* DISASSEMBLY BY DYNAMITE OF 1.PRODOS.SYS * STANDARD PRE-NAMED LABEL EQUATES LINBUF EQU $C080 SYSFCB EQU $C840 RETADR EQU $CC43 BASFCB EQU $D409 CURFCB EQU $D40B * EXTERNAL LABEL EQUATES CMDREG EQU $F000 CMDREG TRKREG EQU $F001 TRKREG SECREG EQU $F002 SECREG DATREG EQU $F003 DATREG ORG $DE00 DREAD JMP READ READ Read a single sector DWRITE JMP WRITE WRITE Write a single sector DVERFY JMP VERIFY VERIFY Verify last sector written DRESTOR JMP RESTORE RESTORE Restore head to track #0 DDRIVE JMP DRIVE DRIVE Select the specified drive DCHECK JMP CHKRDY CHKRDY Check for drive ready DQUICK JMP QUICK QUICK Quick check for drive ready DCOLDS JMP INIT INIT Driver initialize (cold start) DWARMS JMP WARM WARM Driver initialize (warm start) DSEEK JMP SEEKIT SEEK Seek to specified track DRVTBL FCB $00 MAX SECTOR PER SIDE LDE1F FCB $DE,$DD,$DB,$D7 DRIVE PRESENT FCB $00 LDE24 FCB $00 CURRENT DRIVE LDE25 FCB $00,$00,$00,$00 DRIVE TRACK MEMORY REGISTER LDE29 FCB $00 COPY OF STATUS REG LDE2A FCB $00 CURRENT SIDE MASQ LDE2B FCB $00,$00 STEP RATE * INIT AND WARM * * DRIVER INITIALIZATION INIT LDX #$DE24 POINT TO VARIABLES LDB #8 NO. OF BYTES TO CLEAR LDE31 CLR 0,X+ CLEAR THE STORAGE DECB BNE LDE31 WARM LDA #$DF SET MASQ STA LE080 IN DRIVE REG RTS * READ This routine reads the specified sector into memory at the * specified address. This routine should perform a seek * operation if necessary. A sector is 256 bytes in length. * * ENTRY - (X) = Address in memory where sector is to be placed. * (A) = Track Number * (B) = Sector Number * * EXIT - (X) May be destroyed * (A) May be destroyed * (B) = Error condition * (Z) = 1 if no error * = 0 if an error READ BSR SEEKIT TST FBFLAG spooling active? BEQ LDE45 no - proceed SWI3 give spooler opportunity to run LDE45 ORCC #$50 disable FIRQ and IRQ LDA DATREG load command register (useless) LDA #$8C read sector command ORA LDE2A CURRENT SIDE MASQ STA CMDREG issue command JSR DELAY wait for WD2793 to accept command CLRB set byte counter LDE56 LDA CMDREG BITA #2 TEST DATA READY ? BNE LDE67 GET IT BITA #1 STILL BUSY ? BNE LDE56 LOOP TFR A,B BSR LDE84 BRA LDE71 LDE67 LDA DATREG STA 0,X+ STORE IN FCB DECB BNE LDE56 MORE TO COME ? BSR LDE76 LDE71 BITB #$1C ANDCC #$AF RTS LDE76 TST FBFLAG spooling active? BEQ LDE7D no - proceed SWI3 give spooler opportunity to run LDE7D LDB CMDREG BITB #1 STILL BUSY ? BNE LDE7D YES LOOP LDE84 STB LDE29 SAVES STATUS REG BITB #$10 RECORD NOT FOUND ERROR ? BEQ LDEAC NO, PROCEED LDY #LDE1F LDA LDE24 LDB A,Y BITB #$10 BEQ LDEB0 TST LDE23 BNE LDEA1 EORB #$20 STB A,Y *SET MAX SECTOR BY SIDE LDEA1 LDA #$0A MAX TRACK SD BITB #$20 BNE LDEA9 LDA #$12 LDEA9 STA LDE1E LDEAC LDB LDE29 RTS LDEB0 LDA #$0F BRA LDEA9 * SEEK Seeks to the track specified in the 'A' accumulator. In * double-sided systems, this routine should also select the * correct side depending on the sector number supplied in 'B'. * * ENTRY - (A) = Track Number * (B) = Sector Number * * EXIT - (X) May be destroyed (See text) * (A) May be destroyed (See text) * (B) = Error condition * (Z) = 1 if no error * = 0 if an error SEEKIT LBSR LDFB5 WAIT FOR DRIVE READY CLR LDE2A SIDE 1 CMPB DRVTBL COMPARE TO MAX SECTOR PER SIDE BLS LDEC5 SIDE 1, JUMP INC LDE2A MASQ FOR CURRENT SIDE INC LDE2A LDEC5 STB SECREG SET SECTOR CMPA TRKREG CHECK TRACK BEQ LDEE2 CURRENT TRACK ? STA DATREG NO, STORE NEW TRACK JSR DELAY LDA #$18 SET SEEK COMMAND ORA LDE2B SET INTERRUPT COMMAND STA CMDREG SET COMMAND JSR DELAY BSR LDE76 CHECK RECORD NOT FOUND ERROR ? BITB #$10 LDEE2 JMP DELAY DELAY AND RETURN * WRITE This routine writes the information from the specifed memory * buffer area to the disk sector specified. This routine should * perform a seek operation if necessary. A sector is 256 bytes * in length. * * ENTRY - (X) = Address of 256 memory buffer containing data * to be written to disk * (A) = Track Number * (B) = Sector Number * * EXIT - (X) May be destroyed * (A) May be destroyed * (B) = Error condition * (Z) = 1 if no error * = 0 if an error WRITE BSR SEEKIT TST FBFLAG BEQ LDEEE SWI3 LDEEE ORCC #$50 LDB DATREG LDB #$AC ORB LDE2A LDA 0,X+ STA DATREG STB CMDREG JSR DELAY LDB #2 LDF05 BITB CMDREG BEQ LDF0F LDF0A STA DATREG LDA 0,X+ LDF0F BITB CMDREG BNE LDF0A BITB CMDREG BNE LDF0A BITB CMDREG BNE LDF0A STA LDE29 LDA #1 BITA CMDREG BEQ LDF32 LDA LDE29 BITB CMDREG BNE LDF0A BRA LDF05 LDF32 JSR LDE76 BITB #$5C LDF37 ANDCC #$AF RTS * VERIFY The sector just written to the disk is to be verified to * determine if there are CRC errors. No seek is required as * this routine will only be called immediately after a write * single sector operation. * * ENTRY - No entry parameters * * EXIT - (X) May be destroyed * (A) May be destroyed * (B) = Error condition * (Z) = 1 if no error * = 0 if an error VERIFY BSR LDFB5 TST FBFLAG BEQ LDF43 SWI3 LDF43 ORCC #$50 LDA DATREG LDA #$8C ORA LDE2A STA CMDREG JSR DELAY JSR LDE76 BITB #$18 BRA LDF37 LDF5A PSHS X BSR DRIVE LDA #8 ORA LDE2B STA CMDREG JSR DELAY JSR LDE76 BITB #$D8 PULS X,PC * DRIVE The specified drive is to be selected. The drive is specified * in the FCB pointed to by the contents of the X register. Note * that the drive number is the 4th byte of the FCB. * * ENTRY - (X) = FCB address (3,X contains drive number) * * EXIT - (X) May be destroyed * (A) May be destroyed * (B) = $0F if non-existent drive * = Error condition otherwise * (Z) = 1 if no error * = 0 if an error * (C) = 0 if no error * = 1 if an error DRIVE LDA 3,X GET DRIVE NUMBER CMPA #3 ENSURE IT'S < 4 BLS LDF7B BRANCH IF OK LDF76 LDB #$0F ELSE SET ERROR VALUE ORCC #1 RTS RETURN LDF7B LDY #LDE1F DRIVE TRACK MEMORY REGISTER LDB A,Y GET CURRENT TRACK OF TARGET DRIVE BEQ LDF76 JSR LDFE1 FIND TRACK LDB TRKREG GET CURRENT TRACK STB 0,X SAVE IT IN REPOSITORY STA LDE24 SAVE CURRENT DRIVE LDB A,Y STB LDE29 SAVE TARGET TRACK JSR LDEA1 SET MAX SECTOR BY SIDE CLR LDE2B CLEAR STEP RATE BITB #$C0 BNE LDFA0 NOP NOP NOP LDFA0 STB LE080 SET NEW DRIVE BSR LDFE1 FIND NEW TRACK LDA 0,X GET IT STA TRKREG PUT NEW TRACK IN WD BSR LDFB5 WAIT FOR DRIVE READY LDB CMDREG BMI LDFDE LDFB1 CLRB ANDCC #$FE RTS * WAIT FOR DRIVE READY LDFB5 PSHS A,X LDX #L0000 LDFBA LEAX -1,X BEQ LDFC5 NOP NOP LDA CMDREG BMI LDFBA LDFC5 PULS A,X,PC CHKRDY BSR DRIVE BEQ LDFB5 LDB #$80 BRA LDFDE QUICK LDB CMDREG BMI LDFDE LEAX -1,X NOP LEAX 1,X LDB CMDREG BPL LDFB1 LDFDE ORCC #1 RTS * FIND TRACK LDFE1 LDX #LDE25 LDB LDE24 CURDRV BEQ LDFEA ABX LDFEA RTS DELAY BSR DEL1 DEL1 BSR LDFEF DEL2 BSR DEL3 DEL3 RTS END COLDS