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

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 START: XOR A
LD (BSOURCE),A LD (MemBuffer.BSOURCE),A
LD (BDESTN),A LD (MemBuffer.BDESTN),A
; ;
PUSH IX 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 LD C,Dss.PChars
RST ToDSS RST ToDSS
LD BC,256*DSS_Error.sys.NOT_ENOUGH_MEMORY + Dss.Exit 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 POP HL
INC HL INC HL
LD DE,BSOURCE LD DE,MemBuffer.BSOURCE
LD C,Dss.GSwitch LD C,Dss.GSwitch
RST ToDSS RST ToDSS
LD DE,BDESTN LD DE,MemBuffer.BDESTN
LD C,Dss.GSwitch LD C,Dss.GSwitch
RST ToDSS RST ToDSS
; ;
LD HL,BSOURCE LD HL,MemBuffer.BSOURCE
LD BC,Dss.Attrib.Get LD BC,Dss.Attrib.Get
RST ToDSS RST ToDSS
LD (FATTR),A LD (FATTR),A
; ;
LD A,Dss.Open.R LD A,Dss.Open.R
LD HL,BSOURCE LD HL,MemBuffer.BSOURCE
LD C,Dss.Open LD C,Dss.Open
RST ToDSS RST ToDSS
LD (SOURCE_FILE),A LD (READ_FILE_BLOCK.SOURCE_FILE),A
JR NC,.SOURCE_OK JR NC,.SOURCE_OK
; ;
LD (EXITCODE),A LD (EXITCODE),A
LD HL,SOPEN_ERR_STR LD HL,SOPEN_ERR_STR
; LD C,Dss.PChars ; LD C,Dss.PChars
; RST ToDSS ; RST ToDSS
JR QUIT JP QUIT
;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; ;
.SOURCE_OK: LD HL,BDESTN .SOURCE_OK: LD HL,MemBuffer.BDESTN
FATTR+1: LD A,FAT_ATTR.ARCHIVE FATTR+1: LD A,FAT_ATTR.ARCHIVE
LD C,Dss.Creat_N LD C,Dss.Creat_N
RST ToDSS RST ToDSS
LD (DEST_FILE),A LD (WRITE_FILE_BLOCK.DEST_FILE),A
JR NC,RW_LOOP ;JR NC,RW_LOOP
JR NC,BEGIN_COPY
; ;
LD (EXITCODE),A LD (EXITCODE),A
LD HL,DOPEN_ERR_STR LD HL,DOPEN_ERR_STR
; LD C,Dss.PChars
; RST ToDSS
JR QUIT 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 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 LD C,Dss.Write
DEST_FILE+1: LD A,0
RST ToDSS RST ToDSS
POP BC 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 JR C,WR_ERROR
LD A,B ;
OR A LD A,(MemBuffer.EndCopyLoop)
JR Z,RW_LOOP AND A
JR Z,BEGIN_COPY
;
; ;
; ¤ â  ¨ ¢à¥¬ï ; ¤ â  ¨ ¢à¥¬ï
LD A,(SOURCE_FILE) LD A,(READ_FILE_BLOCK.SOURCE_FILE)
LD C,Dss.Get_D_T LD C,Dss.Get_D_T
RST ToDSS RST ToDSS
LD A,(DEST_FILE) LD A,(WRITE_FILE_BLOCK.DEST_FILE)
LD C,Dss.Put_D_T LD C,Dss.Put_D_T
RST ToDSS RST ToDSS
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
XOR A ;EXITCODE XOR A ;EXITCODE
LD (EXITCODE),A LD (EXITCODE),A
@ -236,7 +312,7 @@ PRINT_ERROR: LD H,0
;CALL hex2dec_ascii_16bit ;CALL hex2dec_ascii_16bit
; ¢å®¤: hl=ç¨á«®, de=¡ãä¥à ; ¢å®¤: hl=ç¨á«®, de=¡ãä¥à
hex2dec_ascii_16bit: hex2dec_ascii_16bit:
.n100: LD IX,tmp1 .n100: LD IX,MemBuffer.tmp1
RES 7,(ix+0) RES 7,(ix+0)
.skip2: LD BC,100 .skip2: LD BC,100
CALL .num16 CALL .num16
@ -274,10 +350,27 @@ READ_ERR_STR: DB "Reading error "
WRITE_ERR_STR: DB "Writing error " WRITE_ERR_STR: DB "Writing error "
.errNum: DB "00 ",#0D,#0A,#00 .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 $ ; tmp1: EQU $
BSOURCE: EQU tmp1 + 1 ; MemPages: EQU tmp1 + 1
BDESTN: EQU BSOURCE + 257 ; BSOURCE: EQU MemPages + 256
; BDESTN: EQU BSOURCE + 257
;[END]===================================================== ;[END]=====================================================
/* /*
; ;