Estex-DSS/DSS/API/Write.asm
2024-03-24 04:53:37 +10:00

208 lines
2.9 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.

WRITE.ERR3:
POP HL
WRITE.ERR2:
POP HL
WRITE.ERR1:
POP BC
SCF
RET
WRITE.RD_ONLY:
POP DE
LD A,DSS_Error.sys.READONLY
SCF
RET
; HL - ADDRESS
; DE - SIZE
; A - FM
WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] ¨§¡ëâ®ç­ë¥ ¢ë§®¢ë WRITE_FAT_TABLE
CALL .Start
PUSH AF
LD A,(FatBuffer.CacheUpdated)
OR A
CALL NZ,WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
POP AF
RET
;
.Start: LD (.R_POINT),HL
LD (.S_POINT),HL
PUSH DE
CALL SET_FM
JR C,.ERR1
LD A,(IY+_sFM.ACCESS_MODE)
AND FAT_ATTR.READ_ONLY
JR NZ,.RD_ONLY
SET 7,(IY + _sFM.ACCESS_MODE)
SET 5,(IY + _sFM.FS_REC.ATTRIBUT)
LD A,(IY + _sFM.DRIVE)
CALL OPENDSK
JR C,.ERR1
;
LD C,(IY+_sFM.F_POSITION)
LD A,(IY+_sFM.F_POSITION+1)
LD E,A
AND #01
LD B,A
LD D,(IY+_sFM.F_POSITION+2)
LD L,(IY+_sFM.F_POSITION+3)
LD H,0
OR A
RR L
RR D
RR E
; HL:DE - FP (in sectors)
; BC - FP residue (in bytes)
LD A,B
OR C
JP NZ,.WOV1
.WOV4: POP BC
PUSH BC
SRL B
JR Z,.WOV2
PUSH HL
PUSH DE
PUSH BC
.R_POINT+2:
LD IX,0
CALL BLOK_WR
POP BC
JR C,.ERR3
LD C,B
LD HL,(.R_POINT)
LD DE,#0200 ;!HARDCODE
.WOV5: ADD HL,DE
DJNZ .WOV5
; B=0
LD (.R_POINT),HL
;LD B,0
POP HL
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
.WOV2: POP BC
LD A,B
AND #01
LD B,A
OR C
JR Z,.WOV6
PUSH HL
PUSH DE
PUSH BC
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_READ
POP BC
LD C,SLOT3
OUT (C),B
LD DE,CORE_BUFFERS.BUFFER
LD HL,(.R_POINT)
POP BC
JP C,.ERR2
LDIR
LD (.R_POINT),HL
POP DE
POP HL
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_WR
POP BC
LD C,SLOT3
OUT (C),B
RET C
.WOV6: LD HL,(.R_POINT)
.S_POINT+1: LD DE,0
; CF=0
;AND A
SBC HL,DE
PUSH HL
EX DE,HL
LD XH,D
LD XL,E
LD HL,0
CALL MOVE_FP.F_current
CALL MOVE_CP
POP DE
RET NC ; …᫨ à §¬¥à ä ©«  ­  ¤¨áª¥ <20>… áâ « ¡®«ìè¥, 祬 ¡ë«
; …᫨ à §¬¥à ä ©«  ­  ¤¨áª¥ áâ « ¡®«ìè¥, 祬 ¡ë«
LD L,(IY + _sFM.F_POSITION+0)
LD H,(IY + _sFM.F_POSITION+1)
LD C,(IY + _sFM.F_POSITION+2)
LD B,(IY + _sFM.F_POSITION+3)
LD (IY + _sFM.FS_REC.F_SIZE+0),L
LD (IY + _sFM.FS_REC.F_SIZE+1),H
LD (IY + _sFM.FS_REC.F_SIZE+2),C
LD (IY + _sFM.FS_REC.F_SIZE+3),B
AND A
RET
;
.WOV1: PUSH BC
PUSH HL
PUSH DE
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOCK_READ
POP BC
LD C,SLOT3
OUT (C),B
POP DE
POP HL
EXX
POP DE
JP C,.ERR1
LD HL,512 ;!HARDCODE sector size!
AND A
SBC HL,DE
LD B,H
LD C,L
POP HL
AND A
SBC HL,BC
JR NC,.WOV3
ADD HL,BC
LD B,H
LD C,L
LD HL,0
.WOV3: PUSH HL
LD HL,CORE_BUFFERS.BUFFER
ADD HL,DE
LD DE,(.R_POINT)
EX DE,HL
LDIR
LD (.R_POINT),HL
EXX
PUSH HL
PUSH DE
LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
CALL BLOK_WR
POP BC
LD C,SLOT3
OUT (C),B
POP HL
JP C,.ERR2
LD BC,1
ADD HL,BC
EX DE,HL
POP HL
LD C,B
ADC HL,BC
JP .WOV4
;