234 lines
4.2 KiB
NASM
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
|