Browse Source

Additional ANSI driver work.

import/raw
wayne 13 years ago
parent
commit
b155251c95
  1. BIN
      branches/wbw/Doc/Source/RomWBW Architecture.docx
  2. 937
      branches/wbw/Source/ansi.asm
  3. 1
      branches/wbw/Source/config_n8_2312.asm
  4. 1
      branches/wbw/Source/config_n8_2511.asm
  5. 3
      branches/wbw/Source/config_n8vem_cvdu.asm
  6. 1
      branches/wbw/Source/config_n8vem_dide.asm
  7. 1
      branches/wbw/Source/config_n8vem_diskio.asm
  8. 1
      branches/wbw/Source/config_n8vem_diskio3.asm
  9. 1
      branches/wbw/Source/config_n8vem_ppide.asm
  10. 1
      branches/wbw/Source/config_n8vem_ppisd.asm
  11. 1
      branches/wbw/Source/config_n8vem_propio.asm
  12. 1
      branches/wbw/Source/config_n8vem_simh.asm
  13. 1
      branches/wbw/Source/config_n8vem_std.asm
  14. 7
      branches/wbw/Source/config_n8vem_vdu.asm
  15. 1
      branches/wbw/Source/config_s100_std.asm
  16. 1
      branches/wbw/Source/config_zeta_ppp.asm
  17. 1
      branches/wbw/Source/config_zeta_std.asm
  18. 100
      branches/wbw/Source/cvdu.asm
  19. 9
      branches/wbw/Source/n8v.asm
  20. 9
      branches/wbw/Source/std.asm
  21. 43
      branches/wbw/Source/tty.asm
  22. 47
      branches/wbw/Source/util.asm
  23. 121
      branches/wbw/Source/vdu.asm

BIN
branches/wbw/Doc/Source/RomWBW Architecture.docx

Binary file not shown.

937
branches/wbw/Source/ansi.asm

File diff suppressed because it is too large

1
branches/wbw/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
branches/wbw/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

3
branches/wbw/Source/config_n8vem_cvdu.asm

@ -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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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
branches/wbw/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

100
branches/wbw/Source/cvdu.asm

@ -38,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
@ -103,21 +105,22 @@ CVDU_DISPVDA:
DEC A
JR Z,CVDU_VDAFIL ; $48
DEC A
JR Z,CVDU_VDASCR ; $49
JR Z,CVDU_VDACPY ; $49
DEC A
JR Z,CVDU_VDASCR ; $4A
DEC A
JP Z,KBD_STAT ; $4A
JP Z,KBD_STAT ; $4B
DEC A
JP Z,KBD_FLUSH ; $4B
JP Z,KBD_FLUSH ; $4C
DEC A
JP Z,KBD_READ ; $4C
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
@ -181,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
@ -295,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,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:
@ -452,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
@ -470,7 +491,7 @@ CVDU_SCROLL2:
;
CVDU_RSCROLL:
; SCROLL THE CHARACTER BUFFER
LD A,'=' ; CHAR VALUE TO FILL NEW EXPOSED LINE
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
@ -512,13 +533,17 @@ CVDU_RSCROLL2:
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
@ -530,6 +555,51 @@ CVDU_RSCROLL2:
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
;==================================================================================================

9
branches/wbw/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 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

9
branches/wbw/Source/std.asm

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

43
branches/wbw/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
branches/wbw/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
branches/wbw/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

Loading…
Cancel
Save