* SUPER-BOOT FOR DC-2 - TYPE CONTROLLERS * POSITION-INDEPENDENT CODE FOR SK*DOS * (C) 1984 BY PETER A. STARK * SUPER BOOT EQUATES CMDREG EQU $E018 FDC COMMAND REGISTER STAREG EQU CMDREG FDC STATUS REGISTER TRKREG EQU $E019 FDC TRACK REGISTER SECREG EQU $E01A FDC SECTOR REGISTER DATREG EQU $E01B FDC DATA REGISTER INCHE EQU $F806 MONITOR INPUT CHARACTER WITH ECHO MPSTRN EQU $F810 MONITOR PSTRNG ROUTINE MONITR EQU $F814 MONITOR RE-ENTRY POINT BOOT BRA BOOT1 FCC 'DC2' FOR DC-2 CONTROLLER FIRSTS FDB $0000 FIRST TRACK-SECTOR OF DOS BOOT1 LDS #$C980 POSITION STACK LDA #$0B STA CMDREG RESTORE, LOAD HEAD, SLOW STEP LBSR WAIT GIVE IT TIME LDD FIRSTS,PCR FIRST TR-SEC IS NOW ... STD TRSEC,PCR NEXT TR-SEC LBEQ ERROR BUT QUIT IF MISSING CLR DATPTR,PCR CLEAR DATA POINTER LDX #$FFFF STX TRADDR,PCR ERASE TRANSFER ADDRESS BSR WNBUSY THEN WAIT FOR NOT BUSY * MAIN READ LOOP MLOOP BSR GETBYT GET A BYTE CMPA #2 DATA FOLLOWS? BEQ RDDATA YES, GO READ IT CMPA #$16 ADDRESS FOLLOWS? LBEQ RDADDR YES, GO GET IT BRA MLOOP ELSE REPEAT * GETBYT ROUTINE - GET NEXT BYTE FROM FILE GETBYT LDB DATPTR,PCR GET DATA POINTER BNE GETBY1 OK TO CONTINUE IF NOT 0 BSR GETSEC ELSE GET SECTOR GETBY1 LEAX SBBUFF,PCR POINT TO SBBUFF ABX POINT TO BYTE INC DATPTR,PCR BUMP POINTER LDA 0,X GET BYTE RTS RETURN WITH BYTE IN A AND CC SET * GETSEC - GET NEXT SECTOR GETSEC LDD TRSEC,PCR NEXT TR-SEC LBEQ DONE NEXT IS 00-00 SO END STB SECREG GIVE SECTOR TO FDC CMPA TRKREG ALREADY ON RIGHT TRACK? BEQ TRKOK YES STA DATREG NO, GIVE TRACK TO FDC BSR WAIT LDA #$1B STA CMDREG SEEK, LOAD, SLOW STEP RATE BSR WAIT BSR WNBUSY WAIT FOR COMPLETION TRKOK LDA #$8C STA CMDREG READ COMMAND BSR WAIT CLRB COUNTER = 256 LEAX SBBUFF,PCR POINT TO SBBUFF RDLOOP LDA STAREG BITA #2 DRQ? BNE GETDAT YES, GET THE DATA BITA #1 BUSY? BNE RDLOOP YES, WAIT FOR IT BRA ERROR ON ERROR QUIT GETDAT LDA DATREG GET DATA STA 0,X+ SAVE IT DECB DECREMENT COUNTER BNE RDLOOP REPEAT UNTIL DONE BSR WAIT BSR WNBUSY WAIT FOR READY BITB #$1C RNF, CRC, LD ERRORS BNE ERROR LDB #4 STB DATPTR,PCR NEXT BYTE IS BYTE 4 RTS AND QUIT * WAIT LOOP WAIT LDB #32 WAIT1 DECB BNE WAIT1 RTS * WNBUSY - WAIT FOR NOT BUSY WNBUSY LDB STAREG CHECK STATUS BITB #1 CHECK BUSY FLAG BNE WNBUSY WAIT IF STILL BUSY RTS ELSE RETURN WITH B=STATUS * RDDATA - READ DATA FROM SECTOR RDDATA BSR GETBYT PSHS A BSR GETBYT TFR A,B PULS A GET LOAD ADDRESS TFR D,Y INTO Y REG BSR GETBYT GET COUNT BEQ ERROR IF COUNT = 0 TFR A,B RDMEM PSHS B SAVE COUNTER LBSR GETBYT GET NEXT BYTE PULS B STA 0,Y+ SAVE IT DECB DECREMENT COUNTER BNE RDMEM REPEAT UNTIL DONE LBRA MLOOP GO LOOK FOR MORE * RDADDR - READ ADDRESS FROM SECTOR RDADDR LBSR GETBYT STA TRADDR,PCR LBSR GETBYT STA TRADDR+1,PCR LBRA MLOOP GO GET MORE * WHEN DONE, CHECK TRANSFER ADDR AND GO DO IF OK DONE LDX TRADDR,PCR GET TRANSFER ADDRESS CMPX #$FFFF ANYTHING THERE? BEQ ERROR NO JMP 0,X ELSE GO TO PROGRAM * ERROR ROUTINE ERROR LEAX ERRMSG,PCR ERROR MESSAGE JSR [MPSTRN] PRINT IT JSR [INCHE] INPUT ANSWER CMPA #'Y YES? LBEQ BOOT YES JMP MONITR ELSE QUIT ERRMSG FCC 'AGN?',4 TRADDR RMB 2 TRANSFER ADDRESS DATPTR RMB 1 DATA POINTER SBBUFF RMB 256 TRSEC EQU SBBUFF NEXT TR-SEC IN 1ST TWO BYTES END BOOT