TITLE 'VBIOS -- CP/M COMPATABLE VB3 VIDEO DRIVER' * * "VBIOS"; Rev 0; Written by Ben L Gee; Dec 9, 1979 * * VBIOS is a driver for the SSM VB3 video board. VBIOS contains * only enough code to run CP/M and some CP/M programs. If a more * intelligent driver is required then you should consider ICRT. * *** DEFINE SOME SYSTEM EQUATES. * ROM EQU 0E000H ;BEGINNING OF ROMMABLE CODE FALSE EQU 0 TRUE EQU NOT FALSE *** MOST PEOPLE WILL BE ABLE TO USE ONE OF THE FOLLOWING STANDARD * CONFIGURATIONS. IF NOT THEN YOU MUST WRITE YOUR OWN. REFER TO * THE VB3 USER'S GUIDE FOR THE NEEDED INFORMATION. * TO CHOOSE A CONFIGURATION SIMPLE REMOVE THE "*" FROM COL 1. * MACLIB X64X16 ;64x16, NON-INTERLACED (SAME AS VB1). * MACLIB X80X24 ;80x24, INTERLACED (TV STANDARDS). * MACLIB X80X33 ;SAME AS 80x24 BUT MORE LINES. * MACLIB X80X38 ;STILL MORE LINES. * MACLIB X80X51 ;EXAMPLE OF LOTS OF LINES. * MACLIB X132X28 ;EXAMPLE OF A WIDE SCREEN. MACLIB X ;CUSTOM CONFIGURATION. NORMAL EQU 3 ;NORMAL ATTRIBUTE IF NCOLS=20 CODE EQU 0 ENDIF IF NCOLS=32 CODE EQU 1 ENDIF IF NCOLS=40 CODE EQU 2 ENDIF IF NCOLS=64 CODE EQU 3 ENDIF IF NCOLS=72 CODE EQU 4 ENDIF IF NCOLS=80 CODE EQU 5 ENDIF IF NCOLS=96 CODE EQU 6 ENDIF IF NCOLS=132 CODE EQU 7 ENDIF *** DEFINE SOME ASCII VALUES * BS EQU 08H LF EQU 0AH CR EQU 0DH PAGE *** VIDEO DRIVER SUBROUTINES * * ENTRIES POINTS ARE: * * VBINIT - TO INITALIZE THE HARDWARE AND SOFTWARE * VBIN - TO GET A KEYSTROKE FROM THE KEYBOARD * VBOUT - TO OUTPUT A CHARACTER TO THE VIDEO * VBSTAT - TO STATUS THE KEYBOARD * * CALLING SEQUENCES: * * CALL VBINIT * * CALL VBIN * STA KEYSTROKE ;RESULT IN REGISTER A * * LDA DATA ;OUTPUT CHARACTER IN REG C * MOV C,A * CALL VBOUT * * CALL VBSTAT ;RETURNS REG A = 0 IF * ;NO KEYSTROKE AVAILABLE, ELSE * ;RETURNS REG A = 0FFH. * JMP VBINIT JMP VBIN JMP VBOUT JMP VBSTAT VBINIT: OUT KSTAT ;ENABLE THE VB3 BOARD. LXI H,0 CALL EEOS ;CLEAR THE SCREEN CALL CURON ;PUT THE CURSOR ON THE SCREEN ; INITALIZE ALL OF THE CONTROL REGISTERS OUT VTAC+14 OUT VTAC+10 ;RESET THE VTAC MVI A,HCOUNT-1 OUT VTAC+0 MVI A,(INTERLACED*128)+0111$100B OUT VTAC+1 IF CRT5027 OR NOT INTERLACED MVI A,(SCANR-1)*8+CODE ELSE MVI A,(SCANR-2)*8+CODE ENDIF OUT VTAC+2 MVI A,SKEW*64+NROWS-1 OUT VTAC+3 IF INTERLACED MVI A,(SCANF-513)/2 ELSE MVI A,(SCANF-256)/2 ENDIF OUT VTAC+4 MVI A,(SCANF-NROWS*SCANR)/4+8 OUT VTAC+5 ;TRY TO CENTER THE DATA ONTO THE SCREEN OUT VTAC+14 ;START TIMING CHAIN. OUT KDATA ;DISABLE THE VB3 BOARD RET VBSTAT: IN KSTAT ;STATUS THE KEYBOARD CMA ANI 1 RZ ;RETURN A ZERO IF NO DATA IS AVAILABLE MVI A,0FFH RET ;ELSE RETURN A 0FFH. VBIN: CALL VBSTAT ;RETURN THE NEXT KEY FROM THE KEYBOARD JZ VBIN ;WAIT UNTIL ONE IS AVAILABLE IN KDATA ;GET IT RET ; AND RETURN. ; VBOUT IS THE MAIN DISPLAY DRIVER FOR THE VB3 BOARD VBOUT: PUSH H ;FIRST, SAVE ALL REGISTERS PUSH D PUSH B OUT KSTAT ;AND ENABLE THE VB3 BOARD CALL CUROFF ;THEN, TURN OFF THE CURSOR CALL PROCESS ;AND PROCESS THE CHARACTER. CALL CURON ;NOW, TURN THE CURSOR BACK ON, OUT KDATA ;DISABLE THE VB3 BOARD, POP B ;AND RESTORE THE REGISTERS. POP D POP H RET ; ON ENTRY, REG HL = LOGICAL CURSOR ADDRESS AND REG C = DATA. PROCESS: MOV A,C ;MOVE THE DATA TO REG A. ANI 7FH ;STRIP PARITY AND SET FLAGS RZ ;SKIP NULLS. CPI CR ;CHECK FOR CONTROL CHARACTERS. JZ DOCR ;IF MATCH, THE DO CONTROL CHARACTER. CPI LF JZ DOLF CPI BS JZ DOBS ; MUST BE A DATA CHARACTER. PUSH H ;SAVE THE LOGICAL CURSOR ADDRESS. CALL GETBA ;GET THE PHYSICAL CURSOR ADDRESS. MOV M,C ;PUT THE DATA THERE. LXI D,OFFSET DAD D ;COMPUTE THE ADDRESS OF THE GOVERNING ATTRIBUTE POP H ;GET THE LOGICAL CURSOR ADDRESS BACK. CALL RIGHT ;MOVE THE CURSOR RIGHT. RNZ ;DONE IF THE CURSOR DIDN'T WRAP AROUND. ; PUT THE CURSOR ON COLUMN 1 OF THE CURRENT LINE. DOCR: MVI L,0 ;PUT THE CURSOR ON COL 1 OF THE NEXT LINE RET ; PUT THE CURSOR ON THE NEXT LINE, BLANK THE LINE. DOLF: CALL DOWN ;MOVE THE CURSOR DOWN ONE LINE. PUSH H ;SAVE THE CURSOR ADDRESS. MVI L,0 ;PUT THE CURSOR ON COL 1. CALL EEOL ;ERASE TO THE END OF THE LINE. POP H ;RESTORE THE CURSOR ADDRESS. RET ;RETURN TO CALLER. ; ERASE FROM THE CURSOR TO THE END OF THE CURRENT LINE. EEOL: MVI A,NCOLS SUB L MOV B,A MVI C,1 * JMP ERASE ; ERASE THE SCREEN BEGINNING AT THE CURSOR POSITION. THE NUMBER OF CHARACTERS ; TO ERASE IS IN REG BC. ERASE: PUSH H ERASE1: PUSH H CALL GETBA LXI D,OFFSET XCHG DAD D XCHG MVI A,NORMAL ;USE THE NORMAL ATTRIBUTE ERASE2: MVI M,' ' STAX D INX H INX D DCR B JNZ ERASE2 POP H MVI L,0 CALL DOWN MVI B,NCOLS DCR C JNZ ERASE1 POP H RET ; BACK THE CURSOR BY ONE POSITION. DOBS: CALL LEFT RNZ * JMP UP ; MOVE THE CURSOR UP. UP: MOV A,H DCR H ORA A RNZ MVI H,NROWS-1 RET ; MOVE THE CURSOR DOWN. DOWN: INR H MVI A,NROWS CMP H RNZ MVI H,0 RET ; MOVE THE CURSOR LEFT. LEFT: MOV A,L DCR L ORA A RNZ MVI L,NCOLS-1 RET ; MOVE THE CURSOR RIGHT. RIGHT: INR L MVI A,NCOLS CMP L RNZ MVI L,0 RET ; ERASE FROM THE CURSOR POSITION TO THE END OF THE SCREEN. EEOS: MVI A,NCOLS SUB L MOV B,A MVI A,NROWS SUB H MOV C,A JMP ERASE ; TURN THE CURSOR ON. ; THE LOGICAL ADDRESS OF THE CURSOR MUST BE IN REG HL. CURON: MOV A,L OUT VTAC+12 MOV A,H OUT VTAC+13 OUT VTAC+6 ;MAKE SURE THE CURSOR IS ON THE BOTTOM. RET ; TURN THE CURSOR OFF. ; THE LOGICAL ADDRESS OF THE CURSOR IS RETURNED IN REG HL. CUROFF: IN VTAC+9 ;READ THE COLUMN REGISTER MOV L,A ;TO REG L IN VTAC+8 ;READ THE ROW REGISTER MOV H,A ;TO REG H MVI A,0FFH ;MOVE THE CURSOR OFF THE SCREEN OUT VTAC+12 RET ; CONVERT A LOGICAL ADDRESS TO A PHYSICAL ADDRESS. ; ON ENTRY, HL CONTAINS THE LOGICAL ADDRESS. ; ON EXIT, HL CONTAINS THE PHYSICAL ADDRESS. ; A LOGICAL ADDRESS IS IN THE FORM (ROW, COLUMN) WITH ROW IN REG H AND COLUMN ; IN REG L. ROW MUST BE IN THE RANGE OF 0 TO NROWS-1 AND COLUMN MUST BE IN ; THE RANGE OF 0 TO NCOLS-1. ; A PHYSICAL ADDRESS IS THE ACTUAL MEMORY ADDRESS IN THE VIDEO MEMORY. GETBA: PUSH D PUSH B XCHG INR D LXI H,-NCOLS LXI B,NCOLS GETBA2: DAD B DCR D JNZ GETBA2 DAD D LXI D,VIDEO DAD D POP B POP D RET END START