Copy/Copy.asm
2025-05-29 23:06:31 +10:00

312 lines
6.1 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 (BSOURCE),A
LD (BDESTN),A
;
PUSH IX
LD BC,256*1 + Dss.GetMem
RST ToDSS
JR NC,.mem_OK
;
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: OUT (SLOT3),A
POP HL
INC HL
LD DE,BSOURCE
LD C,Dss.GSwitch
RST ToDSS
LD DE,BDESTN
LD C,Dss.GSwitch
RST ToDSS
;
LD HL,BSOURCE
LD BC,Dss.Attrib.Get
RST ToDSS
LD (FATTR),A
;
LD A,Dss.Open.R
LD HL,BSOURCE
LD C,Dss.Open
RST ToDSS
LD (SOURCE_FILE),A
JR NC,.SOURCE_OK
;
LD (EXITCODE),A
LD HL,SOPEN_ERR_STR
; LD C,Dss.PChars
; RST ToDSS
JR QUIT
;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
.SOURCE_OK: LD HL,BDESTN
FATTR+1: LD A,FAT_ATTR.ARCHIVE
LD C,Dss.Creat_N
RST ToDSS
LD (DEST_FILE),A
JR NC,RW_LOOP
;
LD (EXITCODE),A
LD HL,DOPEN_ERR_STR
; LD C,Dss.PChars
; RST ToDSS
JR QUIT
;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;
;
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
;
;
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,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
;
;
tmp1: EQU $
BSOURCE: EQU tmp1 + 1
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
;
;
*/