;--------------------- ; 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