;INITIALIZE THE VB3 AT ANY ADDRESS. ;WRITTEN BY MALCOLM WRIGHT, 2-24-80 ;REV. 1.4, 8-21-80 BY M. T. WRIGHT ;THE USER WILL BE ASKED QUESTIONS ABOUT EACH ;PARAMETER TO BE PASSED TO THE VB3. ; PORT ADDRESS ; NO. OF ROWS ; LINES PER CHARACTER ; NUMBER OF CHARACTERS ; INTERLACED? ; SCAN FILL-IN PER FRAME ; HCOUNTS FOR HORIZ. LINE ; HORIZONTAL POSITION ; TOP MARGIN ;GENERAL DATA CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED LOC EQU 100H ;START OF PROGRAM STACK EQU LOC ;TOP OF STACK VTAC EQU 0D0H ;VB3 CRT CHIP PORT KSTAT EQU 0E0H ;VB3 KYBD STATUS BDOS EQU 5 ;CP/M ENTRY BOOT EQU 0 ;CP/M BOOT ADDRESS ORG LOC ;MAIN ENTRY POINT INZ0: LXI SP,STACK LXI D,STR13 ;MAIN TITLE CALL CSTNG LXI D,STR14 ;VB3 MEMORY ADDRESS? CALL CSTNG INZ00: CALL CNVHEX ORA A JNZ INZ00 MOV A,L ORA H ;HL=0? THEN SKIP JZ INZ1 SHLD MEMR ;SET VB3 ADDRESS ; ;SELECT INITIALIZE MODE INZ1: LXI D,STR10 CALL CSTNG LXI H,11 ;MAX. MENU SIZE SHLD LIMIT INZ2: CALL CNVNUM ORA A JNZ INZ2 MOV A,L CPI 0 JZ BOOT CPI 1 JZ INZ5 ;SET UP NEW VB3 DATA CPI 2 JZ USR2 ;PRINT USER NUMBERS CPI 3 JZ INZ3 ;SET KEYBOARD PORT CPI 4 JZ INZY ;FILL VB3 WITH PATTERN CPI 5 JZ USR1 ;PRINT VALUES PICKED CPI 6 JZ INZX ;XMIT DATA CALL PICK1 ;PICK A STANDARD MODE JMP INZ22 ;SET KEYBOARD PORT ADDRESS. INZ3: LXI D,STR1 ;PORT ADDR? CALL CSTNG INZ4: CALL CNVHEX ;GET HEX ADDRESS ORA A JNZ INZ4 MOV A,L ;GET PORT ADDRESS ORA A ;TEST FOR ZERO JZ INZ3 ;RE-TRY IF ZERO CALL SET1 ;SET-UP I/O JMP INZ1 ;SPECIAL SET-UP FOR VB3 BOARD. ;NUMBER OF CHARCTERS INZ5: LXI D,STR30 ;NUMBER OF CHARACTERS? CALL CSTNG LXI H,8 ;MAX. MENU NUMBER SHLD LIMIT INZ6: CALL CNVNUM ORA A JNZ INZ6 ;ERROR MOV A,L ORA A JZ INZ7 ;SKIP IF CARRIAGE-RET MOV A,L DCR A STA CODE CALL SET10 ;INTERLACED? INZ7: LXI D,STR4 ;INTERLACED? CALL CSTNG INZ8: CALL CONIN ANI 5FH CPI 'N' JZ INZ9 CPI CR JZ INZ10 ;IF "CR", THEN SKIP CPI 'Y' JNZ INZ7 INZ9: CALL SET4 ;NUMBER OF ROWS INZ10: LXI D,STR2 ;"ROWS" CALL CSTNG LXI H,51 ;MAX. ROWS POSSIBLE SHLD LIMIT INZ11: CALL CNVNUM ;GET NUMBER ORA A JNZ INZ11 ;JUMP IF ERROR MOV A,L ORA A JZ INZ12 ;IF A=0, SKIP ROW NO. CALL SET2 ;SET-UP ROW NO. ;NUMBER OF RASTER LINES INZ12: LXI D,STR3 ;RASTER LINES PER CHAR. CALL CSTNG LXI H,15 ;MAX. RASTER SHLD LIMIT INZ13: CALL CNVNUM ;GET RASTER ORA A JNZ INZ13 MOV A,L ORA A JZ INZ14 ;IF A=0, SKIP RASTER NO. CALL SET3 ;SCANS PER FRAME? INZ14: LXI D,STR5 ;SCAN LINES CALL CSTNG LXI H,700 ;MAX. LINES SHLD LIMIT INZ15: CALL CNVNUM ORA A JNZ INZ15 MOV A,L ORA H JZ INZ16 ;IF HL=0 THEN SKIP MOV A,H ORA A ;LESS THAN 256? JZ INZ14 CALL SET5 ;HCOUNTS INZ16: LXI D,STR6 CALL CSTNG LXI H,200 ;MAX. HCOUNT SHLD LIMIT INZ17: CALL CNVNUM ORA A JNZ INZ17 MOV A,L ORA A JZ INZ18 ;IF A=0, SKIP "HCOUNT" CPI 85 ;ABSOLUTE MINIMUM ALLOWED JC INZ16 ;TOO SMALL? CALL SET6 ;HORIZONTAL POSITION INZ18: LXI D,STR7 ;HORIZ. POSITION CALL CSTNG LXI H,22 ;MAX. POSITION SHLD LIMIT INZ19: CALL CNVNUM ORA A JNZ INZ19 MOV A,L ORA A JZ INZ20 ;IF A=0, SKIP HORIZ. CPI 2 ;COMPARE AGAINST MIN. JC INZ18 CALL SET7 ;TOP MARGIN INZ20: LXI D,STR11 ;MARGIN? CALL CSTNG LXI H,100 SHLD LIMIT INZ21: CALL CNVNUM ORA A JNZ INZ21 MOV A,L ORA A JZ INZ22 ;IF A=0, SKIP MARGIN CALL SET8 ; ;LAST CHANCE TO CHANGE! INZ22: LXI D,STR12 ;ANY OTHER CHANGES? CALL CSTNG INZ23: CALL CONIN ANI 5FH CPI 'Y' JZ INZ5 ;START SPECIAL CPI 'N' JNZ INZ22 CALL SET9 ;MAKE UP DATA TABLE ; INZX: CALL TON ;TURN-ON VB3 LXI H,X80YY ;POINT TO MAIN BUFFER CALL VDATA ;SEND TO VB3 CALL TOFF ;TURN-OFF VB3 JMP INZ1 ;AGAIN? ;OUTPUT TEST PATTERN TO VB3. INZY: INZY2: CALL TON ;TURN-ON VB3 LXI D,NSTR0 ;TITLE LHLD MEMR CALL VSTNG1 MVI C,27 CALL VSPC1 ;OUTPUT SPACES ; LXI D,NSTR1 ;ALPHA CALL VSTNG1 MVI C,23 CALL VSPC1 ;OUTPUT SPACES MVI B,3 ;SET ATTR. BYTE CALL VASC1 ;OUTPUT ASCII CHAR. ; LXI D,NSTR2 ;INVERT DATA CALL VSTNG1 MVI C,14 CALL VSPC1 MVI B,7 CALL VASC1 ; LXI D,NSTR3 ;FLASH ALPHA CALL VSTNG1 MVI C,17 CALL VSPC1 MVI B,23H CALL VASC1 ; LXI D,NSTR4 ;INVERT ALPHA CALL VSTNG1 MVI C,15 CALL VSPC1 MVI B,87H CALL VASC1 ; LXI D,NSTR5 ;UNDERLINE ALPHA CALL VSTNG1 MVI C,13 CALL VSPC1 MVI B,13H CALL VASC1 ; LXI D,NSTR6 ;GRAPHICS CALL VSTNG1 MVI C,20 CALL VSPC1 MVI B,0 CALL VASC1 ; LXI D,NSTR7 ;INVERTED FLASH CALL VSTNG1 MVI C,14 CALL VSPC1 MVI B,27H CALL VASC1 ; LXI D,NSTR8 ;THIN-LINE GRAPHICS CALL VSTNG1 MVI C,10 CALL VSPC1 MVI B,2 CALL VASC1 ; LXI D,NSTR9 ;STRIKE-THRU CALL VSTNG1 MVI C,17 CALL VSPC1 MVI B,43H CALL VASC1 ; LXI D,NSTR10 ;BLANK-OUT CALL VSTNG1 MVI C,19 CALL VSPC1 MVI B,0BH CALL VASC1 ; LXI D,NSTR11 ;INVERTED FLASH GRAY CALL VSTNG1 MVI C,9 CALL VSPC1 MVI B,0A7H CALL VASC1 ; LXI D,NSTR12 ;ALPHA CALL VSTNG1 MVI C,23 CALL VSPC1 MVI B,3 CALL VASC1 ; LXI D,NSTR13 ;GRAY ALPHA CALL VSTNG1 MVI C,18 CALL VSPC1 MVI B,83H CALL VASC1 ; LXI D,NSTR14 ;FLASH GRAPHICS CALL VSTNG1 MVI C,14 CALL VSPC1 MVI B,20H CALL VASC1 ; LXI D,NSTR15 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR16 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR17 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR18 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR19 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR20 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR21 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR22 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR23 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR24 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ; LXI D,NSTR25 ;SPARE CALL VSTNG1 MVI C,151 CALL VSPC1 ;51 ST LINE ; CALL TOFF ;TURN-OFF VB3 JMP INZ1 ;GO BACK FOR MORE ;********** SUBROUTINES ********** ;CONSOLE ROUTINES CONST: MVI C,11 ;TEST STATUS, A>0 FOR TRUE JMP BDOS CONIN: MVI C,1 ;CONSOLE INPUT JMP BDOS CONOT: MVI C,2 ;CONSOLE OUTPUT JMP BDOS CSTNG: MVI C,9 ;PRINT STRING JMP BDOS ; D&E=STRING ADDR. ;ON / OFF CONTROL OF THE VB3 BOARD. TON: OUT KSTAT ;TURN-ON VB3 RET TOFF: OUT KSTAT+1 ;TURN-OFF VB3 RET ;CONVERT NUMBERS INPUTTED IN ASCII INTO ;A BINARY NUMBER. ;ENTER WITH: ; "LIMIT" SET TO MAX. NUMBER (<65535) ;EXITS WITH: ; REG.-A = 0 IF A NUMBER ; REG.-H&L = NUMBER ; PRINTS "ERROR" IF PROBLEMS CNVNUM: LXI H,0 ;START WITH ZERO CN1: PUSH H ;SAVE NUMBER CALL CONIN ;INPUT CHARACTERS POP H ;RESTORE NUMBER ANI 7FH ;REMOVE MSB MOV C,A SUI CR ;CARRIAGE-RET? RZ ;IF DONE, RETURN MOV A,C CALL TSTNUM ;IS IT A NUMBER? ORA A JNZ ERROR MOV A,C ANI 0FH ;SAVE LOWER 4 BITS MOV B,A MOV E,L MOV D,H DAD H ;X2 DAD H ;X4 DAD D ;X5 DAD H ;X10 MVI D,0 MOV E,B DAD D ;X10 + NEW NUMBER XCHG LHLD LIMIT ;MAX. NUMBER ALLOWED CALL COMPR ;TEST LIMIT ORA A ;TEST RESULTS XCHG JZ ERROR JMP CN1 ;TEST CHARACTER TO SEE IF IT IS A NUMBER. ;ENTER WITH: ; REG.-A = CHARACTER ;EXITS WITH: ; REG.-A = 0 IF A NUMBER ; REG.-C = NUMBER TSTNUM: MOV C,A ;GET CHARACTER CPI '0' MVI A,1 RC MOV A,C CPI '9'+1 CMC MVI A,1 RC XRA A RET ;CONVERT INPUTTED ASCII CHARACTERS IN A HEX ;NUMBER. ;EXIT WITH: ; REG.-A = 0 IF NO PROBLEMS ; REG.-H&L = HEX NUMBER CNVHEX: LXI H,0 CH1: PUSH H ;SAVE HEX NUMBER CALL CONIN POP H ;RESTORE HEX NUMBER ANI 7FH ;REMOVE MSB MOV C,A SUI CR ;CARRIAGE RET? RZ MOV A,C CALL TSTNUM ;IS IT A NUMBER? ORA A MOV A,C JZ CH2 ;JUMP IF A NUMBER CALL TSTLTR ;IS IT A HEX LETTER ORA A MOV A,C JNZ ERROR SUI 37H ;REDUCE A = 10, ETC. CH2: ANI 0FH MOV C,A DAD H ;SHIFT LEFT DAD H DAD H DAD H MOV A,L ANI 0F0H ;CLEAR SPACE FOR DIGIT ORA C MOV L,A JMP CH1 ;TEST THE CHARACTER FOR A HEX LETTER.(A THRU F) ;ENTER WITH: ; REG.-A = CHARACTER ;EXITS WITH: ; REG.-A = 0 IF A HEX LETTER ; REG.-C = HEX CHARACTER TSTLTR: MOV C,A ;SAVE CHARACTER CPI 'A' MVI A,1 RC MOV A,C CPI 'F'+1 CMC MVI A,1 RC XRA A RET ;COMPARE H&L WITH D&E. ;IF HL > DE, THEN A=1 COMPR: MOV A,L SUB E MOV A,H SBB D MVI A,1 RNC MVI A,0 RET ;CONVERT REG.-A INTO A HEX VALUE & PRINT IT. ;ENTER WITH VALUE IN REG.-A PHEX: MVI C,2 HEX0: RRC RRC RRC RRC MOV B,A ANI 0FH CPI 10 JC HEX1 ADI 7 ;CONVERT TO LETTER HEX1: ADI 30H ;CONVERT TO ASCII MOV E,A PUSH B CALL CONOT ;PRINT IT POP B MOV A,B DCR C JNZ HEX0 RET ;OUTPUT A CHARACTER STRING TO THE VB3. ;ALL STRINGS SHOULD END WITH A NULL. ;ENTER WITH: ; DE = SOURCE ADDRESS ; HL = DESTINATION ADDRESS (VB3) VSTNG1: MVI B,3 ;SET ATTRIBUTE ;ALTERNATE ENTRY ; B = ATTRIBUTE BYTE VSTNG2: LDAX D ;GET CHARACTER ORA A ;TEST FOR NULL RZ ;RET IF NULL MOV M,A ;SET CHARACTER PUSH D XCHG LXI H,1000H ;ATTR. DELTA ADDR. DAD D MOV M,B ;SET ATTRIBUTE XCHG POP D INX D INX H JMP VSTNG2 ;OUTPUT ALL 128 POSSIBLE ASCII CODES. ;ENTER WITH: ; B = ATTRIBUTE BYTE ; HL = DESTINATION ADDRESS (VB3) VASC1: XRA A ;A=0 MVI C,128 ;COUNT = 128 BYTES XCHG LXI H,1000H DAD D VASC2: STAX D ;SET CHARACTER MOV M,B ;SET ATTRIBUTE INX D INX H INR A ;INCREMENT CHAR. CODE DCR C JNZ VASC2 XCHG RET ;OUTPUT "SPACES" TO THE VB3. ;ENTER WITH: ; C = BYTE COUNT ; HL = DESTINATION ADDRESS (VB3) VSPC1: MVI A,' ' ;SPACE MVI B,3 ;ATTRIBUTE XCHG LXI H,1000H DAD D VSPC2: STAX D MOV M,B INX D INX H DCR C JNZ VSPC2 XCHG RET ;SET-UP VB3 BANK-SWITCH PORT. SET1: STA TON+1 INR A STA TOFF+1 RET ;SET THE ROW VALUE SET2: DCR A STA ROW RET ;SET THE RASTER LINES PER CHAR. SET3: DCR L ;IF NON-INTERLACED LDA ILACED ANI 80H ;TEST INTERLACED BIT JZ S31 DCR L ;IF INTERLACED (-2) S31: MOV A,L ADD A ;X2 ADD A ;X4 ADD A ;X8 ANI 78H ;MASK OFF DATA MOV B,A LDA CODE ;GET NO. OF CHAR. ORA B STA RASTER RET ;SET INTERLACE MODE SET4: ANI 1 RRC MOV B,A LDA ILACED ANI 7FH ORA B STA ILACED RET ;SET RASTER FILL-IN VALUE. SET5: LDA ILACED ANI 80H LXI D,-513 ;IF INTERLACED JNZ S51 LXI D,-256 ;IF NON-INTERLACED S51: DAD D XRA A MOV A,H RAR MOV H,A MOV A,L RAR STA SCANF ;SCAN FILL-IN RET ;SET HCOUNT FOR RASTER LENGTH SET6: DCR A STA HCOUNT RET ;SET HORIZONTAL POSITION. SET7: CPI 10H MVI B,1 JC S71 SUI 0EH MOV B,A MVI A,0FH S71: ADD A ;MOVE LEFT ONE ADD A ;DITTO ADD A ;DITTO ORA B MOV B,A LDA ILACED ANI 80H ORA B STA ILACED RET ;SET TOP MARGIN. SET8: STA MARGIN RET ;TRANSFER ALL DATA TO MAIN BUFFER. SET9: LXI H,X80YY LXI D,HCOUNT MVI B,6 S91: LDAX D ;TRANSFER 6 BYTES MOV M,A ; TO X80YY INX D INX H DCR B JNZ S91 ; LDA ROW MOV B,A MOV M,A ;SET BOTTOM LINE INX H XRA A MOV M,A ;SET CURSOR LEFT INX H MOV M,B ;SET CURSOR BOTTOM RET ;SET THE NUMBER OF CHARACTERS. SET10: MOV B,A ;SAVE CODE LDA RASTER ANI 0F8H ;REMOVE OLD CODE ORA B ;SET NEW CODE STA RASTER ;SAVE IT RET ;OUTPUT A TABLE OF VALUES THAT WAS USED TO ;SET UP THE VB3 AS DEFINED BY THE USER. USR1: MVI A,VTAC ;SET VB3 CTRL PORT STA USTBL ;SAVE IN TABLE LXI D,STR15 CALL CSTNG ;PRINT TITLE LXI D,STR16 CALL CSTNG LDA TON+1 CALL PHEX ;PRINT KEYB. PORT LXI D,STR19 CALL CSTNG MVI A,7 ;OUTPUT 6 BYTES LXI H,X80YY USR11: PUSH PSW PUSH H LXI D,STR16 ;PORT = ? CALL CSTNG LDA USTBL ;GET PORT ADDR. CALL PHEX ;PRINT PORT VALUE LDA USTBL INR A ;NEXT PORT ADDR. STA USTBL LXI D,STR17 CALL CSTNG ;VALUE= POP H PUSH H MOV A,M CALL PHEX ;PRINT HEX VALUE LXI D,STR18 CALL CSTNG POP H POP PSW INX H ;NEXT HEX VALUE DCR A ;FINISHED? JNZ USR11 ; USR12: LXI D,STR20 ;CR TO RETURN. CALL CSTNG USR13: CALL CONIN CPI 0DH JNZ USR13 ; JMP INZ1 USTBL: DB 0 ;TEMP FOR PORT ADDR. ;PRINT OUT THE VALUES THAT WOULD BE INPUTTED ;BY THE USER FOR MENU NUMBER 1. USR2: LXI D,STR21 ;'INTERLACED?' CALL CSTNG LDA X80YY+1 ORA A ;TEST INTERLACED BIT LXI D,STR22 ;NO JP USR21 LXI D,STR23 ;YES USR21: CALL CSTNG ; LXI D,STR24 ;'NUMBER OF ROWS' CALL CSTNG LDA X80YY+3 INR A ;+1 MOV L,A MVI H,0 CALL PRNUM ; LXI D,STR25 ;'NUMBER OF LINES PER CHAR.' CALL CSTNG LDA X80YY+2 RRC RRC RRC ANI 0FH ;NEED ONLY 4 BITS MOV L,A INR L LDA X80YY+1 ORA A ;TEST IF INTERLACED JP USR23 ;JUMP IF NOT INTERLACED INR L USR23: MVI H,0 CALL PRNUM ; LXI D,STR26 ;'SCANS PER FRAME' CALL CSTNG LDA X80YY+1 ;TEST INTERL. BIT ORA A LXI D,256 JP USR22 LXI D,513 USR22: LDA X80YY+4 ADD A ;X2 MOV L,A MVI H,0 DAD D CALL PRNUM ; LXI D,STR27 ;'HCOUNTS ACROSS' CALL CSTNG LDA X80YY INR A MVI H,0 MOV L,A CALL PRNUM ; LXI D,STR28 ;'HORIZONTAL POSITION' CALL CSTNG LDA X80YY+1 MOV B,A ANI 07H ;GET SYNC DELAY MOV C,A MOV A,B RRC RRC RRC ANI 0FH ;GET SYNC WIDTH ADD C ;TOTAL MOV L,A MVI H,0 CALL PRNUM ; LXI D,STR29 ;'TOP MARGIN' CALL CSTNG LDA X80YY+5 MOV L,A MVI H,0 CALL PRNUM JMP USR12 ;HIT CR TO RET ;PRINT A NUMBER PLACED IN H&L OUT AS ;A DECIMAL NUMBER. SUPPRESS ALL PRECEDING ZEROS. PRNUM: XRA A STA ZFLG ;CLEAR ZERO FLAG LXI D,100 CALL DIV ;DIVIDE BY 100 CALL ZTEST ;TEST FOR ZERO CALL PRIT ;PRINT IT LXI D,10 CALL DIV ;DIVIDE BY 10 CALL ZTEST ;TEST FOR ZERO CALL PRIT LXI D,1 CALL DIV ;DIVIDE BY 1 CALL ZTEST CALL PRIT RET ;DIVIDE D&E INTO H&L. ;SET A & E EQUAL TO THE ASCII DIFFERENCE. DIV: MVI C,-1 AND 0FFH DV1: INR C MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A JNC DV1 DAD D ;CORRECT NUMBER MVI A,30H ORA C MOV E,A RET ;TEST FOR REG-A EQUAL TO ZERO (ASCII). ZTEST: CPI 30H RZ STA ZFLG RET ZFLG: DB 0 ;PRINT OUT ASCII LETTERS IF ZERO FLAG IS ;GREATER THAN ZERO. PRIT: LDA ZFLG ORA A ;TEST FLAG RZ PUSH H ;SAVE REMAINDER CALL CONOT POP H RET ;PICK OUT SELECTED TABLE OF PARAMTERS ;H&L = POINTS TO SET-UP DATA FOR THE VB3 ;D&E = DESTINATION ADDRESS ;B = BYTE COUNTER ;REG.-A = NUMBER SELECTED. PICK1: LXI H,X8016 CPI 7 JZ PIC0 LXI H,X8018 CPI 8 JZ PIC0 LXI H,X8032 CPI 9 JZ PIC0 LXI H,X8038 CPI 10 JZ PIC0 LXI H,X8051 ; PIC0: LXI D,HCOUNT MVI B,6 ;SEND SIX BYTES PIC: MOV A,M STAX D ;STORE IN BUFFER INX H INX D DCR B JNZ PIC ;DONE YET? RET ;PASS PARAMETERS TO VB3. ;H&L = TABLE OF DATA VDATA: OUT VTAC+14 OUT VTAC+10 ;RASTER LENGTH MOV A,M OUT VTAC INX H ;SYNC & INTERLACE MOV A,M OUT VTAC+1 INX H ;NO. OF CHARACTERS MOV A,M OUT VTAC+2 INX H ;TEXT LINES MOV A,M OUT VTAC+3 INX H ;RASTER FILL-IN MOV A,M OUT VTAC+4 INX H ;SET TOP MARGIN MOV A,M OUT VTAC+5 INX H ;SET BOTTOM LINE MOV A,M OUT VTAC+6 INX H ;SET CURSOR (LEFT OR RIGHT) MOV A,M OUT VTAC+12 INX H ;SET CURSOR (TOP OR BOTTOM) MOV A,M OUT VTAC+13 ;START UP VB3 OUT VTAC+14 RET ;OUTPUT "ERROR" MESSAGE ERROR: LXI D,STR8 ;"ERROR" CALL CSTNG MVI A,1 RET ;PROGRAM PARAMETERS LIMIT: DW 1 MEMR: DW 0C000H ;VB3 MEMORY ADDR. CODE: DB 5 ;80 CHARACTERS ;TABLE OF DATA ;VALUES ARE CHANGED BY SET ROUTINES. ;TEMPORARY BUFFER. HCOUNT: DB 112 ILACED: DB 0D2H RASTER: DB 5DH ROW: DB 31 SCANF: DB 6 MARGIN: DB 1EH ;SPECIAL TABLE BUFFER. ;DATA SENT TO THE VB3. ;MAIN BUFFER. X80YY: DB 70H ;RASTER LENGTH DB 0D2H ;INTERLACED & HORIZ. POSITION DB 5DH ;LINES/CHAR. & 80 WIDE DB 1FH ;NO. OF TEXT LINES DB 6 ;SCAN FILL-IN DB 1EH ;TOP MARGIN DB 1FH ;BOTTOM LINE DB 0 ;CURSOR - X DB 1FH ;CURSOR - Y ;LIBRARY OF VB3 MODES. X8016: DB 70H ;US DB 53H DB 65H DB 0FH DB 3 DB 26H X8018: DB 70H ;US DB 53H DB 65H DB 11H DB 3 DB 1CH X8032: DB 70H ;US DB 0D2H DB 5DH DB 1FH DB 6 DB 1EH X8038: DB 70H ;US DB 0BCH DB 5DH DB 25H DB 6 DB 9 X8051: DB 6CH ;NON-STANDARD RATE DB 0BCH DB 45H DB 32H DB 10H DB 9 ;TABLE OF STRINGS STR1: DB CR,LF,LF,'WHATS THE STATUS PORT ADDRESS' DB ' OF THE VB3? (HEX)','$' STR2: DB CR,LF,LF,'HOW MANY ROWS VERTICALLY?' DB ' (DECIMAL, 1 TO 51)','$' STR3: DB CR,LF,LF,'HOW MANY RASTER LINES PER CHARACTER?' DB ' (DECIMAL, 10 TO 15)','$' STR4: DB CR,LF,LF,'IS THE VIDEO TO BE INTERLACED?' DB ' (Y=YES, N=NO)','$' STR5: DB CR,LF,LF,'HOW MANY SCANS PER FRAME?' DB ' (DECIMAL, 256 TO 625)','$' STR6: DB CR,LF,LF,'HOW MANY HCOUNTS ACROSS THE SCREEN' DB '? (DECIMAL, US=113, EUR=114)','$' STR7: DB CR,LF,LF,'HORIZONTAL POSITION (2 TO 22)?','$' STR8: DB CR,LF,'ERROR',2CH,' PLEASE RE-TYPE ','$' STR9: DB CR,LF,LF,'DO YOU WISH TO INITIALIZE ' DB 'ANOTHER VB3?' DB CR,LF,' (Y = YES OR N = NO)','$' STR10: DB CR,LF,LF,'SELECT ONE OF THE FOLLOWING MODES ' DB 'FOR THE VB3.' DB CR,LF,' 0 = EXIT TO CP/M' DB CR,LF,' 1 = USER DEFINED INITIALIZATION' DB CR,LF,' 2 = PRINT USER INITIALIZATION' DB CR,LF,' 3 = CHANGE KEYBOARD PORT' DB CR,LF,' 4 = FILL WITH TEST PATTERN (80 CHAR.)' DB CR,LF,' 5 = PRINT OUT VB3 VALUES' DB CR,LF,' 6 = SEND VB3 VALUES' DB CR,LF,' 7 = 80 X 16 LINES' DB CR,LF,' 8 = 80 X 18 LINES' DB CR,LF,' 9 = 80 X 32 LINES' DB CR,LF,' 10= 80 X 38 LINES' DB CR,LF,' 11= 80 X 51 LINES (ALL CAPS)' DB '$' STR11: DB CR,LF,LF,'SET THE TOP MARGIN (1-50) ','$' STR12: DB CR,LF,LF,'DO YOU WANT TO MAKE ANY' DB ' OTHER CHANGES? ','$' STR13: DB CR,LF,LF,' ********** INITIALIZE THE VB3 **********' DB CR,LF,'THIS PROGRAM WILL INITIALIZE A VB3 BOARD AT ANY' DB CR,LF,'KEYBOARD PORT ADDRESS TO A PRESET CONFIGURATION' DB CR,LF,'OR A USER DEFINED CONFIGURATION. THE KEYBOARD STATUS' DB CR,LF,'PORT WILL PRECEDE THE DATA PORT (LIKE STATUS=E0,' DB CR,LF,'THEN DATA=E1). THIS PROGRAM WILL SUPPORT VB3',27H,'S SET' DB CR,LF,'UP FOR I/O BANK SWITCHING. THIS ROUTINE IS USEFUL' DB CR,LF,'IN TRYING OUT DISPLAY CONCEPTS AND TESTING THE VB3.' DB CR,LF,LF,'THE CRT CONTROL CHIP MUST BE ADDRESS TO DO-HEX.' DB CR,LF,'THE KEYBOARD PORTS 00 AND 01 CAN NOT BE USED WITH THIS' DB CR,LF,'ROUTINE WITHOUT CHANGING THE SOURCE PROGRAM AT ABOUT' DB CR,LF,'-- INZ4: -- .' DB CR,LF,'THE VB3 MEMORY CAN BE ADDRESSED TO ANY 8K BOUNDARY,' DB CR,LF,'BUT WILL BE AT C000 UNTIL SPECIFIED.' DB '$' STR14: DB CR,LF,LF,'PLEASE ENTER MEMORY ADDRESS IN HEX' DB ' (TYP. = C000) ','$' STR15: DB CR,LF,LF,'****** VALUES TO BE SENT TO VB3 ******',LF DB CR,LF,'KEYBOARD STATUS','$' STR16: DB CR,LF,' PORT = ','$' STR17: DB ' VALUE = ','$' STR18: DB ' HEX','$' STR19: DB CR,LF,LF,'VB3 CONTROL PORT','$' STR20: DB CR,LF,LF,LF,'HIT A CARRIAGE-RET TO CONTINUE','$' STR21: DB CR,LF,LF,'INTERLACED = ','$' STR22: DB 'NO','$' STR23: DB 'YES','$' STR24: DB CR,LF,'NUMBER OF ROWS = ','$' STR25: DB CR,LF,'NUMBER OF LINES PER CHARACTER = ','$' STR26: DB CR,LF,'SCANS PER FRAME = ','$' STR27: DB CR,LF,'HCOUNTS ACROSS THE SCREEN = ','$' STR28: DB CR,LF,'HORIZONTAL POSITION NUMBER = ','$' STR29: DB CR,LF,'TOP MARGIN NUMBER = ','$' STR30: DB CR,LF,'HOW MANY CHARACTERS ACROSS?' DB CR,LF,'TYPE: 1=20, 2=32, 3=40, 4=64' DB CR,LF,' 5=72, 6=80, 7=96, 8=132 ' DB '$' NSTR0: DB ' **** ' DB 'VB3 TEST PATTERN ****',0 NSTR1: DB '02 ALPHA',0 NSTR2: DB '04 INVERTED ALPHA',0 NSTR3: DB '06 FLASH ALPHA',0 NSTR4: DB '08 INVERTED GRAY',0 NSTR5: DB '10 UNDERLINE ALPHA',0 NSTR6: DB '12 GRAPHICS',0 NSTR7: DB '14 INVERTED FLASH',0 NSTR8: DB '16 THIN-LINE GRAPHICS',0 NSTR9: DB '18 STRIKE-THRU',0 NSTR10: DB '20 BLANK-OUT',0 NSTR11: DB '22 INVERTED FLASH GRAY',0 NSTR12: DB '24 ALPHA',0 NSTR13: DB '26 GRAY ALPHA',0 NSTR14: DB '28 FLASH GRAPHICS',0 NSTR15: DB '30 SPARE',0 NSTR16: DB '32 SPARE',0 NSTR17: DB '34 SPARE',0 NSTR18: DB '36 SPARE',0 NSTR19: DB '38 SPARE',0 NSTR20: DB '40 SPARE',0 NSTR21: DB '42 SPARE',0 NSTR22: DB '44 SPARE',0 NSTR23: DB '46 SPARE',0 NSTR24: DB '48 SPARE',0 NSTR25: DB '50 SPARE',0 END