Browse Source

General code completion of CVDU driver.

import/raw
wayne 13 years ago
parent
commit
a6edfbfdb4
  1. BIN
      branches/wbw/Doc/RomWBW Architecture.pdf
  2. BIN
      branches/wbw/Doc/Source/Character Emulation Video Services.vsd
  3. BIN
      branches/wbw/Doc/Source/RomWBW Architecture.docx
  4. 2
      branches/wbw/Source/ansi.asm
  5. 780
      branches/wbw/Source/cvdu.asm
  6. 7
      branches/wbw/Source/kbd.asm
  7. 14
      branches/wbw/Source/util.asm

BIN
branches/wbw/Doc/RomWBW Architecture.pdf

Binary file not shown.

BIN
branches/wbw/Doc/Source/Character Emulation Video Services.vsd

Binary file not shown.

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

Binary file not shown.

2
branches/wbw/Source/ansi.asm

@ -134,7 +134,7 @@ ANSI_LF:
LD E,A ; LINES TO SCROLL -> E
LD B,BF_VDASCR
CALL EMU_VDADISP ; DO THE SCROLLING
LD A,23 ; ROW 23
LD A,23 ; ROW 24
LD (ANSI_ROW),A ; IS NOW CORRECT
JR ANSI_XY ; RESPOSITION CURSOR AND RETURN
;

780
branches/wbw/Source/cvdu.asm

