1/* 2 CP/M UTILITY TO SET VIDEO MODES FOR IMSAI VIO BOARD 3 4 THIS PROGRAM WAS WRITTEN FOR THE INTEL PL/M-80 CROSS COMPILER 5 6 1.0 02/08/2017 UDO MUNK FIRST RELEASED VERSION 7 1.1 02/10/2017 UDO MUNK ADDED MORE FEATURES 8 1.2 06/01/2017 UDO MUNK CHECK FIRMWARE SIGNATURE 9*/ 10 110100H: /* ORIGIN OF THIS PROGRAM FOR CP/M */ 12 13DECLARE /* ASCII CONSTANTS */ 14 CR LITERALLY '13', /* CARRIAGE RETURN */ 15 LF LITERALLY '10', /* LINEFEED */ 16 ESC LITERALLY '1BH', /* ESCAPE */ 17 CNTLZ LITERALLY '1AH'; /* SUB */ 18 19DECLARE /* BDOS FUNCTIONS */ 20 BDOS$JUMP LITERALLY '05H', /* JUMP TO BDOS */ 21 BDOS$EXIT LITERALLY '0', /* EXIT PROGRAM */ 22 BDOS$PRINTS LITERALLY '9'; /* PRINT CONSOLE STRING */ 23 24DECLARE /* DEFAULT FILE CONTROL BLOCK */ 25 FCB$A ADDRESS INITIAL(5CH), 26 FCB BASED FCB$A (33) BYTE; 27 28DECLARE /* IMSAI VIO MEMORY MAPPED COMMAND WORD */ 29 VIO$A ADDRESS INITIAL(0F7FFH), 30 VIO$CMD BASED VIO$A BYTE; 31 32DECLARE /* IMSAI VIO FIRMWARE SIGNATURE */ 33 VSIG$A ADDRESS INITIAL(0FFFDH), 34 VSIG BASED VSIG$A BYTE; 35 36DECLARE /* IMSAI VIO FIRMWARE INITIALISATION */ 37 VIO$INIT LITERALLY '0F800H'; 38 39DECLARE /* IMSAI VIO FIRMWARE TERMINAL SEQUENCES */ 40 C$TOGGLE DATA (ESC,'C',CNTLZ,'$'), /* TOGGLE 80/40 COLUMNS */ 41 L$TOGGLE DATA (ESC,'L',CNTLZ,'$'), /* TOGGLE 24/12 LINES */ 42 I$TOGGLE DATA (ESC,'V$'), /* TOGGLE INVERSE/NORMAL VIDEO */ 43 U$TOGGLE DATA (ESC,'U$'), /* TOGGLE UPPER/LOWER CASE */ 44 CLS DATA (CNTLZ,'$'); /* CLEAR SCREEN, HOME CURSOR */ 45 46/* CALL VIO FIRMWARE INITIALISATION ROUTINE */ 47VINIT: PROCEDURE; 48 GO TO VIO$INIT; 49END VINIT; 50 51/* CALL BDOS FUNCTIONS WITHOUT RETURN CODE */ 52BDOS1: PROCEDURE(FUNC,PARM); 53 DECLARE FUNC BYTE; 54 DECLARE PARM ADDRESS; 55 GO TO BDOS$JUMP; 56END BDOS1; 57 58/* PRINT A STRING TERMINATED WITH $ CHARACTER */ 59PRINTS: PROCEDURE(S); 60 DECLARE S ADDRESS; 61 CALL BDOS1(BDOS$PRINTS,S); 62END PRINTS; 63 64/* PRINT USAGE FOR THE PROGRAM */ 65USAGE: PROCEDURE; 66 CALL PRINTS(.(LF,'USAGE:',CR,LF,LF,'$')); 67 CALL PRINTS(.(' VMODE F(IRMWARE- CALL FIRMWARE INITIALISATION',CR,LF,'$')); 68 CALL PRINTS(.(' VMODE S(CREEN - CLEAR SCREEN',CR,LF,'$')); 69 CALL PRINTS(.(LF,'SET HARDWARE:',CR,LF,'$')); 70 CALL PRINTS(.(' VMODE R(ESET - RESET TO 80X24 TEXT MODE',CR,LF,'$')); 71 CALL PRINTS(.(' VMODE I(NVERSE - TURN ON INVERSE VIDEO',CR,LF,'$')); 72 CALL PRINTS(.(' VMODE N(ORMAL - TURN OFF INVERSE VIDEO',CR,LF,'$')); 73 CALL PRINTS(.(LF,'SET TERMINAL MODE:',CR,LF,'$')); 74 CALL PRINTS(.(' VMODE U(PPER - TOGGLE UPPER/LOWER CASE',CR,LF,'$')); 75 CALL PRINTS(.(' VMODE V(IDEO - TOGGLE INVERSE VIDEO',CR,LF,'$')); 76 CALL PRINTS(.(' VMODE C(OLUMNS - TOGGLE 80/40 COLUMNS/LINE',CR,LF,'$')); 77 CALL PRINTS(.(' VMODE L(INES - TOGGLE 24/12 LINES',CR,LF,'$')); 78END USAGE; 79 80/* FIRST CHECK VIO FIRMWARE SIGNATURE, DO NOTHING IF NOT THERE */ 81IF (VSIG(0) <> 'V') OR (VSIG(1) <> 'I') OR (VSIG(2) <> '0') THEN DO; 82 CALL PRINTS(.('NO VIO FOUND',CR,LF,'$')); 83 GO TO DONE; 84END; 85 86IF FCB(1) = 'F' THEN /* CALL FIRMWARE INITIALISATION */ 87 CALL VINIT; 88ELSE IF FCB(1) = 'S' THEN /* CLEAR SCREEN */ 89 CALL PRINTS(.CLS); 90ELSE IF FCB(1) = 'R' THEN /* RESET VIDEO MODE */ 91 VIO$CMD = 8; 92ELSE IF FCB(1) = 'I' THEN /* INVERSE VIDEO */ 93 VIO$CMD = VIO$CMD OR 16; 94ELSE IF FCB(1) = 'N' THEN /* NORMAL VIDEO */ 95 VIO$CMD = VIO$CMD AND 15; 96ELSE IF FCB(1) = 'U' THEN /* UPPER/LOWER CASE */ 97 CALL PRINTS(.U$TOGGLE); 98ELSE IF FCB(1) = 'V' THEN /* INVERSE/NORMAL VIDEO */ 99 CALL PRINTS(.I$TOGGLE); 100ELSE IF FCB(1) = 'C' THEN /* 80/40 COLUMNS */ 101 CALL PRINTS(.C$TOGGLE); 102ELSE IF FCB(1) = 'L' THEN /* 24/12 LINES */ 103 CALL PRINTS(.L$TOGGLE); 104ELSE /* CRY AND DIE */ 105 CALL USAGE; 106 107DONE: 108CALL BDOS1(BDOS$EXIT,0); /* TERMINATE PROGRAM */ 109 110EOF 111