читает во всю свободную память, потом пишет

This commit is contained in:
Tolik 2025-05-31 02:54:59 +10:00
parent 3e49b7d702
commit a0ee27b2bb

169
Copy.asm
View File

@ -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]=====================================================
/*
;