diff --git a/Source/cvdu.asm b/Source/cvdu.asm index 6073b18e..ff8b55aa 100644 --- a/Source/cvdu.asm +++ b/Source/cvdu.asm @@ -188,50 +188,12 @@ CVDU_VDASCR1: POP DE ; RECOVER E INC E ; INCREMENT IT JR CVDU_VDASCR ; LOOP -; +; ;====================================================================== ; CVDU DRIVER - PRIVATE DRIVER FUNCTIONS ;====================================================================== ; ;---------------------------------------------------------------------- -; MOS 8563 DISPLAY CONTROLLER CHIP INITIALIZATION -;---------------------------------------------------------------------- -; -CVDU_CRTINIT: - 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_WR ; WRITE IT - INC HL ; POINT TO NEXT VALUE - INC C ; POINT TO NEXT REGISTER - DJNZ CVDU_CRTINIT1 ; LOOP - RET -; -;---------------------------------------------------------------------- -; LOAD FONT DATA -;---------------------------------------------------------------------- -; -CVDU_LOADFONT: - LD HL,$2000 ; START OF FONT BUFFER - LD C,18 ; UPDATE ADDRESS REGISTER PAIR - CALL CVDU_WRX ; DO IT - - LD HL,CVDU_FONTDATA ; POINTER TO FONT DATA - LD DE,$2000 ; LENGTH OF FONT DATA - LD C,31 ; DATA REGISTER -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 -; -;---------------------------------------------------------------------- ; UPDATE M8563 REGISTERS ; CVDU_WR WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C ; CVDU_WRX WRITES VALUE IN DE TO VDU REGISTER PAIR IN C, C+1 @@ -282,6 +244,44 @@ CVDU_RDX: RET ; ;---------------------------------------------------------------------- +; MOS 8563 DISPLAY CONTROLLER CHIP INITIALIZATION +;---------------------------------------------------------------------- +; +CVDU_CRTINIT: + 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_WR ; WRITE IT + INC HL ; POINT TO NEXT VALUE + INC C ; POINT TO NEXT REGISTER + DJNZ CVDU_CRTINIT1 ; LOOP + RET +; +;---------------------------------------------------------------------- +; LOAD FONT DATA +;---------------------------------------------------------------------- +; +CVDU_LOADFONT: + LD HL,$2000 ; START OF FONT BUFFER + LD C,18 ; UPDATE ADDRESS REGISTER PAIR + CALL CVDU_WRX ; DO IT + + LD HL,CVDU_FONTDATA ; POINTER TO FONT DATA + LD DE,$2000 ; LENGTH OF FONT DATA + LD C,31 ; DATA REGISTER +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 +; +;---------------------------------------------------------------------- ; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E ;---------------------------------------------------------------------- ; diff --git a/Source/vdu.asm b/Source/vdu.asm index 005621b5..3ab5fd55 100644 --- a/Source/vdu.asm +++ b/Source/vdu.asm @@ -7,6 +7,8 @@ ;====================================================================== ; ; TODO: +; - ADD REMAINING REGISTERS TO INIT +; - TRY 25 ROW MODE? ; - IMPLEMENT CONSTANTS FOR SCREEN DIMENSIONS ; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION ; - IMPLEMENT ALTERNATE DISPLAY MODES? @@ -26,13 +28,15 @@ VDU_DATA .EQU 0F3h ; VDU DATA REGISTER ;====================================================================== ; VDU_INIT: - CALL VDU_CRTINIT ; INIT 6545 VDU CHIP - CALL VDUINIT ; INIT VDU - CALL PERF_ERASE_EOS ; CLEAR SCREEN - CALL PERF_CURSOR_HOME ; CURSOR HOME - RET + CALL VDU_CRTINIT ; INIT SY6845 VDU CHIP VDU_RESET: + LD DE,0 + LD (VDU_OFFSET),DE + CALL VDU_XY + LD A,' ' + LD DE,1024*16 + CALL VDU_FILL XOR A RET ; @@ -106,8 +110,8 @@ VDU_VDAINI: VDU_VDAQRY: 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 + LD DE,$1850 ; 24 ROWS ($18), 80 COLS ($50) + LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED XOR A ; SIGNAL SUCCESS RET @@ -118,348 +122,242 @@ VDU_VDASCS: CALL PANIC ; NOT IMPLEMENTED (YET) VDU_VDASCP: - LD A,E - LD (VDU_X),A - LD A,D - LD (VDU_Y),A CALL VDU_XY XOR A RET VDU_VDASAT: - ; FIX: NOT IMPLEMENTED!!! - CALL PANIC + XOR A + RET VDU_VDASCO: - ; NOT SUPPORTED!!! - CALL PANIC + XOR A + RET VDU_VDAWRC: - ; PUSH CHARACTER OUT AT CURRENT POSITION - LD A,31 ; PREP VDU FOR DATA R/W - OUT (VDU_REG),A - CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY LD A,E - OUT (VDU_RAMWR),A ; OUTPUT CHAR TO VDU - - ; UPDATE CURSOR POSITION TO FOLLOW CHARACTERS - LD HL,(VDU_DISPLAYPOS) ; GET CURRENT DISPLAY POSITION - INC HL ; INCREMENT IT - LD (VDU_DISPLAYPOS),HL ; STORE NEW DISPLAY POSITION - LD DE,(VDU_DISPLAY_START) ; GET DISPLAY START - ADD HL,DE ; ADD IT TO DISPLAY POSITION - LD A,14 ; UPDATE CURSOR POSITION - CALL VDU_HL2WREG_A ; SEND IT - - ; RETURN WITH SUCCESS + CALL VDU_PUTCHAR XOR A RET VDU_VDAFIL: - LD A, 31 ; PREP VDU FOR DATA R/W - OUT (VDU_REG),A -VDU_VDAFIL1: - LD A,H ; CHECK NUMBER OF FILL CHARS LEFT - OR L - JR Z,VDU_VDAFIL2 ; ALL DONE, GO TO COMPLETION - CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY - LD A,E - OUT (VDU_RAMWR), A ; OUTPUT CHAR TO VDU - DEC HL ; DECREMENT COUNT - JR VDU_VDAFIL1 ; LOOP AS NEEDED -VDU_VDAFIL2: - CALL VDU_XY ; YES, MOVE CURSOR BACK TO ORIGINAL POSITION - XOR A ; RESULT = 0 + LD A,E ; FILL CHARACTER GOES IN A + EX DE,HL ; FILL LENGTH GOES IN DE + CALL VDU_FILL ; DO THE FILL + XOR A ; SIGNAL SUCCESS RET VDU_VDASCR: - ; FIX: IMPLEMENT REVERSE SCROLLING!!! - LD A,E - OR A - RET Z - PUSH DE - CALL DO_SCROLL - POP DE - DEC E - JR VDU_VDASCR + LD A,E ; LOAD E INTO A + OR A ; SET FLAGS + RET Z ; IF ZERO, WE ARE DONE + PUSH DE ; SAVE E + JP M,VDU_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL + CALL VDU_SCROLL ; SCROLL FORWARD ONE LINE + POP DE ; RECOVER E + DEC E ; DECREMENT IT + JR VDU_VDASCR ; LOOP +VDU_VDASCR1: + CALL VDU_RSCROLL ; SCROLL REVERSE ONE LINE + POP DE ; RECOVER E + INC E ; INCREMENT IT + JR VDU_VDASCR ; LOOP +; +;====================================================================== +; CVDU DRIVER - PRIVATE DRIVER FUNCTIONS +;====================================================================== +; +;---------------------------------------------------------------------- +; WAIT FOR VDU TO BE READY FOR A DATA READ/WRITE +;---------------------------------------------------------------------- ; VDU_WAITRDY: IN A,(VDU_STAT) ; READ STATUS OR A ; SET FLAGS RET M ; IF BIT 7 SET, THEN READY! JR VDU_WAITRDY ; KEEP CHECKING -;; -;;__________________________________________________________________________________________________ -;; INITIALIZATION -;;__________________________________________________________________________________________________ -;INITVDU: -; CALL VDUINIT ; INIT VDU -; CALL PERF_ERASE_EOS ; CLEAR SCREEN -; CALL PERF_CURSOR_HOME ; CURSOR HOME -; RET -; -;__PERF_ERASE_EOL__________________________________________________________________________________ -; -; PERFORM ERASE FROM CURSOR POS TO END OF LINE -;__________________________________________________________________________________________________ -PERF_ERASE_EOL: - LD A,(VDU_X) ; GET CURRENT CURSOR X COORD - LD C,A ; STORE IT IN C - LD A,80 ; MOVE CURRENT LINE WIDTH INTO A - SUB C ; GET REMAINING POSITIONS ON CURRENT LINE - LD B,A ; MOVE IT INTO B - LD A,31 ; UPDATE TOGGLE VDU CHIP - OUT (VDU_REG),A -PERF_ERASE_EOL_LOOP: - CALL VDU_WAITRDY ; WAIT FOR VDU CHIP TO BE READY - LD A,32 ; MOVE SPACE CHARACTER INTO A - OUT (VDU_RAMWR),A ; WRITE IT TO SCREEN, VDU WILL AUTO INC TO NEXT ADDRESS - DJNZ PERF_ERASE_EOL_LOOP ; LOOP UNTIL DONE - CALL VDU_XY ; MOVE CURSOR BACK TO ORIGINAL POSITION - RET ; -;__PERF_ERASE_EOS__________________________________________________________________________________ -; -; PERFORM ERASE FROM CURSOR POS TO END OF SCREEN -;__________________________________________________________________________________________________ -PERF_ERASE_EOS: - LD HL,0780H ; SET SCREEN SIZE INTO HL - PUSH HL ; MOVE IT TO DE - POP DE - LD A,31 ; UPDATE TOGGLE VDU CHIP - OUT (VDU_REG),A -PERF_ERASE_EOS_LOOP: - CALL VDU_WAITRDY ; WAIT FOR VDU CHIP TO BE READY - LD A, ' ' ; MOVE SPACE CHARACTER INTO A - OUT (VDU_RAMWR),A ; 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,PERF_ERASE_EOS_LOOP ; NO, LOOP - CALL VDU_XY ; YES, MOVE CURSOR BACK TO ORIGINAL POSITION - RET -; -;__PERF_CURSOR_HOME________________________________________________________________________________ -; -; PERFORM CURSOR HOME -;__________________________________________________________________________________________________ -PERF_CURSOR_HOME: - LD A,0 ; LOAD 0 INTO A - LD (VDU_X),A ; SET X COORD - LD (VDU_Y),A ; SET Y COORD - JP VDU_XY ; MOVE CURSOR TO POSITION -; -;__DO_SCROLL_______________________________________________________________________________________ -; -; SCROLL THE SCREEN UP ONE LINE -;__________________________________________________________________________________________________ -DO_SCROLL: - PUSH AF ; STORE AF -DO_SCROLL1: - PUSH HL ; STORE HL - PUSH BC ; STORE BC - LD A, 31 ; TOGGLE VDU FOR UPDATE - OUT (VDU_REG),A - CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY - LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY - LD DE,0050H ; SET AMOUNT TO ADD - ADD HL,DE ; ADD TO START POS - LD (VDU_DISPLAY_START),HL ; STORE DISPLAY START - LD A, 12 ; SAVE START OF DISPLAY TO VDU - CALL VDU_HL2WREG_A - LD A,23 ; SET CURSOR TO BEGINNING OF LAST LINE - LD (VDU_Y),A - LD A,(VDU_X) - PUSH AF ; STORE X COORD - LD A,0 - LD (VDU_X),A - CALL VDU_XY ; SET CURSOR POSITION TO BEGINNING OF LINE - CALL PERF_ERASE_EOL ; ERASE SCROLLED LINE - POP AF ; RESTORE X COORD - LD (VDU_X),A - CALL VDU_XY ; SET CURSOR POSITION - POP BC ; RESTORE BC - POP HL ; RESTORE HL - POP AF ; RESTORE AF - RET ; -; -;__REVERSE_SCROLL__________________________________________________________________________________ -; -; SCROLL THE SCREEN DOWN ONE LINE -;__________________________________________________________________________________________________ -REVERSE_SCROLL: - PUSH AF ; STORE AF - PUSH HL ; STORE HL - PUSH BC ; STORE BC - LD A, 31 ; TOGGLE VDU FOR UPDATE - OUT (VDU_REG),A - CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY - LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY - LD DE,0FFB0H ; SET AMOUNT TO SUBTRACT (TWOS COMPLEMENT 50H) - ADD HL,DE ; ADD TO START POS - LD (VDU_DISPLAY_START),HL ; STORE DISPLAY START - LD A, 12 ; SAVE START OF DISPLAY TO VDU - CALL VDU_HL2WREG_A - LD A,23 ; SET CURSOR TO BEGINNING OF LAST LINE - LD (VDU_Y),A - LD A,(VDU_X) - PUSH AF ; STORE X COORD - LD A,0 - LD (VDU_X),A - CALL VDU_XY ; SET CURSOR POSITION TO BEGINNING OF LINE - CALL PERF_ERASE_EOL ; ERASE SCROLLED LINE - POP AF ; RESTORE X COORD - LD (VDU_X),A - CALL VDU_XY ; SET CURSOR POSITION - POP BC ; RESTORE BC - POP HL ; RESTORE HL - POP AF ; RESTORE AF +;---------------------------------------------------------------------- +; UPDATE SY6845 REGISTERS +; VDU_WRREG WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C +; VDU_WRREGX WRITES VALUE IN DE TO VDU REGISTER PAIR IN C, C+1 +;---------------------------------------------------------------------- +; +VDU_WRREG: + PUSH AF ; SAVE VALUE TO WRITE + LD A,C ; SET A TO CVDU REGISTER TO SELECT + OUT (VDU_REG),A ; WRITE IT TO SELECT THE REGISTER + POP AF ; RECOVER VALUE TO WRITE + OUT (VDU_DATA),A ; WRITE IT RET ; -;__VDUINIT__________________________________________________________________________________________ +VDU_WRREGX: + LD A,H ; SETUP MSB TO WRITE + CALL VDU_WRREG ; DO IT + INC C ; NEXT CVDU REGISTER + LD A,L ; SETUP LSB TO WRITE + JR VDU_WRREG ; DO IT & RETURN +; +;---------------------------------------------------------------------- +; READ SY6845 REGISTERS +; VDU_RDREG READS VDU REGISTER SPECIFIED IN C AND RETURNS VALUE IN A +; VDU_RDREGX READS VDU REGISTER PAIR SPECIFIED BY C, C+1 +; AND RETURNS VALUE IN HL +;---------------------------------------------------------------------- +; +VDU_RDREG: + LD A,C ; SET A TO CVDU REGISTER TO SELECT + OUT (VDU_REG),A ; WRITE IT TO SELECT THE REGISTER + IN A,(VDU_DATA) ; READ IT + RET ; -; INITIALIZE VDU -;__________________________________________________________________________________________________ -VDUINIT: - PUSH AF ; STORE AF - PUSH DE ; STORE DE - PUSH HL ; STORE HL - - LD A, 31 ; TOGGLE VDU FOR UPDATE - OUT (VDU_REG),A - LD HL,0 ; SET-UP START OF DISPLAY - LD DE, 2048 ; SET-UP DISPLAY SIZE - LD A, 18 ; WRITE HL TO R18 AND R19 (UPDATE ADDRESS) - CALL VDU_HL2WREG_A ; - LD A, 31 ; TOGGLE VDU FOR UPDATE - OUT (VDU_REG),A -VDU_CRTSPACELOOP: ; - CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY - LD A, ' ' ; CLEAR SCREEN - OUT (VDU_RAMWR),A ; SEND SPACE TO DATAPORT - DEC DE ; DECREMENT DE - LD A,D ; IS ZERO? - OR E ; - JP NZ, VDU_CRTSPACELOOP ; NO, LOOP - LD A, 31 ; TOGGLE VDU FOR UPDATE - OUT (VDU_REG),A - LD HL, 0 ; SET UP START OF DISPLAY - LD (VDU_DISPLAY_START),HL ; STORE DISPLAY START - LD A, 12 ; SAVE START OF DISPLAY TO VDU - CALL VDU_HL2WREG_A ; - POP HL ; - POP DE ; - POP AF ; - CALL PERF_CURSOR_HOME ; CURSOR HOME - CALL PERF_ERASE_EOS ; CLEAR SCREEN - RET -; -;__VDU_HL2WREG_A___________________________________________________________________________________ -; -; WRITE VALUE IN HL TO REGISTER IN A -; A: REGISTER TO UPDATE -; HL: WORD VALUE TO WRITE -;__________________________________________________________________________________________________ -VDU_HL2WREG_A: - PUSH BC ; STORE BC - LD C,VDU_REG ; ADDRESS REGISTER - OUT (C),A ; SELECT REGISTER (A) - INC C ; NEXT WRITE IN REGISTER - OUT (C),H ; WRITE H TO SELECTED REGISTER - DEC C ; NEXT WRITE SELECT REGISTER - INC A ; INCREASE REGISTER NUMBER - OUT (C),A ; SELECT REGISTER (A+1) - INC C ; NEXT WRITE IN REGISTER - OUT (C),L ; WRITE L TO SELECTED REGISTER - POP BC ; RESTORE BC - RET +VDU_RDREGX: + CALL VDU_RDREG ; GET VALUE FROM REGISTER IN C + LD H,A ; SAVE IN H + INC C ; BUMP TO NEXT REGISTER OF PAIR + CALL VDU_RDREG ; READ THE VALUE + LD L,A ; SAVE IT IN L + RET ; -;__VDU_CRTINIT_____________________________________________________________________________________ +;---------------------------------------------------------------------- +; SY6845 DISPLAY CONTROLLER CHIP INITIALIZATION +;---------------------------------------------------------------------- ; -; INIT VDU CHIP -;__________________________________________________________________________________________________ VDU_CRTINIT: - PUSH AF ; STORE AF - PUSH BC ; STORE BC - PUSH DE ; STORE DE - PUSH HL ; STORE HL - LD BC,010F2h ; B = 16, C = VDU_REG - LD HL,VDU_INIT6845 ; HL = POINTER TO THE DEFAULT VALUES - XOR A ; A = 0 -VDU_CRTINITLOOP: - OUT (C), A ; VDU_REG SET REGISTER - INC C ; 0F3h - LD D,(HL) ; LOAD THE NEXT DEFAULT VALUE IN D - OUT (C),D ; 0F3h ADDRESS - DEC C ; VDU_REG - INC HL ; TAB + 1 - INC A ; REG + 1 - DJNZ VDU_CRTINITLOOP ; LOOP UNTIL DONE - POP HL ; RESTORE HL - POP DE ; RESTORE DE - POP BC ; RESTORE BC - POP AF ; RESTORE AF + LD C,0 ; START WITH REGISTER 0 + LD B,16 ; INIT 16 REGISTERS + LD HL,VDU_INIT6845 ; HL = POINTER TO THE DEFAULT VALUES +VDU_CRTINIT1: + LD A,(HL) ; GET VALUE + CALL VDU_WRREG ; WRITE IT + INC HL ; POINT TO NEXT VALUE + INC C ; POINT TO NEXT REGISTER + DJNZ VDU_CRTINIT1 ; LOOP RET ; -;__VDU_XY__________________________________________________________________________________________ +;---------------------------------------------------------------------- +; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E +;---------------------------------------------------------------------- ; -; MOVE CURSOR TO POSITON IN VDU_X AND VDU_Y -;__________________________________________________________________________________________________ VDU_XY: - PUSH AF ; STORE AF + 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 + LD (VDU_POS),HL ; SAVE THE RESULT (DISPLAY POSITION) + LD DE,(VDU_OFFSET) ; NOW GET THE BUFFER OFFSET + ADD HL,DE ; AND ADD THAT IN + LD C,14 ; CURSOR POSITION REGISTER PAIR + JP VDU_WRREGX ; DO IT AND RETURN +; +;---------------------------------------------------------------------- +; WRITE VALULE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR +;---------------------------------------------------------------------- +; +VDU_PUTCHAR: + LD B,A ; SAVE THE CHARACTER + + ; SET BUFFER WRITE POSITION + LD HL,(VDU_OFFSET) + LD DE,(VDU_POS) + ADD HL,DE + INC DE ; INC + LD (VDU_POS),DE ; SAVE NEW SCREEN POSITION + LD C,18 ; UPDATE ADDRESS REGISTER PAIR + CALL VDU_WRREGX ; DO IT + INC HL ; NEW CURSOR POSITION + LD C,14 ; CURSOR POSITION REGISTER PAIR + CALL VDU_WRREGX ; DO IT + + LD A,31 ; PREP VDU FOR DATA R/W + OUT (VDU_REG),A + CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY + LD A,B + OUT (VDU_RAMWR),A ; OUTPUT CHAR TO VDU + + RET +; +;---------------------------------------------------------------------- +; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE +; STARTING AT THE CURRENT FRAME BUFFER POSITION +; A: FILL CHARACTER +; DE: NUMBER OF CHARACTERS TO FILL +;---------------------------------------------------------------------- +; +VDU_FILL: + LD B,A ; SAVE THE FILL CHARACTER - LD A,(VDU_Y) ; PLACE Y COORD IN A - CP 24 ; IS 24? - JP Z,DO_SCROLL1 ; YES, MUST SCROLL + ; SET FILL START POSITION + PUSH DE + LD HL,(VDU_OFFSET) + LD DE,(VDU_POS) + ADD HL,DE + LD C,18 + CALL VDU_WRREGX + POP DE - PUSH BC ; STORE BC - PUSH DE ; STORE DE - LD A,(VDU_X) ; - LD H,A ; - LD A,(VDU_Y) ; - LD L,A ; - PUSH HL ; STORE HL - LD B, A ; B = Y COORD - LD DE, 80 ; MOVE LINE LENGTH INTO DE - LD HL, 0 ; MOVE 0 INTO HL - LD A, B ; A=B - CP 0 ; Y=0? - JP Z, VDU_YLOOPEND ; THEN DO NOT MULTIPLY BY 80 -VDU_YLOOP: ; HL = 80 * Y - ADD HL, DE ; HL=HL+DE - DJNZ VDU_YLOOP ; LOOP -VDU_YLOOPEND: ; - POP DE ; DE = ORG HL - LD E, D ; E = X - LD D, 0 ; D = 0 - ADD HL, DE ; HL = HL + X - LD (VDU_DISPLAYPOS), HL ; - PUSH HL ; - POP DE ; - LD HL,(VDU_DISPLAY_START) ; - ADD HL,DE ; - LD A, 18 ; SET UPDATE ADDRESS IN VDU - CALL VDU_HL2WREG_A ; - LD A, 31 ; TOGGLE VDU FOR UPDATE + ; FILL LOOP + LD A,31 ; PREP VDU FOR DATA R/W OUT (VDU_REG),A - LD A, 14 ; SET CURSOR POS - CALL VDU_HL2WREG_A ; - POP DE ; RESTORE DE - POP BC ; RESTORE BC - POP AF ; RESTORE AF - RET +VDU_FILL1: + LD A,D ; CHECK NUMBER OF FILL CHARS LEFT + OR E + RET Z ; ALL DONE, RETURN + CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY + LD A,B + OUT (VDU_RAMWR),A ; OUTPUT CHAR TO VDU + DEC DE ; DECREMENT COUNT + JR VDU_FILL1 ; LOOP +; +;---------------------------------------------------------------------- +; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED) +;---------------------------------------------------------------------- +; +VDU_SCROLL: + ; SCROLL FORWARD BY ADDING ONE ROW TO 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,23*80 + LD (VDU_POS),HL + LD DE,80 + LD A,' ' + CALL VDU_FILL + POP HL + LD (VDU_POS),HL + + ; ADJUST CURSOR POSITION + LD HL,(VDU_OFFSET) + LD DE,(VDU_POS) + ADD HL,DE + LD C,14 + JP VDU_WRREGX +; +;---------------------------------------------------------------------- +; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED) +;---------------------------------------------------------------------- +; +VDU_RSCROLL: + RET ; ;================================================================================================== ; VDU DRIVER - DATA ;================================================================================================== ; -VDU_X .DB 0 ; CURSOR X -VDU_Y .DB 0 ; CURSOR Y -VDU_DISPLAYPOS .DW 0 ; CURRENT DISPLAY POSITION -VDU_DISPLAY_START .DW 0 ; CURRENT DISPLAY POSITION +VDU_POS .DW 0 ; CURRENT DISPLAY POSITION +VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION ; ;================================================================================================== -; VDU DRIVER - 6845 REGISTER INITIALIZATION +; VDU DRIVER - SY6845 REGISTER INITIALIZATION ;================================================================================================== ; VDU_INIT6845: