mirror of
https://github.com/Tolik-Trek/Copy.git
synced 2026-06-15 01:11:37 +03:00
405 lines
7.8 KiB
NASM
405 lines
7.8 KiB
NASM
;[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 <Shared_Includes/LUA/Functions.LUA>
|
||
;---------------------------------------------------------------------[]
|
||
;
|
||
|
||
|
||
|
||
;
|
||
; 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 HL,READ_ERR_STR
|
||
; LD C,Dss.PChars
|
||
; RST ToDSS
|
||
JR QUIT
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
;
|
||
;
|
||
WR_ERROR: CALL PRINT_ERROR
|
||
;
|
||
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 "
|
||
.errNum: DB "00",#0D,#0A,#00
|
||
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 $
|
||
; 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
|
||
;
|
||
;
|
||
*/ |