Browse Source

Reintegrate wbw -> trunk

patch
wayne 13 years ago
parent
commit
9eb8a751dc
  1. BIN
      Doc/RomWBW Architecture.pdf
  2. BIN
      Doc/Source/RomWBW Architecture.docx
  3. 1504
      Source/ansi.asm
  4. 1
      Source/config_n8_2312.asm
  5. 1
      Source/config_n8_2511.asm
  6. 5
      Source/config_n8vem_cvdu.asm
  7. 1
      Source/config_n8vem_dide.asm
  8. 1
      Source/config_n8vem_diskio.asm
  9. 1
      Source/config_n8vem_diskio3.asm
  10. 1
      Source/config_n8vem_ppide.asm
  11. 1
      Source/config_n8vem_ppisd.asm
  12. 1
      Source/config_n8vem_propio.asm
  13. 1
      Source/config_n8vem_simh.asm
  14. 1
      Source/config_n8vem_std.asm
  15. 7
      Source/config_n8vem_vdu.asm
  16. 1
      Source/config_s100_std.asm
  17. 1
      Source/config_zeta_ppp.asm
  18. 1
      Source/config_zeta_std.asm
  19. 137
      Source/cvdu.asm
  20. 108
      Source/kbd.asm
  21. 9
      Source/n8v.asm
  22. 367
      Source/ppide.asm
  23. 7
      Source/ppk.asm
  24. 178
      Source/std.asm
  25. 43
      Source/tty.asm
  26. 47
      Source/util.asm
  27. 121
      Source/vdu.asm
  28. 6
      Source/ver.inc

BIN
Doc/RomWBW Architecture.pdf

Binary file not shown.

BIN
Doc/Source/RomWBW Architecture.docx

Binary file not shown.

1504
Source/ansi.asm

File diff suppressed because it is too large

1
Source/config_n8_2312.asm

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

1
Source/config_n8_2511.asm

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

5
Source/config_n8vem_cvdu.asm

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

1
Source/config_n8vem_dide.asm

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

1
Source/config_n8vem_diskio.asm

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

1
Source/config_n8vem_diskio3.asm

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

1
Source/config_n8vem_ppide.asm

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

1
Source/config_n8vem_ppisd.asm

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

1
Source/config_n8vem_propio.asm

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

1
Source/config_n8vem_simh.asm

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

1
Source/config_n8vem_std.asm

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

7
Source/config_n8vem_vdu.asm

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

1
Source/config_s100_std.asm

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

1
Source/config_zeta_ppp.asm

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

1
Source/config_zeta_std.asm

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

137
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:
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
;
;----------------------------------------------------------------------
; 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,80 ; SET E TO ROW LENGTH
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
LD (CVDU_POS),HL ; SAVE THE RESULT (DISPLAY POSITION)
LD C,14 ; CURSOR POSITION REGISTER PAIR
JP CVDU_WRX ; DO IT AND RETURN
RET ; RETURN
;
;----------------------------------------------------------------------
; WRITE VALULE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR
; 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

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

9
Source/n8v.asm

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

367
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
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
;
;
;
#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
; 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 BC,(HSTSEC) ; HSTSEC -> IDESECTN
LD A,C
LD (PPIDEP_SEC),A
LD C,A
LD A,PPIDE_SECTOR
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 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

7
Source/ppk.asm

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

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

43
Source/tty.asm

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

47
Source/util.asm

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

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

6
Source/ver.inc

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

Loading…
Cancel
Save