LST OFF ORG $B700 ; SST.RWTS USE EDD.ROM ******************************** * * * SST RWTS * * (DOS 3.3 BASED) * * * ******************************** * Zero page SLOTZ EQU $27 CSUM EQU $27 PRIOR EQU $27 WTEMP EQU $26 TO EQU $26 IDX EQU $26 COUNT EQU $26 LAST EQU $26 TRKCNT EQU $26 VOLFND EQU $2F TRKFND EQU $2E SECFND EQU $2D SLOTEMP EQU $2B TRKN EQU $2A PTRSDEST EQU $36 DRIVNO EQU $35 BUFADR EQU $3E DEVCTBL EQU $3C MONTIMEH EQU $47 MONTIMEL EQU $4E SYNCNT EQU $46 TRACK EQU $44 VOLUME EQU $41 BUFADR2 EQU $42 IOBPH EQU $49 IOBPL EQU $48 DRV0TRK EQU $0478 CURTRK EQU $0478 L0478 EQU $0478 SEEKCNT EQU $04F8 DRV1TRK EQU $04F8 L04F8 EQU $04F8 RETRYCNT EQU $0578 SLOT EQU $05F8 SLOTABS EQU $0678 RECALCNT EQU $06F8 * DOS 3.3 patches+routines => NOT USED BY SST DOSSTRT EQU $9D84 CLOSEALL EQU $A316 RSET0 EQU $A75B TEMP1 EQU $AA63 BYTVAL EQU $AA70 RUNINTRC EQU $AAB7 SAVFMW EQU $AE7E SETERROR EQU $B385 STKSAVE EQU $B39B SUBCODE EQU $B5BC VOLNUMBR EQU $B5F9 FRSTPAG EQU $B6FE ; HEX B6 NUMSECS EQU $B6FF ; HEX 09 *------------------------------- * * DOS SECOND STAGE BOOT PGM * STX RWTS_SNUM16 STX RWTS_SLOTFND LDA #$1 STA RWTS_DRVFND STA RWTS_DNUM LDA NUMPGS STA NSECSRW LDA #2 STA RWTS_TNUM LDA #4 STA RWTS_SNUM LDY FRSTBOOT+1 DEY STY RWTS_USRBUF+1 LDA #$1 STA RWTS_CMDCODE TXA LSR LSR LSR LSR TAX LDA #0 STA L04F8,X STA L0478,X JSR RWPAGES LDX #$FF TXS STX RWTS_VOLEXPT JMP REBOOT RESTART JSR SETKBD JMP DOSSTRT * * * PUTDOS- WRITES DOS ON FIRST * TWO TRACKS OF DISK * PUTDOS LDA FRSTBOOT+1 SEC SBC RWTS_USRBUF+1 STA NSECSRW LDA FRSTBOOT+1 STA RWTS_USRBUF+1 DEC RWTS_USRBUF+1 LDA #2 STA RWTS_TNUM LDA #4 STA RWTS_SNUM LDA #2 STA RWTS_CMDCODE JSR RWPAGES LDA FRSTBOOT+1 STA FRSTPAG CLC ADC #9 STA RWTS_USRBUF+1 LDA #$A STA NSECSRW SEC SBC #$1 STA NUMSECS STA RWTS_SNUM JSR RWPAGES RTS DS 6,0 RWPAGES LDA RWTSPPTR+1 LDY RWTSPPTR JSR CALLRWTS LDY RWTS_SNUM DEY BPL L85 LDY #$F NOP NOP DEC RWTS_TNUM L85 STY RWTS_SNUM DEC RWTS_USRBUF+1 DEC NSECSRW BNE RWPAGES RTS CALLRWTS PHP SEI JSR RWTS: BCS L86 PLP CLC RTS L86 PLP SEC RTS RWTSPRMS LDA SUBCODE STA RWTS_USRBUF+1 LDA #0 STA RWTS_USRBUF LDA VOLNUMBR EOR #$FF STA RWTS_VOLEXPT RTS ZEROBUFR LDA #0 TAY L87 STA (BUFADR2),Y INY BNE L87 RTS HEX 00 NUMPGS HEX 1B NSECSRW HEX 000A1B RWTSPPTR DA $B7E8 FRSTBOOT DA $B600 *------------------------------* * Table for RWTS * *------------------------------* RWTS_TABLE RWTS_TBLTYPE DFB 1 ; table type RWTS_SNUM16 HEX 60 ; slot*16 RWTS_DNUM DFB 1 ; drive number RWTS_VOLEXPT HEX FF ; volume number expected RWTS_TNUM HEX 0E ; track number RWTS_SNUM HEX 09 ; sector number DA RWTS_DEVCT ; addr of device characteristics table RWTS_USRBUF DA $9600 ; R/W buffer RWTS_BYTCNT DA $0100 ; number of bytes RWTS_CMDCODE DFB 1 ; 0=seek/1=read/2=write/4=format RWTS_ERRRCODE HEX 00 ; return code RWTS_VOLFND HEX FE ; volume number of last access RWTS_SLOTFND HEX 60 ; slot*16 of last access RWTS_DRVFND DFB 1 ; drive number of last access RWTS_UNUSED HEX 0000 * Device characteristics table RWTS_DEVCT DFB 0 ; device type ($00=disk II) DFB 1 ; phases per track ($01=disk II) HEX EFD8 ; motor on time count DS \,0 *------------------------------- * * PRENIBBLIZE ROUTINE * * CONVERTS 256 BYTES POINTED AT BY * BUFADR TO 342 6-BIT NIBBLES * OF THE FORM 00XXXXXX * PRENIB16 LDX #0 LDY #2 * * GET NEXT USER BYTE * PRENIB1 DEY LDA (BUFADR),Y * * SHIFT H.O. TWO BYTES INTO * NBUF2. * LSR ROL NBUF2,X LSR ROL NBUF2,X * * PUT L.O. SIX BITS (SHIFTED LEFT) * INTO NBUF1. * STA NBUF1,Y INX CPX #$56 BCC PRENIB1 * * * DONE YET? * LDX #0 TYA BNE PRENIB1 * * * STRIP H.O. TWO BITS OF NBUF2. * LDX #$55 PRENIB2 LDA NBUF2,X AND #$3F STA NBUF2,X DEX BPL PRENIB2 RTS * * * WRITE SUBROUTINE * * WRITES PRENIBBILIZED DATA IN * NBUF1 AND NBUF2 TO DISK. * * NOTE: THIS STUFF IS ALL TIME * CRITICAL. * * WATCH PAGE BOUNDRIES, DON'T * REMOVE NOP'S, ETC. * * * WRITE16 SEC ;ANTICIPATE WRITE PROTECT STX SLOTZ STX SLOTABS LDA HC08D,X LDA HC08E,X ;SENSE WRITE PROTECT BMI WEXIT LDA NBUF2 STA WTEMP LDA #$FF ;SYNC BYTE STA HC08F,X ;WRITE 1ST NIBBLE ORA HC08C,X PHA PLA NOP LDY #4 * * * WRITE THE SYNC BYTE * WSYNC PHA PLA JSR WNIBL7 DEY BNE WSYNC LDA #$D5 ;FIRST DATA MARK JSR WNIBL9 LDA #$AA ;2ND DATA MARK JSR WNIBL9 LDA #$AD ;3RD DATA MARK JSR WNIBL9 TYA ;CLEAR CHECKSUM LDY #$56 ;NBUF2 INDEX BNE L1 ;ALWAYS TAKEN * * * WDATA0 LDA NBUF2,Y ;GET PRIOR 6-BIT NIBBLE L1 EOR NBUF2-1,Y ;AND XOR WITH CURRENT NIBBLE TAX LDA NIBL,X LDX SLOTZ STA HC08D,X ;WRITE NIBBLE LDA HC08C,X DEY ;NEXT NIBBLE BNE WDATA0 * * * * NOW HANDLE NBUF1. * * * GET PRIOR NIBBLE * LDA WTEMP RWTS_WDATA1 NOP * * LOOP TO WRITE OUT DATA IN NBUF1 * WDATA2 EOR NBUF1,Y TAX LDA NIBL,X LDX SLOTABS STA HC08D,X ;WRITE NIBBLE LDA HC08C,X LDA NBUF1,Y INY BNE WDATA2 TAX LDA NIBL,X * * WRITE CHECKSUM * LDX SLOTZ JSR WNIBL * * WRITE EPILOG TO DATA * LDA #$DE ;DM4, BIT SLIP MARK JSR WNIBL9 LDA #$AA ;DM5, BSM JSR WNIBL9 LDA #$EB ;DM6, BSM JSR WNIBL9 * * ALL DONE, CLOSE UP THE SHOP! * LDA #$FF JSR WNIBL9 * * TURN OFF THE WRITE MODE * LDA HC08E,X * * AND BACK TO THE READ MODE * WEXIT LDA HC08C,X RTS * * * * WNIBL9 9 CYCLES, THEN WRITE * WNIBL9 CLC * * WNIBL7 7 CYCLES, THEN WRITE * WNIBL7 PHA PLA * * * WRITE NIBBLE TO DISK * WNIBL STA HC08D,X ORA HC08C,X RTS * * * POST NIBBLIZE ROUTINE. * * CONVERTS 342 NIBBLES OF THE FORM * * 00XXXXXX * * TO EIGHT BIT BYTES. * * THE NIBBLES ARE STORED IN NBUF1 * AND NBUF2, THE 8-BIT BYTES WILL * BE STORED AT (BUFADR). * * POSTNB16 LDY #0 POST1 LDX #$56 POST2 DEX BMI POST1 * * GET BYTE AND SHIFT IN L.O. TWO * BITS FROM NBUF2 * LDA NBUF1,Y LSR NBUF2,X ROL LSR NBUF2,X ROL * * STORE IN USER BUFFER * STA (BUFADR),Y INY CPY TO BNE POST2 RTS * * * READ ROUTINE, READS A SECTOR * FROM THE DISK AND STORES THE * DATA IN NBUF1 AND NBUF2. * READ16 LDY #$20 * * GET SYNC BYTES * RSYNC DEY BEQ RDERR * * WAIT UNTIL A BYTE IS RECIEVED * FROM THE DISK DRIVE. * L2 LDA HC08C,X BPL L2 * * BYTE RECIEVED, CHECK FOR DM1 * RSYNC1 EOR #$D5 BNE RSYNC NOP * * GET NEXT BYTE AND CHECK FOR * DM2 * L3 LDA HC08C,X BPL L3 CMP #$AA BNE RSYNC1 LDY #$56 * * CHECK FOR DM3 * L4 LDA HC08C,X BPL L4 CMP #$AD BNE RSYNC1 * * READ THE DATA FROM THE SECTOR * LDA #0 ;INIT CHECKSUM * * READ STUFF INTO NBUF2 * RDATA1 DEY STY IDX L5 LDY HC08C,X BPL L5 EOR MSWAIT,Y LDY IDX STA NBUF2,Y BNE RDATA1 * * READ STUFF INTO NBUF1 * RDATA2 STY IDX L6 LDY HC08C,X BPL L6 EOR MSWAIT,Y LDY IDX STA NBUF1,Y INY BNE RDATA2 * * GET AND CHECK THE CHECKSUM BYTE * L7 LDY HC08C,X BPL L7 CMP MSWAIT,Y BNE RDERR * * CHECK FOR DM4 * L8 LDA HC08C,X BPL L8 CMP #$DE BNE RDERR NOP * * CHECK FOR DM5 * L9 LDA HC08C,X BPL L9 CMP #$AA BEQ RDADRX RDERR SEC RTS * * * READ ADDRESS FIELD. * * READS STARTING ADDRESS MARKS * ($D5, $AA, $96), ADDRESS INFO * (VOLUME/TRACK/SECTOR/CHECKSUM), * AND CLOSING ADDRESS MARKS * ($DE, $AA) * RDADR16 LDY #$FC STY COUNT RDASYN INY BNE L10 INC COUNT BEQ RDERR * * READ FIRST ADDRESS MARK ($D5) * L10 LDA HC08C,X BPL L10 RDASYN1 CMP #$D5 BNE RDASYN NOP * * READ NEXT ADDRESS MARK * L11 LDA HC08C,X BPL L11 CMP #$AA BNE RDASYN1 LDY #3 * * READ LAST ADDRESS MARK * L12 LDA HC08C,X BPL L12 CMP #$96 BNE RDASYN1 * * INIT CHECKSUM AND READ THE * ADDRESS DATA FIELD (FOUR BYTES) * LDA #0 RDAFLD STA CSUM * * READ 'ODD' BIT NIBBLE * L13 LDA HC08C,X BPL L13 ROL STA LAST * * READ EVEN BIT NIBBLE. * L14 LDA HC08C,X BPL L14 * * MERGE THE TWO. * AND LAST * * STORE THE DATA BYTE, UPDATE * CHECKSUM, AND REPEAT UNTIL * ENTIRE ADDRESS FIELD IS READ. * STA SLOTEMP+1,Y EOR CSUM DEY BPL RDAFLD * * CHECKSUM (IN ACC) MUST BE 0. * TAY BNE RDERR * * READ FIRST EPILOGUE BYTE ($DE) * L15 LDA HC08C,X BPL L15 CMP #$DE BNE RDERR NOP * * READ SECOND EPILOGUE BYTE ($AA) * L16 LDA HC08C,X BPL L16 CMP #$AA BNE RDERR RDADRX CLC RTS * * * SEEKABS ROUTINE, MOVES THE * DISK HEAD OVER THE DESIRED * TRACK. * SEEKABS STX SLOTEMP STA TRKN CMP DRV0TRK BEQ RTS0 LDA #0 STA TRKCNT MOVEHEAD LDA DRV0TRK STA PRIOR SEC SBC TRKN BEQ ISTHERE BCS L17 EOR #$FF INC DRV0TRK BCC L18 L17 ADC #$FE DEC DRV0TRK L18 CMP TRKCNT BCC L19 LDA TRKCNT L19 CMP #$C BCS L20 TAY L20 SEC JSR CHKPOS LDA ONTBL,Y JSR MSWAIT LDA PRIOR CLC JSR CHKPOS2 LDA OFFTBL,Y JSR MSWAIT INC TRKCNT BNE MOVEHEAD ISTHERE JSR MSWAIT CLC CHKPOS LDA DRV0TRK CHKPOS2 AND #3 ROL ORA SLOTEMP TAX LDA PHASEOFF,X LDX SLOTEMP RTS0 RTS DS 3,0 * * HEAD MOVE DELAY SUBROUTINE * DELAYS ACC*100 USEC * * MSWAIT LDX #$11 L21 DEX ;DELAY 86 USEC BNE L21 INC MONTIMEL BNE L22 INC MONTIMEH L22 SEC SBC #1 BNE MSWAIT RTS * * * PHASEON/PHASEOFF TABLES * ONTBL HEX 0130 HEX 2824201E1D1C1C1C1C1C OFFTBL HEX 702C26221F1E1D1C1C1C1C1C * * * WRITE TRANSLATE TABLES * NIBL HEX 96979A9B9D9E9FA6A7ABACADAEAFB2B3 HEX B4B5B6B7B9BABBBCBDBEBFCBCDCECFD3 HEX D6D7D9DADBDCDDDEDFE5E6E7E9EAEBEC HEX EDEEEFF2F3F4F5F6F7F9FAFBFCFDFEFF * * ALIGN REMAINDER OF TABLE * DS 45,0 * * HEX 0001989902039C040506A0A1A2A3A4A5 HEX 0708A8A9AA090A0B0C0DB0B10E0F1011 HEX 1213B81415161718191AC0C1C2C3C4C5 HEX C6C7C8C9CA1BCC1C1D1ED0D1D21FD4D5 HEX 2021D822232425262728E0E1E2E3E429 HEX 2A2BE82C2D2E2F303132F0F133343536 HEX 3738F8393A3B3C3D3E3F * * * * NIBBLE BUFFERS, MUST BE IN THIS * ORDER! * NBUF1 DS $100,0 NBUF2 DS $56,0 * * * * WRITE AN ADDRESS FIELD ROUTINE * * WRADR16 SEC ;ASSUME W/P ERROR LDA HC08D,X LDA HC08E,X BMI WPERROR * * OUTPUT SYNC BYTE * LDA #$FF STA HC08F,X CMP HC08C,X PHA PLA FRMSYNC JSR WAIT12 JSR WAIT12 STA HC08D,X CMP HC08C,X NOP DEY BNE FRMSYNC * * OUTPUT DATA MARKS * LDA #$D5 JSR WBYTE9 LDA #$AA JSR WBYTE9 LDA #$96 JSR WBYTE9 * * OUTPUT VOLUME TRACK SECTOR * AND CHECKSUM * LDA VOLUME JSR WBYTE LDA TRACK JSR WBYTE LDA BUFADR+1 JSR WBYTE LDA VOLUME EOR TRACK EOR BUFADR+1 PHA LSR ORA BUFADR STA HC08D,X LDA HC08C,X PLA ORA #$AA JSR WBYTE11 * * OUTPUT DATA MARKS 4,5, AND 6 * LDA #$DE JSR WBYTE9 LDA #$AA JSR WBYTE9 LDA #$EB JSR WBYTE9 CLC WPERROR LDA HC08E,X LDA HC08C,X WAIT12 RTS * * * WRITE A BYTE AS TWO FOUR BIT * NIBBLES TO THE DISK. * WBYTE PHA LSR ORA BUFADR * * WRITE ODD BITS * STA HC08D,X CMP HC08C,X PLA NOP NOP NOP ORA #$AA WBYTE11 NOP WBYTE9 NOP PHA PLA * * WRITE EVEN BITS * STA HC08D,X CMP HC08C,X RTS * * * FORCE RWTS TO PAGE BOUNDRY * DS \,0 *------------------------------* * * * RWTS ENTRY POINT * * * *------------------------------* RWTS: * * UPON ENTRY, A & Y POINT AT IOB * STY IOBPL STA IOBPH * * SET UP FOR ONE RECAL AND 4 SEEKS * LDY #2 STY RECALCNT LDY #4 STY SEEKCNT * * GET SLOT # * LDY #1 LDA (IOBPL),Y TAX * * * SEE IF SLOT # WAS CHANGED * LDY #$F CMP (IOBPL),Y BEQ SAMESLOT * * IF SO, TURN OFF OLD DRIVE * TXA PHA LDA (IOBPL),Y TAX PLA PHA STA (IOBPL),Y LDA HC08E,X * * DELAY UNTIL DATA IS CONSTANT * STILLON LDY #8 LDA HC08C,X NOTSURE CMP HC08C,X BNE STILLON DEY BNE NOTSURE PLA TAX * * * START THE MOTOR UP * SAMESLOT LDA HC08E,X LDA HC08C,X LDY #8 NOTSURE2 LDA HC08C,X PHA PLA PHA PLA STX SLOT CMP HC08C,X BNE L23 DEY BNE NOTSURE2 L23 PHP LDA HC089,X * * MOVE NECESSARY POINTERS TO * PAGE ZERO * LDY #6 PTRMOVE LDA (IOBPL),Y STA PTRSDEST,Y INY CPY #$A BNE PTRMOVE * * GET OTHER PARAMETERS * LDY #3 LDA (DEVCTBL),Y STA MONTIMEH LDY #2 LDA (IOBPL),Y LDY #$10 CMP (IOBPL),Y BEQ L24 STA (IOBPL),Y PLP LDY #0 PHP L24 ROR BCC L25 LDA HC08A,X BCS DRVSEL L25 LDA HC08B,X * * SAVE WHICH DRIVE IS BEING USED * DRVSEL ROR DRIVNO PLP PHP BNE NOWAIT LDY #7 * * WAIT 100 USEC FOR OLD DRIVE'S * TIMING CAPACITOR TO DISCHARGE * STEPWAIT JSR MSWAIT DEY BNE STEPWAIT LDX SLOT NOWAIT LDY #4 LDA (IOBPL),Y JSR MYSEEK PLP BNE TRYTRK LDY MONTIMEH BPL TRYTRK * * WAIT FOR MOTOR TO COME UP TO * SPEED. * MOTOROFF LDY #$12 L26 DEY BNE L26 INC MONTIMEL BNE MOTOROFF INC MONTIMEH BNE MOTOROFF * * DISK IS NOW UP TO SPEED. * IF NOT FORMAT OPERATION, * POSITION THE HEAD OVER THE * PROPER TRACK * TRYTRK LDY #$C LDA (IOBPL),Y BEQ GALLDONE CMP #4 BEQ FORMDSK ROR PHP ;SAVE R/W STATUS BCS TRYTRK2 * * IF A READ OPERATION, MUST * PRENIBBLIZE FIRST. * JSR PRENIB16 * * * SET UP FOR A MAXIMUM OF 48 * RETRIES. * TRYTRK2 LDY #$30 STY RETRYCNT TRYADR LDX SLOT JSR RDADR16 BCC RDRIGHT TRYADR2 DEC RETRYCNT BPL TRYADR * * RECALIBRATE DISK HEAD * RECAL LDA CURTRK PHA LDA #$60 JSR SETTRK DEC RECALCNT BEQ DRVERROR LDA #4 STA SEEKCNT LDA #0 JSR MYSEEK PLA RESEEK JSR MYSEEK JMP TRYTRK2 * * * WE HAVE JUST READ AN ADDRESS * FIELD, NOW CHECK FOR DESIRED * TRACK, SECTOR, AND VOLUME * RDRIGHT LDY TRKFND CPY CURTRK BEQ RTTRK * * SAVE DEST TRACK VALUE * LDA CURTRK PHA TYA JSR SETTRK PLA DEC SEEKCNT BNE RESEEK BEQ RECAL * * BAD DRIVE ERROR. * DRVERROR PLA LDA #$40 * * JMPTO1 PLP JMP HNDLERR GALLDONE BEQ ALLDONE FORMDSK JMP DSKFORM * * * DRIVE IS ON THE RIGHT TRACK, * NOW CHECK FOR A VOL MISMATCH * RTTRK LDY #3 LDA (IOBPL),Y ;GET DESIRED VOLUME PHA * * SAVE VOLUME ACTUALLY FOUND IN * RWTS IOB. * LDA VOLFND LDY #$E STA (IOBPL),Y * * IF VOLUME SPECIFIED WAS ZERO, * NO ERROR. * PLA BEQ CRCTVOL * * OTHERWISE, CHECK FOR A VOLUME * MISMATCH ERROR. * CMP VOLFND BEQ CRCTVOL LDA #$20 BNE JMPTO1 * * NOW CHECK FOR THE CORRECT SECTOR * CRCTVOL LDY #5 LDA (IOBPL),Y ;GET THE SECTOR # * * CONVERT TO A "SOFT" SECTOR * NUMBER BY APPLYING THE SOFTWARE * INTERLEAVE. * TAY LDA INTRLEAV,Y * * ARE WE AT THAT SECTOR YET? * CMP SECFND BNE TRYADR2 * * IF SO, SEE IF WE ARE DOING A * READ OR A WRITE. * PLP BCC WRIT * * READING, SO READ IN THE 256 * BYTES OF DATA THAT FOLLOW. * JSR READ16 PHP BCS TRYADR2 PLP LDX #0 STX TO * * CONVERT THE NIBBLES TO BYTES. * JSR POSTNB16 LDX SLOT ALLDONE CLC DFB $24 ;BIT L38 HNDLERR SEC ;OPCODE SKIPPED BY BIT L38 LDY #$D STA (IOBPL),Y JMP HNDERR2 ; LDA HC088,X RTS * * PERFORMING A WRITE, WRITE THE * DATA (ALREADY NIBBLIZED) TO * THE FOLLOWING DATA SECTOR. * WRIT JSR WRITE16 BCC ALLDONE LDA #$10 BCS HNDLERR * * * MYSEEK IS THE SEEK ROUTINE, * IT SEEKS TRACK 'N' IN SLOT * X/16 * * IF DRIVNO IS NEGATIVE - DRIVE 0 * IF DRIVNO IS POSITIVE - DRIVE 1 * MYSEEK PHA LDY #1 LDA (DEVCTBL),Y ROR PLA BCC SEEK1 ASL JSR SEEK1 LSR CURTRK RTS SEEK1 STA TRKN JSR XTOY LDA DRV0TRK,Y BIT DRIVNO BMI WASDO LDA DRV1TRK,Y WASDO STA DRV0TRK LDA TRKN BIT DRIVNO BMI ISDRV0 STA DRV1TRK,Y BPL GOSEEK ISDRV0 STA DRV0TRK,Y GOSEEK JMP SEEKABS XTOY TXA LSR LSR LSR LSR TAY RTS * * * THIS ROUTINE SETS THE SLOT * DEPENDANT TRACK LOCATION * SETTRK PHA LDY #2 LDA (IOBPL),Y ROR ROR DRIVNO JSR XTOY PLA ASL BIT DRIVNO BMI ONDRV0 STA DRV1TRK,Y BPL RTS3 ONDRV0 STA DRV0TRK,Y RTS3 RTS * * * THIS IS THE DISK FORMATTER * ROUTINE. * DSKFORM LDY #3 LDA (IOBPL),Y STA VOLUME * * SAVE TIMING CONSTANT IN ZERO * PAGE (FOR TIME CRITICAL SECTION) * LDA #$AA STA BUFADR LDY #$56 * * SET UP TO START A TRACK ZERO. * LDA #0 STA TRACK * * * ZERO SECONDARY BUFFER. * L29 STA NBUF2-1,Y DEY BNE L29 * * ZERO PRIMARY BUFFER. * L30 STA NBUF1,Y DEY BNE L30 * * PRETEND WE ARE AT TRACK 40 * (ACC=2*MAXTRACKS) * LDA #$50 JSR SETTRK * * START WITH 40 BYTES OF SELF * SYNC BYTES. * LDA #$28 STA SYNCNT * * GOT TO THE TRACK AND FORMAT IT. * NXTTRK LDA TRACK JSR MYSEEK JSR DISKF2 * * INIT IN CASE OF DISK I/O ERROR. * LDA #8 BCS HNDERR LDA #$30 STA RETRYCNT * * VERIFY THE TRACK JUST FORMATTED. * NOGOOD SEC DEC RETRYCNT BEQ HNDERR * * READ THE ADDRESS FIELD. * JSR RDADR16 BCS NOGOOD ;SOMETHING WRONG? * LDA SECFND BNE NOGOOD * * READ THE DATA AND SEE IF IT'S * OK. * JSR READ16 BCS NOGOOD * * A-OK, MOVE ON TO THE NEXT TRACK. * INC TRACK * * AT THE LAST TRACK YET? * LDA TRACK CMP #$23 BCC NXTTRK * * FORCE ERROR FLAG (CARRY) OFF. * CLC BCC HNDERR2 ; BCC DONEDSK * * * STORE ERROR CODE IN IOB. * * HNDERR LDY #$D * STA (IOBPL),Y * SEC HNDERR JMP HNDLERR HNDERR2 STX IOBPL * * TURN THE DISK OFF. * DONEDSK LDA HC088,X RTS * * FORMAT THE CURRENT TRACK. * DISKF2 LDA #0 ;INIT SECTOR # STA BUFADR+1 LDY #$80 ;BEGIN TRACK WITH 128 SYNC BYTES * BNE L31 * * TRKFRM LDY SYNCNT L31 JSR WRADR16 ;WRITE AN ADDRESS FIELD BCS DELAY12 * * WRITE A DATA FIELD. * JSR WRITE16 BCS DELAY12 * * INCREMENT THE SECTOR NUMBER * AND SEE IF IT IS 16 YET. * INC BUFADR+1 LDA BUFADR+1 CMP #$10 BCC TRKFRM * * RESET SECTOR # TO 15 * LDY #$F STY BUFADR+1 * * MARK THE CURRENT TRACK AS * FORMATTED. * LDA #$30 STA RETRYCNT INITMAP STA SECMAP,Y DEY BPL INITMAP LDY SYNCNT DELAY JSR DELAY12 JSR DELAY12 JSR DELAY12 PHA PLA NOP DEY BNE DELAY JSR RDADR16 BCS DOAGAIN LDA SECFND BEQ ITSGOOD LDA #$10 CMP SYNCNT LDA SYNCNT SBC #1 STA SYNCNT CMP #5 BCS DOAGAIN SEC RTS NXTSEC JSR RDADR16 BCS NXTTRY ITSGOOD JSR READ16 BCC MARKMAP NXTTRY DEC RETRYCNT BNE NXTSEC DOAGAIN JSR RDADR16 BCS ERRCNT LDA SECFND CMP #$F BNE ERRCNT JSR READ16 BCC DISKF2 ERRCNT DEC RETRYCNT BNE DOAGAIN SEC DELAY12 RTS MARKMAP LDY SECFND LDA SECMAP,Y BMI NXTTRY LDA #$FF STA SECMAP,Y DEC BUFADR+1 BPL NXTSEC LDA TRACK BNE TRKDONE LDA SYNCNT CMP #$10 BCC DELAY12 DEC SYNCNT DEC SYNCNT TRKDONE CLC RTS * * * SECMAP- USED TO MARK INITIALIZED * SECTORS. * SECMAP HEX FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF * * * INTERLEAVE REMAPPING TABLE * INTRLEAV HEX 000D0B09070503010E0C0A080604020F * * * * DOS 3.3 PATCHES. WARNING! THESE * ARE ADDRESSED BY OBJECT CODE * AND SHOULD NOT BE MOVED WITHOUT * CAREFUL THOUGHT. * REBOOT JSR SETVID LDA ROM LDA ROM LDA #0 STA BASIC JMP RESTART * * UNUSED (to end of source code) * DS 3,0 * * STA TEMP1 STA BYTVAL STA BYTVAL+1 RTS JSR RSET0 STY RUNINTRC RTS JSR SAVFMW LDX STKSAVE TXS JSR CLOSEALL TSX STX STKSAVE LDA #9 JMP SETERROR SAV OBJ/DECKARD/SST.RWTS