.TITLE SHEP,’APPLE DOS’ * 6.3 10-6-78 * 8 BIT ASSEMBLER - TopicsExpress



          

.TITLE SHEP,’APPLE DOS’ * 6.3 10-6-78 * 8 BIT ASSEMBLER .M6502 * ************************************************************************************** * (C) COPYRIGHT 1978 APPLE COMPUTER, INC ************************************************************************************** ORG1 EQU $1B00 ORG2 EQU $3600 DISKIO EQU $3D00 ASC1 EQU $3800 AEC1 EQU $3ABF ASC2 EQU $3D00 AEC2 EQU $3FFF EDOS EQU $4000 PAGE ORG ORG1 BEQIN JMP DBINIT ; DOSREL ; ; GET RELOCATION PARMS ; DR0 LOC1 EQU $26 LDA #$BF ; START AT BF00 STA ZPGWRK+1 ; TO LOOK FOR LDX #0 ; HIGH RAM STX ZPGWRK LDY #0 ;APPLE TEST DR1B LDA (ZPGWRK,X) STA LOC1 DR1 TYA EOR LOC1 STA LOC1 TYA EOR (ZPGWRK,X) STA (ZPGWRK,X) CMP LOC1 BNE DR1A INY BNE DR1B BEQ DR2 ; BR IF TOOK DR1A DEC ZPGWRK+1 ; NOT RAM BNE DR1 ; TRY NEXT PAGE ; DR2 ; LDY ZPGWRK+1 INY ; NEW END OF DOS STY NEPAGE SEC TYA SBC DOSLNG ; MINUS DOS LENGTH STA NSPAGE ; IS NEW START OF DOS SEC SBC RSPAGE ; MINUS OLD DOS START BEQ BEQIN ; (BREIF NO DELTA) STA DELTA ; IS DELTA PAGE LDA RSPAGE ; RESET START PAGE TO NORMAL STA ASTART+1 ; LDA #DBINIT/256 ;RESET PI RTN TO NORMAL STA DI3+2 LDA #DBINIT&255 STA DI3+1 ; ; PAGE ; ; ; RELOCATE ADR TABLES ; LDX #0 STX ZPGWRK DR3 LDA ADRTAB+1,X TAY LDA ADRTAB+2,X STA ZPGWRK+1 JMP DR5 ; DR4 CLC LDA (ZPGWRK),Y ADC DELTA STA (ZPGWRK),Y INY BNE DR5 INC ZPGWRK+1 DR5 INY BNE DR6 INC ZPGWRK+1 ; DR6 LDA ZPGWRK+1 CMP ADRTAB+4,X BCC DR4 TYA CMP ADRTAB+3,X BCC DR4 ; TXA CLC ADC #4 TAX CPX ADRTAB BCC DR3 PAGE ; ; RELOCATE CODE ; LDX #0 DR7 STX TEMP1 ; LDA CDETAB+1,X ; GET A START OF CODE ADR STA ZPGWRK ; PUT IN ZPG LDA CDETAB+2,X STA ZPGWRK+1 ; DR8 LDX #0 LDA (ZPGWRK,X) ; GET OP CODE JSR INSDS2 ; GO FIND OUT HOW LONG ; LDY LENGTH ; GET HOW LONG CPY #2 ; IF IT AIN’T BNE DR9 ; 3 THEN DON’T RELOC LDA (ZPGWRK),Y ; GET PAGE FROM INST CMP RSPAGE ; IF PAGE < REL START BCC DR9 ; THE IGNOR CMP REPAGE ; IF PAGE >= REL END BCS DR9 ; THEN IGNORE ADC DELTA ; ELSE ADD DELTA STA (ZPGWRK),Y ; TO RELOCATE ; DR9 SEC LDA LENGTH ; ADD LENGTH ADC ZPGWRK ; TO PC STA ZPGWRK LDA #0 ADC ZPGWRK+1 STA ZPGWRK+1 ; LDX TEMP1 ; CHECK FOR END CMP CDETAB+4,X ; OF CODE SEGMENT BCC DR8 ; BR NOT END LDA ZPGWRK CMP CDETAB+3,X BCC DR8 ; BR NOT END ; TXA CLC ADC #4 ; INCREMENT TABLE INDEX TAX CPX CDETAB ; DONE BCC DR7 ; BR IF NOT ; PAGE ; ; MOVE TO RELOCATED CODE ; LDA #DEPAGE-1 STA ZPGWRK+1 ; ZPGWRK=FROM LDY NEPAGE DEY STY ZPGFCB+1 ; ZPGFCB = TOO LDA #0 STA ZPGWRK STA ZPGFCB TAY ; DR10 LDA (ZPGWRK),Y ; BYTE FROM STA (ZPGFCB),Y ; BYTE TO INY ; INCREMENT BNE DR10 ; BR NOT FULL PAGE DEC DPGCNT ; DECREMENT PAGE CNT BEQ DR11 ; BR IF DONE DEC ZPGWRK+1 ; INC FROM PAGE DEC ZPGFCB+1 ; INC TOO PAGE BNE DR10 ; MOVE PAGE ; DR11 JMP DBVECT+3 ; DONE PAGE DEPAGE EQU EDOS/256 DSPAGE EQU START/256 INSDS2 EQU $F88E LENGTH EQU $2F ADRTAB DB 9*4 DB @@SAT1,@@EAT1 DB @@RUN,@@RUN+2 DB @@IBVT+2,@@IBVT+4 DB @@AS1VT,@@AS1VT+4 DB @@AS2VT,@@AS2VT+4 DB @@AS2VT+6,@@AS2VT+8 DB @@SAT2,@@EAT2 DB @@BAIOB,@@ADOSLD+2 DB @@IBDCTP,@@IBDCTP+2 DB @0,@0 DB @0,@0 DB @0,@0 CDETAB DB 6*4 DB @@SC1,@@EC1 DB @@SC2,@@EC2 DB @@SC3,@@EC3 DB SDP1,@@EDP1 DB ASC1,@@AEC1 DB @@ASC2,@@AEC2 DB @0,@0 ; RSPAGE DB DSPAGE REPAGE DB DEPAGE ; NSPAGE DB 0 NEPAGE DB 0 ; DOSLING DB DEPAGE-DSPAGE ; DELTA DB 0 DPGCNT DB DEPAGE-DSPAGE PAGE BOUND 256 ; ; RELOCATION TABLES ; START SAT1 FTAB DB @@*-45 ;START OF FTABS CINA DB @@CHRIN ;CHAR IN ADR COUTA DB @@CHROUT ;CHAR OUT ADR FN1ADR DB @@FNAME1 FN2ADR DB @@FNAME2 SVBLA DB @@SVBL ASTART DB @@BEQIN ;CHANGED TO START BY RELOCATE CCBADR DB @@CCB ; OUTSVT ;CHAR OUTPUT STATE VECTOR TABLE DB @@COS0-1 DB @@COS1-1 DB @@COS2-1 DB @@COS3-1 DB @@COS4-1 DB @@COS5-1 DB @@COS6-1 ; COMMAND EXECUTION TABLE CMDETB DB @@EINIT-1 DB @@ELOAD-1 DB @@ESAVE-1 DB @@ERUN-1 DB @@ECHAIN-1 DB @@EDEL-1 DB @@ELOCK-1 DB @@EUNLK-1 DB @@ECLOSE-1 DB @@EREAD-1 DB @@EEXEC-1 DB @@EWRITE-1 DB @@EPOS-1 DB @@EOPEN-1 DB @@EAPND-1 DB @@EREN-1 DB @@ECAT-1 DB @@EMON-1 DB @@ENOMON-1 DB @@EPR-1 DB @@EIN-1 DB @@EMAXF-1 DB @@EAS-1 DB @@EINT-1 DB @@EBSV-1 DB @@EBLD-1 DB @@EBRUN-1 DB @@EVAR-1 EAT1 PAGE ; ; NON-RELOCATING ADRS ; IBASVT CHAIN DB @@IBCHN RUN DB @@IBRUN BREAK DB @@IBBRK GO DB @@IBGO CONT DB @@IBCONT ;BASIC CONT ENTRY POINT IBVT DB @@IBCHN,@@IBRUN,@@IBRK DB @@IBGO,@@0 IBVTL EQU *-IBVT ; AS1VTL DB @@ASRUN1,@@ASRUN1,@@ASBRK1 DB @@IBGO,@@0 AS1VTL EQU *-AS1VT ; AS2VT DB @@ASRUN2,@@ASRUN2,@@ASBRK2 DB @@DBINIT,@@0 AS2VTL EQU *-AS2VT PAGE ; ; EQUATES REQD TO FIND THINGS IN APPLE II ; SETVID EQU $FE93 SETKBD EQU $FE89 PROMPT EQU $33 ;PROMPT CHAR OUTSW EQU $36 ;OUTPUT VECTOR SWITCH INSW EQU $38 ;INPUT VECTOR SWITCH ZPGWRK EQU $40 ;ZERO PAGE WORK CELL CNUM EQU $44 ;CONVERTED NUMERIC LBUFF EQU $200 ;LINE BUFFER MULT EQU $FB63 ;MULT ROUTINE INPRT EQU $FE8B ;SET OUT PORT OUTPRT EQU $FE95 ;SET OUT PORT IBCHN EQU $E836 ;BASIC RUN IBLMEM EQU $4A ;BASIC LOW MEMORY IBHMEM EQU $4C ;INTEGER BASIC HIMEM IBSOP EQU $CA ;INTEGER BASIC START OF CGM IBBRK EQU $3E3 ;BASIC BREAK IBGO EQU $E000 ;BASIC ENTRY POINT IBCONT EQU $E003 ;BASIC CONTINUE ENTRY POINT IBSOV EQU $CC ;BASIC START OF VARIABLES ASSOP EQU $67 ;AS START OF PROGRAM ASEOP EQU $AF ;AS END OF PROGRAM ASEOP2 EQU $69 ;AS END-OF PGM 2 ASHM1 EQU $73 ;AS HIGH MEM 1 ASHM2 EQU $6F ;AS HIGH MEM 2 ASLMEM EQU $ASSOP ;AS LOW MEM ASBRK1 EQU $D865 ;AS ROM BREAK ASBRK2 EQU $1067 ;AS RAM BREAK AITSTL EQU $E000 ;AS 1 IB TEST LOC ATSTV EQU $4C ;AS TEST VALUE ITSTV EQU $20 ;IB TEST VALUE BOOTSL EQU $2E ;BOOT FROM SLOT ZPQFCB EQU $42 ;ZERO PAGE WORK CELL HOME EQU $FC58 PRINT EQU $FDED GETKEY EQU $FD0C PAGE ; ; DOS BASIC INTERPRETER – INITIAL ENTRY ; SC1 DBINIT LDA IBSLOT ;GET BOOT SLOT LSRA LSRA LSRA LSRA STA CS ;SET AS CURRENT SLOT LDA IBDRVN ;GET BOOT DRIVE NUMBER STA CD ;SET AS CURRENT DRIVE LDA AITSTL ;GET APPLESOFT/IB TEST EOR #ITSTV ;IF AS THEN BNE IAS1 ;GO TO AS INIT ; ;ELSE INIT FOR IB STA ASIBSW ;SET SW FOR IB LDX #IBVTL ;GET IB VT LENGTH IIB1 LDA IBVT-1,X ;MOVE IB ADDR STA IBASVT-1,X DEX BNE JMP INITAA ; IAS1 LDA #$40 ;INDICATE ROM APPLESOFT STA ASIBSW LDX #AS1VTL IAS1A LDA AS1VT-1,X ;MOVE ROM AS ADRS STA IBASVT-1,X DEX BNE IAS1A ; INITAA SEC ;INDICATE INIT BCS INITA DBRST LDA ASIBSW ;GET AS/IB FLAG BNE INITA1 ;BR IF NOT IB LDA #ITSTV ;GET IB TEST VALUE BNE INITA2 ;GO SET IB INITA1 ASLA ;TST ROM AS BPL INITA3 ;BR IF NOT ROM TEST VALUE LDA #ATSTV ;GET AS ROM TEST VALUE INITA2 JSR SWTST ;GO SET INITA3 CLC ;INDICATE RESET ; INITA PHP ;SAVE INIT/RESET JSR MVCSW ;GO MOVE CHAR SWITCH LDA #MC+MI+MO ;SET MONITOR MODES STA MONMOD ; LDA #0 STA OSTATE ;CLEAR OUTSTATE AND EXECUTE STATE PLP ;GET INSTATE RORA ;SHIFT CARRY TO MSB STA ISTATE ;SAVE INSTATE BMI INITB ;BR IF INIT JMP (CONT) ;GO TO CONTINUE ENTRY INITB JMP (GO) ;GO TO GO ENTRY PAGE INITC ASLA ;OF ISTATE NOT ON BPL INITD ;THEN NOT RAM AS STA ASIBSW ;SET RAM AS LDX #AS2VTL IAS2A LDA AS2VT-1,X ;MOVE RAM AS ADRS STA IBASVT-1.X DEX BNE IAS2A LDX #29 IAS2B LDA FNAME2,X STA FNAME1,X DEX BPL IAS2B ; INITD LDA DFNFTS ;GO BUILD FILE TABS STA CNFTBS ;AND SET MEM BOUNDS JSR BLDFTB LDA ESTATE ;GET EXEC STATE BEQ INITZ ;BR IF NOT EXECTUTE PHA ;SVE CHAR JSR MVEFTA ;GO MOVE EX FILE TAB ADR TO ZP PLA ;GET SAVED CHAR LDY #0 STA (ZPGWRK),Y ; INITZ JSR CLRSTS ;SET IN AND OUT STATES TO ZERO LDX #IFBL INITE LDA DBVECT,X ;MOVE RESTART VECTORS STA $3D0,X DEX BPL INITE LDA CMDNO ;IF NOT BOOT BNE INITF ;THEN DONE LDA FNAME1 ;IF FN1 EOR #$A0 ;NOT DONE BEQ INITF ;THEN DONE JMP ERUN ;ELSE ; IFB INITF LDA SVCMD BEQ INITG STA CMDNO JMP CMDGO INITG JMP ORTN ; DBVECT JMP DBRST JMP DBINIT JMP DOSENT JMP DISKIO CCBLDR LDA CCBADR+1 LDY CCBADR RTS IOBLDR LDA AIOB+1 LDY AIOB RTS IFBL EQU *-IFB-1 PAGE ; ; CHRIN – CHAR RCVD VIA IN SWITCH ; CHRIN JSR SVREGS LDA ISTATE ;IF NOT DISKIN BEQ CHIN1 ;THEN BRANCH, ELSE BPL CHINO JMP INITC CHINO LDA SVA STA ($28),Y JMP ICFD ;AND GET CHAR FROM DISK CHIN1 LDA ESTATE BEQ CHIN2 JMP NXTEXC CHIN2 LDA #3 ;SET OUT CHAR STA OSTATE ;STATE TO INPUT ECHO JSR LDREGS JSR GETIN STA SVA JMP ORTN ; GETIN JMP (INSW) ; ; CHROUT – CHAR RCVD VIA OUTPUT SWITCH ; CHROUT JSR SVREGS ;SAVE REGS LDA OSTATE ;GET OUT SPARE ASLA TAX LDA OUTSVT+1,X ;GET ROUTINE ADR PHA LDA OUTSVT,X PHA LDA SVA RTS ;GO TO ROUTINE ; ; SVREGS – SAVE REGS WHILE PROCESSING CHARS ; SVREGS STA SVA ;SAVE ACU SVRGSA STX SVX ;SAVE X STY SVY ;SAVE Y LDX #3 ;SET FOR FOUR BYTE MOVE SVRB LDA SVOUTS,X ;MOVE SAVED OUT AND IN SW STA OUTSW,X ;TO APPLE OUT/IN SW DEX BPL SVRB RTS ;DONE PAGE ; ; COS0 – 1ST CHAR OF PRINTED OUTPUT LINE ; CHECK FOR CNTL-D ; COS0 LDX ISTATE ;IS IN STATE NOT ZERO BEQ COS01 CMP #’?+$80 ;THEN IS THIS? BEQ COS6 ;THEN PRINT ONLY IF MONITOR CMP PROMPT BEQ COS6 COS01 LDX #2 STX OSTATE CMP CCHAR ;IF NOT CNTL-D BNE COS2 ;THEN GO TO STATE 2 DEX STX OSTATE ;ELSE STATE = 1 DEX STX LBUFD ;AND LBUFD=0 ; ; COS1 – ACCUMULATE CMD FROM PRINTED OUTPUT ; COS1 LDX LBUFD ;GET LINE BUFF DISPL COS1A STA LBUFF,X ;PUT CHAR IN BUFF INX ;INCR PTR STX LBUFD ;SAVE PTR CMP #$8D ;WAS THIS A CR BNE CMDRTN ;IF NOT THEN PR CHAR ; JMP SCNCMD ;GO SCAN COMMAND ; ; COS2 – PRINTED OUTPUT, NOT FIRST CHAR ; COS2 CMP #$8D ;IS IT A CR BNE PRRTN ;BR IF NOT LDX #0 ;SET FOR POSSIBLE C-D NEXT STX OSTATE ;NEXT STATE JMP PRRTN ;GO PRINT CHAR PAGE ; ; COS3 – KEY IN ECHO PRINT ; COS3 LDX #0 STX OSTATE ;RESET OUT STATE CMP #$8D ;IS IT CR BEQ COS3A ;IS CR THEN CMD CHECK COS3B LDA ESTATE ;ELSE IF NOT EXECUTE BEQ PRRTN ;THEN PRINT CHAR BNE DRTNI ;ELSE PRINT IF MON INPUT COS3A ; JSR TSTRUN BCS COS3B LDX SVX ;GET LINE INDEX JMP COS1A ; ; COS4 – DISK OUTPUT MODE ; COS4 CMP #$8D ;IS IT CR BNE COS4A ;BR IF NOT CR LDA #5 ;SET STATE FOR CNTL-D STA OSTATE ;EXAMINE COS4A JSR OCTD ;GO OUTPUT CHAR TO DISK JMP DRTNO ;GO TO DATA RETURN (OUT) ; ; COS5 – DISK OUTPUT MODE – 1ST CHAR OF A LINE ; COS5 CMP CCHAR ;IS IT CNTL D BEQ COS0 ;BR IF CNTL– D CMP #$8A ;LINE FEED? BEQ COS4A LDX #4 STX OSTATE ;SET NEW OUT STATE BNE COS4 ;BR IF NOT CNTL D ; ; COS6 – DISK INPUT ECHO ; COS6 LDA #0 STA OSTATE ;RESET OUT STATE = 0 BEQ DRTNI ;GO TO DATA IN RETURN PAGE ; ; PRRTN – PRINT CHAR RETURN ; ; ; CMDRTN – PRINT CHAR IF MONITOR CMBS MODE ; DRTNO – PRINT CHAR IF MONITOR DATA OUT ; DRTNI – PRINT CHAR IF MONITOR DATA IN ; CERTN LDA LBUFF ;CHECK FOR PRINTED COMMAND CMP CCHAR BEQ CMDRTN ;IF PC THEN NO RESET X REG LDA #$A0 ;BLANK STA LBUFF LDA #$8D ;PLUS CR STA LBUFF+1 ;TO OUT BUFFER LDX #0 ;RESET TO SOL STX SVX CMDRTN LDA #MC BNE MODECK DRTNO LDA #MO BNE MODECK DRTNI LDA #MI ; MODECK AND MONMOD ;AND WITH MODE BEQ ORTN ;BR IF NOT PRINT PRRTN JSR LDREGS JSR ORTN1 STA SVA STY SVY STX SVX ; ORTN JSR MVCSW ;GO MOVE CHAR I/O SWITCH LDREGS LDA SVA ;ACU LDY SVY ;Y LDX SVX ;X SEC RTS ;BY PASS PRINT ; ORTN1 JMP (OUTSW) ; ; PRCRIF – PRINT CR IF MON CMDS ; PRCRIF BIT MONMOD ;IF NOT MON CMDS BVC PRCIFR ;THEN RETURN LDA #$8D ;ELSE PRINT CR JSR ORTN1 PRCIFR RTS PAGE ; ; SCNCMD – SCAN COMMAND ; SCNCMD LDY #$FF STY CMDNO ;RESET COMMAND NUMBER INY STY SVCMD SC0 INC CMDNO ;INCR CMD NO LDX #0 ;RESET LINE INDEX TO 0 PHP ;SAVE EQ STATUS LDA LBUFF,X ;GET 1ST LINE CHAR CMP CCHAR ;IS IT CONTROL D BNE SC0A ;BR /IF NOT INX ;INCR OVER CNTLD SC0A STX LBUFD ; SC1X JSR GNBC ;GET NON BLANK INPUT CHAR AND #$7F ;MSB OF CHAR OFF EOR CMDNTB.Y ;EOR WITH INPUT INY ;INCREMENT TABLE INDEX ASLA ;IF MSB OF EOR RESULT ON BEQ SC1A ;IF RESULT NOT NOW ZERO PLA ;THEN INPUT DOES NOT PHP ;EQUAL ENTRY SC1A BCC SC1X ;LOOP FOR END ENTRY ; PLP ;IF INPUT EQUALS END BEQ SYNTAX ;THEN GO SYNTAX ; LDA CMDNTB,Y ;IF NEXT TABLE CHAR NOT ZERO BNE SC0 ;THEN SCAN THE NEXT TABLE ENTRY CNF ;COMMAND NOT FOUND LDA LBUFF ;LINE IS A CONTROL-D CMP CCHAR ;THEN THIS IS A BEQ CNF1 ;POSSIBLE SYNTAX ERROR, ELSE JMP PRRTN ;IT’S A BASIC INPUT LINE CNF1 LDA LBUFF+1 ;GET NEXT CHAR CMP #$8D ;IS IT A CR BNE CSERR ;BR IF CR JSR CLRSTS ;CLEAR THE STATES JMP CMDTRN ;CNTL-D ONLY ; CSERR JMP ESYNTX PAGE ; ; SYNTAX – FIGURE OUT WHAT WE GOT HERE ; SYNTAX LDA CMDNO ;CMDNO=CMDNO*2 ASLA STA CMDNO ; TAY LDA #FN1 AND CMDSTB,Y ;IS FN1 REGD BEQ SN10 ;BR IF NOT JSR CLRFNS PHP ;SAVE EG STATUS ; SN2 JSR GNBC ;GET NON BLANK CHAR BEQ SN6 ;BR IF CR OR COMMA ASLA ;TEST FOR ALPHA BCC SN2A ;BR IF ALPHA BMI SN2A ;BR IS ALPHA JMP CNF ;LURCH IF NOT ALPHA SN2A RORA ;RESTORE BITS JMP SN4 ;AWAY WE GO SN3 JSB GNXTC ;GO GET NEXT CHAR BEQ SN6 ;BR IF COMMA OR CHAR SN4 STA FNAME1,Y ;PUT INTO ILENAME INY ;INC FN INDEX CPY #60 ;ATFN FN INDEX BCC SN3 ;BR IF NOT SN5 JSR GNXTC ;LOOP UNTIL CR OR COMMA BEQ SN5 ; SN6 PLP ;WAS THIS FN2 L OO BNE SN7 ;BR IF IT WAS ; LDY CMDNO LDA #FN2 AND CMDSTB,Y ;IF FN2 NOT REGD THEN BEQ SN8 ;BRANCH ; LDY #30 ;SET FN2 INDEX PHP ;INDICATE FN2 SEEK BNE SN2 ;GO LOOK FOR FN2 ; SN7 LDA FNAME2 ;IF 1ST CHAR OF CMP #$A0 ;FN2 IS BLANK THEN BEQ SERR1 ;SYNTAX ERROR ; SN8 LDA FNAME1 ;IF 1ST CHAR OF CMP #$A0 ;FN1 IS NOT BLANK BNE SOPTS ;THEN GO LOOK FOR OPTIONS ; LDY CMDNO LDA #NPB+NPE ;IF CMD MUST HAVE FILENAME AND CMDSTB,Y ;THEN BEQ SERR1 ;THIS IS ERROR ELSE ; BPL SOPTS ;ITS EXECUTABLE WITHOUT ; SERR1 JMP CNF ; CLRFNS LDA #0 LDY #60 CLRFNA LDA #$A0 SN1 STA FNAME1-1,Y ;CLEAR FN1, FN2 DEY BNE SN1 RTS PAGE SN10 ;FILE NAMES NOT REGD STA FNAME1 LDA #NUM1+NUM2 ;IF NEITHER NUM1 AND CMDSTB,Y ;OR NUM2 IS REGD BEQ SOPTS ;THEN GO LOOK AT OPTIONS ; JSR GETNUM ;GO GET NUMERICS BCS SERR1 ; TAY ;IF HIGH DIGIT NOT BNE SERR1 ;ZERO THEN BAD ; CPX #17 ;IF LOW DIGIT GT 16 BCS SERR1 ;THEN BAD ; LDY CMDNO LDA #NUM1 AND CMDSTB,Y ;IF WE WANT NUM2 BEQ SN11 ; CPX #8 ;IF NUM2>1 BCS SERR1 ;THEN ERROR, ELSE BCC SOPTS ;GO SCAN OPTIONS ; SN11 TXA ;IF NUM1=0 BEQ SERR1 ;THEN ERROR, ELSE ; PAGE ; ; SOPTS – LOOK FOR SYNTAX OPTIONS ; SOPTS LDA #0 STA INOPTS ;CLEAR INPUT OPTIONS STA IMBITS STA CL STA CL+1 LDA LBUFD ;SET PASS 1 STA TEMP1A ; SP1 JSR GNBC ;GO GET NON-BLANK CHAR BNE SP2 ;BR IF NOT COMMA OR CR CMP #$8D ;IF CHAR IS COMMA BNE SP1 ;THEN GO GET CHAR ; LDX CMDNO ;OPTIONS INPUT = I LDA INOPTS ;ALLOW OPTS = A ORA CMDSTB+1,X ;IF (A OR I) EOR CMDSTB+1,X ;XOR A NOT = 0 THEN BNE SERR1 ;WE HAVE UNALLOWED OPTIONS ; LDX TEMP1A ;IF THIS IS PASS 2 BEQ CMDGO ;THEN DONE, STA TEMP1A ;ELSE SET PASS STX LBUFD ;RESTORE LBUFD AND BNE SP1 ;GO DO PASS 2 ; SP2 LDX #OPT1L ;COMPARE CHAR HAVE WITH SP3 CMP OPTAB1-1,X ;CHARS IN OPT TABLE BEQ SP4 ;IF NOT FOUND CONTINUE DEX BNE SP3 ;IF NOT FOUND BEQ SERR2 ;THEN SYNTAX ERROR ; SP4 LDA OPTAB2-1,X ;IF CORRESPONDING OP TAB 2 IS BMI SP8 ;MINUS THEN IT MONITOR BITS ORA INOPTS STA INOPTS DEX ; STX TEMP2A ;ELSE A NUMERIC MUST FOLLOW JSR GETNUM ;FOLLOW BCS SERR2 ; LDA TEMP2A ;GET IOTION NUMBER ASLA ;MULT BY 4 ASLA TAY ; LDA CNUM+1 ;IF RESULT NUM HI IS BNE SP5 ;GT 0, THEN GT LOW RANGE LDA CNUM ;TEST RESULT LOW CMP OPTAB3,Y ;WITH LOW RANGE (LOW) BCC SERR2 ;BR IF RESULT < LR LDA CNUM+1 SP5 CMP OPTAB3+3,Y BCC SP6 ;BR IF LESS BNE SERR2 ;BR IF GRREATER LDA CNUM CMP OPTAB3+2,Y BCC SP6 ;BR IF LESS BNE SERR2 ;BR IF GREATER ; SP6 LDA TEMP1A ;IF PASS 1,THEN BNE SP1 ;DON’T STORE RESULT TYA LSRA TAY ; LDA CNUM+1 ;STORE THE RESULT STA CUROPT+1,Y LDA CNUM STA CUROPT,Y SP7 JMP SP1 ;GO FOR NEXT OPT ; SP8 ;MONITOR REG PHA ;SAVE TYPE REG LDA #CIO ;SET OPTION OF CIO ORA INOPTS STA INOPTS PLA ;RESTORE REG AND #$7F ;CLEAR CIO ORA IMBITS ;OR WITH PREV IMBITS STA IMBITS BNE SP7 ;GO FOR NEXT ; SERR2 JMP CNF PAGE ; ; CMDGO – EXECUTE COMMAND ; CMDGO JSR CLRSTS JSR CLRCCB ;GO CLEAR CCB JSR ECMD ;GO EXECUTE JMP CERTN ECMD LDA CMDNO ;COMMAND NO TAX ;IS CMD EXEC TAB INDEX LDA CMDETB+1,X ;GET CMD ADR PHA ;ONTO STACK LDA CMDETB,X PHA RTS ;AND GOTO COMMAND ; ; GNXTC – GET NEXT CHAR ; GNXTC LDX LBUFD LDA LBUFF,X ;GET NEXT CHAR AND IF CMP #$8D ;IT IS A CR BEQ GNXTCR ;THEN RETURN WITHOUT INX ;INCR TO NEXT CHAR STX LBUFD CMP #’,+$80 ;TEST FOR COMMA GNTXR RTS ; ; GNBC – GET NON BLANK CHAR ; GNBC JSR GNXTC ;GO GET NEXT CHAR BEQ GNXTCR ;BR IF COMMA OR CR CMP #$A0 ;IS IT BLANK BEQ GNBC ;BR IF BLANK RTS ;DONE ; ; CLRCCB – CLEAR CCB ; CLRCCB LDA #0 LDY #CCBLEN ;CCBLENGTH CLC1 STA CCB-1,Y ;CLEAR BYTE DEY BNE CLC1 RTS PAGE ; ; GETNUM – COVERT ASCII INPUT TO NUMERIC ; GETNUM LDA #0 ;CLEAR WORK AREA STA CNUM STA CNUM+1 JSR GNBC PHP CMP #$A4 BEQ HEXNUM PLP JMP GN2A ; GN2 JSR GNBC ;GET NEXT NON BLANK GN2A BNE GN3 ;BR NOT COMMA OR CR LDX CNUM ;X=RESULT LOW LDA CNUM+1 ;Y=RESULT HI CLC RTS ;DONE ; GN3 SEC SBC #$B0 ;SUBTRACT ASCII 0 BMI GN4 ;BR IF NOT NUM CMP #10 BCS GN4 ;BR IF NOT NUM JSR GN5 ;OLD*2 ADC CNUM ;PLUS NEW TAX LDA #0 ADC CNUM+1 TAY JSR GN5 ;OLD*4 JSR GN5 ;OLD*8 TXA ;OLD*8 + OLD*2 + NEW ADC CNUM STA CNUM ;=OLD*10 + NEW TYA ADC CNUM+1 STA CNUM+1 BCC GN2 ; GN4 SEC RTS ;DONE GN5 ASL CNUM ;CNUM * 2 ROL CNUM+1 BCS GN4 RTS PAGE ; HEXNUM PLP HNO JSR GNBC ;GO GET CHAR BEQ GN2A ;BR IF CR OR COMMA ; SEC SBC #$B0 ;CHAR – ASCII0 BMI GN4 ;BR IF LTO CMP #10 ;IS IT LT10 BCC HN1 ;BR IF LT SBC #$7 ;SUB 7 FOR ASCII A BMI GN4 ;BR IF LT A CMP #16 ;TEST GT 15 BCS GN4 ;BR GT 15 HN1 JSR GN5 ;OLD*2 JSR GN5 ;OLD*4 JSR GN5 ;OLD*8 JSR GN5 ;OLD*16 ORA CNUM ;OR IN NEW STA CNUM ;SAVE NEW JMP HN0 ;GO FOR NEXT CHAR PAGE ; ; EPR – EXECUTE PR# ; EPR LDA CNUM ;GET PORT JMP OUTPRT ;GO DO IT ; ; EIN – EXECUTE IN# ; EIN LDA CNUM ;GET PORT JMP INPRT ;GO DO IT ; ; EMON – EXECUTE MONITOR CMD ; EMON LDA MONMOD ;GET CURRETN BITS ORA IMBITS ;OR IN NEW BITS STA MONMOD ;SET NEW MODE RTS ; ; ENOMON – EXECUTE NO MONITOR CMD ; ENOMON BIT IMBITS BVC ENM1 JSR PRCRIF ENM1 LDA #$70 EOR IMBITS ;INVERT INPUT BITS AND MONMOD ;AND WITH CURRENT STA MONMOD ;SET NEW MODE RTS PAGE ; ; EMAXF – EXECUTE MAX FILES ; EMAXF LDA #0 ;RESET EXECUTE STA ESTATE LDA CNUM ;SAVE NEW NO FILES PHA JSR CLALL ;GO CLOSE ALL TBLS PLA STA CNFTBS ;SET NEW NO FILE TBLS JMP BLDFTB ;GO BUILD NEW ONES ; ; EDEL – DELETE A FILE ; EDEL LDA #CRGDEL ;DELETE REQUEST JSR OPEN ;GO OPEN JSR FILSRC ;FIND FILE LDY #0 TYA STA (ZPGWRK),Y ;RESET FN RTS ; ; ELOCK – LOCK A FILE ; ELOCK LDA #CRGLCK ;SET LOCK BNE ELGO ; ; EUNLK – UNLOCK A FILE ; EUNLK LDA #CRGUNL ;SET UNLOCK ELGO JSR OPEN ;OPEN FILE & UNLOCK JSR TSTFNF JMP ECLOSE ; ; EVAR – VERIFY A FILE ; EVAR LDA #CRGVAR ;SET VARIFY BNE ELGO PAGE ; ; EREN – RENAME A FILE ; EREN LDA FN2ADR ;MOVE FILE NAME2 STA CCBFN2 LDA FN2ADR+1 STA CCBFN2+1 LDA #CRGRNM STA TEMP1A ;SET RENAME JSR EO3 ;GO OPEN AND RENAME JMP ECLOSE ;GO CLOSE ; ; EAPND – OPEN FILE FOR APPEND ; EAPND JSR EOPEN ;GO OPEN LDA #CREFNF CMP CCBSTA ;IF FILE CREATED BNE AP1 RTS AP1 JSR RBYTE ;READ A BYTE BNE AP1 ;BR IF NOT ZERO ; JMP RWP3 ;GO RE-POSITION PAGE ; ; EOPEN – OPEN A FILE ; EOPEN LDA #CRGOPN OPEN STA TEMP1A LDA CL ;IF NO LENGTH ENTERED BNE EO1 ;THEN SET DEFAULT OF 1 LDA CL+1 BNE EO1 LDA #1 STA CL EO1 LDA CL ;MOVE REC LENGTH STA CCBRLN LDA CL+1 STA CCBRLN+1 EO3 JSR ECLOSE ;GO CLOSE IF OPEN EO4 LDA CNUM+1 ;GET AVALL ENTRY BNE EO5 ;BR IF ONE AVAIL JMP ENFA ;DONE – NO FILES AVAIL EO5 STA ZPGWRK+1 ;MOVE AVAIL SLOT TO ZPG LDA CNUM STA ZPGWRK EO6 JSR MVFN1 ;GO MOVE FILE NAME JSR MVBUFP ;GO MOVE BUF PTRS JSR OPNSUP ;GO SET UP OPEN LDA TEMP1A ;SET OPEN REG STA CCBREG JMP DOSGO ;GO OPEN PAGE ; ; ECLOSE – EXECUTE CLOSE FILE COMMAND ; ECLOSE LDA FNAME1 CMP #$A0 BEQ CLALL JSR FILSRC ;GO FIND FILE BCS ECL1 ;BR IF NOT FOUND JSR CLOSE ;GO CLOSE JMP ECLOSE ;GO SEE IF ANY MORE OPEN ECL1 RTS ; ; CLOSE – CLOSE A FILE ; CLOSE JSR TSTEXC BNE CLX LDA #0 STA ESTATE CLX LDY #0 ;CLEAR 1ST FN TYA ;CHAR TO ZERO STA (ZPGWRK),Y JSR MVBUFP ;MOVE BUFFER PTRS LDA #CRGCLS ;SET CLOSE STA CCBREG JMP DOSGO ;GO CLOSE ; ; CLALL – CLOSE ALL FILES ; CLALL JSR TSINIT ;GO INIT FILE SEARCH BNE CL1 CL0 JSR TSNXT ;NEXT ENTRY BEQ CL2 ;BR IF NO MORE CL1 JSR TSTEXC BEQ CL0 JSR TSTOPN ;GOL TEST OPEN BEQ CL0 ;BR NOT OPEN JSR CLOSE ;GO CLOSE JMP CLALL ;START OVER CL2 RTS ;DONE PAGE ; ; EBSV – EXECUTE BINARY SAVE ; EBSV LDA #A+L ;IF ALL AND INOPTS CMP #A+L BEQ EBSV1 JMP CNF ;THEN ERROR EBSV1 LDA #4 ;SET BINARY FILE JSR SV1 ;GO OPEN & TEST LDA CA+1 ;OUTPUTADR OF BLOCK LDY CA JSR SV2 LDA CL+1 ;GO OPEN AND TEST LDY CL JSR SV2 ;OUTPUT LENGTH LDA CA+1 ;GET ADR GIVEN LDY CA JMP SV3 ;OUTPUT BLOCK ; ; EBLD – EXECUTE BINARY LOAD ; EBLD JSR EOPEN JSR TSTFNF EBLD2 LDA #$7F AND CCBFUC CMP #4 BEQ EBLD3 JMP ENBF EBLD3 LDA #4 ;SET BINARY FILE JSR SV1 ;GO OPEN $ TEST JSR LD2 ;GO GET ADR TAX LDA INOPTS AND #A ;IF ADR NOT GIVEN BNE EBLD1 STX CA ;THEN USE ADR FROM FILE STY CA+1 EBLD1 JSR LD2 ;GET LENGTH LDX CA ;GET GIVEN ADR LDY CA+1 JMP LD3 ;GO GET BLOCK ; ; EBRUN – EXECUTE BINARY RUN ; EBRUN JSR EBLD ;GO LOAD FILE JSR MVCSW ;GO RESTORE CHAR I/O SW JMP (CA) ;GO EXEC THE STUFF TSTFNF LDA #CREFNF ;FILE NOT FOUND ERROR CODE CMP CCBSTA ;TEST FILE NOT FOUND BEQ FNF ;BR IF FILE NOT FOUND RTS ;FILE FOUND, RETURN FNF JMP KLUTZ ;GO FIX THINGS PAGE ; ; ESAVE – EXECUTE SAVE REQUEST ; ESAVE LDA ASIBSW ;IF IB THEN BEQ EIBSV ;GO TO IB SAVE LDA #2 ;GET APPLESOFT PGM JSR SV1 ;GO OPEN AND TEST ; SEC ;BLOCK LENGTH LDA ASEOP ;=EOP-SOP SBC ASSOP TAY LDA ASEOP+1 SBC ASSOP+1 JSR SV2 ;GO OUTPUT BLOCK ; LDA ASSOP+1 ;BLOCK ADR LDY ASSOP ;=SOP JMP SV3 ;GO OUTPUT BLOCK ; EIBSV LDA #1 ;SET IB PGM JSR SV1 ;GO OPEN AND TEST ; SEC ;BLOCK LENGTH LDA IBHMEM ;=HIMEM-SOP SBC IBSOP TAY LDA IBHMEM+1 SBC IBSOP+1 JSR SV2 ;GO OUTPUT LENGTH ; LDA IBSOP+1 ;BLOCK ADR LDY IBSOP ;=SOP JMP SV3 ;GO OUTPUT ; SV1 SV1A STA CCBFUC ;SET BLOCK PGM TYPE PHA ;SAVE PGM TYPE JSR EOPEN ;GO OPEN FILE PLA ;GET SAVE TYPE JMP TSTFUC ;GO CHECK ; SV2 STY CCBBLN ;SET BLOCK LENGTH STY CCBDAT ;AND DATA BYTE STA CCBBLN+1 LDA #CRGWR ;INDICATE WRITE STA CCBREG LDA #CRMNBT ;NEXT BYTE STA CCBRQM JSR DOSGO ;GO WRITE LDA CCBBLN+1 ;OTHER BYTE TOO STA CCBDAT JMP DOSGO ; SV3 STY CCBBBA ;SET BLOCK ADR STA CCBBBA+1 LDA #CRMNBL ;INDICATE BLOCK I/L STA CCBRQM JSR DOSGO ;GO DO IT JMP ECLOSE ;CLOSE FILE PAGE NBPER JMP ERNU1 ; ; ELOAD – EXECUTE LOAD REQUEST ; ELOAD JSR CLALL ;GO CLOSE ALL JSR EOPEN ;OPEN FILE LDA #CREFNF CMP CCBSTA ;WAS FILE FOUND BNE ELD1 ;BR IF FOUND ; KLUTZ JSR EDEL ;DELETE NEW FILE LDA #CREFNF ;FILE NOT FOUND MSG JMP ERROR ;GO ; ELD1 LDA #$7F ;MASK PROTECT BIT AND CCBFUC ;OUT OF FUC BEQ NBPER ;BR IF ERROR AND #$03 ;ISOLOLATE IB & AS BEQ NBPER ;BR IF ERROR STA CCBFUC ;SAVE IB/AS ONLY LDA ASIBSW ;IF IB THEN BEQ EIBL ;GO TO IB LOAD LDA #2 JSR LD1 ;GO OPEN AND TEST ; JSR LD2 ;GO GET BLOCK LENGTH ; CLC ADC ASSOP ;ADD BLOCK LENGTH TO SOP TAX TYA ADC ASSOP+1 ; CMP ASHM1+1 ;IF BL+SOP >=HMEM BCS MFULL ;THEN WON’T FIT ; EASL1 STA ASEOP+1 ;SET NEW EOP ADR STA ASEOP2+1 STX ASEOP STX ASEOP2 LDX ASSOP ;GET ADR WHERE TO LOAD LDY ASSOP+1 JMP LD3 ;GO LOAD ; EIBL LDA #1 ;SET IB PGM JSR LD1 ;GO OPEN AND TEST ; JSR LD2 ;GO GET BLOCK LENGTH ; SEC ;HMEM – BLOCK LENGTH LDA IBHMEM ;IS NEW SOP SBC SVBL TAX LDA IBHMEM+1 SBC SVBL+1 BCC MFULL TAY ; CPY IBLMEM+1 ;IF NEW SOP
Posted on: Mon, 18 Nov 2013 01:41:18 +0000

Trending Topics



Recently Viewed Topics




© 2015