From c7dbee6375daf902c9b0c9cbd9681c09d6622ce4 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 8 Mar 2020 15:35:58 +0800 Subject: [PATCH] Update nascom.asm Setup ECB-VDU build option, remove debug code --- Source/HBIOS/nascom.asm | 315 ++++++++++++++++++---------------------- 1 file changed, 138 insertions(+), 177 deletions(-) diff --git a/Source/HBIOS/nascom.asm b/Source/HBIOS/nascom.asm index 7483166b..92bb0c5e 100644 --- a/Source/HBIOS/nascom.asm +++ b/Source/HBIOS/nascom.asm @@ -25,16 +25,21 @@ ; 20181027 - Initial retrobrewcomputer SBC V2 version - difficultylevelhigh@gmail.com ; 20191012 - Add PLAY command for SBC-V2-004 Sound support. ; 20191013 - Add option for long error messages. -; - Add option to use VT100 escape codes for screen controls. -; 20200503 - Add ECB-VDU Graphics support for set, reset and point +; - Add option to use VT100 escape codes for screen controls. +; 20200308 - Add ECB-VDU Graphics support for set, reset and point ; #INCLUDE "std.asm" ; ; CUSTOMIZATION ; -ABBRERR .EQU TRUE ; Choose between long error message and abbreviated error messages. +ABBRERR .EQU FALSE ; Choose between long error message and abbreviated error messages. VT100 .EQU TRUE ; Use VT100 escape codes for CLS - +VDUGFX .EQU TRUE ; Option to enable ECB-VDU graphics support using SET, RESET and POINT. +; +;================================================================================== +; SBC V2 + ECB-VDU GRAPHICS CUSTOMIZATION +; REQUIRES ECB-VDU WITH 256 CHARACTER MOD AND 12X8GFX1 FONT INSTALLED, VDU MODE SET TO 80X25B. +; VDUROWS .EQU 25 VDUCOLS .EQU 80 VDUSIZE .EQU (VDUROWS*VDUCOLS) @@ -92,7 +97,7 @@ CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine BRKFLG .EQU WRKSPC+4DH ; Break flag RINPUT .EQU WRKSPC+4EH ; Input reflection -POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) +POINT .EQU WRKSPC+51H ; "POINT" reflection PSET .EQU WRKSPC+54H ; "SET" reflection RESET .EQU WRKSPC+57H ; "RESET" reflection STRSPC .EQU WRKSPC+5AH ; Bottom of string space @@ -561,9 +566,15 @@ INITAB: JP WARMST ; Warm start jump .BYTE 0 ; Break not by NMI .BYTE 0 ; Break flag JP TTYLIN ; Input reflection (set to TTY) +#IF VDUGFX JP POINTB ; POINT reflection unused JP SETB ; SET reflection JP RESETB ; RESET reflection +#ELSE + JP REM + JP REM + JP REM +#ENDIF .WORD STLOOK ; Temp string space .WORD -2 ; Current line number (cold) .WORD PROGST+1 ; Start of program text @@ -2083,8 +2094,10 @@ FNOFST: LD B,0 ; Get address of function PUSH BC ; Save adjusted token value CALL GETCHR ; Get next character LD A,C ; Get adjusted token value +#IF VDUGFX CP 2*(ZPOINT-ZSGN) ; Adjusted "POINT" token? - JP Z,POINTB ; Yes - Do "POINT" (not POINTB) + JP Z,POINT ; Yes - Do "POINT" (not POINTB) +#ENDIF CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? JP C,FNVAL ; No - Do function CALL OPNPAR ; Evaluate expression (X,... @@ -4208,6 +4221,8 @@ ATNTAB: .BYTE 9 ; Table used by ATN ARET: RET ; A RETurn instruction ; +#IF VDUGFX +; ; GETXYA ; Decode the x,y pixel coordinate from BASIC ; Convert pixel coordinate to character coordinate and create the graphic character mask. @@ -4229,42 +4244,56 @@ GETXYA: CALL CHKSYN ; Make sure "(" follows CALL DEINT ; Get integer -32768 to 32767 PUSH HL ; Save code string address POP IY ; In IY +; +; Pixel column (0-159) is on the stack. DE contains the pixel row (0-74) +; Convert X,Y Pixels co-ord. to X,Y character co-ord. Create Byte mask +; + POP HL ; Get the pixel column + LD A,L ; Change HL from a pixel + SRL A ; column to a character column + LD L,A ; by dividing by two. + SBC A,A ; If the pixel column is even + INC A ; then set the byte mask to 00000010 + ADC A,A ; if it is odd set mask to 00000001 + PUSH HL ; Save the character column - CALL XYPOS ; Convert X,Y Pixels to X,Y character. Create Byte mask - OR 10000000B ; Convert Byte mask (0-63) to a charcter (128-192) - ; A=Byte mask, STACK= character column (0-79). DE= row (1-25) + LD HL,(VDUROWS*3)-1; Get row to HL + SBC HL,DE ; C=0 from above + LD DE,-1 ; Zero line count + LD BC,3 ; 3 blocks per line +DIV3LP: SBC HL,BC ; Subtract 3 + INC DE ; Count the subtractions + JP P,DIV3LP ; More to do + OR A ; HL is the remainder which defines + DEC BC ; which pixel row the mask should be on + ADC HL,BC ; HL = -1, 0, 1 and flags are set + JR Z,BY4 ; Byte mask is in A and + JP P,ROW0SKP ; set for pixel row 0 + RLCA ; Move the mask to + RLCA ; pixel row 1 or 2 +BY4: RLCA ; based on the remainder + RLCA ; calculate above in HL +ROW0SKP:OR 10000000B ; Convert Byte mask (0-63) to a font character (128-192) +; +; A=Byte mask, stack = character column (0-79). DE contains character row (0-24) +; Check for valid character co-ord and calculate screen address +; POP HL ; Character column PUSH AF ; Save byte mask - LD B,E ; Rows to B - LD A,E ; Rows to A - CP VDUROWS ; Error if rows -; JP M,FCERR ; out of range - -; PUSH AF -; PUSH DE -; PUSH HL -; LD D,0 -; PUSH DE -; POP HL -; CALL PRTDEC -; POP HL -; POP DE -; POP AF - - LD A,L ; Column to L - CP VDUCOLS ; Error if Columns -; JP M,FCERR ; out of range - - ;PUSH AF - ;CALL PRTDEC - ;POP AF + LD A,H ; Column high byte to A + OR A ; Error if negative + JP NZ,FCERR ; or >255 + LD A,L ; Column low byte to A + CP VDUCOLS ; Error if out of + JP P,FCERR ; Range + LD B,E ; Rows to B LD E,L ; Columns to E - LD HL,-(VDUCOLS) ; SCREEN VDU address (0,0) + LD HL,-(VDUCOLS) ; Base VDU address (0,0) ADD HL,DE ; Add column to address LD DE,VDUCOLS ; Line to DE ADD80X: ADD HL,DE ; Multiply by lines @@ -4331,77 +4360,84 @@ POINTX: POP HL ; Drop return POINT0: LD B,0 ; Set zero JP POINTX ; Return value ; -; on entry STACK = RETURN ADDRESS, PIXEL COLUMN (0-159). DE=PIXEL ROW (0-74) -; on exit A=BYTE MASK, STACK= CHARACTER COLUMN (0-79). DE=ROW (0-24) +;---------------------------------------------------------------------- +; INITIALIZE VDU +;---------------------------------------------------------------------- ; -XYPOS: POP BC ; Get return address - POP HL ; Get the pixel column - LD A,L ; Change HL from a pixel - SRL A ; column to a character column - LD L,A ; by dividing by two. - SBC A,A ; If the pixel column is even - INC A ; then set the byte mask to 00000010 - ADC A,A ; if it is odd set mask to 00000001 - - PUSH HL ; Save the character column - PUSH BC ; Save the return address - - LD HL,(VDUROWS*3)-1; Get row to HL - SBC HL,DE ; C=0 from above - LD DE,-1 ; Zero line count - LD BC,3 ; 3 blocks per line -DIV3LP: SBC HL,BC ; Subtract 3 - INC DE ; Count the subtractions - JP P,DIV3LP ; More to do - - OR A ; HL is the remainder which defines - DEC BC ; which pixel row the mask should be on - ADC HL,BC ; HL = -1, 0, 1 and flags are set - - JR Z,BY4 ; Byte mask is in A and - RET P ; set for pixel row 0 - RLCA ; Move the mask to - RLCA ; pixel row 1 or 2 -BY4: RLCA ; based on the remainder - RLCA ; calculate above in HL +VDU_INIT: + LD HL,0 ; SET SCREEN START ADDRESS + LD C,12 + CALL VDU_WRREGX + LD C,14 ; SET CURSOR START ADDRESS + CALL VDU_WRREGX +; + LD HL,VDUSIZ ; CLEAR SCREEN +VDU_FILL: + LD C,18 + CALL VDU_WRREGX + LD A,31 + OUT (VDUREG),A + CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY + LD A,' ' + OUT (VDURWR),A + LD A,H + OR L + DEC HL + JR NZ,VDU_FILL RET ; -; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION +;---------------------------------------------------------------------- +; WAIT FOR VDU TO BE READY FOR A DATA READ/WRITE +;---------------------------------------------------------------------- ; -PRTDEC: - PUSH BC - PUSH DE - PUSH HL - LD E,'0' - LD BC,-10000 - CALL PRTDEC1 - LD BC,-1000 - CALL PRTDEC1 - LD BC,-100 - CALL PRTDEC1 - LD C,-10 - CALL PRTDEC1 - LD E,0 - LD C,-1 - CALL PRTDEC1 - POP HL - POP DE - POP BC - RET -PRTDEC1: - LD A,'0' - 1 -PRTDEC2: - INC A - ADD HL,BC - JR C,PRTDEC2 - SBC HL,BC - CP E - JR Z,PRTDEC3 - LD E,0 - CALL MONOUT -PRTDEC3: +VDU_WAITRDY: + IN A,(VDUSTS) ; READ STATUS + OR A ; SET FLAGS + RET M ; IF BIT 7 SET, THEN READY! + JR VDU_WAITRDY ; KEEP CHECKING +; +;---------------------------------------------------------------------- +; UPDATE SY6845 REGISTERS +; VDU_WRREG WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C +; VDU_WRREGX WRITES VALUE IN HL TO VDU REGISTER PAIR IN C, C+1 +;---------------------------------------------------------------------- +; +VDU_WRREG: + PUSH AF ; SAVE VALUE TO WRITE + LD A,C ; SET A TO VDU REGISTER TO SELECT + OUT (VDUREG),A ; WRITE IT TO SELECT THE REGISTER + POP AF ; RECOVER VALUE TO WRITE + OUT (VDUDTA),A ; WRITE IT + RET +; +VDU_WRREGX: + LD A,H ; SETUP MSB TO WRITE + CALL VDU_WRREG ; DO IT + INC C ; NEXT VDU REGISTER + LD A,L ; SETUP LSB TO WRITE + JR VDU_WRREG ; DO IT & RETURN +; +VDU_RDHL: + LD C,18 ; READ A BYTE + CALL VDU_WRREGX ; FROM VIDEO MEMORY + LD A,31 ; POINTED TO BY HL + OUT (VDUREG),A ; AND RETURN IT IN A + CALL VDU_WAITRDY + IN A,(VDURRD) + RET + +VDU_WRHL: + PUSH AF ; WRITE A BYTE IN A + LD C,18 ; TO VIDEO MEMORY + CALL VDU_WRREGX ; POINTED TO BY HL + LD A,31 + OUT (VDUREG),A + CALL VDU_WAITRDY + POP AF + OUT (VDURWR),A RET - +; +#ENDIF ; INPUT CHARACTER FROM CONSOLE VIA HBIOS GETINP: @@ -4662,7 +4698,9 @@ MONITR: LD A,BID_BOOT ; BOOT BANK INITST: LD A,0 ; Clear break flag LD (BRKFLG),A CALL SET_DUR_TBL ; SET UP SOUND TABLE - CALL SET_ECB_VDU ; SET AND CLEAR VDU SCREEN 0 +#IF VDUGFX + CALL VDU_INIT ; SET AND CLEAR VDU SCREEN 0 +#ENDIF JP INIT ARETN: RETN ; Return from NMI @@ -4931,83 +4969,6 @@ FRQDURTBL: ; FDTBSIZ .EQU ($-FRQDURTBL)/4 ; -;---------------------------------------------------------------------- -; INITIALIZE VDU -;---------------------------------------------------------------------- -; -SET_ECB_VDU: - LD HL,0 ; SET SCREEN START ADDRESS - LD C,12 - CALL VDU_WRREGX - LD C,14 ; SET CURSOR START ADDRESS - CALL VDU_WRREGX -; - LD HL,VDUSIZ ; CLEAR SCREEN -VDU_FILL: - LD C,18 - CALL VDU_WRREGX - LD A,31 - OUT (VDUREG),A - CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY - LD A,' ' - OUT (VDURWR),A - LD A,H - OR L - DEC HL - JR NZ,VDU_FILL - RET -; -;---------------------------------------------------------------------- -; WAIT FOR VDU TO BE READY FOR A DATA READ/WRITE -;---------------------------------------------------------------------- -; -VDU_WAITRDY: - IN A,(VDUSTS) ; READ STATUS - OR A ; SET FLAGS - RET M ; IF BIT 7 SET, THEN READY! - JR VDU_WAITRDY ; KEEP CHECKING -; -;---------------------------------------------------------------------- -; UPDATE SY6845 REGISTERS -; VDU_WRREG WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C -; VDU_WRREGX WRITES VALUE IN HL TO VDU REGISTER PAIR IN C, C+1 -;---------------------------------------------------------------------- -; -VDU_WRREG: - PUSH AF ; SAVE VALUE TO WRITE - LD A,C ; SET A TO VDU REGISTER TO SELECT - OUT (VDUREG),A ; WRITE IT TO SELECT THE REGISTER - POP AF ; RECOVER VALUE TO WRITE - OUT (VDUDTA),A ; WRITE IT - RET -; -VDU_WRREGX: - LD A,H ; SETUP MSB TO WRITE - CALL VDU_WRREG ; DO IT - INC C ; NEXT VDU REGISTER - LD A,L ; SETUP LSB TO WRITE - JR VDU_WRREG ; DO IT & RETURN -; -VDU_RDHL: - LD C,18 ; READ A BYTE - CALL VDU_WRREGX ; FROM VIDEO MEMORY - LD A,31 ; POINTED TO BY HL - OUT (VDUREG),A ; AND RETURN IT IN A - CALL VDU_WAITRDY - IN A,(VDURRD) - RET - -VDU_WRHL: - PUSH AF ; WRITE A BYTE IN A - LD C,18 ; TO VIDEO MEMORY - CALL VDU_WRREGX ; POINTED TO BY HL - LD A,31 - OUT (VDUREG),A - CALL VDU_WAITRDY - POP AF - OUT (VDURWR),A - RET -; #IF VT100 VT_CLS .BYTE ESC,"[2J",ESC,"[H",0 ; vt100 clear screen & home #ENDIF