diff --git a/Copy.asm b/Copy.asm index d7183e0..e6a1626 100644 --- a/Copy.asm +++ b/Copy.asm @@ -93,15 +93,19 @@ Loader_length EQU 0 ; ;========================================================== START: XOR A - LD (BSOURCE),A - LD (BDESTN),A + LD (MemBuffer.BSOURCE),A + LD (MemBuffer.BDESTN),A ; PUSH IX - LD BC,256*1 + Dss.GetMem - RST ToDSS - JR NC,.mem_OK ; - LD HL,NO_MEM_STR + LD C,BIOS.GetMemSize + RST ToBIOS + ; + LD A,B + OR C + JR NZ,.mem_OK + ; +.no_Mem: LD HL,NO_MEM_STR LD C,Dss.PChars RST ToDSS LD BC,256*DSS_Error.sys.NOT_ENOUGH_MEMORY + Dss.Exit @@ -109,79 +113,151 @@ START: XOR A ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; -.mem_OK: OUT (SLOT3),A +.mem_OK: LD B,C + LD C,Dss.GetMem + RST ToDSS + JR C,.no_Mem + ;PUSH AF ; mem block id + ; + LD HL,MemBuffer.MemPages + LD C,BIOS.GetMemBlkPages + RST ToBIOS + ; + ;POP AF + ;OUT (SLOT3),A POP HL INC HL - LD DE,BSOURCE + LD DE,MemBuffer.BSOURCE LD C,Dss.GSwitch RST ToDSS - LD DE,BDESTN + LD DE,MemBuffer.BDESTN LD C,Dss.GSwitch RST ToDSS ; - LD HL,BSOURCE + LD HL,MemBuffer.BSOURCE LD BC,Dss.Attrib.Get RST ToDSS LD (FATTR),A ; LD A,Dss.Open.R - LD HL,BSOURCE + LD HL,MemBuffer.BSOURCE LD C,Dss.Open RST ToDSS - LD (SOURCE_FILE),A + LD (READ_FILE_BLOCK.SOURCE_FILE),A JR NC,.SOURCE_OK ; LD (EXITCODE),A LD HL,SOPEN_ERR_STR ; LD C,Dss.PChars ; RST ToDSS - JR QUIT + JP QUIT ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; -.SOURCE_OK: LD HL,BDESTN +.SOURCE_OK: LD HL,MemBuffer.BDESTN FATTR+1: LD A,FAT_ATTR.ARCHIVE LD C,Dss.Creat_N RST ToDSS - LD (DEST_FILE),A - JR NC,RW_LOOP + LD (WRITE_FILE_BLOCK.DEST_FILE),A + ;JR NC,RW_LOOP + JR NC,BEGIN_COPY ; LD (EXITCODE),A LD HL,DOPEN_ERR_STR - ; LD C,Dss.PChars - ; RST ToDSS JR QUIT ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +READ_FILE_BLOCK:; + LD HL,MemBuffer.MemPages + LD A,(HL) + OUT (SLOT3),A +.loop: PUSH HL + ; INC A + ; JR Z,.End ; end of block, A=0 ; - ; -RW_LOOP: LD HL,#C000 - LD DE,#4000 - LD C,Dss.Read -SOURCE_FILE+1: LD A,0 - RST ToDSS - JR C,RD_ERROR - ; - PUSH AF LD HL,#C000 + LD DE,#4000 +.SOURCE_FILE+1: LD A,0 + LD C,Dss.Read + RST ToDSS + POP HL + RET C + ; + LD C,A + ; + INC HL + LD A,(HL) + OUT (SLOT3),A + INC A + JR Z,.End ; end of block, A=0 + ; + LD A,C + OR A + JR Z,.loop + ; end of file, A=#FF + ; +.End: LD (MemBuffer.LastFilePageSize),DE + LD DE,MemBuffer.MemPages + ;CF=0 + SBC HL,DE + LD (MemBuffer.EndCopyLoop),A + LD A,L + LD (MemBuffer.FilePagesCounter),A + RET + ;;;;;;;;;;;;;;;;;;;;;;;;; + ; + ; +WRITE_FILE_BLOCK: + LD HL,MemBuffer.MemPages + LD A,(MemBuffer.FilePagesCounter) + LD B,A +.loop: PUSH HL + PUSH BC + ; + DEC B + LD DE,#4000 + JR NZ,.notLastBlock + ; + LD DE,(MemBuffer.LastFilePageSize) +.notLastBlock: LD A,(HL) + OUT (SLOT3),A + LD HL,#C000 +.DEST_FILE+1: LD A,0 LD C,Dss.Write -DEST_FILE+1: LD A,0 RST ToDSS POP BC + POP HL + RET C + ; + INC HL + DJNZ .loop + ;CF=0 + RET + ;;;;;;;;;;;;;;;;;;;;;;;;; + ; + ; + +BEGIN_COPY: CALL READ_FILE_BLOCK + JR C,RD_ERROR + ; + CALL WRITE_FILE_BLOCK JR C,WR_ERROR - LD A,B - OR A - JR Z,RW_LOOP + ; + LD A,(MemBuffer.EndCopyLoop) + AND A + JR Z,BEGIN_COPY + ; ; ; дата и время - LD A,(SOURCE_FILE) + LD A,(READ_FILE_BLOCK.SOURCE_FILE) LD C,Dss.Get_D_T RST ToDSS - LD A,(DEST_FILE) + LD A,(WRITE_FILE_BLOCK.DEST_FILE) LD C,Dss.Put_D_T RST ToDSS - ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; XOR A ;EXITCODE LD (EXITCODE),A @@ -236,7 +312,7 @@ PRINT_ERROR: LD H,0 ;CALL hex2dec_ascii_16bit ; вход: hl=число, de=буфер hex2dec_ascii_16bit: -.n100: LD IX,tmp1 +.n100: LD IX,MemBuffer.tmp1 RES 7,(ix+0) .skip2: LD BC,100 CALL .num16 @@ -274,10 +350,27 @@ READ_ERR_STR: DB "Reading error " WRITE_ERR_STR: DB "Writing error " .errNum: DB "00 ",#0D,#0A,#00 ; + + + + STRUCT Variables +.tmp1 BYTE +.FilePagesCounter BYTE +.EndCopyLoop BYTE +.LastFilePageSize WORD +.MemPages BLOCK 256 +.BSOURCE BLOCK 257 +.BDESTN BLOCK 257 + ENDS + +MemBuffer: Variables = $ + + ; -tmp1: EQU $ -BSOURCE: EQU tmp1 + 1 -BDESTN: EQU BSOURCE + 257 +; tmp1: EQU $ +; MemPages: EQU tmp1 + 1 +; BSOURCE: EQU MemPages + 256 +; BDESTN: EQU BSOURCE + 257 ;[END]===================================================== /* ;