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