|
|
|
@ -11,82 +11,82 @@ |
|
|
|
; - IMPLEMENT DYNAMIC READ/WRITE OF CHARACTER BITMAP DATA? |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; N8V DRIVER - CONSTANTS |
|
|
|
; SCG DRIVER - CONSTANTS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
N8V_CMDREG .EQU N8_BASE + $19 ; READ STATUS / WRITE REG SEL |
|
|
|
N8V_DATREG .EQU N8_BASE + $18 ; READ/WRITE DATA |
|
|
|
SCG_CMDREG .EQU N8_BASE + $19 ; READ STATUS / WRITE REG SEL |
|
|
|
SCG_DATREG .EQU N8_BASE + $18 ; READ/WRITE DATA |
|
|
|
; |
|
|
|
N8V_ROWS .EQU 24 |
|
|
|
N8V_COLS .EQU 40 |
|
|
|
SCG_ROWS .EQU 24 |
|
|
|
SCG_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 |
|
|
|
#DEFINE SCG_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; N8V DRIVER - INITIALIZATION |
|
|
|
; SCG DRIVER - INITIALIZATION |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
N8V_INIT: |
|
|
|
PRTS("N8V: IO=0x$") |
|
|
|
LD A,N8V_DATREG |
|
|
|
SCG_INIT: |
|
|
|
PRTS("SCG: IO=0x$") |
|
|
|
LD A,SCG_DATREG |
|
|
|
CALL PRTHEXBYTE |
|
|
|
; |
|
|
|
CALL N8V_CRTINIT ; SETUP THE N8V CHIP REGISTERS |
|
|
|
CALL N8V_LOADFONT ; LOAD FONT DATA FROM ROM TO N8V STRORAGE |
|
|
|
CALL SCG_CRTINIT ; SETUP THE SCG CHIP REGISTERS |
|
|
|
CALL SCG_LOADFONT ; LOAD FONT DATA FROM ROM TO SCG STRORAGE |
|
|
|
; |
|
|
|
; ADD OURSELVES TO CIO DISPATCH TABLE |
|
|
|
LD B,0 ; PHYSICAL UNIT IS ZERO |
|
|
|
LD C,CIODEV_N8V ; DEVICE TYPE |
|
|
|
LD C,CIODEV_SCG ; DEVICE TYPE |
|
|
|
LD DE,0 ; UNIT DATA BLOB ADDRESS |
|
|
|
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED |
|
|
|
LD (SCG_CIOUNIT),A ; SAVE IT LOCALLY |
|
|
|
LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE |
|
|
|
|
|
|
|
CALL TSTPT ; *DEBUG* |
|
|
|
LD D,VDAEMU ; DEFAULT EMULATION |
|
|
|
LD E,0 ; VIDEO MODE = 0 |
|
|
|
JP N8V_VDAINI |
|
|
|
JP SCG_VDAINI |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; N8V DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS |
|
|
|
; SCG DRIVER - CHARACTER I/O (CIO) DISPATCHER AND FUNCTIONS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
N8V_DISPCIO: |
|
|
|
SCG_DISPCIO: |
|
|
|
JP PANIC |
|
|
|
N8V_CIODISPADR .EQU $ - 2 |
|
|
|
SCG_CIODISPADR .EQU $ - 2 |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; N8V DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS |
|
|
|
; SCG DRIVER - VIDEO DISPLAY ADAPTER (VDA) DISPATCHER AND FUNCTIONS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
N8V_DISPATCH: |
|
|
|
SCG_DISPATCH: |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
|
|
|
|
JP Z,N8V_VDAINI ; $40 |
|
|
|
JP Z,SCG_VDAINI ; $40 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDAQRY ; $41 |
|
|
|
JP Z,SCG_VDAQRY ; $41 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDARES ; $42 |
|
|
|
JP Z,SCG_VDARES ; $42 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDASCS ; $43 |
|
|
|
JP Z,SCG_VDASCS ; $43 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDASCP ; $44 |
|
|
|
JP Z,SCG_VDASCP ; $44 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDASAT ; $45 |
|
|
|
JP Z,SCG_VDASAT ; $45 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDASCO ; $46 |
|
|
|
JP Z,SCG_VDASCO ; $46 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDAWRC ; $47 |
|
|
|
JP Z,SCG_VDAWRC ; $47 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDAFIL ; $48 |
|
|
|
JP Z,SCG_VDAFIL ; $48 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDACPY ; $49 |
|
|
|
JP Z,SCG_VDACPY ; $49 |
|
|
|
DEC A |
|
|
|
JP Z,N8V_VDASCR ; $4A |
|
|
|
JP Z,SCG_VDASCR ; $4A |
|
|
|
DEC A |
|
|
|
JP Z,PPK_STAT ; $4B |
|
|
|
DEC A |
|
|
|
@ -95,302 +95,302 @@ N8V_DISPATCH: |
|
|
|
JP Z,PPK_READ ; $4D |
|
|
|
CALL PANIC |
|
|
|
|
|
|
|
N8V_VDAINI: |
|
|
|
SCG_VDAINI: |
|
|
|
; RESET VDA |
|
|
|
PUSH DE ; SAVE EMULATION TYPE (IN D) |
|
|
|
CALL N8V_VDARES ; RESET VDA |
|
|
|
CALL SCG_VDARES ; RESET VDA |
|
|
|
POP DE ; RECOVER EMULATION TYPE |
|
|
|
|
|
|
|
; INITIALIZE EMULATION |
|
|
|
LD C,D ; EMULATION MODE TO C |
|
|
|
LD DE,N8V_DISPATCH ; DISPATCH ADDRESS TO DE |
|
|
|
CALL TSTPT ; *DEBUG* |
|
|
|
LD B,D ; EMULATION TYPE TO B |
|
|
|
LD A,(SCG_CIOUNIT) ; CIO UNIT NUMBER |
|
|
|
LD C,A ; ... IS PASSED IN C |
|
|
|
LD DE,SCG_DISPATCH ; DISPATCH ADDRESS TO DE |
|
|
|
CALL EMU_INIT ; INITIALIZE EMULATION, DE := CIO DISPATCHER |
|
|
|
LD (N8V_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS |
|
|
|
CALL TSTPT ; *DEBUG* |
|
|
|
LD (SCG_CIODISPADR),DE ; SAVE EMULATORS CIO DISPATCH INTERFACE ADDRESS |
|
|
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
|
|
|
|
N8V_VDAQRY: |
|
|
|
SCG_VDAQRY: |
|
|
|
LD C,$00 ; MODE ZERO IS ALL WE KNOW |
|
|
|
LD D,N8V_ROWS ; ROWS |
|
|
|
LD E,N8V_COLS ; COLS |
|
|
|
LD D,SCG_ROWS ; ROWS |
|
|
|
LD E,SCG_COLS ; COLS |
|
|
|
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDARES: |
|
|
|
SCG_VDARES: |
|
|
|
LD DE,0 ; ROW = 0, COL = 0 |
|
|
|
CALL N8V_XY ; SEND CURSOR TO TOP LEFT |
|
|
|
CALL SCG_XY ; SEND CURSOR TO TOP LEFT |
|
|
|
LD A,' ' ; BLANK THE SCREEN |
|
|
|
LD DE,N8V_ROWS * N8V_COLS ; FILL ENTIRE BUFFER |
|
|
|
CALL N8V_FILL ; DO IT |
|
|
|
LD DE,SCG_ROWS * SCG_COLS ; FILL ENTIRE BUFFER |
|
|
|
CALL SCG_FILL ; DO IT |
|
|
|
LD DE,0 ; ROW = 0, COL = 0 |
|
|
|
CALL N8V_XY ; SEND CURSOR TO TOP LEFT |
|
|
|
CALL SCG_XY ; SEND CURSOR TO TOP LEFT |
|
|
|
XOR A |
|
|
|
DEC A |
|
|
|
LD (N8V_CURSAV),A |
|
|
|
CALL N8V_SETCUR ; SET CURSOR |
|
|
|
LD (SCG_CURSAV),A |
|
|
|
CALL SCG_SETCUR ; SET CURSOR |
|
|
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDASCS: |
|
|
|
SCG_VDASCS: |
|
|
|
CALL PANIC ; NOT IMPLEMENTED (YET) |
|
|
|
|
|
|
|
N8V_VDASCP: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
CALL N8V_XY ; SET CURSOR POSITION |
|
|
|
CALL N8V_SETCUR |
|
|
|
SCG_VDASCP: |
|
|
|
CALL SCG_CLRCUR |
|
|
|
CALL SCG_XY ; SET CURSOR POSITION |
|
|
|
CALL SCG_SETCUR |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDASAT: |
|
|
|
SCG_VDASAT: |
|
|
|
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDASCO: |
|
|
|
SCG_VDASCO: |
|
|
|
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDAWRC: |
|
|
|
CALL N8V_CLRCUR ; CURSOR OFF |
|
|
|
SCG_VDAWRC: |
|
|
|
CALL SCG_CLRCUR ; CURSOR OFF |
|
|
|
LD A,E ; CHARACTER TO WRITE GOES IN A |
|
|
|
CALL N8V_PUTCHAR ; PUT IT ON THE SCREEN |
|
|
|
CALL N8V_SETCUR |
|
|
|
CALL SCG_PUTCHAR ; PUT IT ON THE SCREEN |
|
|
|
CALL SCG_SETCUR |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDAFIL: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
SCG_VDAFIL: |
|
|
|
CALL SCG_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 |
|
|
|
CALL SCG_FILL ; DO THE FILL |
|
|
|
CALL SCG_SETCUR |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDACPY: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS N8V_POS |
|
|
|
SCG_VDACPY: |
|
|
|
CALL SCG_CLRCUR |
|
|
|
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS SCG_POS |
|
|
|
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT |
|
|
|
PUSH HL ; SAVE LENGTH |
|
|
|
CALL N8V_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL |
|
|
|
CALL SCG_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL |
|
|
|
POP BC ; RECOVER LENGTH IN BC |
|
|
|
LD DE,(N8V_POS) ; PUT DEST IN DE |
|
|
|
CALL N8V_BLKCPY ; DO A BLOCK COPY |
|
|
|
CALL N8V_SETCUR |
|
|
|
LD DE,(SCG_POS) ; PUT DEST IN DE |
|
|
|
CALL SCG_BLKCPY ; DO A BLOCK COPY |
|
|
|
CALL SCG_SETCUR |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
|
|
|
|
N8V_VDASCR: |
|
|
|
CALL N8V_CLRCUR |
|
|
|
N8V_VDASCR0: |
|
|
|
SCG_VDASCR: |
|
|
|
CALL SCG_CLRCUR |
|
|
|
SCG_VDASCR0: |
|
|
|
LD A,E ; LOAD E INTO A |
|
|
|
OR A ; SET FLAGS |
|
|
|
JR Z,N8V_VDASCR2 ; IF ZERO, WE ARE DONE |
|
|
|
JR Z,SCG_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 |
|
|
|
JP M,SCG_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL |
|
|
|
CALL SCG_SCROLL ; SCROLL FORWARD ONE LINE |
|
|
|
POP DE ; RECOVER E |
|
|
|
DEC E ; DECREMENT IT |
|
|
|
JR N8V_VDASCR0 ; LOOP |
|
|
|
N8V_VDASCR1: |
|
|
|
CALL N8V_RSCROLL ; SCROLL REVERSE ONE LINE |
|
|
|
JR SCG_VDASCR0 ; LOOP |
|
|
|
SCG_VDASCR1: |
|
|
|
CALL SCG_RSCROLL ; SCROLL REVERSE ONE LINE |
|
|
|
POP DE ; RECOVER E |
|
|
|
INC E ; INCREMENT IT |
|
|
|
JR N8V_VDASCR0 ; LOOP |
|
|
|
N8V_VDASCR2: |
|
|
|
CALL N8V_SETCUR |
|
|
|
JR SCG_VDASCR0 ; LOOP |
|
|
|
SCG_VDASCR2: |
|
|
|
CALL SCG_SETCUR |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; N8V DRIVER - PRIVATE DRIVER FUNCTIONS |
|
|
|
; SCG DRIVER - PRIVATE DRIVER FUNCTIONS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; SET TMS9918 REGISTER VALUE |
|
|
|
; N8V_SET WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C |
|
|
|
; SCG_SET WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_SET: |
|
|
|
OUT (N8V_CMDREG),A ; WRITE IT |
|
|
|
N8V_IODELAY |
|
|
|
SCG_SET: |
|
|
|
OUT (SCG_CMDREG),A ; WRITE IT |
|
|
|
SCG_IODELAY |
|
|
|
LD A,C ; GET THE DESIRED REGISTER |
|
|
|
OR $80 ; SET BIT 7 |
|
|
|
OUT (N8V_CMDREG),A ; SELECT THE DESIRED REGISTER |
|
|
|
N8V_IODELAY |
|
|
|
OUT (SCG_CMDREG),A ; SELECT THE DESIRED REGISTER |
|
|
|
SCG_IODELAY |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; SET TMS9918 READ/WRITE ADDRESS |
|
|
|
; N8V_WR SETS TMS9918 TO BEGIN WRITING TO ADDRESS SPECIFIED IN HL |
|
|
|
; N8V_RD SETS TMS9918 TO BEGIN READING TO ADDRESS SPECIFIED IN HL |
|
|
|
; SCG_WR SETS TMS9918 TO BEGIN WRITING TO ADDRESS SPECIFIED IN HL |
|
|
|
; SCG_RD SETS TMS9918 TO BEGIN READING TO ADDRESS SPECIFIED IN HL |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_WR: |
|
|
|
SCG_WR: |
|
|
|
PUSH HL |
|
|
|
SET 6,H ; SET WRITE BIT |
|
|
|
CALL N8V_RD |
|
|
|
CALL SCG_RD |
|
|
|
POP HL |
|
|
|
RET |
|
|
|
; |
|
|
|
N8V_RD: |
|
|
|
SCG_RD: |
|
|
|
LD A,L |
|
|
|
OUT (N8V_CMDREG),A |
|
|
|
N8V_IODELAY |
|
|
|
OUT (SCG_CMDREG),A |
|
|
|
SCG_IODELAY |
|
|
|
LD A,H |
|
|
|
OUT (N8V_CMDREG),A |
|
|
|
N8V_IODELAY |
|
|
|
OUT (SCG_CMDREG),A |
|
|
|
SCG_IODELAY |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; MOS 8563 DISPLAY CONTROLLER CHIP INITIALIZATION |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_CRTINIT: |
|
|
|
SCG_CRTINIT: |
|
|
|
; SET WRITE ADDRESS TO $0 |
|
|
|
LD HL,0 |
|
|
|
CALL N8V_WR |
|
|
|
CALL SCG_WR |
|
|
|
; |
|
|
|
; FILL ENTIRE RAM CONTENTS |
|
|
|
LD DE,$4000 |
|
|
|
N8V_CRTINIT1: |
|
|
|
SCG_CRTINIT1: |
|
|
|
XOR A |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
OUT (SCG_DATREG),A |
|
|
|
DEC DE |
|
|
|
LD A,D |
|
|
|
OR E |
|
|
|
JR NZ,N8V_CRTINIT1 |
|
|
|
JR NZ,SCG_CRTINIT1 |
|
|
|
; |
|
|
|
; INITIALIZE VDU REGISTERS |
|
|
|
LD C,0 ; START WITH REGISTER 0 |
|
|
|
LD B,N8V_INIT9918LEN ; NUMBER OF REGISTERS TO INIT |
|
|
|
LD HL,N8V_INIT9918 ; HL = POINTER TO THE DEFAULT VALUES |
|
|
|
N8V_CRTINIT2: |
|
|
|
LD B,SCG_INIT9918LEN ; NUMBER OF REGISTERS TO INIT |
|
|
|
LD HL,SCG_INIT9918 ; HL = POINTER TO THE DEFAULT VALUES |
|
|
|
SCG_CRTINIT2: |
|
|
|
LD A,(HL) ; GET VALUE |
|
|
|
CALL N8V_SET ; WRITE IT |
|
|
|
CALL SCG_SET ; WRITE IT |
|
|
|
INC HL ; POINT TO NEXT VALUE |
|
|
|
INC C ; POINT TO NEXT REGISTER |
|
|
|
DJNZ N8V_CRTINIT2 ; LOOP |
|
|
|
DJNZ SCG_CRTINIT2 ; LOOP |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; LOAD FONT DATA |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_LOADFONT: |
|
|
|
SCG_LOADFONT: |
|
|
|
; SET WRITE ADDRESS TO $800 |
|
|
|
LD HL,$800 |
|
|
|
CALL N8V_WR |
|
|
|
CALL SCG_WR |
|
|
|
; |
|
|
|
; FILL $800 BYTES FROM FONTDATA |
|
|
|
LD HL,N8V_FONTDATA |
|
|
|
LD HL,SCG_FONTDATA |
|
|
|
LD DE,$100 * 8 |
|
|
|
N8V_LOADFONT1: |
|
|
|
SCG_LOADFONT1: |
|
|
|
LD B,8 |
|
|
|
N8V_LOADFONT2: |
|
|
|
SCG_LOADFONT2: |
|
|
|
LD A,(HL) |
|
|
|
PUSH AF |
|
|
|
INC HL |
|
|
|
DJNZ N8V_LOADFONT2 |
|
|
|
DJNZ SCG_LOADFONT2 |
|
|
|
; |
|
|
|
LD B,8 |
|
|
|
N8V_LOADFONT3: |
|
|
|
SCG_LOADFONT3: |
|
|
|
POP AF |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
OUT (SCG_DATREG),A |
|
|
|
DEC DE |
|
|
|
DJNZ N8V_LOADFONT3 |
|
|
|
DJNZ SCG_LOADFONT3 |
|
|
|
; |
|
|
|
LD A,D |
|
|
|
OR E |
|
|
|
JR NZ,N8V_LOADFONT1 |
|
|
|
JR NZ,SCG_LOADFONT1 |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; VIRTUAL CURSOR MANAGEMENT |
|
|
|
; N8V_SETCUR CONFIGURES AND DISPLAYS CURSOR AT CURRENT CURSOR LOCATION |
|
|
|
; N8V_CLRCUR REMOVES THE CURSOR |
|
|
|
; SCG_SETCUR CONFIGURES AND DISPLAYS CURSOR AT CURRENT CURSOR LOCATION |
|
|
|
; SCG_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. |
|
|
|
; ALL DISPLAY CHANGES BE BRACKETED WITH CALLS TO SCG_CLRCUR PRIOR TO |
|
|
|
; CHANGES AND SCG_SETCUR AFTER CHANGES. |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_SETCUR: |
|
|
|
SCG_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 |
|
|
|
LD HL,(SCG_POS) ; GET CURSOR POSITION |
|
|
|
CALL SCG_RD ; SETUP TO READ VDU BUF |
|
|
|
IN A,(SCG_DATREG) ; GET REAL CHAR UNDER CURSOR |
|
|
|
SCG_IODELAY ; DELAY |
|
|
|
PUSH AF ; SAVE THE CHARACTER |
|
|
|
CALL N8V_WR ; SETUP TO WRITE TO THE SAME PLACE |
|
|
|
CALL SCG_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 |
|
|
|
OUT (SCG_DATREG),A ; DO IT |
|
|
|
SCG_IODELAY ; DELAY |
|
|
|
POP AF ; RECOVER THE REAL CHARACTER |
|
|
|
LD B,A ; PUT IT IN B |
|
|
|
LD A,(N8V_CURSAV) ; GET THE CURRENTLY SAVED CHAR |
|
|
|
LD A,(SCG_CURSAV) ; GET THE CURRENTLY SAVED CHAR |
|
|
|
CP B ; COMPARE TO CURRENT |
|
|
|
JR Z,N8V_SETCUR3 ; IF EQUAL, BYPASS EXTRA WORK |
|
|
|
JR Z,SCG_SETCUR3 ; IF EQUAL, BYPASS EXTRA WORK |
|
|
|
LD A,B ; GET REAL CHAR BACK TO A |
|
|
|
LD (N8V_CURSAV),A ; SAVE IT |
|
|
|
LD (SCG_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 |
|
|
|
SCG_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 |
|
|
|
DJNZ SCG_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 |
|
|
|
CALL SCG_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,SCG_BUF ; INTO BUFFER |
|
|
|
SCG_SETCUR1: ; READ GLYPH LOOP |
|
|
|
IN A,(SCG_DATREG) ; GET NEXT BYTE |
|
|
|
SCG_IODELAY ; IO DELAY |
|
|
|
LD (HL),A ; SAVE VALUE IN BUF |
|
|
|
INC HL ; BUMP BUF POINTER |
|
|
|
DJNZ N8V_SETCUR1 ; LOOP FOR 8 BYTES |
|
|
|
DJNZ SCG_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 |
|
|
|
CALL SCG_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 HL,SCG_BUF ; POINT TO BUFFER |
|
|
|
SCG_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 |
|
|
|
OUT (SCG_DATREG),A ; WRITE IT TO VDU |
|
|
|
SCG_IODELAY ; IO DELAY |
|
|
|
DJNZ SCG_SETCUR2 ; LOOP FOR ALL 8 BYTES OF GLYPH |
|
|
|
; |
|
|
|
N8V_SETCUR3: ; RESTORE REGISTERS AND RETURN |
|
|
|
SCG_SETCUR3: ; RESTORE REGISTERS AND RETURN |
|
|
|
POP DE ; RECOVER DE |
|
|
|
POP HL ; RECOVER HL |
|
|
|
RET ; RETURN |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
N8V_CLRCUR: ; REMOVE VIRTUAL CURSOR FROM SCREEN |
|
|
|
SCG_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 |
|
|
|
LD HL,(SCG_POS) ; POINT TO CURRENT CURSOR POS |
|
|
|
CALL SCG_WR ; SET UP TO WRITE TO VDU |
|
|
|
LD A,(SCG_CURSAV) ; GET THE REAL CHARACTER |
|
|
|
OUT (SCG_DATREG),A ; WRITE IT |
|
|
|
SCG_IODELAY ; IO DELAY |
|
|
|
POP HL ; RECOVER HL |
|
|
|
RET ; RETURN |
|
|
|
; |
|
|
|
@ -398,9 +398,9 @@ N8V_CLRCUR: ; REMOVE VIRTUAL CURSOR FROM SCREEN |
|
|
|
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_XY: |
|
|
|
CALL N8V_XY2IDX ; CONVERT ROW/COL TO BUF IDX |
|
|
|
LD (N8V_POS),HL ; SAVE THE RESULT (DISPLAY POSITION) |
|
|
|
SCG_XY: |
|
|
|
CALL SCG_XY2IDX ; CONVERT ROW/COL TO BUF IDX |
|
|
|
LD (SCG_POS),HL ; SAVE THE RESULT (DISPLAY POSITION) |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
@ -408,10 +408,10 @@ N8V_XY: |
|
|
|
; D=ROW, E=COL |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_XY2IDX: |
|
|
|
SCG_XY2IDX: |
|
|
|
LD A,E ; SAVE COLUMN NUMBER IN A |
|
|
|
LD H,D ; SET H TO ROW NUMBER |
|
|
|
LD E,N8V_COLS ; SET E TO ROW LENGTH |
|
|
|
LD E,SCG_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 |
|
|
|
@ -421,15 +421,15 @@ N8V_XY2IDX: |
|
|
|
; WRITE VALUE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_PUTCHAR: |
|
|
|
SCG_PUTCHAR: |
|
|
|
PUSH AF ; SAVE CHARACTER |
|
|
|
LD HL,(N8V_POS) ; LOAD CURRENT POSITION INTO HL |
|
|
|
CALL N8V_WR ; SET THE WRITE ADDRESS |
|
|
|
LD HL,(SCG_POS) ; LOAD CURRENT POSITION INTO HL |
|
|
|
CALL SCG_WR ; SET THE WRITE ADDRESS |
|
|
|
POP AF ; RECOVER CHARACTER TO WRITE |
|
|
|
OUT (N8V_DATREG),A ; WRITE THE CHARACTER |
|
|
|
LD HL,(N8V_POS) ; LOAD CURRENT POSITION INTO HL |
|
|
|
OUT (SCG_DATREG),A ; WRITE THE CHARACTER |
|
|
|
LD HL,(SCG_POS) ; LOAD CURRENT POSITION INTO HL |
|
|
|
INC HL |
|
|
|
LD (N8V_POS),HL |
|
|
|
LD (SCG_POS),HL |
|
|
|
RET |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
@ -439,19 +439,19 @@ N8V_PUTCHAR: |
|
|
|
; DE: NUMBER OF CHARACTERS TO FILL |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_FILL: |
|
|
|
SCG_FILL: |
|
|
|
LD C,A ; SAVE THE CHARACTER TO WRITE |
|
|
|
LD HL,(N8V_POS) ; SET STARTING POSITION |
|
|
|
CALL N8V_WR ; SET UP FOR WRITE |
|
|
|
LD HL,(SCG_POS) ; SET STARTING POSITION |
|
|
|
CALL SCG_WR ; SET UP FOR WRITE |
|
|
|
; |
|
|
|
N8V_FILL1: |
|
|
|
SCG_FILL1: |
|
|
|
LD A,C ; RECOVER CHARACTER TO WRITE |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
N8V_IODELAY |
|
|
|
OUT (SCG_DATREG),A |
|
|
|
SCG_IODELAY |
|
|
|
DEC DE |
|
|
|
LD A,D |
|
|
|
OR E |
|
|
|
JR NZ,N8V_FILL1 |
|
|
|
JR NZ,SCG_FILL1 |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -459,50 +459,50 @@ N8V_FILL1: |
|
|
|
; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED) |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_SCROLL: |
|
|
|
SCG_SCROLL: |
|
|
|
LD HL,0 ; SOURCE ADDRESS OF CHARACER BUFFER |
|
|
|
LD C,N8V_ROWS - 1 ; SET UP LOOP COUNTER FOR ROWS - 1 |
|
|
|
LD C,SCG_ROWS - 1 ; SET UP LOOP COUNTER FOR ROWS - 1 |
|
|
|
; |
|
|
|
N8V_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION |
|
|
|
SCG_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION |
|
|
|
PUSH HL ; SAVE CURRENT DESTINATION |
|
|
|
LD DE,N8V_COLS |
|
|
|
LD DE,SCG_COLS |
|
|
|
ADD HL,DE ; POINT TO NEXT ROW SOURCE |
|
|
|
CALL N8V_RD ; SET UP TO READ |
|
|
|
LD DE,N8V_BUF |
|
|
|
LD B,N8V_COLS |
|
|
|
N8V_SCROLL1: |
|
|
|
IN A,(N8V_DATREG) |
|
|
|
N8V_IODELAY |
|
|
|
CALL SCG_RD ; SET UP TO READ |
|
|
|
LD DE,SCG_BUF |
|
|
|
LD B,SCG_COLS |
|
|
|
SCG_SCROLL1: |
|
|
|
IN A,(SCG_DATREG) |
|
|
|
SCG_IODELAY |
|
|
|
LD (DE),A |
|
|
|
INC DE |
|
|
|
DJNZ N8V_SCROLL1 |
|
|
|
DJNZ SCG_SCROLL1 |
|
|
|
POP HL ; RECOVER THE DESTINATION |
|
|
|
; |
|
|
|
; WRITE THE BUFFERED LINE TO CURRENT DESTINATION |
|
|
|
CALL N8V_WR ; SET UP TO WRITE |
|
|
|
LD DE,N8V_BUF |
|
|
|
LD B,N8V_COLS |
|
|
|
N8V_SCROLL2: |
|
|
|
CALL SCG_WR ; SET UP TO WRITE |
|
|
|
LD DE,SCG_BUF |
|
|
|
LD B,SCG_COLS |
|
|
|
SCG_SCROLL2: |
|
|
|
LD A,(DE) |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
N8V_IODELAY |
|
|
|
OUT (SCG_DATREG),A |
|
|
|
SCG_IODELAY |
|
|
|
INC DE |
|
|
|
DJNZ N8V_SCROLL2 |
|
|
|
DJNZ SCG_SCROLL2 |
|
|
|
; |
|
|
|
; BUMP TO NEXT LINE |
|
|
|
LD DE,N8V_COLS |
|
|
|
LD DE,SCG_COLS |
|
|
|
ADD HL,DE |
|
|
|
DEC C ; DECREMENT ROW COUNTER |
|
|
|
JR NZ,N8V_SCROLL0 ; LOOP THRU ALL ROWS |
|
|
|
JR NZ,SCG_SCROLL0 ; LOOP THRU ALL ROWS |
|
|
|
; |
|
|
|
; FILL THE NEWLY EXPOSED BOTTOM LINE |
|
|
|
CALL N8V_WR |
|
|
|
CALL SCG_WR |
|
|
|
LD A,' ' |
|
|
|
LD B,N8V_COLS |
|
|
|
N8V_SCROLL3: |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
N8V_IODELAY |
|
|
|
DJNZ N8V_SCROLL3 |
|
|
|
LD B,SCG_COLS |
|
|
|
SCG_SCROLL3: |
|
|
|
OUT (SCG_DATREG),A |
|
|
|
SCG_IODELAY |
|
|
|
DJNZ SCG_SCROLL3 |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -510,50 +510,50 @@ N8V_SCROLL3: |
|
|
|
; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED) |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_RSCROLL: |
|
|
|
LD HL,N8V_COLS * (N8V_ROWS - 1) |
|
|
|
LD C,N8V_ROWS - 1 |
|
|
|
SCG_RSCROLL: |
|
|
|
LD HL,SCG_COLS * (SCG_ROWS - 1) |
|
|
|
LD C,SCG_ROWS - 1 |
|
|
|
; |
|
|
|
N8V_RSCROLL0: ; READ THE LINE THAT IS ONE PRIOR TO CURRENT DESTINATION |
|
|
|
SCG_RSCROLL0: ; READ THE LINE THAT IS ONE PRIOR TO CURRENT DESTINATION |
|
|
|
PUSH HL ; SAVE THE DESTINATION ADDRESS |
|
|
|
LD DE,-N8V_COLS |
|
|
|
LD DE,-SCG_COLS |
|
|
|
ADD HL,DE ; SET SOURCE ADDRESS |
|
|
|
CALL N8V_RD ; SET UP TO READ |
|
|
|
LD DE,N8V_BUF ; POINT TO BUFFER |
|
|
|
LD B,N8V_COLS ; LOOP FOR EACH COLUMN |
|
|
|
N8V_RSCROLL1: |
|
|
|
IN A,(N8V_DATREG) ; GET THE CHAR |
|
|
|
N8V_IODELAY ; RECOVER |
|
|
|
CALL SCG_RD ; SET UP TO READ |
|
|
|
LD DE,SCG_BUF ; POINT TO BUFFER |
|
|
|
LD B,SCG_COLS ; LOOP FOR EACH COLUMN |
|
|
|
SCG_RSCROLL1: |
|
|
|
IN A,(SCG_DATREG) ; GET THE CHAR |
|
|
|
SCG_IODELAY ; RECOVER |
|
|
|
LD (DE),A ; SAVE IN BUFFER |
|
|
|
INC DE ; BUMP BUFFER POINTER |
|
|
|
DJNZ N8V_RSCROLL1 ; LOOP THRU ALL COLS |
|
|
|
DJNZ SCG_RSCROLL1 ; LOOP THRU ALL COLS |
|
|
|
POP HL ; RECOVER THE DESTINATION ADDRESS |
|
|
|
; |
|
|
|
; WRITE THE BUFFERED LINE TO CURRENT DESTINATION |
|
|
|
CALL N8V_WR ; SET THE WRITE ADDRESS |
|
|
|
LD DE,N8V_BUF ; POINT TO BUFFER |
|
|
|
LD B,N8V_COLS ; INIT LOOP COUNTER |
|
|
|
N8V_RSCROLL2: |
|
|
|
CALL SCG_WR ; SET THE WRITE ADDRESS |
|
|
|
LD DE,SCG_BUF ; POINT TO BUFFER |
|
|
|
LD B,SCG_COLS ; INIT LOOP COUNTER |
|
|
|
SCG_RSCROLL2: |
|
|
|
LD A,(DE) ; LOAD THE CHAR |
|
|
|
OUT (N8V_DATREG),A ; WRITE TO SCREEN |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
OUT (SCG_DATREG),A ; WRITE TO SCREEN |
|
|
|
SCG_IODELAY ; DELAY |
|
|
|
INC DE ; BUMP BUF POINTER |
|
|
|
DJNZ N8V_RSCROLL2 ; LOOP THRU ALL COLS |
|
|
|
DJNZ SCG_RSCROLL2 ; LOOP THRU ALL COLS |
|
|
|
; |
|
|
|
; BUMP TO THE PRIOR LINE |
|
|
|
LD DE,-N8V_COLS ; LOAD COLS (NEGATIVE) |
|
|
|
LD DE,-SCG_COLS ; LOAD COLS (NEGATIVE) |
|
|
|
ADD HL,DE ; BACK UP THE ADDRESS |
|
|
|
DEC C ; DECREMENT ROW COUNTER |
|
|
|
JR NZ,N8V_RSCROLL0 ; LOOP THRU ALL ROWS |
|
|
|
JR NZ,SCG_RSCROLL0 ; LOOP THRU ALL ROWS |
|
|
|
; |
|
|
|
; FILL THE NEWLY EXPOSED BOTTOM LINE |
|
|
|
CALL N8V_WR |
|
|
|
CALL SCG_WR |
|
|
|
LD A,' ' |
|
|
|
LD B,N8V_COLS |
|
|
|
N8V_RSCROLL3: |
|
|
|
OUT (N8V_DATREG),A |
|
|
|
N8V_IODELAY |
|
|
|
DJNZ N8V_RSCROLL3 |
|
|
|
LD B,SCG_COLS |
|
|
|
SCG_RSCROLL3: |
|
|
|
OUT (SCG_DATREG),A |
|
|
|
SCG_IODELAY |
|
|
|
DJNZ SCG_RSCROLL3 |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -561,48 +561,50 @@ N8V_RSCROLL3: |
|
|
|
; BLOCK COPY BC BYTES FROM HL TO DE |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
N8V_BLKCPY: |
|
|
|
SCG_BLKCPY: |
|
|
|
; SAVE DESTINATION AND LENGTH |
|
|
|
PUSH BC ; LENGTH |
|
|
|
PUSH DE ; DEST |
|
|
|
; |
|
|
|
; READ FROM THE SOURCE LOCATION |
|
|
|
N8V_BLKCPY1: |
|
|
|
CALL N8V_RD ; SET UP TO READ FROM ADDRESS IN HL |
|
|
|
LD DE,N8V_BUF ; POINT TO BUFFER |
|
|
|
SCG_BLKCPY1: |
|
|
|
CALL SCG_RD ; SET UP TO READ FROM ADDRESS IN HL |
|
|
|
LD DE,SCG_BUF ; POINT TO BUFFER |
|
|
|
LD B,C |
|
|
|
N8V_BLKCPY2: |
|
|
|
IN A,(N8V_DATREG) ; GET THE NEXT BYTE |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
SCG_BLKCPY2: |
|
|
|
IN A,(SCG_DATREG) ; GET THE NEXT BYTE |
|
|
|
SCG_IODELAY ; DELAY |
|
|
|
LD (DE),A ; SAVE IN BUFFER |
|
|
|
INC DE ; BUMP BUF PTR |
|
|
|
DJNZ N8V_BLKCPY2 ; LOOP AS NEEDED |
|
|
|
DJNZ SCG_BLKCPY2 ; LOOP AS NEEDED |
|
|
|
; |
|
|
|
; WRITE TO THE DESTINATION LOCATION |
|
|
|
POP HL ; RECOVER DESTINATION INTO HL |
|
|
|
CALL N8V_WR ; SET UP TO WRITE |
|
|
|
LD DE,N8V_BUF ; POINT TO BUFFER |
|
|
|
CALL SCG_WR ; SET UP TO WRITE |
|
|
|
LD DE,SCG_BUF ; POINT TO BUFFER |
|
|
|
POP BC ; GET LOOP COUNTER BACK |
|
|
|
LD B,C |
|
|
|
N8V_BLKCPY3: |
|
|
|
SCG_BLKCPY3: |
|
|
|
LD A,(DE) ; GET THE CHAR FROM BUFFER |
|
|
|
OUT (N8V_DATREG),A ; WRITE TO VDU |
|
|
|
N8V_IODELAY ; DELAY |
|
|
|
OUT (SCG_DATREG),A ; WRITE TO VDU |
|
|
|
SCG_IODELAY ; DELAY |
|
|
|
INC DE ; BUMP BUF PTR |
|
|
|
DJNZ N8V_BLKCPY3 ; LOOP AS NEEDED |
|
|
|
DJNZ SCG_BLKCPY3 ; LOOP AS NEEDED |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; N8V DRIVER - DATA |
|
|
|
; SCG DRIVER - DATA |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
N8V_POS .DW 0 ; CURRENT DISPLAY POSITION |
|
|
|
N8V_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR |
|
|
|
N8V_BUF .FILL 256,0 ; COPY BUFFER |
|
|
|
SCG_CIOUNIT .DB $FF ; LOCAL COPY OF OUR CIO UNIT NUMBER |
|
|
|
; |
|
|
|
SCG_POS .DW 0 ; CURRENT DISPLAY POSITION |
|
|
|
SCG_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR |
|
|
|
SCG_BUF .FILL 256,0 ; COPY BUFFER |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; N8V DRIVER - TMS9918 REGISTER INITIALIZATION |
|
|
|
; SCG DRIVER - TMS9918 REGISTER INITIALIZATION |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
; Control Registers (write CMDREG): |
|
|
|
@ -643,7 +645,7 @@ N8V_BUF .FILL 256,0 ; COPY BUFFER |
|
|
|
; 5S Fifth sprite (not displayed) detected. Value in FS* is valid. |
|
|
|
; INT Set at each screen update, used for interrupts. |
|
|
|
; |
|
|
|
N8V_INIT9918: |
|
|
|
SCG_INIT9918: |
|
|
|
.DB $00 ; REG 0 - NO EXTERNAL VID |
|
|
|
.DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 |
|
|
|
.DB $00 ; REG 2 - PATTERN NAME TABLE := 0 |
|
|
|
@ -653,11 +655,11 @@ N8V_INIT9918: |
|
|
|
.DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE |
|
|
|
.DB $F0 ; REG 7 - WHITE ON BLACK |
|
|
|
; |
|
|
|
N8V_INIT9918LEN .EQU $ - N8V_INIT9918 |
|
|
|
SCG_INIT9918LEN .EQU $ - SCG_INIT9918 |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; N8V DRIVER - FONT DATA |
|
|
|
; SCG DRIVER - FONT DATA |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
N8V_FONTDATA: |
|
|
|
#INCLUDE "n8v_font.inc" |
|
|
|
SCG_FONTDATA: |
|
|
|
#INCLUDE "scg_font.inc" |