2
0
Fork 0
original-tara/src/tara/disk.asm
2018-11-22 22:14:43 +01:00

234 lines
4.2 KiB
NASM

;---------------------
; D_FIELD : leest het veld in op 0x4000
;-------------------
D_FIELD:
LD HL,#D_FIELD_FIL
CALL GETNAM
CALL OPEN
CALL SETFCB
LD DE,#0x4000
CALL SETDMA
LD HL,#0x8000
CALL READ
JP CLOSE
D_FIELD_SAVE:
LD HL,#D_FIELD_FIL
CALL GETNAM
CALL CREATE
CALL SETFCB
LD DE,#0x4000
CALL SETDMA
LD HL,#0x8000
CALL WRITE
JP CLOSE
SETDMA:
LD C,#D_SETDMA ; DE=ADR
JP DOS
OPEN:
LD DE,#FCB
LD C,#D_OPEN
JP DOS
READ:
LD DE,#FCB
LD C,#D_READ ; HL=NR BYTES
JP DOS
CLOSE:
LD DE,#FCB
LD C,#D_CLOSE
JP DOS
SETFCB:
LD HL,#0x01
LD (FCB+14),HL ; Record length = 1 byte
DEC L
LD (FCB+33),HL
LD (FCB+35),HL ; Current record number = 0
RET
WRITE:
LD DE,#FCB ; HL,NR BYTES
LD C,#D_WRITE
JP DOS
CREATE:
LD DE,#FCB
LD C,#D_CREATE
JP DOS
;---------------------------------------------
; L_GFX : laad gfx in op (BC,DE)-(BC+212,DE+255)
; IN : HL = pionter naar naam
;---------------------------------------------
L_GFX:
PUSH HL
LD HL,#GFX_CMD+2
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
POP HL
CALL GETNAM ; In: HL = file name address (pointe
LD DE,#FCB
LD C,#D_OPEN
CALL BDOS ; Open file
LD HL,#0x01
LD (FCB+14),HL ; Record length = 1 byte
DEC L
LD (FCB+33),HL
LD (FCB+35),HL ; Current record number = 0
LD HL,(FCB+16)
LD (D_BESTLN),HL
LD HL,(FCB+18)
LD (D_BESTLN+2),HL ; Save file-length
LD HL,#GFX_CMD
CALL DO_CMD
EI
D_NEXT_READ:
CALL D_GETLEN ; Block-length 0x4000 or smaller if l
EX DE,HL ; Block-length in HL
PUSH HL
LD DE,#0x4000
LD C,#D_SETDMA
CALL BDOS ; Set DMA-address
POP HL
PUSH HL ; BDOS verandert HL
LD DE,#FCB
LD C,#D_READ
CALL BDOS ; Read current block
POP HL
EX DE,HL ; Block-length in DE
LD HL,#0x4000 ; RAM start address
D_NEXT_ADR:
IN A,(0x65)
RRCA
JR NC,D_READ_RDY ; Command ready
AND #0x40
JR Z,D_NEXT_ADR ; Transfer not ready
LD A,(HL) ; Get byte from main RAM
OUT (0x62),A ; into VRAM
INC HL
DEC DE
LD A,(D_FF)
CP #0
JP Z,D_HEADER
INC HL
DEC DE ; 7 bytes van de header overslaan
INC HL
DEC DE
INC HL
DEC DE
INC HL
DEC DE
INC HL
DEC DE
INC HL
DEC DE
INC HL
DEC DE
LD A,#0
LD (D_FF),A
D_HEADER:
LD A,D
OR E
JR NZ,D_NEXT_ADR ; RAM page not empty yet
LD HL,(D_BESTLN+2)
LD A,H
OR L
JR NZ,D_NEXT_READ ; File not read completely
LD HL,(D_BESTLN)
LD A,H
OR L
JP NZ,D_NEXT_READ ; File not read completely
D_READ_RDY:
LD DE,#FCB
LD C,#D_CLOSE
CALL BDOS ; Close file
LD A,#0x34
LD (D_FF),A
OUT (0x64),A
XOR A
OUT (0x63),A ; Stop command
RET
; Get length of current block to be read
D_GETLEN:
LD DE,#0x4000 ; In: --
LD HL,(D_BESTLN+2) ; Out: DE = block-length
LD A,H ; Cng: AF, DE, HL
OR L ; Mrk: (BESTLN) should contain length
JR NZ,D_LEN_OK ; not read part of file (32 bits
LD HL,(D_BESTLN) ; (BESTLN) will be updated
LD A,H ; Operation: CP HL,DE
CP D ; In: HL = 16 bits value
JP NZ,D_LEN_OK ; DE = 16 bits value
LD A,L ; Out: F = same as with normal CP co
CP E ; Cng: AF
EX DE,HL ; Block-length is smaller than RAMBLK
D_LEN_OK:
LD HL,(D_BESTLN) ; when reaching the end of the file (
OR A
SBC HL,DE ; Decease file-length with block-leng
LD (D_BESTLN),HL
RET NC
LD HL,(D_BESTLN+2)
DEC HL
LD (D_BESTLN+2),HL
RET
; Get file name from file name pointer into FCB
GETNAM:
LD DE,#FCB+1 ; In: HL = file name pointer
LD BC,#0x0B ; Out: A = drive name (0 = def., 1 =
LDIR ; Cng: HL,DE BC,AF
LD A,#0 ; Mrk: FCB contains current file and
LD (FCB),A ; (DRVNAM) must be valid
RET
;---------------------------------------------
; variabelen en tabelen
;---------------------------------------------
FCB:
.ds 48
CURRENT_DRIVE: .db 1
D_BESTLN: .dw 0,0 ; file-length buffer
D_FF: .db 255 ; Fist Fuck ( HEADER OVERSLAN)
GFX_CMD: .db 36,17 ; REG 36 , 17 BYTES
.dw 0 ; DX
.dw 256 ; DY
.dw 256 ; NX
.dw 212 ; NY
.db 0,12 ; 0,OPRATIE
.dw 0xFFFF ; COLOR MASK
.db 0,0 ; COLOR
.db 0,0 ;
.db 16 ; OPCODE