PL 58 ; PAGE LENGTH OF PRINTER DEBUG EQU $0 ; 0 = NO, 1 = YES ZEROPG EQU $03 ZPGTOP EQU $8F COLD1 EQU $1200 ; WHERE TO ENTER THE REST OF THE CODE INCLUDE EQ.ASM INCLUDE HARDEQ.ASM PAGE STTL "--- MACHINE AUTOBOOT: CBM64 ---" ; ------------------ ; THE VERY BEGINNING ; ------------------ ORG EZIP ; 'CBM' IS AUTOBOOT RECOGNITION CODE ; $00,$0C = TELLS AUTOBOOT TO READ REST IN STARTING AT $C00 ; $00,$02 = READ IN 2 PAGES, $00 = NO DISK CODE, $00 = NO FILE NAME DB 'C','B','M' DB $00,$0C,$00,$02,$00,$00 LDA COLMODE ; 1ST MAKE SURE IN 40 COLUMN MODE CMP #$80 ; TO DISPLAY 80 COL MONITOR NEEDED MSG BNE OK40 JSR SWAPPER ; INTO 40 COL MODE OK40: LDA #$0B ; DARK GRAY STA EXTCOL ; BORDER STA BGCOLO ; BACKGRND STA FRCOLO ; FORGRND COLOR REG LDY #>COLRAM STY I+HI LDY #BI0 ; "I0:" LDA #BI0L ; LENGTH OF FILENAME JSR RSETNAM JMP ROPEN ; OPEN THE DISK (CARRY CLEAR IF OK) ; -------------------------- ; OPEN DIRECT ACCESS CHANNEL ; -------------------------- BPOUND: DB "#" BPNDL EQU $-BPOUND BAOPEN: LDA #0 ; STA SPENA ; SHUT OFF CURSOR DMA JSR BACLOSE ; CLOSE FIRST LDA #2 ; D/A CHANNEL ID TAY ; SECONDARY ID LDX DRIVE JSR RSETLFS LDX #BPOUND ; "#" LDA #BPNDL JSR RSETNAM JMP ROPEN ; OPEN CHANNEL (CARRY CLEAR IF OK) ; ------------------- ; CLOSE CURRENT DRIVE ; ------------------- BDCLOSE: LDA #15 ; CLOSE COMMAND CHANNEL JSR RCLOSE ; FALL THROUGH ... ; --------------------- ; CLOSE THE D/A CHANNEL ; --------------------- BACLOSE: LDA #2 ; AND THE JMP RCLOSE ; DATA CHANNEL ; ---------------- ; DIVIDE [A] BY 10 ; ---------------- ; EXIT: QUOTIENT IN [X], REMAINDER IN [A] BDIV10: LDX #0 ; START WITH ZERO QUOTIENT BD10L: CMP #10 ; IF DIVISOR < 10, BCC BD10EX ; WE'RE DONE SBC #10 ; ELSE SUBTRACT ANOTHER 10 INX ; UPDATE QUOTIENT BNE BD10L ; BRANCH ALWAYS BD10EX: RTS ; --------------- ; SEND Ux COMMAND ; --------------- ; ENTRY: ASCII "1" OR "2" IN [A] BCOMLIN: DB "U" BDCOMM: DB "*" DB ":2,0," BDTRAK: DB "***," BDSECT: DB "***" DB EOL BCMLL EQU $-BCOMLIN BSENDU: STA BDCOMM ; INSERT COMMAND ("1" OR "2") IN STRING ; CONVERT [TRACK] AND [SECTOR] TO ASCII IN [COMLIN] LDA TRACK LDY #2 BTCON: JSR BDIV10 ; DIVIDE BY 10 ORA #'0' ; CONVERT TO ASCII STA BDTRAK,Y ; STORE INTO STRING TXA ; GET QUOTIENT INTO [A] DEY ; ZERO-FILL USUSED BYTES BPL BTCON LDA SECTOR ; SAME FOR SECTOR ID LDY #2 BSCON: JSR BDIV10 ORA #'0' STA BDSECT,Y TXA DEY BPL BSCON ; SEND COMMAND JSR RCLRCHN LDX #15 ; OUTPUT TO THE JSR RCHKOUT ; COMMAND CHANNEL BCS BUEX ; EXIT W/CARRY SET IF ERROR LDY #0 BSCM0: LDA BCOMLIN,Y ; SEND THE COMMAND LINE JSR RCHROUT ; TO THE DRIVE CHANNEL INY ; A BYTE AT A TIME CPY #BCMLL BCC BSCM0 CLC ; SUCCESS! BUEX: RTS ; ---------------------- ; SET THE BUFFER POINTER ; ---------------------- BBPLINE: DB "B-P:2,0" DB EOL BBPLL EQU $-BBPLINE BSETBP: JSR RCLRCHN LDX #15 ; OUTPUT TO JSR RCHKOUT ; COMMAND CHANNEL BCS BBEX ; CARRY SET IF ERROR LDY #0 BSBPL: LDA BBPLINE,Y JSR RCHROUT INY CPY #BBPLL BCC BSBPL CLC BBEX: RTS ; ------------------------------ ; READ/WRITE A BLOCK TO [IOBUFF] ; ------------------------------ ; ENTRY: [TRACK] = TRACK # (1-35) ; [SECTOR] = SECTOR # (0-15) ; [DRIVE] = DRIVE ID (8 OR 9) ; CARRY CLEAR TO READ, CARRY SET TO WRITE BDISK: BCS BDWRITE ; WRITE IF CARRY SET ; READ A DISK BLOCK JSR BAOPEN ; OPEN THE ACCESS CHANNEL BCS BBADISK LDA #'1' ; SEND A "U1" COMMAND JSR BSENDU BCS BBADISK ; CARRY SET IF ERROR JSR BSETBP ; SET THE BUFFER POINTER BCS BBADISK ; CARRY SET IF ERROR JSR RCLRCHN LDX #2 ; INPUT FROM JSR RCHKIN ; DATA CHANNEL BCS BBADISK LDY #0 BREAD1: JSR RCHRIN ; GET A BYTE STA IOBUFF,Y ; MOVE TO I/O BUFFER INY BNE BREAD1 ; DO 256 BYTES BEQ BSHUTD ; THEN EXIT ; WRITE A BLOCK BDWRITE: JSR BAOPEN ; OPEN THE ACCESS CHANNEL BCS BBADISK JSR BSETBP ; SET THE BUFFER POINTER BCS BBADISK ; CARRY SET IF ERROR JSR RCLRCHN LDX #2 ; OUTPUT TO JSR RCHKOUT ; DATA CHANNEL BCS BBADISK ; CARRY SET IF ERROR LDY #0 BWRITE1: LDA IOBUFF,Y ; SEND CONTENTS OF [IOBUFF] JSR RCHROUT ; TO THE DRIVE INY BNE BWRITE1 ; WRITE 256 BYTES LDA #'2' ; ISSUE A "U2" COMMAND JSR BSENDU BCS BBADISK ; CARRY SET IF ERROR BSHUTD: JSR RREADST AND #%10000011 BNE BBADISK JSR RCLRCHN CLC ; CARRY CLEAR FOR SUCCESS RTS BBADISK: JSR RCLRCHN SEC RTS ; OR SET IF ERROR ORG $DFF ; just to fill out the sector with ; 'ff's, curtesy of the assembler! DB $AA ; MARKER END