* STAR-DOS DISK OPERATING SYSTEM FOR THE * SS-50 BUS * COPYRIGHT (C) 1984, 1985 BY PETER A. STARK * STAR-K, PO BOX 209, MT KISCO NY 10549 * INCLUDES GIMIX #28 DRIVERS C000 BASE EQU $C000 STAR-DOS STARTING ADDRESS 0070 SETDP $70 DISABLE ACCIDENTAL DIRECT ADDRESSES * VERSION NUMBER CD00 ORG $CD00 DUMMY ADDRESS CD00 20 01 BRA LOCKUP ONLY HERE TO LEAVE ROOM FOR CD02 23 FCB 35 VERSION NUMBER * VER 28 4-21-86 ADDED ERRVEC TO ALLOW USER-NAMED ERRORS.SYS * VER 29 4-25-86 CHANGED PUTOUT TO ALLOW PTR TO PAUSE * VER 30 5-31-86 UPDATED PER LETTER FROM BERT VAN DER BURG: * MOVED LDS AND JSR RSTRIO DIRECTLY AFTER WARMSTART * VER 31 9-22-86 FIXED ROUTINE TO ALLOW DRIVE=ALL; CHANGE DEPCTR * SO IT COUNTS 1-56 INSTEAD OF 0-55; * VER 32 10-15-86 FIXED PAUSE ROUTINE SO IT DOESN'T IF PLINES=0 * VER 33 1-6-87 FIXED FCS1 SO IT CLEARS ALL OF FCB HEADER * VER 34 6-11-87 CHANGED FCS0 TO RETURN CARRY=0 TO GET AROUND * BUG IN TSC PASCAL * VER 35 5-10-89 PER SUGGESTIONS FROM K DIETER SCHAEFER: PERROR * OUTPUTS TO TERMINAL ONLY; VERSION ON SIGNON CD03 0000 0000 LOCKUP FDB 0,0,0,0 ROOM FOR SERIAL NO CD07 0000 0000 CD0B 0000 0000 FDB 0,0,0,0 AND IDENTIFICATION CD0F 0000 0000 >CD13 BD CD18 JSR PUTCHR CD16 35 96 PULS A,B,X,PC AND SOME DUMMY STUFF CD18 28 43 29 20 FCC '(C) 1984 - 1986 BY PETER A. STARK. ' CD1C 31 39 38 34 CD20 20 2D 20 31 CD24 39 38 36 20 CD28 42 59 20 50 CD2C 45 54 45 52 CD30 20 41 2E 20 CD34 53 54 41 52 CD38 4B 2E 20 CD3B 41 4C 4C 20 FCC 'ALL RIGHTS RESERVED.' CD3F 52 49 47 48 CD43 54 53 20 52 CD47 45 53 45 52 CD4B 56 45 44 2E * FILE CONTROL BLOCK EQUATES 0000 FCBFUN EQU 0 FUNCTION CODE 0001 FCBERR EQU 1 ERROR CODE 0002 FCBRW EQU 2 READ=1, WRITE=2 0003 FCBDRV EQU 3 DRIVE NUMBER 0004 FCBNAM EQU 4 FILE NAME (8 CHARS) 000C FCBEXT EQU 12 FILE EXTENSION (3 CHARS) 000F FCBATT EQU 15 FILE PROT ATTRIBUTES (BITS 4-7) 0011 FCBFTR EQU 17 FIRST TRACK OF FILE 0012 FCBFSE EQU 18 FIRST SECTOR OF FILE 0013 FCBLTR EQU 19 LAST TRACK OF FILE 0014 FCBLSE EQU 20 LAST SECTOR OF FILE 0015 FCBSIZ EQU 21 2-BYTE FILE SIZE IN SECTORS 0017 FCBRAN EQU 23 RANDOM INDICATOR (0=SEQ) 0018 FCBTIM EQU 24 POSSIBLE TIME BYTE 0019 FCBMON EQU 25 MONTH 001A FCBDAY EQU 26 DAY 001B FCBYR EQU 27 YEAR OF FILE CREATION 001C FCBLST EQU 28 FCB LIST POINTER TO NEXT FCB 001E FCBCTR EQU 30 CURRENT TRACK IN BUFFER 001F FCBCSE EQU 31 CURRENT SECTOR IN BUFFER 0020 FCBCRN EQU 32 2-BYTE CURRENT RECORD NUMBER 0022 FCBDPT EQU 34 DATA POINTER TO NEXT BYTE (0-255) 0023 FCBRIN EQU 35 RANDOM FILE INDEX POINTER 0024 FCBNMB EQU 36 TEMPORARY NAME BUFFER (11 CHARS) 002F FCBDIT EQU 47 DIRECTORY TRACK (0- ) 0030 FCBDIS EQU 48 DIRECTORY SECTOR (5- ) 0031 FCBDIB EQU 49 DIRECTORY STARTING BYTE INDEX 0034 FCBDIE EQU 52 DIRECTORY ENTRY NUMBER (0-7) 0035 FCBNMS EQU 53 SCRATCH NAME (11 CHARS) 003B FCBSCF EQU 59 SPACE COMPR FLAG (0=COMPR,FF=NO) 003C FCBSPT EQU 60 SECTORS PER TRACK FOR RANDOM 003F FCBUPD EQU 63 RANDOM UPDATE FLAG 0040 FCBDAT EQU 64 DATA BUFFER (256 BYTES) C080 ORG BASE+$0080 LIES AT $C080 C080 LINBUF RMB 128 INPUT LINE BUFFER C700 ORG BASE+$0700 LIES AT $C700 - CBFF C700 OUTFCB RMB 320 FCB FOR DISK OUTPUT C840 USRFCB RMB 320 USER FCB FOR USER PROGRAMS C980 DIRFCB RMB 320 FCB FOR DIRECTORY CAC0 SIRFCB RMB 320 FCB FOR SYSTEM INFO RECORD * THERE IS SOME UNUSED TEMP STORAGE WITHIN THE ABOVE * AT C9A5-E, C9B2-A, C9BD-F, CAF2-A, CAFD-F * THE FOLLOWING MAKES SOME USE OF THAT C9A6 TEMP1 EQU DIRFCB+$26 C9A6 C9A8 TEMP2 EQU DIRFCB+$28 C9A8 C9AA TEMP3 EQU DIRFCB+$2A C9AA C9B2 ORG DIRFCB+$32 C9B2 C9B2 0D 0A ERRMSG FCB $D,$A C9B4 45 52 52 4F FCC 'ERROR' C9B8 52 C9B9 04 FCB 4 C71B ORG BASE+$071B LIES AT $C71B C71B 00 SPOOCT FCB 0 SPOOLING COUNTER = 0 * INITIALIZATION STAGE FOR SK*DOS C7A0 ORG $C7A0 * FIX UP BOOJMP SO THE NEXT COLDSTART * DOESN'T COME HERE ANY MORE C7A0 CC 1212 ONEDOS LDD #$1212 C7A3 B7 CDD9 STA BOOJMP CHANGES IT TO NOP C7A6 FD CDDA STD BOOJMP+1 CHANGES IT TO NOP C7A9 8D 65 BSR GTMEME CHECK MEMORY SIZE AND SET MEMEND C7AB 30 8D 0351 LEAX SIGNON,PCR C7AF BD D015 JSR PSTRNG PRINT SIGN-ON MESSAGE C7B2 BD CA02 JSR ASKDAT ASK AND GET DATE VIA VECTOR AT CA02 * GO OPEN 'STARTUP.TXT' FILE C7B5 8E CBBC LDX #STNAME POINT TO "STARTUP.TXT" NAME C7B8 108E C844 LDY #USRFCB+4 AND WHERE IT GOES IN FCB C7BC BD D1A8 JSR NAMOVE PUT IT INTO FCB C7BF 8E C840 LDX #USRFCB C7C2 BF D40B STX CURFCB C7C5 B6 CC0B LDA SYSTDR C7C8 A7 03 STA 3,X SELECT SYSTEM DRIVE C7CA BD D69A JSR FCS1 GO OPEN THE FILE FOR READING C7CD 27 0B BEQ STRTOK IF STARTUP.TXT WAS FOUND C7CF A6 01 LDA 1,X CHECK ERROR CODE C7D1 81 04 CMPA #4 IS IT FILE NOT THERE? C7D3 27 2E BEQ NOSPOO ERASE SPOOL TABLE AND WARMSTART C7D5 BD D113 STRTNG JSR PERROR ELSE REPORT ERROR C7D8 20 29 BRA NOSPOO ERASE SPOOL TABLE AND WARMSTART * FOUND STARTUP.TXT FILE, GO DO IT C7DA 108E C080 STRTOK LDY #LINBUF POINT TO LINE BUFFER C7DE 10BF CC14 STY LPOINT C7E2 8E C840 LDX #USRFCB C7E5 BD D472 STRTLP JSR FCS GO READ A BYTE FROM STARTUP C7E8 26 10 BNE STRDER IF READ ERROR ON STARTUP C7EA A7 A0 STA 0,Y+ PUT INTO LINE BUFFER C7EC 81 0D CMPA #$0D END OF LINE? C7EE 26 F5 BNE STRTLP NO, KEEP READING C7F0 BD D43D JSR FCSCLS YES, END OF LINE SO CLOSE FILE C7F3 BD CDFD JSR EXECSD GO EXECUTE THIS COMMAND C7F6 26 DD BNE STRTNG IF THERE WAS AN ERROR C7F8 20 09 BRA NOSPOO ERASE SPOOL TABLE AND WARMSTART * ON STARTUP ERROR, CHECK FOR END OF FILE C7FA A6 01 STRDER LDA 1,X GET ERROR CODE C7FC 81 08 CMPA #8 END OF FILE? C7FE 26 D5 BNE STRTNG NO, REPORT ERROR AND QUIT C800 BD D43D JSR FCSCLS ELSE CLOSE EVERYTHING * FINALLY, ERASE SPOOLING TABLE AT C810-C83F AND WARMSTART C803 8E C810 NOSPOO LDX #$C810 POINT TO SPOOLING TABLE C806 6F 80 NSLOOP CLR 0,X+ CLEAR A BYTE C808 8C C840 CMPX #$C840 AT END? C80B 26 F9 BNE NSLOOP NO, CLEAR MORE C80D 7E CD7D JMP WARMS FINALLY WARM START *********CAUTION - MAKE SURE THIS ENDS BEFORE C810******* * ROUTINE TO CHECK FOR END OF LOGICAL MEMORY C810 8E 0000 GTMEME LDX #0000 POINT TO 0 C813 CC A596 LDD #$A596 MEMORY TEST PATTERN C816 EE 84 MEMLOO LDU 0,X SAVE CONTENTS C818 ED 84 STD 0,X SAVE PATTERN C81A 10A3 84 CMPD 0,X COMPARE IT C81D 26 09 BNE ENDMEM DIDN'T GO IN C81F EF 84 STU 0,X RESTORE OLD CONTENTS C821 30 01 LEAX 1,X GO TO NEXT C823 BC CC2B CMPX MEMEND GONE TOO FAR? C826 23 EE BLS MEMLOO NO, GO BACK FOR MORE C828 30 1F ENDMEM LEAX -1,X GO BACK TO ONE THAT WORKED C82A BF CC2B STX MEMEND AND SAVE AS TOP OF MEMORY C82D 39 RTS * THE FOLLOWING PART LIES INSIDE DIRFCB AT * $CA02 AND WILL GET ERASED LATER CA02 ORG $CA02 CA02 12 ASKDAT NOP CAN BE REPLACED BY VECTOR CA03 12 NOP CA04 12 NOP CA05 30 8D 0191 ASKDA1 LEAX DATERQ,PCR CA09 BD D015 JSR PSTRNG ASK FOR DATE CA0C BD CF93 JSR INLINE INPUT DATE, SEPARATED BY COMMAS CA0F 108E CC0E LDY #MONTH POINT TO MONTH LOCATION CA13 8D 0E BSR GETDAT GET MONTH CA15 8D 0C BSR GETDAT GET DAY CA17 8D 0A BSR GETDAT GET YEAR CA19 8E CBC7 LDX #THANKS CA1C BD D015 JSR PSTRNG PRINT "THANK YOU" CA1F BD D027 JSR PCRLF CA22 39 RTS * GETDAT ROUTINE TO INPUT AND STORE DATE CA23 BD D08C GETDAT JSR DECIN GET NEXT DATE ITEM CA26 24 04 BCC DATEOK OK NUMBER RECEIVED CA28 32 62 DATENG LEAS 2,S ELSE REMOVE RETURN ADDRESS FROM STACK CA2A 20 D9 BRA ASKDA1 AND ASK FOR DATE AGAIN CA2C 1F 10 DATEOK TFR X,D MOVE DATE TO D CA2E 1083 0063 CMPD #99 SHOULD BE LESS THAN 99 CA32 22 F4 BHI DATENG ELSE IT'S NO GOOD CA34 E7 A0 STB 0,Y+ SAVE IT CA36 39 RTS CB00 ORG $CB00 CB00 0D 0A SIGNON FCB $D,$A CB02 20 20 20 20 FCC ' WELCOME TO' CB06 20 20 20 20 CB0A 20 20 20 20 CB0E 20 20 20 20 CB12 20 20 57 45 CB16 4C 43 4F 4D CB1A 45 20 54 4F CB1E 0D 0A FCB $D,$A CB20 20 20 20 20 FCC ' SK*DOS / 68O9 VERSION 35' CB24 20 20 20 20 CB28 20 20 20 53 CB2C 4B 2A 44 4F CB30 53 20 2F 20 CB34 36 38 4F 39 CB38 20 56 45 52 CB3C 53 49 4F 4E CB40 20 33 35 CB43 0D 0A FCB $D,$A CB45 20 20 43 4F FCC ' COPYRIGHT (C) 1984-1989 BY PETER A. STARK' CB49 50 59 52 49 CB4D 47 48 54 20 CB51 28 43 29 20 CB55 31 39 38 34 CB59 2D 31 39 38 CB5D 39 20 42 59 CB61 20 50 45 54 CB65 45 52 20 41 CB69 2E 20 53 54 CB6D 41 52 4B CB70 0D 0A FCB $D,$A CB72 20 20 20 20 FCC ' STAR-K SOFTWARE SYSTEMS CORP.' CB76 20 20 20 20 CB7A 53 54 41 52 CB7E 2D 4B 20 53 CB82 4F 46 54 57 CB86 41 52 45 20 CB8A 53 59 53 54 CB8E 45 4D 53 20 CB92 43 4F 52 50 CB96 2E CB97 0D 0A 04 FCB $D,$A,4 CB9A 0D 0A DATERQ FCB $D,$A CB9C 45 4E 54 45 FCC "ENTER TODAY'S DATE (MM,DD,YY): " CBA0 52 20 54 4F CBA4 44 41 59 27 CBA8 53 20 44 41 CBAC 54 45 20 28 CBB0 4D 4D 2C 44 CBB4 44 2C 59 59 CBB8 29 3A 20 CBBB 04 FCB 4 CBBC 53 54 41 52 STNAME FCC 'STARTUP',0,'TXT' STARTUP.TXT FILE NAME CBC0 54 55 50 00 CBC4 54 58 54 CBC7 54 48 41 4E THANKS FCC 'THANK YOU.',4 CBCB 4B 20 59 4F CBCF 55 2E 04 CC00 ORG BASE+$0C00 LIES AT $CC00 CC00 08 BACKSP FCB $08 BACKSPACE CHARACTER CC01 18 DELETE FCB $18 CONTROL-X CC02 3A ENDLIN FCC ':' END OF LINE CC03 00 PLINES FCB 0 DEPTH OF PAGE CC04 00 WIDTH FCB 0 PAGE WIDTH CC05 00 NULLWT FCB 0 WAIT AFTER CRLF CONSTANT CC06 00 FCB 0 TTYTAB CC07 08 BECHO FCB 8 BACKSPACE ECHO CC08 00 SLINES FCB 0 EJECT COUNT CC09 00 PSFLAG FCB 0 SCREEN PAUSE FLAG (DEFAULT OFF) CC0A 1B ESCAPE FCB $1B ESCAPE CHARACTER CC0B 00 SYSTDR FCB 0 SYSTEM DEFAULT DRIVE CC0C 00 WORKDR FCB 0 WORK DRIVE CC0D 01 REPEAT FCB 1 REPEAT LINE CC0E MONTH RMB 1 SYSTEM MONTH CC0F DAY RMB 1 DAY CC10 YEAR RMB 1 AND YEAR CC11 0D LASTRM FCB $0D LAST TERMINATOR CC12 0000 USRTAB FDB 0 USER COMMAND TABLE CC14 LPOINT RMB 2 LINBUF POINTER CC16 BREAK RMB 2 ESCAPE RETURN ADDRESS CC18 CURRCH RMB 1 CURRENT CHARACTER FROM GETNX CC19 PRECHR RMB 1 PREVIOUS CHARACTER FROM GETNX CC1A 00 DEPCTR FCB 0 PAUSE LINE COUNTER CC1B 0000 OFFSET FDB 0000 CC1D XFERFL RMB 1 TRANSFER FLAG CC1E EXECAD RMB 2 EXECUTION ADDRESS FOR BIN FILES CC20 ERRTYP RMB 1 LAST FCS ERROR CODE CC21 SPECIO RMB 1 SPECIAL I/O FLAG CC22 OUCHSW RMB 1 OUTPUT SWITCH CC23 INCHSW RMB 1 INPUT SWITCH CC24 FOADDR RMB 2 FILE OUTPUT ADDRESS FOR PUTCHR CC26 FIADDR RMB 2 FILE INPUT ADDR FOR GETCHR CC28 CMFLAG RMB 1 EXECSD FLAG =1 IF CALLED VIA EXECSD CC29 CURCOL RMB 1 CURRENT COLUMN ON PAGE CC2A RMB 1 NOT USED CC2B BFFF MEMEND FDB $BFFF END OF MEMORY CC2D 0000 ERRVEC FDB 0 VECTOR TO ERROR NAME ROUTINE CC2F FF INECHO FCB $FF INPUT ECHO FLAG (1=ECHO) CC30 0000 NUMBER FDB 0 SCRATCH - FOR USE WITH OUT5D IN PERROR CC32 RMB 2 SYSTEM SCRATCH CC34 00 SPLFLG FCB 0 SPOOLING FLAG 0=NOT ACTIVE CC43 ORG BASE+$0C43 CC43 ESDRET RMB 2 EXECSD RETURN ADDRESS CC45 ESDSTP RMB 2 EXECSD STACK POINTER CC47 INFLAG RMB 1 DECIMAL (0) OR HEX (1) INPUT FLAG CC48 OPCODE RMB 1 OPCODE IN FCS9 AND 10 * FOLLOWING ***MUST!*** BE AT CC49 CC49 60 FNCASE FCB $60 USED BY GETNAM FOR UPPER CASE ONLY CC4A FCBADD RMB 2 FCB ADDRESS CC4C ORETRY RMB 1 OUTER RETRY COUNTER CC4D IRETRY RMB 1 INNER RETRY COUNTER CC4E TEMP RMB 3 TEMPORARY IN FCS4, DEC-HEXIN, CMDPROC CC51 LISPTR RMB 2 TEMPORARY LIST POINTER CC53 TEMCNT RMB 2 TEMPORARY FOR SCTR COUNT CC55 FCSJMP RMB 2 FCS TEMPORARY LOCATION CC57 EXSAVE RMB 1 EXTENSION CODE FOR GET CC58 SCFLAG RMB 1 SPACE COMPRESSION INDICATOR CC59 CHKSUM RMB 2 CHECKSUM FOR DISK NAME AND DATE CC5B DRTPTR RMB 2 DRIVE TABLE DATA POINTER CC5D DEFDRV RMB 1 DEFAULT DRIVE (WORKDR MOSTLY) CC5E 00 FCB 0 CC5F 03 MAXDRV FCB 3 MAX DRV NUMBER >>MUST BE AT CC5F<< CC60 0000 CACFLG FDB 0 CACHE FLAG >>MUST BE AT CC60<< CC66 ORG BASE+$0C66 CC66 DRTABL RMB 2 DRIVE 0: DISK NAME/DATE CHECKSUM CC68 RMB 2 FIRST FREE T-S FROM SIR CC6A RMB 2 LAST FREE T-2 CC6C RMB 2 NUMBER OF FREE SECTORS CC6E RMB 1 SAVE FOR MULTI USER CC6F RMB 81 SAME FOR 9 MORE DRIVES, TOTAL OF 10 * PRINTER ROUTINES ARE ALL RTS FOR NOW CCC0 ORG $CCC0 CCC0 39 RTS PRINT INITIALIZATION CCD8 ORG $CCD8 CCD8 39 RTS CHECK PRINTER READY CCE4 ORG $CCE4 CCE4 39 RTS OUTPUT TO PRINTER CCFC ORG $CCFC CCFC 00 SPOOLF FCB 0 SPOOLING FLAG - MUST BE 0 CD00 ORG BASE+$0D00 LIES AT $CD00 * STAR-DOS ENTRY POINTS >CD00 7E CD62 COLDSV JMP COLDS COLDSTART >CD03 7E CD7D WARMSV JMP WARMS WARMSTART CD06 7E CDE5 RENTEV JMP MLOOP1 RE-ENTER TO PROCESS LINBUF COMMAND CD09 7E D296 INCH JMP GETCH CD0C 7E D296 INCH2 JMP GETCH CD0F 7E D2A2 OUTCH JMP OUTEEV CD12 7E D2A2 OUTCH2 JMP OUTEEV CD15 7E D26B GETCHR JMP GETCHT GET AN INPUT CHARACTER CD18 7E D2AA PUTCHR JMP PUTCHT OUTPUT A CHARACTER CD1B 7E CF93 INLINV JMP INLINE INPUT INTO LINE BUFFER CD1E 7E D015 PSTRNV JMP PSTRNG PRINT CR-LF AND STRING CD21 7E CF72 CLASFV JMP CLASF IDENTIFY ALPHANUMERIC CHARACTERS CD24 7E D027 PCRLFV JMP PCRLF CARRIAGE RETURN AND LINE FEED CD27 7E CF4A GETNXV JMP GETNX INPUT CHARACTER FROM INPUT BUFFER CD2A 7E DCD7 RESIOV JMP RESIO RESTORE I/O VECTORS CD2D 7E D1BC GETNAV JMP GETNAM TRANSFER FILESPEC FROM LINBUF TO FCB CD30 7E CEC9 LOADV JMP LOAD LOAD ML FILE THAT HAS BEEN OPENED CD33 7E DCF9 DEFEXV JMP DEFEXT SETUP DEFAULT EXTENSION IN FCB CD36 3A ABX ABX ADD B TO X (USELESS) CD37 39 RTS CD38 12 NOP CD39 7E D03C OUT5DV JMP OUT5D OUTPUT A DECIMAL NUMBER CD3C 7E D0F2 OUT2HV JMP OUT2H OUT2H CD3F 7E D113 PERRV JMP PERROR REPORT STAR-DOS ERROR NUMBER CD42 7E D091 HEXINV JMP HEXIN GET 4-DIGIT HEX NUMBER CD45 7E D0E9 OUT4HV JMP OUT4H OUT4H CD48 7E D08C DECINV JMP DECIN INPUT 5-DIGIT DECIMAL NUMBER CD4B 7E CDFD EXECSV JMP EXECSD EXECUTE STARDOS COMMAND CD4E 7E D2A6 STATV JMP STATEV CHECK KEYBOARD STATUS CD51 7E D1A8 MOVNAM JMP NAMOVE MOVE 11 CHARS X TO Y CD54 7E D017 PDATAV JMP PDATA PRINT STRING W/O CR/LF CD57 7E DDE3 INTIME JMP SEQUEN TRAP FOR TIME ENTRY, ELSE SEQUENCE CD5A 4F SETDP CLRA ROUTINE TO SET DP REGISTER TO 0 CD5B 1F 8B TFR A,DP CD5D 39 RTS CD5E 6E 9F D3E5 INNOEC JMP [KINPUV] KEYBOARD INPUT W/O ECHO CD62 10CE C080 COLDS LDS #BASE+$0080 PUT STACK UNDER LINE BUFFER CD66 AD 9F D3F5 JSR [SINITV] INITIALIZE SERIAL PORT CD6A BD DCD7 JSR RESIO RESET I/O VECTORS CD6D 4F CLRA CD6E 5F CLRB CD6F FD D409 STD FBAPTR ERASE FILE LIST POINTER CD72 7F CC28 CLR CMFLAG FORCE EXTERNAL EXECSD FLAG OFF CD75 7F CC1D CLR XFERFL NO TRANSFER ADDRESS LOADED CD78 BD D436 JSR FCSINI INITIALIZE FCS SYSTEM CD7B 20 32 BRA WARMS2 CD7D 8E CD03 WARMS LDX #WARMSV CD80 BF CC16 STX BREAK INITIALIZE ESCAPE RETURN CD83 10CE C080 LDS #BASE+$0080 PUT STACK UNDER LINE BUFFER CD87 BD DCD7 JSR RESIO RESET I/O VECTORS CD8A B6 CC11 LDA LASTRM PREVIOUS LAST TERMINATOR CD8D B1 CC02 CMPA ENDLIN DOING MORE COMMAND? CD90 26 0A BNE WARMS1 NO, JUST WARMS CD92 BE CC14 WARMS0 LDX LPOINT CD95 30 01 LEAX 1,X STEP PAST TERMINATOR CD97 BF CC14 STX LPOINT CD9A 20 49 BRA MLOOP1 AND GO PROCESS IT CD9C 7D CC28 WARMS1 TST CMFLAG CHECK IF AN EXTERNAL EXECSD HAD BEEN USED CD9F 27 0E BEQ WARMS2 NO, SO DO IT NORMALLY CDA1 7F CC28 CLR CMFLAG YES, SO CLEAR FOR NEXT TIME CDA4 10FE CC45 LDS ESDSTP RESET STACK POINTER TO USER'S VALUE CDA8 F6 CC20 LDB ERRTYP GET LAST ERROR CDAB 6E 9F CC43 JMP [ESDRET] AND RETURN TO USER CDAF BD DE18 WARMS2 JSR DWARM WARM-RESET DISK DRIVERS CDB2 BE D377 LDX IRQHAN DISABLE IRQ'S CDB5 AF 9F D3EB STX [IRQVEC] POINTS VECTOR TO HANDLER CDB9 4F CLRA CDBA 5F CLRB CDBB FD CC1B STD OFFSET CLEAR OFFSET CDBE FD CC2D STD ERRVEC AND CLEAR ERROR VECTOR CDC1 4A DECA CHANGE TO $FF CDC2 B7 CC2F STA INECHO ENABLE KEYBOARD ECHO CDC5 7F CC20 CLR ERRTYP NO ERRORS SO FAR CDC8 B6 CC0C LDA WORKDR CDCB B7 CC5D STA DEFDRV DRIVE USUALLY DEFAULTS TO WORK DRIVE CDCE 8D 8A BSR SETDP GO TO CLEAR DP REGISTER CDD0 BD D43D JSR FCSCLS CLOSE ALL FILES CDD3 CC 0D0D LDD #$0D0D CDD6 FD CC18 STD CURRCH CURR & PREV CHAR ARE BOTH CR CDD9 BD C7A0 BOOJMP JSR ONEDOS TEMPORARY - WILL BECOME NOP LATER * MAIN COMMAND LOOP CDDC 8E CDF3 MLOOP LDX #PROMPT CDDF BD D015 JSR PSTRNG PRINT PROMPT CDE2 BD CF93 JSR INLINE INPUT COMMAND CDE5 A6 9F CC14 MLOOP1 LDA [LPOINT] GET FIRST CHAR IN LINE CDE9 81 0D CMPA #$0D CR? CDEB 27 EF BEQ MLOOP YES, SO NOTHING WAS ENTERED CDED 81 20 CMPA #$20 SPACE? CDEF 27 A1 BEQ WARMS0 STEP OVER IT CDF1 20 16 BRA DOCMN0 EXECUTE COMMAND CDF3 53 4B 2A 44 PROMPT FCC 'SK*DOS: ' CDF7 4F 53 3A 20 CDFB 20 CDFC 04 FCB 4 * EXECSD - ROUTINE TO PROCESS COMMAND IN LINBUF * EXTERNAL ENTRY POINT FROM USER PROGRAM CDFD 7C CC28 EXECSD INC CMFLAG EXTERNAL ENTRY POINT CE00 EC E1 LDD 0,S++ GET RETURN ADDRESS CE02 FD CC43 STD ESDRET SAVE IT ALSO IN ESDRET CE05 10FF CC45 STS ESDSTP SAVE USER'S STACK POINTER CE09 7F CC20 DOCMN0 CLR ERRTYP ERASE ERROR CODE CE0C BE CC14 LDX LPOINT POINT X TO NEXT CHAR IN LINBUF CE0F BD D261 JSR SKIPSP SKIP SPACES CE12 81 0D CMPA #$0D IS IT CR? CE14 26 04 BNE DOCMN2 NO, SO CONTINUE CE16 C6 1A DOCMER LDB #26 COMMAND SYNTAX ERROR CE18 20 7D BRA DOERRO SAVE ERROR CODE AND RTS CE1A FC CC14 DOCMN2 LDD LPOINT CE1D FD CC4F STD TEMP+1 SAVE LINE POINTER FOR TRYDISK CE20 8E C840 LDX #USRFCB CE23 BD D1BC JSR GETNAM MOVE COMMAND INTO FCB NAME CE26 25 EE BCS DOCMER ERROR 26 IF NG CE28 BE CC12 LDX USRTAB ELSE TRY USER'S COMMAND TABLE CE2B 27 04 BEQ NOUSER NONE IF 0 CE2D 8D 15 BSR TRYMEM CE2F 27 0F BEQ CMDOK IF WE FOUND ONE CE31 8E CE9C NOUSER LDX #CMDTAB POINT TO OUR CMD TABLE CE34 8D 0E BSR TRYMEM FIND MEMORY RESIDENT CE36 27 08 BEQ CMDOK IF WE FOUND ONE CE38 FC CC4F LDD TEMP+1 IF NOT, RESTORE LPOINT CE3B FD CC14 STD LPOINT CE3E 20 29 BRA TRYDSK TRY DISK RESIDENT * IF A COMMAND IS FOUND IN COMMAND TABLE DO IT CE40 AD 94 CMDOK JSR [0,X] GO VIA ITS ADDRESS CE42 20 43 BRA DOQUIT GET ANY ERROR AND RETURN * TRY TO FIND MEMORY-RESIDENT COMMAND CE44 108E C844 TRYMEM LDY #USRFCB+FCBNAM POINT TO PARSED COMMAND CE48 A6 84 LDA 0,X CHECK FIRST BYTE CE4A 27 1B BEQ TMNOTF ZERO MEANS END OF TABLE CE4C A6 80 TMLOOP LDA 0,X+ NEXT CHAR IN TABLE CE4E A1 A0 CMPA 0,Y+ COMP WITH COMMAND'S NEXT CE50 26 04 BNE TMDIFF IF DIFFERENT CE52 4D TSTA IF SAME, CHECK FOR END CE53 26 F7 BNE TMLOOP NOT END, KEEP GOING CE55 39 TMFOUN RTS EXIT IF SAME, Y-> ADDRESS * IF CHARS DON'T MATCH, OK IF Y POINTS PAST NAME CE56 108C C84C TMDIFF CMPY #USRFCB+FCBEXT PAST NAME TO EXTENSION? CE5A 27 F9 BEQ TMFOUN YES, COMMAND MUST BE SAME * IF NOT, COMMANDS ARE DIFFERENT - STEP TO NEXT CE5C 4D TMSTEP TSTA IS X-> COMMAND'S ADDRESS (PAST 0) CE5D 27 04 BEQ TMADDR YES, STEP OVER IT CE5F A6 80 LDA 0,X+ NO, GO TO NEXT CE61 20 F9 BRA TMSTEP CE63 30 02 TMADDR LEAX 2,X AT ADDRESS, STEP OVER IT CE65 20 DD BRA TRYMEM AND TRY FOR NEXT COMMAND * FINALLY, IF NOTHING FOUND SET NONZERO & EXIT CE67 4C TMNOTF INCA CLEAR Z FLAG CE68 39 RTS * IF MEMORY-RESIDENT COMMAND NOT FOUND, ASSUME DISK-RESIDENT CE69 86 02 TRYDSK LDA #2 CE6B B7 CC57 STA EXSAVE DEFAULT TO CMD EXTENSION CE6E B6 CC0B LDA SYSTDR CE71 B7 CC5D STA DEFDRV USE SYS DRIVE ON COMMANDS ONLY CE74 7F CC20 CLR ERRTYP NO ERRORS SO FAR CE77 8D 39 BSR GET0 ATTEMPT TO DO A GET CE79 26 0C BNE DOQUIT IF ERROR CE7B 7F CC57 XEQ CLR EXSAVE DEFAULT TO BIN EXTENSION AGAIN CE7E 7D CC1D TST XFERFL IS THERE A VALID EXECUTION ADDRESS? CE81 27 12 BEQ NOEXAD NO EXECUTION ADDRESS CE83 AD 9F CC1E JSR [EXECAD] EXECUTE VIA EXECUTION ADDRESS CE87 F6 CC20 DOQUIT LDB ERRTYP GET ERROR CODE CE8A F7 C841 STB USRFCB+FCBERR PUT INTO USER FCB CE8D 27 03 BEQ DOEXIT QUIT IF NO ERROR CE8F 17 027D LBSR RPTER0 ELSE PRINT ERROR CE92 7E CD7D DOEXIT JMP WARMS AND RETURN CE95 C6 1C NOEXAD LDB #28 TA ERROR CE97 F7 CC20 DOERRO STB ERRTYP CE9A 20 EB BRA DOQUIT CE9C 47 45 54 CMDTAB FCC 'GET' GET ML PROGRAM INTO MEMORY CE9F 00 FCB 0 CEA0 CEAF FDB GET CEA2 4D 4F 4E FCC 'MON' EXIT DOS BACK TO HUMBUG CEA5 00 FCB 0 CEA6 D360 FDB MONITR CEA8 58 45 51 FCC 'XEQ' EXECUTE LAST LOADED PROGRAM CEAB 00 FCB 0 CEAC CE7B FDB XEQ CEAE 00 FCB 0 END OF TABLE FLAG * GET COMMAND - GET MACHINE LANGUAGE PROGRAM FROM * DISK INTO MEMORY, STORE EXECUTION ADDRESS IN * EXECAD, AND PRINT ERROR MESSAGE ON ERROR CEAF 7F CC57 GET CLR EXSAVE DEFAULT TO BIN FOR GET CEB2 8E C840 GET0 LDX #USRFCB POINT TO USR FCB CEB5 BD D1BC JSR GETNAM MOVE FILE NAME TO FCB CEB8 25 77 BCS GETEXI IF NAME SEEMS BAD CEBA B6 CC57 GET1 LDA EXSAVE GET EXTENSION TO BE USED CEBD BD DCF9 JSR DEFEXT DEFAULT TO BIN OR CMD EXTENSION CEC0 86 01 LDA #1 CEC2 A7 84 STA 0,X OPEN FILE FOR READ CEC4 BD D472 JSR FCS CEC7 26 68 BNE GETEXI GO REPORT ERROR CEC9 34 76 LOAD PSHS A,B,X,Y,U CECB 8E C840 LDX #USRFCB CECE 86 FF LDA #$FF CED0 A7 88 3B STA FCBSCF,X NO SPACE COMPRESSION CED3 7F CC1D CLR XFERFL NO TRANSFER ADDR YET CED6 8D 5A GET2 BSR GETNEW GET FLAG BYTE CED8 81 02 CMPA #$02 CEDA 27 06 BEQ GETDTA DATA FOLLOWS CEDC 81 16 CMPA #$16 CEDE 27 39 BEQ GETTA TRANSFER ADDRESS FOLLOWS CEE0 20 F4 BRA GET2 ANYTHING ELSE JUST SKIP CEE2 8D 3F GETDTA BSR GETWRD GET LOAD ADDRESS CEE4 F3 CC1B ADDD OFFSET ADD LOAD OFFSET ADDRESS CEE7 1F 03 TFR D,U SAVE IN U CEE9 8D 47 BSR GETNEW GET LENGTH CEEB 1F 89 TFR A,B SET UP AS COUNTER CEED 6D 88 22 GETLO0 TST FCBDPT,X CHECK FCB DATA POINTER CEF0 26 07 BNE GETLO2 <>0 MEANS OK FOR SHORTCUT CEF2 8D 3E GETLO1 BSR GETNEW ELSE GET ONE BYTE CEF4 A7 C0 STA 0,U+ STORE IN MEMORY CEF6 5A DECB DECREMENT COUNTER CEF7 27 DD BEQ GET2 AT END, LOOK FOR NEXT FLAG * HERE'S THE SHORTCUT TO QUICK READ BYTES CEF9 1F 12 GETLO2 TFR X,Y SAVE X POINTER TO FCB CEFB 8E C880 LDX #USRFCB+FCBDAT POINT X TO FCB DATA AREA CEFE 1F 98 TFR B,A SAVE B COUNTER IN A CF00 F6 C862 LDB USRFCB+FCBDPT GET DATA POINTER INTO B CF03 3A ABX POINT X TO NEXT BYTE OF DATA CF04 1E 12 EXG X,Y X->FCB AND Y->DATA IN FCB CF06 1F 89 TFR A,B B IS NOW COUNTER AGAIN CF08 A6 A0 GETLO3 LDA 0,Y+ GET NEXT BYTE CF0A A7 C0 STA 0,U+ SAVE IT CF0C 7C C862 INC USRFCB+FCBDPT INCREMENT DATA POINTER CF0F 5A DECB DECREMENT COUNTER CF10 27 C4 BEQ GET2 AT END, LOOK FOR NEXT FLAG CF12 7D C862 TST USRFCB+FCBDPT TEST DATA POINTER CF15 26 F1 BNE GETLO3 REPEAT IF STILL NOT ZERO CF17 20 D9 BRA GETLO1 CF19 8D 08 GETTA BSR GETWRD GET TRANSFER ADDRESS FROM FILE CF1B FD CC1E STD EXECAD STORE EXECUTION ADDRESS CF1E 7C CC1D INC XFERFL SIGNAL THAT TRANSFER ADDRESS EXISTS CF21 20 B3 BRA GET2 AND REPEAT * GETWRD - GET TWO-BYTE WORD FROM FILE CF23 BD D472 GETWRD JSR FCS GET MSB BYTE CF26 26 0F BNE GETNE1 IF ERROR CF28 1F 89 TFR A,B CF2A BD D472 JSR FCS GET LSB CF2D 26 08 BNE GETNE1 IF ERROR CF2F 1E 89 EXG A,B AND SWITCH MSB WITH LSB CF31 39 GETEXI RTS * GETNEW - GET BYTE FROM FILE CF32 BD D472 GETNEW JSR FCS ELSE USE FCS0 CF35 27 FA BEQ GETEXI EXIT IF NO ERROR CF37 A6 01 GETNE1 LDA 1,X LOOK AT ERROR BYTE CF39 81 08 CMPA #$8 END OF FILE? CF3B 1026 03AB LBNE PDEROR NO, SO DO PERROR AND WARMS CF3F 32 62 LEAS 2,S DELETE EXTRA RETURN ADDRESS CF41 86 04 LDA #4 CLOSE AND CONTINUE CF43 A7 84 STA 0,X CF45 BD D472 JSR FCS GO CLOSE INPUT FILE CF48 35 F6 PULS A,B,X,Y,U,PC AND RETURN * GETNX - GET NEXT CHARACTER FROM LINBUF BUFFER, AND * CLASF - CLASSIFY IT AS ALPHANUMERIC OR NOT CF4A 34 10 GETNX PSHS X CF4C B6 CC18 LDA CURRCH CF4F B7 CC19 STA PRECHR STORE PREVIOUS CHARACTER CF52 BE CC14 GETNX0 LDX LPOINT POINT TO CHARACTER CF55 A6 84 LDA 0,X GET CHARACTER CF57 B7 CC18 STA CURRCH STORE CURRENT CHARACTER CF5A 81 0D CMPA #$0D CR? CF5C 27 12 BEQ CLASF0 YES, SKIP INX AND SPACE TEST CF5E B1 CC02 CMPA ENDLIN END OF LINE? CF61 27 0D BEQ CLASF0 YES, SKIP INX AND SPACE TEST * ON OTHER THAN CR OR EOL, STEP PAST IT CF63 30 01 INX CF65 BF CC14 STX LPOINT * IF SPACE, STEP PAST IT TO NEXT NON-SPACE CF68 81 20 GETNX2 CMPA #$20 SPACE? CF6A 26 04 BNE CLASF0 NO CF6C A1 84 CMPA 0,X YES, IS NEXT ONE ALSO SPACE? CF6E 27 E2 BEQ GETNX0 YES, SO READ AND REPEAT * CLASSIFY CHARACTER, AND RETURN CARRY SET IF NOT ALPHANUMERIC CF70 35 10 CLASF0 PULS X CF72 81 30 CLASF CMPA #'0 CF74 25 17 BLO CLASF2 UNDER '0' IS NOT ALPHA CF76 81 39 CMPA #'9 CF78 23 10 BLS CLASF1 DIGITS 0-9 ARE OK CF7A 81 41 CMPA #'A CF7C 25 0F BLO CLASF2 BELOW 'A' IS NOT ALPHA CF7E 81 5A CMPA #'Z CF80 23 08 BLS CLASF1 LETTERS A-X ARE OK CF82 81 61 CMPA #'a CF84 25 07 BLO CLASF2 CHARACTERS BETWEEN Z AND a ARE NG CF86 81 7A CMPA #'z CF88 22 03 BHI CLASF2 ABOVE 'z' IS AGAIN NG CF8A 1C FE CLASF1 CLC CLEAR IF OK CF8C 39 RTS CF8D B7 CC11 CLASF2 STA LASTRM ELSE STORE TERMINATOR CF90 1A 01 SEC SET CARRY CF92 39 RTS AND RETURN * INLINE - ROUTINE TO ENTER DATA FROM KEYBOARD INTO * THE LINBUF LINE BUFFER CF93 34 12 INLINE PSHS A,X CF95 8E C080 INBUF1 LDX #LINBUF POINT TO BUFFER CF98 BF CC14 STX LPOINT SAVE POINTER CF9B BD D26B INBUF2 JSR GETCHT GET NEXT CHARACTER CF9E B1 CC01 CMPA DELETE CONTROL-X? CFA1 26 15 BNE INBUF4 NO * ON CONTROL-X BACKUP TO BEGINNING OF LINE CFA3 8C C080 INBUF3 CMPX #LINBUF AT BEGINNING? CFA6 27 ED BEQ INBUF1 YES, REPEAT CFA8 86 08 LDA #8 CFAA 8D 51 BSR PUCHV PRINT BACKSPACE CFAC 86 20 LDA #$20 CFAE 8D 4D BSR PUCHV CFB0 86 08 LDA #8 CFB2 8D 49 BSR PUCHV BACKSPACE AGAIN CFB4 30 1F DEX CFB6 20 EB BRA INBUF3 UNTIL AT BEGINNING * CONTINUE IF NOT CONTROL-X CFB8 B1 CC00 INBUF4 CMPA BACKSP BS? CFBB 26 1E BNE INBUF5 NO * BACKSPACE CHARACTER CFBD 8C C080 CMPX #LINBUF AT BEGINNING? CFC0 26 06 BNE INBU4A NO, SO DO BACKSPACE OK CFC2 86 20 LDA #$20 YES, SO CANCEL IT CFC4 8D 37 BSR PUCHV CFC6 20 CD BRA INBUF1 AND START OVER CFC8 30 1F INBU4A DEX BACKSPACE CFCA F6 CC07 LDB BECHO CHECK BACKSPACE ECHO CHARACTER CFCD C1 08 CMPB #8 IS IT BS? CFCF 26 04 BNE NOTBE8 NO CFD1 86 20 LDA #$20 YES, SO PRECEDE WITH SPACE CFD3 8D 28 BSR PUCHV CFD5 1F 98 NOTBE8 TFR B,A CFD7 8D 24 BSR PUCHV THEN OUTPUT ECHO CHARACTER CFD9 20 C0 BRA INBUF2 AND GO GET NEXT * CONTINUE IF NOT BACKSPACE CFDB 81 0D INBUF5 CMPA #$0D RETURN? CFDD 27 32 BEQ INBUF6 YES CFDF B1 CC0D CMPA REPEAT CONTROL-A - AGAIN? CFE2 27 1C BEQ INAGIN YES CFE4 81 20 CMPA #$20 CFE6 25 B3 BLO INBUF2 IGNORE OTHER CONTROL CHARS * FINALLY STORE CHARACTER CFE8 A7 84 STA 0,X STORE IT CFEA 8C C0FF CMPX #LINBUF+127 CHECK FOR END OF BUFFER CFED 27 04 BEQ INBU5A YES, AT END SO IGNORE CFEF 30 01 INX NO, UPDATE POINTER CFF1 20 A8 BRA INBUF2 AND GET NEXT CHARACTER CFF3 86 08 INBU5A LDA #8 USE BACKSPACE TO... CFF5 8D 06 BSR PUCHV ERASE EXTRA CHARACTER CFF7 86 07 LDA #7 AND RING BELL CFF9 8D 02 BSR PUCHV CFFB 20 9E BRA INBUF2 AND CONTINUE * VECTOR TO PUTCHT CFFD 7E D2AA PUCHV JMP PUTCHT SAVES A FEW BYTES * ON CONTROL-A REPEAT LINE UP TO CR D000 A6 84 INAGIN LDA 0,X GET NEXT CHAR D002 81 0D CMPA #$0D CR? D004 27 95 BEQ INBUF2 YES, RETURN TO INPUT D006 8D F5 BSR PUCHV ELSE OUTPUT THIS CHAR D008 30 01 INX STEP PAST IT D00A 8C C0FE CMPX #LINBUF+126 AT END OF BUFFER? D00D 26 F1 BNE INAGIN NO, DO NEXT D00F 20 8A BRA INBUF2 YES, RETURN TO INPUT D011 A7 84 INBUF6 STA 0,X STORE CARRIAGE RETURN AT VERY END D013 35 92 PULS X,A,PC AND RETURN * PSTRNG - PRINT A STRING UP TO 04 DELIMITER W CR/LF * PCRLF - PRINT CARRIAGE RETURN AND LINE FEED * PDATA - SIMILAR TO PSTRNG BUT W/O CR/LF D015 8D 10 PSTRNG BSR PCRLF PRECEDE STRING WITH CRLF D017 34 02 PDATA PSHS A OR BEGIN HERE FOR NO CRLF D019 A6 84 PSTRN1 LDA 0,X GET NEXT CHARACTER D01B 81 04 CMPA #4 END OF STRING MARKER? D01D 27 06 BEQ PSTRN2 YES D01F 8D DC BSR PUCHV NO, OUTPUT IT D021 30 01 LEAX 1,X STEP TO NEXT D023 20 F4 BRA PSTRN1 AND REPEAT D025 35 82 PSTRN2 PULS A,PC D027 34 12 PCRLF PSHS A,X D029 86 0D LDA #$0D CR D02B 8D D0 BSR PUCHV D02D 86 0A LDA #$0A LF D02F 8D CC BSR PUCHV D031 BE CC05 LDX NULLWT WAIT LOOP D034 30 01 LEAX 1,X FORCE 0 TO BE SHORTEST D036 30 1F CRLFWA LEAX -1,X D038 26 FC BNE CRLFWA WAIT AFTER CRLF D03A 35 92 PULS A,X,PC * ASSORTED NUMERIC INPUT AND OUTPUT ROUTINES * OUT5D - OUTPUT A DECIMAL NUMBER D03C 34 37 OUT5D PSHS CC,A,B,X,Y CC GETS REPLACED BY ZERO FLAG D03E 6F E4 CLR 0,S ASSUME ZEROES TO BE SUPPRESSED D040 EC 84 LDD 0,X GET BINARY NUMBER TO BE OUTPUT D042 8E D082 LDX #DECTAB POINT TO POWERS OF TEN TABLE * DIGIT LOOP D045 108E 0000 DIGLOO LDY #0 CLEAR COUNTER FOR NUMBER OF SUBTRACTIONS D049 A3 84 DIGLO1 SUBD 0,X SUBTRACT CURRENT POWER OF TEN D04B 25 06 BLO DIGLT0 RESULT LESS THAN 0 D04D 31 A9 0100 LEAY $0100,Y ADD 1 TO LEFT HALF OF Y D051 20 F6 BRA DIGLO1 AND REPEAT * Y NOW CONTAINS FIRST DIGIT. PRINT IF <>0, OR IF * ZERO FLAG <>0. IF ZERO FLAG=0 THEN SKIP IF B WAS * 0, OR REPLACE BY SPACES IF B<>0. D053 E3 84 DIGLT0 ADDD 0,X ADD BACK THE EXTRA SUBTRACTION D055 34 06 PSHS A,B SAVE IT D057 1F 20 TFR Y,D TRANSFER DEC DIGIT TO A D059 8B 30 ADDA #$30 D05B 81 30 CMPA #$30 CHECK FOR 0 D05D 26 11 BNE ODPRNT IF <>0 THEN PRINT IT D05F 6D 62 TST 2,S TEST ZERO FLAG D061 26 0D BNE ODPRNT IF <>0 THEN PRINT IT D063 8C D08A CMPX #DECTAB+8 D066 27 08 BEQ ODPRNT ALWAYS PRINT LAST ZERO D068 6D 64 TST 4,S TEST OLD B FOR SPACE SUPPRESSION D06A 27 09 BEQ NOPRNT NO PRINT IF SUPPRESSION IS ON D06C 86 20 LDA #$20 ELSE CONVERT ZERO TO SPACE D06E 6A 62 DEC 2,S FIX UP ZERO FLAG D070 BD D2AA ODPRNT JSR PUTCHT OUTPUT A DIGIT OR SPACE D073 6C 62 INC 2,S SET ZERO FLAG D075 35 06 NOPRNT PULS A,B RESTORE BIN NUMBER D077 30 02 LEAX 2,X GO TO NEXT POWER OF 10 D079 8C D08C CMPX #DECTAB+10 DONE? D07C 26 C7 BNE DIGLOO NO, DO NEXT DIGIT D07E 32 61 LEAS 1,S FIX STACK D080 35 B6 PULS A,B,X,Y,PC AND RETURN D082 2710 03E8 DECTAB FDB 10000,1000,100,10,1 D086 0064 000A D08A 0001 * DECIN AND HEXIN INPUT ROUTINES D08C 7F CC47 DECIN CLR INFLAG D08F 20 05 BRA GETHE1 AND DO SIMILAR TO HEX D091 86 01 HEXIN LDA #1 D093 B7 CC47 STA INFLAG 1=HEX, 0=DEC D096 8E 0000 GETHE1 LDX #0 D099 BF CC4E STX TEMP NO NUMBER AS YET D09C 5F CLRB CLEAR B FLAG FOR ERROR * MAIN GET NUMBER LOOP D09D BD CF4A GETHD1 JSR GETNX GET NEXT CHARACTER FROM INPUT BUFFER D0A0 25 41 BCS GETFIN FINISHED IF NOT ALPHA D0A2 81 39 CMPA #'9 CHECK IF A DIGIT D0A4 23 09 BLS GETHD2 IS DIGIT D0A6 7D CC47 TST INFLAG HEX OR DECIMAL? D0A9 27 32 BEQ GETSKP ALL LETTERS ARE NG FOR DECIMAL D0AB 81 46 CMPA #'F CHECK FOR VALID HEX LETTER D0AD 22 2E BHI GETSKP G-Z ARE NG, ONLY A-F OK D0AF 80 30 GETHD2 SUBA #$30 CONVERT FROM ASCII D0B1 81 09 CMPA #9 D0B3 23 04 BLS GETHD6 IF DIGIT 0 THROUGH 9 D0B5 84 1F ANDA #$1F CVT LOWER TO UPPER CASE D0B7 80 07 SUBA #7 CONVERT LETTERS FROM ASCII * ON A VALID DIGIT, MULTIPLY TEMP BY BASE (10 OR 16) * AND ADD CURRENT DIGIT D0B9 34 02 GETHD6 PSHS A SAVE CURRENT DIGIT D0BB FC CC4E LDD TEMP GET NUMBER SO FAR D0BE 58 ASLB D0BF 49 ROLA 2*TEMP D0C0 58 ASLB D0C1 49 ROLA 4*TEMP D0C2 7D CC47 TST INFLAG CHECK WHETHER HEX OR DECIMAL D0C5 26 07 BNE GETHDH HEX D0C7 F3 CC4E ADDD TEMP 5*TEMP IF DECIMAL D0CA 58 ASLB D0CB 49 ROLA 10*TEMP D0CC 20 04 BRA GETHD7 AND CONTINUE D0CE 58 GETHDH ASLB D0CF 49 ROLA 8*TEMP IF HEX D0D0 58 ASLB D0D1 49 ROLA 16*TEMP D0D2 EB E0 GETHD7 ADDB 0,S+ ADD CURRENT DIGIT TO TEMP D0D4 89 00 ADCA #0 WITH CARRY D0D6 FD CC4E STD TEMP AND SAVE IT D0D9 C6 01 LDAB #1 SET B FOR VALID NUMBER D0DB 20 C0 BRA GETHD1 AND GO DO NEXT DIGIT * WHEN INVALID DIGIT IS FOUND, STEP TO NEXT CR OR SPACE D0DD BD CF4A GETSKP JSR GETNX GET NEXT CHARACTER D0E0 24 FB BCC GETSKP IF IT'S ALPHA, KEEP STEPPING D0E2 39 RTS FINALLY EXIT WITH CARRY SET * NORMAL EXIT AT END OF NUMBER: C=0, B<>0, X=ANSWER D0E3 BE CC4E GETFIN LDX TEMP GET ANSWER D0E6 1C FE CLC C=0 D0E8 39 RTS * OUT4H ROUTINE - OUTPUT 4-DIGIT HEX NUMBER D0E9 8D 07 OUT4H BSR OUT2H OUTPUT LEFT 2 HEX CHAR D0EB 30 01 LEAX 1,X D0ED 8D 03 BSR OUT2H OUTPUT RIGHT 2 HEX D0EF 30 1E LEAX -2,X RESTORE X D0F1 39 RTS * OUT2H ROUTINE - OUTPUT 2-DIGIT HEX NUMBER D0F2 34 02 OUT2H PSHS A D0F4 A6 84 LDA 0,X OUTPUT 2 HEX CHARS D0F6 8D 06 BSR OUTHL OUTPUT LEFT HEX CHAR D0F8 A6 84 LDA 0,X D0FA 8D 06 BSR OUTHR OUTPUT RIGHT HEX CHAR D0FC 35 82 PULS A,PC RESTORE A AND RETURN * OUTHL AND R - OUTPUT ONE HEX DIGIT D0FE 44 OUTHL LSRA OUTPUT LEFT DIGIT ENTRY D0FF 44 LSRA D100 44 LSRA D101 44 LSRA D102 84 0F OUTHR ANDA #$F OUTPUT HEX RIGHT DIGIT ENTRY D104 8B 30 ADDA #'0 D106 81 39 CMPA #'9 D108 23 02 BLS PUCHVO D10A 8B 07 ADDA #$7 CONVERT FOR A - F D10C 7E D2AA PUCHVO JMP PUTCHT * PERROR - REPORT STAR-DOS ERROR NUMBER * SEPARATE ERROR ENTRY FOR STAR-DOS ROUTINES D10F 34 36 RPTER0 PSHS A,B,X,Y D111 20 08 BRA RPTER1 D113 34 36 PERROR PSHS A,B,X,Y D115 E6 01 LDB FCBERR,X GET ERROR NUMBER D117 1027 0080 LBEQ RPTER2 NO ERROR EXISTS, EXIT D11B 7C CC22 RPTER1 INC OUCHSW TEMP FORCE OUTPUT TO TERMINAL D11E 8E C9B2 LDX #ERRMSG D121 BD D015 JSR PSTRNG PRINT ERROR MESSAGE D124 BE D40B LDX CURFCB D127 BF C9A6 STX TEMP1 TEMP SAVE CURFCB D12A B6 CC20 LDA ERRTYP D12D B7 C9A8 STA TEMP2 AND ALSO ERROR TYPE D130 8E CC30 LDX #NUMBER POINT X WHERE TO PRINT FROM D133 E7 01 STB 1,X SAVE ERROR NUMBER D135 BD D03C JSR OUT5D OUTPUT THE NUMBER D138 BE CC2D LDX ERRVEC CHECK USER'S ERROR VECTOR D13B 26 03 BNE USERDS USE HIS VECTOR IF THERE D13D 8E D19D LDX #ERRNAM ELSE USE ERRCODES.SYS D140 108E CAC4 USERDS LDY #SIRFCB+FCBNAM D144 8D 62 BSR NAMOVE PUT "ERRCODES.SYS" INTO FCB D146 8E CAC0 LDX #SIRFCB D149 B6 CC0B LDA SYSTDR D14C A7 03 STA FCBDRV,X USE SYSTEM DRIVE D14E 86 01 LDA #1 D150 A7 84 STA FCBFUN,X OPEN FOR READ FUNCTION D152 BD D472 JSR FCS OPEN IT D155 26 35 BNE RPTEXI EXIT IF NOT THERE D157 BD D822 JSR FCS4 CLOSE IT AGAIN D15A 26 30 BNE RPTEXI EXIT ON ERROR D15C 6F 84 CLR FCBFUN,X READY TO READ FILE D15E 6C 02 INC FCBRW,X MAKE BELIEVE IT'S STILL OPEN D160 FC CC30 LDD NUMBER A=0, B=ERROR NUMBER D163 4C RPTER3 INCA D164 C0 0A SUBB #10 CONVERT TO DECIMAL D166 2A FB BPL RPTER3 D168 C3 2E3A ADDD #$2E3A CONVERT TO ASCII D16B 1E 89 EXG A,B REVERSE THE TWO DIGITS D16D FD C9AA STD TEMP3 D170 4F CLRA CLEAR PREVIOUS BYTE D171 1F 89 RPTER4 TFR A,B MOVE PREVIOUS INTO B D173 BD D472 JSR FCS READ SECOND BYTE FROM FILE D176 26 14 BNE RPTEXI EXIT ON ERROR D178 10B3 C9AA CMPD TEMP3 FILE AGAINST ERROR CODE D17C 26 F3 BNE RPTER4 NO MATCH SO READ MORE D17E BD D472 RPTER5 JSR FCS READ A BYTE D181 26 09 BNE RPTEXI EXIT ON ERROR D183 81 0D CMPA #$0D END OF LINE? D185 27 05 BEQ RPTEXI STOP ON END D187 BD D2AA JSR PUTCHT ELSE OUTPUT IT D18A 20 F2 BRA RPTER5 AND REPEAT D18C BE C9A6 RPTEXI LDX TEMP1 RESTORE CURFCB D18F BF D40B STX CURFCB D192 B6 C9A8 LDA TEMP2 RESTORE ERRTYP D195 B7 CC20 STA ERRTYP D198 7A CC22 DEC OUCHSW RESTORE CORRECT I/O PORT D19B 35 B6 RPTER2 PULS A,B,X,Y,PC AND RETURN D19D 45 52 52 43 ERRNAM FCC 'ERRCODESSYS' ERROR FILE NAME D1A1 4F 44 45 53 D1A5 53 59 53 * NAMOVE ROUTINE - MOVE NAME FROM X--> TO Y-->, AND * MOVE ROUTINE - MOVE B BYTES FROM X--> TO Y--> D1A8 34 36 NAMOVE PSHS A,B,X,Y D1AA C6 0B LDB #11 COUNTER, 8 FOR NAME AND 3 FOR EXTENSION D1AC 20 03 BRA MOVE1 D1AE 34 36 MOVE PSHS A,B,X,Y D1B0 5D TSTB ALL DONE? D1B1 27 07 MOVE1 BEQ MOVEXI YES D1B3 A6 80 LDA 0,X+ GET CHARACTER D1B5 A7 A0 STA 0,Y+ STORE IT D1B7 5A DECB D1B8 20 F7 BRA MOVE1 DO UNTIL DONE D1BA 35 B6 MOVEXI PULS A,B,X,Y,PC * GETNAM - PROCESS AND MOVE VALID FILE NAME FROM LINBUF * INTO FCB D1BC 34 16 GETNAM PSHS A,B,X D1BE B6 CC5D LDA DEFDRV USUALLY WORKING DRV EXCEPT ON COMMANDS D1C1 A7 03 STA FCBDRV,X STORE IN FCB UNTIL REPLACED D1C3 B6 CC0C LDA WORKDR D1C6 B7 CC5D STA DEFDRV BACK TO WORK DRV JUST IN CASE D1C9 6F 02 CLR FCBRW,X CLEAR RW FLAG TO SHOW FILE CLOSED D1CB 6F 04 CLR FCBNAM,X ERASE FIRST CHAR OF FILE NAME D1CD 6F 0C CLR FCBEXT,X ERASE FIRST CHAR OF EXTENSION * SKIP SPACES D1CF BE CC14 LDX LPOINT POINT TO BUFFER D1D2 BD D261 JSR SKIPSP SKIP SPACES D1D5 AE 62 LDX 2,S POINT BACK TO FCB D1D7 8D 7C BSR GNXTV GET FIRST CHARACTER D1D9 25 3E BCS NGEXIT IF NOT ALPHA IT'S WRONG D1DB 81 41 CMPA #'A CHECK IF LETTER D1DD 24 19 BHS GNAME1 YES, GO GET A NAME D1DF 80 30 SUBA #$30 CVT FROM ASCII D1E1 B1 CC5F CMPA MAXDRV D1E4 22 33 BHI NGEXIT EXIT IF TOO BIG D1E6 1F 89 TFR A,B SAVE DRIVE NUMBER D1E8 8D 6B BSR GNXTV GET NEXT CHARACTER AFTER DRIVE NO. D1EA 81 2E CMPA #'. MUST BE PERIOD D1EC 26 2B BNE NGEXIT IF NOT A PERIOD IT'S WRONG D1EE E7 03 STB FCBDRV,X STORE VALID DRIVE NUMBER D1F0 8D 63 GNAME BSR GNXTV GET NEXT CHARACTER D1F2 25 25 BCS NGEXIT IF NOT ALPHANUMERIC D1F4 81 41 CMPA #'A D1F6 25 21 BLO NGEXIT CAN'T BE A NUMBER D1F8 30 04 GNAME1 LEAX FCBNAM,X POINT TO NAME D1FA C6 08 LDB #8 UP TO 8 ALLOWED D1FC 8D 3B BSR GNOE1 GO GET NAME AND NEXT CHAR D1FE 24 19 BCC NGEXIT MUST BE FOLLOWED BY NON-ALPHA D200 81 2E CMPA #'. PERIOD? D202 26 2F BNE OKEXIT EXIT IF NOT A PERIOD D204 8D 4F BSR GNXTV GET NEXT CHARACTER AFTER PERIOD D206 81 41 CMPA #'A D208 25 1A BLO GDRIV1 MAY BE DRIVE NUMBER ON END D20A C6 03 GEXT LDB #3 UP TO 3 ALLOWED D20C 8D 2B BSR GNOE1 GET THE EXTENSION AND NEXT CHAR D20E 24 09 BCC NGEXIT MUST BE FOLLOWED BY NON-ALPHA D210 81 2E CMPA #'. PERIOD? D212 27 0E BEQ GDRIVE YES, GO GET DRIVE NUMBER D214 BD CF72 JSR CLASF CLASSIFY IT D217 25 1A BCS OKEXIT EXIT IF NOT ALPHANUMERIC D219 AE 62 NGEXIT LDX 2,S POINT BACK TO FCB D21B 86 15 LDA #21 INVALID FILE NAME ERROR D21D A7 01 STA FCBERR,X PUT INTO FCB D21F 46 RORA ALSO SET CARRY TO SIGNAL ERROR D220 35 96 PULS A,B,X,PC AND THEN EXIT D222 8D 31 GDRIVE BSR GNXTV GET NUMBER D224 AE 62 GDRIV1 LDX 2,S POINT BACK TO FCB D226 80 30 SUBA #$30 CVT FROM ASCII D228 B1 CC5F CMPA MAXDRV D22B 22 EC BHI NGEXIT EXIT IF TOO BIG D22D A7 03 STA FCBDRV,X STORE IT D22F 8D 24 BSR GNXTV GET NEXT CHARACTER D231 24 E6 BCC NGEXIT NO GOOD IF ALPHANUMERIC D233 1C FE OKEXIT CLC CLEAR CARRY IF OK D235 35 96 PULS A,B,X,PC AND THEN EXIT * GET B CHARACTERS OF NAME OR EXT, PLACE AT X-> * FOLLOW WITH ZEROES D237 8D 1C GNOE BSR GNXTV GET NEXT CHARACTER D239 24 0E GNOE1 BCC GISOK OK TO USE IT D23B 81 5F CMPA #'_ UNDERLINE? D23D 27 11 BEQ GISOK1 YES, ALSO OK D23F 81 2D CMPA #'- HYPHEN? D241 27 0D BEQ GISOK1 YES, ALSO OK D243 81 2A CMPA #'* ASTERISK? D245 27 09 BEQ GISOK1 YES, ALSO OK D247 20 0F BRA GZERO ELSE FINISH WITH ZEROES AND QUIT D249 B1 CC49 GISOK CMPA FNCASE IS IT HIGHER THAN FNCASE? D24C 25 02 BLO GISOK1 LEAVE AS IS IF YES D24E 84 DF ANDA #$DF ELSE CVT TO UPPER CASE D250 A7 80 GISOK1 STA 0,X+ STORE IT D252 5A DECB DECREMENT COUNTER D253 26 E2 BNE GNOE CONTINUE UNTIL DONE D255 7E CF4A GNXTV JMP GETNX GET NEXT CHAR AND RETURN D258 6F 80 GZERO CLR 0,X+ FINISH UP WITH ZEROES AT END D25A 5A DECB DECREMENT COUNTER D25B 26 FB BNE GZERO CONTINUE UNTIL DONE D25D BD CF72 JSR CLASF CLASSIFY LAST CHARACTER D260 39 RTS ELSE EXIT * SKIP SPACES IN LINE BUFFER D261 A6 80 SKIPSP LDA 0,X+ GET NEXT CHARACTER D263 81 20 CMPA #$20 SPACE? D265 26 03 BNE SKIRTS NO, EXIT WITH PREVIOUS LPOINT D267 BF CC14 STX LPOINT SAVE POINTER TO NEXT AFTER SPACE D26A 39 SKIRTS RTS AND RETURN * GETCHT - GETCH TEST ROUTINE TO SELECT * WHETHER INCH OR INCH2 IS USED D26B 7D CC23 GETCHT TST INCHSW TEST INPUT SWITCH D26E 1026 FA9A LBNE INCH2 USE INCH2 IF NOT ZERO D272 7D CC26 TST FIADDR CHECK IF DISK FILE TO BE USED D275 1027 FA90 LBEQ INCH USE INCH IF ZERO * FOR DISK I/O (INDICATED BY FIADDR <>0) DO IT D279 34 10 PSHS X SAVE X D27B BE CC26 LDX FIADDR POINT TO FCB D27E BD D472 JSR FCS HANDLE THE CHARACTER D281 27 65 BEQ PULXPC EXIT IF NO ERROR D283 7F CC26 CLR FIADDR STOP TAKING INPUT FROM DISK D286 BD D113 JSR PERROR GO REPORT THE ERROR D289 8E D293 LDX #QUEMSG D28C BD D015 JSR PSTRNG NEW LINE AND QUESTION MARK D28F 35 10 PULS X RESTORE X D291 20 D8 BRA GETCHT AND GO BACK TO INPUTTING FROM KBD D293 3A 20 04 QUEMSG FCC ': ',4 * GETCH - CHAR INPUT ROUTINE D296 34 14 GETCH PSHS X,B SAVE REGISTERS D298 7F CC1A CLR DEPCTR CLEAR DEPTH COUNTER FIRST D29B AD 9F D3FB JSR [INCHV] USE MONITOR INPUT ROUTINE D29F 35 14 PULS X,B RESTORE REGISTERS D2A1 39 RTS * VECTORS FOR INPUT AND OUTPUT D2A2 6E 9F D3F9 OUTEEV JMP [OUTCHV] USE MONITOR OUTPUT ROUTINE D2A6 6E 9F D3F7 STATEV JMP [STATVE] USE MONITOR'S STATUS CHECK * PUTCHT (PUTCHR) ROUTINE TO OUTPUT A CHARACTER D2AA 34 02 PUTCHT PSHS A SAVE CHARACTER D2AC 7D CC21 TST SPECIO CHECK FOR SPECIAL I/O D2AF 26 21 BNE PUTCH1 MEANS IGNORE WIDTH D2B1 81 20 CMPA #$20 IS IT CONTROL CHAR? D2B3 24 07 BHS PUTCH0 D2B5 86 01 LDA #1 D2B7 B7 CC29 STA CURCOL CURRENT COLUMN=1 D2BA 20 16 BRA PUTCH1 AND THEN CONTINUE * ON PRINTABLE CHARACTER, CHECK COLUMN D2BC 7C CC29 PUTCH0 INC CURCOL D2BF B6 CC04 LDA WIDTH CHECK DESIRED WIDTH D2C2 27 0E BEQ PUTCH1 ZERO MEANS NO WIDTH DESIRED D2C4 B1 CC29 CMPA CURCOL COMPARE WITH CURRENT COLUMN D2C7 24 09 BHS PUTCH1 NOT PAST WIDTH YET D2C9 A6 E4 LDA 0,S GET CURRENT CHARACTER D2CB 81 20 CMPA #$20 IS IT SPACE? D2CD 26 03 BNE PUTCH1 NO, DON'T DO CRLF D2CF BD D027 JSR PCRLF YES, DO CRLF ON SPACE PAST WIDTH D2D2 35 02 PUTCH1 PULS A RESTORE CHARACTER D2D4 7D CC22 TST OUCHSW CHECK IF USING OUTCH OR OUTCH2 D2D7 26 1A BNE PUTOUT OUTCH2 IS NEVER DISK D2D9 7D CC24 TST FOADDR CHECK IF WE'RE OUTPUTTING TO DISK D2DC 27 15 BEQ PUTOUT NO, USE TTY; ELSE FALL THRU * FOR DISK I/O (INDICATED BY FOADDR <>0) DO IT D2DE 34 10 PSHS X SAVE X D2E0 BE CC24 LDX FOADDR POINT TO FCB D2E3 BD D472 JSR FCS HANDLE THE CHARACTER D2E6 26 02 BNE PDEROR IF AN ERROR D2E8 35 90 PULXPC PULS X,PC ELSE RESTORE X AND RETURN D2EA 7F CC24 PDEROR CLR FOADDR MAKE SURE ERROR MSG DOESN'T GO TO DISK D2ED BD D113 JSR PERROR GO REPORT THE ERROR D2F0 7E CD7D JMP WARMS AND THEN QUIT * PUTOUT - CHAR OUTPUT ROUTINE IF NOT DISK D2F3 34 56 PUTOUT PSHS X,U,B,A SAVE REGISTERS D2F5 CE CC10 LDU #$CC10 POINT TO DATA AREA D2F8 81 0D CMPA #$0D IS IT CR? D2FA 26 32 BNE PUTCH5 NO, SO JUST OUTPUT IT D2FC 6D 59 TST PSFLAG-$CC10,U SHOULD WE PAUSE? D2FE 27 08 BEQ NOPAUS NO * FOLLOWING DELETED 4-25-86 TO ALLOW PTR TO PAUSE *TST OUCHSW TEST OUTPUT SWITCH *BNE MAYPAU MAYBE PAUSE IF USING OUTCH2 *LDX OUTCH+1 ELSE CHECK ADDRESS *CMPX OUTCH2+1 IF DIFFERENT *BNE NOPAUS DIFFERENT, DON'T PAUSE D300 A6 53 MAYPAU LDA PLINES-$CC10,U GET PAGE LINES D302 27 04 BEQ NOPAUS NO PAUSE IF 0 D304 A1 4A CMPA DEPCTR-$CC10,U TIME TO PAUSE? D306 27 0E BEQ PUTCH3 D308 8D 9C NOPAUS BSR STATEV ELSE CHECK KB FOR SOMETHING D30A 27 20 BEQ PUTCH4 NOTHING THERE D30C AD 9F D3E5 JSR [KINPUV] IF SOMETHING, GET IT W/O ECHOING D310 84 7F ANDA #$7F MASK PARITY D312 A1 5A CMPA ESCAPE-$CC10,U ESCAPE? D314 26 16 BNE PUTCH4 NO, GO DO IT D316 6F 4A PUTCH3 CLR DEPCTR-$CC10,U CLEAR DEPTH COUNTER D318 AD 9F D3E5 JSR [KINPUV] ELSE STOP AND GET ONE MORE D31C 84 7F ANDA #$7F MASK PARITY D31E A1 5A CMPA ESCAPE-$CC10,U ESCAPE? D320 27 0A BEQ PUTCH4 YES, CONTINUE WITH CR D322 81 0D CMPA #$0D CR? D324 26 F0 BNE PUTCH3 NO, KEEP WAITING D326 35 56 PULS X,U,B,A RESTORE REGISTERS D328 6E 9F CC16 JMP [BREAK] QUIT ON ESCAPE AND CR D32C 86 0D PUTCH4 LDA #$0D RESTORE CR D32E 8D 26 PUTCH5 BSR OUTSEL OUTPUT IT D330 A6 E4 LDA 0,S RESTORE CHARACTER FROM OLD A D332 81 0A CMPA #$0A WAS IT A LF? D334 26 1E BNE PUTCH7 NO, JUST RETURN D336 A6 53 LDA PLINES-$CC10,U CHECK IF WE'RE COUNTING D338 27 1A BEQ PUTCH7 NO, JUST GO ON D33A 6C 4A INC DEPCTR-$CC10,U YES, INCREMENT COUNTER D33C A1 4A CMPA DEPCTR-$CC10,U COMPARE WITH COUNTER D33E 24 14 BHS PUTCH7 NOT GREATER, KEEP GOING D340 86 01 LDA #1 D342 A7 4A STA DEPCTR-$CC10,U RESET COUNTER D344 A6 58 LDA SLINES-$CC10,U GET EJECT COUNT D346 27 0C BEQ PUTCH7 JUST CONTINUE IF NO EJECTION D348 34 02 PSHS A ELSE PUT ON STACK D34A 86 0A PUTCH6 LDA #$0A GET LINE FEED D34C 8D 08 BSR OUTSEL OUTPUT IT D34E 6A E4 DEC 0,S DECREMENT COUNTER D350 26 F8 BNE PUTCH6 REPEAT UNTIL DONE D352 32 61 LEAS 1,S FIX UP STACK AND DROP THRU TO D354 35 D6 PUTCH7 PULS X,U,B,A,PC RESTORE REGISTERS AND RETURN * OUTSEL - CHOOSE WHETHER TO USE OUTCH OR OUTCH2 D356 7D CC22 OUTSEL TST OUCHSW TEST OUTPUT SWITCH D359 1026 F9B5 LBNE OUTCH2 USE OUTCH2 IF NOT ZERO D35D 7E CD0F JMP OUTCH ELSE USE OUTCH * OTHER MEMORY-RESIDENT COMMANDS * MON - RETURN TO HUMBUG D360 6E 9F D3F3 MONITR JMP [HUMNEV] RETURN VIA POINTER IN CONSOLE DRIVERS * THE FOLLOWING $7E MAKES THE KINPUV AT $D3E5 * INTO A JMP KINPUT FOR INPUT FROM KBD W/O ECHO D3E4 ORG $D3E4 D3E4 7E FCB $7E * ACTUAL CONSOLE ROUTINES FIT FROM $D370 TO $D3E4 D370 ORG BASE+$1370 * KEYBOARD INPUT ROUTINE WITHOUT ECHO D370 6E 9F F804 KINPUT JMP [$F804] DO HUMBUG'S INCH8 ROUTINE D374 84 7F ANDA #$7F REMOVE PARITY D376 39 RTS * IRQ HANDLER D377 1A 50 IRQHAN ORCC #$50 TURN OFF INTERRUPTS D379 3B RTI AND DO NOTHING * TIMER ON, OFF, INIT D37A 39 TIMRTS RTS DO NOTHING * RE-ENTER HUMBUG VIA NXTCMD D37B 6E 9F F802 HUMNEX JMP [$F802] * SERIAL PORT INITIALIZATION ROUTINE D37F 39 SERINI RTS NONE REQUIRED * SERIAL PORT STATUS CHECK D380 6E 9F F808 STAT JMP [$F808] VIA HUMBUG' INCHEK * OUTPUT CHARACTER VIA HUMBUG D384 6E 9F F80A OUTEEE JMP [$F80A] VIA OUTNOT * INPUT CHARACTER WITHOUT ECHO D388 6E 9F F806 INEEE JMP [$F806] VIA HUMBUG'S INEEE ENTRY POINT * SOME PEOPLE PUT PARTS OF DISK DRIVERS HERE * CONSOLE DRIVER VECTORS D3E5 ORG BASE+$13E5 D3E5 D370 KINPUV FDB KINPUT KEYBOARD INPUT WITHOUT ECHO D3E7 D377 IRQHAV FDB IRQHAN IRQ HANDLER D3E9 DFC2 SWI3VE FDB $DFC2 HUMBUG'S SWI3 VECTOR D3EB DFC8 IRQVEC FDB $DFC8 HUMBUG'S IRQ VECTOR D3ED D37A TIMOFF FDB TIMRTS TIMER OFF - RTS D3EF D37A TIMON FDB TIMRTS TIMER ON - RTS D3F1 D37A TIMINI FDB TIMRTS TIMER INITIALIZE - RTS D3F3 D37B HUMNEV FDB HUMNEX HUMBUG'S NEXT COMMAND ENTRY D3F5 D37F SINITV FDB SERINI SERIAL PORT INITIALIZATION ROUTINE D3F7 D380 STATVE FDB STAT HUMBUG'S INCHEK ENTRY D3F9 D384 OUTCHV FDB OUTEEE HUMBUG'S OUTNOT OUTPUT ENTRY D3FB D388 INCHV FDB INEEE HUMBUG'S INEEE WITH ECHO ENTRY D400 ORG BASE+$1400 LIES AT $D400 >D400 7E D436 FCSINV JMP FCSINI FCS INITIALIZATION >D403 7E D43D FCSCLV JMP FCSCLS CLOSE ALL OPEN FILES >D406 7E D472 FCSV JMP FCS EXECUTE FILE MANAGEMENT SYSTEM D409 0000 FBAPTR FDB 0000 FCB BASE POINTER (00=EMPTY) D40B CURFCB RMB 2 CURRENT FCB * MISC TEXT STRINGS * CAUTION - THESE OVERLAP $D41D-D434, AND MAY GET * CLOBBERED BY PROGRAMS WHICH ATTEMPT TO ACCESS * ANOTHER DOS'S DRIVE DATA TABLE D40D 49 4E 56 41 OCMSG1 FCC 'INVALID FCS CODE',4 D411 4C 49 44 20 D415 46 43 53 20 D419 43 4F 44 45 D41D 04 D41E 43 4F 4E 54 OCMSG2 FCC 'CONTINUE? ',4 D422 49 4E 55 45 D426 3F 20 04 * HOOKS FOR A DISK CACHE * ENTER WITH X-> FCB AND BEQ IF WRITE, BNE IF READ D432 ORG $D432 D432 39 CACHE RTS RETURN BACK TO FCS 9 & 10 D433 12 NOP D434 12 NOP A TOTAL OF 3 BYTES FOR A JUMP D435 01 VERFLG FCB 1 VERIFY FLAG * FCS INITIALIZATION D436 34 17 FCSINI PSHS CC,X,B,A D438 BD DE15 JSR DINIT DO DISK DRIVER INITIALIZATION D43B 20 26 BRA CLRDTB CLEAR DRIVE TABLE AND EXIT * FCSCLS - CLOSE ALL OPEN FILES D43D 34 16 FCSCLS PSHS A,B,X D43F 7F CC20 CLR ERRTYP D442 BE D409 FCSCL0 LDX FBAPTR LOOK AT FCB LIST POINTER D445 27 1A BEQ FCSEXT STOP IF NOTHING ELSE IS OPEN D447 30 88 E4 FCSCL1 LEAX -28,X POINT TO BEGINNING OF OPEN FCB D44A 86 04 LDA #4 D44C A7 84 STA FCBFUN,X CLOSE FILE COMMAND D44E 8D 22 BSR FCS GO CLOSE THIS FILE D450 27 F0 BEQ FCSCL0 GO CLOSE THE NEXT FILE IF NO ERROR D452 AF 62 FCSCL2 STX 2,S ON ERROR X WILL HAVE ADDR OF BAD FCB D454 4F CLRA D455 5F CLRB D456 FD D409 STD FBAPTR FORCE ALL FILES OFF LINE D459 C6 0D LDB #13 ERROR 13 = CLOSE FILE ERROR D45B BD D10F JSR RPTER0 GO REPORT IT D45E F7 CC20 STB ERRTYP STORE IT D461 34 01 FCSEXT PSHS CC SAVE Z CONDITION CODE D463 8E CC66 CLRDTB LDX #DRTABL READY TO ERASE DRIVE DATA TABLE D466 C6 5A LDB #90 90 BYTES WORTH D468 6F 80 FCSEX1 CLR 0,X+ D46A 5A DECB D46B 26 FB BNE FCSEX1 D46D BD DD42 JSR RANCLS CLEAR RANDOM ROUTINES D470 35 97 PULS CC,A,B,X,PC RESTORE REGISTERS AND QUIT * FCS - FILE MANAGEMENT SYSTEM D472 34 36 FCS PSHS A,B,X,Y SAVE REGISTERS D474 BF D40B STX CURFCB SAVE CURRENT FCB ADDRESS D477 7F CC20 CLR ERRTYP D47A 6F 01 CLR FCBERR,X AND ALSO IN FCB D47C E6 84 LDB FCBFUN,X FCS FUNCTION CODE D47E 1027 009F LBEQ FCS0FA ON FCS 0 GO THERE FAST D482 C1 17 CMPB #23 D484 22 1E BHI FCSCNG CODES >23 ARE NOT VALID D486 6D 03 TST FCBDRV,X CHECK DRIVE NUMBER D488 2A 09 BPL FCSNOS NO SEARCH IF A VALID NUMBER D48A C1 03 CMPB #3 CHECK FOR A FILE OPEN COMMAND D48C 23 75 BLS FCSERC ON OPEN GO SEARCH FOR A DRIVE D48E B6 CC0C LDA WORKDR ALL OTHERS DEFAULT TO WORK DRIVE D491 A7 03 STA FCBDRV,X D493 58 FCSNOS ASLB MULT BY 2 D494 8E D4D3 LDX #FCSTAB POINT TO JUMP TABLE D497 30 95 LEAX [B,X] PICK UP ADDRESS OF CORRECT FUNCTION D499 BF CC55 STX FCSJMP STORE IN MEMORY D49C 35 36 PULS A,B,X,Y RESTORE REGISTERS D49E 6E 9F CC55 JMP [FCSJMP] AND GO TO CORRECT ROUTINE * ILLEGAL FCS OPERATION CODE D4A2 34 36 FCSCNP PSHS A,B,X,Y SAVE REGISTERS D4A4 86 01 FCSCNG LDA #1 D4A6 B7 CC20 STA ERRTYP D4A9 8E D40D LDX #OCMSG1 D4AC BD D015 JSR PSTRNG REPORT OC ERROR D4AF AE 62 LDX 2,S RESTORE FCB POINTER D4B1 E6 84 LDB 0,X GET OP CODE D4B3 4F CLRA D4B4 34 06 PSHS D SAVE ON STACK D4B6 30 E4 LEAX 0,S POINT TO IT D4B8 BD D03C JSR OUT5D OUTPUT CODE NUMBER D4BB 32 62 LEAS 2,S FIX STACK D4BD 8E D41E LDX #OCMSG2 D4C0 BD D015 JSR PSTRNG ASK IF CONTINUE D4C3 BD CD15 JSR GETCHR GET ANSWER D4C6 84 DF ANDA #$DF CVT TO UPPER D4C8 81 59 CMPA #'Y YES? D4CA 1026 F8AF LBNE WARMS QUIT IF NOT YES D4CE BD DCCE JSR CPYERR COPY ERROR INTO FCB D4D1 35 B6 PULS A,B,X,Y,PC ELSE GO BACK TO USER D4D3 D51F D69A FCSTAB FDB FCS0,FCS1,FCS2,RAN3,FCS4,FCS5 D4D7 D722 DD51 D4DB D822 D960 D4DF D97B D994 FDB FCS6,FCS7,FCS8,FCS9,FCS10,FCS11,FCS12,FCS13 D4E3 DB4A DB44 D4E7 DB4A D9D8 D4EB DA04 DA91 D4EF D4A2 DAFC FDB FCSCNP,FCS15,FCS16,RAN17,RAN18,FCSCNP,FCS20 D4F3 D98D DD57 D4F7 DD5A D4A2 D4FB DB21 D4FD DD5D DD60 FDB RAN21,RAN22,RAN23 D501 DD63 * IF DRIVE NUMBER = $FF, AND IT'S A REQUEST TO * OPEN A FILE, SEARCH FOR CORRECT DRIVE NUMBER D503 BD DB21 FCSERC JSR FCS20 FIND NEXT DRIVE D506 26 15 BNE FCSENG NG IF NO DRIVE FOUND D508 BD D472 JSR FCS NOW REPEAT FUNCTION ON THIS DRIVE D50B 27 10 BEQ FCSENG WAS COMPLETED OK, SO EXIT D50D A6 04 LDA FCBNAM,X CHECK IF NAME CORRUPTED D50F 26 05 BNE FCSNMK NO, OK TO USE D511 A6 88 24 LDA FCBNMB,X YES, SO RESTORE IE D514 A7 04 STA FCBNAM,X D516 A6 03 FCSNMK LDA FCBDRV,X CHECK DRIVE NUMBER D518 B1 CC5F CMPA MAXDRV IS IT LAST DRIVE? D51B 26 E6 BNE FCSERC NO, SO TRY ANOTHER DRIVE * EITHER FUNCTION WAS COMPLETED ON THIS DRIVE, OR * GOT AN ERROR AND THIS IS THE LAST DRIVE, OR * ELSE NO DRIVE WAS FOUND; EITHER WAY, EXIT D51D 35 B6 FCSENG PULS A,B,X,Y,PC * FCS0 - FCS FUNCTION 0. READ OR WRITE NEXT BYTE FROM/TO * FILE PREVIOUSLY OPENED. D51F 34 36 FCS0 PSHS A,B,X,Y SAVE REGISTERS * CHECK FOR CORRECT READ/WRITE STATUS D521 E6 02 FCS0FA LDB FCBRW,X R/W STATUS BYTE D523 5A DECB D524 27 15 BEQ FCS0R READ IF IT WAS A 1 D526 5A DECB D527 1027 0088 LBEQ FCS0W WRITE IF IT WAS A 2 D52B 5A DECB D52C 27 0D BEQ FCS0R READ IF IT WAS A 3 D52E C1 80 CMPB #$80 WAS IT 83? D530 26 05 BNE ERR18 NO D532 E7 88 3F STB FCBUPD,X YES, FILE IS UPDATED D535 20 04 BRA FCS0R SO GO TO READ ALSO * FILE NOT OPEN ERROR 18 D537 86 12 ERR18 LDA #18 FILE NOT OPEN D539 20 73 BRA F0RERR * READ NEXT BYTE FROM FILE D53B 7F CC58 FCS0R CLR SCFLAG CLEAR SP COMPR FLAG D53E A6 88 3B LDA FCBSCF,X CHECK SPACE COMPRESSION FLAG D541 27 07 BEQ FCS0RD ZERO MEANS COMPR, BUT READ D543 2B 05 BMI FCS0RD >128 MEANS NO COMPR D545 6A 88 3B DEC FCBSCF,X ELSE DECREMENT COUNTER D548 20 1C BRA GIVESP AND GO GIVE A SPACE D54A 6D 88 22 FCS0RD TST FCBDPT,X CHECK DATA POINTER D54D 27 3E BEQ FCS0RN 0 MEANS MUST START NEW SECTOR * WHILE STILL IN CURRENT SECTOR D54F E6 88 22 FCS0R0 LDB FCBDPT,X GET DATA POINTER TO NEXT BYTE D552 31 88 40 LEAY FCBDAT,X POINT Y TO DATA AREA D555 4F CLRA FORCE UNSIGNED ADD IN FOLLOWING D556 A6 AB LDA D,Y GET NEXT BYTE FROM DATA D558 A7 E4 STA 0,S SAVE BYTE IN A ON STACK D55A 6C 88 22 INC FCBDPT,X INCREMENT POINTER TO NEXT D55D 7D CC58 TST SCFLAG WAITING FOR SP COMPR COUNT? D560 27 0A BEQ FCS0R1 NO, JUST GO ON D562 4A DECA YES, SUBTRACT ONE FROM COUNT D563 A7 88 3B STA FCBSCF,X STORE IN FCB D566 86 20 GIVESP LDA #$20 SUBSTITUTE FIRST SPACE D568 A7 E4 STA 0,S SAVE AS A ON STACK D56A 20 0E BRA F0REXT AND EXIT D56C 81 09 FCS0R1 CMPA #$09 POSSIBLE SPACE COMPR? D56E 26 0A BNE F0REXT NO, SO JUST RETURN IT D570 6D 88 3B TST FCBSCF,X SHOULD WE DECOMPRESS IT? D573 26 05 BNE F0REXT NO, JUST RETURN IT D575 B7 CC58 STA SCFLAG YES, SO SET FLAG AND ... D578 20 D0 BRA FCS0RD ...GO GET A COUNT D57A BD DCCE F0REXT JSR CPYERR CHECK AND MOVE ERROR IF ANY D57D 26 0C BNE F0RE2X EXIT ON ERROR D57F 6D E4 TST 0,S CHECK CHARACTER BEING RETURNED D581 26 07 BNE F0REX1 NOT ZERO, OK TO EXIT D583 AE 62 LDX 2,S POINT BACK TO FCB D585 6D 88 3B TST FCBSCF,X YES, SPACE COMPRESSING? D588 2A B1 BPL FCS0R YES, ZERO IS INVALID SO READ NEXT D58A 4F F0REX1 CLRA RESET EQUALS FLAG D58B 20 57 F0RE2X BRA F0REX2 GO CLEAR CARRY AND RETURN * WHEN FCBDPT=0 WE NEED A NEW SECTOR D58D BD DD45 FCS0RN JSR RAN0R CHECK FOR RANDOM READ D590 26 E8 BNE F0REXT IF ERROR D592 EC 88 40 LDD FCBDAT,X CHECK T-S POINTER D595 27 15 BEQ F0REOF ON EOF GO DO ERROR 8 D597 ED 88 1E STD FCBCTR,X ELSE STORE NEW AS CURRENT T-S D59A BD DB44 JSR FCS9 GO READ NEXT SECTOR D59D 26 DB BNE F0REXT EXIT ON ERROR D59F EC 88 42 LDD FCBDAT+2,X D5A2 ED 88 20 STD FCBCRN,X CURRENT RECORD NUMBER FROM FILE D5A5 86 04 LDA #4 START READING WITH BYTE 4 D5A7 A7 88 22 STA FCBDPT,X D5AA 20 A3 BRA FCS0R0 NOW GO PROCESS THE BYTE * AT END OF FILE, GENERATE ERROR 8 D5AC 86 08 F0REOF LDA #8 ERROR 8 D5AE B7 CC20 F0RERR STA ERRTYP D5B1 20 C7 BRA F0REXT AND EXIT * WRITE NEXT BYTE TO FILE D5B3 6D 88 17 FCS0W TST FCBRAN,X IS IT A RANDOM FILE? D5B6 BD DD48 JSR RAN0W1 GO CHECK IT D5B9 27 05 BEQ FCS0WN OK TO PROCEED D5BB 86 13 LDA #19 RANDOM, BUT RANDOM NOT LOADED ERROR D5BD 7E D870 JMP ERR22A PUT INTO ERRTYP, COPY, PULS, AND EXIT D5C0 E6 88 3B FCS0WN LDB FCBSCF,X SPACE COMPRESSION? D5C3 2B 43 BMI F0WRI1 NO, SO JUST WRITE CHARACTER AND QUIT * 0-7F MEANS COMPRESSION, SO COMPRESS D5C5 81 20 F0COMP CMPA #$20 IS CURRENT CHARACTER A SPACE? D5C7 26 1F BNE F0NOSP NO, SO GO WRITE PREVIOUS IF ANY D5C9 6C 88 3B INC FCBSCF,X YES, SO INCREMENT COUNTER D5CC E6 88 3B LDB FCBSCF,X LOOK AT IT D5CF C1 7F CMPB #$7F CHECK FOR MAXIMUM NUMBER D5D1 24 03 BHS F0WOUT IF >126, GO OUTPUT IT D5D3 4F CLRA ELSE ERASE ERROR FLAG D5D4 20 0E BRA F0REX2 CLR CARRY, RETURN *IF MORE THAN 126 SPACES, OUTPUT AND RESET D5D6 86 09 F0WOUT LDA #$09 TAB D5D8 8D 2C BSR F0WRIT WRITE IT OUT D5DA 26 0A BNE F0WEX EXIT ON ERROR D5DC A6 88 3B LDA FCBSCF,X GET SPACE COUNT D5DF 6F 88 3B CLR FCBSCF,X CLEAR IT IN FCB D5E2 8D 22 BSR F0WRIT WRITE IT OUT D5E4 1C FE F0REX2 ANDCC #$FE CLEAR CARRY D5E6 35 B6 F0WEX PULS A,B,X,Y,PC AND RETURN * IF CURRENT IS NOT A SPACE, OUTPUT IT D5E8 E6 88 3B F0NOSP LDB FCBSCF,X GET SPACE COUNT D5EB 27 1B BEQ F0WRI1 NO COMPRESSED SPACES IF 0 D5ED C1 01 CMPB #1 SEE IF ONLY 1 SPACE D5EF 26 04 BNE COMPRE DO COMPRESSED IF >1 D5F1 86 20 LDA #$20 ELSE OUTPUT A PLAIN SPACE D5F3 20 08 BRA JUST1 D5F5 86 09 COMPRE LDA #$09 ELSE OUTPUT TAB FIRST D5F7 8D 0D BSR F0WRIT WRITE IT OUT D5F9 26 EB BNE F0WEX EXIT ON ERROR D5FB 1F 98 TFR B,A GET SPACE COUNT D5FD 6F 88 3B JUST1 CLR FCBSCF,X CLEAR IT IN FCB D600 8D 04 BSR F0WRIT WRITE IT OUT D602 26 E2 BNE F0WEX EXIT ON ERROR D604 20 02 BRA F0WRI1 OUTPUT IT AND QUIT * ROUTINE TO OUTPUT CHARACTER IN A D606 34 36 F0WRIT PSHS A,B,X,Y SAVE EVERYTHING D608 EC 88 20 F0WRI1 LDD FCBCRN,X CURRENT RECORD NUMBER D60B 27 06 BEQ F0NEW NOT YET INITIALIZED IF 0000 OR FFXX D60D 4C INCA CHECK FOR $FF BY INCREMENTING D60E 26 47 BNE F0OLD IS INITIALIZED IF NOT 0000 OR FFXX D610 6F 88 20 CLR FCBCRN,X CHANGE FF TO 00 IF NEEDED * WHEN FCBCRN=0 OR FFXX, FILE HAS JUST BEEN OPENED AND THIS * IS THE FIRST BYTE TO BE WRITTEN TO IT D613 BD DBDA F0NEW JSR GRABIT GO GRAB A FREE SECTOR D616 26 3A BNE F0RITX D618 EC 88 13 LDD FCBLTR,X LAST TR-SEC SO FAR D61B ED 88 11 STD FCBFTR,X IT'S ALSO THE FIRST TR-SEC D61E ED 88 1E STD FCBCTR,X AND ALSO CURRENT TR-SEC D621 BD DD4B JSR RAN0W2 GO DO RANDOM D624 26 2C F0FER0 BNE F0RITX EXIT ON ERROR D626 31 88 40 F0FERA LEAY FCBDAT,X POINT TO USRFCB DATA AREA D629 5F CLRB COUNTER =256 D62A 6F A0 F0FER1 CLR 0,Y+ D62C 5A DECB D62D 26 FB BNE F0FER1 ERASE DATA AREA OF FCB D62F EC 88 15 LDD FCBSIZ,X D632 C3 0001 ADDD #1 SIZE=SIZE+1 D635 ED 88 15 STD FCBSIZ,X D638 EC 88 20 LDD FCBCRN,X D63B C3 0001 ADDD #1 BUMP CURRENT RECORD NUMBER D63E ED 88 20 STD FCBCRN,X D641 ED 88 42 STD FCBDAT+2,X BECOMES ALSO SECTOR COUNT D644 E6 88 22 F0PUT LDB FCBDPT,X DATA POINTER D647 6C 88 22 INC FCBDPT,X BUMP BYTE POINTER D64A 30 88 40 LEAX FCBDAT,X POINT TO DATA AREA D64D 3A ABX POINT TO NEXT EMPTY BYTE IN DATA AREA D64E A6 E4 LDA 0,S GET OUTPUT BYTE D650 A7 84 STA 0,X PUT INTO BUFFER D652 BD DCCE F0RITX JSR CPYERR D655 20 8D BRA F0REX2 AND FINALLY EXIT * AFTER THE VERY FIRST BYTE IS PUT INTO FCB, DO THIS D657 E6 88 22 F0OLD LDB FCBDPT,X CHECK DATA POINTER D65A 26 E8 BNE F0PUT JUST PUT BYTE IN IF NOT AT END OF SECTOR * FINALLY, IF DPT=0, THEN WE HAVE REACHED END OF * SECTOR. WE HAVE TO WRITE THIS ONE OUT AND START A NEW D65C BD DBDA JSR GRABIT GO GRAB A NEW SECTOR D65F 26 F1 BNE F0RITX EXIT ON ERROR D661 EC 88 13 LDD FCBLTR,X GET ITS TR-SEC NUMBER FROM SIRFCB D664 ED 88 40 STD FCBDAT,X PUT IN AS POINTER TO NEXT D667 BD DB4A JSR FCS10 GO WRITE IT TO DISK D66A 26 E6 BNE F0RITX D66C 86 04 LDA #4 NEXT BYTE WILL GO INTO POS 4 D66E A7 88 22 STA FCBDPT,X D671 EC 88 13 LDD FCBLTR,X POINTER TO NEXT D674 ED 88 1E STD FCBCTR,X BECOMES NOW THE CURRENT TR-SEC D677 BD DD4E JSR RAN0W3 GO DO RANDOM D67A 20 A8 BRA F0FER0 NOW CHECK ERROR, ERASE DATA AREA, ETC. * FCS1 - FCS FUNCTION 1. OPEN FILE FOR READ * FOLLOWING IS PUT HERE STRICTLY TO SAVE A FEW BYTES * IT IS USED BELOW AND AGAIN IN FCS12 D67C 31 88 23 F1SVBY LEAY FCBNMB-1,X POINT TO TEMP NAME BUFFER D67F 30 03 LEAX FCBNAM-1,X AND TO NAME D681 C6 0C LDB #12 D683 BD D1AE JSR MOVE SAVE NAME AND DRIVE NO FOR COMPATIBILITY D686 AE 64 LDX 4,S POINT X BACK TO FCB D688 BD DC5D JSR FINAME FIND NAME IN DIRECTORY D68B 39 RTS * THE FOLLOWING IS ALSO PUT HERE STRICTLY TO SAVE A * FEW BYTES. IT IS USED HERE AND IN FCS2 TO CLEAR THE * REST OF THE FCB D68C C6 0F FC1CLR LDB #15 READY TO ERASE FCB AFTER EXT D68E 4F CLRA D68F 6F 8B FCS2EE CLR D,X ERASE NEXT LOCATION D691 5C INCB D692 26 FB BNE FCS2EE D694 7F CC20 CLR ERRTYP D697 6F 01 CLR FCBERR,X NO ERROR YET D699 39 RTS D69A 34 36 FCS1 PSHS A,B,X,Y D69C BD DC3F FCS1A JSR CHKUSE CHECK IF FCB IS IN USE D69F 26 59 BNE FCS1EX EXIT ON ERROR D6A1 8D E9 BSR FC1CLR GO CLEAR REST OF FCB D6A3 8D D7 BSR F1SVBY GO MOVE NAME INTO SECONDARY & FINAME D6A5 27 0B BEQ FOUNAM IF IT WAS FOUND D6A7 B6 CC20 LDA ERRTYP SOME ERROR, CHECK IT D6AA 81 04 CMPA #4 NOT FOUND? D6AC 26 4C BNE FCS1EX NO, JUST EXIT D6AE 6F 04 CLR FCBNAM,X NOT FOUND, CLEAR NAME FOR COMPATIBILITY D6B0 20 48 BRA FCS1EX THEN EXIT D6B2 31 04 FOUNAM LEAY FCBNAM,X Y-> USER'S NAME D6B4 8E C984 LDX #DIRFCB+FCBNAM X-> DIRECTORY ENTRY D6B7 C6 18 LDB #24 D6B9 BD D1AE JSR MOVE MOVE 24 BYTES FROM DIR TO USER'S D6BC AE 62 LDX 2,S X-> TO USER'S FCB D6BE A6 0F LDA FCBATT,X CHECK FILE ATTRIBUTES D6C0 84 20 ANDA #$20 READ PROTECT? D6C2 27 07 BEQ FCS1B NO, SO CONTINUE D6C4 86 0C LDA #12 YES, SO IT'S ERROR 12 D6C6 B7 CC20 STA ERRTYP D6C9 20 2F BRA FCS1EX AND EXIT D6CB EC 88 11 FCS1B LDD FCBFTR,X FIRST TRACK AND SECTOR D6CE ED 88 40 STD FCBDAT,X POINTER IN DATA AREA D6D1 86 01 LDA #1 SET FOR READING (DONE IN GETUPD) D6D3 8D 2A BSR GETUPD GET DIR INFO & UPDATE FILE LIST PTRS * SKIP FIRST TWO SECTORS IF RANDOM FILE D6D5 6D 88 17 TST FCBRAN,X IS IT RANDOM? D6D8 27 20 BEQ FCS1EX NO, SO JUST EXIT D6DA 6A 88 3B DEC FCBSCF,X YES, KILL SPACE COMPRESSION D6DD 108E 01F8 LDY #504 504 BYTES IN TWO SECTORS D6E1 BD D51F F1LOOP JSR FCS0 GO READ A BYTE D6E4 26 14 BNE FCS1EX EXIT ON ERROR D6E6 31 3F LEAY -1,Y DECREMENT COUNTER D6E8 26 F7 BNE F1LOOP AND REPEAT D6EA A6 03 LDA FCBDRV,X GET DRIVE NUMBER D6EC B7 CAC3 STA SIRFCB+FCBDRV PUT INTO SIR FCB D6EF BD DC99 JSR SUMNAM GET SECTORS PER TRACK D6F2 26 06 BNE FCS1EX EXIT ON ERROR D6F4 F6 CADB LDB SIRFCB+27 GET SECTORS PER TRACK D6F7 E7 88 3C STB FCBSPT,X STORE IT D6FA BD DCCE FCS1EX JSR CPYERR TEST AND COPY ERRTYP INTO 1,X D6FD 35 B6 PULS A,B,X,Y,PC AND RETURN * SET R/W FLAG WITH 1 (READ) OR 2 (WRITE), CLEAR FUNCTION CODE, * UPDATE FCB FILE LIST POINTERS AND GET DIRECTORY INFO INTO FCB D6FF A7 02 GETUPD STA FCBRW,X SET R/W STATUS FLAG D701 6F 88 3F CLR FCBUPD,X MARK NOT YET UPDATED D704 6F 84 CLR FCBFUN,X READY FOR FCS0 (WRITE OR READ) NEXT D706 10BE D409 LDY FBAPTR POINTER TO FIRST OPEN FCB (IF ANY) D70A 10AF 88 1C STY FCBLST,X BECOMES POINTER IN THIS FILE D70E 31 88 1C LEAY FCBLST,X POINT TO THIS FCB'S POINTER D711 10BF D409 STY FBAPTR GIVE IT TO STAR-DOS D715 FC C9AF LDD DIRFCB+FCBDIT D718 ED 88 2F STD FCBDIT,X DIRECTORY TRACK-SECTOR D71B B6 C9B1 LDA DIRFCB+FCBDIB D71E A7 88 31 STA FCBDIB,X DIRECTORY BYTE POINTER D721 39 RTS * FCS2 - FCS FUNCTION 2. OPEN A FILE FOR WRITE D722 34 76 FCS2 PSHS A,B,X,Y,U D724 BD DC3F JSR CHKUSE SEE IF FCB IS IN USE D727 26 18 BNE FCS2EX EXIT IF YES D729 A6 03 LDA FCBDRV,X GET DRIVE NUMBER D72B B7 CAC3 STA SIRFCB+FCBDRV PUT INTO SIR FCB D72E B1 CC5F CMPA MAXDRV CHECK FOR MAXIMUM DRIVE NUMBER D731 23 04 BLS FCS2DO <=9 IS OK D733 86 0F LDA #15 DRIVE NUMBER ERROR D735 20 07 BRA FCS2ER D737 BD DC5D FCS2DO JSR FINAME FIND NAME IN DIRECTORY D73A 26 0A BNE FCS2NT OK IF THERE'S AN ERROR D73C 86 03 LDA #3 ELSE FILE EXISTS, ERROR 3 D73E B7 CC20 FCS2ER STA ERRTYP ERROR EXIT ALSO D741 BD DCCE FCS2EX JSR CPYERR D744 35 F6 PULS A,B,X,Y,U,PC AND QUIT * OK TO OPEN A FILE NOT YET ON DISK, BUT CHECK ERROR D746 B6 CC20 FCS2NT LDA ERRTYP D749 81 04 CMPA #4 FILE NOT THERE? D74B 26 F4 BNE FCS2EX NO, MUST BE SOMETHING ELSE BAD D74D BD D68C JSR FC1CLR GO CLEAR REST OF FCB HEADER * NOW LOOK AT SIR, MAKE SURE IT'S THE SAME DISK AND * THERE'S ROOM D750 BD DC99 JSR SUMNAM READ SIR INTO SIRFCB AND CHKSUM IT D753 26 EC BNE FCS2EX ON ERROR D755 E6 03 LDB FCBDRV,X GET DRIVE NUMBER D757 BD D93C JSR DTPOIN POINT X TO DRIVE'S ENTRY IN DRTABL D75A 1F 13 TFR X,U D75C EC 84 LDD 0,X CHECK IF TABLE ENTRY IS EMPTY D75E 27 09 BEQ F2EMTY EMPTY * TABLE ENTRY NOT EMPTY, SO CHECK CHECKSUM D760 10B3 CC59 CMPD CHKSUM SAME? D764 27 06 BEQ F2DKOK YES IT'S SAME DISK, SO CONTINUE D766 7E D934 JMP STOP29 QUIT IMMEDIATELY ON DISK SWITCHED * TABLE ENTRY EMPTY, SO PUT SIR DATA INTO IT D769 BD D94B F2EMTY JSR GETSIR COPY SIR DATA INTO DRTABL * NOW CHECK IF ENOUGH ROOM IS ON DISK D76C EC 06 F2DKOK LDD 6,X CHECK ROOM LEFT ON DISK * ON RANDOM FILES, NEED AT LEAST 3 SECTORS D76E 26 04 BNE F2ROOM YES, IT'S OK D770 86 07 LDA #7 NO, REPORT ERROR 7 D772 20 CA BRA FCS2ER * NEXT FIND AN EMPTY SPOT IN THE DIRECTORY D774 8E C980 F2ROOM LDX #DIRFCB D777 BD D97B JSR FCS6 OPEN IT D77A BD D994 F2FIND JSR FCS7 GET NEXT RECORD D77D 26 09 BNE F2DIRE DIRECTORY ERROR - GO CHECK IT D77F A6 04 LDA FCBNAM,X LOOK AT FIRST CHARACTER D781 27 5D BEQ F2FOUN FOUND AN EMPTY SPOT AT END D783 4C INCA D784 27 5A BEQ F2FOUN FOUND A DELETED ENTRY D786 20 F2 BRA F2FIND ELSE GO LOOK FOR MORE * AT DIRECTORY ERROR, SEE IF EOF OR SOMETHING ELSE D788 B6 CC20 F2DIRE LDA ERRTYP GET ERROR CODE D78B 81 08 CMPA #8 EOF? D78D 26 B2 BNE FCS2EX SOMETHING ELSE, SO IT'S AN ERROR * IT WAS DIRECTORY EOF, SO GRAB ANOTHER SECTOR FOR IT D78F 6F 01 CLR FCBERR,X CLEAR THE ERROR D791 7F CC20 CLR ERRTYP D794 EC 42 LDD 2,U FIND NEXT FREE T-S D796 26 04 BNE HASROO THERE'S ROOM D798 86 06 LDA #6 ELSE DIRECTORY FULL ERROR D79A 20 A2 BRA FCS2ER D79C ED 88 40 HASROO STD FCBDAT,X PUT IN POINTER ON CURRENT DIR SECTOR D79F BD DB4A JSR FCS8 WRITE IT BACK ON DISK WITH NEW POINTER D7A2 26 2D BNE F2ERR5 SIGNAL DIRECTORY ERROR D7A4 BD D994 JSR FCS7 NOW READ NEXT SECTOR D7A7 26 28 BNE F2ERR5 SIGNAL DIRECTORY ERROR D7A9 EC 88 40 LDD FCBDAT,X GET POINTER TO NEXT FREE T-S D7AC ED 42 STD 2,U SAVE IN DRIVE TABLE D7AE EC 46 LDD 6,U GET SIZE OF FREE SPACE D7B0 83 0001 SUBD #1 SUBTRACT 1 D7B3 ED 46 STD 6,U SAVE IT D7B5 30 88 40 LEAX FCBDAT,X POINT TO FCB DATA AREA D7B8 5F CLRB SET COUNTER D7B9 6F 80 CLRDIR CLR 0,X+ CLEAR NEW DIRECTORY SECTOR D7BB 5A DECB D7BC 26 FB BNE CLRDIR ERASE 256 BYTES OF DIRECTORY DATA D7BE 8E C980 LDX #DIRFCB D7C1 BD DB4A JSR FCS8 GO WRITE IT TO DISK D7C4 26 0B BNE F2ERR5 SIGNAL DIRECTORY ERROR D7C6 BD D903 JSR UPDSIR MOVE DATA FROM DRIVE TABLE BACK INTO SIR D7C9 1026 FF74 LBNE FCS2EX D7CD 1F 31 TFR U,X POINT TO DIRECTORY ENTRY D7CF 20 9B BRA F2DKOK SEE IF ENOUGH ROOM LEFT ON DISK * ON DIRECTORY ERROR, SIGNAL IT D7D1 F6 CC20 F2ERR5 LDB ERRTYP CHECK ERROR TYPE D7D4 C1 0B CMPB #11 WRITE PROTECTED? D7D6 27 05 BEQ WPISOK YES, IT'S OK D7D8 C6 05 LDB #5 DIRECTORY ERROR IF ANYTHING ELSE D7DA BD D10F JSR RPTER0 REPORT IT D7DD 7E D741 WPISOK JMP FCS2EX AND THEN REPORT MAIN ERROR * FOUND ROOM IN DIRECTORY, SET UP USER'S FCB FOR IT D7E0 BE D40B F2FOUN LDX CURFCB POINT TO USER FCB D7E3 30 0F LEAX 15,X POINT PAST NAME D7E5 C6 35 LDB #53 D7E7 6F 80 CLRFCB CLR 0,X+ CLEAR NEXT BYTE D7E9 5A DECB ERASING FROM NAME TO 67,X D7EA 26 FB BNE CLRFCB D7EC BE D40B LDX CURFCB POINT TO USER'S FCB D7EF FC CC0E LDD MONTH TODAY'S DATE D7F2 ED 88 19 STD FCBMON,X D7F5 B6 CC10 LDA YEAR D7F8 A7 88 1B STA FCBYR,X D7FB 4F CLRA D7FC BD CD57 JSR INTIME POSSIBLY INPUT TIME CODE ALSO D7FF A7 88 18 STA FCBTIM,X D802 86 04 LDA #4 DATA POINTER AT FOURTH BYTE D804 A7 88 22 STA FCBDPT,X D807 86 02 LDA #2 SET FOR WRITING (DONE IN GETUPD) D809 BD D6FF JSR GETUPD GET DIR INFO & UPDATE FILE LIST PTRS * NOW MOVE INTO DIRECTORY D80C 30 04 LEAX FCBNAM,X POINT TO NAME D80E 108E C984 LDY #DIRFCB+FCBNAM ALSO IN DIR FCB D812 C6 18 LDB #24 D814 BD D1AE JSR MOVE MOVE 24 BYTES INTO DIRECTORY D817 8E C980 LDX #DIRFCB D81A BD D9D8 JSR FCS11 WRITE IT TO DISK D81D 26 B2 BNE F2ERR5 IF DIRECTORY ERROR * THEN FINISH UP D81F 4F CLRA RESET Z ERROR D820 35 F6 PULS A,B,X,Y,U,PC AND RETURN * FCS4 - FCS FUNCTION 4. CLOSE FILE D822 34 36 FCS4 PSHS A,B,X,Y D824 E6 02 LDB FCBRW,X R/W STATUS BYTE D826 5A DECB D827 27 07 BEQ F4LST READ IF IT WAS A 1 D829 5A DECB D82A 27 49 BEQ FCS4W WRITE IF IT WAS A 2 D82C 5A DECB D82D 58 LSLB D82E 26 3C BNE ERR22 FILE CLOSING ERROR IF NOT 3 OR 83 * REMOVE THIS FILE FROM FCB LIST POINTERS D830 BE D40B F4LST LDX CURFCB X-> USER'S FCB D833 108E D409 LDY #FBAPTR POINT TO DOS'S FCB POINTER D837 10BF CC51 STY LISPTR SAVE THIS LIST POINTER D83B 30 88 1C LEAX FCBLST,X POINT X TO THIS FCB'S POINTER D83E 10AE 9F CC51 F4LST0 LDY [LISPTR] PICK UP PREVIOUS POINTER D843 27 27 BEQ ERR22 ERROR 22 IF 0 - FILE NOT OPEN D845 AC 9F CC51 CMPX [LISPTR] COMPARE PREV PTR TO THIS FCB D849 27 06 BEQ F4LST1 FOUND IT, GO CHANGE D84B 10BF CC51 STY LISPTR SAVE AS ADDRESS OF NEXT POINTER D84F 20 ED BRA F4LST0 AND REPEAT * WHEN PREVIOUS POINTER POINTS TO THIS FCB, THEN * MOVE POINTER FROM THIS FCB INTO PREVIOUS D851 10AE 84 F4LST1 LDY 0,X GET THIS FCB'S POINTER D854 10AF 9F CC51 STY [LISPTR] MOVE INTO PREVIOUS D859 108E 0000 LDY #0 D85D 10AF 84 STY 0,X ERASE POINTER IN THIS FCB D860 AE 62 LDX 2,S POINT X TO FCB D862 BD DD54 JSR RAN4 DO RANDOM D865 6F 02 F4EXIT CLR FCBRW,X CLEAR R/W FLAG D867 BD DCCE JSR CPYERR TEST AND COPY ERRTYP INTO 1,X D86A 35 B6 PULS A,B,X,Y,PC AND EXIT * ERROR 22 - ERROR IN CLOSING FILE D86C AE 62 ERR22 LDX 2,S POINT X BACK TO FCB D86E 86 16 LDA #22 D870 B7 CC20 ERR22A STA ERRTYP D873 20 F0 BRA F4EXIT AND EXIT FUNCTION 4 * CLOSING A WRITE FILE IS CONSIDERABLY MORE DIFFICULT D875 A6 03 FCS4W LDA FCBDRV,X DRIVE NUMBER INTO SIRFCB D877 B7 CAC3 STA SIRFCB+FCBDRV D87A E6 88 3B LDB FCBSCF,X CHECK FOR UNFINISHED SPACES D87D 27 17 BEQ FCS4W1 NONE OUTSTANDING, GO ON D87F 2B 15 BMI FCS4W1 NO COMPRESSION BEING DONE D881 86 09 LDA #$09 ELSE SEND OUTSTANDING SPACES D883 BD D51F JSR FCS0 D886 26 DD BNE F4EXIT D888 A6 88 3B LDA FCBSCF,X NUMBER OF SPACES D88B BD D51F JSR FCS0 D88E 26 D5 BNE F4EXIT D890 4F CLRA AND A FINAL 00 D891 BD D51F JSR FCS0 D894 26 CF BNE F4EXIT ON ERROR D896 EC 88 15 FCS4W1 LDD FCBSIZ,X CHECK FILESIZE D899 26 07 BNE F4NOT0 IF >0 THEN STILL HARD D89B BD DA04 JSR FCS12 SIZE=0 IS EASY - JUST DELETE DIR ENTRY D89E 26 C5 BNE F4EXIT D8A0 20 30 BRA F4WDON AND FINISH UP * IF SIZE>0, THEN DIRECTORY ENTRY STAYS. WE * ALWAYS HAVE TO WRITE OUT THE LAST SECTOR. D8A2 4F F4NOT0 CLRA D8A3 5F CLRB D8A4 ED 88 40 STD FCBDAT,X SIGNAL END OF CHAIN D8A7 BD DB4A JSR FCS10 WRITE SECTOR OUT D8AA 26 B9 BNE F4EXIT * NOW UPDATE DIRECTORY D8AC EC 88 2F LDD FCBDIT,X TR-SEC OF DIRECTORY ENTRY D8AF ED 88 1E STD FCBCTR,X CURRENT TR-SEC D8B2 BD DB44 JSR FCS9 GO READ DIRECTORY SECTOR D8B5 26 41 BNE F4ERR5 REPORT DIRECTORY ERROR D8B7 E6 88 31 LDB FCBDIB,X POINT TO DIRECTORY ENTRY D8BA 4F CLRA FORCE UNSIGNED ADDITION D8BB C3 0040 ADDD #FCBDAT GO INTO DATA AREA D8BE 31 8B LEAY D,X Y-> BEGINNING OF NAME D8C0 34 10 PSHS X SAVE POINTERS D8C2 C6 0D LDB #13 WILL MOVE ATTRIBUTES THRU DATE - 13 BYTES D8C4 30 0F LEAX FCBATT,X D8C6 31 2B LEAY 11,Y D8C8 BD D1AE JSR MOVE MOVE 13 BYTES FROM X> TO Y> D8CB 35 10 PULS X RESTORE POINTERS D8CD BD DB4A JSR FCS10 WRITE IT BACK TO DISK D8D0 26 26 BNE F4ERR5 REPORT DIRECTORY ERROR * NOW UPDATE SIR AND DELETE POINTER IF NO OTHER * FILES ARE OPEN FOR WRITING ON THIS DRIVE D8D2 8D 2F F4WDON BSR UPDSIR GO UPDATE SIR D8D4 26 8F BNE F4EXIT D8D6 BE D40B LDX CURFCB D8D9 E6 03 LDB FCBDRV,X DRIVE NUMBER D8DB 63 03 COM FCBDRV,X KILL IT IN THIS FCB D8DD BE D409 LDX FBAPTR ADDRESS OF FIRST FCB+$1C D8E0 86 02 LDA #2 CODE FOR OPEN TO WRITE * LOOP TO SEARCH ALL OPEN FCB'S FOR DRIVE NUMBERS D8E2 10A3 88 E6 SRCHLO CMPD -26,X CHECK EACH FCB'S DRIVE NUM & RW CODE D8E6 27 08 BEQ RESTDN FOUND ONE, SO DON'T KILL DRTABL ENTRY D8E8 AE 84 LDX 0,X GET NEXT POINTER D8EA 26 F6 BNE SRCHLO REPEAT IF POINTER EXISTS * ALL FCB'S CHECKED AND NONE MATCHED THIS DRIVE * SO DELETE THE ENTRY FROM TABLE D8EC AF 9F CC5B STX [DRTPTR] STORE ZERO INTO DRIVE'S CHECKSUM D8F0 BE D40B RESTDN LDX CURFCB POINT BACK TO FCB D8F3 63 03 COM FCBDRV,X RESTORE DRIVE NUMBER D8F5 7E D830 JMP F4LST GO REMOVE FILE LIST POINTER * ON DIRECTORY ERROR, REPORT IT AND MAIN ALSO D8F8 C6 05 F4ERR5 LDB #5 DIRECTORY ERROR D8FA BD D10F JSR RPTER0 REPORT IT D8FD F7 CC20 STB ERRTYP D900 7E D865 JMP F4EXIT AND THEN MAIN EXIT * UPDATE SIR FROM DRIVE DATA TABLE * ASSUMES DRTABL ENTRY ALREADY EXISTS FOR SPECIFIED * DRIVE, AND WRITES IT TO SIR (UNLESS CHECKSUM IN * TABLE DOESN'T MATCH DISK OR THERE IS AN ERROR IN * READING OR WRITING SIR, IN WHICH CASE IT ABORTS * ON ENTRY - X POINTS TO FCB WITH DRIVE NUMBER * ON EXIT - X&Y POINT TO SIRFCB * D903 BD DC99 UPDSIR JSR SUMNAM GO READ SIR AND CHECKSUM NAME D906 26 2B BNE UPDEXI QUIT ON ERROR D908 E6 03 LDB FCBDRV,X GET DRIVE NUMBER D90A 8D 30 BSR DTPOIN POINT X TO DRIVE'S ENTRY IN DRTABL D90C EC 84 LDD 0,X GET CHECKSUM FROM TABLE D90E 10B3 CC59 CMPD CHKSUM CHECK AGAINST DISK D912 26 20 BNE STOP29 OOOPS - THE GUY CHANGED DISKS! D914 108E CAC0 LDY #SIRFCB POINT TO SIR FCB D918 EC 02 LDD 2,X FIRST TR-SEC D91A ED A8 5D STD 93,Y D91D EC 04 LDD 4,X LAST TR-SEC D91F ED A8 5F STD 95,Y D922 EC 06 LDD 6,X NUMBER OF FREE D924 ED A8 61 STD 97,Y D927 1F 21 TFR Y,X X-> SIRFCB D929 BD DB4A JSR FCS10 WRITE SIR BACK D92C 27 05 BEQ UPDEXI IF OK D92E C6 05 LDB #5 ELSE IT'S ERROR 5 D930 F7 CC20 STB ERRTYP D933 39 UPDEXI RTS D934 C6 1D STOP29 LDB #29 ERROR 29 IF DISK CHANGED D936 BD D10F JSR RPTER0 D939 7E CD7D JMP WARMS * * DTPOIN - POINT X TO DRIVE'S ENTRY IN DRIVE TABLE * ON ENTRY - DRIVE NUMBER IN B * ON EXIT - X AND DRTPTR POINT TO DRIVE'S ENTRY * D93C 34 04 DTPOIN PSHS B SAVE DRIVE NUMBER D93E 58 ASLB D93F 58 ASLB MULT BY 9 D940 58 ASLB D941 EB E0 ADDB 0,S+ D943 8E CC66 LDX #DRTABL POINT TO DRIVE DATA TABLE D946 3A ABX POINT TO CURRENT DRIVE'S ENTRY D947 BF CC5B STX DRTPTR AND SAVE AS DRIVE TABLE POINTER D94A 39 RTS * * GETSIR - COPY SIR DATA INTO DRIVE DATA TABLE * ON ENTRY - X POINTS TO DRIVE'S ENTRY IN DRTABL * ON EXIT - DITTO FOR X * Y POINTS TO SIRFCB * D94B FC CC59 GETSIR LDD CHKSUM GET CHECKSUM D94E ED 84 STD 0,X PUT INTO TABLE D950 FC CAD1 LDD SIRFCB+FCBFTR FIRST TRACK & SECTOR D953 ED 02 STD 2,X D955 FC CAD3 LDD SIRFCB+FCBLTR LAST TRACK & SECTOR D958 ED 04 STD 4,X D95A FC CAD5 LDD SIRFCB+FCBSIZ NUMBER OF EMPTY SECTORS D95D ED 06 STD 6,X D95F 39 RTS * FCS 5 - REWIND A FILE - REALLY CONSISTS OF JUST * CLOSING AND OPENING A FILE D960 34 36 FCS5 PSHS A,B,X,Y D962 A6 02 LDA FCBRW,X READ/WRITE FLAG D964 81 01 CMPA #1 IS IT READ? D966 27 07 BEQ FCS5A YES, IT'S OK D968 C6 12 F5ER18 LDB #18 NO - NOT ALLOWED D96A F7 CC20 STB ERRTYP D96D 20 07 BRA FCS5B AND QUIT D96F BD D822 FCS5A JSR FCS4 OK, GO CLOSE FILE D972 1027 FD26 LBEQ FCS1A IF NO ERROR, THEN OPEN IT AGAIN D976 BD DCCE FCS5B JSR CPYERR D979 35 B6 PULS A,B,X,Y,PC ELSE RETURN IMMEDIATELY * FCS6 - OPEN DIRECTORY FILE, AND * FCS16 - OPEN SYSTEM INFORMATION RECORD D97B 34 06 FCS6 PSHS A,B D97D CC 0005 LDD #$0005 TRACK 0 SECTOR 5 D980 ED 88 40 FCS6A STD FCBDAT,X SECTOR LINK POINTS TO FIRST D983 86 FF LDA #$FF D985 A7 88 3B STA FCBSCF,X NO SPACE COMPRESSION D988 6F 88 22 CLR FCBDPT,X DATA POINTER TO VERY FIRST BYTE D98B 35 86 PULS A,B,PC AND RETURN D98D 34 06 FCS16 PSHS A,B D98F CC 0003 LDD #$0003 TRACK 0 SECTOR 3 D992 20 EC BRA FCS6A * FCS7 - READ NEXT INFORMATION ENTRY D994 34 36 FCS7 PSHS A,B,X,Y D996 86 01 LDA #1 D998 A7 02 STA FCBRW,X MAKE AS IF OPEN FOR READ D99A 6F 88 17 CLR FCBRAN,X FORCE SEQUENTIAL D99D BD D51F JSR FCS0 GO READ DIRECTORY FILE D9A0 26 31 BNE FCS7EX EXIT ON ERROR D9A2 6A 88 22 DEC FCBDPT,X STEP BACK TO CHAR JUST READ D9A5 A6 88 22 LDA FCBDPT,X GET POINTER D9A8 81 04 CMPA #4 FIRST CHAR IN SECTOR? D9AA 26 05 BNE FCS7A NO, JUST CONTINUE D9AC 86 10 LDA #16 YES, SO GO TO 16TH BYTE D9AE A7 88 22 STA FCBDPT,X * NOW READ NEXT ENTRY FROM THIS SECTOR D9B1 EC 88 1E FCS7A LDD FCBCTR,X CURRENT TRACK-SECTOR D9B4 ED 88 2F STD FCBDIT,X IS DIRECTORY T-S D9B7 E6 88 22 LDB FCBDPT,X AND INDEX D9BA E7 88 31 STB FCBDIB,X IS DIRECTORY ENTRY INDEX D9BD 34 04 PSHS B SAVE POINTER D9BF CB 18 ADDB #24 D9C1 E7 88 22 STB FCBDPT,X STEP POINTER PAST THIS ENTRY D9C4 35 04 PULS B RESTORE INDEX DATA POINTER D9C6 31 04 LEAY FCBNAM,X WHERE TO MOVE DIR ENTRY D9C8 30 88 40 LEAX FCBDAT,X POINT INTO FCB DATA AREA D9CB 3A ABX POINT TO ENTRY TO GET D9CC C6 18 LDB #24 GET 24 BYTES D9CE BD D1AE JSR MOVE AND GO MOVE IT D9D1 35 B6 PULS A,B,X,Y,PC AND RETURN D9D3 BD DCCE FCS7EX JSR CPYERR D9D6 35 B6 PULS A,B,X,Y,PC AND RETURN * FCS 11 - WRITE BACK DIRECTORY ENTRY * THIS FUNCTION IS USED INTERNALLY BY STAR-DOS, BUT IS * NOT DOCUMENTED BY US OR OTHERS. ANYONE USING IT DOES * SO AT HIS OWN RISK, AND IS TO BE ASSUMED TO BE * EITHER VERY SMART OR VERY STUPID. D9D8 34 76 FCS11 PSHS A,B,X,Y,U SAME AS FCS8! D9DA EC 88 2F LDD FCBDIT,X DIRECTORY TR-SEC D9DD 10A3 88 1E CMPD FCBCTR,X CHECK IF ALSO CURRENT D9E1 27 08 BEQ F11GO SAME, SO IT'S STAR-DOS CALLING D9E3 ED 88 1E STD FCBCTR,X ELSE SOME FLUKY USER MESSING AROUND D9E6 BD DB44 JSR FCS9 READ DIRECTORY SECTOR INTO FCB D9E9 26 17 BNE F11EX IF ERROR D9EB 1F 12 F11GO TFR X,Y Y -> FCB TO USE D9ED E6 88 31 LDB FCBDIB,X DIRECTORY BYTE OFFSET D9F0 30 88 40 LEAX FCBDAT,X POINT TO FCB DATA AREA D9F3 3A ABX POINT TO SPECIFIC ENTRY D9F4 1E 12 EXG X,Y X-> FCB, Y->ENTRY IN IT D9F6 30 04 LEAX FCBNAM,X POINT TO NAME IN FCB D9F8 C6 18 LDB #24 D9FA BD D1AE JSR MOVE MOVE ENTRY INTO SPECIFIC PLACE D9FD AE 62 LDX 2,S POINT X BACK TO FCB D9FF 7E DB4C JMP FCS8A WRITE BACK TO DIRECTORY; FCS8 WILL DO PULS DA02 35 F6 F11EX PULS A,B,X,Y,U,PC AND RETURN * FCS12 - FCS FUNCTION 12. DELETE A FILE DA04 34 76 FCS12 PSHS A,B,X,Y,U DA06 1F 13 TFR X,U SAVE USER'S FCB ADDRESS DA08 BD D67C JSR F1SVBY NAME INTO SECONDARY & FINAME DA0B 26 77 BNE FCS12E EXIT ON ERROR DA0D A6 03 LDA FCBDRV,X DRIVE NUMBER DA0F B7 CAC3 STA SIRFCB+FCBDRV DA12 8E C980 LDX #DIRFCB POINT TO DIRECTORY FCB DA15 A6 0F LDA FCBATT,X CHECK ATTRIBUTES DA17 84 C0 ANDA #$C0 DELETE OR WRITE PROT BITS DA19 27 07 BEQ FCS12A OK TO CONTINUE DA1B 86 0C LDA #12 ELSE IT'S ERROR 12 DA1D B7 CC20 STA ERRTYP DA20 20 62 BRA FCS12E AND EXIT DA22 86 FF FCS12A LDA #$FF DA24 A7 04 STA FCBNAM,X ERASE 1ST LETTER OF FILE NAME DA26 8D B0 BSR FCS11 WRITE DIRECTORY BACK DA28 26 5A BNE FCS12E DA2A EC 88 15 LDD FCBSIZ,X CHECK LENGTH OF DELETED FILE DA2D ED C8 15 STD FCBSIZ,U PUT IN USER'S FCB DA30 27 52 BEQ FCS12E DO NOTHING IF LENGTH =0 DA32 E6 03 LDB FCBDRV,X DRIVE NUMBER DA34 BD D93C JSR DTPOIN POINT X TO DRIVE TABLE ENTRY DA37 EC 84 LDD 0,X LOOK AT ITS CHECKSUM DA39 F7 DA90 STB DTFLAG =0 IF ENTRY NOT THERE, <>0 IF IT WAS DA3C 26 08 BNE ENTHER IF ENTRY WAS THERE DA3E BD DC99 JSR SUMNAM ELSE READ SIR INTO SIRFCB AND CHECKSUM IT DA41 26 41 BNE FCS12E IF ERROR DA43 BD D94B JSR GETSIR GET DRIVE DATA FROM SIR INTO TABLE * NOW THAT DRIVE ENTRY IS IN TABLE, USE IT DA46 10AE 04 ENTHER LDY 4,X TEMP SAVE LAST T-S OF FREE CHAIN DA49 FC C993 LDD DIRFCB+FCBLTR NEW LAST T-S DA4C ED 04 STD 4,X SAVE IN TABLE DA4E EC 06 LDD 6,X OLD LENGTH OF FREE CHAIN DA50 F3 C995 ADDD DIRFCB+FCBSIZ ADD LENGTH OF DELETED DA53 ED 06 STD 6,X NEW LENGTH DA55 31 A4 LEAY 0,Y SAME AS TST Y - CHECK LAST FREE DA57 27 30 BEQ SIREMT IF DISK WAS FULL, GO PUT IN STARTING TOO DA59 8E CAC0 LDX #SIRFCB DA5C 10AF 88 1E STY FCBCTR,X READY TO READ OLD LAST T-S DA60 BD DB44 JSR FCS9 READ IT DA63 26 1F BNE FCS12E DA65 FC C991 LDD DIRFCB+FCBFTR 1ST T-S OF DELETED FILE DA68 ED 88 40 STD FCBDAT,X SET UP NEW CHAIN POINTER DA6B BD DB4A JSR FCS10 WRITE BACK TO DISK DA6E 26 14 BNE FCS12E IF ERROR * UPDATE SIR FROM DRTABL. THEN, IF DRTABL ENTRY * EXISTED BEFORE ALL THIS (INDICATING THAT THERE * IS AN OPEN WRITE FILE SOMEWHERE), THEN LEAVE IT, * ELSE ERASE IT DA70 8E CAC0 F12DON LDX #SIRFCB DA73 BD D903 JSR UPDSIR WRITE DRTABL ENTRY TO SIR DA76 26 0C BNE FCS12E DA78 7D DA90 TST DTFLAG WAS DRTABL ENTRY THERE BEFORE? DA7B 26 07 BNE FCS12E YES, LEAVE IT DA7D BE CC5B LDX DRTPTR NO, ERASE IT DA80 4F CLRA DA81 5F CLRB DA82 ED 84 STD 0,X ERASE DA84 BD DCCE FCS12E JSR CPYERR DA87 35 F6 PULS A,B,X,Y,U,PC AND QUIT * IF SIR INDICATES DISK WAS FULL, MAKE FIRST TR-SEC * OF FREE SPACE SAME AS THAT OF DELETED FILE DA89 FC C991 SIREMT LDD DIRFCB+FCBFTR 1ST T-S OF DELETED FILE DA8C ED 02 STD 2,X BECOMES FIRST OF FREE DA8E 20 E0 BRA F12DON AND THEN FINISH UP DA90 00 DTFLAG FCB 0 DRIVE DATA TABLE FLAG * FCS13 - FCS FUNCTION 13. RENAME A FILE DA91 34 36 FCS13 PSHS A,B,X,Y DA93 6D 88 3D TST FCBNMS+8,X LOOK AT NEW EXTENSION DA96 26 0A BNE FCS13A CONTINUE IF THERE DA98 EC 0C LDD FCBNAM+8,X ELSE COPY OLD EXT TO NEW DA9A ED 88 3D STD FCBNMS+8,X DA9D A6 0E LDA FCBNAM+10,X DA9F A7 88 3F STA FCBNMS+10,X DAA2 31 88 24 FCS13A LEAY FCBNMB,X POINT TO NAME BUFFER DAA5 30 04 LEAX FCBNAM,X SAVE OLD NAME IN BUFFER DAA7 BD D1A8 JSR NAMOVE DAAA AE 62 LDX 2,S POINT X TO FCB DAAC 31 04 LEAY FCBNAM,X DAAE 30 88 35 LEAX FCBNMS,X MOVE NEW NAME TO FRONT OF FCB DAB1 BD D1A8 JSR NAMOVE DAB4 AE 62 LDX 2,S POINT X BACK TO FCB DAB6 BD DC5D JSR FINAME FIND NEW NAME IN DIR DAB9 27 3A BEQ F13E3 ERROR 3 - FILE EXISTS IF YES DABB B6 CC20 LDA ERRTYP CHECK ERROR TYPE DABE 81 04 CMPA #4 IS IT NE? DAC0 26 2E BNE F13EXT NOTHING ELSE IS ALLOWED DAC2 7F CC20 CLR ERRTYP ERASE THE 04 ERROR - IT'S OK DAC5 6F 01 CLR FCBERR,X DAC7 A6 03 LDA FCBDRV,X DRIVE NUMBER DAC9 30 88 20 LEAX $20,X FOOL FINAME INTO THINKING NMB IS NAM DACC A7 03 STA FCBDRV,X BUT GIVE IT DRIVE NUMBER DACE BD DC5D JSR FINAME FIND OLD NAME DAD1 26 1D BNE F13EXT IF IT WASN'T THERE DAD3 AE 62 LDX 2,S POINT TO FCB AGAIN DAD5 30 88 35 LEAX FCBNMS,X X-> NEW NAME IN USER'S FCB DAD8 108E C984 LDY #DIRFCB+FCBNAM Y-> NAME IN DIR FCB DADC BD D1A8 JSR NAMOVE PUT NEW NAME INTO DIR FCB DADF 8E C980 LDX #DIRFCB DAE2 BD D9D8 JSR FCS11 WRITE DIRECTORY BACK TO DISK DAE5 AE 62 LDX 2,S POINT TO FCB AGAIN DAE7 31 88 35 LEAY FCBNMS,X Y-> SECONDARY NAME BUFFER DAEA 30 88 24 LEAX FCBNMB,X X-> OLD NAME IN USER'S FCB DAED BD D1A8 JSR NAMOVE PUT OLD NAME INTO SEC BUFFER FOR COMPAT DAF0 BD DCCE F13EXT JSR CPYERR DAF3 35 B6 PULS A,B,X,Y,PC THEN EXIT * ERROR EXIT DAF5 86 03 F13E3 LDA #3 ERROR 3 - FILE EXISTS DAF7 B7 CC20 STA ERRTYP DAFA 20 F4 BRA F13EXT * FCS 15 - NEXT SEQUENTIAL SECTOR * FCS-15 NO LONGER FITS ORIGINAL DOCUMENTATION - WRITE STILL * IGNORED IF NOTHING WRITTEN TO CURRENT SECTOR, BUT READ NOW * SKIPS SECTOR EVEN IF NOTHING WAS READ FROM SECTOR SO FAR DAFC 34 36 FCS15 PSHS A,B,X,Y DAFE 6F 84 CLR FCBFUN,X CLEAR OP CODE DB00 A6 02 LDA FCBRW,X CHECK FILE STATUS DB02 4A DECA DB03 27 0C BEQ F15RD IS OPEN FOR READ DB05 4A DECA DB06 1026 FE5E LBNE F5ER18 MUST BE ERROR 18 IF WASN'T A 2 * FILE WAS OPEN FOR WRITE DB0A E6 88 22 F15WR LDB FCBDPT,X CHECK DATA POINTER DB0D C1 04 CMPB #4 AT BEGINNING OF SECTOR? DB0F 27 DF BEQ F13EXT YES, JUST EXIT; ELSE FALL THRU * ENTER HERE WITH A=0; IMPORTANT TO WRITE A 0 DB11 6F 88 22 F15RD CLR FCBDPT,X CLEAR DATA POINTER DB14 BD D51F JSR FCS0 GO READ NEXT OR WRITE CURRENT SECTOR DB17 26 D7 BNE F13EXT EXIT ON ERROR DB19 64 88 22 LSR FCBDPT,X DB1C 68 88 22 ASL FCBDPT,X CHANGE 5 TO 4, LEAVE 0 AS IS DB1F 20 CF BRA F13EXT COPY ERROR, IF ANY, AND EXIT * FCS 20 - FIND NEXT READY DRIVE DB21 34 16 FCS20 PSHS A,B,X DB23 A6 03 FCS20A LDA FCBDRV,X GET CURRENT DRIVE NUMBER DB25 4C INCA GO TO NEXT DB26 B1 CC5F CMPA MAXDRV CHECK AGAINST MAXIMUM DB29 22 0B BHI F20NG NG IF OVER MAX DB2B A7 03 STA FCBDRV,X ELSE SAVE DB2D BD DE0F JSR DCHK CHECK IF READY DB30 26 F1 BNE FCS20A REPEAT IF NOT READY DB32 1C FE CLC DB34 35 96 PULS A,B,X,PC EXIT IF READY DB36 BE D40B F20NG LDX CURFCB DB39 C6 10 LDB #16 DRIVE NOT READY DB3B F7 CC20 STB ERRTYP DB3E E7 01 STB FCBERR,X STORE INTO FCB DB40 1A 01 SEC DB42 35 96 PULS A,B,X,PC * FCS8 - WRITE NEXT INFORMATION ENTRY * (EITHER DIRECTORY OR SIR) * FCS9 AND FCS10 - FCS FUNCTIONS 9 (READ) AND * 10 (WRITE) SINGLE SECTOR * READ ENTRY POINT DB44 34 76 FCS9 PSHS A,B,X,Y,U READ SINGLE SECTOR DB46 86 01 LDA #1 DB48 20 03 BRA FCS910 * WRITE ENTRY POINT DB4A 34 76 FCS10 PSHS A,B,X,Y,U WRITE SINGLE SECTOR DB4A FCS8 EQU FCS10 WRITE DIR ENTRY SAME AS WRITE SECTOR * ALTERNATE ENTRY FROM FCS11 DB4C 4F FCS8A CLRA OPCODE=0 FOR WRITE * COMBINED FOR BOTH READ AND WRITE DB4D BF CC4A FCS910 STX FCBADD STORE CURRENT FCB ADDRESS DB50 B7 CC48 STA OPCODE DB53 BD D432 JSR CACHE GO DO CACHE, IF ANY DB56 BE CC4A LDX FCBADD RESTORE CURRENT FCB ADDRESS * INITIALIZE RETRY COUNTER DB59 86 04 LDA #4 DB5B B7 CC4C STA ORETRY OUTER RETRY COUNTER * CHECK DRIVE DB5E A6 03 LDA 3,X CHECK DRIVE NUMBER DB60 B1 CC5F CMPA MAXDRV CHECK AGAINST MAXIMUM DB63 22 71 BHI F10E15 IF HIGHER THAN MAX * NOW DO ACTUAL READ OR WRITE DB65 86 03 OULOOP LDA #3 DB67 B7 CC4D STA IRETRY SET UP INNER COUNTER DB6A BE CC4A GETTRS LDX FCBADD POINT TO FCB DB6D BD DE0C JSR DDRIVE SELECT CORRECT DRIVE DB70 25 17 BCS NRWAIT ON ERROR DB72 BE CC4A LDX FCBADD AGAIN POINT TO FCB DB75 EC 88 1E LDD FCBCTR,X GET TRACK AND SECTOR DB78 30 88 40 LEAX FCBDAT,X POINT X TO ACTUAL DATA AREA DB7B 7D CC48 TST OPCODE DB7E 27 0F BEQ ACTWRI * READ DB80 BD DE00 JSR DREAD GO TRY TO READ DB83 27 47 BEQ F910EX EXIT NORMALLY IF NO ERROR DB85 C5 80 BITB #$80 NOT READY? DB87 27 19 BEQ OTHERR NO, GO PROCESS IT DB89 31 21 NRWAIT LEAY 1,Y WAIT A MOMENT BEFORE PROCEEDING DB8B 26 FC BNE NRWAIT DB8D 20 13 BRA OTHERR AND THEN CONTINUE * WRITE DB8F BD DE03 ACTWRI JSR DWRITE GO TRY TO WRITE DB92 26 0A BNE WRIERR ON ERROR GO SEE IF WRITE PROTECT DB94 7D D435 TST VERFLG VERIFY? DB97 27 33 BEQ F910EX NO, SO JUST QUIT DB99 BD DE06 JSR DVERIF YES, GO VERIFY SECTOR DB9C 27 2E BEQ F910EX OK IF NO ERROR * ANALYZE WRITE ERRORS AND PROCESS THEM DB9E C5 40 WRIERR BITB #$40 WRITE PROTECT? DBA0 26 12 BNE FCS10E YES, IMMEDIATELY PROCESS ERROR DBA2 7A CC4D OTHERR DEC IRETRY DECREMENT INNER RETRY COUNTER DBA5 26 C3 BNE GETTRS TRY AGAIN IF NOT YET DONE DBA7 7A CC4C DEC ORETRY ELSE DECREMENT OUTER RETRY COUNTER DBAA 27 08 BEQ FCS10E GIVE UP AND QUIT WITH ERROR DBAC BE CC4A LDX FCBADD ELSE POINT TO FCB AGAIN DBAF BD DE09 JSR DREST RESTORE SELECTED DRIVE AND IGNORE ERRORS DBB2 20 B1 BRA OULOOP TRY AGAIN IF STILL NOT DONE * TRANSLATE INTO STAR-DOS ERROR CODES AND * STORE IN FCB DBB4 108E DBCE FCS10E LDY #DSKERC POINT TO DISK ERROR CODE TABLE DBB8 C1 0F CMPB #$0F CHECK FOR BAD DRIVE NUMBER DBBA 27 09 BEQ FCS10S GO SAVE ERROR DBBC 58 FCS10F ASLB SHIFT ERROR CODE LEFT DBBD 25 04 BCS FCS10R GOT ERROR BIT IN CARRY DBBF 31 21 LEAY 1,Y POINT TO NEXT ERROR CODE DBC1 20 F9 BRA FCS10F AND LOOK AT NEXT BIT DBC3 E6 A4 FCS10R LDB 0,Y GET ERROR CODE DBC5 AE 62 FCS10S LDX 2,S POINT X TO FCB DBC7 E7 01 STB FCBERR,X PUT INTO FCB DBC9 F7 CC20 STB ERRTYP DBCC 35 F6 F910EX PULS A,B,X,Y,U,PC AND EXIT DBCE 10 DSKERC FCB 16 BIT 7 = DISK NOT READY DBCF 0B FCB 11 BIT 6 = WRITE PROTECT DBD0 0A FCB 10 BIT 5 = WRITE ERROR DBD1 0E FCB 14 BIT 4 = SEEK ERROR DBD2 09 FCB 9 BIT 3 = CRC ERROR DBD3 09 FCB 9 BIT 2 = LOST DATA DBD4 10 FCB 16 NOT READY DBD5 1D FCB 29 VERIFY ERROR * DRIVE NUMBER ERROR DBD6 C6 0F F10E15 LDB #15 DRIVE NUMBER ERROR DBD8 20 EB BRA FCS10S * GRABIT - SUBROUTINE TO GRAB NEXT SECTOR FROM FREE CHAIN * ENTRY: ASSUMES DRTABL HAS AN ENTRY FOR DRIVE, BUT * READS IT IN IF NOT THERE * X-> FCB WHERE SPACE IS NEEDED * DURING: Y-> SIRFCB, U-> DRTABL ENTRY * EXIT: T-S OF FOUND SECTOR IS IN FCBLTR,X * Z INDICATES MINOR ERROR, ELSE ROUTINE IMMEDIATELY * RETURNS TO WARMS ON DIR OR SIR ERROR DBDA 34 56 GRABIT PSHS A,B,X,U DBDC E6 03 LDB FCBDRV,X GET DRIVE NUMBER DBDE F7 CAC3 STB SIRFCB+FCBDRV SAVE IN SIR FCB DBE1 BD D93C JSR DTPOIN POINT X TO DRIVE'S ENTRY IN DRTABL DBE4 1F 13 TFR X,U SAVE DRIVE DATA POINTER DBE6 6D 01 TST 1,X DOES CHECKSUM EXIST IN DRTABL? DBE8 26 08 BNE GRBYES DBEA BD DC99 JSR SUMNAM GET CHECKSUM ETC. DBED 26 37 BNE GRABEX IF ERROR DBEF BD D94B JSR GETSIR COPY SIR DATA INTO DRTABL DBF2 EC 46 GRBYES LDD 6,U NUMBER OF FREE DBF4 27 27 BEQ GRFULL DISK FULL! DBF6 EC 42 LDD 2,U 1ST FREE SECTOR DBF8 27 23 BEQ GRFULL DISK FULL! * NOT FULL, GRAB A SECTOR DBFA AE 62 LDX 2,S POINT BACK TO FCB DBFC ED 88 13 STD FCBLTR,X SAVE AS LAST DBFF 8E CAC0 LDX #SIRFCB POINT BACK TO FCB DC02 ED 88 1E STD FCBCTR,X CURRENT TRACK DC05 BD DB44 JSR FCS9 READ 1ST FREE SECTOR DC08 26 1C BNE GRABEX DC0A EC 88 40 LDD FCBDAT,X POINTER TO 2ND FREE DC0D 27 20 BEQ CLEARG CLEAR EVERYTHING IF ZERO DC0F ED 42 STD 2,U PUT INTO TABLE DC11 EC 46 LDD 6,U DC13 83 0001 SUBD #1 DECREMENT NO. OF FREE DC16 27 17 BEQ CLEARG CLEAR EVERYTHING IF ZERO DC18 ED 46 STD 6,U DC1A 4F CLRA NO ERROR ON Z DC1B 35 D6 PULS A,B,X,U,PC * IF DISK IS FULL, CAN'T GRAB IT DC1D 8D 14 GRFULL BSR GRCLR CLEAR TABLE ENTRY DC1F 26 05 BNE GRABEX DC21 86 07 LDA #7 DISK FULL DC23 B7 CC20 GRFULA STA ERRTYP DC26 BD DCCE GRABEX JSR CPYERR DC29 35 D6 PULS A,B,X,U,PC DC2B 86 05 ERR5 LDA #5 DIRECTORY ERROR IF NOT IN TABLE DC2D 20 F4 BRA GRFULA * CLEAR ALL WHEN DISK FILLED UP DC2F 8D 02 CLEARG BSR GRCLR CLEAR ALL DC31 20 F3 BRA GRABEX AND EXIT DC33 ED 42 GRCLR STD 2,U MAKE EVERYTHING ZERO DC35 ED 44 STD 4,U DC37 ED 46 STD 6,U DC39 AE 64 LDX 4,S POINT BACK TO FCB DC3B BD D903 JSR UPDSIR WRITE TABLE BACK TO DISK DC3E 39 RTS AND RETURN * CHKUSE - CHECK WHETHER AN FCB IS ALREADY IN USE DC3F 34 12 CHKUSE PSHS A,X DC41 30 88 1C LEAX FCBLST,X POINT X TO THIS FCB'S LST LOCATION DC44 34 10 PSHS X SAVE ON STACK FOR TESTING DC46 8E D409 LDX #FBAPTR POINT TO DOS'S POINTER DC49 AE 84 SINUSE LDX 0,X GET POINTER TO NEXT FCB DC4B 27 0C BEQ SNOTIN FINISHED WITHOUT FINDING ONE IS OK DC4D AC E4 CMPX 0,S COMPARE WITH CURRENT FCB DC4F 26 F8 BNE SINUSE NOT FOUND, SO CHECK NEXT * FOUND ANOTHER ONE WITH OPEN DC51 BE D40B LDX CURFCB POINT TO FCB DC54 86 02 LDA #2 ERROR 2 DC56 B7 CC20 STA ERRTYP DC59 32 62 SNOTIN LEAS 2,S RESTORE STACK W/O TOUCHING Z DC5B 35 92 PULS A,X,PC AND RETURN * FINAME - FIND NAME IN DIRECTORY * ENTRY: X-> FCB WITH NAME TO BE FOUND * EXIT: ZERO IF FOUND, ELSE ERROR CODE IN CALLING FCB DC5D 34 76 FINAME PSHS A,B,X,Y,U DC5F 1F 13 TFR X,U SAVE USER'S FCB ADDRESS DC61 8E C980 LDX #DIRFCB POINT TO DIRECTORY FCB DC64 A6 43 LDA FCBDRV,U GET HIS DRIVE NUMBER DC66 A7 03 STA FCBDRV,X STORE IN THIS FCB DC68 BD D97B JSR FCS6 OPEN DIRECTORY DC6B 8E C980 FINLO1 LDX #DIRFCB POINT TO DIRECTORY DC6E BD D994 JSR FCS7 READ NEXT DIR ENTRY DC71 26 16 BNE FINAER EXIT ON ERROR DC73 C6 0B LDB #11 DC75 8E C984 LDX #DIRFCB+FCBNAM X-> TO DIR ENTRY DC78 6D 84 TST 0,X CHECK FIRST CHAR IN DIR ENTRY DC7A 27 14 BEQ FINER4 END OF DIR IF 00 DC7C 31 44 LEAY FCBNAM,U Y-> USER'S NAME DC7E A6 80 FINLO2 LDA 0,X+ DC80 A1 A0 CMPA 0,Y+ COMPARE CHARACTERS DC82 26 E7 BNE FINLO1 DO NEXT IF DIFFERENT DC84 5A DECB COUNTER DC85 26 F7 BNE FINLO2 REPEAT FOR 11 CHARACTERS DC87 35 F6 FINAEX PULS A,B,X,Y,U,PC AND RETURN * ON ERROR DURING ACTUAL READING, CHECK IF EOF DC89 F6 CC20 FINAER LDB ERRTYP GET ERROR CODE DC8C C1 08 CMPB #8 EOF? DC8E 26 F7 BNE FINAEX NO, MUST BE SOMETHING ELSE DC90 C6 04 FINER4 LDB #4 ELSE NAME NOT FOUND DC92 E7 41 STB 1,U SAVE IN USER'S FCB DC94 F7 CC20 STB ERRTYP DC97 35 F6 PULS A,B,X,Y,U,PC AND EXIT * SUMNAM - READ SIR INTO SIRFCB AND CHECKSUM NAME AND DISK NUMBER * RETURN WITH NUMBER OF SECT/TR IN B AND ZERO CONDITION IF OK DC99 34 32 SUMNAM PSHS A,X,Y DC9B 8E CAC0 LDX #SIRFCB DC9E BD D98D JSR FCS16 OPEN SIR DCA1 BD D994 JSR FCS7 READ IT DCA4 26 1D BNE SUMNEX DCA6 CC 0000 LDD #0 SET CHECKSUM TO 0 DCA9 8E CAD7 LDX #SIRFCB+23 POINT TO DISK'S DATE DCAC 108E 0003 LDY #3 SUM THREE BYTES IN DATE DCB0 1C FE CLC BEGIN WITH CARRY=0 DCB2 8D 11 BSR SUMSUB ADD UP THE 3 BYTES DCB4 8E CAC4 LDX #SIRFCB+FCBNAM POINT TO DISK'S NAME DCB7 108E 000D LDY #13 SUM THIRTEEN BYTES IN NAME AND NUMBER DCBB 8D 08 BSR SUMSUB ADD UP THE 13 BYTES DCBD CA 01 ORB #1 ENSURE IT'S NOT ZERO DCBF FD CC59 STD CHKSUM STORE CHECKSUM DCC2 4F CLRA RESET Z ERROR DCC3 35 B2 SUMNEX PULS A,X,Y,PC AND RETURN DCC5 59 SUMSUB ROLB DCC6 49 ROLA DCC7 E8 80 EORB 0,X+ EOR NEXT BYTE TO LS BYTE DCC9 31 3F LEAY -1,Y DECREMENT COUNTER DCCB 26 F8 BNE SUMSUB DCCD 39 RTS * CPYERR ROUTINE - TEST ERRTYP AND ALSO * MOVE IT INTO FCB ERROR BYTE DCCE BE D40B CPYERR LDX CURFCB RESTORE INDEX DCD1 B6 CC20 LDA ERRTYP GET ERROR TYPE DCD4 A7 01 STA 1,X AND STORE INTO FCB DCD6 39 RTS AND RETURN WITH Z ERROR FLAG * RTSRIO - RESTORE INCH AND OUTCH VECTORS DCD7 34 16 RESIO PSHS A,B,X DCD9 FC CD0D LDD INCH2+1 DCDC FD CD0A STD INCH+1 DCDF FC CD13 LDD OUTCH2+1 DCE2 FD CD10 STD OUTCH+1 DCE5 86 7E LDA #$7E JMP OP CODE DCE7 B7 CD09 STA INCH DCEA B7 CD0F STA OUTCH DCED C6 07 LDB #7 DCEF 8E CC21 LDX #SPECIO DCF2 6F 80 RIO1 CLR 0,X+ CLEAR SPECIO, INCHSW, OUCHSW, FI AND FOADDR DCF4 5A DECB DCF5 26 FB BNE RIO1 DCF7 35 96 PULS A,B,X,PC AND RETURN * DEFEXT - SET DEFAULT EXTENSION DCF9 34 66 DEFEXT PSHS A,B,Y,U DCFB E6 0C LDB FCBEXT,X CHECK EXISTING EXTENSION DCFD 27 04 BEQ SETEX1 SET IT IF NULL DCFF C1 20 CMPB #$20 IS IT SPACE? DD01 26 15 BNE SETEX2 NOT SPACE, SO IT'S PROBABLY OK DD03 81 0B SETEX1 CMPA #11 CHECK FOR MAXIMUM DD05 22 11 BHI SETEX2 IGNORE IF >11 DD07 48 ASLA MULT BY 2 DD08 AB E4 ADDA 0,S PLUS 1 MAKES TIMES 3 DD0A 108E DD1A LDY #EXTTAB POINT TO TABLE DD0E EE A6 LDU A,Y GET FIRST TWO LETTERS OF EXTENSION DD10 EF 0C STU FCBEXT,X STORE IN FCB DD12 31 22 LEAY 2,Y ADD 2 DD14 A6 A6 LDA A,Y GET THIRD LETTER DD16 A7 0E STA FCBEXT+2,X AND STORE IN FCB DD18 35 E6 SETEX2 PULS A,B,Y,U,PC EXIT DD1A 42 49 4E 54 EXTTAB FCC 'BINTXTCMDBASSYSBAKSCRDATBACDIRPRTOUT' DD1E 58 54 43 4D DD22 44 42 41 53 DD26 53 59 53 42 DD2A 41 4B 53 43 DD2E 52 44 41 54 DD32 42 41 43 44 DD36 49 52 50 52 DD3A 54 4F 55 54 * JUMP TABLES ETC FOR RANDOM ROUTINES DD40 ORG $DD40 DD40 2525 FDB $2525 VERSION NUMBER DD42 39 RANCLS RTS INITIALIZE RANDOM ROUTINES DD43 12 NOP DD44 12 NOP DD45 4F RAN0R CLRA RANDOM READ DD46 39 RTS DD47 12 NOP DD48 39 RAN0W1 RTS DO NOTHING IF RANDOM NOT INSTALLED DD49 12 NOP DD4A 12 NOP DD4B 4F RAN0W2 CLRA RANDOM WRITE PART 2 DD4C 39 RTS DD4D 12 NOP DD4E 4F RAN0W3 CLRA RANDOM WRITE PART 3 DD4F 39 RTS DD50 12 NOP DD51 7E D4A2 RAN3 JMP FCSCNP RANDOM OPEN FILE FOR UPDATE DD54 39 RAN4 RTS RANDOM CLOSE FILE DD55 12 NOP DD56 12 NOP DD57 7E D4A2 RAN17 JMP FCSCNP GET RANDOM BYTE DD5A 7E D4A2 RAN18 JMP FCSCNP PUT RANDOM BYTE DD5D 7E D4A2 RAN21 JMP FCSCNP POSITION TO RECORD N DD60 7E D4A2 RAN22 JMP FCSCNP BACKUP ONE RECORD DD63 7E D4A2 RAN23 JMP FCSCNP POS TO REC N, OR EXTEND FILE DD66 D53B FDB FCS0R DD68 D5B3 FDB FCS0W DD6A D644 FDB F0PUT DD6C D626 FDB F0FERA DD6E DB44 FDB FCS9 DD70 DB4A FDB FCS10 DD72 DBDA FDB GRABIT DD74 DC99 FDB SUMNAM * THE FOLLOWING ROUTINES ASSIGN A SEQUENCE NUMBER * TO WRITTEN FILES WHEN NO CLOCK CHIP IS INSTALLED DDE3 ORG $DDE3 DDE3 34 10 SEQUEN PSHS X DDE5 8E 1234 LDX #$1234 CHECK IF INITIAL BOOT DDE8 BC DDFD CMPX SEQ1 DDEB 27 08 BEQ SEQNOI NO, NOT INITIAL DDED 86 01 LDA #1 YES, INITIALIZE SEQUENCE NO DDEF B7 DDFF STA SEQNO DDF2 BF DDFD STX SEQ1 AND ALSO BOOTUP FLAG DDF5 B6 DDFF SEQNOI LDA SEQNO LOAD SEQUENCE NUMBER DDF8 7C DDFF INC SEQNO THEN INCREMENT TO NEXT DDFB 35 90 PULS X,PC AND RETURN DDFD SEQ1 RMB 2 SEQUENCE INITIAL BOOTUP FLAG DDFF SEQNO RMB 1 SEQUENCE NUMBER * DISK DRIVER ADDRESSES * DISK DRIVERS * DISK READ ROUTINE DE00 DREAD EQU $DE00 * DISK WRITE ROUTINE DE03 DWRITE EQU $DE03 * DISK VERIFY ROUTINE DE06 DVERIF EQU $DE06 * DISK RESTORE ROUTINE DE09 DREST EQU $DE09 * DISK DRIVE SELECT ROUTINE DE0C DDRIVE EQU $DE0C * DISK CHECK ROUTINE DE0F DCHK EQU $DE0F * DISK QUICK CHECK ROUTINE DE12 DQUICK EQU $DE12 * DISK INITIALIZATION ROUTINE DE15 DINIT EQU $DE15 * DISK WARM START ROUTINE DE18 DWARM EQU $DE18 * DISK SEEK ROUTINE DE1B DSEEK EQU $DE1B * ACTUAL DISK DRIVER CODE FOR G28 D3E5 ORG $D3E5 D3E5 D3 70 D3 9F FCB $D3,$70,$D3,$9F,$DF,$C2,$DF,$C8 D3E9 DF C2 DF C8 D3ED D3 99 D3 95 FCB $D3,$99,$D3,$95,$D3,$87,$D3,$77 D3F1 D3 87 D3 77 D3F5 DF 57 D3 7B FCB $DF,$57,$D3,$7B,$D3,$7F,$D3,$83 D3F9 D3 7F D3 83 D370 ORG $D370 D370 AD 9F F8 04 FCB $AD,$9F,$F8,$04,$84,$7F,$39,$6E D374 84 7F 39 6E D378 9F F8 02 6E FCB $9F,$F8,$02,$6E,$9F,$F8,$08,$6E D37C 9F F8 08 6E D380 9F F8 0A 6E FCB $9F,$F8,$0A,$6E,$9F,$F8,$06,$86 D384 9F F8 06 86 D388 01 B7 E2 11 FCB $01,$B7,$E2,$11,$8D,$0B,$8E,$13 D38C 8D 0B 8E 13 D390 87 BF E2 12 FCB $87,$BF,$E2,$12,$39,$86,$42,$20 D394 39 86 42 20 D398 02 86 43 B7 FCB $02,$86,$43,$B7,$E2,$10,$39,$8D D39C E2 10 39 8D D3A0 F8 8D F2 7E FCB $F8,$8D,$F2,$7E,$C7,$00,$17,$0A D3A4 C7 00 17 0A D3A8 63 E6 21 C4 FCB $63,$E6,$21,$C4,$03,$CA,$08,$D7 D3AC 03 CA 08 D7 D3B0 18 20 05 C6 FCB $18,$20,$05,$C6,$8C,$17,$0B,$1F D3B4 8C 17 0B 1F D3B8 17 0B 92 C5 FCB $17,$0B,$92,$C5,$98,$35,$E8,$CE D3BC 98 35 E8 CE D3C0 DE 1E 8E DE FCB $DE,$1E,$8E,$DE,$2E,$86,$1B,$C6 D3C4 2E 86 1B C6 D3C8 04 6F C0 A7 FCB $04,$6F,$C0,$A7,$C0,$AF,$C1,$5A D3CC C0 AF C1 5A D3D0 26 F7 35 E8 FCB $26,$F7,$35,$E8,$60,$70,$40,$50 D3D4 60 70 40 50 D3D8 10 00 30 20 FCB $10,$00,$30,$20,$00,$00,$00,$03 D3DC 00 00 00 03 DE00 ORG $DE00 DE00 BD DE 4E BD FCB $BD,$DE,$4E,$BD,$DE,$4E,$BD,$DE DE04 DE 4E BD DE DE08 4E BD DE 4E FCB $4E,$BD,$DE,$4E,$BD,$DE,$4E,$BD DE0C BD DE 4E BD DE10 DE 4E BD DE FCB $DE,$4E,$BD,$DE,$4E,$BD,$DE,$4E DE14 4E BD DE 4E DE18 BD DE 4E BD FCB $BD,$DE,$4E,$BD,$DE,$4E,$00,$00 DE1C DE 4E 00 00 DE20 DE 2E 00 00 FCB $DE,$2E,$00,$00,$DE,$2E,$00,$00 DE24 DE 2E 00 00 DE28 DE 2E 00 00 FCB $DE,$2E,$00,$00,$DE,$2E,$DE,$6D DE2C DE 2E DE 6D DE30 00 DE 89 00 FCB $00,$DE,$89,$00,$D3,$B3,$00,$D3 DE34 D3 B3 00 D3 DE38 A6 00 DF 58 FCB $A6,$00,$DF,$58,$00,$DF,$A0,$00 DE3C 00 DF A0 00 DE40 DF AA 00 D3 FCB $DF,$AA,$00,$D3,$BF,$00,$DF,$BB DE44 BF 00 DF BB DE48 00 DE E9 00 FCB $00,$DE,$E9,$00,$DF,$66,$34,$02 DE4C DF 66 34 02 DE50 A6 62 80 03 FCB $A6,$62,$80,$03,$B7,$D3,$DD,$35 DE54 B7 D3 DD 35 DE58 02 32 62 34 FCB $02,$32,$62,$34,$6A,$17,$00,$D9 DE5C 6A 17 00 D9 DE60 86 E0 1F 8B FCB $86,$E0,$1F,$8B,$B6,$D3,$DD,$33 DE64 B6 D3 DD 33 DE68 C6 35 02 6E FCB $C6,$35,$02,$6E,$D4,$34,$01,$8D DE6C D4 34 01 8D DE70 61 C6 8C 8D FCB $61,$C6,$8C,$8D,$62,$D6,$18,$C5 DE74 62 D6 18 C5 DE78 02 26 08 C5 FCB $02,$26,$08,$C5,$01,$26,$F6,$C4 DE7C 01 26 F6 C4 DE80 9C 20 1C 96 FCB $9C,$20,$1C,$96,$1B,$A7,$80,$20 DE84 1B A7 80 20 DE88 EC 34 01 8D FCB $EC,$34,$01,$8D,$45,$C6,$AC,$8D DE8C 45 C6 AC 8D DE90 46 A6 80 D6 FCB $46,$A6,$80,$D6,$18,$C5,$02,$26 DE94 18 C5 02 26 DE98 33 C5 01 26 FCB $33,$C5,$01,$26,$F6,$C5,$DC,$27 DE9C F6 C5 DC 27 DEA0 1D C5 10 27 FCB $1D,$C5,$10,$27,$17,$A6,$21,$84 DEA4 17 A6 21 84 DEA8 8F 34 02 A6 FCB $8F,$34,$02,$A6,$21,$8E,$D3,$D4 DEAC 21 8E D3 D4 DEB0 84 70 44 44 FCB $84,$70,$44,$44,$44,$44,$A6,$86 DEB4 44 44 A6 86 DEB8 AA E0 A7 21 FCB $AA,$E0,$A7,$21,$C5,$DC,$1C,$AF DEBC C5 DC 1C AF DEC0 34 01 A6 61 FCB $34,$01,$A6,$61,$84,$50,$AA,$E1 DEC4 84 50 AA E1 DEC8 1F 8A 35 E8 FCB $1F,$8A,$35,$E8,$97,$1B,$A6,$80 DECC 97 1B A6 80 DED0 20 C1 8D 5A FCB $20,$C1,$8D,$5A,$16,$FF,$44,$B6 DED4 16 FF 44 B6 DED8 D3 DE 48 2A FCB $D3,$DE,$48,$2A,$08,$A6,$21,$85 DEDC 08 A6 21 85 DEE0 10 27 02 CA FCB $10,$27,$02,$CA,$02,$D7,$18,$20 DEE4 02 D7 18 20 DEE8 5E 34 02 D7 FCB $5E,$34,$02,$D7,$1A,$8D,$58,$E6 DEEC 1A 8D 58 E6 DEF0 21 C4 28 4D FCB $21,$C4,$28,$4D,$26,$02,$C4,$08 DEF4 26 02 C4 08 DEF8 86 0A C5 20 FCB $86,$0A,$C5,$20,$27,$02,$8B,$08 DEFC 27 02 8B 08 DF00 91 1A 24 02 FCB $91,$1A,$24,$02,$CA,$40,$FA,$D3 DF04 CA 40 FA D3 DF08 DC D7 14 F7 FCB $DC,$D7,$14,$F7,$D3,$DE,$A6,$E4 DF0C D3 DE A6 E4 DF10 6D 21 2A 06 FCB $6D,$21,$2A,$06,$D6,$19,$58,$D7 DF14 D6 19 58 D7 DF18 19 48 97 1B FCB $19,$48,$97,$1B,$A6,$21,$84,$03 DF1C A6 21 84 03 DF20 8A 18 97 18 FCB $8A,$18,$97,$18,$8D,$27,$35,$02 DF24 8D 27 35 02 DF28 97 19 C5 D8 FCB $97,$19,$C5,$D8,$35,$E8,$1A,$50 DF2C 35 E8 1A 50 DF30 7D CC 34 27 FCB $7D,$CC,$34,$27,$03,$11,$3F,$12 DF34 03 11 3F 12 DF38 39 B6 D3 DC FCB $39,$B6,$D3,$DC,$10,$8E,$DE,$1E DF3C 10 8E DE 1E DF40 48 48 31 A6 FCB $48,$48,$31,$A6,$EE,$22,$39,$C6 DF44 EE 22 39 C6 DF48 14 5A 26 FD FCB $14,$5A,$26,$FD,$39,$D6,$14,$0D DF4C 39 D6 14 0D DF50 19 C5 04 27 FCB $19,$C5,$04,$27,$F8,$D6,$18,$39 DF54 F8 D6 18 39 DF58 A6 03 34 20 FCB $A6,$03,$34,$20,$8D,$DB,$86,$1E DF5C 8D DB 86 1E DF60 10 AE E0 16 FCB $10,$AE,$E0,$16,$FF,$01,$A6,$03 DF64 FF 01 A6 03 DF68 B1 D3 DC 27 FCB $B1,$D3,$DC,$27,$23,$D6,$19,$D7 DF6C 23 D6 19 D7 DF70 1B C6 80 D7 FCB $1B,$C6,$80,$D7,$14,$C6,$10,$D7 DF74 14 C6 10 D7 DF78 18 8D D2 D6 FCB $18,$8D,$D2,$D6,$19,$E7,$A4,$B7 DF7C 19 E7 A4 B7 DF80 D3 DC 8D B5 FCB $D3,$DC,$8D,$B5,$E6,$A4,$D7,$19 DF84 E6 A4 D7 19 DF88 E6 21 84 28 FCB $E6,$21,$84,$28,$AA,$03,$97,$14 DF8C AA 03 97 14 DF90 17 FE 7C 25 FCB $17,$FE,$7C,$25,$05,$5F,$1C,$FE DF94 05 5F 1C FE DF98 35 E8 C6 80 FCB $35,$E8,$C6,$80,$1A,$01,$35,$E8 DF9C 1A 01 35 E8 DFA0 D6 18 2A 06 FCB $D6,$18,$2A,$06,$D6,$14,$C5,$10 DFA4 D6 14 C5 10 DFA8 26 FA A6 03 FCB $26,$FA,$A6,$03,$B1,$D3,$DF,$22 DFAC B1 D3 DF 22 DFB0 06 D6 18 2A FCB $06,$D6,$18,$2A,$E0,$20,$E3,$C6 DFB4 E0 20 E3 C6 DFB8 0F 20 E1 6F FCB $0F,$20,$E1,$6F,$E4,$35,$E8 DFBC E4 35 E8 DFBF SDEND EQU * END OF STAR-DOS END COLDSV