; ; disk stuff ; ; --------------- ; SEND U2 (write) COMMAND ; --------------- COMLIN: DB "U2:2,0," DTRAK: DB "***," DSECT: DB "***" DB EOL CMLL EQU $-COMLIN SENDU: ; CONVERT [TRACK] AND [SECTOR] TO ASCII IN [COMLIN] LDA TRACK LDY #2 TCON: JSR DIV10 ; DIVIDE BY 10 ORA #'0' ; CONVERT TO ASCII STA DTRAK,Y ; STORE INTO STRING TXA ; GET QUOTIENT INTO [A] DEY ; ZERO-FILL USUSED BYTES BPL TCON LDA SECTOR ; SAME FOR SECTOR ID LDY #2 SCON: JSR DIV10 ORA #'0' STA DSECT,Y TXA DEY BPL SCON ; SEND COMMAND JSR CLRCHN LDX #15 ; OUTPUT TO THE JSR CHKOUT ; COMMAND CHANNEL BCS UEX ; EXIT W/CARRY SET IF ERROR LDY #0 SCM0: LDA COMLIN,Y ; SEND THE COMMAND LINE JSR CHROUT ; TO THE DRIVE CHANNEL INY ; A BYTE AT A TIME CPY #CMLL BCC SCM0 CLC ; SUCCESS! UEX: RTS ; -------------------------- ; OPEN DIRECT ACCESS CHANNEL ; -------------------------- POUND: db "#" POUNDL equ $-POUND AOPEN: LDA #2 ; D/A CHANNEL ID JSR CLOSE ; close it first TAY ; SECONDARY ID LDX #8 ; always on drive 8 JSR SETLFS LDX #POUND ; "#" LDA #POUNDL ; to let disk pick buffer JSR SETNAM JMP OPEN ; OPEN CHANNEL (CARRY CLEAR IF OK) ; ---------------------- ; SET THE BUFFER POINTER ; ---------------------- BPLINE: DB "B-P:2,0" DB EOL BPLL EQU $-BPLINE SETBP: JSR CLRCHN LDX #15 ; OUTPUT TO JSR CHKOUT ; COMMAND CHANNEL BCS BEX ; CARRY SET IF ERROR LDY #0 SBPL: LDA BPLINE,Y JSR CHROUT INY CPY #BPLL BCC SBPL CLC BEX: RTS ; -------------- ; OPEN DRIVE [A] ; -------------- ; ENTRY: DISK ID (8 OR 9 BINARY) IN [A] I0: db "I0:" I0L equ $-I0 dopen: LDA #15 ; LOGICAL FILE # TAY ; SECONDARY ADDRESS LDX #8 ; DEVICE #8 JSR SETLFS ; SET UP LOGICAL FILE LDX #I0 ; "I0:" LDA #I0L ; LENGTH OF FILENAME JSR SETNAM JMP OPEN ; OPEN THE DISK (CARRY CLEAR IF OK) ; WRITE A BLOCK dwrite: JSR AOPEN ; OPEN THE ACCESS CHANNEL BCS BADISK JSR SETBP ; SET THE BUFFER POINTER BCS BADISK ; CARRY SET IF ERROR JSR CLRCHN LDX #2 ; OUTPUT TO JSR CHKOUT ; DATA CHANNEL BCS BADISK ; CARRY SET IF ERROR LDY #0 WRITE1: LDA IOBUFF,Y ; SEND CONTENTS OF [IOBUFF] JSR CHROUT ; TO THE DRIVE INY BNE WRITE1 ; WRITE 256 BYTES JSR SENDU BCS BADISK ; CARRY SET IF ERROR SHUTD: JSR READST AND #%10000011 BNE BADISK JSR CLRCHN CLC ; CARRY CLEAR FOR SUCCESS RTS BADISK: JSR CLRCHN SEC RTS ; OR SET IF ERROR ; ; nxtts - get the next track and sector ; nxtts: INC SECTOR ; NEXT SECTOR LDY TRACK ; CHECK IF NEXT TRACK DEY LDA SECTOR CMP TRKTBL,Y BCC SECTOK INC TRACK ; YES, RESET LDA #0 STA SECTOR LDA TRACK CMP #18 BNE DNOT18 INC SECTOR ; SKIP 1ST SECTOR TRACK 18 (DIRECTORY) BNE SECTOK DNOT18: ; check for sector 20 CMP #20 ; for fast code stuff BNE SECTOK INC SECTOR ; so skip over sector 0 SECTOK: RTS ; ; this table shows the last usable sector on the track + 1 ; i.e. 21 means there are sectors 0-20 on the track ; TRKTBL: DB 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21 DB 19,19,19,19,19,19,19 DB 18,18,18,18,18,18 DB 17,17,17,17,17