|
|
|
@ -6,8 +6,7 @@ |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - IMPLEMENT CONSTANTS FOR SCREEN DIMENSIONS |
|
|
|
; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION |
|
|
|
; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION? |
|
|
|
; - IMPLEMENT ALTERNATE DISPLAY MODES? |
|
|
|
; - IMPLEMENT DYNAMIC READ/WRITE OF CHARACTER BITMAP DATA? |
|
|
|
; |
|
|
|
@ -21,6 +20,12 @@ N8V_DATREG .EQU N8_BASE + $18 ; READ/WRITE DATA |
|
|
|
N8V_ROWS .EQU 24 |
|
|
|
N8V_COLS .EQU 40 |
|
|
|
; |
|
|
|
; BELOW WAS TUNED FOR N8 AT 18MHZ WITH 3 IO WAIT STATES |
|
|
|
; WILL NEED TO BE MODIFIED FOR DIFFERENT ACCESS SPEEDS |
|
|
|
; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! |
|
|
|
; |
|
|
|
#DEFINE N8V_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; N8V DRIVER - INITIALIZATION |
|
|
|
;====================================================================== |
|
|
|
@ -41,6 +46,10 @@ N8V_RESET: |
|
|
|
CALL N8V_FILL ; DO IT |
|
|
|
LD DE,0 ; ROW = 0, COL = 0 |
|
|
|
CALL N8V_XY ; SEND CURSOR TO TOP LEFT |
|
|
|
XOR A |
|
|
|
DEC A |
|
|
|
LD (N8V_CURSAV),A |
|
|
|
CALL N8V_SETCUR ; SET CURSOR |
|
|
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
@ -130,7 +139,9 @@ N8V_VDASCS: |
|
|
|
CALL PANIC ; NOT IMPLEMENTED (YET) |
|
|
|
|
|
|
|
N8V_VDASCP: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
CALL N8V_XY ; SET CURSOR POSITION |
|
|
|
CALL N8V_SETCUR |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
@ -143,42 +154,56 @@ N8V_VDASCO: |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDAWRC: |
|
|
|
CALL N8V_CLRCUR ; CURSOR OFF |
|
|
|
LD A,E ; CHARACTER TO WRITE GOES IN A |
|
|
|
CALL N8V_PUTCHAR ; PUT IT ON THE SCREEN |
|
|
|
CALL N8V_SETCUR |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDAFIL: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
LD A,E ; FILL CHARACTER GOES IN A |
|
|
|
EX DE,HL ; FILL LENGTH GOES IN DE |
|
|
|
CALL N8V_FILL ; DO THE FILL |
|
|
|
CALL N8V_SETCUR |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDACPY: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS N8V_POS |
|
|
|
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT |
|
|
|
PUSH HL ; SAVE LENGTH |
|
|
|
CALL N8V_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL |
|
|
|
POP BC ; RECOVER LENGTH IN BC |
|
|
|
LD DE,(N8V_POS) ; PUT DEST IN DE |
|
|
|
JP N8V_BLKCPY ; DO A BLOCK COPY |
|
|
|
CALL N8V_BLKCPY ; DO A BLOCK COPY |
|
|
|
CALL N8V_SETCUR |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDASCR: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
N8V_VDASCR0: |
|
|
|
LD A,E ; LOAD E INTO A |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET Z ; IF ZERO, WE ARE DONE |
|
|
|
JR Z,N8V_VDASCR2 ; IF ZERO, WE ARE DONE |
|
|
|
PUSH DE ; SAVE E |
|
|
|
JP M,N8V_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL |
|
|
|
CALL N8V_SCROLL ; SCROLL FORWARD ONE LINE |
|
|
|
POP DE ; RECOVER E |
|
|
|
DEC E ; DECREMENT IT |
|
|
|
JR N8V_VDASCR ; LOOP |
|
|
|
JR N8V_VDASCR0 ; LOOP |
|
|
|
N8V_VDASCR1: |
|
|
|
CALL N8V_RSCROLL ; SCROLL REVERSE ONE LINE |
|
|
|
POP DE ; RECOVER E |
|
|
|
INC E ; INCREMENT IT |
|
|
|
JR N8V_VDASCR ; LOOP |
|
|
|
JR N8V_VDASCR0 ; LOOP |
|
|
|
N8V_VDASCR2: |
|
|
|
CALL N8V_SETCUR |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; N8V DRIVER - PRIVATE DRIVER FUNCTIONS |
|
|
|
@ -191,11 +216,11 @@ N8V_VDASCR1: |
|
|
|
; |
|
|
|
N8V_SET: |
|
|
|
OUT (N8V_CMDREG),A ; WRITE IT |
|
|
|
NOP |
|
|
|
N8V_IODELAY |
|
|
|
LD A,C ; GET THE DESIRED REGISTER |
|
|
|
OR $80 ; SET BIT 7 |
|
|
|
OUT (N8V_CMDREG),A ; SELECT THE DESIRED REGISTER |
|
|
|
NOP |
|
|
|
N8V_IODELAY |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
@ -214,10 +239,10 @@ N8V_WR: |
|
|
|
N8V_RD: |
|
|
|
LD A,L |
|
|
|
OUT (N8V_CMDREG),A |
|
|
|
NOP |
|
|
|
N8V_IODELAY |
|
|
|
LD A,H |
|
|
|
OUT (N8V_CMDREG),A |
|
|
|
NOP |
|
|
|
N8V_IODELAY |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
@ -285,6 +310,89 @@ N8V_LOADFONT3: |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; VIRTUAL CURSOR MANAGEMENT |
|
|
|
; N8V_SETCUR CONFIGURES AND DISPLAYS CURSOR AT CURRENT CURSOR LOCATION |
|
|
|
; N8V_CLRCUR REMOVES THE CURSOR |
|
|
|
; |
|
|
|
; VIRTUAL CURSOR IS GENERATED BY DYNAMICALLY CHANGING FONT GLYPH |
|
|
|
; FOR CHAR 255 TO BE THE INVERSE OF THE GLYPH OF THE CHARACTER UNDER |
|
|
|
; THE CURRENT CURSOR POSITION. THE CHARACTER CODE IS THEN SWITCH TO |
|
|
|
; THE VALUE 255 AND THE ORIGINAL VALUE IS SAVED. WHEN THE DISPLAY |
|
|
|
; NEEDS TO BE CHANGED THE PROCESS IS UNDONE. IT IS ESSENTIAL THAT |
|
|
|
; ALL DISPLAY CHANGES BE BRACKETED WITH CALLS TO N8V_CLRCUR PRIOR TO |
|
|
|
; CHANGES AND N8V_SETCUR AFTER CHANGES. |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_SETCUR: |
|
|
|
PUSH HL ; PRESERVE HL |
|
|
|
PUSH DE ; PRESERVE DE |
|
|
|
LD HL,(N8V_POS) ; GET CURSOR POSITION |
|
|
|
CALL N8V_RD ; SETUP TO READ VDU BUF |
|
|
|
IN A,(N8V_DATREG) ; GET REAL CHAR UNDER CURSOR |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
PUSH AF ; SAVE THE CHARACTER |
|
|
|
CALL N8V_WR ; SETUP TO WRITE TO THE SAME PLACE |
|
|
|
LD A,$FF ; REPLACE REAL CHAR WITH 255 |
|
|
|
OUT (N8V_DATREG),A ; DO IT |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
POP AF ; RECOVER THE REAL CHARACTER |
|
|
|
LD B,A ; PUT IT IN B |
|
|
|
LD A,(N8V_CURSAV) ; GET THE CURRENTLY SAVED CHAR |
|
|
|
CP B ; COMPARE TO CURRENT |
|
|
|
JR Z,N8V_SETCUR3 ; IF EQUAL, BYPASS EXTRA WORK |
|
|
|
LD A,B ; GET REAL CHAR BACK TO A |
|
|
|
LD (N8V_CURSAV),A ; SAVE IT |
|
|
|
; GET THE GLYPH DATA FOR REAL CHARACTER |
|
|
|
LD HL,0 ; ZERO HL |
|
|
|
LD L,A ; HL IS NOW RAW CHAR INDEX |
|
|
|
LD B,3 ; LEFT SHIFT BY 3 BITS |
|
|
|
N8V_SETCUR0: ; MULT BY 8 FOR FONT INDEX |
|
|
|
SLA L ; SHIFT LSB INTO CARRY |
|
|
|
RL H ; SHFT MSB FROM CARRY |
|
|
|
DJNZ N8V_SETCUR0 ; LOOP 3 TIMES |
|
|
|
LD DE,$800 ; OFFSET TO START OF FONT TABLE |
|
|
|
ADD HL,DE ; ADD TO FONT INDEX |
|
|
|
CALL N8V_RD ; SETUP TO READ GLYPH |
|
|
|
LD B,8 ; 8 BYTES |
|
|
|
LD HL,N8V_BUF ; INTO BUFFER |
|
|
|
N8V_SETCUR1: ; READ GLYPH LOOP |
|
|
|
IN A,(N8V_DATREG) ; GET NEXT BYTE |
|
|
|
N8V_IODELAY ; IO DELAY |
|
|
|
LD (HL),A ; SAVE VALUE IN BUF |
|
|
|
INC HL ; BUMP BUF POINTER |
|
|
|
DJNZ N8V_SETCUR1 ; LOOP FOR 8 BYTES |
|
|
|
; |
|
|
|
; NOW WRITE INVERTED GLYPH INTO FONT INDEX 255 |
|
|
|
LD HL,$800 + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 |
|
|
|
CALL N8V_WR ; SETUP TO WRITE THE INVERTED GLYPH |
|
|
|
LD B,8 ; 8 BYTES PER GLYPH |
|
|
|
LD HL,N8V_BUF ; POINT TO BUFFER |
|
|
|
N8V_SETCUR2: ; WRITE INVERTED GLYPH LOOP |
|
|
|
LD A,(HL) ; GET THE BYTE |
|
|
|
INC HL ; BUMP THE BUF POINTER |
|
|
|
XOR $FF ; INVERT THE VALUE |
|
|
|
OUT (N8V_DATREG),A ; WRITE IT TO VDU |
|
|
|
N8V_IODELAY ; IO DELAY |
|
|
|
DJNZ N8V_SETCUR2 ; LOOP FOR ALL 8 BYTES OF GLYPH |
|
|
|
; |
|
|
|
N8V_SETCUR3: ; RESTORE REGISTERS AND RETURN |
|
|
|
POP DE ; RECOVER DE |
|
|
|
POP HL ; RECOVER HL |
|
|
|
RET ; RETURN |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
N8V_CLRCUR: ; REMOVE VIRTUAL CURSOR FROM SCREEN |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,(N8V_POS) ; POINT TO CURRENT CURSOR POS |
|
|
|
CALL N8V_WR ; SET UP TO WRITE TO VDU |
|
|
|
LD A,(N8V_CURSAV) ; GET THE REAL CHARACTER |
|
|
|
OUT (N8V_DATREG),A ; WRITE IT |
|
|
|
N8V_IODELAY ; IO DELAY |
|
|
|
POP HL ; RECOVER HL |
|
|
|
RET ; RETURN |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
@ -337,7 +445,7 @@ N8V_FILL: |
|
|
|
N8V_FILL1: |
|
|
|
LD A,C ; RECOVER CHARACTER TO WRITE |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
NOP \ NOP |
|
|
|
N8V_IODELAY |
|
|
|
DEC DE |
|
|
|
LD A,D |
|
|
|
OR E |
|
|
|
@ -362,7 +470,7 @@ N8V_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION |
|
|
|
LD B,N8V_COLS |
|
|
|
N8V_SCROLL1: |
|
|
|
IN A,(N8V_DATREG) |
|
|
|
NOP \ NOP |
|
|
|
N8V_IODELAY |
|
|
|
LD (DE),A |
|
|
|
INC DE |
|
|
|
DJNZ N8V_SCROLL1 |
|
|
|
@ -375,7 +483,7 @@ N8V_SCROLL1: |
|
|
|
N8V_SCROLL2: |
|
|
|
LD A,(DE) |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
NOP \ NOP |
|
|
|
N8V_IODELAY |
|
|
|
INC DE |
|
|
|
DJNZ N8V_SCROLL2 |
|
|
|
; |
|
|
|
@ -391,7 +499,7 @@ N8V_SCROLL2: |
|
|
|
LD B,N8V_COLS |
|
|
|
N8V_SCROLL3: |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
NOP \ NOP \ NOP \ NOP |
|
|
|
N8V_IODELAY |
|
|
|
DJNZ N8V_SCROLL3 |
|
|
|
; |
|
|
|
RET |
|
|
|
@ -413,7 +521,7 @@ N8V_RSCROLL0: ; READ THE LINE THAT IS ONE PRIOR TO CURRENT DESTINATION |
|
|
|
LD B,N8V_COLS ; LOOP FOR EACH COLUMN |
|
|
|
N8V_RSCROLL1: |
|
|
|
IN A,(N8V_DATREG) ; GET THE CHAR |
|
|
|
NOP \ NOP ; RECOVER |
|
|
|
N8V_IODELAY ; RECOVER |
|
|
|
LD (DE),A ; SAVE IN BUFFER |
|
|
|
INC DE ; BUMP BUFFER POINTER |
|
|
|
DJNZ N8V_RSCROLL1 ; LOOP THRU ALL COLS |
|
|
|
@ -426,7 +534,7 @@ N8V_RSCROLL1: |
|
|
|
N8V_RSCROLL2: |
|
|
|
LD A,(DE) ; LOAD THE CHAR |
|
|
|
OUT (N8V_DATREG),A ; WRITE TO SCREEN |
|
|
|
NOP \ NOP ; DELAY |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
INC DE ; BUMP BUF POINTER |
|
|
|
DJNZ N8V_RSCROLL2 ; LOOP THRU ALL COLS |
|
|
|
; |
|
|
|
@ -442,7 +550,7 @@ N8V_RSCROLL2: |
|
|
|
LD B,N8V_COLS |
|
|
|
N8V_RSCROLL3: |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
NOP \ NOP \ NOP \ NOP |
|
|
|
N8V_IODELAY |
|
|
|
DJNZ N8V_RSCROLL3 |
|
|
|
; |
|
|
|
RET |
|
|
|
@ -463,7 +571,7 @@ N8V_BLKCPY1: |
|
|
|
LD B,C |
|
|
|
N8V_BLKCPY2: |
|
|
|
IN A,(N8V_DATREG) ; GET THE NEXT BYTE |
|
|
|
NOP \ NOP ; DELAY |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
LD (DE),A ; SAVE IN BUFFER |
|
|
|
INC DE ; BUMP BUF PTR |
|
|
|
DJNZ N8V_BLKCPY2 ; LOOP AS NEEDED |
|
|
|
@ -477,7 +585,7 @@ N8V_BLKCPY2: |
|
|
|
N8V_BLKCPY3: |
|
|
|
LD A,(DE) ; GET THE CHAR FROM BUFFER |
|
|
|
OUT (N8V_DATREG),A ; WRITE TO VDU |
|
|
|
NOP \ NOP ; DELAY |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
INC DE ; BUMP BUF PTR |
|
|
|
DJNZ N8V_BLKCPY3 ; LOOP AS NEEDED |
|
|
|
; |
|
|
|
@ -488,7 +596,8 @@ N8V_BLKCPY3: |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
N8V_POS .DW 0 ; CURRENT DISPLAY POSITION |
|
|
|
N8V_BUF .FILL 256,0 ; COPY BUFFER |
|
|
|
N8V_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR |
|
|
|
N8V_BUF .FILL 256,0 ; COPY BUFFER |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; N8V DRIVER - TMS9918 REGISTER INITIALIZATION |
|
|
|
|