mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-09 01:31:14 +00:00
188 lines
3.2 KiB
NASM
188 lines
3.2 KiB
NASM
;
|
||
; 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
|
||
|
||
|
||
|
||
|
||
|