Copy/Copy.asm

405 lines
7.9 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[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 (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
;
;
*/