;[BEGIN]=================================================== ; ; COPY.EXE ; COPY [source file] [destination file] ; ; Compilation parameters ;---------------------------------------------------------------------[] ;DEVICE SPRINTER ;MMU 2 e, 0 ; нулевая страница в банку 2 и проверка на границы ;OUTPUT './Build/new.bin' ;---------------------------------------------------------------------[] ; ; ; Defines section ;---------------------------------------------------------------------[] ; define EMULATOR 0 define EXE_HEADER 1 ; define NEED_LOADER 1 ; define NeedSafePort_Y 0 define App_EXE_Version 1 ;---------------------------------------------------------------------[] ; ; ; Included LUA section ;---------------------------------------------------------------------[] ; includelua ;---------------------------------------------------------------------[] ; ; ; Included constants section ;---------------------------------------------------------------------[] include 'Shared_Includes/constants/sp2000.inc' include 'Shared_Includes/constants/dss_equ.inc' include 'Shared_Includes/constants/BIOS_equ.inc' ;---------------------------------------------------------------------[] ; ; ; Included macroses section ;---------------------------------------------------------------------[] ; include 'Shared_Includes/macroses/macros.z80' ; include 'Shared_Includes/macroses/accelerator.z80' ;---------------------------------------------------------------------[] ; ; ; Standart EQU section ;---------------------------------------------------------------------[] org_addr EQU #8000 + CLP_Buffer code_addr EQU START stack_point EQU #C000 stack_buffer EQU 64 program_start EQU START Loader_length EQU 0 ;---------------------------------------------------------------------[] ; ; Code start section ;[]-------------------------------------------------------------------[] include 'Shared_Includes/constants/EXE_Header.z80' ORG org_addr ; ORG #8100-24 ; ; INCLUDE "dss.inc" ; ;==EXE HEADER ============================================= ; DB "EX" ;EXE ID ; DB #45 ;EXE TYPE ; DB #01 ;EXE VERSION ; DW 24 ;CODE OFFSET LOW WORD ; DW #0000 ;CODE OFFSET HIGH WORD ; DW #0000 ;PRIMARY LOADER ; DW #0000 ;RESERVED ; DW #0000 ;RESERVED ; DW #0000 ;RESERVED ; DW START ;LOAD ADDRESS ; DW START ;START ADDRESS ; DW #C000 ;STACK ADDRESS ; DS 2 ;RESERVED ; ;========================================================== START: XOR A LD (MemBuffer.BSOURCE),A LD (MemBuffer.BDESTN),A ; PUSH IX ; 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 RST ToDSS ; error exit ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; .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,MemBuffer.BSOURCE LD C,Dss.GSwitch RST ToDSS LD DE,MemBuffer.BDESTN LD C,Dss.GSwitch RST ToDSS ; LD HL,MemBuffer.BSOURCE LD BC,Dss.Attrib.Get RST ToDSS LD (FATTR),A ; LD A,Dss.Open.R LD HL,MemBuffer.BSOURCE LD C,Dss.Open RST ToDSS 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 JP QUIT ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; .SOURCE_OK: LD HL,MemBuffer.BDESTN FATTR+1: LD A,FAT_ATTR.ARCHIVE LD C,Dss.Creat_N RST ToDSS LD (WRITE_FILE_BLOCK.DEST_FILE),A ;JR NC,RW_LOOP JR NC,BEGIN_COPY ; LD (EXITCODE),A LD HL,DOPEN_ERR_STR 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 ; 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 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,(MemBuffer.EndCopyLoop) AND A JR Z,BEGIN_COPY ; ; ; дата и время LD A,(READ_FILE_BLOCK.SOURCE_FILE) LD C,Dss.Get_D_T RST ToDSS LD A,(WRITE_FILE_BLOCK.DEST_FILE) LD C,Dss.Put_D_T RST ToDSS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; XOR A ;EXITCODE LD (EXITCODE),A ; LD HL,DONE_STR QUIT: LD C,Dss.PChars RST ToDSS LD C,Dss.Exit EXITCODE+1: LD B,0 RST ToDSS ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; QUIT_3: LD C,#12 ; LD A,(DEST_FILE) ; RST ToDSS ; QUIT_2: LD C,#12 ; LD A,(SOURCE_FILE) ; RST ToDSS ; JR QUIT ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; RD_ERROR: ;CALL PRINT_ERROR LD (EXITCODE),A LD HL,READ_ERR_STR ; LD C,Dss.PChars ; RST ToDSS JR QUIT ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; WR_ERROR: ;CALL PRINT_ERROR LD (EXITCODE),A LD HL,WRITE_ERR_STR ; LD C,Dss.PChars ; RST ToDSS JR QUIT ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; QUIT: LD C,Dss.Exit ; EXITCODE+1: LD B,0 ; RST ToDSS ; ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; ; ; PRINT_ERROR: LD H,0 ; LD L,A ; LD (EXITCODE),A ; LD DE,READ_ERR_STR.errNum ; ;CALL hex2dec_ascii_16bit ; ; вход: hl=число, de=буфер ; hex2dec_ascii_16bit: ; .n100: LD IX,MemBuffer.tmp1 ; RES 7,(ix+0) ; .skip2: LD BC,100 ; CALL .num16 ; ; ; .decim: LD BC,10 ; CALL .num16 ; LD A,L ; ADD A,"0" ; JR .num16_exit ; ; ; .num16: LD A,'0'-1 ; AND A ; INC A ; SBC HL,BC ; JR NC,$-3 ;!FIXIT $ ; ADD HL,BC ; CP "0" ; JR Z,$+6 ;!FIXIT $ ; SET 7,(ix+0) ; BIT 7,(ix+0) ; RET Z ; .num16_exit: ; LD (DE),A ; сохр. в буфере ; INC DE ; RET ;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DONE_STR: DB "File copied",#0D,#0A,#00 NO_MEM_STR: DB "No free memory",#0D,#0A,#00 SOPEN_ERR_STR: DB "Can't open source file",#0D,#0A,#00 DOPEN_ERR_STR: DB "Can't open destination file",#0D,#0A,#00 READ_ERR_STR: DB "Reading error",#0D,#0A,#00 ;.errNum: DB "00 ",#0D,#0A,#00 WRITE_ERR_STR: DB "Writing error",#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 $ ; MemPages: EQU tmp1 + 1 ; BSOURCE: EQU MemPages + 256 ; BDESTN: EQU BSOURCE + 257 ;[END]===================================================== /* ; ; 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 C,Dss.Write DEST_FILE+1: LD A,0 RST ToDSS POP BC JR C,WR_ERROR LD A,B OR A JR Z,RW_LOOP ; ; дата и время LD A,(SOURCE_FILE) LD C,Dss.Get_D_T RST ToDSS LD A,(DEST_FILE) LD C,Dss.Put_D_T RST ToDSS ; ; */