Updated and added SD to/from Tape copy commands and SD erase
This commit is contained in:
13
README.md
13
README.md
@@ -1,19 +1,22 @@
|
||||
## Overview
|
||||
|
||||
The Sharp MZ80A as with most vintage computers had limited storage. In order to expand the storage it is often the case that the resident software has to be enhanced which was impossible
|
||||
given the storage space (ie. 4K Monitor rom). The Sharp MZ80A has a 4K Monitor ROM, a 2K User ROM/RAM and space within the memory map to add a further 4K ROM typically for the floppy disk
|
||||
drive.
|
||||
The Sharp MZ80A came with 48K RAM and 4K ROM and apart from the option to add a 2K User RAM/ROM and a 4K Floppy Drive ROM, there was no further possibility to expand the machine memory
|
||||
capabilities at the hardware level and thus no additional firmware could be added for use at power-on. Add-ons had to rely on loading control firmware into RAM via tape or floppy, thus depleting valuable application space. Some machines of the same era
|
||||
utilised a scheme called 'banking' whereby much larger memories would occupy a smaller block within the CPU address space and be selected according to features required and hardware attached. The
|
||||
BBC Micro was such a machine with upto 16 banks of 16Kb, it made the machine much more useable.
|
||||
|
||||
One of the seperate projects I've been working on was a 40/80 Column switchable display and colour output. This upgrade requires different software, either a complete rewrite of the original
|
||||
monitor or a patched copy for 80 column mode. Wanting to keep the machine as original as possible, using a rewritten ROM is out of the question thus I would need 2 ROMS, original for 40Column
|
||||
and a patched one for 80Column.
|
||||
|
||||
Thus was born the need for Rom Paging, ie. Use a modern Flash RAM to house multiple 4K Roms which can be *switched in* according to the hardware upgrade.
|
||||
Thus was born the need for Rom Paging in the Sharp MZ80A, ie. Use a modern Flash RAM to house multiple 4K Roms which can be *switched in* to the 4K Monitor ROM address space according to the
|
||||
hardware upgrade being used.
|
||||
|
||||
It was also seen when using large Flash RAM's it was possible to store programs that would normally be present on tape or floppy and load at much higher speed making use of the computer that
|
||||
much easier.
|
||||
|
||||
This upgrade uses the 4K Monitor ROM and 2K User ROM space to map in 2x512Kbyte Flash RAM's providing paged roms and a Rom Filing System storing most commonly used programs.
|
||||
This upgrade goes a bit further and uses the 4K Monitor ROM and 2K User ROM space to map in 2x512Kbyte Flash RAM's providing multiple paged roms (theoretical 256 x 2K slots and 128 x 4K slots)
|
||||
and the required custom software to control the banking called the Rom Filing System.
|
||||
|
||||
This page along with the [CP/M](/sharpmz-upgrades-cpm) page forms the start of the RFS documentation which is still in its infancy. Within this repository are the schematics, PCB Gerber files and the software to implement the Rom Filing
|
||||
System hardware and software.
|
||||
|
||||
@@ -2087,7 +2087,7 @@ SKIPDUMP: POP HL
|
||||
|
||||
; HL = Start
|
||||
; DE = End
|
||||
DUMPX: LD A,1
|
||||
DUMPX: LD A,23
|
||||
DUM1: LD (TMPCNT),A
|
||||
DUM3: LD B,010h
|
||||
LD C,02Fh
|
||||
@@ -2102,9 +2102,7 @@ DUM2: CALL SPHEX
|
||||
CP 020h
|
||||
JR NC,L0D51
|
||||
LD A,02Eh
|
||||
L0D51: ;CALL ?ADCN
|
||||
;CALL ?PRNT3
|
||||
CALL ?PRNT
|
||||
L0D51: CALL ?PRNT
|
||||
LD A,(DSPXY)
|
||||
INC C
|
||||
SUB C
|
||||
@@ -2116,12 +2114,6 @@ L0D51: ;CALL ?ADCN
|
||||
SBC HL,DE
|
||||
POP HL
|
||||
JR NC,DUM7
|
||||
LD A,0F8h
|
||||
LD (0E000h),A
|
||||
NOP
|
||||
LD A,(0E001h)
|
||||
CP 0FEh
|
||||
JR NZ,L0D78
|
||||
L0D78: DJNZ DUM2
|
||||
LD A,(TMPCNT)
|
||||
DEC A
|
||||
@@ -2138,8 +2130,8 @@ DUM4: CALL ?CHKKY
|
||||
DUM5: CP 'U'
|
||||
JR NZ,DUM6
|
||||
PUSH DE
|
||||
LD DE,000FFH
|
||||
SCF
|
||||
LD DE,00100H
|
||||
OR A
|
||||
SBC HL,DE
|
||||
POP DE
|
||||
LD A,8
|
||||
|
||||
@@ -55,15 +55,14 @@ MELDY EQU 00030h
|
||||
MONIT: EQU 00000h
|
||||
SS: EQU 00089h
|
||||
ST1: EQU 00095h
|
||||
MSGE1 EQU 00118h
|
||||
HLHEX EQU 00410h
|
||||
_2HEX EQU 0041Fh
|
||||
?MODE: EQU 0074DH
|
||||
?KEY EQU 008CAh
|
||||
PRNT3 EQU 0096Ch
|
||||
MSG?2 EQU 000F7h
|
||||
?ADCN EQU 00BB9h
|
||||
?DACN EQU 00BCEh
|
||||
?DSP: EQU 00DB5H
|
||||
?BLNK EQU 00DA6h
|
||||
?DPCT EQU 00DDCh
|
||||
PRTHL: EQU 003BAh
|
||||
@@ -73,6 +72,11 @@ DPCT: EQU 00DDCh
|
||||
DLY12: EQU 00DA7h
|
||||
DLY12A: EQU 00DAAh
|
||||
?RSTR1: EQU 00EE6h
|
||||
MOTOR: EQU 006A3H
|
||||
CKSUM: EQU 0071AH
|
||||
GAP: EQU 0077AH
|
||||
WTAPE: EQU 00485H
|
||||
MSTOP: EQU 00700H
|
||||
|
||||
; Debugging
|
||||
ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable
|
||||
@@ -291,6 +295,15 @@ SDDIR_EXEC EQU 019H
|
||||
SDDIR_FNSZ EQU FNSIZE
|
||||
SDDIR_ENTSZ EQU 32
|
||||
|
||||
;
|
||||
; Rom Filing System constants for the SD Card.
|
||||
;
|
||||
SDDIR_DIRENT EQU 256 ; Directory entries in the RFS directory.
|
||||
SDDIR_DIRENTSZ EQU 32 ; Size of a directory entry.
|
||||
SDDIR_DIRSIZE EQU SDDIR_DIRENT * SDDIR_DIRENTSZ ; Total size of the directory.
|
||||
SDDIR_BLOCKSZ EQU 65536 ; Size of a file block per directory entry.
|
||||
SDDIR_IMGSZ EQU SDDIR_DIRSIZE + (SDDIR_DIRENT * SDDIR_BLOCKSZ) ; Total size of the RFS image.
|
||||
|
||||
;-----------------------------------------------
|
||||
; SA-1510 MONITOR WORK AREA (MZ80A)
|
||||
;-----------------------------------------------
|
||||
@@ -350,20 +363,23 @@ TMPLINECNT: EQU 01021H ; Tempo
|
||||
TMPSTACKP: EQU 01023H ; Temporary stack pointer save.
|
||||
SDVER: EQU 01025H
|
||||
SDCAP: EQU 01026H
|
||||
; Variables sharing the CMT buffer, normally the CMT and SD are not used at the same
|
||||
; time. This frees up memory needed by the SD card.
|
||||
; Variables sharing the BUFER buffer, normally the BUFER is only used to get keyboard input and so long as data in BUFER is processed
|
||||
; before calling the CMT/SD commands and not inbetween there shouldnt be any issue. Also the space used is at the top end of the buffer which is not used so often.
|
||||
; This frees up memory needed by the CMT and SD card.
|
||||
SECTORBUF: EQU 0CE00H ; Working buffer to place an SD card sector.
|
||||
SDBYTECNT EQU COMNT+2 ; Bytes to read/write to/from a sector.
|
||||
SDOFFSET EQU COMNT+4 ; Offset into sector prior to data read/write.
|
||||
SDSTARTSEC EQU COMNT+6 ; Starting sector of data to read/write from/to SD card.
|
||||
SDLOADADDR EQU COMNT+10 ; Address to read/write data from/to SD card.
|
||||
SDLOADSIZE EQU COMNT+12 ; Total remaining byte count data to read/write from/to SD card.
|
||||
SDAUTOEXEC EQU COMNT+14 ; Flag to indicate if a loaded image should be executed (=0xFF)
|
||||
SDBUF: EQU COMNT+15 ; SD Card command fram buffer for the command and response storage.
|
||||
DIRSECBUF: EQU COMNT+26 ; Directory sector in cache.
|
||||
RESULT: EQU COMNT+27
|
||||
BYTECNT: EQU COMNT+29
|
||||
WRITECNT: EQU COMNT+31
|
||||
SDSTARTSEC EQU BUFER+50+0 ; Starting sector of data to read/write from/to SD card.
|
||||
SDLOADADDR EQU BUFER+50+4 ; Address to read/write data from/to SD card.
|
||||
SDLOADSIZE EQU BUFER+50+6 ; Total remaining byte count data to read/write from/to SD card.
|
||||
SDAUTOEXEC EQU BUFER+50+8 ; Flag to indicate if a loaded image should be executed (=0xFF)
|
||||
SDBUF: EQU BUFER+50+9 ; SD Card command fram buffer for the command and response storage.
|
||||
DIRSECBUF: EQU BUFER+50+20 ; Directory sector in cache.
|
||||
DUMPADDR: EQU BUFER+50+22 ; Address used by the D(ump) command so that calls without parameters go onto the next block.
|
||||
CMTLOLOAD: EQU BUFER+50+24 ; Flag to indicate that a tape program is loaded into hi memory then shifted to low memory after ROM pageout.
|
||||
CMTCOPY: EQU BUFER+50+25 ; Flag to indicate that a CMT copy operation is taking place.
|
||||
CMTAUTOEXEC:EQU BUFER+50+26 ; Auto execution flag, run CMT program when loaded if flag clear.
|
||||
DTADRSTORE: EQU BUFER+50+27 ; Backup for load address if actual load shifts to lo memory or to 0x1200 for copy.
|
||||
SDCOPY: EQU BUFER+50+29 ; Flag to indicate an SD copy is taking place, either CMT->SD or SD->CMT.
|
||||
RESULT: EQU BUFER+50+30 ; Result variable needed for interbank calls when a result is needed.
|
||||
|
||||
; Quickdisk work area
|
||||
;QDPA EQU 01130h ; QD code 1
|
||||
|
||||
@@ -109,14 +109,13 @@ BKSW0to7: PUSH AF
|
||||
PUSH AF
|
||||
LD A, ROMBANK7 ; Required bank to call.
|
||||
;
|
||||
BKSW0_0: PUSH BC ; Save BC for caller.
|
||||
LD BC, BKSWRET0 ; Place bank switchers return address on stack.
|
||||
PUSH BC
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
BKSW0_0: PUSH HL ; Place function to call on stack
|
||||
LD HL, BKSWRET0 ; Place bank switchers return address on stack.
|
||||
EX (SP),HL
|
||||
LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it.
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
JP (HL) ; Jump to required function.
|
||||
BKSWRET0: POP BC
|
||||
POP AF ; Get bank which called us.
|
||||
BKSWRET0: POP AF ; Get bank which called us.
|
||||
LD (RFSBK2), A ; Return to that bank.
|
||||
POP AF
|
||||
RET ; Return to caller.
|
||||
@@ -161,7 +160,8 @@ SIGNON1: CALL DPCT
|
||||
DEC E
|
||||
JR NZ,SIGNON1
|
||||
LD DE,MSGSON ; Sign on message,
|
||||
RST 018h
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW0to6
|
||||
|
||||
LD HL, SDINIT ; SD Card Initialisation
|
||||
CALL BKSW0to2 ; Call the initialisation routine.
|
||||
@@ -180,7 +180,7 @@ ST1X: CALL NL ; Comma
|
||||
CMDCMP: LD HL,CMDTABLE
|
||||
CMDCMP0: LD DE,BUFER+1 ; First command byte after the * prompt.
|
||||
LD A,(HL)
|
||||
CP 00DH
|
||||
CP 000H
|
||||
JR Z,ST1X ; Skip processing on lines where just CR pressed.
|
||||
BIT 7,A ; Bit 7 set on command properties indicates table end, exit if needed.
|
||||
JR NZ,CMDNOCMP
|
||||
@@ -234,7 +234,8 @@ CMDCMP6: LD DE,CMDCMPEND ; Put r
|
||||
JP (HL)
|
||||
|
||||
CMDNOCMP: LD DE,MSGBADCMD
|
||||
RST 018H
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW0to6
|
||||
CMDCMPEND: JP ST1X
|
||||
|
||||
; Monitor command table. This table contains the list of recognised commands along with the
|
||||
@@ -257,13 +258,16 @@ CMDTABLE: DB 000H | 000H | 000H | 001H ; Bit 2
|
||||
DB 000H | 000H | 018H | 001H
|
||||
DB 'D' ; Dump Memory.
|
||||
DW DUMPX
|
||||
DB 000H | 000H | 010H | 002H
|
||||
DB "EC" ; Erase file.
|
||||
DW ERASESD
|
||||
DB 000H | 000H | 008H | 001H
|
||||
DB 'F' ; RFS Floppy boot code.
|
||||
DW FLOPPY
|
||||
DB 000H | 000H | 008H | 001H
|
||||
DB 0AAH ; Original Floppy boot code.
|
||||
DW FDCK
|
||||
DB 000H | 000H | 018H | 001H
|
||||
DB 000H | 000H | 030H | 001H
|
||||
DB 'H' ; Help screen.
|
||||
DW HELP
|
||||
DB 000H | 000H | 000H | 002H
|
||||
@@ -287,10 +291,10 @@ CMDTABLE: DB 000H | 000H | 000H | 001H ; Bit 2
|
||||
DB 000H | 000H | 000H | 002H
|
||||
DB "LR" ; Load from ROM
|
||||
DW LOADROM
|
||||
DB 000H | 000H | 000H | 004H
|
||||
DB 000H | 000H | 010H | 004H
|
||||
DB "LCNX" ; Load from SDCARD without auto execution.
|
||||
DW LOADSDCARDX
|
||||
DB 000H | 000H | 000H | 002H
|
||||
DB 000H | 000H | 010H | 002H
|
||||
DB "LC" ; Load from SD CARD
|
||||
DW LOADSDCARD
|
||||
DB 000H | 000H | 020H | 001H
|
||||
@@ -305,6 +309,9 @@ CMDTABLE: DB 000H | 000H | 000H | 001H ; Bit 2
|
||||
DB 000H | 000H | 038H | 001H
|
||||
DB 'R' ; Memory test.
|
||||
DW MEMTEST
|
||||
DB 000H | 000H | 018H | 004H
|
||||
DB "SD2T" ; Copy SD Card to Tape.
|
||||
DW SD2TAPE
|
||||
DB 000H | 000H | 010H | 002H
|
||||
DB "SC" ; Save to SD CARD
|
||||
DW SAVESDCARD
|
||||
@@ -314,6 +321,9 @@ CMDTABLE: DB 000H | 000H | 000H | 001H ; Bit 2
|
||||
DB 000H | 000H | 020H | 001H
|
||||
DB 'S' ; Save to CMT
|
||||
DW SAVEX
|
||||
DB 000H | 000H | 018H | 004H
|
||||
DB "T2SD" ; Copy Tape to SD Card.
|
||||
DW TAPE2SD
|
||||
DB 000H | 000H | 038H | 001H
|
||||
DB 'T' ; Timer test.
|
||||
DW TIMERTST
|
||||
@@ -540,8 +550,8 @@ DIRROM: DI ; Disab
|
||||
LD (TMPLINECNT),A
|
||||
;
|
||||
LD DE,MSGRDIRLST ; Print out header.
|
||||
RST 018h
|
||||
CALL NL
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW0to6
|
||||
;
|
||||
; Scan MROM Bank
|
||||
; B = Bank Page
|
||||
@@ -712,11 +722,10 @@ LOADROM1: DI
|
||||
;
|
||||
LD A,(ROMBK1)
|
||||
LD (RFSBK1), A
|
||||
LD DE,MSGLDROM
|
||||
RST 018H
|
||||
LD DE,NAME
|
||||
RST 018H
|
||||
CALL NL
|
||||
LD DE,MSGLOAD+1 ; Skip initial CR.
|
||||
LD BC,NAME
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW0to6
|
||||
LD A,(WRKROMBK1)
|
||||
LD (RFSBK1), A
|
||||
|
||||
@@ -727,9 +736,9 @@ LOADROM1: DI
|
||||
LROMNTFND: POP HL ; Dont need execute flag anymore so waste it.
|
||||
LD A,(ROMBK1)
|
||||
LD (RFSBK1),A
|
||||
LD HL,PRINTMSG
|
||||
LD DE,MSGNOTFND ; Not found
|
||||
RST 018h
|
||||
|
||||
CALL BKSW0to6
|
||||
LOADROMEND: EI
|
||||
RET
|
||||
|
||||
@@ -738,11 +747,12 @@ LOADROMEND: EI
|
||||
;
|
||||
LROMLOAD: PUSH BC
|
||||
;
|
||||
LD DE,MSGLDROM
|
||||
RST 018H
|
||||
LD DE,NAME
|
||||
RST 018H
|
||||
CALL NL
|
||||
PUSH BC
|
||||
LD DE,MSGLOAD+1
|
||||
LD BC,NAME
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW0to6
|
||||
POP BC
|
||||
;
|
||||
LD A,B
|
||||
LD (WRKROMBK1),A
|
||||
@@ -838,25 +848,6 @@ LROMLOAD5: POP HL ; Retri
|
||||
JP (HL) ; Execution address.
|
||||
LROMLOAD9: RET
|
||||
|
||||
|
||||
; Load a program from the SD Card into RAM and/or execute it.
|
||||
;
|
||||
; DE points to a number or filename to load.
|
||||
LOADSDCARDX:LD A,0FFH
|
||||
JR LOADSDCARD0
|
||||
LOADSDCARD: LD A,000H
|
||||
LOADSDCARD0:LD (SDAUTOEXEC),A
|
||||
PUSH DE
|
||||
LD HL,0FFFFh ; Tag the filenumber as invalid.
|
||||
LD (TMPCNT), HL
|
||||
CALL ConvertStringToNumber ; See if a file number was given instead of a filename.
|
||||
JR NZ, LOADSDCARD1 ;
|
||||
LD (TMPCNT), HL ; Store filenumber making load by filenumber valid.
|
||||
LOADSDCARD1:POP DE
|
||||
LD HL,LOADSDE
|
||||
CALL BKSW0to2 ; Call the main functionality in Bank2.
|
||||
LOADSDCARD2:RET
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF RFS COMMAND FUNCTIONS.
|
||||
;-------------------------------------------------------------------------------
|
||||
@@ -864,21 +855,11 @@ LOADSDCARD2:RET
|
||||
|
||||
;--------------------------------------
|
||||
;
|
||||
; Message table
|
||||
; Message table - Refer to bank 6 for
|
||||
; all messages.
|
||||
;
|
||||
;--------------------------------------
|
||||
|
||||
MSGSON: DB "+ RFS ", 0ABh, "1.1 **",00DH
|
||||
MSGOK: DB "OK!", 00DH
|
||||
MSGNOTFND: DB "NOT FOUND", 00DH
|
||||
MSGRDIRLST: DB "ROM DIRECTORY:", 00DH
|
||||
MSGTRM: DB 00DH
|
||||
MSGSV: DB "FILENAME? ", 00DH
|
||||
MSGBADCMD: DB "???", 00DH
|
||||
MSGLDROM: DB "LOADING ", 00DH
|
||||
|
||||
|
||||
|
||||
; Bring in additional resources.
|
||||
USE_CMPSTRING: EQU 1
|
||||
USE_SUBSTRING: EQU 0
|
||||
|
||||
@@ -89,14 +89,13 @@ BKSW1to7: PUSH AF
|
||||
PUSH AF
|
||||
LD A, ROMBANK7 ; Required bank to call.
|
||||
;
|
||||
BKSW1_0: PUSH BC ; Save BC for caller.
|
||||
LD BC, BKSWRET1 ; Place bank switchers return address on stack.
|
||||
PUSH BC
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
BKSW1_0: PUSH HL ; Place function to call on stack
|
||||
LD HL, BKSWRET1 ; Place bank switchers return address on stack.
|
||||
EX (SP),HL
|
||||
LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it.
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
JP (HL) ; Jump to required function.
|
||||
BKSWRET1: POP BC
|
||||
POP AF ; Get bank which called us.
|
||||
BKSWRET1: POP AF ; Get bank which called us.
|
||||
LD (RFSBK2), A ; Return to that bank.
|
||||
POP AF
|
||||
RET ; Return to caller.
|
||||
@@ -133,9 +132,9 @@ FLOPPY: PUSH DE ; P
|
||||
CP 00Dh ;
|
||||
JR NZ,GETBOOTDSK ;
|
||||
CALL DSKINIT ; Initialise disk and flags.
|
||||
L000F: CALL NL ; Prompt for the boot drive as non given in call.
|
||||
LD DE,BOOTDRV ;
|
||||
CALL MSG ;
|
||||
L000F: LD DE,MSGBOOTDRV ;
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW1to6
|
||||
LD DE,011A3H ;
|
||||
CALL GETL ;
|
||||
LD A,(DE) ;
|
||||
@@ -164,11 +163,12 @@ L0049: LD C,(HL) ;
|
||||
INC HL ;
|
||||
INC DE ;
|
||||
DJNZ L0049 ;
|
||||
CALL NL ; Ok, we have a bootable disk, so indicate we are booting it...
|
||||
LD DE,IPLLOAD ;
|
||||
CALL MSG ;
|
||||
LD DE,MSGIPLLOAD ;
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW1to6
|
||||
LD DE,0CE07H ; Program name stored at 8th byte in boot sector.
|
||||
CALL MSG ;
|
||||
LD HL,PRTFN
|
||||
CALL BKSW1to6
|
||||
LD HL,(0CE16H) ; Get the load address
|
||||
LD (IX+005H),L ; And store in parameter block at 100D/100E
|
||||
LD (IX+006H),H ;
|
||||
@@ -187,13 +187,12 @@ NOTCPM: LD HL,(0CE14H) ; G
|
||||
LD HL,(0CE18H) ; Get the execution address
|
||||
JP (HL) ; And execute.
|
||||
|
||||
DSKLOADERR:LD DE,LOADERR ; Loading error message
|
||||
DSKLOADERR:LD DE,MSGLOADERR ; Loading error message
|
||||
JR L008F ; (+003h)
|
||||
|
||||
L008C: LD DE,DSKNOTMST ; This is not a boot/master disk message.
|
||||
L008F: CALL NL
|
||||
CALL MSG
|
||||
CALL NL
|
||||
L008C: LD DE,MSGDSKNOTMST ; This is not a boot/master disk message.
|
||||
L008F: LD HL,PRINTMSG
|
||||
CALL BKSW1to6
|
||||
LD DE,ERRTONE ; Play error tone.
|
||||
CALL MELDY
|
||||
;
|
||||
@@ -493,14 +492,13 @@ L0300: IN A,(0D8H) ; Sta
|
||||
|
||||
;--------------------------------------
|
||||
;
|
||||
; Message table
|
||||
; Message table - Refer to bank 6 for
|
||||
; all messages.
|
||||
;
|
||||
;--------------------------------------
|
||||
BOOTDRV: DB "FLOPPY BOOT DRIVE ?", 00DH
|
||||
LOADERR: DB "DISK LOADING ERROR", 00DH
|
||||
IPLLOAD: DB "DISK LOADING ", 00DH
|
||||
|
||||
; Error tone.
|
||||
ERRTONE: DB "A0", 0D7H, "ARA", 0D7H, "AR", 00DH
|
||||
DSKNOTMST: DB "THIS IS NOT A BOOT DISK", 00Dh
|
||||
|
||||
; Identifier to indicate this is a valid boot disk
|
||||
DSKID: DB 002H, "IPLPRO"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -34,7 +34,7 @@ MODE80C EQU 0
|
||||
|
||||
;===========================================================
|
||||
;
|
||||
; USER ROM BANK 3 - Monitor memory and help utilities.
|
||||
; USER ROM BANK 3 - Monitor memory utilities.
|
||||
;
|
||||
;===========================================================
|
||||
ORG UROMADDR
|
||||
@@ -92,48 +92,110 @@ BKSW3to7: PUSH AF
|
||||
PUSH AF
|
||||
LD A, ROMBANK7 ; Required bank to call.
|
||||
;
|
||||
BKSW3_0: PUSH BC ; Save BC for caller.
|
||||
LD BC, BKSWRET3 ; Place bank switchers return address on stack.
|
||||
PUSH BC
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
BKSW3_0: PUSH HL ; Place function to call on stack
|
||||
LD HL, BKSWRET3 ; Place bank switchers return address on stack.
|
||||
EX (SP),HL
|
||||
LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it.
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
JP (HL) ; Jump to required function.
|
||||
BKSWRET3: POP BC
|
||||
POP AF ; Get bank which called us.
|
||||
BKSWRET3: POP AF ; Get bank which called us.
|
||||
LD (RFSBK2), A ; Return to that bank.
|
||||
POP AF
|
||||
RET ; Return to caller.
|
||||
|
||||
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF MEMORY CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF TAPE/SD CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
;
|
||||
; Memory correction
|
||||
; command 'M'
|
||||
;
|
||||
MCORX: CALL GETHEX ; correction address
|
||||
; Method to copy an application on a tape to an SD stored application. The tape drive is read and the first
|
||||
; encountered program is loaded into memory at 0x1200. The CMT header is populated with the correct details (even if
|
||||
; the load address isnt 0x1200, the CMT Header contains the correct value).
|
||||
; A call is then made to write the application to the SD card.
|
||||
;
|
||||
TAPE2SD: ; Load from tape into memory, filling the tape CMT header and loading data into location 0x1200.
|
||||
LD HL,LOADTAPECP ; Call the Loadtape command, non execute version to get the tape contents into memory.
|
||||
CALL BKSW3to4
|
||||
LD A,(RESULT)
|
||||
OR A
|
||||
JR NZ,TAPE2SDERR
|
||||
; Save to SD Card.
|
||||
LD HL,SAVESDCARDX
|
||||
CALL BKSW3to2
|
||||
LD A,(RESULT)
|
||||
OR A
|
||||
JR NZ,TAPE2SDERR
|
||||
LD DE,MSGT2SDOK
|
||||
JR TAPE2SDERR2
|
||||
TAPE2SDERR: LD DE,MSGT2SDERR
|
||||
TAPE2SDERR2:LD HL,PRINTMSG
|
||||
CALL BKSW3to6
|
||||
RET
|
||||
|
||||
; Method to copy an SD stored application to a Cassette tape in the CMT.
|
||||
; The directory entry number or filename is passed to the command and the entry is located within the SD
|
||||
; directory structure. The file is then loaded into memory and the CMT header populated. A call is then made
|
||||
; to write out the data to tap.
|
||||
;
|
||||
SD2TAPE: ; Load from SD, fill the CMT header then call CMT save.
|
||||
LD HL,LOADSDCP
|
||||
CALL BKSW3to2
|
||||
LD A,(RESULT)
|
||||
OR A
|
||||
JR NZ,SD2TAPEERR
|
||||
LD HL,SAVECMT
|
||||
CALL BKSW3to4
|
||||
LD A,(RESULT)
|
||||
OR A
|
||||
JR NZ,SD2TAPEERR
|
||||
RET
|
||||
SD2TAPEERR: LD DE,MSGSD2TERR
|
||||
JR TAPE2SDERR2
|
||||
RET
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF TAPE/SD CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF MEMORY CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
;
|
||||
; Memory correction
|
||||
; command 'M'
|
||||
;
|
||||
MCORX: CALL READ4HEX ; correction address
|
||||
RET C
|
||||
MCORX1: CALL NLPHL ; corr. adr. print
|
||||
CALL SPHEX ; ACC ASCII display
|
||||
CALL PRNTS ; space print
|
||||
CALL BGETLX ; get data & check data
|
||||
CALL HLHEX ; HLASCII(DE)
|
||||
JR C,MCRX3
|
||||
CALL DOT4DE ; INC DE * 4
|
||||
INC DE
|
||||
CALL _2HEX ; data check
|
||||
JR C,MCORX1
|
||||
CP (HL)
|
||||
JR NZ,MCORX1
|
||||
INC DE
|
||||
LD DE,BUFER ; Input the data.
|
||||
CALL GETL
|
||||
LD A,(DE)
|
||||
CP 01Bh ; If . pressed, exit.
|
||||
RET Z
|
||||
PUSH HL
|
||||
POP BC
|
||||
CALL HLHEX ; If the existing address is no longer hex, reset. HLASCII(DE). If it is hex, take as the address to store data into.
|
||||
JR C,MCRX3 ; Line is corrupted as the address is no longer in Hex, reset.
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE ;
|
||||
CALL _2HEX ; Get value entered.
|
||||
JR C,MCORX1 ; Not hex, reset.
|
||||
CP (HL) ; Not same as memory, reset.
|
||||
JR NZ,MCORX1
|
||||
INC DE ;
|
||||
LD A,(DE) ; Check if no data just CR, if so, move onto next address.
|
||||
CP 00Dh ; not correction
|
||||
JR Z,MCRX2
|
||||
CALL _2HEX ; ACCHL(ASCII)
|
||||
JR C,MCORX1
|
||||
LD (HL),A ; data correct
|
||||
CALL _2HEX ; Get the new entered data. ACCHL(ASCII)
|
||||
JR C,MCORX1 ; New data not hex, reset.
|
||||
LD (HL),A ; data correct so store.
|
||||
MCRX2: INC HL
|
||||
JR MCORX1
|
||||
MCRX3: LD H,B ; memory address
|
||||
@@ -141,17 +203,52 @@ MCRX3: LD H,B ; memor
|
||||
JR MCORX1
|
||||
|
||||
|
||||
DUMPX: CALL GETHEX
|
||||
CALL DOT4DE
|
||||
; Dump method when called interbank as HL cannot be passed.
|
||||
;
|
||||
; BC = Start
|
||||
; DE = End
|
||||
DUMPBC: PUSH BC
|
||||
POP HL
|
||||
JR DUMP
|
||||
|
||||
; Command line utility to dump memory.
|
||||
; Get start and optional end addresses from the command line, ie. XXXX[XXXX]
|
||||
; Paging is implemented, 23 lines at a time, pressing U goes back 100H, pressing D scrolls down 100H
|
||||
;
|
||||
DUMPX: CALL HLHEX ; Get start address if present into HL
|
||||
JR NC,DUMPX1
|
||||
LD DE,(DUMPADDR) ; Setup default start and end.
|
||||
JR DUMPX2
|
||||
DUMPX1: INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
PUSH HL
|
||||
CALL HLHEX
|
||||
POP DE
|
||||
JR C,DUM4
|
||||
DUM1: EX DE,HL
|
||||
DUM3: LD B,008h
|
||||
LD C,017h
|
||||
CALL NLPHL
|
||||
DUM2: CALL SPHEX
|
||||
CALL HLHEX ; Get end address if present into HL
|
||||
POP DE ; DE = Start address
|
||||
JR NC,DUMPX4 ; Both present? Then display.
|
||||
DUMPX2: LD A,(SCRNMODE)
|
||||
OR A
|
||||
LD HL,000A0h ; Make up an end address based on 160 bytes from start for 40 column mode.
|
||||
JR Z,DUMPX3
|
||||
LD HL,00140h ; Make up an end address based on 320 bytes from start for 80 column mode.
|
||||
DUMPX3: ADD HL,DE
|
||||
DUMPX4: EX DE,HL
|
||||
;
|
||||
; HL = Start
|
||||
; DE = End
|
||||
DUMP: LD A,23
|
||||
DUMP0: LD (TMPCNT),A
|
||||
LD A,(SCRNMODE) ; Configure output according to screen mode, 40/80 chars.
|
||||
OR A
|
||||
JR NZ,DUMP1
|
||||
LD B,008H ; 40 Char, output 23 lines of 40 char.
|
||||
LD C,017H
|
||||
JR DUMP2
|
||||
DUMP1: LD B,010h ; 80 Char, output 23 lines of 80 char.
|
||||
LD C,02Fh
|
||||
DUMP2: CALL NLPHL
|
||||
DUMP3: CALL SPHEX
|
||||
INC HL
|
||||
PUSH AF
|
||||
LD A,(DSPXY)
|
||||
@@ -159,9 +256,9 @@ DUM2: CALL SPHEX
|
||||
LD (DSPXY),A
|
||||
POP AF
|
||||
CP 020h
|
||||
JR NC,L0D51
|
||||
JR NC,DUMP4
|
||||
LD A,02Eh
|
||||
L0D51: CALL ?ADCN
|
||||
DUMP4: CALL ?ADCN
|
||||
CALL PRNT3
|
||||
LD A,(DSPXY)
|
||||
INC C
|
||||
@@ -173,32 +270,49 @@ L0D51: CALL ?ADCN
|
||||
PUSH HL
|
||||
SBC HL,DE
|
||||
POP HL
|
||||
JR Z,L0D85
|
||||
LD A,0F8h
|
||||
LD (0E000h),A
|
||||
NOP
|
||||
LD A,(0E001h)
|
||||
CP 0FEh
|
||||
JR NZ,L0D78
|
||||
CALL ?BLNK
|
||||
L0D78: DJNZ DUM2
|
||||
L0D7A: CALL ?KEY
|
||||
JR NC,DUMP9
|
||||
DUMP5: DJNZ DUMP3
|
||||
LD A,(TMPCNT)
|
||||
DEC A
|
||||
JR NZ,DUMP0
|
||||
DUMP6: CALL GETKY ; Pause, X to quit, D to go down a block, U to go up a block.
|
||||
OR A
|
||||
JR Z,L0D7A
|
||||
CALL BRKEY
|
||||
JP NZ,DUM3
|
||||
L0D85: RET ; JR LEA76
|
||||
DUM4: LD HL,000A0h
|
||||
ADD HL,DE
|
||||
JR DUM1
|
||||
JR Z,DUMP6
|
||||
CP 'D'
|
||||
JR NZ,DUMP7
|
||||
LD A,8
|
||||
JR DUMP0
|
||||
DUMP7: CP 'U'
|
||||
JR NZ,DUMP8
|
||||
PUSH DE
|
||||
LD DE,00100H
|
||||
OR A
|
||||
SBC HL,DE
|
||||
POP DE
|
||||
LD A,8
|
||||
JR DUMP0
|
||||
DUMP8: CP 'X'
|
||||
JR Z,DUMP9
|
||||
JR DUMP
|
||||
DUMP9: LD (DUMPADDR),HL ; Store last address so we can just press D for next page,
|
||||
CALL NL
|
||||
RET
|
||||
|
||||
; Clear memory.
|
||||
INITMEMX: LD DE,MSG_INITM
|
||||
CALL MSG
|
||||
CALL LETNL
|
||||
|
||||
; Cmd tool to clear memory.
|
||||
; Read cmd line for an init byte, if one not present, use 00H
|
||||
;
|
||||
INITMEMX: CALL _2HEX
|
||||
JR NC,INITMEMX1
|
||||
LD A,000H
|
||||
INITMEMX1: PUSH AF
|
||||
LD DE,MSGINITM
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW1to6
|
||||
LD HL,1200h
|
||||
LD BC,0D000h - 1200h
|
||||
CLEAR1: LD A,00h
|
||||
POP DE
|
||||
CLEAR1: LD A,D
|
||||
LD (HL),A
|
||||
INC HL
|
||||
DEC BC
|
||||
@@ -207,79 +321,107 @@ CLEAR1: LD A,00h
|
||||
JP NZ,CLEAR1
|
||||
RET
|
||||
|
||||
BGETLX: EX (SP),HL
|
||||
POP BC
|
||||
|
||||
; Method to get the CMT parameters from the command line.
|
||||
; The parameters which should be given are:
|
||||
; XXXXYYYYZZZZ - where XXXX = Start Address, YYYY = End Address, ZZZZ = Execution Address.
|
||||
; If the start, end and execution address parameters are correct, prompt for a filename which will be written into the CMT header.
|
||||
; Output: Reg C = 0 - Success
|
||||
; = 1 - Error.
|
||||
GETCMTPARM: CALL READ4HEX ; Start address
|
||||
JR C,GETCMT1
|
||||
LD (DTADR),HL ; data adress buffer
|
||||
LD B,H
|
||||
LD C,L
|
||||
CALL READ4HEX ; End address
|
||||
JR C,GETCMT1
|
||||
LD (SIZE),HL ; byte size buffer
|
||||
CALL READ4HEX ; Execution address
|
||||
JR C,GETCMT1
|
||||
LD (EXADR),HL ; buffer
|
||||
CALL NL
|
||||
LD DE,MSGSAVE ; 'FILENAME? '
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW2to6 ; Print out the filename.
|
||||
LD DE,BUFER
|
||||
CALL GETL
|
||||
LD A,(DE)
|
||||
CP 01Bh
|
||||
JP Z,GETHEX2
|
||||
JP (HL)
|
||||
|
||||
GETHEX: EX (SP),IY
|
||||
POP AF
|
||||
CALL HLHEX
|
||||
JR C,GETHEX2
|
||||
JP (IY)
|
||||
GETHEX2: POP AF ; Waste the intermediate caller address
|
||||
RET
|
||||
LD HL,BUFER+10
|
||||
LD DE,NAME ; name buffer
|
||||
LD BC,FNSIZE
|
||||
LDIR ; C = 0 means success.
|
||||
RET
|
||||
GETCMT1: LD C,1 ; C = 1 means an error occured.
|
||||
RET
|
||||
|
||||
|
||||
; INCREMENT DE REG.
|
||||
DOT4DE: INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
RET
|
||||
; Method to read 4 bytes from a buffer pointed to by DE and attempt to convert to a 16bit number. If it fails, print out an error
|
||||
; message and return with C set.
|
||||
;
|
||||
; Input: DE = Address of digits to conver.
|
||||
; Output: HL = 16 bit number.
|
||||
|
||||
; SPACE PRINT AND DISP ACC
|
||||
; INPUT:HL=DISP. ADR.
|
||||
SPHEX: CALL PRNTS ; SPACE PRINT
|
||||
LD A,(HL)
|
||||
CALL PRTHX ; DSP OF ACC (ASCII)
|
||||
LD A,(HL)
|
||||
RET
|
||||
READ4HEX: CALL HLHEX
|
||||
JR C,READ4HEXERR
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
OR A ; Clear carry flag.
|
||||
RET
|
||||
READ4HEXERR:LD DE,MSGREAD4HEX ; Load up error message, print and exit.
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW1to6
|
||||
SCF
|
||||
RET
|
||||
|
||||
; NEW LINE AND PRINT HL REG (ASCII)
|
||||
NLPHL: CALL NL
|
||||
CALL PRTHL
|
||||
RET
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF MEMORY CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
; SPACE PRINT AND DISP ACC
|
||||
; INPUT:HL=DISP. ADR.
|
||||
SPHEX: CALL PRNTS ; SPACE PRINT
|
||||
LD A,(HL)
|
||||
CALL PRTHX ; DSP OF ACC (ASCII)
|
||||
LD A,(HL)
|
||||
RET
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF PRINTER CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
PTESTX: LD A,(DE)
|
||||
CP '&' ; plotter test
|
||||
JR NZ,PTST1X
|
||||
PTST0X: INC DE
|
||||
LD A,(DE)
|
||||
CP 'L' ; 40 in 1 line
|
||||
JR Z,.LPTX
|
||||
CP 'S' ; 80 in 1 line
|
||||
JR Z,..LPTX
|
||||
CP 'C' ; Pen change
|
||||
JR Z,PENX
|
||||
CP 'G' ; Graph mode
|
||||
JR Z,PLOTX
|
||||
CP 'T' ; Test
|
||||
JR Z,PTRNX
|
||||
; NEW LINE AND PRINT HL REG (ASCII)
|
||||
NLPHL: CALL NL
|
||||
CALL PRTHL
|
||||
RET
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF MEMORY CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF PRINTER CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
PTESTX: LD A,(DE)
|
||||
CP '&' ; plotter test
|
||||
JR NZ,PTST1X
|
||||
PTST0X: INC DE
|
||||
LD A,(DE)
|
||||
CP 'L' ; 40 in 1 line
|
||||
JR Z,.LPTX
|
||||
CP 'S' ; 80 in 1 line
|
||||
JR Z,..LPTX
|
||||
CP 'C' ; Pen change
|
||||
JR Z,PENX
|
||||
CP 'G' ; Graph mode
|
||||
JR Z,PLOTX
|
||||
CP 'T' ; Test
|
||||
JR Z,PTRNX
|
||||
;
|
||||
PTST1X: CALL PMSGX
|
||||
ST1X2: RET
|
||||
.LPTX: LD DE,LLPT ; 01-09-09-0B-0D
|
||||
JR PTST1X
|
||||
..LPTX: LD DE,SLPT ; 01-09-09-09-0D
|
||||
JR PTST1X
|
||||
PTRNX: LD A,004h ; Test pattern
|
||||
JR LE999
|
||||
PLOTX: LD A,002h ; Graph mode
|
||||
LE999: CALL LPRNTX
|
||||
JR PTST0X
|
||||
PENX: LD A,01Dh ; 1 change code (text mode)
|
||||
JR LE999
|
||||
PTST1X: CALL PMSGX
|
||||
ST1X2: RET
|
||||
.LPTX: LD DE,LLPT ; 01-09-09-0B-0D
|
||||
JR PTST1X
|
||||
..LPTX: LD DE,SLPT ; 01-09-09-09-0D
|
||||
JR PTST1X
|
||||
PTRNX: LD A,004h ; Test pattern
|
||||
JR LE999
|
||||
PLOTX: LD A,002h ; Graph mode
|
||||
LE999: CALL LPRNTX
|
||||
JR PTST0X
|
||||
PENX: LD A,01Dh ; 1 change code (text mode)
|
||||
JR LE999
|
||||
;
|
||||
;
|
||||
; 1 char print to $LPT
|
||||
@@ -287,36 +429,36 @@ PENX: LD A,01Dh ; 1 cha
|
||||
; in: ACC print data
|
||||
;
|
||||
;
|
||||
LPRNTX: LD C,000h ; RDAX test
|
||||
LD B,A ; print data store
|
||||
CALL RDAX
|
||||
LD A,B
|
||||
OUT (0FFh),A ; data out
|
||||
LD A,080h ; RDP high
|
||||
OUT (0FEh),A
|
||||
LD C,001h ; RDA test
|
||||
CALL RDAX
|
||||
XOR A ; RDP low
|
||||
OUT (0FEh),A
|
||||
RET
|
||||
LPRNTX: LD C,000h ; RDAX test
|
||||
LD B,A ; print data store
|
||||
CALL RDAX
|
||||
LD A,B
|
||||
OUT (0FFh),A ; data out
|
||||
LD A,080h ; RDP high
|
||||
OUT (0FEh),A
|
||||
LD C,001h ; RDA test
|
||||
CALL RDAX
|
||||
XOR A ; RDP low
|
||||
OUT (0FEh),A
|
||||
RET
|
||||
;
|
||||
; $LPT msg.
|
||||
; in: DE data low address
|
||||
; 0D msg. end
|
||||
;
|
||||
PMSGX: PUSH DE
|
||||
PUSH BC
|
||||
PUSH AF
|
||||
PMSGX1: LD A,(DE) ; ACC = data
|
||||
CALL LPRNTX
|
||||
LD A,(DE)
|
||||
INC DE
|
||||
CP 00Dh ; end ?
|
||||
JR NZ,PMSGX1
|
||||
POP AF
|
||||
POP BC
|
||||
POP DE
|
||||
RET
|
||||
PMSGX: PUSH DE
|
||||
PUSH BC
|
||||
PUSH AF
|
||||
PMSGX1: LD A,(DE) ; ACC = data
|
||||
CALL LPRNTX
|
||||
LD A,(DE)
|
||||
INC DE
|
||||
CP 00Dh ; end ?
|
||||
JR NZ,PMSGX1
|
||||
POP AF
|
||||
POP BC
|
||||
POP DE
|
||||
RET
|
||||
|
||||
;
|
||||
; RDA check
|
||||
@@ -351,86 +493,13 @@ SLPT: DB 01H ; TEXT
|
||||
; END OF PRINTER CMDLINE TOOLS FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF HELP SCREEN FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
; Simple help screen to display commands.
|
||||
HELP: CALL NL
|
||||
LD DE, HELPSCR
|
||||
CALL PRTSTR
|
||||
RET
|
||||
|
||||
; Modification of original MSG function, use NULL terminated strings not CR terminated and include page pause.
|
||||
PRTSTR: PUSH AF
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
LD A,0
|
||||
LD (TMPLINECNT),A
|
||||
PRTSTR1: LD A,(DE)
|
||||
CP 000H
|
||||
JR Z,PRTSTRE
|
||||
CP 00DH
|
||||
JR Z,PRTSTR3
|
||||
PRTSTR2: CALL PRNT
|
||||
INC DE
|
||||
JR PRTSTR1
|
||||
PRTSTR3: PUSH AF
|
||||
LD A,(TMPLINECNT)
|
||||
CP 24
|
||||
JR Z,PRTSTR5
|
||||
INC A
|
||||
PRTSTR4: LD (TMPLINECNT),A
|
||||
POP AF
|
||||
JR PRTSTR2
|
||||
PRTSTR5: CALL GETKY
|
||||
CP ' '
|
||||
JR NZ,PRTSTR5
|
||||
XOR A
|
||||
JR PRTSTR4
|
||||
PRTSTRE: POP DE
|
||||
POP BC
|
||||
POP AF
|
||||
RET
|
||||
|
||||
; Help text. Use of lower case, due to Sharp's non standard character set, is not easy, you have to manually code each byte
|
||||
; hence using upper case.
|
||||
HELPSCR: DB "4 - 40 COL MODE.", 00DH
|
||||
DB "8 - 80 COL MODE.", 00DH
|
||||
DB "B - TOGGLE KEYBOARD BELL.", 00DH
|
||||
DB "C - CLEAR MEMORY $1200-$D000.", 00DH
|
||||
DB "DXXXX[YYYY] - DUMP MEM XXXX TO YYYY.", 00DH
|
||||
DB "F[X] - BOOT FD DRIVE X.", 00DH
|
||||
DB 0AAH," - BOOT FD ORIGINAL ROM.", 00DH
|
||||
DB "H - THIS HELP SCREEN.", 00DH
|
||||
DB "IR/IC - RFS DIR LISTING ROM/SD CARD.", 00DH
|
||||
DB "JXXXX - JUMP TO LOCATION XXXX.", 00DH
|
||||
DB "LT[FN]- LOAD TAPE, FN=FILENAME", 00DH
|
||||
DB "LR[FN]- LOAD ROM, FN=NO OR NAME", 00DH
|
||||
DB "LC[FN]- LOAD SDCARD, FN=NO OR NAME", 00DH
|
||||
DB " - ADD NX FOR NO EXEC, IE.LRNX.", 00DH
|
||||
DB "MXXXX - EDIT MEMORY STARTING AT XXXX.", 00DH
|
||||
DB "P - TEST PRINTER.", 00DH
|
||||
DB "R - TEST DRAM MEMORY.", 00DH
|
||||
DB "ST[XXXXYYYYZZZZ] - SAVE MEM TO TAPE.", 00DH
|
||||
DB "SC[XXXXYYYYZZZZ] - SAVE MEM TO CARD.", 00DH
|
||||
DB " XXXX=START,YYYY=END,ZZZZ=EXEC", 00DH
|
||||
DB "T - TEST TIMER.", 00DH
|
||||
DB "V - VERIFY TAPE SAVE.", 00DH
|
||||
DB 000H
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF HELP SCREEN FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
;--------------------------------------
|
||||
;
|
||||
; Message table
|
||||
; Message table - Refer to bank 6 for
|
||||
; all messages.
|
||||
;
|
||||
;--------------------------------------
|
||||
|
||||
MSG_INITM: DB "INIT MEMORY", 00DH
|
||||
|
||||
ALIGN 0EFFFh
|
||||
DB 0FFh
|
||||
|
||||
@@ -88,14 +88,13 @@ BKSW4to7: PUSH AF
|
||||
PUSH AF
|
||||
LD A, ROMBANK7 ; Required bank to call.
|
||||
;
|
||||
BKSW4_0: PUSH BC ; Save BC for caller.
|
||||
LD BC, BKSWRET4 ; Place bank switchers return address on stack.
|
||||
PUSH BC
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
BKSW4_0: PUSH HL ; Place function to call on stack
|
||||
LD HL, BKSWRET4 ; Place bank switchers return address on stack.
|
||||
EX (SP),HL
|
||||
LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it.
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
JP (HL) ; Jump to required function.
|
||||
BKSWRET4: POP BC
|
||||
POP AF ; Get bank which called us.
|
||||
BKSWRET4: POP AF ; Get bank which called us.
|
||||
LD (RFSBK2), A ; Return to that bank.
|
||||
POP AF
|
||||
RET ; Return to caller.
|
||||
@@ -105,42 +104,61 @@ BKSWRET4: POP BC
|
||||
; START OF CMT CONTROLLER FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
; Programm load
|
||||
;
|
||||
; cmd. 'L'
|
||||
;
|
||||
LOADTAPENX: LD L,0FFH
|
||||
; CMT Utility to Load a program from tape.
|
||||
;
|
||||
; Three entry points:
|
||||
; LOADTAPE = Load the first program shifting to lo memory if required and execute.
|
||||
; LOADTAPENX = Load the first program and return without executing.
|
||||
; LOADTAPECP = Load the first program to address 0x1200 and return.
|
||||
;
|
||||
LOADTAPECP: LD A,0FFH
|
||||
LD (CMTAUTOEXEC),A
|
||||
JR LOADTAPE2
|
||||
LOADTAPENX: LD A,0FFH
|
||||
JR LOADTAPE1
|
||||
LOADTAPE: LD L,000H
|
||||
LOADTAPE1: PUSH HL ; Preserve auto execute flag.
|
||||
LOADTAPE: LD A,000H
|
||||
LOADTAPE1: LD (CMTAUTOEXEC),A
|
||||
XOR A
|
||||
LOADTAPE2: LD (CMTCOPY),A ; Set cmt copy mode, 0xFF if we are copying.
|
||||
LD A,0FFH ; If called interbank, set a result code in memory to detect success.
|
||||
LD (RESULT),A
|
||||
CALL ?RDI
|
||||
JP C,?ERX2
|
||||
CALL NL
|
||||
LD DE,MSG?2 ; 'LOADING '
|
||||
RST 018h
|
||||
LD DE,NAME
|
||||
RST 018h
|
||||
LD DE,MSGLOAD ; 'LOADING '
|
||||
LD BC,NAME
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW4to6
|
||||
XOR A
|
||||
LD (BUFER),A
|
||||
LD HL,(DTADR)
|
||||
LD (CMTLOLOAD),A
|
||||
|
||||
LD HL,(DTADR) ; Common code, store load address in case we shift or manipulate loading.
|
||||
LD (DTADRSTORE),HL
|
||||
|
||||
LD A,(CMTCOPY) ; If were copying we always load at 0x1200.
|
||||
OR A
|
||||
JR Z,LOADTAPE3
|
||||
LD HL,01200H
|
||||
LD (DTADR),HL
|
||||
|
||||
LOADTAPE3: LD HL,(DTADR) ; If were loading and the load address is below 0x1200, shift it to 0x1200 to load then move into correct location.
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,LE941
|
||||
LD HL,(EXADR)
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,LE941
|
||||
JR NZ,LOADTAPE4
|
||||
LD A,0FFh
|
||||
LD (BUFER),A
|
||||
LD (CMTLOLOAD),A
|
||||
LD HL,01200h
|
||||
LD (DTADR),HL
|
||||
LE941: CALL ?RDD
|
||||
LOADTAPE4: CALL ?RDD
|
||||
JP C,?ERX2
|
||||
POP HL ; Get back the auto execute flag.
|
||||
LD A,L
|
||||
LD HL,(DTADRSTORE) ; Restore the original load address into the CMT header.
|
||||
LD (DTADR),HL
|
||||
LD A,(CMTCOPY)
|
||||
OR A
|
||||
JR Z,LOADTAPE4 ; Dont execute.
|
||||
LD A,(BUFER)
|
||||
JR NZ,LOADTAPE6
|
||||
LOADTAPE5: LD A,(CMTAUTOEXEC) ; Get back the auto execute flag.
|
||||
OR A
|
||||
JR NZ,LOADTAPE6 ; Dont execute..
|
||||
LD A,(CMTLOLOAD)
|
||||
CP 0FFh
|
||||
JR Z,LOADTAPELM ; Execute at low memory?
|
||||
LD BC,00100h
|
||||
@@ -152,56 +170,127 @@ LOADTAPELM: LD A,(MEMSW) ; Perfo
|
||||
LD BC,(SIZE)
|
||||
LDIR
|
||||
LD BC,00100h
|
||||
JP 00000h
|
||||
LOADTAPE4: RET
|
||||
|
||||
;
|
||||
; Programm save
|
||||
;
|
||||
; cmd. 'S'
|
||||
;
|
||||
SAVEX: CALL HEXIY ; Start address
|
||||
LD (DTADR),HL ; data adress buffer
|
||||
LD B,H
|
||||
LD C,L
|
||||
CALL INC4DE
|
||||
CALL HEXIY ; End address
|
||||
SBC HL,BC ; byte size
|
||||
INC HL
|
||||
LD (SIZE),HL ; byte size buffer
|
||||
CALL INC4DE
|
||||
CALL HEXIY ; execute address
|
||||
LD (EXADR),HL ; buffer
|
||||
CALL NL
|
||||
LD DE,MSGSAVE ; 'FILENAME? '
|
||||
RST 018h
|
||||
CALL GETLHEX ; filename input
|
||||
CALL INC4DE
|
||||
CALL INC4DE
|
||||
LD HL,NAME ; name buffer
|
||||
SAVX1: INC DE
|
||||
LD A,(DE)
|
||||
LD (HL),A ; filename trans.
|
||||
INC HL
|
||||
CP 00Dh ; end code
|
||||
JR NZ,SAVX1
|
||||
LD A,OBJCD ; attribute: OBJ
|
||||
LD (ATRB),A
|
||||
CALL ?WRI
|
||||
?ERX1: JP C,?ERX2
|
||||
CALL ?WRD ; data
|
||||
JR C,?ERX1
|
||||
CALL NL
|
||||
LD DE,MSGOK ; 'OK!'
|
||||
RST 018h
|
||||
LD HL,(EXADR) ; Fetch exec address and run.
|
||||
JP (HL)
|
||||
LOADTAPE6: LD DE,MSGCMTDATA
|
||||
PUSH HL ; Load address as parameter 2.
|
||||
LD HL,(EXADR)
|
||||
PUSH HL ; Execution address as parameter 1.
|
||||
LD BC,(SIZE) ; Size as BC parameter.
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW4to6
|
||||
POP BC
|
||||
POP BC ; Waste parameters.
|
||||
XOR A ; Success.
|
||||
LD (RESULT),A
|
||||
RET
|
||||
|
||||
|
||||
; SA1510 Routine to write a tape header. Copied into the RFS and modified to merge better
|
||||
; with the RFS interface.
|
||||
;
|
||||
CMTWRI: DI
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
PUSH HL
|
||||
LD D,0D7H
|
||||
LD E,0CCH
|
||||
LD HL,IBUFE
|
||||
LD BC,00080H
|
||||
CALL CKSUM
|
||||
CALL MOTOR
|
||||
JR C,CMTWRI2
|
||||
LD A,E
|
||||
CP 0CCH
|
||||
JR NZ,CMTWRI1
|
||||
PUSH HL
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
LD DE,MSGCMTWRITE
|
||||
LD BC,NAME
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW4to6
|
||||
POP BC
|
||||
POP DE
|
||||
POP HL
|
||||
CMTWRI1: CALL GAP
|
||||
CALL WTAPE
|
||||
CMTWRI2: POP HL
|
||||
POP BC
|
||||
POP DE
|
||||
CALL MSTOP
|
||||
PUSH AF
|
||||
LD A,(TIMFG)
|
||||
CP 0F0H
|
||||
JR NZ,CMTWRI3
|
||||
EI
|
||||
CMTWRI3: POP AF
|
||||
RET
|
||||
|
||||
|
||||
; Method to save an application stored in memory to a cassette in the CMT. The start, size and execution address are either given in BUFER via the
|
||||
; command line and the a filename is prompted for and read, or alternatively all the data is passed into the function already set in the CMT header.
|
||||
; The tape is then opened and the header + data are written out.
|
||||
;
|
||||
SAVECMT: LD A,0FFH ; Set SDCOPY to indicate this is a copy command and not a command line save.
|
||||
JR SAVEX1
|
||||
;
|
||||
; Normal entry point, the cmdline contains XXXXYYYYZZZZ where XXXX=start, YYYY=size, ZZZZ=exec addr. A filenname is prompted for and read.
|
||||
; The data is stored in the CMT header prior to writing out the header and data..
|
||||
;
|
||||
SAVEX: LD HL,GETCMTPARM ; Get the CMT parameters.
|
||||
CALL BKSW4to3
|
||||
LD A,C
|
||||
OR A
|
||||
RET NZ ; Exit if an error occurred.
|
||||
|
||||
XOR A
|
||||
SAVEX1: LD (SDCOPY),A
|
||||
LD A,0FFH
|
||||
LD (RESULT),A ; For interbank calls, pass result via a memory variable. Assume failure unless updated.
|
||||
LD A,OBJCD ; Set attribute: OBJ
|
||||
LD (ATRB),A
|
||||
CALL CMTWRI ; Commence header write. Header doesnt need updating for header write.
|
||||
?ERX1: JP C,?ERX2
|
||||
|
||||
LD A,(SDCOPY)
|
||||
OR A
|
||||
JR Z,SAVEX2
|
||||
LD DE,(DTADR)
|
||||
LD A,D ; If copying and address is below 1000H, then data is held at 1200H so update header for write.
|
||||
CP 001H
|
||||
JR NC,SAVEX2
|
||||
LD DE,01200H
|
||||
LD (DTADR),DE
|
||||
SAVEX2: CALL ?WRD ; data
|
||||
JR C,?ERX1
|
||||
LD DE,MSGSAVEOK ; 'OK!'
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW4to6
|
||||
LD A,0 ; Success.
|
||||
LD (RESULT),A
|
||||
RET
|
||||
?ERX2: CP 002h
|
||||
JR NZ,?ERX3
|
||||
LD (RESULT),A ; Set break key pressed code.
|
||||
RET Z
|
||||
?ERX3: LD DE,MSGE1 ; 'CHECK SUM ER.'
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW4to6
|
||||
RET
|
||||
|
||||
|
||||
; Method to verify that a tape write occurred free of error. After a write, the tape is read and compared with the memory that created it.
|
||||
;
|
||||
VRFYX: CALL ?VRFY
|
||||
JP C,?ERX2
|
||||
LD DE,MSGOK ; 'OK!'
|
||||
RST 018h
|
||||
LD HL,PRINTMSG
|
||||
CALL BKSW4to6
|
||||
RET
|
||||
|
||||
; Method to toggle the audible key press sound, ie a beep when a key is pressed.
|
||||
;
|
||||
SGX: LD A,(SWRK)
|
||||
RRA
|
||||
CCF
|
||||
@@ -209,90 +298,16 @@ SGX: LD A,(SWRK)
|
||||
LD (SWRK),A
|
||||
RET
|
||||
|
||||
?ERX2: CP 002h
|
||||
RET Z
|
||||
CALL NL
|
||||
LD DE,MSGE1 ; 'CHECK SUM ER.'
|
||||
RST 018h
|
||||
RET
|
||||
|
||||
HEXIY: EX (SP),IY
|
||||
POP AF
|
||||
CALL HLHEX
|
||||
JR C,HEXIY ; Exit if the input is invalid
|
||||
JP (IY)
|
||||
HEXIY2: POP AF ; Waste the intermediate caller address
|
||||
RET ; Return to command processor.
|
||||
|
||||
; INCREMENT DE REG.
|
||||
INC4DE: INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
INC DE
|
||||
RET
|
||||
|
||||
GETLHEX: EX (SP),HL
|
||||
POP BC
|
||||
LD DE,BUFER
|
||||
CALL GETL
|
||||
LD A,(DE)
|
||||
CP 01Bh
|
||||
JR Z,HEXIY2
|
||||
JP (HL)
|
||||
|
||||
|
||||
;FNINP: CALL NL
|
||||
; LD DE,MSGSV ; 'FILENAME? '
|
||||
; RST 018h
|
||||
; LD DE,BUFER
|
||||
; CALL GETL
|
||||
; LD A,(DE)
|
||||
; CP #1B
|
||||
; JR NZ,LEAF3
|
||||
; ;LD HL,ST1X
|
||||
; ;EX (SP),HL
|
||||
; RET
|
||||
;
|
||||
;LEAF3: LD B,000h
|
||||
; LD DE,011ADh
|
||||
; LD HL,BUFER
|
||||
; LD A,(DE)
|
||||
; CP 00Dh
|
||||
; JR Z,LEB20
|
||||
;LEB00: CP 020h
|
||||
; JR NZ,LEB08
|
||||
; INC DE
|
||||
; LD A,(DE)
|
||||
; JR LEB00
|
||||
;LEB08: CP 022h
|
||||
; JR Z,LEB14
|
||||
;LEB0C: LD (HL),A
|
||||
; INC HL
|
||||
; INC B
|
||||
; LD A,011h
|
||||
; CP B
|
||||
; JR Z,FNINP
|
||||
;LEB14: INC DE
|
||||
; LD A,(DE)
|
||||
; CP 022h
|
||||
; JR Z,LEB1E
|
||||
; CP 00Dh
|
||||
; JR NZ,LEB0C
|
||||
;LEB1E: LD A,00dh
|
||||
;LEB20: LD (HL),A
|
||||
; RET
|
||||
;
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF CMT CONTROLLER FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------
|
||||
;
|
||||
; Message table
|
||||
; Message table - Refer to bank 6 for
|
||||
; all messages.
|
||||
;
|
||||
;--------------------------------------
|
||||
MSGSAVE: DB "FILENAME? ", 00DH
|
||||
|
||||
ALIGN 0EFFFh
|
||||
DB 0FFh
|
||||
|
||||
@@ -88,14 +88,13 @@ BKSW5to7: PUSH AF
|
||||
PUSH AF
|
||||
LD A, ROMBANK7 ; Required bank to call.
|
||||
;
|
||||
BKSW5_0: PUSH BC ; Save BC for caller.
|
||||
LD BC, BKSWRET5 ; Place bank switchers return address on stack.
|
||||
PUSH BC
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
BKSW5_0: PUSH HL ; Place function to call on stack
|
||||
LD HL, BKSWRET5 ; Place bank switchers return address on stack.
|
||||
EX (SP),HL
|
||||
LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it.
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
JP (HL) ; Jump to required function.
|
||||
BKSWRET5: POP BC
|
||||
POP AF ; Get bank which called us.
|
||||
BKSWRET5: POP AF ; Get bank which called us.
|
||||
LD (RFSBK2), A ; Return to that bank.
|
||||
POP AF
|
||||
RET ; Return to caller.
|
||||
|
||||
@@ -88,19 +88,369 @@ BKSW6to7: PUSH AF
|
||||
PUSH AF
|
||||
LD A, ROMBANK7 ; Required bank to call.
|
||||
;
|
||||
BKSW6_0: PUSH BC ; Save BC for caller.
|
||||
LD BC, BKSWRET6 ; Place bank switchers return address on stack.
|
||||
PUSH BC
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
BKSW6_0: PUSH HL ; Place function to call on stack
|
||||
LD HL, BKSWRET6 ; Place bank switchers return address on stack.
|
||||
EX (SP),HL
|
||||
LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it.
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
JP (HL) ; Jump to required function.
|
||||
BKSWRET6: POP BC
|
||||
POP AF ; Get bank which called us.
|
||||
BKSWRET6: POP AF ; Get bank which called us.
|
||||
LD (RFSBK2), A ; Return to that bank.
|
||||
POP AF
|
||||
RET ; Return to caller.
|
||||
|
||||
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF PRINT ROUTINE METHODS
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
; Method to print out a true ASCII character, not the Sharp values. This is done using the mapping table ATBL for the
|
||||
; range 0..127, 128.. call the original Sharp routine.
|
||||
; Input: A = Ascii character.
|
||||
PRINTASCII: PUSH HL
|
||||
PUSH BC
|
||||
CP 080H ; Anything above 080H isnt ascii so call original routine.
|
||||
JR NC,PRINTASCII1
|
||||
CP 00DH ; Carriage Return? Dont map just execute via original Sharp call.
|
||||
JR Z,PRINTASCII1
|
||||
LD HL,ATBL
|
||||
LD C,A
|
||||
LD B,0
|
||||
ADD HL,BC
|
||||
LD A,(HL)
|
||||
CALL ?DSP
|
||||
PRINTASCII0:POP BC
|
||||
POP HL
|
||||
RET
|
||||
PRINTASCII1:CALL PRNT
|
||||
JR PRINTASCII0
|
||||
|
||||
; Method to print out a string residing in this bank.
|
||||
;
|
||||
; As string messages take up space and banks are limited, it makes sense to locate all strings in one
|
||||
; bank and print them out from here, hence this method.
|
||||
;
|
||||
; Also, as strings often require embedded values to be printed (aka printf), a basic mechanism for printing out stack
|
||||
; parameters is provided. A PUSH before calling this method followed by an embedded marker (ie. 0xFF) will see the stack
|
||||
; value printed in hex at the point in the string where the marker appears.
|
||||
;
|
||||
; Input: DE = Address, in this bank or any other location EXCEPT another bank.
|
||||
; BC = Value to print with marker 0xFB if needed.
|
||||
; Upto 4 stack values accessed by markers 0xFF, 0xFE, 0xFD, 0xFC
|
||||
PRINTMSG: LD A,(DE)
|
||||
CP 000H ; End of string?
|
||||
RET Z
|
||||
CP 0FFH ; Marker to print out first stack parameter.
|
||||
JR Z,PRINTMSG3
|
||||
CP 0FEH ; Marker to print out second stack parameter.
|
||||
JR Z,PRINTMSG6
|
||||
CP 0FDH ; Marker to print out third stack parameter.
|
||||
JR Z,PRINTMSG7
|
||||
CP 0FCH ; Marker to print out fourth stack parameter.
|
||||
JR Z,PRINTMSG8
|
||||
CP 0FBH ; Marker to print out BC.
|
||||
JR Z,PRINTMSG9
|
||||
CP 0FAH ; Marker to print out a filename with filename address stored in BC.
|
||||
JR Z,PRINTMSG10
|
||||
CALL PRINTASCII
|
||||
PRINTMSG2: INC DE
|
||||
JR PRINTMSG
|
||||
PRINTMSG3: LD HL,8+0 ; Get first stack parameter, there are 2 pushes on the stack plus return address before the parameters.
|
||||
PRINTMSG4: ADD HL,SP
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
LD H,(HL)
|
||||
LD L,A
|
||||
PRINTMSG5: CALL PRTHL
|
||||
JR PRINTMSG2
|
||||
PRINTMSG6: LD HL,8+2
|
||||
JR PRINTMSG4
|
||||
PRINTMSG7: LD HL,8+4
|
||||
JR PRINTMSG4
|
||||
PRINTMSG8: LD HL,8+6
|
||||
JR PRINTMSG4
|
||||
PRINTMSG9: PUSH BC ; Print out contents of BC as 4 digit hex.
|
||||
POP HL
|
||||
JR PRINTMSG5
|
||||
PRINTMSG10: PUSH DE ; Print out a filename with pointer stored in BC.
|
||||
PUSH BC
|
||||
POP DE
|
||||
CALL PRTFN
|
||||
POP DE
|
||||
JR PRINTMSG2
|
||||
|
||||
|
||||
; Method to print out the filename within an MZF header or SD Card header.
|
||||
; The name may not be terminated as the full 17 chars are used, so this needs
|
||||
; to be checked. Also, the filename uses Sharp Ascii so call the original Sharp
|
||||
; print routine.
|
||||
;
|
||||
; Input: DE = Address of filename.
|
||||
;
|
||||
PRTFN: PUSH BC
|
||||
LD B,FNSIZE ; Maximum size of filename.
|
||||
PRTMSG: LD A,(DE)
|
||||
INC DE
|
||||
CP 000H ; If there is a valid terminator, exit.
|
||||
JR Z,PRTMSGE
|
||||
CP 00DH
|
||||
JR Z,PRTMSGE
|
||||
CALL PRNT
|
||||
DJNZ PRTMSG ; Else print until 17 chars have been processed.
|
||||
CALL NL
|
||||
PRTMSGE: POP BC
|
||||
RET
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF PRINT ROUTINE METHODS
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; START OF HELP SCREEN FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
; Simple help screen to display commands.
|
||||
HELP: CALL NL
|
||||
LD DE, HELPSCR
|
||||
CALL PRTSTR
|
||||
RET
|
||||
|
||||
; A modified print string routine with full screen pause to print out the help screen text. The routine prints out true ascii
|
||||
; as opposed to Sharp modified ascii.
|
||||
; A string is NULL terminated.
|
||||
PRTSTR: PUSH AF
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
LD A,0
|
||||
LD (TMPLINECNT),A
|
||||
PRTSTR1: LD A,(DE)
|
||||
CP 000H ; NULL terminates the string.
|
||||
JR Z,PRTSTRE
|
||||
CP 00DH ; As does CR.
|
||||
JR Z,PRTSTR3
|
||||
PRTSTR2: CALL PRINTASCII
|
||||
INC DE
|
||||
JR PRTSTR1
|
||||
PRTSTR3: PUSH AF
|
||||
LD A,(TMPLINECNT)
|
||||
CP 24
|
||||
JR Z,PRTSTR5
|
||||
INC A
|
||||
PRTSTR4: LD (TMPLINECNT),A
|
||||
POP AF
|
||||
JR PRTSTR2
|
||||
PRTSTR5: CALL GETKY
|
||||
CP ' '
|
||||
JR NZ,PRTSTR5
|
||||
XOR A
|
||||
JR PRTSTR4
|
||||
PRTSTRE: POP DE
|
||||
POP BC
|
||||
POP AF
|
||||
RET
|
||||
|
||||
; Help text. Use of lower case, due to Sharp's non standard character set, is not easy, you have to manually code each byte
|
||||
; hence using upper case.
|
||||
HELPSCR: DB "4 - 40 col mode.", 00DH
|
||||
DB "8 - 80 col mode.", 00DH
|
||||
DB "B - toggle keyboard bell.", 00DH
|
||||
DB "C - clear memory $1200-$D000.", 00DH
|
||||
DB "DXXXX[YYYY] - dump mem XXXX to YYYY.", 00DH
|
||||
DB "EC[FN]- erase file, FN=No, or Filename", 00DH
|
||||
DB "F[X] - boot fd drive X.", 00DH
|
||||
DB "f - boot fd original rom.", 00DH
|
||||
DB "H - this help screen.", 00DH
|
||||
DB "IR/IC - rfs dir listing rom/sd card.", 00DH
|
||||
DB "JXXXX - jump to location XXXX.", 00DH
|
||||
DB "LT[FN]- load tape, FN=Filename", 00DH
|
||||
DB "LR[FN]- load rom, FN=No. or Filename", 00DH
|
||||
DB "LC[FN]- load sdcard, FN=No. or Filename", 00DH
|
||||
DB " - add NX for no exec, ie.LRNX.", 00DH
|
||||
DB "MXXXX - edit memory starting at XXXX.", 00DH
|
||||
DB "P - test printer.", 00DH
|
||||
DB "R - test dram memory.", 00DH
|
||||
DB "SD2T - copy sd card to tape.", 00DH
|
||||
DB "ST[XXXXYYYYZZZZ] - save mem to tape.", 00DH
|
||||
DB "SC[XXXXYYYYZZZZ] - save mem to card.", 00DH
|
||||
DB " XXXX=start,YYYY=end,ZZZZ=exec", 00DH
|
||||
DB "T - test timer.", 00DH
|
||||
DB "T2SD - copy tape to sd card.", 00DH
|
||||
DB "V - verify tape save.", 00DH
|
||||
DB 000H
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; END OF HELP SCREEN FUNCTIONALITY
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
; TRUE ASCII TO DISPLAY CODE TABLE
|
||||
;
|
||||
ATBL: DB 0CCH ; NUL '\0' (null character)
|
||||
DB 0E0H ; SOH (start of heading)
|
||||
DB 0F2H ; STX (start of text)
|
||||
DB 0F3H ; ETX (end of text)
|
||||
DB 0CEH ; EOT (end of transmission)
|
||||
DB 0CFH ; ENQ (enquiry)
|
||||
DB 0F6H ; ACK (acknowledge)
|
||||
DB 0F7H ; BEL '\a' (bell)
|
||||
DB 0F8H ; BS '\b' (backspace)
|
||||
DB 0F9H ; HT '\t' (horizontal tab)
|
||||
DB 0FAH ; LF '\n' (new line)
|
||||
DB 0FBH ; VT '\v' (vertical tab)
|
||||
DB 0FCH ; FF '\f' (form feed)
|
||||
DB 0FDH ; CR '\r' (carriage ret)
|
||||
DB 0FEH ; SO (shift out)
|
||||
DB 0FFH ; SI (shift in)
|
||||
DB 0E1H ; DLE (data link escape)
|
||||
DB 0C1H ; DC1 (device control 1)
|
||||
DB 0C2H ; DC2 (device control 2)
|
||||
DB 0C3H ; DC3 (device control 3)
|
||||
DB 0C4H ; DC4 (device control 4)
|
||||
DB 0C5H ; NAK (negative ack.)
|
||||
DB 0C6H ; SYN (synchronous idle)
|
||||
DB 0E2H ; ETB (end of trans. blk)
|
||||
DB 0E3H ; CAN (cancel)
|
||||
DB 0E4H ; EM (end of medium)
|
||||
DB 0E5H ; SUB (substitute)
|
||||
DB 0E6H ; ESC (escape)
|
||||
DB 0EBH ; FS (file separator)
|
||||
DB 0EEH ; GS (group separator)
|
||||
DB 0EFH ; RS (record separator)
|
||||
DB 0F4H ; US (unit separator)
|
||||
DB 000H ; SPACE
|
||||
DB 061H ; !
|
||||
DB 062H ; "
|
||||
DB 063H ; #
|
||||
DB 064H ; $
|
||||
DB 065H ; %
|
||||
DB 066H ; &
|
||||
DB 067H ; '
|
||||
DB 068H ; (
|
||||
DB 069H ; )
|
||||
DB 06BH ; *
|
||||
DB 06AH ; +
|
||||
DB 02FH ; ,
|
||||
DB 02AH ; -
|
||||
DB 02EH ; .
|
||||
DB 02DH ; /
|
||||
DB 020H ; 0
|
||||
DB 021H ; 1
|
||||
DB 022H ; 2
|
||||
DB 023H ; 3
|
||||
DB 024H ; 4
|
||||
DB 025H ; 5
|
||||
DB 026H ; 6
|
||||
DB 027H ; 7
|
||||
DB 028H ; 8
|
||||
DB 029H ; 9
|
||||
DB 04FH ; :
|
||||
DB 02CH ; ;
|
||||
DB 051H ; <
|
||||
DB 02BH ; =
|
||||
DB 057H ; >
|
||||
DB 049H ; ?
|
||||
DB 055H ; @
|
||||
DB 001H ; A
|
||||
DB 002H ; B
|
||||
DB 003H ; C
|
||||
DB 004H ; D
|
||||
DB 005H ; E
|
||||
DB 006H ; F
|
||||
DB 007H ; G
|
||||
DB 008H ; H
|
||||
DB 009H ; I
|
||||
DB 00AH ; J
|
||||
DB 00BH ; K
|
||||
DB 00CH ; L
|
||||
DB 00DH ; M
|
||||
DB 00EH ; N
|
||||
DB 00FH ; O
|
||||
DB 010H ; P
|
||||
DB 011H ; Q
|
||||
DB 012H ; R
|
||||
DB 013H ; S
|
||||
DB 014H ; T
|
||||
DB 015H ; U
|
||||
DB 016H ; V
|
||||
DB 017H ; W
|
||||
DB 018H ; X
|
||||
DB 019H ; Y
|
||||
DB 01AH ; Z
|
||||
DB 052H ; [
|
||||
DB 059H ; \ '\\'
|
||||
DB 054H ; ]
|
||||
DB 0BEH ; ^
|
||||
DB 03CH ; _
|
||||
DB 0C7H ; `
|
||||
DB 081H ; a
|
||||
DB 082H ; b
|
||||
DB 083H ; c
|
||||
DB 084H ; d
|
||||
DB 085H ; e
|
||||
DB 086H ; f
|
||||
DB 087H ; g
|
||||
DB 088H ; h
|
||||
DB 089H ; i
|
||||
DB 08AH ; j
|
||||
DB 08BH ; k
|
||||
DB 08CH ; l
|
||||
DB 08DH ; m
|
||||
DB 08EH ; n
|
||||
DB 08FH ; o
|
||||
DB 090H ; p
|
||||
DB 091H ; q
|
||||
DB 092H ; r
|
||||
DB 093H ; s
|
||||
DB 094H ; t
|
||||
DB 095H ; u
|
||||
DB 096H ; v
|
||||
DB 097H ; w
|
||||
DB 098H ; x
|
||||
DB 099H ; y
|
||||
DB 09AH ; z
|
||||
DB 0BCH ; {
|
||||
DB 080H ; |
|
||||
DB 040H ; }
|
||||
DB 0A5H ; ~
|
||||
DB 0C0H ; DEL
|
||||
|
||||
;--------------------------------------
|
||||
;
|
||||
; Message table
|
||||
;
|
||||
;--------------------------------------
|
||||
MSGSON: DB "+ RFS ", 0ABh, "1.2 **" ,00DH, 000H
|
||||
MSGNOTFND: DB "Not Found", 00DH, 000H
|
||||
MSGRDIRLST: DB "ROM Directory:", 00DH, 000H
|
||||
MSGTRM: DB 00DH, 000H
|
||||
MSGBADCMD: DB "???", 00DH, 000H
|
||||
MSGCDIRLST: DB "SD Card Directory:", 00DH, 000H
|
||||
MSGSDRERR: DB "SD Read error, Sec:",0FBH, 000H
|
||||
MSGSDWERR: DB "SD Write error, Sec:",0FBH, 000H
|
||||
MSGSVFAIL: DB "SD Error, save failed.", 00DH, 000H
|
||||
MSGERAFAIL: DB "SD Dir update failed.", 00DH, 000H
|
||||
MSGSVDIRENT:DB "Saving into dir entry:",0FBH, 00DH, 000H
|
||||
MSGERASEDIR:DB "Deleted dir entry:",0FBH, 000H
|
||||
MSGCMTDATA: DB "Load:",0FEH,",Exec:",0FFH, ",Size:",0FBH, 00DH, 000H
|
||||
MSGNOTBIN: DB "Not binary", 00DH, 000H
|
||||
MSGLOAD: DB 00DH, "Loading ",'"',0FAH,'"', 00DH, 000H
|
||||
MSGSAVE: DB 00DH, "Filename: ", 000H
|
||||
MSGDIRFULL: DB "Directory full", 00DH, 000H
|
||||
MSGE1: DB 00DH, "Check sum error!", 00DH, 000H ; Check sum error.
|
||||
MSGCMTWRITE:DB 00DH, "Writing ", '"',0FAH,'"', 00DH, 000H
|
||||
MSGOK: DB 00DH, "OK!", 00DH, 000H
|
||||
MSGSAVEOK: DB "Tape image saved.", 00DH, 000H
|
||||
MSGBOOTDRV: DB 00DH, "Floppy boot drive ?", 000H
|
||||
MSGLOADERR: DB 00DH, "Disk loading error", 00DH, 000H
|
||||
MSGIPLLOAD: DB 00DH, "Disk loading ", 000H
|
||||
MSGDSKNOTMST:DB 00DH, "This is not a boot disk",00Dh, 000H
|
||||
MSGINITM: DB "Init memory", 00DH, 000H
|
||||
MSGREAD4HEX:DB "Bad hex number", 00DH, 000H
|
||||
MSGT2SDERR: DB "Copy from Tape to SD Failed", 00DH, 000H
|
||||
MSGSD2TERR: DB "Copy from SD to Tape Failed", 00DH, 000H
|
||||
MSGT2SDOK: DB "Success, Tape to SD done.", 00DH, 000H
|
||||
MSGSD2TOK: DB "Success, SD to Tape done.", 00DH, 000H
|
||||
|
||||
ALIGN 0EFFFh
|
||||
DB 0FFh
|
||||
|
||||
@@ -88,14 +88,13 @@ BKSW7to7: PUSH AF
|
||||
PUSH AF
|
||||
LD A, ROMBANK7 ; Required bank to call.
|
||||
;
|
||||
BKSW7_0: PUSH BC ; Save BC for caller.
|
||||
LD BC, BKSWRET7 ; Place bank switchers return address on stack.
|
||||
PUSH BC
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
BKSW7_0: PUSH HL ; Place function to call on stack
|
||||
LD HL, BKSWRET7 ; Place bank switchers return address on stack.
|
||||
EX (SP),HL
|
||||
LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it.
|
||||
LD (RFSBK2), A ; Bank switch in user rom space, A=bank.
|
||||
JP (HL) ; Jump to required function.
|
||||
BKSWRET7: POP BC
|
||||
POP AF ; Get bank which called us.
|
||||
BKSWRET7: POP AF ; Get bank which called us.
|
||||
LD (RFSBK2), A ; Return to that bank.
|
||||
POP AF
|
||||
RET ; Return to caller.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -56,17 +56,13 @@ RFS_INCLUDE+="${MZF_PATH}/2z-046a.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/5Z-009A.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/5Z-009B.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/6502_Betriebssys.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/80A PENCIL.A2_C2.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/80A_PENCIL.A2_C2.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/80A PENCIL.A2_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/80A_PENCIL.A2_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/80zbasic.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/A-BASIC_SA-5510.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/AIP_-_LOGO_xrr.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/APOLLO CHESS v2a.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/APOLLO_CHESS_v2a.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/B880.A3_P6.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/B880 MASTER.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/B880_MASTER.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_MZ-5Z008_2.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_MZ-5Z008.MZF:"
|
||||
@@ -77,37 +73,25 @@ RFS_INCLUDE+="${MZF_PATH}/BASIC_OM-1001.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_OM-500.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/basic_sa-5510.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC.SA-5510.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC SA-5575_C.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_SA-5575_C.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC SA-5575_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_SA-5575_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC SA-5577_C.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_SA-5577_C.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC SA-5577_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_SA-5577_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC SA-5580.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_SA-5580.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BASIC_SP-5025.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BAS MOD v3.74.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BAS_MOD_v3.74.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BATTLE_GAME.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BINARY COUNT.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BINARY_COUNT.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/bomberman_MZ700.m12:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BYTESAVER SA5510.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/BYTESAVER_SA5510.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/cannon_ball.m12:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/clock1.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CLUB COPY.U1.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CLUB_COPY.U1.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CLUB MON.A1_M.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CLUB_MON.A1_M.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CLUB MON.A1_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CLUB_MON.A1_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/cmttofd.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/COLONY.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/COMPILER_A2.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CONVERTER A_700.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CONVERTER_A_700.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CONVERTER.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/COPIER.MZF:"
|
||||
@@ -116,26 +100,19 @@ RFS_INCLUDE+="${MZF_PATH}/cpm22.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CPM_RFS_1.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CPM_RFS_2.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/CRUISER3_MZ1500.M12:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DCS MZ80A APPEND.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DCS_MZ80A_APPEND.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DCS MZ80A RENUM.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DCS_MZ80A_RENUM.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DELETE.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/diamond.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DISASM 8800.A15.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DISASM_8800.A15.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DISASM B800.A15.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DISASM_B800.A15.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DISKEDIT.A4B.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/DISKEDIT.A7_40T.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/diskutility.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/doordoor:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/Doordoor.mzt:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/EXPRESS BAS_700.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/EXPRESS_BAS_700.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/EXPRESS COMPILER.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/EXPRESS_COMPILER.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/EXPRESS PLUS.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/EXPRESS_PLUS.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/EXT.BASIC_OM-500.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/FDCOPY.MZF:"
|
||||
@@ -220,7 +197,6 @@ RFS_INCLUDE+="${MZF_PATH}/ROUND_SHOOT.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/sa-5510_Bas_MZ80K.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/SA-5510_Compiler.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/SA-5510+KN.COMM..MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/SA-6510.DSK:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/sa-6510.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/SARGON_2.71.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/S-Basic-Cent-2.MZF:"
|
||||
@@ -283,7 +259,6 @@ RFS_INCLUDE+="${MZF_PATH}/Z80MACHINE.A3_C2.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/Z80_MACHINE.A3_S.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/ZEN7E.A2.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/Zexas_MZ800.MZF:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/ZSP:"
|
||||
RFS_INCLUDE+="${MZF_PATH}/ZSP.MZF"
|
||||
|
||||
IFS=":"; for f in ${RFS_INCLUDE}
|
||||
|
||||
Reference in New Issue
Block a user