; HL - ADDRESS ; DE - SIZE ; A - FM READ: LD (.R_POINT),HL LD (.S_POINT),HL CALL SET_FM RET C CALL TSTSIZE ; LD A,D OR E JP Z,.NOREAD ; PUSH DE LD A,(IY+_sFM.DRIVE) CALL OPENDSK JP C,.ERR_1 ;Расчёт смещения в секторах ; LD C,(IY+_sFM.F_POSITION) ; LD E,(IY+_sFM.F_POSITION+1) ; LD A,E ; 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 LD H,0 ; LD L,(IY+_sFM.F_POSITION+3) LD D,(IY+_sFM.F_POSITION+2) LD E,(IY+_sFM.F_POSITION+1) LD A,E AND #01 LD B,A LD C,(IY+_sFM.F_POSITION) ;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,.ROV1 .ROV4: POP BC PUSH BC SRL B JR Z,.ROV2 LD (.SECTORH),HL LD (.SECTORL),DE .R_POINT+2: LD IX,0 CALL BLOK_RD JP C,.ERR_1 LD DE,(.R_POINT) .PointerOnBuffer+1: LD HL,0 // LD HL,(READMEM) AND A SBC HL,DE LD C,H LD B,0 ADD HL,DE LD (.R_POINT),HL SRL C .SECTORL+1: LD HL,0 // LD HL,(SECTORL) ADD HL,BC EX DE,HL .SECTORH+1: LD HL,0 // LD HL,(SECTORH) LD C,B ADC HL,BC .ROV2: POP BC LD A,B AND #01 LD B,A OR C JP Z,.ROV6 PUSH BC LD IX,CORE_BUFFERS.BUFFER+#C000 LD B,1 IN A,(SLOT3) PUSH AF IN A,(SLOT0) OUT (SLOT3),A CALL BLOK_RD POP BC LD C,SLOT3 OUT (C),B JP C,.ERR_1 LD HL,CORE_BUFFERS.BUFFER LD DE,(.R_POINT) POP BC LDIR LD (.R_POINT),DE .ROV6: LD HL,(.R_POINT) .S_POINT+1: LD DE,0 ;EX DE,HL AND A SBC HL,DE PUSH HL EX DE,HL LD XH,D LD XL,E LD HL,0 CALL MOVE_FP.F_current POP DE .NOREAD: .COD+1: LD A,0 OR A RET .ROV1: 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 BLOK_RD POP BC LD C,SLOT3 OUT (C),B POP HL JP C,.ERR_3 LD BC,1 ADD HL,BC EX DE,HL POP HL LD C,B ADC HL,BC EXX POP DE LD HL,512 ;!HARDCODE AND A SBC HL,DE LD B,H LD C,L POP HL AND A SBC HL,BC JR NC,.ROV3 ADD HL,BC LD B,H LD C,L LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? .ROV3: PUSH HL LD HL,CORE_BUFFERS.BUFFER ADD HL,DE LD DE,(.R_POINT) LDIR LD (.R_POINT),DE EXX JP .ROV4 .ERR_3: POP HL .ERR_2: POP HL .ERR_1: POP BC SCF RET TSTSIZE: XOR A LD (READ.COD),A LD L,(IY+_sFM.F_POSITION) ;FP LOW LD H,(IY+_sFM.F_POSITION+1) ADD HL,DE ; EXX ;LD DE,0 ;!TEST LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH LD H,(IY+_sFM.F_POSITION+3) ;!TEST JR NC,.no_inc_hl INC HL ;ADC HL,DE ; .no_inc_hl: EXX ;HL':HL - NEW FP ; LD C,(IY+_sFM.F_SIZE) LD B,(IY+_sFM.F_SIZE+1) ;SIZE LOW AND A SBC HL,BC EXX LD C,(IY+_sFM.F_SIZE+2) ;SIZE HIGH LD B,(IY+_sFM.F_SIZE+3) SBC HL,BC EXX RET C ;OK READ ALL EX DE,HL SBC HL,DE ;VERY BIG EX DE,HL LD A,#FF LD (READ.COD),A RET