mirror of
https://github.com/Tolik-Trek/Copy.git
synced 2026-06-15 09:21:38 +03:00
читает во всю свободную память, потом пишет
This commit is contained in:
parent
3e49b7d702
commit
a0ee27b2bb
169
Copy.asm
169
Copy.asm
@ -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]=====================================================
|
||||||
/*
|
/*
|
||||||
;
|
;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user