@ -20,17 +20,18 @@ CVDU_DATA .EQU $EC ; READ/WRITE M8563 DATA
;__________________________________________________________________________________________________
;
CVDU_INIT:
CALL CVDU_CRTINIT
CALL CVDU_LOADFONT
CVDU_RESET:
LD A,14
LD (CVDU_COLOR),A
LD (CVDU_ATTR),A
XOR A
LD (CVDU_X),A
LD (CVDU_Y),A
LD DE,0
LD (CVDU_DISPLAYPOS),DE
LD (CVDU_DISPLAY_START),DE
CALL CVDU_CRTINIT
CALL CVDU_LOADFONT
LD A,'#'
LD DE,$800
CALL CVDU_FILL
@ -44,8 +45,8 @@ CVDU_INIT:
;__________________________________________________________________________________________________
;
CVDU_DISPCIO:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,CVDU_CIOIN
DEC A
JR Z,CVDU_CIOOUT
@ -77,111 +78,137 @@ CVDU_DISPVDA:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,CVDU_VDAINI
JR Z,CVDU_VDAINI ; $40
DEC A
JR Z,CVDU_VDAQRY
JR Z,CVDU_VDAQRY ; $41
DEC A
JR Z,CVDU_VDARES
JR Z,CVDU_VDARES ; $42
DEC A
JR Z,CVDU_VDASCS
JR Z,CVDU_VDASCS ; $43
DEC A
JR Z,CVDU_VDASCP
JR Z,CVDU_VDASCP ; $44
DEC A
JR Z,CVDU_VDASAT
JR Z,CVDU_VDASAT ; $45
DEC A
JR Z,CVDU_VDASCO
JR Z,CVDU_VDASCO ; $46
DEC A
JR Z,CVDU_VDAWRC
JR Z,CVDU_VDAWRC ; $47
DEC A
JR Z,CVDU_VDAFIL
JR Z,CVDU_VDAFIL ; $48
DEC A
JR Z,CVDU_VDASCR
JR Z,CVDU_VDASCR ; $49
DEC A
JP Z,KBD_STAT
JP Z,KBD_STAT ; $4A
DEC A
JP Z,KBD_FLUSH
JP Z,KBD_FLUSH ; $4B
DEC A
JP Z,KBD_READ
JP Z,KBD_READ ; $4C
CALL PANIC
CVDU_VDAINI:
CALL CVDU_INIT
XOR A
CALL CVDU_INIT ; INITIALIZE
XOR A ; SIGNAL SUCCESS
RET
CVDU_VDAQRY:
CALL PANIC
LD C,$00 ; MODE ZERO IS ALL WE KNOW
LD DE,$1950 ; 25 ROWS ($19), 80 COLS ($50)
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
XOR A ; SIGNAL SUCCESS
RET
CVDU_VDARES:
JP CVDU_INIT
JP CVDU_RESET
CVDU_VDASCS:
CALL PANIC
CALL PANIC ; NOT IMPLEMENTED (YET)
CVDU_VDASCP:
LD A,E
LD (CVDU_X),A
LD A,D
LD (CVDU_Y),A
CALL CVDU_XY
XOR A
LD A,E ; GET E
LD (CVDU_X),A ; SAVE AS COLUMN (X)
LD A,D ; GET D
LD (CVDU_Y),A ; SAVE AS ROW (Y)
CALL CVDU_XY ; MOVE THE CURSOR
XOR A ; SIGNAL SUCCESS
RET
CVDU_VDASAT:
; FIX: NOT IMPLEMENTED!!!
CALL PANIC
; INCOMING IS: -----RUB (R=REVERSE, U=UNDERLINE, B=BLINK)
; TRANSFORM TO: -RUB----
LD A,E ; GET THE INCOMING ATTRIBUTE
RLCA ; TRANSLATE TO OUR DESIRED BIT
RLCA ; "
RLCA ; "
RLCA ; "
AND %01110000 ; REMOVE ANYTHING EXTRANEOUS
LD E,A ; SAVE IT IN E
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
XOR A ; SIGNAL SUCCESS
RET
CVDU_VDASCO:
; NOT SUPPORTED!!!
CALL PANIC
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
; TRANSFORM TO: ----RGBI (DISCARD BACKGROUND COLOR IN HIGH NIBBLE)
XOR A ; CLEAR A
LD B,4 ; LOOP 4 TIMES (4 BITS)
CVDU_VDASCO1:
RRC E ; ROTATE LOW ORDER BIT OUT OF E INTO CF
RLA ; ROTATE CF INTO LOW ORDER BIT OF A
DJNZ CVDU_VDASCO1 ; DO FOUR BITS OF THIS
LD E,A ; SAVE RESULT IN E
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
XOR A ; SIGNAL SUCCESS
RET
CVDU_VDAWRC:
LD A,E
CALL CVDU_PUTCHAR
; RETURN WITH SUCCESS
XOR A
LD A,E ; CHARACTER TO WRITE GOES IN A
CALL CVDU_PUTCHAR ; PUT IT ON THE SCREEN
XOR A ; SIGNAL SUCCESS
RET
CVDU_VDAFIL:
LD A,E
EX DE,HL
CALL CVDU_FILL
XOR A ; RESULT = 0
LD A,E ; FILL CHARACTER GOES IN A
EX DE,HL ; FILL LENGTH GOES IN DE
CALL CVDU_FILL ; DO THE FILL
XOR A ; SIGNAL SUCCESS
RET
CVDU_VDASCR:
; FIX: IMPLEMENT REVERSE SCROLLING!!!
LD A,E
OR A
RET Z
PUSH DE
CALL CVDU_SCROLL
POP DE
DEC E
JR CVDU_VDASCR
;
CVDU_WAITRDY:
; IN A,(CVDU_STREG) ; READ STATUS
; OR A ; SET FLAGS
; RET M ; IF BIT 7 SET, THEN READY!
; JR CVDU_WAITRDY ; KEEP CHECKING
;
LD A,E ; LOAD E INTO A
OR A ; SET FLAGS
RET Z ; IF ZERO, WE ARE DONE
PUSH DE ; SAVE E
JP M,CVDU_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL
CALL CVDU_SCROLL ; SCROLL FORWARD ONE LINE
POP DE ; RECOVER E
DEC E ; DECREMENT IT
JR CVDU_VDASCR ; LOOP
CVDU_VDASCR1:
CALL CVDU_RSCROLL ; SCROLL REVERSE ONE LINE
POP DE ; RECOVER E
INC E ; INCREMENT IT
JR CVDU_VDASCR ; LOOP
;
;__CVDU_CRTINIT_____________________________________________________________________________________
;
; INIT 8563 VDU CHIP
;__________________________________________________________________________________________________
;
CVDU_CRTINIT:
LD B,$00 ; B = 0
LD C,0 ; START WITH REGISTER 0
LD B,37 ; INIT 37 REGISTERS
LD HL,CVDU_INIT8563 ; HL = POINTER TO THE DEFAULT VALUES
CVDU_CRTINIT1:
LD A,(HL) ; GET VALUE
CALL CVDU_WREG ; WRITE IT
INC HL
INC B
LD A,B
CP 37
JR NZ,CVDU_CRTINIT1 ; LOOP UNTIL DONE
CALL CVDU_WR ; WRITE IT
INC HL ; POINT TO NEXT VALUE
INC C ; POINT TO NEXT REGISTER
DJNZ CVDU_CRTINIT1 ; LOOP
RET
;
;__CVDU_LOADFONT____________________________________________________________________________________
@ -189,32 +216,23 @@ CVDU_CRTINIT1:
; LOAD SCREEN FONT
;__________________________________________________________________________________________________
CVDU_LOADFONT:
LD HL,$2000 ; SET FONT LOCATION
LD B,18 ; SET UPDATE ADDRESS IN VDU
LD A,H
CALL CVDU_WREG ; WRITE IT
LD B,19 ; SET UPDATE ADDRESS IN VDU
LD A,L
CALL CVDU_WREG ; WRITE IT
LD BC,$0020 ; FONT SIZE
LD HL,CVDU_FONTDATA ; FONT DATA
LD HL,$2000 ; START OF FONT BUFFER
LD C,18 ; SET BUFFER POINTER
CALL CVDU_WRX ; DO IT
LD HL,CVDU_FONTDATA ; POINTER TO FONT DATA
LD DE,$2000 ; LENGTH OF FONT DATA
LD C,31 ; WRITE DATA
CVDU_LOADFONT1:
IN A,(CVDU_STAT) ; READ ADDRESS/STATUS REGISTER
BIT 7,A ; IF BIT 7 = 1 THAN AN UPDATE STROBE HAS BEEN OCCURED
JR Z,CVDU_LOADFONT1 ; WAIT FOR READY
LD A,31
OUT (CVDU_REG),A ; SELECT REGISTER
CVDU_LOADFONT2:
IN A,(CVDU_STAT) ; READ ADDRESS/STATUS REGISTER
BIT 7,A ; IF BIT 7 = 1 THAN AN UPDATE STROBE HAS BEEN OCCURED
JR Z,CVDU_LOADFONT2 ; WAIT FOR READY
LD A,(HL)
OUT (CVDU_DATA),A ; PUT DATA
INC HL
DJNZ CVDU_LOADFONT1
DEC C
JP NZ,CVDU_LOADFONT1
LD A,(HL) ; LOAD NEXT BYTE OF FONT DATA
CALL CVDU_WR ; WRITE IT
INC HL ; INCREMENT FONT DATA POINTER
DEC DE ; DECREMENT LOOP COUNTER
LD A,D ; CHECK DE...
OR E ; FOR COUNTER EXHAUSTED
JR NZ,CVDU_LOADFONT1 ; LOOP TILL DONE
RET
;
;__CVDU_WREG________________________________________________________________________________________
;
; WRITE VALUE IN A TO REGISTER IN B
@ -237,6 +255,33 @@ CVDU_WREG2:
OUT (CVDU_DATA),A ; PUT DATA
RET
;
;__CVDU_WR__________________________________________________________________________________________
;
; WRITE VALUE IN A TO REGISTER IN C
;__________________________________________________________________________________________________
CVDU_WR:
PUSH AF ; SAVE VALUE TO WRITE
LD A,C ; SET A TO CVDU REGISTER TO SELECT
OUT (CVDU_REG),A ; WRITE IT TO SELECT THE REGISTER
CVDU_WR1:
IN A,(CVDU_STAT) ; GET CVDU STATUS
BIT 7,A ; CHECK BIT 7
JR Z,CVDU_WR1 ; LOOP WHILE NOT READY (BIT 7 NOT SET)
POP AF ; RESTORE VALUE TO WRITE
OUT (CVDU_DATA),A ; WRITE IT
RET
;
;__CVDU_WRX_________________________________________________________________________________________
;
; WRITE VALUE IN HL TO REGISTER PAIR C/C+1
;__________________________________________________________________________________________________
CVDU_WRX:
LD A,H ; SETUP MSB TO WRITE
CALL CVDU_WR ; DO IT
INC C ; NEXT CVDU REGISTER
LD A,L ; SETUP LSB TO WRITE
JR CVDU_WR ; DO IT & RETURN
;
;__CVDU_GREG________________________________________________________________________________________
;
; GET VALUE FROM REGISTER IN B PLACE IN A
@ -259,341 +304,237 @@ CVDU_GREG1:
;__CVDU_XY__________________________________________________________________________________________
;
; MOVE CURSOR TO POSITON IN CVDU_X AND CVDU_Y
;__________________________________________________________________________________________________
;
CVDU_XY:
LD A,(CVDU_Y)
LD H,A
LD DE,80
CALL MULT8 ; HL := H * E (D & L ARE CLEARED)
LD A,(CVDU_X)
LD E,A
ADD HL,DE
LD A,(CVDU_Y) ; GET CURRENT ROW (Y)
LD H,A ; PLACE IN Y
LD DE,80 ; DE := 80 (ROW LENGTH)
CALL MULT8 ; HL := H * E (D IS CLEARED)
LD A,(CVDU_X) ; GET CURRENT COLUMN (X)
LD E,A ; PUT IN E, D IS ALREADY 0
ADD HL,DE ; ADD IN COLUMN OFFSET
LD (CVDU_DISPLAYPOS),HL ; SAVE THE RESULT (DISPLAY POSITION)
LD C,14 ; FUNCTION TO SET CURSOR POSITION
JP CVDU_WRX ; DO IT AND RETURN
;
;__________________________________________________________________________________________________
CVDU_PUTCHAR:
;
; PLACE CHARACTER ON SCREEN, ADVANCE CURSOR
; A: CHARACTER TO OUTPUT
;
PUSH AF ; SAVE CHARACTER
; SET MEMORY LOCATION FOR CHARACTER
LD HL,(CVDU_DISPLAYPOS)
LD C,18
CALL CVDU_WRX
; PUT THE CHARACTER THERE
POP AF
LD C,31
CALL CVDU_WR
; BUMP THE CURSOR FORWARD
INC HL
LD (CVDU_DISPLAYPOS),HL
LD DE,(CVDU_DISPLAY_START)
LD C,14
CALL CVDU_WRX
; SET MEMORY LOCATION FOR ATTRIBUTE
LD DE,$800 - 1
ADD HL,DE
LD B,14 ; SET UPDATE CSR POS IN VDU
LD A,H ;
CALL CVDU_WREG ; WRITE IT
INC B ; SET UPDATE CSR POS IN VDU
LD A,L ;
CALL CVDU_WREG ; WRITE IT
RET
LD C,18
CALL CVDU_WRX
; PUT THE ATTRIBUTE THERE
LD A,(CVDU_ATTR)
LD C,31
JP CVDU_WR
;
;__________________________________________________________________________________________________
CVDU_FILL:
;
; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE
; STARTING WITH THE CURRENT FRAME BUFFER POSITION
; A: FILL CHARACTER
; DE: NUMBER OF CHARACTERS TO FILL
;
PUSH DE ; SAVE FILL COUNT
LD HL,(CVDU_DISPLAYPOS) ; SET CHARACTER BUFFER POSITION TO FILL
PUSH HL ; SAVE BUF POS
CALL CVDU_FILL1 ; DO THE CHARACTER FILL
POP HL ; RECOVER BUF POS
LD DE,$800 ; INCREMENT FOR ATTRIBUTE FILL
ADD HL,DE ; HL := BUF POS FOR ATTRIBUTE FILL
POP DE ; RECOVER FILL COUNT
LD A,(CVDU_ATTR) ; SET ATTRIBUTE VALUE FOR ATTRIBUTE FILL
JR CVDU_FILL1 ; DO ATTRIBUTE FILL AND RETURN
CVDU_FILL1:
; SAVE FILL VALUE
LD B,A ; SAVE REQUESTED FILL VALUE
; CHECK FOR VALID FILL LENGTH
LD A,D ; LOAD D
OR E ; OR WITH E
RET Z ; BAIL OUT IF LENGTH OF ZERO SPECIFIED
; POINT TO BUFFER LOCATION TO START FILL
LD C,18 ; USE CVDU REG 18/19 TO SET BUF LOC
CALL CVDU_WRX ; DO IT
; SET MODE TO BLOCK WRITE
XOR A ; WRITE VALUE 0 (BIT 7 CLR FOR BLOCK WRITE)
LD C,24 ; TO CVDU REG 24
CALL CVDU_WR ; DO IT
; SET CHARACTER TO WRITE (WRITES ONE CHARACTER)
LD A,B ; RECOVER FILL VALUE
LD C,31 ; USE CVDU REG 31 TO WRITE VALUE
CALL CVDU_WR ; DO IT
DEC DE ; REFLECT ONE CHARACTER WRITTEN
; LOOP TO DO BULK WRITE
EX DE,HL ; NOW USE HL FOR COUNT
LD C,30 ; BYTE COUNT REGISTER
CVDU_FILL2:
LD A,H ; GET HIGH BYTE
OR A ; SET FLAGS
LD A,L ; PRESUME WE WILL WRITE L COUNT BYTES
JR Z,CVDU_FILL3 ; IF H WAS ZERO, READY TO WRITE L BYTES
LD A,$FF ; H WAS > 0, WRITE 255 BYTES
CVDU_FILL3:
CALL CVDU_WR ; DO IT
LD D,0 ; CLEAR D
LD E,A ; SET E TO BYTES WRITTEN
SBC HL,DE ; SUBTRACT FROM HL
RET Z ; IF ZERO, WE ARE DONE
JR CVDU_FILL2 ; OTHERWISE, WRITE SOME MORE
;
;__CVDU_SCROLL_______________________________________________________________________________________
;
; SCROLL THE SCREEN UP ONE LINE
;__________________________________________________________________________________________________
; SCROLL THE SCREEN FORWARD ONE LINE
;
CVDU_SCROLL:
; SET MODE TO BLOCK COPY
LD A,$80
LD B,24
CALL CVDU_WREG
; SCROLL THE CHARACTER BUFFER
LD A,'=' ; CHAR VALUE TO FILL NEW EXPOSED LINE
LD HL,0 ; SOURCE ADDRESS OF CHARACER BUFFER
CALL CVDU_SCROLL1 ; SCROLL CHARACTER BUFFER
; SCROLL THE ATTRIBUTE BUFFER
LD A,(CVDU_ATTR) ; ATTRIBUTE VALUE TO FILL NEW EXPOSED LINE
LD HL,$800 ; SOURCE ADDRESS OF ATTRIBUTE BUFFER
JR CVDU_SCROLL1 ; SCROLL ATTRIBUTE BUFFER
LD HL,0 ; SOURCE
LD C,23 ; ITERATIONS
CVDU_SCROLL1:
; BLOCK COPY DESTINATION
LD B,18
LD A,H
CALL CVDU_WREG
INC B
LD A,L
CALL CVDU_WREG
PUSH AF ; SAVE FILL VALUE FOR NOW
; SET MODE TO BLOCK COPY
LD A,$80 ; SET BIT 7 FOR BLOCK COPY
LD C,24 ; IN CVDU REG 24
CALL CVDU_WR ; DO IT
LD DE,80
ADD HL,DE
; SET INITIAL BLOCK COPY DESTINATION (USING HL PASSED IN)
LD C,18 ; SET DESTINATION ADDRESS IN REG 18/19
CALL CVDU_WRX ; DO IT
; BLOCK COPY SOURCE
LD B,32
LD A,H
CALL CVDU_WREG
INC B
LD A,L
CALL CVDU_WREG
; COMPUTE SOURCE (INCREMENT ONE ROW)
LD DE,80 ; SOURCE ADDRESS IS ONE ROW PAST DESTINATION
ADD HL,DE ; ADD IT TO BUF ADDRESS
; SET INITIAL BLOCK COPY SOURCE
LD C,32 ; PUT THE SOURCE ADDRESS IN CVDU REG 32
CALL CVDU_WRX ; DO IT
LD B,23 ; ITERATIONS (23 ROWS)
CVDU_SCROLL2:
; BLOCK COPY COUNT
LD A,80
LD B,30
CALL CVDU_WREG
; SET BLOCK COPY COUNT (WILL EXECUTE COPY)
LD A,80 ; COPY 80 BYTES
LD C,30 ; PUT LENGTH TO COPY IN REG 30
CALL CVDU_WR ; DO IT
; LOOP TILL DONE WITH ALL LINES
DEC C
JR NZ,CVDU_SCROLL2
DJNZ CVDU_SCROLL2 ; REPEAT FOR ALL LINES
; SET MODE TO BLOCK WRITE
XOR A
LD B,24
CALL CVDU_WREG
; SET MODE TO BLOCK WRITE TO CLEAR NEW LINE EXPOSED BY SCROLL
XOR A ; CLR BIT 7
LD C,24 ; OF CVDU REG 24
CALL CVDU_WR
; SET CHARACTER TO WRITE
LD A,'='
LD B,31
CALL CVDU_WREG
POP AF ; RESTORE THE FILL VALUE PASSED IN
LD C,31
CALL CVDU_WR
; BLOCK COPY COUNT
; SET BLOCK WRITE COUNT (WILL EXECUTE THE WRITE)
LD A,80 - 1
LD B,30
CALL CVDU_WREG
LD C,30
CALL CVDU_WR
RET
;
;__CVDU_RSCROLL__________________________________________________________________________________
;
; SCROLL THE SCREEN DOWN ONE LINE
;__________________________________________________________________________________________________
;__CVDU_RSCROLL_______________________________________________________________________________________
;
; SCROLL THE SCREEN REVERSE ONE LINE
;
CVDU_RSCROLL:
PUSH AF ; STORE AF
PUSH HL ; STORE HL
PUSH BC ; STORE BC
; SCROLL THE CHARACTER BUFFER
LD A,'=' ; CHAR VALUE TO FILL NEW EXPOSED LINE
LD HL,80*23 ; SOURCE ADDRESS OF CHARACER BUFFER (LINE 24)
CALL CVDU_RSCROLL1 ; SCROLL CHARACTER BUFFER
LD B, 24 ; GET REGISTER 24
CALL CVDU_GREG ;
OR 80H ; TURN ON COPY BIT
LD E,A ; PARK IT
LD HL, (CVDU_DISPLAY_START) ; GET UP START OF DISPLAY
LD BC,0730H ;
ADD HL,BC
LD D,23 ;
CVDU_RSCROLL1:
LD B, 18 ; SET UPDATE(DEST) POS IN VDU
LD A,H ;
CALL CVDU_WREG ; WRITE IT
LD B, 19 ; SET UPDATE(DEST) POS IN VDU
LD A,L ;
CALL CVDU_WREG ; WRITE IT
LD BC,0FFB0H ;
ADD HL,BC ;
LD B, 32 ; SET SOURCE POS IN VDU
LD A,H ;
CALL CVDU_WREG ; WRITE IT
LD B, 33 ; SET SOURCE POS IN VDU
LD A,L ;
CALL CVDU_WREG ; WRITE IT
LD B, 24 ; SET COPY
LD A,E ;
CALL CVDU_WREG ; WRITE IT
LD B, 30 ; SET AMOUNT TO COPY
LD A,050H ;
CALL CVDU_WREG ; WRITE IT
; 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)
JR CVDU_RSCROLL1 ; SCROLL ATTRIBUTE BUFFER
DEC D
LD A,D ;
CP 00H ;
JP NZ,CVDU_RSCROLL1 ; LOOP TILL DONE
CVDU_RSCROLL1:
PUSH AF ; SAVE FILL VALUE FOR NOW
; SET MODE TO BLOCK COPY
LD A,$80 ; SET BIT 7 FOR BLOCK COPY
LD C,24 ; IN CVDU REG 24
CALL CVDU_WR ; DO IT
LD HL, (CVDU_DISPLAY_START) ; GET UP START OF DISPLAY
LD BC,0F50H ;
ADD HL,BC
LD D,23 ;
CVDU_RSCROLL2:
LD B, 18 ; SET UPDATE(DEST) POS IN VDU
LD A,H ;
CALL CVDU_WREG ; WRITE IT
LD B, 19 ; SET UPDATE(DEST) POS IN VDU
LD A,L ;
CALL CVDU_WREG ; WRITE IT
LD BC,0FFB0H ;
ADD HL,BC ;
LD B, 32 ; SET SOURCE POS IN VDU
LD A,H ;
CALL CVDU_WREG ; WRITE IT
LD B, 33 ; SET SOURCE POS IN VDU
LD A,L ;
CALL CVDU_WREG ; WRITE IT
LD B, 24 ; SET COPY
LD A,E ;
CALL CVDU_WREG ; WRITE IT
LD B, 30 ; SET AMOUNT TO COPY
LD A,050H ;
CALL CVDU_WREG ; WRITE IT
LD B,23 ; ITERATIONS (23 ROWS)
CVDU_RSCROLL2:
DEC D
LD A,D ;
CP 00H ;
JP NZ,CVDU_RSCROLL2 ; LOOP TILL DONE
LD A,0 ; SET CURSOR TO BEGINNING OF FIRST LINE
LD (CVDU_Y),A ;
LD A,(CVDU_X) ;
PUSH AF ; STORE X COORD
LD A,0 ;
LD (CVDU_X),A ;
CALL CVDU_XY ; SET CURSOR POSITION TO BEGINNING OF LINE
POP AF ; RESTORE AF
POP BC ; RESTORE BC
CALL CVDU_ERASE_EOL ; ERASE SCROLLED LINE
LD (CVDU_X),A ;
CALL CVDU_XY ; SET CURSOR POSITION
POP HL ; RESTORE HL
POP AF ; RESTORE AF
RET ;
;
;__CVDU_ERASE_EOL__________________________________________________________________________________
;
; PERFORM ERASE FROM CURSOR POS TO END OF LINE
; C=DEFAULT COLOR
;__________________________________________________________________________________________________
CVDU_ERASE_EOL:
PUSH HL
PUSH AF
PUSH BC
; SET BLOCK COPY DESTINATION (USING HL PASSED IN)
LD C,18 ; SET DESTINATION ADDRESS IN REG 18/19
CALL CVDU_WRX ; DO IT
LD A,(CVDU_X) ; GET CURRENT CURSOR X COORD
LD D,A ; STORE IT IN C
LD A,80 ; MOVE CURRENT LINE WIDTH INTO A
SUB D ; GET REMAINING POSITIONS ON CURRENT LINE
LD B,A ; MOVE IT INTO B
CVDU_ERASE_EOL1:
LD A, ' ' ; MOVE SPACE CHARACTER INTO A
CALL CVDU_PUTCHAR ;
DJNZ CVDU_ERASE_EOL1 ; LOOP UNTIL DONE
CALL CVDU_XY ; MOVE CURSOR BACK TO ORIGINAL POSITION
POP BC
POP AF
POP HL
RET
;
;__CVDU_ERASE_EOS__________________________________________________________________________________
;
; PERFORM ERASE FROM CURSOR POS TO END OF SCREEN
; C= DEFAULT COLOR
;__________________________________________________________________________________________________
CVDU_ERASE_EOS:
PUSH HL
PUSH AF
PUSH BC
; COMPUTE SOURCE (DECREMENT ONE ROW)
LD DE,80 ; SOURCE ADDRESS IS ONE ROW PAST DESTINATION
SBC HL,DE ; SUBTRACT IT FROM BUF ADDRESS
LD HL, (CVDU_DISPLAYPOS) ; GET CURRENT DISPLAY ADDRESS
LD B, 18 ; SET UPDATE CSR POS IN VDU
LD A,H ;
CALL CVDU_WREG ; WRITE IT
LD B, 19 ; SET UPDATE CSR POS IN VDU
LD A,L ;
CALL CVDU_WREG ; WRITE IT
LD DE,0820H ; SET SCREEN SIZE INTO HL
CVDU_ERASE_EOS1:
LD A, ' ' ; MOVE SPACE CHARACTER INTO A
LD B,31 ;
CALL CVDU_WREG ; WRITE IT TO SCREEN, VDU WILL AUTO INC TO NEXT ADDRESS
DEC DE ; DEC COUNTER
LD A,D ; IS COUNTER 0 YET?
OR E ;
JP NZ,CVDU_ERASE_EOS1 ; NO, LOOP
LD DE,0820H ; SET SCREEN SIZE INTO HL
CVDU_ERASE_EOS2:
LD A, (CVDU_COLOR) ; MOVE COLOR INTO A
LD B,31 ;
CALL CVDU_WREG ; WRITE IT TO SCREEN, VDU WILL AUTO INC TO NEXT ADDRESS
DEC DE ; DEC COUNTER
LD A,D ; IS COUNTER 0 YET?
OR E ;
JP NZ,CVDU_ERASE_EOS2 ; NO, LOOP
CALL CVDU_XY ; YES, MOVE CURSOR BACK TO ORIGINAL POSITION
POP BC
POP AF
POP HL
RET
;
;__________________________________________________________________________________________________
CVDU_PUTCHAR:
; PLACE CHARACTER ON SCREEN, ADVANCE CURSOR
; A: CHARACTER TO OUTPUT
;
PUSH AF
LD HL,(CVDU_DISPLAY_START)
LD DE,(CVDU_DISPLAYPOS)
ADD HL,DE
INC DE
LD (CVDU_DISPLAYPOS),DE
LD B,18
LD A,H
CALL CVDU_WREG
INC B
LD A,L
CALL CVDU_WREG
POP AF
LD B,31
CALL CVDU_WREG
PUSH HL
INC HL
LD B,14
LD A,H
CALL CVDU_WREG
INC B
LD A,L
CALL CVDU_WREG
POP HL
LD DE,$800
ADD HL,DE
LD B,18
LD A,H
CALL CVDU_WREG
INC B
LD A,L
CALL CVDU_WREG
LD A,(CVDU_COLOR)
LD B,31
CALL CVDU_WREG
RET
;__________________________________________________________________________________________________
CVDU_FILL:
;
; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE
; STARTING WITH THE CURRENT FRAME BUFFER POSITION
; A: FILL CHARACTER
; DE: NUMBER OF CHARACTERS TO FILL
;
PUSH AF
PUSH DE
LD HL,(CVDU_DISPLAY_START)
LD DE,(CVDU_DISPLAYPOS)
ADD HL,DE
LD B,18
LD A,H
CALL CVDU_WREG
INC B
LD A,L
CALL CVDU_WREG
POP DE
POP AF
PUSH DE
LD C,A
CVDU_FILL1:
LD A,C
LD B,31
CALL CVDU_WREG
DEC DE
LD A,D
OR E
JR NZ,CVDU_FILL1
; SET BLOCK COPY SOURCE
LD C,32 ; PUT THE SOURCE ADDRESS IN CVDU REG 32
CALL CVDU_WRX ; DO IT
LD DE,$800
ADD HL,DE
POP DE
LD B,18
LD A,H
CALL CVDU_WREG
INC B
LD A,L
CALL CVDU_WREG
LD A,(CVDU_COLOR)
LD C,A
CVDU_FILL2:
LD A,C
LD B,31
CALL CVDU_WREG
DEC DE
LD A,D
OR E
JR NZ,CVDU_FILL2
; SET BLOCK COPY COUNT (WILL EXECUTE COPY)
LD A,80 ; COPY 80 BYTES
LD C,30 ; PUT LENGTH TO COPY IN REG 30
CALL CVDU_WR ; DO IT
; LOOP TILL DONE WITH ALL LINES
DJNZ CVDU_RSCROLL2 ; REPEAT FOR ALL LINES
; SET MODE TO BLOCK WRITE TO CLEAR NEW LINE EXPOSED BY SCROLL
XOR A ; CLR BIT 7
LD C,24 ; OF CVDU REG 24
CALL CVDU_WR
; SET CHARACTER TO WRITE
POP AF ; RESTORE THE FILL VALUE PASSED IN
LD C,31
CALL CVDU_WR
; SET BLOCK WRITE COUNT (WILL EXECUTE THE WRITE)
LD A,80 - 1
LD C,30
CALL CVDU_WR
RET
;
;==================================================================================================
@ -602,14 +543,63 @@ CVDU_FILL2:
;
CVDU_X .DB 0 ; CURSOR X
CVDU_Y .DB 0 ; CURSOR Y
CVDU_COLOR .DB 0 ; CURRENT COLOR
CVDU_ATTR .DB 0 ; CURRENT COLOR
CVDU_DISPLAYPOS .DW 0 ; CURRENT DISPLAY POSITION
CVDU_DISPLAY_START .DW 0 ; CURRENT DISPLAY POSITION
;
; ATTRIBUTE ENCODING:
; BIT 7: ALTERNATE CHARACTER SET
; BIT 6: REVERSE VIDEO
; BIT 5: UNDERLINE
; BIT 4: BLINK
; BIT 3: RED
; BIT 2: GREEN
; BIT 1: BLUE
; BIT 0: INTENSITY
;
;==================================================================================================
; VDU DRIVER - 8563 REGISTER INITIALIZATION
;==================================================================================================
;
; Reg Hex Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Description
; 0 $00 HT7 HT6 HT5 HT4 HT3 HT2 HT1 HT0 Horizontal Total
; 1 $01 HD7 HD6 HD5 HD4 HD3 HD2 HD1 HD0 Horizontal Displayed
; 2 $02 HP7 HP6 HP5 HP4 HP3 HP2 HP1 HP0 Horizontal Sync Position
; 3 $03 VW3 VW2 VW1 VW0 HW3 HW2 HW1 HW0 Vertical/Horizontal Sync Width
; 4 $04 VT7 VT6 VT5 VT4 VT3 VT2 VT1 VT0 Vertical Total
; 5 $05 -- -- -- VA4 VA3 VA2 VA1 VA0 Vertical Adjust
; 6 $06 VD7 VD6 VD5 VD4 VD3 VD2 VD1 VD0 Vertical Displayed
; 7 $07 VP7 VP6 VP5 VP4 VP3 VP2 VP1 VP0 Vertical Sync Position
; 8 $08 -- -- -- -- -- -- IM1 IM0 Interlace Mode
; 9 $09 -- -- -- -- CTV4 CTV3 CTV2 CTV1 Character Total Vertical
; 10 $0A -- CM1 CM0 CS4 CS3 CS2 CS1 CS0 Cursor Mode, Start Scan
; 11 $0B -- -- -- CE4 CE3 CE2 CE1 CE0 Cursor End Scan Line
; 12 $0C DS15 DS14 DS13 DS12 DS11 DS10 DS9 DS8 Display Start Address High Byte
; 13 $0D DS7 DS6 DS5 DS4 DS3 DS2 DS1 DS0 Display Start Address Low Byte
; 14 $0E CP15 CP14 CP13 CP12 CP11 CP10 CP9 CP8 Cursor Position High Byte
; 15 $0F CP7 CP6 CP5 CP4 CP3 CP2 CP1 CP0 Cursor Position Low Byte
; 16 $10 LPV7 LPV6 LPV5 LPV4 LPV3 LPV2 LPV1 LPV0 Light Pen Vertical Position
; 17 $11 LPH7 LPH6 LPH5 LPH4 LPH3 LPH2 LPH1 LPH0 Light Pen Horizontal Position
; 18 $12 UA15 UA14 UA13 UA12 UA11 UA10 UA9 UA8 Update Address High Byte
; 19 $13 UA7 UA6 UA5 UA4 UA3 UA2 UA1 UA0 Update Address Low Byte
; 20 $14 AA15 AA14 AA13 AA12 AA11 AA10 AA9 AA8 Attribute Start Address High Byte
; 21 $15 AA7 AA6 AA5 AA4 AA3 AA2 AA1 AA0 Attribute Start Address Low Byte
; 22 $16 CTH3 CTH2 CTH1 CTH0 CDH3 CDH2 CDH1 CDH0 Character Total Horizontal, Character Display Horizontal
; 23 $17 -- -- -- CDV4 CDV3 CDV2 CDV1 CDV0 Character Display Vertical
; 24 $18 COPY RVS CBRATE VSS4 VSS3 VSS2 VSS1 VSS0 Vertical Smooth Scrolling
; 25 $19 TEXT ATR SEMI DBL HSS3 HSS2 HSS1 HSS0 Horizontal Smooth Scrolling
; 26 $1A FG3 FG2 FG1 FG0 BG3 BG2 BG1 BG0 Foreground/Background color
; 27 $1B AI7 AI6 AI5 AI4 AI3 AI2 AI1 AI0 Address Increment per Row
; 28 $1C CB15 CB14 CB13 RAM -- -- -- -- Character Base Address
; 29 $1D -- -- -- UL4 UL3 UL2 UL1 UL0 Underline Scan Line
; 30 $1E WC7 WC6 WC5 WC4 WC3 WC2 WC1 WC0 Word Count
; 31 $1F DA7 DA6 DA5 DA4 DA3 DA2 DA1 DA0 Data Register
; 32 $20 BA15 BA14 BA13 BA12 BA11 BA10 BA9 BA8 Block Start Address High Byte
; 33 $21 BA7 BA6 BA5 BA4 BA3 BA2 BA1 BA0 Block Start Address Low Byte
; 34 $22 DEB7 DEB6 DEB5 DEB4 DEB3 DEB2 DEB1 DEB0 Display Enable Begin
; 35 $23 DEE7 DEE6 DEE5 DEE4 DEE3 DEE2 DEE1 DEE0 Display Enable End
; 36 $24 -- -- -- -- DRR3 DRR2 DRR1 DRR0 DRAM Refresh Rate
;
; EGA 720X368 9-BIT CHARACTERS
; - requires 16.257Mhz oscillator frequency
;

7
branches/wbw/Source/kbd.asm

@ -413,6 +413,13 @@ 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

14
branches/wbw/Source/util.asm

@ -392,13 +392,13 @@ MULT8_NOADD:
;
#IF (DSKYENABLE)
;
; ____C0______C1______C2______C3__
;B5 | 20 D 60 E A0 F E0 BO
;B4 | 10 A 50 B 90 C D0 GO
;B3 | 08 7 48 8 88 9 C8 EX
;B2 | 04 4 44 5 84 6 C4 DE
;B1 | 02 1 42 2 82 3 C2 EN
;B0 | 01 FW 41 0 81 BK C1 CL
; _____C0______C1______C2______C3__
;B5 | $20 D $60 E $A0 F $E0 BO
;B4 | $10 A $50 B $90 C $D0 GO
;B3 | $08 7 $48 8 $88 9 $C8 EX
;B2 | $04 4 $44 5 $84 6 $C4 DE
;B1 | $02 1 $42 2 $82 3 $C2 EN
;B0 | $01 FW $41 0 $81 BK $C1 CL
;
KY_0 .EQU 000H
KY_1 .EQU 001H

Loading…
Cancel
Save