Files
erkyrath.infocom-zcode-terps/c-128/tftp/disk.asm
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

188 lines
3.2 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;
; 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 ; POINT TO FILENAME
LDY #>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 ; POINT TO FILENAME
LDY #>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