Add VGA3 Support

This commit is contained in:
Wayne Warthen
2017-06-30 21:50:10 -07:00
parent 939a822f65
commit fb6b1fd54a
417 changed files with 6018 additions and 77479 deletions

View File

@@ -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:

View 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)

View File

@@ -1,8 +0,0 @@
;
;==================================================================================================
; MARK IV CVDU CONFIGURATION
;==================================================================================================
;
CRTACT .SET FALSE ; ACTIVATE CRT AT STARTUP
;
CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT

View File

@@ -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

View File

@@ -1,7 +0,0 @@
;
;==================================================================================================
; MARK IV DUAL SD CONFIGURATION
;==================================================================================================
;
SDENABLE .SET TRUE ; ENABLE SD SUPPORT
SDMODE .SET SDMODE_DSD ; USE DUAL SD BOARD MODE

View File

@@ -1,8 +0,0 @@
;
;==================================================================================================
; MARK IV PROPIO CONFIGURATION
;==================================================================================================
;
CRTACT .SET FALSE ; CRT ACTIVATION AT STARTUP
;
PRPENABLE .SET TRUE ; ENABLE PROPIO BOARD SUPPORT

View File

@@ -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)

View File

@@ -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

View File

@@ -1,5 +0,0 @@
;
;==================================================================================================
; ROMWBW 2.X CONFIGURATION FOR N8 2511
;==================================================================================================
;

View File

@@ -1,8 +0,0 @@
;
;==================================================================================================
; SBC CVDU CONFIGURATION
;==================================================================================================
;
CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP
;
CVDUENABLE .SET TRUE ; ENABLE CVDU BOARD SUPPORT

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +0,0 @@
;
;==================================================================================================
; SBC DUAL SD CONFIGURATION
;==================================================================================================
;
SDENABLE .SET TRUE ; ENABLE SD SUPPORT
SDMODE .SET SDMODE_DSD ; USE DUAL SD BOARD MODE

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +0,0 @@
;
;==================================================================================================
; SBC PPISD CONFIGURATION
;==================================================================================================
;
SDENABLE .SET TRUE ; ENABLE SD SUPPORT
SDMODE .SET SDMODE_PPI ; USE PPI -> SD INTERFACE

View File

@@ -1,8 +0,0 @@
;
;==================================================================================================
; SBC PROPIO CONFIGURATION
;==================================================================================================
;
CRTACT .SET TRUE ; CRT ACTIVATION AT STARTUP
;
PRPENABLE .SET TRUE ; ENABLE PROPIO BOARD SUPPORT

View File

@@ -1,6 +0,0 @@
;
;==================================================================================================
; SBC RAM FLOPPY CONFIGURATION
;==================================================================================================
;
RFENABLE .SET TRUE ; ENABLE RAM FLOPPY SUPPORT

View File

@@ -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

View File

@@ -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)

View File

@@ -1,8 +0,0 @@
;
;==================================================================================================
; SBC VDU CONFIGURATION
;==================================================================================================
;
CRTACT .SET TRUE ; ACTIVATE CRT AT STARTUP
;
VDUENABLE .SET TRUE ; ENABLE VDU BOARD SUPPORT

View File

@@ -3,3 +3,5 @@
; UNA STANDARD CONFIGURATION
;==================================================================================================
;
#include "cfg_una.asm"
;

View File

@@ -1,6 +0,0 @@
;
;==================================================================================================
; ZETA2 PPIDE CONFIGURATION
;==================================================================================================
;
PPIDEENABLE .SET TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)

View File

@@ -1,6 +0,0 @@
;
;==================================================================================================
; ZETA2 PPISD CONFIGURATION
;==================================================================================================
;
SDENABLE .SET TRUE ; TRUE FOR SD SUPPORT

View File

@@ -1,7 +0,0 @@
;
;==================================================================================================
; ZETA2 PARPORTPROP CONFIGURATION
;==================================================================================================
;
CRTACT .SET TRUE ; ACTIVATE CRT CONSOLE AT BOOT
PPPENABLE .SET TRUE ; TRUE FOR PARPORTPROP SUPPORT

View File

@@ -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)

View File

@@ -1,6 +0,0 @@
;
;==================================================================================================
; ZETA PPIDE CONFIGURATION
;==================================================================================================
;
PPIDEENABLE .SET TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)

View File

@@ -1,6 +0,0 @@
;
;==================================================================================================
; ZETA PPISD CONFIGURATION
;==================================================================================================
;
SDENABLE .SET TRUE ; TRUE FOR SD SUPPORT

View File

@@ -1,7 +0,0 @@
;
;==================================================================================================
; ZETA PARPORTPROP CONFIGURATION
;==================================================================================================
;
CRTACT .SET TRUE ; ACTIVATE CRT CONSOLE AT BOOT
PPPENABLE .SET TRUE ; TRUE FOR PARPORTPROP SUPPORT

View File

@@ -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)

View File

@@ -1 +0,0 @@
@..\tools\gcc\mingw32-make %*

View File

@@ -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 ;
;;;;;;;;;;;;;;;;;;;;;

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,10 +0,0 @@
;
;==================================================================================================
; FILLER FOR HBIOS PROXY, JUST A 256 BYTE FILLER
;==================================================================================================
;
#INCLUDE "std.asm"
;
.FILL HBX_SIZ,0FFH
;
.END

View File

@@ -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

View File

@@ -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

View File

@@ -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 ;
;;;;;;;;;;;;;;;;;;;;;;

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,8 +0,0 @@
;
;==================================================================================================
; FILLER FOR ROM PAGE 0 (SEE BANKEDBIOS.TXT)
;==================================================================================================
;
.FILL 3000H
;
.END

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
;

View File

@@ -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
;

View File

@@ -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)

View File

@@ -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)

View File

@@ -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, ...)
;

View File

@@ -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
View 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

View File

@@ -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

View File

@@ -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)

View File

@@ -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
;

View File

@@ -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
;

View File

@@ -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
;=============================================================================

View File

@@ -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

View File

@@ -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
;
;__________________________________________________________________________________________________

View File

@@ -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

View File

@@ -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
;=============================================================================

View File

@@ -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
;

View File

@@ -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

View File

@@ -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
View 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
View 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