NAM NEWDISK FOR 6800 OPT PAG * NEWDISK 5 INCH * * Michael Holley Dec. 1981 * Disk formatting program for 6800 FLEX * This version designed for DC-5 controller * * Latest revision July 2001 * TEMPORARY STORAGE ORG $0020 TRACK RMB 1 SECTOR RMB 1 BADCNT RMB 1 BAD SECTOR COUNT DRN RMB 1 DRIVE NUMBER SIDE RMB 1 DBSDF RMB 1 INDEX1 RMB 2 INDEX2 RMB 2 INDEX3 RMB 2 SECCNT RMB 2 SECTOR COUNTER FSTAVL RMB 2 FIRST AVAILABLE LSTAVL RMB 2 LAST AVAILABLE MAXS0 RMB 1 MAX SIDE 0 SECTOR MAXS1 RMB 1 MAX SIDE 1 SECTOR MAX RMB 1 MAX SECTOR FKFCB RMB 4 VOLNAM RMB 11 VOLNUM RMB 2 * General equates used in NEWDISK FIRST EQU $0101 FIRST USED SECTOR FCS EQU 30 FCB CURRENT SECTOR FSB EQU 64 FCB SECTOR BUFFER IRS EQU 16 INFO RECORD START AVLP EQU FSB+IRS+13 DIRSEC EQU 5 FIRST DIR. SECTOR RDSS EQU 9 READ SS FMS CODE WTSS EQU 10 WRITE SS FMS CODE MAXTRK EQU 35 NUMBER OF TRACKS LAST EQU MAXTRK-1 LAST TRACK NUMBER SMAXS0 EQU 10 SD MAX SIDE 0 SECTORS SMAXS1 EQU SMAXS0*2 SD MAX SIDE 1 SECTORS * TOTAL SECTORS = (MAXTRK-1)*MAXS TOTSS EQU LAST*SMAXS0 TOTAL SECTORS SINGLE SIDED TOTDS EQU LAST*SMAXS1 TOTAL SECTORS DOUBLE SIDED * LAST SECTOR = $MAXTRK-1,$MAXS LASTSS EQU LAST*256+SMAXS0 LAST AVAIL SECTOR SS LASTDS EQU LAST*256+SMAXS1 LAST AVAIL SECTOR DS SSMAP EQU SSMAP5 TST EQU 00 TRACK START VALUE (8"=40 5"=0) SST EQU 07 SECTOR START (8"=73 5"=7) GAP EQU 14 SECTOR GAP (8"=27 5"=14) * TRACK SIZE MUST BE AN EVEN NUMBER TKSZ EQU 3050 TRACK SIZE (8"=5100 5"=3050) * Work space where one track of data is setup WORK EQU $0100 WORK SPACE SWKEND EQU TKSZ+WORK * FLEX LOCATIONS SSTACK EQU $A07F SMONTH EQU $AC0E DOS DATE SDAYMN EQU $AC0F SYEARN EQU $AC10 * FLEX ROUTINES EQUATES WARMST EQU $AD03 GETCHR EQU $AD15 PUTCHR EQU $AD18 INBUFF EQU $AD1B PSTRNG EQU $AD1E PRCRLF EQU $AD24 GETFIL EQU $AD2D OUTDEC EQU $AD39 OUTHEX EQU $AD3C GETHEX EQU $AD42 INDECM EQU $AD48 FMSCAL EQU $B406 * DISK DRIVER ROUTINES DWRITE EQU $BE83 WRITE A SINGLE SECTOR DRSTOR EQU $BE89 RESTORE HEAD DSEEK EQU $0000 SEEK TO TRACK DRVREG EQU $8014 FDC DRIVE SELECT COMREG EQU $8018 FDC COMMAND REG TRKREG EQU $8019 FDC TRACK REG SECREG EQU $801A FDC SECTOR REG DATREG EQU $801B FDC DATA REG DRQREG EQU $8014 FDC STATUS DRQ-INTRQ PAG ORG $A100 ************************************************* * MAIN PROGRAM STARTS HERE ************************************************* STARTR BRA FORM1 VN FCB 5 VERSION NUMBER OUTIN JSR PSTRNG OUTPUT STRING OUTIN2 JSR GETCHR GET RESPONSE ANDA #$5F MAKE IT UPPER CASE CMPA #'Y SEE IF "YES" RTS FORM1 LDS #SSTACK JSR GETHEX GET DRIVE NUMBER BCC FORM12 BR IF GOOD NUMBER FORM11 JMP EXIT FORM12 STX INDEX3 LDAA INDEX3+1 CMPA #3 BHI FORM11 ENSURE 0 TO 3 LDX #WORK STAA $03,X STAA DRN DRIVE NUMBER LDX #SURES ARE YOU SURE JSR OUTIN BNE FORM23 LDX #SCRDS SCRATCH DISK JSR PSTRNG LDX #WORK+2 CLR 0,X CLRB JSR OUTDEC PRINT DRIVE NUMBER LDAA #'? JSR PUTCHR LDAA #' SPACE JSR PUTCHR JSR OUTIN2 BEQ FORM24 FORM23 JMP EXIT FORM24 CLR DBSDF INITALIZE SINGLE SIDED *BRA FORM25 SKIP QUESTION LDX #DBST DOUBLE SIDED JSR OUTIN BNE FORM25 INC DBSDF FORM25 LDX #NMSTR NAME JSR PSTRNG JSR INBUFF GET LINE LDX #FKFCB FAKE FCB JSR GETFIL FORM27 LDX #NUMSTR NUMBER JSR PSTRNG JSR INBUFF JSR INDECM BCS FORM27 GET GOOD VOLUME NUMBER STX VOLNUM JSR PRCRLF LDX #WORK JSR DRSTOR RESTORE DISK BCS EXIT BNE EXIT4 WRITE PROTECT ERROR ************************************************ * ACTUAL FORMAT ROUTINE FORMAT LDX #WORK FORM30 CLR 0,X CLEAR RAM BUFFER INX CPX #SWKEND BNE FORM30 NOP SEI HEADER LDX #WORK LDA B #$FF HEAD1 STA B 0,X INX CPX #WORK+TST+1 BNE HEAD1 LDA B #$FC INDEX MARK STA B 6,X CLR TRACK CLR SIDE FORM32 LDX #WORK+SST TST SIDE BNE FORM4 CLR SECTOR FORM4 BSR DOSEC PROCESS RAM WITH INFO INC SECTOR ADVANCE TO NEXT LDAA SECTOR CHECK VALUE TST SIDE CHECK SIDE BNE FORM45 CMPA #SMAXS0 BNE FORM4 REPEAT UNTIL LAST SECTOR BRA FORM47 FORM45 CMPA #SMAXS1 BNE FORM4 REPEAT UNTIL LAST SECTOR FORM47 JSR WRTTRK TST DBSDF ONE SIDE? BEQ FORM6 TST SIDE BNE FORM6 INC SIDE BRA FORM32 FORM6 INC TRACK LDAA TRACK CMPA #MAXTRK BNE FORM7 REPEAT UNTIL LAST TRACK JMP SETUP DONE...GO FINISH UP FORM7 STAA TRACK JSR SEEK CLR SIDE BRA FORM32 * EXIT ROUTINES EXIT LDX #ABORTS EXIT2 JSR PSTRNG JMP WARMST EXIT4 LDX #WPST WRITE PROTECTED BRA EXIT2 *********************************************** SSMAP5 FCB 1,3,5,7,9,2,4,6,8,10 FCB 11,13,15,17,19,12,14,16,18,20 SSMAP8 FCB 1,6,11,3,8,13,5,10 FCB 15,2,7,12,4,9,14 FCB 16,21,26,18,23,28,20,25 FCB 30,17,22,27,19,24,29 * PROCESS SECTOR IN RAM DOSEC LDAA #$FE ID ADDRESS MARK STAA 6,X LDAA #1 SECTOR NUMBER STAA 10,X LDAA TRACK STAA 7,X LDAB SECTOR STX INDEX1 SAVE INDEX LDX #SSMAP POINT TO SECTOR MAP BSR ADDXB POINT TO SECTOR NUMBER LDAB 0,X GET SECTOR NUMBER LDX INDEX1 RESTOR INDEX TST 7,X TRACK NUMBER BNE DOSEC1 BR NOT TRACK 0 CMPB #$01 BHI DOSEC1 BR NOT SECTOR 0 OR 1 * THERE IS NO SECTOR 1 ON TRACK 0 DECB MAKE IT SECTOR 0 STAB 9,X SECTOR NUMBER INCB BRA DOSEC2 DOSEC1 STAB 9,X SECTOR NUMBER DOSEC2 INCB TST DBSDF BNE DOSEC3 BR DOUBLE SIDED CMPB #SMAXS0+1 END OF TRACK BRA DOSEC4 DOSEC3 CMPB #SMAXS1+1 END OF TRACK DOSEC4 BNE DOSEC7 BR IF NOT INCA INC SECTOR NUMBER LDAB #1 RESET SECTOR NUMBER CMPA #MAXTRK END OF DISK BNE DOSEC7 BR IF NOT CLRA SET ZERO FORWARD LINK CLRB DOSEC7 STAA 30,X FOWARD LINK STAB 31,X LDAA #$FB ADDRESS MARK STAA 29,X JUST BEFORE DATA LDAA #$F7 SET CRC CODE STAA 11,X LDAB #128 HALF A SECTOR BSR ADDXB ADD 128 TO INDEX STAA 128+30,X STORE "F7" AFTER 256 BYTES LDAB #158+GAP HALF A SECTOR +30+GAP * ADD ACCB TO INDEX ADDXB STX INDEX3 ADDB INDEX3+1 STAB INDEX3+1 BCC ADDXB9 INC INDEX3 ADDXB9 LDX INDEX3 RTS ************************************************* * DISK TESTING AND TABLE SETUP * Read all sectors for errors SETUP TST DBSDF BNE SETU01 BR IF DOUBLE SIDED LDX #TOTSS TOTAL SECTORS STX SECCNT SAVE IT LDX #LASTSS BRA SETU02 SETU01 LDX #TOTDS TOTAL SECTORS STX SECCNT LDX #LASTDS SETU02 STX LSTAVL LDX #FIRST SET FIRST AVAIL STX FSTAVL LDAA DRN DRIVE NUMBER STAA WORK+3 CLRA STAA BADCNT STAA TRACK SET TRACK 0 STAA SECTOR SET SECTOR 0 SETUP2 BSR CHKSEC GO CHECK SECTOR BNE REMSEC ERRORS? CLR BADCNT CLEAR COUNT SETUP4 LDAA TRACK LDAB SECTOR BSR FIXSEC GET NEXT ADR BNE SETUP5 JMP DOTRK BR IF FINISHED SETUP5 STAA TRACK STAB SECTOR BRA SETUP2 * CHECK IF SECTOR GOOD CHKSEC LDX #WORK POINT TO FCB LDAA TRACK STAA FCS,X SET CURRENT TRK LDAA SECTOR STAA FCS+1,X SET CURRENT TRK JMP READSS * SET TRACK & SECTOR TO NEXT FIXSEC INCB TSTA BNE FIXSE1 CMPB #1 BNE FIXSE1 INCB FIXSE1 TST DBSDF BNE FIXSE2 BR IF DOUBLE SIDED CMPB #SMAXS0+1 END OF SIDE 0 BRA FIXSE3 FIXSE2 CMPB #SMAXS1+1 END OF SIDE 1 FIXSE3 BNE FIXSE4 INCA NEXT TRACK LDAB #1 SECTOR NUMBER 1 CMPA #MAXTRK END OF DISK FIXSE4 RTS * REMOVE BAD SECTOR FROM FREE SECTOR CHAIN REMSEC INC BADCNT UPDATE COUNTER BEQ REMSE1 OVERFLOW? LDAA TRACK BNE REMSE2 TRACK 0? LDAB SECTOR CMPB #DIRSEC PAST DIRECTORY? BHI REMSE2 REMSE1 LDX #FATERS REPORT FATAL ERROR JMP EXIT2 REMSE2 LDX #WORK POINT TO FCB LDAA FSTAVL GET 1ST TRACK LDAB FSTAVL+1 AND SECTOR CMPA TRACK CHECK TRACK BNE REMSE3 CMPB SECTOR BNE REMSE3 BSR FIXSEC SET TO NEXT STAA FSTAVL STAB FSTAVL+1 BRA REMSE8 REMSE3 LDAA TRACK LDAB SECTOR SUBB BADCNT BEQ REMS35 UNDERFLOW? BPL REMSE4 REMS35 DECA DEC TRACK TST DBSDF BNE REMS36 LDAB #SMAXS0 MAX SIDE 0 BRA REMSE4 REMS36 LDAB #SMAXS1 SIDE 1 REMSE4 STAA FCS,X SET CURRENT ADR STAB FCS+1,X BSR READSS GO DO READ BNE REMSE1 ERROR? LDAA FSB,X GET LINK ADR LDAB FSB+1,X BSR FIXSEC POINT TO NEXT BNE REMSE6 OVERFLOW? LDAA FCS,X GET CURRENT ADDRESS LDAB FCS+1,X STAA LSTAVL SET NEW LAST AVAIL STAB LSTAVL+1 CLRA SET END LINK CLRB REMSE6 STAA FSB,X SET NEW LINK STAB FSB+1,X BSR WRITSS GO DO WRITE BNE REMSE1 REMSE8 LDX SECCNT GET SEC COUNT DEX SUBTRACT ONE SECTOR STX SECCNT SAVE NEW COUNT LDX #BADSS REPORT BAD SECTOR JSR PSTRNG OUTPUT IT LDX #TRACK POINT TO ADDRESS JSR OUTHEX LDAA #' SPACE JSR PUTCHR INX POINT TO SECTOR JSR OUTHEX JMP SETUP4 CONTINUE * READ A SECTOR READSS LDX #WORK POINT TO FCB LDAA #RDSS SET UP COMMAND STAA 0,X JMP FMSCAL GO DO IT * WRITE A SECTOR WRITSS LDX #WORK POINT TO FCB LDAA #WTSS STAA 0,X JSR FMSCAL GO DO IT BEQ READSS ERRORS? RTS ERROR RETURN * SETUP SYSTEM INFORMATION RECORD DOTRK LDX #WORK CLR FCS,X SET TO DIS LDAA #3 SECTOR 3 STAA FCS+1,X JSR READSS READ IN SIR SECTION BNE DOTRK4 ERROR? LDX #WORK FIX POINTER CLR FSB,X CLEAR FOWARD LINK CLR FSB+1,X LDAA FSTAVL ADDR OF 1ST FREE SECTOR LDAB FSTAVL+1 STAA AVLP,X SET IN SIR STAB AVLP+1,X LDAA LSTAVL ADDR OF LAST FREE SECTOR LDAB LSTAVL+1 STAA AVLP+2,X PUT IN SIR STAB AVLP+3,X LDAA SECCNT GET TOTAL SECTORS LDAB SECCNT+1 STAA AVLP+4,X STAB AVLP+5,X TST DBSDF BNE DOTR21 LDAA #SMAXS0 MAX SINGLE SIDED BRA DOTR22 DOTR21 LDAA #SMAXS1 MAX DOUBLE SIDED DOTR22 STAA AVLP+10,X LDAA #MAXTRK-1 STAA AVLP+9,X LDAA SMONTH LDAB SDAYMN STAA AVLP+6,X STAB AVLP+7,X LDAA SYEARN STAA AVLP+8,X LDAB #13 LENGHT OF NAME & NUMBER LDX #VOLNAM POINT TO VOLUME NAME STX INDEX2 SAVE INDEX LDX #WORK DOTR33 STX INDEX1 SAVE INDEX LDX INDEX2 LDAA 0,X INX STX INDEX2 LDX INDEX1 STAA FSB+IRS,X INX DECB BNE DOTR33 JSR WRITSS WRITE SIR BACK OUT BEQ DIRINT DOTRK4 JMP REMSE1 GO REPORT ERROR * INITIALIZE DIRECTORY DIRINT LDX #WORK TST DBSDF BNE DIRIN1 BR IF DOUBLE SIDED LDAA #SMAXS0 MAX SECTORS BRA DIRIN2 DIRIN1 LDAA #SMAXS1 MAX SECTORS DOUBLE SIDED DIRIN2 STAA FCS+1,X JSR READSS READ IN SECTOR BNE DOTRK4 ERRORS? LDX #WORK RESTORE POINTER CLR FSB,X CLEAR LINK CLR FSB+1,X JSR WRITSS WRITE SECTOR BACK BNE DOTRK4 ERRORS? * SAVE BOOT ON TRACK 0 SECTOR 0 DOBOOT LDX #BOOT POINT TO LOADER CLRA TRACK #0 CLRB SECTOR #0 JSR DWRITE WRITE THE SECTOR BNE DOTRK4 ERRORS? * REPORT TOTAL SECTORS AND EXIT LDX #WORK SETUP AN FCB LDAA #16 OPEN SIR FUNCTION STAA 0,X JSR FMSCAL OPEN SIR BNE DOTRK4 LDAA #7 GET INFO RECORD FUNCTION STAA 0,X JSR FMSCAL GET 1ST INFO RECORD BNE DOTRK4 LDX #CMPLTE FORMATTING COMPLETE JSR PSTRNG REPORT IT LDX #WORK+21 TOTAL IS IN INFO RECORD CLRB JSR OUTDEC JMP WARMST ALL FINISHED! ************************************************** * WRITE TRACK ROUTINE * COMMANDS WTCMD EQU $F4 WRITE TRACK SKCMD EQU $1B SEEK COMMAND WRTTRK LDAA DRN Get drive number TST SIDE BEQ SELSID ORAA #$40 Select side 1 SELSID STAA DRVREG JSR DELAY LDX #WORK POINT TO DATA LDAA #WTCMD WRITE TRACK STAA COMREG ISSUE COMMAND LDA B 0,X GET FIRST DATA BYTE JSR DELAY WRTTR2 LDAA DRQREG CHECK STATUS BMI WRTTR3 DRQ READY AND A #$C0 MASK SWITCH BEQ WRTTR2 LOOP UNTIL SO BRA WRTTR8 DONE WRTTR3 STA B DATREG SEND TO DISK INX LDA B 0,X GET NEXT DATA BYTE INX WRTTR4 LDA A DRQREG CHECK STATUS BMI WRTTR5 DRQ READY AND A #$C0 MASK SWITCH BEQ WRTTR4 LOOP UNTIL SO BRA WRTTR8 DONE WRTTR5 STA B DATREG SEND TO DISK LDA B 0,X GET NEXT BYTE CPX #SWKEND BNE WRTTR2 BSR WAIT WRTTR8 RTS SEEK STAA DATREG LDAA #SKCMD STAA COMREG JSR DELAY WAIT LDAA COMREG BITA #$01 BNE WAIT RTS DELAY JSR DELAY2 DELAY2 JSR DELAY4 DELAY4 RTS * STRINGS SURES FCC "ARE YOU SURE? " FCB $04 WPST FCC "DISK IS PROTECTED!" FCB $04 SCRDS FCC "SCRATCH DISK IN DRIVE " FCB $04 FATERS FCC "FATAL ERROR --- " ABORTS FCC "FORMATTING ABORTED" FCB $04 BADSS FCC "BAD SECTOR AT " FCB $04 CMPLTE FCC "FORMATTING COMPLETE" FCB $0D,$0A,$00,$00,$00 FCC "TOTAL SECTORS = " FCB $04 DBST FCC "DOUBLE SIDED DISK? " FCB $04 TRK40 FCC "40 TRACKS? " FCB $04 TRK80 FCC "80 TRACKS? " FCB $04 NMSTR FCC "VOLUME NAME? " FCB $04 NUMSTR FCC "VOLUME NUMBER? " FCB $04 PAG ************************************************** * 6800 Bootstrap Loader for double sided disk * Michael Holley July 2 2001 * LINKT EQU $2405 LINKS EQU LINKT+1 XFER EQU LINKS+1 BTEMP EQU XFER+2 BTEMPX EQU BTEMP+2 SCTBUF EQU $2500 Must be after LOAD99 BSIZE EQU LOAD99-BOOT * Western Digital Commands DRQ EQU $02 DRQ BIT MASK BUSY EQU $01 BUSY MASK RDMSK EQU $1C READ ERROR MASK VERMSK EQU $18 VERIFY ERROR MASK WTMSK EQU $5C WRITE ERROR MASK RDCMND EQU $8C READ COMMAND WTCMND EQU $AC WRITE COMMAND RSCMND EQU $0B RESTORE COMMAND SKCMND EQU $1B SEEK COMMAND * System Equates *DRVREG EQU $8014 FDC DRIVE SELECT *COMREG EQU $8018 FDC COMMAND REG *TRKREG EQU $8019 FDC TRACK REG *SECREG EQU $801A FDC SECTOR REG *DATREG EQU $801B FDC DATA REG *DRQREG EQU $8014 FDC STATUS DRQ-INTRQ *SSTACK EQU $A07F *SMAXS0 EQU 10 SD MAX SIDE 0 SECTORS * ORG $2400 BOOT LDS #SSTACK BRA RESTOR FCB $00,$01,$00,$00,$00,$00,$00,$00 * Select side based on sector number XSIDE LDAA #$40 Select Side One CMPB #SMAXS0 Sector number in B BHI XSIDE1 CLRA Select Side Zero XSIDE1 STAA DRVREG RTS * Restore to track 00 RESTOR LDAA #RSCMND STAA COMREG BSR DEL28 BSR XWAIT BSR BOOT1 BRA LOAD1 BOOT1 LDAA LINKT STARTING TRACK LDAB LINKS STARTING SECTOR BOOT2 BSR XSEEK LDAA #RDCMND STAA COMREG BSR DEL28 LDAB #$00 LDX #SCTBUF BOOT3 LDAA COMREG Get status BITA #DRQ Data Reg Full? BNE BOOT4 BITA #BUSY BNE BOOT3 More comming BRA BOOT Restart BOOT4 LDAA DATREG Get Data STAA 0,X Store in buffer INX DECB Count to 256 BNE BOOT3 BSR XWAIT BITB #RDMSK CRC or not found BNE BOOT LDX #SCTBUF+4 POINT PAST LINK BOOT5 STX BTEMPX RTS * XSEEK The Specified Track * Track in ACC A, Sector in ACC B XSEEK CMPA TRKREG BEQ XSEEK9 STAA DATREG BSR DEL28 LDAA #SKCMND SEEK COMMAND STAA COMREG ISSUE SEEK COMMAND BSR DEL28 PSHB BSR XWAIT PULB XSEEK9 STAB SECREG BSR XSIDE DEL28 BSR DEL14 DEL14 BSR DEL DEL RTS XWAIT LDAB COMREG GET STATUS BITB #BUSY CHECK IF BUSY BNE XWAIT RTS GETCH LDX BTEMPX Check for end of buffer CPX #SCTBUF+256 BEQ GETCH2 LDAA 0,X INX BRA BOOT5 Store Xtemp and Return GETCH2 LDX #SCTBUF LDAA 0,X LDAB $01,X BSR BOOT2 BRA GETCH LOAD1 BSR GETCH Get a byte from buffer CMPA #$02 Data Record Header BEQ LOAD2 CMPA #$16 XFR Address Header BNE LOAD1 Loop if neither BSR GETCH Get transfer address MSB STAA XFER BSR GETCH Get LSB STAA XFER+1 LDX XFER JMP 0,X LOAD2 BSR GETCH Get Load Address PSHA BSR GETCH Get next byte PULB ACC A to ACC B Trick STAA BTEMP+1 STAB BTEMP BSR GETCH Get a byte count TAB Save BEQ LOAD1 BR if count=0 LOAD3 PSHB BSR GETCH Get next byte PULB LDX BTEMP Get Load Address STAA 0,X INX STX BTEMP DECB End of Data Record? BNE LOAD3 BRA LOAD1 Get another record LOAD99 NOP END STARTR