From a0bcabb125bcddd6ae35ef325fb418f88ef80178 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Wed, 8 Nov 2023 16:04:14 +0000 Subject: [PATCH] Interim updates for use with SFD700 --- .gitignore | 4 + asm/include/cpm_definitions.asm | 8 +- asm/include/macros.asm | 134 +- asm/include/rfs_definitions.asm | 110 +- asm/mz80afi.asm | 1 + asm/rfs.asm | 546 +++++---- asm/rfs_bank1.asm | 41 +- asm/rfs_bank2.asm | 48 +- asm/rfs_bank3.asm | 39 +- asm/rfs_bank4.asm | 434 ++++++- asm/rfs_bank5.asm | 38 +- asm/rfs_bank6.asm | 138 ++- asm/rfs_bank7.asm | 2021 +++++++++++++++++++++++++------ roms/SFD700.rom | Bin 0 -> 49152 bytes roms/cbios.rom | Bin 4096 -> 4096 bytes roms/cbios_bank1.rom | Bin 2048 -> 2048 bytes roms/cbios_bank2.rom | Bin 2048 -> 2048 bytes roms/mz-1e05.rom | Bin 0 -> 4096 bytes roms/mz-1e14.rom | Bin 0 -> 4096 bytes roms/rfs.rom | Bin 16384 -> 40960 bytes tools/make_roms.sh | 4 +- 21 files changed, 2768 insertions(+), 798 deletions(-) create mode 100644 roms/SFD700.rom create mode 100644 roms/mz-1e05.rom create mode 100644 roms/mz-1e14.rom diff --git a/.gitignore b/.gitignore index 6f6db68..e28d553 100644 --- a/.gitignore +++ b/.gitignore @@ -201,3 +201,7 @@ dz80.ini full.asm full.bin MZ800_IOCS.ref +asm/c2 +asm/sa1510.asm.prekuma +roms/test.rom + diff --git a/asm/include/cpm_definitions.asm b/asm/include/cpm_definitions.asm index 7f3b47e..7812981 100644 --- a/asm/include/cpm_definitions.asm +++ b/asm/include/cpm_definitions.asm @@ -42,11 +42,11 @@ PP_SPI_ENA EQU 0 ; Set t ; Build time options, only set to '1' to build, '0' to disable, only set one 40C/80C at a time. Set KUMA 80C option if Kuma upgrade being targetted otherwise will default to 40/80 column card. ; IF BUILD_VERSION = 0 -BUILD_80C EQU 0 ; Build for an MZ-80A with a 40/80 column card. -BUILD_40C EQU 1 ; Build for a standard 40 column MZ-80A. +BUILD_80C EQU 1 ; Build for an MZ-80A with a 40/80 column card. +BUILD_40C EQU 0 ; Build for a standard 40 column MZ-80A. BUILD_KUMA EQU 0 ; Enable support for the Kuma 40/80 column upgrade. -BUILD_MZ80A EQU 0 ; Build for the Sharp MZ-80A base hardware. -BUILD_MZ700 EQU 1 ; Build for the Sharp MZ-700 base hardware. +BUILD_MZ80A EQU 1 ; Build for the Sharp MZ-80A base hardware. +BUILD_MZ700 EQU 0 ; Build for the Sharp MZ-700 base hardware. BUILD_MZ1500 EQU 0 ; Build for the Sharp MZ-1500 base hardware. ; ENDIF diff --git a/asm/include/macros.asm b/asm/include/macros.asm index 98f06ac..e7782cc 100644 --- a/asm/include/macros.asm +++ b/asm/include/macros.asm @@ -31,4 +31,136 @@ PAD: MACRO ?address ; ALIGN_FIT8: MACRO ?size ds (($ + ?size - 1) >> 8) != ($ >> 8) && (100H - ($ & 0FFH)) || 0 - ENDM + ENDM + +HWSELROM: MACRO + IF BUILD_ROMDISK = 1 + LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. +HWSEL1: LD A,(BNKCTRLRST) + DJNZ HWSEL1 ; Apply the default number of coded latch reads to enable the bank control registers. + LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. + LD (BNKCTRL),A + LD (ROMCTL),A ; Save to memory the value in the bank control register - this register is used for SPI etc so need to remember its setting. + XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 + LD (BNKSELMROM),A + LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + ENDIF ; 22 bytes. + + IF BUILD_SFD700 = 1 + IN A,(SFD700_MODE) + OR A + LD A,BNKDEFMROM_MZ80A ; Setup default MROM for an MZ80A, this is a 4K Window into the UROM at F000. + JR HWSEL11 +HWSEL11: LD A,BNKDEFMROM_MZ700 ; Setup default MROM for an MZ700, this is a 4K Window into the UROM at F000. + OUT (REG_FXXX),A + LD (ROMBK1),A + LD A,BNKDEFUROM ; Setup default UROM, this is a 2K Window into the UROM at E800 and contains the RFS. + OUT (REG_EXXX),A + LD (ROMBK2),A + NOP + ENDIF + ENDM +HWSELROM2: MACRO + IF BUILD_ROMDISK = 1 + LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. +HWSEL2: LD A,(BNKCTRLRST) + DJNZ HWSEL2 ; Apply the default number of coded latch reads to enable the bank control registers. + LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. + LD (BNKCTRL),A + NOP ; Nops to allocate space for missing LD (ROMCTL),A present in first bank. + NOP + NOP + XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 + LD (BNKSELMROM),A + LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + NOP ; Nops to allocate space for Bank 0 JP to startup code. + NOP + NOP + ENDIF ; 25 bytes. + IF BUILD_SFD700 = 1 + IN A,(SFD700_MODE) + OR A + LD A,BNKDEFMROM_MZ80A ; Setup default MROM for an MZ80A, this is a 4K Window into the UROM at F000. + JR HWSEL21 + LD A,BNKDEFMROM_MZ700 ; Setup default MROM for an MZ700, this is a 4K Window into the UROM at F000. +HWSEL21: OUT (REG_FXXX),A + LD A,BNKDEFUROM ; Setup default UROM, this is a 2K Window into the UROM at E800 and contains the RFS. + OUT (REG_EXXX),A + NOP ; Nops to allocate space to match RomDisk block. + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + NOP + ENDIF + ENDM + + ; Macro to select which part of the FlashROM appears in the Monitor ROM 0000:0FFF Window. + ; On the SFD700 board, for ease of coding as the Monitor ROM doesnt exist but the Floppy ROM F000:FFFF window does, + ; then on this board, MROM refers to the F000:FFFF window when working with code which is compatible across the RomDisk, SFD700 etc.. +HWSELMROM: MACRO + IF BUILD_ROMDISK = 1 + LD (BNKSELMROM),A + ENDIF + IF BUILD_SFD700 = 1 + OUT (REG_FXXX),A + ENDIF + ENDM + + ; Macro to perform the in-situ bank switch. RomDisk it is a simple register load, for the SFD700 + ; depending on the target bank, we need to bring in the complimentary FXXX bank as needed. +BNKSWSEL: MACRO + IF BUILD_ROMDISK = 1 + LD (BNKSELUSER),A + ENDIF + IF BUILD_SFD700 = 1 + OUT (REG_EXXX),A ; Execute active bank switch. + CP ROMBANK6 ; ROMBANK6/7 page in ROM from E300:FFFF + JR C,BNKSWJMP + INC A + JR BNKSWJMP2 +BNKSWJMP: LD A,(ROMBK1) ; All other banks place the current active ROM into F000:FXXX space. +BNKSWJMP2: OUT (REG_FXXX),A + ENDIF + ENDM + + ; Macro to return from a bank switch. +BNKSWSELRET:MACRO + IF BUILD_ROMDISK = 1 + LD (BNKSELUSER),A + ENDIF + IF BUILD_SFD700 = 1 + OUT (REG_EXXX),A ; Execute active bank switch. + LD A,(ROMBK1) ; Ensure the current active ROM is switched to the F000:FXXX space. + OUT (REG_FXXX),A + ENDIF + ENDM + + ; Macro to select which part of the FlashROM appears in the User ROM E800:EFFF window. +HWSELUROM: MACRO + IF BUILD_ROMDISK = 1 + LD (BNKSELUSER),A + ENDIF + IF BUILD_SFD700 = 1 + OUT (REG_EXXX),A + ENDIF + ENDM + + ; Macro which is generally specific to the RomDisk, the code enables the Bank paging registers. +SETCODELTCH:MACRO + IF BUILD_ROMDISK = 1 + LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. + LD (ROMCTL),A ; Save to memory the value in the bank control register - this register is used for SPI etc so need to remember its setting. + ENDIF + IF BUILD_SFD700 = 1 + NOP + NOP + NOP + NOP + NOP + ENDIF + ENDM diff --git a/asm/include/rfs_definitions.asm b/asm/include/rfs_definitions.asm index dba8dd2..9813bba 100644 --- a/asm/include/rfs_definitions.asm +++ b/asm/include/rfs_definitions.asm @@ -41,9 +41,13 @@ HW_SPI_ENA EQU 1 ; Set to 1 if hardware SPI is present on the RFS PCB v2 board. SW_SPI_ENA EQU 0 ; Set to 1 if software SPI is present on the RFS PCB v2 board. PP_SPI_ENA EQU 0 ; Set to 1 if using the SPI interface via the Parallel Port, ie. for RFS PCB v1 which doesnt have SPI onboard. -FUSIONX_ENA EQU 1 ; Set to 1 if using RFS on the tranZPUter FusionX board. +FUSIONX_ENA EQU 0 ; Set to 1 if using RFS on the tranZPUter FusionX board. KUMA80_ENA EQU 0 ; Target has Kuma 40/80 upgrade installed. VIDEOMODULE_ENA EQU 0 ; Target has 40/80 column colour video module installed. +BUILD_ROMDISK EQU 0 ; RFS is built for the MZ-80A RomDisk card. +BUILD_SFD700 EQU 1 ; RFS is built for the SFD700 Floppy Disk Controller. +;BUILD_MZ80A EQU 0 ; RFS is customised to operate on an MZ-80A. +;BUILD_MZ700 EQU 1 ; RFS is customised to operate on an MZ-700. ; Debugging ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable @@ -53,9 +57,14 @@ ENADEBUG EQU 0 ; Enabl ;----------------------------------------------- UROMADDR EQU 0E800H ; Start of User ROM Address space. UROMBSTBL EQU UROMADDR + 020H ; Entry point to the bank switching table. -RFSJMPTABLE EQU UROMADDR + 00080H ; Start of jump table. +RFSJMPTABLE EQU UROMADDR + 000B0H ; Start of jump table. FDCROMADDR EQU 0F000H + IF BUILD_SFD700 = 1 +BNKDEFMROM_MZ80A EQU 0 ; Default MROM (FDC) selected, 1st 4k slot.. +BNKDEFMROM_MZ700 EQU 1 ; Default MROM (FDC) selected, 1st 4k slot.. +BNKDEFUROM EQU 2 ; Default UROM (RFS) selected, starts at 8K. + ENDIF ;----------------------------------------------- ; Common character definitions. @@ -143,30 +152,24 @@ BRKEY EQU 0001Eh MELDY EQU 00030h ?TMST EQU 00033h MONIT: EQU 00000h -SS: EQU 00089h -ST1: EQU 00095h HLHEX EQU 00410h _2HEX EQU 0041Fh -?MODE: EQU 0074DH -?KEY EQU 008CAh -PRNT3 EQU 0096Ch -?ADCN EQU 00BB9h -?DACN EQU 00BCEh -?DSP: EQU 00DB5H -?BLNK EQU 00DA6h -?DPCT EQU 00DDCh PRTHL: EQU 003BAh PRTHX: EQU 003C3h -HEX: EQU 003F9h +PRNT3 EQU 0096Ch +?ADCN EQU 00BB9h +?DSP: EQU 00DB5H DPCT: EQU 00DDCh -DLY12: EQU 00DA7h -DLY12A: EQU 00DAAh -?RSTR1: EQU 00EE6h -MOTOR: EQU 006A3H +HEX: EQU 003F9h CKSUM: EQU 0071AH GAP: EQU 0077AH -WTAPE: EQU 00485H MSTOP: EQU 00700H +MOTOR80A: EQU 006A3H +MOTOR700: EQU 0069FH +WTAPE80A: EQU 00485H +WTAPE700: EQU 0048AH + +DLY12: EQU 00DA7h ;----------------------------------------------- ; Memory mapped ports in hardware. @@ -192,6 +195,9 @@ INVDSP: EQU 0E014H NRMDSP: EQU 0E015H SCLDSP: EQU 0E200H SCLBASE: EQU 0E2H +; +; RomDisk memory mapped ports +; BNKCTRLRST: EQU 0EFF8H ; Bank control reset, returns all registers to power up default. BNKCTRLDIS: EQU 0EFF9H ; Disable bank control registers by resetting the coded latch. HWSPIDATA: EQU 0EFFBH ; Hardware SPI Data register (read/write). @@ -225,6 +231,8 @@ BNKCTRLDEF EQU BBMOSI+SDCS+BBCLK ; Defau SPI_OUT EQU 0FFH SPI_IN EQU 0FEH ; +; RomDisk +; DOUT_LOW EQU 000H DOUT_HIGH EQU 004H DOUT_MASK EQU 004H @@ -236,6 +244,8 @@ CLOCK_MASK EQU 0FDH CS_LOW EQU 000H CS_HIGH EQU 001H ; +; tranZPUter SW +; MMCFG EQU 060H ; Memory management configuration latch. SETXMHZ EQU 062H ; Select the alternate clock frequency. SET2MHZ EQU 064H ; Select the system 2MHz clock frequency. @@ -255,6 +265,22 @@ MMIO4 EQU 0E4H ; MZ-70 MMIO5 EQU 0E5H ; MZ-700/MZ-800 Memory Management Set 5 MMIO6 EQU 0E6H ; MZ-700/MZ-800 Memory Management Set 6 MMIO7 EQU 0E7H ; MZ-700/MZ-800 Memory Management Set 7 +; +; SFD700 +; +REG_EXXX EQU 060H ; A write copies D6:0 into the EXXX page address register to set a uniform 4K block in the region E300:EFFF window. +REG_FXXX EQU 061H ; A write copies D6:0 into the FXXX page address register to set a uniform 4k block in the region F000:FFFF. +REG_MEMMODE EQU 062H ; A write with D0 = low enables FlashROM, D0 = high enables RAM. +SFD700_MODE EQU 063H ; FDC Interface card configured target mode. +FDC_CMD EQU 0D8H ; WD1773 Command Register. +FDC_STATUS EQU 0D8H ; WD1773 Status Register. +FDC_TRACK EQU 0D9H ; WD1773 Track Register. +FDC_SECTOR EQU 0DAH ; WD1773 Sector Register. +FDC_DATA EQU 0DBH ; WD1773 Data Register. +FDC_DRIVE EQU 0DCH ; FDC Drive Select. D2 = 1 to enable, D1:0 = FDC number. D7 = Motor Enable. +FDC_SIDE EQU 0DDH ; FDC Side Select. D0 = Side. +FDC_DDEN EQU 0DEH ; FDC Double Density Enable. +FDC_IRQ EQU 0DFH ; A write enables WD1773 interrupts, a read disables WD1773 interrupts. ;----------------------------------------------- ; CPLD Configuration constants. @@ -323,6 +349,13 @@ RFSSECTSZ EQU 256 MROMSIZE EQU 4096 UROMSIZE EQU 2048 FNSIZE EQU 17 + IF BUILD_ROMDISK = 1 +MROMSTART: EQU 00000H + ENDIF + IF BUILD_SFD700 = 1 +MROMSTART: EQU 0F000H + ENDIF + ; ; Monitor ROM Jump Table definitions. ; @@ -342,19 +375,34 @@ MROMLOAD: EQU MROMJMPTBL + 00006H ;----------------------------------------------- MROMPAGES EQU 8 USRROMPAGES EQU 12 ; Monitor ROM : User ROM -ROMBANK0 EQU 0 ; MROM SA1510 40 Char : RFS Bank 0 - Main RFS Entry point and functions. -ROMBANK1 EQU 1 ; MROM SA1510 80 Char : RFS Bank 1 - Floppy disk controller and utilities. -ROMBANK2 EQU 2 ; CPM 2.2 CBIOS : RFS Bank 2 - SD Card controller and utilities. -ROMBANK3 EQU 3 ; RFS Utilities : RFS Bank 3 - Cmdline tools (Memory, Printer, Help) -ROMBANK4 EQU 4 ; MZ700 1Z-013A 40C : RFS Bank 4 - CMT Utilities. -ROMBANK5 EQU 5 ; MZ700-1Z-013A 80C : RFS Bank 5 -ROMBANK6 EQU 6 ; MZ-80B IPL : RFS Bank 6 -ROMBANK7 EQU 7 ; Free : RFS Bank 7 - Memory and timer test utilities. -ROMBANK8 EQU 8 ; : CBIOS Bank 1 - Utilities -ROMBANK9 EQU 9 ; : CBIOS Bank 2 - Screen / ANSI Terminal -ROMBANK10 EQU 10 ; : CBIOS Bank 3 - SD Card -ROMBANK11 EQU 11 ; : CBIOS Bank 4 - Floppy disk controller. - + IF BUILD_ROMDISK = 1 +ROMBANK0 EQU 0 ; MROM SA1510 40 Char : RFS Bank 0 - Main RFS Entry point and functions. +ROMBANK1 EQU 1 ; MROM SA1510 80 Char : RFS Bank 1 - Floppy disk controller and utilities. +ROMBANK2 EQU 2 ; CPM 2.2 CBIOS : RFS Bank 2 - SD Card controller and utilities. +ROMBANK3 EQU 3 ; RFS Utilities : RFS Bank 3 - Cmdline tools (Memory, Printer, Help) +ROMBANK4 EQU 4 ; MZ700 1Z-013A 40C : RFS Bank 4 - CMT Utilities. +ROMBANK5 EQU 5 ; MZ700-1Z-013A 80C : RFS Bank 5 +ROMBANK6 EQU 6 ; MZ-80B IPL : RFS Bank 6 +ROMBANK7 EQU 7 ; Free : RFS Bank 7 - Memory and timer test utilities. +ROMBANK8 EQU 8 ; : CBIOS Bank 1 - Utilities +ROMBANK9 EQU 9 ; : CBIOS Bank 2 - Screen / ANSI Terminal +ROMBANK10 EQU 10 ; : CBIOS Bank 3 - SD Card +ROMBANK11 EQU 11 ; : CBIOS Bank 4 - Floppy disk controller. + ENDIF + IF BUILD_SFD700 = 1 +ROMBANK0 EQU 0 + BNKDEFUROM ; : RFS Bank 0 - Main RFS Entry point and functions. +ROMBANK1 EQU 1 + BNKDEFUROM ; : RFS Bank 1 - Floppy disk controller and utilities. +ROMBANK2 EQU 2 + BNKDEFUROM ; : RFS Bank 2 - SD Card controller and utilities. +ROMBANK3 EQU 3 + BNKDEFUROM ; : RFS Bank 3 - Cmdline tools (Memory, Printer, Help) +ROMBANK4 EQU 4 + BNKDEFUROM ; : RFS Bank 4 - CMT Utilities. +ROMBANK5 EQU 5 + BNKDEFUROM ; : RFS Bank 5 +ROMBANK6 EQU 6 + BNKDEFUROM ; : RFS Bank 6 +ROMBANK7 EQU 8 + BNKDEFUROM ; : RFS Bank 7 - Memory and timer test utilities. +ROMBANK8 EQU 10 + BNKDEFUROM ; : CBIOS Bank 1 - Utilities +ROMBANK9 EQU 11 + BNKDEFUROM ; : CBIOS Bank 2 - Screen / ANSI Terminal +ROMBANK10 EQU 12 + BNKDEFUROM ; : CBIOS Bank 3 - SD Card +ROMBANK11 EQU 13 + BNKDEFUROM ; : CBIOS Bank 4 - Floppy disk controller. + ENDIF ; MMC/SD command (SPI mode) CMD0 EQU 64 + 0 ; GO_IDLE_STATE diff --git a/asm/mz80afi.asm b/asm/mz80afi.asm index e42477a..5d6f6d1 100644 --- a/asm/mz80afi.asm +++ b/asm/mz80afi.asm @@ -10,6 +10,7 @@ i ; Bring in additional resources. INCLUDE "rfs_definitions.asm" INCLUDE "macros.asm" +SS: EQU 00089h ;====================================== diff --git a/asm/rfs.asm b/asm/rfs.asm index d041181..c6e4a4a 100644 --- a/asm/rfs.asm +++ b/asm/rfs.asm @@ -10,18 +10,21 @@ ;- Credits: ;- Copyright: (c) 2018-2023 Philip Smart ;- -;- History: July 2019 - Merged 2 utilities to create this compilation. -; May 2020 - Bank switch changes with release of v2 pcb with coded latch. The coded +;- History: v1.0 July 2019 - Merged 2 utilities to create this compilation. +; v2.0 May 2020 - Bank switch changes with release of v2 pcb with coded latch. The coded ; latch adds additional instruction overhead as the control latches share ; the same address space as the Flash RAMS thus the extra hardware to ; only enable the control registers if a fixed number of reads is made ; into the upper 8 bytes which normally wouldnt occur. Caveat - ensure ; that no loop instruction is ever placed into EFF8H - EFFFH. -; July 2020 - Updated for the v2.1 hardware. RFS can run with a tranZPUter board with +; v2.0 July 2020 - Updated for the v2.1 hardware. RFS can run with a tranZPUter board with ; or without the K64 I/O processor. RFS wont use the K64 processor all ; operations are done by the Z80 under RFS. -;- April 2021- Updates for the v2.1 RFS board. -;- June 2023 - Updates for the Kuma 40/80 upgrade. +;- v2.1 April 2021- Updates for the v2.1 RFS board. +;- v2.2 June 2023 - Updates for the Kuma 40/80 upgrade and FusionX. +;- v2.3 Aug 2023 - Updates to make RFS run under the SFD700 Floppy Disk Interface board. +;- UROM remains the same, a 2K paged ROM, MROM is located at F000 when +;- RFS is built for the SFD700. ;- ;-------------------------------------------------------------------------------------------------------- ;- This source file is free software: you can redistribute it and-or modify @@ -41,6 +44,101 @@ ; Bring in additional resources. INCLUDE "rfs_definitions.asm" + IF BUILD_SFD700 = 1 + ORG 0E000H + ALIGN 0E300H + ENDIF + + ; Monitor command table. This table contains the list of recognised commands along with the + ; handler function and bank in which it is located. + ; + ; 7 6 5:3 2:0 + ; END MATCH BANK SIZE +CMDTABLE2: IF BUILD_SFD700 = 1 + DB 000H | 000H | 038H | 003H + DB "ASM" ; Assembler. + DW ASM_MAIN + DB 000H | 000H | 000H | 005H + DB "BASIC" ; Load and run BASIC SA-5510. + DW LOADBASIC + DB 000H | 000H | 020H | 001H + DB 'B' ; Bell. + DW SGX + DB 000H | 000H | 000H | 003H + DB "CPM" ; Load and run CPM. + DW LOADCPM + DB 000H | 000H | 018H | 002H + DB "CP" ; Copy Memory. + DW MCOPY + DB 000H | 000H | 018H | 001H + DB 'C' ; Clear Memory. + DW INITMEMX + DB 000H | 000H | 038H | 004H + DB "DASM" ; Disassembler. + DW DASM_MAIN + DB 000H | 000H | 018H | 001H + DB 'D' ; Dump Memory. + DW DUMPX + 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 | 030H | 001H + DB 'H' ; Help screen. + DW HELP + DB 000H | 000H | 000H | 002H + DB "IR" ; List ROM directory. + DW DIRROM + DB 000H | 000H | 000H | 001H + DB 'J' ; Jump to address. + DW GOTOX + DB 000H | 000H | 020H | 004H + DB "LTNX" ; Load from CMT without auto execution. + DW LOADTAPENX + DB 000H | 000H | 020H | 002H + DB "LT" ; Load from CMT + DW LOADTAPE + DB 000H | 000H | 000H | 004H + DB "LRNX" ; Load from ROM without auto execution. + DW LOADROMNX + DB 000H | 000H | 000H | 002H + DB "LR" ; Load from ROM + DW LOADROM + DB 000H | 000H | 020H | 001H + DB "L" ; Original Load from CMT + DW LOADTAPE + DB 000H | 000H | 018H | 001H + DB 'M' ; Edit Memory. + DW MCORX + DB 000H | 000H | 018H | 001H + DB 'P' ; Printer test. + DW PTESTX + DB 000H | 000H | 020H | 001H + DB 'R' ; Memory test. + DW MEMTEST + DB 000H | 000H | 020H | 002H + DB "ST" ; Save to CMT + DW SAVEX + DB 000H | 000H | 020H | 001H + DB 'S' ; Save to CMT + DW SAVEX + DB 000H | 000H | 000H | 004H + DB "TEST" ; A test function used in debugging. + DW LOCALTEST + DB 000H | 000H | 020H | 001H + DB 'T' ; Timer test. + DW TIMERTST + DB 000H | 000H | 000H | 001H + DB 'V' ; Verify CMT Save. + DW VRFYX + DB 080H | 000H | 000H | 001H + ENDIF + + IF BUILD_SFD700 = 1 + ALIGN UROMADDR + ENDIF ;============================================================ ; @@ -49,20 +147,11 @@ ;============================================================ ORG UROMADDR - ;-------------------------------- ; Common code spanning all banks. ;-------------------------------- ROMFS: NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS_0: LD A,(BNKCTRLRST) - DJNZ ROMFS_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - LD (ROMCTL),A ; Save to memory the value in the bank control register - this register is used for SPI etc so need to remember its setting. - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM ; Select the first ROM. JP ROMFS_1 ; Skip the reset vector. JP 00000H ; Other banks will switch at this point thus forcing a full reset. @@ -117,10 +206,10 @@ BKSW0_0: PUSH HL ; Place 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 (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET0: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET ; Return to caller. @@ -162,12 +251,11 @@ ROMFS_1: ROMFS_2: LD (HL),A INC HL DJNZ ROMFS_2 - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (ROMCTL),A ; Save to memory the value in the bank control register - this register is used for SPI etc so need to remember its setting. - LD A,(ROMBK1) -ROMFS_3: LD (BNKSELMROM),A ; start up. + SETCODELTCH ; On RomDisk setup coded latch to default. + LD A, (ROMBK1) +ROMFS_3: HWSELMROM ; start up. LD A, (ROMBK2) - LD (BNKSELUSER),A + HWSELUROM ;------------------------------------------------------------------------------- ; START OF RFS INITIALISATION AND COMMAND ENTRY PROCESSOR FUNCTIONALITY. @@ -175,7 +263,7 @@ ROMFS_3: LD (BNKSELMROM),A ; start ; ; Replacement command processor in place of the SA1510 command processor. ; -MONITOR: IF FUSIONX_ENA = 0 +MONITOR: IF FUSIONX_ENA+BUILD_SFD700 = 0 IN A,(CPLDINFO) ; See if a tranZPUter board is present. AND 0E7H ; Mask out the CPLD Version and host HW. LD C,A @@ -198,11 +286,15 @@ CHKTZ1: AND 0E0H XOR A ; Set the initial SDCFS active drive number. LD (SDDRIVENO),A ; - LD A, (ROMBK1) - CP 1 - JR Z, SET80CHAR - CP 0 - JR NZ, SIGNON + IF BUILD_ROMDISK = 1 + LD A, (ROMBK1) ; Is the 80column MZ-80A monitor active? Yes, set display as 80col. + CP 1 + JR Z, SET80CHAR + CP 0 + JR NZ, SIGNON + ENDIF + IF BUILD_SFD700 = 1 ; Ensure in 40 column mode. + ENDIF ; SET40CHAR: IF VIDEOMODULE_ENA = 1 XOR A ; Using MROM in Bank 0 = 40 char mode. @@ -249,21 +341,23 @@ SIGNON3: LD HL,PRINTMSG ; JR ST1X ; Initialise SD card, report any errors. - LD HL, SDINIT ; SD Card Initialisation - CALL BKSW0to2 ; Call the initialisation routine. - LD A,L - OR A ; 0 = No error. - JR Z,ST1X + IF BUILD_ROMDISK = 1 + LD HL, SDINIT ; SD Card Initialisation + CALL BKSW0to2 ; Call the initialisation routine. + LD A,L + OR A ; 0 = No error. + JR Z,ST1X - ; Place error code in C to print as a number and report with the error message. - ADD A,'0' - LD C,A - LD DE,MSGSDINITER - LD HL,PRINTMSG - CALL BKSW0to6 + ; Place error code in C to print as a number and report with the error message. + ADD A,'0' + LD C,A + LD DE,MSGSDINITER + LD HL,PRINTMSG + CALL BKSW0to6 + ENDIF ; Command processor, table based. - ; A line is inpt then a comparison made with entries in the table. If a match is found then the bank and function + ; A line is input then a comparison made with entries in the table. If a match is found then the bank and function ; address are extracted and a call to the function @ given bank made. The commands can be of variable length ; but important to not that longer commands using the same letters as shorter commands must appear first in the table. ; @@ -290,7 +384,12 @@ ST1X: CALL NL ; Comma ; CMDCMP: XOR A ; Clear the result variable used by interbank calls. Some functions set this variable and we act on it. LD (RESULT),A - LD HL,CMDTABLE + IF BUILD_ROMDISK = 1 + LD HL,CMDTABLE + ENDIF + IF BUILD_SFD700 = 1 + LD HL,CMDTABLE2 + ENDIF CMDCMP0: LD DE,BUFER+1 ; First command byte after the * prompt. LD A,(HL) CP 000H @@ -348,7 +447,12 @@ CMDCMP6: LD DE,CMDCMPEND ; Put r LD DE,(TMPADR) ; For the current bank, just jump to the function. JP (HL) -CMDNOCMP: LD DE,MSGBADCMD +CMDNOCMP: LD A,(BUFER+1) ; If nothing was entered, ignore line otherwise print questions to show command wasnt recognised. + OR A + JR Z,CMDCMPEND + CP 00DH + JR Z,CMDCMPEND + LD DE,MSGBADCMD LD HL,PRINTMSG CALL BKSW0to6 CMDCMPEND: LD A,(RESULT) @@ -362,115 +466,117 @@ CMDCMPEND: LD A,(RESULT) ; ; 7 6 5:3 2:0 ; END MATCH BANK SIZE -CMDTABLE: DB 000H | 000H | 000H | 002H ; Bit 2:0 = Command Size, 5:3 = Bank, 6 = Command match, 7 = Command table end. - DB "40" ; 40 Char screen mode. - DW SETMODE40 - DB 000H | 000H | 000H | 002H - DB "80" ; 80 Char screen mode. - DW SETMODE80 - ;DB 000H | 000H | 000H | 004H - ;DB "7008" ; Switch to 80 column MZ700 mode. - ;DW SETMODE7008 - ;DB 000H | 000H | 000H | 003H - ;DB "700" ; Switch to 40 column MZ700 mode. - ;DW SETMODE700 - DB 000H | 000H | 000H | 005H - DB "BASIC" ; Load and run BASIC SA-5510. - DW LOADBASIC - DB 000H | 000H | 020H | 001H - DB 'B' ; Bell. - DW SGX - DB 000H | 000H | 000H | 003H - DB "CPM" ; Load and run CPM. - DW LOADCPM - DB 000H | 000H | 018H | 002H - DB "CP" ; Copy Memory. - DW MCOPY - DB 000H | 000H | 018H | 001H - DB 'C' ; Clear Memory. - DW INITMEMX - 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 | 030H | 001H - DB 'H' ; Help screen. - DW HELP - DB 000H | 000H | 000H | 002H - DB "IR" ; List ROM directory. - DW DIRROM - DB 000H | 000H | 010H | 002H - DB "IC" ; List SD Card directory. - DW DIRSDCARD - DB 000H | 000H | 000H | 001H - DB 'J' ; Jump to address. - DW GOTOX - DB 000H | 000H | 020H | 004H - DB "LTNX" ; Load from CMT without auto execution. - DW LOADTAPENX - DB 000H | 000H | 020H | 002H - DB "LT" ; Load from CMT - DW LOADTAPE - DB 000H | 000H | 000H | 004H - DB "LRNX" ; Load from ROM without auto execution. - DW LOADROMNX - DB 000H | 000H | 000H | 002H - DB "LR" ; Load from ROM - DW LOADROM - DB 000H | 000H | 010H | 004H - DB "LCNX" ; Load from SDCARD without auto execution. - DW LOADSDCARDX - DB 000H | 000H | 010H | 002H - DB "LC" ; Load from SD CARD - DW LOADSDCARD - DB 000H | 000H | 020H | 001H - DB "L" ; Original Load from CMT - DW LOADTAPE - DB 000H | 000H | 018H | 001H - DB 'M' ; Edit Memory. - DW MCORX - DB 000H | 000H | 018H | 001H - DB 'P' ; Printer test. - DW PTESTX - 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 - DB 000H | 000H | 020H | 002H - DB "ST" ; Save to CMT - DW SAVEX - DB 000H | 000H | 020H | 001H - DB 'S' ; Save to CMT - DW SAVEX - DB 000H | 000H | 000H | 004H - DB "TEST" ; A test function used in debugging. - DW LOCALTEST - 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 - DB 000H | 000H | 000H | 001H - DB 'V' ; Verify CMT Save. - DW VRFYX - DB 000H | 000H | 000H | 001H - DB 'X' ; Exchange to hi load rom so DRAM = 0000:0CFFF - DW HIROM - DB 080H | 000H | 000H | 001H +CMDTABLE: IF BUILD_ROMDISK = 1 + DB 000H | 000H | 000H | 002H ; Bit 2:0 = Command Size, 5:3 = Bank, 6 = Command match, 7 = Command table end. + DB "40" ; 40 Char screen mode. + DW SETMODE40 + DB 000H | 000H | 000H | 002H + DB "80" ; 80 Char screen mode. + DW SETMODE80 + ;DB 000H | 000H | 000H | 004H + ;DB "7008" ; Switch to 80 column MZ700 mode. + ;DW SETMODE7008 + ;DB 000H | 000H | 000H | 003H + ;DB "700" ; Switch to 40 column MZ700 mode. + ;DW SETMODE700 + DB 000H | 000H | 000H | 005H + DB "BASIC" ; Load and run BASIC SA-5510. + DW LOADBASIC + DB 000H | 000H | 020H | 001H + DB 'B' ; Bell. + DW SGX + DB 000H | 000H | 000H | 003H + DB "CPM" ; Load and run CPM. + DW LOADCPM + DB 000H | 000H | 018H | 002H + DB "CP" ; Copy Memory. + DW MCOPY + DB 000H | 000H | 018H | 001H + DB 'C' ; Clear Memory. + DW INITMEMX + 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 | 030H | 001H + DB 'H' ; Help screen. + DW HELP + DB 000H | 000H | 000H | 002H + DB "IR" ; List ROM directory. + DW DIRROM + DB 000H | 000H | 010H | 002H + DB "IC" ; List SD Card directory. + DW DIRSDCARD + DB 000H | 000H | 000H | 001H + DB 'J' ; Jump to address. + DW GOTOX + DB 000H | 000H | 020H | 004H + DB "LTNX" ; Load from CMT without auto execution. + DW LOADTAPENX + DB 000H | 000H | 020H | 002H + DB "LT" ; Load from CMT + DW LOADTAPE + DB 000H | 000H | 000H | 004H + DB "LRNX" ; Load from ROM without auto execution. + DW LOADROMNX + DB 000H | 000H | 000H | 002H + DB "LR" ; Load from ROM + DW LOADROM + DB 000H | 000H | 010H | 004H + DB "LCNX" ; Load from SDCARD without auto execution. + DW LOADSDCARDX + DB 000H | 000H | 010H | 002H + DB "LC" ; Load from SD CARD + DW LOADSDCARD + DB 000H | 000H | 020H | 001H + DB "L" ; Original Load from CMT + DW LOADTAPE + DB 000H | 000H | 018H | 001H + DB 'M' ; Edit Memory. + DW MCORX + DB 000H | 000H | 018H | 001H + DB 'P' ; Printer test. + DW PTESTX + DB 000H | 000H | 020H | 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 + DB 000H | 000H | 020H | 002H + DB "ST" ; Save to CMT + DW SAVEX + DB 000H | 000H | 020H | 001H + DB 'S' ; Save to CMT + DW SAVEX + DB 000H | 000H | 000H | 004H + DB "TEST" ; A test function used in debugging. + DW LOCALTEST + DB 000H | 000H | 018H | 004H + DB "T2SD" ; Copy Tape to SD Card. + DW TAPE2SD + DB 000H | 000H | 020H | 001H + DB 'T' ; Timer test. + DW TIMERTST + DB 000H | 000H | 000H | 001H + DB 'V' ; Verify CMT Save. + DW VRFYX + DB 000H | 000H | 000H | 001H + DB 'X' ; Exchange to hi load rom so DRAM = 0000:0CFFF + DW HIROM + DB 080H | 000H | 000H | 001H + ENDIF ;------------------------------------------------------------------------------- ; END OF RFS INITIALISATION AND COMMAND ENTRY PROCESSOR FUNCTIONALITY. @@ -507,41 +613,47 @@ HEXIYX2: POP AF ; Waste ; ;==================================== -HIROM: LD A, (MEMSW) ; Swap ROM into high range slot. - LD A, ROMBANK2 - LD (ROMBK1),A ; Save bank being enabled. - LD (BNKSELMROM),A ; Switch to the hiload rom in bank 2. - JP 0C000H +HIROM: IF BUILD_ROMDISK = 1 + LD A, (MEMSW) ; Swap ROM into high range slot. + LD A, ROMBANK2 + LD (ROMBK1),A ; Save bank being enabled. + HWSELMROM ; Switch to the hiload rom in bank 2. + JP 0C000H + ENDIF -SETMODE40: LD A, ROMBANK0 ; Switch to 40Char monitor. - LD (ROMBK1),A - LD (BNKSELMROM),A - IF VIDEOMODULE_ENA = 1 - LD HL,DSPCTL ; Setup address of display control register latch. - LD A, 0 - LD E,(HL) ; Dummy operation to enable latch write via multivibrator. - LD (HL), A +SETMODE40: IF BUILD_ROMDISK = 1 + LD A, ROMBANK0 ; Switch to 40Char monitor. + LD (ROMBK1),A + HWSELMROM + IF VIDEOMODULE_ENA = 1 + LD HL,DSPCTL ; Setup address of display control register latch. + LD A, 0 + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ENDIF + IF KUMA80_ENA = 1 ; Kuma80 modification uses INTEN on PC@ of 8255, 0 = 40 column. + LD A,04H + LD (KEYPF),A + ENDIF + JP MONIT ENDIF - IF KUMA80_ENA = 1 ; Kuma80 modification uses INTEN on PC@ of 8255, 0 = 40 column. - LD A,04H - LD (KEYPF),A - ENDIF - JP MONIT -SETMODE80: LD A, ROMBANK1 ; Switch to 80char monitor. - LD (ROMBK1),A - LD (BNKSELMROM),A - IF VIDEOMODULE_ENA = 1 - LD HL,DSPCTL ; Setup address of display control register latch. - LD A, 128 - LD E,(HL) ; Dummy operation to enable latch write via multivibrator. - LD (HL), A +SETMODE80: IF BUILD_ROMDISK = 1 + LD A, ROMBANK1 ; Switch to 80char monitor. + LD (ROMBK1),A + HWSELMROM + IF VIDEOMODULE_ENA = 1 + LD HL,DSPCTL ; Setup address of display control register latch. + LD A, 128 + LD E,(HL) ; Dummy operation to enable latch write via multivibrator. + LD (HL), A + ENDIF + IF KUMA80_ENA = 1 ; Kuma80 modification uses INTEN on PC@ of 8255, 0 = 40 column. + LD A,05H + LD (KEYPF),A + ENDIF + JP MONIT ENDIF - IF KUMA80_ENA = 1 ; Kuma80 modification uses INTEN on PC@ of 8255, 0 = 40 column. - LD A,05H - LD (KEYPF),A - ENDIF - JP MONIT NOTZPU: LD DE,MSGNOTZINST ; No tranZPUter installed. LD HL,PRINTMSG @@ -640,8 +752,10 @@ _PRTDBG: IF ENADEBUG = 1 PUSH DE PUSH BC PUSH AF - LD A,(ROMBK1) - LD (BNKSELMROM),A ; Set the MROM bank back to original. + IF BUILD_ROMDISK = 1 + LD A,(ROMBK1) + HWSELMROM ; Set the MROM bank back to original. + ENDIF CALL PRTHL ; HL LD A, ' ' CALL PRNT @@ -666,8 +780,10 @@ _PRTDBG: IF ENADEBUG = 1 CALL PRNT ; CALL NL ; CALL GETKY - LD A,(WRKROMBK1) - LD (BNKSELMROM),A ; Set the MROM bank back to scanned bank. + IF BUILD_ROMDISK = 1 + LD A,(WRKROMBK1) + HWSELMROM ; Set the MROM bank back to scanned bank. + ENDIF POP AF POP BC POP DE @@ -679,8 +795,10 @@ _PRTMZF: PUSH BC PUSH DE PUSH HL ; - LD A,(ROMBK1) ; Ensure main MROM is switched in. - LD (BNKSELMROM),A + IF BUILD_ROMDISK = 1 + LD A,(ROMBK1) ; Ensure main MROM is switched in. + HWSELMROM + ENDIF ; LD A,(SCRNMODE) CP 0 @@ -746,8 +864,10 @@ PRTMZF2: LD L,A PRTMZF3: XOR A PRTMZF4: OR A PUSH AF - LD A, (WRKROMBK1) - LD (BNKSELMROM),A + IF BUILD_ROMDISK = 1 + LD A, (WRKROMBK1) + HWSELMROM + ENDIF POP AF POP HL POP DE @@ -770,12 +890,14 @@ DIRROM: ;DI ; Disab LD D,0 ; File numbering start. ; - ; Get directory of User ROM. + ; Get directory of User ROM (RomDisk). ; - LD A,ROMBANK3 - LD (WRKROMBK1),A - LD (BNKSELMROM),A - CALL DIRMROM + IF BUILD_ROMDISK = 1 + LD A,ROMBANK3 + LD (WRKROMBK1),A + HWSELMROM + CALL DIRMROM + ENDIF ; ; Scan MROM Bank ; B = Bank Page @@ -786,7 +908,7 @@ DIRROM: ;DI ; Disab ; DIRNXTPG: LD A,B LD (WRKROMBK1), A - LD (BNKSELMROM),A ; Select bank. + HWSELMROM ; Select bank. PUSH BC ; Preserve bank count/block number. PUSH DE ; Preserve file numbering. @@ -799,7 +921,7 @@ DIRNXTPG: LD A,B ENDIF LD B,A LD C,0 - LD HL,RFS_ATRB ; Add block offset to get the valid block address. + LD HL,MROMSTART ; Add block offset to get the valid block address. ADD HL,BC CALL ISMZF POP DE @@ -821,7 +943,7 @@ DIRNXTPG2: LD A,B JR NZ, DIRNXTPG DIRNXTPGX: LD A,(ROMBK1) - LD (BNKSELMROM),A ; Set the MROM bank back to original. + HWSELMROM ; Set the MROM bank back to original. ;EI ; No need to block interrupts now as MROM bank restored. RET ; End of scan, return to monitor @@ -852,10 +974,10 @@ FINDMZF0: POP DE ; Get f LD C,0 ; Block in page. FINDMZF1: LD A,B LD (WRKROMBK1), A - LD (BNKSELMROM),A ; Select bank. + HWSELMROM ; Select bank. FINDMZF2: PUSH BC ; Preserve bank count/block number. PUSH DE ; Preserve file numbering. - LD HL,RFS_ATRB ; Add block offset to get the valid block. + LD HL,MROMSTART ; Add block offset to get the valid block. LD A,C IF RFSSECTSZ >= 512 RLCA @@ -871,7 +993,7 @@ FINDMZF2: PUSH BC ; Prese POP DE POP BC LD A,(ROMBK1) - LD (BNKSELMROM),A ; Set the MROM bank back to original. + HWSELMROM ; Set the MROM bank back to original. JR NZ, FINDMZF4 ; Z set if we found an MZF record. INC HL ; Save address of filename. PUSH HL @@ -892,7 +1014,7 @@ FINDMZF3: POP HL LD DE,(TMPADR) ; Original DE put onto stack, original filename into HL LD BC,FNSIZE LD A,(WRKROMBK1) - LD (BNKSELMROM),A ; Select correct bank for comparison. + HWSELMROM ; Select correct bank for comparison. CALL CMPSTRING POP BC POP DE @@ -913,7 +1035,7 @@ FINDMZF5: LD A,B FINDMZFYES: ; Flag set by previous test. FINDMZFNO: PUSH AF LD A,(ROMBK1) - LD (BNKSELMROM),A ; Set the MROM bank back to original. + HWSELMROM ; Set the MROM bank back to original. POP AF RET @@ -936,7 +1058,7 @@ LOADROM1: ;DI ; LD A,ROMBANK3 ; Activate the RFS Utilities MROM bank. LD (WRKROMBK1), A - LD (BNKSELMROM),A + HWSELMROM CALL MFINDMZF ; Try and find the file in User ROM via MROM utility. POP HL JR Z,MROMLOAD0 @@ -949,13 +1071,13 @@ LOADROM1: ;DI MROMLOAD0: PUSH BC ; Preserve bank and block where MZF file found. PUSH AF LD A,(ROMBK1) ; Page in monitor so we can print a message. - LD (BNKSELMROM),A + HWSELMROM LD DE,MSGLOAD+1 ; Skip initial CR. LD BC,NAME LD HL,PRINTMSG CALL BKSW0to6 LD A,(WRKROMBK1) ; Revert to MROM bank to load the application. - LD (BNKSELMROM),A + HWSELMROM POP AF POP BC ; @@ -964,7 +1086,7 @@ MROMLOAD0: PUSH BC ; Prese LROMNTFND: POP HL ; Dont need execute flag anymore so waste it. LD A,(ROMBK1) - LD (BNKSELMROM),A + HWSELMROM LD HL,PRINTMSG LD DE,MSGNOTFND ; Not found CALL BKSW0to6 @@ -985,7 +1107,7 @@ LROMLOAD: PUSH BC ; LD A,B LD (WRKROMBK1),A - LD (BNKSELMROM),A + HWSELMROM ; LD DE, IBUFE ; Copy the header into the work area. LD HL, 00000h ; Add block offset to get the valid block. @@ -1016,7 +1138,7 @@ LROMLOAD: PUSH BC ; C = Block LROMLOAD2: LD A, B LD (WRKROMBK1), A - LD (BNKSELMROM),A + HWSELMROM LROMLOAD3: PUSH BC LD HL, 00000h @@ -1068,7 +1190,7 @@ LROMLOAD7: LD A, B LROMLOAD8: POP BC LROMLOAD5: POP HL ; Retrieve execute flag. LD A,(ROMBK1) - LD (BNKSELMROM),A ; Set the MROM bank back to original. + HWSELMROM ; Set the MROM bank back to original. LD A,L ; Autoexecute turned off? CP 0FFh JP Z,LROMLOAD9 ; Go back to monitor if it has been, else execute. @@ -1359,12 +1481,12 @@ DEFAULTFNE: EQU $ ; ALIGN 0EFF8h ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0AAh MEND: ; - ; Include all other banks which make up the RFS User cited ROM. + ; Include all other banks which make up the RFS User sited ROM. ; INCLUDE "rfs_bank1.asm" INCLUDE "rfs_bank2.asm" diff --git a/asm/rfs_bank1.asm b/asm/rfs_bank1.asm index 74aec2c..2b74a71 100644 --- a/asm/rfs_bank1.asm +++ b/asm/rfs_bank1.asm @@ -34,6 +34,13 @@ ;- along with this program. If not, see . ;-------------------------------------------------------------------------------------------------------- + IF BUILD_SFD700 = 1 + ORG 0E000H + ALIGN UROMADDR + + + ENDIF + ;============================================================ ; ; USER ROM BANK 1 - Floppy Disk Controller functions. @@ -45,20 +52,7 @@ ; Common code spanning all banks. ;-------------------------------- NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS1_0: LD A,(BNKCTRLRST) - DJNZ ROMFS1_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - NOP - NOP - NOP - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - NOP - NOP - NOP - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM2 ; Select the first ROM page. ; ; No mans land... this should have switched to Bank 0 and at this point there is a jump to 00000H. JP 00000H ; This is for safety!! @@ -113,10 +107,10 @@ BKSW1_0: PUSH HL ; P 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 (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET1: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET @@ -159,7 +153,7 @@ L000F: LD DE,MSGBOOTDRV ; CALL GETL ; LD A,(DE) ; CP 01BH ; BREAK pressed? - JP Z,SS ; + JP Z,ST1X ; LD HL,19 ; Check input value is in range 1-4. ADD HL,DE ; LD A,(HL) ; @@ -532,6 +526,13 @@ PRMBLK: DB 000H, 000H, 000H, 000H, 001H, 000H, 0CEH, 000H, 000H, 000H, L03FE: JP (IY) - ALIGN 0EFF8h - ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ; RomDisk, top 8 bytes are used by the control registers when enabled so dont use the space. + IF BUILD_ROMDISK = 1 + ALIGN 0EFF8h + ORG 0EFF8h + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ENDIF + + IF BUILD_SFD700 = 1 + ALIGN 0F000H + ENDIF diff --git a/asm/rfs_bank2.asm b/asm/rfs_bank2.asm index 69baa0b..49211cd 100644 --- a/asm/rfs_bank2.asm +++ b/asm/rfs_bank2.asm @@ -37,6 +37,11 @@ ;- along with this program. If not, see . ;-------------------------------------------------------------------------------------------------------- + IF BUILD_SFD700 = 1 + ORG 0E000H + ALIGN UROMADDR + ENDIF + ;=========================================================== ; ; USER ROM BANK 2 - SD Card Controller functions. @@ -48,25 +53,11 @@ ; Common code spanning all banks. ;-------------------------------- NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS2_0: LD A,(BNKCTRLRST) - DJNZ ROMFS2_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - NOP - NOP - NOP - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - NOP - NOP - NOP - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM2 ; Select the first ROM page. ; ; No mans land... this should have switched to Bank 0 and at this point there is a jump to 00000H. JP 00000H ; This is for safety!! - ;------------------------------------------------------------------------------------------ ; Bank switching code, allows a call to code in another bank. ; This code is duplicated in each bank such that a bank switch doesnt affect logic flow. @@ -117,10 +108,10 @@ BKSW2_0: PUSH HL ; P LD HL, BKSWRET2 ; Place bank switchers return address on stack. EX (SP),HL LD (TMPSTACKP),SP ; Save the stack pointer as some old code corrupts it. - LD (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET2: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET @@ -197,7 +188,7 @@ TDELAYB0: RRA JR NC, TDELAYB1 OR 0 TDELAYB1: RRA - RET NC + ;RET NC RET @@ -1360,7 +1351,7 @@ LOADSD9A: LD (DTADR),DE LD (EXADR),DE JR LOADSDX ; Exit with ok. ; -LOADSD10 CALL LOADSD9 ; Modularised file find as the CMT replacement functions need it. +LOADSD10: CALL LOADSD9 ; Modularised file find as the CMT replacement functions need it. LD DE,MSGLOAD+1 ; Skip initial CR. LD BC,NAME CALL SDPRINT ; Print out the filename. @@ -1592,14 +1583,13 @@ SAVESD9: LD DE,MSGSVFAIL ; Fail, ; END OF SD CONTROLLER FUNCTIONALITY ;------------------------------------------------------------------------------- - - ;-------------------------------------- - ; - ; Message table - Refer to Bank 6 for - ; all printable messages. - ; - ;-------------------------------------- + ; RomDisk, top 8 bytes are used by the control registers when enabled so dont use the space. + IF BUILD_ROMDISK = 1 + ALIGN 0EFF8h + ORG 0EFF8h + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ENDIF - ALIGN 0EFF8h - ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + IF BUILD_SFD700 = 1 + ALIGN 0F000H + ENDIF diff --git a/asm/rfs_bank3.asm b/asm/rfs_bank3.asm index 79d1cd3..1ffa424 100644 --- a/asm/rfs_bank3.asm +++ b/asm/rfs_bank3.asm @@ -38,6 +38,13 @@ COLW EQU 40 SCRNSZ EQU COLW * ROW MODE80C EQU 0 + IF BUILD_SFD700 = 1 + ORG 0E000H + ALIGN UROMADDR + + + ENDIF + ;=========================================================== ; ; USER ROM BANK 3 - Monitor memory utilities. @@ -49,20 +56,7 @@ MODE80C EQU 0 ; Common code spanning all banks. ;-------------------------------- NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS3_0: LD A,(BNKCTRLRST) - DJNZ ROMFS3_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - NOP - NOP - NOP - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - NOP - NOP - NOP - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM2 ; Select the first ROM page. ; ; No mans land... this should have switched to Bank 0 and at this point there is a jump to 00000H. JP 00000H ; This is for safety!! @@ -118,10 +112,10 @@ BKSW3_0: PUSH HL ; P 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 (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET3: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET @@ -543,6 +537,13 @@ SLPT: DB 01H ; TEXT ; ;-------------------------------------- - ALIGN 0EFF8h - ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ; RomDisk, top 8 bytes are used by the control registers when enabled so dont use the space. + IF BUILD_ROMDISK = 1 + ALIGN 0EFF8h + ORG 0EFF8h + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ENDIF + + IF BUILD_SFD700 = 1 + ALIGN 0F000H + ENDIF diff --git a/asm/rfs_bank4.asm b/asm/rfs_bank4.asm index 31377ad..d86cb9c 100644 --- a/asm/rfs_bank4.asm +++ b/asm/rfs_bank4.asm @@ -33,6 +33,12 @@ ;- along with this program. If not, see . ;-------------------------------------------------------------------------------------------------------- + IF BUILD_SFD700 = 1 + ORG 0E000H + ALIGN UROMADDR + + + ENDIF ;=========================================================== ; @@ -45,20 +51,7 @@ ; Common code spanning all banks. ;-------------------------------- NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS4_0: LD A,(BNKCTRLRST) - DJNZ ROMFS4_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - NOP - NOP - NOP - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - NOP - NOP - NOP - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM2 ; Select the first ROM page. ; ; No mans land... this should have switched to Bank 0 and at this point there is a jump to 00000H. JP 00000H ; This is for safety!! @@ -114,10 +107,10 @@ BKSW4_0: PUSH HL ; P 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 (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET4: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET @@ -219,8 +212,18 @@ CMTWRI: ;DI LD HL,IBUFE LD BC,00080H CALL CKSUM - CALL MOTOR - JR C,CMTWRI2 + IF BUILD_ROMDISK = 1 + CALL MOTOR80A + ENDIF + IF BUILD_SFD700 = 1 + IN A,(SFD700_MODE) + OR A + JR Z,CMTWRI80A + CALL MOTOR700 + JR CMTWRI0 +CMTWRI80A: CALL MOTOR80A + ENDIF +CMTWRI0: JR C,CMTWRI2 LD A,E CP 0CCH JR NZ,CMTWRI1 @@ -235,7 +238,17 @@ CMTWRI: ;DI POP DE POP HL CMTWRI1: CALL GAP - CALL WTAPE + IF BUILD_ROMDISK = 1 + CALL WTAPE80A + ENDIF + IF BUILD_SFD700 = 1 + IN A,(SFD700_MODE) + OR A + JR Z,CMTWRI80A2 + CALL WTAPE700 + JR CMTWRI2 +CMTWRI80A2: CALL WTAPE80A + ENDIF CMTWRI2: POP HL POP BC POP DE @@ -323,6 +336,376 @@ SGX: LD A,(SWRK) ; END OF CMT CONTROLLER FUNCTIONALITY ;------------------------------------------------------------------------------- + ;------------------------------------------------------------------------------- + ; START OF MEMORY TEST FUNCTIONALITY + ;------------------------------------------------------------------------------- + +MEMTEST: LD B,240 ; Number of loops +LOOP: LD HL,MEMSTART ; Start of checked memory, + LD D,0CFh ; End memory check CF00 +LOOP1: LD A,000h + CP L + JR NZ,LOOP1b + CALL PRTHL ; Print HL as 4digit hex. + LD A,0C4h ; Move cursor left. + LD E,004h ; 4 times. +LOOP1a: CALL DPCT + DEC E + JR NZ,LOOP1a +LOOP1b: INC HL + LD A,H + CP D ; Have we reached end of memory. + JR Z,LOOP3 ; Yes, exit. + LD A,(HL) ; Read memory location under test, ie. 0. + CPL ; Subtract, ie. FF - A, ie FF - 0 = FF. + LD (HL),A ; Write it back, ie. FF. + SUB (HL) ; Subtract written memory value from A, ie. should be 0. + JR NZ,LOOP2 ; Not zero, we have an error. + LD A,(HL) ; Reread memory location, ie. FF + CPL ; Subtract FF - FF + LD (HL),A ; Write 0 + SUB (HL) ; Subtract 0 + JR Z,LOOP1 ; Loop if the same, ie. 0 +LOOP2: LD A,16h + CALL PRNT ; Print A + CALL PRTHX ; Print HL as 4 digit hex. + CALL PRNTS ; Print space. + XOR A + LD (HL),A + LD A,(HL) ; Get into A the failing bits. + CALL PRTHX ; Print A as 2 digit hex. + CALL PRNTS ; Print space. + LD A,0FFh ; Repeat but first load FF into memory + LD (HL),A + LD A,(HL) + CALL PRTHX ; Print A as 2 digit hex. + NOP + JR LOOP4 + +LOOP3: CALL PRTHL + LD DE,OKCHECK + CALL MSG ; Print check message in DE + LD A,B ; Print loop count. + CALL PRTHX + LD DE,OKMSG + CALL MSG ; Print ok message in DE + CALL NL + DEC B + JR NZ,LOOP + LD DE,DONEMSG + CALL MSG ; Print check message in DE + JP ST1X + +LOOP4: LD B,09h + CALL PRNTS ; Print space. + XOR A ; Zero A + SCF ; Set Carry +LOOP5: PUSH AF ; Store A and Flags + LD (HL),A ; Store 0 to bad location. + LD A,(HL) ; Read back + CALL PRTHX ; Print A as 2 digit hex. + CALL PRNTS ; Print space + POP AF ; Get back A (ie. 0 + C) + RLA ; Rotate left A. Bit LSB becomes Carry (ie. 1 first instance), Carry becomes MSB + DJNZ LOOP5 ; Loop if not zero, ie. print out all bit locations written and read to memory to locate bad bit. + XOR A ; Zero A, clears flags. + LD A,80h + LD B,08h +LOOP6: PUSH AF ; Repeat above but AND memory location with original A (ie. 80) + LD C,A ; Basically walk through all the bits to find which one is stuck. + LD (HL),A + LD A,(HL) + AND C + NOP + JR Z,LOOP8 ; If zero then print out the bit number + NOP + NOP + LD A,C + CPL + LD (HL),A + LD A,(HL) + AND C + JR NZ,LOOP8 ; As above, if the compliment doesnt yield zero, print out the bit number. +LOOP7: POP AF + RRCA + NOP + DJNZ LOOP6 + JP ST1X + +LOOP8: CALL LETNL ; New line. + LD DE,BITMSG ; BIT message + CALL MSG ; Print message in DE + LD A,B + DEC A + CALL PRTHX ; Print A as 2 digit hex, ie. BIT number. + CALL LETNL ; New line + LD DE,BANKMSG ; BANK message + CALL MSG ; Print message in DE + LD A,H + CP 50h ; 'P' + JR NC,LOOP9 ; Work out bank number, 1, 2 or 3. + LD A,01h + JR LOOP11 + +LOOP9: CP 90h + JR NC,LOOP10 + LD A,02h + JR LOOP11 + +LOOP10: LD A,03h +LOOP11: CALL PRTHX ; Print A as 2 digit hex, ie. BANK number. + JR LOOP7 + +DLY1S: PUSH AF + PUSH BC + LD C,10 +L0324: CALL DLY12 + DEC C + JR NZ,L0324 + POP BC + POP AF + RET + + ;------------------------------------------------------------------------------- + ; END OF MEMORY TEST FUNCTIONALITY + ;------------------------------------------------------------------------------- + + ;------------------------------------------------------------------------------- + ; START OF TIMER TEST FUNCTIONALITY + ;------------------------------------------------------------------------------- + + ; Test the 8253 Timer, configure it as per the monitor and display the read back values. +TIMERTST: CALL NL + LD DE,MSG_TIMERTST + CALL MSG + CALL NL + LD DE,MSG_TIMERVAL + CALL MSG + LD A,01h + LD DE,8000h + CALL TIMERTST1 +NDE: JP NDE + JP ST1X +TIMERTST1: ;DI + PUSH BC + PUSH DE + PUSH HL + LD (AMPM),A + LD A,0F0H + LD (TIMFG),A +ABCD: LD HL,0A8C0H + XOR A + SBC HL,DE + PUSH HL + INC HL + EX DE,HL + + LD HL,CONTF ; Control Register + LD (HL),0B0H ; 10110000 Control Counter 2 10, Write 2 bytes 11, 000 Interrupt on Terminal Count, 0 16 bit binary + LD (HL),074H ; 01110100 Control Counter 1 01, Write 2 bytes 11, 010 Rate Generator, 0 16 bit binary + LD (HL),030H ; 00110100 Control Counter 1 01, Write 2 bytes 11, 010 interrupt on Terminal Count, 0 16 bit binary + + LD HL,CONT2 ; Counter 2 + LD (HL),E + LD (HL),D + + LD HL,CONT1 ; Counter 1 + LD (HL),00AH + LD (HL),000H + + LD HL,CONT0 ; Counter 0 + LD (HL),00CH + LD (HL),0C0H + +; LD HL,CONT2 ; Counter 2 +; LD C,(HL) +; LD A,(HL) +; CP D +; JP NZ,L0323H +; LD A,C +; CP E +; JP Z,CDEF + ; + +L0323H: PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; + LD HL,CONTF ; Control Register + LD (HL),080H + LD HL,CONT2 ; Counter 2 + LD C,(HL) + LD A,(HL) + CALL PRTHX + LD A,C + CALL PRTHX + ; + CALL PRNTS + ;CALL DLY1S + ; + LD HL,CONTF ; Control Register + LD (HL),040H + LD HL,CONT1 ; Counter 1 + LD C,(HL) + LD A,(HL) + CALL PRTHX + LD A,C + CALL PRTHX + ; + CALL PRNTS + ;CALL DLY1S + ; + LD HL,CONTF ; Control Register + LD (HL),000H + LD HL,CONT0 ; Counter 0 + LD C,(HL) + LD A,(HL) + CALL PRTHX + LD A,C + CALL PRTHX + ; + ;CALL DLY1S + ; + LD A,0C4h ; Move cursor left. + LD E,0Eh ; 4 times. +L0330: CALL DPCT + DEC E + JR NZ,L0330 + ; +; LD C,20 +;L0324: CALL DLY12 +; DEC C +; JR NZ,L0324 + ; + POP HL + POP DE + POP BC + POP AF + ; + LD HL,CONT2 ; Counter 2 + LD C,(HL) + LD A,(HL) + CP D + JP NZ,L0323H + LD A,C + CP E + JP NZ,L0323H + ; + ; + PUSH AF + PUSH BC + PUSH DE + PUSH HL + CALL NL + CALL NL + CALL NL + LD DE,MSG_TIMERVAL2 + CALL MSG + POP HL + POP DE + POP BC + POP AF + + ; +CDEF: POP DE + LD HL,CONT1 + LD (HL),00CH + LD (HL),07BH + INC HL + +L0336H: PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; + LD HL,CONTF ; Control Register + LD (HL),080H + LD HL,CONT2 ; Counter 2 + LD C,(HL) + LD A,(HL) + CALL PRTHX + LD A,C + CALL PRTHX + ; + CALL PRNTS + CALL DLY1S + ; + LD HL,CONTF ; Control Register + LD (HL),040H + LD HL,CONT1 ; Counter 1 + LD C,(HL) + LD A,(HL) + CALL PRTHX + LD A,C + CALL PRTHX + ; + CALL PRNTS + CALL DLY1S + ; + LD HL,CONTF ; Control Register + LD (HL),000H + LD HL,CONT0 ; Counter 0 + LD C,(HL) + LD A,(HL) + CALL PRTHX + LD A,C + CALL PRTHX + ; + CALL DLY1S + ; + LD A,0C4h ; Move cursor left. + LD E,0Eh ; 4 times. +L0340: CALL DPCT + DEC E + JR NZ,L0340 + ; + POP HL + POP DE + POP BC + POP AF + + LD HL,CONT2 ; Counter 2 + LD C,(HL) + LD A,(HL) + CP D + JR NZ,L0336H + LD A,C + CP E + JR NZ,L0336H + CALL NL + LD DE,MSG_TIMERVAL3 + CALL MSG + POP HL + POP DE + POP BC + ;EI + RET + ;------------------------------------------------------------------------------- + ; END OF TIMER TEST FUNCTIONALITY + ;------------------------------------------------------------------------------- + + ;-------------------------------------- + ; + ; Message table + ; + ;-------------------------------------- +OKCHECK: DB ", CHECK: ", 0Dh +OKMSG: DB " OK.", 0Dh +DONEMSG: DB 11h + DB "RAM TEST COMPLETE.", 0Dh + +BITMSG: DB " BIT: ", 0Dh +BANKMSG: DB " BANK: ", 0Dh +MSG_TIMERTST: + DB "8253 TIMER TEST", 0Dh, 00h +MSG_TIMERVAL: + DB "READ VALUE 1: ", 0Dh, 00h +MSG_TIMERVAL2: + DB "READ VALUE 2: ", 0Dh, 00h +MSG_TIMERVAL3: + DB "READ DONE.", 0Dh, 00h + ;-------------------------------------- ; ; Message table - Refer to bank 6 for @@ -330,6 +713,13 @@ SGX: LD A,(SWRK) ; ;-------------------------------------- - ALIGN 0EFF8h - ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ; RomDisk, top 8 bytes are used by the control registers when enabled so dont use the space. + IF BUILD_ROMDISK = 1 + ALIGN 0EFF8h + ORG 0EFF8h + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ENDIF + + IF BUILD_SFD700 = 1 + ALIGN 0F000H + ENDIF diff --git a/asm/rfs_bank5.asm b/asm/rfs_bank5.asm index 5bda0db..cda0fe1 100644 --- a/asm/rfs_bank5.asm +++ b/asm/rfs_bank5.asm @@ -34,6 +34,12 @@ ;- along with this program. If not, see . ;-------------------------------------------------------------------------------------------------------- + IF BUILD_SFD700 = 1 + ORG 0E000H + ALIGN UROMADDR + + + ENDIF ;====================================== ; @@ -46,20 +52,7 @@ ; Common code spanning all banks. ;-------------------------------- NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS5_0: LD A,(BNKCTRLRST) - DJNZ ROMFS5_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - NOP - NOP - NOP - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - NOP - NOP - NOP - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM2 ; Select the first ROM page. ; ; No mans land... this should have switched to Bank 0 and at this point there is a jump to 00000H. JP 00000H ; This is for safety!! @@ -115,10 +108,10 @@ BKSW5_0: PUSH HL ; P 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 (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET5: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET @@ -205,6 +198,13 @@ SHARPTOASC: DB 000H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H DB 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H ; 0xEF DB 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H, 020H ; 0xFF - ALIGN 0EFF8h - ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ; RomDisk, top 8 bytes are used by the control registers when enabled so dont use the space. + IF BUILD_ROMDISK = 1 + ALIGN 0EFF8h + ORG 0EFF8h + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ENDIF + + IF BUILD_SFD700 = 1 + ALIGN 0F000H + ENDIF diff --git a/asm/rfs_bank6.asm b/asm/rfs_bank6.asm index cfff453..df7ce16 100644 --- a/asm/rfs_bank6.asm +++ b/asm/rfs_bank6.asm @@ -36,6 +36,12 @@ ;- along with this program. If not, see . ;-------------------------------------------------------------------------------------------------------- + IF BUILD_SFD700 = 1 + ORG 0E000H + ALIGN UROMADDR + + + ENDIF ;====================================== ; @@ -48,20 +54,7 @@ ; Common code spanning all banks. ;-------------------------------- NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS6_0: LD A,(BNKCTRLRST) - DJNZ ROMFS6_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - NOP - NOP - NOP - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - NOP - NOP - NOP - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM2 ; Select the first ROM page. ; ; No mans land... this should have switched to Bank 0 and at this point there is a jump to 00000H. JP 00000H ; This is for safety!! @@ -117,10 +110,10 @@ BKSW6_0: PUSH HL ; P 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 (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET6: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET @@ -280,39 +273,69 @@ PRTSTRE: POP DE ; 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. ; 1 40 -HELPSCR: DB "0..9 - select RFS Drive.", 00DH - DB "40 - 40 col mode.", 00DH - DB "80 - 80 col mode.", 00DH - ;DB "700 - Select MZ-700 Mode.", 00DH - ;DB "7008 - Select MZ-700 80 col Mode.", 00DH - DB "B - toggle keyboard bell.", 00DH - DB "BASIC - Load BASIC SA-5510.", 00DH - DB "C - clear memory $1200-$D000.", 00DH - DB "CPXXXXYYYYZZZZ - copy memory", 00DH - DB " XXXX=src,YYYY=dst,ZZZZ=size", 00DH - DB "CPM - Load CPM.", 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 +HELPSCR: IF BUILD_ROMDISK = 1 + DB "0..9 - select RFS Drive.", 00DH + DB "40 - 40 col mode.", 00DH + DB "80 - 80 col mode.", 00DH + ;DB "700 - Select MZ-700 Mode.", 00DH + ;DB "7008 - Select MZ-700 80 col Mode.", 00DH + DB "B - toggle keyboard bell.", 00DH + DB "BASIC - Load BASIC SA-5510.", 00DH + DB "C - clear memory $1200-$D000.", 00DH + DB "CPXXXXYYYYZZZZ - copy memory", 00DH + DB " XXXX=src,YYYY=dst,ZZZZ=size", 00DH + DB "CPM - Load CPM.", 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 + ENDIF + IF BUILD_SFD700 = 1 + DB "ASMXXXX assemble into dest XXXX", 00DH + DB "B - toggle keyboard bell.", 00DH + DB "BASIC - Load BASIC SA-5510.", 00DH + DB "C - clear memory $1200-$D000.", 00DH + DB "CPXXXXYYYYZZZZ - copy memory", 00DH + DB " XXXX=src,YYYY=dst,ZZZZ=size", 00DH + ;DB "CPM - Load CPM.", 00DH + DB "DXXXX[YYYY] - dump mem XXXX to YYYY.", 00DH + DB "DASMXXXX[YYYY]", 00DH + DB " disassemble XXXX to YYYY", 00DH + DB "F[X] - boot fd drive X.", 00DH + DB "f - boot fd original rom.", 00DH + DB "H - this help screen.", 00DH + DB "IR - rfs rom dir listing.", 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 " - 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 " XXXX=start,YYYY=end,ZZZZ=exec", 00DH + DB "T - test timer.", 00DH + DB "V - verify tape save.", 00DH + DB 000H + ENDIF ;------------------------------------------------------------------------------- ; END OF HELP SCREEN FUNCTIONALITY @@ -455,7 +478,7 @@ ATBL: DB 0CCH ; NUL '\0' (null character) ; ;-------------------------------------- MSGSONTZ: DB "+ TZ" ; Version 2.x with version 2.1+ of tranZPUter board installed. -MSGSON: DB "+ RFS ", 0ABh, "2.2 **", 00DH, 000H ; Version 2.x-> as we are now using the v2.x PCB with 4 devices on-board +MSGSON: DB "+ RFS ", 0ABh, "2.3 **", 00DH, 000H ; Version 2.x-> as we are now using the v2.x PCB with 4 devices on-board MSGNOTFND: DB "Not Found", 00DH, 000H MSGRDIRLST: DB "ROM Directory:", 00DH, 000H MSGTRM: DB 00DH, 000H @@ -491,7 +514,16 @@ MSGNOTZINST:DB "No tranZPUter >=v2 card installed.", 00DH, 000H MSGNOCMTDIR:DB "CMT has no directory.", 00DH, 000H MSGINVDRV: DB "Invalid drive, SD=0..9 or C=CMT", 00DH, 000H MSGNOVERIFY:DB "No Verify for SD!", 00DH, 000H +MSGNOINSTR: DB "Bad instruction.", 00DH, 000H +MSGNOPARAM: DB "Bad parameter.", 00DH, 000H - ALIGN 0EFF8h - ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ; RomDisk - Pad to EFFF boundary. + IF BUILD_ROMDISK = 1 + ALIGN 0EFF8h + ORG 0EFF8h + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ENDIF + ; SFD700 - Pad to 10000H + IF BUILD_SFD700 = 1 + ALIGN 10000H + ENDIF diff --git a/asm/rfs_bank7.asm b/asm/rfs_bank7.asm index 5f66f24..8bf4b78 100644 --- a/asm/rfs_bank7.asm +++ b/asm/rfs_bank7.asm @@ -33,6 +33,772 @@ ;- along with this program. If not, see . ;-------------------------------------------------------------------------------------------------------- + ORG 0CF00H + +COUNT_C: DS virtual 1 ; Counter C +ADDR: +ADDR_LO: DS virtual 1 +ADDR_HI: DS virtual 1 +ASM_ADDR: DS virtual 8 ; Assembler Destination address +ASM_BUF: DS virtual 16 ; 16 byte ASM Input Buffer +OUT_BUF: DS virtual 4 ; 4 byte test buffer(last part of ASM_BUF) +INS_BUF: DS virtual 4 ; 4 Byte Instruction Buffer +PARM_BUF: DS virtual 7 ; 7 Byte Parm Buffer +VAL_BUF: ; 5 Byte Value Buffer +VAL_BUF_HI: DS virtual 2 ; 2 Hi Bytes in Value Buffer +VAL_BUF_LO: DS virtual 2 ; 2 Lo Bytes in Value Buffer + DS virtual 1 +SRC_ADDR: DS virtual 2 ; 2 byte source pointer storage +DES_ADDR: DS virtual 2 ; 2 byte destination pointer storage +BLK_ADDR: DS virtual 2 ; 2 byte table block pointer storage +ROW_ADDR: DS virtual 2 ; 2 byte table row pointer storage +BLK_NUM: DS virtual 1 ; 1 byte Block Number +BLK_SIZE: DS virtual 1 ; 1 byte Block Size +ROW_NUM: DS virtual 1 ; 1 byte Row Number +ML_BUF: DS virtual 2 ; 3 byte ML buffer +ML_BTCOUNT: DS virtual 1 ; Last byte of ML buffer(byte count) +VAL_LO: DS virtual 1 ; Converted value LO +VAL_HI: DS virtual 1 ; Converted value Hi + + + ORG 0E000H + ALIGN 0E300H + + IF BUILD_SFD700 = 1 + ;****************************************************************** + ; DASM_MAIN Z80 Dis-Assembler + ; Based on tables used by TASM for the Z80 target + ;****************************************************************** +DASM_MAIN: LD B,(VAL_HI-COUNT_C)+1 + LD HL,COUNT_C + XOR A + CALL MEMSET + ; + CALL HLHEX ; Get starting address. + JP C,DASM_ERR + LD (SRC_ADDR),HL ; Save in SRC_ADDR & SRC_ADDR+1 + INC DE + INC DE + INC DE + INC DE + + LD BC,0h ; Add 1 To Start Address BC=0000 + SCF ; C=1 + ADC HL,BC ; Add HL+BC+C to HL(FFFF will overflow to 0000) + RET Z ; Exit if xFFFF was entered + + CALL HLHEX ; get end address + LD (ADDR_LO),HL + JP NC,DASM_UENDAD ; User entered a non-zero address(use it) + + XOR A + LD (ASM_ADDR),A ;NOT Using End Address - Just do 16 rows + LD (ASM_ADDR+1),A ;Set ASM_ADDR=x0000 + + LD A,10h + LD (COUNT_C),A ; Set Row Counter = 16 + JP DASM_UROWCT + +DASM_UENDAD: LD A,0FFh ; End Address Was entered - Use It + LD (COUNT_C),A ; Set Row Counter = xFF + + LD HL,(ADDR_LO) + LD (ASM_ADDR),HL +DASM_UROWCT: LD HL,(SRC_ADDR) + LD (ADDR_LO),HL + + ; ** Print CR, LF, ADDR_HI, ADDR_LO (in HEX), space +DASM_LOOP1: CALL NL ; Print CR & LF + LD A,(ADDR_HI) ; Print Address Buffer + CALL PRTHX + LD A,(ADDR_LO) + CALL PRTHX + CALL PRNTS ; Print Space + + LD HL,ASM_BUF ; Clear ASM_BUF, INS_BUF, PARM_BUF & VAL_BUF + LD A,020H + LD B,26 ; (Set to all spaces) +DASM_FILL: LD (HL),A + INC HL + DEC B + JP NZ,DASM_FILL + + ; ** Get 2 bytes from memory pointed to by ADDR_LO & ADDR_HI + LD HL,(ADDR_LO) ; Address ->HL + LD A,(HL) ; First Byte ->A + LD (ML_BUF),A ; Store in ML_BUF Byte 0 + + INC HL + LD A,(HL) ; Second Byte ->A + LD (ML_BUF+1),A ; Store in ML_BUF Byte 1 + + CALL DASMBITINST ; Is This a BIT,SET or RES Inst.? + JP NZ,DASM_FIND ; NO=Do regular search + CALL DSMFINDOPCD ; Search For Matching BIT,SET,RES OP Code + JP Z,DASM_ERR ; NOT FOUND - Error Message + CALL DASMGETINST ; Copy 4 byte Assembler Inst. to ASM_BUF + JP DASM_JUSTV ; VAL_BUF has already been populated + +DASM_FIND: CALL DSMFINDOPCD ; Search For Matching OP Code + JP Z,DASM_ERR ; NOT FOUND - Error Message + + CALL DASMGETINST ; Copy 4 byte Assembler Inst. to ASM_BUF + + ; ** Are Data Bytes expected? YES=COPY TO VAL_BUF + LD A,'0' + LD (VAL_BUF_HI),A ; Set VAL_BUF_HI="00" + LD (VAL_BUF_HI+1),A + LD A,0 + LD (VAL_BUF_LO),A ; Set VAL_BUF_LO=NULL(NO DATA indicator) + + CALL DASMGETVAL ; Get 1 or 2 value bytes from memory + +DASM_JUSTV: CALL DSMLFJVAL ; Left justify VAL_BUF(Trim leading zeros) + + CALL DASMGETPARM ; Build parameter string with value data + + CALL DSMRTRIMASM ; Trim trailing spaces from ASM_BUF + + LD A,0Fh ; Output Memory Bytes and Advance Address Pointer + LD C,A + LD HL,(ADDR_LO) ; Address ->HL + LD A,(ML_BTCOUNT) ;Get Total Byte count from lookup table + LD B,A ;Save in B +DASM_MEMOUT: LD A,(HL) + CALL PRTHX + CALL PRNTS ; Print Space + INC HL ; Adjust memory pointer and byte count + DEC C + DEC C + DEC C + DEC B + JP NZ,DASM_MEMOUT ; DONE? NO=Continue + LD (ADDR_LO),HL ; Save New Memory Address + +DASM_SPCOUT: CALL PRNTS ; Pad with spaces to 15 bytes + DEC C + JP NZ,DASM_SPCOUT ; DONE? NO=Continue + + LD HL,ASM_BUF ; Send Assembly string + EX DE,HL + LD HL,PRTSTR + CALL BKSW7to6 + + LD A,(COUNT_C) ; Get Row Count + CP 0FFh ; Using End Address? + JP Z,DASM_CKEADR + DEC A ; Decrement + RET Z ; DONE? - YES = Exit + LD (COUNT_C),A ; NO= Save Row Count + JP DASM_LOOP1 ; Continue... + +DASM_CKEADR: LD HL,(ASM_ADDR) ; Get End Address + LD BC,(ADDR_LO) ; Get Memory Address pointer + SBC HL,BC ; Subtract End from Current + RET M ; If resulte negative - Exit + JP DASM_LOOP1 ; Otherwise Continue... + +DASM_ERR: LD DE,MSGNOTFND + LD HL,PRINTMSG + CALL BKSW7to6 + RET + + ;****************************************************************** + ; Dis-Assembler Routines + ;****************************************************************** + + ;****************************************************************** + ; ISVALBUF0 + ; Return Z=1 if VAL_BUF contains a single '0' followed by a NULL + ;****************************************************************** +ISVALBUF0: LD A,(VAL_BUF) + CP '0' + JP NZ,IZVBFZ_RET + LD A,(VAL_BUF+1) + CP 0 +IZVBFZ_RET: RET + + ;****************************************************************** + ; ISIXIYPRM + ; Is parameter (IX*) or (IY*) + ;****************************************************************** +ISIXIYPRM: PUSH BC + PUSH HL + LD C,0 ; C = match counter + LD B,7 ; B = byte counter + LD HL,(ROW_ADDR) ; HL = Row data pointer +ISIX_LOOP: LD A,(HL) ; Get a byte from row + CP '(' ; If '(', 'I' or '*' Increment C + JP Z,ISIX_CKI + CP '*' + JP Z,ISIX_COUNT + JP ISIX_NEXT ;None of the above then continue + +ISIX_CKI: INC HL ;Check for '(' followed by 'I' + LD A,(HL) ;Get byte after the '(' just found + CP 'I' ;Is it = 'I'? + JP Z,ISIX_COUNT ;Yes=Count the match + JP ISIX_NEXT2 ;No = Continue + +ISIX_COUNT: INC C +ISIX_NEXT: INC HL ; Advance row data pointer +ISIX_NEXT2: DEC B ; Decrement byte count + JP NZ,ISIX_LOOP ; DONE? NO = Continue + LD A,C ; Get match count + CP 2 ; If = 2 Return Z=1 otherwise Z=0 + POP HL + POP BC + RET + + ;****************************************************************** + ; IS_DIGIT + ; + ; RETURN Z=1 if A is 'A'-'F' otherwise Z=0 (A is unchanged ) + ; NOTE: A MUST be a non-zero ASCII Digit + ;****************************************************************** +IS_DIGIT: CALL ISDECDIGIT ; Is it '0'-'9' + JP Z,IS_DIG_EXIT ; YES=EXIT with Z=1 + + CALL ISHEXDIGIT ; test for 'A'-'F' and return +IS_DIG_EXIT: RET + + ;****************************************************************** + ; ISHEXDIGIT + ; + ; RETURN Z=1 if A is 'A'-'F' otherwise Z=0 (A is unchanged) + ; NOTE: A MUST be a non-zero ASCII Digit + ;****************************************************************** +ISHEXDIGIT: CP 'A' ; is A <'A'? + JP M,ISHEXD_EXIT ; YES=just exit Z=0 + CP 'G' ; is A <='F'? + JP M,ISHEXD_ZRET ; YES=return Z=1 + JP ISHEXD_EXIT ; otherwise return Z=0 + +ISHEXD_ZRET: CP A ; Set Z=1 and Return + RET + +ISHEXD_EXIT: CP 0 ; Set Z=0 and Return + RET + + ;****************************************************************** + ; ISDECDIGIT + ; + ; RETURN A=1 if A is '0'-'9' otherwise Z=0 (A is unchanged) + ; NOTE: A MUST be a non-zero ASCII Digit + ;****************************************************************** +ISDECDIGIT: CP '0' ; is A <'0'? + JP M,ISDECD_EXIT ; YES= exit with Z=0 + CP 03Ah ; is A <='9'? + JP M,ISDECD_ZRET ; YES=return Z=1 + JP ISDECD_EXIT ; otherwise just exit with Z=0 + +ISDECD_ZRET: CP A ; Set Z=1 and Return + RET + +ISDECD_EXIT: CP 0 ; Set Z=0 and Return + RET + + ;****************************************************************** + ; MEMSET + ; HL=src B=COUNT A=FILL BYTE + ; COPY A to (HL) for B bytes + ;****************************************************************** +MEMSET: LD (HL),A + INC HL + DEC B + JP NZ, MEMSET + RET + + ;****************************************************************** + ; RTJUSTVAL + ; Shift bytes in VAL_BUF right until left padded with '0's + ;****************************************************************** +RTJUSTVAL: PUSH IX + PUSH BC + LD IX,VAL_BUF + LD B,05h ; B=MAX search count 5 + +RTJVAL_LOOP: LD A,(IX+3) ; Get last byte from VAL_BUF + CP ' ' ; Is It SPACE? + JP NZ,RTJVAL_EXIT ; Exit + LD A,(IX+2) ; Shift 3 bytes left 1 positiom + LD (IX+3),A + LD A,(IX+1) + LD (IX+2),A + LD A,(IX+0) + LD (IX+1),A + LD A,'0' ; Pad first position with '0' + LD (IX+0),A + DEC B + JP NZ,RTJVAL_LOOP + +RTJVAL_EXIT: POP BC + POP IX + RET + + ;****************************************************************** + ; DSMRTRIMASM + ; Trim trailing spaces from ASM_BUF + ;****************************************************************** +DSMRTRIMASM: PUSH BC + PUSH HL + LD B,0Fh ; B=MAX loop count 15 + LD HL,ASM_BUF+15 ; HL=tail of ASM_BUF + +DSMRTA_LOOP: LD A,(HL) ; Get a byte from VAL_BUF + CP ' ' ; Is It ' '? + JP NZ,DSMRTA_EXIT ; No = Exit + LD A,000h ; A=FFh + LD (HL),A ; Store in ASM_BUF + DEC HL ; Decrement ASM_BUF pointer + DEC B ; Decrement byte count + JP NZ,DSMRTA_LOOP ; Done? No=Continue + +DSMRTA_EXIT: POP HL ; Restore BC, HL & Exit + POP BC + RET + + ;****************************************************************** + ; DSMLFJVAL + ; Shift bytes in VAL_BUF left until non-zero char is encountered + ;****************************************************************** +DSMLFJVAL: PUSH BC + LD B,03h ; B=MAX loop count 3 + +DSMLFJ_LOOP: LD A,(VAL_BUF) ; Get 1st byte from VAL_BUF + CP '0' ; Is It '0'? + JP NZ,DSMLFJ_EXIT ; No = Exit + LD A,(VAL_BUF+1) ; Shift 3 bytes left 1 positiom + LD (VAL_BUF),A + LD A,(VAL_BUF+2) + LD (VAL_BUF+1),A + LD A,(VAL_BUF+3) + LD (VAL_BUF+2),A + LD A,0 ;Set last position to NULL + LD (VAL_BUF+3),A + DEC B + JP NZ,DSMLFJ_LOOP + +DSMLFJ_EXIT: POP BC + RET + + ;****************************************************************** + ; BYTE2ASCII + ; Convert Hex Value of A to 2 Hex ASCII bytes in HL + ; NOTE: L=MSB, H=LSB since strings are usually Hi,Lo eg:"35" + ; if we use LD (address),HL then address = L and address+1 = H + ;****************************************************************** +BYTE2ASCII: LD H,A ;Save A in H + RRA ;Shift Hi 4 Bits to Low 4 Bits + RRA + RRA + RRA + CALL NIB_TOHEX + LD L,A ; MSB->L + LD A,H ;Restore A from H + CALL NIB_TOHEX + LD H,A ; LSB->H + RET + + ;****************************************************************** + ; NIB_TOHEX + ; Convert Lo 4 bits of A to ASCII of it's HEX value (0-9 or A-F) + ;****************************************************************** +NIB_TOHEX: AND 0Fh ;Mask Hi 4 Bits + CP 0Ah ; is it 9 or less? + JP M,ADD_30X + ADD A,07h +ADD_30X: ADD A,030h + RET + + ;****************************************************************** + ; DASMBITINST + ; ML_BUF contains 2 bytes from current memory location. + ; If Byte1=0xCB and (Byte2 & 0xC0) > 0 This is a BIR, SET or RES inst. + ; Pull the "Bit" value from Byte2 and populate VAL_LO + ; Mask the "Bit" indicator bits from byte 2 and do the lookup + ;****************************************************************** +DASMBITINST: LD B,0CBh ;B=0xCB + LD A,(ML_BUF) ;A=ML_BUF Byte1 + CP B ;Compare A with B + JP NZ,DASMBIT_RET ;NoMatch Exit with Z=0 + LD A,(ML_BUF+1) ;Get Byte2 + AND 0C0h ;AND with 0xCO + JP NZ,DASMBIT_VAL ;Not Zero then this is a BIT,SET or RES + LD A,0FFh ;Otherwise... + JP DASMBITRETN ;Return with Z=0 + +DASMBIT_VAL: LD A,(ML_BUF+1) ;Get Byte2 + AND 038h ;Mask All but 'BIT#' bits + RRA ;Shift Right 3x + RRA + RRA + AND 07h + PUSH HL ;Save Address Pointer + CALL BYTE2ASCII ;Convert A to 2 ASCII Bytes in HL + LD (VAL_BUF_LO),HL ;Store 2 bytes in VAL_BUF_LO + LD A,'0' + LD (VAL_BUF_HI),A + LD (VAL_BUF_HI+1),A;Store '00' in VAL_BUF_HI + POP HL ;Restore Address pointer + LD A,(ML_BUF+1) ;Get Byte2 + AND 0C7h ;AND with 0xC7 + LD (ML_BUF+1),A ;Replace MLByte2 +DASMBITRETZ: LD A,0 ;Return with Z=1 +DASMBITRETN: CP 0 ;Return with Z=0 +DASMBIT_RET: RET + + ;****************************************************************** + ; DASMGETPARM + ; Build the Assembly instruction parameter string from bytes in + ; the found row in the lookup table. + ; Assumes justified value bytes are already in VAL_BUF if required. + ; NOTE: ROW_ADDR is set by successful find by DSMFINDOPCD + ;****************************************************************** +DASMGETPARM: LD B,7 ;Byte Counter = 7 + LD IY,ASM_BUF+5; ;IY=Target Address (ASM_BUF+5) + LD IX,(ROW_ADDR) ;IX=Source Address (Table Row Address) +DASM_GETPRM: LD A,(IX) ;Get Parm Byte + CP '*' ;Is it a '*'? + JP NZ,DASM_SAVPAR ;NO=Save Parm byte + + CALL ISIXIYPRM ;Is this an (IX*) ot (IY*) Parm? + JP NZ,DASM_MOVVAL ;NO=Just move the value bytes + CALL ISVALBUF0 ;Is VAL_BUF="0" + JP Z,DASM_NXTPR2 ;YES=Skip move of value bytes + LD A,'+' + LD (IY),A ;Store a '+' + INC IY ;Advance Target Address & move value bytes + +DASM_MOVVAL: LD C,4 ;Byte count=4 + LD HL,VAL_BUF ;HL = VAL_BUF +DASM_MVLOOP: LD A,(HL) ;Get a value byte + CP 0 ;NULL? + JP Z,DASM_SAVH ;YES=DONE goto Save 'h' & continue + LD (IY),A ;Store the value char + INC IY ;Advance destination (ASM_BUF) pointer + INC HL + DEC C + JP NZ,DASM_MVLOOP + +DASM_SAVH: LD A,'h' ;Load the 'h' +DASM_SAVPAR: LD (IY),A ;Store parm char +DASM_NXTPAR: INC IY ;Advance Target Address +DASM_NXTPR2: INC IX ;Advance Source Address + DEC B ;Count Source bytes + JP NZ,DASM_GETPRM ;DONE? NO=Continue + RET ;YES= Exit + + ;****************************************************************** + ; DASMGETVAL + ; Copy 1 or 2 bytes of value data from memory to VAL_BUF + ; Data value are converted to ASCII HEX chars in VAL_BUF + ; NOTE: ML_BTCOUNT is set by successful find by DSMFINDOPCD + ;****************************************************************** +DASMGETVAL: LD HL,(ADDR_LO) ;Get memory Address->HL + LD A,(ML_BTCOUNT) ;Get Total Byte count from lookup table + LD B,A ;Save in B + DEC B ;Skip 1 Byte count + INC HL ;Skip 1 byte in memory + LD A,(ML_BUF+1) ;Is this a 2 byte instruction? + CP 0 + JP Z,DASM_CKBTCNT ;NO= check final byte count + DEC B ;Decrement byte count + INC HL ;Adjust memory pointer +DASM_CKBTCNT:LD A,0 + CP B ;Is byte count=0? + JP Z,DASM_GVEXIT ;YES=NO Data Bytes expected - Exit + LD A,(HL) ;Get 1st Data Byte from memory + PUSH HL ;Save Address Pointer + CALL BYTE2ASCII ;Convert A to 2 ASCII Bytes in HL + LD (VAL_BUF_LO),HL ;Store 2 bytes in VAL_BUF_LO + POP HL ;Restore Address pointer + DEC B + LD A,0 + CP B ;Is byte count=0? + JP Z,DASM_GVEXIT ;YES=NO More Data Bytes expected - Exit + INC HL + LD A,(HL) ;Get 2nd Data Byte from memory + CALL BYTE2ASCII ;Convert A to 2 ASCII Bytes in HL + LD (VAL_BUF_HI),HL ;Store 2 bytes in VAL_BUF_LO +DASM_GVEXIT: RET + + ;****************************************************************** + ; DASMGETINST + ; Copy 4 byte Assembler Instruction to ASM_BUFF + ; NOTE: BLK_ADDR is set by successful find by DSMFINDOPCD + ;****************************************************************** +DASMGETINST: LD HL,(BLK_ADDR) ; Block Header Row Address ->HL + LD DE,ASM_BUF ; ASM_BUF address->DE + LD B,04h ; Byte Count=4 +DASM_MOVINS: INC HL ; Inc Block Header data pointer + LD A,(HL) ; Get 1 byte from Block Header + LD (DE),A ; Save to ASM_BUF + INC DE ; Inc destination (ASM_BUF) pointer + DEC B ; Dec byte count + JP NZ,DASM_MOVINS ;DONE? No=Continue + RET ; YES=Exit + + ;****************************************************************** + ; DSMFINDOPCD + ; ML_BUF contains 2 bytes from current memory location. + ; Search opcode table for a matching opcode + ; Return with BLK_ADDR=block header address, ROW_ADDR=found row address + ; ML_BYCOUNT=a non-zero count if match was found + ;****************************************************************** +DSMFINDOPCD: PUSH BC + LD IX,OPCD_TABLE ;Set IX=Table Start Address +DSMFN_LOOP1: LD A,(IX+0) + CP '#' ;Is Row Byte0='#'? + JP NZ,DSMFNCKBT1 ;YES=SAVE IX->BLK_ADDR + LD (BLK_ADDR),IX + JP DSMFN_NXTROW + +DSMFNCKBT1: LD A,(ML_BUF) ;IS ML_BUF0=(CB,DD,ED or FD)? + CP 0CBh + JP Z,DSMFN_CKBT2 + CP 0DDh + JP Z,DSMFN_CKBT2 + CP 0EDh + JP Z,DSMFN_CKBT2 + CP 0FDh + JP Z,DSMFN_CKBT2 + LD C,(IX+7) ; If ML_BUF0 is NOT one of the above + CP C ; Compare with row byte7 + JP NZ,DSMFN_NXTROW ; NO=Next Row + LD A,0 + LD C,(IX+8) ; Get Row Byte8 + CP C ; Is it Zero + JP Z,DSMFN_MATCH ; YES=MATCH! + JP DSMFN_NXTROW ; NO=Next Row + +DSMFN_CKBT2: LD C,(IX+8) ;If ML_BUF0=(CB,DD,ED or FD)? + CP C ; Compare with row byte8 + JP NZ,DSMFN_NXTROW ; NO=Next Row + LD A,(ML_BUF+1) ; YES=Check Next Byte + LD C,(IX+7) ; Combare with row byte7 + CP C + JP Z,DSMFN_MATCH ; YES=MATCH! + +DSMFN_NXTROW:LD BC,000Ah ; Add 10 to IX and KEEP LOOKING + ADD IX,BC + LD A,(IX+5) ; End Of Lookup Table? + CP 0 + JP NZ,DSMFN_LOOP1 ; NO=Keep Looking otherwise EXIT + +DSMFN_MATCH: LD (ROW_ADDR),IX ; Save IX->ROW_ADDR + LD A,(IX+8) + LD (ML_BUF+1),A ; Save row byte8 ->ML_BUF1 + LD A,(IX+9) + LD (ML_BTCOUNT),A ; Save byte count->ML_BYCOUNT + CP 0 ; Set Z flag if NOT FOUND + POP BC + RET + + ;****************************************************************** + ; END DIS_MAIN + ;****************************************************************** + + ;****************************************************************** + ; ASM_MAIN Z80 Assembler + ; Based on tables used by the TASM for the Z80 target + ;****************************************************************** +ASM_MAIN: CALL HLHEX ; Print "Enter Address:" and get 4 hex bytes + JP C,DASM_ERR + LD (ADDR),HL + + ; ** Print CR, LF, ADDR_HI, ADDR_LO (in HEX), space +ASM_LOOP1: CALL NL ; Print CR & LF + LD A,(ADDR_HI) ; Print Address Buffer + CALL PRTHX + LD A,(ADDR_LO) + CALL PRTHX + CALL PRNTS ; Print Space + + LD HL,ASM_BUF ; Clear ASM_BUF, INS_BUF, PARM_BUF & VAL_BUF + LD B,30h + CALL MEMSET + + LD DE,BUFER ; Use the SA1510 input buffer, it is larger and free format. + CALL GETL + CALL HLHEX ; Check if the address is present, if it is, update address as user may have changed it. + JR C,ASM_LOOP3 + LD (ADDR),HL +ASM_LOOP3: LD BC,01005H + LD DE,BUFER+5 ; Skip memory address. + LD HL,ASM_BUF + CALL GETSTR + LD A,0C2H ; Put cursor back to end of input line. Need to use display control for scrolling. + CALL DPCT ; Cursor up. + + ; Clear the line, could have old data on it. + LD A,(SCRNMODE) + LD B,39 + OR A + JR Z,ASM_LOOP4 + LD B,79 +ASM_LOOP4: CALL PRNTS + DJNZ ASM_LOOP4 + + ; Reprint the line, removing leading white space. + LD HL,(DSPXY) + LD L, 0 + LD (DSPXY),HL + LD A,(ADDR_HI) ; Print Address Buffer + CALL PRTHX + LD A,(ADDR_LO) + CALL PRTHX + CALL PRNTS ; Print Space + LD DE,ASM_BUF +ASM_LOOP5: LD A,(DE) + CP 000H + JR Z,ASM_LOOP6 + CALL PRNT + INC DE + JR ASM_LOOP5 + +ASM_LOOP6: LD HL,(DSPXY) + LD L, 22 + LD (DSPXY),HL ; To end of instruction. + + LD A,(ASM_BUF) ; Check 1st byte of ASM_BUF + CP 0 ; Nothing was entered (QUIT) + JP Z,ASM_EXIT ; Just exit + +;ASM_LOOP2: CALL PRNTS ; print spaces (16-input length from B) +; INC C +; LD A,C +; CP 0Fh +; JP M,ASM_LOOP2 + +ASM_CPYINS: LD DE,INS_BUF + LD HL,ASM_BUF + CALL CPY2SPC ; Copy the instruction from ASM_BUF to INST_BUF + CALL SKIPSPC ; find the start of the parm. bytes + + LD BC,PARM_BUF + CALL PADWSPC ; Pad the instruction buffer to 4 bytes + + ;**** Process the input parameter ***** + LD A,10h + LD B,A ; Load byte counter =16 +GET_NEXTASM: LD A,(HL) ; Get 1 byte from ASM_BUF + CP 0 ; if we reached the end of input? + JP Z,ASMLOOPEXIT ; just exit + CALL ISFLAGORNUM ; Is it $,+,# or 0-9? + JP NZ,SAVE_ASMCHR + CALL ASMGETVAL ; Extract the numbers to VAL_BUF + LD A,'*' ; Load PARM_BUF with a '*' + LD (DE),A + INC DE ; Advance dest. pointer + LD A,(HL) ; Get next non-number byte from ASM_BUF + +SAVE_ASMCHR: CP 0 ; if we reached the end while in getval()? + JP Z,ASMLOOPEXIT ; just exit + LD (DE),A ; Otherwise store the byte + INC DE ; Advance dest. pointer + INC HL ; Advance src. pointer + DEC B + JP NZ,GET_NEXTASM + +ASMLOOPEXIT: LD BC,VAL_BUF + CALL PADWSPC ; Pad the parm buffer to 7 bytes + + LD (SRC_ADDR),HL ; Save HL & DE + LD (DES_ADDR),DE + + CALL ASMFINDINST ; Find Instruction in table + LD A,(BLK_SIZE) ; Got a match? YES=search for a parameter match + CP 0 + JP NZ,ASM_FINDPRM +ASM_ERR_INS: LD DE,MSGNOINSTR + LD HL,PRINTMSG + CALL BKSW7to6 + JP ASM_LOOP1 ; Get another line of ASM input... + +ASM_FINDPRM: CALL ASMFINDPARM ; Look for matching parameter pattern + LD A,(ML_BUF+2) ; Found one? NO=ERROR + CP 0 + JP NZ,ASMOUTML + LD DE,MSGNOPARAM + LD HL,PRINTMSG + CALL BKSW7to6 + JP ASM_LOOP1 ; Get another line of ASM input... + + +ASMOUTML: CALL RTJUSTVAL ; Right Justify VAL_BUF + + LD DE,VAL_BUF_HI ; Convert 4 ASCII Chars in VAL_BUF to 2 values + CALL HLHEX + JR C, ASM_ERR_INS ; Couldnt convert the number. + LD A,H + LD (VAL_HI),A + LD A,L + LD (VAL_LO),A + + ;; Populate OUT_BUF with ML output + LD IX,OUT_BUF + LD A,(ML_BUF+1) + CP 0 + JP Z,ASMNOBYTE2 + LD (IX),A + INC IX + CP 0CBh ; Is this a BIT,SET or RES Inst? + JP NZ,ASMNOBYTE2 ; NO=Continue + LD A,(ML_BUF) ; YES=Check 1st ML byte + AND 0C0h ; Are Bits 7 or 6 are set? + JP Z,ASMNOBYTE2 ; NO=Continue + LD A,(ML_BUF) ; YES=Combine Val with ML_BUF byte1 + LD B,A + LD A,(VAL_LO) + SLA A + SLA A + SLA A + AND 38h + OR B + LD (ML_BUF),A + +ASMNOBYTE2: LD A,(ML_BUF) + LD (IX),A + INC IX + + LD A,(VAL_LO) + LD (IX),A + INC IX + LD A,(VAL_HI) + LD (IX),A + + ;; *** Move ML code(s) to target address, *** + ;; *** print them and adjust pointer *** + ;CALL PRNTS + ;CALL PRNTS + ;CALL PRNTS + ;CALL PRNTS + +ASM_TOMEM: LD A,(ML_BTCOUNT) ; Load Byte Count ->B + LD B,A + LD IX,OUT_BUF ; Load IX with OUT_BUF address +ASM_TOMEM1: LD HL,(ADDR_LO) ; Load HL with Target Address + LD A,(IX) ; Get Byte to Move + LD (HL),A ; Store at target address + CALL PRTHX ; Print it + CALL PRNTS ; Print 1 space + INC HL ; Advance Target Pointer + LD (ADDR_LO),HL ; Save in ADDR_LO & HI + INC IX ; Advance ML_BUF pointer + DEC B ; Decrement byte counter + JP NZ,ASM_TOMEM1 ; Done? NO=Continue + JP ASM_LOOP1 ; Get another line of ASM input... + +ASM_EXIT: RET + ;****************************************************************** + ; END of ASM_MAIN + ;****************************************************************** + + ; Ensure we fill the ROM frmo E300:E7FF + ALIGN UROMADDR + ENDIF ; SFD700 + ;=========================================================== ; @@ -45,20 +811,7 @@ ; Common code spanning all banks. ;-------------------------------- NOP - LD B,16 ; If we read the bank control reset register 15 times then this will enable bank control and then the 16th read will reset all bank control registers to default. -ROMFS7_0: LD A,(BNKCTRLRST) - DJNZ ROMFS7_0 ; Apply the default number of coded latch reads to enable the bank control registers. - LD A,BNKCTRLDEF ; Set coded latch, SDCS high, BBMOSI to high and BBCLK to high which enables SDCLK. - LD (BNKCTRL),A - NOP - NOP - NOP - XOR A ; We shouldnt arrive here after a reset, if we do, select UROM bank 0 - LD (BNKSELMROM),A - NOP - NOP - NOP - LD (BNKSELUSER),A ; and start up - ie. SA1510 Monitor - this occurs as User Bank 0 is enabled and the jmp to 0 is coded in it. + HWSELROM2 ; Select the first ROM page. ; ; No mans land... this should have switched to Bank 0 and at this point there is a jump to 00000H. JP 00000H ; This is for safety!! @@ -114,383 +867,879 @@ BKSW7_0: PUSH HL ; P 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 (BNKSELUSER), A ; Repeat the bank switch B times to enable the bank control register and set its value. + BNKSWSEL JP (HL) ; Jump to required function. BKSWRET7: POP AF ; Get bank which called us. - LD (BNKSELUSER), A ; Return to that bank. + BNKSWSELRET POP AF RET - ;------------------------------------------------------------------------------- - ; START OF MEMORY TEST FUNCTIONALITY - ;------------------------------------------------------------------------------- - -MEMTEST: LD B,240 ; Number of loops -LOOP: LD HL,MEMSTART ; Start of checked memory, - LD D,0CFh ; End memory check CF00 -LOOP1: LD A,000h - CP L - JR NZ,LOOP1b - CALL PRTHL ; Print HL as 4digit hex. - LD A,0C4h ; Move cursor left. - LD E,004h ; 4 times. -LOOP1a: CALL DPCT - DEC E - JR NZ,LOOP1a -LOOP1b: INC HL - LD A,H - CP D ; Have we reached end of memory. - JR Z,LOOP3 ; Yes, exit. - LD A,(HL) ; Read memory location under test, ie. 0. - CPL ; Subtract, ie. FF - A, ie FF - 0 = FF. - LD (HL),A ; Write it back, ie. FF. - SUB (HL) ; Subtract written memory value from A, ie. should be 0. - JR NZ,LOOP2 ; Not zero, we have an error. - LD A,(HL) ; Reread memory location, ie. FF - CPL ; Subtract FF - FF - LD (HL),A ; Write 0 - SUB (HL) ; Subtract 0 - JR Z,LOOP1 ; Loop if the same, ie. 0 -LOOP2: LD A,16h - CALL PRNT ; Print A - CALL PRTHX ; Print HL as 4 digit hex. - CALL PRNTS ; Print space. - XOR A - LD (HL),A - LD A,(HL) ; Get into A the failing bits. - CALL PRTHX ; Print A as 2 digit hex. - CALL PRNTS ; Print space. - LD A,0FFh ; Repeat but first load FF into memory - LD (HL),A - LD A,(HL) - CALL PRTHX ; Print A as 2 digit hex. - NOP - JR LOOP4 - -LOOP3: CALL PRTHL - LD DE,OKCHECK - CALL MSG ; Print check message in DE - LD A,B ; Print loop count. - CALL PRTHX - LD DE,OKMSG - CALL MSG ; Print ok message in DE - CALL NL - DEC B - JR NZ,LOOP - LD DE,DONEMSG - CALL MSG ; Print check message in DE - JP ST1X - -LOOP4: LD B,09h - CALL PRNTS ; Print space. - XOR A ; Zero A - SCF ; Set Carry -LOOP5: PUSH AF ; Store A and Flags - LD (HL),A ; Store 0 to bad location. - LD A,(HL) ; Read back - CALL PRTHX ; Print A as 2 digit hex. - CALL PRNTS ; Print space - POP AF ; Get back A (ie. 0 + C) - RLA ; Rotate left A. Bit LSB becomes Carry (ie. 1 first instance), Carry becomes MSB - DJNZ LOOP5 ; Loop if not zero, ie. print out all bit locations written and read to memory to locate bad bit. - XOR A ; Zero A, clears flags. - LD A,80h - LD B,08h -LOOP6: PUSH AF ; Repeat above but AND memory location with original A (ie. 80) - LD C,A ; Basically walk through all the bits to find which one is stuck. - LD (HL),A - LD A,(HL) - AND C - NOP - JR Z,LOOP8 ; If zero then print out the bit number - NOP - NOP - LD A,C - CPL - LD (HL),A - LD A,(HL) - AND C - JR NZ,LOOP8 ; As above, if the compliment doesnt yield zero, print out the bit number. -LOOP7: POP AF - RRCA - NOP - DJNZ LOOP6 - JP ST1X - -LOOP8: CALL LETNL ; New line. - LD DE,BITMSG ; BIT message - CALL MSG ; Print message in DE - LD A,B - DEC A - CALL PRTHX ; Print A as 2 digit hex, ie. BIT number. - CALL LETNL ; New line - LD DE,BANKMSG ; BANK message - CALL MSG ; Print message in DE - LD A,H - CP 50h ; 'P' - JR NC,LOOP9 ; Work out bank number, 1, 2 or 3. - LD A,01h - JR LOOP11 - -LOOP9: CP 90h - JR NC,LOOP10 - LD A,02h - JR LOOP11 - -LOOP10: LD A,03h -LOOP11: CALL PRTHX ; Print A as 2 digit hex, ie. BANK number. - JR LOOP7 - -DLY1S: PUSH AF - PUSH BC - LD C,10 -L0324: CALL DLY12 - DEC C - JR NZ,L0324 - POP BC - POP AF - RET - - ;------------------------------------------------------------------------------- - ; END OF MEMORY TEST FUNCTIONALITY - ;------------------------------------------------------------------------------- - - ;------------------------------------------------------------------------------- - ; START OF TIMER TEST FUNCTIONALITY - ;------------------------------------------------------------------------------- - - ; Test the 8253 Timer, configure it as per the monitor and display the read back values. -TIMERTST: CALL NL - LD DE,MSG_TIMERTST - CALL MSG - CALL NL - LD DE,MSG_TIMERVAL - CALL MSG - LD A,01h - LD DE,8000h - CALL TIMERTST1 -NDE: JP NDE - JP ST1X -TIMERTST1: ;DI - PUSH BC - PUSH DE - PUSH HL - LD (AMPM),A - LD A,0F0H - LD (TIMFG),A -ABCD: LD HL,0A8C0H - XOR A - SBC HL,DE - PUSH HL - INC HL - EX DE,HL - - LD HL,CONTF ; Control Register - LD (HL),0B0H ; 10110000 Control Counter 2 10, Write 2 bytes 11, 000 Interrupt on Terminal Count, 0 16 bit binary - LD (HL),074H ; 01110100 Control Counter 1 01, Write 2 bytes 11, 010 Rate Generator, 0 16 bit binary - LD (HL),030H ; 00110100 Control Counter 1 01, Write 2 bytes 11, 010 interrupt on Terminal Count, 0 16 bit binary - - LD HL,CONT2 ; Counter 2 - LD (HL),E - LD (HL),D - - LD HL,CONT1 ; Counter 1 - LD (HL),00AH - LD (HL),000H - - LD HL,CONT0 ; Counter 0 - LD (HL),00CH - LD (HL),0C0H - -; LD HL,CONT2 ; Counter 2 -; LD C,(HL) -; LD A,(HL) -; CP D -; JP NZ,L0323H -; LD A,C -; CP E -; JP Z,CDEF - ; - -L0323H: PUSH AF - PUSH BC - PUSH DE - PUSH HL - ; - LD HL,CONTF ; Control Register - LD (HL),080H - LD HL,CONT2 ; Counter 2 - LD C,(HL) - LD A,(HL) - CALL PRTHX - LD A,C - CALL PRTHX - ; - CALL PRNTS - ;CALL DLY1S - ; - LD HL,CONTF ; Control Register - LD (HL),040H - LD HL,CONT1 ; Counter 1 - LD C,(HL) - LD A,(HL) - CALL PRTHX - LD A,C - CALL PRTHX - ; - CALL PRNTS - ;CALL DLY1S - ; - LD HL,CONTF ; Control Register - LD (HL),000H - LD HL,CONT0 ; Counter 0 - LD C,(HL) - LD A,(HL) - CALL PRTHX - LD A,C - CALL PRTHX - ; - ;CALL DLY1S - ; - LD A,0C4h ; Move cursor left. - LD E,0Eh ; 4 times. -L0330: CALL DPCT - DEC E - JR NZ,L0330 - ; -; LD C,20 -;L0324: CALL DLY12 -; DEC C -; JR NZ,L0324 - ; - POP HL - POP DE - POP BC - POP AF - ; - LD HL,CONT2 ; Counter 2 - LD C,(HL) - LD A,(HL) - CP D - JP NZ,L0323H - LD A,C - CP E - JP NZ,L0323H - ; - ; - PUSH AF - PUSH BC - PUSH DE - PUSH HL - CALL NL - CALL NL - CALL NL - LD DE,MSG_TIMERVAL2 - CALL MSG - POP HL - POP DE - POP BC - POP AF - - ; -CDEF: POP DE - LD HL,CONT1 - LD (HL),00CH - LD (HL),07BH - INC HL - -L0336H: PUSH AF - PUSH BC - PUSH DE - PUSH HL - ; - LD HL,CONTF ; Control Register - LD (HL),080H - LD HL,CONT2 ; Counter 2 - LD C,(HL) - LD A,(HL) - CALL PRTHX - LD A,C - CALL PRTHX - ; - CALL PRNTS - CALL DLY1S - ; - LD HL,CONTF ; Control Register - LD (HL),040H - LD HL,CONT1 ; Counter 1 - LD C,(HL) - LD A,(HL) - CALL PRTHX - LD A,C - CALL PRTHX - ; - CALL PRNTS - CALL DLY1S - ; - LD HL,CONTF ; Control Register - LD (HL),000H - LD HL,CONT0 ; Counter 0 - LD C,(HL) - LD A,(HL) - CALL PRTHX - LD A,C - CALL PRTHX - ; - CALL DLY1S - ; - LD A,0C4h ; Move cursor left. - LD E,0Eh ; 4 times. -L0340: CALL DPCT - DEC E - JR NZ,L0340 - ; - POP HL - POP DE - POP BC - POP AF - - LD HL,CONT2 ; Counter 2 - LD C,(HL) - LD A,(HL) - CP D - JR NZ,L0336H - LD A,C - CP E - JR NZ,L0336H - CALL NL - LD DE,MSG_TIMERVAL3 - CALL MSG - POP HL - POP DE - POP BC - ;EI - RET ;------------------------------------------------------------------------------- - ; END OF TIMER TEST FUNCTIONALITY + ; Z80 Assembler lookup table + ; FORMAT: 10 bytes per row + ; Instruction Blocks: start with # followed by 4 char instruction + ; byte 5 = #of rows for this instruction + ; Parameter Blocks: A 7 byte parameter pattern + ; Opcode byte 1, Opcode byte 2(if any otherwise zero) + ; Number of byte used for opcodes & data parameters. + ;------------------------------------------------------------------------------- +OPCD_TABLE: IF BUILD_SFD700 = 1 + DB "#ADC ", 00FH, 000H, 000H, 000H, 000H + DB "A,(HL) ", 08EH, 000H, 001H + DB "A,(IX*)", 08EH, 0DDH, 003H + DB "A,(IY*)", 08EH, 0FDH, 003H + DB "A,A ", 08FH, 000H, 001H + DB "A,B ", 088H, 000H, 001H + DB "A,C ", 089H, 000H, 001H + DB "A,D ", 08AH, 000H, 001H + DB "A,E ", 08BH, 000H, 001H + DB "A,H ", 08CH, 000H, 001H + DB "A,L ", 08DH, 000H, 001H + DB "A,* ", 0CEH, 000H, 002H + DB "HL,BC ", 04AH, 0EDH, 002H + DB "HL,DE ", 05AH, 0EDH, 002H + DB "HL,HL ", 06AH, 0EDH, 002H + DB "HL,SP ", 07AH, 0EDH, 002H + DB "#ADD ", 017H, 000H, 000H, 000H, 000H + DB "A,(HL) ", 086H, 000H, 001H + DB "A,(IX*)", 086H, 0DDH, 003H + DB "A,(IY*)", 086H, 0FDH, 003H + DB "A,A ", 087H, 000H, 001H + DB "A,B ", 080H, 000H, 001H + DB "A,C ", 081H, 000H, 001H + DB "A,D ", 082H, 000H, 001H + DB "A,E ", 083H, 000H, 001H + DB "A,H ", 084H, 000H, 001H + DB "A,L ", 085H, 000H, 001H + DB "A,* ", 0C6H, 000H, 002H + DB "HL,BC ", 009H, 000H, 001H + DB "HL,DE ", 019H, 000H, 001H + DB "HL,HL ", 029H, 000H, 001H + DB "HL,SP ", 039H, 000H, 001H + DB "IX,BC ", 009H, 0DDH, 002H + DB "IX,DE ", 019H, 0DDH, 002H + DB "IX,IX ", 029H, 0DDH, 002H + DB "IX,SP ", 039H, 0DDH, 002H + DB "IY,BC ", 009H, 0FDH, 002H + DB "IY,DE ", 019H, 0FDH, 002H + DB "IY,IY ", 029H, 0FDH, 002H + DB "IY,SP ", 039H, 0FDH, 002H + DB "#AND ", 00BH, 000H, 000H, 000H, 000H + DB "(HL) ", 0A6H, 000H, 001H + DB "(IX*) ", 0A6H, 0DDH, 003H + DB "(IY*) ", 0A6H, 0FDH, 003H + DB "A ", 0A7H, 000H, 001H + DB "B ", 0A0H, 000H, 001H + DB "C ", 0A1H, 000H, 001H + DB "D ", 0A2H, 000H, 001H + DB "E ", 0A3H, 000H, 001H + DB "H ", 0A4H, 000H, 001H + DB "L ", 0A5H, 000H, 001H + DB "* ", 0E6H, 000H, 002H + DB "#BIT ", 008H, 000H, 000H, 000H, 000H + DB "*,(HL) ", 046H, 0CBH, 002H + DB "*,A ", 047H, 0CBH, 002H + DB "*,B ", 040H, 0CBH, 002H + DB "*,C ", 041H, 0CBH, 002H + DB "*,D ", 042H, 0CBH, 002H + DB "*,E ", 043H, 0CBH, 002H + DB "*,H ", 044H, 0CBH, 002H + DB "*,L ", 045H, 0CBH, 002H + DB "#CALL", 009H, 000H, 000H, 000H, 000H + DB "C,* ", 0DCH, 000H, 003H + DB "M,* ", 0FCH, 000H, 003H + DB "NC,* ", 0D4H, 000H, 003H + DB "NZ,* ", 0C4H, 000H, 003H + DB "P,* ", 0F4H, 000H, 003H + DB "PE,* ", 0ECH, 000H, 003H + DB "PO,* ", 0E4H, 000H, 003H + DB "Z,* ", 0CCH, 000H, 003H + DB "* ", 0CDH, 000H, 003H + DB "#CCF ", 001H, 000H, 000H, 000H, 000H + DB " ", 03FH, 000H, 001H + DB "#CP ", 00BH, 000H, 000H, 000H, 000H + DB "(HL) ", 0BEH, 000H, 001H + DB "(IX*) ", 0BEH, 0DDH, 003H + DB "(IY*) ", 0BEH, 0FDH, 003H + DB "A ", 0BFH, 000H, 001H + DB "B ", 0B8H, 000H, 001H + DB "C ", 0B9H, 000H, 001H + DB "D ", 0BAH, 000H, 001H + DB "E ", 0BBH, 000H, 001H + DB "H ", 0BCH, 000H, 001H + DB "L ", 0BDH, 000H, 001H + DB "* ", 0FEH, 000H, 002H + DB "#CPD ", 001H, 000H, 000H, 000H, 000H + DB " ", 0A9H, 0EDH, 002H + DB "#CPDR", 001H, 000H, 000H, 000H, 000H + DB " ", 0B9H, 0EDH, 002H + DB "#CPIR", 001H, 000H, 000H, 000H, 000H + DB " ", 0B1H, 0EDH, 002H + DB "#CPI ", 001H, 000H, 000H, 000H, 000H + DB " ", 0A1H, 0EDH, 002H + DB "#CPL ", 001H, 000H, 000H, 000H, 000H + DB " ", 02FH, 000H, 001H + DB "#DAA ", 001H, 000H, 000H, 000H, 000H + DB " ", 027H, 000H, 001H + DB "#DEC ", 010H, 000H, 000H, 000H, 000H + DB "(HL) ", 035H, 000H, 001H + DB "(IX*) ", 035H, 0DDH, 003H + DB "(IY*) ", 035H, 0FDH, 003H + DB "A ", 03DH, 000H, 001H + DB "B ", 005H, 000H, 001H + DB "BC ", 00BH, 000H, 001H + DB "C ", 00DH, 000H, 001H + DB "D ", 015H, 000H, 001H + DB "DE ", 01BH, 000H, 001H + DB "E ", 01DH, 000H, 001H + DB "H ", 025H, 000H, 001H + DB "HL ", 02BH, 000H, 001H + DB "IX ", 02BH, 0DDH, 002H + DB "IY ", 02BH, 0FDH, 002H + DB "L ", 02DH, 000H, 001H + DB "SP ", 03BH, 000H, 001H + DB "#DI ", 001H, 000H, 000H, 000H, 000H + DB " ", 0F3H, 000H, 001H + DB "#DJNZ", 001H, 000H, 000H, 000H, 000H + DB "* ", 010H, 000H, 002H + DB "#EI ", 001H, 000H, 000H, 000H, 000H + DB " ", 0FBH, 000H, 001H + DB "#EX ", 005H, 000H, 000H, 000H, 000H + DB "(SP),HL", 0E3H, 000H, 001H + DB "(SP),IX", 0E3H, 0DDH, 002H + DB "(SP),IY", 0E3H, 0FDH, 002H + DB "AF,AF", 02CH, 020H, 008H, 000H, 001H + DB "DE,HL ", 0EBH, 000H, 001H + DB "#EXX ", 001H, 000H, 000H, 000H, 000H + DB " ", 0D9H, 000H, 001H + DB "#HALT", 001H, 000H, 000H, 000H, 000H + DB " ", 076H, 000H, 001H + DB "#IM ", 003H, 000H, 000H, 000H, 000H + DB "0 ", 046H, 0EDH, 002H + DB "1 ", 056H, 0EDH, 002H + DB "2 ", 05EH, 0EDH, 002H + DB "#IN ", 008H, 000H, 000H, 000H, 000H + DB "A,(C) ", 078H, 0EDH, 002H + DB "B,(C) ", 040H, 0EDH, 002H + DB "C,(C) ", 048H, 0EDH, 002H + DB "D,(C) ", 050H, 0EDH, 002H + DB "E,(C) ", 058H, 0EDH, 002H + DB "H,(C) ", 060H, 0EDH, 002H + DB "L,(C) ", 068H, 0EDH, 002H + DB "A,(*) ", 0DBH, 000H, 002H + DB "#IN0 ", 007H, 000H, 000H, 000H, 000H + DB " A,(*) ", 038H, 0EDH, 003H + DB " B,(*) ", 000H, 0EDH, 003H + DB " C,(*) ", 008H, 0EDH, 003H + DB " D,(*) ", 010H, 0EDH, 003H + DB " E,(*) ", 018H, 0EDH, 003H + DB " H,(*) ", 020H, 0EDH, 003H + DB " L,(*) ", 028H, 0EDH, 003H + DB "#INC ", 010H, 000H, 000H, 000H, 000H + DB "(HL) ", 034H, 000H, 001H + DB "(IX*) ", 034H, 0DDH, 003H + DB "(IY*) ", 034H, 0FDH, 003H + DB "A ", 03CH, 000H, 001H + DB "B ", 004H, 000H, 001H + DB "BC ", 003H, 000H, 001H + DB "C ", 00CH, 000H, 001H + DB "D ", 014H, 000H, 001H + DB "DE ", 013H, 000H, 001H + DB "E ", 01CH, 000H, 001H + DB "H ", 024H, 000H, 001H + DB "HL ", 023H, 000H, 001H + DB "IX ", 023H, 0DDH, 002H + DB "IY ", 023H, 0FDH, 002H + DB "L ", 02CH, 000H, 001H + DB "SP ", 033H, 000H, 001H + DB "#IND ", 001H, 000H, 000H, 000H, 000H + DB " ", 0AAH, 0EDH, 002H + DB "#INDR", 001H, 000H, 000H, 000H, 000H + DB " ", 0BAH, 0EDH, 002H + DB "#INI ", 001H, 000H, 000H, 000H, 000H + DB " ", 0A2H, 0EDH, 002H + DB "#INIR", 001H, 000H, 000H, 000H, 000H + DB " ", 0B2H, 0EDH, 002H + DB "#JP ", 00CH, 000H, 000H, 000H, 000H + DB "(HL) ", 0E9H, 000H, 001H + DB "(IX) ", 0E9H, 0DDH, 002H + DB "(IY) ", 0E9H, 0FDH, 002H + DB "C,* ", 0DAH, 000H, 003H + DB "M,* ", 0FAH, 000H, 003H + DB "NC,* ", 0D2H, 000H, 003H + DB "NZ,* ", 0C2H, 000H, 003H + DB "P,* ", 0F2H, 000H, 003H + DB "PE,* ", 0EAH, 000H, 003H + DB "PO,* ", 0E2H, 000H, 003H + DB "Z,* ", 0CAH, 000H, 003H + DB "* ", 0C3H, 000H, 003H + DB "#JR ", 005H, 000H, 000H, 000H, 000H + DB "C,* ", 038H, 000H, 002H + DB "NC,* ", 030H, 000H, 002H + DB "NZ,* ", 020H, 000H, 002H + DB "Z,* ", 028H, 000H, 002H + DB "* ", 018H, 000H, 002H + DB "#LD ", 084H, 000H, 000H, 000H, 000H + DB "(BC),A ", 002H, 000H, 001H + DB "(DE),A ", 012H, 000H, 001H + DB "(HL),A ", 077H, 000H, 001H + DB "(HL),B ", 070H, 000H, 001H + DB "(HL),C ", 071H, 000H, 001H + DB "(HL),D ", 072H, 000H, 001H + DB "(HL),E ", 073H, 000H, 001H + DB "(HL),H ", 074H, 000H, 001H + DB "(HL),L ", 075H, 000H, 001H + DB "(HL),* ", 036H, 000H, 002H + DB "(IX*),A", 077H, 0DDH, 003H + DB "(IX*),B", 070H, 0DDH, 003H + DB "(IX*),C", 071H, 0DDH, 003H + DB "(IX*),D", 072H, 0DDH, 003H + DB "(IX*),E", 073H, 0DDH, 003H + DB "(IX*),H", 074H, 0DDH, 003H + DB "(IX*),L", 075H, 0DDH, 003H + DB "(IX*),*", 036H, 0DDH, 004H + DB "(IY*),A", 077H, 0FDH, 003H + DB "(IY*),B", 070H, 0FDH, 003H + DB "(IY*),C", 071H, 0FDH, 003H + DB "(IY*),D", 072H, 0FDH, 003H + DB "(IY*),E", 073H, 0FDH, 003H + DB "(IY*),H", 074H, 0FDH, 003H + DB "(IY*),L", 075H, 0FDH, 003H + DB "(IY*),*", 036H, 0FDH, 004H + DB "(*),A ", 032H, 000H, 003H + DB "(*),BC ", 043H, 0EDH, 004H + DB "(*),DE ", 053H, 0EDH, 004H + DB "(*),HL ", 022H, 000H, 003H + DB "(*),IX ", 022H, 0DDH, 004H + DB "(*),IY ", 022H, 0FDH, 004H + DB "(*),SP ", 073H, 0EDH, 004H + DB "A,(BC) ", 00AH, 000H, 001H + DB "A,(DE) ", 01AH, 000H, 001H + DB "A,(HL) ", 07EH, 000H, 001H + DB "A,(IX*)", 07EH, 0DDH, 003H + DB "A,(IY*)", 07EH, 0FDH, 003H + DB "A,A ", 07FH, 000H, 001H + DB "A,B ", 078H, 000H, 001H + DB "A,C ", 079H, 000H, 001H + DB "A,D ", 07AH, 000H, 001H + DB "A,E ", 07BH, 000H, 001H + DB "A,H ", 07CH, 000H, 001H + DB "A,I ", 057H, 0EDH, 002H + DB "A,L ", 07DH, 000H, 001H + DB "A,R ", 05FH, 0EDH, 002H + DB "A,(*) ", 03AH, 000H, 003H + DB "A,* ", 03EH, 000H, 002H + DB "B,(HL) ", 046H, 000H, 001H + DB "B,(IX*)", 046H, 0DDH, 003H + DB "B,(IY*)", 046H, 0FDH, 003H + DB "B,A ", 047H, 000H, 001H + DB "B,B ", 040H, 000H, 001H + DB "B,C ", 041H, 000H, 001H + DB "B,D ", 042H, 000H, 001H + DB "B,E ", 043H, 000H, 001H + DB "B,H ", 044H, 000H, 001H + DB "B,L ", 045H, 000H, 001H + DB "B,* ", 006H, 000H, 002H + DB "BC,(*) ", 04BH, 0EDH, 004H + DB "BC,* ", 001H, 000H, 003H + DB "C,(HL) ", 04EH, 000H, 001H + DB "C,(IX*)", 04EH, 0DDH, 003H + DB "C,(IY*)", 04EH, 0FDH, 003H + DB "C,A ", 04FH, 000H, 001H + DB "C,B ", 048H, 000H, 001H + DB "C,C ", 049H, 000H, 001H + DB "C,D ", 04AH, 000H, 001H + DB "C,E ", 04BH, 000H, 001H + DB "C,H ", 04CH, 000H, 001H + DB "C,L ", 04DH, 000H, 001H + DB "C,* ", 00EH, 000H, 002H + DB "D,(HL) ", 056H, 000H, 001H + DB "D,(IX*)", 056H, 0DDH, 003H + DB "D,(IY*)", 056H, 0FDH, 003H + DB "D,A ", 057H, 000H, 001H + DB "D,B ", 050H, 000H, 001H + DB "D,C ", 051H, 000H, 001H + DB "D,D ", 052H, 000H, 001H + DB "D,E ", 053H, 000H, 001H + DB "D,H ", 054H, 000H, 001H + DB "D,L ", 055H, 000H, 001H + DB "D,* ", 016H, 000H, 002H + DB "DE,(*) ", 05BH, 0EDH, 004H + DB "DE,* ", 011H, 000H, 003H + DB "E,(HL) ", 05EH, 000H, 001H + DB "E,(IX*)", 05EH, 0DDH, 003H + DB "E,(IY*)", 05EH, 0FDH, 003H + DB "E,A ", 05FH, 000H, 001H + DB "E,B ", 058H, 000H, 001H + DB "E,C ", 059H, 000H, 001H + DB "E,D ", 05AH, 000H, 001H + DB "E,E ", 05BH, 000H, 001H + DB "E,H ", 05CH, 000H, 001H + DB "E,L ", 05DH, 000H, 001H + DB "E,* ", 01EH, 000H, 002H + DB "H,(HL) ", 066H, 000H, 001H + DB "H,(IX*)", 066H, 0DDH, 003H + DB "H,(IY*)", 066H, 0FDH, 003H + DB "H,A ", 067H, 000H, 001H + DB "H,B ", 060H, 000H, 001H + DB "H,C ", 061H, 000H, 001H + DB "H,D ", 062H, 000H, 001H + DB "H,E ", 063H, 000H, 001H + DB "H,H ", 064H, 000H, 001H + DB "H,L ", 065H, 000H, 001H + DB "H,* ", 026H, 000H, 002H + DB "HL,(*) ", 02AH, 000H, 003H + DB "HL,* ", 021H, 000H, 003H + DB "I,A ", 047H, 0EDH, 002H + DB "IX,(*) ", 02AH, 0DDH, 004H + DB "IX,* ", 021H, 0DDH, 004H + DB "IY,(*) ", 02AH, 0FDH, 004H + DB "IY,* ", 021H, 0FDH, 004H + DB "L,(HL) ", 06EH, 000H, 001H + DB "L,(IX*)", 06EH, 0DDH, 003H + DB "L,(IY*)", 06EH, 0FDH, 003H + DB "L,A ", 06FH, 000H, 001H + DB "L,B ", 068H, 000H, 001H + DB "L,C ", 069H, 000H, 001H + DB "L,D ", 06AH, 000H, 001H + DB "L,E ", 06BH, 000H, 001H + DB "L,H ", 06CH, 000H, 001H + DB "L,L ", 06DH, 000H, 001H + DB "L,* ", 02EH, 000H, 002H + DB "R,A ", 04FH, 0EDH, 002H + DB "SP,(*) ", 07BH, 0EDH, 004H + DB "SP,HL ", 0F9H, 000H, 001H + DB "SP,IX ", 0F9H, 0DDH, 002H + DB "SP,IY ", 0F9H, 0FDH, 002H + DB "SP,* ", 031H, 000H, 003H + DB "#LDD ", 001H, 000H, 000H, 000H, 000H + DB " ", 0A8H, 0EDH, 002H + DB "#LDDR", 001H, 000H, 000H, 000H, 000H + DB " ", 0B8H, 0EDH, 002H + DB "#LDI ", 001H, 000H, 000H, 000H, 000H + DB " ", 0A0H, 0EDH, 002H + DB "#LDIR", 001H, 000H, 000H, 000H, 000H + DB " ", 0B0H, 0EDH, 002H + DB "#NEG ", 001H, 000H, 000H, 000H, 000H + DB " ", 044H, 0EDH, 002H + DB "#NOP ", 001H, 000H, 000H, 000H, 000H + DB " ", 000H, 000H, 001H + DB "#OR ", 00BH, 000H, 000H, 000H, 000H + DB "(HL) ", 0B6H, 000H, 001H + DB "(IX*) ", 0B6H, 0DDH, 003H + DB "(IY*) ", 0B6H, 0FDH, 003H + DB "A ", 0B7H, 000H, 001H + DB "B ", 0B0H, 000H, 001H + DB "C ", 0B1H, 000H, 001H + DB "D ", 0B2H, 000H, 001H + DB "E ", 0B3H, 000H, 001H + DB "H ", 0B4H, 000H, 001H + DB "L ", 0B5H, 000H, 001H + DB "* ", 0F6H, 000H, 002H + DB "#OTDR", 001H, 000H, 000H, 000H, 000H + DB " ", 0BBH, 0EDH, 002H + DB "#OTIR", 001H, 000H, 000H, 000H, 000H + DB " ", 0B3H, 0EDH, 002H + DB "#OUT ", 008H, 000H, 000H, 000H, 000H + DB "(C),A ", 079H, 0EDH, 002H + DB "(C),B ", 041H, 0EDH, 002H + DB "(C),C ", 049H, 0EDH, 002H + DB "(C),D ", 051H, 0EDH, 002H + DB "(C),E ", 059H, 0EDH, 002H + DB "(C),H ", 061H, 0EDH, 002H + DB "(C),L ", 069H, 0EDH, 002H + DB "(*),A ", 0D3H, 000H, 002H + DB "#OUT0", 007H, 000H, 000H, 000H, 000H + DB "(*),A ", 039H, 0EDH, 003H + DB "(*),B ", 001H, 0EDH, 003H + DB "(*),C ", 009H, 0EDH, 003H + DB "(*),D ", 011H, 0EDH, 003H + DB "(*),E ", 019H, 0EDH, 003H + DB "(*),H ", 021H, 0EDH, 003H + DB "(*),L ", 029H, 0EDH, 003H + DB "#OUTD", 001H, 000H, 000H, 000H, 000H + DB " ", 0ABH, 0EDH, 002H + DB "#OUTI", 001H, 000H, 000H, 000H, 000H + DB " ", 0A3H, 0EDH, 002H + DB "#POP ", 006H, 000H, 000H, 000H, 000H + DB "AF ", 0F1H, 000H, 001H + DB "BC ", 0C1H, 000H, 001H + DB "DE ", 0D1H, 000H, 001H + DB "HL ", 0E1H, 000H, 001H + DB "IX ", 0E1H, 0DDH, 002H + DB "IY ", 0E1H, 0FDH, 002H + DB "#PUSH", 006H, 000H, 000H, 000H, 000H + DB "AF ", 0F5H, 000H, 001H + DB "BC ", 0C5H, 000H, 001H + DB "DE ", 0D5H, 000H, 001H + DB "HL ", 0E5H, 000H, 001H + DB "IX ", 0E5H, 0DDH, 002H + DB "IY ", 0E5H, 0FDH, 002H + DB "#RES ", 008H, 000H, 000H, 000H, 000H + DB "*,(HL) ", 086H, 0CBH, 002H + DB "*,A ", 087H, 0CBH, 002H + DB "*,B ", 080H, 0CBH, 002H + DB "*,C ", 081H, 0CBH, 002H + DB "*,D ", 082H, 0CBH, 002H + DB "*,E ", 083H, 0CBH, 002H + DB "*,H ", 084H, 0CBH, 002H + DB "*,L ", 085H, 0CBH, 002H + DB "#RET ", 009H, 000H, 000H, 000H, 000H + DB " ", 0C9H, 000H, 001H + DB "C ", 0D8H, 000H, 001H + DB "M ", 0F8H, 000H, 001H + DB "NC ", 0D0H, 000H, 001H + DB "NZ ", 0C0H, 000H, 001H + DB "P ", 0F0H, 000H, 001H + DB "PE ", 0E8H, 000H, 001H + DB "PO ", 0E0H, 000H, 001H + DB "Z ", 0C8H, 000H, 001H + DB "#RETI", 001H, 000H, 000H, 000H, 000H + DB " ", 04DH, 0EDH, 002H + DB "#RETN", 001H, 000H, 000H, 000H, 000H + DB " ", 045H, 0EDH, 002H + DB "#RL ", 008H, 000H, 000H, 000H, 000H + DB "(HL) ", 016H, 0CBH, 002H + DB "A ", 017H, 0CBH, 002H + DB "B ", 010H, 0CBH, 002H + DB "C ", 011H, 0CBH, 002H + DB "D ", 012H, 0CBH, 002H + DB "E ", 013H, 0CBH, 002H + DB "H ", 014H, 0CBH, 002H + DB "L ", 015H, 0CBH, 002H + DB "#RLA ", 001H, 000H, 000H, 000H, 000H + DB " ", 017H, 000H, 001H + DB "#RLC ", 008H, 000H, 000H, 000H, 000H + DB "(HL) ", 006H, 0CBH, 002H + DB "A ", 007H, 0CBH, 002H + DB "B ", 000H, 0CBH, 002H + DB "C ", 001H, 0CBH, 002H + DB "D ", 002H, 0CBH, 002H + DB "E ", 003H, 0CBH, 002H + DB "H ", 004H, 0CBH, 002H + DB "L ", 005H, 0CBH, 002H + DB "#RLCA", 001H, 000H, 000H, 000H, 000H + DB " ", 007H, 000H, 001H + DB "#RLD ", 001H, 000H, 000H, 000H, 000H + DB " ", 06FH, 0EDH, 002H + DB "#RR ", 008H, 000H, 000H, 000H, 000H + DB "(HL) ", 01EH, 0CBH, 002H + DB "A ", 01FH, 0CBH, 002H + DB "B ", 018H, 0CBH, 002H + DB "C ", 019H, 0CBH, 002H + DB "D ", 01AH, 0CBH, 002H + DB "E ", 01BH, 0CBH, 002H + DB "H ", 01CH, 0CBH, 002H + DB "L ", 01DH, 0CBH, 002H + DB "#RRA ", 001H, 000H, 000H, 000H, 000H + DB " ", 01FH, 000H, 001H + DB "#RRC ", 008H, 000H, 000H, 000H, 000H + DB "(HL) ", 00EH, 0CBH, 002H + DB "A ", 00FH, 0CBH, 002H + DB "B ", 008H, 0CBH, 002H + DB "C ", 009H, 0CBH, 002H + DB "D ", 00AH, 0CBH, 002H + DB "E ", 00BH, 0CBH, 002H + DB "H ", 00CH, 0CBH, 002H + DB "L ", 00DH, 0CBH, 002H + DB "#RRCA", 001H, 000H, 000H, 000H, 000H + DB " ", 00FH, 000H, 001H + DB "#RRD ", 001H, 000H, 000H, 000H, 000H + DB " ", 067H, 0EDH, 002H + DB "#RST ", 008H, 000H, 000H, 000H, 000H + DB "00H ", 0C7H, 000H, 001H + DB "08H ", 0CFH, 000H, 001H + DB "10H ", 0D7H, 000H, 001H + DB "18H ", 0DFH, 000H, 001H + DB "20H ", 0E7H, 000H, 001H + DB "28H ", 0EFH, 000H, 001H + DB "30H ", 0F7H, 000H, 001H + DB "38H ", 0FFH, 000H, 001H + DB "#SBC ", 00FH, 000H, 000H, 000H, 000H + DB "A,(HL) ", 09EH, 000H, 001H + DB "A,(IX*)", 09EH, 0DDH, 003H + DB "A,(IY*)", 09EH, 0FDH, 003H + DB "A,A ", 09FH, 000H, 001H + DB "A,B ", 098H, 000H, 001H + DB "A,C ", 099H, 000H, 001H + DB "A,D ", 09AH, 000H, 001H + DB "A,E ", 09BH, 000H, 001H + DB "A,H ", 09CH, 000H, 001H + DB "A,L ", 09DH, 000H, 001H + DB "HL,BC ", 042H, 0EDH, 002H + DB "HL,DE ", 052H, 0EDH, 002H + DB "HL,HL ", 062H, 0EDH, 002H + DB "HL,SP ", 072H, 0EDH, 002H + DB "A,* ", 0DEH, 000H, 002H + DB "#SCF ", 001H, 000H, 000H, 000H, 000H + DB " ", 037H, 000H, 001H + DB "#SET ", 008H, 000H, 000H, 000H, 000H + DB "*,(HL) ", 0C6H, 0CBH, 002H + DB "*,A ", 0C7H, 0CBH, 002H + DB "*,B ", 0C0H, 0CBH, 002H + DB "*,C ", 0C1H, 0CBH, 002H + DB "*,D ", 0C2H, 0CBH, 002H + DB "*,E ", 0C3H, 0CBH, 002H + DB "*,H ", 0C4H, 0CBH, 002H + DB "*,L ", 0C5H, 0CBH, 002H + DB "#SLA ", 008H, 000H, 000H, 000H, 000H + DB "(HL) ", 026H, 0CBH, 002H + DB "A ", 027H, 0CBH, 002H + DB "B ", 020H, 0CBH, 002H + DB "C ", 021H, 0CBH, 002H + DB "D ", 022H, 0CBH, 002H + DB "E ", 023H, 0CBH, 002H + DB "H ", 024H, 0CBH, 002H + DB "L ", 025H, 0CBH, 002H + DB "#SRA ", 008H, 000H, 000H, 000H, 000H + DB "(HL) ", 02EH, 0CBH, 002H + DB "A ", 02FH, 0CBH, 002H + DB "B ", 028H, 0CBH, 002H + DB "C ", 029H, 0CBH, 002H + DB "D ", 02AH, 0CBH, 002H + DB "E ", 02BH, 0CBH, 002H + DB "H ", 02CH, 0CBH, 002H + DB "L ", 02DH, 0CBH, 002H + DB "#SRL ", 008H, 000H, 000H, 000H, 000H + DB "(HL) ", 03EH, 0CBH, 002H + DB "A ", 03FH, 0CBH, 002H + DB "B ", 038H, 0CBH, 002H + DB "C ", 039H, 0CBH, 002H + DB "D ", 03AH, 0CBH, 002H + DB "E ", 03BH, 0CBH, 002H + DB "H ", 03CH, 0CBH, 002H + DB "L ", 03DH, 0CBH, 002H + DB "#SUB ", 00BH, 000H, 000H, 000H, 000H + DB "(HL) ", 096H, 000H, 001H + DB "(IX*) ", 096H, 0DDH, 003H + DB "(IY*) ", 096H, 0FDH, 003H + DB "A ", 097H, 000H, 001H + DB "B ", 090H, 000H, 001H + DB "C ", 091H, 000H, 001H + DB "D ", 092H, 000H, 001H + DB "E ", 093H, 000H, 001H + DB "H ", 094H, 000H, 001H + DB "L ", 095H, 000H, 001H + DB "* ", 0D6H, 000H, 002H + DB "#XOR ", 00BH, 000H, 000H, 000H, 000H + DB "(HL) ", 0AEH, 000H, 001H + DB "(IX*) ", 0AEH, 0DDH, 003H + DB "(IY*) ", 0AEH, 0FDH, 003H + DB "A ", 0AFH, 000H, 001H + DB "B ", 0A8H, 000H, 001H + DB "C ", 0A9H, 000H, 001H + DB "D ", 0AAH, 000H, 001H + DB "E ", 0ABH, 000H, 001H + DB "H ", 0ACH, 000H, 001H + DB "L ", 0ADH, 000H, 001H + DB "* ", 0EEH, 000H, 002H + DB "#END ", 000H, 000H, 000H, 000H, 000H + ENDIF + ;------------------------------------------------------------------------------- + ; END of Z80 Assembler lookup table ;------------------------------------------------------------------------------- - - ;-------------------------------------- - ; - ; Message table - ; - ;-------------------------------------- -OKCHECK: DB ", CHECK: ", 0Dh -OKMSG: DB " OK.", 0Dh -DONEMSG: DB 11h - DB "RAM TEST COMPLETE.", 0Dh - -BITMSG: DB " BIT: ", 0Dh -BANKMSG: DB " BANK: ", 0Dh -MSG_TIMERTST: - DB "8253 TIMER TEST", 0Dh, 00h -MSG_TIMERVAL: - DB "READ VALUE 1: ", 0Dh, 00h -MSG_TIMERVAL2: - DB "READ VALUE 2: ", 0Dh, 00h -MSG_TIMERVAL3: - DB "READ DONE.", 0Dh, 00h - ALIGN 0EFF8h - ORG 0EFF8h - DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ;****************************************************************** + ; Z80 Assembler Routines + ;****************************************************************** + + ; Method to get a string parameter and copy it into the provided buffer. + ; (Duplicate method, also in Bank TZFS1). + ; Inputs: + ; DE = Pointer to BUFER where user entered data has been placed. + ; HL = Pointer to Destination buffer. + ; B = Max number of characters to read. + ; Outputs: + ; DE and HL point to end of bufer and buffer resepectively. + ; B = Characters copied (ie. B - input B = no characters). + ; +GETSTR: IF BUILD_SFD700 = 1 + LD A,(DE) ; Skip white space and control characters before copy. + CP 33 + JR NC, GSTR1 + CP 00DH + JR Z, GSTR2 ; No directory means use the I/O set default. + OR A + JR Z, GSTR2 + INC DE + INC C ; Count the characters on the line. + JR GETSTR +GSTR1: LD (HL),A ; Copy the name entered by user. Validation is done on the I/O processor, bad directory name will result in error next read/write. + INC DE + INC HL + INC C ; Count the characters on the line. + LD A,(DE) ; Get next char and check it isnt CR, end of input line character. + CP 00DH + JR Z,GSTR2 ; Finished if we encounter CR. + DJNZ GSTR1 ; Loop until buffer is full, ignore characters beyond buffer limit. +GSTR2: XOR A ; Place end of buffer terminator as I/O processor uses C strings. + LD (HL),A + RET + ENDIF + + ;****************************************************************** + ; ASMFINDPARM + ; HL=src dest = PARM_BUF + ; Search block until match of PARM_BUF or end of block is found + ; Return with HL pointing to match block B=block count + ;****************************************************************** +ASMFINDPARM:IF BUILD_SFD700 = 1 + PUSH DE + PUSH BC + PUSH HL + LD IX,(BLK_ADDR) ; Load Saved Block Address->IX + LD A,(BLK_SIZE) ; Get Block Size + LD L,A ; L=ROW COUNTER +AFP_NEXTROW: LD DE,000Ah ; 10 bytes per row + ADD IX,DE ; Add 10 to Address (next block) + LD (ROW_ADDR),IX ; Save ROW Address + LD IY,PARM_BUF ; IY=PARM_BUF + LD C,07h ; Loop count =7 +AFP_CMPLOOP: LD A,(IX+0) ; Get Table byte->A + LD B,(IY+0) ; Get PARM_BUF byte->B + CP B ; Compare A-B + JP NZ,AFP_NOMATCH ; Mismatch = Exit loop + INC IX ; Advance pointers + INC IY + DEC C ; Decrement loop count + JP NZ,AFP_CMPLOOP ; Not done yet - continue + JP AFP_MATCH ; Match Found Get ML Bytes & Counts + ; Match not found, advance to next block +AFP_NOMATCH: DEC L ; Decrement row counter + JP Z,AFP_NOFIND ; Done = NOT FOUND EXIT + LD IX,(ROW_ADDR) ; Get Saved ROW Address->IX + JP AFP_NEXTROW ; Continue + +AFP_NOFIND: LD A,0 ; Not Found set ML_BUF[2]=0 + LD (ML_BUF+2),A + JP AFP_EXIT + +AFP_MATCH: LD A,(IX+0) ; Get Table ML Byte 1 + LD (ML_BUF),A ; Save it in M_BUF[0] + LD A,(IX+1) ; Get Table ML Byte 2 + LD (ML_BUF+1),A ; Save it in M_BUF[1] + LD A,(IX+2) ; Get Table ML Byte count + LD (ML_BUF+2),A ; Save it in M_BUF[2] + +AFP_EXIT: POP HL + POP BC + POP DE + RET + ENDIF + + ;****************************************************************** + ; ASMFINDINST + ; HL=src dest = VAL_BUF + ; Search table until match of INS_BUF or end of table is found + ; Return with IX pointing to match block B=block count + ;****************************************************************** +ASMFINDINST:IF BUILD_SFD700 = 1 + PUSH DE + PUSH BC + LD A,0 + LD (ROW_NUM),A + LD IX,OPCD_TABLE +AFI_NEXTBLK: LD (BLK_ADDR),IX ; Save Block Address + LD A,(IX+5) ; Get Block Size & Save + LD (BLK_SIZE),A + CP 0 ; If Block Size = 0 EXIT + JP Z,AFI_EXIT + + LD IY,INS_BUF ; IX=INS_BUF + LD C,04h ; Loop count =4 +AFI_CMPLOOP: LD A,(IX+1) ; Get Table byte->A + LD B,(IY+0) ; Get INS_BUF byte->B + CP B ; Compare A-B + JP NZ,AFI_NOMATCH ; Mismatch = Exit loop + INC IX ; Advance pointers + INC IY + DEC C ; Decremebnt loop count + JP NZ,AFI_CMPLOOP ; Not done yet - continue + JP AFI_EXIT ; Match Found EXIT + ; Match not found, advance to next block +AFI_NOMATCH: LD A,(BLK_SIZE) ; Get Block Size + INC A ; Add 1 to Block count + LD IX,(BLK_ADDR) ; Get Saved Block Start Address + LD DE,000Ah ; 10 bytes per row +AFI_BLKLOOP: ADD IX,DE ; Add 10 to Address + DEC A ; Decrement block counter + JP NZ,AFI_BLKLOOP ; Not Done = loop + LD A,(ROW_NUM) ; Advance Row Number + INC A + LD (ROW_NUM),A + JP AFI_NEXTBLK + +AFI_EXIT: POP BC + POP DE + RET + ENDIF ; SFD700 + + ;****************************************************************** + ; ASMRTJVAL + ; Shift bytes in VAL_BUF right until left padded with '0's + ;****************************************************************** +ASMRJTVAL: IF BUILD_SFD700 = 1 + PUSH DE + PUSH BC + LD IX,VAL_BUF + LD B,05h ; B=MAX search count 5 + +ASMRJT_LOOP: LD A,(IX+3) ; Get last byte from VAL_BUF + CP ' ' ; Is It SPACE? + JP NZ,ASMRJT_EXIT ; Exit + LD A,(IX+2) ; Shift 3 bytes left 1 positiom + LD (IX+3),A + LD A,(IX+1) + LD (IX+2),A + LD A,(IX+0) + LD (IX+1),A + LD A,'0' ; Pad first position with '0' + LD (IX+0),A + DEC B + JP NZ,ASMRJT_LOOP + +ASMRJT_EXIT: POP BC + POP DE + RET + ENDIF ; SFD700 + + ;****************************************************************** + ; ASMGETVAL + ; HL=src dest = VAL_BUF + ; Copy bytes from src to dest until a non digit is encountered (4 bytes max.) + ; skip over number flags ('$','+,'#') + ;****************************************************************** +ASMGETVAL: IF BUILD_SFD700 = 1 + PUSH DE + PUSH BC + LD DE,VAL_BUF + LD B,05h ; B=MAX search count 5 +ASMGVL_LOOP: LD A,(HL) ; Get a byte from ASM_BUF + + CP 0 ; End of input? + JP Z,ASMGVL_EXIT ; Exit + + CALL ISVALFLAG ; Test A for '#' '$' or '+' + JP Z,ASMGVL_SKIP ; If match then just skip it + + CALL IS_DIGIT ; Is A= '0'-'9' or 'A'-'F'? + JP NZ,ASMGVL_EXIT + LD (DE),A ; Save the byte to VAL_BUF + INC DE ; Advance the destination pointer +ASMGVL_SKIP: INC HL ; Advance the sourc pointer + DEC B ; Decrement byte count + JP NZ,ASMGVL_LOOP ; Max reached? NO=Continue +ASMGVL_EXIT: POP BC + POP DE + RET + ENDIF ; SFD700 + + ;****************************************************************** + ; ISFLAGORNUM + ; + ; RETURN Z=1 if A = '$', '+' ,'#' or '0'-'9' + ;****************************************************************** +ISFLAGORNUM:IF BUILD_SFD700 = 1 + CALL ISVALFLAG ; is A ='$','#' or '+'? + JP Z,ISNUMF_ZRET ; YES=return Z=1 + + CALL ISDECDIGIT ; Test for '0-'9' +ISNUMF_ZRET: RET ;(Z is set accordingly) + ENDIF ; SFD700 + + ;****************************************************************** + ; ISVALFLAG + ; + ; RETURN Z=1 if A = '$', '+' ,'#' or '0'-'9' (A is unchanged ) + ; NOTE: A MUST be a non-zero ASCII Digit + ;****************************************************************** +ISVALFLAG: IF BUILD_SFD700 = 1 + CP '$' ; is A ='$'? + JP Z,ISVALF_ZRET ; YES=return Z=1 + CP '+' ; is A ='+'? + JP Z,ISVALF_ZRET ; YES=return Z=1 + CP '#' ; is A ='#'? + JP Z,ISVALF_ZRET ; YES=return Z=1 + + CP 0 ; Otherwise set Z=0 +ISVALF_ZRET: RET + ENDIF ; SFD700 + + ;****************************************************************** + ; PADWSPC + ; DE=dest BC=END + ; starting at current DE fill with spaces until DE=BC + ; NOTE: BC MUST BE > DE no bounds checking is done + ;****************************************************************** +PADWSPC: IF BUILD_SFD700 = 1 + LD A,B + CP D + JP NZ,DOPADWSPC + LD A,C + CP E + JP M,PADWSP_EXIT + JP NZ,DOPADWSPC +PADWSP_EXIT: RET +DOPADWSPC: LD A,' ' + LD (DE),A + INC DE + JP PADWSPC + ENDIF ; SFD700 + + ;****************************************************************** + ; SKIPSPC + ; HL=src b=MAX + ; advance HL until it is pointing at a non-space byte (16 bytes max.) + ;****************************************************************** +SKIPSPC: IF BUILD_SFD700 = 1 + LD B,10h ; B= MAX byte count 16 +SKIPSP_LOOP: LD A,(HL) + INC HL + CP ' ' + JP Z,SKIPSP_EXIT + CP 0 + JP Z,SKIPSP_EXIT + DEC B + JP NZ,SKIPSP_LOOP +SKIPSP_EXIT: RET + ENDIF ; SFD700 + + ;****************************************************************** + ; CPY2SPC + ; HL=src DE=dest b=count + ; Copy bytes from src to dest until a space is encountered (12 bytes max.) + ;****************************************************************** +CPY2SPC: IF BUILD_SFD700 = 1 + LD B,0Ch ; B= MAX byte count 12 +CPY2SP_LOOP: LD A,(HL) + CP ' ' + JP Z,CPY2SP_EXIT ; Found space so EXIT + + CP 0 + JP NZ,CPY2SP_COPY ; Found NULL before space + LD A,' ' + LD (HL),A ; Replace with space & exit + INC HL + LD A,0 ; Terminate + LD (HL),A + DEC HL + JP CPY2SP_EXIT + +CPY2SP_COPY: LD (DE),A ; Copy the byte + INC DE ; Advance destination pointer + INC HL ; Advance source pointer + DEC B ; Decremet byte count + JP NZ,CPY2SP_LOOP ; If MAX not reached continue... +CPY2SP_EXIT: RET + ENDIF ; SFD700 + + ; RomDisk - Pad to EFFF boundary. + IF BUILD_ROMDISK = 1 + ALIGN 0EFF8h + ORG 0EFF8h + DB 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh + ENDIF + ; SFD700 - Pad to 10000H + IF BUILD_SFD700 = 1 + ALIGN 10000H + ENDIF diff --git a/roms/SFD700.rom b/roms/SFD700.rom new file mode 100644 index 0000000000000000000000000000000000000000..fde4edb1ed05530241022781d32f5f3cfd4f3c42 GIT binary patch literal 49152 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 literal 0 HcmV?d00001 diff --git a/roms/cbios.rom b/roms/cbios.rom index 838831bead61a8ffd07c18215eb0b2bb9f83e453..515efe1d7e24b98c1d8e1cde2ab787c956056c3b 100644 GIT binary patch delta 1149 zcmZ9LT})eL7{}k!uT$DVd-&=Bl%CQ7wRCbg6k5*4fx#G4Ht}NuG6(23CvNHl8RcWN z-g&pg6EC?M^Y zeMx3fa+HI_b3Z4`0v?~~DooJD?MporHT+HVe4j-YeWF}6yU@OrNa@E?a;KsiL?;`_ z%4$F+&=uX~H~JH%aTrvoqw*#vX4gOVdo8i<61A&#Nr&Tj>qxPV{%iEJ)<93tg)dlV zQS+FWI&_Q4g`9|>d(7N6_yvvGM^d6CpUHvzxU$W?97MAV+F5*IV73JG4yBxQnG0`b zC!yD6ksIoa1_P}on&K8 zx@zdt^Y2}L*XigT_~8AID7xm-#}_ZyKI}Shs-8Vq{$ld&&4=lyK^;?p0=Pk^z4BRr z>Z-i}9Su&$vjB9B6u@@k|AV4vATSZ+i(;lykwwZyF)tfe<;p}cEk~oy5Jge1+ou)N z3ylQ;fhazQ&hsLF8h2nf_%HD@nW4FPKb2{Y2UkzsgBSsXYrIDNH1BMT1o_@jmLT}Z zq@eT%@Q9%G2MiIOO51N+2~%n8CN%B9DN8Avgx))v2)hQEEofbbMGqnJm>tN1+ul1# z{!-dWH?mVOykc61`BT0ubN*B~m|*{eDOsc{ER_3&!pNfk-_pUbP~}I=VdUf0{`hpo z?(}vrp4d*rgWE(hD%iq)mvGlNgbuO$Uj*oFgy)BmGa|W42^U8N$6enQi8T^i0goNhc%SqcS(GuG1ylmceP~~{&Tyq>|>wqHLvdt%5Ft_LFwSHH)uU5``be_KfoQV8G delta 1130 zcmZ{jZA@EL7{~AJ3w?!hq0mcFIBf^J1C*|U;B^!>wu!RIrZ{lUq0Xr|6a_cBmD#E> zSxo$}+>gr=5@VKq5sb;2%rn~3wQyUmNw;(wV&*UwC9`l@$IGO>@f;#1F7d-T=lT8r z&)b*d1zs?Af+UY}ePl}>adb$y91xNLY9S`*xT_?n+CMEMCmd7IQa>&HI60BSr&@1A zfeHd0I|XBt)B)^MWz#5KA=^vpxOUms=w6Z;4Q*3SjYC?D?wgF zDQZw$r?8QoT({ziCugn8x#l455G;8|az?!YU-^tZY%cS_EoojY;ncoeZN6J+(gO_nu0%YtEojsXE*h276}slMXuW zQq5$-qmE+e6lrx2TLiyn9BxT;=!+mzE@hY|Da&+oH{Ym9j--F3UX8e< zb4+t3(HrXr#Yi?Z(uPK>D>j5Ipr$THXgO6jS@Ln{)9^oHnz|jK7cg9mfH{;#&!TzK zdUOmekPj^cv{KMo2%YPpFT(yzcUF9w&3*ZB3$slW#e<#~UhI77P*?Y}&$aK{|9r=R zox56h@7eoIo5gC|Qc<~;Iby2@VA~GoiYI-4>0WcKKU10&tE+NPpLxxF7B%>AVDO`p zr-od;@1E#;@BRJ{UVr1*o5$aJ`3s(E~M4cA8w?|Engk9hEZ zHh8$h<_4lzhUSW5iJ2&U6uneIp|PmgL~FD)bG)DnhE{lPr)En{lm{C29<;2$ab_#K3Vqk-d3FIh(y(d~TJJ;TIaVM`T=QMO z#hur5dXOza{;p*an#Ti$HuE?iPO^VONftHoLTymU^0UEzB{MJ72N63-`ax@{zhRsm78-5_&SIX&T$S(-BftXw zi$1Ke3Ih9ZBmM*8cml=T1ualSaNyUP>Y~_9wXeg?>B4+~&2A+Buu&+xhI=AWfdlFW zF4XGETbp7Qf}lo-lDp^?5S2oTkRvLEn1~UI0N5KrG#d{trQ8WW?=(4nhB^6pwZf&C k@D10e`-&^jS84&+Jg3SeEE4>Q@a0sujuAXESV delta 96 zcmZn=Xb_m-#Cw2Qkl})&#)Y>VUbAUT^iO3Cuwc3tFmY!jiw1+@jmct+`x(_IUt`n* wlB`S$KvIp#jZtHAE|ZdgdaVJY%GsT-o@&k6W58tRKY2cr0$A7P!%ViU0P8>=hyVZp diff --git a/roms/mz-1e05.rom b/roms/mz-1e05.rom new file mode 100644 index 0000000000000000000000000000000000000000..8dec829cd5afd2152af371e86ca3542a6618956c GIT binary patch literal 4096 zcmeH_-%C?r7{}kUUuRQnJNfIVB<~7hu5$A@V(j9?z#oV@Wr`486kX_@H_e2K*+t$3 z-E>ji6jGNl2|~LmaFCwH`wlr7v-!3}6bvTkoVKMbXYZWd^e4o5Z=RRu`#jH==kvb6 z`5N%d*4Yw{aR8uBfXwRBONHCT&JPMx4YKpZxr@;^)d`Z^qGDk~&F_|;Dd%b(1@4QI z;n-xx-H^QZ7P4-h2A3s9BX1UuoZz%@h{=?hL@e&QB$+ajh{@ebFARwo=s+}~1`cuQ z2-@ZEv^aaMA(`#3OJ?U8V4yR0sm`q^d{s%{b`+P9%PGhPG97ykcL{Gv#=hZ!;qVZk zhXF|ddb$Fkp;0&(92xBn*H97mjlhASU{_zL7uF00`@3PdJJ@v<_H@*$A;USE^|2;{N-b4VpoPGK-0G;J;w)^+9b1+AIRuZ+AIG4E|Zu3k%dZZOA{yRtT zHoB#Kx}=dP%P*AIlTfWn#!Mt?TyQaUBw9tLX}66`vt-gt#w}9fibqa+O(MfHF^^27 zQ)${;POeiEkNj0S_JUTCDR=tVI}6gu;_oSsRE2;P$l+48tEJT9YAoekwSgi|%)rLP zG_)rs#LLjmvz3%dY~u~0KtD@-PO$*a0mvjn#tpG-*l#rP2TeCFl8B8=RY_}{9mIcY zYut-UI1gLyzJbM6`r`W03FriL0y+VmfKEUspcBvu=mc~E{~-Yg{l0c@XM2Yaj&-zq GgMR=LR(i<* literal 0 HcmV?d00001 diff --git a/roms/mz-1e14.rom b/roms/mz-1e14.rom new file mode 100644 index 0000000000000000000000000000000000000000..aac54ba4a974588109a266696c342b48a6904d97 GIT binary patch literal 4096 zcmeHI|8E;b7GHbUuJdKvorJcF3v|{-$6(!6&eAVtske>e#Dpd>al&1DClJ5gH$Wgj zX$1m;Dul!jfW%KoKt)9a(jm8pP>PVM79YK?+qrAb^*UanmFOT}1Hm0Jo`9~|DR2S5VAd~U;&8Vx) zOKg5(%2QPTKYO})8rwqtQ@$}$w@)u|6T>`FkEh*}!kO=+3M~{mXx6qXmPj3sI@OILz zQf%%do`qOs;^(XBv9Nma@jt2;zy%UY4uTnob|M_|qJ|vuBVLa;T8bPBwkNz=Rp|_l zh2i)WxceoA?vyT7O7wXtw!%#lEk&ReeccC2zEG>V-wDQhXzQNM`g=&7<>5_uuR>T; zvEhn8uzqtR+HlQy294{_pen;rueptW(MF$W0bTpspp<3#s-5|k++nWh!WF^rTwx50 zbV64CM)QG5@&nad@n6*=+7aP)^^<1Es~3%Z+TqfyNPn!6#oNz-iSAv@$rY zR1x$cos%xK9ciK`||s4Xb~rR@~} z3i@uEb5%YI`NR2s6g-LNVc8j0YF1Y7Lc1H?X*EOdg1DhxkJ?4;Ey`gUkS^HQfOb08 zDn)dJI-uTH7$M@W*voE*yPMe)(ci-*fa^=>DLYPfqC+r8(P5Y)=uMdKM(@IWSDdKm zBM>&m$%Z&-N5?>JL0`fwqBC~U48hkSe08cJ@M}fF?W-4_KU`8iaFsUa9NK6@AS$}g zW;#J=ug!LnR&<-q1OU6ozV-cq#Eb{f)@g9$UZ$^^czT~E4=0Vj{()XRlpe)>=|_f= zT=QUeCW(7987}h;_xAbXk)ghHX0Us7)on1H>~$@Z{h8h#AjJWk?gO3}GKMFecnD@! zOpNYd6-Sb*BAnAS$Rt2&*bek_*>xK^Fmg*wWmXOL?AgP$kVq0;qbv6H3pJ?2Mk+eh z8oL*_Ye}?&h*fAkd9iBQ&!&(OMRC#*kCWSAh&j=zW%b>tY8hQ9_r{{pgC@^UF4Ez} zX}aLhkDWA(RAf7{6PHdoaOtod3%4CSj_dR-2Yk+@z7icvOTaNvsyb<7H`3zhB*wb| zbqowX*?Qp?47|DL3V5n?yIL~IE-Phv3(Mv>40z8h&yBP3ug*B8QmD_=({q9R8Ry{S z*+X;qR4(Ue-#Y#_`tL=$&C$Dovv4mHSq>_Di8TtJA^{><`=pjNKW z)Hg)0!w(ozpWBOrlh#jCn5nOe1vYGmF3fxf`g=8Vn`Y{oxkEE|+ApNgE~{p~7RNW- yo2gp+CB-L+7yO&nZ8A&EkLKL?sfOjY?wf1RS_RfBuvUS!3anLNtpY#03j7H2b3WPt literal 0 HcmV?d00001 diff --git a/roms/rfs.rom b/roms/rfs.rom index 05d34d4c3197d34781ef2e8066ecfc3e16151a5e..f62c978909dea2ae41f541166bdf21e3d72b107e 100644 GIT binary patch literal 40960 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 /tmp/mrom.rom" -#cat ${ROM_PATH}/monitor_sa1510.rom ${ROM_PATH}/monitor_80c_sa1510.rom \ #cat ${ROM_PATH}/monitor_1Z-013A.rom ${ROM_PATH}/monitor_1Z-013A.rom \ -cat ${ROM_PATH}/monitor_1Z-009B.rom ${ROM_PATH}/monitor_1Z-009B.rom \ +#cat ${ROM_PATH}/monitor_1Z-009B.rom ${ROM_PATH}/monitor_1Z-009B.rom \ +cat ${ROM_PATH}/monitor_sa1510.rom ${ROM_PATH}/monitor_80c_sa1510.rom \ ${ROM_PATH}/cbios.rom ${ROM_PATH}/rfs_mrom.rom \ ${ROM_PATH}/monitor_1z-013a.rom ${ROM_PATH}/monitor_80c_1z-013a.rom \ ${ROM_PATH}/ipl.rom ${ROM_PATH}/blank_mrom.rom \