mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Add VGA3 Support
This commit is contained in:
@@ -9,7 +9,7 @@ while ($true)
|
||||
|
||||
while ($true)
|
||||
{
|
||||
$PlatformConfigFile = "Config/plt_${Platform}.asm"
|
||||
; $PlatformConfigFile = "Config/plt_${Platform}.asm"
|
||||
$ConfigFile = "Config/${Platform}_${Config}.asm"
|
||||
if (Test-Path $ConfigFile) {break}
|
||||
if ($Config -ne "") {Write-Host "${ConfigFile} does not exist!"}
|
||||
@@ -85,7 +85,7 @@ Function Concat($InputFileList, $OutputFile)
|
||||
PLATFORM .EQU PLT_${Platform} ; HARDWARE PLATFORM
|
||||
ROMSIZE .EQU ${ROMSize} ; SIZE OF ROM IN KB
|
||||
;
|
||||
#INCLUDE "${PlatformConfigFile}"
|
||||
;#INCLUDE "${PlatformConfigFile}"
|
||||
#INCLUDE "${ConfigFile}"
|
||||
;
|
||||
"@ | Out-File "build.inc" -Encoding ASCII
|
||||
@@ -124,7 +124,8 @@ Concat 'romldr.bin', 'dbgmon.bin','cpm.bin','zsys.bin' osimg.bin
|
||||
|
||||
Copy-Item $BlankROM $RomDiskFile
|
||||
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/ROM_${RomSize}KB/*.* 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/${Platform}_${Config}/*.* 0:
|
||||
#cpmcp -f $RomFmt $RomDiskFile ../RomDsk/${Platform}_${Config}/*.* 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ../RomDsk/${Platform}/*.* 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile ../Apps/*.com 0:
|
||||
cpmcp -f $RomFmt $RomDiskFile *.sys 0:
|
||||
|
||||
|
||||
14
Source/HBIOS/Config/N8_std.asm
Normal file
14
Source/HBIOS/Config/N8_std.asm
Normal file
@@ -0,0 +1,14 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; N8 STANDARD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
#include "cfg_n8.asm"
|
||||
;
|
||||
Z180_CLKDIV .SET 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .SET 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .SET 3 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;
|
||||
SDMODE .SET SDMODE_CSIO ; FOR N8 PROTOTYPE (DATECODE 2511), USE SDMODE_N8
|
||||
;
|
||||
CRTACT .SET FALSE ; TRUE TO ACTIVATE CRT AT STARTUP (BOOT ON CRT)
|
||||
@@ -1,8 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; MARK IV CVDU CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET FALSE ; ACTIVATE CRT AT STARTUP
|
||||
;
|
||||
CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT
|
||||
@@ -1,10 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; MARK IV DISKIO V3 CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
FDENABLE .SET TRUE ; ENABLE FLOPPY SUPPORT
|
||||
FDMODE .SET FDMODE_DIO3 ; USE DISKIO V3 MODE
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; ENABLE PPIDE SUPPORT
|
||||
PPIDEMODE .SET PPIDEMODE_DIO3 ; PPIDEMODE_SBC, PPPIDEMODE_DIO3, PPIDEMODE_MFP, PPIDEMODE_N8
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; MARK IV DUAL SD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
SDENABLE .SET TRUE ; ENABLE SD SUPPORT
|
||||
SDMODE .SET SDMODE_DSD ; USE DUAL SD BOARD MODE
|
||||
@@ -1,8 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; MARK IV PROPIO CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET FALSE ; CRT ACTIVATION AT STARTUP
|
||||
;
|
||||
PRPENABLE .SET TRUE ; ENABLE PROPIO BOARD SUPPORT
|
||||
@@ -3,3 +3,28 @@
|
||||
; MARK IV STANDARD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
#include "cfg_mk4.asm"
|
||||
;
|
||||
Z180_CLKDIV .SET 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .SET 0 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .SET 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;
|
||||
FDENABLE .SET FALSE ; TRUE FOR FLOPPY DEVICE SUPPORT
|
||||
FDMODE .SET FDMODE_DIDE ; FDMODE_DIO, FDMODE_DIDE, FDMODE_DIO3
|
||||
;
|
||||
IDEENABLE .SET TRUE ; TRUE FOR IDE DEVICE SUPPORT
|
||||
IDEMODE .SET IDEMODE_MK4 ; IDEMODE_MK4, IDEMODE_DIO, IDEMODE_DIDE
|
||||
;
|
||||
PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT
|
||||
PPIDEMODE .SET PPIDEMODE_MFP ; PPIDEMODE_MFP, PPPIDEMODE_DIO3
|
||||
;
|
||||
SDENABLE .SET TRUE ; TRUE FOR SD DEVICE SUPPORT
|
||||
SDMODE .SET SDMODE_MK4 ; SDMODE_MK4, SDMODE_DSD
|
||||
;
|
||||
PRPENABLE .SET TRUE ; TRUE FOR PROPIO BOARD SUPPORT (VIDEO, KBD, & SD CARD)
|
||||
;
|
||||
VGAENABLE .SET TRUE ; TRUE FOR VGA BOARD VIDEO & KBD SUPPORT
|
||||
CVDUENABLE .SET TRUE ; TRUE FOR CVDU BOARD VIDEO & KBD SUPPORT
|
||||
VDUENABLE .SET FALSE ; TRUE FOR VDU BOARD VIDEO & KBD SUPPORT
|
||||
;
|
||||
CRTACT .SET FALSE ; TRUE TO ACTIVATE CRT AT STARTUP (BOOT ON CRT)
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ROMWBW 2.X CONFIGURATION FOR N8 2312
|
||||
;==================================================================================================
|
||||
;
|
||||
SDMODE .SET SDMODE_CSIO ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
|
||||
SDCSIOFAST .SET TRUE ; TABLE-DRIVEN BIT INVERTER
|
||||
@@ -1,5 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ROMWBW 2.X CONFIGURATION FOR N8 2511
|
||||
;==================================================================================================
|
||||
;
|
||||
@@ -1,8 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC CVDU CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP
|
||||
;
|
||||
CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT
|
||||
@@ -1,10 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC DIDE CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
FDENABLE .SET TRUE ; ENABLE FLOPPY SUPPORT
|
||||
FDMODE .SET FDMODE_DIDE ; USE DUAL IDE MODE
|
||||
;
|
||||
IDEENABLE .SET TRUE ; ENABLE IDE SUPPORT
|
||||
IDEMODE .SET IDEMODE_DIDE ; USE DUAL IDE MODE
|
||||
@@ -1,10 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC DISKIO CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
FDENABLE .SET TRUE ; ENABLE FLOPPY SUPPORT
|
||||
FDMODE .SET FDMODE_DIO ; USE DISKIO MODE (V1)
|
||||
;
|
||||
IDEENABLE .SET TRUE ; ENABLE IDE SUPPORT
|
||||
IDEMODE .SET IDEMODE_DIO ; USE DISKIO IDE INTERFACE
|
||||
@@ -1,15 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC DISKIO V3 + CVDU CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP
|
||||
VDAEMU .SET EMUTYP_ANSI ; SELECT ANSI TERMINAL EMULATION
|
||||
;
|
||||
CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT
|
||||
;
|
||||
FDENABLE .SET TRUE ; ENABLE FLOPPY SUPPORT
|
||||
FDMODE .SET FDMODE_DIO3 ; USE DISKIO V3 MODE
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; ENABLE PPIDE SUPPORT
|
||||
PPIDEMODE .SET PPIDEMODE_DIO3 ; PPIDEMODE_SBC, PPPIDEMODE_DIO3, PPIDEMODE_MFP, PPIDEMODE_N8
|
||||
@@ -1,10 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC DISKIO V3 CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
FDENABLE .SET TRUE ; ENABLE FLOPPY SUPPORT
|
||||
FDMODE .SET FDMODE_DIO3 ; USE DISKIO V3 MODE
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; ENABLE PPIDE SUPPORT
|
||||
PPIDEMODE .SET PPIDEMODE_DIO3 ; PPIDEMODE_SBC, PPPIDEMODE_DIO3, PPIDEMODE_MFP, PPIDEMODE_N8
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC DUAL SD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
SDENABLE .SET TRUE ; ENABLE SD SUPPORT
|
||||
SDMODE .SET SDMODE_DSD ; USE DUAL SD BOARD MODE
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC MF/PIC CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; ENABLE PPIDE SUPPORT
|
||||
PPIDEMODE .SET PPIDEMODE_MFP ; PPIDEMODE_SBC, PPPIDEMODE_DIO3, PPIDEMODE_MFP, PPIDEMODE_N8
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC PPIDE CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; ENABLE PPIDE SUPPORT (DO USE WITH DSKYENABLE)
|
||||
PPIDEMODE .SET PPIDEMODE_SBC ; PPIDEMODE_SBC, PPPIDEMODE_DIO3, PPIDEMODE_MFP, PPIDEMODE_N8
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC PPISD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
SDENABLE .SET TRUE ; ENABLE SD SUPPORT
|
||||
SDMODE .SET SDMODE_PPI ; USE PPI -> SD INTERFACE
|
||||
@@ -1,8 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC PROPIO CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET TRUE ; CRT ACTIVATION AT STARTUP
|
||||
;
|
||||
PRPENABLE .SET TRUE ; ENABLE PROPIO BOARD SUPPORT
|
||||
@@ -1,6 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC RAM FLOPPY CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
RFENABLE .SET TRUE ; ENABLE RAM FLOPPY SUPPORT
|
||||
@@ -1,13 +1,11 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC SIMH CONFIGURATION
|
||||
; SBC SIMH EMULATOR CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CPUOSC .SET 20000000 ; EMULATOR RUNS FAST...
|
||||
#include "cfg_sbc.asm"
|
||||
;
|
||||
INTTYPE .SET IT_SIMH
|
||||
DSRTCENABLE .SET FALSE ; DS-1302 CLOCK DRIVER
|
||||
SIMRTCENABLE .SET TRUE ; SIMH CLOCK DRIVER
|
||||
;
|
||||
SIMRTCENABLE .SET TRUE
|
||||
DSRTCENABLE .SET FALSE
|
||||
;
|
||||
HDSKENABLE .SET TRUE
|
||||
HDSKENABLE .SET TRUE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
|
||||
@@ -3,3 +3,24 @@
|
||||
; SBC STANDARD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
#include "cfg_sbc.asm"
|
||||
;
|
||||
FDENABLE .SET FALSE ; TRUE FOR FLOPPY DEVICE SUPPORT
|
||||
FDMODE .SET FDMODE_DIO3 ; FDMODE_DIO, FDMODE_DIDE, FDMODE_DIO3
|
||||
;
|
||||
IDEENABLE .SET FALSE ; TRUE FOR IDE DEVICE SUPPORT
|
||||
IDEMODE .SET IDEMODE_DIO ; IDEMODE_DIO, IDEMODE_DIDE
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; TRUE FOR PPIDE DEVICE SUPPORT
|
||||
PPIDEMODE .SET PPIDEMODE_SBC ; PPIDEMODE_SBC, PPPIDEMODE_DIO3, PPIDEMODE_MFP
|
||||
;
|
||||
SDENABLE .SET FALSE ; TRUE FOR SD DEVICE SUPPORT
|
||||
SDMODE .SET SDMODE_PPI ; SDMODE_JUHA, SDMODE_PPI, SDMODE_DSD
|
||||
;
|
||||
PRPENABLE .SET TRUE ; TRUE FOR PROPIO BOARD SUPPORT (VIDEO, KBD, & SD CARD)
|
||||
;
|
||||
VGAENABLE .SET TRUE ; TRUE FOR VGA BOARD VIDEO & KBD SUPPORT
|
||||
CVDUENABLE .SET TRUE ; TRUE FOR CVDU BOARD VIDEO & KBD SUPPORT
|
||||
VDUENABLE .SET FALSE ; TRUE FOR VDU BOARD VIDEO & KBD SUPPORT
|
||||
;
|
||||
CRTACT .SET FALSE ; TRUE TO ACTIVATE CRT AT STARTUP (BOOT ON CRT)
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SBC VDU CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP
|
||||
;
|
||||
VDUENABLE .SET TRUE ; ENABLE VDU BOARD SUPPORT
|
||||
@@ -3,3 +3,5 @@
|
||||
; UNA STANDARD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
#include "cfg_una.asm"
|
||||
;
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ZETA2 PPIDE CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
@@ -1,6 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ZETA2 PPISD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
SDENABLE .SET TRUE ; TRUE FOR SD SUPPORT
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ZETA2 PARPORTPROP CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET TRUE ; ACTIVATE CRT CONSOLE AT BOOT
|
||||
PPPENABLE .SET TRUE ; TRUE FOR PARPORTPROP SUPPORT
|
||||
@@ -3,3 +3,12 @@
|
||||
; ZETA2 STANDARD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
#include "cfg_zeta2.asm"
|
||||
;
|
||||
PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT
|
||||
;
|
||||
SDENABLE .SET FALSE ; TRUE FOR SD DEVICE SUPPORT
|
||||
;
|
||||
PPPENABLE .SET TRUE ; TRUE FOR PROPIO BOARD SUPPORT (VIDEO, KBD, & SD CARD)
|
||||
;
|
||||
CRTACT .SET TRUE ; TRUE TO ACTIVATE CRT AT STARTUP (BOOT ON CRT)
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ZETA PPIDE CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
PPIDEENABLE .SET TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
@@ -1,6 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ZETA PPISD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
SDENABLE .SET TRUE ; TRUE FOR SD SUPPORT
|
||||
@@ -1,7 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ZETA PARPORTPROP CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
CRTACT .SET TRUE ; ACTIVATE CRT CONSOLE AT BOOT
|
||||
PPPENABLE .SET TRUE ; TRUE FOR PARPORTPROP SUPPORT
|
||||
@@ -3,3 +3,12 @@
|
||||
; ZETA STANDARD CONFIGURATION
|
||||
;==================================================================================================
|
||||
;
|
||||
#include "cfg_zeta.asm"
|
||||
;
|
||||
PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT
|
||||
;
|
||||
SDENABLE .SET FALSE ; TRUE FOR SD DEVICE SUPPORT
|
||||
;
|
||||
PPPENABLE .SET TRUE ; TRUE FOR PROPIO BOARD SUPPORT (VIDEO, KBD, & SD CARD)
|
||||
;
|
||||
CRTACT .SET TRUE ; TRUE TO ACTIVATE CRT AT STARTUP (BOOT ON CRT)
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
@..\tools\gcc\mingw32-make %*
|
||||
@@ -1,131 +0,0 @@
|
||||
; bioshdr.inc 5/10/2012 dwg - offsets into the BIOS Header data
|
||||
|
||||
B_BOOT .equ 0e600h
|
||||
B_WBOOT .equ 0e603h
|
||||
B_CONST .equ 0e606h
|
||||
B_CONIN .equ 0e609h
|
||||
B_CONOUT .equ 0e60ch
|
||||
B_LIST .equ 0e60fh
|
||||
B_PUNCH .equ 0e612h
|
||||
B_READER .equ 0e615h
|
||||
B_HOME .equ 0e618h
|
||||
B_SELDSK .equ 0e61bh
|
||||
B_SETTRK .equ 0e61eh
|
||||
B_SETSEC .equ 0e621h
|
||||
B_SETDMA .equ 0e624h
|
||||
B_READ .equ 0e627h
|
||||
B_WRITE .equ 0e62ah
|
||||
B_LISTST .equ 0e62dh
|
||||
B_SECTRN .equ 0e630h
|
||||
B_BNKSEL .equ 0e633h
|
||||
B_GETLU .equ 0e636h
|
||||
B_SETLU .equ 0e639h
|
||||
B_GETINFO .equ 0e63ch
|
||||
B_RSVD1 .equ 0e63fh
|
||||
B_RSVD2 .equ 0e642h
|
||||
B_RSVD3 .equ 0e645h
|
||||
B_RSVD4 .equ 0e648h
|
||||
|
||||
B_CNFGDATA .equ 0e64bh
|
||||
|
||||
B_RMJ .equ 0e64bh
|
||||
B_RMN .equ 0e64ch
|
||||
B_RUP .equ 0e64dh
|
||||
B_RTP .equ 0e64eh
|
||||
B_DSKBOOT .equ 0e64fh
|
||||
B_BOOTDRV .equ 0e650h
|
||||
|
||||
B_MONTH .equ 0e651h
|
||||
B_DAY .equ 0e652h
|
||||
B_YEAR .equ 0e653h
|
||||
|
||||
B_HOUR .equ 0e654h
|
||||
B_MIN .equ 0e655h
|
||||
B_SEC .equ 0e656h
|
||||
|
||||
; Config Proper Start Here
|
||||
|
||||
B_FREQ .equ 0e657h
|
||||
B_PLATFORM .equ B_FREQ+1
|
||||
B_DIOPLAT .equ B_PLATFORM+1
|
||||
B_VDUMODE .equ B_DIOPLAT+1
|
||||
B_ROMSIZE .equ B_VDUMODE+1
|
||||
B_RAMSIZE .equ B_ROMSIZE+2
|
||||
B_CLRRAMDSK .equ B_RAMSIZE+2
|
||||
B_DSKYENABLE .equ B_CLRRAMDSK+1
|
||||
B_UARTENABLE .equ B_DSKYENABLE+1
|
||||
B_VDUENABLE .equ B_UARTENABLE+1
|
||||
B_FDENABLE .equ B_VDUENABLE+1
|
||||
B_FDTRACE .equ B_FDENABLE+1
|
||||
B_FDMEDIA .equ B_FDTRACE+1
|
||||
B_FDMEDIAALT .equ B_FDMEDIA+1
|
||||
B_FDMAUTO .equ B_FDMEDIAALT+1
|
||||
B_IDEENABLE .equ B_FDMAUTO+1
|
||||
B_IDETRACE .equ B_IDEENABLE+1
|
||||
B_IDE8BIT .equ B_IDETRACE+1
|
||||
B_IDECAPACITY .equ B_IDE8BIT+1
|
||||
B_PPIDEENABLE .equ B_IDECAPACITY+2
|
||||
B_PPIDETRACE .equ B_PPIDEENABLE+1
|
||||
B_PPIDE8BIT .equ B_PPIDETRACE+1
|
||||
B_PPIDECAPACITY .equ B_PPIDE8BIT+1
|
||||
B_PPIDESLOW .equ B_PPIDECAPACITY+2
|
||||
B_BOOTTYPE .equ B_PPIDESLOW+1
|
||||
B_BAUDRATE .equ B_BOOTTYPE+1
|
||||
B_CLKDIV .equ B_BAUDRATE+2
|
||||
|
||||
B_MEMWAIT .equ B_CLKDIV+1
|
||||
B_IOWAIT .equ B_MEMWAIT+1
|
||||
B_CNTLB0 .equ B_IOWAIT+1
|
||||
B_CNTLB1 .equ B_CNTLB0+1
|
||||
B_SDCAPACITY .equ B_CNTLB1+1
|
||||
B_SDCSIO .equ B_SDCAPACITY+2
|
||||
B_SDCSIOFAST .equ B_SDCSIO+1
|
||||
B_DEFIOBYTE .equ B_SDCSIOFAST+1
|
||||
B_TERMTYPE .equ B_DEFIOBYTE+1
|
||||
B_REVISION .equ B_TERMTYPE+1
|
||||
B_PRPSDENABLE .equ B_REVISION+2
|
||||
B_PRPSDTRACE .equ B_PRPSDENABLE+1
|
||||
B_PRPSDCAPACITY .equ B_PRPSDTRACE+1
|
||||
B_PRPCONENABLE .equ B_PRPSDCAPACITY+2
|
||||
B_DATASIZE .equ B_PRPCONENABLE+1
|
||||
|
||||
|
||||
B_INFOVER .equ 0
|
||||
B_STRBANNER .equ B_INFOVER+2
|
||||
B_VARLOC .equ B_STRBANNER+2
|
||||
B_TSTLOC .equ B_VARLOC+2
|
||||
B_SECADR .equ B_TSTLOC+2
|
||||
B_SEKDSK .equ B_SECADR+2
|
||||
B_SEKTRK .equ B_SEKDSK+2
|
||||
B_SEKSEC .equ B_SEKTRK+2
|
||||
B_DSKOP .equ B_SEKSEC+2
|
||||
B_DMAADR .equ B_DSKOP+2
|
||||
B_DPHADR .equ B_DMAADR+2
|
||||
B_XLT .equ B_DPHADR+2
|
||||
B_HST .equ B_XLT+2
|
||||
B_DIRBF .equ B_HST+2
|
||||
B_DPBMAP .equ B_DIRBF+2
|
||||
B_DSKMAP .equ B_DPBMAP+2
|
||||
B_DPHMAP .equ B_DSKMAP+2
|
||||
B_CIOMAP .equ B_DPHMAP+2
|
||||
B_SECBUF .equ B_CIOMAP+2
|
||||
B_ORGFDDATA .equ B_SECBUF+2
|
||||
B_ORGIDEDATA .equ B_ORGFDDATA+2
|
||||
B_ORGSDDATA .equ B_ORGIDEDATA+2
|
||||
B_ORGPRPSDDATA .equ B_ORGSDDATA+2
|
||||
B_ORGPPPSDDATA .equ B_ORGPRPSDDATA+2
|
||||
B_INFOTBLSIZE .equ B_ORGPPPSDDATA+2
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
; eof - bioshdr.inc ;
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,180 +0,0 @@
|
||||
;___BOOTAPP____________________________________________________________________________________________________________
|
||||
;
|
||||
; APPLICATION BOOT MANAGER
|
||||
;
|
||||
; USED TO LOAD AN APPLICATION IMAGE BASED COPY OF THE SYSTEM
|
||||
; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION.
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
.ORG $100
|
||||
;
|
||||
DI ; NO INTERRUPTS
|
||||
IM 1 ; INTERRUPT MODE 1
|
||||
;LD SP,STACK ; SP IN RAM
|
||||
LD SP,HBX_LOC ; SP IN RAM
|
||||
;
|
||||
; PERFORM MINIMAL Z180 SPECIFIC INITIALIZATION
|
||||
;
|
||||
#IFNDEF UNALOAD
|
||||
;
|
||||
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
|
||||
; SET BASE FOR CPU IO REGISTERS
|
||||
LD A,CPU_BASE
|
||||
OUT0 (CPU_ICR),A
|
||||
|
||||
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
|
||||
XOR A
|
||||
OUT0 (CPU_CCR),A
|
||||
OUT0 (CPU_CMR),A
|
||||
|
||||
; SET DEFAULT WAIT STATES
|
||||
LD A,$F0
|
||||
OUT0 (CPU_DCNTL),A
|
||||
|
||||
#IF (Z180_CLKDIV >= 1)
|
||||
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
|
||||
LD A,$80
|
||||
OUT0 (CPU_CCR),A
|
||||
#ENDIF
|
||||
|
||||
#IF (Z180_CLKDIV >= 2)
|
||||
; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED
|
||||
LD A,$80
|
||||
OUT0 (CPU_CMR),A
|
||||
#ENDIF
|
||||
; SET DESIRED WAIT STATES
|
||||
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
|
||||
OUT0 (CPU_DCNTL),A
|
||||
|
||||
; CANNOT CHANGE MMU SETUP DURING AN APP BASED BOOT
|
||||
;; MMU SETUP
|
||||
;LD A,$80
|
||||
;OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
|
||||
;LD A,RAMBIAS >> 2
|
||||
;OUT0 (CPU_BBR),A ; BANK BASE SET TO START OF RAM
|
||||
;LD A,(RAMSIZE + RAMBIAS - 64) >> 2
|
||||
;OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
|
||||
#ENDIF
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
|
||||
;
|
||||
CALL XIO_INIT ; INIT SERIAL PORT
|
||||
LD HL,STR_BOOT ; POINT TO MESSAGE
|
||||
CALL XIO_OUTS ; SAY HELLO
|
||||
;
|
||||
; RELOCATE MONITOR/OS CODE FROM 8000H TO C000H
|
||||
; THIS INCLUDES OURSELVES (FOR PHASE 2) AND THE LOADER CODE
|
||||
; CAREFUL, WORKING STACK AREA IS WIPED OUT!!!
|
||||
;
|
||||
LD HL,$8000 ; COPY MEMORY FROM $8000
|
||||
LD DE,$C000 ; TO $C000
|
||||
LD BC,$4000 - $400 ; ALL BUT TOP 1K TO AVOID OVERLAYING PROXY
|
||||
LDIR
|
||||
;
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
; COPY FIRST $1000 BYTES TO $8000 (UPPER, NON-BANKED MEMORY)
|
||||
; THIS INCLUDES OURSELVES AND THE LOADER CODE
|
||||
; STACK AREA IS WIPED OUT!!!
|
||||
;
|
||||
LD HL,$0000 ; COPY MEMORY FROM 0000
|
||||
LD DE,$8000 ; TO 8000H
|
||||
LD BC,$1000 ; COPY 1000H BYTES
|
||||
LDIR
|
||||
;
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
; IF RUNNING UNDER UNA, WE ARE DONE, PROCEED TO LOADER
|
||||
LD DE,$0100 ; *** FIX *** ASSUME WE WANT DEFAULT DRIVE TO BE ROM
|
||||
JP CPM_ENT ; JUMP TO OS
|
||||
#ELSE
|
||||
; NON-UNA REQUIRES PHASE 2
|
||||
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
|
||||
#ENDIF
|
||||
;
|
||||
STR_BOOT .DB "RomWBW$"
|
||||
;
|
||||
; IMBED DIRECT SERIAL I/O ROUTINES
|
||||
;
|
||||
#INCLUDE "xio.asm"
|
||||
|
||||
;
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
|
||||
;
|
||||
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
|
||||
|
||||
#IF (PLATFORM != PLT_UNA)
|
||||
|
||||
;
|
||||
PHASE2:
|
||||
LD SP,HBX_LOC ; MOVE SP TO HIMEM JUST BELOW HBIOS
|
||||
;
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
; COPY NEW HBIOS IMAGE INTO TARGET RAM PAGE
|
||||
;
|
||||
LD HL,0 ; HL = LOCATION IN LOMEM TO COPY FROM/TO
|
||||
LOOP:
|
||||
LD DE,$9000 ; DE = BUFFER ADDRESS
|
||||
LD BC,$1000 ; BYTES TO COPY (4K CHUNKS)
|
||||
PUSH BC ; SAVE COPY SIZE
|
||||
PUSH DE ; SAVE COPY DEST
|
||||
PUSH HL ; SAVE COPY SOURCE
|
||||
LD A,BID_USR ; RAM PAGE WITH NEW HBIOS IMAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
LDIR ; COPY ROM -> BUFFER
|
||||
POP DE ; RESTORE SOURCE AS NEW DESTINATION
|
||||
POP HL ; RESTORE DESTINATION AS NEW SOURCE
|
||||
POP BC ; RESTORE COPY SIZE
|
||||
LD A,BID_HB ; HBIOS RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
LDIR ; COPY BUFFER -> RAM
|
||||
EX DE,HL ; GET LOMEM POINTER BACK TO HL
|
||||
LD A,H ; HIGH BYTE OF POINTER TO A
|
||||
CP $80 ; HIGH BYTE WILL BE 80H WHEN WE ARE DONE
|
||||
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
|
||||
;
|
||||
LD A,BID_USR ; RAM PAGE WITH NEW HBIOS IMAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
; INITIALIZE HBIOS AND JUMP TO LOADER
|
||||
;
|
||||
; CALL HBIOS HARDWARE INITIALIZATION
|
||||
; CALL HBIOS HARDWARE INITIALIZATION
|
||||
LD A,BID_HB ; HBIOS RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL $1000 ; CALL HBIOS INITIALIZATION
|
||||
;
|
||||
; CALL HBIOS PROXY INITIALIZATION
|
||||
LD A,BID_USR ; USER RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL HBX_LOC ; CALL HBIOS PROXY INITIALIZATION
|
||||
;
|
||||
LD DE,$0000 ; ASSUME WE WANT DEFAULT DRIVE TO BE ROM
|
||||
JP CPM_ENT ; JUMP TO OS
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
|
||||
;
|
||||
#INCLUDE "memmgr.asm"
|
||||
;
|
||||
#ENDIF
|
||||
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; PAD OUT REMAINDER OF PAGE
|
||||
;
|
||||
.FILL $8200 - $,$FF ; PAD OUT REMAINDER OF PAGE
|
||||
;
|
||||
STACK .EQU $ ; STACK IN HIMEM SLACK SPACE
|
||||
;
|
||||
.END
|
||||
@@ -1,424 +0,0 @@
|
||||
;___BOOTGEN___________________________________________________________________________________________________________
|
||||
;
|
||||
; COPY THE SYSTEM TO THE BOOT SECTORS OF AN IDE HDD
|
||||
;
|
||||
; CREATED BY : DAN WERNER 09 12.2009
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
;__CONSTANTS_________________________________________________________________________________________________________________________
|
||||
;
|
||||
CR: .EQU 0DH ; ASCII CARRIAGE RETURN CHARACTER
|
||||
LF: .EQU 0AH ; ASCII LINE FEED CHARACTER
|
||||
ESC: .EQU 1BH ; ASCII ESCAPE CHARACTER
|
||||
BS: .EQU 08H ; ASCII BACKSPACE CHARACTER
|
||||
|
||||
;
|
||||
;
|
||||
;
|
||||
;__MAIN_PROGRAM_____________________________________________________________________________________________________________________
|
||||
;
|
||||
.ORG 00100h ; FOR DEBUG IN CP/M (AS .COM)
|
||||
|
||||
|
||||
LD HL,(0001H) ; GET WBOOT ADDRESS
|
||||
LD BC,1603H ; GET CP/M TOP
|
||||
SBC HL,BC ;
|
||||
LD (CPMSTART),HL ; SET IT
|
||||
DEC HL ;
|
||||
LD SP,HL ; SETUP STACK
|
||||
|
||||
|
||||
; PARSE COMMAND LINE
|
||||
LD HL,0081H ; SET INDEX POINTER
|
||||
LD B,(0080H) ; NUMBER OF BYTES
|
||||
PARSECMD:
|
||||
LD A,(HL) ; GET DRIVE LETTER ON COMMAND LINE
|
||||
INC HL
|
||||
CP 20H ; IS SPACE?
|
||||
JP NZ,PARSEGOT ; JUMP ON NON-BLANK
|
||||
DJNZ PARSECMD ; LOOP
|
||||
PARSEERR:
|
||||
LD DE,MSG_VALID ;
|
||||
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
||||
CALL 0005H
|
||||
JP EXIT ; EXIT
|
||||
PARSEGOT:
|
||||
SUB 'A' ; TURN IT INTO A NUMERIC
|
||||
JP C,PARSEERR ;
|
||||
CP 16 ; VALID CP/M DRIVE?
|
||||
JP P,PARSEERR ;
|
||||
LD (DEVICENUMBER),A ; DEVICE ID
|
||||
; GET NUMBER OF SECTORS PER TRACK
|
||||
LD L,A ; L=DISK NUMBER 0,1,2,3,4
|
||||
LD H,0 ; HIGH ORDER ZERO
|
||||
ADD HL,HL ; *2
|
||||
ADD HL,HL ; *4
|
||||
ADD HL,HL ; *8
|
||||
ADD HL,HL ; *16 (SIZE OF EACH HEADER)
|
||||
PUSH HL ;
|
||||
POP DE
|
||||
LD HL,(0001H) ;
|
||||
LD BC,0058 ;
|
||||
ADD HL,BC ;
|
||||
ADD HL,DE ; HL= DPBASE(DISKNO*16)
|
||||
EX DE,HL ;
|
||||
LD A,(DE) ;
|
||||
LD L,A ;
|
||||
INC DE ;
|
||||
LD A,(DE) ;
|
||||
LD H,A ;
|
||||
EX DE,HL ;
|
||||
LD A,(DE) ;
|
||||
LD (SECTRACK),A ;
|
||||
INC DE ;
|
||||
LD A,(DE) ;
|
||||
LD (SECTRACK+1),A ;
|
||||
|
||||
LD DE,DRIVE_MSG ;
|
||||
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
||||
CALL 0005H
|
||||
LD A,(DEVICENUMBER) ;
|
||||
ADD A,'A' ;
|
||||
CALL COUT ;
|
||||
LD A,':' ;
|
||||
CALL COUT ;
|
||||
CALL CRLF ;
|
||||
|
||||
|
||||
LD DE,BASE_MSG ;
|
||||
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
||||
CALL 0005H
|
||||
LD HL,(CPMSTART) ;
|
||||
CALL PHL ;
|
||||
LD DE,END_MSG ;
|
||||
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
||||
CALL 0005H
|
||||
LD HL,(CPMEND) ;
|
||||
CALL PHL ;
|
||||
CALL CRLF ;
|
||||
|
||||
LD DE,SECTOR_MSG ;
|
||||
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
||||
CALL 0005H
|
||||
LD HL,(SECTRACK) ;
|
||||
CALL PHL ;
|
||||
CALL CRLF ;
|
||||
|
||||
|
||||
; RUN WITH GOOD OUTPUT
|
||||
|
||||
LD A,(DEVICENUMBER) ; SET DEVICE NUMBER
|
||||
LD C,A
|
||||
CALL SELDSK ; SELECT DISK
|
||||
|
||||
LD HL,000CH ; SET INITIAL SECTOR
|
||||
LD (CURSECTOR),HL
|
||||
|
||||
LD HL,0000H ; SET INITIAL TRACK
|
||||
LD (CURTRACK),HL ;
|
||||
|
||||
LD HL,(CPMSTART) ; SET BEGINNING OF CPM
|
||||
LD (CURADDRESS),HL ;
|
||||
|
||||
LD BC,(DMAAD) ; SETUP THE DMA AREA
|
||||
CALL SETDMA ;
|
||||
|
||||
LOOP:
|
||||
LD BC,(CURSECTOR) ; SET SECTOR
|
||||
CALL SETSEC ;
|
||||
LD BC,(CURTRACK) ;
|
||||
CALL SETTRK ;
|
||||
CALL COPYTODMA ; COPY BYTES TO DMA
|
||||
CALL WRITE ; WRITE SECTOR
|
||||
|
||||
LD HL,(CURADDRESS) ; IF IX>CPMEND, EXIT PROGRAM
|
||||
LD BC,(CPMEND) ;
|
||||
LD A,H ;
|
||||
CP B ;
|
||||
JP NZ,CONTINUE ;
|
||||
LD A,L ;
|
||||
CP C ;
|
||||
JP M,ENDLOOP ;
|
||||
CONTINUE:
|
||||
LD HL,(CURSECTOR) ; GET NEXT TRACK & SECTOR
|
||||
INC HL ;
|
||||
LD (CURSECTOR),HL ;
|
||||
LD BC,(SECTRACK) ;
|
||||
LD A,H ;
|
||||
CP B ;
|
||||
JP NZ,LOOP ;
|
||||
LD A,L ;
|
||||
CP C ;
|
||||
JP NZ,LOOP ;
|
||||
|
||||
LD HL,(CURTRACK) ;
|
||||
INC HL ;
|
||||
LD (CURTRACK),HL ;
|
||||
LD HL,0000H ;
|
||||
LD (CURSECTOR),HL ;
|
||||
JP LOOP ;
|
||||
|
||||
ENDLOOP:
|
||||
; WRITE CP/M BOOT START AND END ADDRESSES IN LAST TWO WORDS OF MEDIA INFO SECTOR
|
||||
LD BC,000BH ; SET SECTOR
|
||||
CALL SETSEC ;
|
||||
LD BC,0000H ;
|
||||
CALL SETTRK ;
|
||||
CALL READ ;
|
||||
LD HL,(DMAAD) ; SET ADDRESS IN BUFFER TO LAST TWO WORDS
|
||||
LD BC,122 ;
|
||||
ADD HL,BC ;
|
||||
LD A,(CPMSTART) ;
|
||||
LD (HL),A ;
|
||||
LD A,(CPMSTART+1) ;
|
||||
INC HL
|
||||
LD (HL),A ;
|
||||
LD A,(CPMEND) ;
|
||||
INC HL
|
||||
LD (HL),A ;
|
||||
LD A,(CPMEND+1) ;
|
||||
INC HL
|
||||
LD (HL),A ;
|
||||
LD A,(0001H) ;
|
||||
DEC A ;
|
||||
DEC A ;
|
||||
DEC A ;
|
||||
INC HL
|
||||
LD (HL),A ;
|
||||
LD A,(0002H) ;
|
||||
INC HL
|
||||
LD (HL),A ;
|
||||
CALL WRITE ; WRITE SECTOR
|
||||
|
||||
EXIT:
|
||||
|
||||
LD DE,MSG_END ;
|
||||
LD C,09H ; CP/M WRITE END STRING TO CONSOLE CALL
|
||||
CALL 0005H ;
|
||||
;
|
||||
LD C,00H ; CP/M SYSTEM RESET CALL
|
||||
CALL 0005H ; RETURN TO PROMPT
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;___COPYTODMA_____________________________________________________________________________________
|
||||
;
|
||||
; COPY CURRENT ADDRESS BLOCK TO DMA
|
||||
;_________________________________________________________________________________________________
|
||||
COPYTODMA:
|
||||
LD HL,(DMAAD) ; LOAD HL WITH DMA ADDRESS
|
||||
LD E,L ;
|
||||
LD D,H ; GET IT INTO DE
|
||||
LD HL,(CURADDRESS) ; GET RAM ADDRESS TO COPY
|
||||
LD BC,128 ; BC IS COUNTER FOR FIXED SIZE TRANSFER (128 BYTES)
|
||||
LDIR ; TRANSFER
|
||||
LD HL,(CURADDRESS) ; INCREMENT ADDRESS POINTER BY COPY SIZE
|
||||
LD BC,128 ;
|
||||
ADD HL,BC ;
|
||||
LD (CURADDRESS),HL ;
|
||||
RET
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
;__HXOUT_________________________________________________________________________________________________________________________
|
||||
;
|
||||
; PRINT THE ACCUMULATOR CONTENTS AS HEX DATA ON THE SERIAL PORT
|
||||
;________________________________________________________________________________________________________________________________
|
||||
;
|
||||
HXOUT:
|
||||
PUSH BC ; SAVE BC
|
||||
LD B,A ;
|
||||
RLC A ; DO HIGH NIBBLE FIRST
|
||||
RLC A ;
|
||||
RLC A ;
|
||||
RLC A ;
|
||||
AND 0FH ; ONLY THIS NOW
|
||||
ADD A,30H ; TRY A NUMBER
|
||||
CP 3AH ; TEST IT
|
||||
JR C,OUT1 ; IF CY SET PRINT 'NUMBER'
|
||||
ADD A,07H ; MAKE IT AN ALPHA
|
||||
OUT1:
|
||||
CALL COUT ; SCREEN IT
|
||||
LD A,B ; NEXT NIBBLE
|
||||
AND 0FH ; JUST THIS
|
||||
ADD A,30H ; TRY A NUMBER
|
||||
CP 3AH ; TEST IT
|
||||
JR C,OUT2 ; PRINT 'NUMBER'
|
||||
ADD A,07H ; MAKE IT ALPHA
|
||||
OUT2:
|
||||
CALL COUT ; SCREEN IT
|
||||
POP BC ; RESTORE BC
|
||||
RET ;
|
||||
|
||||
|
||||
;__SPACE_________________________________________________________________________________________________________________________
|
||||
;
|
||||
; PRINT A SPACE CHARACTER ON THE SERIAL PORT
|
||||
;________________________________________________________________________________________________________________________________
|
||||
;
|
||||
SPACE:
|
||||
PUSH AF ; STORE AF
|
||||
LD A,20H ; LOAD A "SPACE"
|
||||
CALL COUT ; SCREEN IT
|
||||
POP AF ; RESTORE AF
|
||||
RET ; DONE
|
||||
|
||||
;__CRLF_________________________________________________________________________________________________________________________
|
||||
;
|
||||
; PRINT A CR/LF
|
||||
;________________________________________________________________________________________________________________________________
|
||||
;
|
||||
CRLF:
|
||||
PUSH AF ; STORE AF
|
||||
LD A,0DH ; LOAD A "SPACE"
|
||||
CALL COUT ; SCREEN IT
|
||||
LD A,0AH ; LOAD A "SPACE"
|
||||
CALL COUT ; SCREEN IT
|
||||
POP AF ; RESTORE AF
|
||||
RET ; DONE
|
||||
|
||||
;__COUT_________________________________________________________________________________________________________________________
|
||||
;
|
||||
; PRINT CONTENTS OF A
|
||||
;________________________________________________________________________________________________________________________________
|
||||
;
|
||||
COUT:
|
||||
PUSH BC ;
|
||||
PUSH AF ;
|
||||
PUSH HL ;
|
||||
PUSH DE ;
|
||||
|
||||
LD (COUT_BUFFER),A ;
|
||||
LD DE,COUT_BUFFER ;
|
||||
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
|
||||
CALL 0005H
|
||||
POP DE ;
|
||||
POP HL ;
|
||||
POP AF ;
|
||||
POP BC ;
|
||||
RET ; DONE
|
||||
|
||||
|
||||
|
||||
|
||||
;__PHL_________________________________________________________________________________________________________________________
|
||||
;
|
||||
; PRINT THE HL REG ON THE SERIAL PORT
|
||||
;________________________________________________________________________________________________________________________________
|
||||
;
|
||||
PHL:
|
||||
LD A,H ; GET HI BYTE
|
||||
CALL HXOUT ; DO HEX OUT ROUTINE
|
||||
LD A,L ; GET LOW BYTE
|
||||
CALL HXOUT ; HEX IT
|
||||
CALL SPACE ;
|
||||
RET ; DONE
|
||||
|
||||
COUT_BUFFER:
|
||||
.DB 00
|
||||
.DB "$"
|
||||
|
||||
BASE_MSG:
|
||||
.TEXT "CP/M IMAGE="
|
||||
.db "$"
|
||||
END_MSG:
|
||||
.TEXT "TO "
|
||||
.db "$"
|
||||
SECTOR_MSG:
|
||||
.TEXT "SECTORS/TRACK="
|
||||
.db "$"
|
||||
|
||||
DRIVE_MSG:
|
||||
.TEXT "DRIVE="
|
||||
.db "$"
|
||||
|
||||
|
||||
;__CBIOS_________________________________________________________________________________________________________________________
|
||||
;
|
||||
; CBIOS JUMP TABLE
|
||||
;________________________________________________________________________________________________________________________________
|
||||
;
|
||||
|
||||
SELDSK: ;SELECT DISK
|
||||
PUSH BC ;
|
||||
LD HL,(0001H) ;
|
||||
LD BC,0024 ;
|
||||
ADD HL,BC ;
|
||||
POP BC ;
|
||||
JP (HL) ;
|
||||
SETTRK: ;SET DISK TRACK ADDR
|
||||
PUSH BC ;
|
||||
LD HL,(0001H) ;
|
||||
LD BC,0027 ;
|
||||
ADD HL,BC ;
|
||||
POP BC ;
|
||||
JP (HL) ;
|
||||
SETSEC: ;SET DISK SECTOR ADDR
|
||||
PUSH BC ;
|
||||
LD HL,(0001H) ;
|
||||
LD BC,0030 ;
|
||||
ADD HL,BC ;
|
||||
POP BC ;
|
||||
JP (HL) ;
|
||||
SETDMA: ;SET DMA BUFFER ADDR
|
||||
PUSH BC ;
|
||||
LD HL,(0001H) ;
|
||||
LD BC,0033 ;
|
||||
ADD HL,BC ;
|
||||
POP BC ;
|
||||
JP (HL) ;
|
||||
READ: ;READ SECTOR
|
||||
PUSH BC ;
|
||||
LD HL,(0001H) ;
|
||||
LD BC,0036 ;
|
||||
ADD HL,BC ;
|
||||
POP BC ;
|
||||
JP (HL) ;
|
||||
WRITE: ;WRITE SECTOR
|
||||
PUSH BC ;
|
||||
LD HL,(0001H) ;
|
||||
LD BC,0039 ;
|
||||
ADD HL,BC ;
|
||||
POP BC ;
|
||||
JP (HL) ;
|
||||
|
||||
|
||||
|
||||
CURTRACK: .DW 0 ; CURRENT TRACK
|
||||
CURSECTOR: .DW 0 ; CURRENT SECTOR
|
||||
CURADDRESS: .DW 0 ; CURRENT CP/M ADDRESS
|
||||
DMAAD: .DW 5000H ; DIRECT MEMORY ADDRESS
|
||||
|
||||
CPMEND: .DW 0FDFFH ; END OF CP/M
|
||||
SECTRACK: .DW 0100H ; SECTORS PER TRACK
|
||||
CPMSTART: .DW 0D000H ; START OF CP/M
|
||||
DEVICENUMBER: .DB 2 ; DEVICE ID
|
||||
|
||||
|
||||
|
||||
MSG_END:
|
||||
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
||||
.TEXT "BOOTGEN COMPLETED."
|
||||
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
||||
.DB "$" ; LINE TERMINATOR
|
||||
MSG_VALID:
|
||||
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
||||
.TEXT "USAGE: BOOTGEN (DRIVE):"
|
||||
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
||||
.TEXT "(DRIVE) IS ANY VALID CP/M DRIVE:"
|
||||
.DB LF, CR ; LINE FEED AND CARRIAGE RETURN
|
||||
.DB "$" ; LINE TERMINATOR
|
||||
|
||||
|
||||
.END
|
||||
|
||||
|
||||
|
||||
@@ -1,177 +0,0 @@
|
||||
;___BOOTROM____________________________________________________________________________________________________________
|
||||
;
|
||||
; ROM BOOT MANAGER
|
||||
;
|
||||
; HARDWARE COLD START WILL JUMP HERE FOR INITIALIZATION
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
.ORG $100
|
||||
;
|
||||
DI ; NO INTERRUPTS
|
||||
IM 1 ; INTERRUPT MODE 1
|
||||
LD SP,HBX_LOC ; SP IN RAM
|
||||
;
|
||||
;
|
||||
; PERFORM MINIMAL Z180 SPECIFIC INITIALIZATION
|
||||
;
|
||||
#IFNDEF UNALOAD
|
||||
;
|
||||
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
|
||||
; SET BASE FOR CPU IO REGISTERS
|
||||
LD A,CPU_BASE
|
||||
OUT0 (CPU_ICR),A
|
||||
|
||||
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
|
||||
XOR A
|
||||
OUT0 (CPU_CCR),A
|
||||
OUT0 (CPU_CMR),A
|
||||
|
||||
; SET DEFAULT WAIT STATES
|
||||
LD A,$F0
|
||||
OUT0 (CPU_DCNTL),A
|
||||
|
||||
#IF (Z180_CLKDIV >= 1)
|
||||
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
|
||||
LD A,$80
|
||||
OUT0 (CPU_CCR),A
|
||||
#ENDIF
|
||||
|
||||
#IF (Z180_CLKDIV >= 2)
|
||||
; SET CPU MULTIPLIER TO 1 RESULTINT IN XTAL * 2 SPEED
|
||||
LD A,$80
|
||||
OUT0 (CPU_CMR),A
|
||||
#ENDIF
|
||||
; SET DESIRED WAIT STATES
|
||||
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
|
||||
OUT0 (CPU_DCNTL),A
|
||||
|
||||
; MMU SETUP
|
||||
LD A,$80
|
||||
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
|
||||
XOR A
|
||||
OUT0 (CPU_BBR),A ; BANK BASE = 0
|
||||
LD A,(RAMSIZE + RAMBIAS - 64) >> 2
|
||||
OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
|
||||
#ENDIF
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
|
||||
;
|
||||
CALL XIO_INIT ; INIT SERIAL PORT
|
||||
LD HL,STR_BOOT ; POINT TO MESSAGE
|
||||
CALL XIO_OUTS ; SAY HELLO
|
||||
;
|
||||
; COPY OURSELVES AND LOADER TO HI RAM FOR PHASE 2
|
||||
;
|
||||
LD HL,0 ; COPY FROM START OF ROM IMAGE
|
||||
LD DE,$8000 ; TO HIMEM $8000
|
||||
LD BC,$1000 ; COPY 4K
|
||||
LDIR
|
||||
;
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
|
||||
;
|
||||
STR_BOOT .DB "RomWBW$"
|
||||
;
|
||||
; IMBED DIRECT SERIAL I/O ROUTINES
|
||||
;
|
||||
#INCLUDE "xio.asm"
|
||||
;
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
|
||||
;
|
||||
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
|
||||
;
|
||||
PHASE2:
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
; SWITCH TO EXEC PAGE IN BANKED MEMORY
|
||||
LD BC,$01FB ; SET BANK
|
||||
LD DE,$800E ; EXEC_PAGE (SEE PAGES.INC)
|
||||
CALL $FFFD ; DO IT
|
||||
;
|
||||
; MARK PROGRESS VIA UNA CHAR OUTPUT
|
||||
LD BC,$0012 ; UNA UNIT = 0, FUNC WRITE CHAR
|
||||
LD E,'.' ; DOT
|
||||
CALL $FFFD ; CALL UNA ENTRY DIRECTLY, RST 08 NOT SETUP YET
|
||||
;
|
||||
; INSTALL UNA INVOCATION VECTOR FOR RST 08
|
||||
LD A,$C3 ; JP INSTRUCTION
|
||||
LD (8),A ; STORE AT 0x0008
|
||||
LD HL,($FFFE) ; UNA ENTRY VECTOR
|
||||
LD (9),HL ; STORE AT 0x0009
|
||||
;
|
||||
LD BC,$0012 ; UNA UNIT = 0, FUNC = WRITE CHAR
|
||||
LD E,'.' ; DOT
|
||||
RST 08 ; RST 08 IS NOW POSSIBLE
|
||||
|
||||
; IF RUNNING UNDER UNA, WE ARE DONE, PROCEED TO LOADER
|
||||
JP $8400 ; JUMP TO LOADER
|
||||
|
||||
#ELSE
|
||||
|
||||
;
|
||||
; COPY HBIOS IMAGE FROM ROM TO RAM
|
||||
;
|
||||
LD HL,0 ; HL = LOCATION IN LOMEM TO COPY FROM/TO
|
||||
LOOP:
|
||||
LD DE,$9000 ; DE = BUFFER ADDRESS
|
||||
LD BC,$1000 ; BYTES TO COPY (4K CHUNKS)
|
||||
PUSH BC ; SAVE COPY SIZE
|
||||
PUSH DE ; SAVE COPY DEST
|
||||
PUSH HL ; SAVE COPY SOURCE
|
||||
LD A,BID_HBIMG ; ROM PAGE WITH HBIOS IMAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
LDIR ; COPY ROM -> BUFFER
|
||||
POP DE ; RESTORE SOURCE AS NEW DESTINATION
|
||||
POP HL ; RESTORE DESTINATION AS NEW SOURCE
|
||||
POP BC ; RESTORE COPY SIZE
|
||||
LD A,BID_HB ; HBIOS RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
LDIR ; COPY BUFFER -> RAM
|
||||
EX DE,HL ; GET LOMEM POINTER BACK TO HL
|
||||
LD A,H ; HIGH BYTE OF POINTER TO A
|
||||
CP $80 ; HIGH BYTE WILL BE $80 WHEN WE ARE DONE
|
||||
JP NZ,LOOP ; IF NOT DONE, LOOP TO DO NEXT 4K CHUNK
|
||||
;
|
||||
LD A,BID_BOOT ; ROM PAGE WITH BOOT IMAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
; INITIALIZE HBIOS AND JUMP TO LOADER
|
||||
;
|
||||
; CALL HBIOS HARDWARE INITIALIZATION
|
||||
LD A,BID_HB ; HBIOS RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL $1000 ; CALL HBIOS INITIALIZATION
|
||||
;
|
||||
; CALL HBIOS PROXY INITIALIZATION
|
||||
LD A,BID_USR ; USER RAM PAGE
|
||||
CALL PGSEL ; SELECT IT
|
||||
CALL HBX_LOC ; CALL HBIOS PROXY INITIALIZATION
|
||||
;
|
||||
JP $8400 ; JUMP TO LOADER
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
|
||||
;
|
||||
#INCLUDE "memmgr.asm"
|
||||
|
||||
#ENDIF
|
||||
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; PAD OUT REMAINDER OF PAGE
|
||||
;
|
||||
.FILL $8200 - $,$FF ; PAD OUT REMAINDER OF PAGE
|
||||
;
|
||||
STACK .EQU $ ; STACK IN HIMEM SLACK SPACE
|
||||
;
|
||||
.END
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,19 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; APPLICATION LOADER (COM FILE)
|
||||
;
|
||||
; CREATES A STANDARD CP/M COM APPLICATION FILE TO LOAD ROMWBW
|
||||
; FROM A COMMAND PROMPT.
|
||||
;==================================================================================================
|
||||
;
|
||||
#define MODE LM_COM
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
#INCLUDE "hbios.exp"
|
||||
;
|
||||
.ORG $100
|
||||
JP START
|
||||
;
|
||||
#INCLUDE "loader.asm"
|
||||
;
|
||||
.END
|
||||
@@ -1,10 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; FILLER FOR HBIOS PROXY, JUST A 256 BYTE FILLER
|
||||
;==================================================================================================
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
.FILL HBX_SIZ,0FFH
|
||||
;
|
||||
.END
|
||||
@@ -1,12 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; HBIOS FILLER
|
||||
;==================================================================================================
|
||||
;
|
||||
; CREATES A CORRECTLY SIZED FILLER TO FILL SPACE BETWEEN END OF HBIOS
|
||||
; IMAGE AND END OF BANK ($8000)
|
||||
;
|
||||
#INCLUDE "hbios.exp"
|
||||
;
|
||||
.FILL $8000 - HB_END,$FF
|
||||
.END
|
||||
@@ -1,60 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; IMAGE LOADER
|
||||
;
|
||||
; CREATES A BINARY IMAGE THAT WILL LAUNCH ROMWBW ASSUMING IMAGE
|
||||
; HAS BEEN PRE-LOADED INTO THE USER BANK. INTENDED FOR USE WITH
|
||||
; UNA FATFS.
|
||||
;==================================================================================================
|
||||
;
|
||||
#define MODE LM_IMG
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
#INCLUDE "hbios.exp"
|
||||
;
|
||||
.ORG 0
|
||||
;
|
||||
;==================================================================================================
|
||||
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
|
||||
;==================================================================================================
|
||||
;
|
||||
.FILL (000H - $),0FFH ; RST 0
|
||||
JP START ; JUMP TO BOOT CODE
|
||||
.DW ROM_SIG
|
||||
.FILL (008H - $),0FFH ; RST 8
|
||||
RET
|
||||
.FILL (010H - $),0FFH ; RST 10
|
||||
RET
|
||||
.FILL (018H - $),0FFH ; RST 18
|
||||
RET
|
||||
.FILL (020H - $),0FFH ; RST 20
|
||||
RET
|
||||
.FILL (028H - $),0FFH ; RST 28
|
||||
RET
|
||||
.FILL (030H - $),0FFH ; RST 30
|
||||
RET
|
||||
.FILL (038H - $),0FFH ; INT
|
||||
RETI
|
||||
.FILL (066H - $),0FFH ; NMI
|
||||
RETN
|
||||
;
|
||||
.FILL (070H - $),0FFH ; SIG STARTS AT $80
|
||||
;
|
||||
ROM_SIG:
|
||||
.DB $76, $B5 ; 2 SIGNATURE BYTES
|
||||
.DB 1 ; STRUCTURE VERSION NUMBER
|
||||
.DB 7 ; ROM SIZE (IN MULTIPLES OF 4KB, MINUS ONE)
|
||||
.DW NAME ; POINTER TO HUMAN-READABLE ROM NAME
|
||||
.DW AUTH ; POINTER TO AUTHOR INITIALS
|
||||
.DW DESC ; POINTER TO LONGER DESCRIPTION OF ROM
|
||||
.DB 0, 0, 0, 0, 0, 0 ; RESERVED FOR FUTURE USE; MUST BE ZERO
|
||||
;
|
||||
NAME .DB "ROMWBW v", BIOSVER, ", ", TIMESTAMP, 0
|
||||
AUTH .DB "WBW",0
|
||||
DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2015, Wayne Warthen, GNU GPL v3", 0
|
||||
;
|
||||
.FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO
|
||||
;
|
||||
#INCLUDE "loader.asm"
|
||||
;
|
||||
.END
|
||||
@@ -1,24 +0,0 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; infolist.inc 6/ 7/2012 dwg - removed DSK_MAP pointer ;
|
||||
; infolist.inc 5/16/2012 dwg - BIOS information pointers ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; The putpose of this table is to provide pointers that can
|
||||
; be used by utility programs to access BIOS internals for
|
||||
; debugging and informative purposes. Any time the format
|
||||
; changes, the first word should be incremented to the Apps
|
||||
; can determine the lineage of a specific BIOS. This table
|
||||
; was created in support of the 2.0.0.0 banked BIOS.
|
||||
|
||||
INFOLIST:
|
||||
.DW 2 ; INFOLIST version 2 6/7/2012
|
||||
.DW STR_BANNER
|
||||
.DW STR_BUILD
|
||||
.DW STR_TIMESTAMP
|
||||
.DW DPB_MAP
|
||||
.DW DPH_MAP
|
||||
.DW CIO_MAP
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;
|
||||
; eof - infolist.inc ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;
|
||||
@@ -1,186 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; LOADER
|
||||
;==================================================================================================
|
||||
;
|
||||
P2LOC .EQU $F000 ; PHASE 2 RUN LOCATION
|
||||
;
|
||||
#IFDEF ROMLOAD
|
||||
CURBNK .EQU BID_BOOT
|
||||
#ELSE
|
||||
CURBNK .EQU BID_USR
|
||||
#ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; COLD START
|
||||
;==================================================================================================
|
||||
;
|
||||
START:
|
||||
DI ; NO INTERRUPTS
|
||||
IM 1 ; INTERRUPT MODE 1
|
||||
LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY
|
||||
;
|
||||
; HARDWARE BOOTSTRAP FOR Z180
|
||||
; FOR N8, ACR & RMAP ARE ASSUMED TO BE ALREADY SET OR THIS CODE
|
||||
; WOULD NOT BE EXECUTING
|
||||
;
|
||||
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
|
||||
; SET BASE FOR CPU IO REGISTERS
|
||||
LD A,Z180_BASE
|
||||
OUT0 (Z180_ICR),A
|
||||
|
||||
; DISABLE REFRESH
|
||||
XOR A
|
||||
OUT0 (Z180_RCR),A
|
||||
|
||||
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
|
||||
XOR A
|
||||
OUT0 (Z180_CCR),A
|
||||
OUT0 (Z180_CMR),A
|
||||
|
||||
; SET DEFAULT WAIT STATES
|
||||
LD A,$F0
|
||||
OUT0 (Z180_DCNTL),A
|
||||
|
||||
; MMU SETUP
|
||||
LD A,$80
|
||||
OUT0 (Z180_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
|
||||
#IFDEF ROMLOAD
|
||||
XOR A
|
||||
OUT0 (Z180_BBR),A ; BANK BASE = 0
|
||||
#ENDIF
|
||||
LD A,(RAMSIZE + RAMBIAS - 64) >> 2
|
||||
OUT0 (Z180_CBR),A ; COMMON BASE = LAST (TOP) BANK
|
||||
|
||||
#IF (Z180_CLKDIV >= 1)
|
||||
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
|
||||
LD A,$80
|
||||
OUT0 (Z180_CCR),A
|
||||
#ENDIF
|
||||
|
||||
#IF (Z180_CLKDIV >= 2)
|
||||
; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED
|
||||
LD A,$80
|
||||
OUT0 (Z180_CMR),A
|
||||
#ENDIF
|
||||
|
||||
; SET DESIRED WAIT STATES
|
||||
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
|
||||
OUT0 (Z180_DCNTL),A
|
||||
#ENDIF
|
||||
;
|
||||
; HARDWARE BOOTSTRAP FOR ZETA 2
|
||||
;
|
||||
#IF (PLATFORM == PLT_ZETA2)
|
||||
; SET PAGING REGISTERS
|
||||
#IFDEF ROMLOAD
|
||||
XOR A
|
||||
OUT (MPGSEL_0),A
|
||||
INC A
|
||||
OUT (MPGSEL_1),A
|
||||
#ENDIF
|
||||
LD A,62
|
||||
OUT (MPGSEL_2),A
|
||||
INC A
|
||||
OUT (MPGSEL_3),A
|
||||
; ENABLE PAGING
|
||||
LD A,1
|
||||
OUT (MPGENA),A
|
||||
#ENDIF
|
||||
;
|
||||
; COPY OURSELVES AND LOADER TO HI RAM FOR PHASE 2
|
||||
;
|
||||
LD HL,0 ; COPY FROM START OF ROM IMAGE
|
||||
LD DE,P2LOC ; TO HIMEM RUN LOCATION
|
||||
LD BC,LDR_END ; COPY FULL IMAGE
|
||||
LDIR
|
||||
JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY
|
||||
;
|
||||
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
|
||||
;
|
||||
.ORG $ + P2LOC ; WE ARE NOW EXECUTING IN UPPER MEMORY
|
||||
;
|
||||
PHASE2:
|
||||
;
|
||||
; INSTALL HBIOS PROXY IN UPPER MEMORY
|
||||
;
|
||||
|
||||
;#IFDEF ROMLOAD
|
||||
; LD A,BID_BIOSIMG ; HBIOS IMAGE ROM BANK
|
||||
; CALL BNKSEL ; SELECT IT
|
||||
;#ENDIF
|
||||
LD HL,HBX_IMG ; HL := SOURCE OF HBIOS PROXY IMAGE
|
||||
#IFNDEF ROMLOAD
|
||||
LD BC,LDR_END ; SIZE OF LOADER
|
||||
ADD HL,BC ; OFFSET SOURCE ADDRESS
|
||||
#ENDIF
|
||||
LD DE,HBX_LOC ; DE := DESTINATION TO INSTALL IT
|
||||
LD BC,HBX_SIZ ; SIZE
|
||||
LDIR ; DO THE COPY
|
||||
LD A,CURBNK ; BOOT/SETUP BANK
|
||||
LD (HB_CURBNK),A ; INIT CURRENT BANK
|
||||
|
||||
;#IFDEF ROMLOAD
|
||||
; CALL BNKSEL ; SELECT IT
|
||||
;#ENDIF
|
||||
|
||||
;
|
||||
; INSTALL HBIOS CODE BANK
|
||||
;
|
||||
;#IFDEF ROMLOAD
|
||||
; LD A,BID_BIOSIMG ; SOURCE BANK
|
||||
;#ELSE
|
||||
LD A,(HB_CURBNK) ; SOURCE BANK
|
||||
;#ENDIF
|
||||
LD (HB_SRCBNK),A ; SET IT
|
||||
LD A,BID_BIOS ; DESTINATION BANK
|
||||
LD (HB_DSTBNK),A ; SET IT
|
||||
LD HL,0 ; SOURCE ADDRESS IS ZERO
|
||||
#IFNDEF ROMLOAD
|
||||
LD BC,LDR_END ; SIZE OF LOADER
|
||||
ADD HL,BC ; OFFSET SOURCE ADDRESS
|
||||
#ENDIF
|
||||
LD DE,0 ; TARGET ADDRESS IS ZERO
|
||||
LD BC,HB_END ; COPY ALL OF HBIOS IMAGE
|
||||
CALL HB_BNKCPY ; DO IT
|
||||
;
|
||||
; INITIALIZE HBIOS
|
||||
;
|
||||
LD A,BID_BIOS ; HBIOS BANK
|
||||
LD HL,0 ; ADDRESS 0 IS HBIOS INIT ENTRY ADDRESS
|
||||
CALL HB_BNKCALL ; DO IT
|
||||
;
|
||||
; CHAIN TO OS LOADER
|
||||
;
|
||||
#IFDEF ROMLOAD
|
||||
; PERFORM BANK CALL TO OS IMAGES BANK
|
||||
LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK
|
||||
LD HL,0 ; ENTER AT ADDRESS 0
|
||||
CALL HB_BNKCALL ; GO THERE
|
||||
HALT ; WE SHOULD NEVER COME BACK!
|
||||
#ELSE
|
||||
; SLIDE OS IMAGES BLOB DOWN TO $0000
|
||||
LD HL,LDR_END ; SOURCE IS LOADER END
|
||||
LD BC,HB_END ; PLUS HBIOS IMAGE SIZE
|
||||
ADD HL,BC ; FINAL SOURCE ADDRESS
|
||||
LD DE,0 ; TARGET ADDRESS IS ZERO
|
||||
LD BC,BNKTOP ; MAX SIZE OF OS IMAGES
|
||||
LDIR ; DO IT
|
||||
; JUMP TO START
|
||||
JP 0 ; AND CHAIN
|
||||
#ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; MEMORY MANAGER
|
||||
;==================================================================================================
|
||||
;
|
||||
#IFDEF ROMLOAD
|
||||
#INCLUDE "memmgr.asm"
|
||||
#ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; CLEAN UP
|
||||
;==================================================================================================
|
||||
;
|
||||
.ORG $ - P2LOC ; BACK TO IMAGE-BASED ADDRESSING
|
||||
LDR_END .EQU $ ; MARK END OF LOADER
|
||||
@@ -1,289 +0,0 @@
|
||||
#
|
||||
# GCC based makefile
|
||||
#
|
||||
# 05/24/2012 2.3 wbw - changed to handle revised build parms
|
||||
#
|
||||
# 05/24/2012 2.0 wbw - changed to handle HBIOS
|
||||
#
|
||||
# 01/11/2011 1.4 wbw - added support for ZSDOS/ZDDOS/ZCPR
|
||||
#
|
||||
# 12/22/2011 1.3 wbw - removed all built-in config stuff, operation is now entirely
|
||||
# dependent on variables CONFIG, ROMSIZE, and CPU
|
||||
#
|
||||
# 12/02/2011 1.3 wbw - replaced makever functionality with built-in makefile stuff
|
||||
#
|
||||
# 11/29/2011 1.3 dwg - uses makever to generate stdincl.inc from the version.hpp file
|
||||
#
|
||||
# 11/19/2011 1.3 dwg - added n8vem_vdu to "usage" and "all" rules
|
||||
# enhanced clean to get files in $(OUTDIR)
|
||||
# added custom to "all" rule
|
||||
|
||||
#
|
||||
# The operation of this makefile is entirely dependent on the setting
|
||||
# of five variables: PLATFORM, CONFIG, ROMSIZE, SYS, and optionally ROMNAME:
|
||||
#
|
||||
# PLATFORM specifies the base hardware platform you are targeting
|
||||
# and must be one of N8VEM, ZETA, N8, S2I, or S100
|
||||
#
|
||||
# CONFIG determines which configuration to build which means that
|
||||
# it will determine the config_xxxx_yyyy.asm config settings file to
|
||||
# include as well as the output file names. So, for example,
|
||||
# if PLATFORM is "n8vem" and CONFIG is "cvdu", the config_N8VEM_cvdu.asm
|
||||
# file will be used for BIOS configuration settings and the output
|
||||
# files will be N8VEM_cvdu.rom, N8VEM_cvdu.sys, and N8VEM_cvdu.com.
|
||||
#
|
||||
# ROMSIZE specifies the size of the ROM image to be produced and
|
||||
# currently must be either "1024" for a 1MB ROM or "512" for a
|
||||
# 512KB ROM.
|
||||
#
|
||||
# SYS specifies the system variant to build in. CPM will
|
||||
# build traditional CP/M. ZSYS will build ZSystem which
|
||||
# currently means ZSDOS 1.2 & ZCPR 1.0
|
||||
#
|
||||
# ROMNAME names the output file. It defaults to
|
||||
# CONFIG. The output of the build will be:
|
||||
# <ROMNAME>.rom, <ROMNAME>.sys, and <ROMNAME>.com.
|
||||
#
|
||||
# These variables can be passed into the makefile by the command
|
||||
# line, hardcoded in this file, or set as environment variables
|
||||
# in the OS. To use a command line, use the following format:
|
||||
#
|
||||
# make PLATFORM=<platform> CONFIG=<config> ROMSIZE=<romsize> SYS=<sys>
|
||||
#
|
||||
# An example of this is:
|
||||
#
|
||||
# make PLATFORM=N8VEM CONFIG=cvdu ROMSIZE=512 SYS=CPM
|
||||
#
|
||||
# Alternatively, you can specify the variables by hardcoding them
|
||||
# in this file. To do so, uncomment the five lines after these
|
||||
# comments and change the values as desired.
|
||||
# If the variables are specified this way, you would then invoke
|
||||
# the make by simply using "make"
|
||||
#
|
||||
# If you want to set them as environment variables, you can
|
||||
# do this with commands like the following at an OS command
|
||||
# prompt or in a batch file:
|
||||
#
|
||||
# SET PLATFORM=N8VEM
|
||||
# SET CONFIG=cvdu
|
||||
# SET ROMSIZE=512
|
||||
# SET SYS=CPM
|
||||
# SET ROMNAME=n8vem
|
||||
#
|
||||
# Note: use "make clean" to delete temporary and output files
|
||||
#
|
||||
# A good idea is to do a clean with every build and this can be
|
||||
# accomplished on one command line doing something like this:
|
||||
#
|
||||
# make clean all PLATFORM=N8VEM CONFIG=std ROMSIZE=512 SYS=CPM
|
||||
#
|
||||
# or, if you are using hard coded variables above:
|
||||
#
|
||||
# make clean all
|
||||
#
|
||||
# Uncomment and update values below to hardcode settings:
|
||||
#
|
||||
#PLATFORM := N8VEM
|
||||
#CONFIG := std
|
||||
#ROMSIZE := 512
|
||||
#SYS := CPM
|
||||
#ROMNAME := n8vem
|
||||
|
||||
ifeq "$(PLATFORM)" "N8"
|
||||
CPU := 180
|
||||
else
|
||||
CPU := 80
|
||||
endif
|
||||
|
||||
ifndef ROMNAME
|
||||
ROMNAME := $(PLATFORM)_$(CONFIG)
|
||||
endif
|
||||
|
||||
ifndef "windir"
|
||||
CPMTOOLSPATH := ../tools/cpmtools
|
||||
CPMCP := $(CPMTOOLSPATH)/cpmcp.exe
|
||||
else
|
||||
CPMCP := /usr/bin/cpmcp
|
||||
endif
|
||||
|
||||
ROMDSKFILES := ../RomDsk/$(SYS)_$(ROMSIZE)KB/*.* ../RomDsk/cfg_$(PLATFORM)_$(CONFIG)/*.* ../Apps/Output/*.*
|
||||
|
||||
ifeq "$(SYS)" "CPM"
|
||||
DOSBIN := bdosb01.bin
|
||||
CPBIN := ccpb03.bin
|
||||
else
|
||||
DOSBIN := zsdos.bin
|
||||
CPBIN := zcprw.bin
|
||||
endif
|
||||
|
||||
OUTDIR := ../Output
|
||||
|
||||
ifndef "windir"
|
||||
TASMPATH := ../tools/tasm32
|
||||
TASM := $(TASMPATH)/tasm.exe
|
||||
TASMTABS := $(TASMPATH)
|
||||
else
|
||||
TASM := /usr/local/bin/tasm
|
||||
TASMTABS := /usr/local/lib
|
||||
endif
|
||||
export TASMTABS
|
||||
|
||||
ASMOPT80 := -t$(CPU) -g3
|
||||
ASMOPT85 := -t85 -g3
|
||||
|
||||
ASM80 := $(TASM) $(ASMOPT80)
|
||||
ASM85 := $(TASM) $(ASMOPT85)
|
||||
ASMIMG := $(TASM) $(ASMOPT80) -b -fE5
|
||||
|
||||
NULL :=
|
||||
SPACE := ${NULL} ${NULL}
|
||||
|
||||
%.bin: %.asm
|
||||
$(ASM80) $< $@
|
||||
|
||||
%.com: %.asm
|
||||
$(ASM80) $< $@
|
||||
|
||||
%.img: %.asm
|
||||
$(ASMIMG) $< $@
|
||||
|
||||
%.exe: %.cpp
|
||||
$(CC) $< -o $@
|
||||
|
||||
ifneq ($(MAKECMDGOALS),clean)
|
||||
ifeq "$(and $(PLATFORM) $(CONFIG), $(ROMSIZE), $(SYS), $(ROMNAME))" ""
|
||||
$(error Usage: make PLATFORM=[N8VEM|ZETA|N8|S2I|S100] CONFIG=<config> ROMSIZE=[512|1024] SYS=[CPM|ZSYS] [ROMNAME=<romname>])
|
||||
endif
|
||||
endif
|
||||
|
||||
all: $(OUTDIR)/$(ROMNAME).rom $(OUTDIR)/$(ROMNAME).sys $(OUTDIR)/$(ROMNAME).com
|
||||
|
||||
ifndef "windir"
|
||||
build.inc:
|
||||
echo ; >$@
|
||||
echo ; RomWBW Configured for $(PLATFORM) $(CONFIG), %date:~4,10% %time% >>$@
|
||||
echo ; >>$@
|
||||
echo #DEFINE TIMESTAMP "%date:~4,10%" >>$@
|
||||
echo ; >>$@
|
||||
echo ; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS >>$@
|
||||
echo ; >>$@
|
||||
echo ROMSIZE .EQU $(ROMSIZE) >>$@
|
||||
echo PLATFORM .EQU PLT_$(PLATFORM) >>$@
|
||||
echo ; >>$@
|
||||
echo #IF (PLATFORM == PLT_S100) >>$@
|
||||
echo #INCLUDE "std-s100.inc" >>$@
|
||||
echo #ELSE >>$@
|
||||
echo #INCLUDE "std-n8vem.inc" >>$@
|
||||
echo #ENDIF >>$@
|
||||
echo ; >>$@
|
||||
echo #INCLUDE "config_$(PLATFORM)_$(CONFIG).asm" >>$@
|
||||
echo ; >>$@
|
||||
else
|
||||
echo ';' >$@
|
||||
echo -n '; RomWBW Configured for '$(CONFIG)'' >>$@
|
||||
date >> $@
|
||||
echo ';' >>$@
|
||||
echo -n '#DEFINE TIMESTAMP "' >>$@
|
||||
date '+%Y %m %d %H%M"' >>$@
|
||||
echo ';' >>$@
|
||||
echo '; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS' >>$@
|
||||
echo ';' >>$@
|
||||
echo 'ROMSIZE .EQU '$(ROMSIZE)'' >>$@
|
||||
echo 'PLATFORM .EQU PLT_'$(PLATFORM)'' >>$@
|
||||
|
||||
echo '#IF (PLATFORM == PLT_S100)' >>$@
|
||||
echo ' #INCLUDE "std-s100.inc"' >>$@
|
||||
echo '#ELSE' >>$@
|
||||
echo ' #INCLUDE "std-n8vem.inc"' >>$@
|
||||
echo '#ENDIF' >>$@
|
||||
echo ';' >>$@
|
||||
echo '#INCLUDE "config_'$(PLATFORM)'_'$(CONFIG)'.asm"' >>$@
|
||||
echo ';' >>$@
|
||||
endif
|
||||
|
||||
bootrom.bin : bootrom.asm std.asm build.inc ver.inc
|
||||
$(TASM) $(ASMOPT80) $< $@
|
||||
|
||||
bootapp.bin : bootapp.asm std.asm build.inc ver.inc
|
||||
$(TASM) $(ASMOPT80) $< $@
|
||||
|
||||
pgzero.bin : pgzero.asm std.asm build.inc ver.inc
|
||||
$(TASM) $(ASMOPT80) $< $@
|
||||
|
||||
zcprw.bin : zcprw.asm zcpr.asm
|
||||
$(TASM) $(ASMOPT85) $< $@
|
||||
|
||||
zsdos.bin : zsdos.asm zsdos.lib zsdos-gp.z80
|
||||
$(TASM) $(ASMOPT80) $< $@
|
||||
|
||||
cbios.bin: cbios.asm fd_dph.asm ide_dph.asm ppide_dph.asm sd_dph.asm prp_dph.asm ppp_dph.asm std.asm ver.inc build.inc
|
||||
$(TASM) $(ASMOPT80) -dBLD_SYS=SYS_$(SYS) $< $@
|
||||
|
||||
dbgmon.bin: dbgmon.asm std.asm ver.inc build.inc
|
||||
|
||||
syscfg.bin: syscfg.asm std.asm build.inc ver.inc
|
||||
|
||||
os.bin: $(CPBIN) $(DOSBIN) cbios.bin
|
||||
ifndef "windir"
|
||||
copy /B $(subst $(SPACE),+,$(^)) "$@"
|
||||
else
|
||||
cat $(CPBIN) $(DOSBIN) cbios.bin >>$@
|
||||
endif
|
||||
|
||||
rom0.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin romfill.bin dbgmon.bin os.bin hbfill.bin
|
||||
ifndef "windir"
|
||||
copy /B $(subst $(SPACE),+,$(^)) "$@"
|
||||
else
|
||||
cat pgzero.bin bootrom.bin syscfg.bin loader.bin romfill.bin dbgmon.bin os.bin hbfill.bin >>$@
|
||||
endif
|
||||
|
||||
rom1.bin: pgzero.bin bootrom.bin syscfg.bin loader.bin hbios.bin
|
||||
ifndef "windir"
|
||||
copy /B $(subst $(SPACE),+,$(^)) "$@"
|
||||
else
|
||||
cat pgzero.bin bootrom.bin syscfg.bin loader.bin hbios.bin >>$@
|
||||
endif
|
||||
|
||||
$(OUTDIR)/$(ROMNAME).rom: rom0.bin rom1.bin $(ROMDISKFILES) $(OUTDIR)/$(ROMNAME).sys
|
||||
ifndef "windir"
|
||||
copy blank$(ROMSIZE)KB.dat RomDisk.tmp
|
||||
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp $(ROMDSKFILES) 0:
|
||||
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp ../Output/$(ROMNAME).sys 0:$(SYS).sys
|
||||
copy /B rom0.bin+rom1.bin+RomDisk.tmp "$@"
|
||||
else
|
||||
cp blank$(ROMSIZE)KB.dat RomDisk.tmp
|
||||
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp $(ROMDSKFILES) 0:
|
||||
$(CPMCP) -f rom$(ROMSIZE)KB RomDisk.tmp ../Output/$(ROMNAME).sys 0:$(SYS).sys
|
||||
cat rom0.bin rom1.bin RomDisk.tmp >>$@
|
||||
endif
|
||||
|
||||
$(OUTDIR)/$(ROMNAME).com: bootapp.bin syscfg.bin loader.bin hbios.bin dbgmon.bin os.bin
|
||||
ifndef "windir"
|
||||
copy /B $(subst $(SPACE),+,$(^)) "$@"
|
||||
else
|
||||
cat bootapp.bin syscfg.bin loader.bin hbios.bin dbgmon.bin os.bin >>$@
|
||||
endif
|
||||
|
||||
$(OUTDIR)/$(ROMNAME).sys: prefix.bin os.bin
|
||||
ifndef "windir"
|
||||
copy /B $(subst $(SPACE),+,$(^)) "$@"
|
||||
else
|
||||
cat prefix.bin os.bin >>$@
|
||||
endif
|
||||
|
||||
clean:
|
||||
ifndef "windir"
|
||||
if exist *.bin del *.bin
|
||||
if exist *.com del *.com
|
||||
if exist *.img del *.img
|
||||
if exist *.rom del *.rom
|
||||
if exist *.lst del *.lst
|
||||
if exist *.exp del *.exp
|
||||
if exist *.tmp del *.tmp
|
||||
if exist build.inc del build.inc
|
||||
if exist "$(OUTDIR)/*.*" erase /Q "$(OUTDIR)/*.*"
|
||||
else
|
||||
rm -f *.bin *.com *.img *.rom *.lst *.exp *.tmp
|
||||
rm -f build.inc
|
||||
rm -f $(OUTDIR)/*.*
|
||||
endif
|
||||
@@ -1,78 +0,0 @@
|
||||
;==================================================================================================
|
||||
; MEMORY BANK MANAGEMENT
|
||||
;==================================================================================================
|
||||
;
|
||||
; SELECT THE REQUESTED 32K BANK OF RAM/ROM INTO THE LOWER 32K OF CPU ADDRESS SPACE.
|
||||
; BANK INDEX IN A, BIT 7 IS SET TO TO SELECT RAM, OTHERWISE ROM
|
||||
; MUST BE INVOKED FROM HIGH 32K AND STACK MUST BE IN HIGH 32K
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
|
||||
#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_ZETA))
|
||||
BNKSEL:
|
||||
OUT (MPCL_ROM),A ; SET ROM PAGE SELECTOR
|
||||
OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR
|
||||
RET
|
||||
#ENDIF
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; ZETA SBC V2 USES 16K PAGES. ANY PAGE CAN BE MAPPED TO ONE OF FOUR BANKS:
|
||||
; BANK_0: 0K - 16K; BANK_1: 16K - 32K; BANK_2: 32K - 48K; BANK_3: 48K - 64K
|
||||
; THIS BNKSEL EMULATES SBC / ZETA BEHAVIOR BY SETTING BANK_0 and BANK_1 TO
|
||||
; TWO CONSECUTIVE PAGES
|
||||
|
||||
#IF (PLATFORM == PLT_ZETA2)
|
||||
BNKSEL:
|
||||
BIT 7,A ; BIT 7 SET REQUESTS RAM PAGE
|
||||
JR Z,BNKSEL_ROM ; NOT SET, SELECT ROM PAGE
|
||||
RES 7,A ; RAM PAGE REQUESTED: CLEAR ROM BIT
|
||||
ADD A,16 ; ADD 16 x 32K - RAM STARTS FROM 512K
|
||||
;
|
||||
BNKSEL_ROM:
|
||||
RLCA ; TIMES 2 - GET 16K PAGE INSTEAD OF 32K
|
||||
OUT (MPGSEL_0),A ; BANK_0: 0K - 16K
|
||||
INC A ;
|
||||
OUT (MPGSEL_1),A ; BANK_1: 16K - 32K
|
||||
RET
|
||||
#ENDIF
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
BNKSEL:
|
||||
BIT 7,A ; TEST BIT 7 FOR RAM VS. ROM
|
||||
JR Z,BNKSEL_ROM ; IF NOT SET, SELECT ROM PAGE
|
||||
;
|
||||
BNKSEL_RAM: ; SELECT RAM PAGE
|
||||
RES 7,A ; CLEAR BIT 7 FROM ABOVE
|
||||
RLCA ; SCALE SELECTOR TO
|
||||
RLCA ; ... GO FROM Z180 4K PAGE SIZE
|
||||
RLCA ; ... TO DESIRED 32K PAGE SIZE
|
||||
OUT0 (Z180_BBR),A ; WRITE TO BANK BASE
|
||||
LD A,N8_DEFACR | 80H ; SELECT RAM BY SETTING BIT 7
|
||||
OUT0 (N8_ACR),A ; ... IN N8 ACR REGISTER
|
||||
RET ; DONE
|
||||
;
|
||||
BNKSEL_ROM: ; SELECT ROM PAGE
|
||||
OUT0 (N8_RMAP),A ; BANK INDEX TO N8 RMAP REGISTER
|
||||
XOR A ; ZERO ACCUM
|
||||
OUT0 (Z180_BBR),A ; ZERO BANK BASE
|
||||
LD A,N8_DEFACR ; SELECT ROM BY CLEARING BIT 7
|
||||
OUT0 (N8_ACR),A ; ... IN N8 ACR REGISTER
|
||||
RET ; DONE
|
||||
;
|
||||
#ENDIF
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
#IF (PLATFORM == PLT_MK4)
|
||||
BNKSEL:
|
||||
RLCA ; RAM FLAG TO CARRY FLAG AND BIT 0
|
||||
JR NC,BNKSEL_ROM ; IF NC, WANT ROM PAGE, SKIP AHEAD
|
||||
XOR %00100001 ; SET BIT FOR HI 512K, CLR BIT 0
|
||||
BNKSEL_ROM:
|
||||
RLCA ; CONTINUE SHIFTING TO SCALE SELECTOR
|
||||
RLCA ; FOR Z180 4K PAGE -> DESIRED 32K PAGE
|
||||
OUT0 (Z180_BBR),A ; WRITE TO BANK BASE
|
||||
RET ; DONE
|
||||
#ENDIF
|
||||
@@ -1,121 +0,0 @@
|
||||
;___BOOTAPP____________________________________________________________________________________________________________
|
||||
;
|
||||
; APPLICATION BOOT MANAGER
|
||||
;
|
||||
; USED TO LOAD AN APPLICATION IMAGE BASED COPY OF THE SYSTEM
|
||||
; REFER TO BANKEDBIOS.TXT FOR MORE INFORMATION.
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; MEMORY MAP
|
||||
;
|
||||
; LOC LEN DESC
|
||||
; ----- ----- --------------
|
||||
; $0000 $1000 BOOTAPP CODE
|
||||
; $1000 $1000 DBGMON IMAGE
|
||||
; $2000 $3000 CPM IMAGE
|
||||
; $5000 $3000 ZSYS IMAGE
|
||||
; $8000 *** END ***
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
.ORG $100
|
||||
;
|
||||
DI ; NO INTERRUPTS
|
||||
IM 1 ; INTERRUPT MODE 1
|
||||
LD SP,STACK ; PRIVATE STACK
|
||||
;
|
||||
; BANNER
|
||||
CALL NEWLINE
|
||||
LD DE,STR_BANNER
|
||||
CALL WRITESTR
|
||||
;
|
||||
MENU:
|
||||
CALL NEWLINE
|
||||
CALL NEWLINE
|
||||
LD DE,STR_BOOTMENU
|
||||
CALL WRITESTR
|
||||
CALL CINUC
|
||||
CP 'M' ; MONITOR
|
||||
JP Z,GOMON
|
||||
CP 'C' ; CP/M BOOT FROM ROM
|
||||
JP Z,GOCPM
|
||||
CP 'Z' ; ZSYSTEM BOOT FROM ROM
|
||||
JP Z,GOZSYS
|
||||
;
|
||||
LD DE,STR_INVALID
|
||||
CALL WRITESTR
|
||||
JR MENU
|
||||
;
|
||||
GOMON:
|
||||
LD DE,STR_BOOTMON
|
||||
CALL WRITESTR
|
||||
LD HL,$1000
|
||||
LD DE,$C000
|
||||
LD BC,$1000
|
||||
LDIR
|
||||
JP MON_SERIAL
|
||||
;
|
||||
GOCPM:
|
||||
LD DE,STR_BOOTCPM
|
||||
CALL WRITESTR
|
||||
LD HL,$2000
|
||||
LD DE,CPM_LOC
|
||||
LD BC,$3000 - $400
|
||||
LDIR
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ELSE
|
||||
LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ENDIF
|
||||
JP CPM_ENT
|
||||
;
|
||||
GOZSYS:
|
||||
LD DE,STR_BOOTZSYS
|
||||
CALL WRITESTR
|
||||
LD HL,$5000
|
||||
LD DE,CPM_LOC
|
||||
LD BC,$3000 - $400
|
||||
LDIR
|
||||
#IF (PLATFORM == PLT_UNA)
|
||||
LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ELSE
|
||||
LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE)
|
||||
#ENDIF
|
||||
JP CPM_ENT
|
||||
;
|
||||
; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE
|
||||
;
|
||||
CINUC:
|
||||
CALL CIN
|
||||
AND 7FH ; STRIP HI BIT
|
||||
CP 'A' ; KEEP NUMBERS, CONTROLS
|
||||
RET C ; AND UPPER CASE
|
||||
CP 7BH ; SEE IF NOT LOWER CASE
|
||||
RET NC
|
||||
AND 5FH ; MAKE UPPER CASE
|
||||
RET
|
||||
;
|
||||
#DEFINE CIOMODE_HBIOS
|
||||
#INCLUDE "util.asm"
|
||||
;
|
||||
; STRINGS
|
||||
;_____________________________________________________________________________________________________________________________
|
||||
;
|
||||
STR_BOOTMON .DB "START MONITOR\r\n$"
|
||||
STR_BOOTCPM .DB "BOOT CPM FROM ROM\r\n$"
|
||||
STR_BOOTZSYS .DB "BOOT ZSYSTEM FROM ROM\r\n$"
|
||||
STR_INVALID .DB "INVALID SELECTION\r\n$"
|
||||
;
|
||||
STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$"
|
||||
STR_BOOTMENU .DB "\r\nBoot: (C)PM, (Z)System, (M)onitor,\r\n"
|
||||
.DB " (L)ist devices, or Device ID ===> $"
|
||||
;
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; PAD OUT REMAINDER
|
||||
;
|
||||
.FILL $1000 - $,$FF ; PAD OUT REMAINDER
|
||||
;
|
||||
STACK .EQU $ ; STACK IN SLACK SPACE
|
||||
;
|
||||
.END
|
||||
@@ -1,47 +0,0 @@
|
||||
;___PGZERO_____________________________________________________________________________________________________________
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
|
||||
.ORG 0000H
|
||||
;
|
||||
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
|
||||
;
|
||||
.FILL (000H - $),0FFH ; RST 0
|
||||
JP 0100H ; JUMP TO BOOT CODE
|
||||
.FILL (004H - $),0FFH ; FILL TO START OF SIG PTR
|
||||
.DW ROM_SIG
|
||||
.FILL (008H - $),0FFH ; RST 8
|
||||
RET
|
||||
.FILL (010H - $),0FFH ; RST 10
|
||||
RET
|
||||
.FILL (018H - $),0FFH ; RST 18
|
||||
RET
|
||||
.FILL (020H - $),0FFH ; RST 20
|
||||
RET
|
||||
.FILL (028H - $),0FFH ; RST 28
|
||||
RET
|
||||
.FILL (030H - $),0FFH ; RST 30
|
||||
RET
|
||||
.FILL (038H - $),0FFH ; INT
|
||||
RETI
|
||||
.FILL (066H - $),0FFH ; NMI
|
||||
RETN
|
||||
;
|
||||
.FILL (070H - $),0FFH ; SIG STARTS AT $80
|
||||
;
|
||||
ROM_SIG:
|
||||
.DB $76, $B5 ; 2 SIGNATURE BYTES
|
||||
.DB 1 ; STRUCTURE VERSION NUMBER
|
||||
.DB 7 ; ROM SIZE (IN MULTIPLES OF 4KB, MINUS ONE)
|
||||
.DW NAME ; POINTER TO HUMAN-READABLE ROM NAME
|
||||
.DW AUTH ; POINTER TO AUTHOR INITIALS
|
||||
.DW DESC ; POINTER TO LONGER DESCRIPTION OF ROM
|
||||
.DB 0, 0, 0, 0, 0, 0 ; RESERVED FOR FUTURE USE; MUST BE ZERO
|
||||
;
|
||||
NAME .DB "ROMWBW v", BIOSVER, ", ", BIOSBLD, ", ", TIMESTAMP, 0
|
||||
AUTH .DB "WBW",0
|
||||
DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2014, Wayne Warthen, GNU GPL v3", 0
|
||||
.FILL (100H - $),0FFH
|
||||
;
|
||||
.END
|
||||
@@ -1,112 +0,0 @@
|
||||
;___ROM0_______________________________________________________________________________________________________________
|
||||
;
|
||||
; HARDWARE BOOTSTRAP
|
||||
;
|
||||
; TEMPORARY HARDWARE BOOTSTRAP TO USE UNTIL JOHN COFFMAN'S
|
||||
; VERSION IS READY.
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
.ORG $0000
|
||||
;
|
||||
DI ; NO INTERRUPTS
|
||||
IM 1 ; INTERRUPT MODE 1
|
||||
LD SP,$HBX_LOC ; START WITH SP BELOW HBIOS PROXY LOCATION
|
||||
;
|
||||
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
|
||||
; SET BASE FOR CPU IO REGISTERS
|
||||
LD A,CPU_BASE
|
||||
OUT0 (CPU_ICR),A
|
||||
|
||||
; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2)
|
||||
XOR A
|
||||
OUT0 (CPU_CCR),A
|
||||
OUT0 (CPU_CMR),A
|
||||
|
||||
; SET DEFAULT WAIT STATES
|
||||
LD A,$F0
|
||||
OUT0 (CPU_DCNTL),A
|
||||
|
||||
#IF (Z180_CLKDIV >= 1)
|
||||
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
|
||||
LD A,$80
|
||||
OUT0 (CPU_CCR),A
|
||||
#ENDIF
|
||||
|
||||
#IF (Z180_CLKDIV >= 2)
|
||||
; SET CPU MULTIPLIER TO 1 RESULTINT IN XTAL * 2 SPEED
|
||||
LD A,$80
|
||||
OUT0 (CPU_CMR),A
|
||||
#ENDIF
|
||||
; SET DESIRED WAIT STATES
|
||||
LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4)
|
||||
OUT0 (CPU_DCNTL),A
|
||||
|
||||
; MMU SETUP
|
||||
LD A,$80
|
||||
OUT0 (CPU_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG
|
||||
XOR A
|
||||
OUT0 (CPU_BBR),A ; BANK BASE = 0
|
||||
LD A,(RAMSIZE + RAMBIAS - 64) >> 2
|
||||
OUT0 (CPU_CBR),A ; COMMON BASE = LAST (TOP) BANK
|
||||
#ENDIF
|
||||
;
|
||||
; EMIT FIRST SIGN OF LIFE TO SERIAL PORT
|
||||
;
|
||||
CALL XIO_INIT ; INIT SERIAL PORT
|
||||
LD HL,STR_BOOT ; POINT TO MESSAGE
|
||||
CALL XIO_OUTS ; SAY HELLO
|
||||
;
|
||||
; COPY OURSELF TO HIRAM
|
||||
;
|
||||
; NOTE: STACK IS WIPED OUT, STACK IS ASSUMED TO BE EMPTY HERE!!!!
|
||||
;
|
||||
LD HL,$0000 ; COPY MEMORY FROM LOMEM (0000H)
|
||||
LD DE,$8000 ; TO HIMEM (8000H)
|
||||
LD BC,COD_SIZ ; COPY CODE
|
||||
LDIR
|
||||
;
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
;
|
||||
JP PHASE2 ; JUMP TO PHASE 2 IN UPPER MEMORY
|
||||
;
|
||||
STR_BOOT .DB PLATFORM_NAME, '$'
|
||||
;
|
||||
; IMBED DIRECT SERIAL I/O ROUTINES
|
||||
;
|
||||
#INCLUDE "xio.asm"
|
||||
;
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY
|
||||
;
|
||||
.ORG $ + $8000 ; WE ARE NOW EXECUTING IN UPPER MEMORY
|
||||
;
|
||||
PHASE2:
|
||||
CALL XIO_DOT ; MARK PROGRESS
|
||||
CALL XIO_CRLF ; FINISH LINE
|
||||
CALL XIO_CRLF ; A BLANK LINE FOR SPACING
|
||||
;
|
||||
; SWAP LOMEM TO BANK 1 AND CHAIN TO $0000
|
||||
;
|
||||
; LD A,1 ; SPECIFY PAGE 1
|
||||
; CALL ROMPG ; PUT ROM PAGE 1 IN LOW RAM
|
||||
LD A,BID_COMIMG ; CHAIN TO COMMON IMAGE IN ROM
|
||||
CALL PGSEL ; SELECT THE PAGE
|
||||
JP $0000 ; CHAIN EXECUTION TO IT
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; NOTE THAT MEMORY MANAGER CODE IS IN UPPER MEMORY!
|
||||
;
|
||||
#INCLUDE "memmgr.asm"
|
||||
;______________________________________________________________________________________________________________________
|
||||
;
|
||||
; PAD OUT REMAINDER OF PAGE
|
||||
;
|
||||
.ORG $ - $8000 ; ORG BACK TO LOWER MEMORY
|
||||
COD_SIZ .EQU $ ; SIZE OF CODE
|
||||
.FILL $8000 - $,$FF ; PAD OUT REMAINDER OF ROM SPACE
|
||||
;
|
||||
.END
|
||||
@@ -1,8 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; FILLER FOR ROM PAGE 0 (SEE BANKEDBIOS.TXT)
|
||||
;==================================================================================================
|
||||
;
|
||||
.FILL 3000H
|
||||
;
|
||||
.END
|
||||
@@ -1,57 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; SETUP
|
||||
;==================================================================================================
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
#INCLUDE "hbios.exp"
|
||||
;
|
||||
.ORG 0
|
||||
;
|
||||
;==================================================================================================
|
||||
; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE
|
||||
;==================================================================================================
|
||||
;
|
||||
.FILL (000H - $),0FFH ; RST 0
|
||||
JP START ; JUMP TO BOOT CODE
|
||||
.FILL (004H - $),0FFH ; FILL TO START OF SIG PTR
|
||||
.DW ROM_SIG
|
||||
.FILL (008H - $),0FFH ; RST 8
|
||||
RET
|
||||
.FILL (010H - $),0FFH ; RST 10
|
||||
RET
|
||||
.FILL (018H - $),0FFH ; RST 18
|
||||
RET
|
||||
.FILL (020H - $),0FFH ; RST 20
|
||||
RET
|
||||
.FILL (028H - $),0FFH ; RST 28
|
||||
RET
|
||||
.FILL (030H - $),0FFH ; RST 30
|
||||
RET
|
||||
.FILL (038H - $),0FFH ; INT
|
||||
RETI
|
||||
.FILL (066H - $),0FFH ; NMI
|
||||
RETN
|
||||
;
|
||||
.FILL (070H - $),0FFH ; SIG STARTS AT $80
|
||||
;
|
||||
ROM_SIG:
|
||||
.DB $76, $B5 ; 2 SIGNATURE BYTES
|
||||
.DB 1 ; STRUCTURE VERSION NUMBER
|
||||
.DB 7 ; ROM SIZE (IN MULTIPLES OF 4KB, MINUS ONE)
|
||||
.DW NAME ; POINTER TO HUMAN-READABLE ROM NAME
|
||||
.DW AUTH ; POINTER TO AUTHOR INITIALS
|
||||
.DW DESC ; POINTER TO LONGER DESCRIPTION OF ROM
|
||||
.DB 0, 0, 0, 0, 0, 0 ; RESERVED FOR FUTURE USE; MUST BE ZERO
|
||||
;
|
||||
NAME .DB "ROMWBW v", BIOSVER, ", ", TIMESTAMP, 0
|
||||
AUTH .DB "WBW",0
|
||||
DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2014, Wayne Warthen, GNU GPL v3", 0
|
||||
;
|
||||
.FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO
|
||||
;
|
||||
#define ROMLOAD
|
||||
#INCLUDE "loader.asm"
|
||||
;
|
||||
.FILL $8000 - $,$FF
|
||||
.END
|
||||
@@ -1,190 +0,0 @@
|
||||
;___SYSCFG_____________________________________________________________________________________________________________
|
||||
;
|
||||
; syscfg.asm 3/04/2012 2.0.0.0 dwg - added required configuration information
|
||||
;
|
||||
; INCLUDE STANDARD BIOS DEFINITIONS
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
#IF (PLATFORM != PLT_UNA)
|
||||
;
|
||||
.ORG 0 ; ALL ADDRESSES GENERATED WILL BE ZERO BASED
|
||||
;
|
||||
.DW $A33A ; MARKER TO VERIFY START OF CONFIG DATA
|
||||
;
|
||||
; Reserved for Configuration Information
|
||||
;
|
||||
.DW SC_CONFIG ; OFFSET OF CONFIG DATA
|
||||
.DW SC_TIMESTAMP ; OFFSET OF TIMESTAMP STRING
|
||||
.DW SC_BUILD ; OFFSET OF VARIANT STRING
|
||||
;
|
||||
; BIOS configuration data
|
||||
;
|
||||
SC_CONFIG:
|
||||
;
|
||||
; BIOS REVISION
|
||||
;
|
||||
.DB RMJ, RMN ; MAJOR, MINOR
|
||||
.DB RUP, RTP ; UPDATE, PATCH
|
||||
.DW REVISION ; SVN REVISION
|
||||
;
|
||||
; LOADER DATA
|
||||
;
|
||||
; THIS AREA IS FOR NOTES LEFT BY THE LOADER FROM WHEN THE CCP/BDOS/BIOS WERE
|
||||
; PLACED IN MEMORY AND KICKED OFF, THIS ALLOWS LOGGING ONTO THE BOOT DRIVE ON STARTUP
|
||||
;
|
||||
DISKBOOT .DB FALSE ; FALSE IF ROM BOOT, OTHERWISE TRUE
|
||||
BOOTDEVICE .DB 0 ; IF NOT ROM BOOT, HAS DEV/UNIT OF BOOT DEVICE
|
||||
BOOTLU .DW 0 ; LOGICAL UNIT ON DEV/UNIT FOR BOOT
|
||||
BOOTTIME .DB 0,0,0,0,0,0 ; SYSTEM STARTUP TIME (YY,MM,DD,HH,MM,SS)
|
||||
;
|
||||
; BUILD CONFIGURATION OPTIONS
|
||||
;
|
||||
.DB PLATFORM
|
||||
.DB CPUFREQ
|
||||
.DW RAMSIZE
|
||||
.DW ROMSIZE
|
||||
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
.DB Z180_CLKDIV
|
||||
.DB Z180_MEMWAIT
|
||||
.DB Z180_IOWAIT
|
||||
.DB Z180_CNTLB0
|
||||
.DB Z180_CNTLB1
|
||||
#ELSE
|
||||
.FILL 5,$FF
|
||||
#ENDIF
|
||||
|
||||
.DB BOOTTYPE
|
||||
.DB BOOT_TIMEOUT
|
||||
.DB BOOT_DEFAULT
|
||||
|
||||
.DB DEFCON
|
||||
.DB ALTCON
|
||||
.DW CONBAUD / 10
|
||||
.DB DEFVDA
|
||||
.DB DEFEMU
|
||||
.DB TERMTYPE
|
||||
|
||||
.DB DEFIOBYTE
|
||||
.DB ALTIOBYTE
|
||||
.DB WRTCACHE
|
||||
.DB DSKTRACE
|
||||
.DB 0 ; DSKMAP
|
||||
.DB CLRRAMDISK
|
||||
|
||||
.DB DSKYENABLE
|
||||
|
||||
.DB UARTENABLE
|
||||
.DB UARTCNT
|
||||
#IF (UARTENABLE & (UARTCNT >= 1))
|
||||
.DB UART0IOB
|
||||
.DW UART0BAUD / 10
|
||||
.DB UART0FIFO
|
||||
.DB UART0AFC
|
||||
#ELSE
|
||||
.FILL 5,$FF
|
||||
#ENDIF
|
||||
#IF (UARTENABLE & (UARTCNT >= 2))
|
||||
.DB UART1IOB
|
||||
.DW UART1BAUD / 10
|
||||
.DB UART1FIFO
|
||||
.DB UART1AFC
|
||||
#ELSE
|
||||
.FILL 5,$FF
|
||||
#ENDIF
|
||||
#IF (UARTENABLE & (UARTCNT >= 3))
|
||||
.DB UART2IOB
|
||||
.DW UART2BAUD / 10
|
||||
.DB UART2FIFO
|
||||
.DB UART2AFC
|
||||
#ELSE
|
||||
.FILL 5,$FF
|
||||
#ENDIF
|
||||
#IF (UARTENABLE & (UARTCNT >= 4))
|
||||
.DB UART3IOB
|
||||
.DW UART3BAUD / 10
|
||||
.DB UART3FIFO
|
||||
.DB UART3AFC
|
||||
#ELSE
|
||||
.FILL 5,$FF
|
||||
#ENDIF
|
||||
|
||||
.DB ASCIENABLE
|
||||
.DW ASCI0BAUD / 10
|
||||
.DW ASCI1BAUD / 10
|
||||
|
||||
.DB VDUENABLE
|
||||
|
||||
.DB CVDUENABLE
|
||||
|
||||
.DB UPD7220ENABLE
|
||||
|
||||
.DB N8VENABLE
|
||||
|
||||
.DB FDENABLE
|
||||
.DB FDMODE
|
||||
.DB FDTRACE
|
||||
.DB FDMEDIA
|
||||
.DB FDMEDIAALT
|
||||
.DB FDMAUTO
|
||||
|
||||
.DB IDEENABLE
|
||||
.DB IDEMODE
|
||||
.DB IDETRACE
|
||||
.DB IDE8BIT
|
||||
.DW IDECAPACITY
|
||||
|
||||
.DB PPIDEENABLE
|
||||
.DB PPIDEIOB
|
||||
.DB PPIDETRACE
|
||||
.DB PPIDE8BIT
|
||||
.DW PPIDECAPACITY
|
||||
.DB PPIDESLOW
|
||||
|
||||
.DB SDENABLE
|
||||
.DB SDMODE
|
||||
.DB SDTRACE
|
||||
.DW SDCAPACITY
|
||||
.DB SDCSIOFAST
|
||||
|
||||
.DB PRPENABLE
|
||||
.DB PRPSDENABLE
|
||||
.DB PRPSDTRACE
|
||||
.DW PRPSDCAPACITY
|
||||
.DB PRPCONENABLE
|
||||
|
||||
.DB PPPENABLE
|
||||
.DB PPPSDENABLE
|
||||
.DB PPPSDTRACE
|
||||
.DW PPPSDCAPACITY
|
||||
.DB PPPCONENABLE
|
||||
|
||||
.DB HDSKENABLE
|
||||
.DB HDSKTRACE
|
||||
.DW HDSKCAPACITY
|
||||
|
||||
.DB PPKENABLE
|
||||
.DB PPKTRACE
|
||||
|
||||
.DB KBDENABLE
|
||||
.DB KBDTRACE
|
||||
|
||||
.DB TTYENABLE
|
||||
|
||||
.DB ANSIENABLE
|
||||
.DB ANSITRACE
|
||||
|
||||
;
|
||||
; BUILD INFORMATION STRINGS
|
||||
;
|
||||
SC_TIMESTAMP .DB TIMESTAMP, "$"
|
||||
SC_BUILD .DB BIOSBLD, "$"
|
||||
;
|
||||
; .EXPORT DISKBOOT,BOOTDEVICE,BOOTLU
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
.FILL $200-$,$FF
|
||||
;
|
||||
.END
|
||||
@@ -1,15 +0,0 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; UBIOS - JUST FILLER TO REPLACE THE SPACE HBIOS WOULD NORMALLY USE
|
||||
;==================================================================================================
|
||||
;
|
||||
.ORG $1000
|
||||
;
|
||||
; INCLUDE GENERIC STUFF
|
||||
;
|
||||
#INCLUDE "std.asm"
|
||||
;
|
||||
.FILL (HBX_LOC - $8000 - $),$FF
|
||||
.ORG HBX_LOC
|
||||
.FILL HBX_END - $,$FF
|
||||
.END
|
||||
@@ -1,6 +1,6 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ROMWBW 2.X CONFIGURATION FOR N8 2312
|
||||
; ROMWBW 2.X CONFIGURATION FOR MARK IV
|
||||
;==================================================================================================
|
||||
;
|
||||
; BUILD CONFIGURATION OPTIONS
|
||||
@@ -27,6 +27,7 @@ VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
NECENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
TMSENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
VGAENABLE .EQU FALSE ; TRUE FOR VGA VIDEO/KBD SUPPORT
|
||||
;
|
||||
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
|
||||
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
|
||||
@@ -87,7 +88,7 @@ BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 0 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;
|
||||
; 18.432MHz OSC @ DOUBLE SPEED
|
||||
;
|
||||
@@ -1,6 +1,6 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ROMWBW 2.X CONFIGURATION FOR N8 2511
|
||||
; ROMWBW 2.X CONFIGURATION FOR N8
|
||||
;==================================================================================================
|
||||
;
|
||||
; BUILD CONFIGURATION OPTIONS
|
||||
@@ -27,6 +27,7 @@ VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
NECENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
TMSENABLE .EQU TRUE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
VGAENABLE .EQU FALSE ; TRUE FOR VGA VIDEO/KBD SUPPORT
|
||||
;
|
||||
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
|
||||
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
|
||||
@@ -53,7 +54,7 @@ PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENA
|
||||
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
;
|
||||
SDENABLE .EQU TRUE ; TRUE FOR SD SUPPORT
|
||||
SDMODE .EQU SDMODE_N8 ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
|
||||
SDMODE .EQU SDMODE_CSIO ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD
|
||||
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
SDCSIOFAST .EQU FALSE ; TABLE-DRIVEN BIT INVERTER
|
||||
;
|
||||
@@ -27,6 +27,7 @@ VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
NECENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
TMSENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
VGAENABLE .EQU FALSE ; TRUE FOR VGA VIDEO/KBD SUPPORT
|
||||
;
|
||||
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
|
||||
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
|
||||
@@ -27,6 +27,7 @@ VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
NECENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
TMSENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
VGAENABLE .EQU FALSE ; TRUE FOR VGA VIDEO/KBD SUPPORT
|
||||
;
|
||||
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
|
||||
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
|
||||
@@ -5,7 +5,7 @@
|
||||
;
|
||||
; BUILD CONFIGURATION OPTIONS
|
||||
;
|
||||
#INCLUDE "Config/plt_zeta.asm" ; USE ZETA CONFIG TO START
|
||||
#INCLUDE "cfg_zeta.asm" ; USE ZETA CONFIG TO START
|
||||
;
|
||||
INTTYPE .SET IT_CTC ; INTERRUPT HANDLING TYPE (IT_NONE, IT_SIMH, IT_Z180, IT_CTC, ...)
|
||||
;
|
||||
@@ -15,9 +15,13 @@
|
||||
; CVDU DRIVER - CONSTANTS
|
||||
;======================================================================
|
||||
;
|
||||
CVDU_STAT .EQU $E4 ; READ M8563 STATUS
|
||||
CVDU_REG .EQU $E4 ; SELECT M8563 REGISTER
|
||||
CVDU_DATA .EQU $EC ; READ/WRITE M8563 DATA
|
||||
CVDU_BASE .EQU $E0
|
||||
;
|
||||
CVDU_KBDDATA .EQU CVDU_BASE + $02 ; KBD CTLR DATA PORT
|
||||
CVDU_KBDST .EQU CVDU_BASE + $0A ; KBD CTLR STATUS/CMD PORT
|
||||
CVDU_STAT .EQU CVDU_BASE + $04 ; READ M8563 STATUS
|
||||
CVDU_REG .EQU CVDU_BASE + $04 ; SELECT M8563 REGISTER
|
||||
CVDU_DATA .EQU CVDU_BASE + $0C ; READ/WRITE M8563 DATA
|
||||
;
|
||||
CVDU_ROWS .EQU 25
|
||||
CVDU_COLS .EQU 80
|
||||
@@ -29,11 +33,21 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
||||
;======================================================================
|
||||
;
|
||||
CVDU_INIT:
|
||||
LD IY,CVDU_IDAT ; POINTER TO INSTANCE DATA
|
||||
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("CVDU: IO=0x$")
|
||||
LD A,CVDU_STAT
|
||||
CALL PRTHEXBYTE
|
||||
CALL CVDU_PROBE ; CHECK FOR HW PRESENCE
|
||||
JR Z,CVDU_INIT1 ; CONTINUE IF HW PRESENT
|
||||
;
|
||||
; HARDWARE NOT PRESENT
|
||||
PRTS(" NOT PRESENT$")
|
||||
OR $FF ; SIGNAL FAILURE
|
||||
RET
|
||||
;
|
||||
CVDU_INIT1:
|
||||
PRTS(" VDURAM=$")
|
||||
CALL CVDU_CRTINIT ; SETUP THE CVDU CHIP REGISTERS
|
||||
CALL PRTDEC
|
||||
@@ -43,14 +57,14 @@ CVDU_INIT:
|
||||
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
|
||||
|
||||
; ADD OURSELVES TO VDA DISPATCH TABLE
|
||||
LD B,0 ; PHYSICAL UNIT IS ZERO
|
||||
LD C,VDADEV_CVDU ; DEVICE TYPE
|
||||
LD DE,0 ; UNIT DATA BLOB ADDRESS
|
||||
LD BC,CVDU_DISPATCH ; BC := DISPATCH ADDRESS
|
||||
LD DE,CVDU_IDAT ; DE := VGA INSTANCE DATA PTR
|
||||
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
||||
|
||||
; INITIALIZE EMULATION
|
||||
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
|
||||
LD DE,CVDU_DISPATCH ; DE := DISPATCH ADDRESS
|
||||
LD HL,CVDU_IDAT ; HL := CVDU INSTANCE DATA PTR
|
||||
CALL TERM_ATTACH ; DO IT
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -266,6 +280,37 @@ CVDU_RDX:
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; PROBE FOR CVDU HARDWARE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
CVDU_PROBE:
|
||||
; WRITE TEST PATTERN $A5 $5A TO START OF VRAM
|
||||
LD HL,0 ; POINT TO FIRST BYTE OF VRAM
|
||||
LD C,18 ; ADDRESS REGISTER PAIR
|
||||
CALL CVDU_WRX ; UPDATE VRAM ADDRESS POINTER
|
||||
LD A,$A5 ; INITIAL TEST VALUE
|
||||
LD B,A ; SAVE IN B
|
||||
LD C,31 ; DATA REGISTER
|
||||
CALL CVDU_WR ; WRITE VALUE TO LOC 0, ADR PTR INCREMENTS
|
||||
CPL ; INVERT TEST VALUE
|
||||
CALL CVDU_WR ; WRITE INVERTED VALUE TO LOC 1
|
||||
|
||||
; READ TEST PATTERN BACK TO CONFIRM HARDWARE EXISTS
|
||||
LD HL,0 ; POINT TO FIRST BYTE OF VRAM
|
||||
LD C,18 ; ADDRESS REGISTER PAIR
|
||||
CALL CVDU_WRX ; UPDATE VRAM ADDRESS POINTER
|
||||
LD C,31 ; DATA REGISTER
|
||||
CALL CVDU_RD ; GET BYTE AT LOC 0, ADR PTR INCREMENTS
|
||||
CP B ; CHECK IT
|
||||
RET NZ ; ABORT IF BAD COMPARE
|
||||
CALL CVDU_RD ; GET BYTE AT LOC 1
|
||||
CPL ; INVERT IT
|
||||
CP B ; CHECK FOR INVERTED TEST VALUE
|
||||
RET ; RETURN WITH ZF SET BASED ON CP
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; MOS 8563 DISPLAY CONTROLLER CHIP INITIALIZATION
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
@@ -330,7 +375,7 @@ CVDU_LOADFONT:
|
||||
LD C,18 ; UPDATE ADDRESS REGISTER PAIR
|
||||
CALL CVDU_WRX ; DO IT
|
||||
|
||||
LD HL,CVDU_FONTDATA ; POINTER TO FONT DATA
|
||||
LD HL,FONT_HI ; POINTER TO FONT DATA
|
||||
LD DE,$2000 ; LENGTH OF FONT DATA
|
||||
LD C,31 ; DATA REGISTER
|
||||
CVDU_LOADFONT1:
|
||||
@@ -701,55 +746,92 @@ CVDU_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
; 35 $23 DEE7 DEE6 DEE5 DEE4 DEE3 DEE2 DEE1 DEE0 Display Enable End
|
||||
; 36 $24 -- -- -- -- DRR3 DRR2 DRR1 DRR0 DRAM Refresh Rate
|
||||
;
|
||||
; EGA 720X368 9-BIT CHARACTERS
|
||||
; - requires 16.257Mhz oscillator frequency
|
||||
;
|
||||
CVDU_INIT8563:
|
||||
.DB 97 ; 0: hor. total - 1
|
||||
.DB 80 ; 1: hor. displayed
|
||||
.DB 90 ; 2: hor. sync position 85
|
||||
#IF 1
|
||||
; EGA 720X368 9-BIT CHARACTERS
|
||||
; - requires 16.257Mhz oscillator frequency
|
||||
.DB $61 ; 0: hor. total - 1
|
||||
.DB $50 ; 1: hor. displayed
|
||||
.DB $5A ; 2: hor. sync position 85
|
||||
.DB $14 ; 3: vert/hor sync width or 0x4F -- MDA
|
||||
.DB 26 ; 4: vert total
|
||||
.DB 2 ; 5: vert total adjust
|
||||
.DB 25 ; 6: vert. displayed
|
||||
.DB 26 ; 7: vert. sync postition
|
||||
.DB 0 ; 8: interlace mode
|
||||
.DB 13 ; 9: char height - 1
|
||||
.DB (2<<5)+12 ; 10: cursor mode, start line
|
||||
.DB 13 ; 11: cursor end line
|
||||
.DB 0 ; 12: display start addr hi
|
||||
.DB 0 ; 13: display start addr lo
|
||||
.DB 7 ; 14: cursor position hi
|
||||
.DB 128 ; 15: cursor position lo
|
||||
.DB 1 ; 16: light pen vertical
|
||||
.DB 1 ; 17: light pen horizontal
|
||||
.DB 0 ; 18: update address hi
|
||||
.DB 0 ; 19: update address lo
|
||||
.DB 8 ; 20: attribute start addr hi
|
||||
.DB 0 ; 21: attribute start addr lo
|
||||
.DB $1A ; 4: vert total
|
||||
.DB $02 ; 5: vert total adjust
|
||||
.DB $19 ; 6: vert. displayed
|
||||
.DB $1A ; 7: vert. sync postition
|
||||
.DB $00 ; 8: interlace mode
|
||||
.DB $0D ; 9: char height - 1
|
||||
.DB $4C ; 10: cursor mode, start line
|
||||
.DB $0D ; 11: cursor end line
|
||||
.DB $00 ; 12: display start addr hi
|
||||
.DB $00 ; 13: display start addr lo
|
||||
.DB $00 ; 14: cursor position hi
|
||||
.DB $00 ; 15: cursor position lo
|
||||
.DB $00 ; 16: light pen vertical
|
||||
.DB $00 ; 17: light pen horizontal
|
||||
.DB $00 ; 18: update address hi
|
||||
.DB $00 ; 19: update address lo
|
||||
.DB $08 ; 20: attribute start addr hi
|
||||
.DB $00 ; 21: attribute start addr lo
|
||||
.DB $89 ; 22: char hor size cntrl 0x78
|
||||
.DB 13 ; 23: vert char pixel space - 1, increase to 13 with new font
|
||||
.DB 0 ; 24: copy/fill, reverse, blink rate; vertical scroll
|
||||
.DB $0D ; 23: vert char pixel space - 1, increase to 13 with new font
|
||||
.DB $00 ; 24: copy/fill, reverse, blink rate; vertical scroll
|
||||
.DB $48 ; 25: gr/txt, color/mono, pxl-rpt, dbl-wide; horiz. scroll
|
||||
.DB $E0 ; 26: fg/bg colors (monochr)
|
||||
.DB 0 ; 27: row addr display incr
|
||||
.DB $20+(1<<4) ; 28: char set addr; RAM size (64/16)
|
||||
.DB 13 ; 29: underline position
|
||||
.DB 0 ; 30: word count - 1
|
||||
.DB 0 ; 31: data
|
||||
.DB 0 ; 32: block copy src hi
|
||||
.DB 0 ; 33: block copy src lo
|
||||
.DB 6 ; 34: display enable begin
|
||||
.DB 88 ; 35: display enable end
|
||||
.DB 0 ; 36: refresh rate
|
||||
|
||||
; .DB 126,80,102,73,32,224,25,29,252,231,160,231,0,0,7,128
|
||||
; .DB 18,23,15,208,8,32,120,232,32,71,240,0,47,231,79,7,15,208,125,100,245
|
||||
.DB $00 ; 27: row addr display incr
|
||||
.DB $30 ; 28: char set addr; RAM size (64/16)
|
||||
.DB $0D ; 29: underline position
|
||||
.DB $00 ; 30: word count - 1
|
||||
.DB $00 ; 31: data
|
||||
.DB $00 ; 32: block copy src hi
|
||||
.DB $00 ; 33: block copy src lo
|
||||
.DB $06 ; 34: display enable begin
|
||||
.DB $56 ; 35: display enable end
|
||||
.DB $00 ; 36: refresh rate
|
||||
#ELSE
|
||||
.DB $7E ; 0: hor. total - 1
|
||||
.DB $50 ; 1: hor. displayed
|
||||
.DB $66 ; 2: hor. sync position 85
|
||||
.DB $49 ; 3: vert/hor sync width or 0x4F -- MDA
|
||||
.DB $20 ; 4: vert total
|
||||
.DB $E0 ; 5: vert total adjust
|
||||
.DB $19 ; 6: vert. displayed
|
||||
.DB $1D ; 7: vert. sync postition
|
||||
.DB $FC ; 8: interlace mode
|
||||
.DB $E7 ; 9: char height - 1
|
||||
.DB $A0 ; 10: cursor mode, start line
|
||||
.DB $E7 ; 11: cursor end line
|
||||
.DB $00 ; 12: display start addr hi
|
||||
.DB $00 ; 13: display start addr lo
|
||||
.DB $07 ; 14: cursor position hi
|
||||
.DB $80 ; 15: cursor position lo
|
||||
.DB $12 ; 16: light pen vertical
|
||||
.DB $17 ; 17: light pen horizontal
|
||||
.DB $0F ; 18: update address hi
|
||||
.DB $D0 ; 19: update address lo
|
||||
.DB $08 ; 20: attribute start addr hi
|
||||
.DB $20 ; 21: attribute start addr lo
|
||||
.DB $78 ; 22: char hor size cntrl 0x78
|
||||
.DB $E8 ; 23: vert char pixel space - 1, increase to 13 with new font
|
||||
.DB $20 ; 24: copy/fill, reverse, blink rate; vertical scroll
|
||||
.DB $47 ; 25: gr/txt, color/mono, pxl-rpt, dbl-wide; horiz. scroll
|
||||
.DB $F0 ; 26: fg/bg colors (monochr)
|
||||
.DB $00 ; 27: row addr display incr
|
||||
.DB $2F ; 28: char set addr; RAM size (64/16)
|
||||
.DB $E7 ; 29: underline position
|
||||
.DB $4F ; 30: word count - 1
|
||||
.DB $07 ; 31: data
|
||||
.DB $0F ; 32: block copy src hi
|
||||
.DB $D0 ; 33: block copy src lo
|
||||
.DB $7D ; 34: display enable begin
|
||||
.DB $64 ; 35: display enable end
|
||||
.DB $F5 ; 36: refresh rate
|
||||
#ENDIF
|
||||
;
|
||||
;==================================================================================================
|
||||
; CVDU DRIVER - FONT DATA
|
||||
; CVDU DRIVER - INSTANCE DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
#INCLUDE "cvdu_font.asm"
|
||||
;
|
||||
#INCLUDE "kbd.asm"
|
||||
CVDU_IDAT:
|
||||
.DB CVDU_KBDST
|
||||
.DB CVDU_KBDDATA
|
||||
|
||||
257
Source/HBIOS/font_hi.asm
Normal file
257
Source/HBIOS/font_hi.asm
Normal file
@@ -0,0 +1,257 @@
|
||||
FONT_HI:
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$7E,$81,$A5,$81,$81,$BD,$99,$81,$81,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$FE,$FE,$D6,$FE,$FE,$BA,$C6,$FE,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$6C,$EE,$FE,$FE,$FE,$FE,$7C,$38,$10,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$10,$38,$7C,$FE,$7C,$38,$10,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$10,$38,$38,$10,$6C,$EE,$6C,$10,$38,$00,$00,$00,$00
|
||||
.DB $00,$00,$10,$38,$7C,$7C,$FE,$FE,$FE,$6C,$10,$38,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$18,$3C,$3C,$3C,$18,$00,$00,$00,$00,$00,$00
|
||||
.DB $FF,$FF,$FF,$FF,$FF,$E7,$C3,$C3,$C3,$E7,$FF,$FF,$FF,$FF,$FF,$FF
|
||||
.DB $00,$00,$00,$00,$18,$3C,$66,$66,$66,$3C,$18,$00,$00,$00,$00,$00
|
||||
.DB $FF,$FF,$FF,$FF,$E7,$C3,$99,$99,$99,$C3,$E7,$FF,$FF,$FF,$FF,$FF
|
||||
.DB $00,$00,$1E,$0E,$1E,$36,$78,$CC,$CC,$CC,$CC,$78,$00,$00,$00,$00
|
||||
.DB $00,$00,$3C,$66,$66,$66,$3C,$18,$7E,$18,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$1E,$1A,$1E,$18,$18,$18,$18,$78,$F8,$70,$00,$00,$00,$00
|
||||
.DB $00,$00,$3E,$36,$3E,$36,$36,$76,$F6,$66,$0E,$1E,$0C,$00,$00,$00
|
||||
.DB $00,$00,$18,$DB,$7E,$3C,$66,$66,$3C,$7E,$DB,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$80,$E0,$F0,$FC,$FE,$FC,$F0,$E0,$80,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$02,$0E,$3E,$7E,$FE,$7E,$3E,$0E,$02,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$3C,$7E,$18,$18,$18,$18,$7E,$3C,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$66,$66,$66,$66,$66,$66,$66,$00,$66,$66,$00,$00,$00,$00
|
||||
.DB $00,$00,$7F,$DB,$DB,$DB,$DB,$7B,$1B,$1B,$1B,$1B,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$60,$7C,$F6,$DE,$7C,$0C,$C6,$C6,$7C,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$FE,$FE,$FE,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$3C,$7E,$18,$18,$18,$7E,$3C,$18,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$3C,$7E,$18,$18,$18,$18,$18,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$18,$18,$18,$18,$18,$18,$7E,$3C,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$0C,$0E,$FF,$0E,$0C,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$30,$70,$FE,$70,$30,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$C0,$C0,$C0,$FE,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$24,$66,$FF,$66,$24,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$10,$38,$38,$38,$7C,$7C,$FE,$FE,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$FE,$FE,$7C,$7C,$7C,$38,$38,$10,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$3C,$3C,$3C,$3C,$18,$18,$00,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$36,$36,$36,$36,$14,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$6C,$6C,$6C,$FE,$6C,$6C,$FE,$6C,$6C,$6C,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$18,$7C,$C6,$C0,$78,$3C,$06,$C6,$7C,$18,$18,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$62,$66,$0C,$18,$30,$66,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$38,$6C,$38,$30,$76,$7E,$CC,$CC,$CC,$76,$00,$00,$00,$00
|
||||
.DB $00,$0C,$0C,$0C,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$0C,$18,$30,$30,$30,$30,$30,$30,$18,$0C,$00,$00,$00,$00
|
||||
.DB $00,$00,$30,$18,$0C,$0C,$0C,$0C,$0C,$0C,$18,$30,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$6C,$38,$FE,$38,$6C,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$18,$18,$7E,$18,$18,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$0C,$0C,$0C,$18,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$FE,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$02,$06,$0C,$18,$30,$60,$C0,$80,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$CE,$DE,$F6,$E6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$78,$18,$18,$18,$18,$18,$18,$18,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$06,$0C,$18,$30,$60,$C6,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$06,$06,$3C,$06,$06,$06,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$0C,$1C,$3C,$6C,$CC,$CC,$FE,$0C,$0C,$1E,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$C0,$C0,$C0,$FC,$06,$06,$06,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C0,$C0,$FC,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$C6,$06,$0C,$18,$30,$30,$30,$30,$30,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$C6,$7C,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$C6,$C6,$7E,$06,$06,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$0C,$0C,$00,$00,$0C,$0C,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$0C,$0C,$00,$00,$0C,$0C,$0C,$18,$00,$00,$00
|
||||
.DB $00,$00,$00,$0C,$18,$30,$60,$C0,$60,$30,$18,$0C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$FE,$00,$FE,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$60,$30,$18,$0C,$06,$0C,$18,$30,$60,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$0C,$18,$18,$18,$00,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$C6,$DE,$DE,$DE,$DC,$C0,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$38,$6C,$C6,$C6,$C6,$FE,$C6,$C6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$FC,$66,$66,$66,$7C,$66,$66,$66,$66,$FC,$00,$00,$00,$00
|
||||
.DB $00,$00,$3C,$66,$C2,$C0,$C0,$C0,$C0,$C2,$66,$3C,$00,$00,$00,$00
|
||||
.DB $00,$00,$F8,$6C,$66,$66,$66,$66,$66,$66,$6C,$F8,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$66,$60,$64,$7C,$64,$60,$60,$66,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$66,$60,$64,$7C,$64,$60,$60,$60,$F0,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$C0,$C0,$C0,$CE,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$C6,$C6,$FE,$C6,$C6,$C6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$3C,$18,$18,$18,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$00,$3C,$18,$18,$18,$18,$18,$18,$D8,$D8,$70,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$CC,$D8,$F0,$F0,$D8,$CC,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$F0,$60,$60,$60,$60,$60,$60,$62,$66,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$EE,$EE,$FE,$D6,$D6,$D6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$E6,$E6,$F6,$DE,$CE,$CE,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$FC,$66,$66,$66,$66,$7C,$60,$60,$60,$F0,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$C6,$C6,$C6,$C6,$D6,$D6,$7C,$06,$00,$00,$00
|
||||
.DB $00,$00,$FC,$66,$66,$66,$7C,$78,$6C,$66,$66,$E6,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C0,$C0,$70,$1C,$06,$06,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$7E,$5A,$18,$18,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$6C,$38,$10,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$C6,$D6,$D6,$D6,$FE,$EE,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$C6,$C6,$6C,$38,$38,$6C,$C6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$66,$66,$66,$66,$66,$3C,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$C6,$86,$0C,$18,$30,$60,$C2,$C6,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$60,$60,$60,$60,$60,$60,$60,$60,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$80,$C0,$60,$30,$18,$0C,$06,$02,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$0C,$0C,$0C,$0C,$0C,$0C,$0C,$0C,$7C,$00,$00,$00,$00
|
||||
.DB $00,$10,$38,$6C,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$00,$00
|
||||
.DB $00,$18,$18,$18,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$78,$0C,$7C,$CC,$CC,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$00,$E0,$60,$60,$7C,$66,$66,$66,$66,$66,$FC,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$7C,$C6,$C0,$C0,$C0,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$1C,$0C,$0C,$7C,$CC,$CC,$CC,$CC,$CC,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$7C,$C6,$C6,$FE,$C0,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$1C,$36,$30,$30,$FC,$30,$30,$30,$30,$78,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$76,$CE,$C6,$C6,$CE,$76,$06,$C6,$7C,$00,$00
|
||||
.DB $00,$00,$E0,$60,$60,$7C,$66,$66,$66,$66,$66,$E6,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$18,$00,$38,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$00,$0C,$0C,$00,$1C,$0C,$0C,$0C,$0C,$0C,$CC,$CC,$78,$00,$00
|
||||
.DB $00,$00,$E0,$60,$60,$66,$66,$6C,$78,$6C,$66,$E6,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$18,$18,$18,$18,$18,$18,$18,$18,$1C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$6C,$FE,$D6,$D6,$C6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$DC,$66,$66,$66,$66,$66,$66,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$7C,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$DC,$66,$66,$66,$66,$7C,$60,$60,$F0,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$76,$CC,$CC,$CC,$CC,$7C,$0C,$0C,$1E,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$DC,$66,$60,$60,$60,$60,$F0,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$7C,$C6,$C0,$7C,$06,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$30,$30,$30,$FC,$30,$30,$30,$30,$36,$1C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$CC,$CC,$CC,$CC,$CC,$CC,$76,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$C6,$C6,$C6,$C6,$6C,$38,$10,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$C6,$C6,$D6,$D6,$D6,$FE,$6C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$C6,$C6,$6C,$38,$6C,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$C6,$C6,$C6,$C6,$CE,$76,$06,$C6,$7C,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$FE,$86,$0C,$18,$30,$62,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$0E,$18,$18,$18,$70,$18,$18,$18,$18,$0E,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$18,$18,$18,$00,$18,$18,$18,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$70,$18,$18,$18,$0E,$18,$18,$18,$18,$70,$00,$00,$00,$00
|
||||
.DB $00,$00,$76,$DC,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$10,$38,$38,$6C,$6C,$FE,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$3C,$66,$C0,$C0,$C0,$C6,$66,$3C,$18,$0C,$CC,$38,$00,$00
|
||||
.DB $00,$00,$C6,$00,$00,$C6,$C6,$C6,$C6,$C6,$CE,$76,$00,$00,$00,$00
|
||||
.DB $00,$0C,$18,$30,$00,$7C,$C6,$C6,$FE,$C0,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$30,$78,$CC,$00,$78,$0C,$7C,$CC,$CC,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$00,$CC,$00,$00,$78,$0C,$7C,$CC,$CC,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$60,$30,$18,$00,$78,$0C,$7C,$CC,$CC,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$38,$6C,$38,$00,$78,$0C,$7C,$CC,$CC,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$7C,$C6,$C0,$C0,$C6,$7C,$18,$0C,$6C,$38,$00,$00
|
||||
.DB $00,$30,$78,$CC,$00,$7C,$C6,$C6,$FE,$C0,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$CC,$00,$00,$7C,$C6,$C6,$FE,$C0,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$30,$18,$0C,$00,$7C,$C6,$C6,$FE,$C0,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$66,$00,$00,$38,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$18,$3C,$66,$00,$38,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$30,$18,$0C,$00,$38,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$C6,$00,$38,$6C,$C6,$C6,$C6,$FE,$C6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $38,$6C,$38,$00,$38,$6C,$C6,$C6,$FE,$C6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $0C,$18,$30,$00,$FE,$60,$60,$7C,$60,$60,$60,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$66,$DB,$1B,$7F,$D8,$D8,$DF,$76,$00,$00,$00,$00
|
||||
.DB $00,$00,$7E,$D8,$D8,$D8,$D8,$FE,$D8,$D8,$D8,$DE,$00,$00,$00,$00
|
||||
.DB $00,$30,$78,$CC,$00,$7C,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$C6,$00,$00,$7C,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$30,$18,$0C,$00,$7C,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$30,$78,$CC,$00,$C6,$C6,$C6,$C6,$C6,$CE,$76,$00,$00,$00,$00
|
||||
.DB $00,$60,$30,$18,$00,$C6,$C6,$C6,$C6,$C6,$CE,$76,$00,$00,$00,$00
|
||||
.DB $00,$18,$00,$3C,$18,$18,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$C6,$00,$7C,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$C6,$00,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$18,$18,$7C,$C6,$C0,$C0,$C6,$7C,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$38,$6C,$60,$60,$F0,$60,$60,$60,$66,$F6,$6C,$00,$00,$00,$00
|
||||
.DB $00,$66,$66,$66,$66,$3C,$18,$7E,$18,$3C,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$3E,$63,$63,$30,$1C,$06,$63,$63,$3E,$00,$1C,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$3E,$63,$38,$0E,$63,$3E,$00,$1C,$00,$00,$00
|
||||
.DB $00,$0C,$18,$30,$00,$78,$0C,$7C,$CC,$CC,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$0C,$18,$30,$00,$38,$18,$18,$18,$18,$18,$3C,$00,$00,$00,$00
|
||||
.DB $00,$0C,$18,$30,$00,$7C,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$18,$30,$60,$00,$CC,$CC,$CC,$CC,$CC,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$00,$76,$DC,$00,$DC,$66,$66,$66,$66,$66,$66,$00,$00,$00,$00
|
||||
.DB $00,$76,$DC,$00,$C6,$C6,$E6,$F6,$DE,$CE,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$21,$1E,$00,$1E,$33,$60,$60,$67,$63,$33,$1D,$00,$00,$00,$00
|
||||
.DB $00,$42,$3C,$00,$3B,$66,$66,$66,$3E,$06,$66,$3C,$00,$00,$00,$00
|
||||
.DB $00,$00,$30,$30,$00,$30,$30,$30,$60,$C6,$C6,$7C,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$7E,$60,$60,$60,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$7E,$06,$06,$06,$00,$00,$00,$00,$00
|
||||
.DB $00,$60,$60,$62,$66,$6C,$18,$30,$60,$DC,$36,$0C,$18,$3E,$00,$00
|
||||
.DB $00,$60,$60,$62,$66,$6C,$18,$36,$6E,$DE,$36,$7E,$06,$06,$00,$00
|
||||
.DB $00,$00,$18,$18,$00,$18,$18,$3C,$3C,$3C,$3C,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$36,$6C,$D8,$6C,$36,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$D8,$6C,$36,$6C,$D8,$00,$00,$00,$00,$00,$00
|
||||
.DB $11,$44,$11,$44,$11,$44,$11,$44,$11,$44,$11,$44,$11,$44,$11,$44
|
||||
.DB $AA,$55,$AA,$55,$AA,$55,$AA,$55,$AA,$55,$AA,$55,$AA,$55,$AA,$55
|
||||
.DB $DD,$77,$DD,$77,$DD,$77,$DD,$77,$DD,$77,$DD,$77,$DD,$77,$DD,$77
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$F8,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $18,$18,$18,$18,$18,$F8,$18,$F8,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $36,$36,$36,$36,$36,$36,$36,$F6,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$FE,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $00,$00,$00,$00,$00,$F8,$18,$F8,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $36,$36,$36,$36,$36,$F6,$06,$F6,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $00,$00,$00,$00,$00,$FE,$06,$F6,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $36,$36,$36,$36,$36,$F6,$06,$FE,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $36,$36,$36,$36,$36,$36,$36,$FE,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $18,$18,$18,$18,$18,$F8,$18,$F8,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$F8,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$1F,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$FF,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$1F,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$FF,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $18,$18,$18,$18,$18,$1F,$18,$1F,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $36,$36,$36,$36,$36,$36,$36,$37,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $36,$36,$36,$36,$36,$37,$30,$3F,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$3F,$30,$37,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $36,$36,$36,$36,$36,$F7,$00,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$FF,$00,$F7,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $36,$36,$36,$36,$36,$37,$30,$37,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $00,$00,$00,$00,$00,$FF,$00,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $36,$36,$36,$36,$36,$F7,$00,$F7,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $18,$18,$18,$18,$18,$FF,$00,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $36,$36,$36,$36,$36,$36,$36,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$FF,$00,$FF,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$FF,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $36,$36,$36,$36,$36,$36,$36,$3F,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $18,$18,$18,$18,$18,$1F,$18,$1F,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$1F,$18,$1F,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$3F,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $36,$36,$36,$36,$36,$36,$36,$FF,$36,$36,$36,$36,$36,$36,$36,$36
|
||||
.DB $18,$18,$18,$18,$18,$FF,$18,$FF,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$F8,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$1F,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||
.DB $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0
|
||||
.DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F
|
||||
.DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$76,$DC,$D8,$D8,$D8,$D8,$DC,$76,$00,$00,$00,$00
|
||||
.DB $00,$00,$78,$CC,$CC,$D8,$FC,$C6,$C6,$C6,$C6,$CC,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$66,$62,$60,$60,$60,$60,$60,$60,$60,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$FE,$6C,$6C,$6C,$6C,$6C,$6C,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$C6,$62,$30,$18,$18,$30,$62,$C6,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$7E,$D8,$CC,$CC,$CC,$D8,$70,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$66,$66,$66,$66,$66,$7C,$60,$C0,$80,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$76,$DC,$18,$18,$18,$18,$18,$00,$00,$00,$00
|
||||
.DB $00,$00,$FE,$38,$38,$6C,$C6,$C6,$6C,$38,$38,$FE,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$38,$6C,$C6,$C6,$FE,$C6,$C6,$6C,$38,$00,$00,$00,$00
|
||||
.DB $00,$00,$38,$6C,$C6,$C6,$C6,$C6,$6C,$6C,$6C,$EE,$00,$00,$00,$00
|
||||
.DB $00,$00,$3E,$60,$60,$3C,$66,$C6,$C6,$C6,$CC,$78,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$7E,$DB,$DB,$DB,$7E,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$02,$06,$7C,$CE,$DE,$F6,$F6,$7C,$60,$C0,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$1C,$30,$60,$60,$7C,$60,$60,$30,$1C,$00,$00,$00,$00
|
||||
.DB $00,$00,$7C,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$C6,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$FE,$00,$00,$FE,$00,$00,$FE,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$18,$18,$7E,$18,$18,$00,$00,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$30,$18,$0C,$06,$0C,$18,$30,$00,$00,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$0C,$18,$30,$60,$30,$18,$0C,$00,$00,$7E,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$0C,$1E,$1A,$18,$18,$18,$18,$18,$18,$18,$18,$18
|
||||
.DB $18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$58,$78,$30,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$18,$18,$00,$7E,$00,$18,$18,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$76,$DC,$00,$76,$DC,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$78,$CC,$CC,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$18,$18,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$18,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$1F,$18,$18,$18,$18,$18,$D8,$D8,$78,$38,$18,$00,$00,$00
|
||||
.DB $00,$00,$D8,$6C,$6C,$6C,$6C,$6C,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$70,$D8,$18,$30,$60,$F8,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$7E,$7E,$7E,$7E,$7E,$7E,$00,$00,$00,$00,$00
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
@@ -1,4 +1,3 @@
|
||||
CVDU_FONTDATA:
|
||||
.DB $18,$18,$18,$FF,$FF,$18,$18,$18
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $C0,$C0,$30,$30,$C0,$C0,$30,$30
|
||||
@@ -511,7 +510,7 @@ CVDU_FONTDATA:
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $0F,$0F,$0F,$0F,$FF,$FF,$FF,$FF
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00
|
||||
#IF 1
|
||||
#IF 0
|
||||
.DB $0F,$0F,$0F,$0F,$F0,$F0,$F0,$F0
|
||||
.DB $00,$00,$00,$00,$00,$00,$00,$00
|
||||
.DB $3C,$66,$6E,$6E,$60,$62,$3C,$00
|
||||
@@ -1,4 +1,5 @@
|
||||
; tms_font.inc - automatically generated by n8vidtst
|
||||
FONT_TMS:
|
||||
.DB 000h,000h,000h,000h,000h,000h,000h,000h ; 0x00(0)
|
||||
.DB 030h,030h,030h,03ch,03ch,000h,000h,000h ; 0x01(1)
|
||||
.DB 030h,030h,030h,0f0h,0f0h,000h,000h,000h ; 0x02(2)
|
||||
@@ -799,13 +799,38 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
|
||||
PRTS(" @ $")
|
||||
LD HL,(CB_CPUKHZ)
|
||||
CALL PRTD3M ; PRINT AS DECIMAL WITH 3 DIGIT MANTISSA
|
||||
PRTS("MHz ROM=$")
|
||||
PRTS("MHz$")
|
||||
;
|
||||
; DISPLAY CPU CONFIG
|
||||
;
|
||||
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
|
||||
;
|
||||
CALL PRTSTRD
|
||||
.TEXT ", $"
|
||||
LD A,Z180_MEMWAIT
|
||||
CALL PRTDECB
|
||||
CALL PRTSTRD
|
||||
.TEXT " MEM W/S, $"
|
||||
LD A,Z180_IOWAIT
|
||||
CALL PRTDECB
|
||||
CALL PRTSTRD
|
||||
.TEXT " I/O W/S$"
|
||||
;
|
||||
; DISPLAY MEMORY CONFIG
|
||||
;
|
||||
CALL NEWLINE
|
||||
CALL PRTSTRD
|
||||
.TEXT "MEMORY LAYOUT $"
|
||||
LD HL,ROMSIZE
|
||||
CALL PRTDEC
|
||||
PRTS("KB RAM=$")
|
||||
CALL PRTSTRD
|
||||
.TEXT "KB ROM, $"
|
||||
LD HL,RAMSIZE
|
||||
CALL PRTDEC
|
||||
PRTS("KB$")
|
||||
CALL PRTSTRD
|
||||
.TEXT "KB RAM$"
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; PERFORM DEVICE INITIALIZATION
|
||||
;
|
||||
@@ -931,6 +956,9 @@ HB_INITTBL:
|
||||
#IF (CVDUENABLE)
|
||||
.DW CVDU_INIT
|
||||
#ENDIF
|
||||
#IF (VGAENABLE)
|
||||
.DW VGA_INIT
|
||||
#ENDIF
|
||||
#IF (NECENABLE)
|
||||
.DW NEC_INIT
|
||||
#ENDIF
|
||||
@@ -1371,6 +1399,7 @@ VDA_DISPATCH:
|
||||
; CONVERT C TO THE DEVICE/DRIVER SPECIFIC UNIT ID
|
||||
; AND GET THE DEVICE TYPE TO A FOR DRIVER DISPATCHING
|
||||
;
|
||||
PUSH IY ; SAVE INCOMING IY
|
||||
LD A,C ; INCOMING UNIT INDEX TO A
|
||||
PUSH HL ; SAVE INCOMING HL
|
||||
LD HL,VDA_CNT ; HL := ADDRESS OF TABLE ENTRY COUNT
|
||||
@@ -1384,34 +1413,37 @@ VDA_DISPATCH:
|
||||
RET ; AND RETURN
|
||||
;
|
||||
VDA_DISPATCH1:
|
||||
INC HL ; BUMP PAST COUNT PREFIX TO START OF TABLE
|
||||
RLCA ; MULTIPLY BY 4 TO
|
||||
;
|
||||
; SET HL := TABLE ENTRY ADDRESS
|
||||
INC HL ; BUMP PAST COUNT PREFIX TO START OF TABLE ENTRIES
|
||||
RLCA ; MULTIPLY UNIT # BY 4 TO
|
||||
RLCA ; ... TO CALC ENTRY OFFSET
|
||||
CALL ADDHLA ; HL := ENTRY OFFSET
|
||||
LD A,(HL) ; GET DEVICE TYPE BYTE
|
||||
INC HL ; BUMP TO DEVICE UNIT INDEX BYTE
|
||||
LD C,(HL) ; DEVICE UNIT INDEX TO C
|
||||
POP HL ; RECOVER INCOMING HL VALUE
|
||||
CALL ADDHLA ; HL := ADDRESS OF ENTRY IN TABLE
|
||||
;
|
||||
; DISPATCH TO DRIVER BASED ON DEVICE TYPE IN A
|
||||
; GET FIRST WORD OF TABLE ENTRY AND SAVE FOR DRIVER CALL
|
||||
LD A,(HL) ; DEREFERENCE
|
||||
INC HL ; ...
|
||||
PUSH HL ; SAVE IT FOR BELOW
|
||||
LD H,(HL) ; ...
|
||||
LD L,A ; ... SO HL HAS ADDRESS OF DRIVER DISPATCH
|
||||
LD (VDA_TGTADR),HL ; SAVE THE TARGET ADDRESS TO CALL LATER
|
||||
;
|
||||
#IF (VDUENABLE)
|
||||
CP VDADEV_VDU
|
||||
JP Z,VDU_DISPATCH
|
||||
#ENDIF
|
||||
#IF (CVDUENABLE)
|
||||
CP VDADEV_CVDU
|
||||
JP Z,CVDU_DISPATCH
|
||||
#ENDIF
|
||||
#IF (NECENABLE)
|
||||
CP VDADEV_7220
|
||||
JP Z,NEC_DISPATCH
|
||||
#ENDIF
|
||||
#IF (TMSENABLE)
|
||||
CP VDADEV_TMS
|
||||
JP Z,TMS_DISPATCH
|
||||
#ENDIF
|
||||
CALL PANIC
|
||||
; GET SECOND WORD OF TABLE ENTRY AND PUT IN IY FOR DRIVER CALL
|
||||
POP HL ; GET TABLE ENTRY ADDRESS BACK
|
||||
INC HL ; INCREMENT TO DATA WORD
|
||||
LD A,(HL) ; GET DATA WORD
|
||||
INC HL ; ...
|
||||
LD H,(HL) ; ...
|
||||
LD L,A ; ... INTO HL
|
||||
PUSH HL ; AND COPY IT
|
||||
POP IY ; ... TO IY
|
||||
;
|
||||
; CALL DRIVER (ADDRESS BYTES OF CALL INSTRUCTION UPDATED ABOVE)
|
||||
POP HL ; GET ORIGINAL HL BACK (10)
|
||||
CALL PANIC ; CALL DRIVER DISPATCH ENTRY
|
||||
VDA_TGTADR .EQU $ - 2 ; REFERENCE TO ADDRESS OF CALL INSTRUCTION
|
||||
POP IY ; RESTORE ORIGINAL IY
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; HBIOS VIDEO DEVICE UNIT TABLE
|
||||
;
|
||||
@@ -1420,8 +1452,7 @@ VDA_DISPATCH1:
|
||||
; NUMBER OF ENTRIES. TABLE - 2 CONTAINS THE MAXIMUM NUMBER OF ENTRIES.
|
||||
; EACH ENTRY IS DEFINED AS:
|
||||
;
|
||||
; BYTE DEVICE TYPE ID
|
||||
; BYTE DEVICE/DRIVER UNIT NUMBER
|
||||
; WORD DRIVER DISPATCH ADDRESS
|
||||
; WORD UNIT DATA ADDRESS
|
||||
;
|
||||
VDA_MAX .EQU 16 ; UP TO 16 UNITS
|
||||
@@ -1981,12 +2012,12 @@ SIZ_ASCI .EQU $ - ORG_ASCI
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (VDUENABLE)
|
||||
ORG_VDU .EQU $
|
||||
#INCLUDE "vdu.asm"
|
||||
SIZ_VDU .EQU $ - ORG_VDU
|
||||
.ECHO "VDU occupies "
|
||||
.ECHO SIZ_VDU
|
||||
#IF (VGAENABLE)
|
||||
ORG_VGA .EQU $
|
||||
#INCLUDE "vga.asm"
|
||||
SIZ_VGA .EQU $ - ORG_VGA
|
||||
.ECHO "VGA occupies "
|
||||
.ECHO SIZ_VGA
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
@@ -1999,12 +2030,12 @@ SIZ_CVDU .EQU $ - ORG_CVDU
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (NECENABLE)
|
||||
ORG_NEC .EQU $
|
||||
;#INCLUDE "nec.asm"
|
||||
SIZ_NEC .EQU $ - ORG_NEC
|
||||
.ECHO "NEC occupies "
|
||||
.ECHO SIZ_NEC
|
||||
#IF (VDUENABLE)
|
||||
ORG_VDU .EQU $
|
||||
#INCLUDE "vdu.asm"
|
||||
SIZ_VDU .EQU $ - ORG_VDU
|
||||
.ECHO "VDU occupies "
|
||||
.ECHO SIZ_VDU
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
@@ -2017,6 +2048,51 @@ SIZ_TMS .EQU $ - ORG_TMS
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (NECENABLE)
|
||||
ORG_NEC .EQU $
|
||||
;#INCLUDE "nec.asm"
|
||||
SIZ_NEC .EQU $ - ORG_NEC
|
||||
.ECHO "NEC occupies "
|
||||
.ECHO SIZ_NEC
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CVDUENABLE | VGAENABLE)
|
||||
ORG_FONTHI .EQU $
|
||||
#INCLUDE "font_hi.asm"
|
||||
SIZ_FONTHI .EQU $ - ORG_FONTHI
|
||||
.ECHO "FONTHI occupies "
|
||||
.ECHO SIZ_FONTHI
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (TMSENABLE)
|
||||
ORG_FONTTMS .EQU $
|
||||
#INCLUDE "font_tms.asm"
|
||||
SIZ_FONTTMS .EQU $ - ORG_FONTTMS
|
||||
.ECHO "FONTTMS occupies "
|
||||
.ECHO SIZ_FONTTMS
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CVDUENABLE | VGAENABLE)
|
||||
ORG_KBD .EQU $
|
||||
#INCLUDE "kbd.asm"
|
||||
SIZ_KBD .EQU $ - ORG_KBD
|
||||
.ECHO "KBD occupies "
|
||||
.ECHO SIZ_KBD
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (VDUENABLE | TMSENABLE)
|
||||
ORG_PPK .EQU $
|
||||
#INCLUDE "ppk.asm"
|
||||
SIZ_PPK .EQU $ - ORG_PPK
|
||||
.ECHO "PPK occupies "
|
||||
.ECHO SIZ_PPK
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PRPENABLE)
|
||||
ORG_PRP .EQU $
|
||||
#INCLUDE "prp.asm"
|
||||
@@ -2810,12 +2886,13 @@ PS_STPARMAP .DB "NONENMNS"
|
||||
; VIDEO DEVICE STRINGS
|
||||
;
|
||||
PS_VDSTRREF:
|
||||
.DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS
|
||||
.DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA
|
||||
;
|
||||
PS_VDVDU .TEXT "VDU$"
|
||||
PS_VDCVDU .TEXT "CVDU$"
|
||||
PS_VDNEC .TEXT "NEC$"
|
||||
PS_VDTMS .TEXT "TMS$"
|
||||
PS_VDVGA .TEXT "VGA$"
|
||||
;
|
||||
; VIDEO TYPE STRINGS
|
||||
;
|
||||
|
||||
@@ -104,6 +104,7 @@ VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545
|
||||
VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563
|
||||
VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220
|
||||
VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918
|
||||
VDADEV_VGA .EQU $40 ; VGA
|
||||
;
|
||||
; EMULATION TYPES
|
||||
;
|
||||
|
||||
@@ -218,7 +218,16 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
|
||||
;
|
||||
IDE_INIT:
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("IDE:$") ; LABEL FOR IO ADDRESS
|
||||
PRTS("IDE:$")
|
||||
CALL IDE_DETECT ; CHECK FOR HARDWARE
|
||||
JR Z,IDE_INIT00 ; CONTINUE IF PRESENT
|
||||
;
|
||||
; HARDWARE NOT PRESENT
|
||||
PRTS(" NOT PRESENT$")
|
||||
OR $FF ; SIGNAL FAILURE
|
||||
RET
|
||||
;
|
||||
IDE_INIT00:
|
||||
;
|
||||
; SETUP THE DISPATCH TABLE ENTRIES
|
||||
;
|
||||
@@ -319,6 +328,20 @@ IDE_INIT2:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; RETURN WITH A=0, AND Z SET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; PROBE FOR IDE HARDWARE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
IDE_DETECT:
|
||||
;
|
||||
#IF (IDEMODE == IDEMODE_DIDE)
|
||||
#ENDIF
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;=============================================================================
|
||||
; FUNCTION DISPATCH ENTRY POINT
|
||||
;=============================================================================
|
||||
|
||||
@@ -12,13 +12,11 @@
|
||||
; DATA CONSTANTS
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; IO PORTS
|
||||
; DRIVER DATA OFFSETS (FROM IY)
|
||||
;
|
||||
KBD_IOBASE .EQU $E0
|
||||
;
|
||||
KBD_ST .EQU KBD_IOBASE + $0A
|
||||
KBD_CMD .EQU KBD_IOBASE + $0A
|
||||
KBD_DATA .EQU KBD_IOBASE + $02
|
||||
KBD_ST .EQU 0 ; BYTE, STATUS PORT NUM (R)
|
||||
KBD_CMD .EQU KBD_ST ; BYTE, CMD PORT NUM (W)
|
||||
KBD_DAT .EQU 1 ; BYTE, DATA PORT NUM (R/W)
|
||||
;
|
||||
; TIMING CONSTANTS
|
||||
;
|
||||
@@ -64,7 +62,7 @@ KBD_IDLE .DB 0 ; IDLE COUNT
|
||||
KBD_INIT:
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("KBD: IO=0x$")
|
||||
LD A,KBD_IOBASE
|
||||
LD A,(IY+KBD_DAT)
|
||||
CALL PRTHEXBYTE
|
||||
;
|
||||
LD A,KBD_DEFRPT ; GET DEFAULT REPEAT RATE
|
||||
@@ -149,7 +147,8 @@ KBD_IST:
|
||||
; KEYBOARD INPUT STATUS
|
||||
; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING
|
||||
;
|
||||
IN A,(KBD_ST) ; GET STATUS
|
||||
LD C,(IY+KBD_ST) ; STATUS PORT
|
||||
IN A,(C) ; GET STATUS
|
||||
AND $01 ; ISOLATE INPUT PENDING BIT
|
||||
RET
|
||||
;
|
||||
@@ -159,7 +158,8 @@ KBD_OST:
|
||||
; KEYBOARD OUTPUT STATUS
|
||||
; A=0, Z SET FOR NOT READY, OTHERWISE READY TO WRITE
|
||||
;
|
||||
IN A,(KBD_ST) ; GET STATUS
|
||||
LD C,(IY+KBD_ST) ; STATUS PORT
|
||||
IN A,(C) ; GET STATUS
|
||||
AND $02 ; ISOLATE OUTPUT EMPTY BIT
|
||||
XOR $02 ; FLIP IT FOR APPROPRIATE RETURN VALUES
|
||||
RET
|
||||
@@ -185,7 +185,8 @@ KBD_PUTCMD1:
|
||||
CALL PC_GT
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
OUT (KBD_CMD),A ; WRITE IT
|
||||
LD C,(IY+KBD_CMD) ; COMMAND PORT
|
||||
OUT (C),A ; WRITE IT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
@@ -209,7 +210,8 @@ KBD_PUTDATA1:
|
||||
CALL PC_GT
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
OUT (KBD_DATA),A ; WRITE IT
|
||||
LD C,(IY+KBD_DAT) ; DATA PORT
|
||||
OUT (C),A ; WRITE IT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
@@ -227,7 +229,8 @@ KBD_GETDATA0:
|
||||
XOR A ; NO DATA, RETURN ZERO
|
||||
RET
|
||||
KBD_GETDATA1:
|
||||
IN A,(KBD_DATA) ; GET THE DATA VALUE
|
||||
LD C,(IY+KBD_DAT) ; DATA PORT
|
||||
IN A,(C) ; GET THE DATA VALUE
|
||||
#IF (KBDTRACE >= 2)
|
||||
PUSH AF
|
||||
CALL PC_SPACE
|
||||
|
||||
@@ -12,23 +12,18 @@
|
||||
; DATA CONSTANTS
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; IO PORTS
|
||||
; DRIVER DATA OFFSETS (FROM IY)
|
||||
;
|
||||
PPK_PPIA .EQU 0 ; PPI PORT A
|
||||
PPK_PPIB .EQU 1 ; PPI PORT B
|
||||
PPK_PPIC .EQU 2 ; PPI PORT C
|
||||
PPK_PPIX .EQU 3 ; PPI CONTROL PORT
|
||||
;
|
||||
; DRIVER CONSTANTS
|
||||
;
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
PPK_PPI .EQU 084H ; PPI PORT BASE FOR N8
|
||||
#ELSE
|
||||
PPK_PPI .EQU 0F4H ; PPI PORT BASE FOR VDU
|
||||
#ENDIF
|
||||
|
||||
PPK_PPIA .EQU PPK_PPI + 0 ; KEYBOARD PPI PORT A
|
||||
PPK_PPIB .EQU PPK_PPI + 1 ; KEYBOARD PPI PORT B
|
||||
PPK_PPIC .EQU PPK_PPI + 2 ; KEYBOARD PPI PORT C
|
||||
PPK_PPIX .EQU PPK_PPI + 3 ; KEYBOARD PPI CONTROL PORT
|
||||
|
||||
PPK_DAT .EQU 01111000B ; PPIX MASK TO MANAGE DATA LINE (C:4)
|
||||
PPK_CLK .EQU 01111010B ; PPIX MASK TO MANAGE CLOCK LINE (C:5)
|
||||
|
||||
;PPK_WAITTO .EQU 50 * CPUMHZ ; TUNE!!! WANT SMALL AS POSSIBLE W/O ERRORS
|
||||
;
|
||||
PPK_WAITRDY .EQU 6 ; TUNE!!! LOOP COUNT TO ENSURE DEVICE READY
|
||||
;
|
||||
; STATUS BITS (FOR PPK_STATUS)
|
||||
@@ -72,7 +67,7 @@ PPK_WAITTO .DW 0 ; TIMEOUT WAIT LOOP COUNT (COMPUTED IN INIT)
|
||||
PPK_INIT:
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("PPK: IO=0x$")
|
||||
LD A,PPK_PPIA
|
||||
LD A,(IY+PPK_PPIA)
|
||||
CALL PRTHEXBYTE
|
||||
;
|
||||
; PRECOMPUTE TIMEOUT LOOP COUNT (CPU KHZ / 16)
|
||||
@@ -178,7 +173,8 @@ PPK_GETDATA1:
|
||||
|
||||
PPK_GETDATA2:
|
||||
CALL PPK_WTCLKLO ; WAIT TILL CLOCK GOES LOW
|
||||
IN A,(PPK_PPIB) ; SAMPLE THE DATA LINE
|
||||
LD C,(IY+PPK_PPIB) ; C := PPI PORT B
|
||||
IN A,(C) ; SAMPLE THE DATA LINE
|
||||
RRA ; MOVE THE DATA BIT INTO THE CARRY REGISTER
|
||||
LD A,E ; GET THE BYTE WE ARE BUILDING IN E
|
||||
RRA ; MOVE THE CARRY BIT INTO BIT 7 AND SHIFT RIGHT
|
||||
@@ -244,7 +240,8 @@ PPK_PUTDATA1:
|
||||
RRC E ; ROTATE LOW BIT OF E TO CARRY (NEXT BIT TO SEND)
|
||||
LD A,PPK_DAT >> 1 ; INIT A WITH DATA MASK SHIFTED RIGHT BY ONE BIT
|
||||
RLA ; SHIFT CARRY INTO LOW BIT OF A
|
||||
OUT (PPK_PPIX),A ; SET/RESET DATA LINE FOR NEXT BIT VALUE
|
||||
LD C,(IY+PPK_PPIX) ; C := PPI CONTROL PORT
|
||||
OUT (C),A ; SET/RESET DATA LINE FOR NEXT BIT VALUE
|
||||
CALL PPK_WTCLKHI ; WAIT FOR CLOCK TO TRANSTION HI
|
||||
CALL PPK_WTCLKLO ; THEN LO, BIT HAS NOW BEEN RECEIVED BY DEVICE
|
||||
DJNZ PPK_PUTDATA1 ; LOOP TO SEND 8 DATA BITS
|
||||
@@ -256,7 +253,8 @@ PPK_PUTDATA1:
|
||||
JP PO,PPK_PUTDATA2 ; PARITY IS ALREADY ODD, LEAVE A ALONE
|
||||
INC A ; SET PARITY BIT BY INCREMENTING A
|
||||
PPK_PUTDATA2:
|
||||
OUT (PPK_PPIX),A ; SET THE DATA LINE
|
||||
LD C,(IY+PPK_PPIX) ; C := PPI CONTROL PORT
|
||||
OUT (C),A ; SET THE DATA LINE
|
||||
CALL PPK_WTCLKHI ; WAIT FOR CLOCK TO TRANSITION HI
|
||||
CALL PPK_WTCLKLO ; THEN LO, BIT HAS NOW BEEN RECEIVED BY DEVICE
|
||||
|
||||
@@ -280,9 +278,11 @@ PPK_INITPORT:
|
||||
; INITIALIZE PPI
|
||||
;
|
||||
LD A,10000010B ; A=OUT B=IN, C HIGH=OUT, CLOW=OUT
|
||||
OUT (PPK_PPIX),A ; SET PPI CONTROL PORT
|
||||
LD C,(IY+PPK_PPIX) ; C := PPI CONTROL PORT
|
||||
OUT (C),A ; SET PPI CONTROL PORT
|
||||
XOR A ; A=0
|
||||
OUT (PPK_PPIA),A ; PPI PORT A TO ZERO (REQUIRED FOR PAR PRINTER)
|
||||
LD C,(IY+PPK_PPIA) ; C := PPI PORT A
|
||||
OUT (C),A ; PPI PORT A TO ZERO (REQUIRED FOR PAR PRINTER)
|
||||
CALL PPK_DATHI ; KBD DATA LINE HI (IDLE)
|
||||
CALL PPK_CLKHI ; KBD CLOCK LINE HI (IDLE)
|
||||
RET
|
||||
@@ -322,7 +322,8 @@ PPK_WTDATHI: ; WAIT FOR DATA LINE TO BE HIGH
|
||||
PPK_WAIT: ; COMPLETE THE WAIT PROCESSING
|
||||
LD HL,(PPK_WAITTO)
|
||||
PPK_WAIT1:
|
||||
IN A,(PPK_PPIB) ; GET BYTE FROM PORT B
|
||||
LD C,(IY+PPK_PPIB) ; C := PPI PORT B
|
||||
IN A,(C) ; GET BYTE FROM PORT B
|
||||
XOR E
|
||||
AND D
|
||||
JR NZ,PPK_WAIT2 ; EXIT IF ANY BIT IS SET
|
||||
@@ -356,7 +357,8 @@ PPK_CLKLO:
|
||||
LD A,PPK_CLK
|
||||
JR PPK_SETBIT
|
||||
PPK_SETBIT:
|
||||
OUT (PPK_PPIX),A
|
||||
LD C,(IY+PPK_PPIX) ; C := PPI CONTROL PORT
|
||||
OUT (C),A
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
|
||||
@@ -20,6 +20,9 @@ PRP_INIT:
|
||||
CALL PRP_DETECT
|
||||
LD DE,PRP_STR_NOHW
|
||||
JP NZ,WRITESTR
|
||||
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXWORD
|
||||
;
|
||||
; RESET INTERFACE, RETURN WITH NZ ON FAILURE
|
||||
#IF (PRPSDTRACE >= 3)
|
||||
@@ -67,7 +70,8 @@ PRP_INIT1:
|
||||
;
|
||||
;
|
||||
PRP_DETECT:
|
||||
LD BC,2000 ; TRY FOR ABOUT 4 SECONDS
|
||||
;LD BC,2000 ; TRY FOR ABOUT 4 SECONDS
|
||||
LD BC,1024 ; TRY FOR ABOUT 2 SECONDS
|
||||
PRP_DETECT1:
|
||||
CALL PRP_DETECT2
|
||||
RET Z
|
||||
|
||||
@@ -216,6 +216,15 @@ SD_CAPACITY .EQU 2 ; CARD CAPACITY (1 DWORD/4 BYTES)
|
||||
SD_INIT:
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("SD:$")
|
||||
CALL SD_PROBE ; CHECK FOR HARDWARE
|
||||
JR Z,SD_INIT00 ; CONTINUE IF PRESENT
|
||||
;
|
||||
; HARDWARE NOT PRESENT
|
||||
PRTS(" NOT PRESENT$")
|
||||
OR $FF ; SIGNAL FAILURE
|
||||
RET
|
||||
;
|
||||
SD_INIT00:
|
||||
;
|
||||
; SETUP THE DISPATCH TABLE ENTRIES
|
||||
;
|
||||
@@ -416,6 +425,25 @@ SD_INITUNIT2:
|
||||
PRTS(" WP$") ; NOTIFY USER
|
||||
RET ; DONE
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; PROBE FOR SD HARDWARE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
SD_PROBE:
|
||||
;
|
||||
#IF (SDMODE == SDMODE_DSD)
|
||||
LD A,$03 ; SET BIT 0 & 1
|
||||
OUT (SD_SELREG),A ; WRITE TO SELECT REG
|
||||
IN A,(SD_SELREG) ; READ BACK, BIT 1 IS ALWAYS 0
|
||||
CP $01 ; ... SO SHOULD READ BACK AS $01
|
||||
RET
|
||||
#ENDIF
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;=============================================================================
|
||||
; FUNCTION DISPATCH ENTRY POINT
|
||||
;=============================================================================
|
||||
|
||||
@@ -29,11 +29,13 @@
|
||||
;
|
||||
; C: VIDEO UNIT NUMBER OF CALLING VDA DRIVER
|
||||
; DE: VDA DRIVER'S DISPATCH ADDRESS
|
||||
; HL: VDA DRIVER'S INSTANCE DATA
|
||||
;
|
||||
TERM_ATTACH:
|
||||
;
|
||||
LD A,(TERM_DEVCNT) ; GET NEXT DEVICE NUMBER TO USE
|
||||
LD B,A ; PUT IT IN B
|
||||
PUSH HL ; SAVE VDA INSTANCE DATA PTR
|
||||
;
|
||||
; SETUP EMULATOR MODULE DISPATCH ADDRESS BASED ON DESIRED EMULATION
|
||||
; EMULATOR PASSES BACK IT'S DISPATCH ADDRESS IN DE
|
||||
@@ -44,12 +46,14 @@ TERM_ATTACH:
|
||||
#IF (VDAEMU == EMUTYP_ANSI)
|
||||
CALL ANSI_INIT ; INIT ANSI, DE := ANSI_DISPATCH
|
||||
#ENDIF
|
||||
POP HL ; RECOVER VDA INSTANCE DATA PTR
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
;
|
||||
; ADD OURSELVES TO CIO DISPATCH TABLE
|
||||
PUSH DE ; COPY EMULATOR DISPATCH ADDRESS
|
||||
POP BC ; ... TO BC
|
||||
LD DE,0 ; DE := DATA BLOB (NONE AT THIS POINT)
|
||||
PUSH HL ; COPY VDA INSTANCE DATA PTR
|
||||
POP DE ; ... TO DE
|
||||
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
||||
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE
|
||||
;
|
||||
|
||||
@@ -14,8 +14,27 @@
|
||||
; TMS DRIVER - CONSTANTS
|
||||
;======================================================================
|
||||
;
|
||||
TMS_CMDREG .EQU N8_BASE + $19 ; READ STATUS / WRITE REG SEL
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
|
||||
TMS_DATREG .EQU N8_BASE + $18 ; READ/WRITE DATA
|
||||
TMS_CMDREG .EQU N8_BASE + $19 ; READ STATUS / WRITE REG SEL
|
||||
|
||||
TMS_PPIA .EQU N8_BASE + $04 ; PPI PORT A
|
||||
TMS_PPIB .EQU N8_BASE + $05 ; PPI PORT B
|
||||
TMS_PPIC .EQU N8_BASE + $06 ; PPI PORT C
|
||||
TMS_PPIX .EQU N8_BASE + $07 ; PPI CONTROL PORT
|
||||
|
||||
#ELSE
|
||||
|
||||
TMS_DATREG .EQU $50 ; READ/WRITE DATA
|
||||
TMS_CMDREG .EQU $51 ; READ STATUS / WRITE REG SEL
|
||||
|
||||
TMS_PPIA .EQU $F4 ; PPI PORT A
|
||||
TMS_PPIB .EQU $F5 ; PPI PORT B
|
||||
TMS_PPIC .EQU $F6 ; PPI PORT C
|
||||
TMS_PPIX .EQU $F7 ; PPI CONTROL PORT
|
||||
|
||||
#ENDIF
|
||||
;
|
||||
TMS_ROWS .EQU 24
|
||||
TMS_COLS .EQU 40
|
||||
@@ -33,6 +52,8 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
||||
;======================================================================
|
||||
;
|
||||
TMS_INIT:
|
||||
LD IY,TMS_IDAT ; POINTER TO INSTANCE DATA
|
||||
;
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("TMS: IO=0x$")
|
||||
LD A,TMS_DATREG
|
||||
@@ -44,14 +65,14 @@ TMS_INIT:
|
||||
CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER
|
||||
;
|
||||
; ADD OURSELVES TO VDA DISPATCH TABLE
|
||||
LD B,0 ; PHYSICAL UNIT IS ZERO
|
||||
LD C,VDADEV_TMS ; DEVICE TYPE
|
||||
LD DE,0 ; UNIT DATA BLOB ADDRESS
|
||||
LD BC,TMS_DISPATCH ; BC := DISPATCH ADDRESS
|
||||
LD DE,TMS_IDAT ; DE := TMS INSTANCE DATA PTR
|
||||
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
||||
;
|
||||
; INITIALIZE EMULATION
|
||||
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
|
||||
LD DE,TMS_DISPATCH ; DE := DISPATCH ADDRESS
|
||||
LD HL,TMS_IDAT ; HL := TMS INSTANCE DATA PTR
|
||||
CALL TERM_ATTACH ; DO IT
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -293,7 +314,7 @@ TMS_LOADFONT:
|
||||
CALL TMS_WR
|
||||
;
|
||||
; FILL $800 BYTES FROM FONTDATA
|
||||
LD HL,TMS_FONTDATA
|
||||
LD HL,FONT_TMS
|
||||
LD DE,$100 * 8
|
||||
TMS_LOADFONT1:
|
||||
LD B,8
|
||||
@@ -662,10 +683,11 @@ TMS_INIT9918:
|
||||
TMS_INIT9918LEN .EQU $ - TMS_INIT9918
|
||||
;
|
||||
;==================================================================================================
|
||||
; TMS DRIVER - FONT DATA
|
||||
; TMS DRIVER - INSTANCE DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
TMS_FONTDATA:
|
||||
#INCLUDE "TMS_font.inc"
|
||||
;
|
||||
#INCLUDE "ppk.asm"
|
||||
TMS_IDAT:
|
||||
.DB TMS_PPIA
|
||||
.DB TMS_PPIB
|
||||
.DB TMS_PPIC
|
||||
.DB TMS_PPIX
|
||||
|
||||
@@ -17,11 +17,17 @@
|
||||
; VDU DRIVER - CONSTANTS
|
||||
;======================================================================
|
||||
;
|
||||
VDU_RAMRD .EQU 0F0h ; READ VDU
|
||||
VDU_RAMWR .EQU 0F1h ; WRITE VDU
|
||||
VDU_STAT .EQU 0F2h ; VDU STATUS/REGISTER
|
||||
VDU_REG .EQU 0F2h ; VDU STATUS/REGISTER
|
||||
VDU_DATA .EQU 0F3h ; VDU DATA REGISTER
|
||||
VDU_BASE .EQU $F0
|
||||
;
|
||||
VDU_RAMRD .EQU VDU_BASE + $00 ; READ VDU
|
||||
VDU_RAMWR .EQU VDU_BASE + $01 ; WRITE VDU
|
||||
VDU_STAT .EQU VDU_BASE + $02 ; VDU STATUS/REGISTER
|
||||
VDU_REG .EQU VDU_BASE + $02 ; VDU STATUS/REGISTER
|
||||
VDU_DATA .EQU VDU_BASE + $03 ; VDU DATA REGISTER
|
||||
VDU_PPIA .EQU VDU_BASE + $04 ; PPI PORT A
|
||||
VDU_PPIB .EQU VDU_BASE + $05 ; PPI PORT B
|
||||
VDU_PPIC .EQU VDU_BASE + $06 ; PPI PORT C
|
||||
VDU_PPIX .EQU VDU_BASE + $07 ; PPI CONTROL PORT
|
||||
;
|
||||
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
||||
;
|
||||
@@ -30,24 +36,34 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
||||
;======================================================================
|
||||
;
|
||||
VDU_INIT:
|
||||
LD IY,VDU_IDAT ; POINTER TO INSTANCE DATA
|
||||
;
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("VDU: IO=0x$")
|
||||
LD A,VDU_RAMRD
|
||||
CALL PRTHEXBYTE
|
||||
CALL VDU_PROBE ; CHECK FOR HW EXISTENCE
|
||||
JR Z,VDU_INIT1 ; CONTINUE IF HW PRESENT
|
||||
;
|
||||
; HARDWARE NOT PRESENT
|
||||
PRTS(" NOT PRESENT$")
|
||||
OR $FF ; SIGNAL FAILURE
|
||||
RET
|
||||
;
|
||||
VDU_INIT1:
|
||||
CALL VDU_CRTINIT ; INIT SY6845 VDU CHIP
|
||||
CALL VDU_VDARES
|
||||
CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER
|
||||
;
|
||||
; ADD OURSELVES TO VDA DISPATCH TABLE
|
||||
LD B,0 ; PHYSICAL UNIT IS ZERO
|
||||
LD C,VDADEV_VDU ; DEVICE TYPE
|
||||
LD DE,0 ; UNIT DATA BLOB ADDRESS
|
||||
LD BC,VDU_DISPATCH ; BC := DISPATCH ADDRESS
|
||||
LD DE,VDU_IDAT ; DE := VDU INSTANCE DATA PTR
|
||||
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
||||
;
|
||||
; INITIALIZE EMULATION
|
||||
LD C,A ; ASSIGNED VIDEO UNIT IN C
|
||||
LD DE,VDU_DISPATCH ; DE := DISPATCH ADDRESS
|
||||
LD HL,VDU_IDAT ; HL := VDU INSTANCE DATA PTR
|
||||
CALL TERM_ATTACH ; DO IT
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -227,14 +243,36 @@ VDU_RDREG:
|
||||
RET
|
||||
;
|
||||
VDU_RDREGX:
|
||||
CALL VDU_RDREG ; GET VALUE FROM REGISTER IN C
|
||||
CALL VDU_RDREG ; GET VALUE FROM REGISTER IN C
|
||||
LD H,A ; SAVE IN H
|
||||
INC C ; BUMP TO NEXT REGISTER OF PAIR
|
||||
CALL VDU_RDREG ; READ THE VALUE
|
||||
CALL VDU_RDREG ; READ THE VALUE
|
||||
LD L,A ; SAVE IT IN L
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; PROBE FOR VDU HARDWARE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
VDU_PROBE:
|
||||
; WRITE TEST PATTERN $A5 $5A TO VRAM ADDRESS POINTER
|
||||
LD HL,$A55A ; POINT TO FIRST BYTE OF VRAM
|
||||
LD C,14 ; ADDRESS REGISTER PAIR
|
||||
CALL VDU_WRREGX ; UPDATE VRAM ADDRESS POINTER
|
||||
LD C,14 ; ADDRESS REGISTER PAIR
|
||||
CALL VDU_RDREGX ; READ IT BACK
|
||||
; TOP TWO BITS ARE ZEROED IN COMPARE BECAUSE THE CRTC
|
||||
; STORES ONLY A 14 BIT VALUE FOR REGISTER PAIR 14/15
|
||||
LD A,$A5 & $3F ; FIRST BYTE TEST VALUE
|
||||
CP H ; COMPARE
|
||||
RET NZ ; ABORT IF NOT EQUAL
|
||||
LD A,$5A ; SECOND BYTE TEST VALUE
|
||||
CP L ; COMPARE
|
||||
RET ; RETURN WITH COMPARE RESULTS
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SY6845 DISPLAY CONTROLLER CHIP INITIALIZATION
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
@@ -506,4 +544,13 @@ VDU_INIT6845:
|
||||
; NEAREST NUMBER OF LINES IS 312 = (R4+1) * (R9+1) + R5.
|
||||
; 15625 / 312 = 50.08 FIELDS PER SECOND (NEAR ENOUGH-DGG)
|
||||
;
|
||||
#INCLUDE "ppk.asm"
|
||||
;
|
||||
;==================================================================================================
|
||||
; VDU DRIVER - INSTANCE DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
VDU_IDAT:
|
||||
.DB VDU_PPIA
|
||||
.DB VDU_PPIB
|
||||
.DB VDU_PPIC
|
||||
.DB VDU_PPIX
|
||||
|
||||
894
Source/HBIOS/vga.asm
Normal file
894
Source/HBIOS/vga.asm
Normal file
@@ -0,0 +1,894 @@
|
||||
;======================================================================
|
||||
; VGA DRIVER FOR RBC PROJECT
|
||||
;
|
||||
; WRITTEN BY: WAYNE WARTHEN -- 5/29/2017
|
||||
;======================================================================
|
||||
;
|
||||
; TODO:
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - CONSTANTS
|
||||
;======================================================================
|
||||
;
|
||||
VGA_BASE .EQU $E0
|
||||
;
|
||||
VGA_KBDDATA .EQU VGA_BASE + $00 ; KBD CTLR DATA PORT
|
||||
VGA_KBDST .EQU VGA_BASE + $01 ; KBD CTLR STATUS/CMD PORT
|
||||
VGA_REG .EQU VGA_BASE + $02 ; SELECT CRTC REGISTER
|
||||
VGA_DATA .EQU VGA_BASE + $03 ; READ/WRITE CRTC DATA
|
||||
VGA_CFG .EQU VGA_BASE + $04 ; VGA3 BOARD CFG REGISTER
|
||||
VGA_HI .EQU VGA_BASE + $05 ; BOARD RAM HI ADDRESS
|
||||
VGA_LO .EQU VGA_BASE + $06 ; BOARD RAM LO ADDRESS
|
||||
VGA_DAT .EQU VGA_BASE + $07 ; BOARD RAM BYTE R/W
|
||||
;
|
||||
VGA_ROWS .EQU 25
|
||||
VGA_COLS .EQU 80
|
||||
;
|
||||
#DEFINE DEFREGS REGS_VGA
|
||||
;
|
||||
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
||||
;
|
||||
; DRIVER UTILIZES THE MULTIPLE DISPLAY WINDOW FEATURE OF THE CRTC TO ACCOMPLISH
|
||||
; FULL SCREEN SCROLLING WITHOUT THE NEED TO MOVE DISPLAY RAM BYTES.
|
||||
;
|
||||
; SCREEN 1 IMPLICITLY STARTS AT PHYSICAL ROW 0
|
||||
; SCREEN 1 RAM ADDRESS POINTER POINTS TO SCREEN OFFSET (R12/R13)
|
||||
; SCREEN 2 ROW DEFINES WHERE BUFFER BYTE 0 WILL BE DISPLAYED (R18)
|
||||
; SCREEN 2 RAM ADDRESS IS ALWAYS ZERO (R19/R20)
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - INITIALIZATION
|
||||
;======================================================================
|
||||
;
|
||||
VGA_INIT:
|
||||
LD IY,VGA_IDAT ; POINTER TO INSTANCE DATA
|
||||
;
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("VGA: IO=0x$")
|
||||
LD A,VGA_REG
|
||||
CALL PRTHEXBYTE
|
||||
CALL VGA_PROBE ; CHECK FOR HW PRESENCE
|
||||
JR Z,VGA_INIT1 ; CONTINUE IF HW PRESENT
|
||||
;
|
||||
; HARDWARE NOT PRESENT
|
||||
PRTS(" NOT PRESENT$")
|
||||
OR $FF ; SIGNAL FAILURE
|
||||
RET
|
||||
;
|
||||
VGA_INIT1:
|
||||
; DISPLAY CONSOLE DIMENSIONS
|
||||
LD A,VGA_COLS
|
||||
CALL PC_SPACE
|
||||
CALL PRTDECB
|
||||
LD A,'X'
|
||||
CALL COUT
|
||||
LD A,VGA_ROWS
|
||||
CALL PRTDECB
|
||||
PRTS(" TEXT$")
|
||||
|
||||
; HARDWARE INITIALIZATION
|
||||
CALL VGA_CRTINIT ; SETUP THE VGA CHIP REGISTERS
|
||||
CALL VGA_LOADFONT ; LOAD FONT DATA FROM ROM TO VGA STRORAGE
|
||||
CALL VGA_VDARES
|
||||
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
|
||||
|
||||
; ADD OURSELVES TO VDA DISPATCH TABLE
|
||||
LD BC,VGA_DISPATCH ; BC := DISPATCH ADDRESS
|
||||
LD DE,VGA_IDAT ; DE := VGA INSTANCE DATA PTR
|
||||
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
||||
|
||||
; INITIALIZE EMULATION
|
||||
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
|
||||
LD DE,VGA_DISPATCH ; DE := DISPATCH ADDRESS
|
||||
LD HL,VGA_IDAT ; HL := VGA INSTANCE DATA PTR
|
||||
CALL TERM_ATTACH ; DO IT
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS
|
||||
;======================================================================
|
||||
;
|
||||
VGA_DISPATCH:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
|
||||
JP Z,VGA_VDAINI ; $40
|
||||
DEC A
|
||||
JP Z,VGA_VDAQRY ; $41
|
||||
DEC A
|
||||
JP Z,VGA_VDARES ; $42
|
||||
DEC A
|
||||
JP Z,VGA_VDADEV ; $43
|
||||
DEC A
|
||||
JP Z,VGA_VDASCS ; $44
|
||||
DEC A
|
||||
JP Z,VGA_VDASCP ; $45
|
||||
DEC A
|
||||
JP Z,VGA_VDASAT ; $46
|
||||
DEC A
|
||||
JP Z,VGA_VDASCO ; $47
|
||||
DEC A
|
||||
JP Z,VGA_VDAWRC ; $48
|
||||
DEC A
|
||||
JP Z,VGA_VDAFIL ; $49
|
||||
DEC A
|
||||
JP Z,VGA_VDACPY ; $4A
|
||||
DEC A
|
||||
JP Z,VGA_VDASCR ; $4B
|
||||
DEC A
|
||||
JP Z,KBD_STAT ; $4C
|
||||
DEC A
|
||||
JP Z,KBD_FLUSH ; $4D
|
||||
DEC A
|
||||
JP Z,KBD_READ ; $4E
|
||||
CALL PANIC
|
||||
|
||||
VGA_VDAINI:
|
||||
; RESET VDA
|
||||
; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA
|
||||
CALL VGA_VDARES ; RESET VDA
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDAQRY:
|
||||
LD C,$00 ; MODE ZERO IS ALL WE KNOW
|
||||
LD D,VGA_ROWS ; ROWS
|
||||
LD E,VGA_COLS ; COLS
|
||||
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDARES:
|
||||
LD A,$07 ; ATTRIBUTE IS STANDARD WHITE ON BLACK
|
||||
LD (VGA_ATTR),A ; SAVE IT
|
||||
XOR A ; ZERO (REVEVERSE, UNDERLINE, BLINK)
|
||||
LD (VGA_RUB),A ; SAVE IT
|
||||
|
||||
LD DE,0 ; ROW = 0, COL = 0
|
||||
CALL VGA_XY ; SEND CURSOR TO TOP LEFT
|
||||
LD A,' ' ; BLANK THE SCREEN
|
||||
LD DE,$800 ; FILL ENTIRE BUFFER
|
||||
CALL VGA_FILL ; DO IT
|
||||
LD DE,0 ; ROW = 0, COL = 0
|
||||
CALL VGA_XY ; SEND CURSOR TO TOP LEFT
|
||||
|
||||
LD HL,$0404 ; SET VIDEO ENABLE BIT
|
||||
CALL VGA_SETCFG ; DO IT
|
||||
|
||||
XOR A
|
||||
RET
|
||||
|
||||
VGA_VDADEV:
|
||||
LD D,VDADEV_VGA ; D := DEVICE TYPE
|
||||
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDASCS:
|
||||
CALL PANIC ; NOT IMPLEMENTED (YET)
|
||||
|
||||
VGA_VDASCP:
|
||||
CALL VGA_XY ; SET CURSOR POSITION
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDASAT:
|
||||
; INCOMING IS: -----RUB (R=REVERSE, U=UNDERLINE, B=BLINK)
|
||||
;
|
||||
; JUST SAVE THE VALUE AND FALL THROUGH. ONLY REVERSE IS
|
||||
; SUPPORTED WHICH IS IMPLEMENTED BELOW.
|
||||
LD A,E
|
||||
LD (VGA_RUB),A ; SAVE IT
|
||||
JR VGA_VDASCO2 ; IMPLEMENT SETTING
|
||||
|
||||
VGA_VDASCO:
|
||||
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
|
||||
; TRANSFORM TO: -RGBIRGB (DISCARD INTENSITY BIT IN HIGH NIBBLE)
|
||||
;
|
||||
; A := INVERTED E, SO A IS RGBIRGBI (F/B)
|
||||
LD B,8 ; DO 8 BITS
|
||||
VGA_VDASCO1:
|
||||
RRC E ; LOW BIT OF E ROTATED RIGHT INTO CF
|
||||
RLA ; CF ROTATED LEFT INTO LOW BIT OF A
|
||||
DJNZ VGA_VDASCO1 ; DO FOR ALL 8 BITS
|
||||
; LS A X 3 TO SWAP F/B BITS, SO A IS IRGBIRGB (B/F)
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
; MASK FOR RELEVANT BITS, SO A IS 0R0B0R0B
|
||||
AND %01010101
|
||||
; SAVE A IN C AND SET A = E
|
||||
LD C,A
|
||||
LD A,E
|
||||
; MASK FOR RELEVANT BITS, SO A IS 00G0I0G0
|
||||
AND %00101010
|
||||
; COMBINE WITH SAVED
|
||||
OR E
|
||||
; SAVE NEW ATTR VALUE
|
||||
LD (VGA_ATTR),A ; AND SAVE THE RESULT
|
||||
VGA_VDASCO2:
|
||||
; CHECK FOR REVERSE VIDEO
|
||||
LD A,(VGA_RUB) ; GET RUB SETTING
|
||||
BIT 2,A ; REVERSE IS BIT 2
|
||||
JR Z,VGA_VDASCO3 ; DONE IF REVERSE VID NOT SET
|
||||
; IMPLEMENT REVERSE VIDEO
|
||||
LD A,(VGA_ATTR) ; GET ATTRIBUTE
|
||||
PUSH AF ; SAVE IT
|
||||
AND %00001000 ; ISOLATE INTENSITY BIT
|
||||
LD E,A ; SAVE IN E
|
||||
POP AF ; GOT ATTR BACK
|
||||
RLCA ; SWAP FG/BG COLORS
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
AND %01110111 ; REMOVE HIGH BITS
|
||||
OR E ; COMBINE WITH PREVIOUS INTENSITY BIT
|
||||
LD (VGA_ATTR),A ; SAVE NEW VALUE
|
||||
VGA_VDASCO3:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDAWRC:
|
||||
LD A,E ; CHARACTER TO WRITE GOES IN A
|
||||
CALL VGA_PUTCHAR ; PUT IT ON THE SCREEN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDAFIL:
|
||||
LD A,E ; FILL CHARACTER GOES IN A
|
||||
EX DE,HL ; FILL LENGTH GOES IN DE
|
||||
CALL VGA_FILL ; DO THE FILL
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDACPY:
|
||||
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS VGA_POS
|
||||
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT
|
||||
PUSH HL ; SAVE LENGTH
|
||||
CALL VGA_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
|
||||
POP BC ; RECOVER LENGTH IN BC
|
||||
LD DE,(VGA_POS) ; PUT DEST IN DE
|
||||
JP VGA_BLKCPY ; DO A BLOCK COPY
|
||||
|
||||
VGA_VDASCR:
|
||||
LD A,E ; LOAD E INTO A
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; IF ZERO, WE ARE DONE
|
||||
PUSH DE ; SAVE E
|
||||
JP M,VGA_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL
|
||||
CALL VGA_SCROLL ; SCROLL FORWARD ONE LINE
|
||||
POP DE ; RECOVER E
|
||||
DEC E ; DECREMENT IT
|
||||
JR VGA_VDASCR ; LOOP
|
||||
VGA_VDASCR1:
|
||||
CALL VGA_RSCROLL ; SCROLL REVERSE ONE LINE
|
||||
POP DE ; RECOVER E
|
||||
INC E ; INCREMENT IT
|
||||
JR VGA_VDASCR ; LOOP
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - PRIVATE DRIVER FUNCTIONS
|
||||
;======================================================================
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SET BOARD CONFIGURATON REGISTER
|
||||
; MASK IN H, VALUE IN L
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_SETCFG:
|
||||
PUSH AF ; PRESERVE AF
|
||||
LD A,H ; MASK IN ACCUM
|
||||
CPL ; INVERT IT
|
||||
LD H,A ; BACK TO H
|
||||
LD A,(VGA_CFGV) ; GET CURRENT CONFIG VALUE
|
||||
AND H ; RESET ALL TARGET BITS
|
||||
OR L ; SET TARGET BITS
|
||||
LD (VGA_CFGV),A ; SAVE NEW VALUE
|
||||
OUT (VGA_CFG),A ; AND WRITE IT TO REGISTER
|
||||
POP AF ; RESTORE AF
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; UPDATE CRTC REGISTERS
|
||||
; VGA_REGWR WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_REGWR:
|
||||
PUSH AF ; SAVE VALUE TO WRITE
|
||||
LD A,C ; SET A TO VGA REGISTER TO SELECT
|
||||
OUT (VGA_REG),A ; WRITE IT TO SELECT THE REGISTER
|
||||
POP AF ; RESTORE VALUE TO WRITE
|
||||
OUT (VGA_DATA),A ; WRITE IT
|
||||
RET
|
||||
;
|
||||
VGA_REGWRX:
|
||||
LD A,H ; SETUP MSB TO WRITE
|
||||
CALL VGA_REGWR ; DO IT
|
||||
INC C ; NEXT CVDU REGISTER
|
||||
LD A,L ; SETUP LSB TO WRITE
|
||||
JR VGA_REGWR ; DO IT & RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; READ CRTC REGISTERS
|
||||
; VGA_REGRD READS VDU REGISTER SPECIFIED IN C AND RETURNS VALUE IN A
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_REGRD:
|
||||
LD A,C ; SET A TO VGA REGISTER TO SELECT
|
||||
OUT (VGA_REG),A ; WRITE IT TO SELECT THE REGISTER
|
||||
IN A,(VGA_DATA) ; READ IT
|
||||
RET
|
||||
;
|
||||
VGA_REGRDX:
|
||||
CALL VGA_REGRD ; GET VALUE FROM REGISTER IN C
|
||||
LD H,A ; SAVE IN H
|
||||
INC C ; BUMP TO NEXT REGISTER OF PAIR
|
||||
CALL VGA_REGRD ; READ THE VALUE
|
||||
LD L,A ; SAVE IT IN L
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; WRITE VIDEO RAM
|
||||
; VGA_MEMWR WRITES VALUE IN A TO ADDRESS IN DE
|
||||
; VGA_MEMWRX WRITES VALUE IN HL TO ADDRESS IN DE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_MEMWR:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
OUT (C),A
|
||||
RET
|
||||
;
|
||||
VGA_MEMWRX:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
OUT (C),H
|
||||
INC E
|
||||
DEC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
OUT (C),L
|
||||
DEC E
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; READ VIDEO RAM
|
||||
; VGA_MEMRD READS VALUE IN DE TO A
|
||||
; VGA_MEMRDX READS VALUE IN DE TO HL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_MEMRD:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
IN A,(C)
|
||||
RET
|
||||
;
|
||||
VGA_MEMRDX:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
IN H,(C)
|
||||
INC E
|
||||
DEC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
IN L,(C)
|
||||
DEC E
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; WAIT FOR VERTICAL RETRACE ACTIVE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_WAITSB:
|
||||
LD A,31 ; CRTC REG 31 IS STATUS REG
|
||||
OUT (VGA_REG),A ; SETUP TO ACCESS IT
|
||||
VGA_WAITSB1:
|
||||
IN A,(VGA_DATA) ; GET STATUS
|
||||
BIT 1,A ; TEST SB BIT (RETRACE ACTIVE)
|
||||
RET NZ ; RETURN IF ACTIVE
|
||||
JR VGA_WAITSB1 ; LOOP
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; PROBE FOR VGA HARDWARE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
VGA_PROBE:
|
||||
LD DE,0 ; POINT TO FIRST BYTE OF VRAM
|
||||
LD A,$A5 ; INITIAL TEST VALUE
|
||||
LD B,A ; SAVE IN B
|
||||
CALL VGA_MEMWR ; WRITE IT
|
||||
INC E ; NEXT BYTE OF VRAM
|
||||
CPL ; INVERT TEST VALUE
|
||||
CALL VGA_MEMWR ; WRITE IT
|
||||
DEC E ; BACK TO FIRST BYTE OF VRAM
|
||||
CALL VGA_MEMRD ; READ IT
|
||||
CP B ; CHECK FOR TEST VALUE
|
||||
RET NZ ; RETURN NZ IF FAILURE
|
||||
INC E ; SECOND VRAM BYTE
|
||||
CALL VGA_MEMRD ; READ IT
|
||||
CPL ; INVERT IT
|
||||
CP B ; CHECK FOR INVERTED TEST VALUE
|
||||
RET ; RETURN WITH ZF SET BASED ON CP
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; CRTC DISPLAY CONTROLLER CHIP INITIALIZATION
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_CRTINIT:
|
||||
LD HL,$FF00 ; ZERO ALL CFG BITS
|
||||
CALL VGA_SETCFG ; DO IT
|
||||
|
||||
CALL VGA_RES ; RESET CRTC (ALL REGS TO ZERO)
|
||||
|
||||
LD HL,DEFREGS ; HL = POINTER TO TABLE OF REG VALUES
|
||||
VGA_CRTINIT1:
|
||||
LD A,(HL) ; FIRST BYTE IS REG ADR
|
||||
LD C,A ; PUT IN C FOR LATER
|
||||
INC A ; TEST FOR END MARKER ($FF)
|
||||
RET Z ; IF EQUAL, DONE
|
||||
INC HL ; NEXT BYTE
|
||||
LD A,(HL) ; SECOND BYTE IS REG VAL
|
||||
INC HL ; HL TO NEXT ENTRY
|
||||
CALL VGA_REGWR ; WRITE REGISTER VALUE
|
||||
JR VGA_CRTINIT1 ; LOOP
|
||||
;
|
||||
VGA_RES:
|
||||
LD C,0 ; START WITH REG ZERO
|
||||
LD B,40 ; CLEAR 40 REGISTERS
|
||||
VGA_RES1:
|
||||
XOR A ; VALUE IS ZERO
|
||||
CALL VGA_REGWR ; SET VALUE
|
||||
INC C ; NEXT REGISTER
|
||||
DJNZ VGA_RES1 ; LOOP TILL DONE
|
||||
RET ; DONE
|
||||
;
|
||||
VGA_CRTCDUMP:
|
||||
LD C,0 ; START WITH REG ZERO
|
||||
LD B,40 ; CLEAR 40 REGISTERS
|
||||
VGA_CRTCDUMP1:
|
||||
CALL VGA_REGRD ; SET VALUE
|
||||
CALL PRTHEXBYTE
|
||||
CALL PC_SPACE
|
||||
INC C ; NEXT REGISTER
|
||||
DJNZ VGA_CRTCDUMP1 ; LOOP TILL DONE
|
||||
RET ; DONE
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; LOAD FONT DATA
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_LOADFONT:
|
||||
LD HL,$7000 ; CLEAR FONT PAGE NUM
|
||||
CALL VGA_SETCFG
|
||||
|
||||
LD DE,$7000 ; PAGE 7 OF VIDEO RAM
|
||||
LD HL,FONT_HI ; START OF FONT DATA
|
||||
VGA_LOADFONT1:
|
||||
LD A,(HL) ; GET NEXT BYTE
|
||||
CALL VGA_MEMWR ; MEM(DE) := A
|
||||
INC HL ; NEXT FONT BYTE
|
||||
INC DE ; NEXT MEM BYTE
|
||||
LD A,D
|
||||
CP $80 ; CHECK FOR END
|
||||
JR NZ,VGA_LOADFONT1 ; LOOP
|
||||
LD HL,$7070 ; SET FONT PAGE NUM TO 7
|
||||
CALL VGA_SETCFG
|
||||
RET ; DONE
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_XY:
|
||||
CALL VGA_XY2IDX ; CONVERT ROW/COL TO BUF IDX
|
||||
LD (VGA_POS),HL ; SAVE THE RESULT (DISPLAY POSITION)
|
||||
LD C,14 ; CURSOR POSITION REGISTER PAIR
|
||||
JP VGA_REGWRX ; DO IT AND RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL
|
||||
; D=ROW, E=COL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_XY2IDX:
|
||||
LD A,E ; SAVE COLUMN NUMBER IN A
|
||||
LD H,D ; SET H TO ROW NUMBER
|
||||
LD E,VGA_COLS ; SET E TO ROW LENGTH
|
||||
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
||||
LD E,A ; GET COLUMN BACK
|
||||
ADD HL,DE ; ADD IT IN
|
||||
|
||||
LD DE,(VGA_OFF) ; SCREEN OFFSET
|
||||
ADD HL,DE ; ADJUST
|
||||
;
|
||||
PUSH HL ; SAVE IT
|
||||
LD DE,VGA_ROWS * VGA_COLS ; DE := BUF SIZE
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; SUBTRACT FROM HL
|
||||
JR C,VGA_XY2IDX1 ; BYPASS IF NO WRAP
|
||||
POP DE ; THROW AWAY TOS
|
||||
RET ; DONE
|
||||
VGA_XY2IDX1:
|
||||
POP HL ; NO WRAP, RESTORE
|
||||
RET ; RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; WRITE VALUE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_PUTCHAR:
|
||||
; SETUP DE WITH BUFFER ADDRESS
|
||||
LD DE,(VGA_POS) ; GET CURRENT POSITION
|
||||
SLA E ; MULTIPLY BY 2
|
||||
RL D ; ... 2 BYTES PER CHAR
|
||||
; SETUP CHAR/ATTR IN HL
|
||||
LD H,A ; CHARACTER
|
||||
LD A,(VGA_ATTR) ; ATTRIBUTE
|
||||
LD L,A ; ... TO L
|
||||
; WRITE CHAR & ATTR
|
||||
;CALL VGA_WAITSB ; WAIT FOR RETRACE
|
||||
CALL VGA_MEMWRX
|
||||
; UPDATE CURRENT POSITION
|
||||
LD HL,(VGA_POS) ; GET CURSOR POSITION
|
||||
INC HL ; INCREMENT
|
||||
;
|
||||
PUSH HL ; SAVE IT
|
||||
LD DE,VGA_ROWS * VGA_COLS ; DE := BUF SIZE
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; SUBTRACT FROM HL
|
||||
JR C,VGA_PUTCHAR1 ; BYPASS IF NO WRAP
|
||||
POP DE ; THROW AWAY TOS
|
||||
JR VGA_PUTCHAR2 ; CONTINUE
|
||||
VGA_PUTCHAR1:
|
||||
POP HL ; NO WRAP, RESTORE
|
||||
VGA_PUTCHAR2:
|
||||
LD (VGA_POS),HL ; SAVE NEW POSITION
|
||||
LD C,14 ; CURSOR POSITION REGISTER PAIR
|
||||
JP VGA_REGWRX ; DO IT AND RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE
|
||||
; STARTING AT THE CURRENT FRAME BUFFER POSITION
|
||||
; A: FILL CHARACTER
|
||||
; DE: NUMBER OF CHARACTERS TO FILL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_FILL:
|
||||
LD B,A ; CACHE FILL CHAR IN B
|
||||
|
||||
; SETUP HL WITH INITIAL BUFFER ADDRESS
|
||||
LD HL,(VGA_POS) ; GET CURRENT POSITION
|
||||
SLA L ; MULTIPLY BY 2
|
||||
RL H ; ... 2 BYTES PER CHAR
|
||||
|
||||
VGA_FILL1:
|
||||
; FILL ONE POSITION (CHAR & ATTR)
|
||||
LD C,VGA_HI ; C := VGA ADR HI
|
||||
OUT (C),H ; SET HI ADDR
|
||||
INC C ; C := VGA ADR LO
|
||||
OUT (C),L ; SET LO ADDR
|
||||
INC C ; POINT TO DATA REG
|
||||
OUT (C),B ; OUTPUT FILL CHAR
|
||||
INC L ; BUMP ADDR (ONLY NEED TO DO LOW BYTE)
|
||||
DEC C ; C := VGA ADDR LO
|
||||
OUT (C),L ; UDPATE LO ADDR
|
||||
INC C ; POINT TO DATA REG
|
||||
;CALL VGA_WAITSB ; WAIT FOR RETRACE
|
||||
LD A,(VGA_ATTR) ; GET CUR ATTR
|
||||
OUT (C),A ; OUTPUT ATTR
|
||||
|
||||
; CHECK COUNT
|
||||
DEC DE ; DECREMENT COUNT
|
||||
LD A,D ; TEST FOR
|
||||
OR E ; ... ZERO
|
||||
RET Z ; DONE IF SO
|
||||
|
||||
; BUMP BUFFER ADDRESS WITH POSSIBLE WRAP
|
||||
INC HL ; NEXT POSITION
|
||||
LD A,0 + (VGA_ROWS * VGA_COLS * 2) & $FF
|
||||
CP L ; TEST LOW BYTE
|
||||
JR NZ,VGA_FILL1 ; IF NOT EQ, NO WRAP, LOOP
|
||||
LD A,0 + ((VGA_ROWS * VGA_COLS * 2) >> 8) & $FF
|
||||
CP H ; TEST HI BYTE
|
||||
JR NZ,VGA_FILL1 ; IF NOT EQ, NO WRAP, LOOP
|
||||
LD HL,0 ; WRAP!
|
||||
JR VGA_FILL1 ; AND LOOP
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED)
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_SCROLL:
|
||||
; CLEAR TOP LINE WHICH IS ABOUT TO BECOME NEW LINE
|
||||
; AT BOTTOM OF SCREEN
|
||||
LD DE,(VGA_POS) ; GET CURRENT POS
|
||||
PUSH DE ; SAVE IT
|
||||
LD DE,(VGA_OFF) ; TOP OF SCREEN IS OFFSET VALUE
|
||||
LD (VGA_POS),DE ; SET POS
|
||||
LD DE,VGA_COLS ; CLEAR ONE ROW
|
||||
LD A,' ' ; WITH BLANKS
|
||||
CALL VGA_FILL ; DO IT
|
||||
POP DE ; GET ORIG POS VALUE BACK
|
||||
LD (VGA_POS),DE ; AND SAVE IT
|
||||
;
|
||||
; OFF += ROWLEN, IF OFF >= BUFSIZ, ADR := 0
|
||||
LD HL,(VGA_OFF) ; CURRENT SCREEN OFFSET
|
||||
LD A,VGA_COLS ; ROW LENGTH
|
||||
CALL ADDHLA ; BUMP TO NEXT ROW
|
||||
PUSH HL ; SAVE IT
|
||||
LD DE,VGA_ROWS * VGA_COLS ; DE := BUF SIZE
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; SUBTRACT FROM HL
|
||||
JR C,VGA_SCROLL1
|
||||
LD HL,0 ; WRAP AROUND TO 0
|
||||
POP DE ; THROW AWAY TOS
|
||||
JR VGA_SCROLL2 ; CONTINUE
|
||||
VGA_SCROLL1:
|
||||
POP HL ; NO WRAP, RESTORE
|
||||
VGA_SCROLL2:
|
||||
LD (VGA_OFF),HL ; SAVE IT
|
||||
CALL VGA_WAITSB
|
||||
LD C,12 ; SCREEN 1 ADDRESS
|
||||
CALL VGA_REGWRX ; COMMIT
|
||||
;
|
||||
; S2ROW--, IF S2ROW < 0, THEN S2ROW := MAXROW
|
||||
LD A,(VGA_S2ROW) ; CURRENT S2 ROW
|
||||
OR A ; = 0?
|
||||
JR Z,VGA_SCROLL3 ; IF 0, WRAP
|
||||
DEC A ; DECREMENT
|
||||
JR VGA_SCROLL4 ; AND CONTINUE
|
||||
VGA_SCROLL3:
|
||||
LD A,VGA_ROWS - 1 ; WRAP BACK TO MAX ROW
|
||||
VGA_SCROLL4:
|
||||
LD (VGA_S2ROW),A ; SAVE IT
|
||||
DEC A ; ADJUST
|
||||
LD C,18 ; S2 ROW REG
|
||||
CALL VGA_REGWR ; COMMIT
|
||||
;
|
||||
; POS += ROWLEN; IF POS >= BUFSIZ, POS -= BUFSIZ
|
||||
LD HL,(VGA_POS) ; CURRENT POSITION
|
||||
LD A,VGA_COLS ; ROW LENGTH
|
||||
CALL ADDHLA ; BUMP TO NEXT ROW
|
||||
PUSH HL ; SAVE IT
|
||||
LD DE,VGA_ROWS * VGA_COLS ; DE := BUF SIZE
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; SUBTRACT FROM HL
|
||||
JR C,VGA_SCROLL5 ; BYPASS IF NO WRAP
|
||||
POP DE ; THROW AWAY TOS
|
||||
JR VGA_SCROLL6 ; CONTINUE
|
||||
VGA_SCROLL5:
|
||||
POP HL ; NO WRAP, RESTORE
|
||||
VGA_SCROLL6:
|
||||
LD (VGA_POS),HL ; SAVE IT
|
||||
LD C,14 ; CURSOR 1 POS REG
|
||||
CALL VGA_REGWRX ; COMMIT
|
||||
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED)
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_RSCROLL:
|
||||
; OFF -= ROWLEN, IF OFF < 0, OFF := MAXROW ((ROWS - 1) * COLS)
|
||||
LD HL,(VGA_OFF) ; CURRENT SCREEN OFFSET
|
||||
LD DE,VGA_COLS ; SUBTRACT ONE ROW
|
||||
SBC HL,DE ; DO IT
|
||||
JR NC,VGA_RSCROLL1 ; IF NOT NEGATIVE, CONTINUE
|
||||
LD HL,0 + ((VGA_ROWS - 1) * VGA_COLS)
|
||||
VGA_RSCROLL1:
|
||||
LD (VGA_OFF),HL ; SAVE IT
|
||||
CALL VGA_WAITSB ; WAIT FOR RETRACE
|
||||
LD C,12 ; SCREEN 1 ADDRESS
|
||||
CALL VGA_REGWRX ; COMMIT
|
||||
;
|
||||
; S2ROW++, IF S2ROW >= ROWS, THEN S2ROW := 0
|
||||
LD A,(VGA_S2ROW) ; CURRENT S2 ROW
|
||||
INC A ; BUMP TO NEXT ROW
|
||||
CP VGA_ROWS ; COMPARE TO ROWS
|
||||
JR C,VGA_RSCROLL2 ; IF NOT >= ROWS, CONTINUE
|
||||
XOR A ; SET TO ZERO
|
||||
VGA_RSCROLL2:
|
||||
LD (VGA_S2ROW),A ; SAVE IT
|
||||
DEC A ; ADJUST
|
||||
LD C,18 ; S2 ROW REG
|
||||
CALL VGA_REGWR ; COMMIT
|
||||
;
|
||||
; POS -= ROWLEN; IF POS < 0, POS += BUFSIZ
|
||||
LD HL,(VGA_POS) ; CURRENT SCREEN OFFSET
|
||||
LD DE,VGA_COLS ; SUBTRACT ONE ROW
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; DO IT
|
||||
JR NC,VGA_RSCROLL3 ; IF NOT NEGATIVE, CONTINUE
|
||||
LD DE,VGA_ROWS * VGA_COLS ; DE := BUF SIZE
|
||||
ADD HL,DE ; ADD TO HL
|
||||
VGA_RSCROLL3:
|
||||
LD (VGA_POS),HL ; SAVE IT
|
||||
LD C,14 ; CURSOR 1 POS REG
|
||||
CALL VGA_REGWRX ; COMMIT
|
||||
;
|
||||
; CLEAR TOP LINE JUST EXPOSED
|
||||
LD DE,(VGA_POS) ; GET CURRENT POS
|
||||
PUSH DE ; SAVE IT
|
||||
LD DE,(VGA_OFF) ; TOP OF SCREEN IS OFFSET VALUE
|
||||
LD (VGA_POS),DE ; SET POS
|
||||
LD DE,VGA_COLS ; CLEAR ONE ROW
|
||||
LD A,' ' ; WITH BLANKS
|
||||
CALL VGA_FILL ; DO IT
|
||||
POP DE ; GET ORIG POS VALUE BACK
|
||||
LD (VGA_POS),DE ; AND SAVE IT
|
||||
;
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; BLOCK COPY BC BYTES FROM HL TO DE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_BLKCPY:
|
||||
; DOUBLE BC TO ACCOUNT FOR 2 BYTE ENTRIES (CHAR & ATTR)
|
||||
SLA C
|
||||
RL B
|
||||
PUSH BC ; COUNT ==> TOS
|
||||
|
||||
; ADJUST HL & DE FOR SCREEN OFFSET/WRAP
|
||||
CALL VGA_BLKCPY4 ; DO HL
|
||||
EX DE,HL ; SWAP
|
||||
CALL VGA_BLKCPY4 ; DO OTHER
|
||||
EX DE,HL ; SWAP BACK
|
||||
|
||||
VGA_BLKCPY1:
|
||||
;CALL VGA_WAITSB ; WAIT FOR RETRACE
|
||||
|
||||
; GET NEXT SOURCE BYTE
|
||||
LD C,VGA_HI ; C := VGA_HI
|
||||
OUT (C),H ; VGA_HI := SOURCE HI (H)
|
||||
INC C ; C := VGA_LO
|
||||
OUT (C),L ; VGA_LO := SOURCE LO (L)
|
||||
INC C ; C := VGA_DATA
|
||||
IN A,(C) ; A := (HL)
|
||||
|
||||
; COPY TO DESTINATION
|
||||
LD C,VGA_HI ; C := VGA_HI
|
||||
OUT (C),D ; VGA_HI := SOURCE HI (H)
|
||||
INC C ; C := VGA_LO
|
||||
OUT (C),E ; VGA_LO := SOURCE LO (L)
|
||||
INC C ; C := VGA_DATA
|
||||
OUT (C),A ; (DE) := A
|
||||
|
||||
; BUMP SOURCE ADDRESS WITH POSSIBLE WRAP
|
||||
INC HL ; NEXT POSITION
|
||||
LD A,0 + (VGA_ROWS * VGA_COLS * 2) & $FF
|
||||
CP L ; TEST LOW BYTE
|
||||
JR NZ,VGA_BLKCPY2 ; IF NOT EQ, NO WRAP, CONTINUE
|
||||
LD A,0 + ((VGA_ROWS * VGA_COLS * 2) >> 8) & $FF
|
||||
CP H ; TEST HI BYTE
|
||||
JR NZ,VGA_BLKCPY2 ; IF NOT EQ, NO WRAP, CONTINUE
|
||||
LD HL,0 ; WRAP!
|
||||
|
||||
VGA_BLKCPY2:
|
||||
; BUMP DEST ADDRESS WITH POSSIBLE WRAP
|
||||
INC DE ; NEXT POSITION
|
||||
LD A,0 + (VGA_ROWS * VGA_COLS * 2) & $FF
|
||||
CP E ; TEST LOW BYTE
|
||||
JR NZ,VGA_BLKCPY3 ; IF NOT EQ, NO WRAP, CONTINUE
|
||||
LD A,0 + ((VGA_ROWS * VGA_COLS * 2) >> 8) & $FF
|
||||
CP D ; TEST HI BYTE
|
||||
JR NZ,VGA_BLKCPY3 ; IF NOT EQ, NO WRAP, CONTINUE
|
||||
LD DE,0 ; WRAP!
|
||||
|
||||
VGA_BLKCPY3:
|
||||
; DECREMENT BYTE COUNT AND CHECK FOR COMPLETION
|
||||
EX (SP),HL ; GET COUNT, SAVE HL
|
||||
DEC HL ; DECREMENT
|
||||
LD A,H ; TEST FOR
|
||||
CP L ; ... ZERO
|
||||
EX (SP),HL ; COUNT BACK TO TOS, RESTORE HL
|
||||
JR NZ,VGA_BLKCPY1 ; LOOP IF NOT ZERO
|
||||
POP BC ; CLEAN UP STACK
|
||||
RET ; DONE
|
||||
;
|
||||
VGA_BLKCPY4:
|
||||
; SUBROUTINE TO ADJUST FOR SCREEN OFFSET/WRAP
|
||||
PUSH DE ; SAVE DE
|
||||
LD DE,(VGA_OFF) ; CUR SCRN OFFSET
|
||||
;ADD HL,DE ; ADJUST FOR OFFSET
|
||||
SLA L ; MULTIPLY BY 2
|
||||
RL H ; ... FOR TWO BYTES PER ENTRY
|
||||
PUSH HL ; SAVE IT
|
||||
LD DE,VGA_ROWS * VGA_COLS * 2 ; DE := BUF SIZE
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; SUBTRACT FROM HL
|
||||
JR C,VGA_BLKCPY4A ; BYPASS IF NO WRAP
|
||||
POP DE ; THROW AWAY TOS
|
||||
JR VGA_BLKCPY4B ; CONTINUE
|
||||
VGA_BLKCPY4A:
|
||||
POP HL ; NO WRAP, RESTORE
|
||||
VGA_BLKCPY4B:
|
||||
POP DE ; RESTORE DE
|
||||
RET
|
||||
;
|
||||
;==================================================================================================
|
||||
; VGA DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
VGA_ATTR .DB 0 ; CURRENT COLOR
|
||||
VGA_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
VGA_OFF .DW 0 ; SCREEN START OFFSET INTO CRTC RAM
|
||||
VGA_S2ROW .DB 0 ; CURRENT S2 ROW
|
||||
VGA_CFGV .DB 0 ; CURRENT BOARD CONFIG VALUE
|
||||
VGA_RUB .DB 0 ; REVERSE/UNDERLINE/BLINK (-----RUB)
|
||||
;
|
||||
; ATTRIBUTE ENCODING:
|
||||
; BIT 7: ALT FONT
|
||||
; BIT 6: BG REG
|
||||
; BIT 5: BG GREEN
|
||||
; BIT 4: BG BLUE
|
||||
; BIT 3: FG INTENSITY
|
||||
; BIT 2: FG RED
|
||||
; BIT 1: FG GREEN
|
||||
; BIT 0: FG BLUE
|
||||
;
|
||||
;===============================================================================
|
||||
; DEFAULT REGISTER VALUES
|
||||
;===============================================================================
|
||||
;
|
||||
REGS_VGA:
|
||||
.DB 0,100 - 1 ; HORZ TOT - 1
|
||||
.DB 1,80 ; HORZ DISP
|
||||
.DB 2,80 + 2 ; HORZ DISP + HORZ FP
|
||||
.DB 3,(2 << 4) | (12 & $0F) ; VERT SW, HORZ SW
|
||||
.DB 4,28 - 1 ; VERT TOT - 1
|
||||
.DB 5,1 ; VERT TOT ADJ
|
||||
.DB 6,25 ; VERT DISP
|
||||
.DB 7,25 + 1 ; VERT DISP + VERT FP
|
||||
.DB 9,16 - 1 ; CHAR HEIGHT - 1
|
||||
.DB 10,(13 | $60) ; CURSOR START & CURSOR BLINK
|
||||
.DB 11,14 ; CURSOR END
|
||||
.DB 12,($0000 >> 8) & $FF ; SCRN 1 START (HI)
|
||||
.DB 13,($0000 & $FF) ; SCRN 1 START (LO)
|
||||
.DB 18,-1 ; S2 ROW - 1
|
||||
.DB 30,$01 ; CONTROL 1, ENABLE 2 WINDOWS
|
||||
.DB 31,0 ; CONTROL 2
|
||||
.DB 33,0 ; CONTROL 3
|
||||
|
||||
|
||||
.DB $FF ; END MARKER
|
||||
;
|
||||
;==================================================================================================
|
||||
; VGA DRIVER - INSTANCE DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
VGA_IDAT:
|
||||
.DB VGA_KBDST
|
||||
.DB VGA_KBDDATA
|
||||
|
||||
|
||||
|
||||
|
||||
; PUSH BC
|
||||
; PUSH DE
|
||||
; POP BC
|
||||
; CALL PC_SPACE
|
||||
; CALL PRTHEXWORD
|
||||
; POP BC
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
773
Source/HBIOS/vga_old.asm
Normal file
773
Source/HBIOS/vga_old.asm
Normal file
@@ -0,0 +1,773 @@
|
||||
;======================================================================
|
||||
; VGA DRIVER FOR RBC PROJECT
|
||||
;
|
||||
; WRITTEN BY: WAYNE WARTHEN -- 5/29/2017
|
||||
;======================================================================
|
||||
;
|
||||
; TODO:
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - CONSTANTS
|
||||
;======================================================================
|
||||
;
|
||||
VGA_BASE .EQU $E0
|
||||
;
|
||||
VGA_KBDDATA .EQU VGA_BASE + $00 ; KBD CTLR DATA PORT
|
||||
VGA_KBDST .EQU VGA_BASE + $01 ; KBD CTLR STATUS/CMD PORT
|
||||
VGA_REG .EQU VGA_BASE + $02 ; SELECT CRTC REGISTER
|
||||
VGA_DATA .EQU VGA_BASE + $03 ; READ/WRITE CRTC DATA
|
||||
VGA_CFG .EQU VGA_BASE + $04 ; VGA3 BOARD CFG REGISTER
|
||||
VGA_HI .EQU VGA_BASE + $05 ; BOARD RAM HI ADDRESS
|
||||
VGA_LO .EQU VGA_BASE + $06 ; BOARD RAM LO ADDRESS
|
||||
VGA_DAT .EQU VGA_BASE + $07 ; BOARD RAM BYTE R/W
|
||||
;
|
||||
VGA_ROWS .EQU 25
|
||||
VGA_COLS .EQU 80
|
||||
;
|
||||
#DEFINE DEFREGS REGS_VGA
|
||||
;
|
||||
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - INITIALIZATION
|
||||
;======================================================================
|
||||
;
|
||||
VGA_INIT:
|
||||
LD IY,VGA_IDAT ; POINTER TO INSTANCE DATA
|
||||
;
|
||||
CALL NEWLINE ; FORMATTING
|
||||
PRTS("VGA: IO=0x$")
|
||||
LD A,VGA_REG
|
||||
CALL PRTHEXBYTE
|
||||
CALL VGA_PROBE ; CHECK FOR HW PRESENCE
|
||||
JR Z,VGA_INIT1 ; CONTINUE IF HW PRESENT
|
||||
;
|
||||
; HARDWARE NOT PRESENT
|
||||
PRTS(" NOT PRESENT$")
|
||||
OR $FF ; SIGNAL FAILURE
|
||||
RET
|
||||
;
|
||||
VGA_INIT1:
|
||||
; DISPLAY CONSOLE DIMENSIONS
|
||||
LD A,VGA_COLS
|
||||
CALL PC_SPACE
|
||||
CALL PRTDECB
|
||||
LD A,'X'
|
||||
CALL COUT
|
||||
LD A,VGA_ROWS
|
||||
CALL PRTDECB
|
||||
PRTS(" TEXT$")
|
||||
|
||||
; HARDWARE INITIALIZATION
|
||||
CALL VGA_CRTINIT ; SETUP THE VGA CHIP REGISTERS
|
||||
CALL VGA_LOADFONT ; LOAD FONT DATA FROM ROM TO VGA STRORAGE
|
||||
CALL VGA_VDARES
|
||||
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
|
||||
|
||||
; ADD OURSELVES TO VDA DISPATCH TABLE
|
||||
LD BC,VGA_DISPATCH ; BC := DISPATCH ADDRESS
|
||||
LD DE,VGA_IDAT ; DE := VGA INSTANCE DATA PTR
|
||||
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
||||
|
||||
; INITIALIZE EMULATION
|
||||
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
|
||||
LD DE,VGA_DISPATCH ; DE := DISPATCH ADDRESS
|
||||
LD HL,VGA_IDAT ; HL := VGA INSTANCE DATA PTR
|
||||
CALL TERM_ATTACH ; DO IT
|
||||
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS
|
||||
;======================================================================
|
||||
;
|
||||
VGA_DISPATCH:
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
|
||||
JP Z,VGA_VDAINI ; $40
|
||||
DEC A
|
||||
JP Z,VGA_VDAQRY ; $41
|
||||
DEC A
|
||||
JP Z,VGA_VDARES ; $42
|
||||
DEC A
|
||||
JP Z,VGA_VDADEV ; $43
|
||||
DEC A
|
||||
JP Z,VGA_VDASCS ; $44
|
||||
DEC A
|
||||
JP Z,VGA_VDASCP ; $45
|
||||
DEC A
|
||||
JP Z,VGA_VDASAT ; $46
|
||||
DEC A
|
||||
JP Z,VGA_VDASCO ; $47
|
||||
DEC A
|
||||
JP Z,VGA_VDAWRC ; $48
|
||||
DEC A
|
||||
JP Z,VGA_VDAFIL ; $49
|
||||
DEC A
|
||||
JP Z,VGA_VDACPY ; $4A
|
||||
DEC A
|
||||
JP Z,VGA_VDASCR ; $4B
|
||||
DEC A
|
||||
JP Z,KBD_STAT ; $4C
|
||||
DEC A
|
||||
JP Z,KBD_FLUSH ; $4D
|
||||
DEC A
|
||||
JP Z,KBD_READ ; $4E
|
||||
CALL PANIC
|
||||
|
||||
VGA_VDAINI:
|
||||
; RESET VDA
|
||||
; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA
|
||||
CALL VGA_VDARES ; RESET VDA
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDAQRY:
|
||||
LD C,$00 ; MODE ZERO IS ALL WE KNOW
|
||||
LD D,VGA_ROWS ; ROWS
|
||||
LD E,VGA_COLS ; COLS
|
||||
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDARES:
|
||||
LD A,$07 ; ATTRIBUTE IS STANDARD WHITE ON BLACK
|
||||
LD (VGA_ATTR),A ; SAVE IT
|
||||
XOR A ; ZERO (REVEVERSE, UNDERLINE, BLINK)
|
||||
LD (VGA_RUB),A ; SAVE IT
|
||||
|
||||
LD DE,0 ; ROW = 0, COL = 0
|
||||
CALL VGA_XY ; SEND CURSOR TO TOP LEFT
|
||||
LD A,' ' ; BLANK THE SCREEN
|
||||
LD DE,$800 ; FILL ENTIRE BUFFER
|
||||
CALL VGA_FILL ; DO IT
|
||||
LD DE,0 ; ROW = 0, COL = 0
|
||||
CALL VGA_XY ; SEND CURSOR TO TOP LEFT
|
||||
|
||||
LD HL,$0404 ; SET VIDEO ENABLE BIT
|
||||
CALL VGA_SETCFG ; DO IT
|
||||
|
||||
XOR A
|
||||
RET
|
||||
|
||||
VGA_VDADEV:
|
||||
LD D,VDADEV_VGA ; D := DEVICE TYPE
|
||||
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDASCS:
|
||||
CALL PANIC ; NOT IMPLEMENTED (YET)
|
||||
|
||||
VGA_VDASCP:
|
||||
CALL VGA_XY ; SET CURSOR POSITION
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDASAT:
|
||||
; INCOMING IS: -----RUB (R=REVERSE, U=UNDERLINE, B=BLINK)
|
||||
;
|
||||
; JUST SAVE THE VALUE AND FALL THROUGH. ONLY REVERSE IS
|
||||
; SUPPORTED WHICH IS IMPLEMENTED BELOW.
|
||||
LD A,E
|
||||
LD (VGA_RUB),A ; SAVE IT
|
||||
JR VGA_VDASCO2 ; IMPLEMENT SETTING
|
||||
|
||||
VGA_VDASCO:
|
||||
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
|
||||
; TRANSFORM TO: -RGBIRGB (DISCARD INTENSITY BIT IN HIGH NIBBLE)
|
||||
;
|
||||
; A := INVERTED E, SO A IS RGBIRGBI (F/B)
|
||||
LD B,8 ; DO 8 BITS
|
||||
VGA_VDASCO1:
|
||||
RRC E ; LOW BIT OF E ROTATED RIGHT INTO CF
|
||||
RLA ; CF ROTATED LEFT INTO LOW BIT OF A
|
||||
DJNZ VGA_VDASCO1 ; DO FOR ALL 8 BITS
|
||||
; LS A X 3 TO SWAP F/B BITS, SO A IS IRGBIRGB (B/F)
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
; MASK FOR RELEVANT BITS, SO A IS 0R0B0R0B
|
||||
AND %01010101
|
||||
; SAVE A IN C AND SET A = E
|
||||
LD C,A
|
||||
LD A,E
|
||||
; MASK FOR RELEVANT BITS, SO A IS 00G0I0G0
|
||||
AND %00101010
|
||||
; COMBINE WITH SAVED
|
||||
OR E
|
||||
; SAVE NEW ATTR VALUE
|
||||
LD (VGA_ATTR),A ; AND SAVE THE RESULT
|
||||
VGA_VDASCO2:
|
||||
; CHECK FOR REVERSE VIDEO
|
||||
LD A,(VGA_RUB) ; GET RUB SETTING
|
||||
BIT 2,A ; REVERSE IS BIT 2
|
||||
JR Z,VGA_VDASCO3 ; DONE IF REVERSE VID NOT SET
|
||||
; IMPLEMENT REVERSE VIDEO
|
||||
LD A,(VGA_ATTR) ; GET ATTRIBUTE
|
||||
PUSH AF ; SAVE IT
|
||||
AND %00001000 ; ISOLATE INTENSITY BIT
|
||||
LD E,A ; SAVE IN E
|
||||
POP AF ; GOT ATTR BACK
|
||||
RLCA ; SWAP FG/BG COLORS
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
AND %01110111 ; REMOVE HIGH BITS
|
||||
OR E ; COMBINE WITH PREVIOUS INTENSITY BIT
|
||||
LD (VGA_ATTR),A ; SAVE NEW VALUE
|
||||
VGA_VDASCO3:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDAWRC:
|
||||
LD A,E ; CHARACTER TO WRITE GOES IN A
|
||||
CALL VGA_PUTCHAR ; PUT IT ON THE SCREEN
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDAFIL:
|
||||
LD A,E ; FILL CHARACTER GOES IN A
|
||||
EX DE,HL ; FILL LENGTH GOES IN DE
|
||||
CALL VGA_FILL ; DO THE FILL
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VGA_VDACPY:
|
||||
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS VGA_POS
|
||||
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT
|
||||
PUSH HL ; SAVE LENGTH
|
||||
CALL VGA_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
|
||||
POP BC ; RECOVER LENGTH IN BC
|
||||
LD DE,(VGA_POS) ; PUT DEST IN DE
|
||||
JP VGA_BLKCPY ; DO A BLOCK COPY
|
||||
|
||||
VGA_VDASCR:
|
||||
LD A,E ; LOAD E INTO A
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; IF ZERO, WE ARE DONE
|
||||
PUSH DE ; SAVE E
|
||||
JP M,VGA_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL
|
||||
CALL VGA_SCROLL ; SCROLL FORWARD ONE LINE
|
||||
POP DE ; RECOVER E
|
||||
DEC E ; DECREMENT IT
|
||||
JR VGA_VDASCR ; LOOP
|
||||
VGA_VDASCR1:
|
||||
CALL VGA_RSCROLL ; SCROLL REVERSE ONE LINE
|
||||
POP DE ; RECOVER E
|
||||
INC E ; INCREMENT IT
|
||||
JR VGA_VDASCR ; LOOP
|
||||
;
|
||||
;======================================================================
|
||||
; VGA DRIVER - PRIVATE DRIVER FUNCTIONS
|
||||
;======================================================================
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SET BOARD CONFIGURATON REGISTER
|
||||
; MASK IN H, VALUE IN L
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_SETCFG:
|
||||
PUSH AF ; PRESERVE AF
|
||||
LD A,H ; MASK IN ACCUM
|
||||
CPL ; INVERT IT
|
||||
LD H,A ; BACK TO H
|
||||
LD A,(VGA_CFGV) ; GET CURRENT CONFIG VALUE
|
||||
AND H ; RESET ALL TARGET BITS
|
||||
OR L ; SET TARGET BITS
|
||||
LD (VGA_CFGV),A ; SAVE NEW VALUE
|
||||
OUT (VGA_CFG),A ; AND WRITE IT TO REGISTER
|
||||
POP AF ; RESTORE AF
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; UPDATE CRTC REGISTERS
|
||||
; VGA_REGWR WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_REGWR:
|
||||
PUSH AF ; SAVE VALUE TO WRITE
|
||||
LD A,C ; SET A TO VGA REGISTER TO SELECT
|
||||
OUT (VGA_REG),A ; WRITE IT TO SELECT THE REGISTER
|
||||
POP AF ; RESTORE VALUE TO WRITE
|
||||
OUT (VGA_DATA),A ; WRITE IT
|
||||
RET
|
||||
;
|
||||
VGA_REGWRX:
|
||||
LD A,H ; SETUP MSB TO WRITE
|
||||
CALL VGA_REGWR ; DO IT
|
||||
INC C ; NEXT CVDU REGISTER
|
||||
LD A,L ; SETUP LSB TO WRITE
|
||||
JR VGA_REGWR ; DO IT & RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; READ CRTC REGISTERS
|
||||
; VGA_REGRD READS VDU REGISTER SPECIFIED IN C AND RETURNS VALUE IN A
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_REGRD:
|
||||
LD A,C ; SET A TO VGA REGISTER TO SELECT
|
||||
OUT (VGA_REG),A ; WRITE IT TO SELECT THE REGISTER
|
||||
IN A,(VGA_DATA) ; READ IT
|
||||
RET
|
||||
;
|
||||
VGA_REGRDX:
|
||||
CALL VGA_REGRD ; GET VALUE FROM REGISTER IN C
|
||||
LD H,A ; SAVE IN H
|
||||
INC C ; BUMP TO NEXT REGISTER OF PAIR
|
||||
CALL VGA_REGRD ; READ THE VALUE
|
||||
LD L,A ; SAVE IT IN L
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; WRITE VIDEO RAM
|
||||
; VGA_MEMWR WRITES VALUE IN A TO ADDRESS IN DE
|
||||
; VGA_MEMWRX WRITES VALUE IN HL TO ADDRESS IN DE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_MEMWR:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
OUT (C),A
|
||||
RET
|
||||
;
|
||||
VGA_MEMWRX:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
OUT (C),H
|
||||
INC E
|
||||
DEC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
OUT (C),L
|
||||
DEC E
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; READ VIDEO RAM
|
||||
; VGA_MEMRD READS VALUE IN DE TO A
|
||||
; VGA_MEMRDX READS VALUE IN DE TO HL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_MEMRD:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
IN A,(C)
|
||||
RET
|
||||
;
|
||||
VGA_MEMRDX:
|
||||
LD C,VGA_HI
|
||||
OUT (C),D
|
||||
INC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
IN H,(C)
|
||||
INC E
|
||||
DEC C
|
||||
OUT (C),E
|
||||
INC C
|
||||
IN L,(C)
|
||||
DEC E
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; PROBE FOR VGA HARDWARE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
VGA_PROBE:
|
||||
LD DE,0 ; POINT TO FIRST BYTE OF VRAM
|
||||
LD A,$A5 ; INITIAL TEST VALUE
|
||||
LD B,A ; SAVE IN B
|
||||
CALL VGA_MEMWR ; WRITE IT
|
||||
INC E ; NEXT BYTE OF VRAM
|
||||
CPL ; INVERT TEST VALUE
|
||||
CALL VGA_MEMWR ; WRITE IT
|
||||
DEC E ; BACK TO FIRST BYTE OF VRAM
|
||||
CALL VGA_MEMRD ; READ IT
|
||||
CP B ; CHECK FOR TEST VALUE
|
||||
RET NZ ; RETURN NZ IF FAILURE
|
||||
INC E ; SECOND VRAM BYTE
|
||||
CALL VGA_MEMRD ; READ IT
|
||||
CPL ; INVERT IT
|
||||
CP B ; CHECK FOR INVERTED TEST VALUE
|
||||
RET ; RETURN WITH ZF SET BASED ON CP
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; CRTC DISPLAY CONTROLLER CHIP INITIALIZATION
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_CRTINIT:
|
||||
LD HL,$FF00 ; ZERO ALL CFG BITS
|
||||
CALL VGA_SETCFG ; DO IT
|
||||
|
||||
CALL VGA_RES ; RESET CRTC (ALL REGS TO ZERO)
|
||||
|
||||
LD HL,DEFREGS ; HL = POINTER TO TABLE OF REG VALUES
|
||||
VGA_CRTINIT1:
|
||||
LD A,(HL) ; FIRST BYTE IS REG ADR
|
||||
LD C,A ; PUT IN C FOR LATER
|
||||
INC A ; TEST FOR END MARKER ($FF)
|
||||
RET Z ; IF EQUAL, DONE
|
||||
INC HL ; NEXT BYTE
|
||||
LD A,(HL) ; SECOND BYTE IS REG VAL
|
||||
INC HL ; HL TO NEXT ENTRY
|
||||
CALL VGA_REGWR ; WRITE REGISTER VALUE
|
||||
JR VGA_CRTINIT1 ; LOOP
|
||||
;
|
||||
VGA_RES:
|
||||
LD C,0 ; START WITH REG ZERO
|
||||
LD B,40 ; CLEAR 40 REGISTERS
|
||||
VGA_RES1:
|
||||
XOR A ; VALUE IS ZERO
|
||||
CALL VGA_REGWR ; SET VALUE
|
||||
INC C ; NEXT REGISTER
|
||||
DJNZ VGA_RES1 ; LOOP TILL DONE
|
||||
RET ; DONE
|
||||
;
|
||||
VGA_CRTCDUMP:
|
||||
LD C,0 ; START WITH REG ZERO
|
||||
LD B,40 ; CLEAR 40 REGISTERS
|
||||
VGA_CRTCDUMP1:
|
||||
CALL VGA_REGRD ; SET VALUE
|
||||
CALL PRTHEXBYTE
|
||||
CALL PC_SPACE
|
||||
INC C ; NEXT REGISTER
|
||||
DJNZ VGA_CRTCDUMP1 ; LOOP TILL DONE
|
||||
RET ; DONE
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; LOAD FONT DATA
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_LOADFONT:
|
||||
LD HL,$7000 ; CLEAR FONT PAGE NUM
|
||||
CALL VGA_SETCFG
|
||||
|
||||
LD DE,$7000 ; PAGE 7 OF VIDEO RAM
|
||||
LD HL,FONT_HI ; START OF FONT DATA
|
||||
VGA_LOADFONT1:
|
||||
LD A,(HL) ; GET NEXT BYTE
|
||||
CALL VGA_MEMWR ; MEM(DE) := A
|
||||
INC HL ; NEXT FONT BYTE
|
||||
INC DE ; NEXT MEM BYTE
|
||||
LD A,D
|
||||
CP $80 ; CHECK FOR END
|
||||
JR NZ,VGA_LOADFONT1 ; LOOP
|
||||
LD HL,$7070 ; SET FONT PAGE NUM TO 7
|
||||
CALL VGA_SETCFG
|
||||
RET ; DONE
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_XY:
|
||||
CALL VGA_XY2IDX ; CONVERT ROW/COL TO BUF IDX
|
||||
LD (VGA_POS),HL ; SAVE THE RESULT (DISPLAY POSITION)
|
||||
LD C,14 ; CURSOR POSITION REGISTER PAIR
|
||||
JP VGA_REGWRX ; DO IT AND RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL
|
||||
; D=ROW, E=COL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_XY2IDX:
|
||||
LD A,E ; SAVE COLUMN NUMBER IN A
|
||||
LD H,D ; SET H TO ROW NUMBER
|
||||
LD E,VGA_COLS ; SET E TO ROW LENGTH
|
||||
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
||||
LD E,A ; GET COLUMN BACK
|
||||
ADD HL,DE ; ADD IT IN
|
||||
RET ; RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; WRITE VALUE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_PUTCHAR:
|
||||
; SETUP DE WITH BUFFER ADDRESS
|
||||
LD DE,(VGA_POS) ; GET CURRENT POSITION
|
||||
RL E ; MULTIPLY BY 2
|
||||
RL D ; ... 2 BYTES PER CHAR
|
||||
; SETUP CHAR/ATTR IN HL
|
||||
LD H,A ; CHARACTER
|
||||
LD A,(VGA_ATTR) ; ATTRIBUTE
|
||||
LD L,A ; ... TO L
|
||||
; WRITE CHAR & ATTR
|
||||
CALL VGA_MEMWRX
|
||||
; UPDATE CURRENT POSITION
|
||||
LD HL,(VGA_POS) ; GET CURSOR POSITION
|
||||
INC HL ; INCREMENT
|
||||
LD (VGA_POS),HL ; SAVE NEW POSITION
|
||||
LD C,14 ; CURSOR POSITION REGISTER PAIR
|
||||
JP VGA_REGWRX ; DO IT AND RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE
|
||||
; STARTING AT THE CURRENT FRAME BUFFER POSITION
|
||||
; A: FILL CHARACTER
|
||||
; DE: NUMBER OF CHARACTERS TO FILL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_FILL:
|
||||
PUSH DE ; COUNT ON STACK
|
||||
LD H,A ; H = CHAR
|
||||
LD A,(VGA_ATTR) ; GET CUR ATTR
|
||||
LD L,A ; PUT INT L
|
||||
|
||||
; SETUP DE WITH INITIAL BUFFER ADDRESS
|
||||
LD DE,(VGA_POS) ; GET CURRENT POSITION
|
||||
RL E ; MULTIPLY BY 2
|
||||
RL D ; ... 2 BYTES PER CHAR
|
||||
LD C,VGA_HI
|
||||
|
||||
VGA_FILL1:
|
||||
OUT (C),D ; SET HI ADDR
|
||||
INC C ; POINT TO LO ADDR REG
|
||||
|
||||
VGA_FILL2:
|
||||
EX (SP),HL ; HL = COUNT, SAVE CHAR/ATTR
|
||||
LD A,H ; CHECK FOR
|
||||
OR L ; ... ZERO
|
||||
JR Z,VGA_FILL3 ; ALL DONE
|
||||
DEC HL ; DEC COUNT
|
||||
EX (SP),HL ; HL = CHAR/ATTR, COUNT ON STACK
|
||||
|
||||
|
||||
OUT (C),E ; SET LO ADDR
|
||||
INC C ; POINT TO DATA REG
|
||||
|
||||
OUT (C),H ; OUTPUT CHAR
|
||||
INC E ; INC ADDR
|
||||
DEC C ; POINT TO LO ADDR REG
|
||||
OUT (C),E ; UPDATE LO ADDR
|
||||
INC C ; POINT TO DATA REG
|
||||
OUT (C),L ; OUTPUT ATTR
|
||||
|
||||
DEC C ; POINT TO LO ADDR REG
|
||||
INC E ; INC ADDR LO
|
||||
JR NZ,VGA_FILL2 ; IF NO CF, SHORT LOOP
|
||||
|
||||
DEC C ; POINT TO HI ADDR REG
|
||||
INC D ; INC ADDR HI
|
||||
JR VGA_FILL1 ; FULL LOOP
|
||||
|
||||
VGA_FILL3:
|
||||
POP DE ; CLEAR STACK
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED)
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_SCROLL:
|
||||
; CLEAR LINE ABOUT TO BE EXPOSED
|
||||
LD DE,(VGA_POS)
|
||||
PUSH DE
|
||||
LD DE,0 + (VGA_ROWS * VGA_COLS)
|
||||
LD (VGA_POS),DE
|
||||
LD DE,VGA_COLS
|
||||
LD A,' '
|
||||
CALL VGA_FILL
|
||||
POP DE
|
||||
LD (VGA_POS),DE
|
||||
|
||||
; USE BLOCK COPY TO SCROLL UP ONE LINE
|
||||
LD HL,VGA_COLS
|
||||
LD DE,0
|
||||
LD BC,0 + ((VGA_ROWS) * VGA_COLS)
|
||||
CALL VGA_BLKCPY
|
||||
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED)
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_RSCROLL:
|
||||
; USE BLOCK COPY TO SCROLL DOWN ONE LINE
|
||||
LD HL,0 + ((VGA_ROWS - 1) * VGA_COLS) - 1 ; SRC IS EOS - 1 LINE
|
||||
LD DE,0 + ((VGA_ROWS) * VGA_COLS) - 1 ; DEST IS EOS
|
||||
LD BC,0 + ((VGA_ROWS - 1) * VGA_COLS) ; LENGTH IS ROWS - 1
|
||||
CALL VGA_RBLKCPY
|
||||
|
||||
; CLEAR TOP LINE
|
||||
LD DE,(VGA_POS)
|
||||
PUSH DE
|
||||
LD DE,0
|
||||
LD (VGA_POS),DE
|
||||
LD DE,VGA_COLS
|
||||
LD A,' '
|
||||
CALL VGA_FILL
|
||||
POP DE
|
||||
LD (VGA_POS),DE
|
||||
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; BLOCK COPY BC BYTES FROM HL TO DE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VGA_BLKCPY:
|
||||
; ADJUST POINTERS FOR 2 BYTE WIDTH (CHAR & ATTR)
|
||||
RL E
|
||||
RL D
|
||||
RL L
|
||||
RL H
|
||||
|
||||
VGA_BLKCPY1:
|
||||
|
||||
PUSH BC ; SAVE COUNT
|
||||
|
||||
; BA = (HL), HL INCREMENTED
|
||||
LD C,VGA_HI ; C := VGA_HI
|
||||
OUT (C),H ; VGA_HI := SOURCE HI (H)
|
||||
INC C ; C := VGA_LO
|
||||
OUT (C),L ; VGA_LO := SOURCE LO (L)
|
||||
INC C ; C := VGA_DATA
|
||||
IN B,(C) ; B := EVEN DATA BYTE (CHAR)
|
||||
INC HL ; INC SOURCE PTR
|
||||
DEC C ; C := VGA_LO
|
||||
OUT (C),L ; VGA_LO := SOURCE LO (L), VGA_HI IS UNCHANGED!
|
||||
INC C ; C := VGA_DATA
|
||||
IN A,(C) ; A := ODD DATA BYTE (ATTR)
|
||||
INC HL ; INC SOURCE PTR
|
||||
|
||||
; (DE) = BA, DE INCREMENTED
|
||||
LD C,VGA_HI ; C := VGA_HI
|
||||
OUT (C),D ; VGA_HI := DEST HI (D)
|
||||
INC C ; C := VGA_LO
|
||||
OUT (C),E ; VGA_LO := DEST LO (E)
|
||||
INC C ; C := VGA_DATA
|
||||
OUT (C),B ; EVEN DATA BYTE (CHAR) := B
|
||||
INC DE ; INC DEST PTR
|
||||
DEC C ; C := VGA_LO
|
||||
OUT (C),E ; VGA_LO := DEST LO (E), VGA_HI IS UNCHANGED
|
||||
INC C ; C := VGA_DATA
|
||||
OUT (C),A ; ODD DATA BYTE (ATTR) := A
|
||||
INC DE ; INC DEST PTR
|
||||
|
||||
; CHECK COUNT AND LOOP TILL DONE
|
||||
POP BC ; RECOVER COUNT
|
||||
DEC BC ; DEC COUNT
|
||||
LD A,B ; CHECK COUNT
|
||||
OR C ; ... FOR ZERO
|
||||
JR NZ,VGA_BLKCPY1 ; LOOP TILL DONE
|
||||
|
||||
RET ; DONE
|
||||
;
|
||||
VGA_RBLKCPY:
|
||||
; ADJUST POINTERS FOR 2 BYTE WIDTH (CHAR & ATTR)
|
||||
RL E
|
||||
RL D
|
||||
RL L
|
||||
RL H
|
||||
|
||||
; ADJUST TO POINT TO SECOND BYTE OF PAIR (ATTR)
|
||||
INC E
|
||||
INC L
|
||||
|
||||
VGA_RBLKCPY1:
|
||||
|
||||
PUSH BC ; SAVE COUNT
|
||||
|
||||
; BA = (HL), HL INCREMENTED
|
||||
LD C,VGA_HI ; C := VGA_HI
|
||||
OUT (C),H ; VGA_HI := SOURCE HI (H)
|
||||
INC C ; C := VGA_LO
|
||||
OUT (C),L ; VGA_LO := SOURCE LO (L)
|
||||
INC C ; C := VGA_DATA
|
||||
IN A,(C) ; A := ODD DATA BYTE (ATTR)
|
||||
DEC HL ; DEC SOURCE PTR
|
||||
DEC C ; C := VGA_LO
|
||||
OUT (C),L ; VGA_LO := SOURCE LO (L), VGA_HI IS UNCHANGED!
|
||||
INC C ; C := VGA_DATA
|
||||
IN B,(C) ; B := EVEN DATA BYTE (CHAR)
|
||||
DEC HL ; DEC SOURCE PTR
|
||||
|
||||
; (DE) = BA, DE INCREMENTED
|
||||
LD C,VGA_HI ; C := VGA_HI
|
||||
OUT (C),D ; VGA_HI := DEST HI (D)
|
||||
INC C ; C := VGA_LO
|
||||
OUT (C),E ; VGA_LO := DEST LO (E)
|
||||
INC C ; C := VGA_DATA
|
||||
OUT (C),A ; ODD DATA BYTE (ATTR) := A
|
||||
DEC DE ; DEC DEST PTR
|
||||
DEC C ; C := VGA_LO
|
||||
OUT (C),E ; VGA_LO := DEST LO (E), VGA_HI IS UNCHANGED
|
||||
INC C ; C := VGA_DATA
|
||||
OUT (C),B ; EVEN DATA BYTE (CHAR) := B
|
||||
DEC DE ; DEC DEST PTR
|
||||
|
||||
; CHECK COUNT AND LOOP TILL DONE
|
||||
POP BC ; RECOVER COUNT
|
||||
DEC BC ; DEC COUNT
|
||||
LD A,B ; CHECK COUNT
|
||||
OR C ; ... FOR ZERO
|
||||
JR NZ,VGA_RBLKCPY1 ; LOOP TILL DONE
|
||||
|
||||
RET ; DONE
|
||||
;
|
||||
;==================================================================================================
|
||||
; VGA DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
VGA_ATTR .DB 0 ; CURRENT COLOR
|
||||
VGA_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
VGA_CFGV .DB 0 ; CURRENT BOARD CONFIG VALUE
|
||||
VGA_RUB .DB 0 ; REVERSE/UNDERLINE/BLINK (-----RUB)
|
||||
;
|
||||
; ATTRIBUTE ENCODING:
|
||||
; BIT 7: ALT FONT
|
||||
; BIT 6: BG REG
|
||||
; BIT 5: BG GREEN
|
||||
; BIT 4: BG BLUE
|
||||
; BIT 3: FG INTENSITY
|
||||
; BIT 2: FG RED
|
||||
; BIT 1: FG GREEN
|
||||
; BIT 0: FG BLUE
|
||||
;
|
||||
;===============================================================================
|
||||
; DEFAULT REGISTER VALUES
|
||||
;===============================================================================
|
||||
;
|
||||
REGS_VGA:
|
||||
.DB 0,100 - 1 ; HORZ TOT - 1
|
||||
.DB 1,80 ; HORZ DISP
|
||||
.DB 2,80 + 2 ; HORZ DISP + HORZ FP
|
||||
.DB 3,(2 << 4) | (12 & $0F) ; VERT SW, HORZ SW
|
||||
.DB 4,28 - 1 ; VERT TOT - 1
|
||||
.DB 5,1 ; VERT TOT ADJ
|
||||
.DB 6,25 ; VERT DISP
|
||||
.DB 7,25 + 1 ; VERT DISP + VERT FP
|
||||
.DB 9,16 - 1 ; CHAR HEIGHT - 1
|
||||
.DB 10,(13 | $60) ; CURSOR START & CURSOR BLINK
|
||||
.DB 11,14 ; CURSOR END
|
||||
.DB 12,($0000 >> 8) & $FF ; SCRN 1 START (HI)
|
||||
.DB 13,($0000 & $FF) ; SCRN 1 START (LO)
|
||||
.DB 30,0 ; CONTROL 1
|
||||
.DB 31,0 ; CONTROL 2
|
||||
.DB 33,0 ; CONTROL 3
|
||||
.DB $FF ; END MARKER
|
||||
;
|
||||
;==================================================================================================
|
||||
; VGA DRIVER - INSTANCE DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
VGA_IDAT:
|
||||
.DB VGA_KBDST
|
||||
.DB VGA_KBDDATA
|
||||
Reference in New Issue
Block a user