*================================= * OTHER ERROR PATCH. * ($B65D - $B670) * - USED WHEN FM DRIVER GETS AN * ERROR THAT IS NOT AN OUT-OF- * DATA ERROR. * - ALSO CONTAINS THE APPEND FLAG. *================================= APPNDFLG HEX 00 ;APPEND FLAG. * ERROR WAS DEADLY, SO BETTER * RELEASE THE FILE'S BUFFER AND * MAKE SURE THE APPEND FLAG IS OFF. OTHRERR JSR GETBUFF ;LOCATE BUFFER BELONGING TO THE ;FILE. (PUT ADR IN A3L/H PTR.) BCS TOERRMSG ;NO BUFFER WAS ASSIGNED, SO NO ;NEED 2 RELEASE THE FILE'S BUF OR ;TURN OFF THE APPEND FLAG. LDA #0 ;ZERO OUT THE APPEND FLAG & SET TAY ;(Y) TO NDEX THE 1RST BYTE OF THE STA APPNDFLG ;DOS NAME BUFFER. STA (A3L),Y ;RELEASE FILE'S DOS BUFFER. TOERRMSG LDA RTNCODFM ;GET ERROR CODE TO INDEX ERR MSG. JMP ERRHNDLR ;EXIT & GO PRINT ERROR MESSAGE. *================================= * PATCH TO HANDLE APPEND. * ($B671 - $B685) *================================= * PREPARE TO MANUALLY BACK UP THE * FILE POINTER IF NECESSARY. NEED * TO BACK IT UP ONE BYTE IF A $00 * BYTE WAS ENCOUNTERED IN A DATA * SECTOR. HOWEVER, IF A ZEROED- * OUT DATA PAIR (LISTED IN A T/S * LIST) OR A ZEROED-OUT T/S LINK * WAS ENCOUNTERED, THEN THE FILE * POINTER IS POSITIONED CORRECTLY. * (P.S. AT ONE TIME IN THE HISTORY * OF DOS, THE POSITION FUNCTION * WAS USED TO BACK UP THE POINTER.) * ENTER WITH APPEND FLAG SET IF A * $00 WAS DETECTED IN A (NON-EMPTY) * FILE'S T/S LIST. CKAPFLG LDA APPNDFLG ;IS APPEND FLAG ON? BEQ CLRAPFLG ;NO - FLAG IS OFF. INC RECNMBFM ;YES -SO INCREMENT THE FILE MGR'S BNE CLRAPFLG ;VERSION OF THE RECORD # BECAUSE INC RECNMBFM+1 ;RECNMBFM IS POINTING AT THE LAST ;VALID DATA BYTE AND WE WANT IT 2 ;POINT AT THE NEXT POTENTIAL ;RECORD NUMBER. (P.S. REMEMBER ;THAT RECNMBFM LAGS RECNMBWA BY ;ONE BYTE.) CLRAPFLG LDA #0 ;DON'T NEED THE APPEND FLAG ANY STA APPNDFLG ;MORE, SO TURN IT OFF. JMP RSETPTRS ;GO BACK UP THE FILE POINTER. *================================== * PATCH TO VERIFY A RANGE-OF-BYTES. * (CALLED BY RWRANGE TO R/W RANGE * OF BYTES & THEN VERIFY THE DATA.) *================================== VRFYRWNG STA SUBCODFM ;PUT RANGE-OF-BYTES SUBCODE IN ;RWTS'S IOB. JSR FMDRIVER ;CALL FM DRIVER TO READ/WRITE A ;RANGE OF BYTES. JSR CMDCLOSE ;CLOSE FILE & THEN VERIFY DATA. JMP CMDVERFY *================================ * APPEND PATCH. * ($B692 -$B6B2) * - USED TO HANDLE AN END-OF-DATA * ERROR. *================================ * THIS PATCH IS DIFFICULT TO UNDER- * STAND BECAUSE IT IS A PATCH THAT * HAS BEEN ADDED TO REPAIR PREVIOUS * PATCHES AND BECAUSE EXECUTION FAILS * ON OCCASSION. AS A RESULT, THE APPEND * COMMAND HAS EVOLVED INTO A CLASSIC * CASE OF SPAGHETTI PROGRAMMING. * PARTS OF THE FOLLOWING ROUTINES * SEEM USELESS. THEY MAY JUST BE * RESIDUAL (BUT INNOCUOUS) INSTRUCS * THAT ARE LEFT OVER FROM AN EARLIER * VERSION OF DOS. * CHECK IF FILE POINTER AND WASTEBYT * ARE ZEROES. APNDPTCH LDY #$13 CK4ZEROS LDA (A4L),Y BNE SETAPFLG ;UNLESS WE ARE DEALING WITH A ;USELESS FILE THAT WAS PREVIOUSLY ;OPENED. BUT NEVER CLOSED, THIS ;INSTRUCTION IS ALWAYS TAKEN. INY CPY #$17 BNE CK4ZEROS * THE PURPOSE OF THE FOLLOWING * INSTRUCTIONS IS NOT UNDERSTOOD. * THIS SECTION OF CODE MAY HAVE BEEN * DESIGNED TO DEAL WITH USELESS FILES * THAT WERE OPENED BUT NEVER CLOSED. * WHATEVER THE ORIGINAL PURPOSE WAS, * THE FOLLOWING CODE APPEARS TO KEEP * THE FILE POINTER AT #$000000 WHEN * AN EMPTY FILE (IE. FILE WITH NO * DATA) IS ENCOUNTERED. LDY #$19 ;COPY IMAGE OF RECNMBWA/+1 AND COPYRECS LDA (A4L),Y ;BYTOFFWA/+1 THAT WERE JUST STA RECLENFM-$19,Y ;STORED IN THE WORK BUFFER TO INY ;RECNMBFM/+1 AND BYTOFFFM/+1 IN CPY #$1D ;THE FM PARAMETER LIST. BNE COPYRECS FMDVRTN JMP BK2FMDRV * SET THE APPEND FLAG. * (NEVER ENTERED IF DEALING WITH * AN EMPTY FILE.) SETAPFLG LDX #$FF STX APPNDFLG ;SET THE APPEND FLAG. BNE FMDVRTN ;ALWAYS. *================================= * YET ANOTHER APPEND PATCH. * ($B6B3 - $B6CE) *================================= * BUGGY ROUTINE USED TO BACK UP THE * FILE POINTER. IF A FILE IS $FFFF * (#65536) BYTES LONG (OR SOME * MULTIPLE THEREOF), THE APPEND CMD * WILL FAIL BECAUSE THIS ROUTINE * NEGLECTS TO BACK UP THE HI BYTE * OF THE FILE POINTER (FILPTSEC+1). RSETPTRS LDA RECNMBFM ;RECONCILE RECORD NUMBER VERSIONS STA FILPTBYT ;AND LOWEST TWO BYTE OF THE FILE STA RECNMBWA ;POINTER. LDA RECNMBFM+1 STA WASTEBYT ;APPEARS TO BE IRRELEVANT. ;OBVIOUSLY HAS SOMETHING TO DO ;WITH CK4ZEROS ROUTINE DESCRIBED ;ABOVE. STA RECNMBWA+1 STA FILPTSEC TSX ;RESET THE STK POINTER SO WE CAN STX STKSAV ;USE THE FMEXIT ROUTINE TO RETURN ;TO THE CALLER OF THE APPEND CMD. ;(NOTE: THIS WILL BE EXCEPTIONAL ;EXIT ROUTE FOR FMEXIT.) JMP GOODFMXT ;EXIT THE APPEND CMD VIA FMEXIT ;ROUTINE. EXECUTION ACTUALLY RTNS ;2 AFTRCMD ($A17D) LOCATED IN THE ;CMD PARSING AND PROCESSING ;ROUTINES. *================================= * FREE SPACE *================================= DS 1 ;($B6CF) *================================= * STRAY CODE (NOT USED). * ($B6D0-$B6E7.) *================================= * - DO A HOME & THEN PRINT "B01-00" * - CONSIDER TO BE FREE SPACE. JSR HOME LDA #"B" JSR COUT LDA #$01 JSR PRBYTE LDA #"-" JSR COUT LDA #$00 JSR PRBYTE RTS *================================= * FREE SPACE *================================= DS 21 ;($B6E8-$B6FC.) *================================= * STORAGE FOR BOOT1. * ($B6FD - $B6FF) * (IMAGE MOVED TO $8FD-$8FF.) *================================= IMG8FD DA $B600 ;VARIES FROM $B600-$BF00 ON 48K ;SLAVE. (EVENTUALLY POINTS TO THE ;START OF BOOT2 AT $B700. IMAGE ;OF BT1LDADR AT $8FD.) IMG8FF DS 1 ;CONTAINS # OF PAGES TO READ WHEN ;EXECUTING BOOT1. ALSO DOUBLES AS ;LOGICAL SEC#. INITIALLY = $01. ;VARIES FROM:$09 --> $00 --> $FF. ;(IMAGE OF BT1PG2RD AT $8FF.) *========================================= * BOOT2 ($B700 - $B749). *========================================= * - READS IN THE REST OF DOS STARING AT * TRK02/SEC04 DOWN TO TRK00/SEC0A * ($B5FF --> $9B00). (SECTORS 0A & 0B * OF TRK 0 ($9CFF - $9B00) ARE * EMPTY.) * - AFTER THE REST OF DOS IS READ IN, * EXECUTION JUMPS TO DOS'S COLDSTART * ROUTINE (DOSCLD, $9D84). * - NOTE THAT ON ENTRY: (X) = SLOT * 16. *::::::::::::::::::::::::::::::::::::::::: * PREPARE RWTS'S INPUT-OUTOUT BLOCK * (IOB) AND DESIGNATE THE NUMBER OF * SECTORS TO READ. BOOT2 STX IBSLOT ;(X) = SLOT*16 WANTED. STX IOBPSN ;LAST-USED SLOT*16. LDA #1 ;DESIGNATE BOTH LAST-USED & WNTD STA IOBPDN ;DRIVES TO BE DRIVE#1. STA IBDRVN LDA NMPG2RD ;SET NUMBER OF PAGES TO READ. STA BT2PGCTR ;COUNTER 4 NUMBER OF PGS 2 READ. LDA #2 ;START WITH TRK$02/SEC$04. STA IBTRK ;TRACK. LDA #4 STA IBSECT ;SECTOR. LDY BT1MGADR+1 ;(Y)=HI BYTE OF ADDR OF IMAGE OF ;BOOT1 (#$B6 ON 48K SLAVE). DEY ;DEFINE I/O BUF AS 1 PAGE BELOW STY IBBUFP+1 ;BOOT1. LDA #1 ;OPCODE FOR READ. STA IBCMD * CONVERT FROM (X) = SLOT*16 * TO (X) = SLOT. TXA ;(X) = SLOT * 16. LSR ;DIVIDE BY 16. LSR LSR LSR TAX ;(X) = SLOT. * INITIALIZE PAGE-4 LOCATIONS WITH * TRACK #'S ASSOC WITH THE DRIVES. LDA #0 STA TRK4DRV2,X STA TRK4DRV1,X * CALL ROUTINE TO READ IN THE REST OF DOS. JSR RWPAGES ;GO READ A GROUP OF PAGES (SECS). LDX #$FF ;COMPLETELY CLEAR OUT THE STACK. TXS STX IBVOL ;SET VOL TO $FF (COMPLEMENT OF 0) JMP CLOBCARD ;GO CLOBBER THE LANGUAGE CARD AND ;SET VIDEO OUTPUT (SIMUL8 PR#0). ;(RETURNS TO NEXT INSTRUC BELOW.) BK2BOOT2 JSR SETKBD ;SIMULATE "IN#0" STATEMENT. ;(THAT IS, SELECT KEYBOARD.) JMP DOSCOLD ;JUMP IN2 DOS'S COLDSTART ROUTINE ;(AT $9DE4) TO BUILD THE DOS BUFS ;AND THE PAGE-3 VECTOR TABLE AND ;THEN RUN THE "HELLO" PROGRAM. ;************* NOTE ************* ;* THIS INSTRUC IS A HACKER'S * ;* DREAM. FOR INSTANCE, YOU CAN* ;* CHANGE THE JUMP TO POINT TO * ;* YOUR OWN PASSWORD OR TIME- * ;* BOMB PRGM THAT YOU HAVE * ;* DEVIOUSLY IMBEDDED IN AN * ;* UNUSED SECTION OF DOS. * ;******************************** *================================ * WRITE DOS IMAGE ON TRKS 0 - 2. * (USED BY INIT FUNCTION.) * * WRITE TRK02/SEC04 ($B5FF) DOWN * TO TRK00/SEC0C ($9D00). *================================ WRDOSIMG LDA BTSTAGE+1 ;CALC # OF PAGES TO WRITE: SEC ; (#$B6 - #$9D = #$19 OR #25.) SBC IBBUFP+1 STA BT2PGCTR ;SET COUNTER FOR 25 PAGES. LDA BTSTAGE+1 STA IBBUFP+1 DEC IBBUFP+1 ;START WITH PAGE #$B5. LDA #2 ;START WITH TRK02/SEC04. STA IBTRK LDA #4 STA IBSECT LDA #2 ;SET WRITE COMMAND. STA IBCMD JSR RWPAGES ;WRT TRK02/SEC04 TO TRK00/SEC00. * WRITE TRK00/SEC09 ($BFFF) DOWN * TO TRK00/SEC00 ($9D00). LDA BTSTAGE+1 ;STORE HI BYTE OF ADRRESS OF THE STA IMG8FD+1 ;START OF BOOT1 (#$B6). CLC ;CALC HI BYTE ADR OF TRK00/SEC09 ADC #9 ;(#$B6 + #$09 = #$BF). STA IBBUFP+1 ;SET BUF 2 SEND INFO 2 PAGE #$BF. LDA #10 ;DESIGNATE 10 PAGES TO WRITE. STA BT2PGCTR ;(#$BFFF - #$B600). SEC SBC #1 STA IMG8FF ;SIGNIFY THAT THERE ARE 9 PAGES 2 ;BE READ WHEN BOOT1 IS EXECUTED. STA IBSECT ;START WRITING WITH TRK00/SEC09. JSR RWPAGES ;WRITE TRK00/SEC09 2 TRK00/SEC00. RTS *================================* * FREE SPACE ($B78D-$B792). *================================* HEX 000000000000 ;UNUSED. *================================= * READ/WRITE A GROUP OF PAGES. *================================= RWPAGES LDA ADROFIOB+1 ;INIT (A)/(Y) WITH HI/LOW BYTS OF LDY ADROFIOB ;ADR OF RWTS'S IOB 4 NTRY 2 RWTS. JSR ENTERWTS ;ENTER IN2 RWTS 2 READ/WRITE SEC. LDY IBSECT ;GET # OF SEC JUST RD OR WRITTEN DEY ;VAL 4 NXT SEC 2 READ/WRITE (WHEN ;EXECUTING BOOT1, #$09 --> #$FF). BPL SAMETRK ;BRANCH TO USE THE SAME TRACK. * START A NEW TRACK. LDY #$0F ;START WITH SEC 15. NOP NOP DEC IBTRK ;REDUCE TRK# WANTED. * ADJUST POINTER TO IOB & TEST IF THERE * ARE ANY MORE SECTORS TO READ/WRITE. SAMETRK STY IBSECT ;STORE NUMBER OF SEC WANTED. DEC IBBUFP+1 ;REDUCE BUFFER'S PAGE ADR. DEC BT2PGCTR ;REDUCE CNTR 4 # OF SECS 2 READ. BNE RWPAGES ;MORE SECS TO READ. RTS *=================================== * ROUTE EXECUTION TO RWTS. *=================================== * NORMAL ROUTE TO ENTER RWTS FROM * CUSTOM ASSEMBLY LANGUAGE PRGMS. * ON ENTRY - THE IOB AND DCT TBLS * MUST ALREADY BE SET UP. * - (Y) AND (A) = LOW AND * HI BYTES (RESPECTIVELY) * OF ADDR OF IOB TABLE. * (P.S. NOTE THAT THE $3D9 VECTOR * JUMPS TO HERE!!!) ENTERWTS PHP ;SAVE STATUS ON STK. ;(C)=0 IF SEEKING OR READING. ;(C)=1 IF WRITING OR FORMATTING. SEI ;SET INTERRUPT DISABLE FLAG TO ;PREVENT ANY FURTHER MASKABLE ;INTERRUPTS WHEN DOING REAL-TIME ;PROGRAMMING. JSR RWTS ;ENTER RWTS PROPER 2 DO OPERAT'N: ; $00=SEEK, $01=READ, ; $02=WRITE, $03=FORMAT. BCS ERRENTER ;OPERATION WAS NOT SUCCESSFUL. ;NVR TAKEN IF JUST SEEKING CAUSE ;NO ERROR SIGNALLING ROUTINES ARE ;ASSOCIATED WITH THAT OPERATION. PLP ;THROW STATUS OFF STACK. CLC ;SIGNAL SUCCESSFUL. RTS ERRENTER PLP ;THROW STATUS OFF STACK. SEC ;SIGNAL UNSUCCESSFUL. RTS *================================= * SET UP RWTS'S IOB TO WRITE DOS. *================================= PRPWRDOS LDA FIRDOSPG+1 ;DESIGNATE START OF DOS AS ADR OF STA IBBUFP+1 ;I/O BUF IN RWTS'S IOB. LDA #0 STA IBBUFP LDA VOLWA ;COMPLEMENT VOL#. EOR #$FF STA IBVOL RTS *================================= * ZERO OUT THE CURRENT (256-BYTE) * BUFFER. *================================= ZCURBUF LDA #0 TAY ZCURBUF1 STA (A4L),Y INY BNE ZCURBUF1 RTS *================================= * PARAMETERS FOR BOOT2. * ($B7DF - $B7E7) *================================= DS 1 ;UNUSED ($B7DF). NMPG2RD HEX 1B ;# OF PAGES TO READ (#27). BT2PGCTR DS 1 ;# OF PAGES LEFT 2 READ (VARIES). BT1RSTSC HEX 0A ;FIRST SEC # IN STAGE (#10). DS 1 ;UNUSED ($B7E3). ADROFIOB DA IBTYPE ;ADR OF RWTS'S IOB (NORM $B7E8). BTSTAGE DA SEC2RDB6 ;ADR OF START OF IMAGE OF BOOT1. ;(NORMALLY, $B600.) BT1MGADR = BTSTAGE *================================= * RWTS'S INPUT/OUTPUT BLOCK (IOB). * ($B7E8 - $B7FA) *================================= IBTYPE HEX 01 ;TABLE TYPE (SHOULD BE $01). IBSLOT DS 1 ;SLOT WANTED * 16. IBDRVN DS 1 ;DRIVE WANTED ($01 OR $02). IBVOL DS 1 ;VOL WANTED ($00 GOOD FOR ALL). IBTRK DS 1 ;TRK WANTED. IBSECT DS 1 ;LOGICAL SEC WANTED. IBDCTP DA DEVTPC ;PTS 2 DEVICE CHARACTERISTIC TBL. ;(NORMALLY, $B7FB). IBBUFP DS 2 ;PTS 2 RWTS'S I/O BUFFER. IBSECSZ HEX 0001 ;SEC SIZ IN BYTS (LOW/HI FORMAT). IBCMD DS 1 ;RWTS COMMAND CODE: ; $00=SEEK, $01=READ, ; $02=WRITE, $04=FORMAT. IBSTAT DS 1 ;ERROR CODE: ;$00=NO ERRS, $10=WRIT PROT, ;$20=VOL MISMTCH, $40=I/O(DRV)ERR ;$80=READ ERR. IBSMOD DS 1 ;VOLUME FOUND. IOBPSN DS 1 ;SLOT*16 OF LAST ACCESS (FOUND). IOBPDN DS 1 ;DRIVE # OF LAST ACCESS (FOUND). HEX 0000 ;UNUSED ($B7F9-$B7FA). *================================= * DEVICE CHARACTERISTIC TABLE. * ($B7FB - $B7FF) *================================= DEVTPC HEX 00 ;DEVICE TYPE. PPTC HEX 01 ;PHASES/TRK. (EVEN VAL = 1PHASE, ;ODD VAL = 2PHASE.) THEREFORE, ;$01=2 PHASE (WHICH TRANSLATES TO ;2 ARM MOVEMENTS PER TRACK). MONTC HEX EFD8 ;MOTOR-ON-TIME COUNT. DS 1 ;UNUSED ($B7FF). D