mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Reintegrate wbw -> trunk
This commit is contained in:
1506
Source/ansi.asm
1506
Source/ansi.asm
File diff suppressed because it is too large
Load Diff
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -10,7 +10,7 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_CVDU ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
DEFEMU .EQU EMUTYP_ANSI ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -46,7 +46,7 @@ IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE
|
||||
IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
PPIDEENABLE .EQU TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
|
||||
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
|
||||
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -10,7 +10,7 @@ CPUFREQ .EQU 8 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
|
||||
DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_VDU, DIODEV_PRPCON
|
||||
ALTCON .EQU DEFCON ; ALT CONSOLE DEVICE (USED WHEN CONFIG JUMPER SHORTED)
|
||||
DEFVDA .EQU VDADEV_VDU ; DEFAULT VDA (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_UPD7220, VDADEV_N8V)
|
||||
DEFEMU .EQU EMUTYP_TTY ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
DEFEMU .EQU EMUTYP_ANSI ; DEFAULT EMULATION TYPE (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CLRRAMDISK .EQU CLR_AUTO ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
|
||||
@@ -46,8 +46,8 @@ IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE
|
||||
IDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
PPIDEMODE .EQU PPIDEMODE_STD ; PPIDEMODE_STD, PPIDEMODE_DIO3
|
||||
PPIDEENABLE .EQU TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
PPIDEMODE .EQU PPIDEMODE_DIO3 ; PPIDEMODE_STD, PPIDEMODE_DIO3
|
||||
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
|
||||
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -89,6 +89,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU TRUE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU TRUE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
@@ -84,6 +84,7 @@ KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
|
||||
141
Source/cvdu.asm
141
Source/cvdu.asm
@@ -15,9 +15,12 @@
|
||||
; 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_STAT .EQU $E4 ; READ M8563 STATUS
|
||||
CVDU_REG .EQU $E4 ; SELECT M8563 REGISTER
|
||||
CVDU_DATA .EQU $EC ; READ/WRITE M8563 DATA
|
||||
;
|
||||
CVDU_ROWS .EQU 25
|
||||
CVDU_COLS .EQU 80
|
||||
;
|
||||
;======================================================================
|
||||
; CVDU DRIVER - INITIALIZATION
|
||||
@@ -35,7 +38,9 @@ CVDU_RESET:
|
||||
LD A,$0E ; ATTRIBUTE IS STANDARD WHITE ON BLACK
|
||||
LD (CVDU_ATTR),A ; SAVE IT
|
||||
|
||||
LD A,'#' ; BLANK THE SCREEN
|
||||
LD DE,0 ; ROW = 0, COL = 0
|
||||
CALL CVDU_XY ; SEND CURSOR TO TOP LEFT
|
||||
LD A,' ' ; BLANK THE SCREEN
|
||||
LD DE,$800 ; FILL ENTIRE BUFFER
|
||||
CALL CVDU_FILL ; DO IT
|
||||
LD DE,0 ; ROW = 0, COL = 0
|
||||
@@ -100,21 +105,24 @@ CVDU_DISPVDA:
|
||||
DEC A
|
||||
JR Z,CVDU_VDAFIL ; $48
|
||||
DEC A
|
||||
JR Z,CVDU_VDASCR ; $49
|
||||
JR Z,CVDU_VDACPY ; $49
|
||||
DEC A
|
||||
JP Z,KBD_STAT ; $4A
|
||||
JR Z,CVDU_VDASCR ; $4A
|
||||
DEC A
|
||||
JP Z,KBD_FLUSH ; $4B
|
||||
JP Z,KBD_STAT ; $4B
|
||||
DEC A
|
||||
JP Z,KBD_READ ; $4C
|
||||
JP Z,KBD_FLUSH ; $4C
|
||||
DEC A
|
||||
JP Z,KBD_READ ; $4D
|
||||
CALL PANIC
|
||||
|
||||
CVDU_VDAINI:
|
||||
JR CVDU_INIT ; INITIALIZE
|
||||
JP CVDU_INIT ; INITIALIZE
|
||||
|
||||
CVDU_VDAQRY:
|
||||
LD C,$00 ; MODE ZERO IS ALL WE KNOW
|
||||
LD DE,$1950 ; 25 ROWS ($19), 80 COLS ($50)
|
||||
LD D,CVDU_ROWS ; ROWS
|
||||
LD E,CVDU_COLS ; COLS
|
||||
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
@@ -143,7 +151,7 @@ CVDU_VDASAT:
|
||||
LD A,(CVDU_ATTR) ; GET CURRENT ATTRIBUTE SETTING
|
||||
AND %10001111 ; CLEAR OUT OLD ATTRIBUTE BITS
|
||||
OR E ; STUFF IN THE NEW ONES
|
||||
LD A,(CVDU_ATTR) ; AND SAVE THE RESULT
|
||||
LD (CVDU_ATTR),A ; AND SAVE THE RESULT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
@@ -160,7 +168,7 @@ CVDU_VDASCO1:
|
||||
LD A,(CVDU_ATTR) ; GET CURRENT VALUE INTO A
|
||||
AND %11110000 ; CLEAR OUT OLD COLOR BITS
|
||||
OR E ; STUFF IN THE NEW ONES
|
||||
LD A,(CVDU_ATTR) ; AND SAVE THE RESULT
|
||||
LD (CVDU_ATTR),A ; AND SAVE THE RESULT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
@@ -176,6 +184,15 @@ CVDU_VDAFIL:
|
||||
CALL CVDU_FILL ; DO THE FILL
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
CVDU_VDACPY:
|
||||
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS CVDU_POS
|
||||
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT
|
||||
PUSH HL ; SAVE LENGTH
|
||||
CALL CVDU_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
|
||||
POP BC ; RECOVER LENGTH IN BC
|
||||
LD DE,(CVDU_POS) ; PUT DEST IN DE
|
||||
JP CVDU_BLKCPY ; DO A BLOCK COPY
|
||||
|
||||
CVDU_VDASCR:
|
||||
LD A,E ; LOAD E INTO A
|
||||
@@ -290,18 +307,27 @@ CVDU_LOADFONT1:
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
CVDU_XY:
|
||||
LD A,E ; SAVE COLUMN NUMBER IN A
|
||||
LD H,D ; SET H TO ROW NUMBER
|
||||
LD E,80 ; SET E TO ROW LENGTH
|
||||
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
||||
LD E,A ; GET COLUMN BACK
|
||||
ADD HL,DE ; ADD IT IN
|
||||
CALL CVDU_XY2IDX ; CONVERT ROW/COL TO BUF IDX
|
||||
LD (CVDU_POS),HL ; SAVE THE RESULT (DISPLAY POSITION)
|
||||
LD C,14 ; CURSOR POSITION REGISTER PAIR
|
||||
JP CVDU_WRX ; DO IT AND RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; WRITE VALULE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR
|
||||
; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL
|
||||
; D=ROW, E=COL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
CVDU_XY2IDX:
|
||||
LD A,E ; SAVE COLUMN NUMBER IN A
|
||||
LD H,D ; SET H TO ROW NUMBER
|
||||
LD E,CVDU_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
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
CVDU_PUTCHAR:
|
||||
@@ -390,6 +416,7 @@ CVDU_FILL3:
|
||||
CALL CVDU_WR ; DO IT (SOURCE/DEST REGS AUTO INCREMENT)
|
||||
LD D,0 ; CLEAR D
|
||||
LD E,A ; SET E TO BYTES WRITTEN
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; SUBTRACT FROM HL
|
||||
RET Z ; IF ZERO, WE ARE DONE
|
||||
JR CVDU_FILL2 ; OTHERWISE, WRITE SOME MORE
|
||||
@@ -423,17 +450,17 @@ CVDU_SCROLL1:
|
||||
CALL CVDU_WRX ; DO IT
|
||||
|
||||
; COMPUTE SOURCE (INCREMENT ONE ROW)
|
||||
LD DE,80 ; SOURCE ADDRESS IS ONE ROW PAST DESTINATION
|
||||
LD DE,CVDU_COLS ; SOURCE ADDRESS IS ONE ROW PAST DESTINATION
|
||||
ADD HL,DE ; ADD IT TO BUF ADDRESS
|
||||
|
||||
; SET INITIAL BLOCK COPY SOURCE
|
||||
LD C,32 ; BLOCK START ADDRESS REGISTER
|
||||
CALL CVDU_WRX ; DO IT
|
||||
|
||||
LD B,23 ; ITERATIONS (ROWS - 1)
|
||||
LD B,CVDU_ROWS - 1 ; ITERATIONS (ROWS - 1)
|
||||
CVDU_SCROLL2:
|
||||
; SET BLOCK COPY COUNT (WILL EXECUTE COPY)
|
||||
LD A,80 ; COPY 80 BYTES
|
||||
LD A,CVDU_COLS ; COPY 80 BYTES
|
||||
LD C,30 ; WORD COUNT REGISTER
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
@@ -446,13 +473,13 @@ CVDU_SCROLL2:
|
||||
AND $7F ; CLEAR BIT 7 FOR FILL MODE
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
; SET CHARACTER TO WRITE
|
||||
; SET VALUE TO WRITE
|
||||
POP AF ; RESTORE THE FILL VALUE PASSED IN
|
||||
LD C,31 ; DATA REGISTER
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
; SET BLOCK WRITE COUNT (WILL EXECUTE THE WRITE)
|
||||
LD A,80 - 1 ; SET WRITE COUNT TO LINE LENGTH - 1 (1 CHAR ALREADY WRITTEN)
|
||||
LD A,CVDU_COLS - 1 ; SET WRITE COUNT TO LINE LENGTH - 1 (1 CHAR ALREADY WRITTEN)
|
||||
LD C,30 ; WORD COUNT REGISTER
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
@@ -464,13 +491,13 @@ CVDU_SCROLL2:
|
||||
;
|
||||
CVDU_RSCROLL:
|
||||
; SCROLL THE CHARACTER BUFFER
|
||||
LD A,'=' ; CHAR VALUE TO FILL NEW EXPOSED LINE
|
||||
LD HL,80*23 ; SOURCE ADDRESS OF CHARACER BUFFER (LINE 24)
|
||||
LD A,' ' ; CHAR VALUE TO FILL NEW EXPOSED LINE
|
||||
LD HL,$0 + ((CVDU_ROWS - 1) * CVDU_COLS) ; SOURCE ADDRESS OF CHARACER BUFFER
|
||||
CALL CVDU_RSCROLL1 ; SCROLL CHARACTER BUFFER
|
||||
|
||||
; SCROLL THE ATTRIBUTE BUFFER
|
||||
LD A,(CVDU_ATTR) ; ATTRIBUTE VALUE TO FILL NEW EXPOSED LINE
|
||||
LD HL,$800+(80*23) ; SOURCE ADDRESS OF ATTRIBUTE BUFFER (LINE 24)
|
||||
LD HL,$800 + ((CVDU_ROWS - 1) * CVDU_COLS) ; SOURCE ADDRESS OF ATTRIBUTE BUFFER
|
||||
JR CVDU_RSCROLL1 ; SCROLL ATTRIBUTE BUFFER AND RETURN
|
||||
|
||||
CVDU_RSCROLL1:
|
||||
@@ -483,7 +510,7 @@ CVDU_RSCROLL1:
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
; LOOP TO SCROLL EACH LINE WORKING FROM BOTTOM TO TOP
|
||||
LD B,23 ; ITERATIONS (23 ROWS)
|
||||
LD B,CVDU_ROWS - 1 ; ITERATIONS (ROWS - 1)
|
||||
CVDU_RSCROLL2:
|
||||
|
||||
; SET BLOCK COPY DESTINATION (USING HL PASSED IN)
|
||||
@@ -491,7 +518,8 @@ CVDU_RSCROLL2:
|
||||
CALL CVDU_WRX ; DO IT
|
||||
|
||||
; COMPUTE SOURCE (DECREMENT ONE ROW)
|
||||
LD DE,80 ; SOURCE ADDRESS IS ONE ROW PAST DESTINATION
|
||||
LD DE,CVDU_COLS ; SOURCE ADDRESS IS ONE ROW PAST DESTINATION
|
||||
OR A ; CLEAR CARRY
|
||||
SBC HL,DE ; SUBTRACT IT FROM BUF ADDRESS
|
||||
|
||||
; SET BLOCK COPY SOURCE
|
||||
@@ -499,30 +527,79 @@ CVDU_RSCROLL2:
|
||||
CALL CVDU_WRX ; DO IT
|
||||
|
||||
; SET BLOCK COPY COUNT (WILL EXECUTE COPY)
|
||||
LD A,80 ; COPY 80 BYTES
|
||||
LD A,CVDU_COLS ; COPY 80 BYTES
|
||||
LD C,30 ; WORD COUNT REGISTER
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
DJNZ CVDU_RSCROLL2 ; REPEAT FOR ALL LINES
|
||||
|
||||
; SET FILL DESTINATION (USING HL PASSED IN)
|
||||
LD C,18 ; UPDATE ADDRESS (DESTINATION) REGISTER
|
||||
CALL CVDU_WRX ; DO IT
|
||||
|
||||
; SET MODE TO BLOCK WRITE TO CLEAR NEW LINE EXPOSED BY SCROLL
|
||||
LD C,24 ; BLOCK MODE CONTROL REGISTER
|
||||
CALL CVDU_RD ; GET CURRENT VALUE
|
||||
AND $7F ; CLEAR BIT 7 FOR FILL MODE
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
; SET CHARACTER TO WRITE
|
||||
; SET VALUE TO WRITE
|
||||
POP AF ; RESTORE THE FILL VALUE PASSED IN
|
||||
LD C,31 ; DATA REGISTER
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
; SET BLOCK WRITE COUNT (WILL EXECUTE THE WRITE)
|
||||
LD A,80 - 1 ; SET WRITE COUNT TO LINE LENGTH - 1 (1 CHAR ALREADY WRITTEN)
|
||||
LD A,CVDU_COLS - 1 ; SET WRITE COUNT TO LINE LENGTH - 1 (1 CHAR ALREADY WRITTEN)
|
||||
LD C,30 ; WORD COUNT REGISTER
|
||||
CALL CVDU_WR ; DO IT
|
||||
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; BLOCK COPY BC BYTES FROM HL TO DE
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
CVDU_BLKCPY:
|
||||
; SETUP PARMS FOR FIRST PASS (CHARS)
|
||||
PUSH BC ; LENGTH
|
||||
PUSH HL ; SOURCE
|
||||
PUSH DE ; DEST
|
||||
; PUT A RETURN ADDRESS ON THE STACK FOR SECOND PASS
|
||||
PUSH HL ; PUT CURRENT HL ON STACK
|
||||
LD HL,CVDU_BLKCPY1 ; NOW SET HL TO RETURN ADDRESS
|
||||
EX (SP),HL ; GET ORIG HL BACK, AND PUT RET ADR ON STACK
|
||||
; SETUP PARMS FOR SECOND PASS (ATTRIBUTES)
|
||||
PUSH BC ; LENGTH
|
||||
LD BC,$800 ; USE BC TO ADD OFFSET TO ATTR BUF
|
||||
ADD HL,BC ; ADD THE OFFSET TO HL
|
||||
PUSH HL ; SAVE PARM (SOURCE ADR)
|
||||
EX DE,HL ; GET DE INTO HL
|
||||
ADD HL,BC ; ADD THE OFFSET
|
||||
PUSH HL ; SAVE PARM (DESTINATION ADR)
|
||||
;
|
||||
CVDU_BLKCPY1:
|
||||
; SET MODE TO BLOCK COPY
|
||||
LD C,24 ; BLOCK MODE CONTROL REGISTER
|
||||
CALL CVDU_RD ; GET CURRENT VALUE
|
||||
OR $80 ; SET BIT 7 FOR COPY MODE
|
||||
CALL CVDU_WR ; DO IT
|
||||
;
|
||||
; SET DESTINATION
|
||||
POP HL ; RECOVER DESTINATION ADDRESS
|
||||
LD C,18 ; REGISTER = UPDATE ADDRESS
|
||||
CALL CVDU_WRX ; DO IT
|
||||
;
|
||||
; SET SOURCE
|
||||
POP HL ; RECOVER SOURCE ADDRESS
|
||||
LD C,32 ; REGISTER = BLOCK START
|
||||
CALL CVDU_WRX ; DO IT
|
||||
;
|
||||
; SET LENGTH
|
||||
POP HL ; RECOVER LENGTH
|
||||
LD A,L ; BYTES TO COPY GOES IN A
|
||||
LD C,30 ; REGSITER = WORD COUNT
|
||||
JP CVDU_WR ; DO IT (COPY OCCURS HERE) AND RETURN
|
||||
;
|
||||
;==================================================================================================
|
||||
; CVDU DRIVER - DATA
|
||||
;==================================================================================================
|
||||
|
||||
108
Source/kbd.asm
108
Source/kbd.asm
@@ -76,7 +76,8 @@ KBD_INIT:
|
||||
CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK)
|
||||
LD A,$60 ; SET COMMAND REGISTER
|
||||
CALL KBD_PUTCMD ; SEND IT
|
||||
LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS
|
||||
; LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS
|
||||
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS
|
||||
CALL KBD_PUTDATA ; SEND IT
|
||||
|
||||
CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED
|
||||
@@ -119,7 +120,6 @@ KBD_STAT3:
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
KBD_READ:
|
||||
; CALL KBD_STAT ; CHECK TO SEE IF KEY READY
|
||||
LD A,(KBD_STATUS) ; GET STATUS
|
||||
AND KBD_KEYRDY ; ISOLIATE KEY READY BIT
|
||||
JR NZ,KBD_READ1 ; READY, GO GET THE KEY AND RETURN
|
||||
@@ -127,6 +127,13 @@ KBD_READ:
|
||||
JR KBD_READ ; AND LOOP
|
||||
;
|
||||
KBD_READ1:
|
||||
LD A,(KBD_STATE) ; GET STATE
|
||||
AND $01 ; ISOLATE EXTENDED SCANCODE BIT
|
||||
RRCA ; ROTATE IT TO HIGH ORDER BIT
|
||||
LD E,A ; SAVE IT IN E FOR NOW
|
||||
LD A,(KBD_SCANCODE) ; GET SCANCODE
|
||||
OR E ; COMBINE WITH EXTENDED BIT
|
||||
LD C,A ; STORE IT IN C FOR RETURN
|
||||
LD A,(KBD_KEYCODE) ; GET KEYCODE
|
||||
LD E,A ; SAVE IT IN E
|
||||
LD A,(KBD_STATE) ; GET STATE FLAGS
|
||||
@@ -252,13 +259,13 @@ KBD_RESET:
|
||||
CALL KBD_PUTDATA ; SEND IT
|
||||
CALL KBD_GETDATA ; GET THE ACK
|
||||
LD B,0 ; SETUP LOOP COUNTER
|
||||
PPK_RESET0:
|
||||
KBD_RESET0:
|
||||
PUSH BC ; PRESERVE COUNTER
|
||||
CALL KBD_GETDATA ; TRY TO GET THE RESPONSE
|
||||
POP BC ; RECOVER COUNTER
|
||||
JR NZ,PPK_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP
|
||||
DJNZ PPK_RESET0 ; LOOP TILL COUNTER EXHAUSTED
|
||||
PPK_RESET1:
|
||||
JR NZ,KBD_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP
|
||||
DJNZ KBD_RESET0 ; LOOP TILL COUNTER EXHAUSTED
|
||||
KBD_RESET1:
|
||||
LD A,B
|
||||
XOR A ; SIGNAL SUCCESS (RESPONSE IS IGNORED...)
|
||||
RET ; DONE
|
||||
@@ -417,20 +424,14 @@ KBD_DEC1: ; PROCESS NEXT SCANCODE
|
||||
LD (KBD_SCANCODE),A ; SAVE SCANCODE
|
||||
|
||||
KBD_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES
|
||||
;
|
||||
; KEYBOARD INSERTION DETECTION HAS BEEN REMOVED BELOW BECAUSE THE SCAN CODE
|
||||
; OF $AA IS AMBIGUOUS WHEN SCAN SET 2 IS IN USE. $AA COULD MEAN EITHER A LEFT
|
||||
; SHIFT KEY BREAK EVENT OR A KEYBOARD INSERTION EVENT. OBVIOUSLY, A SHIFT BREAK
|
||||
; EVENT CANNOT BE ALLOWED TO TRIGGER A KEYBOARD RESET, SO WE CANNOT INTERPRET
|
||||
; $AA AS A KEYBOARD INSERTION. UNFORTUNATE, BUT IS SEE NO ALTERNATIVES.
|
||||
;
|
||||
; LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE
|
||||
; CP $AA ; KEYBOARD INSERTION?
|
||||
; JR NZ,KBD_DEC3 ; NOPE, BYPASS
|
||||
; CALL KBD_RESET ; RESET KEYBOARD
|
||||
; CALL KBD_SETLEDS ; SET LEDS
|
||||
; CALL KBD_SETRPT ; SET REPEAT RATE
|
||||
; JP KBD_DECNEW ; RESTART THE ENGINE
|
||||
LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE
|
||||
CP $AA ; KEYBOARD INSERTION?
|
||||
JR NZ,KBD_DEC3 ; NOPE, BYPASS
|
||||
CALL LDELAY ; WAIT A BIT
|
||||
CALL KBD_RESET ; RESET KEYBOARD
|
||||
CALL KBD_SETLEDS ; SET LEDS
|
||||
CALL KBD_SETRPT ; SET REPEAT RATE
|
||||
JP KBD_DECNEW ; RESTART THE ENGINE
|
||||
|
||||
KBD_DEC3: ; DETECT AND HANDLE SCANCODE PREFIXES
|
||||
LD A,(KBD_SCANCODE) ; GET THE CURRENT SCANCODE
|
||||
@@ -448,8 +449,8 @@ KBD_DEC3B: ; HANDLE SCANCODE PREFIX $E1 (PAUSE KEY)
|
||||
JR NZ,KBD_DEC4 ; NOPE MOVE ON
|
||||
LD A,$EE ; MAP TO KEYCODE $EE
|
||||
LD (KBD_KEYCODE),A ; SAVE IT
|
||||
; SWALLOW NEXT 5 SCANCODES
|
||||
LD B,5 ; LOOP 5 TIMES
|
||||
; SWALLOW NEXT 7 SCANCODES
|
||||
LD B,7 ; LOOP 5 TIMES
|
||||
KBD_DEC3B1:
|
||||
PUSH BC
|
||||
CALL KBD_GETDATA ; RETRIEVE NEXT SCANCODE
|
||||
@@ -458,20 +459,13 @@ KBD_DEC3B1:
|
||||
JP KBD_DEC6 ; RESUME AFTER MAPPING
|
||||
|
||||
KBD_DEC4: ; DETECT AND FLAG BREAK EVENT
|
||||
LD A,(KBD_SCANCODE)
|
||||
LD E,A ; SAVE SCANCODE IN E
|
||||
RES 7,A ; CLEAR THE BREAK BIT FROM THE KEYCODE
|
||||
LD (KBD_SCANCODE),A ; SAVE UPDATED SCANCODE
|
||||
LD A,E ; RECOVER ORIGINAL SCANCODE
|
||||
AND $80 ; ISOLATE BREAK BIT
|
||||
RLCA ; ROTATE BIT TO POSITION...
|
||||
RLCA ; OF BREAK BIT IN STATUS
|
||||
LD E,A ; SAVE IT IN E
|
||||
LD A,(KBD_STATUS) ; GET THE STATUS FLAGS
|
||||
AND ~KBD_BREAK ; CLEAR THE BREAK BIT
|
||||
OR E ; OR IN NEW BREAK BIT
|
||||
LD (KBD_STATUS),A ; SAVE IT
|
||||
|
||||
CP $F0 ; BREAK (KEY UP) PREFIX?
|
||||
JR NZ,KBD_DEC5 ; NOPE MOVE ON
|
||||
LD A,(KBD_STATUS) ; GET STATUS
|
||||
OR KBD_BREAK ; SET BREAK BIT
|
||||
LD (KBD_STATUS),A ; SAVE STATUS
|
||||
JR KBD_DEC1 ; LOOP TO DO NEXT SCANCODE
|
||||
|
||||
KBD_DEC5: ; MAP SCANCODE TO KEYCODE
|
||||
LD A,(KBD_STATUS) ; GET STATUS
|
||||
AND KBD_EXT ; EXTENDED BIT SET?
|
||||
@@ -687,30 +681,36 @@ KBD_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS)
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
KBD_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE
|
||||
.DB $FF,$1B,'1','2','3','4','5','6','7','8','9','0','-','=',$08,$09
|
||||
.DB 'q','w','e','r','t','y','u','i','o','p','[',']',$0D,$B2,'a','s'
|
||||
.DB 'd','f','g','h','j','k','l',';',$27,'`',$B0,'\','z','x','c','v'
|
||||
.DB 'b','n','m',',','.','/',$B1,$CC,$B4,' ',$BC,$E0,$E1,$E2,$E3,$E4
|
||||
.DB $E5,$E6,$E7,$E8,$E9,$BD,$BE,$C6,$C7,$C8,$CD,$C3,$C4,$C5,$CE,$C0
|
||||
.DB $C1,$C2,$C9,$CA,$EC,$FF,$FF,$FA,$EB
|
||||
.DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'`',$FF
|
||||
.DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'z','s','a','w','2',$FF
|
||||
.DB $FF,'c','x','d','e','4','3',$FF,$FF,' ','v','f','t','r','5',$FF
|
||||
.DB $FF,'n','b','h','g','y','6',$FF,$FF,$FF,'m','j','u','7','8',$FF
|
||||
.DB $FF,',','k','i','o','0','9',$FF,$FF,'.','/','l',';','p','-',$FF
|
||||
.DB $FF,$FF,$27,$FF,'[','=',$FF,$FF,$BC,$B1,$0D,']',$FF,'\',$FF,$FF
|
||||
.DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$C0,$FF,$C3,$C6,$FF,$FF,$FF
|
||||
.DB $C9,$CA,$C1,$C4,$C5,$C7,$1B,$BD,$FA,$CE,$C2,$CD,$CC,$C8,$BE,$FF
|
||||
.DB $FF,$FF,$FF,$E6,$EC
|
||||
;
|
||||
KBD_MAPSIZ .EQU ($ - KBD_MAPSTD)
|
||||
;
|
||||
KBD_MAPSHIFT: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE WHEN SHIFT ACTIVE
|
||||
.DB $FF,$1B,'!','@','#','$','%','^','&','*','(',')','_','+',$08,$09
|
||||
.DB 'Q','W','E','R','T','Y','U','I','O','P','{','}',$0D,$B2,'A','S'
|
||||
.DB 'D','F','G','H','J','K','L',':',$22,'~',$B0,'|','Z','X','C','V'
|
||||
.DB 'B','N','M','<','>','?',$B1,$DC,$B4,' ',$BC,$E0,$E1,$E2,$E3,$E4
|
||||
.DB $E5,$E6,$E7,$E8,$E9,$BD,$BE,$D6,$D7,$D8,$DD,$D3,$D4,$D5,$DE,$D0
|
||||
.DB $D1,$D2,$D9,$DA,$EC,$FF,$FF,$FA,$EB
|
||||
.DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'~',$FF
|
||||
.DB $FF,$B4,$B0,$FF,$B2,'Q','!',$FF,$FF,$FF,'Z','S','A','W','@',$FF
|
||||
.DB $FF,'C','X','D','E','$','#',$FF,$FF,' ','V','F','T','R','%',$FF
|
||||
.DB $FF,'N','B','H','G','Y','^',$FF,$FF,$FF,'M','J','U','&','*',$FF
|
||||
.DB $FF,'<','K','I','O',')','(',$FF,$FF,'>','?','L',':','P','_',$FF
|
||||
.DB $FF,$FF,$22,$FF,'{','+',$FF,$FF,$BC,$B1,$0D,'}',$FF,'|',$FF,$FF
|
||||
.DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$D0,$FF,$D3,$D6,$FF,$FF,$FF
|
||||
.DB $D9,$DA,$D1,$D4,$D5,$D7,$1B,$BD,$FA,$DE,$D2,$DD,$DC,$D8,$BE,$FF
|
||||
.DB $FF,$FF,$FF,$E6,$EC
|
||||
;
|
||||
KBD_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES
|
||||
.DB $38,$B5, $1D,$B3, $5B,$B6, $5C,$B7
|
||||
.DB $5D,$EF, $5E,$FA, $5F,$FB, $35,$CB
|
||||
.DB $1C,$CF, $63,$FC, $4F,$F3, $4B,$F8
|
||||
.DB $47,$F2, $52,$F0, $53,$F1, $50,$F7
|
||||
.DB $4D,$F9, $48,$F6, $51,$F5, $37,$ED
|
||||
.DB $49,$F4, $46,$FD, $00,$00
|
||||
.DB $11,$B5, $14,$B3, $1F,$B6, $27,$B7
|
||||
.DB $2F,$EF, $37,$FA, $3F,$FB, $4A,$CB
|
||||
.DB $5A,$CF, $5E,$FC, $69,$F3, $6B,$F8
|
||||
.DB $6C,$F2, $70,$F0, $71,$F1, $72,$F7
|
||||
.DB $74,$F9, $75,$F6, $7A,$F5, $7C,$ED
|
||||
.DB $7D,$F4, $7E,$FD, $00,$00
|
||||
;
|
||||
KBD_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES
|
||||
.DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D
|
||||
|
||||
@@ -341,6 +341,8 @@ N8V_DISPVDA:
|
||||
DEC A
|
||||
JP Z,N8V_VDAFIL
|
||||
DEC A
|
||||
JP Z,N8V_VDACPY
|
||||
DEC A
|
||||
JP Z,N8V_VDASCR
|
||||
DEC A
|
||||
JP Z,PPK_STAT
|
||||
@@ -548,6 +550,13 @@ N8V_VDAFIL:
|
||||
XOR A
|
||||
RET
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Video Display Processor Copy ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
N8V_VDACPY:
|
||||
XOR A
|
||||
RET
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Video Display Processor Scroll ;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
375
Source/ppide.asm
375
Source/ppide.asm
@@ -60,6 +60,7 @@ PPIDE_RST_LINE .EQU 80H ; INVERTER BETWEEN 8255 AND IDE INTERFACE
|
||||
;
|
||||
PPIDE_DATA .EQU PPIDE_CS0_LINE
|
||||
PPIDE_ERROR .EQU PPIDE_CS0_LINE + PPIDE_A0_LINE
|
||||
PPIDE_FEATURE .EQU PPIDE_CS0_LINE + PPIDE_A0_LINE
|
||||
PPIDE_SEC_CNT .EQU PPIDE_CS0_LINE + PPIDE_A1_LINE
|
||||
PPIDE_SECTOR .EQU PPIDE_CS0_LINE + PPIDE_A1_LINE + PPIDE_A0_LINE
|
||||
PPIDE_CYL_LSB .EQU PPIDE_CS0_LINE + PPIDE_A2_LINE
|
||||
@@ -175,19 +176,18 @@ PPIDE_RW:
|
||||
|
||||
#IF (PPIDE8BIT)
|
||||
CALL PPIDE_WAITRDY
|
||||
|
||||
LD C,01H
|
||||
LD A,PPIDE_ERROR
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDECMD_SETFEAT
|
||||
LD A,PPIDE_COMMAND
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDE_FEATURE ; IDE FEATURE REGISTER
|
||||
LD A,01H ; VALUE := 1
|
||||
CALL PPIDE_WRITE ; DO IT
|
||||
LD C,PPIDE_COMMAND ; IDE COMMAND REGISTER
|
||||
LD A,PPIDECMD_SETFEAT ; SET FEATURE
|
||||
CALL PPIDE_WRITE ; DO IT
|
||||
CALL PPIDE_WAITRDY
|
||||
JP NC,PPIDE_ERR
|
||||
CALL PPIDE_CHKERR ; CHECK FOR ERRORS
|
||||
JP NC,PPIDE_ERR
|
||||
#IF (PPIDETRACE >= 2)
|
||||
CALL IDE_PRT
|
||||
CALL PPIDE_PRT
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
|
||||
@@ -195,10 +195,9 @@ PPIDE_RW0:
|
||||
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
|
||||
JP NC,PPIDE_ERR
|
||||
CALL PPIDE_SETUP ; SETUP CYL, TRK, HEAD
|
||||
LD A,(PPIDEP_CMD)
|
||||
LD C,A
|
||||
LD A,PPIDE_COMMAND
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDE_COMMAND ; IDE COMMAND REGISTER
|
||||
LD A,(PPIDEP_CMD) ; COMMAND VALUE
|
||||
CALL PPIDE_WRITE ; DO IT
|
||||
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
|
||||
JP NC,PPIDE_ERR
|
||||
CALL PPIDE_CHKERR ; CHECK FOR ERRORS
|
||||
@@ -246,14 +245,14 @@ PPIDE_OK:
|
||||
;
|
||||
;
|
||||
PPIDE_RESET:
|
||||
LD C,000001110B ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
|
||||
LD A,PPIDE_CONTROL
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDE_CONTROL ; IDE CONTROL REGISTER
|
||||
LD A,000001110B ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
|
||||
CALL PPIDE_WRITE ; DO IT
|
||||
LD DE,8 ; DELAY ABOUT 200ms
|
||||
CALL VDELAY
|
||||
LD C,000000010B ; NO INTERRUPTS, DEASSERT RESET
|
||||
LD A,PPIDE_CONTROL
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDE_CONTROL ; IDE CONTROL REGISTER
|
||||
LD A,000000010B ; NO INTERRUPTS, DEASSERT RESET
|
||||
CALL PPIDE_WRITE ; DO IT
|
||||
XOR A ; STATUS OK
|
||||
LD (PPIDE_STAT),A ; SAVE IT
|
||||
|
||||
@@ -272,9 +271,8 @@ PPIDE_WBSY:
|
||||
LD A,D
|
||||
OR E
|
||||
JP Z,PPIDE_TO
|
||||
LD A,PPIDE_STTS
|
||||
CALL PPIDE_READ
|
||||
LD A,C
|
||||
LD C,PPIDE_STTS ; IDE STATUS REGISTER
|
||||
CALL PPIDE_READ ; READ ID
|
||||
LD (PPIDEP_STTS),A ; SAVE IT
|
||||
AND 011000000B ; ISOLATE BUSY AND RDY BITS
|
||||
XOR 001000000B ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1
|
||||
@@ -290,22 +288,20 @@ PPIDE_TO:
|
||||
;
|
||||
;
|
||||
PPIDE_CHKERR:
|
||||
LD A,PPIDE_STTS
|
||||
CALL PPIDE_READ
|
||||
LD A,C
|
||||
LD C,PPIDE_STTS ; IDE STATUS REGISTER
|
||||
CALL PPIDE_READ ; READ IT
|
||||
LD (PPIDEP_STTS),A ; SAVE IT
|
||||
AND 000000001B ; ERROR BIT SET?
|
||||
SCF ; ASSUME NO ERR
|
||||
RET Z ; NO ERR, RETURN WITH CF SET
|
||||
|
||||
LD A,PPIDE_ERROR
|
||||
CALL PPIDE_READ
|
||||
LD A,C
|
||||
;
|
||||
LD C,PPIDE_ERROR ; IDE ERROR REGISTER
|
||||
CALL PPIDE_READ ; READ IT
|
||||
LD (PPIDEP_ERR),A ; SAVE IT
|
||||
|
||||
;
|
||||
LD A,PPIDERC_CMDERR ; COMMAND ERROR
|
||||
LD (PPIDE_RC),A ; SAVE IT
|
||||
|
||||
;
|
||||
OR A ; CLEAR CF TO SIGNAL ERROR
|
||||
RET
|
||||
;
|
||||
@@ -319,9 +315,8 @@ PPIDE_WDRQ:
|
||||
LD A,D
|
||||
OR E
|
||||
JP Z,PPIDE_TO2
|
||||
LD A,PPIDE_STTS
|
||||
CALL PPIDE_READ
|
||||
LD A,C
|
||||
LD C,PPIDE_STTS ; IDE STATUS REGISTER
|
||||
CALL PPIDE_READ ; READ IT
|
||||
LD (PPIDEP_STTS),A ; SAVE IT
|
||||
AND 010001000B ; TO FILL (OR READY TO FILL)
|
||||
XOR 000001000B
|
||||
@@ -336,73 +331,110 @@ PPIDE_TO2:
|
||||
;
|
||||
;
|
||||
;
|
||||
#IF (PPIDE8BIT)
|
||||
PPIDE_BUFRD:
|
||||
LD HL,(DIOBUF)
|
||||
LD DE,200H
|
||||
PPIDE_BUFRD1:
|
||||
LD A,PPIDE_DATA
|
||||
CALL PPIDE_READ
|
||||
LD (HL),C
|
||||
INC HL
|
||||
DEC DE
|
||||
LD A,D
|
||||
OR E
|
||||
JP NZ,PPIDE_BUFRD1
|
||||
RET
|
||||
#ELSE
|
||||
PPIDE_BUFRD:
|
||||
LD HL,(DIOBUF)
|
||||
LD D,0
|
||||
PPIDE_BUFRD1:
|
||||
LD A,PPIDE_DATA
|
||||
CALL PPIDE_READ
|
||||
LD (HL),C
|
||||
INC HL
|
||||
LD (HL),B
|
||||
INC HL
|
||||
DEC D
|
||||
JP NZ,PPIDE_BUFRD1
|
||||
; SETUP PPI TO READ
|
||||
LD A,RD_IDE_8255 ; READ CONFIG
|
||||
OUT (PPI1CONT),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
; SELECT READ/WRITE IDE REGISTER
|
||||
LD A,PPIDE_DATA ; DATA REGISTER
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
LD E,A ; E := READ UNASSERTED
|
||||
XOR PPIDE_RD_LINE ; SWAP THE READ LINE BIT
|
||||
LD D,A ; D := READ ASSERTED
|
||||
;
|
||||
; LOOP SETUP
|
||||
LD HL,(DIOBUF) ; LOCATION OF BUFFER
|
||||
LD B,0 ; 256 ITERATIONS
|
||||
LD C,IDEMSB ; SETUP C WITH IO PORT (MSB)
|
||||
;
|
||||
CALL PPIDE_BUFRD1 ; FIRST PASS (FIRST 256 BYTES)
|
||||
CALL PPIDE_BUFRD1 ; SECOND PASS (LAST 256 BYTES)
|
||||
;
|
||||
; CLEAN UP
|
||||
XOR A ; ZERO A
|
||||
OUT (IDECTL),A ; RELEASE ALL BUS SIGNALS
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
RET
|
||||
;
|
||||
PPIDE_BUFRD1: ; START OF READ LOOP
|
||||
#IF (!PPIDE8BIT)
|
||||
DEC C ; MSB -> LSB
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
;
|
||||
#IF (PPIDE8BIT)
|
||||
PPIDE_BUFWR:
|
||||
LD HL,(DIOBUF)
|
||||
LD DE,200H
|
||||
PPIDE_BUFWR1:
|
||||
LD C,(HL)
|
||||
LD A,PPIDE_DATA
|
||||
CALL PPIDE_WRITE
|
||||
INC HL
|
||||
DEC DE
|
||||
LD A,D
|
||||
OR E
|
||||
JP NZ,PPIDE_BUFWR1
|
||||
#ELSE
|
||||
PPIDE_BUFWR:
|
||||
LD HL,(DIOBUF)
|
||||
LD D,0
|
||||
PPIDE_BUFWR1:
|
||||
LD C,(HL)
|
||||
INC HL
|
||||
LD B,(HL)
|
||||
INC HL
|
||||
LD A,PPIDE_DATA
|
||||
CALL PPIDE_WRITE
|
||||
DEC D
|
||||
JP NZ,PPIDE_BUFWR1
|
||||
RET
|
||||
LD A,D ; ASSERT READ
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
INI ; GET AND SAVE NEXT BYTE
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
#IF (!PPIDE8BIT)
|
||||
INC C ; LSB -> MSB
|
||||
INI ; GET AND SAVE NEXT BYTE
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
#ENDIF
|
||||
LD A,E ; DEASSERT READ
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
JR NZ,PPIDE_BUFRD1 ; LOOP UNTIL DONE
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_BUFWR:
|
||||
; SETUP PPI TO WRITE
|
||||
LD A,WR_IDE_8255 ; READ CONFIG
|
||||
OUT (PPI1CONT),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
; SELECT READ/WRITE IDE REGISTER
|
||||
LD A,PPIDE_DATA ; DATA REGISTER
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
LD E,A ; E := READ UNASSERTED
|
||||
XOR PPIDE_WR_LINE ; SWAP THE WRITE LINE BIT
|
||||
LD D,A ; D := READ ASSERTED
|
||||
;
|
||||
; LOOP SETUP
|
||||
LD HL,(DIOBUF) ; LOCATION OF BUFFER
|
||||
LD B,0 ; 256 ITERATIONS
|
||||
LD C,IDEMSB ; SETUP C WITH IO PORT (MSB)
|
||||
;
|
||||
CALL PPIDE_BUFWR1 ; FIRST PASS (FIRST 256 BYTES)
|
||||
CALL PPIDE_BUFWR1 ; SECOND PASS (LAST 256 BYTES)
|
||||
;
|
||||
; CLEAN UP
|
||||
XOR A ; ZERO A
|
||||
OUT (IDECTL),A ; RELEASE ALL BUS SIGNALS
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
RET
|
||||
;
|
||||
PPIDE_BUFWR1: ; START OF READ LOOP
|
||||
#IF (!PPIDE8BIT)
|
||||
DEC C ; MSB -> LSB
|
||||
#ENDIF
|
||||
OUTI ; SEND NEXT BYTE OF BUFFER
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
#IF (!PPIDE8BIT)
|
||||
INC C ; LSB -> MSB
|
||||
OUTI ; SEND NEXT BYTE OF BUFFER
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
#ENDIF
|
||||
LD A,D ; ASSERT WRITE
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
LD A,E ; DEASSERT WRITE
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
JR NZ,PPIDE_BUFWR1 ; LOOP UNTIL DONE
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_SETUP:
|
||||
LD C,1
|
||||
LD A,PPIDE_SEC_CNT
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDE_SEC_CNT ; IDE SECTOR COUNT REGISTER
|
||||
LD A,1 ; 1 SECTOR
|
||||
CALL PPIDE_WRITE ; DO IT
|
||||
|
||||
LD A,(HSTDSK) ; HSTDSK -> HEAD BIT 4 TO SELECT UNIT
|
||||
AND 0FH
|
||||
@@ -420,29 +452,25 @@ PPIDE_SETUP_UNIT1:
|
||||
; LD DE,(PPIDE1_OFFSET)
|
||||
JP PPIDE_SETUP1
|
||||
PPIDE_SETUP1:
|
||||
LD (PPIDEP_HEAD),A
|
||||
LD C,A
|
||||
LD A,PPIDE_HEAD
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDE_HEAD ; IDE HEAD REGISTER
|
||||
LD (PPIDEP_HEAD),A ; SAVE HEAD VALUE
|
||||
CALL PPIDE_WRITE ; WRITE IT
|
||||
|
||||
LD HL,(HSTTRK) ; HSTTRK -> IDECYLHI/LO
|
||||
LD A,H
|
||||
LD (PPIDEP_CYLHI),A
|
||||
LD C,A
|
||||
LD A,PPIDE_CYL_MSB
|
||||
CALL PPIDE_WRITE
|
||||
LD A,L
|
||||
LD (PPIDEP_CYLLO),A
|
||||
LD C,A
|
||||
LD A,PPIDE_CYL_LSB
|
||||
CALL PPIDE_WRITE
|
||||
LD C,PPIDE_CYL_MSB ; IDE MSB CYL REGISTER
|
||||
LD A,H ; MSB CYL VALUE
|
||||
LD (PPIDEP_CYLHI),A ; SAVE IT
|
||||
CALL PPIDE_WRITE ; WRITE IT
|
||||
LD C,PPIDE_CYL_LSB ; IDE LSB CYL REGISTER
|
||||
LD A,L ; LSB CYL VALUE
|
||||
LD (PPIDEP_CYLLO),A ; SAVE IT
|
||||
CALL PPIDE_WRITE ; WRITE IT
|
||||
|
||||
LD BC,(HSTSEC) ; HSTSEC -> IDESECTN
|
||||
LD A,C
|
||||
LD (PPIDEP_SEC),A
|
||||
LD C,A
|
||||
LD A,PPIDE_SECTOR
|
||||
CALL PPIDE_WRITE
|
||||
LD HL,(HSTSEC) ; HSTSEC -> IDESECTN
|
||||
LD C,PPIDE_SECTOR ; IDE SECTOR REGISTER
|
||||
LD A,L ; SECTOR VALUE
|
||||
LD (PPIDEP_SEC),A ; SAVE IT
|
||||
CALL PPIDE_WRITE ; WRITE IT
|
||||
|
||||
#IF (DSKYENABLE)
|
||||
CALL PPIDE_DSKY
|
||||
@@ -453,70 +481,63 @@ PPIDE_SETUP1:
|
||||
;
|
||||
;
|
||||
PPIDE_READ:
|
||||
PUSH AF ; save register value
|
||||
LD A,RD_IDE_8255
|
||||
OUT (PPI1CONT),A ; Config 8255 chip, read mode
|
||||
RECOVERY
|
||||
POP AF ; restore register value
|
||||
|
||||
OUT (IDECTL),A ; Drive address onto control lines
|
||||
RECOVERY
|
||||
OR PPIDE_RD_LINE ; assert RD pin
|
||||
|
||||
OUT (IDECTL),A
|
||||
RECOVERY
|
||||
|
||||
PUSH AF ; save register value
|
||||
IN A,(IDELSB) ; read lower byte
|
||||
RECOVERY
|
||||
LD C,A ; save in reg C
|
||||
|
||||
IN A,(IDEMSB) ; read upper byte
|
||||
RECOVERY
|
||||
LD B,A ; save in reg C
|
||||
|
||||
POP AF ; restore register value
|
||||
XOR PPIDE_RD_LINE ; de-assert RD signal
|
||||
OUT (IDECTL),A
|
||||
RECOVERY
|
||||
|
||||
XOR A
|
||||
OUT (IDECTL),A ; Deassert all control pins
|
||||
RECOVERY
|
||||
RET
|
||||
;
|
||||
; SET PPI MODE TO READ CONFIGURATION
|
||||
LD A,RD_IDE_8255 ; PPI MODE TO READ
|
||||
OUT (PPI1CONT),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
; SELECT REQUESTED IDE REGISTER AND ASSERT READ
|
||||
LD A,C ; REGISTER SELECTION -> A
|
||||
OR PPIDE_RD_LINE ; ASSERT READ
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
; READ THE BYTE
|
||||
IN A,(IDELSB) ; READ LSB
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
PUSH AF ; SAVE IT FOR NOW
|
||||
;
|
||||
; CLEAN UP AND RETURN
|
||||
XOR A ; ZERO A
|
||||
OUT (IDECTL),A ; RELEASE ALL BUS SIGNALS
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
POP AF ; RECOVER THE DATA BYTE
|
||||
RET ; RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_WRITE:
|
||||
PUSH AF ; save IDE register value
|
||||
LD A,WR_IDE_8255
|
||||
OUT (PPI1CONT),A ; Config 8255 chip, write mode
|
||||
RECOVERY
|
||||
|
||||
LD A,C ; get value to be written
|
||||
OUT (IDELSB),A
|
||||
RECOVERY
|
||||
|
||||
LD A,B ; get value to be written
|
||||
OUT (IDEMSB),A
|
||||
RECOVERY
|
||||
|
||||
|
||||
POP AF ; get saved IDE register
|
||||
OUT (IDECTL),A ; Drive address onto control lines
|
||||
RECOVERY
|
||||
OR PPIDE_WR_LINE ; assert write pin
|
||||
OUT (IDECTL),A
|
||||
RECOVERY
|
||||
|
||||
XOR PPIDE_WR_LINE ; de assert WR pin
|
||||
OUT (IDECTL),A ; Drive address onto control lines
|
||||
RECOVERY
|
||||
|
||||
XOR A
|
||||
OUT (IDECTL),A ; release bus signals
|
||||
RECOVERY
|
||||
RET
|
||||
;
|
||||
; SAVE THE INCOMING VALUE TO WRITE
|
||||
PUSH AF
|
||||
;
|
||||
; SET PPI MODE TO WRITE CONFIGURATION
|
||||
LD A,WR_IDE_8255 ; PPI MODE TO WRITE
|
||||
OUT (PPI1CONT),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
; SET THE VALUE TO WRITE
|
||||
POP AF ; GET VALUE BACK
|
||||
OUT (IDELSB),A ; SET IDE LSB
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
; XOR A ; ZERO A
|
||||
; OUT (IDELSB),A ; SET IDE MSB
|
||||
; RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
; PULSE THE WRITE LINE
|
||||
LD A,C ; REGISTER SELECTION -> A
|
||||
OR PPIDE_WR_LINE ; ASSERT WRITE
|
||||
OUT (IDECTL),A ; DO IT
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
; CLEAN UP AND RETURN
|
||||
XOR A ; ZERO A
|
||||
OUT (IDECTL),A ; RELEASE ALL BUS SIGNALS
|
||||
RECOVERY ; OPTIONAL SMALL DELAY
|
||||
;
|
||||
RET ; RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
@@ -581,15 +602,13 @@ PPIDE_PRTCMD:
|
||||
CALL WRITESTR
|
||||
|
||||
CALL PC_SPACE
|
||||
LD A,PPIDE_STTS
|
||||
CALL PPIDE_READ
|
||||
LD A,C
|
||||
LD C,PPIDE_STTS ; IDE STATUS REGISTER
|
||||
CALL PPIDE_READ ; READ IT
|
||||
CALL PRTHEXBYTE
|
||||
|
||||
CALL PC_SPACE
|
||||
LD A,PPIDE_ERROR
|
||||
CALL PPIDE_READ
|
||||
LD A,C
|
||||
LD C,PPIDE_ERROR ; IDE ERROR REGISTER
|
||||
CALL PPIDE_READ ; READ IT
|
||||
CALL PRTHEXBYTE
|
||||
|
||||
CALL PC_SPACE
|
||||
|
||||
@@ -133,6 +133,13 @@ PPK_READ:
|
||||
JR PPK_READ ; AND LOOP
|
||||
;
|
||||
PPK_READ1:
|
||||
LD A,(PPK_STATE) ; GET STATE
|
||||
AND $01 ; ISOLATE EXTENDED SCANCODE BIT
|
||||
RRCA ; ROTATE IT TO HIGH ORDER BIT
|
||||
LD E,A ; SAVE IT IN E FOR NOW
|
||||
LD A,(PPK_SCANCODE) ; GET SCANCODE
|
||||
OR E ; COMBINE WITH EXTENDED BIT
|
||||
LD C,A ; STORE IT IN C FOR RETURN
|
||||
LD A,(PPK_KEYCODE) ; GET KEYCODE
|
||||
LD E,A ; SAVE IT IN E
|
||||
LD A,(PPK_STATE) ; GET STATE FLAGS
|
||||
|
||||
178
Source/std.asm
178
Source/std.asm
@@ -112,6 +112,11 @@ EMUTYP_NONE .EQU 0
|
||||
EMUTYP_TTY .EQU 1
|
||||
EMUTYP_ANSI .EQU 2
|
||||
;
|
||||
; SCSI DEVICE PERSONALITY CHOICES
|
||||
;
|
||||
S2I_PER_N8VEM .EQU 1
|
||||
S2I_PER_ST125N .EQU 2
|
||||
;
|
||||
; SYSTEM GENERATION SETTINGS
|
||||
;
|
||||
SYS_CPM .EQU 1 ; CPM (IMPLIES BDOS + CCP)
|
||||
@@ -152,10 +157,14 @@ CP .EQU CP_ZCPR
|
||||
;
|
||||
; INCLUDE PLATFORM SPECIFIC HARDWARE DEFINITIONS
|
||||
;
|
||||
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_S2I))
|
||||
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA))
|
||||
#INCLUDE "n8vem.inc"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PLATFORM == PLT_S2I)
|
||||
#INCLUDE "s2i.inc"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
#INCLUDE "n8.inc"
|
||||
#ENDIF
|
||||
@@ -250,10 +259,11 @@ BF_VDASAT .EQU BF_VDA + 5 ; SET CHARACTER ATTRIBUTE
|
||||
BF_VDASCO .EQU BF_VDA + 6 ; SET CHARACTER COLOR
|
||||
BF_VDAWRC .EQU BF_VDA + 7 ; WRITE CHARACTER
|
||||
BF_VDAFIL .EQU BF_VDA + 8 ; FILL
|
||||
BF_VDASCR .EQU BF_VDA + 9 ; SCROLL
|
||||
BF_VDAKST .EQU BF_VDA + 10 ; GET KEYBOARD STATUS
|
||||
BF_VDAKFL .EQU BF_VDA + 11 ; FLUSH KEYBOARD BUFFER
|
||||
BF_VDAKRD .EQU BF_VDA + 12 ; READ KEYBOARD
|
||||
BF_VDACPY .EQU BF_VDA + 9 ; COPY
|
||||
BF_VDASCR .EQU BF_VDA + 10 ; SCROLL
|
||||
BF_VDAKST .EQU BF_VDA + 11 ; GET KEYBOARD STATUS
|
||||
BF_VDAKFL .EQU BF_VDA + 12 ; FLUSH KEYBOARD BUFFER
|
||||
BF_VDAKRD .EQU BF_VDA + 13 ; READ KEYBOARD
|
||||
;
|
||||
BF_SYS .EQU $F0
|
||||
BF_SYSGETCFG .EQU BF_SYS + 0 ; GET CONFIGURATION DATA BLOCK
|
||||
@@ -340,171 +350,21 @@ BIOS: .EQU CCP+1600H ; BASE OF BIOS
|
||||
CCPSIZ: .EQU 00800H
|
||||
;
|
||||
#IF (PLATFORM == PLT_N8VEM)
|
||||
#DEFINE PLATFORM_NAME "N8VEM Z80 SBC"
|
||||
#DEFINE PLATFORM_NAME "N8VEM Z80"
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_ZETA)
|
||||
#DEFINE PLATFORM_NAME "ZETA Z80 SBC"
|
||||
#DEFINE PLATFORM_NAME "ZETA Z80"
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_N8)
|
||||
#DEFINE PLATFORM_NAME "N8 Z180 SBC"
|
||||
#DEFINE PLATFORM_NAME "N8 Z180"
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_S2I)
|
||||
#DEFINE PLATFORM_NAME "SCSI2IDE"
|
||||
#DEFINE PLATFORM_NAME "SCSI2IDE Z80"
|
||||
#ENDIF
|
||||
#IF (PLATFORM == PLT_S100)
|
||||
#DEFINE PLATFORM_NAME "S100"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (DSKYENABLE)
|
||||
#DEFINE DSKYLBL ", DSKY"
|
||||
#ELSE
|
||||
#DEFINE DSKYLBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (VDUENABLE)
|
||||
#DEFINE VDULBL ", VDU"
|
||||
#ELSE
|
||||
#DEFINE VDULBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CVDUENABLE)
|
||||
#DEFINE CVDULBL ", CVDU"
|
||||
#ELSE
|
||||
#DEFINE CVDULBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (UPD7220ENABLE)
|
||||
#DEFINE UPD7220LBL ", UPD7220"
|
||||
#ELSE
|
||||
#DEFINE UPD7220LBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (N8VENABLE)
|
||||
#DEFINE N8VLBL ", N8V"
|
||||
#ELSE
|
||||
#DEFINE N8VLBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (FDENABLE)
|
||||
#IF (FDMAUTO)
|
||||
#DEFINE FDLBL ", FLOPPY (AUTOSIZE)"
|
||||
#ELSE
|
||||
#IF (FDMEDIA == FDM720)
|
||||
#DEFINE FDLBL ", FLOPPY (360KB)"
|
||||
#ENDIF
|
||||
#IF (FDMEDIA == FDM111)
|
||||
#DEFINE FDLBL ", FLOPPY (1.11MB)"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
#ELSE
|
||||
#DEFINE FDLBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (IDEENABLE)
|
||||
#IF (IDEMODE == IDEMODE_DIO)
|
||||
#DEFINE IDELBL ", IDE (DISKIO)"
|
||||
#ENDIF
|
||||
#IF (IDEMODE == IDEMODE_DIDE)
|
||||
#DEFINE IDELBL ", IDE (DUAL IDE)"
|
||||
#ENDIF
|
||||
#ELSE
|
||||
#DEFINE IDELBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PPIDEENABLE)
|
||||
#IF (PPIDEMODE == PPIDEMODE_STD)
|
||||
#DEFINE PPIDELBL ", PPIDE (STD)"
|
||||
#ENDIF
|
||||
#IF (PPIDEMODE == PPIDEMODE_DIO3)
|
||||
#DEFINE PPIDELBL ", PPIDE (DISKIO V3)"
|
||||
#ENDIF
|
||||
#ELSE
|
||||
#DEFINE PPIDELBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (SDENABLE)
|
||||
#DEFINE SDLBL ", SD CARD"
|
||||
#ELSE
|
||||
#DEFINE SDLBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (IDEENABLE)
|
||||
#DEFINE IDELBL ", IDE"
|
||||
#ELSE
|
||||
#DEFINE IDELBL ""
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PPIDEENABLE)
|
||||
#DEFINE PPIDELBL ", PPIDE"
|
||||
#ELSE
|
||||
#DEFINE PPIDELBL ""
|
||||
#ENDIF
|
||||
|
||||
#IF (SDENABLE)
|
||||
#DEFINE SDLBL ", SD CARD"
|
||||
#ELSE
|
||||
#DEFINE SDLBL ""
|
||||
#ENDIF
|
||||
|
||||
#IF (HDSKENABLE)
|
||||
#DEFINE HDSKLBL ", SIMH DISK"
|
||||
#ELSE
|
||||
#DEFINE HDSKLBL ""
|
||||
#ENDIF
|
||||
|
||||
#IF (PRPENABLE)
|
||||
#IF (PRPCONENABLE & PRPSDENABLE)
|
||||
#DEFINE PRPLBL ", PROPIO (CONSOLE, SD CARD)"
|
||||
#ENDIF
|
||||
#IF (PRPCONENABLE & !PRPSDENABLE)
|
||||
#DEFINE PRPLBL ", PROPIO (CONSOLE)"
|
||||
#ENDIF
|
||||
#IF (!PRPCONENABLE & PRPSDENABLE)
|
||||
#DEFINE PRPLBL ", PROPIO (SD CARD)"
|
||||
#ENDIF
|
||||
#IF (!PRPCONENABLE & !PRPSDENABLE)
|
||||
#DEFINE PRPLBL ", PROPIO ()"
|
||||
#ENDIF
|
||||
#ELSE
|
||||
#DEFINE PRPLBL ""
|
||||
#ENDIF
|
||||
|
||||
#IF (PPPENABLE)
|
||||
#IF (PPPCONENABLE & PPPSDENABLE)
|
||||
#DEFINE PPPLBL ", PARPORTPROP (CONSOLE, SD CARD)"
|
||||
#ENDIF
|
||||
#IF (PPPCONENABLE & !PPPSDENABLE)
|
||||
#DEFINE PPPLBL ", PARPORTPROP (CONSOLE)"
|
||||
#ENDIF
|
||||
#IF (!PPPCONENABLE & PPPSDENABLE)
|
||||
#DEFINE PPPLBL ", PARPORTPROP (SD CARD)"
|
||||
#ENDIF
|
||||
#IF (!PPPCONENABLE & !PPPSDENABLE)
|
||||
#DEFINE PPPLBL ", PARPORTPROP ()"
|
||||
#ENDIF
|
||||
#ELSE
|
||||
#DEFINE PPPLBL ""
|
||||
#ENDIF
|
||||
|
||||
#IFDEF (HISTENABLE)
|
||||
#DEFINE HISTLBL ", HIST"
|
||||
#ELSE
|
||||
#DEFINE HISTLBL ""
|
||||
#ENDIF
|
||||
|
||||
.ECHO "Configuration: "
|
||||
.ECHO PLATFORM_NAME
|
||||
.ECHO DSKYLBL
|
||||
.ECHO VDULBL
|
||||
.ECHO FDLBL
|
||||
.ECHO IDELBL
|
||||
.ECHO PPIDELBL
|
||||
.ECHO SDLBL
|
||||
.ECHO PRPLBL
|
||||
.ECHO PPPLBL
|
||||
.ECHO HISTLBL
|
||||
.ECHO "\n"
|
||||
;
|
||||
; HELPER MACROS
|
||||
;
|
||||
#DEFINE PRTC(C) CALL PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X')
|
||||
|
||||
@@ -96,9 +96,6 @@ TTY_DOCHAR:
|
||||
JR Z,TTY_LF
|
||||
CP 32 ; COMPARE TO SPACE (FIRST PRINTABLE CHARACTER)
|
||||
RET C ; SWALLOW OTHER CONTROL CHARACTERS
|
||||
|
||||
;;; LD HL,(TTY_POS) ; physical driver needs pos data to write
|
||||
|
||||
LD B,BF_VDAWRC
|
||||
CALL EMU_VDADISP ; SPIT OUT THE RAW CHARACTER
|
||||
LD A,(TTY_COL) ; GET CUR COL
|
||||
@@ -123,39 +120,31 @@ TTY_FF:
|
||||
JR TTY_XY ; HOME CURSOR AND RETURN
|
||||
;
|
||||
TTY_BS:
|
||||
LD DE,(TTY_POS) ; GET CURRENT ROW/COL IN DE
|
||||
LD A,E ; GET CURRENT COLUMN
|
||||
CP 1 ; COMPARE TO COLUMN 1
|
||||
RET C ; LESS THAN 1, NOTHING TO DO
|
||||
DEC E ; POINT TO PREVIOUS COLUMN
|
||||
LD (TTY_POS),DE ; SAVE NEW COLUMN VALUE
|
||||
CALL TTY_XY ; MOVE CURSOR TO NEW TARGET COLUMN
|
||||
LD E,' ' ; LOAD A SPACE CHARACTER
|
||||
LD B,BF_VDAWRC ; SET FUNCTION TO WRITE CHARACTER
|
||||
CALL EMU_VDADISP ; OVERWRITE WITH A SPACE CHARACTER
|
||||
JR TTY_XY ; NEED TO MOVE CURSOR BACK TO NEW TARGET COLUMN
|
||||
LD A,(TTY_COL) ; GET CURRENT COLUMN
|
||||
DEC A ; BACK IT UP BY ONE
|
||||
RET C ; IF CARRY, MARGIN EXCEEDED, ABORT
|
||||
LD (TTY_COL),A ; SAVE NEW COLUMN
|
||||
JP TTY_XY ; UDPATE CUSROR AND RETURN
|
||||
;
|
||||
TTY_CR:
|
||||
XOR A ; ZERO ACCUM
|
||||
LD (TTY_COL),A ; COL := 0
|
||||
JR TTY_XY ; REPOSITION CURSOR AND RETURN
|
||||
;
|
||||
TTY_LF:
|
||||
TTY_LF: ; LINEFEED (FORWARD INDEX)
|
||||
LD A,(TTY_ROW) ; GET CURRENT ROW
|
||||
INC A ; BUMP TO NEXT
|
||||
LD (TTY_ROW),A ; SAVE IT
|
||||
LD DE,(TTY_DIM) ; GET SCREEN DIMENSIONS
|
||||
CP D ; COMPARE TO SCREEN ROWS
|
||||
JR C,TTY_XY ; NOT PAST END, ALL DONE
|
||||
DEC D ; D NOW HAS MAX ROW NUM (ROWS - 1)
|
||||
SUB D ; A WILL NOW HAVE NUM LINES TO SCROLL
|
||||
LD E,A ; LINES TO SCROLL -> E
|
||||
LD B,BF_VDASCR ; SET FUNCTION TO SCROLL
|
||||
CALL EMU_VDADISP ; DO THE SCROLLING
|
||||
LD A,(TTY_ROWS) ; GET SCREEN ROW COUNT
|
||||
DEC A ; A NOW HAS LAST ROW
|
||||
DEC D ; D := MAX ROW NUM
|
||||
CP D ; >= LAST ROW?
|
||||
JR NC,TTY_LF1 ; IF SO, NEED TO SCROLL
|
||||
INC A ; BUMP TO NEXT ROW
|
||||
LD (TTY_ROW),A ; SAVE IT
|
||||
JR TTY_XY ; RESPOSITION CURSOR AND RETURN
|
||||
JP TTY_XY ; UPDATE CURSOR AND RETURN
|
||||
;
|
||||
TTY_LF1: ; SCROLL
|
||||
LD E,1 ; SCROLL FORWARD 1 LINE
|
||||
LD B,BF_VDASCR ; SET FUNCTION TO SCROLL
|
||||
JP EMU_VDADISP ; DO THE SCROLLING AND RETURN
|
||||
;
|
||||
TTY_XY:
|
||||
LD DE,(TTY_POS) ; GET THE DESIRED CURSOR POSITION
|
||||
|
||||
@@ -459,6 +459,53 @@ MULT8_LOOP:
|
||||
MULT8_NOADD:
|
||||
DJNZ MULT8_LOOP
|
||||
RET
|
||||
|
||||
|
||||
;
|
||||
; SET A BIT IN BYTE ARRAY AT HL, INDEX IN A
|
||||
;
|
||||
BITSET:
|
||||
CALL BITLOC ; LOCATE THE BIT
|
||||
OR (HL) ; SET THE SPECIFIED BIT
|
||||
LD (HL),A ; SAVE IT
|
||||
RET ; RETURN
|
||||
;
|
||||
; CLEAR A BIT IN BYTE ARRAY AT HL, INDEX IN A
|
||||
;
|
||||
BITCLR:
|
||||
CALL BITLOC ; LOCATE THE BIT
|
||||
CPL ; INVERT ALL BITS
|
||||
AND (HL) ; CLEAR SPECIFIED BIT
|
||||
LD (HL),A ; SAVE IT
|
||||
RET ; RETURN
|
||||
;
|
||||
; GET VALUE OF A BIT IN BYTE ARRAY AT HL, INDEX IN A
|
||||
;
|
||||
BITTST:
|
||||
CALL BITLOC ; LOCATE THE BIT
|
||||
AND (HL) ; SET Z FLAG BASED ON BIT
|
||||
RET ; RETURN
|
||||
;
|
||||
; LOCATE A BIT IN BYTE ARRAY AT HL, INDEX IN A
|
||||
; RETURN WITH HL POINTING TO BYTE AND A WITH MASK FOR SPECIFIC BIT
|
||||
;
|
||||
BITLOC:
|
||||
PUSH AF ; SAVE BIT INDEX
|
||||
SRL A ; DIVIDE BY 8 TO GET BYTE INDEX
|
||||
SRL A ; "
|
||||
SRL A ; "
|
||||
LD C,A ; MOVE TO BC
|
||||
LD B,0 ; "
|
||||
ADD HL,BC ; HL NOW POINTS TO BYTE CONTAINING BIT
|
||||
POP AF ; RECOVER A (INDEX)
|
||||
AND $07 ; ISOLATE REMAINDER, Z SET IF ZERO
|
||||
LD B,A ; SETUP SHIFT COUNTER
|
||||
LD A,1 ; SETUP A WITH MASK
|
||||
RET Z ; DONE IF ZERO
|
||||
BITLOC1:
|
||||
SLA A ; SHIFT
|
||||
DJNZ BITLOC1 ; LOOP AS NEEDED
|
||||
RET ; DONE
|
||||
;
|
||||
; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION
|
||||
;
|
||||
|
||||
121
Source/vdu.asm
121
Source/vdu.asm
@@ -100,13 +100,15 @@ VDU_DISPVDA:
|
||||
DEC A
|
||||
JR Z,VDU_VDAFIL ; $48
|
||||
DEC A
|
||||
JR Z,VDU_VDASCR ; $49
|
||||
JR Z,VDU_VDACPY ; $49
|
||||
DEC A
|
||||
JP Z,PPK_STAT ; $4A
|
||||
JR Z,VDU_VDASCR ; $4A
|
||||
DEC A
|
||||
JP Z,PPK_FLUSH ; $4B
|
||||
JP Z,PPK_STAT ; $4B
|
||||
DEC A
|
||||
JP Z,PPK_READ ; $4C
|
||||
JP Z,PPK_FLUSH ; $4C
|
||||
DEC A
|
||||
JP Z,PPK_READ ; $4D
|
||||
CALL PANIC
|
||||
|
||||
VDU_VDAINI:
|
||||
@@ -150,6 +152,16 @@ VDU_VDAFIL:
|
||||
CALL VDU_FILL ; DO THE FILL
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
VDU_VDACPY:
|
||||
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS CVDU_POS
|
||||
PUSH HL ; SAVE LENGTH
|
||||
CALL VDU_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
|
||||
POP BC ; RECOVER LENGTH IN BC
|
||||
LD DE,(VDU_POS) ; PUT DEST IN DE
|
||||
JP VDU_BLKCPY ; DO A BLOCK COPY
|
||||
|
||||
RET
|
||||
|
||||
VDU_VDASCR:
|
||||
LD A,E ; LOAD E INTO A
|
||||
@@ -240,6 +252,20 @@ VDU_CRTINIT1:
|
||||
RET
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL
|
||||
; D=ROW, E=COL
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VDU_XY2IDX:
|
||||
LD A,E ; SAVE COLUMN NUMBER IN A
|
||||
LD H,D ; SET H TO ROW NUMBER
|
||||
LD E,80 ; 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
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
@@ -316,6 +342,64 @@ VDU_FILL1:
|
||||
JR VDU_FILL1 ; LOOP
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; COPY A BLOCK (UP TO 255 BYTES) FROM HL TO FRAME BUFFER POSITION
|
||||
; BC: NUMBER OF BYTES TO COPY
|
||||
; HL: SOURCE POSITION
|
||||
; DE: DESTINATION POSITION
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VDU_BLKCPY:
|
||||
; SETUP TO COPY FROM VDU SOURCE TO WORK BUFFER
|
||||
PUSH DE ; SAVE VDU DESTINATION ADR
|
||||
PUSH HL ; SAVE VDU SOURCE ADDRESS
|
||||
LD HL,(VDU_OFFSET) ; GET THE CURRENT OFFSET
|
||||
POP DE ; RECOVER SOURCE ADDRESS
|
||||
ADD HL,DE ; HL HAS TRUE SOURCE ADR OF VIDEO BUF W/ OFFSET
|
||||
LD DE,VDU_BUF ; POINT DE TO WORK BUFFER
|
||||
PUSH BC ; SAVE COPY LENGTH FOR LATER
|
||||
LD B,C ; NOW USE B FOR LENGTH (MAX COPY IS 255)
|
||||
LD C,18 ; SET SOURCE ADDRESS IN VDU (HL)
|
||||
CALL VDU_WRREGX ; DO IT
|
||||
LD A,31 ; PREP VDU FOR DATA R/W
|
||||
OUT (VDU_REG),A ; DO IT
|
||||
LD HL,VDU_BUF ; HL POINTS TO WORK BUFFER
|
||||
; LD C,VDU_RAMWR ; LOAD C WITH VDU WRITE REGISTER
|
||||
|
||||
VDU_BLKCPY1: ; VIDEO RAM -> BUFFER COPY LOOP
|
||||
CALL VDU_WAITRDY ; WAIT FOR VDU
|
||||
;;;;;;;;;;;;;;;;;
|
||||
; INI IS NOT WORKING FOR ME, GARBAGE DATA READS, NO IDEA WHY
|
||||
; INI ; READ BYTE, DEC B, INC HL
|
||||
; IN A,(VDU_DATA) ; BOGUS READ TO INCREMENT VDU RAM ADDRESS!!!
|
||||
; JR NZ,VDU_BLKCPY1 ; LOOP TILL DONE
|
||||
;;;;;;;;;;;;;;;;;
|
||||
IN A,(VDU_RAMRD) ; READ DATA BYTE
|
||||
LD (HL),A ; SAVE IN BUFFER
|
||||
INC HL ; BUMP SOURCE ADDRESS
|
||||
IN A,(VDU_DATA) ; BOGUS READ TO INCREMENT VDU RAM ADDRESS!!!
|
||||
DJNZ VDU_BLKCPY1 ; LOOP TILL DONE
|
||||
|
||||
; SETUP TO COPY FROM WORK BUFFER TO VDU DEST
|
||||
POP BC ; RECOVER THE COPY LENGTH
|
||||
LD HL,(VDU_OFFSET) ; GET THE CURRENT VDU OFFSET
|
||||
POP DE ; RECOVER THE DEST ADDRESS
|
||||
ADD HL,DE ; HL HAS TRUE DEST ADR OF VIDEO BUF W/ OFFSET
|
||||
LD B,C ; NOW USE B FOR LENGTH (MAX COPY IS 255)
|
||||
LD C,18 ; SET DEST ADDRESS IN VDU (HL)
|
||||
CALL VDU_WRREGX ; DO IT
|
||||
LD A,31 ; PREP VDU FOR DATA R/W
|
||||
OUT (VDU_REG),A ; DO IT
|
||||
LD HL,VDU_BUF ; HL POINTS TO WORK BUFFER
|
||||
LD C,VDU_RAMWR ; LOAD C WITH VDU WRITE REGISTER
|
||||
|
||||
VDU_BLKCPY2: ; BUFFER -> VIDEO RAM COPY LOOP
|
||||
CALL VDU_WAITRDY ; WAIT FOR VDU
|
||||
OUTI ; WRITE BYTE, DEC B, INC HL
|
||||
JR NZ,VDU_BLKCPY2 ; LOOP TILL DONE
|
||||
;
|
||||
RET ; RETURN
|
||||
;
|
||||
;----------------------------------------------------------------------
|
||||
; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED)
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
@@ -339,7 +423,7 @@ VDU_SCROLL:
|
||||
POP HL
|
||||
LD (VDU_POS),HL
|
||||
|
||||
; ADJUST CURSOR POSITION
|
||||
; ADJUST CURSOR POSITION AND RETURN
|
||||
LD HL,(VDU_OFFSET)
|
||||
LD DE,(VDU_POS)
|
||||
ADD HL,DE
|
||||
@@ -351,7 +435,31 @@ VDU_SCROLL:
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
VDU_RSCROLL:
|
||||
RET
|
||||
; SCROLL BACKWARD BY SUBTRACTING ONE ROW FROM DISPLAY START ADDRESS
|
||||
LD HL,(VDU_OFFSET)
|
||||
LD DE,-80
|
||||
ADD HL,DE
|
||||
LD (VDU_OFFSET),HL
|
||||
LD C,12
|
||||
CALL VDU_WRREGX
|
||||
|
||||
; FILL EXPOSED LINE
|
||||
LD HL,(VDU_POS)
|
||||
PUSH HL
|
||||
LD HL,0
|
||||
LD (VDU_POS),HL
|
||||
LD DE,80
|
||||
LD A,' '
|
||||
CALL VDU_FILL
|
||||
POP HL
|
||||
LD (VDU_POS),HL
|
||||
|
||||
; ADJUST CURSOR POSITION AND RETURN
|
||||
LD HL,(VDU_OFFSET)
|
||||
LD DE,(VDU_POS)
|
||||
ADD HL,DE
|
||||
LD C,14
|
||||
JP VDU_WRREGX
|
||||
;
|
||||
;==================================================================================================
|
||||
; VDU DRIVER - DATA
|
||||
@@ -359,6 +467,7 @@ VDU_RSCROLL:
|
||||
;
|
||||
VDU_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION
|
||||
VDU_BUF .FILL 256,0 ; COPY BUFFER
|
||||
;
|
||||
;==================================================================================================
|
||||
; VDU DRIVER - SY6845 REGISTER INITIALIZATION
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#DEFINE RMJ 2
|
||||
#DEFINE RMN 3
|
||||
#DEFINE RMN 5
|
||||
#DEFINE RUP 0
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "2.3(int)"
|
||||
#DEFINE RTP 1
|
||||
#DEFINE BIOSVER "2.5 - Prerelease"
|
||||
#DEFINE REVISION 248
|
||||
|
||||
Reference in New Issue
Block a user