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,(CORE_BUFFERS.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 Dss.Open.R 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 ; [ ] 26/06/2024 CALL CHECK_64kb_CLUSTER RET C ; CALL GET_OFFSET_IN_SECTORS ; 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_WRITE POP BC JR C,.ERR3 LD C,B LD HL,(.R_POINT) LD DE,#0200 ;!HARDCODE sector size .WOV5: ADD HL,DE DJNZ .WOV5 ; B=0 LD (.R_POINT),HL ;!FIXIT это значение уже расcчитывается перед выходом в BLOK_WRITE? ;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_WRITE 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 ; Если размер файла на диске НЕ стал больше, чем был ; Если размер файла на диске стал больше, чем был 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 ;!FIXIT ; [ ] 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_WRITE 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 ;