NAM SK*DOS * * 1. All of the software and documentation contained here is copyright * (C) 1975 through 2000 by Peter A. Stark, and distributed under * license by Star-K Systems. It is not shareware, nor is it in the * public domain, and Star-K Systems does not provide any warranty on it * whatsoever. * * 2. You may not make any commercial use of this material. That means * that you cannot sell it, and you cannot incorporate it (or parts of * it) into commercial products. You also cannot translate it, or use it * for any other derivative works for commercial use. * * 3. You may, however, use it for your own personal use, or allow * others to use it for personal use. The precise terms for doing so * (excluding commercial use) are the same as those published in the * "GNU General Public License" (or GPL) of the Free Software * Foundation, Inc. 675 Massachusetts Avenue, Cambridge, MA 02139, USA, * which is used to license Linux. If you have any questions about the * interpretation of these terms, consult the full text of the GPL, * available with any Linux distribution. * * Here is a very brief summary of the allowable noncommercial uses, as * more fully described in the GPL: * * You may use these materials for your own use. You may also modify * this software or documentation and/or incorporate parts of it into * materials for your personal use, or for the personal use of others, * and/or distribute it to others for their personal use, as long as you * * (a) do not sell the resulting products or materials, * * (b) include this full License text verbatim with your * distribution, and you conspicuously and appropriately publish on * each copy an appropriate copyright notice and disclaimer of warranty; * keep intact all the notices that refer to this License and to the * absence of any warranty; and give any other recipients a copy of this * License, and ensure that the recipient accepts its terms. * * (c) provide the full source code or documentation for any * modifications you have made with your distribution, * * (d) Just as you are receiving these materials at no charge and * with no restrictions on personal use, so you must license any work * that you distribute or publish, that in whole or in part contains or * is derived from these Star-K materials or any part thereof, at no * charge to all third parties under the terms of this License. * * (e) If you incur a cost in distributing this software or * documentation, or modifications thereof, you may ask recipients to * reimburse you for the reasonable cost of media, packaging, and/or * postage. * * (4) You are not required to accept this License, since you have not * signed it. However, nothing else grants you permission to modify or * distribute Star-K materials or their derivative works. These actions * are prohibited by law if you do not accept this License. Therefore, * by modifying or distributing these materials (or any work based on * them), you indicate your acceptance of this License to do so, and all * its terms and conditions. * OPT PAG PAG * SK*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 DC-4 - TYPE DRIVERS BASE EQU $C000 STAR-DOS STARTING ADDRESS SETDP $70 DISABLE ACCIDENTAL DIRECT ADDRESSES * VERSION NUMBER ORG $CD00 DUMMY ADDRESS BRA LOCKUP ONLY HERE TO LEAVE ROOM FOR 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 LOCKUP FDB 0,0,0,0 FDB 0,0,0,0 JSR PUTCHR PULS A,B,X,PC FCC '(C) 1984 - 1986 BY PETER A. STARK. ' FCC 'ALL RIGHTS RESERVED.' * FILE CONTROL BLOCK EQUATES FCBFUN EQU 0 FUNCTION CODE FCBERR EQU 1 ERROR CODE FCBRW EQU 2 READ=1, WRITE=2 FCBDRV EQU 3 DRIVE NUMBER FCBNAM EQU 4 FILE NAME (8 CHARS) FCBEXT EQU 12 FILE EXTENSION (3 CHARS) FCBATT EQU 15 FILE PROT ATTRIBUTES (BITS 4-7) FCBFTR EQU 17 FIRST TRACK OF FILE FCBFSE EQU 18 FIRST SECTOR OF FILE FCBLTR EQU 19 LAST TRACK OF FILE FCBLSE EQU 20 LAST SECTOR OF FILE FCBSIZ EQU 21 2-BYTE FILE SIZE IN SECTORS FCBRAN EQU 23 RANDOM INDICATOR (0=SEQ) FCBTIM EQU 24 POSSIBLE TIME BYTE FCBMON EQU 25 MONTH FCBDAY EQU 26 DAY FCBYR EQU 27 YEAR OF FILE CREATION FCBLST EQU 28 FCB LIST POINTER TO NEXT FCB FCBCTR EQU 30 CURRENT TRACK IN BUFFER FCBCSE EQU 31 CURRENT SECTOR IN BUFFER FCBCRN EQU 32 2-BYTE CURRENT RECORD NUMBER FCBDPT EQU 34 DATA POINTER TO NEXT BYTE (0-255) FCBRIN EQU 35 RANDOM FILE INDEX POINTER FCBNMB EQU 36 TEMPORARY NAME BUFFER (11 CHARS) FCBDIT EQU 47 DIRECTORY TRACK (0- ) FCBDIS EQU 48 DIRECTORY SECTOR (5- ) FCBDIB EQU 49 DIRECTORY STARTING BYTE INDEX FCBDIE EQU 52 DIRECTORY ENTRY NUMBER (0-7) FCBNMS EQU 53 SCRATCH NAME (11 CHARS) FCBSCF EQU 59 SPACE COMPR FLAG (0=COMPR,FF=NO) FCBSPT EQU 60 SECTORS PER TRACK FOR RANDOM FCBUPD EQU 63 RANDOM UPDATE FLAG FCBDAT EQU 64 DATA BUFFER (256 BYTES) ORG BASE+$0080 LIES AT $C080 LINBUF RMB 128 INPUT LINE BUFFER ORG BASE+$0700 LIES AT $C700 - CBFF OUTFCB RMB 320 FCB FOR DISK OUTPUT USRFCB RMB 320 USER FCB FOR USER PROGRAMS DIRFCB RMB 320 FCB FOR DIRECTORY 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 TEMP1 EQU DIRFCB+$26 C9A6 TEMP2 EQU DIRFCB+$28 C9A8 TEMP3 EQU DIRFCB+$2A C9AA ORG DIRFCB+$32 C9B2 ERRMSG FCB $D,$A FCC 'ERROR' FCB 4 ORG BASE+$071B LIES AT $C71B SPOOCT FCB 0 SPOOLING COUNTER = 0 PAG * INITIALIZATION STAGE FOR SK*DOS ORG $C7A0 * FIX UP BOOJMP SO THE NEXT COLDSTART * DOESN'T COME HERE ANY MORE ONEDOS LDD #$1212 STA BOOJMP CHANGES IT TO NOP STD BOOJMP+1 CHANGES IT TO NOP BSR GTMEME CHECK MEMORY SIZE AND SET MEMEND LEAX SIGNON,PCR JSR PSTRNG PRINT SIGN-ON MESSAGE JSR ASKDAT ASK AND GET DATE VIA VECTOR AT CA02 * GO OPEN 'STARTUP.TXT' FILE LDX #STNAME POINT TO "STARTUP.TXT" NAME LDY #USRFCB+4 AND WHERE IT GOES IN FCB JSR NAMOVE PUT IT INTO FCB LDX #USRFCB STX CURFCB LDA SYSTDR STA 3,X SELECT SYSTEM DRIVE JSR FCS1 GO OPEN THE FILE FOR READING BEQ STRTOK IF STARTUP.TXT WAS FOUND LDA 1,X CHECK ERROR CODE CMPA #4 IS IT FILE NOT THERE? BEQ NOSPOO ERASE SPOOL TABLE AND WARMSTART STRTNG JSR PERROR ELSE REPORT ERROR BRA NOSPOO ERASE SPOOL TABLE AND WARMSTART * FOUND STARTUP.TXT FILE, GO DO IT STRTOK LDY #LINBUF POINT TO LINE BUFFER STY LPOINT LDX #USRFCB STRTLP JSR FCS GO READ A BYTE FROM STARTUP BNE STRDER IF READ ERROR ON STARTUP STA 0,Y+ PUT INTO LINE BUFFER CMPA #$0D END OF LINE? BNE STRTLP NO, KEEP READING JSR FCSCLS YES, END OF LINE SO CLOSE FILE JSR EXECSD GO EXECUTE THIS COMMAND BNE STRTNG IF THERE WAS AN ERROR BRA NOSPOO ERASE SPOOL TABLE AND WARMSTART * ON STARTUP ERROR, CHECK FOR END OF FILE STRDER LDA 1,X GET ERROR CODE CMPA #8 END OF FILE? BNE STRTNG NO, REPORT ERROR AND QUIT JSR FCSCLS ELSE CLOSE EVERYTHING * FINALLY, ERASE SPOOLING TABLE AT C810-C83F AND WARMSTART NOSPOO LDX #$C810 POINT TO SPOOLING TABLE NSLOOP CLR 0,X+ CLEAR A BYTE CMPX #$C840 AT END? BNE NSLOOP NO, CLEAR MORE JMP WARMS FINALLY WARM START *********CAUTION - MAKE SURE THIS ENDS BEFORE C810******* * ROUTINE TO CHECK FOR END OF LOGICAL MEMORY GTMEME LDX #0000 POINT TO 0 LDD #$A596 MEMORY TEST PATTERN MEMLOO LDU 0,X SAVE CONTENTS STD 0,X SAVE PATTERN CMPD 0,X COMPARE IT BNE ENDMEM DIDN'T GO IN STU 0,X RESTORE OLD CONTENTS LEAX 1,X GO TO NEXT CMPX MEMEND GONE TOO FAR? BLS MEMLOO NO, GO BACK FOR MORE ENDMEM LEAX -1,X GO BACK TO ONE THAT WORKED STX MEMEND AND SAVE AS TOP OF MEMORY RTS * THE FOLLOWING PART LIES INSIDE DIRFCB AT * $CA02 AND WILL GET ERASED LATER ORG $CA02 ASKDAT NOP CAN BE REPLACED BY VECTOR NOP NOP ASKDA1 LEAX DATERQ,PCR JSR PSTRNG ASK FOR DATE JSR INLINE INPUT DATE, SEPARATED BY COMMAS LDY #MONTH POINT TO MONTH LOCATION BSR GETDAT GET MONTH BSR GETDAT GET DAY BSR GETDAT GET YEAR LDX #THANKS JSR PSTRNG PRINT "THANK YOU" JSR PCRLF RTS * GETDAT ROUTINE TO INPUT AND STORE DATE GETDAT JSR DECIN GET NEXT DATE ITEM BCC DATEOK OK NUMBER RECEIVED DATENG LEAS 2,S ELSE REMOVE RETURN ADDRESS FROM STACK BRA ASKDA1 AND ASK FOR DATE AGAIN DATEOK TFR X,D MOVE DATE TO D CMPD #99 SHOULD BE LESS THAN 99 BHI DATENG ELSE IT'S NO GOOD STB 0,Y+ SAVE IT RTS ORG $CB00 SIGNON FCB $D,$A FCC ' WELCOME TO' FCB $D,$A FCC ' SK*DOS / 68O9 VERSION 35' FCB $D,$A FCC ' COPYRIGHT (C) 1984-1989 BY PETER A. STARK' FCB $D,$A FCC ' STAR-K SOFTWARE SYSTEMS CORP.' FCB $D,$A,4 DATERQ FCB $D,$A FCC "ENTER TODAY'S DATE (MM,DD,YY): " FCB 4 STNAME FCC 'STARTUP',0,'TXT' STARTUP.TXT FILE NAME THANKS FCC 'THANK YOU.',4 PAG ORG BASE+$0C00 LIES AT $CC00 BACKSP FCB $08 BACKSPACE CHARACTER DELETE FCB $18 CONTROL-X ENDLIN FCC ':' END OF LINE PLINES FCB 0 DEPTH OF PAGE WIDTH FCB 0 PAGE WIDTH NULLWT FCB 0 WAIT AFTER CRLF CONSTANT FCB 0 TTYTAB BECHO FCB 8 BACKSPACE ECHO SLINES FCB 0 EJECT COUNT PSFLAG FCB 0 SCREEN PAUSE FLAG (DEFAULT OFF) ESCAPE FCB $1B ESCAPE CHARACTER SYSTDR FCB 0 SYSTEM DEFAULT DRIVE WORKDR FCB 0 WORK DRIVE REPEAT FCB 1 REPEAT LINE MONTH RMB 1 SYSTEM MONTH DAY RMB 1 DAY YEAR RMB 1 AND YEAR LASTRM FCB $0D LAST TERMINATOR USRTAB FDB 0 USER COMMAND TABLE LPOINT RMB 2 LINBUF POINTER BREAK RMB 2 ESCAPE RETURN ADDRESS CURRCH RMB 1 CURRENT CHARACTER FROM GETNX PRECHR RMB 1 PREVIOUS CHARACTER FROM GETNX DEPCTR FCB 0 PAUSE LINE COUNTER OFFSET FDB 0000 XFERFL RMB 1 TRANSFER FLAG EXECAD RMB 2 EXECUTION ADDRESS FOR BIN FILES ERRTYP RMB 1 LAST FCS ERROR CODE SPECIO RMB 1 SPECIAL I/O FLAG OUCHSW RMB 1 OUTPUT SWITCH INCHSW RMB 1 INPUT SWITCH FOADDR RMB 2 FILE OUTPUT ADDRESS FOR PUTCHR FIADDR RMB 2 FILE INPUT ADDR FOR GETCHR CMFLAG RMB 1 EXECSD FLAG =1 IF CALLED VIA EXECSD CURCOL RMB 1 CURRENT COLUMN ON PAGE RMB 1 NOT USED MEMEND FDB $BFFF END OF MEMORY ERRVEC FDB 0 VECTOR TO ERROR NAME ROUTINE INECHO FCB $FF INPUT ECHO FLAG (1=ECHO) NUMBER FDB 0 SCRATCH - FOR USE WITH OUT5D IN PERROR RMB 2 SYSTEM SCRATCH SPLFLG FCB 0 SPOOLING FLAG 0=NOT ACTIVE ORG BASE+$0C43 ESDRET RMB 2 EXECSD RETURN ADDRESS ESDSTP RMB 2 EXECSD STACK POINTER INFLAG RMB 1 DECIMAL (0) OR HEX (1) INPUT FLAG OPCODE RMB 1 OPCODE IN FCS9 AND 10 * FOLLOWING ***MUST!*** BE AT CC49 FNCASE FCB $60 USED BY GETNAM FOR UPPER CASE ONLY FCBADD RMB 2 FCB ADDRESS ORETRY RMB 1 OUTER RETRY COUNTER IRETRY RMB 1 INNER RETRY COUNTER TEMP RMB 3 TEMPORARY IN FCS4, DEC-HEXIN, CMDPROC LISPTR RMB 2 TEMPORARY LIST POINTER TEMCNT RMB 2 TEMPORARY FOR SCTR COUNT FCSJMP RMB 2 FCS TEMPORARY LOCATION EXSAVE RMB 1 EXTENSION CODE FOR GET SCFLAG RMB 1 SPACE COMPRESSION INDICATOR CHKSUM RMB 2 CHECKSUM FOR DISK NAME AND DATE DRTPTR RMB 2 DRIVE TABLE DATA POINTER DEFDRV RMB 1 DEFAULT DRIVE (WORKDR MOSTLY) FCB 0 MAXDRV FCB 3 MAX DRV NUMBER >>MUST BE AT CC5F<< CACFLG FDB 0 CACHE FLAG >>MUST BE AT CC60<< ORG BASE+$0C66 DRTABL RMB 2 DRIVE 0: DISK NAME/DATE CHECKSUM RMB 2 FIRST FREE T-S FROM SIR RMB 2 LAST FREE T-2 RMB 2 NUMBER OF FREE SECTORS RMB 1 SAVE FOR MULTI USER RMB 81 SAME FOR 9 MORE DRIVES, TOTAL OF 10 * PRINTER ROUTINES ARE ALL RTS FOR NOW ORG $CCC0 RTS PRINT INITIALIZATION ORG $CCD8 RTS CHECK PRINTER READY ORG $CCE4 RTS OUTPUT TO PRINTER ORG $CCFC SPOOLF FCB 0 SPOOLING FLAG - MUST BE 0 PAG ORG BASE+$0D00 LIES AT $CD00 * STAR-DOS ENTRY POINTS COLDSV JMP COLDS COLDSTART WARMSV JMP WARMS WARMSTART RENTEV JMP MLOOP1 RE-ENTER TO PROCESS LINBUF COMMAND INCH JMP GETCH INCH2 JMP GETCH OUTCH JMP OUTEEV OUTCH2 JMP OUTEEV GETCHR JMP GETCHT GET AN INPUT CHARACTER PUTCHR JMP PUTCHT OUTPUT A CHARACTER INLINV JMP INLINE INPUT INTO LINE BUFFER PSTRNV JMP PSTRNG PRINT CR-LF AND STRING CLASFV JMP CLASF IDENTIFY ALPHANUMERIC CHARACTERS PCRLFV JMP PCRLF CARRIAGE RETURN AND LINE FEED GETNXV JMP GETNX INPUT CHARACTER FROM INPUT BUFFER RESIOV JMP RESIO RESTORE I/O VECTORS GETNAV JMP GETNAM TRANSFER FILESPEC FROM LINBUF TO FCB LOADV JMP LOAD LOAD ML FILE THAT HAS BEEN OPENED DEFEXV JMP DEFEXT SETUP DEFAULT EXTENSION IN FCB ABX ABX ADD B TO X (USELESS) RTS NOP OUT5DV JMP OUT5D OUTPUT A DECIMAL NUMBER OUT2HV JMP OUT2H OUT2H PERRV JMP PERROR REPORT STAR-DOS ERROR NUMBER HEXINV JMP HEXIN GET 4-DIGIT HEX NUMBER OUT4HV JMP OUT4H OUT4H DECINV JMP DECIN INPUT 5-DIGIT DECIMAL NUMBER EXECSV JMP EXECSD EXECUTE STARDOS COMMAND STATV JMP STATEV CHECK KEYBOARD STATUS MOVNAM JMP NAMOVE MOVE 11 CHARS X TO Y PDATAV JMP PDATA PRINT STRING W/O CR/LF INTIME JMP SEQUEN TRAP FOR TIME ENTRY, ELSE SEQUENCE SETDP CLRA ROUTINE TO SET DP REGISTER TO 0 TFR A,DP RTS INNOEC JMP [KINPUV] KEYBOARD INPUT W/O ECHO PAG COLDS LDS #BASE+$0080 PUT STACK UNDER LINE BUFFER JSR [SINITV] INITIALIZE SERIAL PORT JSR RESIO RESET I/O VECTORS CLRA CLRB STD FBAPTR ERASE FILE LIST POINTER CLR CMFLAG FORCE EXTERNAL EXECSD FLAG OFF CLR XFERFL NO TRANSFER ADDRESS LOADED JSR FCSINI INITIALIZE FCS SYSTEM BRA WARMS2 WARMS LDX #WARMSV STX BREAK INITIALIZE ESCAPE RETURN LDS #BASE+$0080 PUT STACK UNDER LINE BUFFER JSR RESIO RESET I/O VECTORS LDA LASTRM PREVIOUS LAST TERMINATOR CMPA ENDLIN DOING MORE COMMAND? BNE WARMS1 NO, JUST WARMS WARMS0 LDX LPOINT LEAX 1,X STEP PAST TERMINATOR STX LPOINT BRA MLOOP1 AND GO PROCESS IT WARMS1 TST CMFLAG CHECK IF AN EXTERNAL EXECSD HAD BEEN USED BEQ WARMS2 NO, SO DO IT NORMALLY CLR CMFLAG YES, SO CLEAR FOR NEXT TIME LDS ESDSTP RESET STACK POINTER TO USER'S VALUE LDB ERRTYP GET LAST ERROR JMP [ESDRET] AND RETURN TO USER WARMS2 JSR DWARM WARM-RESET DISK DRIVERS LDX IRQHAN DISABLE IRQ'S STX [IRQVEC] POINTS VECTOR TO HANDLER CLRA CLRB STD OFFSET CLEAR OFFSET STD ERRVEC AND CLEAR ERROR VECTOR DECA CHANGE TO $FF STA INECHO ENABLE KEYBOARD ECHO CLR ERRTYP NO ERRORS SO FAR LDA WORKDR STA DEFDRV DRIVE USUALLY DEFAULTS TO WORK DRIVE BSR SETDP GO TO CLEAR DP REGISTER JSR FCSCLS CLOSE ALL FILES LDD #$0D0D STD CURRCH CURR & PREV CHAR ARE BOTH CR BOOJMP JSR ONEDOS TEMPORARY - WILL BECOME NOP LATER * MAIN COMMAND LOOP MLOOP LDX #PROMPT JSR PSTRNG PRINT PROMPT JSR INLINE INPUT COMMAND MLOOP1 LDA [LPOINT] GET FIRST CHAR IN LINE CMPA #$0D CR? BEQ MLOOP YES, SO NOTHING WAS ENTERED CMPA #$20 SPACE? BEQ WARMS0 STEP OVER IT BRA DOCMN0 EXECUTE COMMAND PROMPT FCC 'SK*DOS: ' FCB 4 * EXECSD - ROUTINE TO PROCESS COMMAND IN LINBUF * EXTERNAL ENTRY POINT FROM USER PROGRAM EXECSD INC CMFLAG EXTERNAL ENTRY POINT LDD 0,S++ GET RETURN ADDRESS STD ESDRET SAVE IT ALSO IN ESDRET STS ESDSTP SAVE USER'S STACK POINTER DOCMN0 CLR ERRTYP ERASE ERROR CODE LDX LPOINT POINT X TO NEXT CHAR IN LINBUF JSR SKIPSP SKIP SPACES CMPA #$0D IS IT CR? BNE DOCMN2 NO, SO CONTINUE DOCMER LDB #26 COMMAND SYNTAX ERROR BRA DOERRO SAVE ERROR CODE AND RTS DOCMN2 LDD LPOINT STD TEMP+1 SAVE LINE POINTER FOR TRYDISK LDX #USRFCB JSR GETNAM MOVE COMMAND INTO FCB NAME BCS DOCMER ERROR 26 IF NG LDX USRTAB ELSE TRY USER'S COMMAND TABLE BEQ NOUSER NONE IF 0 BSR TRYMEM BEQ CMDOK IF WE FOUND ONE NOUSER LDX #CMDTAB POINT TO OUR CMD TABLE BSR TRYMEM FIND MEMORY RESIDENT BEQ CMDOK IF WE FOUND ONE LDD TEMP+1 IF NOT, RESTORE LPOINT STD LPOINT BRA TRYDSK TRY DISK RESIDENT * IF A COMMAND IS FOUND IN COMMAND TABLE DO IT CMDOK JSR [0,X] GO VIA ITS ADDRESS BRA DOQUIT GET ANY ERROR AND RETURN * TRY TO FIND MEMORY-RESIDENT COMMAND TRYMEM LDY #USRFCB+FCBNAM POINT TO PARSED COMMAND LDA 0,X CHECK FIRST BYTE BEQ TMNOTF ZERO MEANS END OF TABLE TMLOOP LDA 0,X+ NEXT CHAR IN TABLE CMPA 0,Y+ COMP WITH COMMAND'S NEXT BNE TMDIFF IF DIFFERENT TSTA IF SAME, CHECK FOR END BNE TMLOOP NOT END, KEEP GOING TMFOUN RTS EXIT IF SAME, Y-> ADDRESS * IF CHARS DON'T MATCH, OK IF Y POINTS PAST NAME TMDIFF CMPY #USRFCB+FCBEXT PAST NAME TO EXTENSION? BEQ TMFOUN YES, COMMAND MUST BE SAME * IF NOT, COMMANDS ARE DIFFERENT - STEP TO NEXT TMSTEP TSTA IS X-> COMMAND'S ADDRESS (PAST 0) BEQ TMADDR YES, STEP OVER IT LDA 0,X+ NO, GO TO NEXT BRA TMSTEP TMADDR LEAX 2,X AT ADDRESS, STEP OVER IT BRA TRYMEM AND TRY FOR NEXT COMMAND * FINALLY, IF NOTHING FOUND SET NONZERO & EXIT TMNOTF INCA CLEAR Z FLAG RTS * IF MEMORY-RESIDENT COMMAND NOT FOUND, ASSUME DISK-RESIDENT TRYDSK LDA #2 STA EXSAVE DEFAULT TO CMD EXTENSION LDA SYSTDR STA DEFDRV USE SYS DRIVE ON COMMANDS ONLY CLR ERRTYP NO ERRORS SO FAR BSR GET0 ATTEMPT TO DO A GET BNE DOQUIT IF ERROR XEQ CLR EXSAVE DEFAULT TO BIN EXTENSION AGAIN TST XFERFL IS THERE A VALID EXECUTION ADDRESS? BEQ NOEXAD NO EXECUTION ADDRESS JSR [EXECAD] EXECUTE VIA EXECUTION ADDRESS DOQUIT LDB ERRTYP GET ERROR CODE STB USRFCB+FCBERR PUT INTO USER FCB BEQ DOEXIT QUIT IF NO ERROR LBSR RPTER0 ELSE PRINT ERROR DOEXIT JMP WARMS AND RETURN NOEXAD LDB #28 TA ERROR DOERRO STB ERRTYP BRA DOQUIT CMDTAB FCC 'GET' GET ML PROGRAM INTO MEMORY FCB 0 FDB GET FCC 'MON' EXIT DOS BACK TO HUMBUG FCB 0 FDB MONITR FCC 'XEQ' EXECUTE LAST LOADED PROGRAM FCB 0 FDB XEQ FCB 0 END OF TABLE FLAG PAG * GET COMMAND - GET MACHINE LANGUAGE PROGRAM FROM * DISK INTO MEMORY, STORE EXECUTION ADDRESS IN * EXECAD, AND PRINT ERROR MESSAGE ON ERROR GET CLR EXSAVE DEFAULT TO BIN FOR GET GET0 LDX #USRFCB POINT TO USR FCB JSR GETNAM MOVE FILE NAME TO FCB BCS GETEXI IF NAME SEEMS BAD GET1 LDA EXSAVE GET EXTENSION TO BE USED JSR DEFEXT DEFAULT TO BIN OR CMD EXTENSION LDA #1 STA 0,X OPEN FILE FOR READ JSR FCS BNE GETEXI GO REPORT ERROR LOAD PSHS A,B,X,Y,U LDX #USRFCB LDA #$FF STA FCBSCF,X NO SPACE COMPRESSION CLR XFERFL NO TRANSFER ADDR YET GET2 BSR GETNEW GET FLAG BYTE CMPA #$02 BEQ GETDTA DATA FOLLOWS CMPA #$16 BEQ GETTA TRANSFER ADDRESS FOLLOWS BRA GET2 ANYTHING ELSE JUST SKIP GETDTA BSR GETWRD GET LOAD ADDRESS ADDD OFFSET ADD LOAD OFFSET ADDRESS TFR D,U SAVE IN U BSR GETNEW GET LENGTH TFR A,B SET UP AS COUNTER GETLO0 TST FCBDPT,X CHECK FCB DATA POINTER BNE GETLO2 <>0 MEANS OK FOR SHORTCUT GETLO1 BSR GETNEW ELSE GET ONE BYTE STA 0,U+ STORE IN MEMORY DECB DECREMENT COUNTER BEQ GET2 AT END, LOOK FOR NEXT FLAG * HERE'S THE SHORTCUT TO QUICK READ BYTES GETLO2 TFR X,Y SAVE X POINTER TO FCB LDX #USRFCB+FCBDAT POINT X TO FCB DATA AREA TFR B,A SAVE B COUNTER IN A LDB USRFCB+FCBDPT GET DATA POINTER INTO B ABX POINT X TO NEXT BYTE OF DATA EXG X,Y X->FCB AND Y->DATA IN FCB TFR A,B B IS NOW COUNTER AGAIN GETLO3 LDA 0,Y+ GET NEXT BYTE STA 0,U+ SAVE IT INC USRFCB+FCBDPT INCREMENT DATA POINTER DECB DECREMENT COUNTER BEQ GET2 AT END, LOOK FOR NEXT FLAG TST USRFCB+FCBDPT TEST DATA POINTER BNE GETLO3 REPEAT IF STILL NOT ZERO BRA GETLO1 GETTA BSR GETWRD GET TRANSFER ADDRESS FROM FILE STD EXECAD STORE EXECUTION ADDRESS INC XFERFL SIGNAL THAT TRANSFER ADDRESS EXISTS BRA GET2 AND REPEAT * GETWRD - GET TWO-BYTE WORD FROM FILE GETWRD JSR FCS GET MSB BYTE BNE GETNE1 IF ERROR TFR A,B JSR FCS GET LSB BNE GETNE1 IF ERROR EXG A,B AND SWITCH MSB WITH LSB GETEXI RTS * GETNEW - GET BYTE FROM FILE GETNEW JSR FCS ELSE USE FCS0 BEQ GETEXI EXIT IF NO ERROR GETNE1 LDA 1,X LOOK AT ERROR BYTE CMPA #$8 END OF FILE? LBNE PDEROR NO, SO DO PERROR AND WARMS LEAS 2,S DELETE EXTRA RETURN ADDRESS LDA #4 CLOSE AND CONTINUE STA 0,X JSR FCS GO CLOSE INPUT FILE PULS A,B,X,Y,U,PC AND RETURN PAG * GETNX - GET NEXT CHARACTER FROM LINBUF BUFFER, AND * CLASF - CLASSIFY IT AS ALPHANUMERIC OR NOT GETNX PSHS X LDA CURRCH STA PRECHR STORE PREVIOUS CHARACTER GETNX0 LDX LPOINT POINT TO CHARACTER LDA 0,X GET CHARACTER STA CURRCH STORE CURRENT CHARACTER CMPA #$0D CR? BEQ CLASF0 YES, SKIP INX AND SPACE TEST CMPA ENDLIN END OF LINE? BEQ CLASF0 YES, SKIP INX AND SPACE TEST * ON OTHER THAN CR OR EOL, STEP PAST IT INX STX LPOINT * IF SPACE, STEP PAST IT TO NEXT NON-SPACE GETNX2 CMPA #$20 SPACE? BNE CLASF0 NO CMPA 0,X YES, IS NEXT ONE ALSO SPACE? BEQ GETNX0 YES, SO READ AND REPEAT * CLASSIFY CHARACTER, AND RETURN CARRY SET IF NOT ALPHANUMERIC CLASF0 PULS X CLASF CMPA #'0 BLO CLASF2 UNDER '0' IS NOT ALPHA CMPA #'9 BLS CLASF1 DIGITS 0-9 ARE OK CMPA #'A BLO CLASF2 BELOW 'A' IS NOT ALPHA CMPA #'Z BLS CLASF1 LETTERS A-X ARE OK CMPA #'a BLO CLASF2 CHARACTERS BETWEEN Z AND a ARE NG CMPA #'z BHI CLASF2 ABOVE 'z' IS AGAIN NG CLASF1 CLC CLEAR IF OK RTS CLASF2 STA LASTRM ELSE STORE TERMINATOR SEC SET CARRY RTS AND RETURN PAG * INLINE - ROUTINE TO ENTER DATA FROM KEYBOARD INTO * THE LINBUF LINE BUFFER INLINE PSHS A,X INBUF1 LDX #LINBUF POINT TO BUFFER STX LPOINT SAVE POINTER INBUF2 JSR GETCHT GET NEXT CHARACTER CMPA DELETE CONTROL-X? BNE INBUF4 NO * ON CONTROL-X BACKUP TO BEGINNING OF LINE INBUF3 CMPX #LINBUF AT BEGINNING? BEQ INBUF1 YES, REPEAT LDA #8 BSR PUCHV PRINT BACKSPACE LDA #$20 BSR PUCHV LDA #8 BSR PUCHV BACKSPACE AGAIN DEX BRA INBUF3 UNTIL AT BEGINNING * CONTINUE IF NOT CONTROL-X INBUF4 CMPA BACKSP BS? BNE INBUF5 NO * BACKSPACE CHARACTER CMPX #LINBUF AT BEGINNING? BNE INBU4A NO, SO DO BACKSPACE OK LDA #$20 YES, SO CANCEL IT BSR PUCHV BRA INBUF1 AND START OVER INBU4A DEX BACKSPACE LDB BECHO CHECK BACKSPACE ECHO CHARACTER CMPB #8 IS IT BS? BNE NOTBE8 NO LDA #$20 YES, SO PRECEDE WITH SPACE BSR PUCHV NOTBE8 TFR B,A BSR PUCHV THEN OUTPUT ECHO CHARACTER BRA INBUF2 AND GO GET NEXT * CONTINUE IF NOT BACKSPACE INBUF5 CMPA #$0D RETURN? BEQ INBUF6 YES CMPA REPEAT CONTROL-A - AGAIN? BEQ INAGIN YES CMPA #$20 BLO INBUF2 IGNORE OTHER CONTROL CHARS * FINALLY STORE CHARACTER STA 0,X STORE IT CMPX #LINBUF+127 CHECK FOR END OF BUFFER BEQ INBU5A YES, AT END SO IGNORE INX NO, UPDATE POINTER BRA INBUF2 AND GET NEXT CHARACTER INBU5A LDA #8 USE BACKSPACE TO... BSR PUCHV ERASE EXTRA CHARACTER LDA #7 AND RING BELL BSR PUCHV BRA INBUF2 AND CONTINUE * VECTOR TO PUTCHT PUCHV JMP PUTCHT SAVES A FEW BYTES * ON CONTROL-A REPEAT LINE UP TO CR INAGIN LDA 0,X GET NEXT CHAR CMPA #$0D CR? BEQ INBUF2 YES, RETURN TO INPUT BSR PUCHV ELSE OUTPUT THIS CHAR INX STEP PAST IT CMPX #LINBUF+126 AT END OF BUFFER? BNE INAGIN NO, DO NEXT BRA INBUF2 YES, RETURN TO INPUT INBUF6 STA 0,X STORE CARRIAGE RETURN AT VERY END PULS X,A,PC AND RETURN PAG * 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 PSTRNG BSR PCRLF PRECEDE STRING WITH CRLF PDATA PSHS A OR BEGIN HERE FOR NO CRLF PSTRN1 LDA 0,X GET NEXT CHARACTER CMPA #4 END OF STRING MARKER? BEQ PSTRN2 YES BSR PUCHV NO, OUTPUT IT LEAX 1,X STEP TO NEXT BRA PSTRN1 AND REPEAT PSTRN2 PULS A,PC PCRLF PSHS A,X LDA #$0D CR BSR PUCHV LDA #$0A LF BSR PUCHV LDX NULLWT WAIT LOOP LEAX 1,X FORCE 0 TO BE SHORTEST CRLFWA LEAX -1,X BNE CRLFWA WAIT AFTER CRLF PULS A,X,PC PAG * ASSORTED NUMERIC INPUT AND OUTPUT ROUTINES * OUT5D - OUTPUT A DECIMAL NUMBER OUT5D PSHS CC,A,B,X,Y CC GETS REPLACED BY ZERO FLAG CLR 0,S ASSUME ZEROES TO BE SUPPRESSED LDD 0,X GET BINARY NUMBER TO BE OUTPUT LDX #DECTAB POINT TO POWERS OF TEN TABLE * DIGIT LOOP DIGLOO LDY #0 CLEAR COUNTER FOR NUMBER OF SUBTRACTIONS DIGLO1 SUBD 0,X SUBTRACT CURRENT POWER OF TEN BLO DIGLT0 RESULT LESS THAN 0 LEAY $0100,Y ADD 1 TO LEFT HALF OF Y 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. DIGLT0 ADDD 0,X ADD BACK THE EXTRA SUBTRACTION PSHS A,B SAVE IT TFR Y,D TRANSFER DEC DIGIT TO A ADDA #$30 CMPA #$30 CHECK FOR 0 BNE ODPRNT IF <>0 THEN PRINT IT TST 2,S TEST ZERO FLAG BNE ODPRNT IF <>0 THEN PRINT IT CMPX #DECTAB+8 BEQ ODPRNT ALWAYS PRINT LAST ZERO TST 4,S TEST OLD B FOR SPACE SUPPRESSION BEQ NOPRNT NO PRINT IF SUPPRESSION IS ON LDA #$20 ELSE CONVERT ZERO TO SPACE DEC 2,S FIX UP ZERO FLAG ODPRNT JSR PUTCHT OUTPUT A DIGIT OR SPACE INC 2,S SET ZERO FLAG NOPRNT PULS A,B RESTORE BIN NUMBER LEAX 2,X GO TO NEXT POWER OF 10 CMPX #DECTAB+10 DONE? BNE DIGLOO NO, DO NEXT DIGIT LEAS 1,S FIX STACK PULS A,B,X,Y,PC AND RETURN DECTAB FDB 10000,1000,100,10,1 * DECIN AND HEXIN INPUT ROUTINES DECIN CLR INFLAG BRA GETHE1 AND DO SIMILAR TO HEX HEXIN LDA #1 STA INFLAG 1=HEX, 0=DEC GETHE1 LDX #0 STX TEMP NO NUMBER AS YET CLRB CLEAR B FLAG FOR ERROR * MAIN GET NUMBER LOOP GETHD1 JSR GETNX GET NEXT CHARACTER FROM INPUT BUFFER BCS GETFIN FINISHED IF NOT ALPHA CMPA #'9 CHECK IF A DIGIT BLS GETHD2 IS DIGIT TST INFLAG HEX OR DECIMAL? BEQ GETSKP ALL LETTERS ARE NG FOR DECIMAL CMPA #'F CHECK FOR VALID HEX LETTER BHI GETSKP G-Z ARE NG, ONLY A-F OK GETHD2 SUB A #$30 CONVERT FROM ASCII CMPA #9 BLS GETHD6 IF DIGIT 0 THROUGH 9 ANDA #$1F CVT LOWER TO UPPER CASE SUBA #7 CONVERT LETTERS FROM ASCII * ON A VALID DIGIT, MULTIPLY TEMP BY BASE (10 OR 16) * AND ADD CURRENT DIGIT GETHD6 PSHS A SAVE CURRENT DIGIT LDD TEMP GET NUMBER SO FAR ASLB ROLA 2*TEMP ASLB ROLA 4*TEMP TST INFLAG CHECK WHETHER HEX OR DECIMAL BNE GETHDH HEX ADDD TEMP 5*TEMP IF DECIMAL ASLB ROLA 10*TEMP BRA GETHD7 AND CONTINUE GETHDH ASLB ROLA 8*TEMP IF HEX ASLB ROLA 16*TEMP GETHD7 ADDB 0,S+ ADD CURRENT DIGIT TO TEMP ADCA #0 WITH CARRY STD TEMP AND SAVE IT LDAB #1 SET B FOR VALID NUMBER BRA GETHD1 AND GO DO NEXT DIGIT * WHEN INVALID DIGIT IS FOUND, STEP TO NEXT CR OR SPACE GETSKP JSR GETNX GET NEXT CHARACTER BCC GETSKP IF IT'S ALPHA, KEEP STEPPING RTS FINALLY EXIT WITH CARRY SET * NORMAL EXIT AT END OF NUMBER: C=0, B<>0, X=ANSWER GETFIN LDX TEMP GET ANSWER CLC C=0 RTS SPC 1 * OUT4H ROUTINE - OUTPUT 4-DIGIT HEX NUMBER OUT4H BSR OUT2H OUTPUT LEFT 2 HEX CHAR LEAX 1,X BSR OUT2H OUTPUT RIGHT 2 HEX LEAX -2,X RESTORE X RTS * OUT2H ROUTINE - OUTPUT 2-DIGIT HEX NUMBER OUT2H PSHS A LDA 0,X OUTPUT 2 HEX CHARS BSR OUTHL OUTPUT LEFT HEX CHAR LDA 0,X BSR OUTHR OUTPUT RIGHT HEX CHAR PULS A,PC RESTORE A AND RETURN * OUTHL AND R - OUTPUT ONE HEX DIGIT OUTHL LSR A OUTPUT LEFT DIGIT ENTRY LSR A LSR A LSR A OUTHR AND A #$F OUTPUT HEX RIGHT DIGIT ENTRY ADDA #'0 CMP A #'9 BLS PUCHVO ADDA #$7 CONVERT FOR A - F PUCHVO JMP PUTCHT * PERROR - REPORT STAR-DOS ERROR NUMBER * SEPARATE ERROR ENTRY FOR STAR-DOS ROUTINES RPTER0 PSHS A,B,X,Y BRA RPTER1 PERROR PSHS A,B,X,Y LDB FCBERR,X GET ERROR NUMBER LBEQ RPTER2 NO ERROR EXISTS, EXIT RPTER1 INC OUCHSW TEMP FORCE OUTPUT TO TERMINAL LDX #ERRMSG JSR PSTRNG PRINT ERROR MESSAGE LDX CURFCB STX TEMP1 TEMP SAVE CURFCB LDA ERRTYP STA TEMP2 AND ALSO ERROR TYPE LDX #NUMBER POINT X WHERE TO PRINT FROM STB 1,X SAVE ERROR NUMBER JSR OUT5D OUTPUT THE NUMBER LDX ERRVEC CHECK USER'S ERROR VECTOR BNE USERDS USE HIS VECTOR IF THERE LDX #ERRNAM ELSE USE ERRCODES.SYS USERDS LDY #SIRFCB+FCBNAM BSR NAMOVE PUT "ERRCODES.SYS" INTO FCB LDX #SIRFCB LDA SYSTDR STA FCBDRV,X USE SYSTEM DRIVE LDA #1 STA FCBFUN,X OPEN FOR READ FUNCTION JSR FCS OPEN IT BNE RPTEXI EXIT IF NOT THERE JSR FCS4 CLOSE IT AGAIN BNE RPTEXI EXIT ON ERROR CLR FCBFUN,X READY TO READ FILE INC FCBRW,X MAKE BELIEVE IT'S STILL OPEN LDD NUMBER A=0, B=ERROR NUMBER RPTER3 INCA SUBB #10 CONVERT TO DECIMAL BPL RPTER3 ADDD #$2E3A CONVERT TO ASCII EXG A,B REVERSE THE TWO DIGITS STD TEMP3 CLRA CLEAR PREVIOUS BYTE RPTER4 TFR A,B MOVE PREVIOUS INTO B JSR FCS READ SECOND BYTE FROM FILE BNE RPTEXI EXIT ON ERROR CMPD TEMP3 FILE AGAINST ERROR CODE BNE RPTER4 NO MATCH SO READ MORE RPTER5 JSR FCS READ A BYTE BNE RPTEXI EXIT ON ERROR CMPA #$0D END OF LINE? BEQ RPTEXI STOP ON END JSR PUTCHT ELSE OUTPUT IT BRA RPTER5 AND REPEAT RPTEXI LDX TEMP1 RESTORE CURFCB STX CURFCB LDA TEMP2 RESTORE ERRTYP STA ERRTYP DEC OUCHSW RESTORE CORRECT I/O PORT RPTER2 PULS A,B,X,Y,PC AND RETURN ERRNAM FCC 'ERRCODESSYS' ERROR FILE NAME PAG * NAMOVE ROUTINE - MOVE NAME FROM X--> TO Y-->, AND * MOVE ROUTINE - MOVE B BYTES FROM X--> TO Y--> NAMOVE PSHS A,B,X,Y LDB #11 COUNTER, 8 FOR NAME AND 3 FOR EXTENSION BRA MOVE1 MOVE PSHS A,B,X,Y TST B ALL DONE? MOVE1 BEQ MOVEXI YES LDA 0,X+ GET CHARACTER STA 0,Y+ STORE IT DEC B BRA MOVE1 DO UNTIL DONE MOVEXI PULS A,B,X,Y,PC PAG * GETNAM - PROCESS AND MOVE VALID FILE NAME FROM LINBUF * INTO FCB GETNAM PSHS A,B,X LDA DEFDRV USUALLY WORKING DRV EXCEPT ON COMMANDS STA FCBDRV,X STORE IN FCB UNTIL REPLACED LDA WORKDR STA DEFDRV BACK TO WORK DRV JUST IN CASE CLR FCBRW,X CLEAR RW FLAG TO SHOW FILE CLOSED CLR FCBNAM,X ERASE FIRST CHAR OF FILE NAME CLR FCBEXT,X ERASE FIRST CHAR OF EXTENSION * SKIP SPACES LDX LPOINT POINT TO BUFFER JSR SKIPSP SKIP SPACES LDX 2,S POINT BACK TO FCB BSR GNXTV GET FIRST CHARACTER BCS NGEXIT IF NOT ALPHA IT'S WRONG CMPA #'A CHECK IF LETTER BHS GNAME1 YES, GO GET A NAME SUBA #$30 CVT FROM ASCII CMPA MAXDRV BHI NGEXIT EXIT IF TOO BIG TFR A,B SAVE DRIVE NUMBER BSR GNXTV GET NEXT CHARACTER AFTER DRIVE NO. CMPA #'. MUST BE PERIOD BNE NGEXIT IF NOT A PERIOD IT'S WRONG STB FCBDRV,X STORE VALID DRIVE NUMBER GNAME BSR GNXTV GET NEXT CHARACTER BCS NGEXIT IF NOT ALPHANUMERIC CMPA #'A BLO NGEXIT CAN'T BE A NUMBER GNAME1 LEAX FCBNAM,X POINT TO NAME LDB #8 UP TO 8 ALLOWED BSR GNOE1 GO GET NAME AND NEXT CHAR BCC NGEXIT MUST BE FOLLOWED BY NON-ALPHA CMPA #'. PERIOD? BNE OKEXIT EXIT IF NOT A PERIOD BSR GNXTV GET NEXT CHARACTER AFTER PERIOD CMPA #'A BLO GDRIV1 MAY BE DRIVE NUMBER ON END GEXT LDB #3 UP TO 3 ALLOWED BSR GNOE1 GET THE EXTENSION AND NEXT CHAR BCC NGEXIT MUST BE FOLLOWED BY NON-ALPHA CMPA #'. PERIOD? BEQ GDRIVE YES, GO GET DRIVE NUMBER JSR CLASF CLASSIFY IT BCS OKEXIT EXIT IF NOT ALPHANUMERIC NGEXIT LDX 2,S POINT BACK TO FCB LDA #21 INVALID FILE NAME ERROR STA FCBERR,X PUT INTO FCB RORA ALSO SET CARRY TO SIGNAL ERROR PULS A,B,X,PC AND THEN EXIT GDRIVE BSR GNXTV GET NUMBER GDRIV1 LDX 2,S POINT BACK TO FCB SUBA #$30 CVT FROM ASCII CMPA MAXDRV BHI NGEXIT EXIT IF TOO BIG STA FCBDRV,X STORE IT BSR GNXTV GET NEXT CHARACTER BCC NGEXIT NO GOOD IF ALPHANUMERIC OKEXIT CLC CLEAR CARRY IF OK PULS A,B,X,PC AND THEN EXIT * GET B CHARACTERS OF NAME OR EXT, PLACE AT X-> * FOLLOW WITH ZEROES GNOE BSR GNXTV GET NEXT CHARACTER GNOE1 BCC GISOK OK TO USE IT CMPA #'_ UNDERLINE? BEQ GISOK1 YES, ALSO OK CMPA #'- HYPHEN? BEQ GISOK1 YES, ALSO OK CMPA #'* ASTERISK? BEQ GISOK1 YES, ALSO OK BRA GZERO ELSE FINISH WITH ZEROES AND QUIT GISOK CMPA FNCASE IS IT HIGHER THAN FNCASE? BLO GISOK1 LEAVE AS IS IF YES ANDA #$DF ELSE CVT TO UPPER CASE GISOK1 STA 0,X+ STORE IT DECB DECREMENT COUNTER BNE GNOE CONTINUE UNTIL DONE GNXTV JMP GETNX GET NEXT CHAR AND RETURN GZERO CLR 0,X+ FINISH UP WITH ZEROES AT END DECB DECREMENT COUNTER BNE GZERO CONTINUE UNTIL DONE JSR CLASF CLASSIFY LAST CHARACTER RTS ELSE EXIT * SKIP SPACES IN LINE BUFFER SKIPSP LDA 0,X+ GET NEXT CHARACTER CMPA #$20 SPACE? BNE SKIRTS NO, EXIT WITH PREVIOUS LPOINT STX LPOINT SAVE POINTER TO NEXT AFTER SPACE SKIRTS RTS AND RETURN PAG * GETCHT - GETCH TEST ROUTINE TO SELECT * WHETHER INCH OR INCH2 IS USED GETCHT TST INCHSW TEST INPUT SWITCH LBNE INCH2 USE INCH2 IF NOT ZERO TST FIADDR CHECK IF DISK FILE TO BE USED LBEQ INCH USE INCH IF ZERO * FOR DISK I/O (INDICATED BY FIADDR <>0) DO IT PSHS X SAVE X LDX FIADDR POINT TO FCB JSR FCS HANDLE THE CHARACTER BEQ PULXPC EXIT IF NO ERROR CLR FIADDR STOP TAKING INPUT FROM DISK JSR PERROR GO REPORT THE ERROR LDX #QUEMSG JSR PSTRNG NEW LINE AND QUESTION MARK PULS X RESTORE X BRA GETCHT AND GO BACK TO INPUTTING FROM KBD QUEMSG FCC ': ',4 * GETCH - CHAR INPUT ROUTINE SPC 1 GETCH PSHS X,B SAVE REGISTERS CLR DEPCTR CLEAR DEPTH COUNTER FIRST JSR [INCHV] USE MONITOR INPUT ROUTINE PULS X,B RESTORE REGISTERS RTS * VECTORS FOR INPUT AND OUTPUT OUTEEV JMP [OUTCHV] USE MONITOR OUTPUT ROUTINE STATEV JMP [STATVE] USE MONITOR'S STATUS CHECK * PUTCHT (PUTCHR) ROUTINE TO OUTPUT A CHARACTER PUTCHT PSHS A SAVE CHARACTER TST SPECIO CHECK FOR SPECIAL I/O BNE PUTCH1 MEANS IGNORE WIDTH CMPA #$20 IS IT CONTROL CHAR? BHS PUTCH0 LDA #1 STA CURCOL CURRENT COLUMN=1 BRA PUTCH1 AND THEN CONTINUE * ON PRINTABLE CHARACTER, CHECK COLUMN PUTCH0 INC CURCOL LDA WIDTH CHECK DESIRED WIDTH BEQ PUTCH1 ZERO MEANS NO WIDTH DESIRED CMPA CURCOL COMPARE WITH CURRENT COLUMN BHS PUTCH1 NOT PAST WIDTH YET LDA 0,S GET CURRENT CHARACTER CMPA #$20 IS IT SPACE? BNE PUTCH1 NO, DON'T DO CRLF JSR PCRLF YES, DO CRLF ON SPACE PAST WIDTH PUTCH1 PULS A RESTORE CHARACTER TST OUCHSW CHECK IF USING OUTCH OR OUTCH2 BNE PUTOUT OUTCH2 IS NEVER DISK TST FOADDR CHECK IF WE'RE OUTPUTTING TO DISK BEQ PUTOUT NO, USE TTY; ELSE FALL THRU * FOR DISK I/O (INDICATED BY FOADDR <>0) DO IT PSHS X SAVE X LDX FOADDR POINT TO FCB JSR FCS HANDLE THE CHARACTER BNE PDEROR IF AN ERROR PULXPC PULS X,PC ELSE RESTORE X AND RETURN PDEROR CLR FOADDR MAKE SURE ERROR MSG DOESN'T GO TO DISK JSR PERROR GO REPORT THE ERROR JMP WARMS AND THEN QUIT * PUTOUT - CHAR OUTPUT ROUTINE IF NOT DISK PUTOUT PSHS X,U,B,A SAVE REGISTERS LDU #$CC10 POINT TO DATA AREA CMPA #$0D IS IT CR? BNE PUTCH5 NO, SO JUST OUTPUT IT TST PSFLAG-$CC10,U SHOULD WE PAUSE? 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 MAYPAU LDA PLINES-$CC10,U GET PAGE LINES BEQ NOPAUS NO PAUSE IF 0 CMPA DEPCTR-$CC10,U TIME TO PAUSE? BEQ PUTCH3 NOPAUS BSR STATEV ELSE CHECK KB FOR SOMETHING BEQ PUTCH4 NOTHING THERE JSR [KINPUV] IF SOMETHING, GET IT W/O ECHOING ANDA #$7F MASK PARITY CMPA ESCAPE-$CC10,U ESCAPE? BNE PUTCH4 NO, GO DO IT PUTCH3 CLR DEPCTR-$CC10,U CLEAR DEPTH COUNTER JSR [KINPUV] ELSE STOP AND GET ONE MORE ANDA #$7F MASK PARITY CMPA ESCAPE-$CC10,U ESCAPE? BEQ PUTCH4 YES, CONTINUE WITH CR CMPA #$0D CR? BNE PUTCH3 NO, KEEP WAITING PULS X,U,B,A RESTORE REGISTERS JMP [BREAK] QUIT ON ESCAPE AND CR PUTCH4 LDA #$0D RESTORE CR PUTCH5 BSR OUTSEL OUTPUT IT LDA 0,S RESTORE CHARACTER FROM OLD A CMPA #$0A WAS IT A LF? BNE PUTCH7 NO, JUST RETURN LDA PLINES-$CC10,U CHECK IF WE'RE COUNTING BEQ PUTCH7 NO, JUST GO ON INC DEPCTR-$CC10,U YES, INCREMENT COUNTER CMPA DEPCTR-$CC10,U COMPARE WITH COUNTER BHS PUTCH7 NOT GREATER, KEEP GOING LDA #1 STA DEPCTR-$CC10,U RESET COUNTER LDA SLINES-$CC10,U GET EJECT COUNT BEQ PUTCH7 JUST CONTINUE IF NO EJECTION PSHS A ELSE PUT ON STACK PUTCH6 LDA #$0A GET LINE FEED BSR OUTSEL OUTPUT IT DEC 0,S DECREMENT COUNTER BNE PUTCH6 REPEAT UNTIL DONE LEAS 1,S FIX UP STACK AND DROP THRU TO PUTCH7 PULS X,U,B,A,PC RESTORE REGISTERS AND RETURN * OUTSEL - CHOOSE WHETHER TO USE OUTCH OR OUTCH2 OUTSEL TST OUCHSW TEST OUTPUT SWITCH LBNE OUTCH2 USE OUTCH2 IF NOT ZERO JMP OUTCH ELSE USE OUTCH * OTHER MEMORY-RESIDENT COMMANDS * MON - RETURN TO HUMBUG MONITR JMP [HUMNEV] RETURN VIA POINTER IN CONSOLE DRIVERS PAG * THE FOLLOWING $7E MAKES THE KINPUV AT $D3E5 * INTO A JMP KINPUT FOR INPUT FROM KBD W/O ECHO ORG $D3E4 FCB $7E * ACTUAL CONSOLE ROUTINES FIT FROM $D370 TO $D3E4 ORG BASE+$1370 * KEYBOARD INPUT ROUTINE WITHOUT ECHO KINPUT JMP [$F804] DO HUMBUG'S INCH8 ROUTINE ANDA #$7F REMOVE PARITY RTS * IRQ HANDLER IRQHAN ORCC #$50 TURN OFF INTERRUPTS RTI AND DO NOTHING * TIMER ON, OFF, INIT TIMRTS RTS DO NOTHING * RE-ENTER HUMBUG VIA NXTCMD HUMNEX JMP [$F802] * SERIAL PORT INITIALIZATION ROUTINE SERINI RTS NONE REQUIRED * SERIAL PORT STATUS CHECK STAT JMP [$F808] VIA HUMBUG' INCHEK * OUTPUT CHARACTER VIA HUMBUG OUTEEE JMP [$F80A] VIA OUTNOT * INPUT CHARACTER WITHOUT ECHO INEEE JMP [$F806] VIA HUMBUG'S INEEE ENTRY POINT * SOME PEOPLE PUT PARTS OF DISK DRIVERS HERE * CONSOLE DRIVER VECTORS ORG BASE+$13E5 KINPUV FDB KINPUT KEYBOARD INPUT WITHOUT ECHO IRQHAV FDB IRQHAN IRQ HANDLER SWI3VE FDB $DFC2 HUMBUG'S SWI3 VECTOR IRQVEC FDB $DFC8 HUMBUG'S IRQ VECTOR TIMOFF FDB TIMRTS TIMER OFF - RTS TIMON FDB TIMRTS TIMER ON - RTS TIMINI FDB TIMRTS TIMER INITIALIZE - RTS HUMNEV FDB HUMNEX HUMBUG'S NEXT COMMAND ENTRY SINITV FDB SERINI SERIAL PORT INITIALIZATION ROUTINE STATVE FDB STAT HUMBUG'S INCHEK ENTRY OUTCHV FDB OUTEEE HUMBUG'S OUTNOT OUTPUT ENTRY INCHV FDB INEEE HUMBUG'S INEEE WITH ECHO ENTRY PAG ORG BASE+$1400 LIES AT $D400 FCSINV JMP FCSINI FCS INITIALIZATION FCSCLV JMP FCSCLS CLOSE ALL OPEN FILES FCSV JMP FCS EXECUTE FILE MANAGEMENT SYSTEM FBAPTR FDB 0000 FCB BASE POINTER (00=EMPTY) 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 OCMSG1 FCC 'INVALID FCS CODE',4 OCMSG2 FCC 'CONTINUE? ',4 * HOOKS FOR A DISK CACHE * ENTER WITH X-> FCB AND BEQ IF WRITE, BNE IF READ ORG $D432 CACHE RTS RETURN BACK TO FCS 9 & 10 NOP NOP A TOTAL OF 3 BYTES FOR A JUMP VERFLG FCB 1 VERIFY FLAG * FCS INITIALIZATION FCSINI PSHS CC,X,B,A JSR DINIT DO DISK DRIVER INITIALIZATION BRA CLRDTB CLEAR DRIVE TABLE AND EXIT * FCSCLS - CLOSE ALL OPEN FILES FCSCLS PSHS A,B,X CLR ERRTYP FCSCL0 LDX FBAPTR LOOK AT FCB LIST POINTER BEQ FCSEXT STOP IF NOTHING ELSE IS OPEN FCSCL1 LEAX -28,X POINT TO BEGINNING OF OPEN FCB LDA #4 STA FCBFUN,X CLOSE FILE COMMAND BSR FCS GO CLOSE THIS FILE BEQ FCSCL0 GO CLOSE THE NEXT FILE IF NO ERROR FCSCL2 STX 2,S ON ERROR X WILL HAVE ADDR OF BAD FCB CLRA CLRB STD FBAPTR FORCE ALL FILES OFF LINE LDB #13 ERROR 13 = CLOSE FILE ERROR JSR RPTER0 GO REPORT IT STB ERRTYP STORE IT FCSEXT PSHS CC SAVE Z CONDITION CODE CLRDTB LDX #DRTABL READY TO ERASE DRIVE DATA TABLE LDB #90 90 BYTES WORTH FCSEX1 CLR 0,X+ DECB BNE FCSEX1 JSR RANCLS CLEAR RANDOM ROUTINES PULS CC,A,B,X,PC RESTORE REGISTERS AND QUIT PAG * FCS - FILE MANAGEMENT SYSTEM FCS PSHS A,B,X,Y SAVE REGISTERS STX CURFCB SAVE CURRENT FCB ADDRESS CLR ERRTYP CLR FCBERR,X AND ALSO IN FCB LDB FCBFUN,X FCS FUNCTION CODE LBEQ FCS0FA ON FCS 0 GO THERE FAST CMPB #23 BHI FCSCNG CODES >23 ARE NOT VALID TST FCBDRV,X CHECK DRIVE NUMBER BPL FCSNOS NO SEARCH IF A VALID NUMBER CMPB #3 CHECK FOR A FILE OPEN COMMAND BLS FCSERC ON OPEN GO SEARCH FOR A DRIVE LDA WORKDR ALL OTHERS DEFAULT TO WORK DRIVE STA FCBDRV,X FCSNOS ASL B MULT BY 2 LDX #FCSTAB POINT TO JUMP TABLE LEAX [B,X] PICK UP ADDRESS OF CORRECT FUNCTION STX FCSJMP STORE IN MEMORY PULS A,B,X,Y RESTORE REGISTERS JMP [FCSJMP] AND GO TO CORRECT ROUTINE * ILLEGAL FCS OPERATION CODE FCSCNP PSHS A,B,X,Y SAVE REGISTERS FCSCNG LDA #1 STA ERRTYP LDX #OCMSG1 JSR PSTRNG REPORT OC ERROR LDX 2,S RESTORE FCB POINTER LDB 0,X GET OP CODE CLRA PSHS D SAVE ON STACK LEAX 0,S POINT TO IT JSR OUT5D OUTPUT CODE NUMBER LEAS 2,S FIX STACK LDX #OCMSG2 JSR PSTRNG ASK IF CONTINUE JSR GETCHR GET ANSWER ANDA #$DF CVT TO UPPER CMPA #'Y YES? LBNE WARMS QUIT IF NOT YES JSR CPYERR COPY ERROR INTO FCB PULS A,B,X,Y,PC ELSE GO BACK TO USER FCSTAB FDB FCS0,FCS1,FCS2,RAN3,FCS4,FCS5 FDB FCS6,FCS7,FCS8,FCS9,FCS10,FCS11,FCS12,FCS13 FDB FCSCNP,FCS15,FCS16,RAN17,RAN18,FCSCNP,FCS20 FDB RAN21,RAN22,RAN23 * IF DRIVE NUMBER = $FF, AND IT'S A REQUEST TO * OPEN A FILE, SEARCH FOR CORRECT DRIVE NUMBER FCSERC JSR FCS20 FIND NEXT DRIVE BNE FCSENG NG IF NO DRIVE FOUND JSR FCS NOW REPEAT FUNCTION ON THIS DRIVE BEQ FCSENG WAS COMPLETED OK, SO EXIT LDA FCBNAM,X CHECK IF NAME CORRUPTED BNE FCSNMK NO, OK TO USE LDA FCBNMB,X YES, SO RESTORE IE STA FCBNAM,X FCSNMK LDA FCBDRV,X CHECK DRIVE NUMBER CMPA MAXDRV IS IT LAST DRIVE? 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 FCSENG PULS A,B,X,Y,PC PAG * FCS0 - FCS FUNCTION 0. READ OR WRITE NEXT BYTE FROM/TO * FILE PREVIOUSLY OPENED. FCS0 PSHS A,B,X,Y SAVE REGISTERS * CHECK FOR CORRECT READ/WRITE STATUS FCS0FA LDB FCBRW,X R/W STATUS BYTE DECB BEQ FCS0R READ IF IT WAS A 1 DECB LBEQ FCS0W WRITE IF IT WAS A 2 DECB BEQ FCS0R READ IF IT WAS A 3 CMPB #$80 WAS IT 83? BNE ERR18 NO STB FCBUPD,X YES, FILE IS UPDATED BRA FCS0R SO GO TO READ ALSO * FILE NOT OPEN ERROR 18 ERR18 LDA #18 FILE NOT OPEN BRA F0RERR * READ NEXT BYTE FROM FILE FCS0R CLR SCFLAG CLEAR SP COMPR FLAG LDA FCBSCF,X CHECK SPACE COMPRESSION FLAG BEQ FCS0RD ZERO MEANS COMPR, BUT READ BMI FCS0RD >128 MEANS NO COMPR DEC FCBSCF,X ELSE DECREMENT COUNTER BRA GIVESP AND GO GIVE A SPACE FCS0RD TST FCBDPT,X CHECK DATA POINTER BEQ FCS0RN 0 MEANS MUST START NEW SECTOR * WHILE STILL IN CURRENT SECTOR FCS0R0 LDB FCBDPT,X GET DATA POINTER TO NEXT BYTE LEAY FCBDAT,X POINT Y TO DATA AREA CLRA FORCE UNSIGNED ADD IN FOLLOWING LDA D,Y GET NEXT BYTE FROM DATA STA 0,S SAVE BYTE IN A ON STACK INC FCBDPT,X INCREMENT POINTER TO NEXT TST SCFLAG WAITING FOR SP COMPR COUNT? BEQ FCS0R1 NO, JUST GO ON DECA YES, SUBTRACT ONE FROM COUNT STA FCBSCF,X STORE IN FCB GIVESP LDA #$20 SUBSTITUTE FIRST SPACE STA 0,S SAVE AS A ON STACK BRA F0REXT AND EXIT FCS0R1 CMPA #$09 POSSIBLE SPACE COMPR? BNE F0REXT NO, SO JUST RETURN IT TST FCBSCF,X SHOULD WE DECOMPRESS IT? BNE F0REXT NO, JUST RETURN IT STA SCFLAG YES, SO SET FLAG AND ... BRA FCS0RD ...GO GET A COUNT F0REXT JSR CPYERR CHECK AND MOVE ERROR IF ANY BNE F0RE2X EXIT ON ERROR TST 0,S CHECK CHARACTER BEING RETURNED BNE F0REX1 NOT ZERO, OK TO EXIT LDX 2,S POINT BACK TO FCB TST FCBSCF,X YES, SPACE COMPRESSING? BPL FCS0R YES, ZERO IS INVALID SO READ NEXT F0REX1 CLRA RESET EQUALS FLAG F0RE2X BRA F0REX2 GO CLEAR CARRY AND RETURN * WHEN FCBDPT=0 WE NEED A NEW SECTOR FCS0RN JSR RAN0R CHECK FOR RANDOM READ BNE F0REXT IF ERROR LDD FCBDAT,X CHECK T-S POINTER BEQ F0REOF ON EOF GO DO ERROR 8 STD FCBCTR,X ELSE STORE NEW AS CURRENT T-S JSR FCS9 GO READ NEXT SECTOR BNE F0REXT EXIT ON ERROR LDD FCBDAT+2,X STD FCBCRN,X CURRENT RECORD NUMBER FROM FILE LDA #4 START READING WITH BYTE 4 STA FCBDPT,X BRA FCS0R0 NOW GO PROCESS THE BYTE * AT END OF FILE, GENERATE ERROR 8 F0REOF LDA #8 ERROR 8 F0RERR STA ERRTYP BRA F0REXT AND EXIT * WRITE NEXT BYTE TO FILE FCS0W TST FCBRAN,X IS IT A RANDOM FILE? JSR RAN0W1 GO CHECK IT BEQ FCS0WN OK TO PROCEED LDA #19 RANDOM, BUT RANDOM NOT LOADED ERROR JMP ERR22A PUT INTO ERRTYP, COPY, PULS, AND EXIT FCS0WN LDB FCBSCF,X SPACE COMPRESSION? BMI F0WRI1 NO, SO JUST WRITE CHARACTER AND QUIT * 0-7F MEANS COMPRESSION, SO COMPRESS F0COMP CMPA #$20 IS CURRENT CHARACTER A SPACE? BNE F0NOSP NO, SO GO WRITE PREVIOUS IF ANY INC FCBSCF,X YES, SO INCREMENT COUNTER LDB FCBSCF,X LOOK AT IT CMPB #$7F CHECK FOR MAXIMUM NUMBER BHS F0WOUT IF >126, GO OUTPUT IT CLRA ELSE ERASE ERROR FLAG BRA F0REX2 CLR CARRY, RETURN *IF MORE THAN 126 SPACES, OUTPUT AND RESET F0WOUT LDA #$09 TAB BSR F0WRIT WRITE IT OUT BNE F0WEX EXIT ON ERROR LDA FCBSCF,X GET SPACE COUNT CLR FCBSCF,X CLEAR IT IN FCB BSR F0WRIT WRITE IT OUT F0REX2 ANDCC #$FE CLEAR CARRY F0WEX PULS A,B,X,Y,PC AND RETURN * IF CURRENT IS NOT A SPACE, OUTPUT IT F0NOSP LDB FCBSCF,X GET SPACE COUNT BEQ F0WRI1 NO COMPRESSED SPACES IF 0 CMPB #1 SEE IF ONLY 1 SPACE BNE COMPRE DO COMPRESSED IF >1 LDA #$20 ELSE OUTPUT A PLAIN SPACE BRA JUST1 COMPRE LDA #$09 ELSE OUTPUT TAB FIRST BSR F0WRIT WRITE IT OUT BNE F0WEX EXIT ON ERROR TFR B,A GET SPACE COUNT JUST1 CLR FCBSCF,X CLEAR IT IN FCB BSR F0WRIT WRITE IT OUT BNE F0WEX EXIT ON ERROR BRA F0WRI1 OUTPUT IT AND QUIT * ROUTINE TO OUTPUT CHARACTER IN A F0WRIT PSHS A,B,X,Y SAVE EVERYTHING F0WRI1 LDD FCBCRN,X CURRENT RECORD NUMBER BEQ F0NEW NOT YET INITIALIZED IF 0000 OR FFXX INCA CHECK FOR $FF BY INCREMENTING BNE F0OLD IS INITIALIZED IF NOT 0000 OR FFXX 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 F0NEW JSR GRABIT GO GRAB A FREE SECTOR BNE F0RITX LDD FCBLTR,X LAST TR-SEC SO FAR STD FCBFTR,X IT'S ALSO THE FIRST TR-SEC STD FCBCTR,X AND ALSO CURRENT TR-SEC JSR RAN0W2 GO DO RANDOM F0FER0 BNE F0RITX EXIT ON ERROR F0FERA LEAY FCBDAT,X POINT TO USRFCB DATA AREA CLRB COUNTER =256 F0FER1 CLR 0,Y+ DECB BNE F0FER1 ERASE DATA AREA OF FCB LDD FCBSIZ,X ADDD #1 SIZE=SIZE+1 STD FCBSIZ,X LDD FCBCRN,X ADDD #1 BUMP CURRENT RECORD NUMBER STD FCBCRN,X STD FCBDAT+2,X BECOMES ALSO SECTOR COUNT F0PUT LDB FCBDPT,X DATA POINTER INC FCBDPT,X BUMP BYTE POINTER LEAX FCBDAT,X POINT TO DATA AREA ABX POINT TO NEXT EMPTY BYTE IN DATA AREA LDA 0,S GET OUTPUT BYTE STA 0,X PUT INTO BUFFER F0RITX JSR CPYERR BRA F0REX2 AND FINALLY EXIT * AFTER THE VERY FIRST BYTE IS PUT INTO FCB, DO THIS F0OLD LDB FCBDPT,X CHECK DATA POINTER 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 JSR GRABIT GO GRAB A NEW SECTOR BNE F0RITX EXIT ON ERROR LDD FCBLTR,X GET ITS TR-SEC NUMBER FROM SIRFCB STD FCBDAT,X PUT IN AS POINTER TO NEXT JSR FCS10 GO WRITE IT TO DISK BNE F0RITX LDA #4 NEXT BYTE WILL GO INTO POS 4 STA FCBDPT,X LDD FCBLTR,X POINTER TO NEXT STD FCBCTR,X BECOMES NOW THE CURRENT TR-SEC JSR RAN0W3 GO DO RANDOM BRA F0FER0 NOW CHECK ERROR, ERASE DATA AREA, ETC. PAG * 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 F1SVBY LEAY FCBNMB-1,X POINT TO TEMP NAME BUFFER LEAX FCBNAM-1,X AND TO NAME LDB #12 JSR MOVE SAVE NAME AND DRIVE NO FOR COMPATIBILITY LDX 4,S POINT X BACK TO FCB JSR FINAME FIND NAME IN DIRECTORY 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 FC1CLR LDB #15 READY TO ERASE FCB AFTER EXT CLR A FCS2EE CLR D,X ERASE NEXT LOCATION INCB BNE FCS2EE CLR ERRTYP CLR FCBERR,X NO ERROR YET RTS FCS1 PSHS A,B,X,Y FCS1A JSR CHKUSE CHECK IF FCB IS IN USE BNE FCS1EX EXIT ON ERROR BSR FC1CLR GO CLEAR REST OF FCB BSR F1SVBY GO MOVE NAME INTO SECONDARY & FINAME BEQ FOUNAM IF IT WAS FOUND LDA ERRTYP SOME ERROR, CHECK IT CMPA #4 NOT FOUND? BNE FCS1EX NO, JUST EXIT CLR FCBNAM,X NOT FOUND, CLEAR NAME FOR COMPATIBILITY BRA FCS1EX THEN EXIT FOUNAM LEAY FCBNAM,X Y-> USER'S NAME LDX #DIRFCB+FCBNAM X-> DIRECTORY ENTRY LDB #24 JSR MOVE MOVE 24 BYTES FROM DIR TO USER'S LDX 2,S X-> TO USER'S FCB LDA FCBATT,X CHECK FILE ATTRIBUTES ANDA #$20 READ PROTECT? BEQ FCS1B NO, SO CONTINUE LDA #12 YES, SO IT'S ERROR 12 STA ERRTYP BRA FCS1EX AND EXIT FCS1B LDD FCBFTR,X FIRST TRACK AND SECTOR STD FCBDAT,X POINTER IN DATA AREA LDA #1 SET FOR READING (DONE IN GETUPD) BSR GETUPD GET DIR INFO & UPDATE FILE LIST PTRS * SKIP FIRST TWO SECTORS IF RANDOM FILE TST FCBRAN,X IS IT RANDOM? BEQ FCS1EX NO, SO JUST EXIT DEC FCBSCF,X YES, KILL SPACE COMPRESSION LDY #504 504 BYTES IN TWO SECTORS F1LOOP JSR FCS0 GO READ A BYTE BNE FCS1EX EXIT ON ERROR LEAY -1,Y DECREMENT COUNTER BNE F1LOOP AND REPEAT LDA FCBDRV,X GET DRIVE NUMBER STA SIRFCB+FCBDRV PUT INTO SIR FCB JSR SUMNAM GET SECTORS PER TRACK BNE FCS1EX EXIT ON ERROR LDB SIRFCB+27 GET SECTORS PER TRACK STB FCBSPT,X STORE IT FCS1EX JSR CPYERR TEST AND COPY ERRTYP INTO 1,X 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 GETUPD STA FCBRW,X SET R/W STATUS FLAG CLR FCBUPD,X MARK NOT YET UPDATED CLR FCBFUN,X READY FOR FCS0 (WRITE OR READ) NEXT LDY FBAPTR POINTER TO FIRST OPEN FCB (IF ANY) STY FCBLST,X BECOMES POINTER IN THIS FILE LEAY FCBLST,X POINT TO THIS FCB'S POINTER STY FBAPTR GIVE IT TO STAR-DOS LDD DIRFCB+FCBDIT STD FCBDIT,X DIRECTORY TRACK-SECTOR LDA DIRFCB+FCBDIB STA FCBDIB,X DIRECTORY BYTE POINTER RTS PAG * FCS2 - FCS FUNCTION 2. OPEN A FILE FOR WRITE FCS2 PSHS A,B,X,Y,U JSR CHKUSE SEE IF FCB IS IN USE BNE FCS2EX EXIT IF YES LDA FCBDRV,X GET DRIVE NUMBER STA SIRFCB+FCBDRV PUT INTO SIR FCB CMPA MAXDRV CHECK FOR MAXIMUM DRIVE NUMBER BLS FCS2DO <=9 IS OK LDA #15 DRIVE NUMBER ERROR BRA FCS2ER FCS2DO JSR FINAME FIND NAME IN DIRECTORY BNE FCS2NT OK IF THERE'S AN ERROR LDA #3 ELSE FILE EXISTS, ERROR 3 FCS2ER STA ERRTYP ERROR EXIT ALSO FCS2EX JSR CPYERR PULS A,B,X,Y,U,PC AND QUIT * OK TO OPEN A FILE NOT YET ON DISK, BUT CHECK ERROR FCS2NT LDA ERRTYP CMPA #4 FILE NOT THERE? BNE FCS2EX NO, MUST BE SOMETHING ELSE BAD JSR FC1CLR GO CLEAR REST OF FCB HEADER * NOW LOOK AT SIR, MAKE SURE IT'S THE SAME DISK AND * THERE'S ROOM JSR SUMNAM READ SIR INTO SIRFCB AND CHKSUM IT BNE FCS2EX ON ERROR LDB FCBDRV,X GET DRIVE NUMBER JSR DTPOIN POINT X TO DRIVE'S ENTRY IN DRTABL TFR X,U LDD 0,X CHECK IF TABLE ENTRY IS EMPTY BEQ F2EMTY EMPTY * TABLE ENTRY NOT EMPTY, SO CHECK CHECKSUM CMPD CHKSUM SAME? BEQ F2DKOK YES IT'S SAME DISK, SO CONTINUE JMP STOP29 QUIT IMMEDIATELY ON DISK SWITCHED * TABLE ENTRY EMPTY, SO PUT SIR DATA INTO IT F2EMTY JSR GETSIR COPY SIR DATA INTO DRTABL * NOW CHECK IF ENOUGH ROOM IS ON DISK F2DKOK LDD 6,X CHECK ROOM LEFT ON DISK * ON RANDOM FILES, NEED AT LEAST 3 SECTORS BNE F2ROOM YES, IT'S OK LDA #7 NO, REPORT ERROR 7 BRA FCS2ER * NEXT FIND AN EMPTY SPOT IN THE DIRECTORY F2ROOM LDX #DIRFCB JSR FCS6 OPEN IT F2FIND JSR FCS7 GET NEXT RECORD BNE F2DIRE DIRECTORY ERROR - GO CHECK IT LDA FCBNAM,X LOOK AT FIRST CHARACTER BEQ F2FOUN FOUND AN EMPTY SPOT AT END INCA BEQ F2FOUN FOUND A DELETED ENTRY BRA F2FIND ELSE GO LOOK FOR MORE * AT DIRECTORY ERROR, SEE IF EOF OR SOMETHING ELSE F2DIRE LDA ERRTYP GET ERROR CODE CMPA #8 EOF? BNE FCS2EX SOMETHING ELSE, SO IT'S AN ERROR * IT WAS DIRECTORY EOF, SO GRAB ANOTHER SECTOR FOR IT CLR FCBERR,X CLEAR THE ERROR CLR ERRTYP LDD 2,U FIND NEXT FREE T-S BNE HASROO THERE'S ROOM LDA #6 ELSE DIRECTORY FULL ERROR BRA FCS2ER HASROO STD FCBDAT,X PUT IN POINTER ON CURRENT DIR SECTOR JSR FCS8 WRITE IT BACK ON DISK WITH NEW POINTER BNE F2ERR5 SIGNAL DIRECTORY ERROR JSR FCS7 NOW READ NEXT SECTOR BNE F2ERR5 SIGNAL DIRECTORY ERROR LDD FCBDAT,X GET POINTER TO NEXT FREE T-S STD 2,U SAVE IN DRIVE TABLE LDD 6,U GET SIZE OF FREE SPACE SUBD #1 SUBTRACT 1 STD 6,U SAVE IT LEAX FCBDAT,X POINT TO FCB DATA AREA CLRB SET COUNTER CLRDIR CLR 0,X+ CLEAR NEW DIRECTORY SECTOR DECB BNE CLRDIR ERASE 256 BYTES OF DIRECTORY DATA LDX #DIRFCB JSR FCS8 GO WRITE IT TO DISK BNE F2ERR5 SIGNAL DIRECTORY ERROR JSR UPDSIR MOVE DATA FROM DRIVE TABLE BACK INTO SIR LBNE FCS2EX TFR U,X POINT TO DIRECTORY ENTRY BRA F2DKOK SEE IF ENOUGH ROOM LEFT ON DISK * ON DIRECTORY ERROR, SIGNAL IT F2ERR5 LDB ERRTYP CHECK ERROR TYPE CMPB #11 WRITE PROTECTED? BEQ WPISOK YES, IT'S OK LDB #5 DIRECTORY ERROR IF ANYTHING ELSE JSR RPTER0 REPORT IT WPISOK JMP FCS2EX AND THEN REPORT MAIN ERROR * FOUND ROOM IN DIRECTORY, SET UP USER'S FCB FOR IT F2FOUN LDX CURFCB POINT TO USER FCB LEAX 15,X POINT PAST NAME LDB #53 CLRFCB CLR 0,X+ CLEAR NEXT BYTE DEC B ERASING FROM NAME TO 67,X BNE CLRFCB LDX CURFCB POINT TO USER'S FCB LDD MONTH TODAY'S DATE STD FCBMON,X LDA YEAR STA FCBYR,X CLRA JSR INTIME POSSIBLY INPUT TIME CODE ALSO STA FCBTIM,X LDA #4 DATA POINTER AT FOURTH BYTE STA FCBDPT,X LDA #2 SET FOR WRITING (DONE IN GETUPD) JSR GETUPD GET DIR INFO & UPDATE FILE LIST PTRS * NOW MOVE INTO DIRECTORY LEAX FCBNAM,X POINT TO NAME LDY #DIRFCB+FCBNAM ALSO IN DIR FCB LDB #24 JSR MOVE MOVE 24 BYTES INTO DIRECTORY LDX #DIRFCB JSR FCS11 WRITE IT TO DISK BNE F2ERR5 IF DIRECTORY ERROR * THEN FINISH UP CLRA RESET Z ERROR PULS A,B,X,Y,U,PC AND RETURN PAG * FCS4 - FCS FUNCTION 4. CLOSE FILE FCS4 PSHS A,B,X,Y LDB FCBRW,X R/W STATUS BYTE DECB BEQ F4LST READ IF IT WAS A 1 DECB BEQ FCS4W WRITE IF IT WAS A 2 DECB LSLB BNE ERR22 FILE CLOSING ERROR IF NOT 3 OR 83 * REMOVE THIS FILE FROM FCB LIST POINTERS F4LST LDX CURFCB X-> USER'S FCB LDY #FBAPTR POINT TO DOS'S FCB POINTER STY LISPTR SAVE THIS LIST POINTER LEAX FCBLST,X POINT X TO THIS FCB'S POINTER F4LST0 LDY [LISPTR] PICK UP PREVIOUS POINTER BEQ ERR22 ERROR 22 IF 0 - FILE NOT OPEN CMPX [LISPTR] COMPARE PREV PTR TO THIS FCB BEQ F4LST1 FOUND IT, GO CHANGE STY LISPTR SAVE AS ADDRESS OF NEXT POINTER BRA F4LST0 AND REPEAT SPC 1 * WHEN PREVIOUS POINTER POINTS TO THIS FCB, THEN * MOVE POINTER FROM THIS FCB INTO PREVIOUS F4LST1 LDY 0,X GET THIS FCB'S POINTER STY [LISPTR] MOVE INTO PREVIOUS LDY #0 STY 0,X ERASE POINTER IN THIS FCB LDX 2,S POINT X TO FCB JSR RAN4 DO RANDOM F4EXIT CLR FCBRW,X CLEAR R/W FLAG JSR CPYERR TEST AND COPY ERRTYP INTO 1,X PULS A,B,X,Y,PC AND EXIT * ERROR 22 - ERROR IN CLOSING FILE ERR22 LDX 2,S POINT X BACK TO FCB LDA #22 ERR22A STA ERRTYP BRA F4EXIT AND EXIT FUNCTION 4 * CLOSING A WRITE FILE IS CONSIDERABLY MORE DIFFICULT FCS4W LDA FCBDRV,X DRIVE NUMBER INTO SIRFCB STA SIRFCB+FCBDRV LDB FCBSCF,X CHECK FOR UNFINISHED SPACES BEQ FCS4W1 NONE OUTSTANDING, GO ON BMI FCS4W1 NO COMPRESSION BEING DONE LDA #$09 ELSE SEND OUTSTANDING SPACES JSR FCS0 BNE F4EXIT LDA FCBSCF,X NUMBER OF SPACES JSR FCS0 BNE F4EXIT CLR A AND A FINAL 00 JSR FCS0 BNE F4EXIT ON ERROR FCS4W1 LDD FCBSIZ,X CHECK FILESIZE BNE F4NOT0 IF >0 THEN STILL HARD JSR FCS12 SIZE=0 IS EASY - JUST DELETE DIR ENTRY BNE F4EXIT BRA F4WDON AND FINISH UP * IF SIZE>0, THEN DIRECTORY ENTRY STAYS. WE * ALWAYS HAVE TO WRITE OUT THE LAST SECTOR. F4NOT0 CLRA CLRB STD FCBDAT,X SIGNAL END OF CHAIN JSR FCS10 WRITE SECTOR OUT BNE F4EXIT * NOW UPDATE DIRECTORY LDD FCBDIT,X TR-SEC OF DIRECTORY ENTRY STD FCBCTR,X CURRENT TR-SEC JSR FCS9 GO READ DIRECTORY SECTOR BNE F4ERR5 REPORT DIRECTORY ERROR LDB FCBDIB,X POINT TO DIRECTORY ENTRY CLRA FORCE UNSIGNED ADDITION ADDD #FCBDAT GO INTO DATA AREA LEAY D,X Y-> BEGINNING OF NAME PSHS X SAVE POINTERS LDB #13 WILL MOVE ATTRIBUTES THRU DATE - 13 BYTES LEAX FCBATT,X LEAY 11,Y JSR MOVE MOVE 13 BYTES FROM X> TO Y> PULS X RESTORE POINTERS JSR FCS10 WRITE IT BACK TO DISK BNE F4ERR5 REPORT DIRECTORY ERROR * NOW UPDATE SIR AND DELETE POINTER IF NO OTHER * FILES ARE OPEN FOR WRITING ON THIS DRIVE F4WDON BSR UPDSIR GO UPDATE SIR BNE F4EXIT LDX CURFCB LDB FCBDRV,X DRIVE NUMBER COM FCBDRV,X KILL IT IN THIS FCB LDX FBAPTR ADDRESS OF FIRST FCB+$1C LDA #2 CODE FOR OPEN TO WRITE * LOOP TO SEARCH ALL OPEN FCB'S FOR DRIVE NUMBERS SRCHLO CMPD -26,X CHECK EACH FCB'S DRIVE NUM & RW CODE BEQ RESTDN FOUND ONE, SO DON'T KILL DRTABL ENTRY LDX 0,X GET NEXT POINTER BNE SRCHLO REPEAT IF POINTER EXISTS * ALL FCB'S CHECKED AND NONE MATCHED THIS DRIVE * SO DELETE THE ENTRY FROM TABLE STX [DRTPTR] STORE ZERO INTO DRIVE'S CHECKSUM RESTDN LDX CURFCB POINT BACK TO FCB COM FCBDRV,X RESTORE DRIVE NUMBER JMP F4LST GO REMOVE FILE LIST POINTER * ON DIRECTORY ERROR, REPORT IT AND MAIN ALSO F4ERR5 LDB #5 DIRECTORY ERROR JSR RPTER0 REPORT IT STB ERRTYP 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 * UPDSIR JSR SUMNAM GO READ SIR AND CHECKSUM NAME BNE UPDEXI QUIT ON ERROR LDB FCBDRV,X GET DRIVE NUMBER BSR DTPOIN POINT X TO DRIVE'S ENTRY IN DRTABL LDD 0,X GET CHECKSUM FROM TABLE CMPD CHKSUM CHECK AGAINST DISK BNE STOP29 OOOPS - THE GUY CHANGED DISKS! LDY #SIRFCB POINT TO SIR FCB LDD 2,X FIRST TR-SEC STD 93,Y LDD 4,X LAST TR-SEC STD 95,Y LDD 6,X NUMBER OF FREE STD 97,Y TFR Y,X X-> SIRFCB JSR FCS10 WRITE SIR BACK BEQ UPDEXI IF OK LDB #5 ELSE IT'S ERROR 5 STB ERRTYP UPDEXI RTS STOP29 LDB #29 ERROR 29 IF DISK CHANGED JSR RPTER0 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 * DTPOIN PSHS B SAVE DRIVE NUMBER ASLB ASLB MULT BY 9 ASLB ADDB 0,S+ LDX #DRTABL POINT TO DRIVE DATA TABLE ABX POINT TO CURRENT DRIVE'S ENTRY STX DRTPTR AND SAVE AS DRIVE TABLE POINTER 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 * GETSIR LDD CHKSUM GET CHECKSUM STD 0,X PUT INTO TABLE LDD SIRFCB+FCBFTR FIRST TRACK & SECTOR STD 2,X LDD SIRFCB+FCBLTR LAST TRACK & SECTOR STD 4,X LDD SIRFCB+FCBSIZ NUMBER OF EMPTY SECTORS STD 6,X RTS PAG * FCS 5 - REWIND A FILE - REALLY CONSISTS OF JUST * CLOSING AND OPENING A FILE FCS5 PSHS A,B,X,Y LDA FCBRW,X READ/WRITE FLAG CMPA #1 IS IT READ? BEQ FCS5A YES, IT'S OK F5ER18 LDB #18 NO - NOT ALLOWED STB ERRTYP BRA FCS5B AND QUIT FCS5A JSR FCS4 OK, GO CLOSE FILE LBEQ FCS1A IF NO ERROR, THEN OPEN IT AGAIN FCS5B JSR CPYERR PULS A,B,X,Y,PC ELSE RETURN IMMEDIATELY PAG * FCS6 - OPEN DIRECTORY FILE, AND * FCS16 - OPEN SYSTEM INFORMATION RECORD FCS6 PSHS A,B LDD #$0005 TRACK 0 SECTOR 5 FCS6A STD FCBDAT,X SECTOR LINK POINTS TO FIRST LDA #$FF STA FCBSCF,X NO SPACE COMPRESSION CLR FCBDPT,X DATA POINTER TO VERY FIRST BYTE PULS A,B,PC AND RETURN FCS16 PSHS A,B LDD #$0003 TRACK 0 SECTOR 3 BRA FCS6A PAG * FCS7 - READ NEXT INFORMATION ENTRY FCS7 PSHS A,B,X,Y LDA #1 STA FCBRW,X MAKE AS IF OPEN FOR READ CLR FCBRAN,X FORCE SEQUENTIAL JSR FCS0 GO READ DIRECTORY FILE BNE FCS7EX EXIT ON ERROR DEC FCBDPT,X STEP BACK TO CHAR JUST READ LDA FCBDPT,X GET POINTER CMPA #4 FIRST CHAR IN SECTOR? BNE FCS7A NO, JUST CONTINUE LDA #16 YES, SO GO TO 16TH BYTE STA FCBDPT,X * NOW READ NEXT ENTRY FROM THIS SECTOR FCS7A LDD FCBCTR,X CURRENT TRACK-SECTOR STD FCBDIT,X IS DIRECTORY T-S LDB FCBDPT,X AND INDEX STB FCBDIB,X IS DIRECTORY ENTRY INDEX PSHS B SAVE POINTER ADDB #24 STB FCBDPT,X STEP POINTER PAST THIS ENTRY PULS B RESTORE INDEX DATA POINTER LEAY FCBNAM,X WHERE TO MOVE DIR ENTRY LEAX FCBDAT,X POINT INTO FCB DATA AREA ABX POINT TO ENTRY TO GET LDB #24 GET 24 BYTES JSR MOVE AND GO MOVE IT PULS A,B,X,Y,PC AND RETURN FCS7EX JSR CPYERR PULS A,B,X,Y,PC AND RETURN PAG * 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. FCS11 PSHS A,B,X,Y,U SAME AS FCS8! LDD FCBDIT,X DIRECTORY TR-SEC CMPD FCBCTR,X CHECK IF ALSO CURRENT BEQ F11GO SAME, SO IT'S STAR-DOS CALLING STD FCBCTR,X ELSE SOME FLUKY USER MESSING AROUND JSR FCS9 READ DIRECTORY SECTOR INTO FCB BNE F11EX IF ERROR F11GO TFR X,Y Y -> FCB TO USE LDB FCBDIB,X DIRECTORY BYTE OFFSET LEAX FCBDAT,X POINT TO FCB DATA AREA ABX POINT TO SPECIFIC ENTRY EXG X,Y X-> FCB, Y->ENTRY IN IT LEAX FCBNAM,X POINT TO NAME IN FCB LDB #24 JSR MOVE MOVE ENTRY INTO SPECIFIC PLACE LDX 2,S POINT X BACK TO FCB JMP FCS8A WRITE BACK TO DIRECTORY; FCS8 WILL DO PULS F11EX PULS A,B,X,Y,U,PC AND RETURN PAG * FCS12 - FCS FUNCTION 12. DELETE A FILE FCS12 PSHS A,B,X,Y,U TFR X,U SAVE USER'S FCB ADDRESS JSR F1SVBY NAME INTO SECONDARY & FINAME BNE FCS12E EXIT ON ERROR LDA FCBDRV,X DRIVE NUMBER STA SIRFCB+FCBDRV LDX #DIRFCB POINT TO DIRECTORY FCB LDA FCBATT,X CHECK ATTRIBUTES ANDA #$C0 DELETE OR WRITE PROT BITS BEQ FCS12A OK TO CONTINUE LDA #12 ELSE IT'S ERROR 12 STA ERRTYP BRA FCS12E AND EXIT FCS12A LDA #$FF STA FCBNAM,X ERASE 1ST LETTER OF FILE NAME BSR FCS11 WRITE DIRECTORY BACK BNE FCS12E LDD FCBSIZ,X CHECK LENGTH OF DELETED FILE STD FCBSIZ,U PUT IN USER'S FCB BEQ FCS12E DO NOTHING IF LENGTH =0 LDB FCBDRV,X DRIVE NUMBER JSR DTPOIN POINT X TO DRIVE TABLE ENTRY LDD 0,X LOOK AT ITS CHECKSUM STB DTFLAG =0 IF ENTRY NOT THERE, <>0 IF IT WAS BNE ENTHER IF ENTRY WAS THERE JSR SUMNAM ELSE READ SIR INTO SIRFCB AND CHECKSUM IT BNE FCS12E IF ERROR JSR GETSIR GET DRIVE DATA FROM SIR INTO TABLE * NOW THAT DRIVE ENTRY IS IN TABLE, USE IT ENTHER LDY 4,X TEMP SAVE LAST T-S OF FREE CHAIN LDD DIRFCB+FCBLTR NEW LAST T-S STD 4,X SAVE IN TABLE LDD 6,X OLD LENGTH OF FREE CHAIN ADDD DIRFCB+FCBSIZ ADD LENGTH OF DELETED STD 6,X NEW LENGTH LEAY 0,Y SAME AS TST Y - CHECK LAST FREE BEQ SIREMT IF DISK WAS FULL, GO PUT IN STARTING TOO LDX #SIRFCB STY FCBCTR,X READY TO READ OLD LAST T-S JSR FCS9 READ IT BNE FCS12E LDD DIRFCB+FCBFTR 1ST T-S OF DELETED FILE STD FCBDAT,X SET UP NEW CHAIN POINTER JSR FCS10 WRITE BACK TO DISK 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 F12DON LDX #SIRFCB JSR UPDSIR WRITE DRTABL ENTRY TO SIR BNE FCS12E TST DTFLAG WAS DRTABL ENTRY THERE BEFORE? BNE FCS12E YES, LEAVE IT LDX DRTPTR NO, ERASE IT CLRA CLRB STD 0,X ERASE FCS12E JSR CPYERR 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 SIREMT LDD DIRFCB+FCBFTR 1ST T-S OF DELETED FILE STD 2,X BECOMES FIRST OF FREE BRA F12DON AND THEN FINISH UP DTFLAG FCB 0 DRIVE DATA TABLE FLAG PAG * FCS13 - FCS FUNCTION 13. RENAME A FILE FCS13 PSHS A,B,X,Y TST FCBNMS+8,X LOOK AT NEW EXTENSION BNE FCS13A CONTINUE IF THERE LDD FCBNAM+8,X ELSE COPY OLD EXT TO NEW STD FCBNMS+8,X LDA FCBNAM+10,X STA FCBNMS+10,X FCS13A LEAY FCBNMB,X POINT TO NAME BUFFER LEAX FCBNAM,X SAVE OLD NAME IN BUFFER JSR NAMOVE LDX 2,S POINT X TO FCB LEAY FCBNAM,X LEAX FCBNMS,X MOVE NEW NAME TO FRONT OF FCB JSR NAMOVE LDX 2,S POINT X BACK TO FCB JSR FINAME FIND NEW NAME IN DIR BEQ F13E3 ERROR 3 - FILE EXISTS IF YES LDA ERRTYP CHECK ERROR TYPE CMPA #4 IS IT NE? BNE F13EXT NOTHING ELSE IS ALLOWED CLR ERRTYP ERASE THE 04 ERROR - IT'S OK CLR FCBERR,X LDA FCBDRV,X DRIVE NUMBER LEAX $20,X FOOL FINAME INTO THINKING NMB IS NAM STA FCBDRV,X BUT GIVE IT DRIVE NUMBER JSR FINAME FIND OLD NAME BNE F13EXT IF IT WASN'T THERE LDX 2,S POINT TO FCB AGAIN LEAX FCBNMS,X X-> NEW NAME IN USER'S FCB LDY #DIRFCB+FCBNAM Y-> NAME IN DIR FCB JSR NAMOVE PUT NEW NAME INTO DIR FCB LDX #DIRFCB JSR FCS11 WRITE DIRECTORY BACK TO DISK LDX 2,S POINT TO FCB AGAIN LEAY FCBNMS,X Y-> SECONDARY NAME BUFFER LEAX FCBNMB,X X-> OLD NAME IN USER'S FCB JSR NAMOVE PUT OLD NAME INTO SEC BUFFER FOR COMPAT F13EXT JSR CPYERR PULS A,B,X,Y,PC THEN EXIT * ERROR EXIT F13E3 LDA #3 ERROR 3 - FILE EXISTS STA ERRTYP BRA F13EXT PAG * 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 FCS15 PSHS A,B,X,Y CLR FCBFUN,X CLEAR OP CODE LDA FCBRW,X CHECK FILE STATUS DECA BEQ F15RD IS OPEN FOR READ DECA LBNE F5ER18 MUST BE ERROR 18 IF WASN'T A 2 * FILE WAS OPEN FOR WRITE F15WR LDB FCBDPT,X CHECK DATA POINTER CMPB #4 AT BEGINNING OF SECTOR? BEQ F13EXT YES, JUST EXIT; ELSE FALL THRU * ENTER HERE WITH A=0; IMPORTANT TO WRITE A 0 F15RD CLR FCBDPT,X CLEAR DATA POINTER JSR FCS0 GO READ NEXT OR WRITE CURRENT SECTOR BNE F13EXT EXIT ON ERROR LSR FCBDPT,X ASL FCBDPT,X CHANGE 5 TO 4, LEAVE 0 AS IS BRA F13EXT COPY ERROR, IF ANY, AND EXIT PAG * FCS 20 - FIND NEXT READY DRIVE FCS20 PSHS A,B,X FCS20A LDA FCBDRV,X GET CURRENT DRIVE NUMBER INCA GO TO NEXT CMPA MAXDRV CHECK AGAINST MAXIMUM BHI F20NG NG IF OVER MAX STA FCBDRV,X ELSE SAVE JSR DCHK CHECK IF READY BNE FCS20A REPEAT IF NOT READY CLC PULS A,B,X,PC EXIT IF READY F20NG LDX CURFCB LDB #16 DRIVE NOT READY STB ERRTYP STB FCBERR,X STORE INTO FCB SEC PULS A,B,X,PC PAG * FCS8 - WRITE NEXT INFORMATION ENTRY * (EITHER DIRECTORY OR SIR) * FCS9 AND FCS10 - FCS FUNCTIONS 9 (READ) AND * 10 (WRITE) SINGLE SECTOR * READ ENTRY POINT FCS9 PSHS A,B,X,Y,U READ SINGLE SECTOR LDA #1 BRA FCS910 * WRITE ENTRY POINT FCS10 PSHS A,B,X,Y,U WRITE SINGLE SECTOR FCS8 EQU FCS10 WRITE DIR ENTRY SAME AS WRITE SECTOR * ALTERNATE ENTRY FROM FCS11 FCS8A CLR A OPCODE=0 FOR WRITE * COMBINED FOR BOTH READ AND WRITE FCS910 STX FCBADD STORE CURRENT FCB ADDRESS STA OPCODE JSR CACHE GO DO CACHE, IF ANY LDX FCBADD RESTORE CURRENT FCB ADDRESS * INITIALIZE RETRY COUNTER LDA #4 STA ORETRY OUTER RETRY COUNTER * CHECK DRIVE LDA 3,X CHECK DRIVE NUMBER CMPA MAXDRV CHECK AGAINST MAXIMUM BHI F10E15 IF HIGHER THAN MAX * NOW DO ACTUAL READ OR WRITE OULOOP LDA #3 STA IRETRY SET UP INNER COUNTER GETTRS LDX FCBADD POINT TO FCB JSR DDRIVE SELECT CORRECT DRIVE BCS NRWAIT ON ERROR LDX FCBADD AGAIN POINT TO FCB LDD FCBCTR,X GET TRACK AND SECTOR LEAX FCBDAT,X POINT X TO ACTUAL DATA AREA TST OPCODE BEQ ACTWRI * READ JSR DREAD GO TRY TO READ BEQ F910EX EXIT NORMALLY IF NO ERROR BITB #$80 NOT READY? BEQ OTHERR NO, GO PROCESS IT NRWAIT LEAY 1,Y WAIT A MOMENT BEFORE PROCEEDING BNE NRWAIT BRA OTHERR AND THEN CONTINUE * WRITE ACTWRI JSR DWRITE GO TRY TO WRITE BNE WRIERR ON ERROR GO SEE IF WRITE PROTECT TST VERFLG VERIFY? BEQ F910EX NO, SO JUST QUIT JSR DVERIF YES, GO VERIFY SECTOR BEQ F910EX OK IF NO ERROR * ANALYZE WRITE ERRORS AND PROCESS THEM WRIERR BITB #$40 WRITE PROTECT? BNE FCS10E YES, IMMEDIATELY PROCESS ERROR OTHERR DEC IRETRY DECREMENT INNER RETRY COUNTER BNE GETTRS TRY AGAIN IF NOT YET DONE DEC ORETRY ELSE DECREMENT OUTER RETRY COUNTER BEQ FCS10E GIVE UP AND QUIT WITH ERROR LDX FCBADD ELSE POINT TO FCB AGAIN JSR DREST RESTORE SELECTED DRIVE AND IGNORE ERRORS BRA OULOOP TRY AGAIN IF STILL NOT DONE * TRANSLATE INTO STAR-DOS ERROR CODES AND * STORE IN FCB FCS10E LDY #DSKERC POINT TO DISK ERROR CODE TABLE CMPB #$0F CHECK FOR BAD DRIVE NUMBER BEQ FCS10S GO SAVE ERROR FCS10F ASL B SHIFT ERROR CODE LEFT BCS FCS10R GOT ERROR BIT IN CARRY LEAY 1,Y POINT TO NEXT ERROR CODE BRA FCS10F AND LOOK AT NEXT BIT FCS10R LDB 0,Y GET ERROR CODE FCS10S LDX 2,S POINT X TO FCB STB FCBERR,X PUT INTO FCB STB ERRTYP F910EX PULS A,B,X,Y,U,PC AND EXIT DSKERC FCB 16 BIT 7 = DISK NOT READY FCB 11 BIT 6 = WRITE PROTECT FCB 10 BIT 5 = WRITE ERROR FCB 14 BIT 4 = SEEK ERROR FCB 9 BIT 3 = CRC ERROR FCB 9 BIT 2 = LOST DATA FCB 16 NOT READY FCB 29 VERIFY ERROR * DRIVE NUMBER ERROR F10E15 LDB #15 DRIVE NUMBER ERROR BRA FCS10S PAG * 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 GRABIT PSHS A,B,X,U LDB FCBDRV,X GET DRIVE NUMBER STB SIRFCB+FCBDRV SAVE IN SIR FCB JSR DTPOIN POINT X TO DRIVE'S ENTRY IN DRTABL TFR X,U SAVE DRIVE DATA POINTER TST 1,X DOES CHECKSUM EXIST IN DRTABL? BNE GRBYES JSR SUMNAM GET CHECKSUM ETC. BNE GRABEX IF ERROR JSR GETSIR COPY SIR DATA INTO DRTABL GRBYES LDD 6,U NUMBER OF FREE BEQ GRFULL DISK FULL! LDD 2,U 1ST FREE SECTOR BEQ GRFULL DISK FULL! * NOT FULL, GRAB A SECTOR LDX 2,S POINT BACK TO FCB STD FCBLTR,X SAVE AS LAST LDX #SIRFCB POINT BACK TO FCB STD FCBCTR,X CURRENT TRACK JSR FCS9 READ 1ST FREE SECTOR BNE GRABEX LDD FCBDAT,X POINTER TO 2ND FREE BEQ CLEARG CLEAR EVERYTHING IF ZERO STD 2,U PUT INTO TABLE LDD 6,U SUBD #1 DECREMENT NO. OF FREE BEQ CLEARG CLEAR EVERYTHING IF ZERO STD 6,U CLRA NO ERROR ON Z PULS A,B,X,U,PC * IF DISK IS FULL, CAN'T GRAB IT GRFULL BSR GRCLR CLEAR TABLE ENTRY BNE GRABEX LDA #7 DISK FULL GRFULA STA ERRTYP GRABEX JSR CPYERR PULS A,B,X,U,PC ERR5 LDA #5 DIRECTORY ERROR IF NOT IN TABLE BRA GRFULA * CLEAR ALL WHEN DISK FILLED UP CLEARG BSR GRCLR CLEAR ALL BRA GRABEX AND EXIT GRCLR STD 2,U MAKE EVERYTHING ZERO STD 4,U STD 6,U LDX 4,S POINT BACK TO FCB JSR UPDSIR WRITE TABLE BACK TO DISK RTS AND RETURN PAG * CHKUSE - CHECK WHETHER AN FCB IS ALREADY IN USE CHKUSE PSHS A,X LEAX FCBLST,X POINT X TO THIS FCB'S LST LOCATION PSHS X SAVE ON STACK FOR TESTING LDX #FBAPTR POINT TO DOS'S POINTER SINUSE LDX 0,X GET POINTER TO NEXT FCB BEQ SNOTIN FINISHED WITHOUT FINDING ONE IS OK CMPX 0,S COMPARE WITH CURRENT FCB BNE SINUSE NOT FOUND, SO CHECK NEXT * FOUND ANOTHER ONE WITH OPEN LDX CURFCB POINT TO FCB LDA #2 ERROR 2 STA ERRTYP SNOTIN LEAS 2,S RESTORE STACK W/O TOUCHING Z PULS A,X,PC AND RETURN PAG * FINAME - FIND NAME IN DIRECTORY * ENTRY: X-> FCB WITH NAME TO BE FOUND * EXIT: ZERO IF FOUND, ELSE ERROR CODE IN CALLING FCB FINAME PSHS A,B,X,Y,U TFR X,U SAVE USER'S FCB ADDRESS LDX #DIRFCB POINT TO DIRECTORY FCB LDA FCBDRV,U GET HIS DRIVE NUMBER STA FCBDRV,X STORE IN THIS FCB JSR FCS6 OPEN DIRECTORY FINLO1 LDX #DIRFCB POINT TO DIRECTORY JSR FCS7 READ NEXT DIR ENTRY BNE FINAER EXIT ON ERROR LDB #11 LDX #DIRFCB+FCBNAM X-> TO DIR ENTRY TST 0,X CHECK FIRST CHAR IN DIR ENTRY BEQ FINER4 END OF DIR IF 00 LEAY FCBNAM,U Y-> USER'S NAME FINLO2 LDA 0,X+ CMPA 0,Y+ COMPARE CHARACTERS BNE FINLO1 DO NEXT IF DIFFERENT DECB COUNTER BNE FINLO2 REPEAT FOR 11 CHARACTERS FINAEX PULS A,B,X,Y,U,PC AND RETURN * ON ERROR DURING ACTUAL READING, CHECK IF EOF FINAER LDB ERRTYP GET ERROR CODE CMPB #8 EOF? BNE FINAEX NO, MUST BE SOMETHING ELSE FINER4 LDB #4 ELSE NAME NOT FOUND STB 1,U SAVE IN USER'S FCB STB ERRTYP PULS A,B,X,Y,U,PC AND EXIT PAG * SUMNAM - READ SIR INTO SIRFCB AND CHECKSUM NAME AND DISK NUMBER * RETURN WITH NUMBER OF SECT/TR IN B AND ZERO CONDITION IF OK SUMNAM PSHS A,X,Y LDX #SIRFCB JSR FCS16 OPEN SIR JSR FCS7 READ IT BNE SUMNEX LDD #0 SET CHECKSUM TO 0 LDX #SIRFCB+23 POINT TO DISK'S DATE LDY #3 SUM THREE BYTES IN DATE CLC BEGIN WITH CARRY=0 BSR SUMSUB ADD UP THE 3 BYTES LDX #SIRFCB+FCBNAM POINT TO DISK'S NAME LDY #13 SUM THIRTEEN BYTES IN NAME AND NUMBER BSR SUMSUB ADD UP THE 13 BYTES ORB #1 ENSURE IT'S NOT ZERO STD CHKSUM STORE CHECKSUM CLRA RESET Z ERROR SUMNEX PULS A,X,Y,PC AND RETURN SUMSUB ROLB ROLA EORB 0,X+ EOR NEXT BYTE TO LS BYTE LEAY -1,Y DECREMENT COUNTER BNE SUMSUB RTS PAG * CPYERR ROUTINE - TEST ERRTYP AND ALSO * MOVE IT INTO FCB ERROR BYTE CPYERR LDX CURFCB RESTORE INDEX LDA ERRTYP GET ERROR TYPE STA 1,X AND STORE INTO FCB RTS AND RETURN WITH Z ERROR FLAG * RTSRIO - RESTORE INCH AND OUTCH VECTORS RESIO PSHS A,B,X LDD INCH2+1 STD INCH+1 LDD OUTCH2+1 STD OUTCH+1 LDA #$7E JMP OP CODE STA INCH STA OUTCH LDB #7 LDX #SPECIO RIO1 CLR 0,X+ CLEAR SPECIO, INCHSW, OUCHSW, FI AND FOADDR DECB BNE RIO1 PULS A,B,X,PC AND RETURN PAG * DEFEXT - SET DEFAULT EXTENSION DEFEXT PSHS A,B,Y,U LDB FCBEXT,X CHECK EXISTING EXTENSION BEQ SETEX1 SET IT IF NULL CMPB #$20 IS IT SPACE? BNE SETEX2 NOT SPACE, SO IT'S PROBABLY OK SETEX1 CMPA #11 CHECK FOR MAXIMUM BHI SETEX2 IGNORE IF >11 ASL A MULT BY 2 ADDA 0,S PLUS 1 MAKES TIMES 3 LDY #EXTTAB POINT TO TABLE LDU A,Y GET FIRST TWO LETTERS OF EXTENSION STU FCBEXT,X STORE IN FCB LEAY 2,Y ADD 2 LDA A,Y GET THIRD LETTER STA FCBEXT+2,X AND STORE IN FCB SETEX2 PULS A,B,Y,U,PC EXIT EXTTAB FCC 'BINTXTCMDBASSYSBAKSCRDATBACDIRPRTOUT' PAG * JUMP TABLES ETC FOR RANDOM ROUTINES ORG $DD40 FDB $2525 VERSION NUMBER RANCLS RTS INITIALIZE RANDOM ROUTINES NOP NOP RAN0R CLRA RANDOM READ RTS NOP RAN0W1 RTS DO NOTHING IF RANDOM NOT INSTALLED NOP NOP RAN0W2 CLRA RANDOM WRITE PART 2 RTS NOP RAN0W3 CLRA RANDOM WRITE PART 3 RTS NOP RAN3 JMP FCSCNP RANDOM OPEN FILE FOR UPDATE RAN4 RTS RANDOM CLOSE FILE NOP NOP RAN17 JMP FCSCNP GET RANDOM BYTE RAN18 JMP FCSCNP PUT RANDOM BYTE RAN21 JMP FCSCNP POSITION TO RECORD N RAN22 JMP FCSCNP BACKUP ONE RECORD RAN23 JMP FCSCNP POS TO REC N, OR EXTEND FILE FDB FCS0R FDB FCS0W FDB F0PUT FDB F0FERA FDB FCS9 FDB FCS10 FDB GRABIT FDB SUMNAM * THE FOLLOWING ROUTINES ASSIGN A SEQUENCE NUMBER * TO WRITTEN FILES WHEN NO CLOCK CHIP IS INSTALLED ORG $DDE3 SEQUEN PSHS X LDX #$1234 CHECK IF INITIAL BOOT CMPX SEQ1 BEQ SEQNOI NO, NOT INITIAL LDA #1 YES, INITIALIZE SEQUENCE NO STA SEQNO STX SEQ1 AND ALSO BOOTUP FLAG SEQNOI LDA SEQNO LOAD SEQUENCE NUMBER INC SEQNO THEN INCREMENT TO NEXT PULS X,PC AND RETURN SEQ1 RMB 2 SEQUENCE INITIAL BOOTUP FLAG SEQNO RMB 1 SEQUENCE NUMBER *************************************************************** * STAR-DOS DISK DRIVERS FOR DC-4 - TYPE CONTROLLERS * (C) 1984 BY PETER A. STARK FOR STAR-KITS * EQUATES DLATCH EQU $E014 * EXPLANATION OF DLATCH OPERATION: * ON WRITE: BITS 0 AND 1 SELECT DRIVE 0-3 * BIT 6 SELECTS SIDE (0=SIDE A) * BIT 7 DISABLES DRIVE SELECT IF 1 * ON READ: BIT 6 SAME AS FDC INTRQ OUTPUT PIN * BIT 7 SAME AS FDC DRQ OUTPUT PIN COMREG EQU $E018 STAREG EQU COMREG TRKREG EQU $E019 SECREG EQU $E01A DATREG EQU $E01B ORG $DE00 * DISK DRIVER VECTORS DREAD JMP READ DWRITE JMP WRITE DVERIF JMP VERIFY DREST JMP RESTOR DDRIVE JMP DRIVE DCHK JMP CHKRDY DQUICK JMP QUICK DINIT JMP RTS DWARM JMP RTS DSEEK JMP SEEK LASTDR FCB 3 LAST DRIVE ON SYSTEM STPRAT FCB 3 STEPRATE (DEFAULT TO 30 MS) * DRIVE - SELECT DRIVE SPECIFIED BY FCB+3 DRIVE PSHS A,X,Y LDA 3,X GET DRIVE NUMBER FROM FCB CMPA LASTDR CHECK IT BHI DRIVNG IF DRIVE NUMBER NG LDX #TRTABL POINT TO DRIVE DATA TABLE LDB DRIVNO GET OLD DRIVE NUMBER ABX POINT TO DRIVE'S ENTRY LDB TRKREG LAST TRACK USED STB 0,X SAVE IN TABLE STA DLATCH SWITCH TO NEW DRIVE CMPA DRIVNO SAME AS BEFORE? BEQ SAMDRV YES BIGWAI LEAX -1,X COUNT DOWN FROM ABOUT $DFXX TO... BNE BIGWAI WAIT FOR CONTROLLER TO SWITCH STA DRIVNO SAVE NEWDRIVE NUMBER LDX #TRTABL POINT TO TABLE LDA A,X GET LAST TRACK ON NEW DRIVE STA TRKREG GIVE TO FDC SAMDRV CLRB MEANS THERE WAS NO ERROR ASRB CLEAR CARRY WITH 1-BYTE INSTRUCTION PULS A,X,Y,PC AND RETURN DRIVNG LDB #15 ERROR 15 SEC SET CARRY PULS A,X,Y,PC AND RETURN ON ERROR * CHKRDY - CHECK IF DRIVE SPEC BY FCB IS READY CHKRDY LDB 3,X GET DRIVE NUMBER CMPB LASTDR CHECK FOR LAST DRIVE BHI CHKNG CLRB NO ERROR ASRB CLEAR CARRY WITH 1-BYTE INSTRUCTION RTS CHKNG LDB #$80 NOT READY BIT SEC RTS * QUICK - QUICK CHECK QUICK EQU CHKRDY SAME AS CHECK READY * RESTORE - SELECT DRIVE SPEC BY FCB AND RESTORE IT TO 0 RESTOR BSR DRIVE SELECT DRIVE BNE RTS ON ERROR RESTR1 LDB #$08 ADDB STPRAT PLUS STEP RATE BITS STB COMREG RESTORE, LOAD HEAD, SLOW STEP BSR WNBUSY WAIT UNTIL NOT BUSY ANDB #$98 CHECK NR, SK, CRC ERRORS ANDCC #$FE CLEAR CARRY RTS RTS AND RETURN * WAIT - WAIT ROUTINE TO WAIT A WHILE WAIT LBSR WAIT4 WAIT4 LBSR WAIT2 WAIT2 LBSR WAIT1 WAIT1 RTS * WNBUSY - WAIT FOR NOT BUSY WNBUSY BSR WAIT FOR COMMAND TO SETTLE LDB STAREG CHECK STATUS BITB #1 CHECK BUSY FLAG BNE WNBUSY WAIT IF STILL BUSY RTS ELSE RETURN WITH B=STATUS * SEEK - SEEK TO TR-SEC C(D) AND RETURN Z FLAG SEEK PSHS A,X STB SECREG GIVE SECTOR NUMBER TO FDC LDB DRIVNO CURRENT DRIVE NUMBER LDX #DENSTE DRIVE DATA TABLE ABX POINT TO DRIVE'S ENTRY IN IT STX DDATA SAVE POINTER FOR LATER CLRB TEMP ASSUME SINGLE DENSITY TST A CHECK TRACK NUMBER BEQ USESD USE SD ON TRACK 0 LDB 0,X ELSE GET CURRENT ENTRY ASLB MOVE DENSITY BIT TO BIT 1 ANDB #2 KEEP ONLY DENSITY USESD STB DENSTY ASLB ASLB B=0 ON SD, 8 ON DD ADDB #10 B=10 ON SD, 18 ON DD CMPB SECREG COMPARE WITH DESIRED SECTOR BLO SWSIDB USE SIDE B IF >10 (SD) OR 18(DD) CLRB SIDE A BRA SIDEOK SWSIDB LDB #$40 SIDE B SIDEOK ADDB DRIVNO ADD IN DRIVE NUMBER STB DLATCH SELECT DRIVE AND SIDE CMPA TRKREG ALREADY ON DESIRED TRACK? BEQ TRKOK YES, WAIT AND EXIT LDB [DDATA] CHECK DISK PARAMETERS ANDB #2 DOUBLE STEPPING? STB DUBSTE STORE FOR LATER BEQ NODUB1 IF NOT DOUBLE STEPPING ASL TRKREG ELSE FOOL FDC INTO DOUBLE-STEPPING ASLA NODUB1 STA DATREG AND GIVE NEW TRACK TO FDC BSR WAIT LDA #$18 ADDA STPRAT ADD STEP RATE STA COMREG SEEK, LOAD, SLOW COMMAND BSR WNBUSY WAIT FOR COMPLETION TST DUBSTE DOUBLE-STEPPING? BEQ NODUB2 NO LSR TRKREG YES, FIX UP FDC TRACK REG BSR WNBUSY CHECK FDC BITS ONCE MORE NODUB2 ANDB #$98 CHECK NR,SK,CRC ERRORS PULS A,X,PC AND RETURN TRKOK BSR WAIT WAIT FOR COMPLETION CLRB IF NO ERROR PULS A,X,PC AND RETURN * READ - READ SECTOR ROUTINE - READ TR-SEC C(D) * INTO C(X) AND RETURN Z ERROR FLAG READ PSHS CC BSR RWCOMN GO PREPARE FOR READING ADDA #$8C ADD READ COMMAND TO DENSITY BIT STA COMREG READ COMMAND LBSR WAIT WAIT FOR FDC TO SETTLE TST DENSTY SINGLE OR DOUBLE DENSITY? BNE DDREAD DOUBLE * SINGLE-DENSITY READ RDLOOP LDA STAREG CHECK STATUS BITA #2 DRQ? BNE RDBYTE YES BITA #1 BUSY? BNE RDLOOP YES, SO WAIT TFR A,B MOVE STATUS TO B BRA SDFINR THEN EXIT RDBYTE LDA DATREG GET DATA BYTE STA 0,X+ SAVE IT IN MEM DECB DECREMENT COUNTER BNE RDLOOP REPEAT UNTIL DONE SDFINR LBSR WNBUSY WAIT FOR NOT BUSY BITB #$10 RNF ERROR? BEQ READEX NO, SOMETHING ELSE? INC [DDATA] YES, TRY NEXT SETTING PSHS B SAVE ERROR CODE JSR RESTR1 FORCE A RESTORE (AND THEN RE-SEEK) PULS B RESTORE ERROR CODE READEX PULS CC RESTORE INTERRUPTS ANDB #$9C NR, RNF, CRC, OR LOST DATA? RTS AND RETURN * DOUBLE-DENSITY READ DDREAD PSHS DP SAVE DP REGISTER LDA #$E0 TFR A,DP POINT TO I/O PAGE DRLOOP LDA