diff options
Diffstat (limited to 'v4.0/src/DEV/PRINTER')
25 files changed, 15564 insertions, 0 deletions
diff --git a/v4.0/src/DEV/PRINTER/4201/4201.CPI b/v4.0/src/DEV/PRINTER/4201/4201.CPI new file mode 100644 index 0000000..7b16921 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4201/4201.CPI | |||
| Binary files differ | |||
diff --git a/v4.0/src/DEV/PRINTER/4201/4201.INC b/v4.0/src/DEV/PRINTER/4201/4201.INC new file mode 100644 index 0000000..7c82aa8 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4201/4201.INC | |||
| @@ -0,0 +1,801 @@ | |||
| 1 | db 0FFH,046H,04FH,04EH,054H,020H,020H,020H | ||
| 2 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 3 | db 001H,000H,001H,017H,000H,000H,000H,005H | ||
| 4 | db 000H,01CH,000H,035H,000H,000H,000H,002H | ||
| 5 | db 000H,034H,032H,030H,031H,020H,020H,020H | ||
| 6 | db 020H,05FH,003H,000H,000H,000H,000H,000H | ||
| 7 | db 000H,0A5H,000H,000H,000H,01CH,000H,051H | ||
| 8 | db 000H,000H,000H,002H,000H,034H,032H,030H | ||
| 9 | db 031H,020H,020H,020H,020H,0B5H,001H,000H | ||
| 10 | db 000H,000H,000H,000H,000H,064H,006H,000H | ||
| 11 | db 000H,01CH,000H,06DH,000H,000H,000H,002H | ||
| 12 | db 000H,034H,032H,030H,031H,020H,020H,020H | ||
| 13 | db 020H,05CH,003H,000H,000H,000H,000H,000H | ||
| 14 | db 000H,087H,006H,000H,000H,01CH,000H,089H | ||
| 15 | db 000H,000H,000H,002H,000H,034H,032H,030H | ||
| 16 | db 031H,020H,020H,020H,020H,061H,003H,000H | ||
| 17 | db 000H,000H,000H,000H,000H,045H,00BH,000H | ||
| 18 | db 000H,01CH,000H,000H,000H,000H,000H,002H | ||
| 19 | db 000H,034H,032H,030H,031H,020H,020H,020H | ||
| 20 | db 020H,052H,003H,000H,000H,000H,000H,000H | ||
| 21 | db 000H,04FH,00CH,000H,000H,001H,000H,001H | ||
| 22 | db 000H,0B9H,005H,001H,000H,00CH,000H,005H | ||
| 23 | db 01BH,049H,000H,01BH,036H,005H,01BH,049H | ||
| 24 | db 004H,01BH,036H,01BH,03DH,001H,000H,015H | ||
| 25 | db 01BH,03DH,000H,000H,01BH,049H,004H,000H | ||
| 26 | db 01BH,03DH,029H,000H,014H,084H,000H,009H | ||
| 27 | db 04EH,014H,084H,0A4H,0A4H,0A4H,084H,014H | ||
| 28 | db 04EH,000H,000H,000H,009H,004H,00AH,02AH | ||
| 29 | db 0AAH,06AH,02AH,02AH,01CH,002H,000H,000H | ||
| 30 | db 000H,009H,0C0H,0A0H,0A0H,0FEH,080H,080H | ||
| 31 | db 080H,080H,0FEH,000H,000H,000H,000H,01BH | ||
| 32 | db 03DH,077H,000H,014H,08DH,000H,009H,00AH | ||
| 33 | db 00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH | ||
| 34 | db 000H,000H,000H,009H,00EH,014H,024H,0A4H | ||
| 35 | db 064H,024H,024H,014H,00EH,000H,000H,000H | ||
| 36 | db 017H,000H,050H,0AAH,0AAH,0AAH,0AAH,0AAH | ||
| 37 | db 014H,000H,000H,000H,000H,009H,03EH,02AH | ||
| 38 | db 02AH,02AH,06AH,0AAH,02AH,022H,022H,000H | ||
| 39 | db 000H,000H,009H,03EH,02AH,02AH,0AAH,06AH | ||
| 40 | db 02AH,02AH,022H,022H,000H,000H,000H,009H | ||
| 41 | db 03EH,02AH,06AH,0AAH,0AAH,0AAH,06AH,022H | ||
| 42 | db 022H,000H,000H,000H,008H,04CH,012H,092H | ||
| 43 | db 092H,092H,012H,052H,00CH,000H,000H,000H | ||
| 44 | db 000H,009H,03EH,0AAH,0AAH,02AH,02AH,02AH | ||
| 45 | db 0AAH,0A2H,022H,000H,000H,000H,017H,000H | ||
| 46 | db 000H,0A2H,0A2H,03EH,022H,0A2H,080H,000H | ||
| 47 | db 000H,000H,000H,000H,01BH,03DH,01CH,000H | ||
| 48 | db 014H,098H,000H,008H,05DH,022H,022H,022H | ||
| 49 | db 022H,022H,022H,05DH,000H,000H,000H,000H | ||
| 50 | db 009H,01CH,022H,062H,0A2H,0A2H,0A2H,062H | ||
| 51 | db 022H,01CH,000H,000H,000H,000H,01BH,03DH | ||
| 52 | db 01CH,000H,014H,09DH,000H,009H,03CH,002H | ||
| 53 | db 002H,082H,042H,002H,002H,002H,03CH,000H | ||
| 54 | db 000H,000H,009H,05CH,002H,082H,082H,082H | ||
| 55 | db 082H,082H,002H,05CH,000H,000H,000H,000H | ||
| 56 | db 01BH,03DH,01CH,000H,014H,0A0H,000H,025H | ||
| 57 | db 000H,000H,000H,000H,0EEH,000H,000H,000H | ||
| 58 | db 000H,000H,000H,000H,025H,000H,000H,000H | ||
| 59 | db 000H,040H,080H,000H,000H,000H,000H,000H | ||
| 60 | db 000H,000H,01BH,03DH,043H,000H,014H,0A4H | ||
| 61 | db 000H,016H,000H,080H,080H,000H,000H,080H | ||
| 62 | db 080H,000H,000H,000H,000H,080H,015H,000H | ||
| 63 | db 000H,001H,001H,005H,002H,000H,000H,000H | ||
| 64 | db 000H,000H,000H,025H,000H,000H,000H,0A8H | ||
| 65 | db 0A8H,0A8H,050H,000H,000H,000H,000H,000H | ||
| 66 | db 009H,080H,080H,080H,080H,080H,080H,080H | ||
| 67 | db 080H,080H,000H,000H,000H,016H,000H,000H | ||
| 68 | db 062H,0A2H,0BEH,0A2H,062H,000H,000H,000H | ||
| 69 | db 000H,000H,000H,01BH,03DH,00FH,000H,014H | ||
| 70 | db 0ADH,000H,00BH,0A8H,0A8H,0AAH,054H,008H | ||
| 71 | db 010H,022H,046H,08AH,002H,01FH,000H,000H | ||
| 72 | db 01BH,03DH,032H,000H,015H,084H,000H,000H | ||
| 73 | db 000H,000H,001H,000H,001H,000H,021H,000H | ||
| 74 | db 023H,002H,025H,004H,06DH,008H,025H,010H | ||
| 75 | db 034H,0A0H,024H,000H,0A4H,000H,0A4H,000H | ||
| 76 | db 0A4H,000H,024H,000H,014H,0A0H,005H,010H | ||
| 77 | db 04DH,008H,005H,004H,003H,002H,001H,000H | ||
| 78 | db 001H,000H,001H,000H,000H,000H,01BH,03DH | ||
| 79 | db 032H,000H,015H,086H,000H,000H,000H,000H | ||
| 80 | db 000H,000H,000H,000H,030H,020H,030H,020H | ||
| 81 | db 078H,071H,078H,071H,078H,0F9H,078H,0F9H | ||
| 82 | db 07FH,0FFH,000H,080H,000H,080H,000H,080H | ||
| 83 | db 000H,080H,000H,080H,07FH,0FFH,000H,081H | ||
| 84 | db 000H,081H,000H,081H,000H,081H,000H,000H | ||
| 85 | db 000H,000H,000H,000H,01BH,03DH,092H,000H | ||
| 86 | db 015H,08DH,001H,000H,000H,00AH,000H,00AH | ||
| 87 | db 000H,00AH,000H,00AH,000H,00AH,000H,00AH | ||
| 88 | db 000H,00AH,000H,00AH,000H,00AH,000H,00AH | ||
| 89 | db 000H,00AH,000H,00AH,000H,00AH,000H,00AH | ||
| 90 | db 000H,00AH,000H,00AH,000H,00AH,000H,00AH | ||
| 91 | db 000H,00AH,000H,00AH,000H,00AH,000H,00AH | ||
| 92 | db 000H,00AH,000H,000H,000H,000H,001H,000H | ||
| 93 | db 001H,000H,021H,000H,023H,002H,025H,004H | ||
| 94 | db 02DH,008H,025H,010H,0B4H,020H,024H,000H | ||
| 95 | db 024H,080H,024H,000H,064H,000H,024H,000H | ||
| 96 | db 014H,020H,005H,010H,00DH,008H,005H,004H | ||
| 97 | db 003H,002H,001H,000H,001H,000H,001H,000H | ||
| 98 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 99 | db 000H,000H,000H,000H,000H,000H,010H,030H | ||
| 100 | db 029H,003H,000H,009H,040H,041H,024H,001H | ||
| 101 | db 000H,081H,000H,0A5H,000H,081H,012H,080H | ||
| 102 | db 001H,082H,000H,090H,04AH,0C0H,004H,00CH | ||
| 103 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 104 | db 000H,000H,01BH,03DH,062H,000H,015H,091H | ||
| 105 | db 000H,000H,000H,000H,000H,000H,021H,000H | ||
| 106 | db 021H,000H,021H,000H,021H,000H,03FH,03EH | ||
| 107 | db 021H,008H,021H,008H,0A1H,008H,021H,008H | ||
| 108 | db 021H,088H,021H,008H,061H,008H,02DH,01CH | ||
| 109 | db 021H,000H,021H,000H,021H,000H,021H,000H | ||
| 110 | db 021H,000H,033H,026H,000H,000H,000H,000H | ||
| 111 | db 000H,000H,000H,000H,000H,000H,021H,000H | ||
| 112 | db 021H,000H,021H,000H,021H,000H,03FH,03EH | ||
| 113 | db 061H,008H,021H,008H,021H,088H,021H,008H | ||
| 114 | db 0A1H,008H,0A1H,008H,0A1H,008H,02DH,01CH | ||
| 115 | db 021H,080H,021H,000H,061H,000H,021H,000H | ||
| 116 | db 021H,000H,033H,026H,000H,000H,000H,000H | ||
| 117 | db 01BH,03DH,062H,000H,015H,094H,000H,000H | ||
| 118 | db 000H,000H,000H,000H,021H,000H,021H,000H | ||
| 119 | db 021H,000H,021H,000H,0BFH,0BEH,0A1H,088H | ||
| 120 | db 0A1H,088H,021H,008H,021H,008H,021H,008H | ||
| 121 | db 021H,008H,021H,008H,02DH,01CH,0A1H,080H | ||
| 122 | db 0A1H,080H,0A1H,080H,021H,000H,021H,000H | ||
| 123 | db 033H,026H,000H,000H,000H,000H,000H,000H | ||
| 124 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 125 | db 000H,000H,021H,000H,0A1H,080H,0A1H,080H | ||
| 126 | db 0A1H,080H,021H,000H,021H,000H,03FH,03EH | ||
| 127 | db 021H,000H,021H,000H,0A1H,080H,0A1H,080H | ||
| 128 | db 0A1H,080H,021H,000H,000H,000H,000H,000H | ||
| 129 | db 000H,000H,000H,000H,000H,000H,01BH,03DH | ||
| 130 | db 062H,000H,015H,098H,000H,000H,000H,000H | ||
| 131 | db 000H,000H,042H,000H,000H,000H,018H,054H | ||
| 132 | db 000H,028H,024H,000H,000H,000H,000H,044H | ||
| 133 | db 000H,044H,000H,044H,000H,044H,000H,044H | ||
| 134 | db 000H,044H,000H,044H,000H,000H,024H,000H | ||
| 135 | db 000H,028H,018H,054H,000H,000H,042H,000H | ||
| 136 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 137 | db 000H,000H,000H,000H,000H,000H,01CH,01CH | ||
| 138 | db 002H,020H,060H,002H,000H,000H,001H,0C0H | ||
| 139 | db 001H,040H,081H,040H,081H,040H,081H,040H | ||
| 140 | db 001H,040H,001H,0C0H,000H,000H,060H,002H | ||
| 141 | db 002H,020H,01CH,01CH,000H,000H,000H,000H | ||
| 142 | db 000H,000H,000H,000H,01BH,03DH,062H,000H | ||
| 143 | db 015H,09DH,000H,000H,000H,000H,020H,000H | ||
| 144 | db 020H,000H,020H,000H,03CH,03CH,022H,000H | ||
| 145 | db 020H,002H,020H,000H,081H,000H,001H,000H | ||
| 146 | db 001H,080H,001H,000H,041H,000H,001H,000H | ||
| 147 | db 001H,000H,020H,000H,020H,002H,022H,000H | ||
| 148 | db 03CH,03CH,020H,000H,020H,000H,020H,000H | ||
| 149 | db 000H,000H,000H,000H,000H,000H,020H,000H | ||
| 150 | db 020H,000H,020H,000H,03CH,03CH,022H,000H | ||
| 151 | db 060H,002H,020H,000H,001H,080H,001H,000H | ||
| 152 | db 081H,000H,081H,000H,081H,000H,001H,000H | ||
| 153 | db 001H,080H,020H,000H,060H,002H,022H,000H | ||
| 154 | db 03CH,03CH,020H,000H,020H,000H,020H,000H | ||
| 155 | db 000H,000H,01BH,03DH,062H,000H,015H,0A0H | ||
| 156 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 157 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 158 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 159 | db 0E7H,0E7H,000H,000H,000H,000H,000H,000H | ||
| 160 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 161 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 162 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 163 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 164 | db 000H,000H,000H,000H,000H,000H,040H,000H | ||
| 165 | db 000H,000H,000H,080H,000H,000H,080H,000H | ||
| 166 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 167 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 168 | db 01BH,03DH,0F2H,000H,015H,0A4H,000H,000H | ||
| 169 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 170 | db 000H,000H,000H,000H,080H,080H,080H,080H | ||
| 171 | db 080H,080H,000H,000H,000H,000H,000H,000H | ||
| 172 | db 000H,000H,000H,000H,080H,080H,080H,080H | ||
| 173 | db 080H,080H,000H,000H,000H,000H,000H,000H | ||
| 174 | db 000H,000H,000H,000H,000H,000H,080H,000H | ||
| 175 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 176 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 177 | db 000H,000H,000H,000H,000H,000H,000H,001H | ||
| 178 | db 001H,000H,000H,002H,002H,000H,000H,000H | ||
| 179 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 180 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 181 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 182 | db 000H,000H,000H,000H,000H,000H,008H,080H | ||
| 183 | db 000H,000H,080H,008H,0A0H,008H,0A0H,008H | ||
| 184 | db 0A0H,008H,0A0H,008H,020H,000H,008H,0A0H | ||
| 185 | db 050H,050H,000H,000H,000H,000H,000H,000H | ||
| 186 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 187 | db 000H,000H,000H,000H,000H,000H,080H,000H | ||
| 188 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 189 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 190 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 191 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 192 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 193 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 194 | db 000H,000H,021H,000H,061H,000H,021H,000H | ||
| 195 | db 021H,080H,021H,000H,0A1H,000H,0BFH,03EH | ||
| 196 | db 0A1H,000H,021H,000H,021H,080H,021H,000H | ||
| 197 | db 061H,000H,021H,000H,000H,000H,000H,000H | ||
| 198 | db 000H,000H,000H,000H,000H,000H,01BH,03DH | ||
| 199 | db 032H,000H,015H,0ADH,000H,000H,010H,080H | ||
| 200 | db 080H,010H,080H,010H,080H,050H,081H,050H | ||
| 201 | db 080H,052H,002H,000H,070H,0A4H,004H,000H | ||
| 202 | db 000H,008H,008H,000H,000H,010H,010H,000H | ||
| 203 | db 002H,022H,024H,006H,008H,04AH,040H,002H | ||
| 204 | db 000H,082H,000H,002H,007H,007H,000H,002H | ||
| 205 | db 000H,002H,000H,000H,001H,000H,001H,000H | ||
| 206 | db 01DH,000H,001H,000H,00CH,000H,005H,01BH | ||
| 207 | db 049H,000H,01BH,036H,005H,01BH,049H,004H | ||
| 208 | db 01BH,036H,01BH,03DH,001H,000H,015H,01BH | ||
| 209 | db 03DH,000H,000H,01BH,049H,004H,000H,001H | ||
| 210 | db 000H,001H,000H,0B8H,004H,001H,000H,00CH | ||
| 211 | db 000H,005H,01BH,049H,000H,01BH,036H,005H | ||
| 212 | db 01BH,049H,004H,01BH,036H,01BH,03DH,001H | ||
| 213 | db 000H,015H,01BH,03DH,000H,000H,01BH,049H | ||
| 214 | db 004H,000H,01BH,03DH,029H,000H,014H,084H | ||
| 215 | db 000H,009H,044H,00AH,08AH,0AAH,0AAH,06AH | ||
| 216 | db 04AH,05CH,082H,000H,000H,000H,009H,004H | ||
| 217 | db 00AH,02AH,0AAH,06AH,02AH,02AH,01CH,002H | ||
| 218 | db 000H,000H,000H,009H,00EH,014H,024H,024H | ||
| 219 | db 064H,0A4H,024H,014H,00EH,000H,000H,000H | ||
| 220 | db 000H,01BH,03DH,0DFH,000H,014H,089H,000H | ||
| 221 | db 009H,07EH,02AH,0AAH,0AAH,0AAH,0AAH,0AAH | ||
| 222 | db 022H,062H,000H,000H,000H,009H,01CH,02AH | ||
| 223 | db 02AH,0AAH,06AH,02AH,02AH,02AH,018H,000H | ||
| 224 | db 000H,000H,016H,000H,000H,022H,022H,07EH | ||
| 225 | db 0A2H,022H,000H,000H,000H,000H,000H,00BH | ||
| 226 | db 040H,000H,09CH,0A2H,0A2H,0A2H,0A2H,0A2H | ||
| 227 | db 09CH,000H,040H,000H,016H,000H,000H,012H | ||
| 228 | db 092H,05EH,002H,002H,000H,000H,000H,000H | ||
| 229 | db 000H,009H,04EH,014H,084H,0A4H,0A4H,064H | ||
| 230 | db 044H,054H,08EH,000H,000H,000H,009H,04EH | ||
| 231 | db 014H,084H,0A4H,0A4H,0A4H,084H,014H,04EH | ||
| 232 | db 000H,000H,000H,009H,03EH,02AH,02AH,02AH | ||
| 233 | db 06AH,0AAH,02AH,022H,022H,000H,000H,000H | ||
| 234 | db 009H,00EH,014H,024H,0A4H,064H,024H,024H | ||
| 235 | db 014H,00EH,000H,000H,000H,009H,03EH,02AH | ||
| 236 | db 02AH,0AAH,06AH,02AH,02AH,022H,022H,000H | ||
| 237 | db 000H,000H,008H,04CH,012H,092H,092H,092H | ||
| 238 | db 012H,052H,00CH,000H,000H,000H,000H,008H | ||
| 239 | db 04CH,092H,092H,092H,052H,052H,052H,08CH | ||
| 240 | db 000H,000H,000H,000H,008H,00CH,012H,012H | ||
| 241 | db 092H,052H,012H,012H,00CH,000H,000H,000H | ||
| 242 | db 000H,009H,03CH,002H,002H,002H,042H,082H | ||
| 243 | db 002H,002H,03CH,000H,000H,000H,009H,01CH | ||
| 244 | db 002H,002H,082H,042H,002H,002H,01CH,002H | ||
| 245 | db 000H,000H,000H,016H,000H,000H,022H,0A2H | ||
| 246 | db 07EH,022H,022H,000H,000H,000H,000H,000H | ||
| 247 | db 008H,04CH,092H,092H,092H,052H,052H,052H | ||
| 248 | db 08CH,000H,000H,000H,000H,000H,01BH,03DH | ||
| 249 | db 00FH,000H,014H,09DH,000H,009H,03CH,002H | ||
| 250 | db 002H,082H,042H,002H,002H,002H,03CH,000H | ||
| 251 | db 000H,000H,000H,01BH,03DH,00FH,000H,014H | ||
| 252 | db 09FH,000H,008H,01CH,022H,022H,022H,062H | ||
| 253 | db 0A2H,022H,01CH,000H,000H,000H,000H,000H | ||
| 254 | db 01BH,03DH,00FH,000H,014H,0A9H,000H,008H | ||
| 255 | db 01CH,022H,022H,0A2H,062H,022H,022H,01CH | ||
| 256 | db 000H,000H,000H,000H,000H,01BH,03DH,032H | ||
| 257 | db 000H,015H,084H,000H,000H,000H,000H,000H | ||
| 258 | db 000H,000H,000H,002H,004H,044H,002H,000H | ||
| 259 | db 0A0H,001H,028H,081H,028H,081H,028H,081H | ||
| 260 | db 028H,001H,028H,001H,0A8H,001H,028H,041H | ||
| 261 | db 028H,041H,028H,040H,028H,000H,00AH,010H | ||
| 262 | db 08AH,08EH,01EH,001H,000H,001H,000H,001H | ||
| 263 | db 000H,000H,000H,01BH,03DH,032H,000H,015H | ||
| 264 | db 086H,000H,000H,000H,000H,001H,000H,001H | ||
| 265 | db 000H,021H,000H,023H,002H,025H,004H,02DH | ||
| 266 | db 008H,025H,010H,034H,020H,024H,000H,064H | ||
| 267 | db 000H,024H,000H,024H,080H,024H,000H,094H | ||
| 268 | db 020H,005H,010H,00DH,008H,005H,004H,003H | ||
| 269 | db 002H,001H,000H,001H,000H,001H,000H,000H | ||
| 270 | db 000H,01BH,03DH,032H,000H,015H,089H,000H | ||
| 271 | db 000H,000H,000H,000H,000H,021H,000H,021H | ||
| 272 | db 000H,021H,000H,021H,000H,03FH,03EH,061H | ||
| 273 | db 008H,021H,008H,021H,088H,021H,008H,0A1H | ||
| 274 | db 008H,0A1H,008H,0A1H,008H,02DH,01CH,021H | ||
| 275 | db 080H,021H,000H,061H,000H,021H,000H,021H | ||
| 276 | db 000H,033H,026H,000H,000H,000H,000H,01BH | ||
| 277 | db 03DH,062H,000H,015H,08BH,000H,000H,000H | ||
| 278 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 279 | db 000H,021H,000H,021H,000H,021H,000H,021H | ||
| 280 | db 000H,021H,000H,061H,000H,03FH,03EH,021H | ||
| 281 | db 080H,021H,000H,0A1H,000H,021H,000H,021H | ||
| 282 | db 000H,021H,000H,000H,000H,000H,000H,000H | ||
| 283 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 284 | db 000H,000H,000H,00CH,008H,000H,014H,012H | ||
| 285 | db 000H,000H,000H,040H,022H,000H,000H,021H | ||
| 286 | db 080H,021H,000H,0A1H,000H,0A1H,000H,0A1H | ||
| 287 | db 000H,021H,000H,021H,080H,000H,000H,040H | ||
| 288 | db 022H,000H,000H,012H,000H,000H,014H,00CH | ||
| 289 | db 008H,000H,000H,000H,000H,01BH,03DH,062H | ||
| 290 | db 000H,015H,08EH,000H,000H,000H,000H,001H | ||
| 291 | db 000H,001H,000H,021H,000H,023H,082H,025H | ||
| 292 | db 004H,0ADH,008H,0A5H,010H,0B4H,020H,0A4H | ||
| 293 | db 000H,0A4H,000H,024H,000H,024H,080H,024H | ||
| 294 | db 080H,014H,0A0H,005H,090H,00DH,088H,005H | ||
| 295 | db 004H,083H,002H,001H,000H,001H,000H,001H | ||
| 296 | db 000H,000H,000H,000H,000H,000H,000H,001H | ||
| 297 | db 000H,001H,000H,021H,000H,023H,002H,025H | ||
| 298 | db 004H,06DH,008H,025H,010H,034H,0A0H,024H | ||
| 299 | db 000H,0A4H,000H,0A4H,000H,0A4H,000H,024H | ||
| 300 | db 000H,014H,0A0H,005H,010H,04DH,008H,005H | ||
| 301 | db 004H,003H,002H,001H,000H,001H,000H,001H | ||
| 302 | db 000H,000H,000H,01BH,03DH,062H,000H,015H | ||
| 303 | db 091H,000H,000H,000H,000H,001H,000H,001H | ||
| 304 | db 000H,021H,000H,023H,002H,025H,004H,02DH | ||
| 305 | db 008H,025H,010H,0B4H,020H,024H,000H,024H | ||
| 306 | db 080H,024H,000H,064H,000H,024H,000H,014H | ||
| 307 | db 020H,005H,010H,00DH,008H,005H,004H,003H | ||
| 308 | db 002H,001H,000H,001H,000H,001H,000H,000H | ||
| 309 | db 000H,000H,000H,000H,000H,000H,000H,021H | ||
| 310 | db 000H,021H,000H,021H,000H,021H,000H,03FH | ||
| 311 | db 03EH,021H,008H,021H,008H,0A1H,008H,021H | ||
| 312 | db 008H,021H,088H,021H,008H,061H,008H,02DH | ||
| 313 | db 01CH,021H,000H,021H,000H,021H,000H,021H | ||
| 314 | db 000H,021H,000H,033H,026H,000H,000H,000H | ||
| 315 | db 000H,01BH,03DH,032H,000H,015H,094H,000H | ||
| 316 | db 000H,000H,000H,000H,000H,000H,000H,00CH | ||
| 317 | db 00CH,042H,010H,000H,080H,010H,002H,080H | ||
| 318 | db 000H,081H,020H,081H,020H,001H,020H,001H | ||
| 319 | db 0A0H,001H,020H,041H,020H,041H,020H,040H | ||
| 320 | db 000H,010H,002H,000H,080H,082H,010H,00CH | ||
| 321 | db 00CH,000H,000H,000H,000H,000H,000H,01BH | ||
| 322 | db 03DH,032H,000H,015H,096H,000H,000H,000H | ||
| 323 | db 000H,020H,000H,020H,000H,020H,000H,03CH | ||
| 324 | db 03CH,022H,000H,020H,002H,020H,000H,001H | ||
| 325 | db 000H,001H,000H,041H,000H,001H,000H,001H | ||
| 326 | db 080H,001H,000H,081H,000H,020H,000H,020H | ||
| 327 | db 002H,022H,000H,03CH,03CH,020H,000H,020H | ||
| 328 | db 000H,020H,000H,000H,000H,01BH,03DH,062H | ||
| 329 | db 000H,015H,098H,000H,000H,000H,000H,000H | ||
| 330 | db 000H,000H,000H,000H,000H,000H,000H,021H | ||
| 331 | db 000H,021H,000H,021H,000H,0A1H,000H,021H | ||
| 332 | db 000H,021H,080H,03FH,03EH,061H,000H,021H | ||
| 333 | db 000H,021H,000H,021H,000H,021H,000H,021H | ||
| 334 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 335 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 336 | db 000H,00CH,008H,000H,014H,012H,080H,000H | ||
| 337 | db 000H,080H,022H,080H,000H,0A1H,000H,0A1H | ||
| 338 | db 000H,0A1H,000H,021H,000H,021H,080H,021H | ||
| 339 | db 080H,021H,080H,000H,080H,000H,0A2H,000H | ||
| 340 | db 000H,092H,000H,000H,014H,00CH,008H,000H | ||
| 341 | db 000H,000H,000H,01BH,03DH,032H,000H,015H | ||
| 342 | db 09DH,000H,000H,000H,000H,020H,000H,020H | ||
| 343 | db 000H,020H,000H,03CH,03CH,022H,000H,020H | ||
| 344 | db 002H,020H,000H,081H,000H,001H,000H,001H | ||
| 345 | db 080H,001H,000H,041H,000H,001H,000H,001H | ||
| 346 | db 000H,020H,000H,020H,002H,022H,000H,03CH | ||
| 347 | db 03CH,020H,000H,020H,000H,020H,000H,000H | ||
| 348 | db 000H,01BH,03DH,032H,000H,015H,09FH,000H | ||
| 349 | db 000H,000H,000H,000H,000H,00CH,008H,000H | ||
| 350 | db 014H,012H,000H,000H,000H,000H,022H,000H | ||
| 351 | db 000H,021H,000H,021H,000H,061H,000H,021H | ||
| 352 | db 000H,021H,080H,021H,000H,0A1H,000H,000H | ||
| 353 | db 000H,000H,022H,000H,000H,012H,000H,000H | ||
| 354 | db 014H,00CH,008H,000H,000H,000H,000H,01BH | ||
| 355 | db 03DH,032H,000H,015H,0A9H,000H,000H,000H | ||
| 356 | db 000H,000H,000H,00CH,008H,000H,014H,012H | ||
| 357 | db 000H,000H,000H,000H,022H,000H,000H,0A1H | ||
| 358 | db 000H,021H,000H,021H,080H,021H,000H,061H | ||
| 359 | db 000H,021H,000H,021H,000H,000H,000H,000H | ||
| 360 | db 022H,000H,000H,012H,000H,000H,014H,00CH | ||
| 361 | db 008H,000H,000H,000H,000H,001H,000H,001H | ||
| 362 | db 000H,004H,001H,001H,000H,00CH,000H,005H | ||
| 363 | db 01BH,049H,000H,01BH,036H,005H,01BH,049H | ||
| 364 | db 004H,01BH,036H,01BH,03DH,001H,000H,015H | ||
| 365 | db 01BH,03DH,000H,000H,01BH,049H,004H,000H | ||
| 366 | db 01BH,03DH,029H,000H,014H,09BH,000H,009H | ||
| 367 | db 01CH,023H,022H,026H,02AH,032H,022H,05CH | ||
| 368 | db 000H,000H,000H,000H,009H,012H,012H,07EH | ||
| 369 | db 092H,092H,082H,082H,082H,042H,000H,000H | ||
| 370 | db 000H,00AH,03AH,044H,000H,08AH,092H,0A2H | ||
| 371 | db 000H,044H,0B8H,000H,000H,000H,000H,01BH | ||
| 372 | db 03DH,032H,000H,015H,09BH,080H,000H,000H | ||
| 373 | db 000H,000H,000H,018H,018H,004H,020H,000H | ||
| 374 | db 000H,021H,004H,000H,002H,002H,040H,002H | ||
| 375 | db 044H,006H,040H,002H,048H,00AH,040H,002H | ||
| 376 | db 050H,012H,040H,002H,060H,022H,040H,060H | ||
| 377 | db 000H,020H,084H,000H,000H,004H,020H,018H | ||
| 378 | db 018H,000H,000H,000H,000H,01BH,03DH,032H | ||
| 379 | db 000H,015H,09DH,000H,000H,000H,000H,000H | ||
| 380 | db 000H,018H,018H,024H,024H,002H,040H,000H | ||
| 381 | db 001H,041H,002H,001H,000H,003H,080H,005H | ||
| 382 | db 084H,001H,088H,009H,090H,011H,080H,021H | ||
| 383 | db 0A0H,001H,0C0H,000H,080H,040H,082H,080H | ||
| 384 | db 000H,002H,040H,024H,024H,018H,018H,000H | ||
| 385 | db 000H,000H,000H,01BH,03DH,00FH,000H,014H | ||
| 386 | db 0AFH,000H,009H,05DH,022H,022H,022H,022H | ||
| 387 | db 022H,022H,05DH,000H,000H,000H,01BH,03DH | ||
| 388 | db 032H,000H,015H,0AFH,000H,000H,000H,000H | ||
| 389 | db 000H,000H,042H,000H,000H,000H,018H,054H | ||
| 390 | db 000H,028H,024H,000H,000H,000H,000H,044H | ||
| 391 | db 000H,044H,000H,044H,000H,044H,000H,044H | ||
| 392 | db 000H,044H,000H,044H,000H,000H,024H,000H | ||
| 393 | db 000H,028H,018H,054H,000H,000H,042H,000H | ||
| 394 | db 000H,000H,000H,000H,000H,000H,000H,001H | ||
| 395 | db 000H,001H,000H,0AFH,00CH,001H,000H,00CH | ||
| 396 | db 000H,005H,01BH,049H,000H,01BH,036H,005H | ||
| 397 | db 01BH,049H,004H,01BH,036H,01BH,03DH,001H | ||
| 398 | db 000H,015H,01BH,03DH,000H,000H,01BH,049H | ||
| 399 | db 004H,000H,01BH,03DH,00FH,000H,014H,086H | ||
| 400 | db 000H,00AH,004H,00AH,06AH,0AAH,0AAH,0AAH | ||
| 401 | db 06AH,01CH,002H,000H,000H,000H,000H,01BH | ||
| 402 | db 03DH,036H,000H,014H,09BH,000H,009H,01DH | ||
| 403 | db 022H,026H,02AH,02AH,032H,022H,05CH,000H | ||
| 404 | db 000H,000H,000H,009H,012H,012H,07EH,092H | ||
| 405 | db 092H,082H,082H,082H,042H,000H,000H,000H | ||
| 406 | db 00AH,03AH,044H,000H,08AH,092H,0A2H,000H | ||
| 407 | db 044H,0B8H,000H,000H,000H,019H,000H,044H | ||
| 408 | db 000H,028H,000H,010H,000H,028H,000H,044H | ||
| 409 | db 000H,000H,000H,01BH,03DH,00FH,000H,014H | ||
| 410 | db 0A9H,000H,00BH,03CH,042H,081H,081H,0BDH | ||
| 411 | db 0A9H,0A9H,095H,081H,042H,03CH,000H,000H | ||
| 412 | db 01BH,03DH,036H,000H,014H,0B5H,000H,009H | ||
| 413 | db 00EH,014H,024H,024H,064H,0A4H,024H,014H | ||
| 414 | db 00EH,000H,000H,000H,009H,04EH,014H,084H | ||
| 415 | db 0A4H,0A4H,0A4H,084H,014H,04EH,000H,000H | ||
| 416 | db 000H,009H,00EH,014H,024H,0A4H,064H,024H | ||
| 417 | db 024H,014H,00EH,000H,000H,000H,00BH,038H | ||
| 418 | db 044H,000H,092H,0AAH,0AAH,0AAH,082H,000H | ||
| 419 | db 044H,038H,000H,000H,01BH,03DH,00FH,000H | ||
| 420 | db 014H,0BDH,000H,008H,018H,024H,024H,024H | ||
| 421 | db 07EH,024H,024H,024H,000H,000H,000H,000H | ||
| 422 | db 000H,01BH,03DH,01CH,000H,014H,0C6H,000H | ||
| 423 | db 009H,044H,00AH,08AH,0AAH,0AAH,06AH,04AH | ||
| 424 | db 05CH,082H,000H,000H,000H,009H,04EH,014H | ||
| 425 | db 084H,0A4H,0A4H,064H,044H,054H,08EH,000H | ||
| 426 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 427 | db 000H,01BH,03DH,0A2H,001H,014H,0DDH,000H | ||
| 428 | db 025H,000H,000H,000H,000H,0EEH,000H,000H | ||
| 429 | db 000H,000H,000H,000H,000H,016H,000H,000H | ||
| 430 | db 022H,0A2H,07EH,022H,022H,000H,000H,000H | ||
| 431 | db 000H,001H,00BH,0FCH,0FCH,0FCH,0FCH,0FCH | ||
| 432 | db 0FCH,0FCH,0FCH,0FCH,0FCH,0FCH,000H,008H | ||
| 433 | db 01CH,022H,022H,022H,062H,0A2H,022H,01CH | ||
| 434 | db 000H,000H,000H,000H,008H,01FH,020H,040H | ||
| 435 | db 084H,092H,082H,06AH,004H,000H,000H,000H | ||
| 436 | db 000H,00BH,040H,000H,09CH,0A2H,0A2H,0A2H | ||
| 437 | db 0A2H,0A2H,09CH,000H,040H,000H,008H,01CH | ||
| 438 | db 022H,022H,0A2H,062H,022H,022H,01CH,000H | ||
| 439 | db 000H,000H,000H,008H,04CH,092H,092H,092H | ||
| 440 | db 052H,052H,052H,08CH,000H,000H,000H,000H | ||
| 441 | db 009H,040H,01CH,080H,0A2H,0A2H,062H,040H | ||
| 442 | db 05CH,080H,000H,000H,080H,008H,001H,07EH | ||
| 443 | db 008H,008H,008H,008H,078H,004H,000H,000H | ||
| 444 | db 000H,000H,009H,081H,081H,0FFH,025H,025H | ||
| 445 | db 025H,024H,024H,018H,000H,000H,000H,018H | ||
| 446 | db 000H,081H,0FFH,0A5H,024H,024H,024H,024H | ||
| 447 | db 018H,000H,000H,000H,009H,03CH,002H,002H | ||
| 448 | db 002H,042H,082H,002H,002H,03CH,000H,000H | ||
| 449 | db 000H,009H,05CH,002H,082H,082H,082H,082H | ||
| 450 | db 082H,002H,05CH,000H,000H,000H,009H,03CH | ||
| 451 | db 002H,002H,082H,042H,002H,002H,002H,03CH | ||
| 452 | db 000H,000H,080H,008H,020H,010H,009H,002H | ||
| 453 | db 044H,088H,010H,020H,000H,000H,000H,000H | ||
| 454 | db 009H,040H,020H,010H,008H,046H,088H,010H | ||
| 455 | db 020H,040H,000H,000H,000H,009H,080H,080H | ||
| 456 | db 080H,080H,080H,080H,080H,080H,080H,000H | ||
| 457 | db 000H,000H,025H,000H,000H,000H,000H,040H | ||
| 458 | db 080H,000H,000H,000H,000H,000H,020H,00BH | ||
| 459 | db 010H,010H,010H,010H,010H,010H,010H,010H | ||
| 460 | db 010H,000H,000H,000H,009H,022H,022H,022H | ||
| 461 | db 022H,0FAH,022H,022H,022H,022H,000H,000H | ||
| 462 | db 000H,009H,00AH,00AH,00AH,00AH,00AH,00AH | ||
| 463 | db 00AH,00AH,00AH,000H,000H,000H,00BH,0A8H | ||
| 464 | db 0A8H,0AAH,054H,008H,010H,022H,046H,08AH | ||
| 465 | db 002H,01FH,000H,009H,0C0H,0A0H,0A0H,0FEH | ||
| 466 | db 080H,080H,080H,080H,0FEH,000H,000H,000H | ||
| 467 | db 017H,000H,050H,0AAH,0AAH,0AAH,0AAH,0AAH | ||
| 468 | db 014H,000H,000H,000H,000H,019H,000H,010H | ||
| 469 | db 010H,010H,0D6H,0D6H,0D6H,010H,010H,010H | ||
| 470 | db 000H,080H,015H,000H,000H,001H,001H,005H | ||
| 471 | db 002H,000H,000H,000H,000H,000H,000H,016H | ||
| 472 | db 000H,000H,060H,090H,090H,090H,060H,000H | ||
| 473 | db 000H,000H,000H,000H,018H,000H,030H,030H | ||
| 474 | db 030H,000H,000H,030H,030H,030H,000H,000H | ||
| 475 | db 000H,025H,000H,000H,000H,000H,010H,010H | ||
| 476 | db 000H,000H,000H,000H,000H,000H,016H,000H | ||
| 477 | db 000H,048H,008H,0F8H,008H,008H,000H,000H | ||
| 478 | db 000H,000H,000H,025H,000H,000H,000H,0A8H | ||
| 479 | db 0A8H,0A8H,050H,000H,000H,000H,000H,000H | ||
| 480 | db 000H,01BH,03DH,084H,000H,014H,0CFH,000H | ||
| 481 | db 008H,05DH,022H,022H,022H,022H,022H,022H | ||
| 482 | db 05DH,000H,000H,000H,000H,017H,000H,004H | ||
| 483 | db 02AH,08AH,04AH,02AH,09AH,004H,000H,000H | ||
| 484 | db 000H,000H,009H,092H,0FEH,092H,092H,082H | ||
| 485 | db 082H,082H,044H,038H,000H,000H,000H,009H | ||
| 486 | db 07EH,02AH,0AAH,0AAH,0AAH,0AAH,0AAH,022H | ||
| 487 | db 062H,000H,000H,000H,009H,03EH,0AAH,0AAH | ||
| 488 | db 02AH,02AH,02AH,0AAH,0A2H,022H,000H,000H | ||
| 489 | db 000H,009H,03EH,02AH,02AH,0AAH,06AH,02AH | ||
| 490 | db 02AH,022H,022H,000H,000H,000H,016H,000H | ||
| 491 | db 000H,012H,012H,01EH,002H,002H,000H,000H | ||
| 492 | db 000H,000H,000H,016H,000H,000H,022H,022H | ||
| 493 | db 07EH,0A2H,022H,000H,000H,000H,000H,000H | ||
| 494 | db 00BH,040H,000H,080H,0A2H,0A2H,0BEH,0A2H | ||
| 495 | db 0A2H,080H,000H,040H,000H,017H,000H,000H | ||
| 496 | db 0A2H,0A2H,03EH,022H,0A2H,080H,000H,000H | ||
| 497 | db 000H,000H,01BH,03DH,032H,000H,015H,09BH | ||
| 498 | db 080H,000H,000H,000H,000H,000H,018H,018H | ||
| 499 | db 004H,020H,000H,000H,021H,004H,000H,002H | ||
| 500 | db 002H,040H,002H,044H,006H,040H,002H,048H | ||
| 501 | db 00AH,040H,002H,050H,012H,040H,002H,060H | ||
| 502 | db 022H,040H,060H,000H,020H,084H,000H,000H | ||
| 503 | db 004H,020H,018H,018H,000H,000H,000H,000H | ||
| 504 | db 01BH,03DH,032H,000H,015H,09DH,000H,000H | ||
| 505 | db 000H,000H,000H,000H,018H,018H,024H,024H | ||
| 506 | db 002H,040H,000H,001H,041H,002H,001H,000H | ||
| 507 | db 003H,080H,005H,084H,001H,088H,009H,090H | ||
| 508 | db 011H,080H,021H,0A0H,001H,0C0H,000H,080H | ||
| 509 | db 040H,082H,080H,000H,002H,040H,024H,024H | ||
| 510 | db 018H,018H,000H,000H,000H,000H,01BH,03DH | ||
| 511 | db 032H,000H,015H,086H,000H,000H,000H,000H | ||
| 512 | db 000H,000H,000H,000H,002H,004H,004H,002H | ||
| 513 | db 000H,020H,041H,0A8H,001H,028H,081H,068H | ||
| 514 | db 081H,068H,081H,068H,081H,068H,081H,068H | ||
| 515 | db 081H,068H,081H,068H,000H,028H,040H,08AH | ||
| 516 | db 010H,00AH,00EH,01EH,001H,000H,001H,000H | ||
| 517 | db 001H,000H,000H,000H,01BH,03DH,032H,000H | ||
| 518 | db 015H,09EH,000H,000H,000H,000H,000H,000H | ||
| 519 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 520 | db 024H,000H,000H,000H,000H,028H,018H,000H | ||
| 521 | db 000H,000H,000H,010H,000H,000H,018H,000H | ||
| 522 | db 000H,028H,000H,000H,024H,000H,000H,000H | ||
| 523 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 524 | db 000H,000H,01BH,03DH,032H,000H,015H,0A9H | ||
| 525 | db 000H,000H,000H,000H,01CH,018H,000H,024H | ||
| 526 | db 022H,000H,000H,000H,000H,042H,000H,000H | ||
| 527 | db 05DH,03CH,049H,020H,049H,020H,049H,020H | ||
| 528 | db 049H,020H,049H,020H,049H,020H,049H,028H | ||
| 529 | db 04DH,020H,010H,014H,000H,042H,000H,000H | ||
| 530 | db 022H,000H,000H,024H,01CH,018H,000H,000H | ||
| 531 | db 01BH,03DH,0C2H,000H,015H,0B5H,000H,000H | ||
| 532 | db 000H,000H,001H,000H,001H,000H,021H,000H | ||
| 533 | db 023H,002H,025H,004H,02DH,008H,025H,010H | ||
| 534 | db 034H,020H,024H,000H,064H,000H,024H,000H | ||
| 535 | db 024H,080H,024H,000H,094H,020H,005H,010H | ||
| 536 | db 00DH,008H,005H,004H,003H,002H,001H,000H | ||
| 537 | db 001H,000H,001H,000H,000H,000H,000H,000H | ||
| 538 | db 000H,000H,001H,000H,001H,000H,021H,000H | ||
| 539 | db 023H,002H,025H,004H,06DH,008H,025H,010H | ||
| 540 | db 034H,0A0H,024H,000H,0A4H,000H,0A4H,000H | ||
| 541 | db 0A4H,000H,024H,000H,014H,0A0H,005H,010H | ||
| 542 | db 04DH,008H,005H,004H,003H,002H,001H,000H | ||
| 543 | db 001H,000H,001H,000H,000H,000H,000H,000H | ||
| 544 | db 000H,000H,001H,000H,001H,000H,021H,000H | ||
| 545 | db 023H,002H,025H,004H,02DH,008H,025H,010H | ||
| 546 | db 0B4H,020H,024H,000H,024H,080H,024H,000H | ||
| 547 | db 064H,000H,024H,000H,014H,020H,005H,010H | ||
| 548 | db 00DH,008H,005H,004H,003H,002H,001H,000H | ||
| 549 | db 001H,000H,001H,000H,000H,000H,000H,000H | ||
| 550 | db 000H,000H,01CH,018H,000H,024H,022H,000H | ||
| 551 | db 000H,000H,000H,042H,008H,018H,055H,000H | ||
| 552 | db 041H,024H,041H,024H,041H,024H,041H,024H | ||
| 553 | db 041H,024H,041H,024H,041H,024H,041H,000H | ||
| 554 | db 014H,000H,000H,042H,000H,000H,022H,000H | ||
| 555 | db 000H,024H,01CH,018H,000H,000H,01BH,03DH | ||
| 556 | db 032H,000H,015H,0BDH,000H,000H,000H,000H | ||
| 557 | db 000H,000H,000H,000H,000H,000H,018H,018H | ||
| 558 | db 004H,020H,020H,004H,000H,000H,002H,040H | ||
| 559 | db 002H,040H,002H,040H,0FFH,0FFH,002H,040H | ||
| 560 | db 002H,040H,002H,040H,022H,000H,022H,000H | ||
| 561 | db 030H,060H,000H,004H,000H,000H,000H,000H | ||
| 562 | db 000H,000H,000H,000H,01BH,03DH,062H,000H | ||
| 563 | db 015H,0C6H,000H,000H,000H,000H,000H,000H | ||
| 564 | db 000H,000H,002H,004H,044H,002H,000H,0A0H | ||
| 565 | db 001H,028H,081H,028H,081H,028H,081H,028H | ||
| 566 | db 001H,028H,001H,0A8H,001H,028H,041H,028H | ||
| 567 | db 041H,028H,040H,028H,000H,00AH,010H,08AH | ||
| 568 | db 08EH,01EH,001H,000H,001H,000H,001H,000H | ||
| 569 | db 000H,000H,000H,000H,000H,000H,001H,000H | ||
| 570 | db 001H,000H,021H,000H,023H,082H,025H,004H | ||
| 571 | db 0ADH,008H,0A5H,010H,0B4H,020H,0A4H,000H | ||
| 572 | db 0A4H,000H,024H,000H,024H,080H,024H,080H | ||
| 573 | db 014H,0A0H,005H,090H,00DH,088H,005H,004H | ||
| 574 | db 083H,002H,001H,000H,001H,000H,001H,000H | ||
| 575 | db 000H,000H,01BH,03DH,0E2H,001H,015H,0CFH | ||
| 576 | db 000H,000H,000H,000H,000H,000H,042H,000H | ||
| 577 | db 000H,000H,018H,054H,000H,028H,024H,000H | ||
| 578 | db 000H,000H,000H,044H,000H,044H,000H,044H | ||
| 579 | db 000H,044H,000H,044H,000H,044H,000H,044H | ||
| 580 | db 000H,000H,024H,000H,000H,028H,018H,054H | ||
| 581 | db 000H,000H,042H,000H,000H,000H,000H,000H | ||
| 582 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 583 | db 004H,00CH,0AAH,000H,000H,000H,000H,0D2H | ||
| 584 | db 000H,000H,051H,000H,011H,000H,011H,0C0H | ||
| 585 | db 011H,000H,0B1H,000H,001H,000H,001H,020H | ||
| 586 | db 010H,000H,000H,002H,000H,010H,00AH,000H | ||
| 587 | db 004H,00CH,000H,000H,000H,000H,000H,000H | ||
| 588 | db 000H,000H,000H,000H,000H,010H,001H,090H | ||
| 589 | db 001H,090H,001H,090H,07FH,0FEH,001H,090H | ||
| 590 | db 001H,090H,001H,090H,001H,090H,001H,090H | ||
| 591 | db 001H,090H,001H,080H,001H,080H,001H,080H | ||
| 592 | db 000H,000H,040H,002H,000H,000H,002H,040H | ||
| 593 | db 024H,024H,018H,018H,000H,000H,000H,000H | ||
| 594 | db 000H,000H,000H,000H,000H,000H,021H,000H | ||
| 595 | db 021H,000H,021H,000H,021H,000H,03FH,03EH | ||
| 596 | db 061H,008H,021H,008H,021H,088H,021H,008H | ||
| 597 | db 0A1H,008H,0A1H,008H,0A1H,008H,02DH,01CH | ||
| 598 | db 021H,080H,021H,000H,061H,000H,021H,000H | ||
| 599 | db 021H,000H,033H,026H,000H,000H,000H,000H | ||
| 600 | db 000H,000H,000H,000H,000H,000H,021H,000H | ||
| 601 | db 021H,000H,021H,000H,021H,000H,0BFH,0BEH | ||
| 602 | db 0A1H,088H,0A1H,088H,021H,008H,021H,008H | ||
| 603 | db 021H,008H,021H,008H,021H,008H,02DH,01CH | ||
| 604 | db 0A1H,080H,0A1H,080H,0A1H,080H,021H,000H | ||
| 605 | db 021H,000H,033H,026H,000H,000H,000H,000H | ||
| 606 | db 000H,000H,000H,000H,000H,000H,021H,000H | ||
| 607 | db 021H,000H,021H,000H,021H,000H,03FH,03EH | ||
| 608 | db 021H,008H,021H,008H,0A1H,008H,021H,008H | ||
| 609 | db 021H,088H,021H,008H,061H,008H,02DH,01CH | ||
| 610 | db 021H,000H,021H,000H,021H,000H,021H,000H | ||
| 611 | db 021H,000H,033H,026H,000H,000H,000H,000H | ||
| 612 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 613 | db 000H,000H,001H,000H,001H,000H,001H,020H | ||
| 614 | db 001H,020H,001H,020H,001H,020H,001H,020H | ||
| 615 | db 001H,020H,01FH,03EH,001H,000H,001H,000H | ||
| 616 | db 001H,000H,001H,000H,001H,000H,001H,000H | ||
| 617 | db 001H,000H,001H,000H,000H,000H,000H,000H | ||
| 618 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 619 | db 000H,000H,000H,000H,021H,000H,021H,000H | ||
| 620 | db 021H,000H,021H,000H,021H,000H,061H,000H | ||
| 621 | db 03FH,03EH,021H,080H,021H,000H,0A1H,000H | ||
| 622 | db 021H,000H,021H,000H,021H,000H,000H,000H | ||
| 623 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 624 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 625 | db 000H,000H,000H,000H,021H,000H,061H,000H | ||
| 626 | db 021H,000H,021H,080H,021H,000H,0A1H,000H | ||
| 627 | db 0BFH,03EH,0A1H,000H,021H,000H,021H,080H | ||
| 628 | db 021H,000H,061H,000H,021H,000H,000H,000H | ||
| 629 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 630 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 631 | db 000H,000H,000H,000H,021H,000H,0A1H,080H | ||
| 632 | db 0A1H,080H,0A1H,080H,021H,000H,021H,000H | ||
| 633 | db 03FH,03EH,021H,000H,021H,000H,0A1H,080H | ||
| 634 | db 0A1H,080H,0A1H,080H,021H,000H,000H,000H | ||
| 635 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 636 | db 01BH,03DH,062H,000H,015H,0DDH,000H,000H | ||
| 637 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 638 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 639 | db 000H,000H,000H,000H,000H,000H,0E7H,0E7H | ||
| 640 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 641 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 642 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 643 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 644 | db 000H,000H,021H,000H,021H,000H,021H,000H | ||
| 645 | db 0A1H,000H,021H,000H,021H,080H,03FH,03EH | ||
| 646 | db 061H,000H,021H,000H,021H,000H,021H,000H | ||
| 647 | db 021H,000H,021H,000H,000H,000H,000H,000H | ||
| 648 | db 000H,000H,000H,000H,000H,000H,01BH,03DH | ||
| 649 | db 032H,000H,015H,0E0H,000H,000H,000H,000H | ||
| 650 | db 000H,000H,00CH,008H,000H,014H,012H,000H | ||
| 651 | db 000H,000H,000H,022H,000H,000H,021H,000H | ||
| 652 | db 021H,000H,061H,000H,021H,000H,021H,080H | ||
| 653 | db 021H,000H,0A1H,000H,000H,000H,000H,022H | ||
| 654 | db 000H,000H,012H,000H,000H,014H,00CH,008H | ||
| 655 | db 000H,000H,000H,000H,01BH,03DH,0C2H,000H | ||
| 656 | db 015H,0E2H,000H,000H,000H,000H,000H,000H | ||
| 657 | db 00CH,008H,000H,014H,012H,000H,000H,000H | ||
| 658 | db 040H,022H,000H,000H,021H,080H,021H,000H | ||
| 659 | db 0A1H,000H,0A1H,000H,0A1H,000H,021H,000H | ||
| 660 | db 021H,080H,000H,000H,040H,022H,000H,000H | ||
| 661 | db 012H,000H,000H,014H,00CH,008H,000H,000H | ||
| 662 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 663 | db 00CH,008H,000H,014H,012H,000H,000H,000H | ||
| 664 | db 000H,022H,000H,000H,0A1H,000H,021H,000H | ||
| 665 | db 021H,080H,021H,000H,061H,000H,021H,000H | ||
| 666 | db 021H,000H,000H,000H,000H,022H,000H,000H | ||
| 667 | db 012H,000H,000H,014H,00CH,008H,000H,000H | ||
| 668 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 669 | db 000H,000H,00CH,00CH,042H,010H,000H,080H | ||
| 670 | db 010H,002H,080H,000H,081H,020H,081H,020H | ||
| 671 | db 001H,020H,001H,0A0H,001H,020H,041H,020H | ||
| 672 | db 041H,020H,040H,000H,010H,002H,000H,080H | ||
| 673 | db 082H,010H,00CH,00CH,000H,000H,000H,000H | ||
| 674 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 675 | db 00CH,008H,000H,014H,012H,080H,000H,000H | ||
| 676 | db 080H,022H,080H,000H,0A1H,000H,0A1H,000H | ||
| 677 | db 0A1H,000H,021H,000H,021H,080H,021H,080H | ||
| 678 | db 021H,080H,000H,080H,000H,0A2H,000H,000H | ||
| 679 | db 092H,000H,000H,014H,00CH,008H,000H,000H | ||
| 680 | db 000H,000H,01BH,03DH,0E2H,001H,015H,0E7H | ||
| 681 | db 080H,000H,080H,000H,080H,001H,080H,001H | ||
| 682 | db 080H,001H,0FFH,0FFH,024H,001H,024H,001H | ||
| 683 | db 000H,001H,000H,045H,000H,045H,000H,044H | ||
| 684 | db 000H,044H,000H,044H,000H,044H,000H,044H | ||
| 685 | db 000H,044H,000H,044H,000H,000H,024H,000H | ||
| 686 | db 000H,028H,018H,010H,000H,000H,000H,000H | ||
| 687 | db 000H,000H,000H,000H,000H,000H,001H,080H | ||
| 688 | db 001H,080H,001H,080H,001H,080H,07FH,0FEH | ||
| 689 | db 021H,084H,021H,084H,021H,084H,021H,084H | ||
| 690 | db 021H,084H,021H,084H,020H,004H,020H,004H | ||
| 691 | db 020H,004H,020H,004H,020H,004H,020H,004H | ||
| 692 | db 000H,000H,004H,020H,018H,018H,000H,000H | ||
| 693 | db 000H,000H,000H,000H,020H,000H,020H,000H | ||
| 694 | db 020H,000H,03CH,03CH,022H,000H,020H,002H | ||
| 695 | db 020H,000H,001H,000H,001H,000H,041H,000H | ||
| 696 | db 001H,000H,001H,080H,001H,000H,081H,000H | ||
| 697 | db 020H,000H,020H,002H,022H,000H,03CH,03CH | ||
| 698 | db 020H,000H,020H,000H,020H,000H,000H,000H | ||
| 699 | db 000H,000H,000H,000H,020H,000H,020H,000H | ||
| 700 | db 020H,000H,03CH,03CH,022H,000H,060H,002H | ||
| 701 | db 020H,000H,001H,080H,001H,000H,081H,000H | ||
| 702 | db 081H,000H,081H,000H,001H,000H,001H,080H | ||
| 703 | db 020H,000H,060H,002H,022H,000H,03CH,03CH | ||
| 704 | db 020H,000H,020H,000H,020H,000H,000H,000H | ||
| 705 | db 000H,000H,000H,000H,020H,000H,020H,000H | ||
| 706 | db 020H,000H,03CH,03CH,022H,000H,020H,002H | ||
| 707 | db 020H,000H,081H,000H,001H,000H,001H,080H | ||
| 708 | db 001H,000H,041H,000H,001H,000H,001H,000H | ||
| 709 | db 020H,000H,020H,002H,022H,000H,03CH,03CH | ||
| 710 | db 020H,000H,020H,000H,020H,000H,000H,000H | ||
| 711 | db 000H,000H,000H,000H,000H,020H,000H,020H | ||
| 712 | db 000H,020H,010H,020H,000H,031H,008H,021H | ||
| 713 | db 000H,029H,004H,001H,000H,005H,043H,001H | ||
| 714 | db 002H,003H,002H,081H,000H,005H,084H,000H | ||
| 715 | db 000H,028H,008H,020H,000H,030H,010H,020H | ||
| 716 | db 000H,020H,000H,020H,000H,020H,000H,000H | ||
| 717 | db 000H,000H,000H,000H,020H,000H,020H,000H | ||
| 718 | db 020H,000H,020H,000H,020H,020H,030H,000H | ||
| 719 | db 021H,010H,009H,000H,001H,008H,005H,000H | ||
| 720 | db 047H,006H,005H,000H,001H,088H,009H,000H | ||
| 721 | db 0A1H,010H,030H,000H,020H,020H,020H,000H | ||
| 722 | db 020H,000H,020H,000H,020H,000H,000H,000H | ||
| 723 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 724 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 725 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 726 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 727 | db 080H,000H,080H,000H,080H,000H,080H,000H | ||
| 728 | db 080H,000H,000H,000H,000H,000H,000H,000H | ||
| 729 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 730 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 731 | db 000H,000H,000H,000H,000H,000H,040H,000H | ||
| 732 | db 000H,000H,000H,080H,000H,000H,080H,000H | ||
| 733 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 734 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 735 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 736 | db 000H,000H,000H,000H,000H,000H,000H,008H | ||
| 737 | db 000H,008H,000H,008H,000H,008H,000H,008H | ||
| 738 | db 000H,008H,000H,008H,000H,008H,000H,008H | ||
| 739 | db 000H,008H,000H,008H,000H,000H,000H,000H | ||
| 740 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 741 | db 01BH,03DH,0C2H,000H,015H,0F2H,080H,000H | ||
| 742 | db 002H,001H,002H,001H,002H,001H,002H,001H | ||
| 743 | db 002H,001H,002H,001H,002H,001H,002H,001H | ||
| 744 | db 002H,001H,002H,001H,002H,001H,002H,001H | ||
| 745 | db 002H,001H,002H,001H,002H,001H,002H,001H | ||
| 746 | db 002H,001H,002H,001H,002H,001H,002H,001H | ||
| 747 | db 002H,001H,002H,001H,002H,001H,000H,000H | ||
| 748 | db 010H,080H,080H,010H,080H,010H,080H,050H | ||
| 749 | db 081H,050H,080H,052H,002H,000H,070H,0A4H | ||
| 750 | db 004H,000H,000H,008H,008H,000H,000H,010H | ||
| 751 | db 010H,000H,002H,022H,024H,006H,008H,04AH | ||
| 752 | db 040H,002H,000H,082H,000H,002H,007H,007H | ||
| 753 | db 000H,002H,000H,002H,000H,000H,000H,000H | ||
| 754 | db 000H,000H,000H,000H,000H,000H,030H,020H | ||
| 755 | db 030H,020H,078H,071H,078H,071H,078H,0F9H | ||
| 756 | db 078H,0F9H,07FH,0FFH,000H,080H,000H,080H | ||
| 757 | db 000H,080H,000H,080H,000H,080H,07FH,0FFH | ||
| 758 | db 000H,081H,000H,081H,000H,081H,000H,081H | ||
| 759 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 760 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 761 | db 000H,000H,010H,030H,029H,003H,000H,009H | ||
| 762 | db 040H,041H,024H,001H,000H,081H,000H,0A5H | ||
| 763 | db 000H,081H,012H,080H,001H,082H,000H,090H | ||
| 764 | db 04AH,0C0H,004H,00CH,000H,000H,000H,000H | ||
| 765 | db 000H,000H,000H,000H,000H,000H,01BH,03DH | ||
| 766 | db 032H,000H,015H,0F7H,080H,000H,000H,000H | ||
| 767 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 768 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 769 | db 000H,000H,000H,000H,000H,001H,001H,000H | ||
| 770 | db 000H,002H,002H,000H,000H,000H,000H,000H | ||
| 771 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 772 | db 000H,000H,000H,000H,01BH,03DH,032H,000H | ||
| 773 | db 015H,0F9H,000H,000H,000H,000H,000H,000H | ||
| 774 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 775 | db 080H,080H,080H,080H,080H,080H,000H,000H | ||
| 776 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 777 | db 000H,000H,080H,080H,080H,080H,080H,080H | ||
| 778 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 779 | db 000H,000H,01BH,03DH,062H,000H,015H,0FBH | ||
| 780 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 781 | db 000H,000H,000H,000H,000H,000H,000H,008H | ||
| 782 | db 040H,008H,000H,008H,000H,088H,000H,088H | ||
| 783 | db 0F8H,0F8H,000H,008H,000H,008H,000H,008H | ||
| 784 | db 000H,008H,000H,008H,000H,000H,000H,000H | ||
| 785 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 786 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 787 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 788 | db 008H,080H,000H,000H,080H,008H,0A0H,008H | ||
| 789 | db 0A0H,008H,0A0H,008H,0A0H,008H,020H,000H | ||
| 790 | db 008H,0A0H,050H,050H,000H,000H,000H,000H | ||
| 791 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 792 | db 01BH,03DH,00FH,000H,014H,0BEH,000H,009H | ||
| 793 | db 080H,054H,034H,014H,01EH,014H,034H,054H | ||
| 794 | db 080H,000H,000H,01BH,03DH,032H,000H,015H | ||
| 795 | db 0BEH,000H,000H,000H,000H,000H,080H,000H | ||
| 796 | db 080H,000H,094H,040H,094H,000H,0D4H,020H | ||
| 797 | db 094H,001H,0B4H,011H,014H,001H,014H,009H | ||
| 798 | db 004H,00FH,00EH,009H,004H,001H,014H,011H | ||
| 799 | db 014H,001H,0B4H,020H,094H,000H,0D4H,040H | ||
| 800 | db 094H,000H,094H,000H,080H,000H,080H,000H | ||
| 801 | db 000H,000H,000H,000H | ||
diff --git a/v4.0/src/DEV/PRINTER/4201/4201.MAK b/v4.0/src/DEV/PRINTER/4201/4201.MAK new file mode 100644 index 0000000..a457074 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4201/4201.MAK | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #---- MAKEFILE FOR 4201.CPI ------------ | ||
| 2 | # This make file prevents build output errors for (subdirs.bat config line | ||
| 3 | # Mark Nosewicz | ||
| 4 | |||
| 5 | 4201.CPI: 4201.CPI | ||
| 6 | ECHO 4201.CPI HAS BEEN CHANGED | ||
| 7 | \ No newline at end of file | ||
diff --git a/v4.0/src/DEV/PRINTER/4201/MAKEFILE b/v4.0/src/DEV/PRINTER/4201/MAKEFILE new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4201/MAKEFILE | |||
diff --git a/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM b/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM new file mode 100644 index 0000000..6bb3695 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | |||
| 2 | CODE segment public 'code' | ||
| 3 | ASSUME CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING | ||
| 4 | org 0 | ||
| 5 | |||
| 6 | include copyrigh.inc | ||
| 7 | |||
| 8 | code ends | ||
| 9 | end | ||
| 10 | \ No newline at end of file | ||
diff --git a/v4.0/src/DEV/PRINTER/4208/4208.CPI b/v4.0/src/DEV/PRINTER/4208/4208.CPI new file mode 100644 index 0000000..4fe1a18 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/4208.CPI | |||
| Binary files differ | |||
diff --git a/v4.0/src/DEV/PRINTER/4208/4208.INC b/v4.0/src/DEV/PRINTER/4208/4208.INC new file mode 100644 index 0000000..6aa3dfe --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/4208.INC | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | db 0FFH,046H,04FH,04EH,054H,020H,020H,020H | ||
| 2 | db 000H,000H,000H,000H,000H,000H,000H,000H | ||
| 3 | db 001H,000H,001H,017H,000H,000H,000H,009H | ||
| 4 | db 000H,01AH,000H,035H,000H,000H,000H,002H | ||
| 5 | db 000H,034H,032H,030H,038H,020H,020H,020H | ||
| 6 | db 020H,0B5H,001H,000H,000H,000H,000H,000H | ||
| 7 | db 000H,015H,001H,000H,000H,01AH,000H,051H | ||
| 8 | db 000H,000H,000H,002H,000H,034H,032H,030H | ||
| 9 | db 038H,020H,020H,020H,020H,05EH,003H,000H | ||
| 10 | db 000H,000H,000H,000H,000H,02BH,001H,000H | ||
| 11 | db 000H,01AH,000H,06DH,000H,000H,000H,002H | ||
| 12 | db 000H,034H,032H,030H,038H,020H,020H,020H | ||
| 13 | db 020H,060H,003H,000H,000H,000H,000H,000H | ||
| 14 | db 000H,041H,001H,000H,000H,01AH,000H,089H | ||
| 15 | db 000H,000H,000H,002H,000H,034H,032H,030H | ||
| 16 | db 038H,020H,020H,020H,020H,052H,003H,000H | ||
| 17 | db 000H,000H,000H,000H,000H,057H,001H,000H | ||
| 18 | db 000H,01AH,000H,0A5H,000H,000H,000H,002H | ||
| 19 | db 000H,034H,032H,030H,038H,020H,020H,020H | ||
| 20 | db 020H,053H,003H,000H,000H,000H,000H,000H | ||
| 21 | db 000H,06DH,001H,000H,000H,01AH,000H,0C1H | ||
| 22 | db 000H,000H,000H,002H,000H,034H,032H,030H | ||
| 23 | db 038H,020H,020H,020H,020H,055H,003H,000H | ||
| 24 | db 000H,000H,000H,000H,000H,083H,001H,000H | ||
| 25 | db 000H,01AH,000H,0DDH,000H,000H,000H,002H | ||
| 26 | db 000H,034H,032H,030H,038H,020H,020H,020H | ||
| 27 | db 020H,057H,003H,000H,000H,000H,000H,000H | ||
| 28 | db 000H,099H,001H,000H,000H,01AH,000H,000H | ||
| 29 | db 000H,000H,000H,002H,000H,034H,032H,030H | ||
| 30 | db 038H,020H,020H,020H,020H,05FH,003H,000H | ||
| 31 | db 000H,000H,000H,000H,000H,0AFH,001H,000H | ||
| 32 | db 000H,01AH,000H,000H,000H,000H,000H,002H | ||
| 33 | db 000H,034H,032H,030H,038H,020H,020H,020H | ||
| 34 | db 020H,000H,000H,000H,000H,000H,000H,000H | ||
| 35 | db 000H,000H,000H,000H,000H,001H,000H,001H | ||
| 36 | db 000H,010H,000H,002H,000H,00CH,000H,01BH | ||
| 37 | db 049H,002H,000H,000H,000H,000H,000H,000H | ||
| 38 | db 000H,01BH,036H,001H,000H,001H,000H,010H | ||
| 39 | db 000H,002H,000H,00CH,000H,01BH,049H,00EH | ||
| 40 | db 01BH,049H,007H,01BH,049H,006H,000H,01BH | ||
| 41 | db 036H,001H,000H,001H,000H,010H,000H,002H | ||
| 42 | db 000H,00CH,000H,01BH,049H,00EH,01BH,049H | ||
| 43 | db 007H,01BH,049H,006H,000H,01BH,036H,001H | ||
| 44 | db 000H,001H,000H,010H,000H,002H,000H,00CH | ||
| 45 | db 000H,01BH,049H,00EH,01BH,049H,007H,01BH | ||
| 46 | db 049H,006H,000H,01BH,036H,001H,000H,001H | ||
| 47 | db 000H,010H,000H,002H,000H,00CH,000H,01BH | ||
| 48 | db 049H,00EH,01BH,049H,007H,01BH,049H,006H | ||
| 49 | db 000H,01BH,036H,001H,000H,001H,000H,010H | ||
| 50 | db 000H,002H,000H,00CH,000H,01BH,049H,00EH | ||
| 51 | db 01BH,049H,007H,01BH,049H,006H,000H,01BH | ||
| 52 | db 036H,001H,000H,001H,000H,010H,000H,002H | ||
| 53 | db 000H,00CH,000H,01BH,049H,00EH,01BH,049H | ||
| 54 | db 007H,01BH,049H,006H,000H,01BH,036H,001H | ||
| 55 | db 000H,001H,000H,010H,000H,002H,000H,00CH | ||
| 56 | db 000H,01BH,049H,00EH,01BH,049H,007H,01BH | ||
| 57 | db 049H,006H,000H,01BH,036H,001H,000H,001H | ||
| 58 | db 000H,010H,000H,002H,000H,00CH,000H,01BH | ||
| 59 | db 049H,00EH,01BH,049H,007H,01BH,049H,006H | ||
| 60 | db 000H,01BH,036H,00AH,00DH,054H,068H,065H | ||
| 61 | db 020H,049H,042H,04DH,020H,050H,065H,072H | ||
| 62 | db 073H,06FH,06EH,061H,06CH,020H,043H,06FH | ||
| 63 | db 06DH,070H,075H,074H,065H,072H,020H,050H | ||
| 64 | db 072H,069H,06EH,074H,065H,072H,020H,043H | ||
| 65 | db 06FH,064H,065H,020H,050H,061H,067H,065H | ||
| 66 | db 020H,044H,072H,069H,076H,065H,072H,00AH | ||
| 67 | db 00DH,056H,065H,072H,073H,069H,06FH,06EH | ||
| 68 | db 020H,033H,02EH,033H,030H,020H,028H,043H | ||
| 69 | db 029H,020H,043H,06FH,070H,079H,072H,069H | ||
| 70 | db 067H,068H,074H,020H,049H,042H,04DH,020H | ||
| 71 | db 043H,06FH,072H,070H,020H,031H,039H,038H | ||
| 72 | db 037H,00AH,00DH,04CH,069H,063H,065H,06EH | ||
| 73 | db 073H,065H,064H,020H,04DH,061H,074H,065H | ||
| 74 | db 072H,069H,061H,06CH,020H,02DH,020H,050H | ||
| 75 | db 072H,06FH,067H,072H,061H,06DH,020H,050H | ||
| 76 | db 072H,06FH,070H,065H,072H,074H,079H,020H | ||
| 77 | db 06FH,066H,020H,049H,042H,04DH,01AH,01AH | ||
| 78 | db 040H,040H,040H,023H,023H,023H,020H,044H | ||
| 79 | db 04FH,053H,020H,033H,02EH,033H,030H,020H | ||
| 80 | db 044H,072H,069H,076H,065H,072H,020H,044H | ||
| 81 | db 052H,056H,030H,035H,048H,02CH,020H,031H | ||
| 82 | db 030H,02FH,032H,031H,02FH,038H,036H,00DH | ||
| 83 | db 00AH,01AH,000H,020H,020H,020H,020H,020H | ||
| 84 | db 020H,020H,020H,020H,020H,020H,020H,020H | ||
| 85 | db 020H,020H,020H,020H,020H,020H,020H,020H | ||
| 86 | db 020H,020H,020H,020H,020H,020H,020H,020H | ||
| 87 | db 020H,020H,020H,020H,020H,020H,020H,020H | ||
| 88 | db 020H,020H,020H,020H,020H,020H,020H,020H | ||
| 89 | db 020H,020H,020H,020H,020H,020H,020H,020H | ||
| 90 | db 020H,020H,020H,020H,020H,020H,020H,020H | ||
diff --git a/v4.0/src/DEV/PRINTER/4208/4208.MAK b/v4.0/src/DEV/PRINTER/4208/4208.MAK new file mode 100644 index 0000000..b3d0c4d --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/4208.MAK | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #---- MAKEFILE FOR 4208.CPI ------------ | ||
| 2 | # This make file prevents build output errors for (subdirs.bat config line | ||
| 3 | # Mark Nosewicz | ||
| 4 | |||
| 5 | 4208.CPI: 4208.CPI | ||
| 6 | ECHO 4208.CPI HAS BEEN CHANGED | ||
| 7 | \ No newline at end of file | ||
diff --git a/v4.0/src/DEV/PRINTER/4208/MAKEFILE b/v4.0/src/DEV/PRINTER/4208/MAKEFILE new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/MAKEFILE | |||
diff --git a/v4.0/src/DEV/PRINTER/5202/5202.ASM b/v4.0/src/DEV/PRINTER/5202/5202.ASM new file mode 100644 index 0000000..ed6c3cf --- /dev/null +++ b/v4.0/src/DEV/PRINTER/5202/5202.ASM | |||
| @@ -0,0 +1,108 @@ | |||
| 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2 | ; | ||
| 3 | ; DESCRIPTION : Code Page Switching 5202 Printer Font File | ||
| 4 | ; | ||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | ESC1 EQU 01BH ; | ||
| 7 | ; | ||
| 8 | CSEG SEGMENT ; | ||
| 9 | ASSUME CS:CSEG,DS:CSEG ; | ||
| 10 | BEGIN: ORG 0 ; | ||
| 11 | ; | ||
| 12 | FNTHEAD:DB 0FFH,"FONT " ; FILE TAG | ||
| 13 | DB 8 DUP(0) ; RESERVED | ||
| 14 | DW 1 ; CNT OF POINTERS IN HEADER | ||
| 15 | DB 1 ; TYPE FOR INFO POINTER | ||
| 16 | DW OFFSET INFO,0 ; POINTER TO INFO IN FILE | ||
| 17 | ; | ||
| 18 | info : DW 5 ; COUNT OF ENTRIES | ||
| 19 | ; | ||
| 20 | QUI437: DW LEN_437 ; SIZE OF ENTRY HEADER | ||
| 21 | DW QUI850,0 ; POINTER TO NEXT HEADER | ||
| 22 | DW 2 ; DEVICE TYPE | ||
| 23 | DB "5202 " ; DEVICE SUBTYPE ID | ||
| 24 | DW 437 ; CODE PAGE ID | ||
| 25 | DW 3 DUP(0) ; RESERVED | ||
| 26 | DW OFFSET DATA437,0 ; POINTER TO FONTS | ||
| 27 | LEN_437 EQU ($-QUI437)-2 ; | ||
| 28 | ; | ||
| 29 | QUI850: DW LEN_850 ; SIZE OF ENTRY HEADER | ||
| 30 | DW QUI860,0 ; POINTER TO NEXT HEADER | ||
| 31 | DW 2 ; DEVICE TYPE | ||
| 32 | DB "5202 " ; DEVICE SUBTYPE ID | ||
| 33 | DW 850 ; CODE PAGE ID | ||
| 34 | DW 3 DUP(0) ; RESERVED | ||
| 35 | DW OFFSET DATA850,0 ; POINTER TO FONTS | ||
| 36 | LEN_850 EQU ($-QUI850)-2 ; | ||
| 37 | ; | ||
| 38 | QUI860: DW LEN_860 ; SIZE OF ENTRY HEADER | ||
| 39 | DW QUI863,0 ; POINTER TO NEXT HEADER | ||
| 40 | DW 2 ; DEVICE TYPE | ||
| 41 | DB "5202 " ; DEVICE SUBTYPE ID | ||
| 42 | DW 860 ; CODE PAGE ID | ||
| 43 | DW 3 DUP(0) ; RESERVED | ||
| 44 | DW OFFSET DATA860,0 ; POINTER TO FONTS | ||
| 45 | LEN_860 EQU ($-QUI860)-2 ; | ||
| 46 | ; | ||
| 47 | QUI863: DW LEN_863 ; SIZE OF ENTRY HEADER | ||
| 48 | DW QUI865,0 ; POINTER TO NEXT HEADER | ||
| 49 | DW 2 ; DEVICE TYPE | ||
| 50 | DB "5202 " ; DEVICE SUBTYPE ID | ||
| 51 | DW 863 ; CODE PAGE ID | ||
| 52 | DW 3 DUP(0) ; RESERVED | ||
| 53 | DW OFFSET DATA863,0 ; POINTER TO FONTS | ||
| 54 | LEN_863 EQU ($-QUI863)-2 ; | ||
| 55 | ; | ||
| 56 | QUI865: DW LEN_865 ; SIZE OF ENTRY HEADER | ||
| 57 | DW 0,0 ; POINTER TO NEXT HEADER | ||
| 58 | DW 2 ; DEVICE TYPE | ||
| 59 | DB "5202 " ; DEVICE SUBTYPE ID | ||
| 60 | DW 865 ; CODE PAGE ID | ||
| 61 | DW 3 DUP(0) ; RESERVED | ||
| 62 | DW OFFSET DATA865,0 ; POINTER TO FONTS | ||
| 63 | LEN_865 EQU ($-QUI865)-2 ; | ||
| 64 | ; | ||
| 65 | DATA437:DW 1 ; CART/NON-CART | ||
| 66 | DW 1 ; # OF FONTS | ||
| 67 | DW 16 ; LENGTH OF DATA | ||
| 68 | DW 2 ; SELECTION TYPE | ||
| 69 | DW 12 ; SELECTION length | ||
| 70 | DB ESC1,91,84,5,0,00,00,001H,0B5H,00 ; select code page ****** | ||
| 71 | dB ESC1,"6" ; | ||
| 72 | ; | ||
| 73 | DATA850:DW 1 ; CART/NON-CART | ||
| 74 | DW 1 ; # OF FONTS | ||
| 75 | DW 16 ; LENGTH OF DATA | ||
| 76 | DW 2 ; SELECTION TYPE | ||
| 77 | DW 12 ; SELECTION length | ||
| 78 | DB ESC1,91,84,5,0,00,00,003H,052H,00 ; select code page ****** | ||
| 79 | dB ESC1,"6" ; | ||
| 80 | ; | ||
| 81 | DATA860:DW 1 ; CART/NON-CART | ||
| 82 | DW 1 ; # OF FONTS | ||
| 83 | DW 16 ; LENGTH OF DATA | ||
| 84 | DW 2 ; SELECTION TYPE | ||
| 85 | DW 12 ; SELECTION length | ||
| 86 | DB ESC1,91,84,5,0,00,00,003H,05CH,00 ; select code page ****** | ||
| 87 | dB ESC1,"6" ; | ||
| 88 | ; | ||
| 89 | DATA863:DW 1 ; CART/NON-CART | ||
| 90 | DW 1 ; # OF FONTS | ||
| 91 | DW 16 ; LENGTH OF DATA | ||
| 92 | DW 2 ; SELECTION TYPE | ||
| 93 | DW 12 ; SELECTION length | ||
| 94 | DB ESC1,91,84,5,0,00,00,003H,05FH,00 ; select code page ****** | ||
| 95 | dB ESC1,"6" ; | ||
| 96 | ; | ||
| 97 | DATA865:DW 1 ; CART/NON-CART | ||
| 98 | DW 1 ; # OF FONTS | ||
| 99 | DW 16 ; LENGTH OF DATA | ||
| 100 | DW 2 ; SELECTION TYPE | ||
| 101 | DW 12 ; SELECTION length | ||
| 102 | DB ESC1,91,84,5,0,00,00,003H,061H,00 ; select code page ****** | ||
| 103 | dB ESC1,"6" ; | ||
| 104 | |||
| 105 | include copyrigh.inc | ||
| 106 | |||
| 107 | CSEG ENDS ; | ||
| 108 | END BEGIN ; | ||
diff --git a/v4.0/src/DEV/PRINTER/5202/MAKEFILE b/v4.0/src/DEV/PRINTER/5202/MAKEFILE new file mode 100644 index 0000000..7bb70db --- /dev/null +++ b/v4.0/src/DEV/PRINTER/5202/MAKEFILE | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | #********************** Makefile for Printer\5202.CPI ********************** | ||
| 2 | |||
| 3 | inc =..\..\..\inc | ||
| 4 | dos =..\..\..\dos | ||
| 5 | hinc =..\..\..\h | ||
| 6 | msg =..\..\..\message | ||
| 7 | |||
| 8 | # | ||
| 9 | ######################### Dependencies Begin Here ########################## | ||
| 10 | # | ||
| 11 | |||
| 12 | all: 5202.cpi | ||
| 13 | |||
| 14 | 5202.obj: 5202.asm $(inc)\copyrigh.inc makefile | ||
| 15 | |||
| 16 | |||
| 17 | 5202.cpi: 5202.obj | ||
| 18 | link 5202; | ||
| 19 | exe2bin 5202 5202.cpi | ||
| 20 | del 5202.exe | ||
| 21 | |||
diff --git a/v4.0/src/DEV/PRINTER/CPSFONT.ASM b/v4.0/src/DEV/PRINTER/CPSFONT.ASM new file mode 100644 index 0000000..74fa12b --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSFONT.ASM | |||
| @@ -0,0 +1,1961 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; | ||
| 6 | ;; FILENAME: CPS Device Driver -- Font Parser | ||
| 7 | ;; MODULE NAME: CPSFONT | ||
| 8 | ;; TYPE: Font Parser Module | ||
| 9 | ;; LINK PROCEDURE: Link CPS+CPSSUB+CPSINT9+...+CPSINIT into .EXE format | ||
| 10 | ;; CPS must be first. CPSINIT must be last. Everything | ||
| 11 | ;; before CPSINIT will be resident. | ||
| 12 | ;; INCLUDE FILES: | ||
| 13 | ;; CPSPEQU.INC | ||
| 14 | ;; | ||
| 15 | ;; | ||
| 16 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 17 | ;; | ||
| 18 | INCLUDE CPSPEQU.INC ;; | ||
| 19 | ;; | ||
| 20 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 21 | ;; | ||
| 22 | CSEG SEGMENT PUBLIC 'CODE' ;; | ||
| 23 | ASSUME CS:CSEG ;; | ||
| 24 | ASSUME DS:NOTHING ;; | ||
| 25 | ;; | ||
| 26 | PUBLIC FTABLE,FONT_PARSER ;; | ||
| 27 | ;; | ||
| 28 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 29 | ;; | ||
| 30 | ;; ************************************ | ||
| 31 | ;; ** ** | ||
| 32 | ;; ** Resident Code ** | ||
| 33 | ;; ** ** | ||
| 34 | ;; ************************************ | ||
| 35 | ;; | ||
| 36 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 37 | ;; | ||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | ;; | ||
| 40 | ;; FONT_PARSER data | ||
| 41 | ;; | ||
| 42 | ;; -- Interface table : FTABLE | ||
| 43 | ;; | ||
| 44 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 45 | FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing | ||
| 46 | FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries | ||
| 47 | FTB2 FTBLK <,,,,,,,,,,,,> ;; | ||
| 48 | FTB3 FTBLK <,,,,,,,,,,,,> ;; | ||
| 49 | FTB4 FTBLK <,,,,,,,,,,,,> ;; | ||
| 50 | FTB5 FTBLK <,,,,,,,,,,,,> ;; | ||
| 51 | FTB6 FTBLK <,,,,,,,,,,,,> ;; | ||
| 52 | FTB7 FTBLK <,,,,,,,,,,,,> ;; | ||
| 53 | FTB8 FTBLK <,,,,,,,,,,,,> ;; | ||
| 54 | FTB9 FTBLK <,,,,,,,,,,,,> ;; | ||
| 55 | FTBa FTBLK <,,,,,,,,,,,,> ;; | ||
| 56 | FTBb FTBLK <,,,,,,,,,,,,> ;; | ||
| 57 | FTBc FTBLK <,,,,,,,,,,,,> ;; | ||
| 58 | ;; | ||
| 59 | FP_ERROR DW 0000H ;; internal error register | ||
| 60 | ;; | ||
| 61 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 62 | ;; the followings are bytes accumulated | ||
| 63 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 64 | FTAG_LEN EQU 8 ;; FILE TAGE in the font file header | ||
| 65 | FTAG_COUNT DW 0000H ;; | ||
| 66 | ;; | ||
| 67 | FTAG_PATTERN LABEL BYTE ;; | ||
| 68 | DB 0FFH ;; | ||
| 69 | DB 'FONT ' ;; | ||
| 70 | ;; | ||
| 71 | ;; | ||
| 72 | ;; POINTER in the font file header | ||
| 73 | fptr_LOW LABEL WORD ;; | ||
| 74 | fptr_LOL DB 00H ;; NEXT | ||
| 75 | fptr_LOH DB 00H ;; | ||
| 76 | fptr_HIGH LABEL WORD ;; | ||
| 77 | fptr_HIL DB 00H ;; | ||
| 78 | fptr_HIH DB 00H ;; | ||
| 79 | ;; | ||
| 80 | ;; | ||
| 81 | ;; | ||
| 82 | ENTRY_WORD LABEL WORD ;; | ||
| 83 | ENTRY_LOB DB 00H ;; ENTRY COUNT | ||
| 84 | ENTRY_HIB DB 00H ;; | ||
| 85 | NEXT_LOW LABEL WORD ;; | ||
| 86 | NEXT_LOL DB 00H ;; NEXT | ||
| 87 | NEXT_LOH DB 00H ;; | ||
| 88 | NEXT_HIGH LABEL WORD ;; | ||
| 89 | NEXT_HIL DB 00H ;; | ||
| 90 | NEXT_HIH DB 00H ;; | ||
| 91 | TYPE_WORD LABEL WORD ;; | ||
| 92 | TYPE_LOB DB 00H ;; TYPE | ||
| 93 | TYPE_HIB DB 00H ;; | ||
| 94 | TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8) | ||
| 95 | TYPE_ID : DB ' ' ;; TYPEID | ||
| 96 | CPG_WORD LABEL WORD ;; | ||
| 97 | CPG_LOB DB 00H ;; CODE PAGE | ||
| 98 | CPG_HIB DB 00H ;; | ||
| 99 | FONT_LOW LABEL WORD ;; | ||
| 100 | FONT_LOL DB 00H ;; FONT ADDRESS | ||
| 101 | FONT_LOH DB 00H ;; | ||
| 102 | FONT_HIGH LABEL WORD ;; | ||
| 103 | FONT_HIL DB 00H ;; | ||
| 104 | FONT_HIH DB 00H ;; | ||
| 105 | ;; the followings are contained in the font-block in the exact order & length | ||
| 106 | MOD_WORD LABEL WORD ;; | ||
| 107 | MOD_LOB DB 00H ;; MODIFIER | ||
| 108 | MOD_HIB DB 00H ;; | ||
| 109 | FONTS_WORD LABEL WORD ;; | ||
| 110 | FONTS_LOB DB 00H ;; FONTS | ||
| 111 | FONTS_HIB DB 00H ;; | ||
| 112 | FDLEN_WORD LABEL WORD ;; | ||
| 113 | FDLEN_LOB DB 00H ;; FONT DATA LENGTH | ||
| 114 | FDLEN_HIB DB 00H ;; | ||
| 115 | PRE_FONT_ND EQU ($-MOD_WORD) ;; used to update target for font data | ||
| 116 | ;; to follow. -- for NON-DISPLAY | ||
| 117 | DISP_ROWS DB 00H ;; DISPLAY's parameters : | ||
| 118 | DISP_COLS DB 00H ;; BOX SIZE | ||
| 119 | DISP_X DB 00H ;; ASPECT RATIO | ||
| 120 | DISP_Y DB 00H ;; | ||
| 121 | COUNT_WORD LABEL WORD ;; NO. OF DISPLAY CHARACTERS | ||
| 122 | COUNT_LOB DB 00H ;; | ||
| 123 | COUNT_HIB DB 00H ;; | ||
| 124 | PRE_FONT_D EQU ($-MOD_WORD) ;; used to update target for font data | ||
| 125 | ;; to follow. -- for DISPLAY | ||
| 126 | ;; | ||
| 127 | PTR_SEL_WORD LABEL WORD ;; | ||
| 128 | PTR_SELOB DB 00H ;; | ||
| 129 | PTR_SEHIB DB 00H ;; | ||
| 130 | PRE_FONT_P0 EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data | ||
| 131 | ;; to follow -- for PRINTER with | ||
| 132 | ;; selection type = 0. | ||
| 133 | ;; | ||
| 134 | PTR_LEN_WORD LABEL WORD ;; | ||
| 135 | PTR_LNLOB DB 00H ;; | ||
| 136 | PTR_LNHIB DB 00H ;; | ||
| 137 | PRE_FONT_P EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data | ||
| 138 | ;; to follow -- for PRINTER with | ||
| 139 | ;; selection type <> 0. | ||
| 140 | ;; | ||
| 141 | ;; | ||
| 142 | ;; also update STAGE_CASES and indexing constants | ||
| 143 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 144 | ;; the stage the parsing is in : ;;;;; | ||
| 145 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 146 | ;; | ||
| 147 | STAGE_CASES LABEL WORD ;; the stage the parsing is in : | ||
| 148 | ;; | ||
| 149 | ;; *** INDEXED BY STAGE-INDEX | ||
| 150 | ;; | ||
| 151 | DW OFFSET ENTRYLO ;; 0 | ||
| 152 | DW OFFSET ENTRYHI ;; 1 | ||
| 153 | DW OFFSET NEXTLOL ;; 2 | ||
| 154 | DW OFFSET NEXTLOH ;; 3 | ||
| 155 | DW OFFSET NEXTHIL ;; 4 | ||
| 156 | DW OFFSET NEXTHIH ;; 5 | ||
| 157 | DW OFFSET TYPELO ;; 6 | ||
| 158 | DW OFFSET TYPEHI ;; 7 | ||
| 159 | DW OFFSET TYPEIDS ;; 8 | ||
| 160 | DW OFFSET CPGLO ;; 9 | ||
| 161 | DW OFFSET CPGHI ;; A | ||
| 162 | DW OFFSET FONTLOL ;; B | ||
| 163 | DW OFFSET FONTLOH ;; C | ||
| 164 | DW OFFSET FONTHIL ;; D | ||
| 165 | DW OFFSET FONTHIH ;; E | ||
| 166 | DW 00H ;; MATCH case -- end of SEARCH stages | ||
| 167 | DW 00H ;; SCAN case -- before PRE-FOUND stage | ||
| 168 | DW OFFSET MODLO ;; 11 | ||
| 169 | DW OFFSET MODHI ;; 12 | ||
| 170 | DW OFFSET FONTSLO ;; 13 | ||
| 171 | DW OFFSET FONTSHI ;; 14 | ||
| 172 | DW OFFSET FDLENLO ;; 15 | ||
| 173 | DW OFFSET FDLENHI ;; 16 -- lead to FONT case,NON- DISPLAY | ||
| 174 | DW OFFSET DSPROWS ;; 17 -- DISPLAY only | ||
| 175 | DW OFFSET DSPCOLS ;; 18 | ||
| 176 | DW OFFSET DSPX ;; 19 | ||
| 177 | DW OFFSET DSPY ;; 1A | ||
| 178 | DW OFFSET DSPCOUNTLO ;; 1B | ||
| 179 | DW OFFSET DSPCOUNTHI ;; 1C -- lead to FONT case, DISPLAY | ||
| 180 | DW OFFSET PTRSELLO ;; 1D -- PRINTER only | ||
| 181 | DW OFFSET PTRSELHI ;; 1E | ||
| 182 | DW OFFSET PTRLENLO ;; 1F | ||
| 183 | DW OFFSET PTRLENHI ;; 20 -- lead to FONT case, PRINTER | ||
| 184 | DW 00H ;; FOUND case | ||
| 185 | DW 00H ;; GET_FONT case | ||
| 186 | DW 00H ;; PASS special stage | ||
| 187 | DW OFFSET FILETAG ;; 24 | ||
| 188 | DW OFFSET fptrLOL ;; 25 | ||
| 189 | DW OFFSET fptrLOH ;; 26 | ||
| 190 | DW OFFSET fptrHIL ;; 27 | ||
| 191 | DW OFFSET fptrHIH ;; 28 | ||
| 192 | DW 00H ;; FPTR_SKIP_CASE | ||
| 193 | ;; | ||
| 194 | ;; The followings are individual stage | ||
| 195 | STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages | ||
| 196 | ;; | ||
| 197 | ;; STAGE-INDEX | ||
| 198 | ;; | ||
| 199 | ;; **** INDEX TO STAGE_CASES **** | ||
| 200 | ENTRY_LOX EQU 00H ;; | ||
| 201 | ENTRY_HIX EQU 01H ;; | ||
| 202 | NEXT_LOLX EQU 02H ;; NEXT | ||
| 203 | NEXT_LOHX EQU 03H ;; | ||
| 204 | NEXT_HILX EQU 04H ;; | ||
| 205 | NEXT_HIHX EQU 05H ;; | ||
| 206 | TYPE_LOBX EQU 06H ;; TYPE | ||
| 207 | TYPE_HIBX EQU 07H ;; | ||
| 208 | TYPE_IDX EQU 08H ;; TYPEID | ||
| 209 | CPG_LOBX EQU 09H ;; CODE PAGE | ||
| 210 | CPG_HIBX EQU 0AH ;; | ||
| 211 | FONT_LOLX EQU 0BH ;; FONT ADDRESS | ||
| 212 | FONT_LOHX EQU 0CH ;; | ||
| 213 | FONT_HILX EQU 0DH ;; | ||
| 214 | FONT_HIHX EQU 0EH ;; | ||
| 215 | ;; ------------------------------ | ||
| 216 | MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages | ||
| 217 | SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages | ||
| 218 | ;; ------------------------------ | ||
| 219 | MOD_LOBX EQU 11H ;; MODIFIER | ||
| 220 | MOD_HIBX EQU 12H ;; | ||
| 221 | FONTS_LOBX EQU 13H ;; FONTS | ||
| 222 | FONTS_HIBX EQU 14H ;; | ||
| 223 | FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH | ||
| 224 | FDLEN_HIBX EQU 16H ;; | ||
| 225 | DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE | ||
| 226 | DISP_COLSX EQU 18H ;; | ||
| 227 | DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO | ||
| 228 | DISP_YX EQU 1AH ;; | ||
| 229 | COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT | ||
| 230 | COUNT_HIBX EQU 1CH ;; | ||
| 231 | PTRSELLOX EQU 1DH ;; | ||
| 232 | PTRSELHIX EQU 1EH ;; | ||
| 233 | PTRLENLOX EQU 1FH ;; | ||
| 234 | PTRLENHIX EQU 20H ;; | ||
| 235 | ;; | ||
| 236 | ;; ------------------------------ | ||
| 237 | FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage | ||
| 238 | GET_FX EQU 22H ;; | ||
| 239 | ;; ------------------------------ | ||
| 240 | PASSX EQU 23H ;; see pass_brk table | ||
| 241 | ;; ------------------------------ | ||
| 242 | FTAGX EQU 24H ;; RESTART ==> FILE TAG | ||
| 243 | ;; | ||
| 244 | fptr_LOLX EQU 25H ;; POINTER in font file header | ||
| 245 | fptr_LOHX EQU 26H ;; | ||
| 246 | fptr_HILX EQU 27H ;; | ||
| 247 | fptr_HIHX EQU 28H ;; --------------------------------- | ||
| 248 | ;; | ||
| 249 | fptr_SKIPX EQU 29H ;; ==> ENTRY_LOX | ||
| 250 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 251 | ;; PASS -- to skip some bytes ;;;;;; | ||
| 252 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 253 | ;; the PASS mechanism is used to skip | ||
| 254 | ;; a number of bytes between two fields | ||
| 255 | ;; The numbers are tabulated in | ||
| 256 | ;; PASS_BRK table in the accumulative | ||
| 257 | ;; sum. The PASS_POSTX(and PASS_POSTXX) | ||
| 258 | ;; are used to tell what is the stage | ||
| 259 | ;; after all the bytes have skipped. | ||
| 260 | ;; | ||
| 261 | PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage | ||
| 262 | ;; | ||
| 263 | FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file : | ||
| 264 | ;; ( after TAG, before POINTER) | ||
| 265 | ;; | ||
| 266 | PASS_CNT DW 0 ;; | ||
| 267 | PASS_BRK LABEL WORD ;; | ||
| 268 | DW FILE_OFFSET ;; skip in the font file header | ||
| 269 | DW FILE_OFFSET+2 ;; pass header-length, needs to reset | ||
| 270 | ;; PASS_CNT for each of the font_header | ||
| 271 | DW FILE_OFFSET+8 ;; pass header-reserved bytes | ||
| 272 | PASS_INDX EQU ($-PASS_BRK)/2 ;; | ||
| 273 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 274 | ;; the control variables : ;;;;;;;; | ||
| 275 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 276 | STAGE DW STAGE_MAX ;; of the STAGE-INDEX | ||
| 277 | ;; | ||
| 278 | Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA | ||
| 279 | ;; | ||
| 280 | ;; | ||
| 281 | COUNT_LO DW 00000H ;; no. of bytes parsed so far | ||
| 282 | COUNT_hI DW 00000H ;; | ||
| 283 | ;; | ||
| 284 | HIT_LO DW 00000H ;; the next byte that is addressed by : | ||
| 285 | HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK. | ||
| 286 | ;; | ||
| 287 | HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching | ||
| 288 | HIT_BX DW 00000H ;; where FTB is found for nearest hit | ||
| 289 | ;; | ||
| 290 | NUM_FTB DW 00000H ;; as defined in the FP_BUFFER | ||
| 291 | ;; | ||
| 292 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 293 | ;; | ||
| 294 | ;; FONT_PARSER routine | ||
| 295 | ;; | ||
| 296 | ;; -- to be called at every packet received to extract informations | ||
| 297 | ;; from Font File on byte basis. | ||
| 298 | ;; | ||
| 299 | ;; -- Interface though FTABLE | ||
| 300 | ;; | ||
| 301 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 302 | ;; | ||
| 303 | FONT_PARSER PROC ;; | ||
| 304 | PUSH DS ;; save all registers Revised | ||
| 305 | PUSH ES ;; | ||
| 306 | PUSH AX ;; | ||
| 307 | PUSH BX ;; | ||
| 308 | PUSH CX ;; | ||
| 309 | PUSH DX ;; | ||
| 310 | PUSH DI ;; | ||
| 311 | PUSH SI ;; | ||
| 312 | ;; BP isn't used, so it isn't saved | ||
| 313 | LEA BX,FTABLE ;; | ||
| 314 | PUSH CS ;; | ||
| 315 | POP ES ;; ES:[BX] | ||
| 316 | LDS SI,FTP.BUFFER_ADDR ;; DS:[SI] | ||
| 317 | MOV CX,FTP.BUFFER_LEN ;; CX = length of packet | ||
| 318 | MOV DX,FTP.NUM_FTBLK ;; DX = number of FTB | ||
| 319 | MOV cs:num_ftb,DX ;; | ||
| 320 | AND DX,DX ;; | ||
| 321 | JNZ VALID_BUFFER ;; | ||
| 322 | MOV cs:fp_error,0020H ;; ERROR 0020H | ||
| 323 | JMP FP_RET ;; | ||
| 324 | VALID_BUFFER : ;; | ||
| 325 | MOV AX,FTP.FLAG ;; | ||
| 326 | AND AX,FLAG_RESTART ;; | ||
| 327 | Jnz has_RESTART ;; | ||
| 328 | JMP NO_RESTART ;; | ||
| 329 | ;; | ||
| 330 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 331 | has_restart : ;; | ||
| 332 | PUSH BX ;; reset all the output fields | ||
| 333 | ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK | ||
| 334 | XOR AX,AX ;; | ||
| 335 | ;; | ||
| 336 | MOV cs:ftag_count,AX ;; | ||
| 337 | MOV cs:fptr_low,AX ;; | ||
| 338 | MOV cs:fptr_high,AX ;; | ||
| 339 | MOV cs:pre_font_len,AX ;; | ||
| 340 | MOV cs:count_lo,AX ;; | ||
| 341 | MOV cs:count_hi,AX ;; | ||
| 342 | MOV cs:next_low,AX ;; | ||
| 343 | MOV cs:next_high,AX ;; | ||
| 344 | MOV cs:hit_lo,AX ;; | ||
| 345 | MOV cs:hit_hi,AX ;; | ||
| 346 | MOV cs:hit_flag,AX ;; | ||
| 347 | MOV cs:pass_cnt,AX ;; | ||
| 348 | MOV cs:pass_postx,STAGE_MAX ;; | ||
| 349 | ;; | ||
| 350 | MOV cs:stage,STAGE_MAX ;; | ||
| 351 | ;; | ||
| 352 | RESET_FTB : ;; | ||
| 353 | MOV FTP.FTB_STATUS,FSTAT_SEARCH | ||
| 354 | MOV FTP.FTB_TYPE,AX ;; | ||
| 355 | MOV FTP.FTB_MOD,AX ;; | ||
| 356 | MOV FTP.FTB_FONTS,AX ;; | ||
| 357 | MOV FTP.FTB_ROWS,AL ;; | ||
| 358 | MOV FTP.FTB_COLS,AL ;; | ||
| 359 | MOV FTP.FTB_X,AL ;; | ||
| 360 | MOV FTP.FTB_Y,AL ;; | ||
| 361 | MOV FTP.FTB_COUNT,AX ;; | ||
| 362 | MOV FTP.FTB_DLEFT,AX ;; | ||
| 363 | MOV FTP.FTB_DLEN,AX ;; | ||
| 364 | MOV FTP.FTB_DALO,AX ;; | ||
| 365 | MOV FTP.FTB_DAHI,AX ;; | ||
| 366 | MOV FTP.TARGET_LO,AX ;; | ||
| 367 | MOV FTP.TARGET_HI,AX ;; | ||
| 368 | ;; | ||
| 369 | ADD BX, TYPE FTBLK ;; | ||
| 370 | ;; | ||
| 371 | DEC DX ;; | ||
| 372 | AND DX,DX ;; | ||
| 373 | JNZ RESET_FTB ;; | ||
| 374 | ;; | ||
| 375 | POP BX ;; | ||
| 376 | NO_RESTART : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 377 | ;; any FTBLKs have their data all | ||
| 378 | ;; returned ? if so set their status | ||
| 379 | ;; from FOUND to COMPLETE | ||
| 380 | PUSH BX ;; | ||
| 381 | ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK | ||
| 382 | ;; | ||
| 383 | MOV DX,cs:num_ftb ;; | ||
| 384 | ;; | ||
| 385 | SET_COMPLETE : ;; | ||
| 386 | MOV AX,FTP.FTB_STATUS ;; | ||
| 387 | CMP AX,FSTAT_FONT ;; | ||
| 388 | JNE SET_NEXT ;; | ||
| 389 | ;; | ||
| 390 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 391 | AND AX,AX ;; | ||
| 392 | JNZ SET_NEXT ;; | ||
| 393 | ;; | ||
| 394 | MOV FTP.FTB_STATUS,FSTAT_COMPLETE | ||
| 395 | ;; | ||
| 396 | SET_NEXT : ;; | ||
| 397 | ;; | ||
| 398 | ADD BX,TYPE FTBLK ;; | ||
| 399 | ;; | ||
| 400 | DEC DX ;; | ||
| 401 | AND DX,DX ;; | ||
| 402 | JNZ SET_COMPLETE ;; | ||
| 403 | ;; | ||
| 404 | POP BX ;; | ||
| 405 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 406 | ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK | ||
| 407 | ;; | ||
| 408 | PUSH CX ;; STACK 1 = CX | ||
| 409 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 410 | ;; | ||
| 411 | ;; DO WHILE CX is not zero : | ||
| 412 | ;; | ||
| 413 | ;; -- on each loop, the CX, COUNTs are updated | ||
| 414 | ;; | ||
| 415 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 416 | ;; | ||
| 417 | ;; | ||
| 418 | FTB_LOOP : ;; | ||
| 419 | POP AX ;; STACK -1 | ||
| 420 | SUB AX,CX ;; | ||
| 421 | ADD cs:count_lo,AX ;; | ||
| 422 | JNC NO_CARRY ;; | ||
| 423 | ADD cs:count_hi,1000H ;; | ||
| 424 | NO_CARRY : ;; | ||
| 425 | PUSH CX ;; STACK 1 = CX | ||
| 426 | AND CX,CX ;; | ||
| 427 | JNZ FTB_CONT ;; | ||
| 428 | JMP FTB_LPEND ;; | ||
| 429 | ;; DO CASES : | ||
| 430 | FTB_CONT : ;; ========== | ||
| 431 | ;; | ||
| 432 | MOV AX,cs:stage ;; | ||
| 433 | ;; | ||
| 434 | CMP AX,STAGE_MAX ;; | ||
| 435 | JNE FTB_010 ;; | ||
| 436 | JMP START_CASE ;; ** RESTART ** | ||
| 437 | ;; | ||
| 438 | FTB_010 : ;; | ||
| 439 | CMP AX,MATCHX ;; | ||
| 440 | JAE FTB_020 ;; | ||
| 441 | JMP SEARCH_CASE ;; ** SEARCH ** | ||
| 442 | ;; | ||
| 443 | FTB_020 : ;; | ||
| 444 | CMP AX,MATCHX ;; | ||
| 445 | JNE FTB_030 ;; | ||
| 446 | JMP MATCH_CASE ;; ** MATCH ** | ||
| 447 | ;; | ||
| 448 | FTB_030 : ;; | ||
| 449 | CMP AX,SCANX ;; | ||
| 450 | JNE FTB_040 ;; | ||
| 451 | JMP SCAN_CASE ;; ** SCAN ** | ||
| 452 | ;; | ||
| 453 | FTB_040 : ;; | ||
| 454 | CMP AX,FOUNDX ;; | ||
| 455 | JAE FTB_050 ;; | ||
| 456 | JMP PRE_FOUND_CASE ;; ** PRE-FOUND ** | ||
| 457 | ;; | ||
| 458 | FTB_050 : ;; | ||
| 459 | CMP AX,FOUNDX ;; | ||
| 460 | JNE FTB_060 ;; | ||
| 461 | JMP FOUND_CASE ;; ** FOUND ** | ||
| 462 | ;; | ||
| 463 | FTB_060 : ;; | ||
| 464 | CMP AX,GET_FX ;; | ||
| 465 | JNE FTB_070 ;; | ||
| 466 | JMP GETFONT_CASE ;; ** GET_FONT ** | ||
| 467 | ;; | ||
| 468 | FTB_070 : ;; | ||
| 469 | CMP AX,PASSX ;; | ||
| 470 | JNE FTB_080 ;; | ||
| 471 | JMP PASS ;; ** PASS ** | ||
| 472 | ;; | ||
| 473 | FTB_080 : ;; | ||
| 474 | CMP AX,FPTR_SKIPX ;; | ||
| 475 | JAE FTB_090 ;; | ||
| 476 | JMP SEARCH_CASE ;; ** SEARCH ** | ||
| 477 | ;; | ||
| 478 | FTB_090 : ;; | ||
| 479 | CMP AX,FPTR_SKIPX ;; | ||
| 480 | JNE FTB_FFF ;; | ||
| 481 | JMP FPTR_SKIP_CASE ;; ** SEARCH ** | ||
| 482 | ;; | ||
| 483 | FTB_FFF : ;; | ||
| 484 | MOV FTP.FTB_STATUS,STAT_DEVERR | ||
| 485 | JMP FTB_LPEND ;; ** DEVICE ERROR ** | ||
| 486 | ;; | ||
| 487 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 488 | ;; | ||
| 489 | ;; at the entry of each STAGES /CASES | ||
| 490 | ;; | ||
| 491 | ;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer | ||
| 492 | ;; -- CX remaining packet length | ||
| 493 | ;; -- ES:[BX] points to the first FTBLK | ||
| 494 | ;; -- COUNT_LO, COUNT_HI, upto but and including the address pointed by FPKT | ||
| 495 | ;; | ||
| 496 | ;; | ||
| 497 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 498 | ;; | ||
| 499 | ;============================================================================ | ||
| 500 | START_CASE : ;; pass the FILE leading bytes | ||
| 501 | ;; | ||
| 502 | MOV cs:ftag_count,0 ;; | ||
| 503 | MOV cs:stage,ftagx ;; | ||
| 504 | JMP FTB_LOOP ;; | ||
| 505 | ;; | ||
| 506 | ;============================================================================= | ||
| 507 | FPTR_SKIP_CASE : ;; skip until the ENTRY pointed by | ||
| 508 | ;; POINTER (in FPTR) is reached. | ||
| 509 | ;; | ||
| 510 | ;; ************** | ||
| 511 | MOV AX,cs:fptr_low ;; * HIT = FPTR * | ||
| 512 | MOV cs:hit_lo,AX ;; ************** | ||
| 513 | MOV DX,cs:fptr_high ;; | ||
| 514 | MOV cs:hit_hi,DX ;; | ||
| 515 | ;; | ||
| 516 | CMP AX,0FFFFH ;; | ||
| 517 | JNE FPTR_SKIP_VALID ;; | ||
| 518 | CMP DX,0FFFFH ;; | ||
| 519 | JNE FPTR_SKIP_VALID ;; | ||
| 520 | ;; | ||
| 521 | MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK | ||
| 522 | JMP FPTR_SKIP_MORE ;; | ||
| 523 | ;; | ||
| 524 | FPTR_SKIP_VALID : ;; | ||
| 525 | ;; normalised HIT_HI, HIT_LO | ||
| 526 | MOV AX,DX ;; | ||
| 527 | AND AX,00FFFH ;; | ||
| 528 | PUSH CX ;; | ||
| 529 | MOV CX,4 ;; | ||
| 530 | SHL AX,CL ;; | ||
| 531 | POP CX ;; | ||
| 532 | AND DX,0F000H ;; | ||
| 533 | ADD AX,cs:hit_lo ;; | ||
| 534 | JNC NO_CARRY10 ;; | ||
| 535 | ADD DX,01000H ;; | ||
| 536 | NO_CARRY10: ;; | ||
| 537 | MOV cs:hit_lo,AX ;; | ||
| 538 | MOV cs:hit_hi,DX ;; | ||
| 539 | ;; ************************** | ||
| 540 | ;; * compare FPTR and COUNT * | ||
| 541 | ;; ************************** | ||
| 542 | ;; DX:AX = HIT_HI:HIT_LO (normalised) | ||
| 543 | ;; | ||
| 544 | SUB AX,cs:count_lo ;; | ||
| 545 | Jnc more_fptrlo ;; | ||
| 546 | sub dx,01000h ;; | ||
| 547 | jc fptr_bad ;; | ||
| 548 | ;; | ||
| 549 | more_fptrlo : ;; | ||
| 550 | SUB DX,cs:count_hi ;; | ||
| 551 | JC fptr_BAD ;; | ||
| 552 | ;; | ||
| 553 | INC AX ;; COUNT can be at the HIT, then AX=0 | ||
| 554 | JNC NO_CARRY11 ;; INC AX to make AX comparable to CX | ||
| 555 | ADD DX,01000H ;; i.e. AX = offset + 1 | ||
| 556 | ;; | ||
| 557 | NO_CARRY11: ;; | ||
| 558 | CMP AX,CX ;; | ||
| 559 | JA fptr_skip_more ;; AX > CX, whole CX to be skipped | ||
| 560 | ;; | ||
| 561 | PUSH DX ;; normalise dx:ax | ||
| 562 | AND DX,00FFFH ;; | ||
| 563 | PUSH CX ;; | ||
| 564 | MOV CX,4 ;; | ||
| 565 | SHL DX,CL ;; | ||
| 566 | POP CX ;; | ||
| 567 | ADD AX,DX ;; | ||
| 568 | POP DX ;; | ||
| 569 | JNC NO_CARRY13 ;; | ||
| 570 | ADD DX,01000H ;; | ||
| 571 | NO_CARRY13: ;; | ||
| 572 | AND DX,0F000H ;; | ||
| 573 | ;; | ||
| 574 | PUSH AX ;; | ||
| 575 | PUSH DX ;; STACK +1 : normalosed DX:AX | ||
| 576 | SUB AX,CX ;; | ||
| 577 | JNC NO_BORROW11 ;; | ||
| 578 | SUB DX,1000H ;; | ||
| 579 | JC fptr_MORE_CXp ;; dx:ax < cx | ||
| 580 | NO_BORROW11: ;; | ||
| 581 | ;; dx:ax >= cx | ||
| 582 | AND AX,AX ;; | ||
| 583 | JNE fptr_skip_MOREP ;; | ||
| 584 | AND DX,DX ;; | ||
| 585 | JNE fptr_skip_MOREP ;; | ||
| 586 | ;; dx:ax = cx, or | ||
| 587 | ;; offset + 1 = CX | ||
| 588 | ;; | ||
| 589 | ;; ************************************ | ||
| 590 | ;; * POINTER is within the current CX * | ||
| 591 | ;; ************************************ | ||
| 592 | fptr_MORE_CXP : ;; | ||
| 593 | POP DX ;; | ||
| 594 | POP AX ;; STACK -1 | ||
| 595 | ;; | ||
| 596 | fptr_MORE_CX : ;; DX = 0,to have more CX than offset+1 | ||
| 597 | DEC AX ;; = offset : 0 and above | ||
| 598 | SUB CX,AX ;; | ||
| 599 | ADD SI,AX ;; where the first byte is | ||
| 600 | ;; | ||
| 601 | MOV cs:stage,entry_lox ;; ENTRIES in the font file | ||
| 602 | ;; | ||
| 603 | JMP FTB_LOOP ;; ****** RETURN ******* | ||
| 604 | ;; | ||
| 605 | ;; *********************************** | ||
| 606 | ;; * more to skip ==> FPTR_SKIP_CASE * | ||
| 607 | ;; *********************************** | ||
| 608 | fptr_skip_morep: ;; | ||
| 609 | POP DX ;; | ||
| 610 | POP AX ;; STACK -1 | ||
| 611 | ;; | ||
| 612 | fptr_skip_more : ;; | ||
| 613 | ADD SI,CX ;; | ||
| 614 | SUB CX,CX ;; | ||
| 615 | JMP FTB_LOOP ;; ****** RETURN ***** | ||
| 616 | ;; | ||
| 617 | ;; *********************************** | ||
| 618 | ;; * bad POINTER in font file header * | ||
| 619 | ;; *********************************** | ||
| 620 | ;; | ||
| 621 | fptr_bad : ;; | ||
| 622 | MOV cs:fptr_low,0FFFFH ;; | ||
| 623 | MOV cs:fptr_high,0FFFFH ;; | ||
| 624 | ;; | ||
| 625 | MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK | ||
| 626 | ;; | ||
| 627 | JMP FPTR_SKIP_MORE ;; | ||
| 628 | ;; | ||
| 629 | ;============================================================================= | ||
| 630 | SEARCH_CASE : ;; | ||
| 631 | ;; still looking for header to match | ||
| 632 | ;; the input : codepage and typeid | ||
| 633 | ;; | ||
| 634 | MOV DI,cs:stage ;; | ||
| 635 | ;; | ||
| 636 | ADD DI,DI ;; double to index to WORD-offset | ||
| 637 | ;; | ||
| 638 | JMP CS:STAGE_CASES[DI] ;; call routine to process the stage | ||
| 639 | ;; | ||
| 640 | ;; | ||
| 641 | ;=========================================================================== | ||
| 642 | MATCH_CASE : ;; | ||
| 643 | ;; | ||
| 644 | PUSH BX ;; | ||
| 645 | MOV DX,cs:num_ftb ;; | ||
| 646 | ;; | ||
| 647 | ;; | ||
| 648 | MATCH_LOOP : ;; | ||
| 649 | MOV AX,FTP.FTB_STATUS ;; | ||
| 650 | CMP AX,FSTAT_SEARCH ;; | ||
| 651 | JE MATCH_SEARCH ;; | ||
| 652 | JMP MATCH_NEXT ;; | ||
| 653 | ;; | ||
| 654 | MATCH_SEARCH : ;; | ||
| 655 | MOV AX,FTP.FTB_CP ;; check the FTB with SEARCH status | ||
| 656 | CMP AX,cs:cpg_word ;; | ||
| 657 | JNE MATCH_MORE ;; | ||
| 658 | PUSH DS ;; code page matched | ||
| 659 | PUSH SI ;; | ||
| 660 | PUSH CX ;; | ||
| 661 | ;; | ||
| 662 | PUSH CS ;; | ||
| 663 | POP DS ;; | ||
| 664 | MOV SI,OFFSET TYPE_ID ;; | ||
| 665 | LEA DI,[BX].FTB_TID ;; | ||
| 666 | MOV CX,8 ;; | ||
| 667 | REPE CMPSB ;; | ||
| 668 | ;; | ||
| 669 | POP CX ;; | ||
| 670 | POP SI ;; | ||
| 671 | POP DS ;; | ||
| 672 | ;; | ||
| 673 | JNE MATCH_MORE ;; | ||
| 674 | ;; MATCH !!!!! (type_id matched) | ||
| 675 | MOV FTP.FTB_STATUS,FSTAT_MATCH | ||
| 676 | MOV AX,cs:type_word ;; | ||
| 677 | MOV FTP.FTB_TYPE,AX ;; | ||
| 678 | MOV AX,cs:font_low ;; | ||
| 679 | MOV FTP.TARGET_LO,AX ;; | ||
| 680 | MOV AX,cs:font_high ;; | ||
| 681 | MOV FTP.TARGET_HI,AX ;; | ||
| 682 | ;; | ||
| 683 | JMP MATCH_NEXT ;; | ||
| 684 | ;; | ||
| 685 | MATCH_MORE : ;; if this is the last rounf ? | ||
| 686 | ;; | ||
| 687 | MOV AX,cs:next_low ;; NEXT = FFFF:FFFF means no more | ||
| 688 | CMP AX,-1 ;; header to come. | ||
| 689 | JNE MATCH_NEXT ;; | ||
| 690 | ;; | ||
| 691 | MOV AX,cs:next_high ;; | ||
| 692 | CMP AX,-1 ;; | ||
| 693 | JNE MATCH_NEXT ;; | ||
| 694 | ;; | ||
| 695 | MOV FTP.FTB_STATUS,STAT_NOFIND ;; ERROR : no match | ||
| 696 | ;; | ||
| 697 | MATCH_NEXT : ;; | ||
| 698 | ADD BX,FTP.FTB_LENGTH ;; | ||
| 699 | DEC DX ;; | ||
| 700 | AND DX,DX ;; | ||
| 701 | JZ MATCH_ALL ;; | ||
| 702 | JMP MATCH_LOOP ;; | ||
| 703 | ;; | ||
| 704 | MATCH_ALL : ;; | ||
| 705 | MOV cs:stage,SCANX ;; | ||
| 706 | ;; | ||
| 707 | MATCH_DONE : ;; | ||
| 708 | POP BX ;; | ||
| 709 | JMP FTB_LOOP ;; | ||
| 710 | ;; | ||
| 711 | ;=========================================================================== | ||
| 712 | SCAN_CASE : ;; | ||
| 713 | ;; ********************************** | ||
| 714 | ;; * determine whether it the font * | ||
| 715 | ;; * data(TARGET),or the next font * | ||
| 716 | ;; * header(NEXT) that is approaching | ||
| 717 | ;; ********************************** | ||
| 718 | ;; | ||
| 719 | MOV AX,cs:next_low ;; | ||
| 720 | MOV cs:hit_lo,AX ;; | ||
| 721 | MOV AX,cs:next_high ;; | ||
| 722 | MOV cs:hit_hi,AX ;; | ||
| 723 | XOR AX,AX ;; | ||
| 724 | MOV cs:hit_flag,AX ;; | ||
| 725 | ;; | ||
| 726 | MOV DI,cs:hit_hi ;; normalised HIT_HI, HIT_LO | ||
| 727 | MOV AX,DI ;; | ||
| 728 | AND AX,00FFFH ;; | ||
| 729 | PUSH CX ;; | ||
| 730 | MOV CX,4 ;; | ||
| 731 | SHL AX,CL ;; | ||
| 732 | POP CX ;; | ||
| 733 | AND DI,0F000H ;; | ||
| 734 | ADD AX,cs:hit_lo ;; | ||
| 735 | JNC NO_CARRY2 ;; | ||
| 736 | ADD DI,01000H ;; | ||
| 737 | NO_CARRY2 : ;; | ||
| 738 | MOV cs:hit_lo,AX ;; | ||
| 739 | MOV cs:hit_hi,DI ;; | ||
| 740 | ;; | ||
| 741 | MOV DX,cs:num_ftb ;; | ||
| 742 | ;; | ||
| 743 | PUSH BX ;; | ||
| 744 | SCAN_LOOP : ;; | ||
| 745 | MOV AX,FTP.FTB_STATUS ;; | ||
| 746 | CMP AX,FSTAT_MATCH ;; | ||
| 747 | JNE SCAN_NEXT ;; | ||
| 748 | ;; | ||
| 749 | ;; | ||
| 750 | MOV DI,FTP.TARGET_HI ;; NORMALISED TARGET | ||
| 751 | MOV AX,DI ;; | ||
| 752 | AND AX,00FFFH ;; | ||
| 753 | PUSH CX ;; | ||
| 754 | MOV CX,4 ;; | ||
| 755 | SHL AX,CL ;; | ||
| 756 | POP CX ;; | ||
| 757 | AND DI,0F000H ;; | ||
| 758 | ADD AX,FTP.TARGET_LO ;; | ||
| 759 | JNC NO_CARRY1 ;; | ||
| 760 | ADD DI,01000H ;; | ||
| 761 | NO_CARRY1 : ;; DI:AX = NORMALISED TARGET | ||
| 762 | ;; | ||
| 763 | ;; ** compare the TARGET and the NEXT | ||
| 764 | ;; | ||
| 765 | CMP DI,cs:hit_hi ;; | ||
| 766 | JA SCAN_NEXT ;; | ||
| 767 | ;; | ||
| 768 | JE SCAN_EQU ;; | ||
| 769 | JMP NEAR_FONT ;; | ||
| 770 | ;; | ||
| 771 | SCAN_EQU : ;; | ||
| 772 | CMP AX,cs:hit_lo ;; | ||
| 773 | JA SCAN_NEXT ;; | ||
| 774 | JE SCAN_ERROR_CHK ;; | ||
| 775 | ;; ********************************** | ||
| 776 | ;; * the font data is approaching * | ||
| 777 | ;; ********************************** | ||
| 778 | NEAR_FONT : ;; | ||
| 779 | MOV cs:hit_flag,-1 ;; | ||
| 780 | MOV cs:hit_lo,AX ;; | ||
| 781 | MOV cs:hit_hi,DI ;; | ||
| 782 | MOV cs:hit_bx,BX ;; used for BAD_BX and in FOUND_CASE | ||
| 783 | JMP SCAN_NEXT ;; | ||
| 784 | ;; | ||
| 785 | ;; ********************************** | ||
| 786 | ;; * the NEXT header is approaching * | ||
| 787 | ;; ********************************** | ||
| 788 | SCAN_ERROR_CHK : ;; | ||
| 789 | MOV AX,cs:hit_flag ;; | ||
| 790 | AND AX,AX ;; | ||
| 791 | JNZ SCAN_NEXT ;; | ||
| 792 | MOV FTP.FTB_STATUS,STAT_BADATA ;; next header and font cannot be the | ||
| 793 | ;; same | ||
| 794 | ;; | ||
| 795 | SCAN_NEXT : ;; | ||
| 796 | DEC DX ;; | ||
| 797 | AND DX,DX ;; | ||
| 798 | JZ SCAN_DONE ;; | ||
| 799 | ;; | ||
| 800 | ADD BX,FTP.FTB_LENGTH ;; | ||
| 801 | JMP SCAN_LOOP ;; ** is there any closer font data ? | ||
| 802 | ;; | ||
| 803 | ;; ************************************ | ||
| 804 | ;; * the HIT is either font data(TARGET | ||
| 805 | ;; * or the font block (NEXT). * | ||
| 806 | ;; ************************************ | ||
| 807 | SCAN_DONE : ;; | ||
| 808 | POP BX ;; | ||
| 809 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 810 | MOV DX,cs:hit_hi ;; HIT_FLAG, HIT_LO, HIT_HI defined | ||
| 811 | MOV AX,cs:hit_lo ;; | ||
| 812 | ;; | ||
| 813 | CMP AX,0FFFFH ;; | ||
| 814 | JNE NOT_FFFF_HIT ;; | ||
| 815 | CMP DX,0FFFFH ;; | ||
| 816 | JNE NOT_FFFF_HIT ;; | ||
| 817 | JMP SCAN_MORE ;; stage remained as SCAN, discard data | ||
| 818 | ;; | ||
| 819 | NOT_FFFF_HIT : ;; | ||
| 820 | ;; DX:AX = HIT_HI:HIT_LO (normalised) | ||
| 821 | SUB AX,cs:count_lo ;; | ||
| 822 | JNC NO_BORROW ;; | ||
| 823 | SUB DX,01000H ;; | ||
| 824 | JC SCAN_BAD ;; | ||
| 825 | NO_BORROW: ;; | ||
| 826 | SUB DX,cs:count_hi ;; | ||
| 827 | JC SCAN_BAD ;; | ||
| 828 | ;; | ||
| 829 | INC AX ;; COUNT can be at the HIT, then AX=0 | ||
| 830 | JNC NO_CARRYX ;; INC AX to make AX comparable to CX | ||
| 831 | ADD DX,01000H ;; i.e. AX = offset + 1 | ||
| 832 | ;; | ||
| 833 | NO_CARRYX : ;; | ||
| 834 | CMP AX,CX ;; | ||
| 835 | JA SCAN_MORE ;; | ||
| 836 | ;; | ||
| 837 | PUSH DX ;; | ||
| 838 | AND DX,00FFFH ;; | ||
| 839 | PUSH CX ;; | ||
| 840 | MOV CX,4 ;; | ||
| 841 | SHL DX,CL ;; | ||
| 842 | POP CX ;; | ||
| 843 | ADD AX,DX ;; | ||
| 844 | POP DX ;; | ||
| 845 | JNC NO_CARRY3 ;; | ||
| 846 | ADD DX,01000H ;; | ||
| 847 | NO_CARRY3 : ;; | ||
| 848 | AND DX,0F000H ;; | ||
| 849 | ;; | ||
| 850 | ;; | ||
| 851 | PUSH AX ;; | ||
| 852 | PUSH DX ;; | ||
| 853 | SUB AX,CX ;; | ||
| 854 | JNC NO_BORROW1 ;; | ||
| 855 | SUB DX,1000H ;; | ||
| 856 | JC MORE_CXp ;; | ||
| 857 | NO_BORROW1 : ;; | ||
| 858 | ;; dx:ax >= cx | ||
| 859 | AND AX,AX ;; | ||
| 860 | JNE SCAN_MOREP ;; | ||
| 861 | AND DX,DX ;; | ||
| 862 | JNE SCAN_MOREP ;; | ||
| 863 | ;; | ||
| 864 | ;; offset + 1 = CX | ||
| 865 | ;; | ||
| 866 | MORE_CXP : ;; | ||
| 867 | POP DX ;; | ||
| 868 | POP AX ;; | ||
| 869 | ;; | ||
| 870 | MORE_CX : ;; DX = 0,to have more CX than offset+1 | ||
| 871 | DEC AX ;; = offset : 0 and above | ||
| 872 | SUB CX,AX ;; | ||
| 873 | ADD SI,AX ;; where the first byte is | ||
| 874 | MOV AX,cs:hit_flag ;; | ||
| 875 | AND AX,AX ;; | ||
| 876 | JE NEXT_REACHED ;; | ||
| 877 | ;; | ||
| 878 | MOV cs:stage,MOD_LOBX ;; font-data reached, | ||
| 879 | ;; | ||
| 880 | JMP FTB_LOOP ;; ****** RETURN ******* | ||
| 881 | ;; | ||
| 882 | NEXT_REACHED : ;; | ||
| 883 | MOV cs:stage,PASSX ;; | ||
| 884 | MOV cs:pass_postx,next_lolX ;; | ||
| 885 | MOV cs:pass_cnt,FILE_OFFSET ;; | ||
| 886 | ;; | ||
| 887 | ;; | ||
| 888 | JMP FTB_LOOP ;; ****** RETURN ******* | ||
| 889 | ;; | ||
| 890 | ;; *********************************** | ||
| 891 | SCAN_MOREP : ;; * scan more FTBLK for the nearest * | ||
| 892 | ;; * font data * | ||
| 893 | ;; *********************************** | ||
| 894 | POP DX ;; | ||
| 895 | POP AX ;; | ||
| 896 | ;; | ||
| 897 | SCAN_MORE : ;; | ||
| 898 | ADD SI,CX ;; | ||
| 899 | SUB CX,CX ;; | ||
| 900 | JMP FTB_LOOP ;; more SCAN stage | ||
| 901 | ;; | ||
| 902 | SCAN_BAD: ;; ************************* | ||
| 903 | MOV AX,cs:hit_flag ;; * scan is bad * | ||
| 904 | AND AX,AX ;; ************************* | ||
| 905 | JNZ BAD_BX ;; | ||
| 906 | MOV AX,-1 ;; NEXT is pointing backwards | ||
| 907 | MOV cs:next_low,AX ;; | ||
| 908 | MOV cs:next_high,AX ;; no more NEXT | ||
| 909 | MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK | ||
| 910 | JMP FTB_LOOP ;; | ||
| 911 | ;; | ||
| 912 | BAD_BX : ;; | ||
| 913 | PUSH BX ;; FONT is pointing backwards | ||
| 914 | MOV BX,cs:hit_bx ;; | ||
| 915 | MOV FTP.FTB_STATUS,STAT_BADATA | ||
| 916 | POP BX ;; | ||
| 917 | JMP FTB_LOOP ;; | ||
| 918 | ;; | ||
| 919 | ;=========================================================================== | ||
| 920 | PRE_FOUND_CASE : ;; | ||
| 921 | ;; extract informations from the font | ||
| 922 | ;; block until font_length is defined | ||
| 923 | ;; | ||
| 924 | MOV DI,cs:stage ;; | ||
| 925 | ;; | ||
| 926 | ADD DI,DI ;; double to index to WORD-offset | ||
| 927 | ;; | ||
| 928 | JMP CS:STAGE_CASES[DI] ;; call routine to process the stage | ||
| 929 | ;; | ||
| 930 | ;=========================================================================== | ||
| 931 | FOUND_CASE : ;; | ||
| 932 | MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to | ||
| 933 | PUSH DI ;; | ||
| 934 | ;=========================================================================== | ||
| 935 | FOUND_DO : ;; | ||
| 936 | ;; define informations into FTBLK of | ||
| 937 | ;; HIT_BX defined in the SCAN case | ||
| 938 | PUSH BX ;; | ||
| 939 | MOV BX,cs:hit_bx ;; | ||
| 940 | ;; FTBLK : | ||
| 941 | MOV AX,cs:mod_word ;; | ||
| 942 | MOV FTP.FTB_MOD,AX ;; | ||
| 943 | MOV AX,cs:fonts_word ;; | ||
| 944 | MOV FTP.FTB_FONTS,AX ;; | ||
| 945 | ;; | ||
| 946 | MOV AX,cs:fdlen_word ;; | ||
| 947 | MOV FTP.FTB_DLEFT,AX ;; | ||
| 948 | MOV FTP.FTB_DLEN,0 ;; | ||
| 949 | MOV FTP.FTB_DALO,0 ;; | ||
| 950 | MOV FTP.FTB_DAHI,0 ;; | ||
| 951 | ;; | ||
| 952 | MOV FTP.FTB_STATUS,FSTAT_FOUND | ||
| 953 | ;; | ||
| 954 | CMP FTP.FTB_TYPE,TYPE_DISPLAY; | ||
| 955 | JNE CHECK_PTR_TYPE ;; | ||
| 956 | CMP cs:pre_font_len,PRE_FONT_D ;; | ||
| 957 | JNE DISPLAY_BAD ;; | ||
| 958 | JMP DISPLAY_DONE ;; | ||
| 959 | ;; | ||
| 960 | CHECK_PTR_TYPE : ;; | ||
| 961 | CMP FTP.FTB_TYPE,TYPE_PRINTER; | ||
| 962 | JNE SET_STAGE ;; | ||
| 963 | CMP cs:ptr_sel_word,0 ;; | ||
| 964 | JNE PRINTER_HAS_SEL ;; | ||
| 965 | CMP cs:pre_font_len,PRE_FONT_P0;; | ||
| 966 | JNE PRINTER_BAD ;; | ||
| 967 | JMP PRINTER_DONE ;; | ||
| 968 | ;; | ||
| 969 | PRINTER_HAS_SEL : ;; | ||
| 970 | CMP cs:pre_font_len,PRE_FONT_P ;; | ||
| 971 | JNE PRINTER_BAD ;; | ||
| 972 | JMP PRINTER_DONE ;; | ||
| 973 | ;; | ||
| 974 | DISPLAY_BAD : ;; | ||
| 975 | ;; | ||
| 976 | MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. | ||
| 977 | ;; | ||
| 978 | DISPLAY_DONE : ;; | ||
| 979 | MOV AL,cs:disp_rows ;; | ||
| 980 | MOV FTP.FTB_ROWS,AL ;; | ||
| 981 | MOV AL,cs:disp_cols ;; | ||
| 982 | MOV FTP.FTB_COLS,AL ;; | ||
| 983 | MOV AL,cs:disp_x ;; | ||
| 984 | MOV FTP.FTB_X,AL ;; | ||
| 985 | MOV AL,cs:disp_y ;; | ||
| 986 | MOV FTP.FTB_Y,AL ;; | ||
| 987 | MOV AX,cs:count_word ;; | ||
| 988 | MOV FTP.FTB_COUNT,AX ;; | ||
| 989 | JMP SET_STAGE ;; | ||
| 990 | ;; | ||
| 991 | PRINTER_BAD : ;; | ||
| 992 | ;; | ||
| 993 | MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. | ||
| 994 | ;; | ||
| 995 | PRINTER_DONE : ;; | ||
| 996 | MOV AX,cs:ptr_sel_word ;; | ||
| 997 | MOV FTP.FTB_SELECT,AX ;; | ||
| 998 | MOV AX,cs:ptr_len_word ;; | ||
| 999 | MOV FTP.FTB_SELLEN,AX ;; | ||
| 1000 | ;; | ||
| 1001 | SET_STAGE : ;; STAGE : | ||
| 1002 | MOV AX,cs:fdlen_word ;; if no font data to follow | ||
| 1003 | AND AX,AX ;; | ||
| 1004 | JNZ GET_FDATA ;; | ||
| 1005 | MOV cs:stage,SCANX ;; then scan for next header or font | ||
| 1006 | JMP FONT_RET ;; | ||
| 1007 | ;; | ||
| 1008 | GET_FDATA : ;; update the moving target | ||
| 1009 | MOV cs:stage,GET_FX ;; | ||
| 1010 | MOV AX,cs:pre_font_len ;; | ||
| 1011 | ADD FTP.TARGET_LO,AX ;; | ||
| 1012 | JNC FONT_RET ;; | ||
| 1013 | ADD FTP.TARGET_HI,01000H ;; | ||
| 1014 | ;; | ||
| 1015 | FONT_RET : ;; | ||
| 1016 | POP BX ;; | ||
| 1017 | RET ;; | ||
| 1018 | ;; | ||
| 1019 | ;=========================================================================== | ||
| 1020 | GETFONT_CASE : ;; as ES:[SI], at COUNT, there is font | ||
| 1021 | ;; data | ||
| 1022 | MOV DX,cs:num_ftb ;; | ||
| 1023 | PUSH BX ;; | ||
| 1024 | ;; | ||
| 1025 | MOV cs:hit_hi,0 ;; temp. register | ||
| 1026 | MOV cs:hit_flag,0 ;; assumed can be changed to SCAN stage | ||
| 1027 | ;; | ||
| 1028 | MOV DI,cs:count_hi ;; normalised COUNT_HI,COUNT_LO | ||
| 1029 | MOV AX,DI ;; | ||
| 1030 | AND AX,00FFFH ;; | ||
| 1031 | PUSH CX ;; | ||
| 1032 | MOV CX,4 ;; | ||
| 1033 | SHL AX,CL ;; | ||
| 1034 | POP CX ;; | ||
| 1035 | AND DI,0F000H ;; | ||
| 1036 | ADD AX,cs:count_lo ;; | ||
| 1037 | JNC NO_CARRY4 ;; | ||
| 1038 | ADD DI,01000H ;; | ||
| 1039 | NO_CARRY4 : ;; | ||
| 1040 | MOV cs:count_lo,AX ;; | ||
| 1041 | MOV cs:count_hi,DI ;; | ||
| 1042 | ;; | ||
| 1043 | ;; | ||
| 1044 | GETFONT_LOOP : ;; | ||
| 1045 | MOV AX,FTP.FTB_STATUS ;; | ||
| 1046 | CMP AX,FSTAT_FONT ;; | ||
| 1047 | JE GETFONT_CONT ;; | ||
| 1048 | ;; | ||
| 1049 | CMP AX,FSTAT_FOUND ;; | ||
| 1050 | JE GETFONT_FOUND ;; | ||
| 1051 | ;; | ||
| 1052 | JMP NEXT_GETFONT ;; | ||
| 1053 | ;; | ||
| 1054 | GETFONT_FOUND : ;; | ||
| 1055 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 1056 | AND AX,AX ;; | ||
| 1057 | JZ NEXT_GF ;; | ||
| 1058 | MOV FTP.FTB_STATUS,FSTAT_FONT; | ||
| 1059 | JMP GETFONT_CONT1 ;; | ||
| 1060 | ;; | ||
| 1061 | ;; | ||
| 1062 | GETFONT_CONT : ;; | ||
| 1063 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 1064 | AND AX,AX ;; | ||
| 1065 | JNZ GETFONT_CONT1 ;; | ||
| 1066 | NEXT_GF : ;; | ||
| 1067 | JMP NEXT_GETFONT ;; | ||
| 1068 | ;; only on FOUND and DLEFT <> 0 | ||
| 1069 | GETFONT_CONT1: ;; | ||
| 1070 | MOV DI,FTP.TARGET_HI ;; normalised TARGET | ||
| 1071 | MOV AX,DI ;; | ||
| 1072 | AND AX,00FFFH ;; | ||
| 1073 | PUSH CX ;; | ||
| 1074 | MOV CX,4 ;; | ||
| 1075 | SHL AX,CL ;; | ||
| 1076 | POP CX ;; | ||
| 1077 | AND DI,0F000H ;; | ||
| 1078 | ADD AX,FTP.TARGET_LO ;; | ||
| 1079 | JNC NO_CARRY5 ;; | ||
| 1080 | ADD DI,01000H ;; | ||
| 1081 | NO_CARRY5 : ;; DI:AX = TARGET (normalised) | ||
| 1082 | ;; | ||
| 1083 | CMP DI,cs:count_hi ;; | ||
| 1084 | JB GETFONT_BAD ;; | ||
| 1085 | JNE NEXT_GETFONT ;; | ||
| 1086 | CMP AX,cs:count_lo ;; | ||
| 1087 | JB GETFONT_BAD ;; | ||
| 1088 | JNE NEXT_GETFONT ;; | ||
| 1089 | ;; | ||
| 1090 | MOV FTP.FTB_DALO,SI ;; where the font data is in the packet | ||
| 1091 | MOV FTP.FTB_DAHI,DS ;; | ||
| 1092 | ;; | ||
| 1093 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 1094 | CMP AX,CX ;; | ||
| 1095 | JAE UPTO_CX ;; | ||
| 1096 | ;; upto FDLEFT | ||
| 1097 | MOV FTP.FTB_DLEFT,0 ;; | ||
| 1098 | MOV FTP.FTB_DLEN,AX ;; | ||
| 1099 | CMP cs:hit_hi,AX ;; | ||
| 1100 | JNB NOT_HIGHER0 ;; | ||
| 1101 | MOV cs:hit_hi,AX ;; | ||
| 1102 | NOT_HIGHER0 : ;; | ||
| 1103 | ADD FTP.TARGET_LO,AX ;; | ||
| 1104 | JNC NEXT_GETFONT ;; | ||
| 1105 | ADD FTP.TARGET_HI,01000H ;; | ||
| 1106 | JMP NEXT_GETFONT ;; | ||
| 1107 | ;; | ||
| 1108 | GETFONT_BAD : ;; | ||
| 1109 | MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards | ||
| 1110 | JMP NEXT_GETFONT ;; | ||
| 1111 | ;; | ||
| 1112 | UPTO_CX : ;; | ||
| 1113 | SUB AX,CX ;; | ||
| 1114 | MOV FTP.FTB_DLEFT,AX ;; | ||
| 1115 | MOV FTP.FTB_DLEN,CX ;; | ||
| 1116 | MOV cs:hit_hi,CX ;; | ||
| 1117 | ADD FTP.TARGET_LO,CX ;; | ||
| 1118 | JNC NO_CARRYOVER ;; | ||
| 1119 | ADD FTP.TARGET_HI,01000H ;; | ||
| 1120 | NO_CARRYOVER : ;; | ||
| 1121 | AND AX,AX ;; all data have been returned ? | ||
| 1122 | JZ NEXT_GETFONT ;; | ||
| 1123 | ;; | ||
| 1124 | MOV cs:hit_flag,-1 ;; no ! stay in the GET_FONT stage | ||
| 1125 | ;; | ||
| 1126 | NEXT_GETFONT : ;; | ||
| 1127 | ADD BX,FTP.FTB_LENGTH ;; | ||
| 1128 | DEC DX ;; | ||
| 1129 | AND DX,DX ;; | ||
| 1130 | JZ GETFONT_END ;; | ||
| 1131 | JMP GETFONT_LOOP ;; | ||
| 1132 | ;; | ||
| 1133 | GETFONT_END : ;; | ||
| 1134 | MOV AX,cs:hit_hi ;; | ||
| 1135 | ADD SI,AX ;; | ||
| 1136 | SUB CX,AX ;; | ||
| 1137 | ;; | ||
| 1138 | CMP cs:hit_flag,0 ;; | ||
| 1139 | Jne GETFONT_DONE ;; | ||
| 1140 | MOV cs:stage,SCANX ;; no more in the GET_FONT stage | ||
| 1141 | ;; | ||
| 1142 | ;; | ||
| 1143 | GETFONT_DONE : ;; | ||
| 1144 | POP BX ;; | ||
| 1145 | JMP FTB_LOOP ;; | ||
| 1146 | ;; | ||
| 1147 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1148 | ;; | ||
| 1149 | ;; STAGES -- "called by" SERACH_CASE | ||
| 1150 | ;; | ||
| 1151 | ;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer | ||
| 1152 | ;; -- CX remaining packet length | ||
| 1153 | ;; -- ES:[BX] points to the first FTBLK | ||
| 1154 | ;; -- COUNT_LO, COUNT_HI, upto but not including the address pointed by FPKT | ||
| 1155 | ;; | ||
| 1156 | ;; | ||
| 1157 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1158 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1159 | filetag : ;; | ||
| 1160 | ;; | ||
| 1161 | ; mov ax,ftag_len ;; | ||
| 1162 | cmp cs:ftag_count,ftag_len ;; | ||
| 1163 | jB valid_ftag ;; | ||
| 1164 | JE FTAG_FAILED ;; | ||
| 1165 | ;; | ||
| 1166 | mov ftp.ftb_status,stat_deverr | ||
| 1167 | mov cs:fp_error,00022H ;; ERROR 0022H | ||
| 1168 | ;; | ||
| 1169 | FTAG_FAILED : ;; discard all the bytes, while | ||
| 1170 | ADD SI,CX ;; stage stays as FTAGX | ||
| 1171 | SUB CX,CX ;; | ||
| 1172 | JMP FTB_LOOP ;; **** RETURN (bytes discarded) **** | ||
| 1173 | ;; | ||
| 1174 | VALID_FTAG : ;; | ||
| 1175 | MOV AX,FPKT ;; | ||
| 1176 | INC SI ;; | ||
| 1177 | DEC CX ;; | ||
| 1178 | ;; | ||
| 1179 | MOV DI,cs:ftag_count ;; | ||
| 1180 | CMP AL,cs:ftag_pattern[DI] ;; | ||
| 1181 | JE FTAG_NEXTB ;; | ||
| 1182 | ;; | ||
| 1183 | mov ftp.ftb_status,stat_badata | ||
| 1184 | MOV ax,ftag_len ;; stays in FTAGX to consume all bytes | ||
| 1185 | MOV cs:ftag_count,ax ;; stays in FTAGX to consume all bytes | ||
| 1186 | JMP FTB_LOOP ;; **** RETURN (FAILED !) **** | ||
| 1187 | ;; | ||
| 1188 | FTAG_NEXTB : ;; | ||
| 1189 | INC DI ;; | ||
| 1190 | MOV cs:ftag_count,DI ;; | ||
| 1191 | ;; | ||
| 1192 | CMP DI,ftag_len ;; | ||
| 1193 | JE FTAG_DONE ;; | ||
| 1194 | ;; | ||
| 1195 | JMP FTB_LOOP ;; **** RETURN ( MORE TO COME) **** | ||
| 1196 | ;; | ||
| 1197 | FTAG_DONE : ;; | ||
| 1198 | MOV cs:pass_cnt,0 ;; | ||
| 1199 | MOV cs:stage,PASSX ;; | ||
| 1200 | MOV cs:pass_postx,fptr_lolx ;; | ||
| 1201 | ;; | ||
| 1202 | JMP FTB_LOOP ;; **** NEXT STAGE **** | ||
| 1203 | ;; | ||
| 1204 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1205 | fptrLOL : ;; STAGE the low byte of the low fptr | ||
| 1206 | MOV AX,FPKT ;; | ||
| 1207 | INC SI ;; byte by byte | ||
| 1208 | DEC CX ;; | ||
| 1209 | AND CX,CX ;; | ||
| 1210 | JNZ WORD_fptrLO ;; | ||
| 1211 | MOV cs:fptr_lol,AL ;; | ||
| 1212 | MOV cs:stage,fptr_lohX ;; | ||
| 1213 | JMP FTB_LOOP ;; | ||
| 1214 | WORD_fptrLO : ;; | ||
| 1215 | INC SI ;; | ||
| 1216 | DEC CX ;; | ||
| 1217 | MOV cs:fptr_low,AX ;; | ||
| 1218 | MOV cs:stage,fptr_HILX ;; | ||
| 1219 | JMP FTB_LOOP ;; | ||
| 1220 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1221 | fptrLOH : ;; STAGE the high byte of the low fptr | ||
| 1222 | MOV AX,FPKT ;; | ||
| 1223 | INC SI ;; byte by byte | ||
| 1224 | DEC CX ;; | ||
| 1225 | MOV cs:fptr_loh,AL ;; | ||
| 1226 | MOV cs:stage,fptr_HILX ;; | ||
| 1227 | JMP FTB_LOOP ;; | ||
| 1228 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1229 | fptrHIL : ;; STAGE the low byte of the high fptr | ||
| 1230 | MOV AX,FPKT ;; | ||
| 1231 | INC SI ;; byte by byte | ||
| 1232 | DEC CX ;; | ||
| 1233 | AND CX,CX ;; | ||
| 1234 | JNZ WORD_fptrHI ;; | ||
| 1235 | MOV cs:fptr_hil,AL ;; | ||
| 1236 | MOV cs:stage,fptr_hihX ;; | ||
| 1237 | JMP FTB_LOOP ;; | ||
| 1238 | WORD_fptrHI : ;; | ||
| 1239 | INC SI ;; | ||
| 1240 | DEC CX ;; | ||
| 1241 | MOV cs:fptr_high,AX ;; | ||
| 1242 | MOV cs:stage,FPTR_SKIPX ;; | ||
| 1243 | JMP FTB_LOOP ;; | ||
| 1244 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1245 | fptrHIH : ;; STAGE the high byte of the high fptr | ||
| 1246 | MOV AX,FPKT ;; | ||
| 1247 | INC SI ;; byte by byte | ||
| 1248 | DEC CX ;; | ||
| 1249 | MOV cs:fptr_hih,AL ;; | ||
| 1250 | MOV cs:stage,FPTR_SKIPX ;; | ||
| 1251 | JMP FTB_LOOP ;; | ||
| 1252 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1253 | ENTRYLO : ;; STAGE - ENTRY LOW BYTE | ||
| 1254 | MOV AX,FPKT ;; | ||
| 1255 | INC SI ;; byte by byte | ||
| 1256 | DEC CX ;; | ||
| 1257 | AND CX,CX ;; | ||
| 1258 | JNZ WORD_ENTRY ;; | ||
| 1259 | MOV cs:entry_lob,AL ;; | ||
| 1260 | MOV cs:stage,ENTRY_HIX ;; | ||
| 1261 | JMP FTB_LOOP ;; | ||
| 1262 | WORD_ENTRY : ;; | ||
| 1263 | INC SI ;; | ||
| 1264 | DEC CX ;; | ||
| 1265 | MOV cs:entry_word,AX ;; | ||
| 1266 | MOV cs:stage,PASSX ;; 2 bytes to be passed | ||
| 1267 | MOV cs:pass_postx,NEXT_LOLX ;; | ||
| 1268 | JMP FTB_LOOP ;; | ||
| 1269 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1270 | ENTRYHI : ;; stage - ENTRY HIGN BYTE | ||
| 1271 | MOV AX,FPKT ;; | ||
| 1272 | INC SI ;; byte by byte | ||
| 1273 | DEC CX ;; | ||
| 1274 | MOV cs:entry_hib,AL ;; | ||
| 1275 | MOV cs:stage,PASSX ;; 2 bytes to be passed | ||
| 1276 | MOV cs:pass_postx,NEXT_LOLX ;; | ||
| 1277 | AND CX,CX ;; | ||
| 1278 | JNZ ENTHI_PASS1 ;; | ||
| 1279 | JMP FTB_LOOP ;; | ||
| 1280 | ENTHI_PASS1 : ;; | ||
| 1281 | INC SI ;; | ||
| 1282 | INC cs:pass_cnt ;; | ||
| 1283 | DEC CX ;; | ||
| 1284 | AND CX,CX ;; | ||
| 1285 | JNZ ENTHI_PASS2 ;; | ||
| 1286 | JMP FTB_LOOP ;; | ||
| 1287 | ENTHI_PASS2 : ;; | ||
| 1288 | INC SI ;; | ||
| 1289 | INC cs:pass_cnt ;; | ||
| 1290 | DEC CX ;; | ||
| 1291 | MOV cs:stage,NEXT_LOLX ;; | ||
| 1292 | JMP FTB_LOOP ;; | ||
| 1293 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1294 | NEXTLOL : ;; STAGE the low byte of the low NEXT | ||
| 1295 | MOV AX,FPKT ;; | ||
| 1296 | INC SI ;; byte by byte | ||
| 1297 | DEC CX ;; | ||
| 1298 | AND CX,CX ;; | ||
| 1299 | JNZ WORD_NEXTLO ;; | ||
| 1300 | MOV cs:next_lol,AL ;; | ||
| 1301 | MOV cs:stage,NEXT_LOHX ;; | ||
| 1302 | JMP FTB_LOOP ;; | ||
| 1303 | WORD_NEXTLO : ;; | ||
| 1304 | INC SI ;; | ||
| 1305 | DEC CX ;; | ||
| 1306 | MOV cs:next_low,AX ;; | ||
| 1307 | MOV cs:stage,next_hilX ;; | ||
| 1308 | JMP FTB_LOOP ;; | ||
| 1309 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1310 | NEXTLOH : ;; STAGE the high byte of the low NEXT | ||
| 1311 | MOV AX,FPKT ;; | ||
| 1312 | INC SI ;; byte by byte | ||
| 1313 | DEC CX ;; | ||
| 1314 | MOV cs:next_loh,AL ;; | ||
| 1315 | MOV cs:stage,next_hilX ;; | ||
| 1316 | JMP FTB_LOOP ;; | ||
| 1317 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1318 | NEXTHIL : ;; STAGE the low byte of the high NEXT | ||
| 1319 | MOV AX,FPKT ;; | ||
| 1320 | INC SI ;; byte by byte | ||
| 1321 | DEC CX ;; | ||
| 1322 | AND CX,CX ;; | ||
| 1323 | JNZ WORD_NEXTHI ;; | ||
| 1324 | MOV cs:next_hil,AL ;; | ||
| 1325 | MOV cs:stage,NEXT_HIHX ;; | ||
| 1326 | JMP FTB_LOOP ;; | ||
| 1327 | WORD_NEXTHI : ;; | ||
| 1328 | INC SI ;; | ||
| 1329 | DEC CX ;; | ||
| 1330 | MOV cs:next_high,AX ;; | ||
| 1331 | MOV cs:stage,type_lobX ;; | ||
| 1332 | JMP FTB_LOOP ;; | ||
| 1333 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1334 | NEXTHIH : ;; STAGE the high byte of the high NEXT | ||
| 1335 | MOV AX,FPKT ;; | ||
| 1336 | INC SI ;; byte by byte | ||
| 1337 | DEC CX ;; | ||
| 1338 | MOV cs:next_hih,AL ;; | ||
| 1339 | MOV cs:stage,type_lobX ;; | ||
| 1340 | JMP FTB_LOOP ;; | ||
| 1341 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1342 | TYPELO : ;; STAGE the low byte of the TYPE | ||
| 1343 | MOV AX,FPKT ;; | ||
| 1344 | INC SI ;; byte by byte | ||
| 1345 | DEC CX ;; | ||
| 1346 | AND CX,CX ;; | ||
| 1347 | JNZ WORD_TYPE ;; | ||
| 1348 | MOV cs:type_lob,AL ;; | ||
| 1349 | MOV cs:stage,type_hibX ;; | ||
| 1350 | JMP FTB_LOOP ;; | ||
| 1351 | WORD_TYPE : ;; | ||
| 1352 | INC SI ;; | ||
| 1353 | DEC CX ;; | ||
| 1354 | MOV cs:type_word,AX ;; | ||
| 1355 | MOV cs:stage,type_idX ;; | ||
| 1356 | MOV cs:tid_cnt,0 ;; | ||
| 1357 | JMP FTB_LOOP ;; | ||
| 1358 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1359 | TYPEHI : ;; STAGE the high byte of the TYPE | ||
| 1360 | MOV AX,FPKT ;; | ||
| 1361 | INC SI ;; byte by byte | ||
| 1362 | DEC CX ;; | ||
| 1363 | MOV cs:type_hib,AL ;; | ||
| 1364 | MOV cs:stage,TYPE_IDX ;; | ||
| 1365 | MOV cs:tid_cnt,0 ;; | ||
| 1366 | JMP FTB_LOOP ;; | ||
| 1367 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1368 | TYPEIDS : ;; STAGE the type id | ||
| 1369 | CMP cs:tid_cnt,8 ;; | ||
| 1370 | JNA VALID_TID ;; | ||
| 1371 | MOV FTP.FTB_STATUS,STAT_DEVERR | ||
| 1372 | MOV cs:fp_error,00021H ;; ERROR 0021H | ||
| 1373 | ADD SI,CX ;; | ||
| 1374 | SUB CX,CX ;; | ||
| 1375 | JMP FTB_LOOP ;; | ||
| 1376 | ;; | ||
| 1377 | VALID_TID : ;; | ||
| 1378 | MOV AX,8 ;; | ||
| 1379 | SUB AX,cs:tid_cnt ;; | ||
| 1380 | CMP CX,AX ;; | ||
| 1381 | JNB TID_ALL ;; | ||
| 1382 | ;; all data in FPKT are stored | ||
| 1383 | PUSH ES ;; | ||
| 1384 | PUSH CS ;; | ||
| 1385 | POP ES ;; | ||
| 1386 | ;; | ||
| 1387 | MOV DI,OFFSET TYPE_ID ;; | ||
| 1388 | ADD DI,cs:tid_cnt ;; | ||
| 1389 | ADD cs:tid_cnt,CX ;; | ||
| 1390 | REP MOVSB ;; SI is incremented accordingly | ||
| 1391 | POP ES ;; | ||
| 1392 | ;; | ||
| 1393 | MOV CX,0 ;; STAGE remained | ||
| 1394 | JMP FTB_LOOP ;; | ||
| 1395 | TID_ALL : ;; | ||
| 1396 | PUSH CX ;; | ||
| 1397 | ;; | ||
| 1398 | PUSH ES ;; | ||
| 1399 | PUSH CS ;; | ||
| 1400 | POP ES ;; | ||
| 1401 | ;; | ||
| 1402 | MOV DI,OFFSET TYPE_ID ;; | ||
| 1403 | ADD DI,cs:tid_cnt ;; | ||
| 1404 | MOV CX,AX ;; | ||
| 1405 | REP MOVSB ;; SI is incremented accordingly | ||
| 1406 | POP ES ;; | ||
| 1407 | ;; | ||
| 1408 | ADD cs:tid_cnt,AX ;; | ||
| 1409 | POP CX ;; | ||
| 1410 | SUB CX,AX ;; | ||
| 1411 | ;; | ||
| 1412 | MOV cs:stage,CPG_LOBX ;; | ||
| 1413 | JMP FTB_LOOP ;; | ||
| 1414 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1415 | CPGLO : ;; STAGE the low byte of the CODE PAGE | ||
| 1416 | MOV AX,FPKT ;; | ||
| 1417 | INC SI ;; byte by byte | ||
| 1418 | DEC CX ;; | ||
| 1419 | AND CX,CX ;; | ||
| 1420 | JNZ WORD_CPG ;; | ||
| 1421 | MOV cs:cpg_lob,AL ;; | ||
| 1422 | MOV cs:stage,CPG_HIBX ;; | ||
| 1423 | JMP FTB_LOOP ;; | ||
| 1424 | WORD_CPG : ;; | ||
| 1425 | INC SI ;; | ||
| 1426 | DEC CX ;; | ||
| 1427 | MOV cs:cpg_word,AX ;; | ||
| 1428 | MOV cs:stage,PASSX ;; | ||
| 1429 | MOV cs:pass_postx,font_lolX ;; | ||
| 1430 | JMP FTB_LOOP ;; | ||
| 1431 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1432 | CPGHI : ;; STAGE the high byte of the CODE PAGE | ||
| 1433 | MOV AX,FPKT ;; | ||
| 1434 | INC SI ;; byte by byte | ||
| 1435 | DEC CX ;; | ||
| 1436 | MOV cs:cpg_hib,AL ;; | ||
| 1437 | MOV cs:stage,PASSX ;; | ||
| 1438 | MOV cs:pass_postx,font_lolX ;; | ||
| 1439 | JMP FTB_LOOP ;; | ||
| 1440 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1441 | FONTLOL : ;; STAGE the low byte of the low FONT | ||
| 1442 | MOV AX,FPKT ;; | ||
| 1443 | INC SI ;; byte by byte | ||
| 1444 | DEC CX ;; | ||
| 1445 | AND CX,CX ;; | ||
| 1446 | JNZ WORD_FONTLO ;; | ||
| 1447 | MOV cs:font_lol,AL ;; | ||
| 1448 | MOV cs:stage,FONT_LOHX ;; | ||
| 1449 | JMP FTB_LOOP ;; | ||
| 1450 | WORD_FONTLO : ;; | ||
| 1451 | INC SI ;; | ||
| 1452 | DEC CX ;; | ||
| 1453 | MOV cs:font_low,AX ;; | ||
| 1454 | MOV cs:stage,FONT_HILX ;; | ||
| 1455 | JMP FTB_LOOP ;; | ||
| 1456 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1457 | FONTLOH : ;; STAGE the high byte of the low FONT | ||
| 1458 | MOV AX,FPKT ;; | ||
| 1459 | INC SI ;; byte by byte | ||
| 1460 | DEC CX ;; | ||
| 1461 | MOV cs:font_loh,AL ;; | ||
| 1462 | MOV cs:stage,FONT_HILX ;; | ||
| 1463 | JMP FTB_LOOP ;; | ||
| 1464 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1465 | FONTHIL : ;; STAGE the low byte of the high FONT | ||
| 1466 | MOV AX,FPKT ;; | ||
| 1467 | INC SI ;; byte by byte | ||
| 1468 | DEC CX ;; | ||
| 1469 | AND CX,CX ;; | ||
| 1470 | JNZ WORD_FONTHI ;; | ||
| 1471 | MOV cs:font_hil,AL ;; | ||
| 1472 | MOV cs:stage,FONT_HIHX ;; | ||
| 1473 | JMP FTB_LOOP ;; | ||
| 1474 | WORD_FONTHI : ;; | ||
| 1475 | INC SI ;; | ||
| 1476 | DEC CX ;; | ||
| 1477 | MOV cs:font_high,AX ;; | ||
| 1478 | ;;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN | ||
| 1479 | ;; anymore headers to be processed ? | ||
| 1480 | MOV cs:stage,MATCHX ;; | ||
| 1481 | MOV AX,cs:entry_word ;; | ||
| 1482 | DEC AX ;; | ||
| 1483 | MOV cs:entry_word,AX ;; | ||
| 1484 | AND AX,AX ;; | ||
| 1485 | JNZ CHECK_NEXT ;; | ||
| 1486 | ;; no more header to be processed ! | ||
| 1487 | MOV AX,-1 ;; | ||
| 1488 | MOV cs:next_low,AX ;; | ||
| 1489 | MOV cs:next_high,AX ;; as ENTRY has been consumed | ||
| 1490 | JMP FTB_LOOP ;; | ||
| 1491 | ;; | ||
| 1492 | CHECK_NEXT : ;; | ||
| 1493 | MOV AX,cs:next_low ;; | ||
| 1494 | AND AX,AX ;; | ||
| 1495 | JNZ MORE_HEADER ;; | ||
| 1496 | MOV AX,cs:next_high ;; | ||
| 1497 | AND AX,AX ;; | ||
| 1498 | JNZ MORE_HEADER ;; | ||
| 1499 | ;; no more header to be processed ! | ||
| 1500 | MOV AX,-1 ;; | ||
| 1501 | MOV cs:next_low,AX ;; as NEXT is nil | ||
| 1502 | MOV cs:next_high,AX ;; | ||
| 1503 | ;; | ||
| 1504 | MORE_HEADER : ;; | ||
| 1505 | JMP FTB_LOOP ;; | ||
| 1506 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1507 | FONTHIH : ;; STAGE the high byte of the high FONT | ||
| 1508 | MOV AX,FPKT ;; | ||
| 1509 | INC SI ;; byte by byte | ||
| 1510 | DEC CX ;; | ||
| 1511 | MOV cs:font_hih,AL ;; | ||
| 1512 | ;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN | ||
| 1513 | ;; | ||
| 1514 | MOV cs:stage,MATCHX ;; | ||
| 1515 | ;; anymore headers to be processed ? | ||
| 1516 | MOV AX,cs:entry_word ;; | ||
| 1517 | DEC AX ;; | ||
| 1518 | MOV cs:entry_word,AX ;; | ||
| 1519 | AND AX,AX ;; | ||
| 1520 | JNZ CHECK_NEXT0 ;; | ||
| 1521 | ;; no more header to be processed ! | ||
| 1522 | MOV AX,-1 ;; | ||
| 1523 | MOV cs:next_low,AX ;; | ||
| 1524 | MOV cs:next_high,AX ;; as ENTRY has been consumed | ||
| 1525 | JMP FTB_LOOP ;; | ||
| 1526 | ;; | ||
| 1527 | CHECK_NEXT0 : ;; | ||
| 1528 | MOV AX,cs:next_low ;; | ||
| 1529 | AND AX,AX ;; | ||
| 1530 | JNZ MORE_HEADER0 ;; | ||
| 1531 | MOV AX,cs:next_high ;; | ||
| 1532 | AND AX,AX ;; | ||
| 1533 | JNZ MORE_HEADER0 ;; | ||
| 1534 | ;; no more header to be processed ! | ||
| 1535 | MOV AX,-1 ;; | ||
| 1536 | MOV cs:next_low,AX ;; as NEXT is nil | ||
| 1537 | MOV cs:next_high,AX ;; | ||
| 1538 | ;; | ||
| 1539 | MORE_HEADER0 : ;; | ||
| 1540 | JMP FTB_LOOP ;; | ||
| 1541 | ;; | ||
| 1542 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1543 | MODLO : ;; STAGE the low byte of the MODIFIER | ||
| 1544 | MOV AX,FPKT ;; | ||
| 1545 | INC SI ;; byte by byte | ||
| 1546 | DEC CX ;; | ||
| 1547 | AND CX,CX ;; | ||
| 1548 | JNZ WORD_MOD ;; | ||
| 1549 | MOV MOD_LOB,AL ;; | ||
| 1550 | MOV cs:stage,MOD_HIBX ;; | ||
| 1551 | JMP FTB_LOOP ;; | ||
| 1552 | WORD_MOD : ;; | ||
| 1553 | INC SI ;; | ||
| 1554 | DEC CX ;; | ||
| 1555 | MOV cs:mod_word,AX ;; | ||
| 1556 | MOV cs:stage,fonts_lobX ;; | ||
| 1557 | JMP FTB_LOOP ;; | ||
| 1558 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1559 | MODHI : ;; STAGE the high byte of the MODIFIER | ||
| 1560 | MOV AX,FPKT ;; | ||
| 1561 | INC SI ;; byte by byte | ||
| 1562 | DEC CX ;; | ||
| 1563 | MOV cs:mod_hib,AL ;; | ||
| 1564 | MOV cs:stage,FONTS_LOBX ;; | ||
| 1565 | JMP FTB_LOOP ;; | ||
| 1566 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1567 | FONTSLO : ;; STAGE the low byte of the FONTS | ||
| 1568 | MOV AX,FPKT ;; | ||
| 1569 | INC SI ;; byte by byte | ||
| 1570 | DEC CX ;; | ||
| 1571 | AND CX,CX ;; | ||
| 1572 | JNZ WORD_FONTS ;; | ||
| 1573 | MOV cs:fonts_lob,AL ;; | ||
| 1574 | MOV cs:stage,FONTS_HIBX ;; | ||
| 1575 | JMP FTB_LOOP ;; | ||
| 1576 | WORD_FONTS : ;; | ||
| 1577 | INC SI ;; | ||
| 1578 | DEC CX ;; | ||
| 1579 | MOV cs:fonts_word,AX ;; | ||
| 1580 | MOV cs:stage,FDLEN_LOBX ;; | ||
| 1581 | JMP FTB_LOOP ;; | ||
| 1582 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1583 | FONTSHI : ;; STAGE the high byte of the FONTS | ||
| 1584 | MOV AX,FPKT ;; | ||
| 1585 | INC SI ;; byte by byte | ||
| 1586 | DEC CX ;; | ||
| 1587 | MOV cs:fonts_hib,AL ;; | ||
| 1588 | MOV cs:stage,FDLEN_LOBX ;; | ||
| 1589 | JMP FTB_LOOP ;; | ||
| 1590 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1591 | FDLENLO : ;; the low byte of the FONT-LENGTH | ||
| 1592 | MOV AX,FPKT ;; | ||
| 1593 | INC SI ;; byte by byte | ||
| 1594 | DEC CX ;; | ||
| 1595 | AND CX,CX ;; | ||
| 1596 | JNZ WORD_FDLEN ;; | ||
| 1597 | MOV cs:fdlen_lob,AL ;; | ||
| 1598 | MOV cs:stage,FDLEN_HIBX ;; | ||
| 1599 | JMP FTB_LOOP ;; | ||
| 1600 | WORD_FDLEN : ;; | ||
| 1601 | INC SI ;; | ||
| 1602 | DEC CX ;; | ||
| 1603 | MOV cs:pre_font_len,PRE_FONT_ND;; | ||
| 1604 | MOV cs:fdlen_word,AX ;; | ||
| 1605 | AND AX,AX ;; | ||
| 1606 | JZ NO_DISP_PTR ;; | ||
| 1607 | CMP cs:type_word,TYPE_DISPLAY ;; | ||
| 1608 | JE DISPLAY_TYPE1 ;; | ||
| 1609 | CMP cs:type_word,TYPE_PRINTER ;; | ||
| 1610 | JE PRINTER_TYPE1 ;; | ||
| 1611 | ;; | ||
| 1612 | NO_DISP_PTR : ;; | ||
| 1613 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1614 | JMP FTB_LOOP ;; | ||
| 1615 | DISPLAY_TYPE1 : ;; | ||
| 1616 | MOV cs:stage,DISP_ROWSX ;; | ||
| 1617 | JMP FTB_LOOP ;; | ||
| 1618 | PRINTER_TYPE1 : ;; | ||
| 1619 | MOV cs:stage,PTRSELLOX ;; | ||
| 1620 | JMP FTB_LOOP ;; | ||
| 1621 | ;; | ||
| 1622 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1623 | FDLENHI : ;; STAGE the high byte of the F-LENGTH | ||
| 1624 | MOV cs:pre_font_len,PRE_FONT_ND | ||
| 1625 | MOV AX,FPKT ;; | ||
| 1626 | INC SI ;; byte by byte | ||
| 1627 | DEC CX ;; | ||
| 1628 | MOV cs:fdlen_hib,AL ;; | ||
| 1629 | MOV AX,cs:fdlen_word ;; | ||
| 1630 | AND AX,AX ;; | ||
| 1631 | JZ NO_DISP_PTR2 ;; | ||
| 1632 | CMP cs:type_word,TYPE_DISPLAY ;; | ||
| 1633 | JE DISPLAY_TYPE2 ;; | ||
| 1634 | CMP cs:type_word,TYPE_PRINTER ;; | ||
| 1635 | JE PRINTER_TYPE2 ;; | ||
| 1636 | NO_DISP_PTR2: ;; | ||
| 1637 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1638 | JMP FTB_LOOP ;; | ||
| 1639 | DISPLAY_TYPE2 : ;; | ||
| 1640 | MOV cs:stage,DISP_ROWSX ;; | ||
| 1641 | JMP FTB_LOOP ;; | ||
| 1642 | PRINTER_TYPE2 : ;; | ||
| 1643 | MOV cs:stage,PTRSELLOX ;; | ||
| 1644 | JMP FTB_LOOP ;; | ||
| 1645 | ;; | ||
| 1646 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1647 | DSPROWS : ;; STAGE : get the rows | ||
| 1648 | XOR AX,AX ;; | ||
| 1649 | MOV cs:disp_rows,AL ;; | ||
| 1650 | MOV cs:disp_cols,AL ;; | ||
| 1651 | MOV cs:DISP_X,AL ;; | ||
| 1652 | MOV cs:disp_y,AL ;; | ||
| 1653 | MOV cs:count_word,AX ;; | ||
| 1654 | ;; | ||
| 1655 | INC cs:pre_font_len ;; | ||
| 1656 | MOV AX,FPKT ;; | ||
| 1657 | INC SI ;; | ||
| 1658 | DEC CX ;; | ||
| 1659 | MOV cs:disp_rows,AL ;; | ||
| 1660 | MOV AX,cs:fdlen_word ;; | ||
| 1661 | DEC AX ;; | ||
| 1662 | MOV cs:fdlen_word,AX ;; | ||
| 1663 | JZ NO_DISP_FONT3 ;; | ||
| 1664 | MOV cs:stage,disp_colsX ;; | ||
| 1665 | JMP FTB_LOOP ;; | ||
| 1666 | NO_DISP_FONT3 : ;; | ||
| 1667 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1668 | JMP FTB_LOOP ;; | ||
| 1669 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1670 | DSPCOLS : ;; STAGE : get the COLS | ||
| 1671 | INC cs:pre_font_len ;; | ||
| 1672 | MOV AX,FPKT ;; | ||
| 1673 | INC SI ;; | ||
| 1674 | DEC CX ;; | ||
| 1675 | MOV cs:disp_cols,AL ;; | ||
| 1676 | MOV AX,cs:fdlen_word ;; | ||
| 1677 | DEC AX ;; | ||
| 1678 | MOV cs:fdlen_word,AX ;; | ||
| 1679 | JZ NO_DISP_FONT3 ;; | ||
| 1680 | MOV cs:stage,DISP_XX ;; | ||
| 1681 | JMP FTB_LOOP ;; | ||
| 1682 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1683 | DSPX : ;; STAGE : get the aspect X | ||
| 1684 | INC cs:pre_font_len ;; | ||
| 1685 | MOV AX,FPKT ;; | ||
| 1686 | INC SI ;; | ||
| 1687 | DEC CX ;; | ||
| 1688 | MOV DISP_X,AL ;; | ||
| 1689 | MOV AX,cs:fdlen_word ;; | ||
| 1690 | DEC AX ;; | ||
| 1691 | MOV cs:fdlen_word,AX ;; | ||
| 1692 | JZ NO_DISP_FONT3 ;; | ||
| 1693 | MOV cs:stage,DISP_YX ;; | ||
| 1694 | JMP FTB_LOOP ;; | ||
| 1695 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1696 | DSPY : ;; STAGE : get the aspect Y | ||
| 1697 | INC cs:pre_font_len ;; | ||
| 1698 | MOV AX,FPKT ;; | ||
| 1699 | INC SI ;; | ||
| 1700 | DEC CX ;; | ||
| 1701 | MOV cs:disp_y,AL ;; | ||
| 1702 | MOV AX,cs:fdlen_word ;; | ||
| 1703 | DEC AX ;; | ||
| 1704 | MOV cs:fdlen_word,AX ;; | ||
| 1705 | JZ NO_DISP_FONT3 ;; | ||
| 1706 | MOV cs:stage,COUNT_LOBX ;; | ||
| 1707 | JMP FTB_LOOP ;; | ||
| 1708 | ;; | ||
| 1709 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1710 | DSPCOUNTLO : ;; the low byte of the FONT-LENGTH | ||
| 1711 | INC cs:pre_font_len ;; | ||
| 1712 | MOV AX,FPKT ;; | ||
| 1713 | INC SI ;; byte by byte | ||
| 1714 | DEC CX ;; | ||
| 1715 | PUSH AX ;; check if length is enough | ||
| 1716 | MOV AX,cs:fdlen_word ;; | ||
| 1717 | DEC AX ;; | ||
| 1718 | MOV cs:fdlen_word,AX ;; | ||
| 1719 | POP AX ;; | ||
| 1720 | JNZ A_WORD_COUNT ;; | ||
| 1721 | JMP NO_DISP_FONT3 ;; | ||
| 1722 | A_WORD_COUNT : ;; | ||
| 1723 | AND CX,CX ;; | ||
| 1724 | JNZ WORD_COUNT ;; | ||
| 1725 | MOV cs:count_lob,AL ;; | ||
| 1726 | MOV cs:stage,COUNT_HIBX ;; | ||
| 1727 | JMP FTB_LOOP ;; | ||
| 1728 | WORD_COUNT : ;; | ||
| 1729 | INC cs:pre_font_len ;; | ||
| 1730 | INC SI ;; | ||
| 1731 | DEC CX ;; | ||
| 1732 | MOV cs:count_word,AX ;; | ||
| 1733 | ; MOV cs:pre_font_len,PRE_FONT_D; | ||
| 1734 | ;; | ||
| 1735 | MOV AX,cs:fdlen_word ;; | ||
| 1736 | DEC AX ;; | ||
| 1737 | MOV cs:fdlen_word,AX ;; | ||
| 1738 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1739 | JMP FTB_LOOP ;; | ||
| 1740 | ;; | ||
| 1741 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1742 | DSPCOUNTHI : ;; STAGE the high byte of the F-LENGTH | ||
| 1743 | INC cs:pre_font_len ;; | ||
| 1744 | MOV AX,FPKT ;; | ||
| 1745 | INC SI ;; byte by byte | ||
| 1746 | DEC CX ;; | ||
| 1747 | MOV cs:count_hib,AL ;; | ||
| 1748 | ; MOV cs:pre_font_len,PRE_FONT_D; | ||
| 1749 | ;; | ||
| 1750 | MOV AX,cs:fdlen_word ;; | ||
| 1751 | DEC AX ;; | ||
| 1752 | MOV cs:fdlen_word,AX ;; | ||
| 1753 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1754 | JMP FTB_LOOP ;; | ||
| 1755 | ;; | ||
| 1756 | ;; | ||
| 1757 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1758 | PTRSELLO : ;; the low byte of the SELECTION_TYPE | ||
| 1759 | INC cs:pre_font_len ;; | ||
| 1760 | MOV AX,FPKT ;; | ||
| 1761 | INC SI ;; byte by byte | ||
| 1762 | DEC CX ;; | ||
| 1763 | PUSH AX ;; check if length is enough | ||
| 1764 | MOV AX,cs:fdlen_word ;; | ||
| 1765 | DEC AX ;; | ||
| 1766 | MOV cs:fdlen_word,AX ;; | ||
| 1767 | POP AX ;; | ||
| 1768 | JNZ A_WORD_SEL ;; | ||
| 1769 | JMP NO_PTR_FONT3 ;; | ||
| 1770 | A_WORD_SEL : ;; | ||
| 1771 | AND CX,CX ;; | ||
| 1772 | JNZ WORD_SEL ;; | ||
| 1773 | MOV cs:ptr_selob,AL ;; | ||
| 1774 | MOV cs:stage,PTRSELHIX ;; | ||
| 1775 | JMP FTB_LOOP ;; | ||
| 1776 | WORD_SEL : ;; | ||
| 1777 | INC cs:pre_font_len ;; | ||
| 1778 | INC SI ;; | ||
| 1779 | DEC CX ;; | ||
| 1780 | MOV cs:ptr_sel_word,AX ;; | ||
| 1781 | ;; | ||
| 1782 | MOV AX,cs:fdlen_word ;; | ||
| 1783 | DEC AX ;; | ||
| 1784 | MOV cs:fdlen_word,AX ;; | ||
| 1785 | ;; | ||
| 1786 | CMP cs:ptr_sel_word,0 ;; | ||
| 1787 | JNE PTR_SEL_NOT0 ;; | ||
| 1788 | ;; | ||
| 1789 | ;; | ||
| 1790 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1791 | JMP FTB_LOOP ;; | ||
| 1792 | ;; | ||
| 1793 | PTR_SEL_NOT0 : ;; | ||
| 1794 | MOV cs:stage,PTRLENLOX ;; | ||
| 1795 | JMP FTB_LOOP ;; | ||
| 1796 | ;; | ||
| 1797 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1798 | PTRSELHI: ;; STAGE the high byte of SELECT_TYPE | ||
| 1799 | INC cs:pre_font_len ;; | ||
| 1800 | MOV AX,FPKT ;; | ||
| 1801 | INC SI ;; byte by byte | ||
| 1802 | DEC CX ;; | ||
| 1803 | MOV cs:ptr_sehib,AL ;; | ||
| 1804 | ;; | ||
| 1805 | MOV AX,cs:fdlen_word ;; | ||
| 1806 | DEC AX ;; | ||
| 1807 | MOV cs:fdlen_word,AX ;; | ||
| 1808 | ;; | ||
| 1809 | CMP cs:ptr_sel_word,0 ;; | ||
| 1810 | JNE PTR_SEL_NOT0 ;; | ||
| 1811 | ;; | ||
| 1812 | ;; | ||
| 1813 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1814 | JMP FTB_LOOP ;; | ||
| 1815 | ;; | ||
| 1816 | ;; | ||
| 1817 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1818 | PTRLENLO : ;; the low byte of SELECTION_LENGTH | ||
| 1819 | INC cs:pre_font_len ;; | ||
| 1820 | MOV AX,FPKT ;; | ||
| 1821 | INC SI ;; byte by byte | ||
| 1822 | DEC CX ;; | ||
| 1823 | PUSH AX ;; check if length is enough | ||
| 1824 | MOV AX,cs:fdlen_word ;; | ||
| 1825 | DEC AX ;; | ||
| 1826 | MOV cs:fdlen_word,AX ;; | ||
| 1827 | POP AX ;; | ||
| 1828 | JNZ A_WORD_SELEN ;; | ||
| 1829 | JMP NO_PTR_FONT3 ;; | ||
| 1830 | A_WORD_SELEN : ;; | ||
| 1831 | AND CX,CX ;; | ||
| 1832 | JNZ WORD_SELEN ;; | ||
| 1833 | MOV cs:ptr_lnlob,AL ;; | ||
| 1834 | MOV cs:stage,PTRLENHIX ;; | ||
| 1835 | JMP FTB_LOOP ;; | ||
| 1836 | WORD_SELEN : ;; | ||
| 1837 | INC cs:pre_font_len ;; | ||
| 1838 | INC SI ;; | ||
| 1839 | DEC CX ;; | ||
| 1840 | MOV cs:ptr_len_word,AX ;; | ||
| 1841 | ;; | ||
| 1842 | MOV AX,cs:fdlen_word ;; | ||
| 1843 | DEC AX ;; | ||
| 1844 | MOV cs:fdlen_word,AX ;; | ||
| 1845 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1846 | JMP FTB_LOOP ;; | ||
| 1847 | ;; | ||
| 1848 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1849 | PTRLENHI : ;; STAGE the high byte of SELECT_LENGTH | ||
| 1850 | INC cs:pre_font_len ;; | ||
| 1851 | MOV AX,FPKT ;; | ||
| 1852 | INC SI ;; byte by byte | ||
| 1853 | DEC CX ;; | ||
| 1854 | MOV cs:ptr_lnhib,AL ;; | ||
| 1855 | ;; | ||
| 1856 | MOV AX,cs:fdlen_word ;; | ||
| 1857 | DEC AX ;; | ||
| 1858 | MOV cs:fdlen_word,AX ;; | ||
| 1859 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1860 | JMP FTB_LOOP ;; | ||
| 1861 | ;; | ||
| 1862 | NO_PTR_FONT3 : ;; | ||
| 1863 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1864 | JMP FTB_LOOP ;; | ||
| 1865 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1866 | PASS : ;; STAGE - PASS DUMMY BYTES | ||
| 1867 | ;; | ||
| 1868 | PUSH DX ;; | ||
| 1869 | PUSH ES ;; | ||
| 1870 | PUSH DI ;; | ||
| 1871 | ;; | ||
| 1872 | PUSH CS ;; | ||
| 1873 | POP ES ;; | ||
| 1874 | MOV DI,OFFSET PASS_BRK ;; | ||
| 1875 | MOV DX,PASS_INDX ;; | ||
| 1876 | MOV AX,cs:pass_cnt ;; | ||
| 1877 | ;; | ||
| 1878 | NEXT_BRK: ;; find the next pass-break | ||
| 1879 | CMP AX,ES:[DI] ;; | ||
| 1880 | ;; | ||
| 1881 | JB UPTO_BRK ;; | ||
| 1882 | ;; | ||
| 1883 | DEC DX ;; | ||
| 1884 | JZ PASS_ERR ;; | ||
| 1885 | INC DI ;; | ||
| 1886 | INC DI ;; | ||
| 1887 | JMP NEXT_BRK ;; | ||
| 1888 | ;; | ||
| 1889 | UPTO_BRK : ;; next break point found | ||
| 1890 | MOV DX,ES:[DI] ;; | ||
| 1891 | SUB DX,AX ;; bytes to be skipped | ||
| 1892 | CMP CX,DX ;; all to be skipped ? | ||
| 1893 | JAE PASS_ALL ;; | ||
| 1894 | ;; | ||
| 1895 | ADD cs:pass_cnt,CX ;; | ||
| 1896 | ADD SI,CX ;; | ||
| 1897 | SUB CX,CX ;; | ||
| 1898 | JMP PASS_END ;; | ||
| 1899 | ;; | ||
| 1900 | PASS_ALL : ;; | ||
| 1901 | ADD cs:pass_cnt,DX ;; | ||
| 1902 | ADD SI,DX ;; | ||
| 1903 | SUB CX,DX ;; | ||
| 1904 | ;; | ||
| 1905 | MOV AX,cs:pass_postx ;; | ||
| 1906 | MOV cs:stage,AX ;; | ||
| 1907 | ;; | ||
| 1908 | ; cmp ax,passx ;; is the next stage a pass-stage ? | ||
| 1909 | ; jne not_passx ;; | ||
| 1910 | ; mov ax,pass_postxx ;; | ||
| 1911 | ; mov pass_postx,ax ;; | ||
| 1912 | ; mov pass_postxx,stage_max ;; can support only 2 consecutive pass | ||
| 1913 | ;; | ||
| 1914 | ;not_passx : ;; | ||
| 1915 | ;; | ||
| 1916 | JMP PASS_END ;; | ||
| 1917 | ;; | ||
| 1918 | PASS_ERR : ;; DEVICE ERROR, wrong stage | ||
| 1919 | POP DI ;; | ||
| 1920 | POP ES ;; | ||
| 1921 | POP DX ;; | ||
| 1922 | MOV FTP.FTB_STATUS,STAT_DEVERR | ||
| 1923 | SUB CX,CX ;; ignore all the input string | ||
| 1924 | JMP PASS_DONE ;; | ||
| 1925 | ;; | ||
| 1926 | PASS_END : ;; | ||
| 1927 | POP DI ;; | ||
| 1928 | POP ES ;; | ||
| 1929 | POP DX ;; | ||
| 1930 | PASS_DONE : ;; | ||
| 1931 | JMP FTB_LOOP ;; | ||
| 1932 | ;; | ||
| 1933 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1934 | ;; | ||
| 1935 | FTB_LPEND : ;; | ||
| 1936 | ;; | ||
| 1937 | CMP cs:stage,FOUNDX ;; | ||
| 1938 | JNE NOT_FOUNDX ;; | ||
| 1939 | ;; | ||
| 1940 | CALL FOUND_DO ;; | ||
| 1941 | ;; | ||
| 1942 | NOT_FOUNDX : ;; | ||
| 1943 | ;; | ||
| 1944 | POP CX ;; STACK -1 | ||
| 1945 | ;; | ||
| 1946 | FP_RET : ;; | ||
| 1947 | POP SI ;; restore registers | ||
| 1948 | POP DI ;; | ||
| 1949 | POP DX ;; | ||
| 1950 | POP CX ;; | ||
| 1951 | POP BX ;; | ||
| 1952 | POP AX ;; | ||
| 1953 | POP ES ;; | ||
| 1954 | POP DS ;; | ||
| 1955 | ;; | ||
| 1956 | RET ;; | ||
| 1957 | FONT_PARSER ENDP ;; | ||
| 1958 | ;; | ||
| 1959 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1960 | CSEG ENDS | ||
| 1961 | END | ||
diff --git a/v4.0/src/DEV/PRINTER/CPSFONT3.ASM b/v4.0/src/DEV/PRINTER/CPSFONT3.ASM new file mode 100644 index 0000000..74fa12b --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSFONT3.ASM | |||
| @@ -0,0 +1,1961 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; | ||
| 6 | ;; FILENAME: CPS Device Driver -- Font Parser | ||
| 7 | ;; MODULE NAME: CPSFONT | ||
| 8 | ;; TYPE: Font Parser Module | ||
| 9 | ;; LINK PROCEDURE: Link CPS+CPSSUB+CPSINT9+...+CPSINIT into .EXE format | ||
| 10 | ;; CPS must be first. CPSINIT must be last. Everything | ||
| 11 | ;; before CPSINIT will be resident. | ||
| 12 | ;; INCLUDE FILES: | ||
| 13 | ;; CPSPEQU.INC | ||
| 14 | ;; | ||
| 15 | ;; | ||
| 16 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 17 | ;; | ||
| 18 | INCLUDE CPSPEQU.INC ;; | ||
| 19 | ;; | ||
| 20 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 21 | ;; | ||
| 22 | CSEG SEGMENT PUBLIC 'CODE' ;; | ||
| 23 | ASSUME CS:CSEG ;; | ||
| 24 | ASSUME DS:NOTHING ;; | ||
| 25 | ;; | ||
| 26 | PUBLIC FTABLE,FONT_PARSER ;; | ||
| 27 | ;; | ||
| 28 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 29 | ;; | ||
| 30 | ;; ************************************ | ||
| 31 | ;; ** ** | ||
| 32 | ;; ** Resident Code ** | ||
| 33 | ;; ** ** | ||
| 34 | ;; ************************************ | ||
| 35 | ;; | ||
| 36 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 37 | ;; | ||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | ;; | ||
| 40 | ;; FONT_PARSER data | ||
| 41 | ;; | ||
| 42 | ;; -- Interface table : FTABLE | ||
| 43 | ;; | ||
| 44 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 45 | FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing | ||
| 46 | FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries | ||
| 47 | FTB2 FTBLK <,,,,,,,,,,,,> ;; | ||
| 48 | FTB3 FTBLK <,,,,,,,,,,,,> ;; | ||
| 49 | FTB4 FTBLK <,,,,,,,,,,,,> ;; | ||
| 50 | FTB5 FTBLK <,,,,,,,,,,,,> ;; | ||
| 51 | FTB6 FTBLK <,,,,,,,,,,,,> ;; | ||
| 52 | FTB7 FTBLK <,,,,,,,,,,,,> ;; | ||
| 53 | FTB8 FTBLK <,,,,,,,,,,,,> ;; | ||
| 54 | FTB9 FTBLK <,,,,,,,,,,,,> ;; | ||
| 55 | FTBa FTBLK <,,,,,,,,,,,,> ;; | ||
| 56 | FTBb FTBLK <,,,,,,,,,,,,> ;; | ||
| 57 | FTBc FTBLK <,,,,,,,,,,,,> ;; | ||
| 58 | ;; | ||
| 59 | FP_ERROR DW 0000H ;; internal error register | ||
| 60 | ;; | ||
| 61 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 62 | ;; the followings are bytes accumulated | ||
| 63 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 64 | FTAG_LEN EQU 8 ;; FILE TAGE in the font file header | ||
| 65 | FTAG_COUNT DW 0000H ;; | ||
| 66 | ;; | ||
| 67 | FTAG_PATTERN LABEL BYTE ;; | ||
| 68 | DB 0FFH ;; | ||
| 69 | DB 'FONT ' ;; | ||
| 70 | ;; | ||
| 71 | ;; | ||
| 72 | ;; POINTER in the font file header | ||
| 73 | fptr_LOW LABEL WORD ;; | ||
| 74 | fptr_LOL DB 00H ;; NEXT | ||
| 75 | fptr_LOH DB 00H ;; | ||
| 76 | fptr_HIGH LABEL WORD ;; | ||
| 77 | fptr_HIL DB 00H ;; | ||
| 78 | fptr_HIH DB 00H ;; | ||
| 79 | ;; | ||
| 80 | ;; | ||
| 81 | ;; | ||
| 82 | ENTRY_WORD LABEL WORD ;; | ||
| 83 | ENTRY_LOB DB 00H ;; ENTRY COUNT | ||
| 84 | ENTRY_HIB DB 00H ;; | ||
| 85 | NEXT_LOW LABEL WORD ;; | ||
| 86 | NEXT_LOL DB 00H ;; NEXT | ||
| 87 | NEXT_LOH DB 00H ;; | ||
| 88 | NEXT_HIGH LABEL WORD ;; | ||
| 89 | NEXT_HIL DB 00H ;; | ||
| 90 | NEXT_HIH DB 00H ;; | ||
| 91 | TYPE_WORD LABEL WORD ;; | ||
| 92 | TYPE_LOB DB 00H ;; TYPE | ||
| 93 | TYPE_HIB DB 00H ;; | ||
| 94 | TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8) | ||
| 95 | TYPE_ID : DB ' ' ;; TYPEID | ||
| 96 | CPG_WORD LABEL WORD ;; | ||
| 97 | CPG_LOB DB 00H ;; CODE PAGE | ||
| 98 | CPG_HIB DB 00H ;; | ||
| 99 | FONT_LOW LABEL WORD ;; | ||
| 100 | FONT_LOL DB 00H ;; FONT ADDRESS | ||
| 101 | FONT_LOH DB 00H ;; | ||
| 102 | FONT_HIGH LABEL WORD ;; | ||
| 103 | FONT_HIL DB 00H ;; | ||
| 104 | FONT_HIH DB 00H ;; | ||
| 105 | ;; the followings are contained in the font-block in the exact order & length | ||
| 106 | MOD_WORD LABEL WORD ;; | ||
| 107 | MOD_LOB DB 00H ;; MODIFIER | ||
| 108 | MOD_HIB DB 00H ;; | ||
| 109 | FONTS_WORD LABEL WORD ;; | ||
| 110 | FONTS_LOB DB 00H ;; FONTS | ||
| 111 | FONTS_HIB DB 00H ;; | ||
| 112 | FDLEN_WORD LABEL WORD ;; | ||
| 113 | FDLEN_LOB DB 00H ;; FONT DATA LENGTH | ||
| 114 | FDLEN_HIB DB 00H ;; | ||
| 115 | PRE_FONT_ND EQU ($-MOD_WORD) ;; used to update target for font data | ||
| 116 | ;; to follow. -- for NON-DISPLAY | ||
| 117 | DISP_ROWS DB 00H ;; DISPLAY's parameters : | ||
| 118 | DISP_COLS DB 00H ;; BOX SIZE | ||
| 119 | DISP_X DB 00H ;; ASPECT RATIO | ||
| 120 | DISP_Y DB 00H ;; | ||
| 121 | COUNT_WORD LABEL WORD ;; NO. OF DISPLAY CHARACTERS | ||
| 122 | COUNT_LOB DB 00H ;; | ||
| 123 | COUNT_HIB DB 00H ;; | ||
| 124 | PRE_FONT_D EQU ($-MOD_WORD) ;; used to update target for font data | ||
| 125 | ;; to follow. -- for DISPLAY | ||
| 126 | ;; | ||
| 127 | PTR_SEL_WORD LABEL WORD ;; | ||
| 128 | PTR_SELOB DB 00H ;; | ||
| 129 | PTR_SEHIB DB 00H ;; | ||
| 130 | PRE_FONT_P0 EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data | ||
| 131 | ;; to follow -- for PRINTER with | ||
| 132 | ;; selection type = 0. | ||
| 133 | ;; | ||
| 134 | PTR_LEN_WORD LABEL WORD ;; | ||
| 135 | PTR_LNLOB DB 00H ;; | ||
| 136 | PTR_LNHIB DB 00H ;; | ||
| 137 | PRE_FONT_P EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data | ||
| 138 | ;; to follow -- for PRINTER with | ||
| 139 | ;; selection type <> 0. | ||
| 140 | ;; | ||
| 141 | ;; | ||
| 142 | ;; also update STAGE_CASES and indexing constants | ||
| 143 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 144 | ;; the stage the parsing is in : ;;;;; | ||
| 145 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 146 | ;; | ||
| 147 | STAGE_CASES LABEL WORD ;; the stage the parsing is in : | ||
| 148 | ;; | ||
| 149 | ;; *** INDEXED BY STAGE-INDEX | ||
| 150 | ;; | ||
| 151 | DW OFFSET ENTRYLO ;; 0 | ||
| 152 | DW OFFSET ENTRYHI ;; 1 | ||
| 153 | DW OFFSET NEXTLOL ;; 2 | ||
| 154 | DW OFFSET NEXTLOH ;; 3 | ||
| 155 | DW OFFSET NEXTHIL ;; 4 | ||
| 156 | DW OFFSET NEXTHIH ;; 5 | ||
| 157 | DW OFFSET TYPELO ;; 6 | ||
| 158 | DW OFFSET TYPEHI ;; 7 | ||
| 159 | DW OFFSET TYPEIDS ;; 8 | ||
| 160 | DW OFFSET CPGLO ;; 9 | ||
| 161 | DW OFFSET CPGHI ;; A | ||
| 162 | DW OFFSET FONTLOL ;; B | ||
| 163 | DW OFFSET FONTLOH ;; C | ||
| 164 | DW OFFSET FONTHIL ;; D | ||
| 165 | DW OFFSET FONTHIH ;; E | ||
| 166 | DW 00H ;; MATCH case -- end of SEARCH stages | ||
| 167 | DW 00H ;; SCAN case -- before PRE-FOUND stage | ||
| 168 | DW OFFSET MODLO ;; 11 | ||
| 169 | DW OFFSET MODHI ;; 12 | ||
| 170 | DW OFFSET FONTSLO ;; 13 | ||
| 171 | DW OFFSET FONTSHI ;; 14 | ||
| 172 | DW OFFSET FDLENLO ;; 15 | ||
| 173 | DW OFFSET FDLENHI ;; 16 -- lead to FONT case,NON- DISPLAY | ||
| 174 | DW OFFSET DSPROWS ;; 17 -- DISPLAY only | ||
| 175 | DW OFFSET DSPCOLS ;; 18 | ||
| 176 | DW OFFSET DSPX ;; 19 | ||
| 177 | DW OFFSET DSPY ;; 1A | ||
| 178 | DW OFFSET DSPCOUNTLO ;; 1B | ||
| 179 | DW OFFSET DSPCOUNTHI ;; 1C -- lead to FONT case, DISPLAY | ||
| 180 | DW OFFSET PTRSELLO ;; 1D -- PRINTER only | ||
| 181 | DW OFFSET PTRSELHI ;; 1E | ||
| 182 | DW OFFSET PTRLENLO ;; 1F | ||
| 183 | DW OFFSET PTRLENHI ;; 20 -- lead to FONT case, PRINTER | ||
| 184 | DW 00H ;; FOUND case | ||
| 185 | DW 00H ;; GET_FONT case | ||
| 186 | DW 00H ;; PASS special stage | ||
| 187 | DW OFFSET FILETAG ;; 24 | ||
| 188 | DW OFFSET fptrLOL ;; 25 | ||
| 189 | DW OFFSET fptrLOH ;; 26 | ||
| 190 | DW OFFSET fptrHIL ;; 27 | ||
| 191 | DW OFFSET fptrHIH ;; 28 | ||
| 192 | DW 00H ;; FPTR_SKIP_CASE | ||
| 193 | ;; | ||
| 194 | ;; The followings are individual stage | ||
| 195 | STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages | ||
| 196 | ;; | ||
| 197 | ;; STAGE-INDEX | ||
| 198 | ;; | ||
| 199 | ;; **** INDEX TO STAGE_CASES **** | ||
| 200 | ENTRY_LOX EQU 00H ;; | ||
| 201 | ENTRY_HIX EQU 01H ;; | ||
| 202 | NEXT_LOLX EQU 02H ;; NEXT | ||
| 203 | NEXT_LOHX EQU 03H ;; | ||
| 204 | NEXT_HILX EQU 04H ;; | ||
| 205 | NEXT_HIHX EQU 05H ;; | ||
| 206 | TYPE_LOBX EQU 06H ;; TYPE | ||
| 207 | TYPE_HIBX EQU 07H ;; | ||
| 208 | TYPE_IDX EQU 08H ;; TYPEID | ||
| 209 | CPG_LOBX EQU 09H ;; CODE PAGE | ||
| 210 | CPG_HIBX EQU 0AH ;; | ||
| 211 | FONT_LOLX EQU 0BH ;; FONT ADDRESS | ||
| 212 | FONT_LOHX EQU 0CH ;; | ||
| 213 | FONT_HILX EQU 0DH ;; | ||
| 214 | FONT_HIHX EQU 0EH ;; | ||
| 215 | ;; ------------------------------ | ||
| 216 | MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages | ||
| 217 | SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages | ||
| 218 | ;; ------------------------------ | ||
| 219 | MOD_LOBX EQU 11H ;; MODIFIER | ||
| 220 | MOD_HIBX EQU 12H ;; | ||
| 221 | FONTS_LOBX EQU 13H ;; FONTS | ||
| 222 | FONTS_HIBX EQU 14H ;; | ||
| 223 | FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH | ||
| 224 | FDLEN_HIBX EQU 16H ;; | ||
| 225 | DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE | ||
| 226 | DISP_COLSX EQU 18H ;; | ||
| 227 | DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO | ||
| 228 | DISP_YX EQU 1AH ;; | ||
| 229 | COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT | ||
| 230 | COUNT_HIBX EQU 1CH ;; | ||
| 231 | PTRSELLOX EQU 1DH ;; | ||
| 232 | PTRSELHIX EQU 1EH ;; | ||
| 233 | PTRLENLOX EQU 1FH ;; | ||
| 234 | PTRLENHIX EQU 20H ;; | ||
| 235 | ;; | ||
| 236 | ;; ------------------------------ | ||
| 237 | FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage | ||
| 238 | GET_FX EQU 22H ;; | ||
| 239 | ;; ------------------------------ | ||
| 240 | PASSX EQU 23H ;; see pass_brk table | ||
| 241 | ;; ------------------------------ | ||
| 242 | FTAGX EQU 24H ;; RESTART ==> FILE TAG | ||
| 243 | ;; | ||
| 244 | fptr_LOLX EQU 25H ;; POINTER in font file header | ||
| 245 | fptr_LOHX EQU 26H ;; | ||
| 246 | fptr_HILX EQU 27H ;; | ||
| 247 | fptr_HIHX EQU 28H ;; --------------------------------- | ||
| 248 | ;; | ||
| 249 | fptr_SKIPX EQU 29H ;; ==> ENTRY_LOX | ||
| 250 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 251 | ;; PASS -- to skip some bytes ;;;;;; | ||
| 252 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 253 | ;; the PASS mechanism is used to skip | ||
| 254 | ;; a number of bytes between two fields | ||
| 255 | ;; The numbers are tabulated in | ||
| 256 | ;; PASS_BRK table in the accumulative | ||
| 257 | ;; sum. The PASS_POSTX(and PASS_POSTXX) | ||
| 258 | ;; are used to tell what is the stage | ||
| 259 | ;; after all the bytes have skipped. | ||
| 260 | ;; | ||
| 261 | PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage | ||
| 262 | ;; | ||
| 263 | FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file : | ||
| 264 | ;; ( after TAG, before POINTER) | ||
| 265 | ;; | ||
| 266 | PASS_CNT DW 0 ;; | ||
| 267 | PASS_BRK LABEL WORD ;; | ||
| 268 | DW FILE_OFFSET ;; skip in the font file header | ||
| 269 | DW FILE_OFFSET+2 ;; pass header-length, needs to reset | ||
| 270 | ;; PASS_CNT for each of the font_header | ||
| 271 | DW FILE_OFFSET+8 ;; pass header-reserved bytes | ||
| 272 | PASS_INDX EQU ($-PASS_BRK)/2 ;; | ||
| 273 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 274 | ;; the control variables : ;;;;;;;; | ||
| 275 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 276 | STAGE DW STAGE_MAX ;; of the STAGE-INDEX | ||
| 277 | ;; | ||
| 278 | Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA | ||
| 279 | ;; | ||
| 280 | ;; | ||
| 281 | COUNT_LO DW 00000H ;; no. of bytes parsed so far | ||
| 282 | COUNT_hI DW 00000H ;; | ||
| 283 | ;; | ||
| 284 | HIT_LO DW 00000H ;; the next byte that is addressed by : | ||
| 285 | HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK. | ||
| 286 | ;; | ||
| 287 | HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching | ||
| 288 | HIT_BX DW 00000H ;; where FTB is found for nearest hit | ||
| 289 | ;; | ||
| 290 | NUM_FTB DW 00000H ;; as defined in the FP_BUFFER | ||
| 291 | ;; | ||
| 292 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 293 | ;; | ||
| 294 | ;; FONT_PARSER routine | ||
| 295 | ;; | ||
| 296 | ;; -- to be called at every packet received to extract informations | ||
| 297 | ;; from Font File on byte basis. | ||
| 298 | ;; | ||
| 299 | ;; -- Interface though FTABLE | ||
| 300 | ;; | ||
| 301 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 302 | ;; | ||
| 303 | FONT_PARSER PROC ;; | ||
| 304 | PUSH DS ;; save all registers Revised | ||
| 305 | PUSH ES ;; | ||
| 306 | PUSH AX ;; | ||
| 307 | PUSH BX ;; | ||
| 308 | PUSH CX ;; | ||
| 309 | PUSH DX ;; | ||
| 310 | PUSH DI ;; | ||
| 311 | PUSH SI ;; | ||
| 312 | ;; BP isn't used, so it isn't saved | ||
| 313 | LEA BX,FTABLE ;; | ||
| 314 | PUSH CS ;; | ||
| 315 | POP ES ;; ES:[BX] | ||
| 316 | LDS SI,FTP.BUFFER_ADDR ;; DS:[SI] | ||
| 317 | MOV CX,FTP.BUFFER_LEN ;; CX = length of packet | ||
| 318 | MOV DX,FTP.NUM_FTBLK ;; DX = number of FTB | ||
| 319 | MOV cs:num_ftb,DX ;; | ||
| 320 | AND DX,DX ;; | ||
| 321 | JNZ VALID_BUFFER ;; | ||
| 322 | MOV cs:fp_error,0020H ;; ERROR 0020H | ||
| 323 | JMP FP_RET ;; | ||
| 324 | VALID_BUFFER : ;; | ||
| 325 | MOV AX,FTP.FLAG ;; | ||
| 326 | AND AX,FLAG_RESTART ;; | ||
| 327 | Jnz has_RESTART ;; | ||
| 328 | JMP NO_RESTART ;; | ||
| 329 | ;; | ||
| 330 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 331 | has_restart : ;; | ||
| 332 | PUSH BX ;; reset all the output fields | ||
| 333 | ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK | ||
| 334 | XOR AX,AX ;; | ||
| 335 | ;; | ||
| 336 | MOV cs:ftag_count,AX ;; | ||
| 337 | MOV cs:fptr_low,AX ;; | ||
| 338 | MOV cs:fptr_high,AX ;; | ||
| 339 | MOV cs:pre_font_len,AX ;; | ||
| 340 | MOV cs:count_lo,AX ;; | ||
| 341 | MOV cs:count_hi,AX ;; | ||
| 342 | MOV cs:next_low,AX ;; | ||
| 343 | MOV cs:next_high,AX ;; | ||
| 344 | MOV cs:hit_lo,AX ;; | ||
| 345 | MOV cs:hit_hi,AX ;; | ||
| 346 | MOV cs:hit_flag,AX ;; | ||
| 347 | MOV cs:pass_cnt,AX ;; | ||
| 348 | MOV cs:pass_postx,STAGE_MAX ;; | ||
| 349 | ;; | ||
| 350 | MOV cs:stage,STAGE_MAX ;; | ||
| 351 | ;; | ||
| 352 | RESET_FTB : ;; | ||
| 353 | MOV FTP.FTB_STATUS,FSTAT_SEARCH | ||
| 354 | MOV FTP.FTB_TYPE,AX ;; | ||
| 355 | MOV FTP.FTB_MOD,AX ;; | ||
| 356 | MOV FTP.FTB_FONTS,AX ;; | ||
| 357 | MOV FTP.FTB_ROWS,AL ;; | ||
| 358 | MOV FTP.FTB_COLS,AL ;; | ||
| 359 | MOV FTP.FTB_X,AL ;; | ||
| 360 | MOV FTP.FTB_Y,AL ;; | ||
| 361 | MOV FTP.FTB_COUNT,AX ;; | ||
| 362 | MOV FTP.FTB_DLEFT,AX ;; | ||
| 363 | MOV FTP.FTB_DLEN,AX ;; | ||
| 364 | MOV FTP.FTB_DALO,AX ;; | ||
| 365 | MOV FTP.FTB_DAHI,AX ;; | ||
| 366 | MOV FTP.TARGET_LO,AX ;; | ||
| 367 | MOV FTP.TARGET_HI,AX ;; | ||
| 368 | ;; | ||
| 369 | ADD BX, TYPE FTBLK ;; | ||
| 370 | ;; | ||
| 371 | DEC DX ;; | ||
| 372 | AND DX,DX ;; | ||
| 373 | JNZ RESET_FTB ;; | ||
| 374 | ;; | ||
| 375 | POP BX ;; | ||
| 376 | NO_RESTART : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 377 | ;; any FTBLKs have their data all | ||
| 378 | ;; returned ? if so set their status | ||
| 379 | ;; from FOUND to COMPLETE | ||
| 380 | PUSH BX ;; | ||
| 381 | ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK | ||
| 382 | ;; | ||
| 383 | MOV DX,cs:num_ftb ;; | ||
| 384 | ;; | ||
| 385 | SET_COMPLETE : ;; | ||
| 386 | MOV AX,FTP.FTB_STATUS ;; | ||
| 387 | CMP AX,FSTAT_FONT ;; | ||
| 388 | JNE SET_NEXT ;; | ||
| 389 | ;; | ||
| 390 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 391 | AND AX,AX ;; | ||
| 392 | JNZ SET_NEXT ;; | ||
| 393 | ;; | ||
| 394 | MOV FTP.FTB_STATUS,FSTAT_COMPLETE | ||
| 395 | ;; | ||
| 396 | SET_NEXT : ;; | ||
| 397 | ;; | ||
| 398 | ADD BX,TYPE FTBLK ;; | ||
| 399 | ;; | ||
| 400 | DEC DX ;; | ||
| 401 | AND DX,DX ;; | ||
| 402 | JNZ SET_COMPLETE ;; | ||
| 403 | ;; | ||
| 404 | POP BX ;; | ||
| 405 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 406 | ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK | ||
| 407 | ;; | ||
| 408 | PUSH CX ;; STACK 1 = CX | ||
| 409 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 410 | ;; | ||
| 411 | ;; DO WHILE CX is not zero : | ||
| 412 | ;; | ||
| 413 | ;; -- on each loop, the CX, COUNTs are updated | ||
| 414 | ;; | ||
| 415 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 416 | ;; | ||
| 417 | ;; | ||
| 418 | FTB_LOOP : ;; | ||
| 419 | POP AX ;; STACK -1 | ||
| 420 | SUB AX,CX ;; | ||
| 421 | ADD cs:count_lo,AX ;; | ||
| 422 | JNC NO_CARRY ;; | ||
| 423 | ADD cs:count_hi,1000H ;; | ||
| 424 | NO_CARRY : ;; | ||
| 425 | PUSH CX ;; STACK 1 = CX | ||
| 426 | AND CX,CX ;; | ||
| 427 | JNZ FTB_CONT ;; | ||
| 428 | JMP FTB_LPEND ;; | ||
| 429 | ;; DO CASES : | ||
| 430 | FTB_CONT : ;; ========== | ||
| 431 | ;; | ||
| 432 | MOV AX,cs:stage ;; | ||
| 433 | ;; | ||
| 434 | CMP AX,STAGE_MAX ;; | ||
| 435 | JNE FTB_010 ;; | ||
| 436 | JMP START_CASE ;; ** RESTART ** | ||
| 437 | ;; | ||
| 438 | FTB_010 : ;; | ||
| 439 | CMP AX,MATCHX ;; | ||
| 440 | JAE FTB_020 ;; | ||
| 441 | JMP SEARCH_CASE ;; ** SEARCH ** | ||
| 442 | ;; | ||
| 443 | FTB_020 : ;; | ||
| 444 | CMP AX,MATCHX ;; | ||
| 445 | JNE FTB_030 ;; | ||
| 446 | JMP MATCH_CASE ;; ** MATCH ** | ||
| 447 | ;; | ||
| 448 | FTB_030 : ;; | ||
| 449 | CMP AX,SCANX ;; | ||
| 450 | JNE FTB_040 ;; | ||
| 451 | JMP SCAN_CASE ;; ** SCAN ** | ||
| 452 | ;; | ||
| 453 | FTB_040 : ;; | ||
| 454 | CMP AX,FOUNDX ;; | ||
| 455 | JAE FTB_050 ;; | ||
| 456 | JMP PRE_FOUND_CASE ;; ** PRE-FOUND ** | ||
| 457 | ;; | ||
| 458 | FTB_050 : ;; | ||
| 459 | CMP AX,FOUNDX ;; | ||
| 460 | JNE FTB_060 ;; | ||
| 461 | JMP FOUND_CASE ;; ** FOUND ** | ||
| 462 | ;; | ||
| 463 | FTB_060 : ;; | ||
| 464 | CMP AX,GET_FX ;; | ||
| 465 | JNE FTB_070 ;; | ||
| 466 | JMP GETFONT_CASE ;; ** GET_FONT ** | ||
| 467 | ;; | ||
| 468 | FTB_070 : ;; | ||
| 469 | CMP AX,PASSX ;; | ||
| 470 | JNE FTB_080 ;; | ||
| 471 | JMP PASS ;; ** PASS ** | ||
| 472 | ;; | ||
| 473 | FTB_080 : ;; | ||
| 474 | CMP AX,FPTR_SKIPX ;; | ||
| 475 | JAE FTB_090 ;; | ||
| 476 | JMP SEARCH_CASE ;; ** SEARCH ** | ||
| 477 | ;; | ||
| 478 | FTB_090 : ;; | ||
| 479 | CMP AX,FPTR_SKIPX ;; | ||
| 480 | JNE FTB_FFF ;; | ||
| 481 | JMP FPTR_SKIP_CASE ;; ** SEARCH ** | ||
| 482 | ;; | ||
| 483 | FTB_FFF : ;; | ||
| 484 | MOV FTP.FTB_STATUS,STAT_DEVERR | ||
| 485 | JMP FTB_LPEND ;; ** DEVICE ERROR ** | ||
| 486 | ;; | ||
| 487 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 488 | ;; | ||
| 489 | ;; at the entry of each STAGES /CASES | ||
| 490 | ;; | ||
| 491 | ;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer | ||
| 492 | ;; -- CX remaining packet length | ||
| 493 | ;; -- ES:[BX] points to the first FTBLK | ||
| 494 | ;; -- COUNT_LO, COUNT_HI, upto but and including the address pointed by FPKT | ||
| 495 | ;; | ||
| 496 | ;; | ||
| 497 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 498 | ;; | ||
| 499 | ;============================================================================ | ||
| 500 | START_CASE : ;; pass the FILE leading bytes | ||
| 501 | ;; | ||
| 502 | MOV cs:ftag_count,0 ;; | ||
| 503 | MOV cs:stage,ftagx ;; | ||
| 504 | JMP FTB_LOOP ;; | ||
| 505 | ;; | ||
| 506 | ;============================================================================= | ||
| 507 | FPTR_SKIP_CASE : ;; skip until the ENTRY pointed by | ||
| 508 | ;; POINTER (in FPTR) is reached. | ||
| 509 | ;; | ||
| 510 | ;; ************** | ||
| 511 | MOV AX,cs:fptr_low ;; * HIT = FPTR * | ||
| 512 | MOV cs:hit_lo,AX ;; ************** | ||
| 513 | MOV DX,cs:fptr_high ;; | ||
| 514 | MOV cs:hit_hi,DX ;; | ||
| 515 | ;; | ||
| 516 | CMP AX,0FFFFH ;; | ||
| 517 | JNE FPTR_SKIP_VALID ;; | ||
| 518 | CMP DX,0FFFFH ;; | ||
| 519 | JNE FPTR_SKIP_VALID ;; | ||
| 520 | ;; | ||
| 521 | MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK | ||
| 522 | JMP FPTR_SKIP_MORE ;; | ||
| 523 | ;; | ||
| 524 | FPTR_SKIP_VALID : ;; | ||
| 525 | ;; normalised HIT_HI, HIT_LO | ||
| 526 | MOV AX,DX ;; | ||
| 527 | AND AX,00FFFH ;; | ||
| 528 | PUSH CX ;; | ||
| 529 | MOV CX,4 ;; | ||
| 530 | SHL AX,CL ;; | ||
| 531 | POP CX ;; | ||
| 532 | AND DX,0F000H ;; | ||
| 533 | ADD AX,cs:hit_lo ;; | ||
| 534 | JNC NO_CARRY10 ;; | ||
| 535 | ADD DX,01000H ;; | ||
| 536 | NO_CARRY10: ;; | ||
| 537 | MOV cs:hit_lo,AX ;; | ||
| 538 | MOV cs:hit_hi,DX ;; | ||
| 539 | ;; ************************** | ||
| 540 | ;; * compare FPTR and COUNT * | ||
| 541 | ;; ************************** | ||
| 542 | ;; DX:AX = HIT_HI:HIT_LO (normalised) | ||
| 543 | ;; | ||
| 544 | SUB AX,cs:count_lo ;; | ||
| 545 | Jnc more_fptrlo ;; | ||
| 546 | sub dx,01000h ;; | ||
| 547 | jc fptr_bad ;; | ||
| 548 | ;; | ||
| 549 | more_fptrlo : ;; | ||
| 550 | SUB DX,cs:count_hi ;; | ||
| 551 | JC fptr_BAD ;; | ||
| 552 | ;; | ||
| 553 | INC AX ;; COUNT can be at the HIT, then AX=0 | ||
| 554 | JNC NO_CARRY11 ;; INC AX to make AX comparable to CX | ||
| 555 | ADD DX,01000H ;; i.e. AX = offset + 1 | ||
| 556 | ;; | ||
| 557 | NO_CARRY11: ;; | ||
| 558 | CMP AX,CX ;; | ||
| 559 | JA fptr_skip_more ;; AX > CX, whole CX to be skipped | ||
| 560 | ;; | ||
| 561 | PUSH DX ;; normalise dx:ax | ||
| 562 | AND DX,00FFFH ;; | ||
| 563 | PUSH CX ;; | ||
| 564 | MOV CX,4 ;; | ||
| 565 | SHL DX,CL ;; | ||
| 566 | POP CX ;; | ||
| 567 | ADD AX,DX ;; | ||
| 568 | POP DX ;; | ||
| 569 | JNC NO_CARRY13 ;; | ||
| 570 | ADD DX,01000H ;; | ||
| 571 | NO_CARRY13: ;; | ||
| 572 | AND DX,0F000H ;; | ||
| 573 | ;; | ||
| 574 | PUSH AX ;; | ||
| 575 | PUSH DX ;; STACK +1 : normalosed DX:AX | ||
| 576 | SUB AX,CX ;; | ||
| 577 | JNC NO_BORROW11 ;; | ||
| 578 | SUB DX,1000H ;; | ||
| 579 | JC fptr_MORE_CXp ;; dx:ax < cx | ||
| 580 | NO_BORROW11: ;; | ||
| 581 | ;; dx:ax >= cx | ||
| 582 | AND AX,AX ;; | ||
| 583 | JNE fptr_skip_MOREP ;; | ||
| 584 | AND DX,DX ;; | ||
| 585 | JNE fptr_skip_MOREP ;; | ||
| 586 | ;; dx:ax = cx, or | ||
| 587 | ;; offset + 1 = CX | ||
| 588 | ;; | ||
| 589 | ;; ************************************ | ||
| 590 | ;; * POINTER is within the current CX * | ||
| 591 | ;; ************************************ | ||
| 592 | fptr_MORE_CXP : ;; | ||
| 593 | POP DX ;; | ||
| 594 | POP AX ;; STACK -1 | ||
| 595 | ;; | ||
| 596 | fptr_MORE_CX : ;; DX = 0,to have more CX than offset+1 | ||
| 597 | DEC AX ;; = offset : 0 and above | ||
| 598 | SUB CX,AX ;; | ||
| 599 | ADD SI,AX ;; where the first byte is | ||
| 600 | ;; | ||
| 601 | MOV cs:stage,entry_lox ;; ENTRIES in the font file | ||
| 602 | ;; | ||
| 603 | JMP FTB_LOOP ;; ****** RETURN ******* | ||
| 604 | ;; | ||
| 605 | ;; *********************************** | ||
| 606 | ;; * more to skip ==> FPTR_SKIP_CASE * | ||
| 607 | ;; *********************************** | ||
| 608 | fptr_skip_morep: ;; | ||
| 609 | POP DX ;; | ||
| 610 | POP AX ;; STACK -1 | ||
| 611 | ;; | ||
| 612 | fptr_skip_more : ;; | ||
| 613 | ADD SI,CX ;; | ||
| 614 | SUB CX,CX ;; | ||
| 615 | JMP FTB_LOOP ;; ****** RETURN ***** | ||
| 616 | ;; | ||
| 617 | ;; *********************************** | ||
| 618 | ;; * bad POINTER in font file header * | ||
| 619 | ;; *********************************** | ||
| 620 | ;; | ||
| 621 | fptr_bad : ;; | ||
| 622 | MOV cs:fptr_low,0FFFFH ;; | ||
| 623 | MOV cs:fptr_high,0FFFFH ;; | ||
| 624 | ;; | ||
| 625 | MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK | ||
| 626 | ;; | ||
| 627 | JMP FPTR_SKIP_MORE ;; | ||
| 628 | ;; | ||
| 629 | ;============================================================================= | ||
| 630 | SEARCH_CASE : ;; | ||
| 631 | ;; still looking for header to match | ||
| 632 | ;; the input : codepage and typeid | ||
| 633 | ;; | ||
| 634 | MOV DI,cs:stage ;; | ||
| 635 | ;; | ||
| 636 | ADD DI,DI ;; double to index to WORD-offset | ||
| 637 | ;; | ||
| 638 | JMP CS:STAGE_CASES[DI] ;; call routine to process the stage | ||
| 639 | ;; | ||
| 640 | ;; | ||
| 641 | ;=========================================================================== | ||
| 642 | MATCH_CASE : ;; | ||
| 643 | ;; | ||
| 644 | PUSH BX ;; | ||
| 645 | MOV DX,cs:num_ftb ;; | ||
| 646 | ;; | ||
| 647 | ;; | ||
| 648 | MATCH_LOOP : ;; | ||
| 649 | MOV AX,FTP.FTB_STATUS ;; | ||
| 650 | CMP AX,FSTAT_SEARCH ;; | ||
| 651 | JE MATCH_SEARCH ;; | ||
| 652 | JMP MATCH_NEXT ;; | ||
| 653 | ;; | ||
| 654 | MATCH_SEARCH : ;; | ||
| 655 | MOV AX,FTP.FTB_CP ;; check the FTB with SEARCH status | ||
| 656 | CMP AX,cs:cpg_word ;; | ||
| 657 | JNE MATCH_MORE ;; | ||
| 658 | PUSH DS ;; code page matched | ||
| 659 | PUSH SI ;; | ||
| 660 | PUSH CX ;; | ||
| 661 | ;; | ||
| 662 | PUSH CS ;; | ||
| 663 | POP DS ;; | ||
| 664 | MOV SI,OFFSET TYPE_ID ;; | ||
| 665 | LEA DI,[BX].FTB_TID ;; | ||
| 666 | MOV CX,8 ;; | ||
| 667 | REPE CMPSB ;; | ||
| 668 | ;; | ||
| 669 | POP CX ;; | ||
| 670 | POP SI ;; | ||
| 671 | POP DS ;; | ||
| 672 | ;; | ||
| 673 | JNE MATCH_MORE ;; | ||
| 674 | ;; MATCH !!!!! (type_id matched) | ||
| 675 | MOV FTP.FTB_STATUS,FSTAT_MATCH | ||
| 676 | MOV AX,cs:type_word ;; | ||
| 677 | MOV FTP.FTB_TYPE,AX ;; | ||
| 678 | MOV AX,cs:font_low ;; | ||
| 679 | MOV FTP.TARGET_LO,AX ;; | ||
| 680 | MOV AX,cs:font_high ;; | ||
| 681 | MOV FTP.TARGET_HI,AX ;; | ||
| 682 | ;; | ||
| 683 | JMP MATCH_NEXT ;; | ||
| 684 | ;; | ||
| 685 | MATCH_MORE : ;; if this is the last rounf ? | ||
| 686 | ;; | ||
| 687 | MOV AX,cs:next_low ;; NEXT = FFFF:FFFF means no more | ||
| 688 | CMP AX,-1 ;; header to come. | ||
| 689 | JNE MATCH_NEXT ;; | ||
| 690 | ;; | ||
| 691 | MOV AX,cs:next_high ;; | ||
| 692 | CMP AX,-1 ;; | ||
| 693 | JNE MATCH_NEXT ;; | ||
| 694 | ;; | ||
| 695 | MOV FTP.FTB_STATUS,STAT_NOFIND ;; ERROR : no match | ||
| 696 | ;; | ||
| 697 | MATCH_NEXT : ;; | ||
| 698 | ADD BX,FTP.FTB_LENGTH ;; | ||
| 699 | DEC DX ;; | ||
| 700 | AND DX,DX ;; | ||
| 701 | JZ MATCH_ALL ;; | ||
| 702 | JMP MATCH_LOOP ;; | ||
| 703 | ;; | ||
| 704 | MATCH_ALL : ;; | ||
| 705 | MOV cs:stage,SCANX ;; | ||
| 706 | ;; | ||
| 707 | MATCH_DONE : ;; | ||
| 708 | POP BX ;; | ||
| 709 | JMP FTB_LOOP ;; | ||
| 710 | ;; | ||
| 711 | ;=========================================================================== | ||
| 712 | SCAN_CASE : ;; | ||
| 713 | ;; ********************************** | ||
| 714 | ;; * determine whether it the font * | ||
| 715 | ;; * data(TARGET),or the next font * | ||
| 716 | ;; * header(NEXT) that is approaching | ||
| 717 | ;; ********************************** | ||
| 718 | ;; | ||
| 719 | MOV AX,cs:next_low ;; | ||
| 720 | MOV cs:hit_lo,AX ;; | ||
| 721 | MOV AX,cs:next_high ;; | ||
| 722 | MOV cs:hit_hi,AX ;; | ||
| 723 | XOR AX,AX ;; | ||
| 724 | MOV cs:hit_flag,AX ;; | ||
| 725 | ;; | ||
| 726 | MOV DI,cs:hit_hi ;; normalised HIT_HI, HIT_LO | ||
| 727 | MOV AX,DI ;; | ||
| 728 | AND AX,00FFFH ;; | ||
| 729 | PUSH CX ;; | ||
| 730 | MOV CX,4 ;; | ||
| 731 | SHL AX,CL ;; | ||
| 732 | POP CX ;; | ||
| 733 | AND DI,0F000H ;; | ||
| 734 | ADD AX,cs:hit_lo ;; | ||
| 735 | JNC NO_CARRY2 ;; | ||
| 736 | ADD DI,01000H ;; | ||
| 737 | NO_CARRY2 : ;; | ||
| 738 | MOV cs:hit_lo,AX ;; | ||
| 739 | MOV cs:hit_hi,DI ;; | ||
| 740 | ;; | ||
| 741 | MOV DX,cs:num_ftb ;; | ||
| 742 | ;; | ||
| 743 | PUSH BX ;; | ||
| 744 | SCAN_LOOP : ;; | ||
| 745 | MOV AX,FTP.FTB_STATUS ;; | ||
| 746 | CMP AX,FSTAT_MATCH ;; | ||
| 747 | JNE SCAN_NEXT ;; | ||
| 748 | ;; | ||
| 749 | ;; | ||
| 750 | MOV DI,FTP.TARGET_HI ;; NORMALISED TARGET | ||
| 751 | MOV AX,DI ;; | ||
| 752 | AND AX,00FFFH ;; | ||
| 753 | PUSH CX ;; | ||
| 754 | MOV CX,4 ;; | ||
| 755 | SHL AX,CL ;; | ||
| 756 | POP CX ;; | ||
| 757 | AND DI,0F000H ;; | ||
| 758 | ADD AX,FTP.TARGET_LO ;; | ||
| 759 | JNC NO_CARRY1 ;; | ||
| 760 | ADD DI,01000H ;; | ||
| 761 | NO_CARRY1 : ;; DI:AX = NORMALISED TARGET | ||
| 762 | ;; | ||
| 763 | ;; ** compare the TARGET and the NEXT | ||
| 764 | ;; | ||
| 765 | CMP DI,cs:hit_hi ;; | ||
| 766 | JA SCAN_NEXT ;; | ||
| 767 | ;; | ||
| 768 | JE SCAN_EQU ;; | ||
| 769 | JMP NEAR_FONT ;; | ||
| 770 | ;; | ||
| 771 | SCAN_EQU : ;; | ||
| 772 | CMP AX,cs:hit_lo ;; | ||
| 773 | JA SCAN_NEXT ;; | ||
| 774 | JE SCAN_ERROR_CHK ;; | ||
| 775 | ;; ********************************** | ||
| 776 | ;; * the font data is approaching * | ||
| 777 | ;; ********************************** | ||
| 778 | NEAR_FONT : ;; | ||
| 779 | MOV cs:hit_flag,-1 ;; | ||
| 780 | MOV cs:hit_lo,AX ;; | ||
| 781 | MOV cs:hit_hi,DI ;; | ||
| 782 | MOV cs:hit_bx,BX ;; used for BAD_BX and in FOUND_CASE | ||
| 783 | JMP SCAN_NEXT ;; | ||
| 784 | ;; | ||
| 785 | ;; ********************************** | ||
| 786 | ;; * the NEXT header is approaching * | ||
| 787 | ;; ********************************** | ||
| 788 | SCAN_ERROR_CHK : ;; | ||
| 789 | MOV AX,cs:hit_flag ;; | ||
| 790 | AND AX,AX ;; | ||
| 791 | JNZ SCAN_NEXT ;; | ||
| 792 | MOV FTP.FTB_STATUS,STAT_BADATA ;; next header and font cannot be the | ||
| 793 | ;; same | ||
| 794 | ;; | ||
| 795 | SCAN_NEXT : ;; | ||
| 796 | DEC DX ;; | ||
| 797 | AND DX,DX ;; | ||
| 798 | JZ SCAN_DONE ;; | ||
| 799 | ;; | ||
| 800 | ADD BX,FTP.FTB_LENGTH ;; | ||
| 801 | JMP SCAN_LOOP ;; ** is there any closer font data ? | ||
| 802 | ;; | ||
| 803 | ;; ************************************ | ||
| 804 | ;; * the HIT is either font data(TARGET | ||
| 805 | ;; * or the font block (NEXT). * | ||
| 806 | ;; ************************************ | ||
| 807 | SCAN_DONE : ;; | ||
| 808 | POP BX ;; | ||
| 809 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 810 | MOV DX,cs:hit_hi ;; HIT_FLAG, HIT_LO, HIT_HI defined | ||
| 811 | MOV AX,cs:hit_lo ;; | ||
| 812 | ;; | ||
| 813 | CMP AX,0FFFFH ;; | ||
| 814 | JNE NOT_FFFF_HIT ;; | ||
| 815 | CMP DX,0FFFFH ;; | ||
| 816 | JNE NOT_FFFF_HIT ;; | ||
| 817 | JMP SCAN_MORE ;; stage remained as SCAN, discard data | ||
| 818 | ;; | ||
| 819 | NOT_FFFF_HIT : ;; | ||
| 820 | ;; DX:AX = HIT_HI:HIT_LO (normalised) | ||
| 821 | SUB AX,cs:count_lo ;; | ||
| 822 | JNC NO_BORROW ;; | ||
| 823 | SUB DX,01000H ;; | ||
| 824 | JC SCAN_BAD ;; | ||
| 825 | NO_BORROW: ;; | ||
| 826 | SUB DX,cs:count_hi ;; | ||
| 827 | JC SCAN_BAD ;; | ||
| 828 | ;; | ||
| 829 | INC AX ;; COUNT can be at the HIT, then AX=0 | ||
| 830 | JNC NO_CARRYX ;; INC AX to make AX comparable to CX | ||
| 831 | ADD DX,01000H ;; i.e. AX = offset + 1 | ||
| 832 | ;; | ||
| 833 | NO_CARRYX : ;; | ||
| 834 | CMP AX,CX ;; | ||
| 835 | JA SCAN_MORE ;; | ||
| 836 | ;; | ||
| 837 | PUSH DX ;; | ||
| 838 | AND DX,00FFFH ;; | ||
| 839 | PUSH CX ;; | ||
| 840 | MOV CX,4 ;; | ||
| 841 | SHL DX,CL ;; | ||
| 842 | POP CX ;; | ||
| 843 | ADD AX,DX ;; | ||
| 844 | POP DX ;; | ||
| 845 | JNC NO_CARRY3 ;; | ||
| 846 | ADD DX,01000H ;; | ||
| 847 | NO_CARRY3 : ;; | ||
| 848 | AND DX,0F000H ;; | ||
| 849 | ;; | ||
| 850 | ;; | ||
| 851 | PUSH AX ;; | ||
| 852 | PUSH DX ;; | ||
| 853 | SUB AX,CX ;; | ||
| 854 | JNC NO_BORROW1 ;; | ||
| 855 | SUB DX,1000H ;; | ||
| 856 | JC MORE_CXp ;; | ||
| 857 | NO_BORROW1 : ;; | ||
| 858 | ;; dx:ax >= cx | ||
| 859 | AND AX,AX ;; | ||
| 860 | JNE SCAN_MOREP ;; | ||
| 861 | AND DX,DX ;; | ||
| 862 | JNE SCAN_MOREP ;; | ||
| 863 | ;; | ||
| 864 | ;; offset + 1 = CX | ||
| 865 | ;; | ||
| 866 | MORE_CXP : ;; | ||
| 867 | POP DX ;; | ||
| 868 | POP AX ;; | ||
| 869 | ;; | ||
| 870 | MORE_CX : ;; DX = 0,to have more CX than offset+1 | ||
| 871 | DEC AX ;; = offset : 0 and above | ||
| 872 | SUB CX,AX ;; | ||
| 873 | ADD SI,AX ;; where the first byte is | ||
| 874 | MOV AX,cs:hit_flag ;; | ||
| 875 | AND AX,AX ;; | ||
| 876 | JE NEXT_REACHED ;; | ||
| 877 | ;; | ||
| 878 | MOV cs:stage,MOD_LOBX ;; font-data reached, | ||
| 879 | ;; | ||
| 880 | JMP FTB_LOOP ;; ****** RETURN ******* | ||
| 881 | ;; | ||
| 882 | NEXT_REACHED : ;; | ||
| 883 | MOV cs:stage,PASSX ;; | ||
| 884 | MOV cs:pass_postx,next_lolX ;; | ||
| 885 | MOV cs:pass_cnt,FILE_OFFSET ;; | ||
| 886 | ;; | ||
| 887 | ;; | ||
| 888 | JMP FTB_LOOP ;; ****** RETURN ******* | ||
| 889 | ;; | ||
| 890 | ;; *********************************** | ||
| 891 | SCAN_MOREP : ;; * scan more FTBLK for the nearest * | ||
| 892 | ;; * font data * | ||
| 893 | ;; *********************************** | ||
| 894 | POP DX ;; | ||
| 895 | POP AX ;; | ||
| 896 | ;; | ||
| 897 | SCAN_MORE : ;; | ||
| 898 | ADD SI,CX ;; | ||
| 899 | SUB CX,CX ;; | ||
| 900 | JMP FTB_LOOP ;; more SCAN stage | ||
| 901 | ;; | ||
| 902 | SCAN_BAD: ;; ************************* | ||
| 903 | MOV AX,cs:hit_flag ;; * scan is bad * | ||
| 904 | AND AX,AX ;; ************************* | ||
| 905 | JNZ BAD_BX ;; | ||
| 906 | MOV AX,-1 ;; NEXT is pointing backwards | ||
| 907 | MOV cs:next_low,AX ;; | ||
| 908 | MOV cs:next_high,AX ;; no more NEXT | ||
| 909 | MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK | ||
| 910 | JMP FTB_LOOP ;; | ||
| 911 | ;; | ||
| 912 | BAD_BX : ;; | ||
| 913 | PUSH BX ;; FONT is pointing backwards | ||
| 914 | MOV BX,cs:hit_bx ;; | ||
| 915 | MOV FTP.FTB_STATUS,STAT_BADATA | ||
| 916 | POP BX ;; | ||
| 917 | JMP FTB_LOOP ;; | ||
| 918 | ;; | ||
| 919 | ;=========================================================================== | ||
| 920 | PRE_FOUND_CASE : ;; | ||
| 921 | ;; extract informations from the font | ||
| 922 | ;; block until font_length is defined | ||
| 923 | ;; | ||
| 924 | MOV DI,cs:stage ;; | ||
| 925 | ;; | ||
| 926 | ADD DI,DI ;; double to index to WORD-offset | ||
| 927 | ;; | ||
| 928 | JMP CS:STAGE_CASES[DI] ;; call routine to process the stage | ||
| 929 | ;; | ||
| 930 | ;=========================================================================== | ||
| 931 | FOUND_CASE : ;; | ||
| 932 | MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to | ||
| 933 | PUSH DI ;; | ||
| 934 | ;=========================================================================== | ||
| 935 | FOUND_DO : ;; | ||
| 936 | ;; define informations into FTBLK of | ||
| 937 | ;; HIT_BX defined in the SCAN case | ||
| 938 | PUSH BX ;; | ||
| 939 | MOV BX,cs:hit_bx ;; | ||
| 940 | ;; FTBLK : | ||
| 941 | MOV AX,cs:mod_word ;; | ||
| 942 | MOV FTP.FTB_MOD,AX ;; | ||
| 943 | MOV AX,cs:fonts_word ;; | ||
| 944 | MOV FTP.FTB_FONTS,AX ;; | ||
| 945 | ;; | ||
| 946 | MOV AX,cs:fdlen_word ;; | ||
| 947 | MOV FTP.FTB_DLEFT,AX ;; | ||
| 948 | MOV FTP.FTB_DLEN,0 ;; | ||
| 949 | MOV FTP.FTB_DALO,0 ;; | ||
| 950 | MOV FTP.FTB_DAHI,0 ;; | ||
| 951 | ;; | ||
| 952 | MOV FTP.FTB_STATUS,FSTAT_FOUND | ||
| 953 | ;; | ||
| 954 | CMP FTP.FTB_TYPE,TYPE_DISPLAY; | ||
| 955 | JNE CHECK_PTR_TYPE ;; | ||
| 956 | CMP cs:pre_font_len,PRE_FONT_D ;; | ||
| 957 | JNE DISPLAY_BAD ;; | ||
| 958 | JMP DISPLAY_DONE ;; | ||
| 959 | ;; | ||
| 960 | CHECK_PTR_TYPE : ;; | ||
| 961 | CMP FTP.FTB_TYPE,TYPE_PRINTER; | ||
| 962 | JNE SET_STAGE ;; | ||
| 963 | CMP cs:ptr_sel_word,0 ;; | ||
| 964 | JNE PRINTER_HAS_SEL ;; | ||
| 965 | CMP cs:pre_font_len,PRE_FONT_P0;; | ||
| 966 | JNE PRINTER_BAD ;; | ||
| 967 | JMP PRINTER_DONE ;; | ||
| 968 | ;; | ||
| 969 | PRINTER_HAS_SEL : ;; | ||
| 970 | CMP cs:pre_font_len,PRE_FONT_P ;; | ||
| 971 | JNE PRINTER_BAD ;; | ||
| 972 | JMP PRINTER_DONE ;; | ||
| 973 | ;; | ||
| 974 | DISPLAY_BAD : ;; | ||
| 975 | ;; | ||
| 976 | MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. | ||
| 977 | ;; | ||
| 978 | DISPLAY_DONE : ;; | ||
| 979 | MOV AL,cs:disp_rows ;; | ||
| 980 | MOV FTP.FTB_ROWS,AL ;; | ||
| 981 | MOV AL,cs:disp_cols ;; | ||
| 982 | MOV FTP.FTB_COLS,AL ;; | ||
| 983 | MOV AL,cs:disp_x ;; | ||
| 984 | MOV FTP.FTB_X,AL ;; | ||
| 985 | MOV AL,cs:disp_y ;; | ||
| 986 | MOV FTP.FTB_Y,AL ;; | ||
| 987 | MOV AX,cs:count_word ;; | ||
| 988 | MOV FTP.FTB_COUNT,AX ;; | ||
| 989 | JMP SET_STAGE ;; | ||
| 990 | ;; | ||
| 991 | PRINTER_BAD : ;; | ||
| 992 | ;; | ||
| 993 | MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. | ||
| 994 | ;; | ||
| 995 | PRINTER_DONE : ;; | ||
| 996 | MOV AX,cs:ptr_sel_word ;; | ||
| 997 | MOV FTP.FTB_SELECT,AX ;; | ||
| 998 | MOV AX,cs:ptr_len_word ;; | ||
| 999 | MOV FTP.FTB_SELLEN,AX ;; | ||
| 1000 | ;; | ||
| 1001 | SET_STAGE : ;; STAGE : | ||
| 1002 | MOV AX,cs:fdlen_word ;; if no font data to follow | ||
| 1003 | AND AX,AX ;; | ||
| 1004 | JNZ GET_FDATA ;; | ||
| 1005 | MOV cs:stage,SCANX ;; then scan for next header or font | ||
| 1006 | JMP FONT_RET ;; | ||
| 1007 | ;; | ||
| 1008 | GET_FDATA : ;; update the moving target | ||
| 1009 | MOV cs:stage,GET_FX ;; | ||
| 1010 | MOV AX,cs:pre_font_len ;; | ||
| 1011 | ADD FTP.TARGET_LO,AX ;; | ||
| 1012 | JNC FONT_RET ;; | ||
| 1013 | ADD FTP.TARGET_HI,01000H ;; | ||
| 1014 | ;; | ||
| 1015 | FONT_RET : ;; | ||
| 1016 | POP BX ;; | ||
| 1017 | RET ;; | ||
| 1018 | ;; | ||
| 1019 | ;=========================================================================== | ||
| 1020 | GETFONT_CASE : ;; as ES:[SI], at COUNT, there is font | ||
| 1021 | ;; data | ||
| 1022 | MOV DX,cs:num_ftb ;; | ||
| 1023 | PUSH BX ;; | ||
| 1024 | ;; | ||
| 1025 | MOV cs:hit_hi,0 ;; temp. register | ||
| 1026 | MOV cs:hit_flag,0 ;; assumed can be changed to SCAN stage | ||
| 1027 | ;; | ||
| 1028 | MOV DI,cs:count_hi ;; normalised COUNT_HI,COUNT_LO | ||
| 1029 | MOV AX,DI ;; | ||
| 1030 | AND AX,00FFFH ;; | ||
| 1031 | PUSH CX ;; | ||
| 1032 | MOV CX,4 ;; | ||
| 1033 | SHL AX,CL ;; | ||
| 1034 | POP CX ;; | ||
| 1035 | AND DI,0F000H ;; | ||
| 1036 | ADD AX,cs:count_lo ;; | ||
| 1037 | JNC NO_CARRY4 ;; | ||
| 1038 | ADD DI,01000H ;; | ||
| 1039 | NO_CARRY4 : ;; | ||
| 1040 | MOV cs:count_lo,AX ;; | ||
| 1041 | MOV cs:count_hi,DI ;; | ||
| 1042 | ;; | ||
| 1043 | ;; | ||
| 1044 | GETFONT_LOOP : ;; | ||
| 1045 | MOV AX,FTP.FTB_STATUS ;; | ||
| 1046 | CMP AX,FSTAT_FONT ;; | ||
| 1047 | JE GETFONT_CONT ;; | ||
| 1048 | ;; | ||
| 1049 | CMP AX,FSTAT_FOUND ;; | ||
| 1050 | JE GETFONT_FOUND ;; | ||
| 1051 | ;; | ||
| 1052 | JMP NEXT_GETFONT ;; | ||
| 1053 | ;; | ||
| 1054 | GETFONT_FOUND : ;; | ||
| 1055 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 1056 | AND AX,AX ;; | ||
| 1057 | JZ NEXT_GF ;; | ||
| 1058 | MOV FTP.FTB_STATUS,FSTAT_FONT; | ||
| 1059 | JMP GETFONT_CONT1 ;; | ||
| 1060 | ;; | ||
| 1061 | ;; | ||
| 1062 | GETFONT_CONT : ;; | ||
| 1063 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 1064 | AND AX,AX ;; | ||
| 1065 | JNZ GETFONT_CONT1 ;; | ||
| 1066 | NEXT_GF : ;; | ||
| 1067 | JMP NEXT_GETFONT ;; | ||
| 1068 | ;; only on FOUND and DLEFT <> 0 | ||
| 1069 | GETFONT_CONT1: ;; | ||
| 1070 | MOV DI,FTP.TARGET_HI ;; normalised TARGET | ||
| 1071 | MOV AX,DI ;; | ||
| 1072 | AND AX,00FFFH ;; | ||
| 1073 | PUSH CX ;; | ||
| 1074 | MOV CX,4 ;; | ||
| 1075 | SHL AX,CL ;; | ||
| 1076 | POP CX ;; | ||
| 1077 | AND DI,0F000H ;; | ||
| 1078 | ADD AX,FTP.TARGET_LO ;; | ||
| 1079 | JNC NO_CARRY5 ;; | ||
| 1080 | ADD DI,01000H ;; | ||
| 1081 | NO_CARRY5 : ;; DI:AX = TARGET (normalised) | ||
| 1082 | ;; | ||
| 1083 | CMP DI,cs:count_hi ;; | ||
| 1084 | JB GETFONT_BAD ;; | ||
| 1085 | JNE NEXT_GETFONT ;; | ||
| 1086 | CMP AX,cs:count_lo ;; | ||
| 1087 | JB GETFONT_BAD ;; | ||
| 1088 | JNE NEXT_GETFONT ;; | ||
| 1089 | ;; | ||
| 1090 | MOV FTP.FTB_DALO,SI ;; where the font data is in the packet | ||
| 1091 | MOV FTP.FTB_DAHI,DS ;; | ||
| 1092 | ;; | ||
| 1093 | MOV AX,FTP.FTB_DLEFT ;; | ||
| 1094 | CMP AX,CX ;; | ||
| 1095 | JAE UPTO_CX ;; | ||
| 1096 | ;; upto FDLEFT | ||
| 1097 | MOV FTP.FTB_DLEFT,0 ;; | ||
| 1098 | MOV FTP.FTB_DLEN,AX ;; | ||
| 1099 | CMP cs:hit_hi,AX ;; | ||
| 1100 | JNB NOT_HIGHER0 ;; | ||
| 1101 | MOV cs:hit_hi,AX ;; | ||
| 1102 | NOT_HIGHER0 : ;; | ||
| 1103 | ADD FTP.TARGET_LO,AX ;; | ||
| 1104 | JNC NEXT_GETFONT ;; | ||
| 1105 | ADD FTP.TARGET_HI,01000H ;; | ||
| 1106 | JMP NEXT_GETFONT ;; | ||
| 1107 | ;; | ||
| 1108 | GETFONT_BAD : ;; | ||
| 1109 | MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards | ||
| 1110 | JMP NEXT_GETFONT ;; | ||
| 1111 | ;; | ||
| 1112 | UPTO_CX : ;; | ||
| 1113 | SUB AX,CX ;; | ||
| 1114 | MOV FTP.FTB_DLEFT,AX ;; | ||
| 1115 | MOV FTP.FTB_DLEN,CX ;; | ||
| 1116 | MOV cs:hit_hi,CX ;; | ||
| 1117 | ADD FTP.TARGET_LO,CX ;; | ||
| 1118 | JNC NO_CARRYOVER ;; | ||
| 1119 | ADD FTP.TARGET_HI,01000H ;; | ||
| 1120 | NO_CARRYOVER : ;; | ||
| 1121 | AND AX,AX ;; all data have been returned ? | ||
| 1122 | JZ NEXT_GETFONT ;; | ||
| 1123 | ;; | ||
| 1124 | MOV cs:hit_flag,-1 ;; no ! stay in the GET_FONT stage | ||
| 1125 | ;; | ||
| 1126 | NEXT_GETFONT : ;; | ||
| 1127 | ADD BX,FTP.FTB_LENGTH ;; | ||
| 1128 | DEC DX ;; | ||
| 1129 | AND DX,DX ;; | ||
| 1130 | JZ GETFONT_END ;; | ||
| 1131 | JMP GETFONT_LOOP ;; | ||
| 1132 | ;; | ||
| 1133 | GETFONT_END : ;; | ||
| 1134 | MOV AX,cs:hit_hi ;; | ||
| 1135 | ADD SI,AX ;; | ||
| 1136 | SUB CX,AX ;; | ||
| 1137 | ;; | ||
| 1138 | CMP cs:hit_flag,0 ;; | ||
| 1139 | Jne GETFONT_DONE ;; | ||
| 1140 | MOV cs:stage,SCANX ;; no more in the GET_FONT stage | ||
| 1141 | ;; | ||
| 1142 | ;; | ||
| 1143 | GETFONT_DONE : ;; | ||
| 1144 | POP BX ;; | ||
| 1145 | JMP FTB_LOOP ;; | ||
| 1146 | ;; | ||
| 1147 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1148 | ;; | ||
| 1149 | ;; STAGES -- "called by" SERACH_CASE | ||
| 1150 | ;; | ||
| 1151 | ;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer | ||
| 1152 | ;; -- CX remaining packet length | ||
| 1153 | ;; -- ES:[BX] points to the first FTBLK | ||
| 1154 | ;; -- COUNT_LO, COUNT_HI, upto but not including the address pointed by FPKT | ||
| 1155 | ;; | ||
| 1156 | ;; | ||
| 1157 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1158 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1159 | filetag : ;; | ||
| 1160 | ;; | ||
| 1161 | ; mov ax,ftag_len ;; | ||
| 1162 | cmp cs:ftag_count,ftag_len ;; | ||
| 1163 | jB valid_ftag ;; | ||
| 1164 | JE FTAG_FAILED ;; | ||
| 1165 | ;; | ||
| 1166 | mov ftp.ftb_status,stat_deverr | ||
| 1167 | mov cs:fp_error,00022H ;; ERROR 0022H | ||
| 1168 | ;; | ||
| 1169 | FTAG_FAILED : ;; discard all the bytes, while | ||
| 1170 | ADD SI,CX ;; stage stays as FTAGX | ||
| 1171 | SUB CX,CX ;; | ||
| 1172 | JMP FTB_LOOP ;; **** RETURN (bytes discarded) **** | ||
| 1173 | ;; | ||
| 1174 | VALID_FTAG : ;; | ||
| 1175 | MOV AX,FPKT ;; | ||
| 1176 | INC SI ;; | ||
| 1177 | DEC CX ;; | ||
| 1178 | ;; | ||
| 1179 | MOV DI,cs:ftag_count ;; | ||
| 1180 | CMP AL,cs:ftag_pattern[DI] ;; | ||
| 1181 | JE FTAG_NEXTB ;; | ||
| 1182 | ;; | ||
| 1183 | mov ftp.ftb_status,stat_badata | ||
| 1184 | MOV ax,ftag_len ;; stays in FTAGX to consume all bytes | ||
| 1185 | MOV cs:ftag_count,ax ;; stays in FTAGX to consume all bytes | ||
| 1186 | JMP FTB_LOOP ;; **** RETURN (FAILED !) **** | ||
| 1187 | ;; | ||
| 1188 | FTAG_NEXTB : ;; | ||
| 1189 | INC DI ;; | ||
| 1190 | MOV cs:ftag_count,DI ;; | ||
| 1191 | ;; | ||
| 1192 | CMP DI,ftag_len ;; | ||
| 1193 | JE FTAG_DONE ;; | ||
| 1194 | ;; | ||
| 1195 | JMP FTB_LOOP ;; **** RETURN ( MORE TO COME) **** | ||
| 1196 | ;; | ||
| 1197 | FTAG_DONE : ;; | ||
| 1198 | MOV cs:pass_cnt,0 ;; | ||
| 1199 | MOV cs:stage,PASSX ;; | ||
| 1200 | MOV cs:pass_postx,fptr_lolx ;; | ||
| 1201 | ;; | ||
| 1202 | JMP FTB_LOOP ;; **** NEXT STAGE **** | ||
| 1203 | ;; | ||
| 1204 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1205 | fptrLOL : ;; STAGE the low byte of the low fptr | ||
| 1206 | MOV AX,FPKT ;; | ||
| 1207 | INC SI ;; byte by byte | ||
| 1208 | DEC CX ;; | ||
| 1209 | AND CX,CX ;; | ||
| 1210 | JNZ WORD_fptrLO ;; | ||
| 1211 | MOV cs:fptr_lol,AL ;; | ||
| 1212 | MOV cs:stage,fptr_lohX ;; | ||
| 1213 | JMP FTB_LOOP ;; | ||
| 1214 | WORD_fptrLO : ;; | ||
| 1215 | INC SI ;; | ||
| 1216 | DEC CX ;; | ||
| 1217 | MOV cs:fptr_low,AX ;; | ||
| 1218 | MOV cs:stage,fptr_HILX ;; | ||
| 1219 | JMP FTB_LOOP ;; | ||
| 1220 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1221 | fptrLOH : ;; STAGE the high byte of the low fptr | ||
| 1222 | MOV AX,FPKT ;; | ||
| 1223 | INC SI ;; byte by byte | ||
| 1224 | DEC CX ;; | ||
| 1225 | MOV cs:fptr_loh,AL ;; | ||
| 1226 | MOV cs:stage,fptr_HILX ;; | ||
| 1227 | JMP FTB_LOOP ;; | ||
| 1228 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1229 | fptrHIL : ;; STAGE the low byte of the high fptr | ||
| 1230 | MOV AX,FPKT ;; | ||
| 1231 | INC SI ;; byte by byte | ||
| 1232 | DEC CX ;; | ||
| 1233 | AND CX,CX ;; | ||
| 1234 | JNZ WORD_fptrHI ;; | ||
| 1235 | MOV cs:fptr_hil,AL ;; | ||
| 1236 | MOV cs:stage,fptr_hihX ;; | ||
| 1237 | JMP FTB_LOOP ;; | ||
| 1238 | WORD_fptrHI : ;; | ||
| 1239 | INC SI ;; | ||
| 1240 | DEC CX ;; | ||
| 1241 | MOV cs:fptr_high,AX ;; | ||
| 1242 | MOV cs:stage,FPTR_SKIPX ;; | ||
| 1243 | JMP FTB_LOOP ;; | ||
| 1244 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1245 | fptrHIH : ;; STAGE the high byte of the high fptr | ||
| 1246 | MOV AX,FPKT ;; | ||
| 1247 | INC SI ;; byte by byte | ||
| 1248 | DEC CX ;; | ||
| 1249 | MOV cs:fptr_hih,AL ;; | ||
| 1250 | MOV cs:stage,FPTR_SKIPX ;; | ||
| 1251 | JMP FTB_LOOP ;; | ||
| 1252 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1253 | ENTRYLO : ;; STAGE - ENTRY LOW BYTE | ||
| 1254 | MOV AX,FPKT ;; | ||
| 1255 | INC SI ;; byte by byte | ||
| 1256 | DEC CX ;; | ||
| 1257 | AND CX,CX ;; | ||
| 1258 | JNZ WORD_ENTRY ;; | ||
| 1259 | MOV cs:entry_lob,AL ;; | ||
| 1260 | MOV cs:stage,ENTRY_HIX ;; | ||
| 1261 | JMP FTB_LOOP ;; | ||
| 1262 | WORD_ENTRY : ;; | ||
| 1263 | INC SI ;; | ||
| 1264 | DEC CX ;; | ||
| 1265 | MOV cs:entry_word,AX ;; | ||
| 1266 | MOV cs:stage,PASSX ;; 2 bytes to be passed | ||
| 1267 | MOV cs:pass_postx,NEXT_LOLX ;; | ||
| 1268 | JMP FTB_LOOP ;; | ||
| 1269 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1270 | ENTRYHI : ;; stage - ENTRY HIGN BYTE | ||
| 1271 | MOV AX,FPKT ;; | ||
| 1272 | INC SI ;; byte by byte | ||
| 1273 | DEC CX ;; | ||
| 1274 | MOV cs:entry_hib,AL ;; | ||
| 1275 | MOV cs:stage,PASSX ;; 2 bytes to be passed | ||
| 1276 | MOV cs:pass_postx,NEXT_LOLX ;; | ||
| 1277 | AND CX,CX ;; | ||
| 1278 | JNZ ENTHI_PASS1 ;; | ||
| 1279 | JMP FTB_LOOP ;; | ||
| 1280 | ENTHI_PASS1 : ;; | ||
| 1281 | INC SI ;; | ||
| 1282 | INC cs:pass_cnt ;; | ||
| 1283 | DEC CX ;; | ||
| 1284 | AND CX,CX ;; | ||
| 1285 | JNZ ENTHI_PASS2 ;; | ||
| 1286 | JMP FTB_LOOP ;; | ||
| 1287 | ENTHI_PASS2 : ;; | ||
| 1288 | INC SI ;; | ||
| 1289 | INC cs:pass_cnt ;; | ||
| 1290 | DEC CX ;; | ||
| 1291 | MOV cs:stage,NEXT_LOLX ;; | ||
| 1292 | JMP FTB_LOOP ;; | ||
| 1293 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1294 | NEXTLOL : ;; STAGE the low byte of the low NEXT | ||
| 1295 | MOV AX,FPKT ;; | ||
| 1296 | INC SI ;; byte by byte | ||
| 1297 | DEC CX ;; | ||
| 1298 | AND CX,CX ;; | ||
| 1299 | JNZ WORD_NEXTLO ;; | ||
| 1300 | MOV cs:next_lol,AL ;; | ||
| 1301 | MOV cs:stage,NEXT_LOHX ;; | ||
| 1302 | JMP FTB_LOOP ;; | ||
| 1303 | WORD_NEXTLO : ;; | ||
| 1304 | INC SI ;; | ||
| 1305 | DEC CX ;; | ||
| 1306 | MOV cs:next_low,AX ;; | ||
| 1307 | MOV cs:stage,next_hilX ;; | ||
| 1308 | JMP FTB_LOOP ;; | ||
| 1309 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1310 | NEXTLOH : ;; STAGE the high byte of the low NEXT | ||
| 1311 | MOV AX,FPKT ;; | ||
| 1312 | INC SI ;; byte by byte | ||
| 1313 | DEC CX ;; | ||
| 1314 | MOV cs:next_loh,AL ;; | ||
| 1315 | MOV cs:stage,next_hilX ;; | ||
| 1316 | JMP FTB_LOOP ;; | ||
| 1317 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1318 | NEXTHIL : ;; STAGE the low byte of the high NEXT | ||
| 1319 | MOV AX,FPKT ;; | ||
| 1320 | INC SI ;; byte by byte | ||
| 1321 | DEC CX ;; | ||
| 1322 | AND CX,CX ;; | ||
| 1323 | JNZ WORD_NEXTHI ;; | ||
| 1324 | MOV cs:next_hil,AL ;; | ||
| 1325 | MOV cs:stage,NEXT_HIHX ;; | ||
| 1326 | JMP FTB_LOOP ;; | ||
| 1327 | WORD_NEXTHI : ;; | ||
| 1328 | INC SI ;; | ||
| 1329 | DEC CX ;; | ||
| 1330 | MOV cs:next_high,AX ;; | ||
| 1331 | MOV cs:stage,type_lobX ;; | ||
| 1332 | JMP FTB_LOOP ;; | ||
| 1333 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1334 | NEXTHIH : ;; STAGE the high byte of the high NEXT | ||
| 1335 | MOV AX,FPKT ;; | ||
| 1336 | INC SI ;; byte by byte | ||
| 1337 | DEC CX ;; | ||
| 1338 | MOV cs:next_hih,AL ;; | ||
| 1339 | MOV cs:stage,type_lobX ;; | ||
| 1340 | JMP FTB_LOOP ;; | ||
| 1341 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1342 | TYPELO : ;; STAGE the low byte of the TYPE | ||
| 1343 | MOV AX,FPKT ;; | ||
| 1344 | INC SI ;; byte by byte | ||
| 1345 | DEC CX ;; | ||
| 1346 | AND CX,CX ;; | ||
| 1347 | JNZ WORD_TYPE ;; | ||
| 1348 | MOV cs:type_lob,AL ;; | ||
| 1349 | MOV cs:stage,type_hibX ;; | ||
| 1350 | JMP FTB_LOOP ;; | ||
| 1351 | WORD_TYPE : ;; | ||
| 1352 | INC SI ;; | ||
| 1353 | DEC CX ;; | ||
| 1354 | MOV cs:type_word,AX ;; | ||
| 1355 | MOV cs:stage,type_idX ;; | ||
| 1356 | MOV cs:tid_cnt,0 ;; | ||
| 1357 | JMP FTB_LOOP ;; | ||
| 1358 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1359 | TYPEHI : ;; STAGE the high byte of the TYPE | ||
| 1360 | MOV AX,FPKT ;; | ||
| 1361 | INC SI ;; byte by byte | ||
| 1362 | DEC CX ;; | ||
| 1363 | MOV cs:type_hib,AL ;; | ||
| 1364 | MOV cs:stage,TYPE_IDX ;; | ||
| 1365 | MOV cs:tid_cnt,0 ;; | ||
| 1366 | JMP FTB_LOOP ;; | ||
| 1367 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1368 | TYPEIDS : ;; STAGE the type id | ||
| 1369 | CMP cs:tid_cnt,8 ;; | ||
| 1370 | JNA VALID_TID ;; | ||
| 1371 | MOV FTP.FTB_STATUS,STAT_DEVERR | ||
| 1372 | MOV cs:fp_error,00021H ;; ERROR 0021H | ||
| 1373 | ADD SI,CX ;; | ||
| 1374 | SUB CX,CX ;; | ||
| 1375 | JMP FTB_LOOP ;; | ||
| 1376 | ;; | ||
| 1377 | VALID_TID : ;; | ||
| 1378 | MOV AX,8 ;; | ||
| 1379 | SUB AX,cs:tid_cnt ;; | ||
| 1380 | CMP CX,AX ;; | ||
| 1381 | JNB TID_ALL ;; | ||
| 1382 | ;; all data in FPKT are stored | ||
| 1383 | PUSH ES ;; | ||
| 1384 | PUSH CS ;; | ||
| 1385 | POP ES ;; | ||
| 1386 | ;; | ||
| 1387 | MOV DI,OFFSET TYPE_ID ;; | ||
| 1388 | ADD DI,cs:tid_cnt ;; | ||
| 1389 | ADD cs:tid_cnt,CX ;; | ||
| 1390 | REP MOVSB ;; SI is incremented accordingly | ||
| 1391 | POP ES ;; | ||
| 1392 | ;; | ||
| 1393 | MOV CX,0 ;; STAGE remained | ||
| 1394 | JMP FTB_LOOP ;; | ||
| 1395 | TID_ALL : ;; | ||
| 1396 | PUSH CX ;; | ||
| 1397 | ;; | ||
| 1398 | PUSH ES ;; | ||
| 1399 | PUSH CS ;; | ||
| 1400 | POP ES ;; | ||
| 1401 | ;; | ||
| 1402 | MOV DI,OFFSET TYPE_ID ;; | ||
| 1403 | ADD DI,cs:tid_cnt ;; | ||
| 1404 | MOV CX,AX ;; | ||
| 1405 | REP MOVSB ;; SI is incremented accordingly | ||
| 1406 | POP ES ;; | ||
| 1407 | ;; | ||
| 1408 | ADD cs:tid_cnt,AX ;; | ||
| 1409 | POP CX ;; | ||
| 1410 | SUB CX,AX ;; | ||
| 1411 | ;; | ||
| 1412 | MOV cs:stage,CPG_LOBX ;; | ||
| 1413 | JMP FTB_LOOP ;; | ||
| 1414 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1415 | CPGLO : ;; STAGE the low byte of the CODE PAGE | ||
| 1416 | MOV AX,FPKT ;; | ||
| 1417 | INC SI ;; byte by byte | ||
| 1418 | DEC CX ;; | ||
| 1419 | AND CX,CX ;; | ||
| 1420 | JNZ WORD_CPG ;; | ||
| 1421 | MOV cs:cpg_lob,AL ;; | ||
| 1422 | MOV cs:stage,CPG_HIBX ;; | ||
| 1423 | JMP FTB_LOOP ;; | ||
| 1424 | WORD_CPG : ;; | ||
| 1425 | INC SI ;; | ||
| 1426 | DEC CX ;; | ||
| 1427 | MOV cs:cpg_word,AX ;; | ||
| 1428 | MOV cs:stage,PASSX ;; | ||
| 1429 | MOV cs:pass_postx,font_lolX ;; | ||
| 1430 | JMP FTB_LOOP ;; | ||
| 1431 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1432 | CPGHI : ;; STAGE the high byte of the CODE PAGE | ||
| 1433 | MOV AX,FPKT ;; | ||
| 1434 | INC SI ;; byte by byte | ||
| 1435 | DEC CX ;; | ||
| 1436 | MOV cs:cpg_hib,AL ;; | ||
| 1437 | MOV cs:stage,PASSX ;; | ||
| 1438 | MOV cs:pass_postx,font_lolX ;; | ||
| 1439 | JMP FTB_LOOP ;; | ||
| 1440 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1441 | FONTLOL : ;; STAGE the low byte of the low FONT | ||
| 1442 | MOV AX,FPKT ;; | ||
| 1443 | INC SI ;; byte by byte | ||
| 1444 | DEC CX ;; | ||
| 1445 | AND CX,CX ;; | ||
| 1446 | JNZ WORD_FONTLO ;; | ||
| 1447 | MOV cs:font_lol,AL ;; | ||
| 1448 | MOV cs:stage,FONT_LOHX ;; | ||
| 1449 | JMP FTB_LOOP ;; | ||
| 1450 | WORD_FONTLO : ;; | ||
| 1451 | INC SI ;; | ||
| 1452 | DEC CX ;; | ||
| 1453 | MOV cs:font_low,AX ;; | ||
| 1454 | MOV cs:stage,FONT_HILX ;; | ||
| 1455 | JMP FTB_LOOP ;; | ||
| 1456 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1457 | FONTLOH : ;; STAGE the high byte of the low FONT | ||
| 1458 | MOV AX,FPKT ;; | ||
| 1459 | INC SI ;; byte by byte | ||
| 1460 | DEC CX ;; | ||
| 1461 | MOV cs:font_loh,AL ;; | ||
| 1462 | MOV cs:stage,FONT_HILX ;; | ||
| 1463 | JMP FTB_LOOP ;; | ||
| 1464 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1465 | FONTHIL : ;; STAGE the low byte of the high FONT | ||
| 1466 | MOV AX,FPKT ;; | ||
| 1467 | INC SI ;; byte by byte | ||
| 1468 | DEC CX ;; | ||
| 1469 | AND CX,CX ;; | ||
| 1470 | JNZ WORD_FONTHI ;; | ||
| 1471 | MOV cs:font_hil,AL ;; | ||
| 1472 | MOV cs:stage,FONT_HIHX ;; | ||
| 1473 | JMP FTB_LOOP ;; | ||
| 1474 | WORD_FONTHI : ;; | ||
| 1475 | INC SI ;; | ||
| 1476 | DEC CX ;; | ||
| 1477 | MOV cs:font_high,AX ;; | ||
| 1478 | ;;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN | ||
| 1479 | ;; anymore headers to be processed ? | ||
| 1480 | MOV cs:stage,MATCHX ;; | ||
| 1481 | MOV AX,cs:entry_word ;; | ||
| 1482 | DEC AX ;; | ||
| 1483 | MOV cs:entry_word,AX ;; | ||
| 1484 | AND AX,AX ;; | ||
| 1485 | JNZ CHECK_NEXT ;; | ||
| 1486 | ;; no more header to be processed ! | ||
| 1487 | MOV AX,-1 ;; | ||
| 1488 | MOV cs:next_low,AX ;; | ||
| 1489 | MOV cs:next_high,AX ;; as ENTRY has been consumed | ||
| 1490 | JMP FTB_LOOP ;; | ||
| 1491 | ;; | ||
| 1492 | CHECK_NEXT : ;; | ||
| 1493 | MOV AX,cs:next_low ;; | ||
| 1494 | AND AX,AX ;; | ||
| 1495 | JNZ MORE_HEADER ;; | ||
| 1496 | MOV AX,cs:next_high ;; | ||
| 1497 | AND AX,AX ;; | ||
| 1498 | JNZ MORE_HEADER ;; | ||
| 1499 | ;; no more header to be processed ! | ||
| 1500 | MOV AX,-1 ;; | ||
| 1501 | MOV cs:next_low,AX ;; as NEXT is nil | ||
| 1502 | MOV cs:next_high,AX ;; | ||
| 1503 | ;; | ||
| 1504 | MORE_HEADER : ;; | ||
| 1505 | JMP FTB_LOOP ;; | ||
| 1506 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1507 | FONTHIH : ;; STAGE the high byte of the high FONT | ||
| 1508 | MOV AX,FPKT ;; | ||
| 1509 | INC SI ;; byte by byte | ||
| 1510 | DEC CX ;; | ||
| 1511 | MOV cs:font_hih,AL ;; | ||
| 1512 | ;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN | ||
| 1513 | ;; | ||
| 1514 | MOV cs:stage,MATCHX ;; | ||
| 1515 | ;; anymore headers to be processed ? | ||
| 1516 | MOV AX,cs:entry_word ;; | ||
| 1517 | DEC AX ;; | ||
| 1518 | MOV cs:entry_word,AX ;; | ||
| 1519 | AND AX,AX ;; | ||
| 1520 | JNZ CHECK_NEXT0 ;; | ||
| 1521 | ;; no more header to be processed ! | ||
| 1522 | MOV AX,-1 ;; | ||
| 1523 | MOV cs:next_low,AX ;; | ||
| 1524 | MOV cs:next_high,AX ;; as ENTRY has been consumed | ||
| 1525 | JMP FTB_LOOP ;; | ||
| 1526 | ;; | ||
| 1527 | CHECK_NEXT0 : ;; | ||
| 1528 | MOV AX,cs:next_low ;; | ||
| 1529 | AND AX,AX ;; | ||
| 1530 | JNZ MORE_HEADER0 ;; | ||
| 1531 | MOV AX,cs:next_high ;; | ||
| 1532 | AND AX,AX ;; | ||
| 1533 | JNZ MORE_HEADER0 ;; | ||
| 1534 | ;; no more header to be processed ! | ||
| 1535 | MOV AX,-1 ;; | ||
| 1536 | MOV cs:next_low,AX ;; as NEXT is nil | ||
| 1537 | MOV cs:next_high,AX ;; | ||
| 1538 | ;; | ||
| 1539 | MORE_HEADER0 : ;; | ||
| 1540 | JMP FTB_LOOP ;; | ||
| 1541 | ;; | ||
| 1542 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1543 | MODLO : ;; STAGE the low byte of the MODIFIER | ||
| 1544 | MOV AX,FPKT ;; | ||
| 1545 | INC SI ;; byte by byte | ||
| 1546 | DEC CX ;; | ||
| 1547 | AND CX,CX ;; | ||
| 1548 | JNZ WORD_MOD ;; | ||
| 1549 | MOV MOD_LOB,AL ;; | ||
| 1550 | MOV cs:stage,MOD_HIBX ;; | ||
| 1551 | JMP FTB_LOOP ;; | ||
| 1552 | WORD_MOD : ;; | ||
| 1553 | INC SI ;; | ||
| 1554 | DEC CX ;; | ||
| 1555 | MOV cs:mod_word,AX ;; | ||
| 1556 | MOV cs:stage,fonts_lobX ;; | ||
| 1557 | JMP FTB_LOOP ;; | ||
| 1558 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1559 | MODHI : ;; STAGE the high byte of the MODIFIER | ||
| 1560 | MOV AX,FPKT ;; | ||
| 1561 | INC SI ;; byte by byte | ||
| 1562 | DEC CX ;; | ||
| 1563 | MOV cs:mod_hib,AL ;; | ||
| 1564 | MOV cs:stage,FONTS_LOBX ;; | ||
| 1565 | JMP FTB_LOOP ;; | ||
| 1566 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1567 | FONTSLO : ;; STAGE the low byte of the FONTS | ||
| 1568 | MOV AX,FPKT ;; | ||
| 1569 | INC SI ;; byte by byte | ||
| 1570 | DEC CX ;; | ||
| 1571 | AND CX,CX ;; | ||
| 1572 | JNZ WORD_FONTS ;; | ||
| 1573 | MOV cs:fonts_lob,AL ;; | ||
| 1574 | MOV cs:stage,FONTS_HIBX ;; | ||
| 1575 | JMP FTB_LOOP ;; | ||
| 1576 | WORD_FONTS : ;; | ||
| 1577 | INC SI ;; | ||
| 1578 | DEC CX ;; | ||
| 1579 | MOV cs:fonts_word,AX ;; | ||
| 1580 | MOV cs:stage,FDLEN_LOBX ;; | ||
| 1581 | JMP FTB_LOOP ;; | ||
| 1582 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1583 | FONTSHI : ;; STAGE the high byte of the FONTS | ||
| 1584 | MOV AX,FPKT ;; | ||
| 1585 | INC SI ;; byte by byte | ||
| 1586 | DEC CX ;; | ||
| 1587 | MOV cs:fonts_hib,AL ;; | ||
| 1588 | MOV cs:stage,FDLEN_LOBX ;; | ||
| 1589 | JMP FTB_LOOP ;; | ||
| 1590 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1591 | FDLENLO : ;; the low byte of the FONT-LENGTH | ||
| 1592 | MOV AX,FPKT ;; | ||
| 1593 | INC SI ;; byte by byte | ||
| 1594 | DEC CX ;; | ||
| 1595 | AND CX,CX ;; | ||
| 1596 | JNZ WORD_FDLEN ;; | ||
| 1597 | MOV cs:fdlen_lob,AL ;; | ||
| 1598 | MOV cs:stage,FDLEN_HIBX ;; | ||
| 1599 | JMP FTB_LOOP ;; | ||
| 1600 | WORD_FDLEN : ;; | ||
| 1601 | INC SI ;; | ||
| 1602 | DEC CX ;; | ||
| 1603 | MOV cs:pre_font_len,PRE_FONT_ND;; | ||
| 1604 | MOV cs:fdlen_word,AX ;; | ||
| 1605 | AND AX,AX ;; | ||
| 1606 | JZ NO_DISP_PTR ;; | ||
| 1607 | CMP cs:type_word,TYPE_DISPLAY ;; | ||
| 1608 | JE DISPLAY_TYPE1 ;; | ||
| 1609 | CMP cs:type_word,TYPE_PRINTER ;; | ||
| 1610 | JE PRINTER_TYPE1 ;; | ||
| 1611 | ;; | ||
| 1612 | NO_DISP_PTR : ;; | ||
| 1613 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1614 | JMP FTB_LOOP ;; | ||
| 1615 | DISPLAY_TYPE1 : ;; | ||
| 1616 | MOV cs:stage,DISP_ROWSX ;; | ||
| 1617 | JMP FTB_LOOP ;; | ||
| 1618 | PRINTER_TYPE1 : ;; | ||
| 1619 | MOV cs:stage,PTRSELLOX ;; | ||
| 1620 | JMP FTB_LOOP ;; | ||
| 1621 | ;; | ||
| 1622 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1623 | FDLENHI : ;; STAGE the high byte of the F-LENGTH | ||
| 1624 | MOV cs:pre_font_len,PRE_FONT_ND | ||
| 1625 | MOV AX,FPKT ;; | ||
| 1626 | INC SI ;; byte by byte | ||
| 1627 | DEC CX ;; | ||
| 1628 | MOV cs:fdlen_hib,AL ;; | ||
| 1629 | MOV AX,cs:fdlen_word ;; | ||
| 1630 | AND AX,AX ;; | ||
| 1631 | JZ NO_DISP_PTR2 ;; | ||
| 1632 | CMP cs:type_word,TYPE_DISPLAY ;; | ||
| 1633 | JE DISPLAY_TYPE2 ;; | ||
| 1634 | CMP cs:type_word,TYPE_PRINTER ;; | ||
| 1635 | JE PRINTER_TYPE2 ;; | ||
| 1636 | NO_DISP_PTR2: ;; | ||
| 1637 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1638 | JMP FTB_LOOP ;; | ||
| 1639 | DISPLAY_TYPE2 : ;; | ||
| 1640 | MOV cs:stage,DISP_ROWSX ;; | ||
| 1641 | JMP FTB_LOOP ;; | ||
| 1642 | PRINTER_TYPE2 : ;; | ||
| 1643 | MOV cs:stage,PTRSELLOX ;; | ||
| 1644 | JMP FTB_LOOP ;; | ||
| 1645 | ;; | ||
| 1646 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1647 | DSPROWS : ;; STAGE : get the rows | ||
| 1648 | XOR AX,AX ;; | ||
| 1649 | MOV cs:disp_rows,AL ;; | ||
| 1650 | MOV cs:disp_cols,AL ;; | ||
| 1651 | MOV cs:DISP_X,AL ;; | ||
| 1652 | MOV cs:disp_y,AL ;; | ||
| 1653 | MOV cs:count_word,AX ;; | ||
| 1654 | ;; | ||
| 1655 | INC cs:pre_font_len ;; | ||
| 1656 | MOV AX,FPKT ;; | ||
| 1657 | INC SI ;; | ||
| 1658 | DEC CX ;; | ||
| 1659 | MOV cs:disp_rows,AL ;; | ||
| 1660 | MOV AX,cs:fdlen_word ;; | ||
| 1661 | DEC AX ;; | ||
| 1662 | MOV cs:fdlen_word,AX ;; | ||
| 1663 | JZ NO_DISP_FONT3 ;; | ||
| 1664 | MOV cs:stage,disp_colsX ;; | ||
| 1665 | JMP FTB_LOOP ;; | ||
| 1666 | NO_DISP_FONT3 : ;; | ||
| 1667 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1668 | JMP FTB_LOOP ;; | ||
| 1669 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1670 | DSPCOLS : ;; STAGE : get the COLS | ||
| 1671 | INC cs:pre_font_len ;; | ||
| 1672 | MOV AX,FPKT ;; | ||
| 1673 | INC SI ;; | ||
| 1674 | DEC CX ;; | ||
| 1675 | MOV cs:disp_cols,AL ;; | ||
| 1676 | MOV AX,cs:fdlen_word ;; | ||
| 1677 | DEC AX ;; | ||
| 1678 | MOV cs:fdlen_word,AX ;; | ||
| 1679 | JZ NO_DISP_FONT3 ;; | ||
| 1680 | MOV cs:stage,DISP_XX ;; | ||
| 1681 | JMP FTB_LOOP ;; | ||
| 1682 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1683 | DSPX : ;; STAGE : get the aspect X | ||
| 1684 | INC cs:pre_font_len ;; | ||
| 1685 | MOV AX,FPKT ;; | ||
| 1686 | INC SI ;; | ||
| 1687 | DEC CX ;; | ||
| 1688 | MOV DISP_X,AL ;; | ||
| 1689 | MOV AX,cs:fdlen_word ;; | ||
| 1690 | DEC AX ;; | ||
| 1691 | MOV cs:fdlen_word,AX ;; | ||
| 1692 | JZ NO_DISP_FONT3 ;; | ||
| 1693 | MOV cs:stage,DISP_YX ;; | ||
| 1694 | JMP FTB_LOOP ;; | ||
| 1695 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1696 | DSPY : ;; STAGE : get the aspect Y | ||
| 1697 | INC cs:pre_font_len ;; | ||
| 1698 | MOV AX,FPKT ;; | ||
| 1699 | INC SI ;; | ||
| 1700 | DEC CX ;; | ||
| 1701 | MOV cs:disp_y,AL ;; | ||
| 1702 | MOV AX,cs:fdlen_word ;; | ||
| 1703 | DEC AX ;; | ||
| 1704 | MOV cs:fdlen_word,AX ;; | ||
| 1705 | JZ NO_DISP_FONT3 ;; | ||
| 1706 | MOV cs:stage,COUNT_LOBX ;; | ||
| 1707 | JMP FTB_LOOP ;; | ||
| 1708 | ;; | ||
| 1709 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1710 | DSPCOUNTLO : ;; the low byte of the FONT-LENGTH | ||
| 1711 | INC cs:pre_font_len ;; | ||
| 1712 | MOV AX,FPKT ;; | ||
| 1713 | INC SI ;; byte by byte | ||
| 1714 | DEC CX ;; | ||
| 1715 | PUSH AX ;; check if length is enough | ||
| 1716 | MOV AX,cs:fdlen_word ;; | ||
| 1717 | DEC AX ;; | ||
| 1718 | MOV cs:fdlen_word,AX ;; | ||
| 1719 | POP AX ;; | ||
| 1720 | JNZ A_WORD_COUNT ;; | ||
| 1721 | JMP NO_DISP_FONT3 ;; | ||
| 1722 | A_WORD_COUNT : ;; | ||
| 1723 | AND CX,CX ;; | ||
| 1724 | JNZ WORD_COUNT ;; | ||
| 1725 | MOV cs:count_lob,AL ;; | ||
| 1726 | MOV cs:stage,COUNT_HIBX ;; | ||
| 1727 | JMP FTB_LOOP ;; | ||
| 1728 | WORD_COUNT : ;; | ||
| 1729 | INC cs:pre_font_len ;; | ||
| 1730 | INC SI ;; | ||
| 1731 | DEC CX ;; | ||
| 1732 | MOV cs:count_word,AX ;; | ||
| 1733 | ; MOV cs:pre_font_len,PRE_FONT_D; | ||
| 1734 | ;; | ||
| 1735 | MOV AX,cs:fdlen_word ;; | ||
| 1736 | DEC AX ;; | ||
| 1737 | MOV cs:fdlen_word,AX ;; | ||
| 1738 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1739 | JMP FTB_LOOP ;; | ||
| 1740 | ;; | ||
| 1741 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1742 | DSPCOUNTHI : ;; STAGE the high byte of the F-LENGTH | ||
| 1743 | INC cs:pre_font_len ;; | ||
| 1744 | MOV AX,FPKT ;; | ||
| 1745 | INC SI ;; byte by byte | ||
| 1746 | DEC CX ;; | ||
| 1747 | MOV cs:count_hib,AL ;; | ||
| 1748 | ; MOV cs:pre_font_len,PRE_FONT_D; | ||
| 1749 | ;; | ||
| 1750 | MOV AX,cs:fdlen_word ;; | ||
| 1751 | DEC AX ;; | ||
| 1752 | MOV cs:fdlen_word,AX ;; | ||
| 1753 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1754 | JMP FTB_LOOP ;; | ||
| 1755 | ;; | ||
| 1756 | ;; | ||
| 1757 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1758 | PTRSELLO : ;; the low byte of the SELECTION_TYPE | ||
| 1759 | INC cs:pre_font_len ;; | ||
| 1760 | MOV AX,FPKT ;; | ||
| 1761 | INC SI ;; byte by byte | ||
| 1762 | DEC CX ;; | ||
| 1763 | PUSH AX ;; check if length is enough | ||
| 1764 | MOV AX,cs:fdlen_word ;; | ||
| 1765 | DEC AX ;; | ||
| 1766 | MOV cs:fdlen_word,AX ;; | ||
| 1767 | POP AX ;; | ||
| 1768 | JNZ A_WORD_SEL ;; | ||
| 1769 | JMP NO_PTR_FONT3 ;; | ||
| 1770 | A_WORD_SEL : ;; | ||
| 1771 | AND CX,CX ;; | ||
| 1772 | JNZ WORD_SEL ;; | ||
| 1773 | MOV cs:ptr_selob,AL ;; | ||
| 1774 | MOV cs:stage,PTRSELHIX ;; | ||
| 1775 | JMP FTB_LOOP ;; | ||
| 1776 | WORD_SEL : ;; | ||
| 1777 | INC cs:pre_font_len ;; | ||
| 1778 | INC SI ;; | ||
| 1779 | DEC CX ;; | ||
| 1780 | MOV cs:ptr_sel_word,AX ;; | ||
| 1781 | ;; | ||
| 1782 | MOV AX,cs:fdlen_word ;; | ||
| 1783 | DEC AX ;; | ||
| 1784 | MOV cs:fdlen_word,AX ;; | ||
| 1785 | ;; | ||
| 1786 | CMP cs:ptr_sel_word,0 ;; | ||
| 1787 | JNE PTR_SEL_NOT0 ;; | ||
| 1788 | ;; | ||
| 1789 | ;; | ||
| 1790 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1791 | JMP FTB_LOOP ;; | ||
| 1792 | ;; | ||
| 1793 | PTR_SEL_NOT0 : ;; | ||
| 1794 | MOV cs:stage,PTRLENLOX ;; | ||
| 1795 | JMP FTB_LOOP ;; | ||
| 1796 | ;; | ||
| 1797 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1798 | PTRSELHI: ;; STAGE the high byte of SELECT_TYPE | ||
| 1799 | INC cs:pre_font_len ;; | ||
| 1800 | MOV AX,FPKT ;; | ||
| 1801 | INC SI ;; byte by byte | ||
| 1802 | DEC CX ;; | ||
| 1803 | MOV cs:ptr_sehib,AL ;; | ||
| 1804 | ;; | ||
| 1805 | MOV AX,cs:fdlen_word ;; | ||
| 1806 | DEC AX ;; | ||
| 1807 | MOV cs:fdlen_word,AX ;; | ||
| 1808 | ;; | ||
| 1809 | CMP cs:ptr_sel_word,0 ;; | ||
| 1810 | JNE PTR_SEL_NOT0 ;; | ||
| 1811 | ;; | ||
| 1812 | ;; | ||
| 1813 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1814 | JMP FTB_LOOP ;; | ||
| 1815 | ;; | ||
| 1816 | ;; | ||
| 1817 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1818 | PTRLENLO : ;; the low byte of SELECTION_LENGTH | ||
| 1819 | INC cs:pre_font_len ;; | ||
| 1820 | MOV AX,FPKT ;; | ||
| 1821 | INC SI ;; byte by byte | ||
| 1822 | DEC CX ;; | ||
| 1823 | PUSH AX ;; check if length is enough | ||
| 1824 | MOV AX,cs:fdlen_word ;; | ||
| 1825 | DEC AX ;; | ||
| 1826 | MOV cs:fdlen_word,AX ;; | ||
| 1827 | POP AX ;; | ||
| 1828 | JNZ A_WORD_SELEN ;; | ||
| 1829 | JMP NO_PTR_FONT3 ;; | ||
| 1830 | A_WORD_SELEN : ;; | ||
| 1831 | AND CX,CX ;; | ||
| 1832 | JNZ WORD_SELEN ;; | ||
| 1833 | MOV cs:ptr_lnlob,AL ;; | ||
| 1834 | MOV cs:stage,PTRLENHIX ;; | ||
| 1835 | JMP FTB_LOOP ;; | ||
| 1836 | WORD_SELEN : ;; | ||
| 1837 | INC cs:pre_font_len ;; | ||
| 1838 | INC SI ;; | ||
| 1839 | DEC CX ;; | ||
| 1840 | MOV cs:ptr_len_word,AX ;; | ||
| 1841 | ;; | ||
| 1842 | MOV AX,cs:fdlen_word ;; | ||
| 1843 | DEC AX ;; | ||
| 1844 | MOV cs:fdlen_word,AX ;; | ||
| 1845 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1846 | JMP FTB_LOOP ;; | ||
| 1847 | ;; | ||
| 1848 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1849 | PTRLENHI : ;; STAGE the high byte of SELECT_LENGTH | ||
| 1850 | INC cs:pre_font_len ;; | ||
| 1851 | MOV AX,FPKT ;; | ||
| 1852 | INC SI ;; byte by byte | ||
| 1853 | DEC CX ;; | ||
| 1854 | MOV cs:ptr_lnhib,AL ;; | ||
| 1855 | ;; | ||
| 1856 | MOV AX,cs:fdlen_word ;; | ||
| 1857 | DEC AX ;; | ||
| 1858 | MOV cs:fdlen_word,AX ;; | ||
| 1859 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1860 | JMP FTB_LOOP ;; | ||
| 1861 | ;; | ||
| 1862 | NO_PTR_FONT3 : ;; | ||
| 1863 | MOV cs:stage,FOUNDX ;; FSTAT is to be changed | ||
| 1864 | JMP FTB_LOOP ;; | ||
| 1865 | ;;+++++++++++++++++++++++++++++++++ | ||
| 1866 | PASS : ;; STAGE - PASS DUMMY BYTES | ||
| 1867 | ;; | ||
| 1868 | PUSH DX ;; | ||
| 1869 | PUSH ES ;; | ||
| 1870 | PUSH DI ;; | ||
| 1871 | ;; | ||
| 1872 | PUSH CS ;; | ||
| 1873 | POP ES ;; | ||
| 1874 | MOV DI,OFFSET PASS_BRK ;; | ||
| 1875 | MOV DX,PASS_INDX ;; | ||
| 1876 | MOV AX,cs:pass_cnt ;; | ||
| 1877 | ;; | ||
| 1878 | NEXT_BRK: ;; find the next pass-break | ||
| 1879 | CMP AX,ES:[DI] ;; | ||
| 1880 | ;; | ||
| 1881 | JB UPTO_BRK ;; | ||
| 1882 | ;; | ||
| 1883 | DEC DX ;; | ||
| 1884 | JZ PASS_ERR ;; | ||
| 1885 | INC DI ;; | ||
| 1886 | INC DI ;; | ||
| 1887 | JMP NEXT_BRK ;; | ||
| 1888 | ;; | ||
| 1889 | UPTO_BRK : ;; next break point found | ||
| 1890 | MOV DX,ES:[DI] ;; | ||
| 1891 | SUB DX,AX ;; bytes to be skipped | ||
| 1892 | CMP CX,DX ;; all to be skipped ? | ||
| 1893 | JAE PASS_ALL ;; | ||
| 1894 | ;; | ||
| 1895 | ADD cs:pass_cnt,CX ;; | ||
| 1896 | ADD SI,CX ;; | ||
| 1897 | SUB CX,CX ;; | ||
| 1898 | JMP PASS_END ;; | ||
| 1899 | ;; | ||
| 1900 | PASS_ALL : ;; | ||
| 1901 | ADD cs:pass_cnt,DX ;; | ||
| 1902 | ADD SI,DX ;; | ||
| 1903 | SUB CX,DX ;; | ||
| 1904 | ;; | ||
| 1905 | MOV AX,cs:pass_postx ;; | ||
| 1906 | MOV cs:stage,AX ;; | ||
| 1907 | ;; | ||
| 1908 | ; cmp ax,passx ;; is the next stage a pass-stage ? | ||
| 1909 | ; jne not_passx ;; | ||
| 1910 | ; mov ax,pass_postxx ;; | ||
| 1911 | ; mov pass_postx,ax ;; | ||
| 1912 | ; mov pass_postxx,stage_max ;; can support only 2 consecutive pass | ||
| 1913 | ;; | ||
| 1914 | ;not_passx : ;; | ||
| 1915 | ;; | ||
| 1916 | JMP PASS_END ;; | ||
| 1917 | ;; | ||
| 1918 | PASS_ERR : ;; DEVICE ERROR, wrong stage | ||
| 1919 | POP DI ;; | ||
| 1920 | POP ES ;; | ||
| 1921 | POP DX ;; | ||
| 1922 | MOV FTP.FTB_STATUS,STAT_DEVERR | ||
| 1923 | SUB CX,CX ;; ignore all the input string | ||
| 1924 | JMP PASS_DONE ;; | ||
| 1925 | ;; | ||
| 1926 | PASS_END : ;; | ||
| 1927 | POP DI ;; | ||
| 1928 | POP ES ;; | ||
| 1929 | POP DX ;; | ||
| 1930 | PASS_DONE : ;; | ||
| 1931 | JMP FTB_LOOP ;; | ||
| 1932 | ;; | ||
| 1933 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1934 | ;; | ||
| 1935 | FTB_LPEND : ;; | ||
| 1936 | ;; | ||
| 1937 | CMP cs:stage,FOUNDX ;; | ||
| 1938 | JNE NOT_FOUNDX ;; | ||
| 1939 | ;; | ||
| 1940 | CALL FOUND_DO ;; | ||
| 1941 | ;; | ||
| 1942 | NOT_FOUNDX : ;; | ||
| 1943 | ;; | ||
| 1944 | POP CX ;; STACK -1 | ||
| 1945 | ;; | ||
| 1946 | FP_RET : ;; | ||
| 1947 | POP SI ;; restore registers | ||
| 1948 | POP DI ;; | ||
| 1949 | POP DX ;; | ||
| 1950 | POP CX ;; | ||
| 1951 | POP BX ;; | ||
| 1952 | POP AX ;; | ||
| 1953 | POP ES ;; | ||
| 1954 | POP DS ;; | ||
| 1955 | ;; | ||
| 1956 | RET ;; | ||
| 1957 | FONT_PARSER ENDP ;; | ||
| 1958 | ;; | ||
| 1959 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1960 | CSEG ENDS | ||
| 1961 | END | ||
diff --git a/v4.0/src/DEV/PRINTER/CPSPEQU.INC b/v4.0/src/DEV/PRINTER/CPSPEQU.INC new file mode 100644 index 0000000..ca086cb --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPEQU.INC | |||
| @@ -0,0 +1,577 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; | ||
| 6 | ;; FILENAME: CPS Printer Device Driver EQUAL Include | ||
| 7 | ;; MODULE NAME: CPSEQU | ||
| 8 | ;; TYPE: Include File | ||
| 9 | ;; | ||
| 10 | ;; LINK PROCEDURE: See CPSPx.ASM | ||
| 11 | ;; | ||
| 12 | ;; INCLUDE FILES: | ||
| 13 | ;; | ||
| 14 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 15 | ;; | ||
| 16 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 17 | ;; | ||
| 18 | ;; Request Header (Common portion) | ||
| 19 | ;; | ||
| 20 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 21 | ;; | ||
| 22 | RH EQU ES:[DI] ;; addressability to Request Header | ||
| 23 | ;; | ||
| 24 | RHC STRUC ;; fields common to all request types | ||
| 25 | RHC_LEN DB ? ;; length of Request Header | ||
| 26 | DB ? ;; unit code (subunit) | ||
| 27 | RHC_CMD DB ? ;; command code | ||
| 28 | RHC_STA DW ? ;; status | ||
| 29 | DQ ? ;; reserved for DOS | ||
| 30 | RHC ENDS ;; end of common portion | ||
| 31 | ;; | ||
| 32 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 33 | ;; | ||
| 34 | ;; Command in the Request Header | ||
| 35 | ;; (see CMD_CODES table) | ||
| 36 | ;; | ||
| 37 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 38 | ;; | ||
| 39 | CMD_INI EQU 0 ;; init command | ||
| 40 | CMD_WRT EQU 8 ;; write command | ||
| 41 | CMD_GIO EQU 19 ;; generic IOCTL command | ||
| 42 | ;; (see major/minor GIO functions) | ||
| 43 | ;; | ||
| 44 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 45 | ;; | ||
| 46 | ;; status values for RHC_STA | ||
| 47 | ;; | ||
| 48 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 49 | ;; | ||
| 50 | STAT_DONE EQU 01H ;; function complete - high order byte | ||
| 51 | STAT_CMDERR EQU 8003H ;; invalid command code error | ||
| 52 | STAT_ERROR EQU 8000H ;; error returned by normal driver | ||
| 53 | ;; | ||
| 54 | ;; see Generic IOCTL Request Header section | ||
| 55 | ;; for more errorneous status. ;; | ||
| 56 | ;; | ||
| 57 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 58 | ;; | ||
| 59 | ;; Request Header for INIT | ||
| 60 | ;; | ||
| 61 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 62 | ;; | ||
| 63 | ;; | ||
| 64 | RH0 STRUC ;; | ||
| 65 | DB (TYPE RHC) DUP (?) ;; common portion | ||
| 66 | ;; | ||
| 67 | DB ? ;; not used for CHAR devices | ||
| 68 | RH0_ENDO DW ? ;; offset of ending address | ||
| 69 | RH0_ENDS DW ? ;; segment of ending address | ||
| 70 | RH0_BPBA DD ? ;; pointer to BPBA | ||
| 71 | db ? | ||
| 72 | RH0_CONFIG_ERRMSG dw 0 ;DCR D493 "Error in CONFIG.SYS..." msg flag. | ||
| 73 | RH0 ENDS ;; | ||
| 74 | ;; | ||
| 75 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 76 | ;; | ||
| 77 | ;; Request Header for IOCTL | ||
| 78 | ;; | ||
| 79 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 80 | ;; | ||
| 81 | RH3 STRUC ;; | ||
| 82 | DB (TYPE RHC) DUP (?) ;; common portion | ||
| 83 | ;; | ||
| 84 | ;; | ||
| 85 | DB ? ;; media descriptor | ||
| 86 | RH3_DTAO DW ? ;; offset of transfer address | ||
| 87 | RH3_DTAS DW ? ;; segment of transfer address | ||
| 88 | RH3_CNT DW ? ;; byte count | ||
| 89 | RH3 ENDS ;; | ||
| 90 | ;; | ||
| 91 | ;; | ||
| 92 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 93 | ;; | ||
| 94 | ;; Request Header for GENERIC IOCTL | ||
| 95 | ;; | ||
| 96 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 97 | ;; | ||
| 98 | GIH STRUC ;; | ||
| 99 | DB (TYPE RHC) DUP (?) ;; common portion | ||
| 100 | ;; | ||
| 101 | ;; | ||
| 102 | GIH_MAF DB ? ;; major function | ||
| 103 | GIH_MIF DB ? ;; minor function | ||
| 104 | GIH_SI DW ? ;; content of SI | ||
| 105 | GIH_DI DW ? ;; content of DI | ||
| 106 | GIH_GBA DD ? ;; Address of Generic Buffer | ||
| 107 | GIH ENDS ;; | ||
| 108 | ;; | ||
| 109 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 110 | ;; | ||
| 111 | ;; GIO major/minor functions | ||
| 112 | ;; (see GIO_CODES table) | ||
| 113 | ;; | ||
| 114 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 115 | MAF_CON EQU 03 ;; major function for CON device | ||
| 116 | MAF_PTR EQU 05 ;; major function for LPTX device | ||
| 117 | ;; | ||
| 118 | MIF_DST EQU 4CH ;; minor function : designate start | ||
| 119 | MIF_DEN EQU 4DH ;; designate end | ||
| 120 | MIF_IVK EQU 4AH ;; invoke | ||
| 121 | MIF_QIV EQU 6AH ;; query-invoked | ||
| 122 | MIF_QLS EQU 6BH ;; query-list | ||
| 123 | ;; | ||
| 124 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 125 | ;; Designate Start (MIF_DST)Flags | ||
| 126 | ;; see GBIS structure | ||
| 127 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 128 | ;; | ||
| 129 | DSF_FIFOCP EQU 08000H ;; Single code page FIFO command | ||
| 130 | DSF_CARTCP EQU 00001H ;; Code page for Cartridge/semi- | ||
| 131 | ;; hardware RAM | ||
| 132 | ;; | ||
| 133 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 134 | ;; Generic IOCTL errorneous status | ||
| 135 | ;; upon return | ||
| 136 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 137 | ;; | ||
| 138 | STAT_DELETE EQU 08000H ;; previous degignate deleted (DST) | ||
| 139 | ;; STAT_DELETE : only for FIFO | ||
| 140 | STAT_NOFIND EQU 08008H ;; codepage,device not found (DST) | ||
| 141 | STAT_DEVERR EQU 0800AH ;; Device error (DST,IVK,QIV,QLS,WRT) | ||
| 142 | STAT_BADATA EQU 0800CH ;; bad font file (DST) | ||
| 143 | STAT_NOBUFF EQU 0800CH ;; no font buffer for (REFRESH) | ||
| 144 | STAT_BADDEN EQU 0800CH ;; no DST (DEN) | ||
| 145 | STAT_bffDEN EQU 08000H ;; bad font file (DEN) | ||
| 146 | STAT_TOMANY EQU 0800aH ;; too manay codepages (DST) | ||
| 147 | STAT_DUPLCP EQU 0800aH ;; too manay codepages (DST) | ||
| 148 | STAT_NOCPIV EQU 08007H ;; no codepage designated/invoked | ||
| 149 | STAT_NOCP EQU 08007H ;; no codepage designated/invoked | ||
| 150 | ;; (IVK, QIV, QLS) | ||
| 151 | ;; | ||
| 152 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 153 | ;; | ||
| 154 | ;; Generic IOCTL Buffer DS:[SI] | ||
| 155 | ;; | ||
| 156 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 157 | GIOB EQU DS:[SI] ;; | ||
| 158 | ;; | ||
| 159 | GB1S STRUC ;; | ||
| 160 | GB1_FLAG DW ? ;; flag | ||
| 161 | GB1_LEN DW ? ;; length | ||
| 162 | GB1_NUM DW ? ;; length | ||
| 163 | GB1_CP DW ? ;; | ||
| 164 | GB1S ENDS ;; | ||
| 165 | ;; | ||
| 166 | ;; | ||
| 167 | GB2S STRUC ;; | ||
| 168 | GB2_LEN DW ? ;; length | ||
| 169 | GB2_CP DW ? ;; | ||
| 170 | GB2S ENDS ;; | ||
| 171 | ;; | ||
| 172 | ;; | ||
| 173 | GB3S STRUC ;; | ||
| 174 | GB3_LEN DW ? ;; length | ||
| 175 | GB3_GBL DW ? ;; hardware code page number | ||
| 176 | GB3S ENDS ;; | ||
| 177 | ;; | ||
| 178 | GB3_MINILEN EQU 4 ;; minimium length of GB3 | ||
| 179 | ;; | ||
| 180 | GBLS STRUC ;; | ||
| 181 | GBL_LEN DW ? ;; length | ||
| 182 | GBL_CP DW ? ;; hardware code page number | ||
| 183 | GBLS ENDS ;; | ||
| 184 | ;; | ||
| 185 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 186 | ;; | ||
| 187 | ;; DEVICE Header DS:[SI] -- to locate the next LPTn header | ||
| 188 | ;; NEXT device header ES:[DI] | ||
| 189 | ;; | ||
| 190 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 191 | HP EQU DS:[SI] ;; | ||
| 192 | NHD EQU ES:[DI] ;; | ||
| 193 | ;; | ||
| 194 | NAME_LEN EQU 8 ;; | ||
| 195 | ;; | ||
| 196 | DHS STRUC ;; | ||
| 197 | DH_NEXTO DW ? ;; offset of pointer to next header | ||
| 198 | DH_NEXTS DW ? ;; segment of pointer to next header | ||
| 199 | DW ? ;; attribute | ||
| 200 | DH_STRAO DW ? ;; offset to strategy routine | ||
| 201 | DH_INTRO DW ? ;; offset to interrupt routine | ||
| 202 | DH_NAME DB NAME_LEN DUP(0) ;; device name in this header | ||
| 203 | DHS ENDS ;; end of common portion | ||
| 204 | ;; | ||
| 205 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 206 | ;; | ||
| 207 | ;; FONT_PARSER data | ||
| 208 | ;; | ||
| 209 | ;; -- Interface table : FTABLE | ||
| 210 | ;; | ||
| 211 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 212 | ;; | ||
| 213 | FPKT EQU DS:[SI] ;; | ||
| 214 | ;; | ||
| 215 | FTP EQU ES:[BX] ;; | ||
| 216 | ;; ( I=Input O=Output ) | ||
| 217 | FTBLK STRUC ;; | ||
| 218 | FTB_LENGTH DW TYPE FTBLK ;; (NOT TO BE CHANGED) | ||
| 219 | FTB_STATUS DW 0FFFFH ;; (O) parsing compelte | ||
| 220 | FTB_TYPE DW 0 ;; (O) | ||
| 221 | FTB_TID DB 8 DUP(?) ;; (I) | ||
| 222 | FTB_CP DW 0FFFFH ;; (I) | ||
| 223 | FTB_MOD DW 0 ;; (O) | ||
| 224 | FTB_FONTS DW 0 ;; (O) | ||
| 225 | FTB_ROWS DB 0 ;; (O) DISPLAY TYPE DEVICE | ||
| 226 | FTB_COLS DB 0 ;; (O) DISPLAY TYPE DEVICE | ||
| 227 | FTB_X DB 0 ;; (O) DISPLAY TYPE DEVICE | ||
| 228 | FTB_Y DB 0 ;; (O) DISPLAY TYPE DEVICE | ||
| 229 | FTB_COUNT DW 0 ;; (O) DISPLAY TYPE DEVICE | ||
| 230 | FTB_SELECT DW 0 ;; (O) PRINTER TYPE DEVICE | ||
| 231 | FTB_SELLEN DW 0 ;; (O) PRINTER TYPE DEVICE | ||
| 232 | FTB_DLEFT DW 0 ;; (O) =0, none to come | ||
| 233 | FTB_DLEN DW 0 ;; (O) =0, not in this packet | ||
| 234 | FTB_DALO DW 0 ;; (O) in the DOS "packet" buffer | ||
| 235 | FTB_DAHI DW 0 ;; (O) " " " " " | ||
| 236 | TARGET_LO DW 0 ;; internal registers | ||
| 237 | TARGET_HI DW 0 ;; internal registers | ||
| 238 | FTBLK ENDS ;; | ||
| 239 | ;; | ||
| 240 | TYPE_DISPLAY EQU 01H ;; display type device | ||
| 241 | TYPE_PRINTER EQU 02H ;; printer type device | ||
| 242 | ;; | ||
| 243 | FBUFS STRUC ;; | ||
| 244 | FLAG DW 0 ;; | ||
| 245 | BUFFER_LEN DW 0 ;; | ||
| 246 | BUFFER_ADDR DD 0 ;; | ||
| 247 | NUM_FTBLK DW 0 ;; no. of FTBKL entries | ||
| 248 | FBUFS ENDS ;; | ||
| 249 | ;; | ||
| 250 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 251 | ;; FLAGS : | ||
| 252 | FLAG_RESTART EQU 000001H ;; bit 1 = restart the parsing | ||
| 253 | ;; | ||
| 254 | ;; | ||
| 255 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 256 | ;; STATUS : (in FTB_STATUS) | ||
| 257 | ;; | ||
| 258 | FSTAT_COMPLETE EQU 0FFFFH ;; parsing compeleted. (good status) | ||
| 259 | FSTAT_FONT EQU 0FFFEH ;; font data is defined and returned | ||
| 260 | FSTAT_FOUND EQU 0FFFDH ;; informations including font-length | ||
| 261 | FSTAT_MATCH EQU 0FFFCH ;; font header matches FTBLK | ||
| 262 | FSTAT_SEARCH EQU 0FFFBH ;; seraching for header & font | ||
| 263 | FSTAT_BOTTOM EQU 0FFF0H ;; below this are the DOS_STATUS. | ||
| 264 | ;; | ||
| 265 | ;; the FSTAT with value lower than 0FFF0H is to be returned to the DOS | ||
| 266 | ;; | ||
| 267 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 268 | ; | ||
| 269 | ; DEVICE Command Parser Table ES:[DI] | ||
| 270 | ; | ||
| 271 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 272 | ;; | ||
| 273 | table_len equ 290 ;; | ||
| 274 | ;; | ||
| 275 | PSE EQU ES:[DI] ;; | ||
| 276 | ;; | ||
| 277 | PAR_OT STRUC ;; | ||
| 278 | PAR_DEV_NUM DW ? ;; | ||
| 279 | PAR_OFF DW ? ;; | ||
| 280 | PAR_OT ENDS ;; | ||
| 281 | ;; | ||
| 282 | PAR_DEVOT STRUC ;; OFFSET to the parameters of a device | ||
| 283 | PAR_onum DW ? ;; number of offsets in the table | ||
| 284 | PAR_DNMO DW ? ;; device-name table offset | ||
| 285 | PAR_DIDO DW ? ;; device-id table offset | ||
| 286 | PAR_HWCPO DW ? ;; hwcp table offset | ||
| 287 | PAR_DESGO DW ? ;; designate table offset | ||
| 288 | PAR_PARMO DW ? ;; parameter table offset | ||
| 289 | PAR_DEVOT ENDS ;; | ||
| 290 | ;; | ||
| 291 | PAR_DNMT STRUC ;; DEVICE NAME table | ||
| 292 | PAR_DNML DW ? ;; length of device name | ||
| 293 | PAR_DNM DB ? ;; device name | ||
| 294 | PAR_DNMT ENDS ;; | ||
| 295 | ;; | ||
| 296 | PAR_DIDT STRUC ;; DEVICE ID table | ||
| 297 | PAR_DIDL DW ? ;; device ID length | ||
| 298 | PAR_DID DB ? ;; device ID | ||
| 299 | PAR_DIDT ENDS ;; | ||
| 300 | ;; | ||
| 301 | PAR_HWCPT STRUC ;; hwcp table | ||
| 302 | PAR_HWCPL DW ? ;; hwcp entry number | ||
| 303 | PAR_HWCP DW ? ;; hwcp | ||
| 304 | PAR_HWCPT ENDS ;; | ||
| 305 | ;; | ||
| 306 | ;; | ||
| 307 | PAR_DESGT STRUC ;; DESIGNATE table | ||
| 308 | PAR_DESGL DW ? ;; entry number | ||
| 309 | PAR_DESG DW ? ;; designate | ||
| 310 | PAR_FONT DW ? ;; fonts | ||
| 311 | PAR_DESGT ENDS ;; | ||
| 312 | ;; | ||
| 313 | ;; | ||
| 314 | PAR_PARMT STRUC ;; parameter table | ||
| 315 | PAR_PARML DW ? ;; length | ||
| 316 | PAR_PARM DW ? ;; | ||
| 317 | PAR_PARMT ENDS ;; | ||
| 318 | ;; | ||
| 319 | ;; | ||
| 320 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 321 | ; | ||
| 322 | ; LPTn printer data structure CS:[BX] | ||
| 323 | ; | ||
| 324 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 325 | ;; | ||
| 326 | BUF EQU CS:[BX] ;; | ||
| 327 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 328 | ;; STATES | ||
| 329 | ;; | ||
| 330 | NORMAL EQU 0 ;; normal state | ||
| 331 | CPSW EQU 1 ;; | ||
| 332 | DESG_WR EQU 2 ;; designate write | ||
| 333 | DESG_END EQU 3 ;; designate end | ||
| 334 | LOCKED EQU 4 ;; WGR locked | ||
| 335 | ;; | ||
| 336 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 337 | GOOD EQU 0 ;; STATUS : | ||
| 338 | REPLX EQU 8000H ;; codepage replaced in DST | ||
| 339 | FAIL EQU 4000H ;; fail in designate | ||
| 340 | LOADED EQU 2000H ;; the font has just been loaded to | ||
| 341 | REFRESH EQU 0800H ;; there was a refresh via DST | ||
| 342 | ;; | ||
| 343 | ;; also | ||
| 344 | ;; -- DSF_CARTCP | ||
| 345 | ;; | ||
| 346 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 347 | ;; | ||
| 348 | ;; for BFLAG : | ||
| 349 | BF_PRN EQU 0 ;; 0 = PRN initialized (interrupt) | ||
| 350 | BF_LPT1 EQU 1 ;; 1 = LPT1 initialized (interrupt) | ||
| 351 | BF_LPT2 EQU 2 ;; 2 = LPT2 initialized (interrupt) | ||
| 352 | BF_LPT3 EQU 3 ;; 3 = LPT3 initialized (interrupt) | ||
| 353 | BF_MEM_DONE EQU 08000H ;; memory done for this device | ||
| 354 | ;; | ||
| 355 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 356 | ;; BUFFER DATA structure | ||
| 357 | BUF_DATA STRUC ;;................................. | ||
| 358 | BFLAG DW -1 ;; buf flag for initialisation | ||
| 359 | ;; -1 = buf not yet initialised | ||
| 360 | ;; (see BF_PRN, BF_LPT's) | ||
| 361 | ;; | ||
| 362 | DEV_HDRO DW -1 ;; device driver n header offset | ||
| 363 | DEV_HDRS DW -1 ;; | ||
| 364 | LPT_STRAO DW -1 ;; dos lptn strategy offset | ||
| 365 | LPT_STRAS DW -1 ;; | ||
| 366 | LPT_INTRO DW -1 ;; dos lptn strategy offset | ||
| 367 | LPT_INTRS DW -1 ;; | ||
| 368 | RH_PTRO DW -1 ;; request header offset | ||
| 369 | RH_PTRS DW -1 ;; segment ....................(unique) | ||
| 370 | ;; | ||
| 371 | ;; (following is replicated for LPT1 ) | ||
| 372 | ;; | ||
| 373 | RNORMO DW -1 ;; request-normal driver header offset | ||
| 374 | prn_bufo dw -1 ;; offset to prn buffer | ||
| 375 | did_prn dw 0 ;; where PRN is in the DID order | ||
| 376 | PCLASS DW 0 ;; | ||
| 377 | STATE DW NORMAL ;; | ||
| 378 | STATUS DW GOOD ;; | ||
| 379 | ;; (the followings should be used | ||
| 380 | ;; IFF BUT.STATE <> NORMAL : ) | ||
| 381 | ;; | ||
| 382 | PDESCO DW -1 ;; offset to printer description table. | ||
| 383 | ;; | ||
| 384 | ;;===== hwcp and designated slots ==== | ||
| 385 | HSLMX DW 0 ;; HSLMX is the size of HARDslot (at | ||
| 386 | ;; HARDSO) and the buffer(at HRBUFO) | ||
| 387 | ;; | ||
| 388 | HARDMX DW 0 ;; no. of HWCP+cart slots supported | ||
| 389 | ;; (less than or equal to .HSLOTS) | ||
| 390 | HARDSO DW -1 ;; offset to hardware slots n | ||
| 391 | ;; | ||
| 392 | HCARMX DW 0 ;; no. of cart slots supported | ||
| 393 | HRBUFO DW -1 ;; offset to cart slots' buffer | ||
| 394 | ;; | ||
| 395 | ;;===== physical and designated RAM === | ||
| 396 | ;; | ||
| 397 | RSLMX DW 0 ;; RSLMX is the size of RAMslot (at | ||
| 398 | ;; RAMSO) and the RAM buffer(at RMBUFO) | ||
| 399 | ;; | ||
| 400 | ;; | ||
| 401 | RAMMX DW 0 ;; no. of physical RAM slots(max.=1) | ||
| 402 | RAMSO DW -1 ;; offset to RAM slots(incl. designated | ||
| 403 | ;; | ||
| 404 | RBUFMX DW 0 ;; no. of designated RAM slots supported | ||
| 405 | RMBUFO DW -1 ;; offset to RAM slots's buffer | ||
| 406 | ;; | ||
| 407 | FTSZPA DW -1 ;; font buffer in paragraph = FONTSZ | ||
| 408 | FTSIZE DW 0 ;; font buffer size = FTSZPA x 16 | ||
| 409 | FTSTART DW -1 ;; start of font buffer | ||
| 410 | FTSLOTO DW -1 ;; segment address of font buffer | ||
| 411 | ;; -- of the one to be designated to | ||
| 412 | FTDLO DW -1 ;; offset to where the FTSTART:OFFSET | ||
| 413 | ;; (next destination = total length | ||
| 414 | ;; so far) | ||
| 415 | FSELEN DW 0 ;; length of selection control copied | ||
| 416 | ;; to the selection buffer | ||
| 417 | ;; (USED BY SELECT TYPE = 1 ONLY) | ||
| 418 | ;; -- initialized to 0, if selection | ||
| 419 | ;; is not 0, copied the selection | ||
| 420 | ;; from the font file until the | ||
| 421 | ;; length is reached. After copying | ||
| 422 | ;; to selection buffer, reset to 0 | ||
| 423 | FSELMAX DW 0 ;; max. room reserved for selection | ||
| 424 | ;; controls. | ||
| 425 | ;; | ||
| 426 | PAR_EXTRACTO DB (TYPE PAR_DEVOT) DUP (-1);; Offset to parameter extracts | ||
| 427 | SAVED_CP DW -1 ;; WGR saved code page during lock ;AN000; | ||
| 428 | BUFEND DW 0 ;; END OF BUFFER, for LPT1 copy. | ||
| 429 | BUF_DATA ENDS ;; | ||
| 430 | ;; | ||
| 431 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 432 | ; | ||
| 433 | ; Printer Description Table | ||
| 434 | ; | ||
| 435 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 436 | ;; | ||
| 437 | DEVN_LEN EQU 8 ;; device name (type-id) length | ||
| 438 | ;; | ||
| 439 | PDSH STRUC ;; | ||
| 440 | PD_LEN DW 30 ;; length of each entry | ||
| 441 | TYPEID DB ' ' ;; device name (id), length DEVN_LEN | ||
| 442 | VMINOR DB 0 ;; version : .00 | ||
| 443 | VMAJOR DB 1 ;; version : 1. | ||
| 444 | CLASS DW ? ;; reserved | ||
| 445 | FONTSZ DW ? ;; font buffer size in paragraph (max) | ||
| 446 | HSLOTS DW ? ;; hard-slots number (max # of Hslots) | ||
| 447 | HWCPMIN DW ? ;; what left by min_hwcp can be cart. | ||
| 448 | RSLOTS DW ? ;; ram-slots number (max # of Rslots) | ||
| 449 | PDSH ENDS ;; the SELH_O, and SELR_O are defined | ||
| 450 | ;; in the next two entries in PDS | ||
| 451 | ;; | ||
| 452 | ;; | ||
| 453 | PDS STRUC ;; | ||
| 454 | DB (TYPE PDSH) DUP (?) ;; common portion | ||
| 455 | SELH_O DW ? ;; offset to select controls on Hslots | ||
| 456 | SELR_O DW ? ;; offset to select controls on Rslots | ||
| 457 | SELB_O DW ? ;; offset to buffered select controls | ||
| 458 | PDS ENDS ;; | ||
| 459 | ;; | ||
| 460 | ;; | ||
| 461 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 462 | ; | ||
| 463 | ; HARD / RAM slots table structure/constants | ||
| 464 | ; | ||
| 465 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 466 | ;; NOTE : must be only FOUR bytes for | ||
| 467 | ;; codepage positioning | ||
| 468 | ;; calculation as compared | ||
| 469 | ;; with each entry in FTDL_OFF | ||
| 470 | ;; | ||
| 471 | SLTS STRUC ;; slots-table structure | ||
| 472 | SLT_CP DW -1 ;; code page : no code page | ||
| 473 | SLT_AT DW 0 ;; attribute : empty | ||
| 474 | SLTS ENDS ;; | ||
| 475 | ;; | ||
| 476 | ;; ATTRIBUTES : | ||
| 477 | AT_RAM1 EQU 00001H ;; in the 1st physical RAM slot | ||
| 478 | AT_RAM2 EQU 00002H ;; in the 2nd physical RAM slot | ||
| 479 | AT_RAM3 EQU 00004H ;; in the 3rd physical RAM slot | ||
| 480 | AT_RAM4 EQU 00008H ;; in the 4th physical RAM slot | ||
| 481 | AT_RAMS EQU 0000FH ;;(note the current logic supports | ||
| 482 | ;; only ONE physical RAM slot) | ||
| 483 | ;; | ||
| 484 | AT_OCC EQU 01000H ;; slot occupied | ||
| 485 | AT_ACT EQU 02000H ;; slot active | ||
| 486 | AT_HWCP EQU 04000H ;; slot is hwcp | ||
| 487 | AT_OLD EQU 08000H ;; codepage in buffer is not newly | ||
| 488 | ;; designated. | ||
| 489 | AT_LOAD EQU 00100H ;; slot with font to be loaded | ||
| 490 | AT_FONT EQU 00200H ;; font in this slot has been loaded | ||
| 491 | AT_NO_LOAD EQU NOT AT_LOAD ;; to reset the bit | ||
| 492 | AT_NO_FONT EQU NOT AT_FONT ;; to reset the bit | ||
| 493 | AT_SELECT EQU 00400H ;; for SELECT TYPE = 1 | ||
| 494 | ;; -- mark the FTBLK where control is | ||
| 495 | ;; copied from. | ||
| 496 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 497 | ;; constants on SLOTS | ||
| 498 | HARDSL_MAX EQU 12 ;; | ||
| 499 | ;; | ||
| 500 | RAMSL_MAX EQU 12 ;; | ||
| 501 | ;; | ||
| 502 | CTL_MAX EQU 32 ;; max.length of each selection control | ||
| 503 | CTL5202_OFFS EQU 8 ;; offset to CTL5202_H for codepage | ||
| 504 | ;; | ||
| 505 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 506 | ; | ||
| 507 | ; General Constants | ||
| 508 | ; | ||
| 509 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 510 | ;; | ||
| 511 | STACK_SIZE EQU 28H ;; in paragraph, total 200H bytes | ||
| 512 | ;; | ||
| 513 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 514 | ; | ||
| 515 | ; | ||
| 516 | ; STRUCS AND EQUATES | ||
| 517 | ; | ||
| 518 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 519 | ;; | ||
| 520 | PARSE_NAME STRUC ;; ;AN000; | ||
| 521 | N_LENGTH DW ? ;; ;AN000; | ||
| 522 | FNAME DB " " ;; ;AN000; | ||
| 523 | PARSE_NAME ENDS ;; ;AN000; | ||
| 524 | ;; | ||
| 525 | PARSE_OFFSETS STRUC ;; ;AN000; | ||
| 526 | DW ? ;; ;AN000; | ||
| 527 | DN_OFFSET DW ? ;; ;AN000; | ||
| 528 | DI_OFFSET DW ? ;; ;AN000; | ||
| 529 | DCP_OFFSET DW ? ;; ;AN000; | ||
| 530 | DD_OFFSET DW ? ;; ;AN000; | ||
| 531 | DW ? ;; ;AN000; | ||
| 532 | PARSE_OFFSETS ENDS ;; ;AN000; | ||
| 533 | ;; | ||
| 534 | PARSE_HWCP STRUC ;; ;AN000; | ||
| 535 | NUM_HWCPS DW ? ;; ;AN000; | ||
| 536 | HWCP_1 DW ? ;; ;AN000; | ||
| 537 | HWCP_2 DW ? ;; ;AN000; | ||
| 538 | HWCP_3 DW ? ;; ;AN000; | ||
| 539 | HWCP_4 DW ? ;; ;AN000; | ||
| 540 | HWCP_5 DW ? ;; ;AN000; | ||
| 541 | HWCP_6 DW ? ;; ;AN000; | ||
| 542 | HWCP_7 DW ? ;; ;AN000; | ||
| 543 | HWCP_8 DW ? ;; ;AN000; | ||
| 544 | HWCP_9 DW ? ;; ;AN000; | ||
| 545 | HWCP_10 DW ? ;; ;AN000; | ||
| 546 | PARSE_HWCP ENDS ;; ;AN000; | ||
| 547 | ;; | ||
| 548 | PARSE_DESG STRUC ;; ;AN000; | ||
| 549 | NUM_VALUES DW ? ;; ;AN000; | ||
| 550 | NUM_DESGS DW ? ;; ;AN000; | ||
| 551 | NUM_FONTS DW ? ;; ;AN000; | ||
| 552 | PARSE_DESG ENDS ;; ;AN000; | ||
| 553 | ;; | ||
| 554 | ;; | ||
| 555 | ZERO EQU 0H ;; ;AN000; | ||
| 556 | ONE EQU 1H ;; ;AN000; | ||
| 557 | TWO EQU 2H ;; ;AN000; | ||
| 558 | THREE EQU 3H ;; ;AN000; | ||
| 559 | FOUR EQU 4H ;; ;AN000; | ||
| 560 | FIVE EQU 5H ;; ;AN000; | ||
| 561 | SIX EQU 6H ;; ;AN000; | ||
| 562 | SEVEN EQU 7H ;; ;AN000; | ||
| 563 | EIGHT EQU 8H ;; ;AN000; | ||
| 564 | NINE EQU 9H ;; ;AN000; | ||
| 565 | TEN EQU 0AH ;; ;AN000; | ||
| 566 | NUMBER EQU 1 ;; ;AN000; | ||
| 567 | STRING EQU 3 ;; ;AN000; | ||
| 568 | COMPLEX EQU 4 ;; ;AN000; | ||
| 569 | RC_EOL EQU -1 ;; ;AN000; | ||
| 570 | RC_NO_ERROR EQU 0 ;; ;AN000; | ||
| 571 | RC_OP_MISSING EQU 2 ;; ;AN000; | ||
| 572 | ON EQU 1 ;; ;AN000; | ||
| 573 | OFF EQU 0 ;; ;AN000; | ||
| 574 | BAD_SYNTAX_MSG EQU 12 ;; ;AN000; | ||
| 575 | BAD_DEVICE_MSG EQU 2 ;; ;AN000; | ||
| 576 | ; | ||
| 577 | |||
diff --git a/v4.0/src/DEV/PRINTER/CPSPI.ASM b/v4.0/src/DEV/PRINTER/CPSPI.ASM new file mode 100644 index 0000000..30bb7c9 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPI.ASM | |||
| @@ -0,0 +1,2422 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; | ||
| 6 | ;; FILENAME: CPS Printer Device Driver INIT module (CPSPInn) | ||
| 7 | ;; MODULE NAME: | ||
| 8 | ;; TYPE: Assemble file (non-resident code) | ||
| 9 | ;; LINK PROCEDURE: Link CPSPMnn+CPSFONT+CPSPInn into .EXE format. CPSPM01 | ||
| 10 | ;; must be first. CPSPInn must be last. Everything | ||
| 11 | ;; before CPSPInn will be resident. | ||
| 12 | ;; INCLUDE FILES: | ||
| 13 | ;; CPSPEQU.INC | ||
| 14 | ;; | ||
| 15 | ;; LAYOUT : This file is divided into two main section : | ||
| 16 | ;; ++++++++++++++++++++++++ | ||
| 17 | ;; ++ DEVICE Parser ++ | ||
| 18 | ;; ++++++++++++++++++++++++ | ||
| 19 | ;; | ||
| 20 | ;; ++++++++++++++++++++++++ | ||
| 21 | ;; ++ INIT Command ++ | ||
| 22 | ;; ++++++++++++++++++++++++ | ||
| 23 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 24 | ;; | ||
| 25 | INCLUDE CPSPEQU.INC ;; | ||
| 26 | ;; | ||
| 27 | PUBLIC INIT ;; | ||
| 28 | PUBLIC CODE_END ;; for MAP listing only | ||
| 29 | PUBLIC RESIDENT_END ;; | ||
| 30 | PUBLIC STACK_ALLOCATED ;; | ||
| 31 | ;; | ||
| 32 | ;; | ||
| 33 | EXTRN PRINTER_DESC_NUM:WORD ;; | ||
| 34 | EXTRN PRINTER_DESC_TBL:WORD ;; | ||
| 35 | EXTRN INIT_CHK:WORD,TABLE:WORD ;; | ||
| 36 | EXTRN HARD_SL1:BYTE,RAM_SL1:BYTE ;; | ||
| 37 | EXTRN HARD_SL2:BYTE,RAM_SL2:BYTE ;; | ||
| 38 | EXTRN HARD_SL3:BYTE,RAM_SL3:BYTE ;; | ||
| 39 | EXTRN HARD_SL4:BYTE,RAM_SL4:BYTE ;; | ||
| 40 | EXTRN RESERVED1:WORD,RESERVED2:WORD ;; | ||
| 41 | ;; | ||
| 42 | EXTRN MSG_NO_INIT_P:BYTE ;; | ||
| 43 | EXTRN MSG_NO_INIT:BYTE ;; | ||
| 44 | EXTRN MSG_BAD_SYNTAX:BYTE ;; | ||
| 45 | EXTRN MSG_INSUFF_MEM:BYTE ;; | ||
| 46 | ;; | ||
| 47 | ;; | ||
| 48 | CSEG SEGMENT PARA PUBLIC 'CODE' ;; | ||
| 49 | ASSUME CS:CSEG ;; | ||
| 50 | ;; | ||
| 51 | ;; | ||
| 52 | CODE_END EQU $ ;; end of resident code | ||
| 53 | ;; | ||
| 54 | DW 0 ;; -- there are 16 bytes kept, | ||
| 55 | ;; including this word | ||
| 56 | ;; | ||
| 57 | RESIDENT_END DW 0FFFH ;; end of extended resident area | ||
| 58 | STACK_ALLOCATED DW -1 ;; end of extended resident area | ||
| 59 | ;; | ||
| 60 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 61 | ;; | ||
| 62 | ;; End of resident code | ||
| 63 | ;; | ||
| 64 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 65 | ;; | ||
| 66 | ;; Incorporating Device Command Parser : | ||
| 67 | ;; | ||
| 68 | ;; -- extracted from PARSE4E.ASM, size 49582 bytes | ||
| 69 | ;; | ||
| 70 | ;; (some modifications have to be made in the section right after the parser's | ||
| 71 | ;; document and before the GET_PARMS_A, one of them is :) | ||
| 72 | ;; | ||
| 73 | ;; -- move the TABLE to the printer device driver's main module | ||
| 74 | ;; | ||
| 75 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 76 | ;; | ||
| 77 | ;; ++++++++++++++++++++++++ | ||
| 78 | ;; ++ DEVICE Parser ++ | ||
| 79 | ;; ++++++++++++++++++++++++ | ||
| 80 | ;; | ||
| 81 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 82 | ;; | ||
| 83 | ;; | ||
| 84 | ;; PARSER's code -- non resident | ||
| 85 | ;; | ||
| 86 | ;; -- set ES:[DI] pointing to the Request Header before calling PARSER | ||
| 87 | ;; | ||
| 88 | ;; to be called as PARSER with ES:[DI] defined as Request Header | ||
| 89 | ;; If there is any syntax error in the DEVICE command line, the | ||
| 90 | ;; Parser return a 0 in the first word (NUMBER)of the first table. | ||
| 91 | ;; | ||
| 92 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 93 | ;; | ||
| 94 | ; | ||
| 95 | ; Description: A command parser for DEVICE command in the CONFIG.SYS file. | ||
| 96 | ; ------------ | ||
| 97 | ; | ||
| 98 | ; Procedures contained in the file: | ||
| 99 | ; --------------------------------- | ||
| 100 | ; PARSER: Main routine for command processing. | ||
| 101 | ; GET_CHAR: Gets a character from command line. | ||
| 102 | ; IS_ALPH: Checks if character is an alpha character. | ||
| 103 | ; IS_DIGIT: Checks if character is a digit. | ||
| 104 | ; IS_DELIM: Checks if character is a DOS delimiter. | ||
| 105 | ; DEVICE_PARSE: Pulls device name from command line and | ||
| 106 | ; inserts in table. | ||
| 107 | ; ID_PARSE: Pulls id name from command line and insers in table | ||
| 108 | ; HWCP_PARMS: Extract HWCP number, converts it to binary and | ||
| 109 | ; inserts it in table. | ||
| 110 | ; HWCP_PARSE: Extracts HWCP number if only one number is given. | ||
| 111 | ; MUL_HWCP: Extracts multiple HWCP's numbers, if they are given | ||
| 112 | ; in a list. | ||
| 113 | ; DESG_PARMS: Extracts designate number, converts it to binary | ||
| 114 | ; and inserts it in table. | ||
| 115 | ; DESG_FONT: Extracts the designate and the font if both were | ||
| 116 | ; given in command line. | ||
| 117 | ; DESG_PARSE: Pulls designate number if it is the only one given. | ||
| 118 | ; GET_NUMBER: Converts a number to binary. | ||
| 119 | ; OFFSET_TABLE: Updates the counter in table #1. | ||
| 120 | ; FIND_RIGHT_BR: Looks for a right bracket. | ||
| 121 | ; | ||
| 122 | ; | ||
| 123 | ; Change history: | ||
| 124 | ; --------------- | ||
| 125 | ; | ||
| 126 | ; | ||
| 127 | ;LOGIC: | ||
| 128 | ;------ | ||
| 129 | ; Establish addressability to parameters. | ||
| 130 | ; Skip until end of path and file name -first delimiter | ||
| 131 | ; | ||
| 132 | ; Loop: | ||
| 133 | ; Isolate the first non-delimiter or non delimeter characters. | ||
| 134 | ; If End_of_Line_Delimiter then | ||
| 135 | ; return an error_code | ||
| 136 | ; Else | ||
| 137 | ; If first non-delimiter is ALPHA then | ||
| 138 | ; (assume a device name) | ||
| 139 | ; Extracts device name | ||
| 140 | ; Update offset counter | ||
| 141 | ; | ||
| 142 | ; Isolate the first non-delimiter characters after id name. | ||
| 143 | ; If End_of_Line_Delimiter then | ||
| 144 | ; return an error_code | ||
| 145 | ; Else | ||
| 146 | ; If first non-delimiter is ALPHA-NUMARIC or | ||
| 147 | ; If character is '(' then | ||
| 148 | ; (assume an id name) | ||
| 149 | ; Extracts id name | ||
| 150 | ; Update offset counter | ||
| 151 | ; | ||
| 152 | ; Pull out HWCP | ||
| 153 | ; If error flag is set then exit | ||
| 154 | ; Else if end of line flag is set then exit | ||
| 155 | ; | ||
| 156 | ; Pull out DESG parms | ||
| 157 | ; If error_flag is set then exit. | ||
| 158 | ; Else if end of line flag is set then exit | ||
| 159 | ; Else if Number of devices is four then Exit | ||
| 160 | ; Else Loop | ||
| 161 | ; | ||
| 162 | ; | ||
| 163 | ;Subroutines Logic: | ||
| 164 | ;------------------ | ||
| 165 | ; | ||
| 166 | ; GET_CHAR: | ||
| 167 | ; --------- | ||
| 168 | ; Load character in AL | ||
| 169 | ; If character less than 20h then | ||
| 170 | ; turn Z-flag on | ||
| 171 | ; | ||
| 172 | ; IS_ALPHA: | ||
| 173 | ; --------- | ||
| 174 | ; Save character | ||
| 175 | ; 'Convert character to upper case' | ||
| 176 | ; If character >=A and <=Z then | ||
| 177 | ; turn Z-flag on | ||
| 178 | ; exit | ||
| 179 | ; Else | ||
| 180 | ; Restore character | ||
| 181 | ; exit. | ||
| 182 | ; | ||
| 183 | ; IS_DIGIT: | ||
| 184 | ; --------- If Character >=0 and <=9 then | ||
| 185 | ; turn Z-flag on | ||
| 186 | ; | ||
| 187 | ; IS_DELIMITER: | ||
| 188 | ; ------------- | ||
| 189 | ; If character a dos delimiter (' ','=',',',';',TAB) | ||
| 190 | ; then turn Z-flag on | ||
| 191 | ; | ||
| 192 | ; DEVICE_PARSE: | ||
| 193 | ; ------------- | ||
| 194 | ; Set device name length counter. | ||
| 195 | ; Loop | ||
| 196 | ; If a dos delimiter then | ||
| 197 | ; add spaces to name (if require) | ||
| 198 | ; Else if char is ALPHA-NUM then | ||
| 199 | ; save in table | ||
| 200 | ; If name >8 character thne | ||
| 201 | ; error; exit | ||
| 202 | ; Else | ||
| 203 | ; error; exit | ||
| 204 | ; | ||
| 205 | ; ID_PARSE: | ||
| 206 | ; --------- Set id name length counter. | ||
| 207 | ; Loop | ||
| 208 | ; If a dos delimiter then | ||
| 209 | ; add spaces to name (if require) | ||
| 210 | ; Else if char is ALPHA-NUM then | ||
| 211 | ; save in table | ||
| 212 | ; If name >8 character then | ||
| 213 | ; error; exit | ||
| 214 | ; Else if char is ')' or '(' then | ||
| 215 | ; set flags | ||
| 216 | ; Else | ||
| 217 | ; error; exit | ||
| 218 | ; | ||
| 219 | ; HWCP_PARMS: | ||
| 220 | ; ----------- | ||
| 221 | ; Loop: Set flags off | ||
| 222 | ; If char is a DIGIT then | ||
| 223 | ; convert number to binary | ||
| 224 | ; update table | ||
| 225 | ; Else if char is ',' then | ||
| 226 | ; no HWCP was given | ||
| 227 | ; exit | ||
| 228 | ; Else if char is '(' then | ||
| 229 | ; assume multiple HWCP | ||
| 230 | ; Else if char is ')' then | ||
| 231 | ; end of parms, exit | ||
| 232 | ; Else if not a delimiter then | ||
| 233 | ; error, exit set carry flag set carry flag | ||
| 234 | ; Loop | ||
| 235 | ; | ||
| 236 | ; HWCP_PARSE: | ||
| 237 | ; ----------- Increment counter | ||
| 238 | ; Get number and convert to binary | ||
| 239 | ; Update the table | ||
| 240 | ; Set table_5 pointer | ||
| 241 | ; | ||
| 242 | ; MUL_HWCP: | ||
| 243 | ; --------- | ||
| 244 | ; Loop: If char is ')' then | ||
| 245 | ; end of list, exit | ||
| 246 | ; If char is a DIGIT | ||
| 247 | ; Get number and convert to binary | ||
| 248 | ; Update table. | ||
| 249 | ; If char is not a delimiter then | ||
| 250 | ; error, exit set carry flag | ||
| 251 | ; Loop | ||
| 252 | ; | ||
| 253 | ; DESG_PARMS: | ||
| 254 | ; ----------- | ||
| 255 | ; Loop: If char is a DIGIT then | ||
| 256 | ; Get number and convert to binary | ||
| 257 | ; Update table. | ||
| 258 | ; If char is a ')' then | ||
| 259 | ; end of parms, exit | ||
| 260 | ; If char is a '(' then | ||
| 261 | ; assume given desg. and font | ||
| 262 | ; If char is a ',' then | ||
| 263 | ; no desg ginven | ||
| 264 | ; scane for ')' | ||
| 265 | ; If char is not a delimiter then | ||
| 266 | ; error, exit set carry flag | ||
| 267 | ; Loop | ||
| 268 | ; | ||
| 269 | ; DESG_FONT: | ||
| 270 | ; ---------- | ||
| 271 | ; Loop: If char is a ',' then | ||
| 272 | ; no desg number was given | ||
| 273 | ; update table | ||
| 274 | ; If char is a ')' then | ||
| 275 | ; end of desg-font pair, exit | ||
| 276 | ; If char is a DIGIT then | ||
| 277 | ; Get number and convert to binary | ||
| 278 | ; Update table | ||
| 279 | ; If char not a delimiter then | ||
| 280 | ; error, exit set carry flag | ||
| 281 | ; Loop | ||
| 282 | ; | ||
| 283 | ; DESG_PARSE: | ||
| 284 | ; ----------- Get number and conver to binary | ||
| 285 | ; Update table | ||
| 286 | ; | ||
| 287 | ; GET_NUMBER: | ||
| 288 | ; ----------- Get ASCII number from parms | ||
| 289 | ; conver to binary | ||
| 290 | ; add to total | ||
| 291 | ; | ||
| 292 | ; OFFSET_TABLE: | ||
| 293 | ; ------------- | ||
| 294 | ; Increment the number of parms | ||
| 295 | ; | ||
| 296 | ; FIND_RIGHT_BR: | ||
| 297 | ; -------------- | ||
| 298 | ; Loop: If char is ')' then | ||
| 299 | ; found bracket exit | ||
| 300 | ; If char is not ' ' then | ||
| 301 | ; error, exit set carry flag | ||
| 302 | ; Loop | ||
| 303 | ; END | ||
| 304 | ;------------------------------------------------------ | ||
| 305 | ; | ||
| 306 | ; The following is the table structure of the parser. All fields are | ||
| 307 | ; two bytes field (accept for the device and id name) | ||
| 308 | ; | ||
| 309 | ; TABLE HEADER : | ||
| 310 | ; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ | ||
| 311 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 312 | ; ³ N = Number of devices. ³ | ||
| 313 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 314 | ; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 315 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ | ||
| 316 | ; ³ Device # 2 offset ³ ³ Table_1 (a) ³ | ||
| 317 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ | ||
| 318 | ; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 319 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 320 | ; ³ Device # 4 offset ³ | ||
| 321 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 322 | ; | ||
| 323 | ; | ||
| 324 | ; N = 1,2,3 or 4. A two bytes number indicating the number of device specified. | ||
| 325 | ; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset | ||
| 326 | ; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1 | ||
| 327 | ; (b)...etc.). If an error was detected in the command N is set to zero. | ||
| 328 | ; | ||
| 329 | ; | ||
| 330 | ; | ||
| 331 | ; TABLE_1 : | ||
| 332 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 333 | ; | ||
| 334 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 335 | ; ³ N = Number of Offsets. ³ ³ ³ | ||
| 336 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³ | ||
| 337 | ; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³ | ||
| 338 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 339 | ; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿ | ||
| 340 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 341 | ; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³ | ||
| 342 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³ | ||
| 343 | ; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³ | ||
| 344 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 345 | ; ³ "Reserved" ³ ³ ³ | ||
| 346 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 347 | ; ³ ³ ³ ³ | ||
| 348 | ; ³ ÀÄÄÄÄÄij Table_4 (a) ³ | ||
| 349 | ; ³ ³ ³ | ||
| 350 | ; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 351 | ; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 352 | ; ³ ³ ³ | ||
| 353 | ; ÀÄÄÄÄÄÄÄij Table_5 (a) ³ | ||
| 354 | ; ³ ³ | ||
| 355 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 356 | ; | ||
| 357 | ; | ||
| 358 | ; N=Length of table_1, or the number of offsets contained in table_1. | ||
| 359 | ; The offsets are pointers (two bytes) to the parameters value of the device. | ||
| 360 | ; "Reserved" : a two byte memory reserved for future use of the "PARMS" option. | ||
| 361 | ; | ||
| 362 | ; | ||
| 363 | ; TABLE_2 : | ||
| 364 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 365 | ; | ||
| 366 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 367 | ; ³ N = Length of devices name ³ | ||
| 368 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 369 | ; ³ Device name ³ | ||
| 370 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 371 | ; | ||
| 372 | ; N = Length of device name. Device length is always 8 byte long. | ||
| 373 | ; Device Name : the name of the device (eg. LPT1, CON, PRN). The name | ||
| 374 | ; is paded with spaces to make up the rest of the 8 characters. | ||
| 375 | ; | ||
| 376 | ; | ||
| 377 | ; | ||
| 378 | ; TABLE_3 : | ||
| 379 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 380 | ; | ||
| 381 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 382 | ; ³ N = Length of Id name. ³ | ||
| 383 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 384 | ; ³ Id Name ³ | ||
| 385 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 386 | ; | ||
| 387 | ; N = Length of id name. Id name length is always 8 byte long. | ||
| 388 | ; Id Name : the name of the id (eg. EGA, VGA, 3812). The name | ||
| 389 | ; is paded with spaces to make up the rest of the 8 character. | ||
| 390 | ; | ||
| 391 | ; | ||
| 392 | ; | ||
| 393 | ; TABLE_4 : | ||
| 394 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 395 | ; | ||
| 396 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 397 | ; ³ N = Length of table. ³ | ||
| 398 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 399 | ; ³ HWCP # 1 ³ | ||
| 400 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 401 | ; ³ HWCP # 2 ³ | ||
| 402 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 403 | ; ³ . ³ | ||
| 404 | ; ³ . ³ | ||
| 405 | ; ³ . ³ | ||
| 406 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 407 | ; ³ HWCP # 10 ³ | ||
| 408 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 409 | ; | ||
| 410 | ; | ||
| 411 | ; N = Length of table in words. Or the number of HWCP's. | ||
| 412 | ; HWCP # N : a hardware code page number converted to binary. The maximum | ||
| 413 | ; number of pages allowed is 10. | ||
| 414 | ; | ||
| 415 | ; | ||
| 416 | ; | ||
| 417 | ; TABLE_5 : | ||
| 418 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 419 | ; | ||
| 420 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 421 | ; ³ N = Length of table. ³ | ||
| 422 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 423 | ; ³ Designate ³ | ||
| 424 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 425 | ; ³ Font ³ | ||
| 426 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 427 | ; | ||
| 428 | ; N = Lenght of table. 0 - nothing was specified | ||
| 429 | ; 1 - Only a designate was specified. | ||
| 430 | ; 2 - Designate and font were given. If the Desg field | ||
| 431 | ; was left empty in the DEVICE command then the | ||
| 432 | ; Designate field is filled with 0FFFFH. | ||
| 433 | ; Designate, Font : Are the Desg. and Font binary numbers. | ||
| 434 | ; | ||
| 435 | ;------------------------------------------------------ | ||
| 436 | ; | ||
| 437 | |||
| 438 | ;RESERVED MEMORY: | ||
| 439 | TABLE_1 DW ? ; Pointer at offsets. | ||
| 440 | TABLE_2 DW ? ; Pointer at device name. | ||
| 441 | TABLE_3 DW ? ; Pointer at id name. | ||
| 442 | TABLE_4 DW ? ; Pointer at hwcp. | ||
| 443 | TABLE_5 DW ? ; Pointer at desg and font. | ||
| 444 | ;TABLE DB 290 DUP (?) ; Table of parsed parms. Max 4 devices. | ||
| 445 | DEVNUM DW ? ; Counter to number of devices. | ||
| 446 | RIGHT_FLAG DB ? ; Flag to indicate a left bracket. | ||
| 447 | DEV_ERR_FLG DB ? ; Device name error flag. | ||
| 448 | ID_ERR_FLG DB ? ; Id name error flag. | ||
| 449 | ERROR_FLAG DB ? ; Error flag_terminate program if set to 1. | ||
| 450 | COMMA_FLAG DB ? ; Indicate the number of commas incounterd. | ||
| 451 | HWCP_FLAG DB ? ; Flag for multiple hwcps. | ||
| 452 | DESG_FLAG DB ? ; Flag indicates desg. and font. | ||
| 453 | |||
| 454 | ;Main part of program-links different sumbroutines together | ||
| 455 | |||
| 456 | PARSER PROC | ||
| 457 | |||
| 458 | PUSH AX ; ;;;;;;;;;;;;;;;;;; | ||
| 459 | PUSH BX ; ; | ||
| 460 | PUSH CX ; ; SAVE | ||
| 461 | PUSH DX ; ; ALL | ||
| 462 | PUSH DS ; ; REGISTERS. | ||
| 463 | PUSH ES ; ; | ||
| 464 | PUSH DI ; ; | ||
| 465 | PUSH SI ; ;;;;;;;;;;;;;;;;;; | ||
| 466 | |||
| 467 | LES SI,RH.RH0_BPBA ; Point at all after DEVICE= | ||
| 468 | ; in the CONFIG.SYS file. | ||
| 469 | |||
| 470 | |||
| 471 | ;Skip to end of file name, to the first DOS delimiter. | ||
| 472 | |||
| 473 | MOV DEVNUM,02H ; Number of devices counter. | ||
| 474 | |||
| 475 | GET_PARMS_A: CALL GET_CHAR ; Get command character in AL . | ||
| 476 | JZ EXIT_B ; No parms found. | ||
| 477 | CALL IS_DELIM ; If not a delimiter then. | ||
| 478 | JNE GET_PARMS_A ; Check next character. | ||
| 479 | |||
| 480 | MOV DI,OFFSET TABLE ; Get the table address. | ||
| 481 | ADD DI,02H ; Point at devices offsets. | ||
| 482 | MOV BX,DI ; | ||
| 483 | ADD BX,08H ; Point BX at parms offsets. | ||
| 484 | TAB2: CALL UPDATE_TABLE ; Update table pointers value. | ||
| 485 | |||
| 486 | CLR_DELIM: CALL GET_CHAR ; Get character into AL. | ||
| 487 | JZ EXIT_B ; No parms found. | ||
| 488 | CALL IS_ALPHA ; If alpha then assume. | ||
| 489 | JZ DEVICE ; A device name. | ||
| 490 | CALL IS_DELIM ; Is it a delimiter | ||
| 491 | JNE EXIT_A ; If not then error. | ||
| 492 | JMP CLR_DELIM ; Get next character. | ||
| 493 | |||
| 494 | DEVICE: MOV DEV_ERR_FLG,00H ; Set device error flag off; | ||
| 495 | CALL DEVICE_PARSE ; Call routine to parse device name. | ||
| 496 | CMP DEV_ERR_FLG,01H ; If error flag is | ||
| 497 | JZ EXIT_A ; set then exit. | ||
| 498 | CALL OFFSET_TABLE ; Update table. | ||
| 499 | |||
| 500 | ID_PARMS: CALL GET_CHAR ; Load a character in AL. | ||
| 501 | JZ EXIT_A ; Exit if end of line (error). | ||
| 502 | CMP AL,'(' ; If AL is a '(' then | ||
| 503 | JE ID ; Parse ID name. | ||
| 504 | CALL IS_ALPHA ; If an Alpha | ||
| 505 | JE ID ; Then parse ID name. | ||
| 506 | CALL IS_DIGIT ; If a digit | ||
| 507 | JE ID ; Then parse ID name. | ||
| 508 | CALL IS_DELIM ; If not a delimiter | ||
| 509 | JNE EXIT_A ; Then error, exit | ||
| 510 | JMP ID_PARMS ; Get another number | ||
| 511 | |||
| 512 | EXIT_B: CMP DEVNUM,02H ; If device number above 2 then | ||
| 513 | JA EXIT_C ; Exit parse. | ||
| 514 | JMP EXIT_A ; Else error, exit | ||
| 515 | |||
| 516 | ID: MOV ID_ERR_FLG,00H ; Set id error flag off. | ||
| 517 | CALL ID_PARSE ; Parse ID name. | ||
| 518 | CMP ID_ERR_FLG,01H ; Was error flag set, then | ||
| 519 | JE EXIT_A ; Print error message. | ||
| 520 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 521 | |||
| 522 | CALL HWCP_PARMS ; Get code page number | ||
| 523 | CMP ERROR_FLAG,01H ; If error, then | ||
| 524 | JE EXIT_A ; Print error message and exit | ||
| 525 | CMP ERROR_FLAG,02H ; If end of string | ||
| 526 | JE EXIT_H ; Then exit. | ||
| 527 | |||
| 528 | CALL DESG_PARMS ; Get designate number | ||
| 529 | CMP ERROR_FLAG,01H ; If error, then | ||
| 530 | JE EXIT_A ; Print error message and exit | ||
| 531 | JMP EXIT_H ; Then exit. | ||
| 532 | |||
| 533 | EXIT_A: MOV DI,OFFSET TABLE ; Load table offset | ||
| 534 | MOV DS:WORD PTR [DI],00H ; Set error to on. | ||
| 535 | STC ; Set carry flag | ||
| 536 | JMP EXIT_P ; Exit parse. | ||
| 537 | |||
| 538 | EXIT_H: MOV DI,OFFSET TABLE ; Load table offset. | ||
| 539 | ADD DS:WORD PTR [DI],01H ; Increment number of devices. | ||
| 540 | CMP DEVNUM,08H ; If 4 devices loaded | ||
| 541 | JE EXIT_C ; Then exit parse. | ||
| 542 | ADD DEVNUM,02H ; Increment the number of devices | ||
| 543 | ADD DI,DEVNUM ; Point at next devices offset. | ||
| 544 | MOV BX,TABLE_5 ; BX point at | ||
| 545 | ADD BX,06H ; end of previous table. | ||
| 546 | JMP TAB2 ; Get next device. | ||
| 547 | |||
| 548 | EXIT_C: CLC | ||
| 549 | |||
| 550 | EXIT_P: POP SI ; ;;;;;;;;;;;;;;;;;; | ||
| 551 | POP DI ; ; | ||
| 552 | POP ES ; ; RESTORE | ||
| 553 | POP DS ; ; ALL | ||
| 554 | POP DX ; ; REGISTERS. | ||
| 555 | POP CX ; ; | ||
| 556 | POP BX ; ; | ||
| 557 | POP AX ; ;;;;;;;;;;;;;;;;;; | ||
| 558 | RET | ||
| 559 | |||
| 560 | PARSER ENDP | ||
| 561 | |||
| 562 | |||
| 563 | ;******************************************************** | ||
| 564 | ;** GET_CHAR : a routine to get next character pointed ** | ||
| 565 | ;** to by ES:SI into AL. ** | ||
| 566 | ;******************************************************** | ||
| 567 | |||
| 568 | GET_CHAR PROC | ||
| 569 | |||
| 570 | MOV AL,ES:BYTE PTR [SI] ; Load character pointed to | ||
| 571 | CMP AL,09H ; by ES:[SI] in AL. | ||
| 572 | JE ZOFF ; If tab then O.K | ||
| 573 | CMP AL,20H ; Turn Z-flag on | ||
| 574 | JL TURN_Z_ON ; if character | ||
| 575 | ZOFF: INC SI ; is below | ||
| 576 | JMP GET_CHAR_X ; 20h. | ||
| 577 | ; ( End of line | ||
| 578 | TURN_Z_ON: CMP AL,AL ; delimiters ). | ||
| 579 | GET_CHAR_X: RET | ||
| 580 | |||
| 581 | GET_CHAR ENDP | ||
| 582 | |||
| 583 | |||
| 584 | ;******************************************************** | ||
| 585 | ;** IS_ALPHA : a routine to check the character in ** | ||
| 586 | ;** AL if it is an alpha character (a...z,A...Z). ** | ||
| 587 | ;** If character is lower case, convert to upper case. ** | ||
| 588 | ;******************************************************** | ||
| 589 | |||
| 590 | IS_ALPHA PROC | ||
| 591 | |||
| 592 | PUSH AX ; Save value of AL | ||
| 593 | AND AL,0DFH ; Convert to upper case | ||
| 594 | CMP AL,'A' ; If <'A', then | ||
| 595 | JB IS_ALPHA_X ; NZ-flag is set, exit | ||
| 596 | CMP AL,'Z' ; If >'Z', then | ||
| 597 | JA IS_ALPHA_X ; NZ-flag is set, exit | ||
| 598 | CMP AL,AL ; Force Z-flag | ||
| 599 | POP DX ; Discard lower case. | ||
| 600 | JMP IA_X ; Exit. | ||
| 601 | IS_ALPHA_X: POP AX ; Restore value of AL | ||
| 602 | IA_X: RET | ||
| 603 | |||
| 604 | IS_ALPHA ENDP | ||
| 605 | |||
| 606 | |||
| 607 | ;******************************************************** | ||
| 608 | ;** IS_DIGIT : a routine to check if the character in ** | ||
| 609 | ;** AL register is a digit (i.e. 1..9). ** | ||
| 610 | ;******************************************************** | ||
| 611 | |||
| 612 | IS_DIGIT PROC | ||
| 613 | |||
| 614 | CMP AL,'0' ; If < '0' then | ||
| 615 | JB IS_NUM_X ; NZ-flag is set, exit | ||
| 616 | CMP AL,'9' ; If > '9' then | ||
| 617 | JA IS_NUM_X ; NZ-flag is set, exit | ||
| 618 | CMP AL,AL ; Set Z-flag to indecate digit | ||
| 619 | IS_NUM_X: RET | ||
| 620 | |||
| 621 | IS_DIGIT ENDP | ||
| 622 | |||
| 623 | |||
| 624 | ;******************************************************** | ||
| 625 | ;** IS_DELIM : This routine check if the character in ** | ||
| 626 | ;** AL is a delimiter. ('+',' ',';',',','=',tab) ** | ||
| 627 | ;******************************************************** | ||
| 628 | |||
| 629 | IS_DELIM PROC | ||
| 630 | |||
| 631 | CMP AL,' ' ; Test for space. | ||
| 632 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 633 | CMP AL,',' ; Test for comma. | ||
| 634 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 635 | CMP AL,';' ; Test for semicolon. | ||
| 636 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 637 | CMP AL,'=' ; Test for equal sign. | ||
| 638 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 639 | CMP AL,09h ; Test for TAB. | ||
| 640 | |||
| 641 | IS_DELIM_X: RET ; Exit | ||
| 642 | |||
| 643 | IS_DELIM ENDP | ||
| 644 | |||
| 645 | |||
| 646 | ;******************************************************** | ||
| 647 | ;** DEVICE_PARSE : Parse the device driver name and ** | ||
| 648 | ;** store in table. Update offset. ** | ||
| 649 | ;******************************************************** | ||
| 650 | |||
| 651 | DEVICE_PARSE PROC | ||
| 652 | |||
| 653 | MOV DI,TABLE_2 | ||
| 654 | MOV DS:WORD PTR [DI],0008H ; Save dev name size. | ||
| 655 | ADD DI,02H ; Increment DI. | ||
| 656 | MOV CX,9 ; Set counter. | ||
| 657 | NEXT_C: CALL IS_ALPHA ; if Check then. | ||
| 658 | JZ SAVE_C ; Save it. | ||
| 659 | CALL IS_DIGIT ; if Digit then. | ||
| 660 | JZ SAVE_C ; Save it. | ||
| 661 | CMP AL,'-' ; If '-' then. | ||
| 662 | JZ SAVE_C ; Save it. | ||
| 663 | CALL IS_DELIM ; If a delimiter then. | ||
| 664 | JZ ADD_SPACE1 ; Pad with spaces. | ||
| 665 | CMP AL,':' ; If a colon | ||
| 666 | JE ADD_SPACE1 ; then end device parse | ||
| 667 | JMP ERR_DEV_PAR ; Else an error. | ||
| 668 | |||
| 669 | SAVE_C: DEC CX ; Decrement counter. | ||
| 670 | CMP CX,0 ; If counter zero then. | ||
| 671 | JE ERR_DEV_PAR ; Error. | ||
| 672 | MOV DS:BYTE PTR [DI],AL ; Save char in table. | ||
| 673 | INC DI ; Increment pointer. | ||
| 674 | CALL GET_CHAR ; Get another char. | ||
| 675 | JZ ERR_DEV_PAR | ||
| 676 | JMP NEXT_C ; Check char. | ||
| 677 | |||
| 678 | ERR_DEV_PAR: MOV DEV_ERR_FLG,01H ; Set error flag. | ||
| 679 | JMP DEV_PAR_X ; Exit. | ||
| 680 | |||
| 681 | ADD_SPACE1: DEC CX ; Check counter. | ||
| 682 | CMP CX,1 | ||
| 683 | JL DEV_PAR_X ; Exit if already 8. | ||
| 684 | LL1: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. | ||
| 685 | INC DI ; Increment pointer. | ||
| 686 | LOOP LL1 ; Loop again. | ||
| 687 | DEV_PAR_X: RET | ||
| 688 | |||
| 689 | DEVICE_PARSE ENDP | ||
| 690 | |||
| 691 | |||
| 692 | ;******************************************************** | ||
| 693 | ;** ID_PARSE : Parse the id driver name and ** | ||
| 694 | ;** store in table. Update offset. ** | ||
| 695 | ;******************************************************** | ||
| 696 | |||
| 697 | ID_PARSE PROC | ||
| 698 | |||
| 699 | MOV DI,TABLE_3 | ||
| 700 | MOV DS:WORD PTR [DI],0008H ; Save dev name size. | ||
| 701 | ADD DI,02H ; Increment DI. | ||
| 702 | MOV RIGHT_FLAG,00H ; Clear flag. | ||
| 703 | MOV CX,9 ; Set counter. | ||
| 704 | |||
| 705 | NEXT_I: CALL IS_ALPHA ; If Check then. | ||
| 706 | JZ SAVE_I ; Save it. | ||
| 707 | CALL IS_DIGIT ; if Digit then. | ||
| 708 | JZ SAVE_I ; Save it. | ||
| 709 | CMP AL,'-' ; If '-' then. | ||
| 710 | JZ SAVE_I ; Save it. | ||
| 711 | CMP AL,'(' ; If '(' then. | ||
| 712 | JE RIG_BR_FLG ; Set flag. | ||
| 713 | CMP AL,')' ; If ')' then | ||
| 714 | JE BR_FLG_LEF ; Pad with spaces. | ||
| 715 | CALL IS_DELIM ; If a delimiter then. | ||
| 716 | JZ ADD_SPACE2 ; Pad with spaces. | ||
| 717 | JMP ERR_ID_PAR ; Else an error. | ||
| 718 | |||
| 719 | SAVE_I: DEC CX ; Decrement counter. | ||
| 720 | CMP CX,0 ; If counter zero then. | ||
| 721 | JLE ERR_ID_PAR ; Error. | ||
| 722 | MOV DS:BYTE PTR [DI],AL ; Save char in table. | ||
| 723 | INC DI ; Increment pointer. | ||
| 724 | CALL GET_CHAR ; Get another char. | ||
| 725 | JZ ADD_SPACE2 ; Exit routine. | ||
| 726 | JMP NEXT_I ; Check char. | ||
| 727 | |||
| 728 | ERR_ID_PAR: MOV ID_ERR_FLG,01H ; Set error falg on. | ||
| 729 | JMP ID_PAR_X ; Exit. | ||
| 730 | |||
| 731 | BR_FLG_LEF: CMP RIGHT_FLAG,01H ; If left bracket was | ||
| 732 | JNE ERR_ID_PAR ; found and no previous | ||
| 733 | JMP ADD_SPACE2 ; Bracket found, then error | ||
| 734 | |||
| 735 | RIG_BR_FLG: CMP RIGHT_FLAG,01H ; If more than one bracket | ||
| 736 | JE ERR_ID_PAR ; then error. | ||
| 737 | CMP CX,09 ; If '(' and already id | ||
| 738 | JB ERR_ID_PAR ; then error. | ||
| 739 | MOV RIGHT_FLAG,01H ; Set flag for. | ||
| 740 | CALL GET_CHAR ; Left brackets. | ||
| 741 | JZ ERR_ID_PAR ; If end of line,exit. | ||
| 742 | JMP NEXT_I ; Check character. | ||
| 743 | |||
| 744 | ADD_SPACE2: DEC CX ; Check counter. | ||
| 745 | CMP CX,1 | ||
| 746 | JL ID_PAR_X ; Exit if already 8. | ||
| 747 | |||
| 748 | LL2: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. | ||
| 749 | INC DI ; Increment pointer. | ||
| 750 | LOOP LL2 ; Loop again. | ||
| 751 | |||
| 752 | ID_PAR_X: RET | ||
| 753 | |||
| 754 | ID_PARSE ENDP | ||
| 755 | |||
| 756 | ;******************************************************** | ||
| 757 | ;** HWCP_PARMS : Scane for the hardware code page, and ** | ||
| 758 | ;** parse it if found. Flag codes set to: ** | ||
| 759 | ;** ERROR_FLAG = 0 - parsing completed. No error. ** | ||
| 760 | ;** ERROR_FLAG = 1 - error found exit parse. ** | ||
| 761 | ;** ERROR_FLAG = 2 - end of line found, exit parse. ** | ||
| 762 | ;******************************************************** | ||
| 763 | |||
| 764 | |||
| 765 | HWCP_PARMS PROC | ||
| 766 | |||
| 767 | MOV COMMA_FLAG,00H ; Set the comma flag off. | ||
| 768 | MOV ERROR_FLAG,00H ; Set the error flag off. | ||
| 769 | DEC SI ; Point at current char in Al. | ||
| 770 | CMP RIGHT_FLAG,01H ; If no left brackets then | ||
| 771 | JNE LEFT_BR ; Exit parse. | ||
| 772 | |||
| 773 | HWCP_1: CALL GET_CHAR ; Load character in AL. | ||
| 774 | JZ LEFT_BR ; Exit, if end of line. | ||
| 775 | CALL IS_DIGIT ; Check if digit, then | ||
| 776 | JE HP1 ; Parse hwcp parms. | ||
| 777 | CMP AL,',' ; If a comma | ||
| 778 | JE COMMA_1 ; Jump to comma_1 | ||
| 779 | CMP AL,')' ; If a ')' then | ||
| 780 | JE RIGHT_BR ; end of current dev parms. | ||
| 781 | CMP AL,'(' ; If a '(' then | ||
| 782 | JE HWCP_2 ; There are multible hwcp. | ||
| 783 | CALL IS_DELIM ; Else, if not a delimiter | ||
| 784 | JNE EXIT_2 ; Then error, exit | ||
| 785 | JMP HWCP_1 ; Get another character. | ||
| 786 | |||
| 787 | LEFT_BR: CMP RIGHT_FLAG,01H ; If no left bracket | ||
| 788 | JE EXIT_2 ; Then error, exit | ||
| 789 | JMP RB1 ; Jump to rb1 | ||
| 790 | |||
| 791 | COMMA_1: CMP COMMA_FLAG,01H ; If comma flag set | ||
| 792 | JE COM_2_HC ; Then exit hwcp parse. | ||
| 793 | MOV COMMA_FLAG,01H ; Else set comma flag. | ||
| 794 | JMP HWCP_1 ; Get another character. | ||
| 795 | |||
| 796 | HWCP_2: CMP RIGHT_FLAG,01H ; If left bracket not set | ||
| 797 | JNE EXIT_2 ; then error. | ||
| 798 | CALL MUL_HWCP ; else call multiple hwcp | ||
| 799 | ADD DI,02H ; routine. Increment DI | ||
| 800 | MOV TABLE_5,DI ; Desg. Table starts at end | ||
| 801 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 802 | JMP HP_X ; Exit. | ||
| 803 | |||
| 804 | HP1: JMP HWCP ; Jump too long. | ||
| 805 | |||
| 806 | COM_2_HC: MOV DI,TABLE_4 ; DI points at hwcp table | ||
| 807 | MOV DS:WORD PTR [DI],0000H ; Set number of pages to | ||
| 808 | MOV COMMA_FLAG,00H ; Zero and reset comma flag. | ||
| 809 | ADD DI,02H ; Increment DI. | ||
| 810 | MOV TABLE_5,DI ; Desg. Table starts at end | ||
| 811 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 812 | JMP HP_X ; of hwcp table. Exit. | ||
| 813 | |||
| 814 | RIGHT_BR: CMP RIGHT_FLAG,01H ; If left brackets not | ||
| 815 | JNE EXIT_2 ; Found then error. | ||
| 816 | RB1: MOV ERROR_FLAG,02H ; Set end of line flag. | ||
| 817 | MOV BX,TABLE_4 ; Point at hwcp table | ||
| 818 | ADD BX,02H ; Adjust pointer to desg | ||
| 819 | MOV TABLE_5,BX ; table, and save in table_5 | ||
| 820 | MOV DI,TABLE_1 ; Point at table of offsets | ||
| 821 | ADD DI,08H ; Set at DESG offset | ||
| 822 | MOV DS:WORD PTR [DI],BX ; Update table. | ||
| 823 | JMP HP_X ; Exit | ||
| 824 | |||
| 825 | |||
| 826 | |||
| 827 | EXIT_2: MOV ERROR_FLAG,01H ; Set error flag. | ||
| 828 | JMP HP_X ; and exit. | ||
| 829 | |||
| 830 | HWCP: CMP RIGHT_FLAG,01H ; If left brackets not | ||
| 831 | JNE EXIT_2 ; Found then error. | ||
| 832 | CALL HWCP_PARSE ; Call parse one hwcp. | ||
| 833 | CMP ERROR_FLAG,01H ; If error flag set | ||
| 834 | JE HP_X ; Then exit, else | ||
| 835 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 836 | |||
| 837 | HP_X: RET | ||
| 838 | |||
| 839 | HWCP_PARMS ENDP | ||
| 840 | |||
| 841 | |||
| 842 | ;******************************************************** | ||
| 843 | ;** HWCP_PARSE : Parse the hardware code page page ** | ||
| 844 | ;** number and change it from hex to binary. ** | ||
| 845 | ;******************************************************** | ||
| 846 | |||
| 847 | HWCP_PARSE PROC | ||
| 848 | |||
| 849 | MOV DI,TABLE_4 ; Load address of hwcpages. | ||
| 850 | ADD DS:WORD PTR [DI],0001H ; Set count to 1 | ||
| 851 | |||
| 852 | CALL GET_NUMBER ; Convert number to binary. | ||
| 853 | CMP ERROR_FLAG,01H ; If error then | ||
| 854 | JE HWCP_X ; Exit. | ||
| 855 | MOV DS:WORD PTR [DI+2],BX ; Else, save binary page number | ||
| 856 | ADD DI,04H ; Increment counter | ||
| 857 | MOV TABLE_5,DI ; Set pointer of designate num | ||
| 858 | |||
| 859 | HWCP_X: RET | ||
| 860 | |||
| 861 | HWCP_PARSE ENDP | ||
| 862 | |||
| 863 | |||
| 864 | ;******************************************************** | ||
| 865 | ;** MUL_HWCP : Parse multiple hardware code pages ** | ||
| 866 | ;** and convert them from hex to binary numbers. ** | ||
| 867 | ;******************************************************** | ||
| 868 | |||
| 869 | MUL_HWCP PROC | ||
| 870 | |||
| 871 | MOV DI,TABLE_4 ; Load offset of table_4 | ||
| 872 | MOV BX,DI ; in DI and Bx. | ||
| 873 | MOV HWCP_FLAG,00H ; Set hwcp flag off. | ||
| 874 | |||
| 875 | MH1: CALL GET_CHAR ; Load character in AL. | ||
| 876 | JZ MH3 ; Exit if end of line. | ||
| 877 | CMP AL,')' ; If ')' then exit | ||
| 878 | JE MH2 ; end of parms. | ||
| 879 | CALL IS_DIGIT ; If a digit, then | ||
| 880 | JE MH4 ; Convert number to binary. | ||
| 881 | CALL IS_DELIM ; If not a delimiter | ||
| 882 | JNE MH3 ; then error, exit | ||
| 883 | JMP MH1 ; get another character. | ||
| 884 | |||
| 885 | MH2: CALL GET_CHAR ; Get next character | ||
| 886 | JMP MH_X ; and exit. | ||
| 887 | |||
| 888 | MH3: MOV ERROR_FLAG,01H ; Set error flag on. | ||
| 889 | JMP MH_X ; Exit. | ||
| 890 | |||
| 891 | MH4: ADD HWCP_FLAG,01H ; Set hwcp flag on (0 off) | ||
| 892 | ADD DI,02H ; Increment table pointer | ||
| 893 | PUSH BX ; Save Bx | ||
| 894 | CALL GET_NUMBER ; Convert number to binary. | ||
| 895 | MOV DS:WORD PTR [DI],BX ; Add number to table | ||
| 896 | POP BX ; Restore BX. | ||
| 897 | CMP ERROR_FLAG,01H ; If error then | ||
| 898 | JE MH_X ; Exit. | ||
| 899 | ADD DS:WORD PTR [BX],01H ; Increment hwcp count. | ||
| 900 | DEC SI ; Point at character in AL | ||
| 901 | JMP MH1 ; (delimeter or ')'). | ||
| 902 | MH_X: RET | ||
| 903 | |||
| 904 | MUL_HWCP ENDP | ||
| 905 | |||
| 906 | |||
| 907 | |||
| 908 | ;******************************************************** | ||
| 909 | ;** DESG_PARMS : Scane for the designate numbers, and ** | ||
| 910 | ;** parse it if found. Flag codes set to: ** | ||
| 911 | ;** ERROR_FLAG = 0 - parsing completed. No error. ** | ||
| 912 | ;** ERROR_FLAG = 1 - error found exit parse. ** | ||
| 913 | ;** ERROR_FLAG = 2 - end of line found, exit parse. ** | ||
| 914 | ;******************************************************** | ||
| 915 | |||
| 916 | |||
| 917 | DESG_PARMS PROC | ||
| 918 | |||
| 919 | MOV DI,TABLE_1 ; Get offset of dev in DI | ||
| 920 | MOV BX,TABLE_5 ; & offset of desg. in BX. | ||
| 921 | ADD DI,08 ; Location of desg offset in table. | ||
| 922 | MOV DS:WORD PTR [DI],BX ; Update table. | ||
| 923 | MOV COMMA_FLAG,00H ; Set comma flag off. | ||
| 924 | |||
| 925 | cmp al,'(' | ||
| 926 | je df | ||
| 927 | cmp al,')' | ||
| 928 | je right_br2 | ||
| 929 | |||
| 930 | cmp al,',' | ||
| 931 | jne desg_parm1 | ||
| 932 | mov comma_flag,01h | ||
| 933 | |||
| 934 | DESG_PARM1: CALL GET_CHAR ; Get character in AL. | ||
| 935 | JZ EXIT_3 ; Error, if end of line | ||
| 936 | CALL IS_DIGIT ; If character is a digit | ||
| 937 | JE DESG ; Then convert to binary. | ||
| 938 | CMP AL,')' ; If a ')', then | ||
| 939 | JE RIGHT_BR2 ; end of parameters. | ||
| 940 | CMP AL,'(' ; If a '(' then | ||
| 941 | JE DF ; parse desg and font. | ||
| 942 | CMP AL,',' ; If a comma then | ||
| 943 | JE DP3 ; set flag. | ||
| 944 | CALL IS_DELIM ; If not a delimiter | ||
| 945 | JNE EXIT_3 ; then error. | ||
| 946 | JMP DESG_PARM1 ; Get another character. | ||
| 947 | |||
| 948 | RIGHT_BR2: CMP RIGHT_FLAG,01H ; IF no '(' encountered, | ||
| 949 | JNE EXIT_3 ; then error, exit | ||
| 950 | JMP DP_x ; Jump to DP1. | ||
| 951 | |||
| 952 | EXIT_3: MOV ERROR_FLAG,01H ; Set error flag on | ||
| 953 | JMP DP_X ; Exit. | ||
| 954 | |||
| 955 | DF: CMP RIGHT_FLAG,01H ; If no '(' encountered | ||
| 956 | JB EXIT_3 ; then error, exit | ||
| 957 | CALL DESG_FONT ; Parse desg and font. | ||
| 958 | JMP DP1 ; Jump to DP1. | ||
| 959 | |||
| 960 | DP2: CALL FIND_RIGHT_BR ; Check for ')' | ||
| 961 | JMP DP_X ; Exit. | ||
| 962 | |||
| 963 | DP3: CMP COMMA_FLAG,01H ; If comma flag set | ||
| 964 | JE DP2 ; then error | ||
| 965 | MOV COMMA_FLAG,01H ; Else set comma flag on. | ||
| 966 | JMP DESG_PARM1 ; Get another character. | ||
| 967 | |||
| 968 | DESG: MOV ERROR_FLAG,00H ; Set error flag off. | ||
| 969 | CALL DESG_PARSE ; Parse desg. | ||
| 970 | DP1: CMP ERROR_FLAG,01H ; If error flag on then | ||
| 971 | JE DP_X ; Exit, | ||
| 972 | CALL FIND_RIGHT_BR ; Else check for ')' | ||
| 973 | CALL OFFSET_TABLE ; Update table | ||
| 974 | |||
| 975 | DP_X: RET | ||
| 976 | |||
| 977 | DESG_PARMS ENDP | ||
| 978 | |||
| 979 | |||
| 980 | |||
| 981 | ;******************************************************** | ||
| 982 | ;** DESG_FONT : Parse the designate and font numbers & ** | ||
| 983 | ;** change them from decimal to binary. ** | ||
| 984 | ;******************************************************** | ||
| 985 | |||
| 986 | |||
| 987 | DESG_FONT PROC | ||
| 988 | |||
| 989 | |||
| 990 | MOV DI,TABLE_5 ; Get desg font table. | ||
| 991 | MOV COMMA_FLAG,00H ; Set comma flag off. | ||
| 992 | DF1: CALL GET_CHAR ; Load a character in AL. | ||
| 993 | JZ DF3 ; Error if end of line. | ||
| 994 | CMP AL,',' ; Check if a comma. | ||
| 995 | JE DF2 ; Set flag. | ||
| 996 | CALL IS_DIGIT ; If a digit, then | ||
| 997 | JE DF5 ; Convert number to binary. | ||
| 998 | CMP AL,')' ; If a ')' then | ||
| 999 | JE DF4 ; Exit. | ||
| 1000 | CALL IS_DELIM ; If not a delimiter | ||
| 1001 | JNE DF3 ; then error, exit | ||
| 1002 | JMP DF1 ; Get another character. | ||
| 1003 | |||
| 1004 | DF2: CMP COMMA_FLAG,01H ; If comma flag on | ||
| 1005 | JE DF3 ; then error, exit | ||
| 1006 | MOV COMMA_FLAG,01H ; Set comma flag on | ||
| 1007 | ADD DS:WORD PTR [DI],01H ; Increment desg counter. | ||
| 1008 | MOV DS:WORD PTR [DI+2],0FFFFH ; Load ffffh for desg empty | ||
| 1009 | JMP DF1 ; field. | ||
| 1010 | |||
| 1011 | DF3: MOV ERROR_FLAG,01H ; Set error flag on. | ||
| 1012 | JMP DF_X ; Exit. | ||
| 1013 | |||
| 1014 | DF4: CMP DESG_FLAG,00H ; If desg flag off | ||
| 1015 | JE DF3 ; then error, exit | ||
| 1016 | JMP DF_X ; Else exit. | ||
| 1017 | |||
| 1018 | DF5: ADD DS:WORD PTR [DI],01H ; Increment desg font count. | ||
| 1019 | CMP DESG_FLAG,01H ; If desg flag is on | ||
| 1020 | JE DF6 ; then get font. | ||
| 1021 | CMP COMMA_FLAG,01H ; if comma flag is on | ||
| 1022 | JE DF6 ; then get font. | ||
| 1023 | MOV DESG_FLAG,01H ; Set desg flag on | ||
| 1024 | JMP DF7 ; Get desg number. | ||
| 1025 | |||
| 1026 | DF6: ADD DI,02H ; adjust pointer to font. | ||
| 1027 | MOV DESG_FLAG,02H ; Set desg and font flag. | ||
| 1028 | DF7: CALL GET_NUMBER ; Get a number & convert to | ||
| 1029 | CMP ERROR_FLAG,01H ; binary. | ||
| 1030 | JE DF_X ; If error flag set, Exit. | ||
| 1031 | MOV DS:WORD PTR [DI+2],BX ; Store number in table. | ||
| 1032 | CMP DESG_FLAG,02H ; If desg and font flag | ||
| 1033 | JNE DF1 ; not set, then get char. | ||
| 1034 | CALL FIND_RIGHT_BR ; Check for right bracket. | ||
| 1035 | |||
| 1036 | DF_X: RET | ||
| 1037 | |||
| 1038 | DESG_FONT ENDP | ||
| 1039 | |||
| 1040 | |||
| 1041 | ;******************************************************** | ||
| 1042 | ;** DESG_PARSE : Parse the designate number and ** | ||
| 1043 | ;** change it from decimal to binary. ** | ||
| 1044 | ;******************************************************** | ||
| 1045 | |||
| 1046 | DESG_PARSE PROC | ||
| 1047 | |||
| 1048 | MOV DI,TABLE_5 ; Load designate location | ||
| 1049 | ADD DS:WORD PTR [DI],0001H ; Update table count. | ||
| 1050 | |||
| 1051 | CALL GET_NUMBER ; Get the ascii number and | ||
| 1052 | CMP ERROR_FLAG,01H ; conver it to binary | ||
| 1053 | JE DESG_X ; If error then exit | ||
| 1054 | |||
| 1055 | MOV DS:WORD PTR [DI+2],BX ; Else, save desg number | ||
| 1056 | |||
| 1057 | |||
| 1058 | DESG_X: RET | ||
| 1059 | |||
| 1060 | DESG_PARSE ENDP | ||
| 1061 | |||
| 1062 | |||
| 1063 | ;******************************************************** | ||
| 1064 | ;** GET_NUMBER : Convert the number pointed to by SI ** | ||
| 1065 | ;** to a binary number and store it in BX ** | ||
| 1066 | ;******************************************************** | ||
| 1067 | |||
| 1068 | GET_NUMBER PROC | ||
| 1069 | |||
| 1070 | MOV CX,0AH ; Set multiplying factor | ||
| 1071 | XOR BX,BX ; Clear DX | ||
| 1072 | |||
| 1073 | NEXT_NUM: SUB AL,30H ; Conver number to binary | ||
| 1074 | CBW ; Clear AH | ||
| 1075 | XCHG AX,BX ; Switch ax and bx to mul | ||
| 1076 | MUL CX ; already converted number by 10. | ||
| 1077 | JO ERR_NUM ; On over flow jump to error. | ||
| 1078 | ADD BX,AX ; Add number to total. | ||
| 1079 | JC ERR_NUM ; On over flow jump to error. | ||
| 1080 | XOR AX,AX ; Clear AX (clear if al=0a). | ||
| 1081 | CALL GET_CHAR ; Get next character | ||
| 1082 | JZ GET_NUM_X ; Exit, if end of line. | ||
| 1083 | CALL IS_DIGIT ; Call is digit. | ||
| 1084 | JNZ GET_NUM_X ; Exit if not a number. | ||
| 1085 | JMP NEXT_NUM ; Loop. | ||
| 1086 | |||
| 1087 | ERR_NUM: MOV ERROR_FLAG,01H ; Set error code to 1. | ||
| 1088 | |||
| 1089 | GET_NUM_X: RET | ||
| 1090 | |||
| 1091 | GET_NUMBER ENDP | ||
| 1092 | |||
| 1093 | |||
| 1094 | ;******************************************************** | ||
| 1095 | ;** UPDATE_TABLE : This routine set up pointers to the ** | ||
| 1096 | ;** different offsets of the different tables ** | ||
| 1097 | ;******************************************************** | ||
| 1098 | |||
| 1099 | UPDATE_TABLE PROC | ||
| 1100 | |||
| 1101 | MOV DS:WORD PTR [DI],BX ; Offset of offsets | ||
| 1102 | MOV TABLE_1,BX ; Table_1 points at offsets | ||
| 1103 | |||
| 1104 | MOV DI,BX ; | ||
| 1105 | ADD BX,0CH ; | ||
| 1106 | MOV DS:WORD PTR [DI+2],BX ; Offset of DEVICE name. | ||
| 1107 | MOV TABLE_2,BX ; Table_2 point at device name. | ||
| 1108 | |||
| 1109 | ADD BX,0AH ; | ||
| 1110 | MOV DS:WORD PTR [DI+4],BX ; Offset of ID name. | ||
| 1111 | MOV TABLE_3,BX ; Table_3 point at ID name. | ||
| 1112 | |||
| 1113 | ADD BX,0AH ; | ||
| 1114 | MOV DS:WORD PTR [DI+6],BX ; Offset of HWCP pages. | ||
| 1115 | MOV TABLE_4,BX ; Table_4 point at HWCP pages. | ||
| 1116 | |||
| 1117 | RET | ||
| 1118 | |||
| 1119 | UPDATE_TABLE ENDP | ||
| 1120 | |||
| 1121 | |||
| 1122 | ;******************************************************** | ||
| 1123 | ;** OFFSET_TABLE : This routine set up pointers of ** | ||
| 1124 | ;** tables number one and two. ** | ||
| 1125 | ;******************************************************** | ||
| 1126 | |||
| 1127 | OFFSET_TABLE PROC | ||
| 1128 | |||
| 1129 | MOV DI,TABLE_1 ; Increment the number | ||
| 1130 | ADD DS:WORD PTR [DI],01H ; of parms foun. (ie. id,hwcp | ||
| 1131 | RET ; and desg) | ||
| 1132 | |||
| 1133 | OFFSET_TABLE ENDP | ||
| 1134 | |||
| 1135 | |||
| 1136 | ;******************************************************** | ||
| 1137 | ;** FIND_RIGHT_BR :This routine scane the line for a ** | ||
| 1138 | ;** ')' if cannot find it turns error flag on ** | ||
| 1139 | ;******************************************************** | ||
| 1140 | |||
| 1141 | FIND_RIGHT_BR PROC | ||
| 1142 | |||
| 1143 | FBR1: CMP AL,')' ; If a right bracket | ||
| 1144 | JE FBR_X ; then exit. | ||
| 1145 | CMP AL,' ' ; If not a space | ||
| 1146 | JNE FBR2 ; Then error. | ||
| 1147 | CALL GET_CHAR ; Get a character | ||
| 1148 | JZ FBR2 ; If end of line then exit. | ||
| 1149 | JMP FBR1 ; Else get another character. | ||
| 1150 | |||
| 1151 | FBR2: MOV ERROR_FLAG,01H ; Set error flag on | ||
| 1152 | FBR_X: MOV AL,20H ; Erase character from AL. | ||
| 1153 | RET | ||
| 1154 | |||
| 1155 | FIND_RIGHT_BR ENDP | ||
| 1156 | |||
| 1157 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 1158 | ;; | ||
| 1159 | ;; ++++++++++++++++++++++++ | ||
| 1160 | ;; ++ INIT Command ++ | ||
| 1161 | ;; ++++++++++++++++++++++++ | ||
| 1162 | ;; | ||
| 1163 | ;;==== Command Code 0 - Initialization ====== | ||
| 1164 | ;; | ||
| 1165 | ;; messages returned : | ||
| 1166 | ;; | ||
| 1167 | ;; msg_bad_syntax -- syntax error from parser, no driver installation | ||
| 1168 | ;; msg_no_init -- device cannot be initialised | ||
| 1169 | ;; msg_insuff_mem -- insufficient memory | ||
| 1170 | ;; | ||
| 1171 | ;; layout : the initialization is done in two stages : | ||
| 1172 | ;; | ||
| 1173 | ;; ++++++++++++++++++++++++ | ||
| 1174 | ;; ++ INIT Stage 1 ++ to examine and extract the | ||
| 1175 | ;; ++++++++++++++++++++++++ parameters defined for the | ||
| 1176 | ;; device_id in DEVICE command, | ||
| 1177 | ;; according to the printer | ||
| 1178 | ;; description table for the | ||
| 1179 | ;; device_id. | ||
| 1180 | ;; | ||
| 1181 | ;; ++++++++++++++++++++++++ | ||
| 1182 | ;; ++ INIT Stage 2 ++ to set the BUFfer for the LPTn | ||
| 1183 | ;; ++++++++++++++++++++++++ or PRN according to device_id's | ||
| 1184 | ;; parameters | ||
| 1185 | ;; | ||
| 1186 | ;; | ||
| 1187 | ;; | ||
| 1188 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 1189 | ;; | ||
| 1190 | DEV_NUM dw ? ;; | ||
| 1191 | ;; | ||
| 1192 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1193 | ; | ||
| 1194 | ; Tables for the deivce_id parameters in the order of device_id in the | ||
| 1195 | ; PARSE table | ||
| 1196 | ; === the tables serves as the link between LPTn to be defined in the 2nd | ||
| 1197 | ; stage, and the device_id that is processed in the first stage. | ||
| 1198 | ; | ||
| 1199 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1200 | ;; | ||
| 1201 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1202 | ;; device ID indicators : | ||
| 1203 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1204 | DID_MAX EQU 4 ;; device entris exepcted in PARSE | ||
| 1205 | ;; not more than 16. ;; table | ||
| 1206 | ;; | ||
| 1207 | DID_STATUS DW 0 ;; status of parsing device id | ||
| 1208 | ;; = 0 : all Device-ID bad | ||
| 1209 | ;; -- see DID_BIT | ||
| 1210 | ;; | ||
| 1211 | DID_MATCH DW 0 ;; this DID has device_name matched | ||
| 1212 | ;; | ||
| 1213 | DID_FAIL DW 0 ;; to fail the good DID_STATUS and | ||
| 1214 | ;; the matched name. (due to | ||
| 1215 | ;; inconsistency among the same LPTn | ||
| 1216 | ;; or between PRN and LPT1.) | ||
| 1217 | ;; | ||
| 1218 | ;; (DID_STATUS) AND (DID_MATCH) XOR (DID_FAIL) determines the success of DID | ||
| 1219 | ;; initialization | ||
| 1220 | ;; | ||
| 1221 | DID_ONE EQU 00001H ;; first device-ID | ||
| 1222 | DID_TWO EQU 00002H ;; second " | ||
| 1223 | DID_THREE EQU 00004H ;; third " | ||
| 1224 | DID_FOUR EQU 00008H ;; fourth " | ||
| 1225 | ;;maximun number of device_id = 16 ;; | ||
| 1226 | ;; | ||
| 1227 | DID_BIT LABEL WORD ;; | ||
| 1228 | DW DID_ONE ;; | ||
| 1229 | DW DID_TWO ;; | ||
| 1230 | DW DID_THREE ;; | ||
| 1231 | DW DID_FOUR ;; | ||
| 1232 | ;;maximun number of device_id = 16 ;; | ||
| 1233 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1234 | ;; device paramters according to the | ||
| 1235 | ;; device_id defined in DEVICE and the | ||
| 1236 | ;; parameters defined for the device_id | ||
| 1237 | ;; in the printer description table. | ||
| 1238 | ;; | ||
| 1239 | HRMAX LABEL word ;; number of hwcp+cart slots supported | ||
| 1240 | DW 0 ;; did = 1 | ||
| 1241 | DW 0 ;; did = 2 | ||
| 1242 | DW 0 ;; did = 3 | ||
| 1243 | DW 0 ;; did = 4 | ||
| 1244 | ;upto max DID_MAX ;; | ||
| 1245 | ;; | ||
| 1246 | CTMAX LABEL word ;; number of cart slots supported | ||
| 1247 | DW 0 ;; did = 1 | ||
| 1248 | DW 0 ;; did = 2 | ||
| 1249 | DW 0 ;; did = 3 | ||
| 1250 | DW 0 ;; did = 4 | ||
| 1251 | ;upto max DID_MAX ;; | ||
| 1252 | ;; | ||
| 1253 | RMMAX LABEL word ;; number of ram-slots supported | ||
| 1254 | DW 0 ;; did = 1 | ||
| 1255 | DW 0 ;; did = 2 | ||
| 1256 | DW 0 ;; did = 3 | ||
| 1257 | DW 0 ;; did = 4 | ||
| 1258 | ;upto max DID_MAX ;; | ||
| 1259 | ;; | ||
| 1260 | RBUMAX LABEL word ;; number of ram-designate slots | ||
| 1261 | DW 0 ;; did = 1 | ||
| 1262 | DW 0 ;; did = 2 | ||
| 1263 | DW 0 ;; did = 3 | ||
| 1264 | DW 0 ;; did = 4 | ||
| 1265 | ;upto max DID_MAX ;; | ||
| 1266 | ;; | ||
| 1267 | DESCO LABEL word ;; offset to the description table | ||
| 1268 | ;; where the device_id is defined. | ||
| 1269 | DW -1 ;; did = 1 | ||
| 1270 | DW -1 ;; did = 2 | ||
| 1271 | DW -1 ;; did = 3 | ||
| 1272 | DW -1 ;; did = 4 | ||
| 1273 | ;upto max DID_MAX ;; | ||
| 1274 | ;; | ||
| 1275 | FSIZE LABEL word ;; font size of the device | ||
| 1276 | DW 0 ;; did = 1 | ||
| 1277 | DW 0 ;; did = 2 | ||
| 1278 | DW 0 ;; did = 3 | ||
| 1279 | DW 0 ;; did = 4 | ||
| 1280 | ;upto max DID_MAX ;; | ||
| 1281 | ;; | ||
| 1282 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1283 | ; | ||
| 1284 | ; Hard/RAM slots table in the order of DEVICE parameters | ||
| 1285 | ; | ||
| 1286 | ; number of entries in all HARD_SLn is determined by the max. {HSLOTS}, and | ||
| 1287 | ; number of entries in all RAM_SLn is determined by the max. {RSLOTS} | ||
| 1288 | ; | ||
| 1289 | ; -- they are initialized according to the device_id defined in the DEVICE. | ||
| 1290 | ; | ||
| 1291 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1292 | ;; | ||
| 1293 | HARD_SLA LABEL word ;; index in the order of device in | ||
| 1294 | DW OFFSET (HARD_SL1) ;; the PARSE-talbes | ||
| 1295 | DW OFFSET (HARD_SL2) ;; | ||
| 1296 | DW OFFSET (HARD_SL3) ;; | ||
| 1297 | DW OFFSET (HARD_SL4) ;; | ||
| 1298 | ; up to DID_MAX ;; | ||
| 1299 | ;; | ||
| 1300 | RAM_SLA LABEL word ;; | ||
| 1301 | DW OFFSET (RAM_SL1) ;; | ||
| 1302 | DW OFFSET (RAM_SL2) ;; | ||
| 1303 | DW OFFSET (RAM_SL3) ;; | ||
| 1304 | DW OFFSET (RAM_SL4) ;; | ||
| 1305 | ; up to DID_MAX ;; | ||
| 1306 | ;; | ||
| 1307 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1308 | ;; | ||
| 1309 | ;; ++++++++++++++++++++++++ | ||
| 1310 | ;; ++ INIT Command ++ | ||
| 1311 | ;; ++++++++++++++++++++++++ | ||
| 1312 | ;; | ||
| 1313 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1314 | ;; | ||
| 1315 | INIT PROC NEAR ;; | ||
| 1316 | ;; | ||
| 1317 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1318 | ;; parse the initialization parameters in DEVICE command | ||
| 1319 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1320 | ;; | ||
| 1321 | ;; | ||
| 1322 | CMP BUF.BFLAG,BF_PRN ;; since PRN is the FIRST device header | ||
| 1323 | JNE NOT_PRN ;; | ||
| 1324 | ;; | ||
| 1325 | ;; | ||
| 1326 | MOV AX,OFFSET CODE_END ;; defined only once for each DEVICE | ||
| 1327 | XOR CX,CX ;; | ||
| 1328 | MOV CL,4 ;; | ||
| 1329 | SHR AX,CL ;; | ||
| 1330 | PUSH CS ;; | ||
| 1331 | POP CX ;; | ||
| 1332 | ADD AX,CX ;; | ||
| 1333 | INC AX ;; leave 16 bytes,room for resident_end | ||
| 1334 | MOV RESIDENT_END,AX ;; | ||
| 1335 | ;; | ||
| 1336 | CALL PARSER ;; call only once, for PRM | ||
| 1337 | ;; | ||
| 1338 | JMP PROCESS_TABLE ;; | ||
| 1339 | ;; | ||
| 1340 | NOT_PRN : ;; | ||
| 1341 | CMP DEV_NUM,1 ;; | ||
| 1342 | ;; | ||
| 1343 | JNB PROCESS_TABLE ;; | ||
| 1344 | ;; | ||
| 1345 | JMP SYNTAX_ERROR ;; | ||
| 1346 | ;; | ||
| 1347 | ;; | ||
| 1348 | ;; | ||
| 1349 | ;; | ||
| 1350 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 1351 | ;; | ||
| 1352 | ;; ++++++++++++++++++++++++ | ||
| 1353 | ;; ++ INIT Stage 1 ++ | ||
| 1354 | ;; ++++++++++++++++++++++++ | ||
| 1355 | ;; | ||
| 1356 | ;; INIT - FIRST STAGE : | ||
| 1357 | ;; | ||
| 1358 | ;; == test and extract if the parameters on device-id is valid | ||
| 1359 | ;; == determine the DID_STATUS according to the validity of the parameters | ||
| 1360 | ;; == procedure(s) called -- DID_EXTRACT | ||
| 1361 | ;; | ||
| 1362 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 1363 | ;; | ||
| 1364 | PROCESS_TABLE : ;; | ||
| 1365 | ;; | ||
| 1366 | PUSH CS ;; | ||
| 1367 | POP ES ;; PSE points to Device offsets | ||
| 1368 | MOV DI,OFFSET(table) ;; ES:[DI] | ||
| 1369 | MOV DX,PSE.PAR_DEV_NUM ;; | ||
| 1370 | MOV DEV_NUM,DX ;; | ||
| 1371 | ;; | ||
| 1372 | CMP DEV_NUM,0 ;; | ||
| 1373 | JNZ NO_SYNTAX_ERR ;; | ||
| 1374 | ;; | ||
| 1375 | XOR AX,AX ;; | ||
| 1376 | MOV AH,09H ;; | ||
| 1377 | MOV DX,OFFSET MSG_BAD_SYNTAX;; | ||
| 1378 | INT 21H ;; | ||
| 1379 | ;; | ||
| 1380 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1381 | SYNTAX_ERROR : ;; set the request header status | ||
| 1382 | ;; according to the STATE | ||
| 1383 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1384 | MOV AX, RESIDENT_END ;; | ||
| 1385 | PUSH CS ;; | ||
| 1386 | POP CX ;; CX=CS | ||
| 1387 | SUB AX,Cx ;; additional segment required. | ||
| 1388 | CS_LOOP1: ;; | ||
| 1389 | CMP AX,1000H ;; | ||
| 1390 | JB CS_LPEND1 ;; | ||
| 1391 | ADD CX,1000H ;; | ||
| 1392 | SUB AX,1000H ;; | ||
| 1393 | JMP CS_LOOP1 ;; | ||
| 1394 | ;; | ||
| 1395 | CS_LPEND1: ;; | ||
| 1396 | SHL AX,1 ;; | ||
| 1397 | SHL AX,1 ;; | ||
| 1398 | SHL AX,1 ;; | ||
| 1399 | SHL AX,1 ;; | ||
| 1400 | ;; | ||
| 1401 | LES DI,dword ptr buf.rh_ptro ;; get Request Header address | ||
| 1402 | ; MOV RH.RH0_ENDO,AX ;; | ||
| 1403 | MOV RH.RH0_ENDO,0 ;; | ||
| 1404 | MOV RH.RH0_ENDS,CX ;; | ||
| 1405 | MOV RH.RHC_STA,stat_cmderr ;; set status in request header | ||
| 1406 | ;; | ||
| 1407 | JMP INIT_RETurn ;; | ||
| 1408 | ;; | ||
| 1409 | ;; | ||
| 1410 | NO_SYNTAX_ERR : ;; | ||
| 1411 | ;; | ||
| 1412 | CMP DX,DID_MAX ;; | ||
| 1413 | JNA NEXT_DID ;; | ||
| 1414 | ;; | ||
| 1415 | MOV INIT_CHK,0001H ;; ERROR 0001 | ||
| 1416 | JMP BAD_DID ;; more than supported no. of device | ||
| 1417 | ;; | ||
| 1418 | NEXT_DID: ;; | ||
| 1419 | PUSH DI ;; pointer to PAR_OT (table 1) | ||
| 1420 | AND DX,DX ;; | ||
| 1421 | JNZ SCAN_DESC ;; | ||
| 1422 | JMP END_DID ;; DI = offset to the 1st PARSE table | ||
| 1423 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1424 | SCAN_DESC: ;; | ||
| 1425 | MOV DI,PSE.PAR_OFF ;; points to the nth device | ||
| 1426 | ;; | ||
| 1427 | ;; find the description for the | ||
| 1428 | ;;device-id | ||
| 1429 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1430 | MOV CX,PRINTER_DESC_NUM ;; | ||
| 1431 | MOV SI, OFFSET(PRINTER_DESC_TBL); offset to the description table | ||
| 1432 | PUSH CS ;; | ||
| 1433 | POP DS ;; | ||
| 1434 | ; $SEARCH ;; | ||
| 1435 | $$DO1: | ||
| 1436 | PUSH CX ;; save device count | ||
| 1437 | PUSH SI ;; pointer to printer-descn's offset | ||
| 1438 | MOV SI,CS:WORD PTR[SI] ;; | ||
| 1439 | AND CX,CX ;; | ||
| 1440 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1441 | ; $LEAVE Z ;; LEAVE if no more device description | ||
| 1442 | JZ $$EN1 | ||
| 1443 | PUSH DI ;; save offset to PAR_DEVOT | ||
| 1444 | MOV DI,PSE.PAR_DIDO ;; | ||
| 1445 | MOV CX,PSE.PAR_DIDL ;; length of parsed device name | ||
| 1446 | LEA DI,PSE.PAR_DID ;; pointer to parse device name | ||
| 1447 | ;; | ||
| 1448 | PUSH SI ;; | ||
| 1449 | LEA SI,[SI].TYPEID ;; offset to name of device-id | ||
| 1450 | REPE CMPSB ;; | ||
| 1451 | POP SI ;; | ||
| 1452 | POP DI ;; get back offset to PAR_DEVOT | ||
| 1453 | ;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1454 | ; $EXITIF Z ;; EXIT if name matched | ||
| 1455 | JNZ $$IF1 | ||
| 1456 | ;; | ||
| 1457 | CALL DID_EXTRACT ;; get the parameters | ||
| 1458 | ;; | ||
| 1459 | POP SI ;; balance push-pop | ||
| 1460 | POP CX ;; | ||
| 1461 | ;; | ||
| 1462 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1463 | ; $ORELSE ;; try next description : | ||
| 1464 | JMP SHORT $$SR1 | ||
| 1465 | $$IF1: | ||
| 1466 | ;; | ||
| 1467 | POP SI ;; of printer_descn offset table | ||
| 1468 | INC SI ;; | ||
| 1469 | INC SI ;; next offset to PRINTER_DESCn | ||
| 1470 | ;; | ||
| 1471 | POP CX ;; one description less | ||
| 1472 | DEC CX ;; | ||
| 1473 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1474 | ; $ENDLOOP ;; DEVICE-ID not defined in | ||
| 1475 | JMP SHORT $$DO1 | ||
| 1476 | $$EN1: | ||
| 1477 | ;; printer_desc; | ||
| 1478 | ;; | ||
| 1479 | MOV AX,INIT_CHK ;; | ||
| 1480 | AND AX,AX ;; | ||
| 1481 | JNZ UNCHANGED ;; | ||
| 1482 | MOV INIT_CHK,0004H ;; ERROR 0004 | ||
| 1483 | UNCHANGED: ;; | ||
| 1484 | POP SI ;; balance push-pop | ||
| 1485 | POP CX ;; | ||
| 1486 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1487 | ; $ENDSRCH ;; End of scanning printer_desc | ||
| 1488 | $$SR1: | ||
| 1489 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1490 | POP DI ;; | ||
| 1491 | INC DI ;; | ||
| 1492 | INC DI ;; points to next device in PART_OT | ||
| 1493 | DEC DX ;; | ||
| 1494 | ;; | ||
| 1495 | JMP NEXT_DID ;; | ||
| 1496 | ;; | ||
| 1497 | END_DID : ;; | ||
| 1498 | POP DI ;; | ||
| 1499 | BAD_DID : ;; | ||
| 1500 | ;; | ||
| 1501 | MOV AX,DID_STATUS ;; | ||
| 1502 | AND AX,AX ;; | ||
| 1503 | JNZ DEF_BUFFER ;; | ||
| 1504 | ;; | ||
| 1505 | JMP END_LPT ;; | ||
| 1506 | ;; | ||
| 1507 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 1508 | ;; | ||
| 1509 | ;; ++++++++++++++++++++++++ | ||
| 1510 | ;; ++ INIT Stage 2 ++ | ||
| 1511 | ;; ++++++++++++++++++++++++ | ||
| 1512 | ;; | ||
| 1513 | ;; INIT -- SECOND STAGE : | ||
| 1514 | ;; | ||
| 1515 | ;; == match the device_name extracted in stage 1 with the name of PRN or | ||
| 1516 | ;; LPTn | ||
| 1517 | ;; | ||
| 1518 | ;; == if the PRN/LPTn has never been defined before, then set up the BUF | ||
| 1519 | ;; for the PRN/LPTn if the DID_STATUS is good; otherwise message will | ||
| 1520 | ;; be generated indicating it cannot be initilized. | ||
| 1521 | ;; | ||
| 1522 | ;; == if there is PRN, LPT1 is also setup, and vice vera. IF both PRN and | ||
| 1523 | ;; LPT1 are on the DEVICE command, or there are multiple entries for | ||
| 1524 | ;; the same LPTn, the consistency is checked. It they are inconsistent | ||
| 1525 | ;; the associated LPTn or PRN is forced to fail by : DID_FAIL. | ||
| 1526 | ;; | ||
| 1527 | ;; == if the device_name on the DEVICE command is not one of the supported | ||
| 1528 | ;; PRN or LPTn, then DID_MATCH bit will not be set. An error message | ||
| 1529 | ;; will be generated for the device_name indicating it cannot be | ||
| 1530 | ;; initialized. | ||
| 1531 | ;; | ||
| 1532 | ;; == procedure(s) called : CHK_DID .. check DID parameters for device | ||
| 1533 | ;; whose name matched. | ||
| 1534 | ;; DEV_CHECK .. if device-name duplicated, or | ||
| 1535 | ;; there are both PRN/LPT1 : check | ||
| 1536 | ;; for consistent parameters. | ||
| 1537 | ;; | ||
| 1538 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 1539 | DEF_BUFFER : ;; | ||
| 1540 | PUSH CS ;; | ||
| 1541 | POP ES ;; PSE points to Device offsets | ||
| 1542 | MOV DI,OFFSET(table) ;; ES:[DI] | ||
| 1543 | xor cx,cx ;; device order in parse table | ||
| 1544 | ;SEARCH ;; | ||
| 1545 | $$DO7: | ||
| 1546 | PUSH DI ;; pointer to PAR_OT | ||
| 1547 | PUSH CX ;; save device count | ||
| 1548 | MOV DI,PSE.PAR_OFF ;; " " PAR_DEVOT | ||
| 1549 | cmp cx,dev_num ;; | ||
| 1550 | ;; | ||
| 1551 | ;LEAVE NB ;; LEAVE if no more device entry | ||
| 1552 | jb MORE_DEVICE ;; | ||
| 1553 | JMP $$EN7 | ||
| 1554 | MORE_DEVICE : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1555 | ;; more parsed_device to be checked | ||
| 1556 | PUSH DI ;; save offset to PAR_DEVOT | ||
| 1557 | MOV DI,PSE.PAR_DNMO ;; | ||
| 1558 | MOV CX,PSE.PAR_DNML ;; length of parsed device name | ||
| 1559 | LEA DI,PSE.PAR_DNM ;; pointer to parse device name | ||
| 1560 | ;; | ||
| 1561 | LDS SI,DWORD PTR BUF.DEV_HDRO ; get the offset to device-n header | ||
| 1562 | LEA SI,HP.DH_NAME ;; " offset to name of device-n | ||
| 1563 | REPE CMPSB ;; | ||
| 1564 | POP DI ;; get back offset to PAR_DEVOT | ||
| 1565 | ;; | ||
| 1566 | ;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1567 | ;EXITIF Z ;; EXIT if name matched | ||
| 1568 | JZ NAME_MATCHED ;; | ||
| 1569 | ;; | ||
| 1570 | JMP MORE_PARSED_DEVICE ;; | ||
| 1571 | ;; | ||
| 1572 | NAME_MATCHED : ;; | ||
| 1573 | ;; | ||
| 1574 | POP CX ;; the DID order | ||
| 1575 | PUSH BX ;; | ||
| 1576 | MOV BX,CX ;; | ||
| 1577 | ADD BX,BX ;; | ||
| 1578 | MOV AX,DID_BIT[BX] ;; | ||
| 1579 | OR DID_MATCH,AX ;; this DID matched | ||
| 1580 | POP BX ;; | ||
| 1581 | PUSH CX ;; | ||
| 1582 | ;; | ||
| 1583 | LEA SI,BUF.PAR_EXTRACTO ;; was the LPT1/PRN defined before ? | ||
| 1584 | MOV AX,CS:[SI].PAR_DNMO ;; | ||
| 1585 | CMP AX,0FFFFH ;; | ||
| 1586 | ;; | ||
| 1587 | JNE DEV_COMPARE ;; DI = PAR_DEVOT | ||
| 1588 | ;;----------------------------------- | ||
| 1589 | ;; | ||
| 1590 | ;; no device previousely defined | ||
| 1591 | MOV AX,PSE.PAR_DNMO ;; | ||
| 1592 | MOV CS:[SI].PAR_DNMO,AX ;; define device parameters for LPTn | ||
| 1593 | ;; | ||
| 1594 | MOV AX,PSE.PAR_DIDO ;; | ||
| 1595 | MOV CS:[SI].PAR_DIDO,AX ;; | ||
| 1596 | ;; | ||
| 1597 | MOV AX,PSE.PAR_HWCPO ;; | ||
| 1598 | MOV CS:[SI].PAR_HWCPO,AX ;; | ||
| 1599 | ;; | ||
| 1600 | MOV AX,PSE.PAR_DESGO ;; | ||
| 1601 | MOV CS:[SI].PAR_DESGO,AX ;; | ||
| 1602 | ;; | ||
| 1603 | MOV AX,PSE.PAR_PARMO ;; | ||
| 1604 | MOV CS:[SI].PAR_PARMO,AX ;; | ||
| 1605 | ;; | ||
| 1606 | ;;--------------------------------- | ||
| 1607 | CALL CHK_DID ;; define the STATE according to | ||
| 1608 | ;; DID_STATUS | ||
| 1609 | JMP MORE_PARSED_DEVICE ;; | ||
| 1610 | ;; | ||
| 1611 | DEV_COMPARE : ;;------------------------------- | ||
| 1612 | ;; e.g. LPT1 and PRN shares one BUF. | ||
| 1613 | ;; or duplicated device name | ||
| 1614 | CALL DEV_CHECK ;; | ||
| 1615 | ;; | ||
| 1616 | CMP BUF.STATE,CPSW ;; | ||
| 1617 | JNE DEV_COMPARE_FAIL ;; | ||
| 1618 | ;; | ||
| 1619 | JMP MORE_PARSED_DEVICE ;; | ||
| 1620 | ;; | ||
| 1621 | DEV_COMPARE_FAIL : ;; | ||
| 1622 | ;; | ||
| 1623 | POP CX ;; | ||
| 1624 | POP DI ;; balance push-pop | ||
| 1625 | ;; | ||
| 1626 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1627 | ;$ORELSE ;; | ||
| 1628 | JMP END_LPT | ||
| 1629 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1630 | MORE_PARSED_DEVICE : ;; name does not match | ||
| 1631 | ;; | ||
| 1632 | POP CX ;; | ||
| 1633 | INC CX ;; | ||
| 1634 | POP DI ;; | ||
| 1635 | INC DI ;; | ||
| 1636 | INC DI ;; points to next device in PART_OT | ||
| 1637 | ;; | ||
| 1638 | jmp $$DO7 ;; | ||
| 1639 | ;$ENDLOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1640 | $$EN7: ;; no device found for LPTn | ||
| 1641 | ;; | ||
| 1642 | POP CX ;; | ||
| 1643 | POP DI ;; balance push-pop | ||
| 1644 | ;; | ||
| 1645 | CMP BUF.STATE,CPSW ;; | ||
| 1646 | JE END_LPT ;; for LPT1/PRN pair | ||
| 1647 | ;; | ||
| 1648 | MOV BUF.STATE,NORMAL ;; no device defined for the LPTn | ||
| 1649 | ;; | ||
| 1650 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1651 | ;; End of defining LPTn Buffer | ||
| 1652 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1653 | ;$ENDSRCH ;; | ||
| 1654 | END_LPT : ;; | ||
| 1655 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1656 | ;; set the request header status | ||
| 1657 | ;; according to the STATE | ||
| 1658 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1659 | MOV AX, RESIDENT_END ;; | ||
| 1660 | PUSH CS ;; | ||
| 1661 | POP CX ;; CX=CS | ||
| 1662 | SUB AX,Cx ;; additional segment required. | ||
| 1663 | CS_LOOP2: ;; | ||
| 1664 | CMP AX,1000H ;; | ||
| 1665 | JB CS_LPEND2 ;; | ||
| 1666 | ADD CX,1000H ;; | ||
| 1667 | SUB AX,1000H ;; | ||
| 1668 | JMP CS_LOOP2 ;; | ||
| 1669 | ;; | ||
| 1670 | CS_LPEND2: ;; | ||
| 1671 | SHL AX,1 ;; | ||
| 1672 | SHL AX,1 ;; | ||
| 1673 | SHL AX,1 ;; | ||
| 1674 | SHL AX,1 ;; | ||
| 1675 | ;; | ||
| 1676 | LES DI,dword ptr buf.rh_ptro ;; get Request Header address | ||
| 1677 | MOV RH.RH0_ENDO,AX ;; | ||
| 1678 | MOV RH.RH0_ENDS,CX ;; | ||
| 1679 | XOR AX,AX ;; clear error code to be returned | ||
| 1680 | MOV CX,BUF.STATE ;; | ||
| 1681 | CMP CX,CPSW ;; | ||
| 1682 | JE MATCH_GOOD ;; | ||
| 1683 | MOV AX,STAT_CMDERR ;; | ||
| 1684 | ;; | ||
| 1685 | MATCH_GOOD : ;; | ||
| 1686 | MOV RH.RHC_STA,AX ;; set status in request header | ||
| 1687 | ;; | ||
| 1688 | BUF_END : ;; | ||
| 1689 | ;; | ||
| 1690 | CMP BUF.BFLAG,BF_LPT1 ;; | ||
| 1691 | JNE BUF_MESSAGES ;; | ||
| 1692 | ;; | ||
| 1693 | CMP BUF.STATE,CPSW ;; | ||
| 1694 | JNE BUF_MESSAGES ;; | ||
| 1695 | ;; set PRN to the same setting as LPT1 | ||
| 1696 | PUSH BX ;; | ||
| 1697 | ;; | ||
| 1698 | LEA SI,BUF.RNORMO ;; | ||
| 1699 | LEA CX,BUF.BUFEND ;; | ||
| 1700 | SUB CX,SI ;; | ||
| 1701 | MOV BX,BUF.PRN_BUFO ;; where PRN buffer is | ||
| 1702 | LEA DI,BUF.RNORMO ;; | ||
| 1703 | PUSH CS ;; | ||
| 1704 | POP ES ;; | ||
| 1705 | PUSH CS ;; | ||
| 1706 | POP DS ;; | ||
| 1707 | REP MOVSB ;; | ||
| 1708 | ;; | ||
| 1709 | POP BX ;; | ||
| 1710 | ;; | ||
| 1711 | BUF_MESSAGES : ;; | ||
| 1712 | CMP BUF.BFLAG,BF_LPT3 ;; generate error message is this is | ||
| 1713 | je last_round ;; the last LPTn | ||
| 1714 | Jmp INIT_RETURN ;; | ||
| 1715 | ;; ERROR messages will be generated | ||
| 1716 | ;; at the end of initialization of all | ||
| 1717 | ;; the LPT devices | ||
| 1718 | last_round : ;; | ||
| 1719 | MOV AX,RESIDENT_END ;; | ||
| 1720 | ADD AX,STACK_SIZE ;; | ||
| 1721 | MOV RESIDENT_END,AX ;; | ||
| 1722 | PUSH CS ;; | ||
| 1723 | POP CX ;; CX=CS | ||
| 1724 | SUB AX,Cx ;; additional segment required. | ||
| 1725 | CS_LOOP3: ;; | ||
| 1726 | CMP AX,1000H ;; | ||
| 1727 | JB CS_LPEND3 ;; | ||
| 1728 | ADD CX,1000H ;; | ||
| 1729 | SUB AX,1000H ;; | ||
| 1730 | JMP CS_LOOP3 ;; | ||
| 1731 | ;; | ||
| 1732 | CS_LPENd3: ;; | ||
| 1733 | SHL AX,1 ;; | ||
| 1734 | SHL AX,1 ;; | ||
| 1735 | SHL AX,1 ;; | ||
| 1736 | SHL AX,1 ;; | ||
| 1737 | ;; | ||
| 1738 | MOV RH.RH0_ENDO,AX ;; STACK !!!!! | ||
| 1739 | MOV STACK_ALLOCATED,0 ;; from now on, internal stack is used | ||
| 1740 | ;; | ||
| 1741 | MOV AX,DID_STATUS ;; what is the DID combination ? | ||
| 1742 | AND AX,DID_MATCH ;; | ||
| 1743 | XOR AX,DID_FAIL ;; | ||
| 1744 | ;; | ||
| 1745 | AND AX,AX ;; | ||
| 1746 | JNZ CODE_STAYED ;; | ||
| 1747 | ; MOV RH.RH0_ENDO,0 ;; none of the devices are good | ||
| 1748 | ;; | ||
| 1749 | ;; | ||
| 1750 | CODE_STAYED : ;; | ||
| 1751 | MOV DI,OFFSET TABLE ;; | ||
| 1752 | push CS ;; | ||
| 1753 | POP ES ;; | ||
| 1754 | ;; | ||
| 1755 | XOR CX,CX ;; | ||
| 1756 | MSG_LOOP : ;; | ||
| 1757 | CMP CX,DEV_NUM ;; | ||
| 1758 | JNB INIT_RETURN ;; | ||
| 1759 | SHR AX,1 ;; | ||
| 1760 | JC MSG_NEXT ;; | ||
| 1761 | ;; this device in parse table is bad | ||
| 1762 | PUSH DI ;; | ||
| 1763 | PUSH CX ;; | ||
| 1764 | PUSH AX ;; | ||
| 1765 | ;; | ||
| 1766 | MOV DI,PSE.PAR_OFF ;; | ||
| 1767 | MOV SI,PSE.PAR_DNMO ;; | ||
| 1768 | ;; | ||
| 1769 | PUSH CS ;; | ||
| 1770 | POP ES ;; | ||
| 1771 | PUSH CS ;; | ||
| 1772 | POP DS ;; | ||
| 1773 | ;; | ||
| 1774 | MOV CX,8 ;; | ||
| 1775 | LEA SI,[SI].PAR_DNM ;; | ||
| 1776 | ;; | ||
| 1777 | MOV DI,SI ;; | ||
| 1778 | ADD DI,7 ;; skip backward the blanks | ||
| 1779 | MOV AL,20H ;; | ||
| 1780 | STD ;; | ||
| 1781 | REPE SCASB ;; | ||
| 1782 | CLD ;; | ||
| 1783 | ;; | ||
| 1784 | MOV DI, OFFSET MSG_NO_INIT_P;; | ||
| 1785 | MOV DX,DI ;; for INT 21H | ||
| 1786 | XOR AX,AX ;; | ||
| 1787 | MOV AH,09H ;; | ||
| 1788 | INT 21H ;; | ||
| 1789 | ;; | ||
| 1790 | ;; | ||
| 1791 | MOV DI, OFFSET MSG_NO_INIT ;; | ||
| 1792 | MOV DX,DI ;; for INT 21H | ||
| 1793 | ;; | ||
| 1794 | INC CX ;; | ||
| 1795 | ;; | ||
| 1796 | PUSH CX ;; remaining name that is non blank | ||
| 1797 | MOV AX,CX ;; | ||
| 1798 | MOV CX,8 ;; | ||
| 1799 | SUB CX,AX ;; | ||
| 1800 | ADD DI,CX ;; | ||
| 1801 | MOV DX,DI ;; | ||
| 1802 | POP CX ;; | ||
| 1803 | REP MOVSB ;; | ||
| 1804 | ;; | ||
| 1805 | ;; | ||
| 1806 | XOR AX,AX ;; | ||
| 1807 | MOV AH,09H ;; | ||
| 1808 | INT 21H ;; | ||
| 1809 | ;; | ||
| 1810 | POP AX ;; | ||
| 1811 | POP CX ;; | ||
| 1812 | POP DI ;; | ||
| 1813 | ;; | ||
| 1814 | MSG_NEXT : ;; | ||
| 1815 | INC CX ;; | ||
| 1816 | INC DI ;; | ||
| 1817 | INC DI ;; | ||
| 1818 | JMP MSG_LOOP ;; | ||
| 1819 | ;; | ||
| 1820 | ;; | ||
| 1821 | INIT_RETURN : ;; | ||
| 1822 | ;; | ||
| 1823 | ;; | ||
| 1824 | RET ;; | ||
| 1825 | ;; | ||
| 1826 | INIT ENDP ;; | ||
| 1827 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1828 | ;; | ||
| 1829 | ;; Call by INIT to extract parameters for the deivce_id | ||
| 1830 | ;; | ||
| 1831 | ;; on rntry : | ||
| 1832 | ;; ES:[DI] PARSE Table 2, offsets of all parameters | ||
| 1833 | ;; DS:[SI] Printer Description table whose TYPEID matched | ||
| 1834 | ;; DX "inverse" order of devices in the PARSE tables | ||
| 1835 | ;; | ||
| 1836 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1837 | ;; | ||
| 1838 | ;; | ||
| 1839 | DID_EXTRACT PROC ;; | ||
| 1840 | ;; | ||
| 1841 | PUSH DX ;; | ||
| 1842 | ;;----------------------------- | ||
| 1843 | ;; define the DID_parameters | ||
| 1844 | PUSH BX ;; | ||
| 1845 | ;; | ||
| 1846 | MOV BX,DEV_NUM ;; | ||
| 1847 | SUB BX,DX ;; order in the Parse table | ||
| 1848 | add bx,bx ;; double to index [bx] | ||
| 1849 | MOV DX,BX ;; | ||
| 1850 | ;; | ||
| 1851 | MOV AX,DS:[SI].FONTSZ ;; | ||
| 1852 | MOV FSIZE[BX],AX ;; size of font buffer to be created | ||
| 1853 | ;; | ||
| 1854 | MOV AX,DS:[SI].HSLOTS ;; | ||
| 1855 | CMP AX,HARDSL_MAX ;; | ||
| 1856 | JNA LESS_HARDSL ;; | ||
| 1857 | MOV INIT_CHK, 0010H ;; ERROR 0010H | ||
| 1858 | POP BX ;; | ||
| 1859 | JMP END_MATCH_BAD ;; | ||
| 1860 | LESS_HARDSL : ;; | ||
| 1861 | CMP AX,DS:[SI].HWCPMIN ;; | ||
| 1862 | JNB VALID_HARDSL ;; | ||
| 1863 | MOV INIT_CHK, 0012H ;; ERROR 0012H | ||
| 1864 | POP BX ;; | ||
| 1865 | JMP END_MATCH_BAD ;; | ||
| 1866 | VALID_HARDSL : ;; | ||
| 1867 | MOV HRMAX[BX],AX ;; | ||
| 1868 | MOV CTMAX[BX],AX ;; will be reduced by the no. of hwcp | ||
| 1869 | ;; | ||
| 1870 | MOV AX,DS:[SI].RSLOTS ;; | ||
| 1871 | CMP AX,RAMSL_MAX ;; | ||
| 1872 | JNA LESS_RAMSL ;; | ||
| 1873 | MOV INIT_CHK, 0011H ;; ERROR 0011H | ||
| 1874 | POP BX ;; | ||
| 1875 | JMP END_MATCH_BAD ;; | ||
| 1876 | LESS_RAMSL : ;; | ||
| 1877 | MOV RMMAX[BX],AX ;; see also designate | ||
| 1878 | ;; | ||
| 1879 | MOV DESCO[BX],SI ;; | ||
| 1880 | ;; | ||
| 1881 | POP BX ;; | ||
| 1882 | ;;---------------------------------- | ||
| 1883 | ;; | ||
| 1884 | PUSH CX ;; | ||
| 1885 | ;; | ||
| 1886 | HWCPgt: PUSH DI ;; get the hwcp | ||
| 1887 | ;; | ||
| 1888 | MOV DI,PSE.PAR_HWCPO ;; | ||
| 1889 | MOV CX,PSE.PAR_HWCPL ;; no. of hwcp | ||
| 1890 | AND CX,CX ;; | ||
| 1891 | JNZ chk_hwcp ;; | ||
| 1892 | push bx ;; | ||
| 1893 | mov bx,dx ;; | ||
| 1894 | MOV HRMAX[BX],CX ;; | ||
| 1895 | MOV CX,DS:[SI].HWCPMIN ;; | ||
| 1896 | SUB CTMAX[BX],CX ;; what is left becomes cartridge slot | ||
| 1897 | pop bx ;; | ||
| 1898 | JMP DESIGN ;; | ||
| 1899 | ;; hwcp to be defined | ||
| 1900 | chk_hwcp: MOV AX,DS:[SI].HSLOTS ;; defined in printer_desc | ||
| 1901 | CMP CX,AX ;; | ||
| 1902 | JA BAD_MATCH2 ;; | ||
| 1903 | CMP CX,HARDSL_MAX ;; | ||
| 1904 | JNA HWCP_GOOD ;; jump if system error | ||
| 1905 | MOV INIT_CHK,0003H ;; ERROR 0003 | ||
| 1906 | JMP END_MATCH ;; | ||
| 1907 | BAD_MATCH2: ;; | ||
| 1908 | MOV INIT_CHK,0002H ;; ERROR 0002 | ||
| 1909 | JMP END_MATCH ;; | ||
| 1910 | ;; | ||
| 1911 | HWCP_GOOD: ;; there are sufficient hard-slot for | ||
| 1912 | ;; HWCP | ||
| 1913 | PUSH SI ;; printer description table of TYPEID | ||
| 1914 | PUSH BX ;; | ||
| 1915 | ;; | ||
| 1916 | MOV BX,DX ;; | ||
| 1917 | MOV AX,CTMAX[BX] ;; | ||
| 1918 | ;; | ||
| 1919 | PUSH CX ;; calculate what is left for cart_slot | ||
| 1920 | CMP CX,DS:[SI].HWCPMIN ;; | ||
| 1921 | JNB MORE_THAN_HWCPMIN ;; | ||
| 1922 | MOV CX,DS:[SI].HWCPMIN ;; | ||
| 1923 | MORE_THAN_HWCPMIN : ;; | ||
| 1924 | SUB AX,CX ;; | ||
| 1925 | POP CX ;; | ||
| 1926 | mov HRMAX[BX],CX ;; | ||
| 1927 | ;; | ||
| 1928 | MOV CTMAX[BX],AX ;; no of cart-slot for designate | ||
| 1929 | MOV SI,HARD_SLA[BX] ;; get the corresponding hard-slots | ||
| 1930 | ;; | ||
| 1931 | POP BX ;; | ||
| 1932 | ;; | ||
| 1933 | push bx ;; | ||
| 1934 | push dx ;; | ||
| 1935 | mov bx,si ;; | ||
| 1936 | mov dx,cx ;; | ||
| 1937 | mov reserved1,dx ;; IF THERE IS ANY REPETITIVE HWCP | ||
| 1938 | mov reserved2,bx ;; IF THERE IS ANY REPETITIVE HWCP | ||
| 1939 | ;; | ||
| 1940 | FILL_HWCP: ;; | ||
| 1941 | AND CX,CX ;; | ||
| 1942 | JZ DESIGN_P ;; | ||
| 1943 | INC DI ;; next code page in PARSE table | ||
| 1944 | INC DI ;; | ||
| 1945 | MOV AX,ES:[DI] ;; get code page value | ||
| 1946 | ;; | ||
| 1947 | ;; IF THERE IS ANY REPETITIVE HWCP | ||
| 1948 | push dx ;; | ||
| 1949 | push bx ;; | ||
| 1950 | hwcp_norep : ;; | ||
| 1951 | cmp ax,cs:[bx].slt_cp ;; | ||
| 1952 | jne hwcp_repnext ;; | ||
| 1953 | pop bx ;; | ||
| 1954 | pop dx ;; | ||
| 1955 | pop dx ;; | ||
| 1956 | pop bx ;; | ||
| 1957 | pop si ;; | ||
| 1958 | jmp end_match ;; | ||
| 1959 | ;; | ||
| 1960 | hwcp_repnext: ;; | ||
| 1961 | inc bx ;; | ||
| 1962 | inc bx ;; | ||
| 1963 | inc bx ;; | ||
| 1964 | inc bx ;; | ||
| 1965 | dec dx ;; | ||
| 1966 | jnz hwcp_norep ;; | ||
| 1967 | pop bx ;; | ||
| 1968 | pop dx ;; | ||
| 1969 | ;; | ||
| 1970 | MOV CS:[SI].SLT_CP,AX ;; | ||
| 1971 | MOV AX,CS:[SI].SLT_AT ;; get the attributes | ||
| 1972 | OR AX,AT_OCC ;; occupied | ||
| 1973 | OR AX,AT_HWCP ;; hwcp slot | ||
| 1974 | MOV CS:[SI].SLT_AT,AX ;; | ||
| 1975 | INC SI ;; | ||
| 1976 | INC SI ;; next slot | ||
| 1977 | INC SI ;; next slot | ||
| 1978 | INC SI ;; next slot | ||
| 1979 | DEC CX ;; | ||
| 1980 | JMP FILL_HWCP ;; | ||
| 1981 | DESIGN_P: ;; | ||
| 1982 | pop dx ;; | ||
| 1983 | pop bx ;; | ||
| 1984 | POP SI ;; | ||
| 1985 | ;;--------------------- | ||
| 1986 | DESIGN: POP DI ;; get the designate no. | ||
| 1987 | PUSH DI ;; | ||
| 1988 | ;; | ||
| 1989 | MOV DI,PSE.PAR_DESGO ;; | ||
| 1990 | MOV AX,PSE.PAR_DESGL ;; | ||
| 1991 | CMP AX,1 ;; | ||
| 1992 | JA END_MATCH ;; there should have no font entry | ||
| 1993 | AND AX,AX ;; | ||
| 1994 | JZ DEF_RBUFMAX ;; | ||
| 1995 | ;; | ||
| 1996 | MOV AX,PSE.PAR_DESG ;; | ||
| 1997 | AND AX,AX ;; | ||
| 1998 | JZ DEF_RBUFMAX ;; | ||
| 1999 | ;; | ||
| 2000 | CMP CS:[SI].CLASS,1 ;; | ||
| 2001 | JNE DESIG_NOt_CLASS1 ;; | ||
| 2002 | ;; | ||
| 2003 | PUSH BX ;; if there is any cartridge slot ? | ||
| 2004 | PUSH AX ;; | ||
| 2005 | MOV BX,DX ;; | ||
| 2006 | MOV AX,ctmax[BX] ;; | ||
| 2007 | AND AX,AX ;; | ||
| 2008 | POP AX ;; | ||
| 2009 | POP BX ;; | ||
| 2010 | JZ END_MATCH ;; fail, as there is no physical RAM. | ||
| 2011 | ;; | ||
| 2012 | CMP AX,HARDSL_MAX ;; is the designate more than max ? | ||
| 2013 | JA END_MATCH ;; | ||
| 2014 | ;; | ||
| 2015 | ;; | ||
| 2016 | JMP DEF_RBUFMAX ;; | ||
| 2017 | ;; | ||
| 2018 | ;; | ||
| 2019 | ;; | ||
| 2020 | DESIG_NOT_CLASS1 : ;; | ||
| 2021 | PUSH BX ;; if there is any physical RAM slot ? | ||
| 2022 | PUSH AX ;; | ||
| 2023 | MOV BX,DX ;; | ||
| 2024 | MOV AX,RMMAX[BX] ;; | ||
| 2025 | AND AX,AX ;; | ||
| 2026 | POP AX ;; | ||
| 2027 | POP BX ;; | ||
| 2028 | JZ END_MATCH ;; fail, as there is no physical RAM. | ||
| 2029 | ;; | ||
| 2030 | ;; | ||
| 2031 | CMP AX,RAMSL_MAX ;; is the designate more than max ? | ||
| 2032 | JA END_MATCH ;; | ||
| 2033 | ;; | ||
| 2034 | DEF_RBUFMAX : ;; | ||
| 2035 | PUSH BX ;; | ||
| 2036 | MOV BX,DX ;; | ||
| 2037 | MOV RBUMAX[BX],AX ;; | ||
| 2038 | POP BX ;; | ||
| 2039 | ;; | ||
| 2040 | ;; | ||
| 2041 | PARAM : ;; | ||
| 2042 | ;PARM: POP DI ;; | ||
| 2043 | ; PUSH DI ;; | ||
| 2044 | ;; MOV DI,PSE.PAR_PARMO ;; | ||
| 2045 | ;; | ||
| 2046 | ;,-------------------------- | ||
| 2047 | ;; GOOD device_id parameters | ||
| 2048 | shr dx,1 ;; | ||
| 2049 | MOV AX,DID_ONE ;; | ||
| 2050 | MOV CX,DX ;; | ||
| 2051 | AND CX,CX ;; | ||
| 2052 | JZ NO_SHL ;; | ||
| 2053 | SHL AX,CL ;; | ||
| 2054 | NO_SHL: OR DID_STATUS,AX ;; is defined | ||
| 2055 | ;;------------------------- | ||
| 2056 | END_MATCH: POP DI ;; end of extract | ||
| 2057 | POP CX ;; | ||
| 2058 | END_MATCH_BAD : ;; | ||
| 2059 | POP DX ;; | ||
| 2060 | ;; | ||
| 2061 | RET ;; | ||
| 2062 | ;; | ||
| 2063 | DID_EXTRACT ENDP ;; | ||
| 2064 | ;; | ||
| 2065 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2066 | ;; | ||
| 2067 | ;; Called by INIT to define the STATE and BUF for the LPTn according to | ||
| 2068 | ;; the DID_STATUS. Create font buffer if requested through the "desi*nate" | ||
| 2069 | ;; | ||
| 2070 | ;; at entry : CX = device order in parse table | ||
| 2071 | ;; | ||
| 2072 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2073 | CHK_DID PROC ;; | ||
| 2074 | ;; | ||
| 2075 | push cx ;; | ||
| 2076 | push di ;; | ||
| 2077 | push dx ;; | ||
| 2078 | ;; | ||
| 2079 | MOV AX,DID_STATUS ;; | ||
| 2080 | ;; | ||
| 2081 | PUSH CX ;; order 0 to m | ||
| 2082 | POP DI ;; | ||
| 2083 | ADD DI,DI ;; indexing : [DI] | ||
| 2084 | ;; | ||
| 2085 | INC CX ;; | ||
| 2086 | SHR AX,CL ;; is the device parameter valid ? | ||
| 2087 | ;; | ||
| 2088 | JC DEFINE_BUFFER ;; | ||
| 2089 | JMP LPT_FAIL ;;-------------------------- | ||
| 2090 | ;; | ||
| 2091 | DEFINE_BUFFER : ;; | ||
| 2092 | ;; good device parameters as determined | ||
| 2093 | MOV AX,DESCO[DI] ;; | ||
| 2094 | MOV BUF.PDESCO,AX ;; | ||
| 2095 | ;; | ||
| 2096 | PUSH DI ;; | ||
| 2097 | MOV DI,AX ;; | ||
| 2098 | MOV AX,CS:[DI].CLASS ;; | ||
| 2099 | MOV BUF.PCLASS,AX ;; | ||
| 2100 | POP DI ;; | ||
| 2101 | ;; | ||
| 2102 | MOV AX,HARD_SLA[DI] ;; in the DID_EXTRACT | ||
| 2103 | MOV BUF.HARDSO,AX ;; | ||
| 2104 | ;; | ||
| 2105 | MOV AX,RAM_SLA[DI] ;; | ||
| 2106 | MOV BUF.RAMSO,AX ;; | ||
| 2107 | ;; | ||
| 2108 | MOV AX,HRMAX[DI] ;; | ||
| 2109 | MOV BUF.HARDMX,AX ;; | ||
| 2110 | ;; | ||
| 2111 | MOV AX,CTMAX[DI] ;; | ||
| 2112 | MOV BUF.HCARMX,AX ;; | ||
| 2113 | ;; | ||
| 2114 | ADD AX,HRMAX[DI] ;; defore "designate" | ||
| 2115 | MOV BUF.HSLMX,AX ;; | ||
| 2116 | ;; | ||
| 2117 | ;; | ||
| 2118 | MOV AX,RMMAX[DI] ;; | ||
| 2119 | MOV BUF.RAMMX,AX ;; | ||
| 2120 | ;; | ||
| 2121 | XOR AX,AX ;; | ||
| 2122 | PUSH CX ;; calculate the max. length of control | ||
| 2123 | MOV CX,2 ;; sequence that is allowed for the | ||
| 2124 | CMP BUF.PCLASS,1 ;; room reserved for physical slots. | ||
| 2125 | JNE CTL_LOOP ;; | ||
| 2126 | MOV CX,1 ;; class 1 printer has one control seq. | ||
| 2127 | CTL_LOOP : ;; | ||
| 2128 | ADD AX,CTL_MAX ;; | ||
| 2129 | DEC AX ;; leave one byte for the length | ||
| 2130 | DEC CX ;; | ||
| 2131 | JNZ CTL_LOOP ;; | ||
| 2132 | MOV BUF.FSELMAX,AX ;; | ||
| 2133 | POP CX ;; | ||
| 2134 | ;; | ||
| 2135 | MOV AX,FSIZE[DI] ;; | ||
| 2136 | MOV BUF.FTSZPA,AX ;; FTSIZE in paragraph | ||
| 2137 | ;; | ||
| 2138 | PUSH AX ;; | ||
| 2139 | ;; | ||
| 2140 | MOV DX,4 ;; | ||
| 2141 | FT_PARA: ;; | ||
| 2142 | ADD AX,AX ;; | ||
| 2143 | DEC DX ;; | ||
| 2144 | JNZ FT_PARA ;; font size | ||
| 2145 | MOV BUF.FTSIZE,AX ;; font size in bytes (used with.RBUFMX) | ||
| 2146 | ;; | ||
| 2147 | POP DX ;; FTSIZE in paragraph | ||
| 2148 | ;; | ||
| 2149 | MOV CX,RBUMAX[DI] ;; create font buffer per .RBUFMX and | ||
| 2150 | MOV BUF.RBUFMX,CX ;; assume sufficient memory for all the | ||
| 2151 | ;; "designate request" | ||
| 2152 | PUSH CX ;; | ||
| 2153 | ;; | ||
| 2154 | CMP BUF.PCLASS,1 ;; always create font buffer for class1 | ||
| 2155 | JNE CLASS_NOT_1 ;; | ||
| 2156 | ;; | ||
| 2157 | AND CX,CX ;; | ||
| 2158 | JZ CLASS1_NOCX ;; | ||
| 2159 | ADD CX,BUF.HARDMX ;; | ||
| 2160 | MOV BUF.HSLMX,CX ;; | ||
| 2161 | JMP CLASS_NOT_1 ;; | ||
| 2162 | ;; | ||
| 2163 | CLASS1_NOCX: ;; | ||
| 2164 | MOV CX,BUF.HSLMX ;; | ||
| 2165 | ;; | ||
| 2166 | CLASS_NOT_1 : ;; | ||
| 2167 | AND CX,CX ;; | ||
| 2168 | JZ MULTIPLE_DONE ;; | ||
| 2169 | MOV AX,RESIDENT_END ;; | ||
| 2170 | MULTIPLE_FT : ;; | ||
| 2171 | ADD AX,DX ;; allocate the font buffers at the end | ||
| 2172 | DEC CX ;; of the resident codes | ||
| 2173 | JNZ MULTIPLE_FT ;; | ||
| 2174 | ;; | ||
| 2175 | ;; | ||
| 2176 | MOV CX,RESIDENT_END ;; | ||
| 2177 | MOV BUF.FTSTART,CX ;; | ||
| 2178 | MOV RESIDENT_END,AX ;; | ||
| 2179 | ;; | ||
| 2180 | ;; | ||
| 2181 | MULTIPLE_DONE : ;; | ||
| 2182 | POP CX ;; designate requested | ||
| 2183 | ;; | ||
| 2184 | CMP BUF.PCLASS,1 ;; | ||
| 2185 | JNE DEF_RBUF ;; | ||
| 2186 | ;; CLASS 1 | ||
| 2187 | CMP BUF.HARDMX,0 ;; | ||
| 2188 | JE DEFBUF_DONE ;; | ||
| 2189 | ;; | ||
| 2190 | PUSH CX ;; STACKS... | ||
| 2191 | PUSH SI ;; | ||
| 2192 | PUSH DS ;; | ||
| 2193 | PUSH ES ;; | ||
| 2194 | PUSH DI ;; | ||
| 2195 | PUSH DX ;; | ||
| 2196 | ;; | ||
| 2197 | MOV DX,BUF.HARDMX ;; | ||
| 2198 | PUSH DX ;; STACK +1 -- # of HWCP | ||
| 2199 | ;; | ||
| 2200 | PUSH CS ;; | ||
| 2201 | POP DS ;; | ||
| 2202 | MOV BUF.RBUFMX,0 ;; | ||
| 2203 | MOV SI,BUF.PDESCO ;; | ||
| 2204 | MOV SI,CS:[SI].SELH_O ;; | ||
| 2205 | XOR CX,CX ;; | ||
| 2206 | MOV CL,CS:BYTE PTR [SI] ;; | ||
| 2207 | INC CX ;; including the length byte | ||
| 2208 | ;; | ||
| 2209 | MOV DI,BUF.FTSTART ;; control template | ||
| 2210 | DEF_FTBUF: ;; fill the font buffer with the | ||
| 2211 | PUSH DI ;; | ||
| 2212 | POP ES ;; | ||
| 2213 | XOR DI,DI ;; | ||
| 2214 | ;; | ||
| 2215 | PUSH CX ;; | ||
| 2216 | PUSH SI ;; | ||
| 2217 | REP MOVSB ;; | ||
| 2218 | POP SI ;; | ||
| 2219 | POP CX ;; | ||
| 2220 | ;; | ||
| 2221 | PUSH ES ;; | ||
| 2222 | POP DI ;; | ||
| 2223 | ADD DI,BUF.FTszpa ;; | ||
| 2224 | DEC DX ;; | ||
| 2225 | JNZ DEF_FTBUF ;; | ||
| 2226 | ;; | ||
| 2227 | POP DX ;; STACK -1 | ||
| 2228 | ;; | ||
| 2229 | MOV SI,BUF.HARDSO ;; | ||
| 2230 | MOV DI,BUF.FTSTART ;; define the HWCP values | ||
| 2231 | DEF_FThwcp : ;; | ||
| 2232 | PUSH DI ;; | ||
| 2233 | POP ES ;; | ||
| 2234 | MOV DI,CTL5202_OFFS ;; offset to the HWCP words | ||
| 2235 | ;; | ||
| 2236 | MOV AX,CS:[SI].SLT_CP ;; | ||
| 2237 | MOV ES:WORD PTR [DI],AX ;; | ||
| 2238 | ;; | ||
| 2239 | INC SI ;; | ||
| 2240 | INC SI ;; | ||
| 2241 | INC SI ;; | ||
| 2242 | INC SI ;; | ||
| 2243 | ;; | ||
| 2244 | PUSH ES ;; | ||
| 2245 | POP DI ;; | ||
| 2246 | ADD DI,BUF.FTSZPA ;; | ||
| 2247 | DEC DX ;; | ||
| 2248 | JNZ DEF_FThwcp ;; | ||
| 2249 | ;; | ||
| 2250 | POP DX ;; | ||
| 2251 | POP DI ;; | ||
| 2252 | POP ES ;; | ||
| 2253 | POP DS ;; | ||
| 2254 | POP SI ;; | ||
| 2255 | POP CX ;; | ||
| 2256 | ;; | ||
| 2257 | JMP DEFBUF_DONE ;; | ||
| 2258 | ;; | ||
| 2259 | ;; | ||
| 2260 | DEF_RBUF : ;; | ||
| 2261 | MOV BUF.RSLMX,CX ;; the no. of ram slots supported | ||
| 2262 | CMP CX,RMMAX[DI] ;; | ||
| 2263 | JNB DEFBUF_DONE ;; | ||
| 2264 | MOV AX,RMMAX[DI] ;; | ||
| 2265 | MOV BUF.RSLMX,AX ;; the max. of .RAMMX and .RBUFMX | ||
| 2266 | ;; | ||
| 2267 | DEFBUF_DONE : ;; | ||
| 2268 | MOV BUF.STATE,CPSW ;; the LPTn is CPSW ----- STATE | ||
| 2269 | ;; | ||
| 2270 | CMP BUF.BFLAG,BF_PRN ;; | ||
| 2271 | JNE RET_CHK_DID ;; | ||
| 2272 | MOV AX,DID_BIT[DI] ;; | ||
| 2273 | MOV BUF.DID_PRN,AX ;; | ||
| 2274 | ;; | ||
| 2275 | ;; | ||
| 2276 | JMP RET_CHK_DID ;; | ||
| 2277 | ;; | ||
| 2278 | LPT_FAIL: ;; | ||
| 2279 | ;; | ||
| 2280 | MOV BUF.STATE,NORMAL ;; the LPTn is NORMAL --- STATE | ||
| 2281 | ;; | ||
| 2282 | ;; | ||
| 2283 | RET_CHK_DID: ;; | ||
| 2284 | ;; | ||
| 2285 | pop dx ;; | ||
| 2286 | pop di ;; | ||
| 2287 | pop cx ;; | ||
| 2288 | ;; | ||
| 2289 | RET ;; | ||
| 2290 | ;; | ||
| 2291 | CHK_DID ENDP ;; | ||
| 2292 | ;; | ||
| 2293 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2294 | ;; | ||
| 2295 | ;; Called by INIT to check for consistency between duplicated device name and | ||
| 2296 | ;; between PRN and LPT1 | ||
| 2297 | ;; | ||
| 2298 | ;; at entry : DI = pointer to PAR_DEVOT | ||
| 2299 | ;; BUF.STATE = any state | ||
| 2300 | ;; CX = DID order | ||
| 2301 | ;; | ||
| 2302 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2303 | ;; | ||
| 2304 | DEV_CHECK PROC ;; | ||
| 2305 | ;; | ||
| 2306 | LEA SI,BUF.PAR_EXTRACTO ;; | ||
| 2307 | ;; | ||
| 2308 | PUSH CX ;; | ||
| 2309 | ;; | ||
| 2310 | PUSH SI ;; compare device id | ||
| 2311 | PUSH DI ;; | ||
| 2312 | mov SI,[SI].PAR_DIDO ;; | ||
| 2313 | MOV DI,PSE.PAR_DIDO ;; | ||
| 2314 | MOV CX,PSE.PAR_DNML ;; | ||
| 2315 | INC CX ;; including length | ||
| 2316 | INC CX ;; | ||
| 2317 | REPE CMPSB ;; | ||
| 2318 | POP DI ;; | ||
| 2319 | POP SI ;; | ||
| 2320 | Jz hwcp_check ;; | ||
| 2321 | mov init_chk,0021h ;; error 0021h | ||
| 2322 | Jmp FORCE_LPT_BAD ;; | ||
| 2323 | ;; | ||
| 2324 | hwcp_check : ;; | ||
| 2325 | PUSH SI ;; compare HWCP | ||
| 2326 | PUSH DI ;; | ||
| 2327 | mov SI,[SI].PAR_HWCPO ;; | ||
| 2328 | MOV DI,PSE.PAR_HWCPO ;; | ||
| 2329 | MOV AX,PSE.PAR_HWCPL ;; | ||
| 2330 | MOV CX,2 ;; | ||
| 2331 | SHL AX,CL ;; multiply by two | ||
| 2332 | INC AX ;; including length | ||
| 2333 | INC AX ;; | ||
| 2334 | MOV CX,AX ;; | ||
| 2335 | REPE CMPSB ;; | ||
| 2336 | POP DI ;; | ||
| 2337 | POP SI ;; | ||
| 2338 | Jz desig_check ;; | ||
| 2339 | mov init_chk,0022h ;; error 0022h | ||
| 2340 | Jmp FORCE_LPT_BAD ;; | ||
| 2341 | ;; | ||
| 2342 | desig_check : ;; | ||
| 2343 | PUSH SI ;; compare DESIGNATE | ||
| 2344 | PUSH DI ;; | ||
| 2345 | mov SI,[SI].PAR_DESGO ;; | ||
| 2346 | MOV DI,PSE.PAR_DESGO ;; | ||
| 2347 | MOV AX,PSE.PAR_DESGL ;; | ||
| 2348 | MOV CX,2 ;; | ||
| 2349 | SHL AX,CL ;; multiply by two | ||
| 2350 | INC AX ;; including length | ||
| 2351 | INC AX ;; | ||
| 2352 | MOV CX,AX ;; | ||
| 2353 | REPE CMPSB ;; | ||
| 2354 | POP DI ;; | ||
| 2355 | POP SI ;; | ||
| 2356 | Jz param_check ;; | ||
| 2357 | mov init_chk,0023h ;; error 0023h | ||
| 2358 | Jmp FORCE_LPT_BAD ;; | ||
| 2359 | ;; | ||
| 2360 | param_check : ;; | ||
| 2361 | PUSH SI ;; compare parameters | ||
| 2362 | PUSH DI ;; | ||
| 2363 | mov SI,[SI].PAR_PARMO ;; | ||
| 2364 | MOV DI,PSE.PAR_PARMO ;; | ||
| 2365 | MOV CX,PSE.PAR_PARML ;; | ||
| 2366 | INC CX ;; including length | ||
| 2367 | INC CX ;; | ||
| 2368 | REPE CMPSB ;; | ||
| 2369 | POP DI ;; | ||
| 2370 | POP SI ;; | ||
| 2371 | JZ M_END ;; | ||
| 2372 | mov init_chk,0024h ;; error 0024h | ||
| 2373 | ;; | ||
| 2374 | FORCE_LPT_BAD : ;; the second set of parameters is | ||
| 2375 | MOV BUF.STATE,NORMAL ;; bad | ||
| 2376 | ;; | ||
| 2377 | CMP BUF.BFLAG,BF_LPT1 ;; | ||
| 2378 | JNE M_END ;; | ||
| 2379 | ;; | ||
| 2380 | ;; since LPT1 is bad, force PRN to bad | ||
| 2381 | push bx ;; force prn to be bad too | ||
| 2382 | mov bx,buf.prn_bufo ;; | ||
| 2383 | MOV BUF.STATE,NORMAL ;; | ||
| 2384 | pop bx ;; | ||
| 2385 | ;; | ||
| 2386 | mov AX,BUF.DID_PRN ;; if PRN was not good, DID_PRN = 0 | ||
| 2387 | OR DID_FAIL,AX ;; | ||
| 2388 | ;; | ||
| 2389 | ;; | ||
| 2390 | M_END: ;; force the good did_status to fail if | ||
| 2391 | ;; STATE is bad | ||
| 2392 | POP CX ;; | ||
| 2393 | PUSH CX ;; order 0 to m | ||
| 2394 | MOV AX,DID_STATUS ;; | ||
| 2395 | ;; | ||
| 2396 | INC CX ;; | ||
| 2397 | SHR AX,CL ;; | ||
| 2398 | POP CX ;; | ||
| 2399 | JNC DEV_CHECK_RET ;; already failed | ||
| 2400 | ;; | ||
| 2401 | CMP BUF.STATE,CPSW ;; | ||
| 2402 | JE DEV_CHECK_RET ;; | ||
| 2403 | ;; | ||
| 2404 | PUSH BX ;; | ||
| 2405 | MOV BX,CX ;; | ||
| 2406 | ADD BX,BX ;; | ||
| 2407 | MOV AX,DID_BIT[BX] ;; | ||
| 2408 | OR DID_FAIL,AX ;; force DID to fail | ||
| 2409 | POP BX ;; | ||
| 2410 | ;; | ||
| 2411 | ;; | ||
| 2412 | DEV_CHECK_RET : ;; | ||
| 2413 | ;; | ||
| 2414 | RET ;; | ||
| 2415 | ;; | ||
| 2416 | ;; | ||
| 2417 | DEV_CHECK ENDP ;; | ||
| 2418 | ;; | ||
| 2419 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2420 | ;; | ||
| 2421 | CSEG ENDS | ||
| 2422 | END | ||
diff --git a/v4.0/src/DEV/PRINTER/CPSPI07.ASM b/v4.0/src/DEV/PRINTER/CPSPI07.ASM new file mode 100644 index 0000000..740b136 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPI07.ASM | |||
| @@ -0,0 +1,1416 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; | ||
| 6 | ;; FILENAME: CPS Printer Device Driver INIT module (CPSPInn) | ||
| 7 | ;; MODULE NAME: | ||
| 8 | ;; TYPE: Assemble file (non-resident code) | ||
| 9 | ;; LINK PROCEDURE: Link CPSPMnn+CPSFONT+CPSPInn into .EXE format. CPSPM01 | ||
| 10 | ;; must be first. CPSPInn must be last. Everything | ||
| 11 | ;; before CPSPInn will be resident. | ||
| 12 | ;; INCLUDE FILES: | ||
| 13 | ;; CPSPEQU.INC | ||
| 14 | ;; | ||
| 15 | ;; LAYOUT : This file is divided into two main section : | ||
| 16 | ;; ++++++++++++++++++++++++ | ||
| 17 | ;; ++ DEVICE Parser ++ | ||
| 18 | ;; ++++++++++++++++++++++++ | ||
| 19 | ;; | ||
| 20 | ;; ++++++++++++++++++++++++ | ||
| 21 | ;; ++ INIT Command ++ | ||
| 22 | ;; ++++++++++++++++++++++++ | ||
| 23 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 24 | ;; | ||
| 25 | INCLUDE CPSPEQU.INC ;; | ||
| 26 | INT2F_LOW EQU (4*2FH) ;; WGR interrupt 2F vector location ;AN000; | ||
| 27 | INT2F_HI EQU (4*2FH)+2 ;; WGR ;AN000; | ||
| 28 | ;; | ||
| 29 | .XLIST ;; | ||
| 30 | INCLUDE SYSMSG.INC ;; WGR ;AN000; | ||
| 31 | .LIST ;; | ||
| 32 | ;; | ||
| 33 | MSG_UTILNAME <PRINTER> ;; WGR ;AN000; | ||
| 34 | ;; | ||
| 35 | PUBLIC INIT ;; | ||
| 36 | PUBLIC CODE_END ;; for MAP listing only | ||
| 37 | PUBLIC RESIDENT_END ;; | ||
| 38 | PUBLIC STACK_ALLOCATED ;; | ||
| 39 | ;; | ||
| 40 | ;; | ||
| 41 | EXTRN PRINTER_DESC_NUM:WORD ;; | ||
| 42 | EXTRN PRINTER_DESC_TBL:WORD ;; | ||
| 43 | EXTRN INIT_CHK:WORD,TABLE:WORD ;; | ||
| 44 | EXTRN HARD_SL1:BYTE,RAM_SL1:BYTE ;; | ||
| 45 | EXTRN HARD_SL2:BYTE,RAM_SL2:BYTE ;; | ||
| 46 | EXTRN HARD_SL3:BYTE,RAM_SL3:BYTE ;; | ||
| 47 | EXTRN HARD_SL4:BYTE,RAM_SL4:BYTE ;; | ||
| 48 | EXTRN RESERVED1:WORD,RESERVED2:WORD ;; | ||
| 49 | ;; | ||
| 50 | ;; | ||
| 51 | ;; | ||
| 52 | CSEG SEGMENT PARA PUBLIC 'CODE' ;; | ||
| 53 | ASSUME CS:CSEG ;; | ||
| 54 | ;; | ||
| 55 | ;; | ||
| 56 | EXTRN PARSER:NEAR ;; WGR ;AN000; | ||
| 57 | EXTRN ROM_INT2F:WORD ;; WGR ;AN000; | ||
| 58 | EXTRN INT2F_COM:NEAR ;; WGR ;AN000; | ||
| 59 | EXTRN ABORT:BYTE ;; WGR ;AN000; | ||
| 60 | |||
| 61 | CODE_END EQU $ ;; end of resident code | ||
| 62 | ;; | ||
| 63 | DW 0 ;; -- there are 16 bytes kept, | ||
| 64 | ;; including this word | ||
| 65 | ;; | ||
| 66 | RESIDENT_END DW 0FFFH ;; end of extended resident area | ||
| 67 | STACK_ALLOCATED DW -1 ;; end of extended resident area | ||
| 68 | ;; | ||
| 69 | DW 150 DUP(0) ;; need some space here. | ||
| 70 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 71 | ;; | ||
| 72 | ;; End of resident code | ||
| 73 | ;; | ||
| 74 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 75 | ;; | ||
| 76 | ;; ++++++++++++++++++++++++ | ||
| 77 | ;; ++ INIT Command ++ | ||
| 78 | ;; ++++++++++++++++++++++++ | ||
| 79 | ;; | ||
| 80 | ;;==== Command Code 0 - Initialization ====== | ||
| 81 | ;; | ||
| 82 | ;; messages returned : | ||
| 83 | ;; | ||
| 84 | ;; msg_bad_syntax -- syntax error from parser, no driver installation | ||
| 85 | ;; msg_no_init -- device cannot be initialised | ||
| 86 | ;; msg_insuff_mem -- insufficient memory | ||
| 87 | ;; | ||
| 88 | ;; layout : the initialization is done in two stages : | ||
| 89 | ;; | ||
| 90 | ;; ++++++++++++++++++++++++ | ||
| 91 | ;; ++ INIT Stage 1 ++ to examine and extract the | ||
| 92 | ;; ++++++++++++++++++++++++ parameters defined for the | ||
| 93 | ;; device_id in DEVICE command, | ||
| 94 | ;; according to the printer | ||
| 95 | ;; description table for the | ||
| 96 | ;; device_id. | ||
| 97 | ;; | ||
| 98 | ;; ++++++++++++++++++++++++ | ||
| 99 | ;; ++ INIT Stage 2 ++ to set the BUFfer for the LPTn | ||
| 100 | ;; ++++++++++++++++++++++++ or PRN according to device_id's | ||
| 101 | ;; parameters | ||
| 102 | ;; | ||
| 103 | ;; | ||
| 104 | ;; | ||
| 105 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 106 | ;; | ||
| 107 | DEV_NUM dw ? ;; | ||
| 108 | ;; | ||
| 109 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 110 | ; | ||
| 111 | ; Tables for the deivce_id parameters in the order of device_id in the | ||
| 112 | ; PARSE table | ||
| 113 | ; === the tables serves as the link between LPTn to be defined in the 2nd | ||
| 114 | ; stage, and the device_id that is processed in the first stage. | ||
| 115 | ; | ||
| 116 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 117 | ;; | ||
| 118 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 119 | ;; device ID indicators : | ||
| 120 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 121 | DID_MAX EQU 4 ;; device entris exepcted in PARSE | ||
| 122 | ;; not more than 16. ;; table | ||
| 123 | ;; | ||
| 124 | DID_STATUS DW 0 ;; status of parsing device id | ||
| 125 | ;; = 0 : all Device-ID bad | ||
| 126 | ;; -- see DID_BIT | ||
| 127 | ;; | ||
| 128 | DID_MATCH DW 0 ;; this DID has device_name matched | ||
| 129 | ;; | ||
| 130 | DID_FAIL DW 0 ;; to fail the good DID_STATUS and | ||
| 131 | ;; the matched name. (due to | ||
| 132 | ;; inconsistency among the same LPTn | ||
| 133 | ;; or between PRN and LPT1.) | ||
| 134 | ;; | ||
| 135 | ;; (DID_STATUS) AND (DID_MATCH) XOR (DID_FAIL) determines the success of DID | ||
| 136 | ;; initialization | ||
| 137 | ;; | ||
| 138 | DID_ONE EQU 00001H ;; first device-ID | ||
| 139 | DID_TWO EQU 00002H ;; second " | ||
| 140 | DID_THREE EQU 00004H ;; third " | ||
| 141 | DID_FOUR EQU 00008H ;; fourth " | ||
| 142 | ;;maximun number of device_id = 16 ;; | ||
| 143 | ;; | ||
| 144 | DID_BIT LABEL WORD ;; | ||
| 145 | DW DID_ONE ;; | ||
| 146 | DW DID_TWO ;; | ||
| 147 | DW DID_THREE ;; | ||
| 148 | DW DID_FOUR ;; | ||
| 149 | ;;maximun number of device_id = 16 ;; | ||
| 150 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 151 | ;; device paramters according to the | ||
| 152 | ;; device_id defined in DEVICE and the | ||
| 153 | ;; parameters defined for the device_id | ||
| 154 | ;; in the printer description table. | ||
| 155 | ;; | ||
| 156 | HRMAX LABEL word ;; number of hwcp+cart slots supported | ||
| 157 | DW 0 ;; did = 1 | ||
| 158 | DW 0 ;; did = 2 | ||
| 159 | DW 0 ;; did = 3 | ||
| 160 | DW 0 ;; did = 4 | ||
| 161 | ;upto max DID_MAX ;; | ||
| 162 | ;; | ||
| 163 | CTMAX LABEL word ;; number of cart slots supported | ||
| 164 | DW 0 ;; did = 1 | ||
| 165 | DW 0 ;; did = 2 | ||
| 166 | DW 0 ;; did = 3 | ||
| 167 | DW 0 ;; did = 4 | ||
| 168 | ;upto max DID_MAX ;; | ||
| 169 | ;; | ||
| 170 | RMMAX LABEL word ;; number of ram-slots supported | ||
| 171 | DW 0 ;; did = 1 | ||
| 172 | DW 0 ;; did = 2 | ||
| 173 | DW 0 ;; did = 3 | ||
| 174 | DW 0 ;; did = 4 | ||
| 175 | ;upto max DID_MAX ;; | ||
| 176 | ;; | ||
| 177 | RBUMAX LABEL word ;; number of ram-designate slots | ||
| 178 | DW 0 ;; did = 1 | ||
| 179 | DW 0 ;; did = 2 | ||
| 180 | DW 0 ;; did = 3 | ||
| 181 | DW 0 ;; did = 4 | ||
| 182 | ;upto max DID_MAX ;; | ||
| 183 | ;; | ||
| 184 | DESCO LABEL word ;; offset to the description table | ||
| 185 | ;; where the device_id is defined. | ||
| 186 | DW -1 ;; did = 1 | ||
| 187 | DW -1 ;; did = 2 | ||
| 188 | DW -1 ;; did = 3 | ||
| 189 | DW -1 ;; did = 4 | ||
| 190 | ;upto max DID_MAX ;; | ||
| 191 | ;; | ||
| 192 | FSIZE LABEL word ;; font size of the device | ||
| 193 | DW 0 ;; did = 1 | ||
| 194 | DW 0 ;; did = 2 | ||
| 195 | DW 0 ;; did = 3 | ||
| 196 | DW 0 ;; did = 4 | ||
| 197 | ;upto max DID_MAX ;; | ||
| 198 | ;; | ||
| 199 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 200 | ; | ||
| 201 | ; Hard/RAM slots table in the order of DEVICE parameters | ||
| 202 | ; | ||
| 203 | ; number of entries in all HARD_SLn is determined by the max. {HSLOTS}, and | ||
| 204 | ; number of entries in all RAM_SLn is determined by the max. {RSLOTS} | ||
| 205 | ; | ||
| 206 | ; -- they are initialized according to the device_id defined in the DEVICE. | ||
| 207 | ; | ||
| 208 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 209 | ;; | ||
| 210 | HARD_SLA LABEL word ;; index in the order of device in | ||
| 211 | DW OFFSET (HARD_SL1) ;; the PARSE-talbes | ||
| 212 | DW OFFSET (HARD_SL2) ;; | ||
| 213 | DW OFFSET (HARD_SL3) ;; | ||
| 214 | DW OFFSET (HARD_SL4) ;; | ||
| 215 | ; up to DID_MAX ;; | ||
| 216 | ;; | ||
| 217 | RAM_SLA LABEL word ;; | ||
| 218 | DW OFFSET (RAM_SL1) ;; | ||
| 219 | DW OFFSET (RAM_SL2) ;; | ||
| 220 | DW OFFSET (RAM_SL3) ;; | ||
| 221 | DW OFFSET (RAM_SL4) ;; | ||
| 222 | ; up to DID_MAX ;; | ||
| 223 | ;; | ||
| 224 | SUB_SIZE EQU 11 ;; WGR sublist size ;AN000; | ||
| 225 | LEFT_ASCIIZ EQU 00010000B ;; WGR left-aligned asciiz string ;AN000; | ||
| 226 | UNLIMITED EQU 0 ;; WGR unlimited message size. ;AN000; | ||
| 227 | ;; WGR ;AN000; | ||
| 228 | SUBLIST LABEL DWORD ;; WGR ;AN000; | ||
| 229 | DB SUB_SIZE ;; WGR ;AN000; | ||
| 230 | DB 0 ;; WGR ;AN000; | ||
| 231 | MSG_PTR DW ? ;; WGR ;AN000; | ||
| 232 | MSG_SEG DW SEG CSEG ;; WGR ;AN000; | ||
| 233 | DB 1 ;; WGR ;AN000; | ||
| 234 | DB LEFT_ASCIIZ ;; WGR ;AN000; | ||
| 235 | DB UNLIMITED ;; WGR ;AN000; | ||
| 236 | DB 1 ;; WGR ;AN000; | ||
| 237 | DB " " ;; WGR ;AN000; | ||
| 238 | ; | ||
| 239 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 240 | ;; | ||
| 241 | ;; ++++++++++++++++++++++++ | ||
| 242 | ;; ++ INIT Command ++ | ||
| 243 | ;; ++++++++++++++++++++++++ | ||
| 244 | ;; | ||
| 245 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 246 | ;; | ||
| 247 | INIT PROC NEAR ;; | ||
| 248 | ;; | ||
| 249 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 250 | ;; parse the initialization parameters in DEVICE command | ||
| 251 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 252 | ;; | ||
| 253 | PUSH BX ;; WGR ;AN000; | ||
| 254 | CALL SYSLOADMSG ;; WGR load messages ;AN000; | ||
| 255 | JNC CONT_1 ;; WGR if no error then continue ;AN000; | ||
| 256 | CALL SYSDISPMSG ;; WGR error (DOS version)..display ;AN000; | ||
| 257 | POP BX ;; WGR message.... ;AN000; | ||
| 258 | JMP SYNTAX_ERROR ;; WGR ...and exit with error code. ;AN000; | ||
| 259 | ;; WGR ;AN000; | ||
| 260 | CONT_1: ;; WGR ;AN000; | ||
| 261 | POP BX ;; WGR ;AN000; | ||
| 262 | CMP BUF.BFLAG,BF_PRN ;; since PRN is the FIRST device header | ||
| 263 | JNE NOT_PRN ;; | ||
| 264 | ;; | ||
| 265 | ;; | ||
| 266 | MOV AX,OFFSET CODE_END ;; defined only once for each DEVICE | ||
| 267 | XOR CX,CX ;; | ||
| 268 | MOV CL,4 ;; | ||
| 269 | SHR AX,CL ;; | ||
| 270 | PUSH CS ;; | ||
| 271 | POP CX ;; | ||
| 272 | ADD AX,CX ;; | ||
| 273 | INC AX ;; leave 16 bytes,room for resident_end | ||
| 274 | MOV RESIDENT_END,AX ;; | ||
| 275 | ;; | ||
| 276 | CALL PARSER ;; call only once, for PRM | ||
| 277 | ;; | ||
| 278 | JMP PROCESS_TABLE ;; | ||
| 279 | ;; | ||
| 280 | NOT_PRN : ;; | ||
| 281 | CMP DEV_NUM,1 ;; | ||
| 282 | ;; | ||
| 283 | JNB PROCESS_TABLE ;; | ||
| 284 | ;; | ||
| 285 | JMP SYNTAX_ERROR ;; | ||
| 286 | ;; | ||
| 287 | ;; | ||
| 288 | ;; | ||
| 289 | ;; | ||
| 290 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 291 | ;; | ||
| 292 | ;; ++++++++++++++++++++++++ | ||
| 293 | ;; ++ INIT Stage 1 ++ | ||
| 294 | ;; ++++++++++++++++++++++++ | ||
| 295 | ;; | ||
| 296 | ;; INIT - FIRST STAGE : | ||
| 297 | ;; | ||
| 298 | ;; == test and extract if the parameters on device-id is valid | ||
| 299 | ;; == determine the DID_STATUS according to the validity of the parameters | ||
| 300 | ;; == procedure(s) called -- DID_EXTRACT | ||
| 301 | ;; | ||
| 302 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 303 | ;; | ||
| 304 | PROCESS_TABLE : ;; | ||
| 305 | ;; | ||
| 306 | PUSH CS ;; | ||
| 307 | POP ES ;; PSE points to Device offsets | ||
| 308 | MOV DI,OFFSET(table) ;; ES:[DI] | ||
| 309 | MOV DX,PSE.PAR_DEV_NUM ;; | ||
| 310 | MOV DEV_NUM,DX ;; | ||
| 311 | ;; | ||
| 312 | CMP DEV_NUM,0 ;; | ||
| 313 | JNZ NO_SYNTAX_ERR ;; | ||
| 314 | ;; | ||
| 315 | ;; WGR ;AN000; | ||
| 316 | PUSH BX ;; WGR ;AN000; | ||
| 317 | MOV AX,BAD_SYNTAX_MSG ;; WGR 'bad syntax' message ;AN000; | ||
| 318 | MOV BX,STDERR ;; WGR to standard error ;AN000; | ||
| 319 | XOR CX,CX ;; WGR ;AN000; | ||
| 320 | XOR DL,DL ;; WGR ;AN000; | ||
| 321 | MOV DH,UTILITY_MSG_CLASS ;; WGR class = parse error ;AN000; | ||
| 322 | CALL SYSDISPMSG ;; WGR display message. ;AN000; | ||
| 323 | POP BX ;; WGR ;AN000; | ||
| 324 | ;; | ||
| 325 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 326 | SYNTAX_ERROR : ;; set the request header status | ||
| 327 | ;; according to the STATE | ||
| 328 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 329 | MOV AX, RESIDENT_END ;; | ||
| 330 | PUSH CS ;; | ||
| 331 | POP CX ;; CX=CS | ||
| 332 | SUB AX,Cx ;; additional segment required. | ||
| 333 | CS_LOOP1: ;; | ||
| 334 | CMP AX,1000H ;; | ||
| 335 | JB CS_LPEND1 ;; | ||
| 336 | ADD CX,1000H ;; | ||
| 337 | SUB AX,1000H ;; | ||
| 338 | JMP CS_LOOP1 ;; | ||
| 339 | ;; | ||
| 340 | CS_LPEND1: ;; | ||
| 341 | SHL AX,1 ;; | ||
| 342 | SHL AX,1 ;; | ||
| 343 | SHL AX,1 ;; | ||
| 344 | SHL AX,1 ;; | ||
| 345 | ;; | ||
| 346 | LES DI,dword ptr buf.rh_ptro ;; get Request Header address | ||
| 347 | ; MOV RH.RH0_ENDO,AX ;; | ||
| 348 | MOV RH.RH0_ENDO,0 ;; | ||
| 349 | MOV RH.RH0_ENDS,CX ;; | ||
| 350 | mov rh.RH0_CONFIG_ERRMSG, -1 ;DCR D493 2/25/88 "Error in CONFIG.SYS..." msg flag. | ||
| 351 | MOV RH.RHC_STA,stat_cmderr ;; set status in request header | ||
| 352 | ;; | ||
| 353 | JMP INIT_RETurn ;; | ||
| 354 | ;; | ||
| 355 | ;; | ||
| 356 | NO_SYNTAX_ERR : ;; | ||
| 357 | ;; | ||
| 358 | CMP DX,DID_MAX ;; | ||
| 359 | JNA NEXT_DID ;; | ||
| 360 | ;; | ||
| 361 | MOV INIT_CHK,0001H ;; ERROR 0001 | ||
| 362 | JMP BAD_DID ;; more than supported no. of device | ||
| 363 | ;; | ||
| 364 | NEXT_DID: ;; | ||
| 365 | PUSH DI ;; pointer to PAR_OT (table 1) | ||
| 366 | AND DX,DX ;; | ||
| 367 | JNZ SCAN_DESC ;; | ||
| 368 | JMP END_DID ;; DI = offset to the 1st PARSE table | ||
| 369 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 370 | SCAN_DESC: ;; | ||
| 371 | MOV DI,PSE.PAR_OFF ;; points to the nth device | ||
| 372 | ;; | ||
| 373 | ;; find the description for the | ||
| 374 | ;;device-id | ||
| 375 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 376 | MOV CX,PRINTER_DESC_NUM ;; | ||
| 377 | MOV SI, OFFSET(PRINTER_DESC_TBL); offset to the description table | ||
| 378 | PUSH CS ;; | ||
| 379 | POP DS ;; | ||
| 380 | ; $SEARCH ;; | ||
| 381 | $$DO1: | ||
| 382 | PUSH CX ;; save device count | ||
| 383 | PUSH SI ;; pointer to printer-descn's offset | ||
| 384 | MOV SI,CS:WORD PTR[SI] ;; | ||
| 385 | AND CX,CX ;; | ||
| 386 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 387 | ; $LEAVE Z ;; LEAVE if no more device description | ||
| 388 | JZ $$EN1 | ||
| 389 | PUSH DI ;; save offset to PAR_DEVOT | ||
| 390 | MOV DI,PSE.PAR_DIDO ;; | ||
| 391 | MOV CX,PSE.PAR_DIDL ;; length of parsed device name | ||
| 392 | LEA DI,PSE.PAR_DID ;; pointer to parse device name | ||
| 393 | ;; | ||
| 394 | PUSH SI ;; | ||
| 395 | LEA SI,[SI].TYPEID ;; offset to name of device-id | ||
| 396 | REPE CMPSB ;; | ||
| 397 | POP SI ;; | ||
| 398 | POP DI ;; get back offset to PAR_DEVOT | ||
| 399 | ;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 400 | ; $EXITIF Z ;; EXIT if name matched | ||
| 401 | JNZ $$IF1 | ||
| 402 | ;; | ||
| 403 | CALL DID_EXTRACT ;; get the parameters | ||
| 404 | ;; | ||
| 405 | POP SI ;; balance push-pop | ||
| 406 | POP CX ;; | ||
| 407 | ;; | ||
| 408 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 409 | ; $ORELSE ;; try next description : | ||
| 410 | JMP SHORT $$SR1 | ||
| 411 | $$IF1: | ||
| 412 | ;; | ||
| 413 | POP SI ;; of printer_descn offset table | ||
| 414 | INC SI ;; | ||
| 415 | INC SI ;; next offset to PRINTER_DESCn | ||
| 416 | ;; | ||
| 417 | POP CX ;; one description less | ||
| 418 | DEC CX ;; | ||
| 419 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 420 | ; $ENDLOOP ;; DEVICE-ID not defined in | ||
| 421 | JMP SHORT $$DO1 | ||
| 422 | $$EN1: | ||
| 423 | ;; printer_desc; | ||
| 424 | ;; | ||
| 425 | MOV AX,INIT_CHK ;; | ||
| 426 | AND AX,AX ;; | ||
| 427 | JNZ UNCHANGED ;; | ||
| 428 | MOV INIT_CHK,0004H ;; ERROR 0004 | ||
| 429 | UNCHANGED: ;; | ||
| 430 | POP SI ;; balance push-pop | ||
| 431 | POP CX ;; | ||
| 432 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 433 | ; $ENDSRCH ;; End of scanning printer_desc | ||
| 434 | $$SR1: | ||
| 435 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 436 | POP DI ;; | ||
| 437 | INC DI ;; | ||
| 438 | INC DI ;; points to next device in PART_OT | ||
| 439 | DEC DX ;; | ||
| 440 | ;; | ||
| 441 | JMP NEXT_DID ;; | ||
| 442 | ;; | ||
| 443 | END_DID : ;; | ||
| 444 | POP DI ;; | ||
| 445 | BAD_DID : ;; | ||
| 446 | ;; | ||
| 447 | MOV AX,DID_STATUS ;; | ||
| 448 | AND AX,AX ;; | ||
| 449 | JNZ DEF_BUFFER ;; | ||
| 450 | ;; | ||
| 451 | JMP END_LPT ;; | ||
| 452 | ;; | ||
| 453 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 454 | ;; | ||
| 455 | ;; ++++++++++++++++++++++++ | ||
| 456 | ;; ++ INIT Stage 2 ++ | ||
| 457 | ;; ++++++++++++++++++++++++ | ||
| 458 | ;; | ||
| 459 | ;; INIT -- SECOND STAGE : | ||
| 460 | ;; | ||
| 461 | ;; == match the device_name extracted in stage 1 with the name of PRN or | ||
| 462 | ;; LPTn | ||
| 463 | ;; | ||
| 464 | ;; == if the PRN/LPTn has never been defined before, then set up the BUF | ||
| 465 | ;; for the PRN/LPTn if the DID_STATUS is good; otherwise message will | ||
| 466 | ;; be generated indicating it cannot be initilized. | ||
| 467 | ;; | ||
| 468 | ;; == if there is PRN, LPT1 is also setup, and vice vera. IF both PRN and | ||
| 469 | ;; LPT1 are on the DEVICE command, or there are multiple entries for | ||
| 470 | ;; the same LPTn, the consistency is checked. It they are inconsistent | ||
| 471 | ;; the associated LPTn or PRN is forced to fail by : DID_FAIL. | ||
| 472 | ;; | ||
| 473 | ;; == if the device_name on the DEVICE command is not one of the supported | ||
| 474 | ;; PRN or LPTn, then DID_MATCH bit will not be set. An error message | ||
| 475 | ;; will be generated for the device_name indicating it cannot be | ||
| 476 | ;; initialized. | ||
| 477 | ;; | ||
| 478 | ;; == procedure(s) called : CHK_DID .. check DID parameters for device | ||
| 479 | ;; whose name matched. | ||
| 480 | ;; DEV_CHECK .. if device-name duplicated, or | ||
| 481 | ;; there are both PRN/LPT1 : check | ||
| 482 | ;; for consistent parameters. | ||
| 483 | ;; | ||
| 484 | ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | ||
| 485 | DEF_BUFFER : ;; | ||
| 486 | PUSH CS ;; | ||
| 487 | POP ES ;; PSE points to Device offsets | ||
| 488 | MOV DI,OFFSET(table) ;; ES:[DI] | ||
| 489 | xor cx,cx ;; device order in parse table | ||
| 490 | ;SEARCH ;; | ||
| 491 | $$DO7: | ||
| 492 | PUSH DI ;; pointer to PAR_OT | ||
| 493 | PUSH CX ;; save device count | ||
| 494 | MOV DI,PSE.PAR_OFF ;; " " PAR_DEVOT | ||
| 495 | cmp cx,dev_num ;; | ||
| 496 | ;; | ||
| 497 | ;LEAVE NB ;; LEAVE if no more device entry | ||
| 498 | jb MORE_DEVICE ;; | ||
| 499 | JMP $$EN7 | ||
| 500 | MORE_DEVICE : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 501 | ;; more parsed_device to be checked | ||
| 502 | PUSH DI ;; save offset to PAR_DEVOT | ||
| 503 | MOV DI,PSE.PAR_DNMO ;; | ||
| 504 | MOV CX,PSE.PAR_DNML ;; length of parsed device name | ||
| 505 | LEA DI,PSE.PAR_DNM ;; pointer to parse device name | ||
| 506 | ;; | ||
| 507 | LDS SI,DWORD PTR BUF.DEV_HDRO ; get the offset to device-n header | ||
| 508 | LEA SI,HP.DH_NAME ;; " offset to name of device-n | ||
| 509 | REPE CMPSB ;; | ||
| 510 | POP DI ;; get back offset to PAR_DEVOT | ||
| 511 | ;; | ||
| 512 | ;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 513 | ;EXITIF Z ;; EXIT if name matched | ||
| 514 | JZ NAME_MATCHED ;; | ||
| 515 | ;; | ||
| 516 | JMP MORE_PARSED_DEVICE ;; | ||
| 517 | ;; | ||
| 518 | NAME_MATCHED : ;; | ||
| 519 | ;; | ||
| 520 | POP CX ;; the DID order | ||
| 521 | PUSH BX ;; | ||
| 522 | MOV BX,CX ;; | ||
| 523 | ADD BX,BX ;; | ||
| 524 | MOV AX,DID_BIT[BX] ;; | ||
| 525 | OR DID_MATCH,AX ;; this DID matched | ||
| 526 | POP BX ;; | ||
| 527 | PUSH CX ;; | ||
| 528 | ;; | ||
| 529 | LEA SI,BUF.PAR_EXTRACTO ;; was the LPT1/PRN defined before ? | ||
| 530 | MOV AX,CS:[SI].PAR_DNMO ;; | ||
| 531 | CMP AX,0FFFFH ;; | ||
| 532 | ;; | ||
| 533 | JNE DEV_COMPARE ;; DI = PAR_DEVOT | ||
| 534 | ;;----------------------------------- | ||
| 535 | ;; | ||
| 536 | ;; no device previousely defined | ||
| 537 | MOV AX,PSE.PAR_DNMO ;; | ||
| 538 | MOV CS:[SI].PAR_DNMO,AX ;; define device parameters for LPTn | ||
| 539 | ;; | ||
| 540 | MOV AX,PSE.PAR_DIDO ;; | ||
| 541 | MOV CS:[SI].PAR_DIDO,AX ;; | ||
| 542 | ;; | ||
| 543 | MOV AX,PSE.PAR_HWCPO ;; | ||
| 544 | MOV CS:[SI].PAR_HWCPO,AX ;; | ||
| 545 | ;; | ||
| 546 | MOV AX,PSE.PAR_DESGO ;; | ||
| 547 | MOV CS:[SI].PAR_DESGO,AX ;; | ||
| 548 | ;; | ||
| 549 | MOV AX,PSE.PAR_PARMO ;; | ||
| 550 | MOV CS:[SI].PAR_PARMO,AX ;; | ||
| 551 | ;; | ||
| 552 | ;;--------------------------------- | ||
| 553 | CALL CHK_DID ;; define the STATE according to | ||
| 554 | ;; DID_STATUS | ||
| 555 | JMP MORE_PARSED_DEVICE ;; | ||
| 556 | ;; | ||
| 557 | DEV_COMPARE : ;;------------------------------- | ||
| 558 | ;; e.g. LPT1 and PRN shares one BUF. | ||
| 559 | ;; or duplicated device name | ||
| 560 | CALL DEV_CHECK ;; | ||
| 561 | ;; | ||
| 562 | CMP BUF.STATE,CPSW ;; | ||
| 563 | JNE DEV_COMPARE_FAIL ;; | ||
| 564 | ;; | ||
| 565 | JMP MORE_PARSED_DEVICE ;; | ||
| 566 | ;; | ||
| 567 | DEV_COMPARE_FAIL : ;; | ||
| 568 | ;; | ||
| 569 | POP CX ;; | ||
| 570 | POP DI ;; balance push-pop | ||
| 571 | ;; | ||
| 572 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 573 | ;$ORELSE ;; | ||
| 574 | JMP END_LPT | ||
| 575 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 576 | MORE_PARSED_DEVICE : ;; name does not match | ||
| 577 | ;; | ||
| 578 | POP CX ;; | ||
| 579 | INC CX ;; | ||
| 580 | POP DI ;; | ||
| 581 | INC DI ;; | ||
| 582 | INC DI ;; points to next device in PART_OT | ||
| 583 | ;; | ||
| 584 | jmp $$DO7 ;; | ||
| 585 | ;$ENDLOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 586 | $$EN7: ;; no device found for LPTn | ||
| 587 | ;; | ||
| 588 | POP CX ;; | ||
| 589 | POP DI ;; balance push-pop | ||
| 590 | ;; | ||
| 591 | CMP BUF.STATE,CPSW ;; | ||
| 592 | JE END_LPT ;; for LPT1/PRN pair | ||
| 593 | ;; | ||
| 594 | MOV BUF.STATE,NORMAL ;; no device defined for the LPTn | ||
| 595 | ;; | ||
| 596 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 597 | ;; End of defining LPTn Buffer | ||
| 598 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 599 | ;$ENDSRCH ;; | ||
| 600 | END_LPT : ;; | ||
| 601 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 602 | ;; set the request header status | ||
| 603 | ;; according to the STATE | ||
| 604 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 605 | MOV AX, RESIDENT_END ;; | ||
| 606 | PUSH CS ;; | ||
| 607 | POP CX ;; CX=CS | ||
| 608 | SUB AX,Cx ;; additional segment required. | ||
| 609 | CS_LOOP2: ;; | ||
| 610 | CMP AX,1000H ;; | ||
| 611 | JB CS_LPEND2 ;; | ||
| 612 | ADD CX,1000H ;; | ||
| 613 | SUB AX,1000H ;; | ||
| 614 | JMP CS_LOOP2 ;; | ||
| 615 | ;; | ||
| 616 | CS_LPEND2: ;; | ||
| 617 | SHL AX,1 ;; | ||
| 618 | SHL AX,1 ;; | ||
| 619 | SHL AX,1 ;; | ||
| 620 | SHL AX,1 ;; | ||
| 621 | ;; | ||
| 622 | LES DI,dword ptr buf.rh_ptro ;; get Request Header address | ||
| 623 | MOV RH.RH0_ENDO,AX ;; | ||
| 624 | MOV RH.RH0_ENDS,CX ;; | ||
| 625 | XOR AX,AX ;; clear error code to be returned | ||
| 626 | MOV CX,BUF.STATE ;; | ||
| 627 | CMP CX,CPSW ;; | ||
| 628 | JE MATCH_GOOD ;; | ||
| 629 | MOV AX,STAT_CMDERR ;; | ||
| 630 | ;; | ||
| 631 | MATCH_GOOD : ;; | ||
| 632 | MOV RH.RHC_STA,AX ;; set status in request header | ||
| 633 | CALL LOAD_INT2F ;; WGR load INT2f handler ;AN000; | ||
| 634 | ;; | ||
| 635 | BUF_END : ;; | ||
| 636 | ;; | ||
| 637 | CMP BUF.BFLAG,BF_LPT1 ;; | ||
| 638 | JNE BUF_MESSAGES ;; | ||
| 639 | ;; | ||
| 640 | CMP BUF.STATE,CPSW ;; | ||
| 641 | JNE BUF_MESSAGES ;; | ||
| 642 | ;; set PRN to the same setting as LPT1 | ||
| 643 | PUSH BX ;; | ||
| 644 | ;; | ||
| 645 | LEA SI,BUF.RNORMO ;; | ||
| 646 | LEA CX,BUF.BUFEND ;; | ||
| 647 | SUB CX,SI ;; | ||
| 648 | MOV BX,BUF.PRN_BUFO ;; where PRN buffer is | ||
| 649 | LEA DI,BUF.RNORMO ;; | ||
| 650 | PUSH CS ;; | ||
| 651 | POP ES ;; | ||
| 652 | PUSH CS ;; | ||
| 653 | POP DS ;; | ||
| 654 | REP MOVSB ;; | ||
| 655 | ;; | ||
| 656 | POP BX ;; | ||
| 657 | ;; | ||
| 658 | BUF_MESSAGES : ;; | ||
| 659 | CMP BUF.BFLAG,BF_LPT3 ;; generate error message is this is | ||
| 660 | je last_round ;; the last LPTn | ||
| 661 | Jmp INIT_RETURN ;; | ||
| 662 | ;; ERROR messages will be generated | ||
| 663 | ;; at the end of initialization of all | ||
| 664 | ;; the LPT devices | ||
| 665 | last_round : ;; | ||
| 666 | MOV AX,RESIDENT_END ;; | ||
| 667 | ADD AX,STACK_SIZE ;; | ||
| 668 | MOV RESIDENT_END,AX ;; | ||
| 669 | PUSH CS ;; | ||
| 670 | POP CX ;; CX=CS | ||
| 671 | SUB AX,Cx ;; additional segment required. | ||
| 672 | CS_LOOP3: ;; | ||
| 673 | CMP AX,1000H ;; | ||
| 674 | JB CS_LPEND3 ;; | ||
| 675 | ADD CX,1000H ;; | ||
| 676 | SUB AX,1000H ;; | ||
| 677 | JMP CS_LOOP3 ;; | ||
| 678 | ;; | ||
| 679 | CS_LPENd3: ;; | ||
| 680 | SHL AX,1 ;; | ||
| 681 | SHL AX,1 ;; | ||
| 682 | SHL AX,1 ;; | ||
| 683 | SHL AX,1 ;; | ||
| 684 | ;; | ||
| 685 | MOV RH.RH0_ENDO,AX ;; STACK !!!!! | ||
| 686 | MOV STACK_ALLOCATED,0 ;; from now on, internal stack is used | ||
| 687 | ;; | ||
| 688 | MOV AX,DID_STATUS ;; what is the DID combination ? | ||
| 689 | AND AX,DID_MATCH ;; | ||
| 690 | XOR AX,DID_FAIL ;; | ||
| 691 | ;; | ||
| 692 | AND AX,AX ;; | ||
| 693 | JNZ CODE_STAYED ;; | ||
| 694 | ; MOV RH.RH0_ENDO,0 ;; none of the devices are good | ||
| 695 | ;; | ||
| 696 | ;; | ||
| 697 | CODE_STAYED : ;; | ||
| 698 | MOV DI,OFFSET TABLE ;; | ||
| 699 | push CS ;; | ||
| 700 | POP ES ;; | ||
| 701 | ;; | ||
| 702 | XOR CX,CX ;; | ||
| 703 | MSG_LOOP : ;; | ||
| 704 | CMP CX,DEV_NUM ;; | ||
| 705 | JNB INIT_RETURN ;; | ||
| 706 | SHR AX,1 ;; | ||
| 707 | JC MSG_NEXT ;; | ||
| 708 | ;; this device in parse table is bad | ||
| 709 | PUSH DI ;; | ||
| 710 | PUSH CX ;; | ||
| 711 | PUSH AX ;; | ||
| 712 | PUSH BX ;; WGR ;AN000; | ||
| 713 | PUSH DX ;; WGR ;AN000; | ||
| 714 | ;; | ||
| 715 | MOV DI,PSE.PAR_OFF ;; | ||
| 716 | MOV SI,PSE.PAR_DNMO ;; | ||
| 717 | ;; | ||
| 718 | PUSH CS ;; | ||
| 719 | POP ES ;; | ||
| 720 | PUSH CS ;; | ||
| 721 | POP DS ;; | ||
| 722 | ;; | ||
| 723 | MOV CX,8 ;; | ||
| 724 | LEA SI,[SI].PAR_DNM ;; | ||
| 725 | MOV DI,SI ;; | ||
| 726 | MOV AL,' ' ;; WGR ;AN000; | ||
| 727 | CLD ;; WGR ;AN000; | ||
| 728 | REPNE SCASB ;; WGR ;AN000; | ||
| 729 | DEC DI ;; WGR ;AN000; | ||
| 730 | MOV BYTE PTR ES:[DI],ZERO ;; WGR ;AN000; | ||
| 731 | ;; WGR ;AN000; | ||
| 732 | MOV MSG_SEG,CS ;; WGR ;AN000; | ||
| 733 | MOV MSG_PTR,SI ;; WGR ;AN000; | ||
| 734 | MOV AX,BAD_DEVICE_MSG ;; WGR ;AN000; | ||
| 735 | MOV BX,STDERR ;; WGR ;AN000; | ||
| 736 | LEA SI,SUBLIST ;; WGR ;AN000; | ||
| 737 | MOV CX,ONE ;; WGR ;AN000; | ||
| 738 | XOR DL,DL ;; WGR ;AN000; | ||
| 739 | MOV DH,UTILITY_MSG_CLASS ;; WGR ;AN000; | ||
| 740 | CALL SYSDISPMSG ;; WGR ;AN000; | ||
| 741 | ;; ;AN000; | ||
| 742 | POP DX ;; WGR ;AN000; | ||
| 743 | POP BX ;; WGR ;AN000; | ||
| 744 | POP AX ;; | ||
| 745 | POP CX ;; | ||
| 746 | POP DI ;; | ||
| 747 | ;; | ||
| 748 | MSG_NEXT : ;; | ||
| 749 | INC CX ;; | ||
| 750 | INC DI ;; | ||
| 751 | INC DI ;; | ||
| 752 | JMP MSG_LOOP ;; | ||
| 753 | ;; | ||
| 754 | ;; | ||
| 755 | INIT_RETURN : ;; | ||
| 756 | ;; | ||
| 757 | ;; | ||
| 758 | RET ;; | ||
| 759 | ;; | ||
| 760 | INIT ENDP ;; | ||
| 761 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 762 | ;; | ||
| 763 | ;; Call by INIT to extract parameters for the deivce_id | ||
| 764 | ;; | ||
| 765 | ;; on rntry : | ||
| 766 | ;; ES:[DI] PARSE Table 2, offsets of all parameters | ||
| 767 | ;; DS:[SI] Printer Description table whose TYPEID matched | ||
| 768 | ;; DX "inverse" order of devices in the PARSE tables | ||
| 769 | ;; | ||
| 770 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 771 | ;; | ||
| 772 | ;; | ||
| 773 | DID_EXTRACT PROC ;; | ||
| 774 | ;; | ||
| 775 | PUSH DX ;; | ||
| 776 | ;;----------------------------- | ||
| 777 | ;; define the DID_parameters | ||
| 778 | PUSH BX ;; | ||
| 779 | ;; | ||
| 780 | MOV BX,DEV_NUM ;; | ||
| 781 | SUB BX,DX ;; order in the Parse table | ||
| 782 | add bx,bx ;; double to index [bx] | ||
| 783 | MOV DX,BX ;; | ||
| 784 | ;; | ||
| 785 | MOV AX,DS:[SI].FONTSZ ;; | ||
| 786 | MOV FSIZE[BX],AX ;; size of font buffer to be created | ||
| 787 | ;; | ||
| 788 | MOV AX,DS:[SI].HSLOTS ;; | ||
| 789 | CMP AX,HARDSL_MAX ;; | ||
| 790 | JNA LESS_HARDSL ;; | ||
| 791 | MOV INIT_CHK, 0010H ;; ERROR 0010H | ||
| 792 | POP BX ;; | ||
| 793 | JMP END_MATCH_BAD ;; | ||
| 794 | LESS_HARDSL : ;; | ||
| 795 | CMP AX,DS:[SI].HWCPMIN ;; | ||
| 796 | JNB VALID_HARDSL ;; | ||
| 797 | MOV INIT_CHK, 0012H ;; ERROR 0012H | ||
| 798 | POP BX ;; | ||
| 799 | JMP END_MATCH_BAD ;; | ||
| 800 | VALID_HARDSL : ;; | ||
| 801 | MOV HRMAX[BX],AX ;; | ||
| 802 | MOV CTMAX[BX],AX ;; will be reduced by the no. of hwcp | ||
| 803 | ;; | ||
| 804 | MOV AX,DS:[SI].RSLOTS ;; | ||
| 805 | CMP AX,RAMSL_MAX ;; | ||
| 806 | JNA LESS_RAMSL ;; | ||
| 807 | MOV INIT_CHK, 0011H ;; ERROR 0011H | ||
| 808 | POP BX ;; | ||
| 809 | JMP END_MATCH_BAD ;; | ||
| 810 | LESS_RAMSL : ;; | ||
| 811 | MOV RMMAX[BX],AX ;; see also designate | ||
| 812 | ;; | ||
| 813 | MOV DESCO[BX],SI ;; | ||
| 814 | ;; | ||
| 815 | POP BX ;; | ||
| 816 | ;;---------------------------------- | ||
| 817 | ;; | ||
| 818 | PUSH CX ;; | ||
| 819 | ;; | ||
| 820 | HWCPgt: PUSH DI ;; get the hwcp | ||
| 821 | ;; | ||
| 822 | MOV DI,PSE.PAR_HWCPO ;; | ||
| 823 | MOV CX,PSE.PAR_HWCPL ;; no. of hwcp | ||
| 824 | AND CX,CX ;; | ||
| 825 | JNZ chk_hwcp ;; | ||
| 826 | push bx ;; | ||
| 827 | mov bx,dx ;; | ||
| 828 | MOV HRMAX[BX],CX ;; | ||
| 829 | MOV CX,DS:[SI].HWCPMIN ;; | ||
| 830 | SUB CTMAX[BX],CX ;; what is left becomes cartridge slot | ||
| 831 | pop bx ;; | ||
| 832 | JMP DESIGN ;; | ||
| 833 | ;; hwcp to be defined | ||
| 834 | chk_hwcp: MOV AX,DS:[SI].HSLOTS ;; defined in printer_desc | ||
| 835 | CMP CX,AX ;; | ||
| 836 | JA BAD_MATCH2 ;; | ||
| 837 | CMP CX,HARDSL_MAX ;; | ||
| 838 | JNA HWCP_GOOD ;; jump if system error | ||
| 839 | MOV INIT_CHK,0003H ;; ERROR 0003 | ||
| 840 | JMP END_MATCH ;; | ||
| 841 | BAD_MATCH2: ;; | ||
| 842 | MOV INIT_CHK,0002H ;; ERROR 0002 | ||
| 843 | JMP END_MATCH ;; | ||
| 844 | ;; | ||
| 845 | HWCP_GOOD: ;; there are sufficient hard-slot for | ||
| 846 | ;; HWCP | ||
| 847 | PUSH SI ;; printer description table of TYPEID | ||
| 848 | PUSH BX ;; | ||
| 849 | ;; | ||
| 850 | MOV BX,DX ;; | ||
| 851 | MOV AX,CTMAX[BX] ;; | ||
| 852 | ;; | ||
| 853 | PUSH CX ;; calculate what is left for cart_slot | ||
| 854 | CMP CX,DS:[SI].HWCPMIN ;; | ||
| 855 | JNB MORE_THAN_HWCPMIN ;; | ||
| 856 | MOV CX,DS:[SI].HWCPMIN ;; | ||
| 857 | MORE_THAN_HWCPMIN : ;; | ||
| 858 | SUB AX,CX ;; | ||
| 859 | POP CX ;; | ||
| 860 | mov HRMAX[BX],CX ;; | ||
| 861 | ;; | ||
| 862 | MOV CTMAX[BX],AX ;; no of cart-slot for designate | ||
| 863 | MOV SI,HARD_SLA[BX] ;; get the corresponding hard-slots | ||
| 864 | ;; | ||
| 865 | POP BX ;; | ||
| 866 | ;; | ||
| 867 | push bx ;; | ||
| 868 | push dx ;; | ||
| 869 | mov bx,si ;; | ||
| 870 | mov dx,cx ;; | ||
| 871 | mov reserved1,dx ;; IF THERE IS ANY REPETITIVE HWCP | ||
| 872 | mov reserved2,bx ;; IF THERE IS ANY REPETITIVE HWCP | ||
| 873 | ;; | ||
| 874 | FILL_HWCP: ;; | ||
| 875 | AND CX,CX ;; | ||
| 876 | JZ DESIGN_P ;; | ||
| 877 | INC DI ;; next code page in PARSE table | ||
| 878 | INC DI ;; | ||
| 879 | MOV AX,ES:[DI] ;; get code page value | ||
| 880 | ;; | ||
| 881 | ;; IF THERE IS ANY REPETITIVE HWCP | ||
| 882 | push dx ;; | ||
| 883 | push bx ;; | ||
| 884 | hwcp_norep : ;; | ||
| 885 | cmp ax,cs:[bx].slt_cp ;; | ||
| 886 | jne hwcp_repnext ;; | ||
| 887 | pop bx ;; | ||
| 888 | pop dx ;; | ||
| 889 | pop dx ;; | ||
| 890 | pop bx ;; | ||
| 891 | pop si ;; | ||
| 892 | jmp end_match ;; | ||
| 893 | ;; | ||
| 894 | hwcp_repnext: ;; | ||
| 895 | inc bx ;; | ||
| 896 | inc bx ;; | ||
| 897 | inc bx ;; | ||
| 898 | inc bx ;; | ||
| 899 | dec dx ;; | ||
| 900 | jnz hwcp_norep ;; | ||
| 901 | pop bx ;; | ||
| 902 | pop dx ;; | ||
| 903 | ;; | ||
| 904 | MOV CS:[SI].SLT_CP,AX ;; | ||
| 905 | MOV AX,CS:[SI].SLT_AT ;; get the attributes | ||
| 906 | OR AX,AT_OCC ;; occupied | ||
| 907 | OR AX,AT_HWCP ;; hwcp slot | ||
| 908 | MOV CS:[SI].SLT_AT,AX ;; | ||
| 909 | INC SI ;; | ||
| 910 | INC SI ;; next slot | ||
| 911 | INC SI ;; next slot | ||
| 912 | INC SI ;; next slot | ||
| 913 | DEC CX ;; | ||
| 914 | JMP FILL_HWCP ;; | ||
| 915 | DESIGN_P: ;; | ||
| 916 | pop dx ;; | ||
| 917 | pop bx ;; | ||
| 918 | POP SI ;; | ||
| 919 | ;;--------------------- | ||
| 920 | DESIGN: POP DI ;; get the designate no. | ||
| 921 | PUSH DI ;; | ||
| 922 | ;; | ||
| 923 | MOV DI,PSE.PAR_DESGO ;; | ||
| 924 | MOV AX,PSE.PAR_DESGL ;; | ||
| 925 | CMP AX,1 ;; | ||
| 926 | JA END_MATCH ;; there should have no font entry | ||
| 927 | AND AX,AX ;; | ||
| 928 | JZ DEF_RBUFMAX ;; | ||
| 929 | ;; | ||
| 930 | MOV AX,PSE.PAR_DESG ;; | ||
| 931 | AND AX,AX ;; | ||
| 932 | JZ DEF_RBUFMAX ;; | ||
| 933 | ;; | ||
| 934 | CMP CS:[SI].CLASS,1 ;; | ||
| 935 | JNE DESIG_NOt_CLASS1 ;; | ||
| 936 | ;; | ||
| 937 | PUSH BX ;; if there is any cartridge slot ? | ||
| 938 | PUSH AX ;; | ||
| 939 | MOV BX,DX ;; | ||
| 940 | MOV AX,ctmax[BX] ;; | ||
| 941 | AND AX,AX ;; | ||
| 942 | POP AX ;; | ||
| 943 | POP BX ;; | ||
| 944 | JZ END_MATCH ;; fail, as there is no physical RAM. | ||
| 945 | ;; | ||
| 946 | CMP AX,HARDSL_MAX ;; is the designate more than max ? | ||
| 947 | JA END_MATCH ;; | ||
| 948 | ;; | ||
| 949 | ;; | ||
| 950 | JMP DEF_RBUFMAX ;; | ||
| 951 | ;; | ||
| 952 | ;; | ||
| 953 | ;; | ||
| 954 | DESIG_NOT_CLASS1 : ;; | ||
| 955 | PUSH BX ;; if there is any physical RAM slot ? | ||
| 956 | PUSH AX ;; | ||
| 957 | MOV BX,DX ;; | ||
| 958 | MOV AX,RMMAX[BX] ;; | ||
| 959 | AND AX,AX ;; | ||
| 960 | POP AX ;; | ||
| 961 | POP BX ;; | ||
| 962 | JZ END_MATCH ;; fail, as there is no physical RAM. | ||
| 963 | ;; | ||
| 964 | ;; | ||
| 965 | CMP AX,RAMSL_MAX ;; is the designate more than max ? | ||
| 966 | JA END_MATCH ;; | ||
| 967 | ;; | ||
| 968 | DEF_RBUFMAX : ;; | ||
| 969 | PUSH BX ;; | ||
| 970 | MOV BX,DX ;; | ||
| 971 | MOV RBUMAX[BX],AX ;; | ||
| 972 | POP BX ;; | ||
| 973 | ;; | ||
| 974 | ;; | ||
| 975 | PARAM : ;; | ||
| 976 | ;PARM: POP DI ;; | ||
| 977 | ; PUSH DI ;; | ||
| 978 | ;; MOV DI,PSE.PAR_PARMO ;; | ||
| 979 | ;; | ||
| 980 | ;,-------------------------- | ||
| 981 | ;; GOOD device_id parameters | ||
| 982 | shr dx,1 ;; | ||
| 983 | MOV AX,DID_ONE ;; | ||
| 984 | MOV CX,DX ;; | ||
| 985 | AND CX,CX ;; | ||
| 986 | JZ NO_SHL ;; | ||
| 987 | SHL AX,CL ;; | ||
| 988 | NO_SHL: OR DID_STATUS,AX ;; is defined | ||
| 989 | ;;------------------------- | ||
| 990 | END_MATCH: POP DI ;; end of extract | ||
| 991 | POP CX ;; | ||
| 992 | END_MATCH_BAD : ;; | ||
| 993 | POP DX ;; | ||
| 994 | ;; | ||
| 995 | RET ;; | ||
| 996 | ;; | ||
| 997 | DID_EXTRACT ENDP ;; | ||
| 998 | ;; | ||
| 999 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1000 | ;; | ||
| 1001 | ;; Called by INIT to define the STATE and BUF for the LPTn according to | ||
| 1002 | ;; the DID_STATUS. Create font buffer if requested through the "desi*nate" | ||
| 1003 | ;; | ||
| 1004 | ;; at entry : CX = device order in parse table | ||
| 1005 | ;; | ||
| 1006 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1007 | CHK_DID PROC ;; | ||
| 1008 | ;; | ||
| 1009 | push cx ;; | ||
| 1010 | push di ;; | ||
| 1011 | push dx ;; | ||
| 1012 | ;; | ||
| 1013 | MOV AX,DID_STATUS ;; | ||
| 1014 | ;; | ||
| 1015 | PUSH CX ;; order 0 to m | ||
| 1016 | POP DI ;; | ||
| 1017 | ADD DI,DI ;; indexing : [DI] | ||
| 1018 | ;; | ||
| 1019 | INC CX ;; | ||
| 1020 | SHR AX,CL ;; is the device parameter valid ? | ||
| 1021 | ;; | ||
| 1022 | JC DEFINE_BUFFER ;; | ||
| 1023 | JMP LPT_FAIL ;;-------------------------- | ||
| 1024 | ;; | ||
| 1025 | DEFINE_BUFFER : ;; | ||
| 1026 | ;; good device parameters as determined | ||
| 1027 | MOV AX,DESCO[DI] ;; | ||
| 1028 | MOV BUF.PDESCO,AX ;; | ||
| 1029 | ;; | ||
| 1030 | PUSH DI ;; | ||
| 1031 | MOV DI,AX ;; | ||
| 1032 | MOV AX,CS:[DI].CLASS ;; | ||
| 1033 | MOV BUF.PCLASS,AX ;; | ||
| 1034 | POP DI ;; | ||
| 1035 | ;; | ||
| 1036 | MOV AX,HARD_SLA[DI] ;; in the DID_EXTRACT | ||
| 1037 | MOV BUF.HARDSO,AX ;; | ||
| 1038 | ;; | ||
| 1039 | MOV AX,RAM_SLA[DI] ;; | ||
| 1040 | MOV BUF.RAMSO,AX ;; | ||
| 1041 | ;; | ||
| 1042 | MOV AX,HRMAX[DI] ;; | ||
| 1043 | MOV BUF.HARDMX,AX ;; | ||
| 1044 | ;; | ||
| 1045 | MOV AX,CTMAX[DI] ;; | ||
| 1046 | MOV BUF.HCARMX,AX ;; | ||
| 1047 | ;; | ||
| 1048 | ADD AX,HRMAX[DI] ;; defore "designate" | ||
| 1049 | MOV BUF.HSLMX,AX ;; | ||
| 1050 | ;; | ||
| 1051 | ;; | ||
| 1052 | MOV AX,RMMAX[DI] ;; | ||
| 1053 | MOV BUF.RAMMX,AX ;; | ||
| 1054 | ;; | ||
| 1055 | XOR AX,AX ;; | ||
| 1056 | PUSH CX ;; calculate the max. length of control | ||
| 1057 | MOV CX,2 ;; sequence that is allowed for the | ||
| 1058 | CMP BUF.PCLASS,1 ;; room reserved for physical slots. | ||
| 1059 | JNE CTL_LOOP ;; | ||
| 1060 | MOV CX,1 ;; class 1 printer has one control seq. | ||
| 1061 | CTL_LOOP : ;; | ||
| 1062 | ADD AX,CTL_MAX ;; | ||
| 1063 | DEC AX ;; leave one byte for the length | ||
| 1064 | DEC CX ;; | ||
| 1065 | JNZ CTL_LOOP ;; | ||
| 1066 | MOV BUF.FSELMAX,AX ;; | ||
| 1067 | POP CX ;; | ||
| 1068 | ;; | ||
| 1069 | MOV AX,FSIZE[DI] ;; | ||
| 1070 | MOV BUF.FTSZPA,AX ;; FTSIZE in paragraph | ||
| 1071 | ;; | ||
| 1072 | PUSH AX ;; | ||
| 1073 | ;; | ||
| 1074 | MOV DX,4 ;; | ||
| 1075 | FT_PARA: ;; | ||
| 1076 | ADD AX,AX ;; | ||
| 1077 | DEC DX ;; | ||
| 1078 | JNZ FT_PARA ;; font size | ||
| 1079 | MOV BUF.FTSIZE,AX ;; font size in bytes (used with.RBUFMX) | ||
| 1080 | ;; | ||
| 1081 | POP DX ;; FTSIZE in paragraph | ||
| 1082 | ;; | ||
| 1083 | MOV CX,RBUMAX[DI] ;; create font buffer per .RBUFMX and | ||
| 1084 | MOV BUF.RBUFMX,CX ;; assume sufficient memory for all the | ||
| 1085 | ;; "designate request" | ||
| 1086 | PUSH CX ;; | ||
| 1087 | ;; | ||
| 1088 | CMP BUF.PCLASS,1 ;; always create font buffer for class1 | ||
| 1089 | JNE CLASS_NOT_1 ;; | ||
| 1090 | ;; | ||
| 1091 | AND CX,CX ;; | ||
| 1092 | JZ CLASS1_NOCX ;; | ||
| 1093 | ADD CX,BUF.HARDMX ;; | ||
| 1094 | MOV BUF.HSLMX,CX ;; | ||
| 1095 | JMP CLASS_NOT_1 ;; | ||
| 1096 | ;; | ||
| 1097 | CLASS1_NOCX: ;; | ||
| 1098 | MOV CX,BUF.HSLMX ;; | ||
| 1099 | ;; | ||
| 1100 | CLASS_NOT_1 : ;; | ||
| 1101 | AND CX,CX ;; | ||
| 1102 | JZ MULTIPLE_DONE ;; | ||
| 1103 | MOV AX,RESIDENT_END ;; | ||
| 1104 | MULTIPLE_FT : ;; | ||
| 1105 | ADD AX,DX ;; allocate the font buffers at the end | ||
| 1106 | DEC CX ;; of the resident codes | ||
| 1107 | JNZ MULTIPLE_FT ;; | ||
| 1108 | ;; | ||
| 1109 | ;; | ||
| 1110 | MOV CX,RESIDENT_END ;; | ||
| 1111 | MOV BUF.FTSTART,CX ;; | ||
| 1112 | MOV RESIDENT_END,AX ;; | ||
| 1113 | ;; | ||
| 1114 | ;; | ||
| 1115 | MULTIPLE_DONE : ;; | ||
| 1116 | POP CX ;; designate requested | ||
| 1117 | ;; | ||
| 1118 | CMP BUF.PCLASS,1 ;; | ||
| 1119 | JNE DEF_RBUF ;; | ||
| 1120 | ;; CLASS 1 | ||
| 1121 | CMP BUF.HARDMX,0 ;; | ||
| 1122 | JE DEFBUF_DONE ;; | ||
| 1123 | ;; | ||
| 1124 | PUSH CX ;; STACKS... | ||
| 1125 | PUSH SI ;; | ||
| 1126 | PUSH DS ;; | ||
| 1127 | PUSH ES ;; | ||
| 1128 | PUSH DI ;; | ||
| 1129 | PUSH DX ;; | ||
| 1130 | ;; | ||
| 1131 | MOV DX,BUF.HARDMX ;; | ||
| 1132 | PUSH DX ;; STACK +1 -- # of HWCP | ||
| 1133 | ;; | ||
| 1134 | PUSH CS ;; | ||
| 1135 | POP DS ;; | ||
| 1136 | MOV BUF.RBUFMX,0 ;; | ||
| 1137 | MOV SI,BUF.PDESCO ;; | ||
| 1138 | MOV SI,CS:[SI].SELH_O ;; | ||
| 1139 | XOR CX,CX ;; | ||
| 1140 | MOV CL,CS:BYTE PTR [SI] ;; | ||
| 1141 | INC CX ;; including the length byte | ||
| 1142 | ;; | ||
| 1143 | MOV DI,BUF.FTSTART ;; control template | ||
| 1144 | DEF_FTBUF: ;; fill the font buffer with the | ||
| 1145 | PUSH DI ;; | ||
| 1146 | POP ES ;; | ||
| 1147 | XOR DI,DI ;; | ||
| 1148 | ;; | ||
| 1149 | PUSH CX ;; | ||
| 1150 | PUSH SI ;; | ||
| 1151 | REP MOVSB ;; | ||
| 1152 | POP SI ;; | ||
| 1153 | POP CX ;; | ||
| 1154 | ;; | ||
| 1155 | PUSH ES ;; | ||
| 1156 | POP DI ;; | ||
| 1157 | ADD DI,BUF.FTszpa ;; | ||
| 1158 | DEC DX ;; | ||
| 1159 | JNZ DEF_FTBUF ;; | ||
| 1160 | ;; | ||
| 1161 | POP DX ;; STACK -1 | ||
| 1162 | ;; | ||
| 1163 | MOV SI,BUF.HARDSO ;; | ||
| 1164 | MOV DI,BUF.FTSTART ;; define the HWCP values | ||
| 1165 | DEF_FThwcp : ;; | ||
| 1166 | PUSH DI ;; | ||
| 1167 | POP ES ;; | ||
| 1168 | MOV DI,CTL5202_OFFS ;; offset to the HWCP words | ||
| 1169 | ;; | ||
| 1170 | MOV AX,CS:[SI].SLT_CP ;; | ||
| 1171 | MOV ES:WORD PTR [DI],AX ;; | ||
| 1172 | ;; | ||
| 1173 | INC SI ;; | ||
| 1174 | INC SI ;; | ||
| 1175 | INC SI ;; | ||
| 1176 | INC SI ;; | ||
| 1177 | ;; | ||
| 1178 | PUSH ES ;; | ||
| 1179 | POP DI ;; | ||
| 1180 | ADD DI,BUF.FTSZPA ;; | ||
| 1181 | DEC DX ;; | ||
| 1182 | JNZ DEF_FThwcp ;; | ||
| 1183 | ;; | ||
| 1184 | POP DX ;; | ||
| 1185 | POP DI ;; | ||
| 1186 | POP ES ;; | ||
| 1187 | POP DS ;; | ||
| 1188 | POP SI ;; | ||
| 1189 | POP CX ;; | ||
| 1190 | ;; | ||
| 1191 | JMP DEFBUF_DONE ;; | ||
| 1192 | ;; | ||
| 1193 | ;; | ||
| 1194 | DEF_RBUF : ;; | ||
| 1195 | MOV BUF.RSLMX,CX ;; the no. of ram slots supported | ||
| 1196 | CMP CX,RMMAX[DI] ;; | ||
| 1197 | JNB DEFBUF_DONE ;; | ||
| 1198 | MOV AX,RMMAX[DI] ;; | ||
| 1199 | MOV BUF.RSLMX,AX ;; the max. of .RAMMX and .RBUFMX | ||
| 1200 | ;; | ||
| 1201 | DEFBUF_DONE : ;; | ||
| 1202 | MOV BUF.STATE,CPSW ;; the LPTn is CPSW ----- STATE | ||
| 1203 | ;; | ||
| 1204 | CMP BUF.BFLAG,BF_PRN ;; | ||
| 1205 | JNE RET_CHK_DID ;; | ||
| 1206 | MOV AX,DID_BIT[DI] ;; | ||
| 1207 | MOV BUF.DID_PRN,AX ;; | ||
| 1208 | ;; | ||
| 1209 | ;; | ||
| 1210 | JMP RET_CHK_DID ;; | ||
| 1211 | ;; | ||
| 1212 | LPT_FAIL: ;; | ||
| 1213 | ;; | ||
| 1214 | MOV BUF.STATE,NORMAL ;; the LPTn is NORMAL --- STATE | ||
| 1215 | ;; | ||
| 1216 | ;; | ||
| 1217 | RET_CHK_DID: ;; | ||
| 1218 | ;; | ||
| 1219 | pop dx ;; | ||
| 1220 | pop di ;; | ||
| 1221 | pop cx ;; | ||
| 1222 | ;; | ||
| 1223 | RET ;; | ||
| 1224 | ;; | ||
| 1225 | CHK_DID ENDP ;; | ||
| 1226 | ;; | ||
| 1227 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1228 | ;; | ||
| 1229 | ;; Called by INIT to check for consistency between duplicated device name and | ||
| 1230 | ;; between PRN and LPT1 | ||
| 1231 | ;; | ||
| 1232 | ;; at entry : DI = pointer to PAR_DEVOT | ||
| 1233 | ;; BUF.STATE = any state | ||
| 1234 | ;; CX = DID order | ||
| 1235 | ;; | ||
| 1236 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1237 | ;; | ||
| 1238 | DEV_CHECK PROC ;; | ||
| 1239 | ;; | ||
| 1240 | LEA SI,BUF.PAR_EXTRACTO ;; | ||
| 1241 | ;; | ||
| 1242 | PUSH CX ;; | ||
| 1243 | ;; | ||
| 1244 | PUSH SI ;; compare device id | ||
| 1245 | PUSH DI ;; | ||
| 1246 | mov SI,[SI].PAR_DIDO ;; | ||
| 1247 | MOV DI,PSE.PAR_DIDO ;; | ||
| 1248 | MOV CX,PSE.PAR_DNML ;; | ||
| 1249 | INC CX ;; including length | ||
| 1250 | INC CX ;; | ||
| 1251 | REPE CMPSB ;; | ||
| 1252 | POP DI ;; | ||
| 1253 | POP SI ;; | ||
| 1254 | Jz hwcp_check ;; | ||
| 1255 | mov init_chk,0021h ;; error 0021h | ||
| 1256 | Jmp FORCE_LPT_BAD ;; | ||
| 1257 | ;; | ||
| 1258 | hwcp_check : ;; | ||
| 1259 | PUSH SI ;; compare HWCP | ||
| 1260 | PUSH DI ;; | ||
| 1261 | mov SI,[SI].PAR_HWCPO ;; | ||
| 1262 | MOV DI,PSE.PAR_HWCPO ;; | ||
| 1263 | MOV AX,PSE.PAR_HWCPL ;; | ||
| 1264 | MOV CX,2 ;; | ||
| 1265 | SHL AX,CL ;; multiply by two | ||
| 1266 | INC AX ;; including length | ||
| 1267 | INC AX ;; | ||
| 1268 | MOV CX,AX ;; | ||
| 1269 | REPE CMPSB ;; | ||
| 1270 | POP DI ;; | ||
| 1271 | POP SI ;; | ||
| 1272 | Jz desig_check ;; | ||
| 1273 | mov init_chk,0022h ;; error 0022h | ||
| 1274 | Jmp FORCE_LPT_BAD ;; | ||
| 1275 | ;; | ||
| 1276 | desig_check : ;; | ||
| 1277 | PUSH SI ;; compare DESIGNATE | ||
| 1278 | PUSH DI ;; | ||
| 1279 | mov SI,[SI].PAR_DESGO ;; | ||
| 1280 | MOV DI,PSE.PAR_DESGO ;; | ||
| 1281 | MOV AX,PSE.PAR_DESGL ;; | ||
| 1282 | MOV CX,2 ;; | ||
| 1283 | SHL AX,CL ;; multiply by two | ||
| 1284 | INC AX ;; including length | ||
| 1285 | INC AX ;; | ||
| 1286 | MOV CX,AX ;; | ||
| 1287 | REPE CMPSB ;; | ||
| 1288 | POP DI ;; | ||
| 1289 | POP SI ;; | ||
| 1290 | Jz param_check ;; | ||
| 1291 | mov init_chk,0023h ;; error 0023h | ||
| 1292 | Jmp FORCE_LPT_BAD ;; | ||
| 1293 | ;; | ||
| 1294 | param_check : ;; | ||
| 1295 | PUSH SI ;; compare parameters | ||
| 1296 | PUSH DI ;; | ||
| 1297 | mov SI,[SI].PAR_PARMO ;; | ||
| 1298 | MOV DI,PSE.PAR_PARMO ;; | ||
| 1299 | MOV CX,PSE.PAR_PARML ;; | ||
| 1300 | INC CX ;; including length | ||
| 1301 | INC CX ;; | ||
| 1302 | REPE CMPSB ;; | ||
| 1303 | POP DI ;; | ||
| 1304 | POP SI ;; | ||
| 1305 | JZ M_END ;; | ||
| 1306 | mov init_chk,0024h ;; error 0024h | ||
| 1307 | ;; | ||
| 1308 | FORCE_LPT_BAD : ;; the second set of parameters is | ||
| 1309 | MOV BUF.STATE,NORMAL ;; bad | ||
| 1310 | ;; | ||
| 1311 | CMP BUF.BFLAG,BF_LPT1 ;; | ||
| 1312 | JNE M_END ;; | ||
| 1313 | ;; | ||
| 1314 | ;; since LPT1 is bad, force PRN to bad | ||
| 1315 | push bx ;; force prn to be bad too | ||
| 1316 | mov bx,buf.prn_bufo ;; | ||
| 1317 | MOV BUF.STATE,NORMAL ;; | ||
| 1318 | pop bx ;; | ||
| 1319 | ;; | ||
| 1320 | mov AX,BUF.DID_PRN ;; if PRN was not good, DID_PRN = 0 | ||
| 1321 | OR DID_FAIL,AX ;; | ||
| 1322 | ;; | ||
| 1323 | ;; | ||
| 1324 | M_END: ;; force the good did_status to fail if | ||
| 1325 | ;; STATE is bad | ||
| 1326 | POP CX ;; | ||
| 1327 | PUSH CX ;; order 0 to m | ||
| 1328 | MOV AX,DID_STATUS ;; | ||
| 1329 | ;; | ||
| 1330 | INC CX ;; | ||
| 1331 | SHR AX,CL ;; | ||
| 1332 | POP CX ;; | ||
| 1333 | JNC DEV_CHECK_RET ;; already failed | ||
| 1334 | ;; | ||
| 1335 | CMP BUF.STATE,CPSW ;; | ||
| 1336 | JE DEV_CHECK_RET ;; | ||
| 1337 | ;; | ||
| 1338 | PUSH BX ;; | ||
| 1339 | MOV BX,CX ;; | ||
| 1340 | ADD BX,BX ;; | ||
| 1341 | MOV AX,DID_BIT[BX] ;; | ||
| 1342 | OR DID_FAIL,AX ;; force DID to fail | ||
| 1343 | POP BX ;; | ||
| 1344 | ;; | ||
| 1345 | ;; | ||
| 1346 | DEV_CHECK_RET : ;; | ||
| 1347 | ;; | ||
| 1348 | RET ;; | ||
| 1349 | ;; | ||
| 1350 | ;; | ||
| 1351 | DEV_CHECK ENDP ;; | ||
| 1352 | ;; | ||
| 1353 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1354 | ;; | ||
| 1355 | |||
| 1356 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1357 | ; | ||
| 1358 | ; PROCEDURE_NAME: LOAD_INT2F | ||
| 1359 | ; | ||
| 1360 | ; FUNCTION: | ||
| 1361 | ; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH | ||
| 1362 | ; | ||
| 1363 | ; AT ENTRY: | ||
| 1364 | ; | ||
| 1365 | ; AT EXIT: | ||
| 1366 | ; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH | ||
| 1367 | ; VECTOR STORED. | ||
| 1368 | ; | ||
| 1369 | ; ERROR: N/A | ||
| 1370 | ; | ||
| 1371 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1372 | |||
| 1373 | SEMAPHORE DB 0 ;AN000; | ||
| 1374 | ;AN000; | ||
| 1375 | LOAD_INT2F PROC NEAR ;AN000; | ||
| 1376 | CMP CS:SEMAPHORE,0 ; already loaded? ;AN000; | ||
| 1377 | JNE LI_1 ; yes.....exit ;AN000; | ||
| 1378 | PUSH ES ; no...load. ;AN000; | ||
| 1379 | PUSH CX ; ;AN000; | ||
| 1380 | PUSH AX ; ;AN000; | ||
| 1381 | XOR AX,AX ; point ES to low.. ;AN000; | ||
| 1382 | MOV ES,AX ; memory. ;AN000; | ||
| 1383 | MOV AX,ES:WORD PTR INT2F_LOW ; store original.. ;AN000; | ||
| 1384 | MOV CS:ROM_INT2F,AX ; interrupt 2Fh.. ;AN000; | ||
| 1385 | MOV CX,ES:WORD PTR INT2F_HI ; location.. ;AN000; | ||
| 1386 | MOV CS:ROM_INT2F+2,CX ; ;AN000; | ||
| 1387 | OR AX,CX ; check if old int2F.. ;AN000; | ||
| 1388 | JNZ LI_0 ; is 0. ;AN000; | ||
| 1389 | MOV AX,OFFSET ABORT ; yes....point to.. ;AN000; | ||
| 1390 | MOV CS:ROM_INT2F,AX ; IRET. ;AN000; | ||
| 1391 | MOV AX,CS ; ;AN000; | ||
| 1392 | MOV CS:ROM_INT2F+2,AX ; ;AN000; | ||
| 1393 | LI_0: ; ;AN000; | ||
| 1394 | CLI ; ;AN000; | ||
| 1395 | MOV ES:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector.. ;AN000; | ||
| 1396 | MOV ES:WORD PTR INT2F_HI,CS ; with our own.. ;AN000; | ||
| 1397 | STI ; ;AN000; | ||
| 1398 | POP AX ; ;AN000; | ||
| 1399 | POP CX ; ;AN000; | ||
| 1400 | POP ES ; ;AN000; | ||
| 1401 | MOV CS:SEMAPHORE,1 ; now loaded. ;AN000; | ||
| 1402 | LI_1: RET ; ;AN000; | ||
| 1403 | LOAD_INT2F ENDP | ||
| 1404 | |||
| 1405 | .XLIST | ||
| 1406 | MSG_SERVICES <MSGDATA> ; WGR ;AN000; | ||
| 1407 | MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg> ; WGR ;AN000; | ||
| 1408 | MSG_SERVICES <PRINTER.CL1> ; WGR ;AN000; | ||
| 1409 | MSG_SERVICES <PRINTER.CL2> ; WGR ;AN000; | ||
| 1410 | MSG_SERVICES <PRINTER.CLA> ; WGR ;AN000; | ||
| 1411 | .LIST | ||
| 1412 | |||
| 1413 | include msgdcl.inc | ||
| 1414 | |||
| 1415 | CSEG ENDS | ||
| 1416 | END | ||
diff --git a/v4.0/src/DEV/PRINTER/CPSPM10.ASM b/v4.0/src/DEV/PRINTER/CPSPM10.ASM new file mode 100644 index 0000000..ea62b25 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPM10.ASM | |||
| @@ -0,0 +1,3851 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE DOS - Code Page Switching - Printer Device Driver | ||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; | ||
| 5 | ;; FILENAME: CPS Printer Device Driver Main Code | ||
| 6 | ;; MODULE NAME: | ||
| 7 | ;; TYPE: Assemble file (resident code) | ||
| 8 | ;; LINK PROCEDURE: Link CPSPMnn+CPSFONT+CPSPInn into .EXE format. CPSPM01 | ||
| 9 | ;; must be first. CPSPInn must be last. Everything | ||
| 10 | ;; before CPSPInn will be resident. | ||
| 11 | ;; INCLUDE FILES: | ||
| 12 | ;; CPSPEQU.INC | ||
| 13 | ;; | ||
| 14 | ;; | ||
| 15 | ;; This routine is structured as a DOS Device Driver. | ||
| 16 | ;; IE it is installed via the CONFIG.SYS command: | ||
| 17 | ;; | ||
| 18 | ;; The following device commands are supported: | ||
| 19 | ;; | ||
| 20 | ;; 0 - INIT | ||
| 21 | ;; -------- | ||
| 22 | ;; | ||
| 23 | ;; 8 - OUTPUT | ||
| 24 | ;; 9 - OUTPUT | ||
| 25 | ;; -------- | ||
| 26 | ;; Supported in between Designate-start and the Designate_end commands. | ||
| 27 | ;; | ||
| 28 | ;; | ||
| 29 | ;; 12 - IOCTL OUTPUT | ||
| 30 | ;; ----------------- | ||
| 31 | ;; CPS Function request : Major function = 05 -- printer device | ||
| 32 | ;; Minor functions = 4CH -- designate start | ||
| 33 | ;; 4DH -- designate end | ||
| 34 | ;; 4AH -- invoke | ||
| 35 | ;; 6AH -- query-invoked | ||
| 36 | ;; 6BH -- query-list | ||
| 37 | ;; | ||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | ;*Modification history ******************************************************** | ||
| 40 | ;AN001; p2685 Long delay on CHCP before failure message 12/10/87 J.K. | ||
| 41 | ;****************************************************************************** | ||
| 42 | ;; | ||
| 43 | INCLUDE CPSPEQU.INC ;; | ||
| 44 | ;; | ||
| 45 | PUBLIC PRINTER_DESC_NUM ;; | ||
| 46 | PUBLIC PRINTER_DESC_TBL ;; | ||
| 47 | PUBLIC INIT_CHK,TABLE,DEVICE_NUM ;; WGR ;AN000; | ||
| 48 | PUBLIC INVOKE ;; WGR ;AN000; | ||
| 49 | PUBLIC BUF0,BUF1,BUF2,BUF3 ;; WGR ;AN000; | ||
| 50 | PUBLIC HARD_SL1,RAM_SL1 ;; | ||
| 51 | PUBLIC HARD_SL2,RAM_SL2 ;; | ||
| 52 | PUBLIC HARD_SL3,RAM_SL3 ;; | ||
| 53 | PUBLIC HARD_SL4,RAM_SL4 ;; | ||
| 54 | PUBLIC RESERVED1,RESERVED2 ;; | ||
| 55 | ;; | ||
| 56 | EXTRN RESIDENT_END:WORD ;; | ||
| 57 | EXTRN STACK_ALLOCATED:WORD ;; | ||
| 58 | EXTRN FONT_PARSER:NEAR,FTABLE:WORD ;; | ||
| 59 | EXTRN INIT:NEAR ;; | ||
| 60 | ;; | ||
| 61 | ;; | ||
| 62 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 63 | ;; | ||
| 64 | ;; | ||
| 65 | CSEG SEGMENT PARA PUBLIC 'CODE' ;; | ||
| 66 | ASSUME CS:CSEG ;; | ||
| 67 | ;; | ||
| 68 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 69 | ;; | ||
| 70 | ;; ************************************ | ||
| 71 | ;; ** ** | ||
| 72 | ;; ** Resident Code ** | ||
| 73 | ;; ** ** | ||
| 74 | ;; ************************************ | ||
| 75 | ;; | ||
| 76 | ;; | ||
| 77 | ;; DEVICE HEADER - must be at offset zero within device driver | ||
| 78 | ;; (DHS is defined according to this structure) | ||
| 79 | ;; | ||
| 80 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 81 | ;; | ||
| 82 | DEV_HDR0: DW OFFSET DEV_HDR1 ;; becomes pointer to next device header | ||
| 83 | DW 0 ;; must be zero for no link | ||
| 84 | DW 0e040H ;; attribute (Char device) | ||
| 85 | ;; supports IOCTL calls | ||
| 86 | DW OFFSET STRATEGY0 ;; pointer to device "strategy" routine | ||
| 87 | DW OFFSET INTERRUPT0 ;; pointer to device "interrupt handler" | ||
| 88 | DEV_NAME0: DB 'PRN ' ;; device name( length : NAME_LEN) | ||
| 89 | ;; | ||
| 90 | DEV_HDR1: DW OFFSET DEV_HDR2 ;; becomes pointer to next device header | ||
| 91 | DW 0 ;; must be zero for no link | ||
| 92 | DW 0e040H ;; attribute (Char device) | ||
| 93 | ;; supports IOCTL calls | ||
| 94 | DW OFFSET STRATEGY1 ;; pointer to device "strategy" routine | ||
| 95 | DW OFFSET INTERRUPT1 ;; pointer to device "interrupt handler" | ||
| 96 | DEV_NAME1: DB 'LPT1 ' ;; device name( length : NAME_LEN) | ||
| 97 | ;; | ||
| 98 | DEV_HDR2: DW OFFSET DEV_HDR3 ;; becomes pointer to next device header | ||
| 99 | DW 0 ;; must be zero for no link | ||
| 100 | DW 0e040H ;; attribute (Char device) | ||
| 101 | ;; supports IOCTL calls | ||
| 102 | DW OFFSET STRATEGY2 ;; pointer to device "strategy" routine | ||
| 103 | DW OFFSET INTERRUPT2 ;; pointer to device "interrupt handler" | ||
| 104 | DEV_NAME2: DB 'LPT2 ' ;; device name( length : NAME_LEN) | ||
| 105 | ;; | ||
| 106 | ;; | ||
| 107 | DEV_HDR3: DD -1 ;; becomes pointer to next device header | ||
| 108 | DW 0e040H ;; attribute (Char device) | ||
| 109 | ;; supports IOCTL calls | ||
| 110 | DW OFFSET STRATEGY3 ;; pointer to device "strategy" routine | ||
| 111 | DW OFFSET INTERRUPT3 ;; pointer to device "interrupt handler" | ||
| 112 | DEV_NAME3: DB 'LPT3 ' ;; device name( length : NAME_LEN) | ||
| 113 | ;; | ||
| 114 | ;; | ||
| 115 | ;; | ||
| 116 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 117 | ;; ***************************** | ||
| 118 | ;; ** Resident Data Areas ** | ||
| 119 | ;; ***************************** | ||
| 120 | ;; | ||
| 121 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 122 | ; | ||
| 123 | ; PRN/LPTn printer data based on BUF | ||
| 124 | ; | ||
| 125 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 126 | ;; | ||
| 127 | INIT_CHK DW 0 ;; internal flag : error loc. in INIT | ||
| 128 | ;; | ||
| 129 | BUF0: BUF_DATA <,,,,,,,,,,> ;; PRN | ||
| 130 | ;; | ||
| 131 | BUF1: BUF_DATA <,,,,,,,,,,> ;; LPT1 | ||
| 132 | ;; | ||
| 133 | BUF2: BUF_DATA <,,,,,,,,,,> ;; LPT2 | ||
| 134 | ;; | ||
| 135 | BUF3: BUF_DATA <,,,,,,,,,,> ;; LPT3 | ||
| 136 | ;; | ||
| 137 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 138 | ; | ||
| 139 | ; Hard/RAM slots table in the order of DEVICE parameters | ||
| 140 | ; | ||
| 141 | ; number of entries in all HARD_SLn is determined by the max. {HSLOTS} | ||
| 142 | ; | ||
| 143 | ; | ||
| 144 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 145 | ;; | ||
| 146 | HARD_SL1 : SLTS <,> ;; 1st hardware slots | ||
| 147 | HARD_SL1B: SLTS <,> ;; | ||
| 148 | HARD_SL1C: SLTS <,> ;; | ||
| 149 | HARD_SL1D: SLTS <,> ;; | ||
| 150 | HARD_SL1E: SLTS <,> ;; | ||
| 151 | HARD_SL1F: SLTS <,> ;; | ||
| 152 | HARD_SL1G: SLTS <,> ;; | ||
| 153 | HARD_SL1H: SLTS <,> ;; | ||
| 154 | HARD_SL1I: SLTS <,> ;; | ||
| 155 | HARD_SL1J: SLTS <,> ;; | ||
| 156 | HARD_SL1K: SLTS <,> ;; | ||
| 157 | HARD_SL1L: SLTS <,> ;; | ||
| 158 | HARD_SL1M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 159 | ;;upto hardsl_max + 1 ;; | ||
| 160 | ;; | ||
| 161 | HARD_SL2 : SLTS <,> ;; 2nd hardware slots | ||
| 162 | HARD_SL2B: SLTS <,> ;; | ||
| 163 | HARD_SL2C: SLTS <,> ;; | ||
| 164 | HARD_SL2D: SLTS <,> ;; | ||
| 165 | HARD_SL2E: SLTS <,> ;; | ||
| 166 | HARD_SL2F: SLTS <,> ;; | ||
| 167 | HARD_SL2G: SLTS <,> ;; | ||
| 168 | HARD_SL2H: SLTS <,> ;; | ||
| 169 | HARD_SL2I: SLTS <,> ;; | ||
| 170 | HARD_SL2J: SLTS <,> ;; | ||
| 171 | HARD_SL2K: SLTS <,> ;; | ||
| 172 | HARD_SL2L: SLTS <,> ;; | ||
| 173 | HARD_SL2M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 174 | ;;upto hardsl_max + 1 ;; | ||
| 175 | ;; | ||
| 176 | HARD_SL3 : SLTS <,> ;; 3rd hardware slots | ||
| 177 | HARD_SL3B: SLTS <,> ;; | ||
| 178 | HARD_SL3C: SLTS <,> ;; | ||
| 179 | HARD_SL3D: SLTS <,> ;; | ||
| 180 | HARD_SL3E: SLTS <,> ;; | ||
| 181 | HARD_SL3F: SLTS <,> ;; | ||
| 182 | HARD_SL3G: SLTS <,> ;; | ||
| 183 | HARD_SL3H: SLTS <,> ;; | ||
| 184 | HARD_SL3I: SLTS <,> ;; | ||
| 185 | HARD_SL3J: SLTS <,> ;; | ||
| 186 | HARD_SL3K: SLTS <,> ;; | ||
| 187 | HARD_SL3L: SLTS <,> ;; | ||
| 188 | HARD_SL3M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 189 | ;;upto hardsl_max + 1 ;; | ||
| 190 | ;; | ||
| 191 | HARD_SL4 : SLTS <,> ;; 4TH hardware slots | ||
| 192 | HARD_SL4B: SLTS <,> ;; | ||
| 193 | HARD_SL4C: SLTS <,> ;; | ||
| 194 | HARD_SL4D: SLTS <,> ;; | ||
| 195 | HARD_SL4E: SLTS <,> ;; | ||
| 196 | HARD_SL4F: SLTS <,> ;; | ||
| 197 | HARD_SL4G: SLTS <,> ;; | ||
| 198 | HARD_SL4H: SLTS <,> ;; | ||
| 199 | HARD_SL4I: SLTS <,> ;; | ||
| 200 | HARD_SL4J: SLTS <,> ;; | ||
| 201 | HARD_SL4K: SLTS <,> ;; | ||
| 202 | HARD_SL4L: SLTS <,> ;; | ||
| 203 | HARD_SL4M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 204 | ;;upto hardsl_max + 1 ;; | ||
| 205 | ;; | ||
| 206 | ;; | ||
| 207 | RAM_SL1 : SLTS <,> ;; 1st ram slots | ||
| 208 | RAM_SL1B: SLTS <,> ;; NOTE : must be only FOUR bytes for | ||
| 209 | RAM_SL1C: SLTS <,> ;; codepage positioning | ||
| 210 | RAM_SL1D: SLTS <,> ;; calculation as compared | ||
| 211 | RAM_SL1E: SLTS <,> ;; with each entry in FTDL_OFF | ||
| 212 | RAM_SL1F: SLTS <,> ;; | ||
| 213 | RAM_SL1G: SLTS <,> ;; | ||
| 214 | RAM_SL1H: SLTS <,> ;; | ||
| 215 | RAM_SL1I: SLTS <,> ;; | ||
| 216 | RAM_SL1J: SLTS <,> ;; | ||
| 217 | RAM_SL1K: SLTS <,> ;; | ||
| 218 | RAM_SL1L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 219 | ;;upto ramsl_max, ;; | ||
| 220 | ;; | ||
| 221 | RAM_SL2 : SLTS <,> ;; 2nd ram slots | ||
| 222 | RAM_SL2B: SLTS <,> ;; | ||
| 223 | RAM_SL2C: SLTS <,> ;; | ||
| 224 | RAM_SL2D: SLTS <,> ;; | ||
| 225 | RAM_SL2E: SLTS <,> ;; | ||
| 226 | RAM_SL2F: SLTS <,> ;; | ||
| 227 | RAM_SL2G: SLTS <,> ;; | ||
| 228 | RAM_SL2H: SLTS <,> ;; | ||
| 229 | RAM_SL2I: SLTS <,> ;; | ||
| 230 | RAM_SL2J: SLTS <,> ;; | ||
| 231 | RAM_SL2K: SLTS <,> ;; | ||
| 232 | RAM_SL2L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 233 | ;;upto ramsl_max, ;; | ||
| 234 | ;; | ||
| 235 | RAM_SL3 : SLTS <,> ;; 3rd ram slots | ||
| 236 | RAM_SL3B: SLTS <,> ;; | ||
| 237 | RAM_SL3C: SLTS <,> ;; | ||
| 238 | RAM_SL3D: SLTS <,> ;; | ||
| 239 | RAM_SL3E: SLTS <,> ;; | ||
| 240 | RAM_SL3F: SLTS <,> ;; | ||
| 241 | RAM_SL3G: SLTS <,> ;; | ||
| 242 | RAM_SL3H: SLTS <,> ;; | ||
| 243 | RAM_SL3I: SLTS <,> ;; | ||
| 244 | RAM_SL3J: SLTS <,> ;; | ||
| 245 | RAM_SL3K: SLTS <,> ;; | ||
| 246 | RAM_SL3L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 247 | ;;upto ramsl_max, ;; | ||
| 248 | ;; | ||
| 249 | RAM_SL4 : SLTS <,> ;; 4th ram slots | ||
| 250 | RAM_SL4B: SLTS <,> ;; | ||
| 251 | RAM_SL4C: SLTS <,> ;; | ||
| 252 | RAM_SL4D: SLTS <,> ;; | ||
| 253 | RAM_SL4E: SLTS <,> ;; | ||
| 254 | RAM_SL4F: SLTS <,> ;; | ||
| 255 | RAM_SL4G: SLTS <,> ;; | ||
| 256 | RAM_SL4H: SLTS <,> ;; | ||
| 257 | RAM_SL4I: SLTS <,> ;; | ||
| 258 | RAM_SL4J: SLTS <,> ;; | ||
| 259 | RAM_SL4K: SLTS <,> ;; | ||
| 260 | RAM_SL4L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 261 | ;;upto ramsl_max, ;; | ||
| 262 | ;; | ||
| 263 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 264 | ;; hard/RAM buffered slots on codepages | ||
| 265 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 266 | HBUF_SL1 LABEL WORD ;; hardware slots' buffer for LPT1/PRN | ||
| 267 | DW 0FFFFH ;; ---- only for CART-SLOTS | ||
| 268 | DW 0FFFFH ;; | ||
| 269 | DW 0FFFFH ;; | ||
| 270 | DW 0FFFFH ;; | ||
| 271 | DW 0FFFFH ;; | ||
| 272 | DW 0FFFFH ;; | ||
| 273 | DW 0FFFFH ;; | ||
| 274 | DW 0FFFFH ;; | ||
| 275 | DW 0FFFFH ;; | ||
| 276 | DW 0FFFFH ;; | ||
| 277 | DW 0FFFFH ;; | ||
| 278 | DW 0FFFFH ;; | ||
| 279 | DW 0FFFFH ;; | ||
| 280 | ;;upto hardsl_max+1, there are as many HARD_SLn | ||
| 281 | ;; | ||
| 282 | HBUF_SL2 LABEL WORD ;; hardware slots' buffer for LPT2 | ||
| 283 | DW 0FFFFH ;; ---- only for CART-SLOTS | ||
| 284 | DW 0FFFFH ;; | ||
| 285 | DW 0FFFFH ;; | ||
| 286 | DW 0FFFFH ;; | ||
| 287 | DW 0FFFFH ;; | ||
| 288 | DW 0FFFFH ;; | ||
| 289 | DW 0FFFFH ;; | ||
| 290 | DW 0FFFFH ;; | ||
| 291 | DW 0FFFFH ;; | ||
| 292 | DW 0FFFFH ;; | ||
| 293 | DW 0FFFFH ;; | ||
| 294 | DW 0FFFFH ;; | ||
| 295 | DW 0FFFFH ;; | ||
| 296 | ;;upto hardsl_max+1, there are as many HARD_SLn | ||
| 297 | ;; | ||
| 298 | HBUF_SL3 LABEL WORD ;; hardware slots' buffer for LPT3 | ||
| 299 | DW 0FFFFH ;; ---- only for CART-SLOTS | ||
| 300 | DW 0FFFFH ;; | ||
| 301 | DW 0FFFFH ;; | ||
| 302 | DW 0FFFFH ;; | ||
| 303 | DW 0FFFFH ;; | ||
| 304 | DW 0FFFFH ;; | ||
| 305 | DW 0FFFFH ;; | ||
| 306 | DW 0FFFFH ;; | ||
| 307 | DW 0FFFFH ;; | ||
| 308 | DW 0FFFFH ;; | ||
| 309 | DW 0FFFFH ;; | ||
| 310 | DW 0FFFFH ;; | ||
| 311 | DW 0FFFFH ;; | ||
| 312 | ;;upto hardsl_max+1, there are as many HARD_SLn | ||
| 313 | ;; | ||
| 314 | ;; | ||
| 315 | RBUF_SL1 LABEL WORD ;; ram slots' buffer for LPT1/PRN | ||
| 316 | DW 0FFFFH ;; | ||
| 317 | DW 0FFFFH ;; | ||
| 318 | DW 0FFFFH ;; | ||
| 319 | DW 0FFFFH ;; | ||
| 320 | DW 0FFFFH ;; | ||
| 321 | DW 0FFFFH ;; | ||
| 322 | DW 0FFFFH ;; | ||
| 323 | DW 0FFFFH ;; | ||
| 324 | DW 0FFFFH ;; | ||
| 325 | DW 0FFFFH ;; | ||
| 326 | DW 0FFFFH ;; | ||
| 327 | DW 0FFFFH ;; | ||
| 328 | ;;upto ramsl_max, there are as many RAM_SLn | ||
| 329 | ;; | ||
| 330 | RBUF_SL2 LABEL WORD ;; ram slots' buffer for LPT2 | ||
| 331 | DW 0FFFFH ;; | ||
| 332 | DW 0FFFFH ;; | ||
| 333 | DW 0FFFFH ;; | ||
| 334 | DW 0FFFFH ;; | ||
| 335 | DW 0FFFFH ;; | ||
| 336 | DW 0FFFFH ;; | ||
| 337 | DW 0FFFFH ;; | ||
| 338 | DW 0FFFFH ;; | ||
| 339 | DW 0FFFFH ;; | ||
| 340 | DW 0FFFFH ;; | ||
| 341 | DW 0FFFFH ;; | ||
| 342 | DW 0FFFFH ;; | ||
| 343 | ;;upto ramsl_max, there are as many RAM_SLn | ||
| 344 | ;; | ||
| 345 | RBUF_SL3 LABEL WORD ;; ram slots' buffer for LPT3 | ||
| 346 | DW 0FFFFH ;; | ||
| 347 | DW 0FFFFH ;; | ||
| 348 | DW 0FFFFH ;; | ||
| 349 | DW 0FFFFH ;; | ||
| 350 | DW 0FFFFH ;; | ||
| 351 | DW 0FFFFH ;; | ||
| 352 | DW 0FFFFH ;; | ||
| 353 | DW 0FFFFH ;; | ||
| 354 | DW 0FFFFH ;; | ||
| 355 | DW 0FFFFH ;; | ||
| 356 | DW 0FFFFH ;; | ||
| 357 | DW 0FFFFH ;; | ||
| 358 | ;;upto ramsl_max, there are as many RAM_SLn | ||
| 359 | ;; | ||
| 360 | FTDL_OFF1 LABEL WORD ;; offset of FTSTART for PRN/LPT1 | ||
| 361 | DW 0 ;; NOTE : must be only two bytes for | ||
| 362 | DW 0 ;; codepage positioning | ||
| 363 | DW 0 ;; calculation as compared | ||
| 364 | DW 0 ;; with each entry in RAM_SLOT | ||
| 365 | DW 0 ;; or CART_SLOT | ||
| 366 | DW 0 ;; | ||
| 367 | DW 0 ;; | ||
| 368 | DW 0 ;; | ||
| 369 | DW 0 ;; | ||
| 370 | DW 0 ;; | ||
| 371 | DW 0 ;; | ||
| 372 | DW 0 ;; | ||
| 373 | DW 0 ;; | ||
| 374 | ;;upto the max. of {ramsl_max,hardsl_max} | ||
| 375 | ;; | ||
| 376 | FTDL_OFF2 LABEL WORD ;; offset of FTSTART for LPT2 | ||
| 377 | DW 0 ;; | ||
| 378 | DW 0 ;; | ||
| 379 | DW 0 ;; | ||
| 380 | DW 0 ;; | ||
| 381 | DW 0 ;; | ||
| 382 | DW 0 ;; | ||
| 383 | DW 0 ;; | ||
| 384 | DW 0 ;; | ||
| 385 | DW 0 ;; | ||
| 386 | DW 0 ;; | ||
| 387 | DW 0 ;; | ||
| 388 | DW 0 ;; | ||
| 389 | DW 0 ;; | ||
| 390 | ;;upto the max. of {ramsl_max,hardsl_max} | ||
| 391 | ;; | ||
| 392 | FTDL_OFF3 LABEL WORD ;; offset of FTSTART for LPT3 | ||
| 393 | DW 0 ;; | ||
| 394 | DW 0 ;; | ||
| 395 | DW 0 ;; | ||
| 396 | DW 0 ;; | ||
| 397 | DW 0 ;; | ||
| 398 | DW 0 ;; | ||
| 399 | DW 0 ;; | ||
| 400 | DW 0 ;; | ||
| 401 | DW 0 ;; | ||
| 402 | DW 0 ;; | ||
| 403 | DW 0 ;; | ||
| 404 | DW 0 ;; | ||
| 405 | DW 0 ;; | ||
| 406 | ;;upto the max. of {ramsl_max,hardsl_max} | ||
| 407 | ;; | ||
| 408 | ;; | ||
| 409 | ;; | ||
| 410 | ;; | ||
| 411 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 412 | ; | ||
| 413 | ; Printer Description Tables | ||
| 414 | ; | ||
| 415 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 416 | ;; | ||
| 417 | ESC_CHAR EQU 27 ;; | ||
| 418 | ;; | ||
| 419 | db 'PRINTER_DESC' ;; | ||
| 420 | ;; | ||
| 421 | PRINTER_DESC_NUM DW 3 ;; number of PRINTER_DESCn | ||
| 422 | ;; | ||
| 423 | PRINTER_DESC_TBL LABEL WORD ;; | ||
| 424 | DW OFFSET(PRINTER_DESC1) ;; | ||
| 425 | DW OFFSET(PRINTER_DESC2) ;; | ||
| 426 | DW OFFSET(PRINTER_DESC3) ;; | ||
| 427 | DW OFFSET(PRINTER_DESC4) ;; | ||
| 428 | ;; | ||
| 429 | ;; | ||
| 430 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 431 | ; | ||
| 432 | ; Printer Description Table for Proprinter (4201) | ||
| 433 | ; | ||
| 434 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 435 | PRINTER_DESC1 : ;; | ||
| 436 | ;; | ||
| 437 | PDSH <,'4201 ',,,0,212,1,1,1> ;; followed by the rest in PDS | ||
| 438 | ;; CLASS = 0 | ||
| 439 | ;; FTSZPA = 212 ==> 212 x 16=3008 bytes | ||
| 440 | ;; of font buffer | ||
| 441 | ;; HSLOTS = 1 (check CTL4201_B) | ||
| 442 | ;; HWCPMIN = 1 | ||
| 443 | ;; RSLOTS = 1 (check CTL4201_B) | ||
| 444 | ;; | ||
| 445 | DW OFFSET(CTL4201_H) | ||
| 446 | DW OFFSET(CTL4201_R) | ||
| 447 | DW OFFSET(CTL4201_B) | ||
| 448 | ;; (CTL_MAX = 32) | ||
| 449 | ;; (32 bytes for each control) | ||
| 450 | ;; (MUST BE ADJACENT...no blanks bet.:) | ||
| 451 | CTL4201_H : DB 5,ESC_CHAR,'I',0,ESC_CHAR,"6" ;; selection control 1 | ||
| 452 | CTL4201_R : DB 5,ESC_CHAR,'I',4,ESC_CHAR,"6" ;; selection control 2 | ||
| 453 | db 26 dup (0) ;; for CTL4201_H | ||
| 454 | db 26 dup (0) ;; for CTL4201_R | ||
| 455 | ;; | ||
| 456 | CTL4201_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 457 | DB CTL_MAX DUP (0) ;; | ||
| 458 | ;; | ||
| 459 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 460 | ; | ||
| 461 | ; Printer Description Table for 5202 | ||
| 462 | ; | ||
| 463 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 464 | ;; | ||
| 465 | PRINTER_DESC2 : ;; | ||
| 466 | PDSH <,'5202 ',,,1,2,2,1,0> ;; followed by the rest in PDS | ||
| 467 | ;; CLASS = 1 (font buffers allowed | ||
| 468 | ;; if there is cart-slot) | ||
| 469 | ;; FTSZPA = 2 ==> 2 x 16 = 32 bytes | ||
| 470 | ;; of font buffer | ||
| 471 | ;; HSLOTS = 2 (check CTL5202_B) | ||
| 472 | ;; HWCPMIN = 1 | ||
| 473 | ;; RSLOTS = 0 (check CTL5202_B) | ||
| 474 | ;; | ||
| 475 | DW OFFSET(CTL5202_H) | ||
| 476 | DW OFFSET(CTL5202_R) | ||
| 477 | DW OFFSET(CTL5202_B) | ||
| 478 | ;; | ||
| 479 | ;; (CTL_MAX = 32) | ||
| 480 | ;; (SEE CTL5202_OFFS) | ||
| 481 | ;; (32 bytes for each control) | ||
| 482 | CTL5202_H : DB 12,ESC_CHAR,91,84,5,0,00,00,0FFH,0FFH,00 ;; selection control 1 | ||
| 483 | dB ESC_CHAR,"6" ;; | ||
| 484 | DB 12,ESC_CHAR,91,84,5,0,00,00,0FFH,0FFH,00 ;; selection control 2 | ||
| 485 | dB ESC_CHAR,"6" ;; | ||
| 486 | db 19 dup (0) ;; for CTL5202_H selection 1 | ||
| 487 | db 19 dup (0) ;; for CTL5202_H selection 2 | ||
| 488 | CTL5202_R : DB 0 ;; | ||
| 489 | ;; | ||
| 490 | CTL5202_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 491 | DB CTL_MAX DUP (0) ;; | ||
| 492 | ;; | ||
| 493 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 494 | ; | ||
| 495 | ; Printer Description Table for RESERVED PRINTER (res1) | ||
| 496 | ; | ||
| 497 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 498 | PRINTER_DESC3 : ;; | ||
| 499 | ;; | ||
| 500 | PDSH <,'4208 ',,,1,2,2,1,0> ;; followed by the rest in PDS | ||
| 501 | ;; CLASS = 1 | ||
| 502 | ;; FTSZPA = 2 | ||
| 503 | ;; HSLOTS = 2 | ||
| 504 | ;; HWCPMIN = 1 | ||
| 505 | ;; RSLOTS = 0 | ||
| 506 | ;; | ||
| 507 | DW OFFSET(CTL4208_H) | ||
| 508 | DW OFFSET(CTL4208_R) | ||
| 509 | DW OFFSET(CTL4208_B) | ||
| 510 | ;; (CTL_MAX = 32) | ||
| 511 | ;; (32 bytes for each control) | ||
| 512 | ;; (MUST BE ADJACENT...no blanks bet.:) | ||
| 513 | CTL4208_H : DB 0Bh,ESC_CHAR,49h,0Ah ;; selection control 1 | ||
| 514 | DB ESC_CHAR,49h,03 | ||
| 515 | DB ESC_CHAR,49h,02 | ||
| 516 | DB ESC_CHAR,36h | ||
| 517 | db 20 dup (0) | ||
| 518 | CTL4208_R : DB 0Bh,ESC_CHAR,49h,0Eh ;; selection control 2 | ||
| 519 | DB ESC_CHAR,49h,7 | ||
| 520 | DB ESC_CHAR,49h,6 | ||
| 521 | DB ESC_CHAR,36h | ||
| 522 | db 20 dup (0) ;; for CTLres1_H and CTRLres1_R | ||
| 523 | ;; | ||
| 524 | CTL4208_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 525 | DB CTL_MAX DUP (0) ;; | ||
| 526 | ;; | ||
| 527 | ;; | ||
| 528 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 529 | ; | ||
| 530 | ; Printer Description Table for RESERVED PRINTER (res2) | ||
| 531 | ; | ||
| 532 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 533 | PRINTER_DESC4 : ;; | ||
| 534 | ;; | ||
| 535 | PDSH <,'nnnnnnnn',,,0,0,1,1,1> ;; followed by the rest in PDS | ||
| 536 | ;; CLASS = 0 | ||
| 537 | ;; FTSZPA = 0 | ||
| 538 | ;; HSLOTS = 1 | ||
| 539 | ;; HWCPMIN = 1 | ||
| 540 | ;; RSLOTS = 1 | ||
| 541 | ;; | ||
| 542 | DW OFFSET(CTLres2_H) | ||
| 543 | DW OFFSET(CTLres2_R) | ||
| 544 | DW OFFSET(CTLres2_B) | ||
| 545 | ;; (CTL_MAX = 32) | ||
| 546 | ;; (32 bytes for each control) | ||
| 547 | ;; (MUST BE ADJACENT...no blanks bet.:) | ||
| 548 | CTLres2_H : DB 0 ;; selection control 1 | ||
| 549 | CTLres2_R : DB 32 dup (0) ;; selection control 2 | ||
| 550 | db 32 dup (0) ;; for CTLres2_H and CTRLres2_R | ||
| 551 | ;; | ||
| 552 | CTLres2_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 553 | DB CTL_MAX DUP (0) ;; | ||
| 554 | ;; | ||
| 555 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 556 | ;; | ||
| 557 | ;; | ||
| 558 | TEMP_SI DW ? ;; | ||
| 559 | ;; | ||
| 560 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 561 | ;; | ||
| 562 | ;; The request header for IOCTL call | ||
| 563 | ;; to the Normal device driver | ||
| 564 | ;; | ||
| 565 | ;; | ||
| 566 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 567 | ;; | ||
| 568 | REQ_NORM1 GIH <,,,,,> ;; for LPT1/PRN | ||
| 569 | GB2S <,> ;; | ||
| 570 | REQ_NORM2 GIH <,,,,,> ;; for LPT2 | ||
| 571 | GB2S <,> ;; | ||
| 572 | REQ_NORM3 GIH <,,,,,> ;; for LPT3 | ||
| 573 | GB2S <,> ;; | ||
| 574 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 575 | ;; | ||
| 576 | ;; | ||
| 577 | ;; | ||
| 578 | ;; PARSER'S TABLES | ||
| 579 | ;; | ||
| 580 | ;; -- TABLE is the first table of the results of the parsing. | ||
| 581 | ;; The first word (number of devices) will be set to 0 if | ||
| 582 | ;; syntax error is detected in the DEVICE command line. | ||
| 583 | ;; | ||
| 584 | ;; | ||
| 585 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 586 | ; | ||
| 587 | ; TABLE STRUCTURE FOR RETURNING VALUES TO THE INIT MODULE WGR | ||
| 588 | ; (ADAPTED FROM VERSION 1.0 DISPLAY.SYS) WGR | ||
| 589 | ; | ||
| 590 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 591 | |||
| 592 | TABLE LABEL BYTE ; table header ;AN000; | ||
| 593 | DEVICE_NUM DW ZERO ; initialized to zero devices ;AN000; | ||
| 594 | DW TABLE1_1 ; pointer to table 2 for device 1 ;AN000; | ||
| 595 | DW TABLE2_1 ; pointer to table 2 for device 2 ;AN000; | ||
| 596 | DW TABLE3_1 ; pointer to table 2 for device 3 ;AN000; | ||
| 597 | DW TABLE4_1 ; pointer to table 2 for device 4 ;AN000; | ||
| 598 | ;AN000; | ||
| 599 | TABLE1_1 LABEL WORD ;AN000; | ||
| 600 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 601 | DW TABLE1_2 ; pointer to table 3 (device name) ;AN000; | ||
| 602 | DW TABLE1_3 ; pointer to table 4 (device id) ;AN000; | ||
| 603 | DW TABLE1_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 604 | DW TABLE1_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 605 | DW -1 ; reserved ;AN000; | ||
| 606 | ;AN000; | ||
| 607 | TABLE1_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 608 | DW ZERO ; length ;AN000; | ||
| 609 | DB " " ; value ;AN000; | ||
| 610 | ;AN000; | ||
| 611 | TABLE1_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 612 | DW ZERO ; length ;AN000; | ||
| 613 | DB " " ; value ;AN000; | ||
| 614 | ;AN000; | ||
| 615 | TABLE1_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 616 | DW ZERO ; number ;AN000; | ||
| 617 | DW -1 ; value ;AN000; | ||
| 618 | DW -1 ; value ;AN000; | ||
| 619 | DW -1 ; value ;AN000; | ||
| 620 | DW -1 ; value ;AN000; | ||
| 621 | DW -1 ; value ;AN000; | ||
| 622 | DW -1 ; value ;AN000; | ||
| 623 | DW -1 ; value ;AN000; | ||
| 624 | DW -1 ; value ;AN000; | ||
| 625 | DW -1 ; value ;AN000; | ||
| 626 | DW -1 ; value ;AN000; | ||
| 627 | ;AN000; | ||
| 628 | TABLE1_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 629 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 630 | DW -1 ; n value ;AN000; | ||
| 631 | DW -1 ; m value ;AN000; | ||
| 632 | ;AN000; | ||
| 633 | TABLE2_1 LABEL WORD ;AN000; | ||
| 634 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 635 | DW TABLE2_2 ; pointer to table 3 (device name) ;AN000; | ||
| 636 | DW TABLE2_3 ; pointer to table 4 (device id) ;AN000; | ||
| 637 | DW TABLE2_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 638 | DW TABLE2_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 639 | DW -1 ; reserved ;AN000; | ||
| 640 | ;AN000; | ||
| 641 | TABLE2_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 642 | DW ZERO ; length ;AN000; | ||
| 643 | DB " " ; value ;AN000; | ||
| 644 | ;AN000; | ||
| 645 | TABLE2_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 646 | DW ZERO ; length ;AN000; | ||
| 647 | DB " " ; value ;AN000; | ||
| 648 | ;AN000; | ||
| 649 | TABLE2_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 650 | DW ZERO ; number ;AN000; | ||
| 651 | DW -1 ; value ;AN000; | ||
| 652 | DW -1 ; value ;AN000; | ||
| 653 | DW -1 ; value ;AN000; | ||
| 654 | DW -1 ; value ;AN000; | ||
| 655 | DW -1 ; value ;AN000; | ||
| 656 | DW -1 ; value ;AN000; | ||
| 657 | DW -1 ; value ;AN000; | ||
| 658 | DW -1 ; value ;AN000; | ||
| 659 | DW -1 ; value ;AN000; | ||
| 660 | DW -1 ; value ;AN000; | ||
| 661 | ;AN000; | ||
| 662 | TABLE2_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 663 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 664 | DW -1 ; n value ;AN000; | ||
| 665 | DW -1 ; m value ;AN000; | ||
| 666 | ;AN000; | ||
| 667 | TABLE3_1 LABEL WORD ;AN000; | ||
| 668 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 669 | DW TABLE3_2 ; pointer to table 3 (device name) ;AN000; | ||
| 670 | DW TABLE3_3 ; pointer to table 4 (device id) ;AN000; | ||
| 671 | DW TABLE3_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 672 | DW TABLE3_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 673 | DW -1 ; reserved ;AN000; | ||
| 674 | ;AN000; | ||
| 675 | TABLE3_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 676 | DW ZERO ; length ;AN000; | ||
| 677 | DB " " ; value ;AN000; | ||
| 678 | ;AN000; | ||
| 679 | TABLE3_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 680 | DW ZERO ; length ;AN000; | ||
| 681 | DB " " ; value ;AN000; | ||
| 682 | ;AN000; | ||
| 683 | TABLE3_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 684 | DW ZERO ; number ;AN000; | ||
| 685 | DW -1 ; value ;AN000; | ||
| 686 | DW -1 ; value ;AN000; | ||
| 687 | DW -1 ; value ;AN000; | ||
| 688 | DW -1 ; value ;AN000; | ||
| 689 | DW -1 ; value ;AN000; | ||
| 690 | DW -1 ; value ;AN000; | ||
| 691 | DW -1 ; value ;AN000; | ||
| 692 | DW -1 ; value ;AN000; | ||
| 693 | DW -1 ; value ;AN000; | ||
| 694 | DW -1 ; value ;AN000; | ||
| 695 | ;AN000; | ||
| 696 | TABLE3_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 697 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 698 | DW 0 ; n value ;AN000; | ||
| 699 | DW 0 ; m value ;AN000; | ||
| 700 | ;AN000; | ||
| 701 | TABLE4_1 LABEL WORD ;AN000; | ||
| 702 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 703 | DW TABLE4_2 ; pointer to table 3 (device name) ;AN000; | ||
| 704 | DW TABLE4_3 ; pointer to table 4 (device id) ;AN000; | ||
| 705 | DW TABLE4_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 706 | DW TABLE4_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 707 | DW -1 ; reserved ;AN000; | ||
| 708 | ;AN000; | ||
| 709 | TABLE4_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 710 | DW ZERO ; length ;AN000; | ||
| 711 | DB " " ; value ;AN000; | ||
| 712 | ;AN000; | ||
| 713 | TABLE4_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 714 | DW ZERO ; length ;AN000; | ||
| 715 | DB " " ; value ;AN000; | ||
| 716 | ;AN000; | ||
| 717 | TABLE4_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 718 | DW ZERO ; number ;AN000; | ||
| 719 | DW -1 ; value ;AN000; | ||
| 720 | DW -1 ; value ;AN000; | ||
| 721 | DW -1 ; value ;AN000; | ||
| 722 | DW -1 ; value ;AN000; | ||
| 723 | DW -1 ; value ;AN000; | ||
| 724 | DW -1 ; value ;AN000; | ||
| 725 | DW -1 ; value ;AN000; | ||
| 726 | DW -1 ; value ;AN000; | ||
| 727 | DW -1 ; value ;AN000; | ||
| 728 | DW -1 ; value ;AN000; | ||
| 729 | ;AN000; | ||
| 730 | TABLE4_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 731 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 732 | DW 0 ; n value ;AN000; | ||
| 733 | DW 0 ; m value ;AN000; | ||
| 734 | |||
| 735 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 736 | reserved1 DW ? ;; reserved for debugging used | ||
| 737 | reserved2 dw ? ;; | ||
| 738 | ;; | ||
| 739 | ;;;;;;;;ASSUME DS:NOTHING ;; | ||
| 740 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 741 | ;; | ||
| 742 | ;; PRN Device "strategy" entry point | ||
| 743 | ;; | ||
| 744 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 745 | ;; | ||
| 746 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 747 | STRATEGY0 PROC FAR ;; | ||
| 748 | PUSH BX ;; | ||
| 749 | PUSH BX ;; | ||
| 750 | LEA BX, BUF0 ;; BUF = BUF0 CS:[BX] | ||
| 751 | POP buf.RH_PTRO ;; offset of request header | ||
| 752 | MOV buf.RH_PTRS,ES ;; segment | ||
| 753 | POP BX ;; | ||
| 754 | RET ;; | ||
| 755 | STRATEGY0 ENDP ;; | ||
| 756 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 757 | ;; | ||
| 758 | ;; LPT1 Device "strategy" entry point | ||
| 759 | ;; | ||
| 760 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 761 | ;; | ||
| 762 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 763 | STRATEGY1 PROC FAR ;; | ||
| 764 | PUSH BX ;; | ||
| 765 | PUSH BX ;; | ||
| 766 | LEA BX, BUF1 ;; BUF = BUF1 CS:[BX] | ||
| 767 | POP buf.RH_PTRO ;; offset of request header | ||
| 768 | MOV buf.RH_PTRS,ES ;; segment | ||
| 769 | POP BX ;; | ||
| 770 | RET ;; | ||
| 771 | STRATEGY1 ENDP ;; | ||
| 772 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 773 | ;; | ||
| 774 | ;; LPT2 Device "strategy" entry point | ||
| 775 | ;; | ||
| 776 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 777 | ;; | ||
| 778 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 779 | STRATEGY2 PROC FAR ;; | ||
| 780 | PUSH BX ;; | ||
| 781 | PUSH BX ;; | ||
| 782 | LEA BX, BUF2 ;; BUF = BUF2 CS:[BX] | ||
| 783 | POP buf.RH_PTRO ;; offset of request header | ||
| 784 | MOV buf.RH_PTRS,ES ;; segment | ||
| 785 | POP BX ;; | ||
| 786 | RET ;; | ||
| 787 | STRATEGY2 ENDP ;; | ||
| 788 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 789 | ;; | ||
| 790 | ;; LPT3 Device "strategy" entry point | ||
| 791 | ;; | ||
| 792 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 793 | ;; | ||
| 794 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 795 | STRATEGY3 PROC FAR ;; | ||
| 796 | PUSH BX ;; | ||
| 797 | PUSH BX ;; | ||
| 798 | LEA BX, BUF3 ;; BUF = BUF3 CS:[BX] | ||
| 799 | POP buf.RH_PTRO ;; offset of request header | ||
| 800 | MOV buf.RH_PTRS,ES ;; segment | ||
| 801 | POP BX ;; | ||
| 802 | RET ;; | ||
| 803 | STRATEGY3 ENDP ;; | ||
| 804 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 805 | ;; | ||
| 806 | ;; Table of command / functions supported by LPTn | ||
| 807 | ;; | ||
| 808 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 809 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 810 | ;; CMD_CODES code supported by LPTn | ||
| 811 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 812 | CMD_CODES LABEL BYTE ;; | ||
| 813 | DB CMD_INI ;; Initialization | ||
| 814 | DB CMD_WRT ;; output | ||
| 815 | DB 09 ;; output | ||
| 816 | DB 12 ;; output | ||
| 817 | CMD_INDX EQU ($-CMD_CODES) ;; number of entries in CMD_CODES | ||
| 818 | ;; | ||
| 819 | ;; Write (CMD_WRT) has exceptional | ||
| 820 | ;; support by LPTn | ||
| 821 | ;; | ||
| 822 | ;; Generic IOCTL (CMD_GIO) leads to | ||
| 823 | ;; GIO_CODES | ||
| 824 | ;; | ||
| 825 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 826 | ;; GIO_CODES code supported by LPTn | ||
| 827 | ;; -- command = CMD_GIO and | ||
| 828 | ;; major function = MAF_PTR | ||
| 829 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 830 | GIO_CODES LABEL BYTE ;; minor GIO functions supported : | ||
| 831 | DB MIF_DST ;; - designate start | ||
| 832 | DB MIF_DEN ;; - designate end | ||
| 833 | DB MIF_IVK ;; - invoke | ||
| 834 | DB MIF_QIV ;; - query-invoked | ||
| 835 | DB MIF_QLS ;; - query-list | ||
| 836 | GIO_INDX EQU ($-GIO_CODES) ;; number of entries in GIO_CODES | ||
| 837 | ;; | ||
| 838 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 839 | ;; Cases supported by LPTn | ||
| 840 | ;; -- first section matched with | ||
| 841 | ;; CMD_CODES upto CMD_INDX | ||
| 842 | ;; | ||
| 843 | ;; -- 2nd section matched with | ||
| 844 | ;; GIO_CODES for GIO_INDEX more | ||
| 845 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 846 | CASES LABEL WORD ;; in CMD_CODES order | ||
| 847 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 848 | ;; | ||
| 849 | DW OFFSET INIT ;; 0 - Initialization | ||
| 850 | DW OFFSET WRITE ;; | ||
| 851 | DW OFFSET WRITE ;; | ||
| 852 | DW OFFSET WRITE ;; | ||
| 853 | ;; | ||
| 854 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 855 | ;; in GIO_CODES order | ||
| 856 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 857 | ;; | ||
| 858 | DW OFFSET DESIGNATE_START ;; | ||
| 859 | DW OFFSET DESIGNATE_END ;; | ||
| 860 | DW OFFSET INVOKE ;; | ||
| 861 | DW OFFSET Q_INVOKED ;; | ||
| 862 | DW OFFSET Q_LIST ;; | ||
| 863 | ;; | ||
| 864 | ;; | ||
| 865 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 866 | ;; | ||
| 867 | ;; Memory Allocation | ||
| 868 | ;; | ||
| 869 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 870 | ;; | ||
| 871 | ;; | ||
| 872 | ;; | ||
| 873 | MEM_REQUEST DW -1 ;; flag used for first time memory | ||
| 874 | ;; allocation for each device | ||
| 875 | ;; | ||
| 876 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 877 | ;; | ||
| 878 | ;; PRN Device "interrupt" entry point | ||
| 879 | ;; | ||
| 880 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 881 | ;; | ||
| 882 | INTERRUPT0 PROC FAR ;; device interrupt entry point | ||
| 883 | ;; | ||
| 884 | PUSH DS ;; save all registers Revised | ||
| 885 | PUSH ES ;; | ||
| 886 | PUSH AX ;; | ||
| 887 | PUSH BX ;; | ||
| 888 | PUSH CX ;; | ||
| 889 | PUSH DX ;; | ||
| 890 | PUSH DI ;; | ||
| 891 | PUSH SI ;; | ||
| 892 | ;; BP isn't used, so it isn't saved | ||
| 893 | push cs ;; | ||
| 894 | pop ds ;; | ||
| 895 | ;; | ||
| 896 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 897 | JNE PRN_NO_STACK ;; | ||
| 898 | ;; | ||
| 899 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 900 | ; | ||
| 901 | ; STACK RECODING SEPT 28/86 | ||
| 902 | ; | ||
| 903 | ; GORDON GIDDINGS | ||
| 904 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 905 | MOV AX,STACK_SIZE ;G; | ||
| 906 | SHL AX,1 ;G; | ||
| 907 | SHL AX,1 ;G; | ||
| 908 | SHL AX,1 ;G; | ||
| 909 | SHL AX,1 ;G; | ||
| 910 | MOV CS:TEMP_SI,SI ;G; | ||
| 911 | MOV SI,RESIDENT_END ;G; | ||
| 912 | SUB SI,STACK_SIZE ;G; | ||
| 913 | ;G; | ||
| 914 | mov reserved1,AX ;G; | ||
| 915 | mov reserved2,SI ;G; | ||
| 916 | ;G; | ||
| 917 | CLI ;G; | ||
| 918 | MOV DX,SS ;G; | ||
| 919 | MOV CX,SP ;G; | ||
| 920 | MOV SS,SI ;G; | ||
| 921 | MOV SP,AX ;G; | ||
| 922 | STI ;G; | ||
| 923 | MOV SI,CS:TEMP_SI ;G; | ||
| 924 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 925 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 926 | PUSH CX ;; " " SP " " | ||
| 927 | ;; | ||
| 928 | PRN_NO_STACK : ;; | ||
| 929 | ;; | ||
| 930 | ;; | ||
| 931 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 932 | ;; | ||
| 933 | PUSH DI ;; push return address onto stack | ||
| 934 | ;; command routine issues "RET" | ||
| 935 | ;; | ||
| 936 | LEA BX, BUF0 ;; PRN BUF = BUF0 , CS:BX | ||
| 937 | ;; | ||
| 938 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 939 | ;; | ||
| 940 | CMP BUF.BFLAG,-1 ;; | ||
| 941 | JNE PRN_INITED ;; | ||
| 942 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 943 | MOV BUF.BFLAG,BF_PRN ;; INITIALIZE PRN BUFFER | ||
| 944 | ;; | ||
| 945 | MOV DI,OFFSET DEV_HDR0 ;; PRN Device header | ||
| 946 | MOV BUF.DEV_HDRO,DI ;; | ||
| 947 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 948 | ;; | ||
| 949 | MOV DI,OFFSET HBUF_SL1 ;; PRN/LPT1 buffer for Hardware-slots | ||
| 950 | MOV BUF.HRBUFO,DI ;; | ||
| 951 | ;; | ||
| 952 | MOV DI,OFFSET RBUF_SL1 ;; PRN/LPT1 buffer for RAM-slots | ||
| 953 | MOV BUF.RMBUFO,DI ;; | ||
| 954 | ;; | ||
| 955 | MOV DI,OFFSET FTDL_OFF1 ;; | ||
| 956 | MOV BUF.FTDLO,DI ;; | ||
| 957 | ;; | ||
| 958 | MOV DI,OFFSET REQ_NORM1 ;; PRN/LPT1 request header | ||
| 959 | MOV BUF.RNORMO,DI ;; | ||
| 960 | ;; | ||
| 961 | MOV BUF.FSELEN,0 ;; selection control length | ||
| 962 | ;; | ||
| 963 | mov buf.prn_bufo,offset buf0;; | ||
| 964 | ;; | ||
| 965 | JMP COMMON_INTR ;; common interrupt handler | ||
| 966 | ;; | ||
| 967 | PRN_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 968 | ;; FONT BUFFER TO BE CREATED ? | ||
| 969 | CMP BUF.BFLAG,BF_PRN ;; | ||
| 970 | JNE PRN_MEM_DONE ;; | ||
| 971 | ;; | ||
| 972 | OR BUF.BFLAG,BF_MEM_DONE ;; do it only once. | ||
| 973 | ;; | ||
| 974 | CMP BUF.STATE,CPSW ;; | ||
| 975 | JNE PRN_MEM_DONE ;; create only if state is CPSW | ||
| 976 | ;; | ||
| 977 | PRN_MEM_CREATE : ;; | ||
| 978 | XOR AX,AX ;; THEN CREATE | ||
| 979 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 980 | ;; LPTn or PRN | ||
| 981 | PRN_MEM_DONE : ;; | ||
| 982 | JMP COMMON_INTR ;; common interrupt handler | ||
| 983 | ;; | ||
| 984 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 985 | ;; | ||
| 986 | ;; LPT1 Device "interrupt" entry point | ||
| 987 | ;; | ||
| 988 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 989 | INTERRUPT1 PROC FAR ;; device interrupt entry point | ||
| 990 | ;; | ||
| 991 | PUSH DS ;; save all registers Revised | ||
| 992 | PUSH ES ;; | ||
| 993 | PUSH AX ;; | ||
| 994 | PUSH BX ;; | ||
| 995 | PUSH CX ;; | ||
| 996 | PUSH DX ;; | ||
| 997 | PUSH DI ;; | ||
| 998 | PUSH SI ;; | ||
| 999 | ;; BP isn't used, so it isn't saved | ||
| 1000 | push cs ;; | ||
| 1001 | pop ds ;; | ||
| 1002 | ;; | ||
| 1003 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 1004 | JNE LPT1_NO_STACK ;; | ||
| 1005 | ;; | ||
| 1006 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1007 | ; | ||
| 1008 | ; STACK RECODING SEPT 28/86 | ||
| 1009 | ; | ||
| 1010 | ; GORDON GIDDINGS | ||
| 1011 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1012 | MOV AX,STACK_SIZE ;G; | ||
| 1013 | SHL AX,1 ;G; | ||
| 1014 | SHL AX,1 ;G; | ||
| 1015 | SHL AX,1 ;G; | ||
| 1016 | SHL AX,1 ;G; | ||
| 1017 | MOV CS:TEMP_SI,SI ;G; | ||
| 1018 | MOV SI,RESIDENT_END ;G; | ||
| 1019 | SUB SI,STACK_SIZE ;G; | ||
| 1020 | ;G; | ||
| 1021 | mov reserved1,AX ;G; | ||
| 1022 | mov reserved2,SI ;G; | ||
| 1023 | ;G; | ||
| 1024 | CLI ;G; | ||
| 1025 | MOV DX,SS ;G; | ||
| 1026 | MOV CX,SP ;G; | ||
| 1027 | MOV SS,SI ;G; | ||
| 1028 | MOV SP,AX ;G; | ||
| 1029 | STI ;G; | ||
| 1030 | MOV SI,CS:TEMP_SI ;G; | ||
| 1031 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1032 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 1033 | PUSH CX ;; " " SP " " | ||
| 1034 | ;; | ||
| 1035 | LPT1_NO_STACK : ;; | ||
| 1036 | ;; | ||
| 1037 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 1038 | ;; | ||
| 1039 | PUSH DI ;; push return address onto stack | ||
| 1040 | ;; command routine issues "RET" | ||
| 1041 | LEA BX, BUF1 ;; LPT1 BUF = BUF1 , CS:BX | ||
| 1042 | ;; | ||
| 1043 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 1044 | ;; | ||
| 1045 | CMP BUF.BFLAG,-1 ;; | ||
| 1046 | JNE LPT1_INITED ;; | ||
| 1047 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1048 | MOV BUF.BFLAG,BF_LPT1 ;; INITIALIZE LPT1 BUFFER | ||
| 1049 | ;; | ||
| 1050 | MOV DI,OFFSET DEV_HDR1 ;; LPT1 Device header | ||
| 1051 | MOV BUF.DEV_HDRO,DI ;; | ||
| 1052 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 1053 | ;;.................................... | ||
| 1054 | LEA DI,BUF.RNORMO ;; duplicate common infor. between | ||
| 1055 | PUSH CS ;; PRN and LPT1 | ||
| 1056 | POP ES ;; | ||
| 1057 | LEA CX,BUF.BUFEND ;; | ||
| 1058 | SUB CX,DI ;; | ||
| 1059 | LEA SI, BUF0 ;; | ||
| 1060 | LEA SI,[SI].RNORMO ;; | ||
| 1061 | REP MOVS ES:BYTE PTR[DI],CS:[SI] | ||
| 1062 | ;; | ||
| 1063 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1064 | ;; | ||
| 1065 | LPT1_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1066 | ;; FONT MEMORY TO BE CREATED ? | ||
| 1067 | CMP BUF.BFLAG,BF_LPT1 ;; | ||
| 1068 | JNE LPT1_MEM_DONE ;; | ||
| 1069 | ;; | ||
| 1070 | OR BUF.BFLAG,BF_MEM_DONE ;; no more next time | ||
| 1071 | ;; | ||
| 1072 | CMP BUF.STATE,CPSW ;; | ||
| 1073 | JNE LPT1_MEM_DONE ;; do it only if state is CPSW | ||
| 1074 | ;; | ||
| 1075 | LPT1_MEM_CREATE : ;; | ||
| 1076 | XOR AX,AX ;; THEN CREATE MEMORY | ||
| 1077 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 1078 | ;; | ||
| 1079 | LPT1_MEM_DONE : ;; | ||
| 1080 | ;; | ||
| 1081 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1082 | ;; | ||
| 1083 | INTERRUPT1 ENDP ;; | ||
| 1084 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1085 | ;; | ||
| 1086 | ;; LPT2 Device "interrupt" entry point | ||
| 1087 | ;; | ||
| 1088 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1089 | INTERRUPT2 PROC FAR ;; device interrupt entry point | ||
| 1090 | ;; | ||
| 1091 | PUSH DS ;; save all registers Revised | ||
| 1092 | PUSH ES ;; | ||
| 1093 | PUSH AX ;; | ||
| 1094 | PUSH BX ;; | ||
| 1095 | PUSH CX ;; | ||
| 1096 | PUSH DX ;; | ||
| 1097 | PUSH DI ;; | ||
| 1098 | PUSH SI ;; | ||
| 1099 | ;; BP isn't used, so it isn't saved | ||
| 1100 | push cs ;; | ||
| 1101 | pop ds ;; | ||
| 1102 | ;; | ||
| 1103 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 1104 | JNE LPT2_NO_STACK ;; | ||
| 1105 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1106 | ; | ||
| 1107 | ; STACK RECODING SEPT 28/86 | ||
| 1108 | ; | ||
| 1109 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1110 | MOV AX,STACK_SIZE ;G; | ||
| 1111 | SHL AX,1 ;G; | ||
| 1112 | SHL AX,1 ;G; | ||
| 1113 | SHL AX,1 ;G; | ||
| 1114 | SHL AX,1 ;G; | ||
| 1115 | MOV CS:TEMP_SI,SI ;G; | ||
| 1116 | MOV SI,RESIDENT_END ;G; | ||
| 1117 | SUB SI,STACK_SIZE ;G; | ||
| 1118 | ;G; | ||
| 1119 | mov reserved1,AX ;G; | ||
| 1120 | mov reserved2,SI ;G; | ||
| 1121 | ;G; | ||
| 1122 | CLI ;G; | ||
| 1123 | MOV DX,SS ;G; | ||
| 1124 | MOV CX,SP ;G; | ||
| 1125 | MOV SS,SI ;G; | ||
| 1126 | MOV SP,AX ;G; | ||
| 1127 | STI ;G; | ||
| 1128 | MOV SI,CS:TEMP_SI ;G; | ||
| 1129 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1130 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 1131 | PUSH CX ;; " " SP " " | ||
| 1132 | ;; | ||
| 1133 | LPT2_NO_STACK : ;; | ||
| 1134 | ;; | ||
| 1135 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 1136 | ;; | ||
| 1137 | PUSH DI ;; push return address onto stack | ||
| 1138 | ;; command routine issues "RET" | ||
| 1139 | ;; | ||
| 1140 | LEA BX, BUF2 ;; LPT2 BUF = BUF2 , CS:BX | ||
| 1141 | ;; | ||
| 1142 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 1143 | ;; | ||
| 1144 | CMP BUF.BFLAG,-1 ;; | ||
| 1145 | JNE LPT2_INITED ;; | ||
| 1146 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1147 | MOV BUF.BFLAG,BF_LPT2 ;; initialise LPT2 buffer | ||
| 1148 | ;; | ||
| 1149 | MOV DI,OFFSET DEV_HDR2 ;; LPT2 Device header | ||
| 1150 | MOV BUF.DEV_HDRO,DI ;; | ||
| 1151 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 1152 | ;; | ||
| 1153 | MOV DI,OFFSET HBUF_SL2 ;; LPT2 buffer for Hardware-slots | ||
| 1154 | MOV BUF.HRBUFO,DI ;; | ||
| 1155 | ;; | ||
| 1156 | MOV DI,OFFSET RBUF_SL2 ;; LPT2 buffer for RAM-slots | ||
| 1157 | MOV BUF.RMBUFO,DI ;; | ||
| 1158 | ;; | ||
| 1159 | MOV DI,OFFSET FTDL_OFF2 ;; | ||
| 1160 | MOV BUF.FTDLO,DI ;; | ||
| 1161 | ;; | ||
| 1162 | ;; | ||
| 1163 | MOV DI,OFFSET REQ_NORM2 ;; LPT2 request header | ||
| 1164 | MOV BUF.RNORMO,DI ;; | ||
| 1165 | ;; | ||
| 1166 | MOV BUF.FSELEN,0 ;; selection control length | ||
| 1167 | ;; | ||
| 1168 | mov buf.prn_bufo,offset buf2;; | ||
| 1169 | ;; | ||
| 1170 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1171 | ;; | ||
| 1172 | LPT2_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1173 | ;; FONT BUFFER TO BE CREATED ? | ||
| 1174 | CMP BUF.BFLAG,BF_LPT2 ;; | ||
| 1175 | JNE LPT2_MEM_DONE ;; | ||
| 1176 | ;; | ||
| 1177 | OR BUF.BFLAG,BF_MEM_DONE ;; | ||
| 1178 | ;; | ||
| 1179 | CMP BUF.STATE,CPSW ;; | ||
| 1180 | JNE LPT2_MEM_DONE ;; | ||
| 1181 | ;; | ||
| 1182 | XOR AX,AX ;; | ||
| 1183 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 1184 | ;; LPTn or PRN | ||
| 1185 | LPT2_MEM_DONE : ;; | ||
| 1186 | ;; | ||
| 1187 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1188 | ;; | ||
| 1189 | INTERRUPT2 ENDP ;; | ||
| 1190 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1191 | ;; | ||
| 1192 | ;; LPT3 Device "interrupt" entry point | ||
| 1193 | ;; | ||
| 1194 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1195 | INTERRUPT3 PROC FAR ;; device interrupt entry point | ||
| 1196 | ;; | ||
| 1197 | PUSH DS ;; save all registers Revised | ||
| 1198 | PUSH ES ;; | ||
| 1199 | PUSH AX ;; | ||
| 1200 | PUSH BX ;; | ||
| 1201 | PUSH CX ;; | ||
| 1202 | PUSH DX ;; | ||
| 1203 | PUSH DI ;; | ||
| 1204 | PUSH SI ;; | ||
| 1205 | ;; BP isn't used, so it isn't saved | ||
| 1206 | push cs ;; | ||
| 1207 | pop ds ;; | ||
| 1208 | ;; | ||
| 1209 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 1210 | JNE LPT3_NO_STACK ;; | ||
| 1211 | ;; | ||
| 1212 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1213 | ; | ||
| 1214 | ; STACK RECODING SEPT 28/86 | ||
| 1215 | ; | ||
| 1216 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1217 | MOV AX,STACK_SIZE ;G; | ||
| 1218 | SHL AX,1 ;G; | ||
| 1219 | SHL AX,1 ;G; | ||
| 1220 | SHL AX,1 ;G; | ||
| 1221 | SHL AX,1 ;G; | ||
| 1222 | MOV CS:TEMP_SI,SI ;G; | ||
| 1223 | MOV SI,RESIDENT_END ;G; | ||
| 1224 | SUB SI,STACK_SIZE ;G; | ||
| 1225 | ;G; | ||
| 1226 | mov reserved1,AX ;G; | ||
| 1227 | mov reserved2,SI ;G; | ||
| 1228 | ;G; | ||
| 1229 | CLI ;G; | ||
| 1230 | MOV DX,SS ;G; | ||
| 1231 | MOV CX,SP ;G; | ||
| 1232 | MOV SS,SI ;G; | ||
| 1233 | MOV SP,AX ;G; | ||
| 1234 | STI ;G; | ||
| 1235 | MOV SI,CS:TEMP_SI ;G; | ||
| 1236 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1237 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 1238 | PUSH CX ;; " " SP " " | ||
| 1239 | ;; | ||
| 1240 | LPT3_NO_STACK : ;; | ||
| 1241 | ;; | ||
| 1242 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 1243 | ;; | ||
| 1244 | PUSH DI ;; push return address onto stack | ||
| 1245 | ;; command routine issues "RET" | ||
| 1246 | ;; | ||
| 1247 | LEA BX, BUF3 ;; LPT3 BUF = BUF3 , CS:BX | ||
| 1248 | ;; | ||
| 1249 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 1250 | ;; | ||
| 1251 | CMP BUF.BFLAG,-1 ;; | ||
| 1252 | JNE LPT3_INITED ;; | ||
| 1253 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1254 | MOV BUF.BFLAG,BF_LPT3 ;; INITIALIZE LPT3 BUFFER | ||
| 1255 | ;; | ||
| 1256 | MOV DI,OFFSET DEV_HDR3 ;; LPT3 Device header | ||
| 1257 | MOV BUF.DEV_HDRO,DI ;; | ||
| 1258 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 1259 | ;; | ||
| 1260 | MOV DI,OFFSET HBUF_SL3 ;; LPT3 buffer for Hardware-slots | ||
| 1261 | MOV BUF.HRBUFO,DI ;; | ||
| 1262 | ;; | ||
| 1263 | MOV DI,OFFSET RBUF_SL3 ;; LPT3 buffer for RAM-slots | ||
| 1264 | MOV BUF.RMBUFO,DI ;; | ||
| 1265 | ;; | ||
| 1266 | MOV DI,OFFSET FTDL_OFF3 ;; | ||
| 1267 | MOV BUF.FTDLO,DI ;; | ||
| 1268 | ;; | ||
| 1269 | ;; | ||
| 1270 | MOV DI,OFFSET REQ_NORM3 ;; LPT3 request header | ||
| 1271 | MOV BUF.RNORMO,DI ;; | ||
| 1272 | ;; | ||
| 1273 | MOV BUF.FSELEN,0 ;; selection control length | ||
| 1274 | ;; | ||
| 1275 | mov buf.prn_bufo,offset buf3;; | ||
| 1276 | ;; | ||
| 1277 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1278 | ;; | ||
| 1279 | LPT3_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1280 | ;; FONT BUFFER TO BE CREATED ? | ||
| 1281 | CMP BUF.BFLAG,BF_LPT3 ;; | ||
| 1282 | JNE LPT3_MEM_DONE ;; | ||
| 1283 | ;; | ||
| 1284 | OR BUF.BFLAG,BF_MEM_DONE ;; no more next time | ||
| 1285 | ;; | ||
| 1286 | CMP BUF.STATE,CPSW ;; | ||
| 1287 | JNE LPT3_MEM_DONE ;; | ||
| 1288 | ;; | ||
| 1289 | XOR AX,AX ;; | ||
| 1290 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 1291 | ;; LPTn or PRN | ||
| 1292 | LPT3_MEM_DONE : ;; | ||
| 1293 | ;; | ||
| 1294 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1295 | ;; | ||
| 1296 | INTERRUPT3 ENDP ;; | ||
| 1297 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1298 | ; | ||
| 1299 | ; Common interrupt entry : | ||
| 1300 | ; at entry, BUFn (CS:BX) of LPTn is defined | ||
| 1301 | ; | ||
| 1302 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1303 | COMMON_INTR : ;; | ||
| 1304 | CLD ;; all moves forward | ||
| 1305 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1306 | ; Check if header link has to be set | ||
| 1307 | ; | ||
| 1308 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1309 | LDS SI,DWORD PTR BUF.DEV_HDRO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1310 | ;; device header : DS:[SI] | ||
| 1311 | CMP BUF.LPT_STRAO, -1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1312 | JNE DOSLPT_FOUND ;; has been linked to DOS LPTn | ||
| 1313 | CMP BUF.LPT_STRAS, -1 ;; | ||
| 1314 | JNE DOSLPT_FOUND ;; has been linked to DOS LPTn | ||
| 1315 | LDS SI,DWORD PTR BUF.DEV_HDRO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1316 | ;; next device header : ES:[DI] | ||
| 1317 | LES DI,DWORD PTR HP.DH_NEXTO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1318 | ;; | ||
| 1319 | PUSH ES ;; | ||
| 1320 | POP AX ;; | ||
| 1321 | AND AX,AX ;; | ||
| 1322 | JNZ L1 ;; | ||
| 1323 | JMP DOSLPT_FOUND ;; link not yet set up | ||
| 1324 | ;; | ||
| 1325 | ;$SEARCH WHILE ;; pointer to next device header is NOT | ||
| 1326 | L1: | ||
| 1327 | PUSH ES ;; -1 | ||
| 1328 | POP AX ;; | ||
| 1329 | CMP AX,-1 ;; | ||
| 1330 | ;$LEAVE E, AND ;; leave if both offset and segment are | ||
| 1331 | JNE NOT0FFFF | ||
| 1332 | |||
| 1333 | CMP DI,-1 ;; 0FFFFH | ||
| 1334 | ;$LEAVE E ;; | ||
| 1335 | JE L2 | ||
| 1336 | |||
| 1337 | NOT0FFFF: ;; | ||
| 1338 | PUSH DI ;; | ||
| 1339 | PUSH SI ;; | ||
| 1340 | MOV CX,NAME_LEN ;; | ||
| 1341 | LEA DI,NHD.DH_NAME ;; | ||
| 1342 | LEA SI,HP.DH_NAME ;; | ||
| 1343 | REPE CMPSB ;; | ||
| 1344 | POP SI ;; | ||
| 1345 | POP DI ;; | ||
| 1346 | AND CX,CX ;; | ||
| 1347 | |||
| 1348 | ;$EXITIF Z ;; exit if name is found in linked hd. | ||
| 1349 | JNZ L3 ;; name is not found | ||
| 1350 | ;; | ||
| 1351 | ;; name is found in the linked header | ||
| 1352 | MOV AX,NHD.DH_STRAO ;; get the STRATEGY address | ||
| 1353 | ; ADD AX,DI ;; | ||
| 1354 | MOV BUF.LPT_STRAO,AX ;; | ||
| 1355 | MOV AX,ES ;; | ||
| 1356 | ; JNC X1 ;; | ||
| 1357 | ; ADD AX,1000H ;; carrier overflow | ||
| 1358 | X1: MOV BUF.LPT_STRAS,AX ;; | ||
| 1359 | ;; | ||
| 1360 | MOV AX,NHD.DH_INTRO ;; get the INTERRUPT address | ||
| 1361 | ; ADD AX,DI ;; | ||
| 1362 | MOV BUF.LPT_INTRO,AX ;; | ||
| 1363 | MOV AX,ES ;; | ||
| 1364 | ; JNC X2 ;; | ||
| 1365 | ; ADD AX,1000H ;; carrier overflow | ||
| 1366 | X2: MOV BUF.LPT_INTRS,AX ;; | ||
| 1367 | ;; | ||
| 1368 | ;; | ||
| 1369 | ;$ORELSE ;; find next header to have the same | ||
| 1370 | ;; device name | ||
| 1371 | JMP L4 ;; | ||
| 1372 | L3: ;; | ||
| 1373 | LES DI,DWORD PTR NHD.DH_NEXTO ; | ||
| 1374 | ;; | ||
| 1375 | ;$ENDLOOP ;; | ||
| 1376 | JMP L1 ;; | ||
| 1377 | L2: ;; | ||
| 1378 | ;$ENDSRCH ;; | ||
| 1379 | L4: ;; | ||
| 1380 | ;; | ||
| 1381 | DOSLPT_FOUND : ;; device header link has been | ||
| 1382 | ;; established | ||
| 1383 | ;; | ||
| 1384 | ;; | ||
| 1385 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1386 | ; | ||
| 1387 | ; COMMAND REQUEST | ||
| 1388 | ; ES:DI Request Header , and | ||
| 1389 | ; | ||
| 1390 | ; CMD_CODES, GIO_CODES | ||
| 1391 | ; | ||
| 1392 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1393 | ;; | ||
| 1394 | ;; | ||
| 1395 | LES DI,dword ptr buf.rh_ptro ;; get RH address passed to | ||
| 1396 | ;; | ||
| 1397 | MOV AL,RH.RHC_CMD ;; | ||
| 1398 | CMP AL,CMD_GIO ;; | ||
| 1399 | JE GIO_COMMAND ;; | ||
| 1400 | ;; | ||
| 1401 | PUSH CS ;; non-GIO command | ||
| 1402 | POP ES ;; | ||
| 1403 | MOV DI,OFFSET CMD_CODES ;; | ||
| 1404 | MOV CX,CMD_INDX ;; | ||
| 1405 | ;; find if command is in CMD_CODES ? | ||
| 1406 | REPNE SCASB ;; | ||
| 1407 | JNE UN_SUP ;; | ||
| 1408 | MOV SI,CMD_INDX ;; the command is supported : | ||
| 1409 | SUB SI,CX ;; | ||
| 1410 | DEC SI ;; index to CASES | ||
| 1411 | JMP SUPPORTED ;; | ||
| 1412 | ;; | ||
| 1413 | UN_SUP: JMP NORM_DRIVER ;; to be handled by DOS normal driver | ||
| 1414 | ;; | ||
| 1415 | GIO_COMMAND : ;; Check if it is valid GIO | ||
| 1416 | ;; | ||
| 1417 | GIO_CASES : ;; supported GIO command | ||
| 1418 | MOV AL,RH.GIH_MIF ;; | ||
| 1419 | ;; use minor function to locate | ||
| 1420 | PUSH CS ;; | ||
| 1421 | POP ES ;; | ||
| 1422 | MOV DI,OFFSET GIO_CODES ;; | ||
| 1423 | MOV CX,GIO_INDX ;; | ||
| 1424 | ;; find if command is in GIO_CODES ? | ||
| 1425 | REPNE SCASB ;; | ||
| 1426 | JNE NORM_DRIVER ;; | ||
| 1427 | MOV SI,GIO_INDX ;; the command is supported : | ||
| 1428 | SUB SI,CX ;; | ||
| 1429 | DEC SI ;; index to CASES | ||
| 1430 | ADD SI,CMD_INDX ;; | ||
| 1431 | ;; | ||
| 1432 | SUPPORTED : ;; command/functions supported by LPTn | ||
| 1433 | ;; | ||
| 1434 | ADD SI,SI ;; double to index to WORD-offset | ||
| 1435 | ;; | ||
| 1436 | XOR AX,AX ;; initialize return to "no error" | ||
| 1437 | ;; | ||
| 1438 | LES DI,dword ptr buf.rh_ptro ;; get RH address again | ||
| 1439 | ;; | ||
| 1440 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1441 | ; At entry to command processing routine: | ||
| 1442 | ; | ||
| 1443 | ; ES:DI = Request Header address | ||
| 1444 | ; CS:BX = Buffer for lptn | ||
| 1445 | ; CS = code segment address | ||
| 1446 | ; AX = 0 | ||
| 1447 | ; | ||
| 1448 | ; top of stack is return address, IRPT_CMD_EXIT | ||
| 1449 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1450 | ;; | ||
| 1451 | JMP CS:CASES[SI] ;; call routine to handle the command | ||
| 1452 | ;; | ||
| 1453 | ;; | ||
| 1454 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1455 | ;; | ||
| 1456 | IRPT_CMD_EXIT: ;; return from command routine | ||
| 1457 | ;; AX = value to OR into status word | ||
| 1458 | LES DI,dword ptr buf.rh_ptro ;; restore ES:DI as Request Header ptr | ||
| 1459 | MOV AX,RH.RHC_STA ;; | ||
| 1460 | OR AH,STAT_DONE ;; add "done" bit to status word | ||
| 1461 | MOV RH.RHC_STA,AX ;; store status into request header | ||
| 1462 | ;; | ||
| 1463 | ;; | ||
| 1464 | ;; *** USING INTERNATL STACK ? *** | ||
| 1465 | ;; | ||
| 1466 | CMP STACK_ALLOCATED,-1 ;; | ||
| 1467 | JE RET0_NO_STACK ;; | ||
| 1468 | ;; | ||
| 1469 | CMP STACK_ALLOCATED,0 ;; | ||
| 1470 | JNE RET0_IN_STACK ;; | ||
| 1471 | ;; | ||
| 1472 | MOV STACK_ALLOCATED,0AAH ;; NEXT interrupt will start using | ||
| 1473 | JMP RET0_NO_STACK ;; internal STACK | ||
| 1474 | ;; | ||
| 1475 | RET0_IN_STACK : ;; use internal STACK !!!! | ||
| 1476 | POP CX ;get old SP from stack | ||
| 1477 | POP DX ;get old SS from stack | ||
| 1478 | CLI ;disable interrupts while changing SS:SP | ||
| 1479 | MOV SS,DX ;restore stack segment register | ||
| 1480 | MOV SP,CX ;restore stack pointer register | ||
| 1481 | STI ;enable interrupts | ||
| 1482 | ;; | ||
| 1483 | ;; | ||
| 1484 | RET0_NO_STACK : ;; | ||
| 1485 | ;; | ||
| 1486 | POP SI ;; restore registers | ||
| 1487 | POP DI ;; | ||
| 1488 | POP DX ;; | ||
| 1489 | POP CX ;; | ||
| 1490 | POP BX ;; | ||
| 1491 | POP AX ;; | ||
| 1492 | POP ES ;; | ||
| 1493 | POP DS ;; | ||
| 1494 | RET ;; | ||
| 1495 | ;; | ||
| 1496 | INTERRUPT0 ENDP ;; | ||
| 1497 | ;; | ||
| 1498 | ;; | ||
| 1499 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1500 | ;; | ||
| 1501 | ;;==== Command not supported by CPSW device driver | ||
| 1502 | ;; | ||
| 1503 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1504 | ;; | ||
| 1505 | NORM_DRIVER PROC ;; LPT OUTPUT to the DOS LPTn | ||
| 1506 | ;; | ||
| 1507 | PUSH BX ;; **** BUF. is changed **** | ||
| 1508 | PUSH BX ;; | ||
| 1509 | POP SI ;; | ||
| 1510 | LES BX,DWORD PTR BUF.RH_PTRO ;; pass the request header to the | ||
| 1511 | CALL DWORD PTR CS:[SI].LPT_STRAO ;; LPTn strategy routine. | ||
| 1512 | ;; | ||
| 1513 | POP BX ;; | ||
| 1514 | CALL DWORD PTR BUF.LPT_INTRO ;; interrupt the DOS LPTn | ||
| 1515 | RET ;; | ||
| 1516 | ;; | ||
| 1517 | NORM_DRIVER ENDP ;; | ||
| 1518 | ;; | ||
| 1519 | ;; | ||
| 1520 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1521 | ;; | ||
| 1522 | ;;==== Command Code - lpt_output ======= | ||
| 1523 | ;; | ||
| 1524 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1525 | ;; | ||
| 1526 | WRITE PROC ;; LPT OUTPUT to the DOS LPTn | ||
| 1527 | ;; | ||
| 1528 | ;; | ||
| 1529 | ;; | ||
| 1530 | LES DI,dword ptr buf.rh_ptro ;; restore ES:DI as Request Header ptr | ||
| 1531 | ;; | ||
| 1532 | MOV AX,BUF.STATE ;; | ||
| 1533 | CMP AX,NORMAL ;; | ||
| 1534 | JNE WRT_NOT_NORMAL ;; | ||
| 1535 | JMP WRT_NORMAL ;; | ||
| 1536 | ;; | ||
| 1537 | WRT_NOT_NORMAL : ;; | ||
| 1538 | CMP AX,DESG_END ;; | ||
| 1539 | JNE WRT_FONT ;; | ||
| 1540 | JMP NO_MORE_FTBLK ;; ignore the write | ||
| 1541 | ;; | ||
| 1542 | WRT_FONT : ;; | ||
| 1543 | CMP AX,DESG_WR ;; | ||
| 1544 | JE WRT_DESIGNATE ;; | ||
| 1545 | JMP WRT_NORMAL ;; | ||
| 1546 | ;;------------------------- | ||
| 1547 | WRT_DESIGNATE : ;; DESIGNATE WRITE | ||
| 1548 | MOV AX,BUF.STATUS ;; | ||
| 1549 | AND AX,FAIL ;; | ||
| 1550 | JZ WRT_DESG_GOOD ;; | ||
| 1551 | JMP WRT_IGNORE ;; already failed | ||
| 1552 | ;; | ||
| 1553 | WRT_DESG_GOOD : ;; | ||
| 1554 | MOV SI,OFFSET FTABLE ;; | ||
| 1555 | PUSH CS ;; | ||
| 1556 | POP DS ;; | ||
| 1557 | ;; | ||
| 1558 | MOV DS:[SI].FLAG,0 ;; no restart | ||
| 1559 | MOV AX,RH.RH3_CNT ;; | ||
| 1560 | MOV DS:[SI].BUFFER_LEN,AX ;; length of request packet | ||
| 1561 | ;; | ||
| 1562 | PUSH SI ;; | ||
| 1563 | LEA SI,[SI].BUFFER_ADDR ;; packet address | ||
| 1564 | MOV AX,RH.RH3_DTAO ;; | ||
| 1565 | MOV DS:[SI],AX ;; | ||
| 1566 | INC SI ;; | ||
| 1567 | INC SI ;; | ||
| 1568 | MOV AX,RH.RH3_DTAS ;; | ||
| 1569 | MOV DS:[SI],AX ;; | ||
| 1570 | POP SI ;; | ||
| 1571 | ;; | ||
| 1572 | FP_CALL : ;; ************************** | ||
| 1573 | CALL FONT_PARSER ;; ** Parse the Font File ** | ||
| 1574 | FP_RETURN : ;; ************************** | ||
| 1575 | ;; | ||
| 1576 | ;; -- only for the RAM slot -- | ||
| 1577 | ;; | ||
| 1578 | ;; PROCESS THE RETURNED FONT : | ||
| 1579 | ;; SI = FTABLE | ||
| 1580 | MOV ES,BUF.FTSTART ;; ES = the start of the font buffer, | ||
| 1581 | ;; its entry corresponds to the | ||
| 1582 | ;; positioning of codepage in slot | ||
| 1583 | MOV DI,BUF.FTSLOTO ;; DI = start of the slot of codepages | ||
| 1584 | ;; CX = slot size of the font downloaded | ||
| 1585 | MOV CX,BUF.RBUFMX ;; --- if there is no designate | ||
| 1586 | MOV AX,BUF.STATUS ;; | ||
| 1587 | AND AX,DSF_CARTCP ;; | ||
| 1588 | JZ CHECK_RETURN ;; | ||
| 1589 | MOV CX,BUF.HSLMX ;; -- with/without designate, <>0 | ||
| 1590 | ;; | ||
| 1591 | CHECK_RETURN : ;; | ||
| 1592 | ;; | ||
| 1593 | MOV DX,CS:[SI].NUM_FTBLK ;; DX = number fo code pages loaded | ||
| 1594 | ;; | ||
| 1595 | ADD SI,TYPE FBUFS ;; SI = points to FTBLK | ||
| 1596 | ;;................................... | ||
| 1597 | PARSE_FTBLK : ;; **** LOOP **** | ||
| 1598 | ;; | ||
| 1599 | ;; | ||
| 1600 | AND DX,DX ;; | ||
| 1601 | JNZ SKIP_SLOT ;; | ||
| 1602 | JMP NO_MORE_FTBLK ;; **** LOOP EXIT (FTBLK end) **** | ||
| 1603 | ;;................................... | ||
| 1604 | ;; **** LOOP (on each FTBLK) **** | ||
| 1605 | ;; | ||
| 1606 | ;; skip on the slot until the codepage | ||
| 1607 | SKIP_SLOT : ;; is one of the downloaded. | ||
| 1608 | AND CX,CX ;; | ||
| 1609 | JNZ LOCATE_SLOT ;; | ||
| 1610 | XOR AX,AX ;; | ||
| 1611 | PUSH AX ;; | ||
| 1612 | POP ES ;; ES = 0, no font storage(less buffer) | ||
| 1613 | JMP SLOT_FOUND ;; | ||
| 1614 | ;; | ||
| 1615 | LOCATE_SLOT: ;; | ||
| 1616 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 1617 | AND AX,AT_load ;; | ||
| 1618 | Jnz SLOT_FOUND ;; | ||
| 1619 | INC DI ;;######## NEXT SLOT ############ | ||
| 1620 | INC DI ;; | ||
| 1621 | INC DI ;; | ||
| 1622 | INC DI ;; next slot | ||
| 1623 | PUSH ES ;; | ||
| 1624 | POP AX ;; | ||
| 1625 | ADD AX,BUF.FTSZPA ;; | ||
| 1626 | PUSH AX ;; | ||
| 1627 | POP ES ;; next buffer | ||
| 1628 | DEC CX ;;#################################### | ||
| 1629 | JMP SKIP_SLOT ;; | ||
| 1630 | ;; | ||
| 1631 | SLOT_FOUND : ;; | ||
| 1632 | MOV AX,CS:[SI].FTB_STATUS ;; | ||
| 1633 | CMP AX,0FFF0H ;; | ||
| 1634 | JNB CHECK_FSTAT ;; | ||
| 1635 | ;; | ||
| 1636 | OR BUF.STATUS,FAIL ;; | ||
| 1637 | ;; | ||
| 1638 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 1639 | MOV RH.RHC_STA,AX ;; | ||
| 1640 | JMP WRITE_RET ;; **** LOOP EXIT (fail) **** | ||
| 1641 | ;; | ||
| 1642 | CHECK_FSTAT : ;; | ||
| 1643 | CMP AX,FSTAT_FONT ;; | ||
| 1644 | JNE NEXT_FTBLK ;; | ||
| 1645 | ;; | ||
| 1646 | MOV AX,CS:[SI].FTB_DLEN ;; | ||
| 1647 | AND AX,AX ;; | ||
| 1648 | JNZ FONT_RETURNED ;; | ||
| 1649 | ;; | ||
| 1650 | NEXT_FTBLK : ;; **** NEXT IN LOOP **** | ||
| 1651 | ;; | ||
| 1652 | ADD SI,TYPE FTBLK ;; SI = points to FTBLK | ||
| 1653 | DEC DX ;; | ||
| 1654 | INC DI ;;######## NEXT SLOT ############ | ||
| 1655 | INC DI ;; | ||
| 1656 | INC DI ;; | ||
| 1657 | INC DI ;; next slot | ||
| 1658 | PUSH ES ;; | ||
| 1659 | POP AX ;; | ||
| 1660 | ADD AX,BUF.FTSZPA ;; | ||
| 1661 | PUSH AX ;; | ||
| 1662 | POP ES ;; next buffer | ||
| 1663 | DEC CX ;;#################################### | ||
| 1664 | JMP PARSE_FTBLK ;; | ||
| 1665 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1666 | FONT_RETURNED : ;; | ||
| 1667 | ;; ********************************* | ||
| 1668 | ;; * ANY SELECTION CONTROL TO BE * | ||
| 1669 | ;; * STORED ? * | ||
| 1670 | ;; ********************************* | ||
| 1671 | ;; | ||
| 1672 | ;; | ||
| 1673 | ;; SI = points to FTBLK | ||
| 1674 | ;; ES = font buffer segment / 0 | ||
| 1675 | ;; BX = LPT buffer | ||
| 1676 | ;; DI = SLOT pointer | ||
| 1677 | PUSH CX ;; | ||
| 1678 | ;; | ||
| 1679 | ;; | ||
| 1680 | MOV AX,CS:[SI].FTB_SELECT ;; | ||
| 1681 | AND AX,AX ;; | ||
| 1682 | JNZ SELECT_NOT0 ;; | ||
| 1683 | CMP BUF.PCLASS,1 ;; | ||
| 1684 | JNE SELECT_0 ;; | ||
| 1685 | JMP SELECT_BAD ;; CLASS 1 printer CANNOT have SELECT=0 | ||
| 1686 | ;; | ||
| 1687 | SELECT_0: ;; | ||
| 1688 | ;; | ||
| 1689 | POP CX ;; | ||
| 1690 | JMP STORE_FONT ;; | ||
| 1691 | ;; | ||
| 1692 | SELECT_NOT0 : ;; | ||
| 1693 | ;; | ||
| 1694 | CMP BUF.PCLASS,1 ;; | ||
| 1695 | JNE NOT_CLASS1 ;; | ||
| 1696 | JMP SELECT_CLASS1 ;; | ||
| 1697 | ;; | ||
| 1698 | not_class1 : ;; | ||
| 1699 | MOV AX,CS:[SI].FTB_SELLEN ;; has this FTBLK already passed the | ||
| 1700 | AND AX,AX ;; select ? | ||
| 1701 | JNZ SELECT_NOT_PASSED ;; | ||
| 1702 | ;; | ||
| 1703 | POP CX ;; | ||
| 1704 | JMP STORE_FONT ;; | ||
| 1705 | ;; | ||
| 1706 | SELECT_NOT_PASSED : ;; | ||
| 1707 | CMP AX,BUF.FSELMAX ;; | ||
| 1708 | JNA SELECT_NOT_LONG ;; | ||
| 1709 | JMP SELECT_BAD ;; cannot be more than buffer size | ||
| 1710 | ;; | ||
| 1711 | ;; | ||
| 1712 | SELECT_NOT_LONG : ;; | ||
| 1713 | MOV AX,CS:[SI].FTB_SELECT ;; | ||
| 1714 | CMP AX,1 ;; | ||
| 1715 | JE SELECT_1 ;; | ||
| 1716 | JMP SELECT_BAD ;; | ||
| 1717 | ;; | ||
| 1718 | SELECT_1 : ;; | ||
| 1719 | MOV CX,BUF.FSELEN ;; +++ SELECT = 1 +++ | ||
| 1720 | AND CX,CX ;; | ||
| 1721 | JZ CTL_NOT_COPIED ;; | ||
| 1722 | MOV AX,CS:[DI].SLT_AT ;; == copy control only from one FTBLK | ||
| 1723 | AND AX,AT_SELECT ;; | ||
| 1724 | JNZ CTL_NOT_COPIED ;; | ||
| 1725 | JMP SKIP_SELECT ;; | ||
| 1726 | ;; | ||
| 1727 | CTL_NOT_COPIED : ;; | ||
| 1728 | ;; | ||
| 1729 | OR CS:[DI].SLT_AT,AT_SELECT;; the FTBLK where control is copied | ||
| 1730 | ;; from | ||
| 1731 | ;; | ||
| 1732 | MOV CX,CS:[SI].FTB_SELLEN ;; | ||
| 1733 | CMP CX,CS:[SI].FTB_DLEN ;; | ||
| 1734 | JNA STORE_SELECT ;; | ||
| 1735 | ;; | ||
| 1736 | MOV CX,CS:[SI].FTB_DLEN ;; | ||
| 1737 | ;; | ||
| 1738 | STORE_SELECT: ;; | ||
| 1739 | PUSH CX ;; CX is the length to be copied. | ||
| 1740 | ;; | ||
| 1741 | PUSH ES ;; | ||
| 1742 | PUSH DS ;; | ||
| 1743 | PUSH SI ;; | ||
| 1744 | PUSH DI ;; | ||
| 1745 | ;; | ||
| 1746 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 1747 | PUSH AX ;; | ||
| 1748 | POP DS ;; | ||
| 1749 | MOV SI,CS:[SI].FTB_DALO ;; | ||
| 1750 | ;; | ||
| 1751 | PUSH CS ;; | ||
| 1752 | POP ES ;; | ||
| 1753 | ;; | ||
| 1754 | MOV DI,BUF.PDESCO ;; | ||
| 1755 | MOV DI,CS:[DI].SELB_O ;; | ||
| 1756 | ADD DI,BUF.FSELEN ;; | ||
| 1757 | ;; | ||
| 1758 | REP MOVSB ;; | ||
| 1759 | ;; | ||
| 1760 | ;; | ||
| 1761 | POP DI ;; | ||
| 1762 | POP SI ;; | ||
| 1763 | POP DS ;; | ||
| 1764 | POP ES ;; | ||
| 1765 | ;; | ||
| 1766 | POP CX ;; | ||
| 1767 | SUB CS:[SI].FTB_DLEN,CX ;; | ||
| 1768 | SUB CS:[SI].FTB_SELLEN,CX ;; == less control bytes to be copied | ||
| 1769 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1770 | ADD BUF.FSELEN,CX ;; | ||
| 1771 | ;; | ||
| 1772 | POP CX ;; | ||
| 1773 | ;; | ||
| 1774 | ;; any data left for font ? | ||
| 1775 | CMP BUF.PCLASS,1 ;; | ||
| 1776 | JNE MORE_FONT ;; | ||
| 1777 | ;; | ||
| 1778 | JMP NEXT_FTBLK ;; == CLASS 1 printer ingnores fonts | ||
| 1779 | ;; | ||
| 1780 | MORE_FONT : ;; more font data ? | ||
| 1781 | ;; | ||
| 1782 | JMP STORE_FONT ;; | ||
| 1783 | ;; | ||
| 1784 | SELECT_CLASS1: ;; +++ PRINTER CLASS = 1 | ||
| 1785 | ;; | ||
| 1786 | MOV AX,CS:[SI].FTB_SELECT ;; | ||
| 1787 | CMP AX,2 ;; | ||
| 1788 | JE GOOD_CLASS1 ;; | ||
| 1789 | JMP SELECT_BAD ;; | ||
| 1790 | ;; select type = 2 only | ||
| 1791 | GOOD_CLASS1 : ;; | ||
| 1792 | POP CX ;; | ||
| 1793 | ;; | ||
| 1794 | PUSH ES ;; STACKS... | ||
| 1795 | PUSH DX ;; | ||
| 1796 | PUSH DI ;; | ||
| 1797 | MOV AX,DI ;; | ||
| 1798 | SUB AX,BUF.FTSLOTO ;; | ||
| 1799 | SHR AX,1 ;; | ||
| 1800 | PUSH AX ;; stack 1 -- offest | ||
| 1801 | MOV DI,BUF.FTDLO ;; | ||
| 1802 | ADD DI,AX ;; | ||
| 1803 | ;; | ||
| 1804 | MOV AX,CS:WORD PTR [DI] ;; length copied to font buffer | ||
| 1805 | ;; | ||
| 1806 | POP DX ;; stack -1 | ||
| 1807 | SHR DX,1 ;; | ||
| 1808 | PUSH DI ;; STACK +1 -- to font buffer length | ||
| 1809 | MOV DI,BUF.FTSTART ;; | ||
| 1810 | CTL_ADDR : ;; | ||
| 1811 | AND DX,DX ;; | ||
| 1812 | JZ CTL_LOCATED ;; | ||
| 1813 | ADD DI,BUF.FTSZPA ;; | ||
| 1814 | DEC DX ;; | ||
| 1815 | JNZ CTL_ADDR ;; | ||
| 1816 | ;; | ||
| 1817 | CTL_LOCATED : ;; | ||
| 1818 | PUSH DI ;; | ||
| 1819 | POP ES ;; | ||
| 1820 | XOR DI,DI ;; start of the font buffer | ||
| 1821 | MOV CX,CS:[SI].FTB_SELLEN ;; | ||
| 1822 | AND AX,AX ;; | ||
| 1823 | JNZ HASBEEN_COPIED ;; | ||
| 1824 | MOV ES:BYTE PTR [DI],CL ;; 1st byte is the length | ||
| 1825 | INC AX ;; | ||
| 1826 | ;; | ||
| 1827 | HASBEEN_COPIED : ;; | ||
| 1828 | ;; | ||
| 1829 | ADD DI,AX ;; | ||
| 1830 | DEC AX ;; | ||
| 1831 | CMP AX,CX ;; all copied ? | ||
| 1832 | JB COPY_SELECT ;; | ||
| 1833 | ;; | ||
| 1834 | POP DI ;; STACK -1 | ||
| 1835 | ;; | ||
| 1836 | POP DI ;; STACKS... | ||
| 1837 | POP DX ;; | ||
| 1838 | POP ES ;; | ||
| 1839 | MOV CX,CS:[SI].FTB_DLEN ;; all font data for this code page is | ||
| 1840 | SUB CS:[SI].FTB_DLEN,CX ;; discarded | ||
| 1841 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1842 | ;; | ||
| 1843 | JMP NEXT_FTBLK ;; | ||
| 1844 | ;; | ||
| 1845 | COPY_SELECT : ;; | ||
| 1846 | ;; | ||
| 1847 | SUB CX,AX ;; | ||
| 1848 | CMP CX,CS:[SI].FTB_DLEN ;; | ||
| 1849 | JNA FONT_SELECT ;; | ||
| 1850 | ;; | ||
| 1851 | MOV CX,CS:[SI].FTB_DLEN ;; | ||
| 1852 | ;; | ||
| 1853 | FONT_SELECT : ;; | ||
| 1854 | ;; | ||
| 1855 | PUSH CX ;; STACK +2 | ||
| 1856 | ;; | ||
| 1857 | PUSH DS ;; STACK +3 | ||
| 1858 | PUSH SI ;; STACK +4 | ||
| 1859 | ;; | ||
| 1860 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 1861 | PUSH AX ;; | ||
| 1862 | POP DS ;; | ||
| 1863 | MOV SI,CS:[SI].FTB_DALO ;; | ||
| 1864 | ;; | ||
| 1865 | PUSH DI ;; STACK +5 | ||
| 1866 | ;; | ||
| 1867 | REP MOVSB ;; | ||
| 1868 | ;; | ||
| 1869 | POP DI ;; STACK -5 | ||
| 1870 | POP SI ;; STACK -4 | ||
| 1871 | POP DS ;; STACK -3 | ||
| 1872 | ;; | ||
| 1873 | POP CX ;; STACK -2 | ||
| 1874 | ADD CX,DI ;; | ||
| 1875 | POP DI ;; STACK -1 | ||
| 1876 | MOV CS:WORD PTR [DI],CX ;; | ||
| 1877 | ;; | ||
| 1878 | MOV CX,CS:[SI].FTB_DLEN ;; all font data for this code page is | ||
| 1879 | SUB CS:[SI].FTB_DLEN,CX ;; discarded | ||
| 1880 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1881 | ;; | ||
| 1882 | POP DI ;; | ||
| 1883 | POP DX ;; | ||
| 1884 | POP ES ;; | ||
| 1885 | ;; | ||
| 1886 | JMP NEXT_FTBLK ;; | ||
| 1887 | ;; | ||
| 1888 | ;; | ||
| 1889 | SKIP_SELECT : ;; ++ SKIP SELECT ++ | ||
| 1890 | ;; | ||
| 1891 | MOV CX,CS:[SI].FTB_SELLEN ;; | ||
| 1892 | CMP CX,CS:[SI].FTB_DLEN ;; | ||
| 1893 | JNA SKIP_ALL_SELLEN ;; | ||
| 1894 | MOV CX,CS:[SI].FTB_DLEN ;; | ||
| 1895 | ;; | ||
| 1896 | SKIP_ALL_SELLEN : ;; | ||
| 1897 | SUB CS:[SI].FTB_DLEN,CX ;; | ||
| 1898 | SUB CS:[SI].FTB_SELLEN,CX ;; == less control bytes to be skipped | ||
| 1899 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1900 | ;; | ||
| 1901 | POP CX ;; | ||
| 1902 | JMP STORE_FONT ;; | ||
| 1903 | ;; | ||
| 1904 | SELECT_BAD : ;; ++ BAD SELECT ++ | ||
| 1905 | ;; | ||
| 1906 | POP CX ;; | ||
| 1907 | ;; | ||
| 1908 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 1909 | MOV RH.RHC_STA,STAT_BADATA ;; | ||
| 1910 | ;; | ||
| 1911 | OR BUF.STATUS,FAIL ;; | ||
| 1912 | ;; | ||
| 1913 | JMP WRITE_RET ;; | ||
| 1914 | ;; | ||
| 1915 | ;; | ||
| 1916 | ;; ************************************* | ||
| 1917 | ;; * FONT TO BE STORED OR DOWNLOADED ? * | ||
| 1918 | ;; ************************************* | ||
| 1919 | ;; | ||
| 1920 | ;; SI = points to FTBLK | ||
| 1921 | ;; ES = font buffer segment / 0 | ||
| 1922 | ;; BX = LPT buffer | ||
| 1923 | ;; DI = SLOT pointer | ||
| 1924 | STORE_FONT : ;; | ||
| 1925 | ;; | ||
| 1926 | CMP CS:[SI].FTB_DLEN,0 ;; any font data left ? | ||
| 1927 | JNZ HAS_FONT_DATA ;; | ||
| 1928 | JMP NEXT_FTBLK ;; | ||
| 1929 | ;; | ||
| 1930 | HAS_FONT_DATA : ;; | ||
| 1931 | PUSH ES ;; | ||
| 1932 | POP AX ;; | ||
| 1933 | AND AX,AX ;; | ||
| 1934 | JNZ STORE_FONT_BUFFER ;; | ||
| 1935 | JMP FONT_DOWNLOAD ;; | ||
| 1936 | ;; | ||
| 1937 | ;; | ||
| 1938 | ;; | ||
| 1939 | STORE_FONT_BUFFER : ;; ***************************** | ||
| 1940 | PUSH DI ;; ** STORE TO FONT BUFFER ** | ||
| 1941 | ;; ***************************** | ||
| 1942 | PUSH CX ;; | ||
| 1943 | PUSH DS ;; ES = font buffer segment | ||
| 1944 | ;; | ||
| 1945 | ;; -- determine where is the infor : | ||
| 1946 | MOV AX,DI ;; | ||
| 1947 | SUB AX,BUF.FTSLOTO ;; relative to the start of the slot | ||
| 1948 | SHR AX,1 ;; '' '' '' " of FTDL_OFF | ||
| 1949 | ;; | ||
| 1950 | ;; | ||
| 1951 | ADD AX,BUF.FTDLO ;; | ||
| 1952 | MOV DI,AX ;; | ||
| 1953 | ;; | ||
| 1954 | ;;................................... | ||
| 1955 | MOV CX,CS:[SI].FTB_DLEN ;; length of font data | ||
| 1956 | ;; | ||
| 1957 | MOV AX,CS:WORD PTR [DI] ;; current destination | ||
| 1958 | ;; | ||
| 1959 | ADD AX,CX ;; | ||
| 1960 | PUSH AX ;; STACK A (next destination) | ||
| 1961 | ;; | ||
| 1962 | ADD AX,CS:[SI].FTB_DLEFT ;; enough room in font buffer ? | ||
| 1963 | CMP AX,BUF.FTSIZE ;; | ||
| 1964 | JNA ROOM_FOR_FONT ;; | ||
| 1965 | ;; | ||
| 1966 | POP AX ;; STACK A | ||
| 1967 | POP DS ;; | ||
| 1968 | POP CX ;; **** LOOP EXIT (no room) **** | ||
| 1969 | POP DI ;; | ||
| 1970 | ;; | ||
| 1971 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 1972 | MOV RH.RHC_STA,STAT_BADATA ;; | ||
| 1973 | ;; | ||
| 1974 | OR BUF.STATUS,FAIL ;; | ||
| 1975 | ;; | ||
| 1976 | JMP WRITE_RET ;; | ||
| 1977 | ;; | ||
| 1978 | ROOM_FOR_FONT : ;; | ||
| 1979 | ;; | ||
| 1980 | PUSH DI ;; STACK B | ||
| 1981 | ;; | ||
| 1982 | MOV DI,CS:WORD PTR [DI] ;; current destination | ||
| 1983 | ;; | ||
| 1984 | PUSH SI ;; STACK C | ||
| 1985 | PUSH DS ;; STACK D | ||
| 1986 | ;; | ||
| 1987 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 1988 | PUSH AX ;; | ||
| 1989 | POP DS ;; source : FTB_DA | ||
| 1990 | MOV SI,CS:[SI].FTB_DALO ;; | ||
| 1991 | ;; | ||
| 1992 | REP MOVSB ;; | ||
| 1993 | ;; | ||
| 1994 | POP DS ;; STACK D | ||
| 1995 | POP SI ;; STACK C | ||
| 1996 | POP DI ;; STACK B | ||
| 1997 | POP AX ;; STACK A | ||
| 1998 | MOV CS:WORD PTR [DI],AX ;; next detination/current length | ||
| 1999 | ;; | ||
| 2000 | POP DS ;; | ||
| 2001 | POP CX ;; | ||
| 2002 | POP DI ;; | ||
| 2003 | ;; | ||
| 2004 | OR CS:[DI].SLT_AT,AT_FONT ;; font buffer has been overwritten | ||
| 2005 | ;; | ||
| 2006 | JMP NEXT_FTBLK ;; | ||
| 2007 | ;; | ||
| 2008 | FONT_DOWNLOAD : ;; *********************************** | ||
| 2009 | ;; * DOWNLOAD FONT TO THE DEVICE : * | ||
| 2010 | PUSH ES ;; *********************************** | ||
| 2011 | PUSH DI ;; | ||
| 2012 | LES DI,dword ptr buf.rh_ptro ;; -- the logic can only support one | ||
| 2013 | ;; physical device slot that can be | ||
| 2014 | ;; downloaded.) | ||
| 2015 | MOV AX,CS:[SI].FTB_DLEN ;; | ||
| 2016 | MOV RH.RH3_CNT,AX ;; | ||
| 2017 | MOV AX,CS:[SI].FTB_DALO ;; | ||
| 2018 | MOV RH.RH3_DTAO,AX ;; | ||
| 2019 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 2020 | MOV RH.RH3_DTAS,AX ;; | ||
| 2021 | ;; | ||
| 2022 | MOV RH.RHC_CMD,CMD_WRT ;; 06/25 MODE.COM | ||
| 2023 | ;; | ||
| 2024 | PUSH SI ;; | ||
| 2025 | PUSH ES ;; | ||
| 2026 | PUSH BX ;; **** BUF. is changed **** | ||
| 2027 | PUSH BX ;; | ||
| 2028 | POP SI ;; | ||
| 2029 | LES BX,DWORD PTR BUF.RH_PTRO ;; pass the request header to the | ||
| 2030 | ;; | ||
| 2031 | FDL_CALL_STR : ;; | ||
| 2032 | CALL DWORD PTR CS:[SI].LPT_STRAO ;; LPTn strategy routine. | ||
| 2033 | POP BX ;; | ||
| 2034 | POP ES ;; | ||
| 2035 | POP SI ;; | ||
| 2036 | ;; | ||
| 2037 | FDL_CALL_ITR : ;; | ||
| 2038 | CALL DWORD PTR BUF.LPT_INTRO ;; interrupt the DOS LPTn | ||
| 2039 | ;; | ||
| 2040 | FDL_ITR_RETURN : ;; | ||
| 2041 | MOV AX,rh.RHC_STA ;; | ||
| 2042 | ;; | ||
| 2043 | and ax,stat_error ;; | ||
| 2044 | jz fdl_good1 ;; | ||
| 2045 | mov ax,stat_deverr ;; | ||
| 2046 | mov rh.rhc_sta,ax ;; | ||
| 2047 | ;; | ||
| 2048 | fdl_good1 : ;; | ||
| 2049 | POP DI ;; | ||
| 2050 | POP ES ;; | ||
| 2051 | ;; | ||
| 2052 | AND AX,STAT_ERROR ;; any error returned by normal device? | ||
| 2053 | JNZ FDL_BAD ;; | ||
| 2054 | OR CS:[DI].SLT_AT,AT_RAM1 ;; | ||
| 2055 | JMP NEXT_FTBLK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2056 | ;; | ||
| 2057 | FDL_BAD : ;; **** LOOP EXIT (bad) **** | ||
| 2058 | OR BUF.STATUS,FAIL ;; | ||
| 2059 | ;; | ||
| 2060 | JMP WRITE_RET ;; | ||
| 2061 | ;; | ||
| 2062 | WRT_NORMAL : ;; | ||
| 2063 | ;; | ||
| 2064 | JMP NORM_DRIVER ;; | ||
| 2065 | ;; | ||
| 2066 | WRT_ignore : ;; | ||
| 2067 | ;; | ||
| 2068 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 2069 | MOV RH.RHC_STA,STAT_DEVERR ;; | ||
| 2070 | JMP WRITE_RET ;; | ||
| 2071 | ;; | ||
| 2072 | NO_MORE_FTBLK : ;; | ||
| 2073 | ;; | ||
| 2074 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 2075 | MOV RH.RHC_STA,0 ;; | ||
| 2076 | ;; | ||
| 2077 | WRITE_RET : ;; | ||
| 2078 | RET ;; | ||
| 2079 | ;; | ||
| 2080 | WRITE ENDP ;; | ||
| 2081 | ;; | ||
| 2082 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2083 | ;; | ||
| 2084 | ;;==== Generic IOCTL Designate Start ====== | ||
| 2085 | ;; | ||
| 2086 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2087 | DESIGNATE_START PROC ;; | ||
| 2088 | MOV AX,BUF.STATE ;; | ||
| 2089 | CMP AX,NORMAL ;; | ||
| 2090 | JNE DS_00 ;G; ALL OF THESE EXTRA JUMPS ARE | ||
| 2091 | JMP DST_NORMAL ;; DUE TO SIZE OF FOLLOWING CODE!!!!! | ||
| 2092 | DS_00: CMP AX,CPSW ;; WGR ;AN000; | ||
| 2093 | JE DS_01 ;G; | ||
| 2094 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 2095 | JE DS_03 ;; WGR ;AN000; | ||
| 2096 | JMP DST_CMDERR ;G; | ||
| 2097 | |||
| 2098 | DS_01: CALL CHECK_PRINT_ACTIVE ;G; THIS WILL FIND OUT IF THE | ||
| 2099 | JNC DS_02 ;G; | ||
| 2100 | DS_03: ;; WGR ;AN000; | ||
| 2101 | JMP DST_DEVERR ;G; PRINT.COM IS ACTIVE, CY=1 MEANS YES | ||
| 2102 | ;G; | ||
| 2103 | DS_02: LDS SI,RH.GIH_GBA ;; GIOB = DS:[SI] | ||
| 2104 | MOV AX,GIOB.GB1_FLAG ;; | ||
| 2105 | AND AX,DSF_CARTCP ;; | ||
| 2106 | JNZ dst_deverr ;; DO NOT SUPPORT CARTRIDGE FLAG !!!! | ||
| 2107 | ;; | ||
| 2108 | ;; ****************************** | ||
| 2109 | ;; ** DESIGNATE / REFRESH ? ** | ||
| 2110 | ;; ****************************** | ||
| 2111 | ;; check the LENGTH in BUFFER1 | ||
| 2112 | ;; | ||
| 2113 | MOV CX,GIOB.GB1_LEN ;; | ||
| 2114 | AND CX,CX ;; | ||
| 2115 | JNZ DST_NOT_NULL ;; | ||
| 2116 | ;; | ||
| 2117 | mov cs:init_chk,0fefeh ;; | ||
| 2118 | ;; | ||
| 2119 | JMP DST_REFRESH ;; null lenght ==> refresh | ||
| 2120 | ;; | ||
| 2121 | DST_NOT_NULL : ;; | ||
| 2122 | MOV AX,CX ;; | ||
| 2123 | SHR AX,1 ;; divide by 2 | ||
| 2124 | MOV CX,AX ;; | ||
| 2125 | MOV AX,STAT_CMDERR ;; error if LEN < 2 | ||
| 2126 | AND CX,CX ;; | ||
| 2127 | JZ DST_RET ;; | ||
| 2128 | DEC CX ;; | ||
| 2129 | JNZ NO_REFRESH ;; | ||
| 2130 | ;; | ||
| 2131 | MOV AX,GIOB.GB1_NUM ;; | ||
| 2132 | AND AX,AX ;; | ||
| 2133 | MOV AX,STAT_BADATA ;; | ||
| 2134 | JNZ DST_RET ;; error, as no code pages followed | ||
| 2135 | ;; | ||
| 2136 | mov cs:init_chk,0ffeeh ;; | ||
| 2137 | ;; | ||
| 2138 | ;; | ||
| 2139 | JMP DST_REFRESH ;; null length => REFRESH font from | ||
| 2140 | ;; font buffer to device | ||
| 2141 | ;; ********************************* | ||
| 2142 | ;; ** DESIGNATE FOR CARTRIDGE ? ** | ||
| 2143 | NO_REFRESH : ;; ********************************* | ||
| 2144 | ;; CX = number of codepages designated | ||
| 2145 | CMP BUF.PCLASS,1 ;; CLASS 1 Printer ? | ||
| 2146 | JNE DST_RAM ;; | ||
| 2147 | JMP DST_CART ;; | ||
| 2148 | ;; | ||
| 2149 | DST_RAM : ;; | ||
| 2150 | ;; | ||
| 2151 | MOV AX,DSF_CARTCP ;; RAM-code pages | ||
| 2152 | NOT AX ;; | ||
| 2153 | AND BUF.STATUS,AX ;; not CARTCP | ||
| 2154 | MOV DI,BUF.RMBUFO ;; DI | ||
| 2155 | MOV DX,BUF.RSLMX ;; DX = number of designate allowed | ||
| 2156 | ;; (limited by available slots) | ||
| 2157 | MOV AX,STAT_TOMANY ;; | ||
| 2158 | CMP CX,DX ;; more codepages than supported ? | ||
| 2159 | JA DST_RET ;; | ||
| 2160 | ;; | ||
| 2161 | JMP DST_DESIGNATE ;; | ||
| 2162 | ;; | ||
| 2163 | DST_NORMAL : ;; | ||
| 2164 | push cs ;; | ||
| 2165 | pop ds ;; | ||
| 2166 | JMP NORM_DRIVER ;; | ||
| 2167 | ;; | ||
| 2168 | DST_DEVERR : ;; | ||
| 2169 | MOV AX,STAT_DEVERR ;; | ||
| 2170 | JMP DST_RET ;G; | ||
| 2171 | ;; | ||
| 2172 | DST_CMDERR : ;G; | ||
| 2173 | MOV AX,STAT_CMDERR ;G; | ||
| 2174 | DST_RET : ;; | ||
| 2175 | JMP DST_RETURN ;; | ||
| 2176 | ;; | ||
| 2177 | DST_CART: ;; | ||
| 2178 | MOV AX,DSF_CARTCP ;; Hardware code pages | ||
| 2179 | OR BUF.STATUS,AX ;; | ||
| 2180 | MOV DI,BUF.HRBUFO ;; DI | ||
| 2181 | MOV DX,BUF.HSLMX ;; DX = number of slots available | ||
| 2182 | MOV AX,DX ;; | ||
| 2183 | SUB AX,BUF.HARDMX ;; no. of designate allowed | ||
| 2184 | ;; | ||
| 2185 | CMP CX,AX ;; more codepages than supported ? | ||
| 2186 | MOV AX,STAT_TOMANY ;; | ||
| 2187 | JA DST_RET ;; | ||
| 2188 | ;;--------------------------------------------------------------------------- | ||
| 2189 | ;; ************************************* | ||
| 2190 | DST_DESIGNATE : ;; * any duplicated codepages in MODE ?* | ||
| 2191 | ;; * define the slot-buffer * | ||
| 2192 | ;; ************************************* | ||
| 2193 | ;; | ||
| 2194 | ;; -- Use the buffer to hold the code | ||
| 2195 | ;; page value in the MODE with the | ||
| 2196 | ;; position correspondence : | ||
| 2197 | ;; 1. reset the buffer to all 0FFFFH | ||
| 2198 | ;; 2. if the code page in MODE does not | ||
| 2199 | ;; replicate with any in the buffer, | ||
| 2200 | ;; then store the code page value in | ||
| 2201 | ;; the buffer. | ||
| 2202 | ;; 3. proceed to the next code page in | ||
| 2203 | ;; the MODE to check with what is | ||
| 2204 | ;; already copied to the buffer. | ||
| 2205 | ;; 4. designate will fail if there is a | ||
| 2206 | ;; replication : i.e. a repetition | ||
| 2207 | ;; in the MODE command. | ||
| 2208 | ;; 5. skip the buffer corresponding to | ||
| 2209 | ;; HWCP codepages | ||
| 2210 | ;;------------------------------------- | ||
| 2211 | ;; | ||
| 2212 | PUSH DI ;; (the start of RAM/Hardware buffer) | ||
| 2213 | PUSH DX ;; count of buffer size | ||
| 2214 | MOV AX,0FFFFH ;; | ||
| 2215 | RESET_BUF: ;; | ||
| 2216 | MOV CS:[DI],AX ;; reset all buffer to 0FFFFH | ||
| 2217 | INC DI ;; | ||
| 2218 | INC DI ;; | ||
| 2219 | DEC DX ;; | ||
| 2220 | JNZ RESET_BUF ;; | ||
| 2221 | POP DX ;; | ||
| 2222 | POP DI ;; | ||
| 2223 | ;; | ||
| 2224 | PUSH BX ;; | ||
| 2225 | PUSH DI ;; (the start of RAM/Hardware buffer) | ||
| 2226 | PUSH DX ;; count of buffer size | ||
| 2227 | PUSH SI ;; first code page in GB1 | ||
| 2228 | PUSH CX ;; number of codepages in GB1 | ||
| 2229 | ;; | ||
| 2230 | PUSH SI ;; | ||
| 2231 | ;; | ||
| 2232 | MOV AX,BUF.STATUS ;; | ||
| 2233 | AND AX,DSF_CARTCP ;; | ||
| 2234 | JZ FILL_BUFFER ;; | ||
| 2235 | ;; for cartridge designation | ||
| 2236 | MOV SI,BUF.HARDSO ;; | ||
| 2237 | SKIP_HWCP: ;; | ||
| 2238 | MOV AX,CS:[SI].SLT_AT ;; | ||
| 2239 | AND AX,AT_HWCP ;; | ||
| 2240 | JZ FILL_BUFFER ;; | ||
| 2241 | INC SI ;; skip the hwcp slots, they cannot be | ||
| 2242 | INC SI ;; designated | ||
| 2243 | INC SI ;; | ||
| 2244 | INC SI ;; | ||
| 2245 | INC DI ;; | ||
| 2246 | INC DI ;; | ||
| 2247 | JMP SKIP_HWCP ;; | ||
| 2248 | ;; | ||
| 2249 | FILL_BUFFER : ;; | ||
| 2250 | ;; | ||
| 2251 | POP SI ;; | ||
| 2252 | ;; | ||
| 2253 | PUSH DI ;; | ||
| 2254 | POP BX ;; BX = the positioned buffer | ||
| 2255 | ;; | ||
| 2256 | DST_BUFLP : ;; **** LOOP **** | ||
| 2257 | MOV AX,GIOB.GB1_CP ;; (use GIOB only for codepages) | ||
| 2258 | CMP AX,0FFFFH ;; | ||
| 2259 | JZ DST_BUFNXT ;; | ||
| 2260 | ;; | ||
| 2261 | PUSH CX ;; | ||
| 2262 | ;; compare code page with SLOT-BUFFER | ||
| 2263 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2264 | ;; SCAN THE BUFFER FOR DUPLICATION | ||
| 2265 | PUSH DX ;; | ||
| 2266 | POP CX ;; no. of buffer entries | ||
| 2267 | ;; | ||
| 2268 | PUSH ES ;; | ||
| 2269 | PUSH DI ;; | ||
| 2270 | PUSH CS ;; | ||
| 2271 | POP ES ;; | ||
| 2272 | REPNE SCASW ;; scan codepage vs. buffer | ||
| 2273 | POP DI ;; | ||
| 2274 | POP ES ;; | ||
| 2275 | ;; | ||
| 2276 | POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2277 | ;; | ||
| 2278 | JNE BUF_DEFINE ;; | ||
| 2279 | ;; | ||
| 2280 | ;; **** EXIT FROM LOOP **** | ||
| 2281 | ;; | ||
| 2282 | POP CX ;; number of codepages in GB1 | ||
| 2283 | POP SI ;; first code page in GB1 | ||
| 2284 | POP DX ;; count of buffer size | ||
| 2285 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2286 | POP BX ;; | ||
| 2287 | ;; | ||
| 2288 | MOV AX,STAT_DUPLCP ;; Duplicated code page | ||
| 2289 | JMP DST_RETURN ;; | ||
| 2290 | ;; | ||
| 2291 | ;; | ||
| 2292 | BUF_DEFINE : ;; | ||
| 2293 | MOV CS:[BX],AX ;; no duplicated cp in MODE list | ||
| 2294 | ;; | ||
| 2295 | ;; | ||
| 2296 | ;; **** NEXT IN LOOP **** | ||
| 2297 | DST_BUFNXT: ;; | ||
| 2298 | INC SI ;; (use GIOB only for codepages) | ||
| 2299 | INC SI ;; | ||
| 2300 | INC BX ;; | ||
| 2301 | INC BX ;; | ||
| 2302 | XOR AX,AX ;; | ||
| 2303 | DEC CX ;; | ||
| 2304 | JNZ DST_BUFLP ;; | ||
| 2305 | ;; | ||
| 2306 | ;; | ||
| 2307 | POP CX ;; number of codepages in GB1 | ||
| 2308 | POP SI ;; first code page in GB1 | ||
| 2309 | POP DX ;; count of buffer size | ||
| 2310 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2311 | POP BX ;; | ||
| 2312 | ;; | ||
| 2313 | ;; | ||
| 2314 | ;;----------------------------------------------------------------------------- | ||
| 2315 | ;;************************************* | ||
| 2316 | ;;* any duplicated codepages bet MODE * | ||
| 2317 | ;;* and code pages in the slot ? * | ||
| 2318 | ;;************************************* | ||
| 2319 | ;; -- for each code page in the slot, | ||
| 2320 | ;; check for any duplication to | ||
| 2321 | ;; code pages in buffer, if the code | ||
| 2322 | ;; page in the slot is not to be | ||
| 2323 | ;; replaced. | ||
| 2324 | ;; -- the designate fails if there is | ||
| 2325 | ;; duplication. | ||
| 2326 | ;; -- copy the codepage in the slot to | ||
| 2327 | ;; the buffer if is not to be | ||
| 2328 | ;; replaced. Mark the slot to be | ||
| 2329 | ;; AT_OLD. | ||
| 2330 | ;; -- if the code page is tobe replaced | ||
| 2331 | ;; mark the STATUS with REPLX. | ||
| 2332 | ;;------------------------------------- | ||
| 2333 | ;; | ||
| 2334 | MOV CX,DX ;; both slots & buffer of same size | ||
| 2335 | ;; --exclude the hwcp which is not | ||
| 2336 | ;; designatable | ||
| 2337 | MOV SI,BUF.HARDSO ;; SI = hardware slot | ||
| 2338 | ;; | ||
| 2339 | MOV AX,BUF.STATUS ;; | ||
| 2340 | AND AX,DSF_CARTCP ;; | ||
| 2341 | JNZ CMP_CP ;; | ||
| 2342 | MOV SI,BUF.RAMSO ;; SI = RAM slot | ||
| 2343 | CMP_CP: ;; | ||
| 2344 | MOV BUF.FTSLOTO,SI ;; | ||
| 2345 | ;; | ||
| 2346 | PUSH DI ;; (the start of RAM/Hardware buffer) | ||
| 2347 | PUSH DX ;; count of buffer size | ||
| 2348 | PUSH SI ;; first entry in RAM/hardware slot | ||
| 2349 | PUSH CX ;; slot size | ||
| 2350 | PUSH BX ;; | ||
| 2351 | ;; | ||
| 2352 | PUSH DI ;; | ||
| 2353 | POP BX ;; BX = the positioned buffer | ||
| 2354 | DST_SLTLP : ;; | ||
| 2355 | ;; **** LOOP **** | ||
| 2356 | ;; | ||
| 2357 | MOV AX,AT_OLD ;; =**= | ||
| 2358 | NOT AX ;; assumed the codepage in slot is new, | ||
| 2359 | AND CS:[SI].SLT_AT,AX ;; to be downloaded if buffer <> 0FFFFH | ||
| 2360 | ;; | ||
| 2361 | AND CS:[SI].SLT_AT,AT_NO_LOAD; -- codepage not to be loaded | ||
| 2362 | AND CS:[SI].SLT_AT,AT_NO_font; -- no font has been loaded | ||
| 2363 | ;; | ||
| 2364 | MOV AX,CS:[SI].SLT_CP ;; | ||
| 2365 | CMP AX,0FFFFH ;; | ||
| 2366 | JZ DST_SLTNXT ;; | ||
| 2367 | ;; | ||
| 2368 | PUSH CX ;; | ||
| 2369 | MOV CX,CS:[BX] ;; | ||
| 2370 | CMP CX,0FFFFH ;; if this slot to be replaced ? | ||
| 2371 | POP CX ;; | ||
| 2372 | JNZ DST_SLTREPLACED ;; YES, the buffer is not empty | ||
| 2373 | ;; | ||
| 2374 | ;; compare code page with SLOT-BUFFER | ||
| 2375 | PUSH CX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2376 | ;; SCAN THE BUFFER FOR DUPLICATION | ||
| 2377 | PUSH DX ;; | ||
| 2378 | POP CX ;; no. of buffer entries | ||
| 2379 | ;; | ||
| 2380 | PUSH ES ;; | ||
| 2381 | PUSH DI ;; | ||
| 2382 | PUSH CS ;; | ||
| 2383 | POP ES ;; | ||
| 2384 | REPNE SCASW ;; scan codepage vs. buffer | ||
| 2385 | POP DI ;; | ||
| 2386 | POP ES ;; | ||
| 2387 | ;; | ||
| 2388 | POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2389 | ;; | ||
| 2390 | JNE SLT_BUF_DEF ;; | ||
| 2391 | ;; | ||
| 2392 | ;; **** LOOP EXIT **** | ||
| 2393 | ;; | ||
| 2394 | POP BX ;; | ||
| 2395 | POP CX ;; number of codepages in slots | ||
| 2396 | POP SI ;; first entry in RAM/hardware slots | ||
| 2397 | POP DX ;; count of buffer size | ||
| 2398 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2399 | ;; | ||
| 2400 | MOV AX,STAT_DUPLCP ;; Duplicated code page | ||
| 2401 | JMP DST_RETURN ;; | ||
| 2402 | ;; | ||
| 2403 | ;; | ||
| 2404 | SLT_BUF_DEF: ;; | ||
| 2405 | MOV CS:[BX],AX ;; no duplicated cp, there was no cp in | ||
| 2406 | ;; =**= | ||
| 2407 | OR CS:[SI].SLT_AT,AT_OLD ;; mark old so as no new font download | ||
| 2408 | ;; | ||
| 2409 | JMP DST_SLTNXT ;; the MODE command for this position | ||
| 2410 | ;; | ||
| 2411 | DST_SLTREPLACED : ;; | ||
| 2412 | PUSH BX ;; | ||
| 2413 | POP AX ;; save the buffer slot-position | ||
| 2414 | POP BX ;; | ||
| 2415 | OR BUF.STATUS,REPLX ;; there are codepage in slots replaced | ||
| 2416 | PUSH BX ;; | ||
| 2417 | PUSH AX ;; | ||
| 2418 | POP BX ;; gets back the buffer position | ||
| 2419 | ;; | ||
| 2420 | ;; **** NEXT IN LOOP **** | ||
| 2421 | ;; | ||
| 2422 | DST_SLTNXT: ;; | ||
| 2423 | INC SI ;; will take whatever is in buffer | ||
| 2424 | INC SI ;; | ||
| 2425 | INC SI ;; | ||
| 2426 | INC SI ;; | ||
| 2427 | INC BX ;; position slot in buffer | ||
| 2428 | INC BX ;; | ||
| 2429 | XOR AX,AX ;; | ||
| 2430 | DEC CX ;; | ||
| 2431 | JNZ DST_SLTLP ;; | ||
| 2432 | ;; | ||
| 2433 | ;; | ||
| 2434 | POP BX ;; | ||
| 2435 | POP CX ;; slot size | ||
| 2436 | POP SI ;; first entry in RAM/hardware slots | ||
| 2437 | POP DX ;; count of buffer size | ||
| 2438 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2439 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2440 | ;;************************************ | ||
| 2441 | ;;* prepare the FTABLE * | ||
| 2442 | ;;************************************ | ||
| 2443 | ;; | ||
| 2444 | ;; -- CX slot / buffer size | ||
| 2445 | ;; SI slot | ||
| 2446 | ;; DI buffer | ||
| 2447 | ;;------------------------------------ | ||
| 2448 | PUSH BX ;; STACK +1 | ||
| 2449 | PUSH SI ;; STACK +2 | ||
| 2450 | ;; =**= | ||
| 2451 | MOV AX,FAIL ;; | ||
| 2452 | NOT AX ;; | ||
| 2453 | AND BUF.STATUS,AX ;; assume it is successful | ||
| 2454 | ;; | ||
| 2455 | ;; | ||
| 2456 | PREPARE_FTB : ;; Prepare for Font Parser | ||
| 2457 | LEA BX,FTABLE ;; | ||
| 2458 | MOV CS:[BX].FLAG,FLAG_RESTART; | ||
| 2459 | MOV CS:[BX].BUFFER_LEN,0 ;; no data packet | ||
| 2460 | MOV CS:[BX].NUM_FTBLK,0 ;; | ||
| 2461 | ;; | ||
| 2462 | ADD BX,TYPE FBUFS ;; points to the first FTBLK. | ||
| 2463 | XOR DX,DX ;; DX = FTBLK entries (no code page yet) | ||
| 2464 | ;; | ||
| 2465 | ;; | ||
| 2466 | GET_CODEPAGE : ;; **** LOOP **** | ||
| 2467 | AND CX,CX ;; | ||
| 2468 | JZ NO_MORE_SLOT ;; | ||
| 2469 | MOV AX,CS:[SI].SLT_AT ;; | ||
| 2470 | AND AX,AT_OLD ;; | ||
| 2471 | JZ NEW_CODEPAGE ;; | ||
| 2472 | ;; | ||
| 2473 | MOV AX,CS:[SI].SLT_AT ;; | ||
| 2474 | AND AX,AT_HWCP ;; | ||
| 2475 | JZ GET_NEXT ;; not NEW and not HWCP | ||
| 2476 | AND CS:[SI].SLT_AT, NOT AT_OLD ;; also load for HWCP | ||
| 2477 | ;; | ||
| 2478 | NEW_CODEPAGE : ;; | ||
| 2479 | MOV AX,CS:[DI] ;; -- SLOT_AT is not old | ||
| 2480 | ;; -- code page in buffer is not 0FFFFH | ||
| 2481 | CMP AX,0FFFFH ;; | ||
| 2482 | JE GET_NEXT ;; | ||
| 2483 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2484 | INC DX ;; LOAD FONT as : | ||
| 2485 | MOV AX,CS:[DI] ;; codepage in buffer is new code page | ||
| 2486 | ;; | ||
| 2487 | OR CS:[SI].SLT_AT,AT_LOAD ;; set the attribute indicating load | ||
| 2488 | ;; | ||
| 2489 | MOV CS:[BX].FTB_CP,AX ;; | ||
| 2490 | ;; | ||
| 2491 | ADD BX,type ftblk ;; next FTBLK | ||
| 2492 | ;; | ||
| 2493 | ;; | ||
| 2494 | GET_NEXT : ;; **** NEXT IN LOOP **** | ||
| 2495 | INC DI ;; | ||
| 2496 | INC DI ;; next in buffer | ||
| 2497 | INC SI ;; | ||
| 2498 | INC SI ;; | ||
| 2499 | INC SI ;; | ||
| 2500 | INC SI ;; next in slot | ||
| 2501 | DEC CX ;; | ||
| 2502 | JMP GET_CODEPAGE ;; | ||
| 2503 | ;; | ||
| 2504 | NO_MORE_SLOT : ;; **** EXIT LOOP **** | ||
| 2505 | AND DX,DX ;; | ||
| 2506 | JNZ DEFINE_DID ;; | ||
| 2507 | JMP NO_FONT_DOWNL ;; | ||
| 2508 | ;; | ||
| 2509 | ;; ********************************** | ||
| 2510 | ;; ** NEXT STATE = DESIGNATE_WRITE ** | ||
| 2511 | ;; ********************************** | ||
| 2512 | ;; | ||
| 2513 | DEFINE_DID : ;; | ||
| 2514 | POP SI ;; STACK -2 | ||
| 2515 | POP BX ;; STACK -1 | ||
| 2516 | ;; | ||
| 2517 | PUSH BX ;; STACK +1 | ||
| 2518 | PUSH SI ;; STACK +2 | ||
| 2519 | ;; | ||
| 2520 | PUSH DI ;; STACK +3 | ||
| 2521 | PUSH CX ;; STACK +4 | ||
| 2522 | PUSH ES ;; STACK +5 | ||
| 2523 | PUSH DS ;; STACK +6 | ||
| 2524 | ;; | ||
| 2525 | PUSH CS ;; | ||
| 2526 | POP ES ;; | ||
| 2527 | PUSH CS ;; | ||
| 2528 | POP DS ;; | ||
| 2529 | ;; | ||
| 2530 | MOV SI,BX ;; GET THE DEVICE_ID FROM LPTn BUFFER | ||
| 2531 | LEA SI,[SI].PAR_EXTRACTO ;; | ||
| 2532 | MOV SI,CS:[SI].PAR_DIDO ;; | ||
| 2533 | LEA SI,[SI].PAR_DID ;; | ||
| 2534 | ;; | ||
| 2535 | LEA DI,FTABLE ;; | ||
| 2536 | MOV CS:[DI].NUM_FTBLK,DX ;; | ||
| 2537 | ;; | ||
| 2538 | ADD DI,TYPE FBUFS ;; | ||
| 2539 | LEA DI,[DI].FTB_TID ;; | ||
| 2540 | ;; | ||
| 2541 | SET_DID : ;; | ||
| 2542 | MOV CX,8 ;; | ||
| 2543 | PUSH SI ;; | ||
| 2544 | PUSH DI ;; | ||
| 2545 | ;; | ||
| 2546 | REP MOVSB ;; | ||
| 2547 | ;; | ||
| 2548 | POP DI ;; | ||
| 2549 | POP SI ;; | ||
| 2550 | ;; | ||
| 2551 | ADD DI,TYPE FTBLK ;; next DID | ||
| 2552 | DEC DX ;; | ||
| 2553 | JNZ SET_DID ;; | ||
| 2554 | ;; | ||
| 2555 | POP DS ;; STACK -6 | ||
| 2556 | POP ES ;; STACK -5 | ||
| 2557 | POP CX ;; STACK -4 | ||
| 2558 | POP DI ;; STACK -3 | ||
| 2559 | ;; | ||
| 2560 | CALL FONT_PARSER ;; restart font parser | ||
| 2561 | ;; | ||
| 2562 | LEA BX,FTABLE ;; | ||
| 2563 | ADD BX,TYPE FBUFS ;; | ||
| 2564 | CMP CS:[BX].FTB_STATUS,FSTAT_SEARCH | ||
| 2565 | ;; | ||
| 2566 | JE FONT_DOWNL ;; | ||
| 2567 | MOV AX,STAT_DEVERR ;; | ||
| 2568 | POP SI ;; STACK -2 | ||
| 2569 | POP BX ;; STACK -1 | ||
| 2570 | JMP DST_RETURN ;; there is no designate_end if fails | ||
| 2571 | ;; | ||
| 2572 | FONT_DOWNL : ;; | ||
| 2573 | POP SI ;; STACK -2 | ||
| 2574 | POP BX ;; STACK -1 | ||
| 2575 | MOV BUF.STATE,DESG_WR ;; enter DESIGNATE_WRITE state | ||
| 2576 | MOV BUF.FSELEN,0 ;; for font selection control loading | ||
| 2577 | ;; | ||
| 2578 | PUSH CX ;; init the font buffer address of | ||
| 2579 | PUSH DI ;; each codepage | ||
| 2580 | PUSH SI ;; | ||
| 2581 | MOV DI,BUF.FTDLO ;; | ||
| 2582 | ;; | ||
| 2583 | MOV CX,BUF.RSLMX ;; | ||
| 2584 | MOV AX,BUF.STATUS ;; | ||
| 2585 | AND AX,DSF_CARTCP ;; | ||
| 2586 | JZ FTDL_LOOP ;; | ||
| 2587 | MOV CX,BUF.HSLMX ;; | ||
| 2588 | ;; | ||
| 2589 | FTDL_LOOP : ;; | ||
| 2590 | AND CX,CX ;; | ||
| 2591 | JZ FTDL_DONE ;; | ||
| 2592 | mov ax,cs:[si].slt_at ;; | ||
| 2593 | and ax,at_load ;; | ||
| 2594 | jz ftdl_next ;; | ||
| 2595 | ;; | ||
| 2596 | MOV CS:WORD PTR[DI],0 ;; the font length in font buffer is 0 | ||
| 2597 | ;; | ||
| 2598 | ftdl_next : ;; | ||
| 2599 | INC SI ;; | ||
| 2600 | INC SI ;; | ||
| 2601 | INC SI ;; | ||
| 2602 | INC SI ;; | ||
| 2603 | INC DI ;; | ||
| 2604 | INC DI ;; | ||
| 2605 | DEC CX ;; | ||
| 2606 | JMP FTDL_LOOP ;; | ||
| 2607 | FTDL_DONE : ;; | ||
| 2608 | POP SI ;; | ||
| 2609 | POP DI ;; | ||
| 2610 | POP CX ;; | ||
| 2611 | ;; | ||
| 2612 | JMP CHECK_OTHER ;; | ||
| 2613 | ;; | ||
| 2614 | ;; ******************************* | ||
| 2615 | ;; ** NEXT STATE = DSIGNATE_END ** | ||
| 2616 | ;; ******************************* | ||
| 2617 | NO_FONT_DOWNL : ;; | ||
| 2618 | POP SI ;; STACK -2 | ||
| 2619 | POP BX ;; STACK -1 | ||
| 2620 | MOV BUF.STATE,DESG_END ;; proper designate end, ignore write | ||
| 2621 | ;; | ||
| 2622 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2623 | CHECK_OTHER : ;; | ||
| 2624 | ;; | ||
| 2625 | MOV DX,BUF.STATUS ;; | ||
| 2626 | MOV AX,REPLX ;; | ||
| 2627 | NOT AX ;; | ||
| 2628 | AND AX,DX ;; reset the bit for "replaced" | ||
| 2629 | MOV BUF.STATUS,AX ;; | ||
| 2630 | ;; | ||
| 2631 | XOR AX,AX ;; | ||
| 2632 | AND DX,REPLX ;; | ||
| 2633 | JMP DST_RETURN ;; | ||
| 2634 | ;; only for the FIFO | ||
| 2635 | JMP DST_RETURN ;; | ||
| 2636 | ;; | ||
| 2637 | ;; | ||
| 2638 | DST_REFRESH: ;; ****************************** | ||
| 2639 | ;; ** REFRESH FONT TO DEVICE ** | ||
| 2640 | ;; ****************************** | ||
| 2641 | ;; -- if there is RAM buffer on device | ||
| 2642 | ;; -- if there is font assumed to be | ||
| 2643 | ;; on the device, then | ||
| 2644 | ;; -- load the font to the device, | ||
| 2645 | ;; but no change in slot attributes | ||
| 2646 | ;; | ||
| 2647 | OR BUF.STATUS,REFRESH ;; -- STATE = CPSW (for Designate_end) | ||
| 2648 | ;; | ||
| 2649 | MOV CX,BUF.RSLMX ;; | ||
| 2650 | AND CX,CX ;; | ||
| 2651 | JNZ DST_CHECK_FBUFFER ;; | ||
| 2652 | JMP DST_REF_INVK ;; invoke any active code page | ||
| 2653 | ;; | ||
| 2654 | DST_CHECK_FBUFFER: ;; | ||
| 2655 | MOV DI,BUF.RAMSO ;; | ||
| 2656 | ;; | ||
| 2657 | DST_RAMLP: ;; | ||
| 2658 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2659 | AND AX,AT_RAM1 ;; | ||
| 2660 | JNZ DST_RAM_LOCATED ;; | ||
| 2661 | INC DI ;; | ||
| 2662 | INC DI ;; | ||
| 2663 | INC DI ;; | ||
| 2664 | INC DI ;; | ||
| 2665 | DEC CX ;; | ||
| 2666 | JNZ DST_RAMLP ;; | ||
| 2667 | JMP DST_REF_INVK ;; there was no font loaded | ||
| 2668 | ;; | ||
| 2669 | DST_RAM_LOCATED: ;; | ||
| 2670 | CMP BUF.RBUFMX,0 ;; ANY FONT BUFFER TO BE COPIED FROM ? | ||
| 2671 | JA DST_HAS_BUFFER ;; | ||
| 2672 | MOV AX,STAT_NOBUFF ;; | ||
| 2673 | mov cs:init_chk,ax ;; | ||
| 2674 | JMP DST_RETURN ;; ERROR !!! | ||
| 2675 | ;; | ||
| 2676 | DST_HAS_BUFFER : ;; | ||
| 2677 | SUB DI,BUF.RAMSO ;; relative to .RAMSO | ||
| 2678 | SHR DI,1 ;; relative to .FTLDO | ||
| 2679 | PUSH DI ;; | ||
| 2680 | ;; | ||
| 2681 | SHR DI,1 ;; the nth | ||
| 2682 | MOV CX,DI ;; | ||
| 2683 | MOV AX,BUF.FTSTART ;; | ||
| 2684 | ;; | ||
| 2685 | DST_LOCATE_FT: ;; | ||
| 2686 | AND CX,CX ;; | ||
| 2687 | JZ DST_FT_LOCATED ;; | ||
| 2688 | ADD AX,BUF.FTSZPA ;; | ||
| 2689 | DEC CX ;; | ||
| 2690 | JNZ DST_LOCATE_FT ;; | ||
| 2691 | ;; | ||
| 2692 | DST_FT_LOCATED: ;; | ||
| 2693 | ;; | ||
| 2694 | POP DI ;; | ||
| 2695 | ADD DI,BUF.FTDLO ;; | ||
| 2696 | MOV CX,CS:WORD PTR [DI] ;; | ||
| 2697 | ;;.................................... | ||
| 2698 | ;; DOWNLOAD THE FONT TO DEVICE | ||
| 2699 | MOV SI,BUF.RNORMO ;; | ||
| 2700 | MOV CS:[SI].RHC_LEN,20 ;; | ||
| 2701 | MOV CS:[SI].RHC_CMD,CMD_WRT ;; | ||
| 2702 | MOV CS:[SI].RH3_CNT,CX ;; | ||
| 2703 | MOV CS:[SI].RH3_DTAO,0 ;; | ||
| 2704 | MOV CS:[SI].RH3_DTAS,AX ;; | ||
| 2705 | ;; | ||
| 2706 | PUSH BX ;; | ||
| 2707 | ;; | ||
| 2708 | PUSH BX ;; | ||
| 2709 | POP DI ;; save BX in DI | ||
| 2710 | PUSH CS ;; | ||
| 2711 | POP ES ;; | ||
| 2712 | MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) | ||
| 2713 | ;; | ||
| 2714 | CALL DWORD PTR CS:[DI].LPT_STRAO | ||
| 2715 | ;; | ||
| 2716 | CALL DWORD PTR CS:[DI].LPT_INTRO | ||
| 2717 | ;; | ||
| 2718 | POP BX ;; | ||
| 2719 | ;; | ||
| 2720 | MOV AX,CS:[SI].RHC_STA ;; | ||
| 2721 | ;; | ||
| 2722 | and ax,stat_error ;; | ||
| 2723 | jz fdl_good2 ;; | ||
| 2724 | mov ax,stat_deverr ;; | ||
| 2725 | ;; | ||
| 2726 | fdl_good2 : ;; | ||
| 2727 | PUSH AX ;; | ||
| 2728 | AND AX,STAT_ERROR ;; | ||
| 2729 | POP AX ;; | ||
| 2730 | JZ DST_REF_INVK ;; | ||
| 2731 | ;; | ||
| 2732 | ;; | ||
| 2733 | DST_RETURN : ;; | ||
| 2734 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 2735 | MOV RH.RHC_STA,AX ;; | ||
| 2736 | ;; | ||
| 2737 | push cs ;; | ||
| 2738 | pop ds ;; | ||
| 2739 | ;; | ||
| 2740 | RET ;; | ||
| 2741 | ;; | ||
| 2742 | ;; | ||
| 2743 | DST_REF_INVK : ;; INVOKE FOR REFRESH | ||
| 2744 | ;; | ||
| 2745 | ;; ************************************ | ||
| 2746 | ;; * INVOKE HIERIECHY : RAM, HARDWARE * | ||
| 2747 | ;; ************************************ | ||
| 2748 | ;; | ||
| 2749 | MOV DI,BUF.RAMSO ;; check with the ram-slots (DI) | ||
| 2750 | MOV CX,BUF.RSLMX ;; CX = size | ||
| 2751 | AND CX,CX ;; | ||
| 2752 | JZ DST_HWCP_CHK ;; | ||
| 2753 | ;; | ||
| 2754 | DST_RAM_CMP: ;; there are RAM-slots | ||
| 2755 | DST_RAM_LP: ;; | ||
| 2756 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2757 | AND AX,AT_ACT ;; | ||
| 2758 | JNZ DST_IVK_CP ;; | ||
| 2759 | INC DI ;; | ||
| 2760 | INC DI ;; | ||
| 2761 | INC DI ;; | ||
| 2762 | INC DI ;; | ||
| 2763 | DEC CX ;; | ||
| 2764 | JNZ DST_RAM_LP ;; | ||
| 2765 | ;; | ||
| 2766 | DST_HWCP_CHK : ;; | ||
| 2767 | MOV DI,BUF.HARDSO ;; check with the HWCP-slots (DI) | ||
| 2768 | MOV CX,BUF.Hslmx ;; CX = size | ||
| 2769 | AND CX,CX ;; | ||
| 2770 | JNZ dst_HWCP_cmp ;; | ||
| 2771 | JMP DST_NO_IVK ;; | ||
| 2772 | ;; | ||
| 2773 | DST_HWCP_CMP : ;; | ||
| 2774 | DST_HWCP_LP: ;; | ||
| 2775 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2776 | AND AX,AT_ACT ;; | ||
| 2777 | JZ DST_HWCP_NEXT ;; | ||
| 2778 | JMP DST_IVK_CP ;; | ||
| 2779 | ;; | ||
| 2780 | DST_HWCP_NEXT : ;; | ||
| 2781 | INC DI ;; | ||
| 2782 | INC DI ;; | ||
| 2783 | INC DI ;; | ||
| 2784 | INC DI ;; | ||
| 2785 | DEC CX ;; | ||
| 2786 | JNZ DST_HWCP_LP ;; | ||
| 2787 | ;; | ||
| 2788 | DST_NO_IVK: ;; | ||
| 2789 | XOR AX,AX ;; | ||
| 2790 | JMP DST_RETURN ;; | ||
| 2791 | ;; | ||
| 2792 | DST_IVK_CP : ;; | ||
| 2793 | PUSH SI ;; | ||
| 2794 | ;; | ||
| 2795 | MOV SI,BUF.RNORMO ;; | ||
| 2796 | MOV AX,SI ;; | ||
| 2797 | ADD AX,TYPE GIH ;; points to buffer | ||
| 2798 | ;; | ||
| 2799 | PUSH AX ;; | ||
| 2800 | LEA SI,[SI].GIH_GBA ;; | ||
| 2801 | MOV CS:WORD PTR [SI],AX | ||
| 2802 | INC SI ;; | ||
| 2803 | INC SI ;; | ||
| 2804 | MOV CS:WORD PTR [SI],CS ;; | ||
| 2805 | POP SI ;; | ||
| 2806 | MOV CS:[SI].GB2_LEN,2 ;; | ||
| 2807 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 2808 | MOV CS:[SI].GB2_CP,AX ;; | ||
| 2809 | ;; | ||
| 2810 | POP SI ;; | ||
| 2811 | PUSH CS ;; define RH = ES:[DI] | ||
| 2812 | POP ES ;; | ||
| 2813 | MOV DI,BUF.RNORMO ;; | ||
| 2814 | ;; | ||
| 2815 | push cs ;; | ||
| 2816 | pop ds ;; | ||
| 2817 | ;; | ||
| 2818 | JMP INVOKE ;; | ||
| 2819 | ;; | ||
| 2820 | DESIGNATE_START ENDP ;; | ||
| 2821 | ;; | ||
| 2822 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2823 | ;; | ||
| 2824 | ;;==== Generic IOCTL Designate End ====== | ||
| 2825 | ;; | ||
| 2826 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2827 | DESIGNATE_END PROC ;; | ||
| 2828 | ;; | ||
| 2829 | MOV AX,BUF.STATE ;; | ||
| 2830 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 2831 | JNE DE_01 ;; WGR ;AN000; | ||
| 2832 | MOV AX,STAT_BADDEN ;; WGR ;AN000; | ||
| 2833 | JMP DE_11 ;; WGR ;AN000; | ||
| 2834 | DE_01: ;; WGR ;AN000; | ||
| 2835 | CMP AX,CPSW ;; | ||
| 2836 | JNE DEN_NOT_CPSW ;; | ||
| 2837 | MOV AX,BUF.STATUS ;; any refresh ? | ||
| 2838 | AND AX,REFRESH ;; | ||
| 2839 | JNZ DEN_REFRESH ;; | ||
| 2840 | MOV AX,STAT_BADDEN ;; | ||
| 2841 | JMP DEN_FAIL ;; | ||
| 2842 | ;; | ||
| 2843 | DEN_REFRESH : ;; | ||
| 2844 | AND BUF.STATUS,NOT REFRESH ;; | ||
| 2845 | XOR AX,AX ;; | ||
| 2846 | JMP DEN_RET ;; | ||
| 2847 | ;; | ||
| 2848 | DEN_NOT_CPSW : ;; | ||
| 2849 | CMP AX,NORMAL ;; | ||
| 2850 | JNE den_NOT_NORMAL ;; | ||
| 2851 | JMP NORM_DRIVER ;; not in the code page switching stage | ||
| 2852 | ;; | ||
| 2853 | den_NOT_NORMAL : ;; | ||
| 2854 | CMP AX,DESG_END ;; | ||
| 2855 | JNE den_other ;; | ||
| 2856 | JMP den_ENDED ;; end with no error check | ||
| 2857 | ;; | ||
| 2858 | den_other : ;; | ||
| 2859 | CMP AX,DESG_WR ;; | ||
| 2860 | JE den_write ;; | ||
| 2861 | MOV AX,STAT_BADDEN ;; | ||
| 2862 | JMP DEN_FAIL ;; no designate start | ||
| 2863 | ;;------------------------- | ||
| 2864 | den_write : ;; DESIGNATE WRITE ended | ||
| 2865 | ;; | ||
| 2866 | MOV AX,BUF.STATUS ;; | ||
| 2867 | AND AX,FAIL ;; | ||
| 2868 | JZ DEN_FTABLE ;; failed in the middle of desig-write | ||
| 2869 | XOR AX,AX ;; | ||
| 2870 | JMP DEN_FAIL ;; ignore the DEN | ||
| 2871 | ;; | ||
| 2872 | DEN_FTABLE : ;; | ||
| 2873 | ;; | ||
| 2874 | LEA DI,FTABLE ;; | ||
| 2875 | ADD DI,TYPE FBUFS ;; | ||
| 2876 | MOV AX,CS:[DI].FTB_STATUS ;; | ||
| 2877 | CMP AX,FSTAT_COMPLETE ;; | ||
| 2878 | JE DEN_ENDED ;; | ||
| 2879 | ;; | ||
| 2880 | CMP AX,FSTAT_FONT ;; | ||
| 2881 | JE DEN_FONT ;; | ||
| 2882 | MOV AX,STAT_bffDEN ;; bad font file | ||
| 2883 | JMP DEN_FAIL ;; the font data was not complete | ||
| 2884 | ;; | ||
| 2885 | DEN_FONT : ;; | ||
| 2886 | MOV AX,CS:[DI].FTB_DLEFT ;; | ||
| 2887 | AND AX,AX ;; | ||
| 2888 | JZ DEN_ENDED ;; | ||
| 2889 | MOV AX,STAT_BffDEN ;; | ||
| 2890 | JMP DEN_FAIL ;; | ||
| 2891 | ;; | ||
| 2892 | DEN_ENDED : ;; good designate-end | ||
| 2893 | ;; | ||
| 2894 | MOV DI,BUF.HARDSO ;; to hardware slot | ||
| 2895 | MOV SI,BUF.HRBUFO ;; to hardware-buffer | ||
| 2896 | HARD_HWCPE: ;; | ||
| 2897 | MOV AX,CS:[DI].SLT_AT ;; skip the HWCP | ||
| 2898 | AND AX,AT_HWCP ;; | ||
| 2899 | JZ HARD_CARTE ;; | ||
| 2900 | INC DI ;; | ||
| 2901 | INC DI ;; | ||
| 2902 | INC DI ;; | ||
| 2903 | INC DI ;; | ||
| 2904 | INC SI ;; | ||
| 2905 | INC SI ;; | ||
| 2906 | JMP HARD_HWCPE ;; | ||
| 2907 | HARD_CARTE: ;; | ||
| 2908 | MOV CX,BUF.HSLMX ;; size of both hardware slot/buffer | ||
| 2909 | SUB CX,BUF.HARDMX ;; slots that can be designated???????? | ||
| 2910 | MOV AX,BUF.STATUS ;; | ||
| 2911 | AND AX,DSF_CARTCP ;; | ||
| 2912 | JZ ASSIGN_RAM ;; | ||
| 2913 | ;; | ||
| 2914 | ;; | ||
| 2915 | MOV AX,STAT_TOMANY ;; | ||
| 2916 | AND CX,CX ;; any cart-slot to be designated ? | ||
| 2917 | JNZ ASSIGN_CP_CART ;; | ||
| 2918 | JMP DEN_FAIL ;; | ||
| 2919 | ;; | ||
| 2920 | ;; | ||
| 2921 | ASSIGN_CP_CART : ;; | ||
| 2922 | JMP ASSIGN_CP ;; | ||
| 2923 | ;; | ||
| 2924 | ASSIGN_RAM: ;; | ||
| 2925 | MOV DI,BUF.RAMSO ;; to RAM slot | ||
| 2926 | MOV SI,BUF.RMBUFO ;; to RAM-buffer | ||
| 2927 | MOV CX,BUF.RSLMX ;; size of both RAM slot/buffer | ||
| 2928 | ;; | ||
| 2929 | MOV AX,STAT_TOMANY ;; | ||
| 2930 | AND CX,CX ;; any cart-slot to be designated ? | ||
| 2931 | JNZ ASSIGN_CP ;; | ||
| 2932 | JMP DEN_FAIL ;; | ||
| 2933 | ;; | ||
| 2934 | ASSIGN_CP: ;; | ||
| 2935 | MOV AX,AT_LOAD ;; | ||
| 2936 | OR AX,AT_FONT ;; | ||
| 2937 | OR AX,AT_SELECT ;; | ||
| 2938 | NOT AX ;; | ||
| 2939 | AND CS:[DI].SLT_AT,AX ;; reset load, font, select attributes | ||
| 2940 | ;; | ||
| 2941 | MOV AX,CS:[SI] ;; code page assigned | ||
| 2942 | MOV CS:[DI].SLT_CP,AX ;; | ||
| 2943 | ;; | ||
| 2944 | CMP AX,0FFFFH ;; | ||
| 2945 | JNE SLOT_OCC ;; | ||
| 2946 | MOV AX,AT_OCC ;; | ||
| 2947 | NOT AX ;; empty | ||
| 2948 | AND CS:[DI].SLT_AT,AX ;; | ||
| 2949 | JMP ASSIGN_NEXT ;; | ||
| 2950 | SLOT_OCC: ;; | ||
| 2951 | OR CS:[DI].SLT_AT,AT_OCC ;; occupied | ||
| 2952 | ;; | ||
| 2953 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2954 | AND AX,AT_OLD ;; | ||
| 2955 | JNZ ASSIGN_NEXT ;; | ||
| 2956 | ;; | ||
| 2957 | NOT_ACTIVE: ;; this newly designated is not active | ||
| 2958 | MOV AX,AT_ACT ;; | ||
| 2959 | NOT AX ;; | ||
| 2960 | AND CS:[DI].SLT_AT,AX ;; not active | ||
| 2961 | CMP BUF.RBUFMX,0 ;; | ||
| 2962 | JE ASSIGN_NEXT ;; | ||
| 2963 | AND CS:[DI].SLT_AT,NOT AT_RAM1;; not loaded to physical RAM until | ||
| 2964 | ;; the code page is selected | ||
| 2965 | ASSIGN_NEXT : ;; | ||
| 2966 | INC DI ;; | ||
| 2967 | INC DI ;; | ||
| 2968 | INC DI ;; | ||
| 2969 | INC DI ;; | ||
| 2970 | INC SI ;; | ||
| 2971 | INC SI ;; | ||
| 2972 | DEC CX ;; | ||
| 2973 | AND CX,CX ;; | ||
| 2974 | JNE ASSIGN_CP ;; | ||
| 2975 | ;; | ||
| 2976 | MOV CX,BUF.FSELEN ;; COPY SELECT-CONTROL for CLASS 0 | ||
| 2977 | AND CX,CX ;; | ||
| 2978 | JZ DEN_NO_SELECT ;; | ||
| 2979 | ;; | ||
| 2980 | PUSH ES ;; | ||
| 2981 | PUSH DS ;; | ||
| 2982 | PUSH SI ;; | ||
| 2983 | PUSH DI ;; | ||
| 2984 | ;; | ||
| 2985 | PUSH CS ;; | ||
| 2986 | POP ES ;; | ||
| 2987 | PUSH CS ;; | ||
| 2988 | POP DS ;; | ||
| 2989 | ;; | ||
| 2990 | PUSH DX ;; | ||
| 2991 | MOV DI,BUF.PDESCO ;; | ||
| 2992 | MOV SI,CS:[DI].SELB_O ;; | ||
| 2993 | PUSH DI ;; | ||
| 2994 | MOV DI,CS:[DI].SELH_O ;; | ||
| 2995 | XOR DX,DX ;; | ||
| 2996 | MOV DL,CS:BYTE PTR [SI] ;; | ||
| 2997 | ADD DX,DI ;; | ||
| 2998 | INC DX ;; of the length byte | ||
| 2999 | ;; | ||
| 3000 | REP MOVSB ;; | ||
| 3001 | ;; | ||
| 3002 | POP DI ;; | ||
| 3003 | MOV CS:[DI].SELR_O,DX ;; | ||
| 3004 | POP DX ;; | ||
| 3005 | ;; | ||
| 3006 | POP DI ;; | ||
| 3007 | POP SI ;; | ||
| 3008 | POP DS ;; | ||
| 3009 | POP ES ;; | ||
| 3010 | ;; | ||
| 3011 | MOV BUF.FSELEN,0 ;; | ||
| 3012 | ;; | ||
| 3013 | DEN_NO_SELECT : ;; | ||
| 3014 | XOR AX,AX ;; clear status | ||
| 3015 | JMP DEN_RET ;; | ||
| 3016 | ;; | ||
| 3017 | DEN_FAIL : ;;------------------------------------ | ||
| 3018 | PUSH AX ;; ANY FONT BUFFER DESTROYED ? | ||
| 3019 | ;; | ||
| 3020 | MOV AX,BUF.STATUS ;; | ||
| 3021 | AND AX,DSF_CARTCP ;; | ||
| 3022 | JZ DEN_RAM_FAIL ;; | ||
| 3023 | ;; | ||
| 3024 | MOV DI,BUF.FTSLOTO ;; | ||
| 3025 | MOV CX,BUF.HSLMX ;; | ||
| 3026 | JMP DEN_FAIL_LOOP ;; | ||
| 3027 | ;; | ||
| 3028 | DEN_RAM_FAIL : ;; | ||
| 3029 | MOV DI,BUF.RAMSO ;; to RAM slot | ||
| 3030 | MOV CX,BUF.RSLMX ;; size of both RAM slot/buffer | ||
| 3031 | MOV DX,BUF.RBUFMX ;; | ||
| 3032 | ;; | ||
| 3033 | AND DX,DX ;; | ||
| 3034 | JZ DEN_FAIL_RET ;; | ||
| 3035 | ;; | ||
| 3036 | DEN_FAIL_LOOP : ;; | ||
| 3037 | AND CX,CX ;; | ||
| 3038 | JZ DEN_FAIL_RET ;; | ||
| 3039 | ;; | ||
| 3040 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 3041 | AND AX,AT_LOAD ;; | ||
| 3042 | JZ DEN_FAIL_NEXT ;; | ||
| 3043 | ;; | ||
| 3044 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 3045 | AND AX,AT_HWCP ;; | ||
| 3046 | JNZ DEN_FAIL_NEXT ;; | ||
| 3047 | ;; | ||
| 3048 | MOV CS:[DI].SLT_CP,0FFFFH ;; those slot whose font has been or | ||
| 3049 | MOV CS:[DI].SLT_AT,0 ;; to be loaded will be wiped out by | ||
| 3050 | ;; a failing designate | ||
| 3051 | DEN_FAIL_NEXT : ;; | ||
| 3052 | ;; | ||
| 3053 | INC DI ;; | ||
| 3054 | INC DI ;; | ||
| 3055 | INC DI ;; | ||
| 3056 | INC DI ;; | ||
| 3057 | DEC CX ;; | ||
| 3058 | JNE DEN_FAIL_LOOP ;; | ||
| 3059 | ;; | ||
| 3060 | DEN_FAIL_RET : ;; | ||
| 3061 | ;; | ||
| 3062 | POP AX ;; | ||
| 3063 | ;; | ||
| 3064 | MOV BUF.FSELEN,0 ;; | ||
| 3065 | ;; | ||
| 3066 | ;;------------------------------------- | ||
| 3067 | DEN_RET : ;; | ||
| 3068 | MOV BUF.STATE,CPSW ;; end of designate cycle | ||
| 3069 | ;; | ||
| 3070 | DE_11: ;; WGR ;AN000; | ||
| 3071 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 3072 | MOV RH.RHC_STA,AX ;; | ||
| 3073 | ;; | ||
| 3074 | RET ;; | ||
| 3075 | ;; | ||
| 3076 | DESIGNATE_END ENDP ;; | ||
| 3077 | ;; | ||
| 3078 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3079 | ;; | ||
| 3080 | ;;==== Generic IOCTL Invoke ========== | ||
| 3081 | ;; | ||
| 3082 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3083 | ;; | ||
| 3084 | INVOKE PROC ;; ALSO JUMP FROM REFRESH | ||
| 3085 | ;; | ||
| 3086 | MOV AX,BUF.STATE ;; | ||
| 3087 | CMP AX,CPSW ;; | ||
| 3088 | JE IVK_PROCESS ;; | ||
| 3089 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 3090 | JE IVK_PROCESS ;; WGR ;AN000; | ||
| 3091 | JMP IVK_CMDERR ;G; | ||
| 3092 | IVK_PROCESS: ;;------------------------- | ||
| 3093 | ;G; | ||
| 3094 | CALL CHECK_PRINT_ACTIVE ;G; THIS WILL FIND OUT IF THE | ||
| 3095 | JNC IVK_PROCESS_CONT ;G; PRINT.COM IS PRESENTLY ACTIVE! | ||
| 3096 | JMP IVK_DEVERR ;G; If so, THEN DEVICE_ERROR | ||
| 3097 | ;G; | ||
| 3098 | IVK_PROCESS_CONT: ;G; | ||
| 3099 | push ds ;; | ||
| 3100 | LDS SI,RH.GIH_GBA ;; | ||
| 3101 | MOV CX,GIOB.GB2_LEN ;; | ||
| 3102 | MOV AX,STAT_CMDERR ;; | ||
| 3103 | CMP CX,2 ;; | ||
| 3104 | JE IVK_GOODN ;; | ||
| 3105 | pop ds ;; | ||
| 3106 | JMP IVK_RET ;; | ||
| 3107 | IVK_GOODN: ;; | ||
| 3108 | MOV DX,GIOB.GB2_CP ;; DX = the codepage to be invoked | ||
| 3109 | CMP DX,0FFFFH ;; | ||
| 3110 | JNE IVK_GOODCP ;; | ||
| 3111 | pop ds ;; | ||
| 3112 | JMP IVK_RET ;; | ||
| 3113 | IVK_GOODCP: ;; | ||
| 3114 | ;; ************************************ | ||
| 3115 | ;; * INVOKE HIERIECHY : RAM, HARDWARE * | ||
| 3116 | ;; ************************************ | ||
| 3117 | pop ds ;; | ||
| 3118 | ;; | ||
| 3119 | MOV DI,BUF.RAMSO ;; check with the ram-slots (DI) | ||
| 3120 | MOV CX,BUF.RSLMX ;; CX = size | ||
| 3121 | AND CX,CX ;; | ||
| 3122 | JZ HWCP_CHK ;; | ||
| 3123 | ;; | ||
| 3124 | RAM_CMP: ;; there are RAM-slots | ||
| 3125 | PUSH CX ;; stack 1 = size | ||
| 3126 | PUSH DI ;; | ||
| 3127 | POP SI ;; start of the slot compared with (SI) | ||
| 3128 | RAM_LP: ;; | ||
| 3129 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3130 | CMP AX,DX ;; | ||
| 3131 | JE IVK_RAMCP ;; | ||
| 3132 | INC DI ;; | ||
| 3133 | INC DI ;; | ||
| 3134 | INC DI ;; | ||
| 3135 | INC DI ;; | ||
| 3136 | DEC CX ;; | ||
| 3137 | JNZ RAM_LP ;; | ||
| 3138 | ;; | ||
| 3139 | POP CX ;; stack -1 | ||
| 3140 | ;; code page not found in ram-slots | ||
| 3141 | HWCP_CHK : ;; | ||
| 3142 | MOV DI,BUF.HARDSO ;; check with the HWCP-slots (DI) | ||
| 3143 | MOV CX,BUF.Hslmx ;; CX = size | ||
| 3144 | AND CX,CX ;; | ||
| 3145 | JNZ HWCP_cmp ;; | ||
| 3146 | JMP NO_INVOKE ;; | ||
| 3147 | ;; | ||
| 3148 | HWCP_CMP : ;; | ||
| 3149 | PUSH CX ;; stack 1 = size of HWCP | ||
| 3150 | PUSH DI ;; | ||
| 3151 | POP SI ;; start of the slot compared with (SI) | ||
| 3152 | HWCP_LP: ;; | ||
| 3153 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3154 | CMP AX,DX ;; | ||
| 3155 | JNE HWCP_NEXT ;; | ||
| 3156 | JMP IVK_HWCPCP ;; | ||
| 3157 | ;; | ||
| 3158 | HWCP_NEXT : ;; | ||
| 3159 | INC DI ;; | ||
| 3160 | INC DI ;; | ||
| 3161 | INC DI ;; | ||
| 3162 | INC DI ;; | ||
| 3163 | DEC CX ;; | ||
| 3164 | JNZ HWCP_LP ;; | ||
| 3165 | POP CX ;; stack -1 | ||
| 3166 | ;; | ||
| 3167 | JMP NO_INVOKE ;; | ||
| 3168 | ;; ********************************** | ||
| 3169 | ;; ** RAM CODEPAGE TO BE INVOKED ** | ||
| 3170 | ;; ********************************** | ||
| 3171 | ;; -- determine if any font to be | ||
| 3172 | ;; downloaded for the first time | ||
| 3173 | ;; select of the font. | ||
| 3174 | ;; -- send selection control to invoke | ||
| 3175 | ;; | ||
| 3176 | ;; CX = inverse order of slot cp found | ||
| 3177 | IVK_RAMCP : ;; code page found in RAM slots | ||
| 3178 | ;; set up the pointer to first controls | ||
| 3179 | ;; DI = where slot found | ||
| 3180 | ;; | ||
| 3181 | ;;------------------------------------- | ||
| 3182 | ;; **** LOAD THE FONT FIRST if **** | ||
| 3183 | ;; -- there are font buffers created | ||
| 3184 | ;; -- the slot's font has not been | ||
| 3185 | ;; loaded | ||
| 3186 | CMP CS:[BX].STATE,LOCKED ;; WGR are we locked? ;AN000; | ||
| 3187 | JNE IR_0 ;; WGR no..continue ;AN000; | ||
| 3188 | MOV CS:[BX].SAVED_CP,DX ;; WGR yes...save the code page ;AN000; | ||
| 3189 | CMP BX,OFFSET BUF1 ;; WGR if this is lpt1..then ;AN000; | ||
| 3190 | JNE NEXT_1 ;; WGR ;AN000; | ||
| 3191 | LEA SI,BUF0 ;; WGR copy to PRN buffer. ;AN000; | ||
| 3192 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3193 | JMP ALL_RESET ;; WGR ;AN000; | ||
| 3194 | NEXT_1: ;; WGR ;AN000; | ||
| 3195 | CMP BX,OFFSET BUF0 ;; WGR if this is PRN..then.. ;AN000; | ||
| 3196 | JNE NEXT_2 ;; WGR ;AN000; | ||
| 3197 | LEA SI,BUF1 ;; WGR copy to lpt1 buffer. ;AN000; | ||
| 3198 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3199 | NEXT_2: ;; WGR ;AN000; | ||
| 3200 | JMP ALL_RESET ;; WGR exit invoke with good status ;AN000; | ||
| 3201 | IR_0: ;; WGR ;AN000; | ||
| 3202 | ; test cs:[di].SLT_AT, AT_ACT ;AN001;If it is currently active, then do nothing | ||
| 3203 | ; jnz Next_2 ;AN001; | ||
| 3204 | CMP BUF.RBUFMX,0 ;; | ||
| 3205 | JE INVK_RAM_PHYSICAL ;; | ||
| 3206 | ;; | ||
| 3207 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 3208 | AND AX,AT_RAM1 ;; supports only ONE physical ram | ||
| 3209 | JNZ INVK_RAM_PHYSICAL ;; | ||
| 3210 | ;; | ||
| 3211 | OR BUF.STATUS,LOADED ;; font has not been loaded | ||
| 3212 | ;; | ||
| 3213 | ;; | ||
| 3214 | POP DX ;; stack -1 | ||
| 3215 | PUSH DX ;; stack 1 (size) | ||
| 3216 | ;; | ||
| 3217 | ;; | ||
| 3218 | PUSH CX ;; | ||
| 3219 | PUSH SI ;; | ||
| 3220 | PUSH DI ;; | ||
| 3221 | ;; | ||
| 3222 | SUB DX,CX ;; | ||
| 3223 | MOV AX,BUF.FTSTART ;; | ||
| 3224 | LOCATE_FONT : ;; | ||
| 3225 | AND DX,DX ;; | ||
| 3226 | JZ FONT_LOCATED ;; | ||
| 3227 | ADD AX,BUF.FTSZPA ;; | ||
| 3228 | DEC DX ;; | ||
| 3229 | JMP LOCATE_FONT ;; | ||
| 3230 | ;; | ||
| 3231 | FONT_LOCATED : ;; | ||
| 3232 | ;; AX = FONT LOCATION (AX:0) | ||
| 3233 | SUB DI,BUF.RAMSO ;; | ||
| 3234 | SHR DI,1 ;; offset to the start of .FTDLEN | ||
| 3235 | ;; | ||
| 3236 | add DI,buf.ftdlo ;; length of font data | ||
| 3237 | mov cx,cs:word ptr [di] ;; | ||
| 3238 | |||
| 3239 | |||
| 3240 | ;Before sending data, let's check the status of the printer | ||
| 3241 | call Prt_status_check ;AN001;Check the printer status | ||
| 3242 | jz Send_Ram_Data ;AN001;O.K.? | ||
| 3243 | pop di ;AN001;Balance the stack | ||
| 3244 | pop si ;AN001; | ||
| 3245 | pop cx ;AN001; | ||
| 3246 | jmp Ram_Prt_Status_Err ;AN001;return with error. | ||
| 3247 | Send_Ram_Data: | ||
| 3248 | MOV SI,BUF.RNORMO ;; | ||
| 3249 | MOV CS:[SI].RHC_LEN,20 ;; | ||
| 3250 | MOV CS:[SI].RHC_CMD,CMD_WRT ;; | ||
| 3251 | MOV CS:[SI].RH3_CNT,CX ;; | ||
| 3252 | MOV CS:[SI].RH3_DTAO,0 ;; | ||
| 3253 | MOV CS:[SI].RH3_DTAS,AX ;; | ||
| 3254 | ;; | ||
| 3255 | PUSH BX ;; | ||
| 3256 | ;; | ||
| 3257 | PUSH BX ;; | ||
| 3258 | POP DI ;; save BX in DI | ||
| 3259 | PUSH CS ;; | ||
| 3260 | POP ES ;; | ||
| 3261 | MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) | ||
| 3262 | ;; | ||
| 3263 | CALL DWORD PTR CS:[DI].LPT_STRAO | ||
| 3264 | ;; | ||
| 3265 | CALL DWORD PTR CS:[DI].LPT_INTRO | ||
| 3266 | ;; | ||
| 3267 | POP BX ;; | ||
| 3268 | ;; | ||
| 3269 | MOV AX,CS:[SI].RHC_STA ;; | ||
| 3270 | ;; | ||
| 3271 | POP DI ;; | ||
| 3272 | POP SI ;; | ||
| 3273 | POP CX ;; | ||
| 3274 | ;; | ||
| 3275 | AND AX,STAT_ERROR ;; any error returned by normal device? | ||
| 3276 | JZ INVK_RAM_PHYSICAL ;; | ||
| 3277 | ;; | ||
| 3278 | Ram_Prt_Status_err: | ||
| 3279 | POP CX ;; stack -1 | ||
| 3280 | JMP IVK_DEVERR ;; | ||
| 3281 | ;;------------------------------------- | ||
| 3282 | ;; **** SEND THE SELECTION CONTROL **** | ||
| 3283 | ;; | ||
| 3284 | INVK_RAM_PHYSICAL : ;; | ||
| 3285 | ;; | ||
| 3286 | POP DX ;; stack -1 | ||
| 3287 | PUSH DX ;; stack 1 (size) | ||
| 3288 | ;; | ||
| 3289 | PUSH DI ;; stack 2 | ||
| 3290 | PUSH SI ;; stack 3 | ||
| 3291 | PUSH ES ;; stack 4 | ||
| 3292 | ;; | ||
| 3293 | ;; | ||
| 3294 | ;; **** SUPPORT ONLY ONE PHYSICAL RAM | ||
| 3295 | ;; | ||
| 3296 | MOV DI,BUF.PDESCO ;; | ||
| 3297 | MOV DI,CS:[DI].SELR_O ;; the RAM-select controls | ||
| 3298 | XOR AX,AX ;; | ||
| 3299 | JMP CTL_DEF ;; | ||
| 3300 | ;; | ||
| 3301 | ;; ******************************* | ||
| 3302 | ;; ** INVOKE HARDWARE CODEPAGE ** | ||
| 3303 | ;; ******************************* | ||
| 3304 | ;; -- check if it is CLASS 1 device, | ||
| 3305 | ;; If so then send slection control | ||
| 3306 | ;; from the font buffer at FTSTART | ||
| 3307 | ;; | ||
| 3308 | ;; CX=inverse order of slot cp found | ||
| 3309 | IVK_HWCPCP: ;; code page found in HWCP slots | ||
| 3310 | ;; set up the pointer to first controls | ||
| 3311 | CMP CS:[BX].STATE,LOCKED ;; WGR are we locked? ;AN000; | ||
| 3312 | JNE IR_1 ;; WGR no..continue ;AN000; | ||
| 3313 | MOV CS:[BX].SAVED_CP,DX ;; WGR yes...save the code page ;AN000; | ||
| 3314 | CMP BX,OFFSET BUF1 ;; WGR if this is lpt1..then ;AN000; | ||
| 3315 | JNE NEXT_3 ;; WGR ;AN000; | ||
| 3316 | LEA SI,BUF0 ;; WGR copy to PRN buffer. ;AN000; | ||
| 3317 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3318 | JMP ALL_RESET ;; WGR ;AN000; | ||
| 3319 | NEXT_3: ;; WGR ;AN000; | ||
| 3320 | CMP BX,OFFSET BUF0 ;; WGR if this is PRN..then.. ;AN000; | ||
| 3321 | JNE NEXT_4 ;; WGR ;AN000; | ||
| 3322 | LEA SI,BUF1 ;; WGR copy to lpt1 buffer. ;AN000; | ||
| 3323 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3324 | NEXT_4: ;; WGR ;AN000; | ||
| 3325 | JMP ALL_RESET ;; WGR exit invoke with good status ;AN000; | ||
| 3326 | IR_1: ;; WGR ;AN000; | ||
| 3327 | ; test cs:[di].SLT_AT, AT_ACT ;AN001;If it is currently active, then do nothing | ||
| 3328 | ; jnz Next_4 ;AN001; | ||
| 3329 | POP DX ;; stack -1 | ||
| 3330 | PUSH DX ;; stack 1 (size) | ||
| 3331 | ;; | ||
| 3332 | PUSH DI ;; stack 2 | ||
| 3333 | PUSH SI ;; stack 3 | ||
| 3334 | PUSH ES ;; stack 4 | ||
| 3335 | ;; | ||
| 3336 | SUB DX,CX ;; the slot's order in HWCP-slots(0-n) | ||
| 3337 | ;; | ||
| 3338 | CMP BUF.PCLASS,1 ;; | ||
| 3339 | JNE SELECT_SLOT ;; | ||
| 3340 | ;; | ||
| 3341 | MOV AX,BUF.FTSTART ;; ***** CLASS 1 CODEPAGE SELECT **** | ||
| 3342 | AND DX,DX ;; | ||
| 3343 | JZ ADJUST_DI ;; | ||
| 3344 | ;; | ||
| 3345 | SELECTCP_LP : ;; | ||
| 3346 | ADD AX,BUF.FTSZPA ;; | ||
| 3347 | ;; | ||
| 3348 | DEC DX ;; | ||
| 3349 | JNZ SELECTCP_LP ;; | ||
| 3350 | ;; | ||
| 3351 | ADJUST_DI : ;; | ||
| 3352 | mov DI,AX ;; | ||
| 3353 | PUSH CS ;; | ||
| 3354 | POP AX ;; | ||
| 3355 | SUB DI,AX ;; | ||
| 3356 | SHL DI,1 ;; | ||
| 3357 | SHL DI,1 ;; | ||
| 3358 | SHL DI,1 ;; | ||
| 3359 | SHL DI,1 ;; | ||
| 3360 | JMP CTL_DEF ;; | ||
| 3361 | ;; | ||
| 3362 | ;; ** SELECT HARDWARE PHYSICAL SLOT ** | ||
| 3363 | SELECT_SLOT : ;; | ||
| 3364 | MOV DI,BUF.PDESCO ;; | ||
| 3365 | MOV DI,CS:[DI].SELH_O ;; the HARDWARE-select controls | ||
| 3366 | XOR AX,AX ;; | ||
| 3367 | JMP RCTL_NXT ;; | ||
| 3368 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3369 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3370 | RCTL_NXT: ;; locate the right control sequence | ||
| 3371 | AND DX,DX ;; | ||
| 3372 | JZ CTL_DEF ;; | ||
| 3373 | MOV AL,CS:[DI] ;; | ||
| 3374 | ADD DI,AX ;; | ||
| 3375 | DEC DX ;; | ||
| 3376 | JMP RCTL_NXT ;; | ||
| 3377 | ;; | ||
| 3378 | ;; ******************************** | ||
| 3379 | ;; ** SEND OUT SELECTION CONTROL ** | ||
| 3380 | ;; ******************************** | ||
| 3381 | ;; | ||
| 3382 | ;; code page is to be invoked | ||
| 3383 | CTL_DEF : ;; DI points to the control sequence | ||
| 3384 | ;Check the status of the printer before writing. | ||
| 3385 | call Prt_status_check ;AN001;Check the printer status | ||
| 3386 | jz Ctl_Def_Send ;AN001;O.K.? | ||
| 3387 | jmp Ctl_Dev_Err ;AN001;Error. | ||
| 3388 | |||
| 3389 | Ctl_Def_Send: | ||
| 3390 | MOV SI,BUF.RNORMO ;; | ||
| 3391 | MOV CS:[SI].RHC_LEN,20 ;; | ||
| 3392 | MOV CS:[SI].RHC_CMD,CMD_WRT ;; | ||
| 3393 | ;; | ||
| 3394 | XOR CX,CX ;; | ||
| 3395 | MOV CL,CS:[DI] ;; | ||
| 3396 | ;; | ||
| 3397 | CTL_NEXT_BYTE : ;; | ||
| 3398 | ;; | ||
| 3399 | CMP BUF.PCLASS,1 ;; | ||
| 3400 | JE CTL_CLASS1 ;; | ||
| 3401 | ;; | ||
| 3402 | MOV CS:[SI].RH3_CNT,CX ;; send all at once | ||
| 3403 | MOV CX,1 ;; sent only once. | ||
| 3404 | JMP CTL_COMMON ;; | ||
| 3405 | ;; | ||
| 3406 | CTL_CLASS1 : ;; sent byte by byte to overcome | ||
| 3407 | MOV CS:[SI].RH3_CNT,1 ;; DOS timeout on kingman printer | ||
| 3408 | CTL_COMMON : ;; | ||
| 3409 | INC DI ;; | ||
| 3410 | MOV CS:[SI].RH3_DTAO,DI ;; | ||
| 3411 | PUSH CS ;; | ||
| 3412 | POP AX ;; | ||
| 3413 | MOV CS:[SI].RH3_DTAS,AX ;; | ||
| 3414 | ;; | ||
| 3415 | PUSH DI ;; | ||
| 3416 | PUSH BX ;; | ||
| 3417 | ;; | ||
| 3418 | PUSH BX ;; | ||
| 3419 | POP DI ;; save BX in DI | ||
| 3420 | PUSH CS ;; | ||
| 3421 | POP ES ;; | ||
| 3422 | MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) | ||
| 3423 | ;; | ||
| 3424 | CALL DWORD PTR CS:[DI].LPT_STRAO | ||
| 3425 | ;; | ||
| 3426 | CALL DWORD PTR CS:[DI].LPT_INTRO | ||
| 3427 | ;; | ||
| 3428 | POP BX ;; | ||
| 3429 | POP DI ;; | ||
| 3430 | ;; | ||
| 3431 | MOV AX,CS:[SI].RHC_STA ;; | ||
| 3432 | ;; | ||
| 3433 | AND AX,STAT_ERROR ;; any error returned by normal device? | ||
| 3434 | JNZ CTL_DEV_ERR ;; | ||
| 3435 | DEC CX ;; | ||
| 3436 | JNZ CTL_NEXT_BYTE ;; | ||
| 3437 | ;; | ||
| 3438 | POP ES ;; stack -4 | ||
| 3439 | POP SI ;; stack -3 | ||
| 3440 | POP DI ;; stack -2 | ||
| 3441 | JMP IVK_CP ;; | ||
| 3442 | ;; | ||
| 3443 | CTL_DEV_ERR : ;; | ||
| 3444 | POP ES ;; stack -4 | ||
| 3445 | POP SI ;; stack -3 | ||
| 3446 | POP DI ;; stack -2 | ||
| 3447 | POP CX ;; stack -1 | ||
| 3448 | JMP IVK_DEVERR ;; | ||
| 3449 | ;; | ||
| 3450 | ;; ********************************** | ||
| 3451 | ;; ** ADJUST WHICH CODEPAGE TO BE ** | ||
| 3452 | ;; ** ACTIVE ** | ||
| 3453 | ;; ********************************** | ||
| 3454 | ;; | ||
| 3455 | ;; -- set the attribute bit of the | ||
| 3456 | ;; slot (SLT_AT) to active for | ||
| 3457 | ;; the code page just invoked. | ||
| 3458 | ;; -- reset others to non-active. | ||
| 3459 | ;; | ||
| 3460 | ;; | ||
| 3461 | IVK_CP: ;; SI = start of the slots compared | ||
| 3462 | ;; DI = where code page was found | ||
| 3463 | POP CX ;; stack -1 | ||
| 3464 | PUSH SI ;; stack 1 = start of slots compared | ||
| 3465 | mov AX,BUF.STATUS ;; | ||
| 3466 | AND AX,LOADED ;; | ||
| 3467 | MOV AX,AT_ACT ;; | ||
| 3468 | JZ NO_LOAD ;; | ||
| 3469 | OR AX,AT_RAM1 ;; reset loaded to physical RAM #1, | ||
| 3470 | ;; this is reset only when there is | ||
| 3471 | ;; font loading in this round of invoke | ||
| 3472 | NO_LOAD: ;; (for RAM codepages only) | ||
| 3473 | NOT AX ;; | ||
| 3474 | NXT_CP: ;; | ||
| 3475 | AND CS:[SI].SLT_AT,AX ;; not active (and not loaded) | ||
| 3476 | INC SI ;; | ||
| 3477 | INC SI ;; | ||
| 3478 | INC SI ;; | ||
| 3479 | INC SI ;; | ||
| 3480 | DEC CX ;; | ||
| 3481 | JNZ NXT_CP ;; | ||
| 3482 | OR CS:[DI].SLT_AT,AT_ACT ;; the codepage found becomes active | ||
| 3483 | MOV AX,BUF.STATUS ;; | ||
| 3484 | AND AX,LOADED ;; | ||
| 3485 | JZ HWCP_RESET ;; | ||
| 3486 | OR CS:[DI].SLT_AT,AT_RAM1 ;; the font has just been loaded | ||
| 3487 | AND BUF.STATUS,NOT LOADED ;; | ||
| 3488 | ;; | ||
| 3489 | HWCP_RESET : ;; | ||
| 3490 | ;; | ||
| 3491 | POP SI ;; stack -1 (slot : ATs adjusted ) | ||
| 3492 | PUSH SI ;; stack 1 = start of slots compared | ||
| 3493 | ;; | ||
| 3494 | MOV DI,BUF.HARDSO ;; | ||
| 3495 | CMP SI,DI ;; | ||
| 3496 | JE RAM_RESET ;; | ||
| 3497 | ;; HWCP's AT to be reset | ||
| 3498 | MOV CX,BUF.HSLMX ;; | ||
| 3499 | AND CX,CX ;; | ||
| 3500 | JZ RAM_RESET ;; | ||
| 3501 | MOV AX,AT_ACT ;; | ||
| 3502 | NOT AX ;; | ||
| 3503 | RESET_HWCP : ;; | ||
| 3504 | AND CS:[DI].SLT_AT,AX ;; HWCP is not active | ||
| 3505 | INC DI ;; | ||
| 3506 | INC DI ;; | ||
| 3507 | INC DI ;; | ||
| 3508 | INC DI ;; | ||
| 3509 | DEC CX ;; | ||
| 3510 | JNZ RESET_HWCP ;; | ||
| 3511 | ;; | ||
| 3512 | ;; | ||
| 3513 | RAM_RESET: ;; | ||
| 3514 | ;; | ||
| 3515 | POP SI ;; stack -1 (slot : ATs adjusted ) | ||
| 3516 | PUSH SI ;; stack 1 = start of slots compared | ||
| 3517 | ;; | ||
| 3518 | MOV DI,BUF.RAMSO ;; | ||
| 3519 | CMP SI,DI ;; | ||
| 3520 | JE ALL_RESET ;; | ||
| 3521 | ;; HWCP's AT to be reset | ||
| 3522 | MOV CX,BUF.RSLMX ;; | ||
| 3523 | AND CX,CX ;; HWCP's no. | ||
| 3524 | JZ ALL_RESET ;; | ||
| 3525 | MOV AX,AT_ACT ;; | ||
| 3526 | NOT AX ;; | ||
| 3527 | RESET_RAM : ;; | ||
| 3528 | AND CS:[DI].SLT_AT,AX ;; HWCP is not active | ||
| 3529 | INC DI ;; | ||
| 3530 | INC DI ;; | ||
| 3531 | INC DI ;; | ||
| 3532 | INC DI ;; | ||
| 3533 | DEC CX ;; | ||
| 3534 | JNZ RESET_RAM ;; | ||
| 3535 | ;; | ||
| 3536 | ALL_RESET : ;; | ||
| 3537 | POP SI ;; stack -1 | ||
| 3538 | ;; | ||
| 3539 | XOR AX,AX ;; | ||
| 3540 | JMP IVK_RET ;; | ||
| 3541 | ;; | ||
| 3542 | NO_INVOKE : ;; | ||
| 3543 | ;; | ||
| 3544 | MOV AX,STAT_NOCPIV ;; | ||
| 3545 | JMP IVK_RET ;; | ||
| 3546 | ;; | ||
| 3547 | IVK_DEVERR : ;; | ||
| 3548 | MOV AX,STAT_DEVERR ;; | ||
| 3549 | JMP IVK_RET ;G; | ||
| 3550 | ;; | ||
| 3551 | IVK_CMDERR : ;G; | ||
| 3552 | MOV AX,STAT_CMDERR ;G; | ||
| 3553 | ;; | ||
| 3554 | IVK_RET : ;; | ||
| 3555 | LES DI,dword ptr buf.rh_ptro;; | ||
| 3556 | MOV RH.RHC_STA,AX ;; | ||
| 3557 | ;; | ||
| 3558 | RET ;; | ||
| 3559 | ;; | ||
| 3560 | INVOKE ENDP ;; | ||
| 3561 | ;; | ||
| 3562 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3563 | Prt_Status_Check proc near ;AN001; | ||
| 3564 | ;Check the printer device status | ||
| 3565 | ;Out) if Zero flag set - Ok. | ||
| 3566 | ; All registers saved. | ||
| 3567 | |||
| 3568 | push es ;AN001; | ||
| 3569 | push si ;AN001; | ||
| 3570 | |||
| 3571 | mov si, BUF.RNORMO ;AN001; | ||
| 3572 | mov cs:[si].RHC_LEN, 13 ;AN001; | ||
| 3573 | mov cs:[si].RHC_CMD, 10 ;AN001;device driver status check | ||
| 3574 | |||
| 3575 | push di ;AN001; | ||
| 3576 | push bx ;AN001; | ||
| 3577 | |||
| 3578 | push bx ;AN001; | ||
| 3579 | pop di ;AN001; | ||
| 3580 | push cs ;AN001; | ||
| 3581 | pop es ;AN001;ES:BX -> REQ_NORMn (was cs:si) | ||
| 3582 | mov bx, si ;AN001; | ||
| 3583 | |||
| 3584 | call dword ptr cs:[di].LPT_STRAO ;AN001;Strategy | ||
| 3585 | call dword ptr cs:[di].LPT_INTRO ;AN001;Intrrupt | ||
| 3586 | test cs:[si].RHC_STA, STAT_ERROR ;AN001; | ||
| 3587 | pop bx ;AN001; | ||
| 3588 | pop di ;AN001; | ||
| 3589 | |||
| 3590 | pop si ;AN001; | ||
| 3591 | pop es ;AN001; | ||
| 3592 | ret ;AN001; | ||
| 3593 | Prt_Status_Check endp ;AN001; | ||
| 3594 | |||
| 3595 | |||
| 3596 | |||
| 3597 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3598 | ;; | ||
| 3599 | ;;==== Generic IOCTL Query Invoked ======= | ||
| 3600 | ;; | ||
| 3601 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3602 | ;; | ||
| 3603 | Q_INVOKED PROC ;; | ||
| 3604 | push ds ;; | ||
| 3605 | ;; | ||
| 3606 | MOV AX,BUF.STATE ;; ??????????????? | ||
| 3607 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 3608 | JNE QI_0 ;; WGR ;AN000; | ||
| 3609 | MOV AX,BUF.SAVED_CP ;; WGR ;AN000; | ||
| 3610 | LDS SI,RH.GIH_GBA ;; WGR ;AN000; | ||
| 3611 | CMP AX,-1 ;; WGR ;AN000; | ||
| 3612 | JE QIV_NOACT ;; WGR ;AN000; | ||
| 3613 | JMP QI_1 ;; WGR ;AN000; | ||
| 3614 | QI_0: ;; WGR ;AN000; | ||
| 3615 | CMP AX,CPSW ;; reject only in NORMAL !!!! | ||
| 3616 | JNE QIV_CMDERR ;G; | ||
| 3617 | ;;------------------------- | ||
| 3618 | LDS SI,RH.GIH_GBA ;; | ||
| 3619 | ;; | ||
| 3620 | MOV DI,BUF.RAMSO ;; | ||
| 3621 | MOV CX,BUF.RSLMX ;; | ||
| 3622 | AND CX,CX ;; | ||
| 3623 | JZ QIV_HARD ;; | ||
| 3624 | ;; | ||
| 3625 | QIV_RAMLP : ;; | ||
| 3626 | MOV AX,CS:[DI].SLT_AT ;; check the RAM slots | ||
| 3627 | AND AX,AT_ACT ;; | ||
| 3628 | JNZ QIV_FOUND ;; | ||
| 3629 | INC DI ;; | ||
| 3630 | INC DI ;; | ||
| 3631 | INC DI ;; | ||
| 3632 | INC DI ;; | ||
| 3633 | DEC CX ;; | ||
| 3634 | JNZ QIV_RAMLP ;; | ||
| 3635 | ;; | ||
| 3636 | QIV_HARD : ;; | ||
| 3637 | MOV DI,BUF.HARDSO ;; | ||
| 3638 | MOV CX,BUF.HSLMX ;; | ||
| 3639 | AND CX,CX ;; | ||
| 3640 | JZ QIV_NOACT ;; | ||
| 3641 | ;; | ||
| 3642 | QIV_HARDLP : ;; | ||
| 3643 | MOV AX,CS:[DI].SLT_AT ;; check the RAM slots | ||
| 3644 | AND AX,AT_ACT ;; | ||
| 3645 | JNZ QIV_FOUND ;; | ||
| 3646 | INC DI ;; | ||
| 3647 | INC DI ;; | ||
| 3648 | INC DI ;; | ||
| 3649 | INC DI ;; | ||
| 3650 | DEC CX ;; | ||
| 3651 | JNZ QIV_HARDLP ;; | ||
| 3652 | ;; | ||
| 3653 | QIV_NOACT : ;; | ||
| 3654 | ;; | ||
| 3655 | MOV AX,STAT_NOCPIV ;; | ||
| 3656 | JMP QIV_RET ;; | ||
| 3657 | ;; | ||
| 3658 | ;; | ||
| 3659 | QIV_FOUND : ;; | ||
| 3660 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3661 | QI_1: ;; WGR ;AN000; | ||
| 3662 | MOV GIOB.GB2_LEN,2 ;; | ||
| 3663 | MOV GIOB.GB2_CP,AX ;; | ||
| 3664 | ;; | ||
| 3665 | XOR AX,AX ;; | ||
| 3666 | JMP QIV_RET ;; | ||
| 3667 | ;; | ||
| 3668 | QIV_DEVERR : ;; | ||
| 3669 | MOV AX,STAT_DEVERR ;; | ||
| 3670 | JMP QIV_RET ;G; | ||
| 3671 | ;; | ||
| 3672 | QIV_CMDERR : ;G; | ||
| 3673 | MOV AX,STAT_CMDERR ;G; | ||
| 3674 | ;; | ||
| 3675 | QIV_RET : ;; | ||
| 3676 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 3677 | MOV RH.RHC_STA,AX ;; | ||
| 3678 | ;; | ||
| 3679 | pop ds ;; | ||
| 3680 | ;; | ||
| 3681 | RET ;; | ||
| 3682 | ;; | ||
| 3683 | Q_INVOKED ENDP ;; | ||
| 3684 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3685 | ;; | ||
| 3686 | ;;==== Generic IOCTL Query List ======= | ||
| 3687 | ;; | ||
| 3688 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3689 | Q_LIST PROC ;; | ||
| 3690 | ;; | ||
| 3691 | push ds ;; | ||
| 3692 | ;; | ||
| 3693 | MOV AX,BUF.STATE ;; ???????????????? | ||
| 3694 | CMP AX,CPSW ;; reject only in NORMAL | ||
| 3695 | JE QLS_CPSW ;; | ||
| 3696 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 3697 | JE QLS_CPSW ;; WGR ;AN000; | ||
| 3698 | JMP QLS_CMDERR ;G; | ||
| 3699 | QLS_CPSW : ;;------------------------- | ||
| 3700 | LDS SI,RH.GIH_GBA ;; | ||
| 3701 | PUSH SI ;; stack 1 -- GB3 (SI) | ||
| 3702 | ;; | ||
| 3703 | MOV DI,BUF.HARDSO ;; | ||
| 3704 | MOV CX,BUF.HARDMX ;; | ||
| 3705 | MOV DX,BUF.HSLMX ;; DX = number of entries | ||
| 3706 | LEA SI,[SI].GB3_GBL ;; | ||
| 3707 | MOV GIOB.GBL_LEN,CX ;; | ||
| 3708 | ;; | ||
| 3709 | QL_HARDLP: ;; | ||
| 3710 | AND CX,CX ;; | ||
| 3711 | JZ QL_PREPARE ;; | ||
| 3712 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3713 | MOV GIOB.GBL_CP,AX ;; | ||
| 3714 | INC DI ;; | ||
| 3715 | INC DI ;; | ||
| 3716 | INC DI ;; | ||
| 3717 | INC DI ;; | ||
| 3718 | INC SI ;; | ||
| 3719 | INC SI ;; | ||
| 3720 | DEC CX ;; | ||
| 3721 | JMP QL_HARDLP ;; | ||
| 3722 | ;; | ||
| 3723 | QL_PREPARE: ;; | ||
| 3724 | MOV CX,BUF.HSLMX ;; | ||
| 3725 | SUB CX,BUF.HARDMX ;; less the no. of HWCP | ||
| 3726 | MOV DX,BUF.RSLMX ;; | ||
| 3727 | ADD DX,CX ;; DX = total number of entries | ||
| 3728 | INC SI ;; | ||
| 3729 | INC SI ;; | ||
| 3730 | MOV GIOB.GBL_LEN,DX ;; | ||
| 3731 | QL_CARTLP: ;; | ||
| 3732 | AND CX,CX ;; | ||
| 3733 | JZ QL_RAM_PREP ;; | ||
| 3734 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3735 | MOV GIOB.GBL_CP,AX ;; | ||
| 3736 | INC DI ;; | ||
| 3737 | INC DI ;; | ||
| 3738 | INC DI ;; | ||
| 3739 | INC DI ;; | ||
| 3740 | INC SI ;; | ||
| 3741 | INC SI ;; | ||
| 3742 | DEC CX ;; | ||
| 3743 | JMP QL_CARTLP ;; | ||
| 3744 | ;; | ||
| 3745 | ;; | ||
| 3746 | QL_RAM_PREP: ;; | ||
| 3747 | MOV DI,BUF.RAMSO ;; | ||
| 3748 | MOV CX,BUF.RSLMX ;; | ||
| 3749 | ;; | ||
| 3750 | QL_RAMLP : ;; | ||
| 3751 | AND CX,CX ;; | ||
| 3752 | JZ QL_DONE ;; | ||
| 3753 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3754 | MOV GIOB.GBL_CP,AX ;; | ||
| 3755 | INC DI ;; | ||
| 3756 | INC DI ;; | ||
| 3757 | INC DI ;; | ||
| 3758 | INC DI ;; | ||
| 3759 | INC SI ;; | ||
| 3760 | INC SI ;; | ||
| 3761 | DEC CX ;; | ||
| 3762 | JMP QL_RAMLP ;; | ||
| 3763 | ;; | ||
| 3764 | QL_DONE: ;; | ||
| 3765 | POP SI ;; stack -1 | ||
| 3766 | mov dx,buf.hslmx ;; | ||
| 3767 | add DX,BUF.RSLMX ;; | ||
| 3768 | INC DX ;; | ||
| 3769 | INC DX ;; | ||
| 3770 | MOV CX,1 ;; | ||
| 3771 | SHL DX,CL ;; | ||
| 3772 | MOV GIOB.GB3_LEN,DX ;; | ||
| 3773 | ;; | ||
| 3774 | XOR AX,AX ;; | ||
| 3775 | CMP DX,GB3_MINILEN ;; min. GBL length | ||
| 3776 | JA QLS_RET ;; | ||
| 3777 | MOV AX,STAT_NOCP ;; | ||
| 3778 | JMP QLS_RET ;; | ||
| 3779 | ;; | ||
| 3780 | QLS_DEVERR : ;; | ||
| 3781 | MOV AX,STAT_DEVERR ;; | ||
| 3782 | JMP QLS_RET ;G; | ||
| 3783 | ;; | ||
| 3784 | QLS_CMDERR : ;G; | ||
| 3785 | MOV AX,STAT_CMDERR ;G; | ||
| 3786 | ;; | ||
| 3787 | QLS_RET : ;; | ||
| 3788 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 3789 | MOV RH.RHC_STA,AX ;; | ||
| 3790 | ;; | ||
| 3791 | pop ds ;; | ||
| 3792 | RET ;; | ||
| 3793 | ;; | ||
| 3794 | Q_LIST ENDP ;; | ||
| 3795 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3796 | ; | ||
| 3797 | ; CHECK_PRINT_ACTIVE | ||
| 3798 | ; | ||
| 3799 | ; THIS ROUTINE IS CALLED BEFORE THE INVOKE, DESIGNATE | ||
| 3800 | ; COMMANDS ARE OPERATED ON. THIS IS TO PREVENT CONFLICT | ||
| 3801 | ; BETWEEN THE BACKGROUND PRINTING AND THE DOWNLOAD SEQUENCE. | ||
| 3802 | ; | ||
| 3803 | ; INPUT: | ||
| 3804 | ; CS:[BX].DEV_HDRO OFFSET AND SEGMENT OF ACTIVE DEVICE | ||
| 3805 | ; CS:[BX].DEV_HDRS | ||
| 3806 | ; | ||
| 3807 | ; WARNING: IF ANOTHER DEVICE DRIVER IS TO TAKE THE LPTx, THEN | ||
| 3808 | ; THIS WILL not FIND OUT THAT THE PRINTER.SYS IS ACTIVE. | ||
| 3809 | ; | ||
| 3810 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3811 | CHECK_PRINT_ACTIVE PROC ;G; | ||
| 3812 | PUSH AX ;G; SAVE THE REGISTERS............ | ||
| 3813 | PUSH SI ;G; | ||
| 3814 | PUSH DI ;G; | ||
| 3815 | PUSH DS ;G; | ||
| 3816 | PUSH ES ;G; | ||
| 3817 | ;G; | ||
| 3818 | MOV DI,BUF.DEV_HDRS ;G; SETUP ES: = ACTIVE DEVICE SEGMENT | ||
| 3819 | MOV ES,DI ;G; & | ||
| 3820 | MOV DI,BUF.DEV_HDRO ;G; SETUP DI: = ACTIVE DEVICE OFFSET | ||
| 3821 | ;G; | ||
| 3822 | MOV AX,0106H ;G; PRINT (GET LIST DEVICE) | ||
| 3823 | CLC ;G; | ||
| 3824 | JNC CPA_5 ;G; CY=0 IF NOT LOADED/NOT ACTIVE | ||
| 3825 | ;G; | ||
| 3826 | CMP SI,DI ;G; ES:DI POINTS TO THE ACTIVE DEVICE | ||
| 3827 | JNE CPA_5 ;G; | ||
| 3828 | MOV SI,DS ;G; | ||
| 3829 | MOV DI,ES ;G; | ||
| 3830 | CMP SI,DI ;G; | ||
| 3831 | JNE CPA_5 ;G; | ||
| 3832 | STC ;G; OTHERWISE, THIS DEVICE IS PRESENTLY | ||
| 3833 | JMP CPA_6 ;G; UNDER PRINT!!! PREVENT DATASTREAM | ||
| 3834 | ;G; CONFLICT IN THIS CASE. | ||
| 3835 | ;G; | ||
| 3836 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;G; PRINT.COM IS ASLEEP OR IS NOT | ||
| 3837 | ;G; PRESENTLY LOADED. THE PRINTER.SYS | ||
| 3838 | CPA_5: CLC ;G; CAN CONTINUE IT PROCESS! | ||
| 3839 | CPA_6: POP ES ;G; RESTORE REGISTERS..... | ||
| 3840 | POP DS ;G; | ||
| 3841 | POP DI ;G; | ||
| 3842 | POP SI ;G; | ||
| 3843 | POP AX ;G; | ||
| 3844 | RET ;G; | ||
| 3845 | CHECK_PRINT_ACTIVE ENDP ;G; | ||
| 3846 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3847 | |||
| 3848 | |||
| 3849 | |||
| 3850 | CSEG ENDS | ||
| 3851 | END | ||
diff --git a/v4.0/src/DEV/PRINTER/MAKEFILE b/v4.0/src/DEV/PRINTER/MAKEFILE new file mode 100644 index 0000000..2f14f1a --- /dev/null +++ b/v4.0/src/DEV/PRINTER/MAKEFILE | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | #************************* Makefile for Printer *************************** | ||
| 2 | |||
| 3 | inc =..\..\inc | ||
| 4 | msg =..\..\messages | ||
| 5 | dos =..\..\dos | ||
| 6 | hinc =..\..\h | ||
| 7 | make =nmake | ||
| 8 | |||
| 9 | # | ||
| 10 | ######################## Dependencies Begin Here ########################## | ||
| 11 | # | ||
| 12 | |||
| 13 | all: printer.sys 5202.cpi | ||
| 14 | |||
| 15 | printer.ctl: printer.skl $(msg)\$(COUNTRY).msg | ||
| 16 | |||
| 17 | cpspm10.obj: cpspm10.asm cpspequ.inc | ||
| 18 | |||
| 19 | cpsfont3.obj: cpsfont3.asm cpspequ.inc | ||
| 20 | |||
| 21 | prtint2f.obj: prtint2f.asm cpspequ.inc $(inc)\struc.inc | ||
| 22 | |||
| 23 | cpspi07.obj: cpspi07.asm cpspequ.inc \ | ||
| 24 | $(inc)\sysmsg.inc printer.ctl \ | ||
| 25 | $(inc)\versiona.inc | ||
| 26 | |||
| 27 | parser.obj: parser.asm cpspequ.inc $(inc)\parse.asm \ | ||
| 28 | $(inc)\struc.inc | ||
| 29 | |||
| 30 | printer.sys: cpspm10.obj cpsfont3.obj parser.obj cpspi07.obj prtint2f.obj | ||
| 31 | link @printer.lnk | ||
| 32 | exe2bin printer.exe printer.sys < zero.dat | ||
| 33 | del printer.exe | ||
| 34 | |||
| 35 | 5202.cpi: | ||
| 36 | cd 5202 | ||
| 37 | $(make) | ||
| 38 | cd .. | ||
| 39 | |||
| 40 | |||
diff --git a/v4.0/src/DEV/PRINTER/PARSE4E.ASM b/v4.0/src/DEV/PRINTER/PARSE4E.ASM new file mode 100644 index 0000000..872a458 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PARSE4E.ASM | |||
| @@ -0,0 +1,1106 @@ | |||
| 1 | ;*************************************************************** | ||
| 2 | ;** ** | ||
| 3 | ;** ******** ** ** ******* ** | ||
| 4 | ;** ** ** ** ** ** | ||
| 5 | ;** ** ******* ***** ** | ||
| 6 | ;** ** ** ** ** ** | ||
| 7 | ;** ** ** ** ******* ** | ||
| 8 | ;** ** | ||
| 9 | ;** ****** * ****** ****** ******* ****** ** | ||
| 10 | ;** ** ** ** ** ** ** ** ** ** ** ** | ||
| 11 | ;** ****** ******* ****** ***** ****** ****** ** | ||
| 12 | ;** ** ** ** ** ** ** ** ** ** ** | ||
| 13 | ;** ** ** ** ** ** ****** ******* ** ** ** | ||
| 14 | ;** ** | ||
| 15 | ;*************************************************************** | ||
| 16 | ; | ||
| 17 | ; File Name: PARSE.ASM | ||
| 18 | ; ---------- | ||
| 19 | ; | ||
| 20 | ; Description: A command parser for DEVICE command in the CONFIG.SYS file. | ||
| 21 | ; ------------ | ||
| 22 | ; | ||
| 23 | ; Procedures contained in the file: | ||
| 24 | ; --------------------------------- | ||
| 25 | ; PARSER: Main routine for command processing. | ||
| 26 | ; GET_CHAR: Gets a character from command line. | ||
| 27 | ; IS_ALPH: Checks if character is an alpha character. | ||
| 28 | ; IS_DIGIT: Checks if character is a digit. | ||
| 29 | ; IS_DELIM: Checks if character is a DOS delimiter. | ||
| 30 | ; DEVICE_PARSE: Pulls device name from command line and | ||
| 31 | ; inserts in table. | ||
| 32 | ; ID_PARSE: Pulls id name from command line and insers in table | ||
| 33 | ; HWCP_PARMS: Extract HWCP number, converts it to binary and | ||
| 34 | ; inserts it in table. | ||
| 35 | ; HWCP_PARSE: Extracts HWCP number if only one number is given. | ||
| 36 | ; MUL_HWCP: Extracts multiple HWCP's numbers, if they are given | ||
| 37 | ; in a list. | ||
| 38 | ; DESG_PARMS: Extracts designate number, converts it to binary | ||
| 39 | ; and inserts it in table. | ||
| 40 | ; DESG_FONT: Extracts the designate and the font if both were | ||
| 41 | ; given in command line. | ||
| 42 | ; DESG_PARSE: Pulls designate number if it is the only one given. | ||
| 43 | ; GET_NUMBER: Converts a number to binary. | ||
| 44 | ; OFFSET_TABLE: Updates the counter in table #1. | ||
| 45 | ; FIND_RIGHT_BR: Looks for a right bracket. | ||
| 46 | ; | ||
| 47 | ; | ||
| 48 | ; Change history: | ||
| 49 | ; --------------- | ||
| 50 | ; | ||
| 51 | ; | ||
| 52 | ;LOGIC: | ||
| 53 | ;------ | ||
| 54 | ; Establish addressability to parameters. | ||
| 55 | ; Skip until end of path and file name -first delimiter | ||
| 56 | ; | ||
| 57 | ; Loop: | ||
| 58 | ; Isolate the first non-delimiter or non delimeter characters. | ||
| 59 | ; If End_of_Line_Delimiter then | ||
| 60 | ; return an error_code | ||
| 61 | ; Else | ||
| 62 | ; If first non-delimiter is ALPHA then | ||
| 63 | ; (assume a device name) | ||
| 64 | ; Extracts device name | ||
| 65 | ; Update offset counter | ||
| 66 | ; | ||
| 67 | ; Isolate the first non-delimiter characters after id name. | ||
| 68 | ; If End_of_Line_Delimiter then | ||
| 69 | ; return an error_code | ||
| 70 | ; Else | ||
| 71 | ; If first non-delimiter is ALPHA-NUMARIC or | ||
| 72 | ; If character is '(' then | ||
| 73 | ; (assume an id name) | ||
| 74 | ; Extracts id name | ||
| 75 | ; Update offset counter | ||
| 76 | ; | ||
| 77 | ; Pull out HWCP | ||
| 78 | ; If error flag is set then exit | ||
| 79 | ; Else if end of line flag is set then exit | ||
| 80 | ; | ||
| 81 | ; Pull out DESG parms | ||
| 82 | ; If error_flag is set then exit. | ||
| 83 | ; Else if end of line flag is set then exit | ||
| 84 | ; Else if Number of devices is four then Exit | ||
| 85 | ; Else Loop | ||
| 86 | ; | ||
| 87 | ; | ||
| 88 | ;Subroutines Logic: | ||
| 89 | ;------------------ | ||
| 90 | ; | ||
| 91 | ; GET_CHAR: | ||
| 92 | ; --------- | ||
| 93 | ; Load character in AL | ||
| 94 | ; If character less than 20h then | ||
| 95 | ; turn Z-flag on | ||
| 96 | ; | ||
| 97 | ; IS_ALPHA: | ||
| 98 | ; --------- | ||
| 99 | ; Save character | ||
| 100 | ; 'Convert character to upper case' | ||
| 101 | ; If character >=A and <=Z then | ||
| 102 | ; turn Z-flag on | ||
| 103 | ; exit | ||
| 104 | ; Else | ||
| 105 | ; Restore character | ||
| 106 | ; exit. | ||
| 107 | ; | ||
| 108 | ; IS_DIGIT: | ||
| 109 | ; --------- If Character >=0 and <=9 then | ||
| 110 | ; turn Z-flag on | ||
| 111 | ; | ||
| 112 | ; IS_DELIMITER: | ||
| 113 | ; ------------- | ||
| 114 | ; If character a dos delimiter (' ','=',',',';',TAB) | ||
| 115 | ; then turn Z-flag on | ||
| 116 | ; | ||
| 117 | ; DEVICE_PARSE: | ||
| 118 | ; ------------- | ||
| 119 | ; Set device name length counter. | ||
| 120 | ; Loop | ||
| 121 | ; If a dos delimiter then | ||
| 122 | ; add spaces to name (if require) | ||
| 123 | ; Else if char is ALPHA-NUM then | ||
| 124 | ; save in table | ||
| 125 | ; If name >8 character thne | ||
| 126 | ; error; exit | ||
| 127 | ; Else | ||
| 128 | ; error; exit | ||
| 129 | ; | ||
| 130 | ; ID_PARSE: | ||
| 131 | ; --------- Set id name length counter. | ||
| 132 | ; Loop | ||
| 133 | ; If a dos delimiter then | ||
| 134 | ; add spaces to name (if require) | ||
| 135 | ; Else if char is ALPHA-NUM then | ||
| 136 | ; save in table | ||
| 137 | ; If name >8 character then | ||
| 138 | ; error; exit | ||
| 139 | ; Else if char is ')' or '(' then | ||
| 140 | ; set flags | ||
| 141 | ; Else | ||
| 142 | ; error; exit | ||
| 143 | ; | ||
| 144 | ; HWCP_PARMS: | ||
| 145 | ; ----------- | ||
| 146 | ; Loop: Set flags off | ||
| 147 | ; If char is a DIGIT then | ||
| 148 | ; convert number to binary | ||
| 149 | ; update table | ||
| 150 | ; Else if char is ',' then | ||
| 151 | ; no HWCP was given | ||
| 152 | ; exit | ||
| 153 | ; Else if char is '(' then | ||
| 154 | ; assume multiple HWCP | ||
| 155 | ; Else if char is ')' then | ||
| 156 | ; end of parms, exit | ||
| 157 | ; Else if not a delimiter then | ||
| 158 | ; error, exit set carry flag set carry flag | ||
| 159 | ; Loop | ||
| 160 | ; | ||
| 161 | ; HWCP_PARSE: | ||
| 162 | ; ----------- Increment counter | ||
| 163 | ; Get number and convert to binary | ||
| 164 | ; Update the table | ||
| 165 | ; Set table_5 pointer | ||
| 166 | ; | ||
| 167 | ; MUL_HWCP: | ||
| 168 | ; --------- | ||
| 169 | ; Loop: If char is ')' then | ||
| 170 | ; end of list, exit | ||
| 171 | ; If char is a DIGIT | ||
| 172 | ; Get number and convert to binary | ||
| 173 | ; Update table. | ||
| 174 | ; If char is not a delimiter then | ||
| 175 | ; error, exit set carry flag | ||
| 176 | ; Loop | ||
| 177 | ; | ||
| 178 | ; DESG_PARMS: | ||
| 179 | ; ----------- | ||
| 180 | ; Loop: If char is a DIGIT then | ||
| 181 | ; Get number and convert to binary | ||
| 182 | ; Update table. | ||
| 183 | ; If char is a ')' then | ||
| 184 | ; end of parms, exit | ||
| 185 | ; If char is a '(' then | ||
| 186 | ; assume given desg. and font | ||
| 187 | ; If char is a ',' then | ||
| 188 | ; no desg ginven | ||
| 189 | ; scane for ')' | ||
| 190 | ; If char is not a delimiter then | ||
| 191 | ; error, exit set carry flag | ||
| 192 | ; Loop | ||
| 193 | ; | ||
| 194 | ; DESG_FONT: | ||
| 195 | ; ---------- | ||
| 196 | ; Loop: If char is a ',' then | ||
| 197 | ; no desg number was given | ||
| 198 | ; update table | ||
| 199 | ; If char is a ')' then | ||
| 200 | ; end of desg-font pair, exit | ||
| 201 | ; If char is a DIGIT then | ||
| 202 | ; Get number and convert to binary | ||
| 203 | ; Update table | ||
| 204 | ; If char not a delimiter then | ||
| 205 | ; error, exit set carry flag | ||
| 206 | ; Loop | ||
| 207 | ; | ||
| 208 | ; DESG_PARSE: | ||
| 209 | ; ----------- Get number and conver to binary | ||
| 210 | ; Update table | ||
| 211 | ; | ||
| 212 | ; GET_NUMBER: | ||
| 213 | ; ----------- Get ASCII number from parms | ||
| 214 | ; conver to binary | ||
| 215 | ; add to total | ||
| 216 | ; | ||
| 217 | ; OFFSET_TABLE: | ||
| 218 | ; ------------- | ||
| 219 | ; Increment the number of parms | ||
| 220 | ; | ||
| 221 | ; FIND_RIGHT_BR: | ||
| 222 | ; -------------- | ||
| 223 | ; Loop: If char is ')' then | ||
| 224 | ; found bracket exit | ||
| 225 | ; If char is not ' ' then | ||
| 226 | ; error, exit set carry flag | ||
| 227 | ; Loop | ||
| 228 | ; END | ||
| 229 | ;------------------------------------------------------ | ||
| 230 | ; | ||
| 231 | ; The following is the table structure of the parser. All fields are | ||
| 232 | ; two bytes field (accept for the device and id name) | ||
| 233 | ; | ||
| 234 | ; TABLE HEADER : | ||
| 235 | ; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ | ||
| 236 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 237 | ; ³ N = Number of devices. ³ | ||
| 238 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 239 | ; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 240 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ | ||
| 241 | ; ³ Device # 2 offset ³ ³ Table_1 (a) ³ | ||
| 242 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ | ||
| 243 | ; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 244 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 245 | ; ³ Device # 4 offset ³ | ||
| 246 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 247 | ; | ||
| 248 | ; | ||
| 249 | ; N = 1,2,3 or 4. A two bytes number indicating the number of device specified. | ||
| 250 | ; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset | ||
| 251 | ; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1 | ||
| 252 | ; (b)...etc.). If an error was detected in the command N is set to zero. | ||
| 253 | ; | ||
| 254 | ; | ||
| 255 | ; | ||
| 256 | ; TABLE_1 : | ||
| 257 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 258 | ; | ||
| 259 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 260 | ; ³ N = Number of Offsets. ³ ³ ³ | ||
| 261 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³ | ||
| 262 | ; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³ | ||
| 263 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 264 | ; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿ | ||
| 265 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 266 | ; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³ | ||
| 267 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³ | ||
| 268 | ; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³ | ||
| 269 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 270 | ; ³ "Reserved" ³ ³ ³ | ||
| 271 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 272 | ; ³ ³ ³ ³ | ||
| 273 | ; ³ ÀÄÄÄÄÄij Table_4 (a) ³ | ||
| 274 | ; ³ ³ ³ | ||
| 275 | ; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 276 | ; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 277 | ; ³ ³ ³ | ||
| 278 | ; ÀÄÄÄÄÄÄÄij Table_5 (a) ³ | ||
| 279 | ; ³ ³ | ||
| 280 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 281 | ; | ||
| 282 | ; | ||
| 283 | ; N=Length of table_1, or the number of offsets contained in table_1. | ||
| 284 | ; The offsets are pointers (two bytes) to the parameters value of the device. | ||
| 285 | ; "Reserved" : a two byte memory reserved for future use of the "PARMS" option. | ||
| 286 | ; | ||
| 287 | ; | ||
| 288 | ; TABLE_2 : | ||
| 289 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 290 | ; | ||
| 291 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 292 | ; ³ N = Length of devices name ³ | ||
| 293 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 294 | ; ³ Device name ³ | ||
| 295 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 296 | ; | ||
| 297 | ; N = Length of device name. Device length is always 8 byte long. | ||
| 298 | ; Device Name : the name of the device (eg. LPT1, CON, PRN). The name | ||
| 299 | ; is paded with spaces to make up the rest of the 8 characters. | ||
| 300 | ; | ||
| 301 | ; | ||
| 302 | ; | ||
| 303 | ; TABLE_3 : | ||
| 304 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 305 | ; | ||
| 306 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 307 | ; ³ N = Length of Id name. ³ | ||
| 308 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 309 | ; ³ Id Name ³ | ||
| 310 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 311 | ; | ||
| 312 | ; N = Length of id name. Id name length is always 8 byte long. | ||
| 313 | ; Id Name : the name of the id (eg. EGA, VGA, 3812). The name | ||
| 314 | ; is paded with spaces to make up the rest of the 8 character. | ||
| 315 | ; | ||
| 316 | ; | ||
| 317 | ; | ||
| 318 | ; TABLE_4 : | ||
| 319 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 320 | ; | ||
| 321 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 322 | ; ³ N = Length of table. ³ | ||
| 323 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 324 | ; ³ HWCP # 1 ³ | ||
| 325 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 326 | ; ³ HWCP # 2 ³ | ||
| 327 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 328 | ; ³ . ³ | ||
| 329 | ; ³ . ³ | ||
| 330 | ; ³ . ³ | ||
| 331 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 332 | ; ³ HWCP # 10 ³ | ||
| 333 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 334 | ; | ||
| 335 | ; | ||
| 336 | ; N = Length of table in words. Or the number of HWCP's. | ||
| 337 | ; HWCP # N : a hardware code page number converted to binary. The maximum | ||
| 338 | ; number of pages allowed is 10. | ||
| 339 | ; | ||
| 340 | ; | ||
| 341 | ; | ||
| 342 | ; TABLE_5 : | ||
| 343 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 344 | ; | ||
| 345 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 346 | ; ³ N = Length of table. ³ | ||
| 347 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 348 | ; ³ Designate ³ | ||
| 349 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 350 | ; ³ Font ³ | ||
| 351 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 352 | ; | ||
| 353 | ; N = Lenght of table. 0 - nothing was specified | ||
| 354 | ; 1 - Only a designate was specified. | ||
| 355 | ; 2 - Designate and font were given. If the Desg field | ||
| 356 | ; was left empty in the DEVICE command then the | ||
| 357 | ; Designate field is filled with 0FFFFH. | ||
| 358 | ; Designate, Font : Are the Desg. and Font binary numbers. | ||
| 359 | ; | ||
| 360 | ;------------------------------------------------------ | ||
| 361 | ; | ||
| 362 | |||
| 363 | PROGRAM SEGMENT | ||
| 364 | |||
| 365 | ASSUME CS:PROGRAM | ||
| 366 | ASSUME DS:PROGRAM | ||
| 367 | ASSUME ES:PROGRAM | ||
| 368 | |||
| 369 | ORG 100H | ||
| 370 | |||
| 371 | START: | ||
| 372 | JMP NOW | ||
| 373 | |||
| 374 | ;RESERVED MEMORY: | ||
| 375 | TABLE_1 DW ? ; Pointer at offsets. | ||
| 376 | TABLE_2 DW ? ; Pointer at device name. | ||
| 377 | TABLE_3 DW ? ; Pointer at id name. | ||
| 378 | TABLE_4 DW ? ; Pointer at hwcp. | ||
| 379 | TABLE_5 DW ? ; Pointer at desg and font. | ||
| 380 | TABLE DB 290 DUP (?) ; Table of parsed parms. Max 4 devices. | ||
| 381 | DEVNUM DW ? ; Counter to number of devices. | ||
| 382 | RIGHT_FLAG DB ? ; Flag to indicate a left bracket. | ||
| 383 | DEV_ERR_FLG DB ? ; Device name error flag. | ||
| 384 | ID_ERR_FLG DB ? ; Id name error flag. | ||
| 385 | ERROR_FLAG DB ? ; Error flag_terminate program if set to 1. | ||
| 386 | COMMA_FLAG DB ? ; Indicate the number of commas incounterd. | ||
| 387 | HWCP_FLAG DB ? ; Flag for multiple hwcps. | ||
| 388 | DESG_FLAG DB ? ; Flag indicates desg. and font. | ||
| 389 | |||
| 390 | ;Main part of program-links different sumbroutines together | ||
| 391 | NOW: | ||
| 392 | CALL PARSER | ||
| 393 | INT 20H ;Exit DOS. | ||
| 394 | |||
| 395 | PARSER PROC | ||
| 396 | |||
| 397 | PUSH AX ; ;;;;;;;;;;;;;;;;;; | ||
| 398 | PUSH BX ; ; | ||
| 399 | PUSH CX ; ; SAVE | ||
| 400 | PUSH DX ; ; ALL | ||
| 401 | PUSH DS ; ; REGISTERS. | ||
| 402 | PUSH ES ; ; | ||
| 403 | PUSH DI ; ; | ||
| 404 | PUSH SI ; ;;;;;;;;;;;;;;;;;; | ||
| 405 | |||
| 406 | ;LES SI,RH.RH0_BPBA ; Point at all after DEVICE= | ||
| 407 | ; in the CONFIG.SYS file. | ||
| 408 | |||
| 409 | mov di,81h ; ;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 410 | mov cl,cs:byte ptr [di-1] ; ; ;; | ||
| 411 | xor ch,ch ; ; ERASE THIS ;; | ||
| 412 | add di,cx ; ;;;;;;;; CODE IN ;; | ||
| 413 | mov ds:word ptr[di],0a0dh ; ; CPS ;; | ||
| 414 | ; ;;;;;;;; ;; | ||
| 415 | MOV SI,0081h ; ;Set SI at parameters. ;; | ||
| 416 | ; ;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 417 | |||
| 418 | ;Skip to end of file name, to the first DOS delimiter. | ||
| 419 | |||
| 420 | MOV DEVNUM,02H ; Number of devices counter. | ||
| 421 | |||
| 422 | GET_PARMS_A: CALL GET_CHAR ; Get command character in AL . | ||
| 423 | JZ EXIT_B ; No parms found. | ||
| 424 | CALL IS_DELIM ; If not a delimiter then. | ||
| 425 | JNE GET_PARMS_A ; Check next character. | ||
| 426 | |||
| 427 | MOV DI,OFFSET TABLE ; Get the table address. | ||
| 428 | ADD DI,02H ; Point at devices offsets. | ||
| 429 | MOV BX,DI ; | ||
| 430 | ADD BX,08H ; Point BX at parms offsets. | ||
| 431 | TAB2: CALL UPDATE_TABLE ; Update table pointers value. | ||
| 432 | |||
| 433 | CLR_DELIM: CALL GET_CHAR ; Get character into AL. | ||
| 434 | JZ EXIT_B ; No parms found. | ||
| 435 | CALL IS_ALPHA ; If alpha then assume. | ||
| 436 | JZ DEVICE ; A device name. | ||
| 437 | CALL IS_DELIM ; Is it a delimiter | ||
| 438 | JNE EXIT_A ; If not then error. | ||
| 439 | JMP CLR_DELIM ; Get next character. | ||
| 440 | |||
| 441 | DEVICE: MOV DEV_ERR_FLG,00H ; Set device error flag off; | ||
| 442 | CALL DEVICE_PARSE ; Call routine to parse device name. | ||
| 443 | CMP DEV_ERR_FLG,01H ; If error flag is | ||
| 444 | JZ EXIT_A ; set then exit. | ||
| 445 | CALL OFFSET_TABLE ; Update table. | ||
| 446 | |||
| 447 | ID_PARMS: CALL GET_CHAR ; Load a character in AL. | ||
| 448 | JZ EXIT_A ; Exit if end of line (error). | ||
| 449 | CMP AL,'(' ; If AL is a '(' then | ||
| 450 | JE ID ; Parse ID name. | ||
| 451 | CALL IS_ALPHA ; If an Alpha | ||
| 452 | JE ID ; Then parse ID name. | ||
| 453 | CALL IS_DIGIT ; If a digit | ||
| 454 | JE ID ; Then parse ID name. | ||
| 455 | CALL IS_DELIM ; If not a delimiter | ||
| 456 | JNE EXIT_A ; Then error, exit | ||
| 457 | JMP ID_PARMS ; Get another number | ||
| 458 | |||
| 459 | EXIT_B: CMP DEVNUM,02H ; If device number above 2 then | ||
| 460 | JA EXIT_C ; Exit parse. | ||
| 461 | JMP EXIT_A ; Else error, exit | ||
| 462 | |||
| 463 | ID: MOV ID_ERR_FLG,00H ; Set id error flag off. | ||
| 464 | CALL ID_PARSE ; Parse ID name. | ||
| 465 | CMP ID_ERR_FLG,01H ; Was error flag set, then | ||
| 466 | JE EXIT_A ; Print error message. | ||
| 467 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 468 | |||
| 469 | CALL HWCP_PARMS ; Get code page number | ||
| 470 | CMP ERROR_FLAG,01H ; If error, then | ||
| 471 | JE EXIT_A ; Print error message and exit | ||
| 472 | CMP ERROR_FLAG,02H ; If end of string | ||
| 473 | JE EXIT_H ; Then exit. | ||
| 474 | |||
| 475 | CALL DESG_PARMS ; Get designate number | ||
| 476 | CMP ERROR_FLAG,01H ; If error, then | ||
| 477 | JE EXIT_A ; Print error message and exit | ||
| 478 | JMP EXIT_H ; Then exit. | ||
| 479 | |||
| 480 | EXIT_A: MOV DI,OFFSET TABLE ; Load table offset | ||
| 481 | MOV DS:WORD PTR [DI],00H ; Set error to on. | ||
| 482 | STC ; Set carry flag | ||
| 483 | JMP EXIT_P ; Exit parse. | ||
| 484 | |||
| 485 | EXIT_H: MOV DI,OFFSET TABLE ; Load table offset. | ||
| 486 | ADD DS:WORD PTR [DI],01H ; Increment number of devices. | ||
| 487 | CMP DEVNUM,08H ; If 4 devices loaded | ||
| 488 | JE EXIT_C ; Then exit parse. | ||
| 489 | ADD DEVNUM,02H ; Increment the number of devices | ||
| 490 | ADD DI,DEVNUM ; Point at next devices offset. | ||
| 491 | MOV BX,TABLE_5 ; BX point at | ||
| 492 | ADD BX,06H ; end of previous table. | ||
| 493 | JMP TAB2 ; Get next device. | ||
| 494 | |||
| 495 | EXIT_C: CLC | ||
| 496 | |||
| 497 | EXIT_P: POP SI ; ;;;;;;;;;;;;;;;;;; | ||
| 498 | POP DI ; ; | ||
| 499 | POP ES ; ; RESTORE | ||
| 500 | POP DS ; ; ALL | ||
| 501 | POP DX ; ; REGISTERS. | ||
| 502 | POP CX ; ; | ||
| 503 | POP BX ; ; | ||
| 504 | POP AX ; ;;;;;;;;;;;;;;;;;; | ||
| 505 | RET | ||
| 506 | |||
| 507 | PARSER ENDP | ||
| 508 | |||
| 509 | |||
| 510 | ;******************************************************** | ||
| 511 | ;** GET_CHAR : a routine to get next character pointed ** | ||
| 512 | ;** to by ES:SI into AL. ** | ||
| 513 | ;******************************************************** | ||
| 514 | |||
| 515 | GET_CHAR PROC | ||
| 516 | |||
| 517 | MOV AL,ES:BYTE PTR [SI] ; Load character pointed to | ||
| 518 | CMP AL,09H ; by ES:[SI] in AL. | ||
| 519 | JE ZOFF ; If tab then O.K | ||
| 520 | CMP AL,20H ; Turn Z-flag on | ||
| 521 | JL TURN_Z_ON ; if character | ||
| 522 | ZOFF: INC SI ; is below | ||
| 523 | JMP GET_CHAR_X ; 20h. | ||
| 524 | ; ( End of line | ||
| 525 | TURN_Z_ON: CMP AL,AL ; delimiters ). | ||
| 526 | GET_CHAR_X: RET | ||
| 527 | |||
| 528 | GET_CHAR ENDP | ||
| 529 | |||
| 530 | |||
| 531 | ;******************************************************** | ||
| 532 | ;** IS_ALPHA : a routine to check the character in ** | ||
| 533 | ;** AL if it is an alpha character (a...z,A...Z). ** | ||
| 534 | ;** If character is lower case, convert to upper case. ** | ||
| 535 | ;******************************************************** | ||
| 536 | |||
| 537 | IS_ALPHA PROC | ||
| 538 | |||
| 539 | PUSH AX ; Save value of AL | ||
| 540 | AND AL,0DFH ; Convert to upper case | ||
| 541 | CMP AL,'A' ; If <'A', then | ||
| 542 | JB IS_ALPHA_X ; NZ-flag is set, exit | ||
| 543 | CMP AL,'Z' ; If >'Z', then | ||
| 544 | JA IS_ALPHA_X ; NZ-flag is set, exit | ||
| 545 | CMP AL,AL ; Force Z-flag | ||
| 546 | POP DX ; Discard lower case. | ||
| 547 | JMP IA_X ; Exit. | ||
| 548 | IS_ALPHA_X: POP AX ; Restore value of AL | ||
| 549 | IA_X: RET | ||
| 550 | |||
| 551 | IS_ALPHA ENDP | ||
| 552 | |||
| 553 | |||
| 554 | ;******************************************************** | ||
| 555 | ;** IS_DIGIT : a routine to check if the character in ** | ||
| 556 | ;** AL register is a digit (i.e. 1..9). ** | ||
| 557 | ;******************************************************** | ||
| 558 | |||
| 559 | IS_DIGIT PROC | ||
| 560 | |||
| 561 | CMP AL,'0' ; If < '0' then | ||
| 562 | JB IS_NUM_X ; NZ-flag is set, exit | ||
| 563 | CMP AL,'9' ; If > '9' then | ||
| 564 | JA IS_NUM_X ; NZ-flag is set, exit | ||
| 565 | CMP AL,AL ; Set Z-flag to indecate digit | ||
| 566 | IS_NUM_X: RET | ||
| 567 | |||
| 568 | IS_DIGIT ENDP | ||
| 569 | |||
| 570 | |||
| 571 | ;******************************************************** | ||
| 572 | ;** IS_DELIM : This routine check if the character in ** | ||
| 573 | ;** AL is a delimiter. ('+',' ',';',',','=',tab) ** | ||
| 574 | ;******************************************************** | ||
| 575 | |||
| 576 | IS_DELIM PROC | ||
| 577 | |||
| 578 | CMP AL,' ' ; Test for space. | ||
| 579 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 580 | CMP AL,',' ; Test for comma. | ||
| 581 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 582 | CMP AL,';' ; Test for semicolon. | ||
| 583 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 584 | CMP AL,'=' ; Test for equal sign. | ||
| 585 | JE IS_DELIM_X ; Z-flag is set, exit | ||
| 586 | CMP AL,09h ; Test for TAB. | ||
| 587 | |||
| 588 | IS_DELIM_X: RET ; Exit | ||
| 589 | |||
| 590 | IS_DELIM ENDP | ||
| 591 | |||
| 592 | |||
| 593 | ;******************************************************** | ||
| 594 | ;** DEVICE_PARSE : Parse the device driver name and ** | ||
| 595 | ;** store in table. Update offset. ** | ||
| 596 | ;******************************************************** | ||
| 597 | |||
| 598 | DEVICE_PARSE PROC | ||
| 599 | |||
| 600 | MOV DI,TABLE_2 | ||
| 601 | MOV DS:WORD PTR [DI],0008H ; Save dev name size. | ||
| 602 | ADD DI,02H ; Increment DI. | ||
| 603 | MOV CX,9 ; Set counter. | ||
| 604 | NEXT_C: CALL IS_ALPHA ; if Check then. | ||
| 605 | JZ SAVE_C ; Save it. | ||
| 606 | CALL IS_DIGIT ; if Digit then. | ||
| 607 | JZ SAVE_C ; Save it. | ||
| 608 | CMP AL,'-' ; If '-' then. | ||
| 609 | JZ SAVE_C ; Save it. | ||
| 610 | CALL IS_DELIM ; If a delimiter then. | ||
| 611 | JZ ADD_SPACE1 ; Pad with spaces. | ||
| 612 | CMP AL,':' ; If a colon | ||
| 613 | JE ADD_SPACE1 ; then end device parse | ||
| 614 | JMP ERR_DEV_PAR ; Else an error. | ||
| 615 | |||
| 616 | SAVE_C: DEC CX ; Decrement counter. | ||
| 617 | CMP CX,0 ; If counter zero then. | ||
| 618 | JE ERR_DEV_PAR ; Error. | ||
| 619 | MOV DS:BYTE PTR [DI],AL ; Save char in table. | ||
| 620 | INC DI ; Increment pointer. | ||
| 621 | CALL GET_CHAR ; Get another char. | ||
| 622 | JZ ERR_DEV_PAR | ||
| 623 | JMP NEXT_C ; Check char. | ||
| 624 | |||
| 625 | ERR_DEV_PAR: MOV DEV_ERR_FLG,01H ; Set error flag. | ||
| 626 | JMP DEV_PAR_X ; Exit. | ||
| 627 | |||
| 628 | ADD_SPACE1: DEC CX ; Check counter. | ||
| 629 | CMP CX,1 | ||
| 630 | JL DEV_PAR_X ; Exit if already 8. | ||
| 631 | LL1: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. | ||
| 632 | INC DI ; Increment pointer. | ||
| 633 | LOOP LL1 ; Loop again. | ||
| 634 | DEV_PAR_X: RET | ||
| 635 | |||
| 636 | DEVICE_PARSE ENDP | ||
| 637 | |||
| 638 | |||
| 639 | ;******************************************************** | ||
| 640 | ;** ID_PARSE : Parse the id driver name and ** | ||
| 641 | ;** store in table. Update offset. ** | ||
| 642 | ;******************************************************** | ||
| 643 | |||
| 644 | ID_PARSE PROC | ||
| 645 | |||
| 646 | MOV DI,TABLE_3 | ||
| 647 | MOV DS:WORD PTR [DI],0008H ; Save dev name size. | ||
| 648 | ADD DI,02H ; Increment DI. | ||
| 649 | MOV RIGHT_FLAG,00H ; Clear flag. | ||
| 650 | MOV CX,9 ; Set counter. | ||
| 651 | |||
| 652 | NEXT_I: CALL IS_ALPHA ; If Check then. | ||
| 653 | JZ SAVE_I ; Save it. | ||
| 654 | CALL IS_DIGIT ; if Digit then. | ||
| 655 | JZ SAVE_I ; Save it. | ||
| 656 | CMP AL,'-' ; If '-' then. | ||
| 657 | JZ SAVE_I ; Save it. | ||
| 658 | CMP AL,'(' ; If '(' then. | ||
| 659 | JE RIG_BR_FLG ; Set flag. | ||
| 660 | CMP AL,')' ; If ')' then | ||
| 661 | JE BR_FLG_LEF ; Pad with spaces. | ||
| 662 | CALL IS_DELIM ; If a delimiter then. | ||
| 663 | JZ ADD_SPACE2 ; Pad with spaces. | ||
| 664 | JMP ERR_ID_PAR ; Else an error. | ||
| 665 | |||
| 666 | SAVE_I: DEC CX ; Decrement counter. | ||
| 667 | CMP CX,0 ; If counter zero then. | ||
| 668 | JLE ERR_ID_PAR ; Error. | ||
| 669 | MOV DS:BYTE PTR [DI],AL ; Save char in table. | ||
| 670 | INC DI ; Increment pointer. | ||
| 671 | CALL GET_CHAR ; Get another char. | ||
| 672 | JZ ADD_SPACE2 ; Exit routine. | ||
| 673 | JMP NEXT_I ; Check char. | ||
| 674 | |||
| 675 | ERR_ID_PAR: MOV ID_ERR_FLG,01H ; Set error falg on. | ||
| 676 | JMP ID_PAR_X ; Exit. | ||
| 677 | |||
| 678 | BR_FLG_LEF: CMP RIGHT_FLAG,01H ; If left bracket was | ||
| 679 | JNE ERR_ID_PAR ; found and no previous | ||
| 680 | JMP ADD_SPACE2 ; Bracket found, then error | ||
| 681 | |||
| 682 | RIG_BR_FLG: CMP RIGHT_FLAG,01H ; If more than one bracket | ||
| 683 | JE ERR_ID_PAR ; then error. | ||
| 684 | CMP CX,09 ; If '(' and already id | ||
| 685 | JB ERR_ID_PAR ; then error. | ||
| 686 | MOV RIGHT_FLAG,01H ; Set flag for. | ||
| 687 | CALL GET_CHAR ; Left brackets. | ||
| 688 | JZ ERR_ID_PAR ; If end of line,exit. | ||
| 689 | JMP NEXT_I ; Check character. | ||
| 690 | |||
| 691 | ADD_SPACE2: DEC CX ; Check counter. | ||
| 692 | CMP CX,1 | ||
| 693 | JL ID_PAR_X ; Exit if already 8. | ||
| 694 | |||
| 695 | LL2: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. | ||
| 696 | INC DI ; Increment pointer. | ||
| 697 | LOOP LL2 ; Loop again. | ||
| 698 | |||
| 699 | ID_PAR_X: RET | ||
| 700 | |||
| 701 | ID_PARSE ENDP | ||
| 702 | |||
| 703 | ;******************************************************** | ||
| 704 | ;** HWCP_PARMS : Scane for the hardware code page, and ** | ||
| 705 | ;** parse it if found. Flag codes set to: ** | ||
| 706 | ;** ERROR_FLAG = 0 - parsing completed. No error. ** | ||
| 707 | ;** ERROR_FLAG = 1 - error found exit parse. ** | ||
| 708 | ;** ERROR_FLAG = 2 - end of line found, exit parse. ** | ||
| 709 | ;******************************************************** | ||
| 710 | |||
| 711 | |||
| 712 | HWCP_PARMS PROC | ||
| 713 | |||
| 714 | MOV COMMA_FLAG,00H ; Set the comma flag off. | ||
| 715 | MOV ERROR_FLAG,00H ; Set the error flag off. | ||
| 716 | DEC SI ; Point at current char in Al. | ||
| 717 | CMP RIGHT_FLAG,01H ; If no left brackets then | ||
| 718 | JNE LEFT_BR ; Exit parse. | ||
| 719 | |||
| 720 | HWCP_1: CALL GET_CHAR ; Load character in AL. | ||
| 721 | JZ LEFT_BR ; Exit, if end of line. | ||
| 722 | CALL IS_DIGIT ; Check if digit, then | ||
| 723 | JE HP1 ; Parse hwcp parms. | ||
| 724 | CMP AL,',' ; If a comma | ||
| 725 | JE COMMA_1 ; Jump to comma_1 | ||
| 726 | CMP AL,')' ; If a ')' then | ||
| 727 | JE RIGHT_BR ; end of current dev parms. | ||
| 728 | CMP AL,'(' ; If a '(' then | ||
| 729 | JE HWCP_2 ; There are multible hwcp. | ||
| 730 | CALL IS_DELIM ; Else, if not a delimiter | ||
| 731 | JNE EXIT_2 ; Then error, exit | ||
| 732 | JMP HWCP_1 ; Get another character. | ||
| 733 | |||
| 734 | LEFT_BR: CMP RIGHT_FLAG,01H ; If no left bracket | ||
| 735 | JE EXIT_2 ; Then error, exit | ||
| 736 | JMP RB1 ; Jump to rb1 | ||
| 737 | |||
| 738 | COMMA_1: CMP COMMA_FLAG,01H ; If comma flag set | ||
| 739 | JE COM_2_HC ; Then exit hwcp parse. | ||
| 740 | MOV COMMA_FLAG,01H ; Else set comma flag. | ||
| 741 | JMP HWCP_1 ; Get another character. | ||
| 742 | |||
| 743 | HWCP_2: CMP RIGHT_FLAG,01H ; If left bracket not set | ||
| 744 | JNE EXIT_2 ; then error. | ||
| 745 | CALL MUL_HWCP ; else call multiple hwcp | ||
| 746 | ADD DI,02H ; routine. Increment DI | ||
| 747 | MOV TABLE_5,DI ; Desg. Table starts at end | ||
| 748 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 749 | JMP HP_X ; Exit. | ||
| 750 | |||
| 751 | HP1: JMP HWCP ; Jump too long. | ||
| 752 | |||
| 753 | COM_2_HC: MOV DI,TABLE_4 ; DI points at hwcp table | ||
| 754 | MOV DS:WORD PTR [DI],0000H ; Set number of pages to | ||
| 755 | MOV COMMA_FLAG,00H ; Zero and reset comma flag. | ||
| 756 | ADD DI,02H ; Increment DI. | ||
| 757 | MOV TABLE_5,DI ; Desg. Table starts at end | ||
| 758 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 759 | JMP HP_X ; of hwcp table. Exit. | ||
| 760 | |||
| 761 | RIGHT_BR: CMP RIGHT_FLAG,01H ; If left brackets not | ||
| 762 | JNE EXIT_2 ; Found then error. | ||
| 763 | RB1: MOV ERROR_FLAG,02H ; Set end of line flag. | ||
| 764 | MOV BX,TABLE_4 ; Point at hwcp table | ||
| 765 | ADD BX,02H ; Adjust pointer to desg | ||
| 766 | MOV TABLE_5,BX ; table, and save in table_5 | ||
| 767 | MOV DI,TABLE_1 ; Point at table of offsets | ||
| 768 | ADD DI,08H ; Set at DESG offset | ||
| 769 | MOV DS:WORD PTR [DI],BX ; Update table. | ||
| 770 | JMP HP_X ; Exit | ||
| 771 | |||
| 772 | |||
| 773 | |||
| 774 | EXIT_2: MOV ERROR_FLAG,01H ; Set error flag. | ||
| 775 | JMP HP_X ; and exit. | ||
| 776 | |||
| 777 | HWCP: CMP RIGHT_FLAG,01H ; If left brackets not | ||
| 778 | JNE EXIT_2 ; Found then error. | ||
| 779 | CALL HWCP_PARSE ; Call parse one hwcp. | ||
| 780 | CMP ERROR_FLAG,01H ; If error flag set | ||
| 781 | JE HP_X ; Then exit, else | ||
| 782 | CALL OFFSET_TABLE ; Update table of offsets. | ||
| 783 | |||
| 784 | HP_X: RET | ||
| 785 | |||
| 786 | HWCP_PARMS ENDP | ||
| 787 | |||
| 788 | |||
| 789 | ;******************************************************** | ||
| 790 | ;** HWCP_PARSE : Parse the hardware code page page ** | ||
| 791 | ;** number and change it from hex to binary. ** | ||
| 792 | ;******************************************************** | ||
| 793 | |||
| 794 | HWCP_PARSE PROC | ||
| 795 | |||
| 796 | MOV DI,TABLE_4 ; Load address of hwcpages. | ||
| 797 | ADD DS:WORD PTR [DI],0001H ; Set count to 1 | ||
| 798 | |||
| 799 | CALL GET_NUMBER ; Convert number to binary. | ||
| 800 | CMP ERROR_FLAG,01H ; If error then | ||
| 801 | JE HWCP_X ; Exit. | ||
| 802 | MOV DS:WORD PTR [DI+2],BX ; Else, save binary page number | ||
| 803 | ADD DI,04H ; Increment counter | ||
| 804 | MOV TABLE_5,DI ; Set pointer of designate num | ||
| 805 | |||
| 806 | HWCP_X: RET | ||
| 807 | |||
| 808 | HWCP_PARSE ENDP | ||
| 809 | |||
| 810 | |||
| 811 | ;******************************************************** | ||
| 812 | ;** MUL_HWCP : Parse multiple hardware code pages ** | ||
| 813 | ;** and convert them from hex to binary numbers. ** | ||
| 814 | ;******************************************************** | ||
| 815 | |||
| 816 | MUL_HWCP PROC | ||
| 817 | |||
| 818 | MOV DI,TABLE_4 ; Load offset of table_4 | ||
| 819 | MOV BX,DI ; in DI and Bx. | ||
| 820 | MOV HWCP_FLAG,00H ; Set hwcp flag off. | ||
| 821 | |||
| 822 | MH1: CALL GET_CHAR ; Load character in AL. | ||
| 823 | JZ MH3 ; Exit if end of line. | ||
| 824 | CMP AL,')' ; If ')' then exit | ||
| 825 | JE MH2 ; end of parms. | ||
| 826 | CALL IS_DIGIT ; If a digit, then | ||
| 827 | JE MH4 ; Convert number to binary. | ||
| 828 | CALL IS_DELIM ; If not a delimiter | ||
| 829 | JNE MH3 ; then error, exit | ||
| 830 | JMP MH1 ; get another character. | ||
| 831 | |||
| 832 | MH2: CALL GET_CHAR ; Get next character | ||
| 833 | JMP MH_X ; and exit. | ||
| 834 | |||
| 835 | MH3: MOV ERROR_FLAG,01H ; Set error flag on. | ||
| 836 | JMP MH_X ; Exit. | ||
| 837 | |||
| 838 | MH4: ADD HWCP_FLAG,01H ; Set hwcp flag on (0 off) | ||
| 839 | ADD DI,02H ; Increment table pointer | ||
| 840 | PUSH BX ; Save Bx | ||
| 841 | CALL GET_NUMBER ; Convert number to binary. | ||
| 842 | MOV DS:WORD PTR [DI],BX ; Add number to table | ||
| 843 | POP BX ; Restore BX. | ||
| 844 | CMP ERROR_FLAG,01H ; If error then | ||
| 845 | JE MH_X ; Exit. | ||
| 846 | ADD DS:WORD PTR [BX],01H ; Increment hwcp count. | ||
| 847 | DEC SI ; Point at character in AL | ||
| 848 | JMP MH1 ; (delimeter or ')'). | ||
| 849 | MH_X: RET | ||
| 850 | |||
| 851 | MUL_HWCP ENDP | ||
| 852 | |||
| 853 | |||
| 854 | |||
| 855 | ;******************************************************** | ||
| 856 | ;** DESG_PARMS : Scane for the designate numbers, and ** | ||
| 857 | ;** parse it if found. Flag codes set to: ** | ||
| 858 | ;** ERROR_FLAG = 0 - parsing completed. No error. ** | ||
| 859 | ;** ERROR_FLAG = 1 - error found exit parse. ** | ||
| 860 | ;** ERROR_FLAG = 2 - end of line found, exit parse. ** | ||
| 861 | ;******************************************************** | ||
| 862 | |||
| 863 | |||
| 864 | DESG_PARMS PROC | ||
| 865 | |||
| 866 | MOV DI,TABLE_1 ; Get offset of dev in DI | ||
| 867 | MOV BX,TABLE_5 ; & offset of desg. in BX. | ||
| 868 | ADD DI,08 ; Location of desg offset in table. | ||
| 869 | MOV DS:WORD PTR [DI],BX ; Update table. | ||
| 870 | MOV COMMA_FLAG,00H ; Set comma flag off. | ||
| 871 | |||
| 872 | cmp al,'(' | ||
| 873 | je df | ||
| 874 | cmp al,')' | ||
| 875 | je right_br2 | ||
| 876 | |||
| 877 | cmp al,',' | ||
| 878 | jne desg_parm1 | ||
| 879 | mov comma_flag,01h | ||
| 880 | |||
| 881 | DESG_PARM1: CALL GET_CHAR ; Get character in AL. | ||
| 882 | JZ EXIT_3 ; Error, if end of line | ||
| 883 | CALL IS_DIGIT ; If character is a digit | ||
| 884 | JE DESG ; Then convert to binary. | ||
| 885 | CMP AL,')' ; If a ')', then | ||
| 886 | JE RIGHT_BR2 ; end of parameters. | ||
| 887 | CMP AL,'(' ; If a '(' then | ||
| 888 | JE DF ; parse desg and font. | ||
| 889 | CMP AL,',' ; If a comma then | ||
| 890 | JE DP3 ; set flag. | ||
| 891 | CALL IS_DELIM ; If not a delimiter | ||
| 892 | JNE EXIT_3 ; then error. | ||
| 893 | JMP DESG_PARM1 ; Get another character. | ||
| 894 | |||
| 895 | RIGHT_BR2: CMP RIGHT_FLAG,01H ; IF no '(' encountered, | ||
| 896 | JNE EXIT_3 ; then error, exit | ||
| 897 | JMP DP_x ; Jump to DP1. | ||
| 898 | |||
| 899 | EXIT_3: MOV ERROR_FLAG,01H ; Set error flag on | ||
| 900 | JMP DP_X ; Exit. | ||
| 901 | |||
| 902 | DF: CMP RIGHT_FLAG,01H ; If no '(' encountered | ||
| 903 | JB EXIT_3 ; then error, exit | ||
| 904 | CALL DESG_FONT ; Parse desg and font. | ||
| 905 | JMP DP1 ; Jump to DP1. | ||
| 906 | |||
| 907 | DP2: CALL FIND_RIGHT_BR ; Check for ')' | ||
| 908 | JMP DP_X ; Exit. | ||
| 909 | |||
| 910 | DP3: CMP COMMA_FLAG,01H ; If comma flag set | ||
| 911 | JE DP2 ; then error | ||
| 912 | MOV COMMA_FLAG,01H ; Else set comma flag on. | ||
| 913 | JMP DESG_PARM1 ; Get another character. | ||
| 914 | |||
| 915 | DESG: MOV ERROR_FLAG,00H ; Set error flag off. | ||
| 916 | CALL DESG_PARSE ; Parse desg. | ||
| 917 | DP1: CMP ERROR_FLAG,01H ; If error flag on then | ||
| 918 | JE DP_X ; Exit, | ||
| 919 | CALL FIND_RIGHT_BR ; Else check for ')' | ||
| 920 | CALL OFFSET_TABLE ; Update table | ||
| 921 | |||
| 922 | DP_X: RET | ||
| 923 | |||
| 924 | DESG_PARMS ENDP | ||
| 925 | |||
| 926 | |||
| 927 | |||
| 928 | ;******************************************************** | ||
| 929 | ;** DESG_FONT : Parse the designate and font numbers & ** | ||
| 930 | ;** change them from decimal to binary. ** | ||
| 931 | ;******************************************************** | ||
| 932 | |||
| 933 | |||
| 934 | DESG_FONT PROC | ||
| 935 | |||
| 936 | |||
| 937 | MOV DI,TABLE_5 ; Get desg font table. | ||
| 938 | MOV COMMA_FLAG,00H ; Set comma flag off. | ||
| 939 | DF1: CALL GET_CHAR ; Load a character in AL. | ||
| 940 | JZ DF3 ; Error if end of line. | ||
| 941 | CMP AL,',' ; Check if a comma. | ||
| 942 | JE DF2 ; Set flag. | ||
| 943 | CALL IS_DIGIT ; If a digit, then | ||
| 944 | JE DF5 ; Convert number to binary. | ||
| 945 | CMP AL,')' ; If a ')' then | ||
| 946 | JE DF4 ; Exit. | ||
| 947 | CALL IS_DELIM ; If not a delimiter | ||
| 948 | JNE DF3 ; then error, exit | ||
| 949 | JMP DF1 ; Get another character. | ||
| 950 | |||
| 951 | DF2: CMP COMMA_FLAG,01H ; If comma flag on | ||
| 952 | JE DF3 ; then error, exit | ||
| 953 | MOV COMMA_FLAG,01H ; Set comma flag on | ||
| 954 | ADD DS:WORD PTR [DI],01H ; Increment desg counter. | ||
| 955 | MOV DS:WORD PTR [DI+2],0FFFFH ; Load ffffh for desg empty | ||
| 956 | JMP DF1 ; field. | ||
| 957 | |||
| 958 | DF3: MOV ERROR_FLAG,01H ; Set error flag on. | ||
| 959 | JMP DF_X ; Exit. | ||
| 960 | |||
| 961 | DF4: CMP DESG_FLAG,00H ; If desg flag off | ||
| 962 | JE DF3 ; then error, exit | ||
| 963 | JMP DF_X ; Else exit. | ||
| 964 | |||
| 965 | DF5: ADD DS:WORD PTR [DI],01H ; Increment desg font count. | ||
| 966 | CMP DESG_FLAG,01H ; If desg flag is on | ||
| 967 | JE DF6 ; then get font. | ||
| 968 | CMP COMMA_FLAG,01H ; if comma flag is on | ||
| 969 | JE DF6 ; then get font. | ||
| 970 | MOV DESG_FLAG,01H ; Set desg flag on | ||
| 971 | JMP DF7 ; Get desg number. | ||
| 972 | |||
| 973 | DF6: ADD DI,02H ; adjust pointer to font. | ||
| 974 | MOV DESG_FLAG,02H ; Set desg and font flag. | ||
| 975 | DF7: CALL GET_NUMBER ; Get a number & convert to | ||
| 976 | CMP ERROR_FLAG,01H ; binary. | ||
| 977 | JE DF_X ; If error flag set, Exit. | ||
| 978 | MOV DS:WORD PTR [DI+2],BX ; Store number in table. | ||
| 979 | CMP DESG_FLAG,02H ; If desg and font flag | ||
| 980 | JNE DF1 ; not set, then get char. | ||
| 981 | CALL FIND_RIGHT_BR ; Check for right bracket. | ||
| 982 | |||
| 983 | DF_X: RET | ||
| 984 | |||
| 985 | DESG_FONT ENDP | ||
| 986 | |||
| 987 | |||
| 988 | ;******************************************************** | ||
| 989 | ;** DESG_PARSE : Parse the designate number and ** | ||
| 990 | ;** change it from decimal to binary. ** | ||
| 991 | ;******************************************************** | ||
| 992 | |||
| 993 | DESG_PARSE PROC | ||
| 994 | |||
| 995 | MOV DI,TABLE_5 ; Load designate location | ||
| 996 | ADD DS:WORD PTR [DI],0001H ; Update table count. | ||
| 997 | |||
| 998 | CALL GET_NUMBER ; Get the ascii number and | ||
| 999 | CMP ERROR_FLAG,01H ; conver it to binary | ||
| 1000 | JE DESG_X ; If error then exit | ||
| 1001 | |||
| 1002 | MOV DS:WORD PTR [DI+2],BX ; Else, save desg number | ||
| 1003 | |||
| 1004 | |||
| 1005 | DESG_X: RET | ||
| 1006 | |||
| 1007 | DESG_PARSE ENDP | ||
| 1008 | |||
| 1009 | |||
| 1010 | ;******************************************************** | ||
| 1011 | ;** GET_NUMBER : Convert the number pointed to by SI ** | ||
| 1012 | ;** to a binary number and store it in BX ** | ||
| 1013 | ;******************************************************** | ||
| 1014 | |||
| 1015 | GET_NUMBER PROC | ||
| 1016 | |||
| 1017 | MOV CX,0AH ; Set multiplying factor | ||
| 1018 | XOR BX,BX ; Clear DX | ||
| 1019 | |||
| 1020 | NEXT_NUM: SUB AL,30H ; Conver number to binary | ||
| 1021 | CBW ; Clear AH | ||
| 1022 | XCHG AX,BX ; Switch ax and bx to mul | ||
| 1023 | MUL CX ; already converted number by 10. | ||
| 1024 | JO ERR_NUM ; On over flow jump to error. | ||
| 1025 | ADD BX,AX ; Add number to total. | ||
| 1026 | JC ERR_NUM ; On over flow jump to error. | ||
| 1027 | XOR AX,AX ; Clear AX (clear if al=0a). | ||
| 1028 | CALL GET_CHAR ; Get next character | ||
| 1029 | JZ GET_NUM_X ; Exit, if end of line. | ||
| 1030 | CALL IS_DIGIT ; Call is digit. | ||
| 1031 | JNZ GET_NUM_X ; Exit if not a number. | ||
| 1032 | JMP NEXT_NUM ; Loop. | ||
| 1033 | |||
| 1034 | ERR_NUM: MOV ERROR_FLAG,01H ; Set error code to 1. | ||
| 1035 | |||
| 1036 | GET_NUM_X: RET | ||
| 1037 | |||
| 1038 | GET_NUMBER ENDP | ||
| 1039 | |||
| 1040 | |||
| 1041 | ;******************************************************** | ||
| 1042 | ;** UPDATE_TABLE : This routine set up pointers to the ** | ||
| 1043 | ;** different offsets of the different tables ** | ||
| 1044 | ;******************************************************** | ||
| 1045 | |||
| 1046 | UPDATE_TABLE PROC | ||
| 1047 | |||
| 1048 | MOV DS:WORD PTR [DI],BX ; Offset of offsets | ||
| 1049 | MOV TABLE_1,BX ; Table_1 points at offsets | ||
| 1050 | |||
| 1051 | MOV DI,BX ; | ||
| 1052 | ADD BX,0CH ; | ||
| 1053 | MOV DS:WORD PTR [DI+2],BX ; Offset of DEVICE name. | ||
| 1054 | MOV TABLE_2,BX ; Table_2 point at device name. | ||
| 1055 | |||
| 1056 | ADD BX,0AH ; | ||
| 1057 | MOV DS:WORD PTR [DI+4],BX ; Offset of ID name. | ||
| 1058 | MOV TABLE_3,BX ; Table_3 point at ID name. | ||
| 1059 | |||
| 1060 | ADD BX,0AH ; | ||
| 1061 | MOV DS:WORD PTR [DI+6],BX ; Offset of HWCP pages. | ||
| 1062 | MOV TABLE_4,BX ; Table_4 point at HWCP pages. | ||
| 1063 | |||
| 1064 | RET | ||
| 1065 | |||
| 1066 | UPDATE_TABLE ENDP | ||
| 1067 | |||
| 1068 | |||
| 1069 | ;******************************************************** | ||
| 1070 | ;** OFFSET_TABLE : This routine set up pointers of ** | ||
| 1071 | ;** tables number one and two. ** | ||
| 1072 | ;******************************************************** | ||
| 1073 | |||
| 1074 | OFFSET_TABLE PROC | ||
| 1075 | |||
| 1076 | MOV DI,TABLE_1 ; Increment the number | ||
| 1077 | ADD DS:WORD PTR [DI],01H ; of parms foun. (ie. id,hwcp | ||
| 1078 | RET ; and desg) | ||
| 1079 | |||
| 1080 | OFFSET_TABLE ENDP | ||
| 1081 | |||
| 1082 | |||
| 1083 | ;******************************************************** | ||
| 1084 | ;** FIND_RIGHT_BR :This routine scane the line for a ** | ||
| 1085 | ;** ')' if cannot find it turns error flag on ** | ||
| 1086 | ;******************************************************** | ||
| 1087 | |||
| 1088 | FIND_RIGHT_BR PROC | ||
| 1089 | |||
| 1090 | FBR1: CMP AL,')' ; If a right bracket | ||
| 1091 | JE FBR_X ; then exit. | ||
| 1092 | CMP AL,' ' ; If not a space | ||
| 1093 | JNE FBR2 ; Then error. | ||
| 1094 | CALL GET_CHAR ; Get a character | ||
| 1095 | JZ FBR2 ; If end of line then exit. | ||
| 1096 | JMP FBR1 ; Else get another character. | ||
| 1097 | |||
| 1098 | FBR2: MOV ERROR_FLAG,01H ; Set error flag on | ||
| 1099 | FBR_X: MOV AL,20H ; Erase character from AL. | ||
| 1100 | RET | ||
| 1101 | |||
| 1102 | FIND_RIGHT_BR ENDP | ||
| 1103 | |||
| 1104 | |||
| 1105 | PROGRAM ENDS | ||
| 1106 | END START | ||
diff --git a/v4.0/src/DEV/PRINTER/PARSER.ASM b/v4.0/src/DEV/PRINTER/PARSER.ASM new file mode 100644 index 0000000..f299838 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PARSER.ASM | |||
| @@ -0,0 +1,668 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE PARSE CODE AND CONTROL BLOCKS FOR PRINTER.SYS | ||
| 3 | |||
| 4 | ;****************** START OF SPECIFICATIONS ************************** | ||
| 5 | ; | ||
| 6 | ; MODULE NAME: PARSER.ASM | ||
| 7 | ; | ||
| 8 | ; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR | ||
| 9 | ; PRINTER.SYS | ||
| 10 | ; | ||
| 11 | ; FUNCTION: THE COMMAND LINE PASSED TO PRINTER.SYS IN THE CONFIG.SYS | ||
| 12 | ; STATEMENT IS PARSED TO CHECK FOR CORRECT SYNTAX. A TABLE | ||
| 13 | ; IS SETUP CONTAINING THE VALUES FOUND. | ||
| 14 | ; | ||
| 15 | ; ENTRY POINT: PARSER | ||
| 16 | ; | ||
| 17 | ; INPUT: ES:DI POINTS TO REQUEST HEADER | ||
| 18 | ; | ||
| 19 | ; AT EXIT: | ||
| 20 | ; NORMAL: TABLE SET UP WITH VALUES FOUND. | ||
| 21 | ; | ||
| 22 | ; ERROR: 0 RETURNED IN FIRST WORD OF TABLE. | ||
| 23 | ; | ||
| 24 | ; INTERNAL REFERENCES: | ||
| 25 | ; | ||
| 26 | ; ROUTINES: SYSPARSE - PARSING CODE | ||
| 27 | ; | ||
| 28 | ; DATA AREAS: PARMSx - PARSE CONTROL BLOCK FOR SYSPARSE | ||
| 29 | ; | ||
| 30 | ; EXTERNAL REFERENCES: | ||
| 31 | ; | ||
| 32 | ; ROUTINES: N/A | ||
| 33 | ; | ||
| 34 | ; DATA AREAS: TABLE - TO CONTAIN VALUES FOUND IN DEVICE= LINE | ||
| 35 | ; | ||
| 36 | ; NOTES: | ||
| 37 | ; | ||
| 38 | ; REVISION HISTORY: | ||
| 39 | ; AN000; - DOS Version 4.00 | ||
| 40 | ; AN001 - GHG Changes had to made for P897. The PARSER was | ||
| 41 | ; changed to need the '=' in the keywords. | ||
| 42 | ; | ||
| 43 | ; Label: "DOS DISPLAY.SYS Device Driver" | ||
| 44 | ; "Version 4.00 (C) Copyright 1988 Microsoft | ||
| 45 | ; "Licensed Material - Program Property of Microsoft" | ||
| 46 | ; | ||
| 47 | ; | ||
| 48 | ;****************** END OF SPECIFICATIONS **************************** | ||
| 49 | ;*Modification history ******************************************************** | ||
| 50 | ;AN001; p1482 - PRINTER.SYS refused to initialize 10/6/87 J.K. | ||
| 51 | ;AN002; p2686 No range checking on n parameter for printer.sys 12/11/87 J.K. | ||
| 52 | ;****************************************************************************** | ||
| 53 | |||
| 54 | |||
| 55 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 56 | ; | ||
| 57 | ; The following is the table structure of the parser. All fields are | ||
| 58 | ; two bytes field (accept for the device and id name) | ||
| 59 | ; | ||
| 60 | ; TABLE HEADER : | ||
| 61 | ; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ | ||
| 62 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 63 | ; ³ N = Number of devices. ³ | ||
| 64 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 65 | ; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 66 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ | ||
| 67 | ; ³ Device # 2 offset ³ ³ Table_1 (a) ³ | ||
| 68 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ | ||
| 69 | ; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 70 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 71 | ; ³ Device # 4 offset ³ | ||
| 72 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 73 | ; | ||
| 74 | ; | ||
| 75 | ; N = 1,2,3 or 4. A two bytes number indicating the number of device specified. | ||
| 76 | ; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset | ||
| 77 | ; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1 | ||
| 78 | ; (b)...etc.). If an error was detected in the command N is set to zero. | ||
| 79 | ; | ||
| 80 | ; | ||
| 81 | ; | ||
| 82 | ; TABLE_1 : | ||
| 83 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 84 | ; | ||
| 85 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 86 | ; ³ N = Number of Offsets. ³ ³ ³ | ||
| 87 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³ | ||
| 88 | ; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³ | ||
| 89 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 90 | ; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿ | ||
| 91 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 92 | ; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³ | ||
| 93 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³ | ||
| 94 | ; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³ | ||
| 95 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 96 | ; ³ "Reserved" ³ ³ ³ | ||
| 97 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 98 | ; ³ ³ ³ ³ | ||
| 99 | ; ³ ÀÄÄÄÄÄij Table_4 (a) ³ | ||
| 100 | ; ³ ³ ³ | ||
| 101 | ; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 102 | ; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 103 | ; ³ ³ ³ | ||
| 104 | ; ÀÄÄÄÄÄÄÄij Table_5 (a) ³ | ||
| 105 | ; ³ ³ | ||
| 106 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 107 | ; | ||
| 108 | ; | ||
| 109 | ; N=Length of table_1, or the number of offsets contained in table_1. | ||
| 110 | ; The offsets are pointers (two bytes) to the parameters value of the device. | ||
| 111 | ; "Reserved" : a two byte memory reserved for future use of the "PARMS" option. | ||
| 112 | ; | ||
| 113 | ; | ||
| 114 | ; TABLE_2 : | ||
| 115 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 116 | ; | ||
| 117 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 118 | ; ³ N = Length of devices name ³ | ||
| 119 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 120 | ; ³ Device name ³ | ||
| 121 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 122 | ; | ||
| 123 | ; N = Length of device name. Device length is always 8 byte long. | ||
| 124 | ; Device Name : the name of the device (eg. LPT1, CON, PRN). The name | ||
| 125 | ; is paded with spaces to make up the rest of the 8 characters. | ||
| 126 | ; | ||
| 127 | ; | ||
| 128 | ; | ||
| 129 | ; TABLE_3 : | ||
| 130 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 131 | ; | ||
| 132 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 133 | ; ³ N = Length of Id name. ³ | ||
| 134 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 135 | ; ³ Id Name ³ | ||
| 136 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 137 | ; | ||
| 138 | ; N = Length of id name. Id name length is always 8 byte long. | ||
| 139 | ; Id Name : the name of the id (eg. EGA, VGA). The name | ||
| 140 | ; is paded with spaces to make up the rest of the 8 character. | ||
| 141 | ; | ||
| 142 | ; | ||
| 143 | ; | ||
| 144 | ; TABLE_4 : | ||
| 145 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 146 | ; | ||
| 147 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 148 | ; ³ N = Length of table. ³ | ||
| 149 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 150 | ; ³ HWCP # 1 ³ | ||
| 151 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 152 | ; ³ HWCP # 2 ³ | ||
| 153 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 154 | ; ³ . ³ | ||
| 155 | ; ³ . ³ | ||
| 156 | ; ³ . ³ | ||
| 157 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 158 | ; ³ HWCP # 10 ³ | ||
| 159 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 160 | ; | ||
| 161 | ; | ||
| 162 | ; N = Length of table in words. Or the number of HWCP's. | ||
| 163 | ; HWCP # N : a hardware code page number converted to binary. The maximum | ||
| 164 | ; number of pages allowed is 10. | ||
| 165 | ; | ||
| 166 | ; | ||
| 167 | ; | ||
| 168 | ; TABLE_5 : | ||
| 169 | ; ÍÍÍÍÍÍÍÍÍ | ||
| 170 | ; | ||
| 171 | ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 172 | ; ³ N = Length of table. ³ | ||
| 173 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 174 | ; ³ Designate ³ | ||
| 175 | ; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ | ||
| 176 | ; ³ Font ³ | ||
| 177 | ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 178 | ; | ||
| 179 | ; N = Lenght of table. 0 - nothing was specified | ||
| 180 | ; 1 - Only a designate was specified. | ||
| 181 | ; 2 - Designate and font were given. If the Desg field | ||
| 182 | ; was left empty in the DEVICE command then the | ||
| 183 | ; Designate field is filled with 0FFFFH. | ||
| 184 | ; Designate, Font : Are the Desg. and Font binary numbers. | ||
| 185 | ; | ||
| 186 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 187 | |||
| 188 | |||
| 189 | .XLIST | ||
| 190 | INCLUDE STRUC.INC ; Structured macros ;AN000; | ||
| 191 | .LIST | ||
| 192 | |||
| 193 | INCLUDE CPSPEQU.INC ;AN000; | ||
| 194 | |||
| 195 | PUBLIC PARSER ; near procedure for parsing DEVICE= statement ;AN000; | ||
| 196 | |||
| 197 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 198 | ; | ||
| 199 | ; Set assemble switches for parse code | ||
| 200 | ; | ||
| 201 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 202 | |||
| 203 | DateSW EQU 0 ;AN000; | ||
| 204 | DrvSW EQU 0 ;AN000; | ||
| 205 | SwSW EQU 0 ;AN000; | ||
| 206 | Val1SW EQU 1 ;;AN002; ;AN000; | ||
| 207 | Val2SW EQU 0 ;AN000; | ||
| 208 | Val3SW EQU 0 ;AN000; | ||
| 209 | |||
| 210 | |||
| 211 | CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000; | ||
| 212 | ASSUME CS:CSEG,DS:NOTHING,ES:NOTHING ;AN000; | ||
| 213 | |||
| 214 | |||
| 215 | EXTRN TABLE:WORD ; table for variable storage used by INIT module. ;AN000; | ||
| 216 | EXTRN DEVICE_NUM:WORD ;AN000; | ||
| 217 | |||
| 218 | .XLIST | ||
| 219 | INCLUDE PARSE.ASM ; Parsing code ;AN000; | ||
| 220 | .LIST | ||
| 221 | |||
| 222 | |||
| 223 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 224 | ; | ||
| 225 | ; PARM control block for parsing PRINTER.SYS - DEVICE= command statement. | ||
| 226 | ; Command line looks like: | ||
| 227 | ; | ||
| 228 | ; DEVICE=[d:][path]PRINTER.SYS LPT#[:]=(type[,[hwcp][,n]]) | ||
| 229 | ; or | ||
| 230 | ; DEVICE=[d:][path]PRINTER.SYS LPT#[:]=(type[,[(hwcp1,hwcp2,...)][,n]]) | ||
| 231 | ; | ||
| 232 | ; The command line will be parsed from left to right, taking care of the | ||
| 233 | ; nesting of complex lists as they occur. | ||
| 234 | ; | ||
| 235 | ; The first level of control blocks is shown below. | ||
| 236 | ; Complex list control blocks follow. | ||
| 237 | ; Null VALUE LIST and RESULT BUFFER are placed after all other PARSE control | ||
| 238 | ; blocks. | ||
| 239 | ; | ||
| 240 | ; d:\path\PRINTER.SYS lpt#=(complex list) | ||
| 241 | ; | ||
| 242 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 243 | |||
| 244 | PARMS1 LABEL WORD ;AN000; | ||
| 245 | DW PARMSX1 ;AN000; | ||
| 246 | DB 0 ; no extra delimeters or EOLs. ;AN000; | ||
| 247 | |||
| 248 | PARMSX1 LABEL BYTE ;AN000; | ||
| 249 | DB 1,1 ; min,max positional operands ;AN000; | ||
| 250 | DW D_NAME ; pointer to control block ;AN000; | ||
| 251 | DB 0 ; no switches ;AN000; | ||
| 252 | DB 1 ; 1 or more keywords ;AN000; | ||
| 253 | DW PRT_LIST ; pointer to control block ;AN000; | ||
| 254 | |||
| 255 | D_NAME LABEL WORD ;AN000; | ||
| 256 | DW 0200H ; file spec ;AN000; | ||
| 257 | DW 0001H ; cap result by file table ;AN000; | ||
| 258 | DW RESULT_BUF ; result ;AN000; | ||
| 259 | DW NOVALS ; no value checking done ;AN000; | ||
| 260 | DB 0 ; no keyword/switch synonyms ;AN000; | ||
| 261 | |||
| 262 | PRT_LIST LABEL WORD ;AN000; | ||
| 263 | DW 0402H ; complex list, repeats allowed ;AN000; | ||
| 264 | DW 0002H ; cap result by char table ;AN000; | ||
| 265 | DW RESULT_BUF ; result ;AN000; | ||
| 266 | DW NOVALS ; no value checking done ;AN000; | ||
| 267 | DB 8 ; 4 keywords ;AN000; | ||
| 268 | DB "PRN=",0 ;GHG Ä¿ ;AN001; | ||
| 269 | DB "LPT1=",0 ;GHG ³ 4 possible keywords ;AN001; | ||
| 270 | DB "LPT2=",0 ;GHG ³ ;AN001; | ||
| 271 | DB "LPT3=",0 ;GHG ÄÙ ;AN001; | ||
| 272 | DB "PRN:=",0 ;GHG Ä¿ ;AN001; | ||
| 273 | DB "LPT1:=",0 ;GHG ³ 4 possible keywords ;AN001; | ||
| 274 | DB "LPT2:=",0 ;GHG ³ with colon ;AN001; | ||
| 275 | DB "LPT3:=",0 ;GHG ÄÙ ;AN001; | ||
| 276 | |||
| 277 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 278 | ; | ||
| 279 | ; PARM control block for second level of nesting. | ||
| 280 | ; ie. complex list from first level of nesting | ||
| 281 | ; | ||
| 282 | ; (type, hwcp or complex list, n) | ||
| 283 | ; | ||
| 284 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 285 | |||
| 286 | PARMS2 LABEL WORD ;AN000; | ||
| 287 | DW PARMSX2 ;AN000; | ||
| 288 | DB 0 ; no extra delimeters or EOLs. ;AN000; | ||
| 289 | |||
| 290 | PARMSX2 LABEL BYTE ;AN000; | ||
| 291 | DB 1,3 ; min,max positional operands ;AN000; | ||
| 292 | DW PRT_TYPE ; pointer to control block ;AN000; | ||
| 293 | DW HWCP ; pointer to control block ;AN000; | ||
| 294 | DW CP_PREPS ; pointer to control block ;AN000; | ||
| 295 | DB 0 ; no switches ;AN000; | ||
| 296 | DB 0 ; no keywords ;AN000; | ||
| 297 | |||
| 298 | PRT_TYPE LABEL BYTE ;AN000; | ||
| 299 | DW 2000H ; sstring ;AN000; | ||
| 300 | DW 0002H ; cap by char table ;AN000; | ||
| 301 | DW RESULT_BUF ; result ;AN000; | ||
| 302 | DW NOVALS ; value list ;AN000; | ||
| 303 | DB 0 ; no keyword/switch synonyms ;AN000; | ||
| 304 | |||
| 305 | HWCP LABEL BYTE ;AN000; | ||
| 306 | DW 8401H ; numeric or complex list (optional) ;AN000; | ||
| 307 | DW 0 ; no functions ;AN000; | ||
| 308 | DW RESULT_BUF ; result ;AN000; | ||
| 309 | DW NOVALS ; no value checking done ;AN000; | ||
| 310 | DB 0 ; no keyword/switch synonyms ;AN000; | ||
| 311 | |||
| 312 | CP_PREPS LABEL BYTE ;AN000; | ||
| 313 | DW 8001H ; numeric (optional) ;AN000; | ||
| 314 | DW 0 ; no functions ;AN000; | ||
| 315 | DW RESULT_BUF ; result ;AN000; | ||
| 316 | DW N_Val_Range ;AN002; value list ;AN000; | ||
| 317 | DB 0 ; no keyword/switch synonyms ;AN000; | ||
| 318 | |||
| 319 | |||
| 320 | N_Val_Range label byte | ||
| 321 | db 1 ;AN002; Range defintion | ||
| 322 | db 1 ;AN002; Number of ranges | ||
| 323 | db 1 ;AN002; item tag | ||
| 324 | dd 0, 12 ;AN002; 0 - 12 | ||
| 325 | |||
| 326 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 327 | ; | ||
| 328 | ; PARM control block for third level of nesting. | ||
| 329 | ; ie. complex list from second nesting level | ||
| 330 | ; | ||
| 331 | ; (hwcp1,hwcp2,...) | ||
| 332 | ; | ||
| 333 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 334 | |||
| 335 | PARMS3 LABEL WORD ;AN000; | ||
| 336 | DW PARMSX3 ;AN000; | ||
| 337 | DB 0 ; no extra delimeters or EOLs. ;AN000; | ||
| 338 | |||
| 339 | PARMSX3 LABEL BYTE ;AN000; | ||
| 340 | DB 1,1 ; min,max positional operands ;AN000; | ||
| 341 | DW HWCPS ; pointer to control block ;AN000; | ||
| 342 | DB 0 ; no switches ;AN000; | ||
| 343 | DB 0 ; no keywords ;AN000; | ||
| 344 | |||
| 345 | HWCPS LABEL BYTE ;AN000; | ||
| 346 | DW 8003H ; numeric, repeats allowed ;AN000; | ||
| 347 | DW 0 ; no functions ;AN000; | ||
| 348 | DW RESULT_BUF ; result ;AN000; | ||
| 349 | DW NOVALS ; no value checking done ;AN000; | ||
| 350 | DB 0 ; no keyword/switch synonyms ;AN000; | ||
| 351 | |||
| 352 | |||
| 353 | ; Null VALUE LIST and RESULT BUFFER for all PARSE control blocks | ||
| 354 | |||
| 355 | |||
| 356 | NOVALS LABEL BYTE ;AN000; | ||
| 357 | DB 0 ; no value checking done ;AN000; | ||
| 358 | |||
| 359 | RESULT_BUF LABEL BYTE ;AN000; | ||
| 360 | RESULT_TYPE DB ? ; type returned (number, string, etc.) ;AN000; | ||
| 361 | DB ? ; matched item tag (if applicable) ;AN000; | ||
| 362 | SYN_PTR DW ? ; synonym ptr (if applicable) ;AN000; | ||
| 363 | RESULT_VAL DD ? ; value ;AN000; | ||
| 364 | |||
| 365 | |||
| 366 | OK_FLAG DB ON ; FLAG INDICATING PARSE STATUS ;AN000; | ||
| 367 | NUM_LOOP DB ZERO ;AN000; | ||
| 368 | |||
| 369 | |||
| 370 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 371 | ; | ||
| 372 | ; PROCEDURE_NAME: PARSER | ||
| 373 | ; | ||
| 374 | ; FUNCTION: | ||
| 375 | ; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST | ||
| 376 | ; BLOCK. | ||
| 377 | ; | ||
| 378 | ; AT ENTRY: ES:DI POINTS TO REQUEST HEADER | ||
| 379 | ; | ||
| 380 | ; AT EXIT: | ||
| 381 | ; NORMAL: TABLE SET UP WITH VALUES FOUND | ||
| 382 | ; | ||
| 383 | ; ERROR: 0 LOADED IN FIRST WORD OF TABLE | ||
| 384 | ; | ||
| 385 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 386 | |||
| 387 | PARSER PROC NEAR ;AN000; | ||
| 388 | PUSH DX ;AN000; | ||
| 389 | PUSH DI ;AN000; | ||
| 390 | PUSH ES ;AN000; | ||
| 391 | PUSH BX ;AN000; | ||
| 392 | PUSH DS ; ;AN000; | ||
| 393 | PUSH SI ; ;AN000; | ||
| 394 | CLD ; ;AN000; | ||
| 395 | LDS SI,RH.RH0_BPBA ; ;AN000; | ||
| 396 | PUSH CS ; establish ES .. ;AN000; | ||
| 397 | POP ES ; addressability to data ;AN000; | ||
| 398 | LEA DI,PARMS1 ; point to PARMS control block ;AN000; | ||
| 399 | XOR CX,CX ; clear both CX and DX for ;AN000; | ||
| 400 | XOR DX,DX ; SYSPARSE ;AN000; | ||
| 401 | CALL SYSPARSE ; move pointer past file spec ;AN000; | ||
| 402 | CALL SYSPARSE ; do first parse ;AN000; | ||
| 403 | LEA BX,TABLE ; ;AN000; | ||
| 404 | .WHILE <AX NE RC_EOL> AND ; EOL?...then end parse...and.. ;AN000; | ||
| 405 | .WHILE <OK_FLAG EQ ON> ; make sure that flag still ok.. ;AN000; | ||
| 406 | .IF <AX NE RC_NO_ERROR> ; parse error? ;AN000; | ||
| 407 | MOV OK_FLAG,OFF ; yes...reset flag ;AN000; | ||
| 408 | .ELSE ; ;AN000; | ||
| 409 | .SELECT ; ;AN000; | ||
| 410 | .WHEN <RESULT_TYPE EQ COMPLEX>; complex string found? ;AN000; | ||
| 411 | INC DEVICE_NUM ; increment count ;AN000; | ||
| 412 | INC BX ; point to next device table ;AN000; | ||
| 413 | INC BX ; ;AN000; | ||
| 414 | .IF <DEVICE_NUM GT FOUR> ; more than one? ;AN000; | ||
| 415 | MOV OK_FLAG,OFF ; yes....we have an error ;AN000; | ||
| 416 | .ELSE ; no .. ;AN000; | ||
| 417 | PUSH BX ; ;AN000; | ||
| 418 | MOV BX,CS:[BX] ; ;AN000; | ||
| 419 | CALL COPY_NAME ; ;AN000; | ||
| 420 | MOV NUM_LOOP,ZERO ; ;AN000; | ||
| 421 | CALL PARSE_MAIN ; process complex string.. ;AN000; | ||
| 422 | POP BX ; ;AN000; | ||
| 423 | .ENDIF ; ;AN000; | ||
| 424 | .OTHERWISE ; not a complex string so.. ;AN000; | ||
| 425 | MOV OK_FLAG,OFF ; we have a problem...reset flag ;AN000; | ||
| 426 | .ENDSELECT ; ;AN000; | ||
| 427 | .ENDIF ; ;AN000; | ||
| 428 | PUSH BX ; ;AN000; | ||
| 429 | CALL SYSPARSE ; continue parsing.. ;AN000; | ||
| 430 | POP BX ; ;AN000; | ||
| 431 | .ENDWHILE ; ;AN000; | ||
| 432 | .IF <OK_FLAG EQ OFF> ; flag indicating error? ;AN000; | ||
| 433 | MOV DEVICE_NUM,ZERO ; yes...set device number to 0 ;AN000; | ||
| 434 | STC ; ;AN000; | ||
| 435 | .ELSE ; ;AN000; | ||
| 436 | CLC ; ;AN000; | ||
| 437 | .ENDIF ; ;AN000; | ||
| 438 | POP SI ; ;AN000; | ||
| 439 | POP DS ; ;AN000; | ||
| 440 | POP BX ; ;AN000; | ||
| 441 | POP ES ; ;AN000; | ||
| 442 | POP DI ; ;AN000; | ||
| 443 | POP DX ; ;AN000; | ||
| 444 | RET ; ;AN000; | ||
| 445 | PARSER ENDP ;AN000; | ||
| 446 | |||
| 447 | |||
| 448 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 449 | ; | ||
| 450 | ; PROCEDURE_NAME: PARSE_MAIN | ||
| 451 | ; | ||
| 452 | ; FUNCTION: | ||
| 453 | ; THIS PROCEDURE PARSES THE LPT=( ) COMPLEX LIST DEVICE= LINE FOUND | ||
| 454 | ; IN CONFIG.SYS | ||
| 455 | ; | ||
| 456 | ; AT ENTRY: RESULT BUFFER CONTAINS POINTER TO COMPLEX STRING | ||
| 457 | ; | ||
| 458 | ; AT EXIT: | ||
| 459 | ; NORMAL: TABLE SET UP WITH VALUES FOUND | ||
| 460 | ; | ||
| 461 | ; ERROR: OK_FLAG = 0 | ||
| 462 | ; | ||
| 463 | ; | ||
| 464 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 465 | |||
| 466 | PARSE_MAIN PROC NEAR ;AN000; | ||
| 467 | PUSH BX ; ;AN000; | ||
| 468 | PUSH DI ; setup to parse the nested.. ;AN000; | ||
| 469 | PUSH DS ; complex string...but save.. ;AN000; | ||
| 470 | PUSH SI ; current parsing status. ;AN000; | ||
| 471 | PUSH CX ; ;AN000; | ||
| 472 | XOR CX,CX ; ;AN000; | ||
| 473 | LEA DI,PARMS2 ; next control block.. ;AN000; | ||
| 474 | LDS SI,RESULT_VAL ; point to stored string ;AN000; | ||
| 475 | PUSH BX ; ;AN000; | ||
| 476 | CALL SYSPARSE ; ;AN000; | ||
| 477 | POP BX ; ;AN000; | ||
| 478 | .WHILE <AX NE RC_EOL> AND ; not EOL? and.. ;AN000; | ||
| 479 | .WHILE <OK_FLAG EQ ON> ; error flag still ok? ;AN000; | ||
| 480 | INC NUM_LOOP ; ;AN000; | ||
| 481 | .IF <AX NE RC_NO_ERROR> ; check for parse errors ;AN000; | ||
| 482 | MOV OK_FLAG,OFF ; yes....reset error flag ;AN000; | ||
| 483 | .ELSE ; no...process ;AN000; | ||
| 484 | PUSH BX ; ;AN000; | ||
| 485 | .SELECT ; ;AN000; | ||
| 486 | .WHEN <RESULT_TYPE EQ STRING> ; simple string ;AN000; | ||
| 487 | MOV BX,CS:[BX].DI_OFFSET ; ;AN000; | ||
| 488 | CALL PARSE_STR ; yes...process ;AN000; | ||
| 489 | .WHEN <RESULT_TYPE EQ NUMBER> ; number?.. ;AN000; | ||
| 490 | .IF <NUM_LOOP EQ TWO> ; ;AN000; | ||
| 491 | MOV BX,CS:[BX].DCP_OFFSET ;AN000; | ||
| 492 | .ELSE ; ;AN000; | ||
| 493 | MOV BX,CS:[BX].DD_OFFSET ;AN000; | ||
| 494 | .ENDIF ; ;AN000; | ||
| 495 | MOV AX,WORD PTR RESULT_VAL ; get value into word form ;AN000; | ||
| 496 | .IF <AX NE ZERO> ;AN000; | ||
| 497 | INC WORD PTR CS:[BX] ; ;AN000; | ||
| 498 | MOV WORD PTR CS:[BX+2],AX ; load that value. ;AN000; | ||
| 499 | .ENDIF ;AN000; | ||
| 500 | .WHEN <RESULT_TYPE EQ COMPLEX> ; complex string? ;AN000; | ||
| 501 | MOV BX,CS:[BX].DCP_OFFSET ; ;AN000; | ||
| 502 | CALL PARSE_COMP ; yes...process ;AN000; | ||
| 503 | .OTHERWISE ; anything else is.. ;AN000; | ||
| 504 | MOV OK_FLAG,OFF ; an error...reset flag. ;AN000; | ||
| 505 | .ENDSELECT ; ;AN000; | ||
| 506 | CALL SYSPARSE ; continue parsing ;AN000; | ||
| 507 | POP BX ; ;AN000; | ||
| 508 | .ENDIF ; ;AN000; | ||
| 509 | .ENDWHILE ; ;AN000; | ||
| 510 | POP CX ; restore original parse.. ;AN000; | ||
| 511 | POP SI ; registers. ;AN000; | ||
| 512 | POP DS ; ;AN000; | ||
| 513 | POP DI ; ;AN000; | ||
| 514 | POP BX ; ;AN000; | ||
| 515 | RET ; ;AN000; | ||
| 516 | PARSE_MAIN ENDP ;AN000; | ||
| 517 | ;AN000; | ||
| 518 | |||
| 519 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 520 | ; | ||
| 521 | ; PROCEDURE_NAME: PARSE_COMP | ||
| 522 | ; | ||
| 523 | ; FUNCTION: | ||
| 524 | ; THIS PROCEDURE PARSES A COMPLEX LIST FOUND WITHIN THE LPT=( ) | ||
| 525 | ; COMPLEX LIST. | ||
| 526 | ; | ||
| 527 | ; AT ENTRY: RESULT BUFFER CONTAINS POINTER TO COMPLEX STRING | ||
| 528 | ; | ||
| 529 | ; AT EXIT: | ||
| 530 | ; NORMAL: TABLE SET UP WITH VALUES FOUND | ||
| 531 | ; | ||
| 532 | ; ERROR: OK_FLAG = 0 | ||
| 533 | ; | ||
| 534 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 535 | |||
| 536 | PARSE_COMP PROC NEAR ;AN000; | ||
| 537 | PUSH DI ; setup ro parse the nested.. ;AN000; | ||
| 538 | PUSH DS ; complex string..saving the.. ;AN000; | ||
| 539 | PUSH SI ; current parse status. ;AN000; | ||
| 540 | PUSH CX ; ;AN000; | ||
| 541 | MOV DI,BX ; ;AN000; | ||
| 542 | PUSH DI ; ;AN000; | ||
| 543 | XOR CX,CX ; ;AN000; | ||
| 544 | LEA DI,PARMS3 ; next control block ;AN000; | ||
| 545 | LDS SI,RESULT_VAL ; point to stored string. ;AN000; | ||
| 546 | PUSH BX ; ;AN000; | ||
| 547 | CALL SYSPARSE ; ;AN000; | ||
| 548 | POP BX ; ;AN000; | ||
| 549 | .WHILE <AX NE RC_EOL> AND ; not EOL?...and.. ;AN000; | ||
| 550 | .WHILE <OK_FLAG EQ ON> AND ; error flag still okay? ;AN000; | ||
| 551 | .WHILE <AX NE RC_OP_MISSING> ; ;AN000; | ||
| 552 | .IF <AX NE RC_NO_ERROR> ; parse error?...or.. ;AN000; | ||
| 553 | MOV OK_FLAG,OFF ; found?....yes..reset flag. ;AN000; | ||
| 554 | .ELSE ; no...process.. ;AN000; | ||
| 555 | INC WORD PTR CS:[BX] ; increment counter ;AN000; | ||
| 556 | .IF <<WORD PTR CS:[BX]> LE TEN> ;AN000; | ||
| 557 | POP DI ; ;AN000; | ||
| 558 | MOV AX,WORD PTR RESULT_VAL ; get numeric value into word ;AN000; | ||
| 559 | MOV WORD PTR CS:[DI+2],AX ; ;AN000; | ||
| 560 | INC DI ; ;AN000; | ||
| 561 | INC DI ; ;AN000; | ||
| 562 | PUSH DI ; ;AN000; | ||
| 563 | PUSH BX ; ;AN000; | ||
| 564 | LEA DI,PARMS3 ; ;AN000; | ||
| 565 | CALL SYSPARSE ; continue parsing ;AN000; | ||
| 566 | POP BX ; ;AN000; | ||
| 567 | .ELSE ; ;AN000; | ||
| 568 | MOV OK_FLAG,OFF ; ;AN000; | ||
| 569 | .ENDIF ; ;AN000; | ||
| 570 | .ENDIF ; ;AN000; | ||
| 571 | .ENDWHILE ; ;AN000; | ||
| 572 | POP DI ; ;AN000; | ||
| 573 | POP CX ; restore previous parse.. ;AN000; | ||
| 574 | POP SI ; registers. ;AN000; | ||
| 575 | POP DS ; ;AN000; | ||
| 576 | POP DI ; ;AN000; | ||
| 577 | RET ; ;AN000; | ||
| 578 | PARSE_COMP ENDP ;AN000; | ||
| 579 | |||
| 580 | |||
| 581 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 582 | ; | ||
| 583 | ; PROCEDURE_NAME: PARSE_STR | ||
| 584 | ; | ||
| 585 | ; FUNCTION: | ||
| 586 | ; THIS PROCEDURE PARSES A STRING FOUND WITHIN THE LPT=( ) STATEMENT | ||
| 587 | ; | ||
| 588 | ; AT ENTRY: RESULT BUFFER POINTS TO ASCIIZ STRING | ||
| 589 | ; | ||
| 590 | ; AT EXIT: | ||
| 591 | ; NORMAL: TABLE SET UP WITH VALUES FOUND | ||
| 592 | ; | ||
| 593 | ; ERROR: STRING > 8 - OK_FLAG SET OFF | ||
| 594 | ; | ||
| 595 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 596 | |||
| 597 | PARSE_STR PROC NEAR ;AN000; | ||
| 598 | PUSH DI ; get source and.. ;AN000; | ||
| 599 | PUSH DS ; destination registers.. ;AN000; | ||
| 600 | PUSH SI ; setup. ;AN000; | ||
| 601 | PUSH CX ; ;AN000; | ||
| 602 | LDS SI,RESULT_VAL ; ;AN000; | ||
| 603 | MOV DI,BX ; ;AN000; | ||
| 604 | MOV CS:[DI].N_LENGTH,EIGHT ; ;AN000; | ||
| 605 | INC DI ; ;AN000; | ||
| 606 | INC DI ; ;AN000; | ||
| 607 | MOV CX,EIGHT ; ;AN000; | ||
| 608 | LODSB ; load first character. ;AN000; | ||
| 609 | .WHILE <AL NE ZERO> AND ; while not at end of ASCIIZ do.. ;AN000; | ||
| 610 | .WHILE <CX NE ZERO> ; ;AN000; | ||
| 611 | STOSB ; store.. ;AN000; | ||
| 612 | LODSB ; load next character.. ;AN000; | ||
| 613 | DEC CX ; ;AN000; | ||
| 614 | .ENDWHILE ; ;AN000; | ||
| 615 | .IF <CX EQ ZERO> ;AN000; | ||
| 616 | MOV OK_FLAG,OFF ;AN000; | ||
| 617 | .ENDIF ;AN000; | ||
| 618 | POP CX ; value found. ;AN000; | ||
| 619 | POP SI ; restore registers. ;AN000; | ||
| 620 | POP DS ; ;AN000; | ||
| 621 | POP DI ; ;AN000; | ||
| 622 | RET ;AN000; | ||
| 623 | PARSE_STR ENDP ;AN000; | ||
| 624 | |||
| 625 | |||
| 626 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 627 | ; | ||
| 628 | ; PROCEDURE_NAME: COPY_NAME | ||
| 629 | ; | ||
| 630 | ; FUNCTION: | ||
| 631 | ; THIS PROCEDURE COPIES THE FOUND STRING VALUE INTO THE TABLE. | ||
| 632 | ; | ||
| 633 | ; AT ENTRY: N/A | ||
| 634 | ; | ||
| 635 | ; AT EXIT: | ||
| 636 | ; NORMAL: TABLE UPDATED | ||
| 637 | ; | ||
| 638 | ; ERROR: N/A | ||
| 639 | ; | ||
| 640 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 641 | |||
| 642 | COPY_NAME PROC NEAR ;AN000; | ||
| 643 | PUSH DI ; get source and.. ;AN000; | ||
| 644 | PUSH DS ; destination registers.. ;AN000; | ||
| 645 | PUSH SI ; setup. ;AN000; | ||
| 646 | PUSH CS ; ;AN000; | ||
| 647 | POP DS ; ;AN000; | ||
| 648 | MOV SI,SYN_PTR ; ;AN000; | ||
| 649 | MOV DI,CS:[BX].DN_OFFSET ; ;AN000; | ||
| 650 | MOV CS:[DI].N_LENGTH,EIGHT ; ;AN000; | ||
| 651 | INC DI ; ;AN000; | ||
| 652 | INC DI ; ;AN000; | ||
| 653 | LODSB ; load first character. ;AN000; | ||
| 654 | .WHILE <AL NE ZERO> ; while not at end of ASCIIZ do.. ;AN000; | ||
| 655 | .IF <AL NE ':'> AND ;ignore colon ;AN001; | ||
| 656 | .IF <AL NE '='> ; or = ;AN001; | ||
| 657 | STOSB ; store.. ;AN000; | ||
| 658 | .ENDIF ; ;AN000; | ||
| 659 | LODSB ; load next character.. ;AN000; | ||
| 660 | .ENDWHILE ; ;AN000; | ||
| 661 | POP SI ; restore registers. ;AN000; | ||
| 662 | POP DS ; ;AN000; | ||
| 663 | POP DI ; ;AN000; | ||
| 664 | RET ;AN000; | ||
| 665 | COPY_NAME ENDP ;AN000; | ||
| 666 | |||
| 667 | CSEG ENDS | ||
| 668 | END | ||
diff --git a/v4.0/src/DEV/PRINTER/PRINTER.LNK b/v4.0/src/DEV/PRINTER/PRINTER.LNK new file mode 100644 index 0000000..9449900 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PRINTER.LNK | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | CPSPM10+ | ||
| 2 | CPSFONT3+ | ||
| 3 | PRTINT2F+ | ||
| 4 | CPSPI07+ | ||
| 5 | PARSER | ||
| 6 | PRINTER.EXE | ||
| 7 | PRINTER.MAP /M | ||
| 8 | ; | ||
| 9 | \ No newline at end of file | ||
diff --git a/v4.0/src/DEV/PRINTER/PRINTER.SKL b/v4.0/src/DEV/PRINTER/PRINTER.SKL new file mode 100644 index 0000000..6cfb2f6 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PRINTER.SKL | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2 | ; | ||
| 3 | ; Message Skeleton file for PRINTER.SYS | ||
| 4 | ; | ||
| 5 | ; Author: WGR | ||
| 6 | ; | ||
| 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 8 | |||
| 9 | :util PRINTER ; utility name | ||
| 10 | |||
| 11 | :class A | ||
| 12 | :use 1 COMMON1 | ||
| 13 | :def 2 "%1 code page driver cannot be initialized",CR,LF,BELL | ||
| 14 | :def 12 "Invalid syntax on PRINTER.SYS code page driver",CR,LF,BELL | ||
| 15 | |||
| 16 | :end | ||
| 17 | \ No newline at end of file | ||
diff --git a/v4.0/src/DEV/PRINTER/PRTINT2F.ASM b/v4.0/src/DEV/PRINTER/PRTINT2F.ASM new file mode 100644 index 0000000..82654c5 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PRTINT2F.ASM | |||
| @@ -0,0 +1,450 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE PRINTER.SYS INT2FH Code | ||
| 3 | |||
| 4 | ;****************** START OF SPECIFICATIONS ************************** | ||
| 5 | ; | ||
| 6 | ; MODULE NAME: PRTINT2F.ASM | ||
| 7 | ; | ||
| 8 | ; DESCRIPTIVE NAME: PERFORM THE INT2FH FUNCTION OF PRINTER.SYS | ||
| 9 | ; | ||
| 10 | ; FUNCTION: THE INT2FH FUNCTION OF PRINTER.SYS WILL LOCK THE PRINTER | ||
| 11 | ; DEVICE AND LOAD THE CODE PAGE SPECIFIED. WHEN AN UNLOCK | ||
| 12 | ; IS ENCOUNTERED, THE SAVED CODE PAGE WILL BE ACTIVATED. | ||
| 13 | ; ATTACHED. | ||
| 14 | ; | ||
| 15 | ; ENTRY POINT: INT2F_COM | ||
| 16 | ; | ||
| 17 | ; INPUT: AX = AD40H (CALL IDENTIFIER) | ||
| 18 | ; BX = REQUESTED CODE PAGE (-1 FOR UNLOCK) | ||
| 19 | ; DX = 0 - LPT1 | ||
| 20 | ; 1 - LPT2 | ||
| 21 | ; 2 - LPT3 | ||
| 22 | ; | ||
| 23 | ; AT EXIT: | ||
| 24 | ; NORMAL: CARRY CLEAR | ||
| 25 | ; | ||
| 26 | ; ERROR: CARRY SET - CODE PAGE NOT AVAILABLE OR DEVICE IS NOT CPSW. | ||
| 27 | ; | ||
| 28 | ; INTERNAL REFERENCES: | ||
| 29 | ; | ||
| 30 | ; ROUTINES: CHECK_FOR_CP - CHECKS TO SEE IF CODE PAGE REQUESTED IS | ||
| 31 | ; AVAILABLE ON DEVICE REQUESTED. | ||
| 32 | ; FIND_ACTIVE_CP - FINDS THE ACTIVE CODE PAGE ON SPECIFIED | ||
| 33 | ; DEVICE; IF AVAILABLE. | ||
| 34 | ; LOCK_CP - VERIFIES, LOADS, AND LOCKS DEVICE CODE PAGE. | ||
| 35 | ; UNLOCK_CP - UNLOCKS DEVICE. | ||
| 36 | ; | ||
| 37 | ; DATA AREAS: INVOKE_BLOCK - PARAMETER BLOCK PASSED TO INVOKE PROC. | ||
| 38 | ; | ||
| 39 | ; | ||
| 40 | ; EXTERNAL REFERENCES: | ||
| 41 | ; | ||
| 42 | ; ROUTINES: INVOKE - ACTIVATES FONT REQUESTED. | ||
| 43 | ; | ||
| 44 | ; DATA AREAS: BUF1 - BUFFER FOR LPT1 | ||
| 45 | ; BUF2 - BUFFER FOR LPT2 | ||
| 46 | ; BUF3 - BUFFER FOR LPT3 | ||
| 47 | ; | ||
| 48 | ; NOTES: | ||
| 49 | ; | ||
| 50 | ; REVISION HISTORY: | ||
| 51 | ; A000 - DOS Version 4.00 | ||
| 52 | ; | ||
| 53 | ; Label: "DOS PRINTER.SYS Device Driver" | ||
| 54 | ; "Version 4.00 (C) Copyright 1988 Microsoft | ||
| 55 | ; "Licensed Material - Program Property of Microsoft" | ||
| 56 | ; | ||
| 57 | ;****************** END OF SPECIFICATIONS **************************** | ||
| 58 | |||
| 59 | .XLIST | ||
| 60 | INCLUDE STRUC.INC ;AN000; | ||
| 61 | .LIST | ||
| 62 | |||
| 63 | |||
| 64 | INCLUDE CPSPEQU.INC ;AN000; | ||
| 65 | PRIV_LK_CP EQU 0AD40H ; multiplex number and function ;AN000; | ||
| 66 | LPT1 EQU 0 ; ;AN000; | ||
| 67 | LPT2 EQU 1 ; ;AN000; | ||
| 68 | LPT3 EQU 2 ; ;AN000; | ||
| 69 | UNLOCK EQU -1 ; unlock the device ;AN000; | ||
| 70 | UNDEFINED EQU -1 ; undefined code page ;AN000; | ||
| 71 | NOT_CY EQU 0FFFEH ; clear the carry in flag register ;AN000; | ||
| 72 | CY EQU 1 ; set the carry in flag register ;AN000; | ||
| 73 | FOUND EQU 1 ; search flag ;AN000; | ||
| 74 | NOT_FOUND EQU 0 ; ;AN000; | ||
| 75 | |||
| 76 | |||
| 77 | PUBLIC INT2F_COM ;AN000; | ||
| 78 | PUBLIC ROM_INT2F ;AN000; | ||
| 79 | PUBLIC ABORT ;AN000; | ||
| 80 | |||
| 81 | |||
| 82 | CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000; | ||
| 83 | ASSUME CS:CSEG ;AN000; | ||
| 84 | |||
| 85 | |||
| 86 | EXTRN INVOKE:NEAR ;AN000; | ||
| 87 | EXTRN BUF0:BYTE ;AN000; | ||
| 88 | EXTRN BUF1:BYTE ;AN000; | ||
| 89 | EXTRN BUF2:BYTE ;AN000; | ||
| 90 | EXTRN BUF3:BYTE ;AN000; | ||
| 91 | |||
| 92 | ROM_INT2F DW ? ; chaining point for INT2FH ;AN000; | ||
| 93 | DW ? ;AN000; | ||
| 94 | |||
| 95 | COPY_BUF0 DW 0 ;AN000; | ||
| 96 | PREV_LOCK DB OFF ;AN000; | ||
| 97 | |||
| 98 | INVOKE_BLOCK LABEL BYTE ; parameter block passed to INVOKE ;AN000; | ||
| 99 | DB 3 DUP(0) ; ;AN000; | ||
| 100 | RET_STAT DW 0 ; returned status from INVOKE ;AN000; | ||
| 101 | DQ 0 ; ;AN000; | ||
| 102 | DB 6 DUP(0) ; ;AN000; | ||
| 103 | DW OFFSET PARA_BLOCK ; ;AN000; | ||
| 104 | CODE_SEGB DW SEG CSEG ; ;AN000; | ||
| 105 | ; | ||
| 106 | PARA_BLOCK LABEL WORD ; ;AN000; | ||
| 107 | DW TWO ; ;AN000; | ||
| 108 | REQ_CP DW ? ; requested code page to load ;AN000; | ||
| 109 | ; | ||
| 110 | |||
| 111 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 112 | ; | ||
| 113 | ; PROCEDURE_NAME: INT2F_COM | ||
| 114 | ; | ||
| 115 | ; FUNCTION: | ||
| 116 | ; THIS IS THE INTERRUPT 2FH HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS: | ||
| 117 | ; | ||
| 118 | ; AX=AD40H PRIVELEGED LOCK CP SWITCHING | ||
| 119 | ; | ||
| 120 | ; AT ENTRY: AX = AD40H | ||
| 121 | ; BX = CODEPAGE REQUESTED DURING LOCK. | ||
| 122 | ; -1 = UNLOCK | ||
| 123 | ; DX = 0 - LPT1 | ||
| 124 | ; 1 - LPT2 | ||
| 125 | ; 2 - LPT3 | ||
| 126 | ; | ||
| 127 | ; | ||
| 128 | ; AT EXIT: | ||
| 129 | ; NORMAL: CARRY CLEAR - DEVICE LOADED AND LOCKED | ||
| 130 | ; | ||
| 131 | ; ERROR: CARRY SET - CODE PAGE NOT AVAILABLE OR DEVICE NOT CPSW. | ||
| 132 | ; | ||
| 133 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 134 | |||
| 135 | |||
| 136 | INT2F_COM PROC NEAR ;AN000; | ||
| 137 | STI ;AN000; | ||
| 138 | .IF <AX NE PRIV_LK_CP> ; is this for PRINTER? ;AN000; | ||
| 139 | JMP DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F ;AN000; | ||
| 140 | .ENDIF ; ;AN000; | ||
| 141 | PUSH AX ; ;AN000; | ||
| 142 | PUSH BP ; ;AN000; | ||
| 143 | PUSH BX ; s r ;AN000; | ||
| 144 | PUSH CX ; a e ;AN000; | ||
| 145 | PUSH DX ; v g ;AN000; | ||
| 146 | PUSH DI ; e s ;AN000; | ||
| 147 | PUSH SI ; ;AN000; | ||
| 148 | PUSH DS ; ;AN000; | ||
| 149 | PUSH ES ; ;AN000; | ||
| 150 | MOV CS:COPY_BUF0,ZERO ; ;AN000; | ||
| 151 | MOV CS:CODE_SEGB,CS ; ;AN000; | ||
| 152 | MOV BP,BX ; move req. cp to bp ;AN000; | ||
| 153 | .SELECT ; depending on the lptx.. ;AN000; | ||
| 154 | .WHEN <DX EQ LPT1> ; point to the appropriate ;AN000; | ||
| 155 | LEA BX,BUF1 ; buffer.. ;AN000; | ||
| 156 | LEA SI,BUF0 ; ;AN000; | ||
| 157 | MOV CS:COPY_BUF0,SI ; ;AN000; | ||
| 158 | .WHEN <DX EQ LPT2> ; ;AN000; | ||
| 159 | LEA BX,BUF2 ; ;AN000; | ||
| 160 | .WHEN <DX EQ LPT3> ; ;AN000; | ||
| 161 | LEA BX,BUF3 ; ;AN000; | ||
| 162 | .OTHERWISE ; ;AN000; | ||
| 163 | STC ; not a valid lptx..set flag ;AN000; | ||
| 164 | .ENDSELECT ; ;AN000; | ||
| 165 | .IF NC ; process ;AN000; | ||
| 166 | .IF <BP EQ UNLOCK> ; if unlock requested ;AN000; | ||
| 167 | CALL UNLOCK_CP ; unlock code page. ;AN000; | ||
| 168 | .ELSE ; must be a lock request.. ;AN000; | ||
| 169 | CALL LOCK_CP ; ;AN000; | ||
| 170 | .ENDIF ; ;AN000; | ||
| 171 | .ENDIF ; ;AN000; | ||
| 172 | MOV SI,CS:COPY_BUF0 ; ;AN000; | ||
| 173 | PUSHF ; ;AN000; | ||
| 174 | .IF <SI NE ZERO> ; if this is lpt1... ;AN000; | ||
| 175 | MOV AX,CS:[BX].STATE ; copy data into prn ;AN000; | ||
| 176 | MOV CS:[SI].STATE,AX ; buffer as well. ;AN000; | ||
| 177 | MOV AX,CS:[BX].SAVED_CP ; ;AN000; | ||
| 178 | MOV CS:[SI].SAVED_CP,AX ; ;AN000; | ||
| 179 | .ENDIF ; ;AN000; | ||
| 180 | POPF ; ;AN000; | ||
| 181 | POP ES ; ;AN000; | ||
| 182 | POP DS ; restore ;AN000; | ||
| 183 | POP SI ; ;AN000; | ||
| 184 | POP DI ; registers ;AN000; | ||
| 185 | POP DX ; ;AN000; | ||
| 186 | POP CX ; ;AN000; | ||
| 187 | POP BX ; ;AN000; | ||
| 188 | MOV BP,SP ; ;AN000; | ||
| 189 | MOV AX,[BP+8] ; load flag onto.. ;AN000; | ||
| 190 | .IF NC ; ;AN000; | ||
| 191 | AND AX,NOT_CY ; ;AN000; | ||
| 192 | .ELSE ; stack flags ;AN000; | ||
| 193 | OR AX,CY ; ;AN000; | ||
| 194 | .ENDIF ; ;AN000; | ||
| 195 | MOV [BP+8],AX ; ;AN000; | ||
| 196 | POP BP ; ;AN000; | ||
| 197 | POP AX ; ;AN000; | ||
| 198 | XCHG AH,AL ; exchange ah and al to show that.. ;AN000; | ||
| 199 | ABORT: IRET ; printer.sys is present. ;AN000; | ||
| 200 | INT2F_COM ENDP ;AN000; | ||
| 201 | |||
| 202 | |||
| 203 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 204 | ; | ||
| 205 | ; PROCEDURE_NAME: UNLOCK_CP | ||
| 206 | ; | ||
| 207 | ; FUNCTION: | ||
| 208 | ; THIS FUNCTION UNLOCKS THE DEVICE THAT IS LOCKED. | ||
| 209 | ; | ||
| 210 | ; AT ENTRY: | ||
| 211 | ; BX - POINTS TO LPTx BUFFER | ||
| 212 | ; | ||
| 213 | ; | ||
| 214 | ; AT EXIT: | ||
| 215 | ; NORMAL: CARRY CLEAR - DEVICE UNLOCKED. | ||
| 216 | ; | ||
| 217 | ; ERROR: CARRY SET - ERROR DURING UNLOCK, ACTIVE CODE PAGE SET TO INACTIVE | ||
| 218 | ; | ||
| 219 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 220 | |||
| 221 | UNLOCK_CP PROC NEAR ;AN000; | ||
| 222 | .IF <CS:[BX].STATE EQ LOCKED> NEAR ; is device locked? ;AN000; | ||
| 223 | MOV CS:[BX].STATE,CPSW ; change status to unlocked.. ;AN000; | ||
| 224 | MOV BP,CS:[BX].SAVED_CP ; get saved code page ;AN000; | ||
| 225 | .IF <BP NE UNDEFINED> ; valid?..... ;AN000; | ||
| 226 | XOR AX,AX ; ;AN000; | ||
| 227 | CALL FIND_ACTIVE_CP ; find the active code page. ;AN000; | ||
| 228 | .IF <BP NE DX> ; are they the same..? ;AN000; | ||
| 229 | MOV CS:REQ_CP,BP ; no...invoke the saved code page ;AN000; | ||
| 230 | PUSH CS ; ;AN000; | ||
| 231 | POP ES ; ;AN000; | ||
| 232 | LEA DI,INVOKE_BLOCK ; ;AN000; | ||
| 233 | MOV CS:[BX].RH_PTRO,DI ; ;AN000; | ||
| 234 | MOV CS:[BX].RH_PTRS,ES ; ;AN000; | ||
| 235 | CALL INVOKE ; ;AN000; | ||
| 236 | .IF <AL NE ZERO> ; error on invoke? ;AN000; | ||
| 237 | MOV AX,ONE ; yes...change the active.. ;AN000; | ||
| 238 | CALL FIND_ACTIVE_CP ; to inactive. ;AN000; | ||
| 239 | .IF <CS:COPY_BUF0 NE ZERO> ; do likewise to PRN if this ;AN000; | ||
| 240 | PUSH BX ; is lpt1. ;AN000; | ||
| 241 | MOV BX,CS:COPY_BUF0 ; ;AN000; | ||
| 242 | CALL FIND_ACTIVE_CP ; ;AN000; | ||
| 243 | POP BX ; ;AN000; | ||
| 244 | .ENDIF ; ;AN000; | ||
| 245 | STC ; set error flag. ;AN000; | ||
| 246 | .ELSE ; ;AN000; | ||
| 247 | CLC ; invoke ok...clear error flag ;AN000; | ||
| 248 | .ENDIF ; ;AN000; | ||
| 249 | .ELSE ; ;AN000; | ||
| 250 | CLC ; active = saved ..no invoke... ;AN000; | ||
| 251 | .ENDIF ; clear error ;AN000; | ||
| 252 | .ELSE ; ;AN000; | ||
| 253 | MOV AX,ONE ; saved cp was inactive...change..;AN000; | ||
| 254 | CALL FIND_ACTIVE_CP ; active to inactive. ;AN000; | ||
| 255 | .IF <CS:COPY_BUF0 NE ZERO> ; do likewise to PRN if this ;AN000; | ||
| 256 | PUSH BX ; is lpt1. ;AN000; | ||
| 257 | MOV BX,CS:COPY_BUF0 ; ;AN000; | ||
| 258 | CALL FIND_ACTIVE_CP ; ;AN000; | ||
| 259 | POP BX ; ;AN000; | ||
| 260 | .ENDIF ; ;AN000; | ||
| 261 | CLC ; ;AN000; | ||
| 262 | .ENDIF ; ;AN000; | ||
| 263 | MOV CS:[BX].SAVED_CP,UNDEFINED; reset the saved cp ;AN000; | ||
| 264 | .ENDIF ; ;AN000; | ||
| 265 | RET ;AN000; | ||
| 266 | UNLOCK_CP ENDP ;AN000; | ||
| 267 | |||
| 268 | |||
| 269 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 270 | ; | ||
| 271 | ; PROCEDURE_NAME: LOCK_CP | ||
| 272 | ; | ||
| 273 | ; FUNCTION: | ||
| 274 | ; THIS FUNCTION LOCKS THE DEVICE WITH THE CODE PAGE REQUESTED. | ||
| 275 | ; | ||
| 276 | ; AT ENTRY: BP - REQUESTED CODE PAGE | ||
| 277 | ; BX - POINTS TO LPTx BUFFER | ||
| 278 | ; | ||
| 279 | ; | ||
| 280 | ; AT EXIT: | ||
| 281 | ; NORMAL: CARRY CLEAR - DEVICE LOCKED. | ||
| 282 | ; | ||
| 283 | ; ERROR: CARRY SET - ERROR, CODE PAGE NOT LOCKED. | ||
| 284 | ; | ||
| 285 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 286 | |||
| 287 | LOCK_CP PROC NEAR ;AN000; | ||
| 288 | .IF <CS:[BX].STATE EQ LOCKED> ; if this was previously locked.. ;AN000; | ||
| 289 | MOV CS:PREV_LOCK,ON ; then...set flag and... ;AN000; | ||
| 290 | MOV CS:[BX].STATE,CPSW ; change to unlock for this proc ;AN000; | ||
| 291 | .ELSEIF <CS:[BX].STATE EQ CPSW> ; if this is unlocked... ;AN000; | ||
| 292 | MOV CS:PREV_LOCK,OFF ; then set flag off. ;AN000; | ||
| 293 | .ELSE ; ;AN000; | ||
| 294 | STC ; neither...set error ;AN000; | ||
| 295 | .ENDIF ; ;AN000; | ||
| 296 | .IF NC ; ;AN000; | ||
| 297 | CALL CHECK_FOR_CP ; yes..see if req cp is available. ;AN000; | ||
| 298 | .IF NC ; yes... ;AN000; | ||
| 299 | XOR AX,AX ; ;AN000; | ||
| 300 | CALL FIND_ACTIVE_CP ; find the active code page ;AN000; | ||
| 301 | .IF <BP NE DX> ; is it the same as requested?.. ;AN000; | ||
| 302 | MOV CS:REQ_CP,BP ; no..invoke the requested cp ;AN000; | ||
| 303 | PUSH CS ; ;AN000; | ||
| 304 | POP ES ; ;AN000; | ||
| 305 | LEA DI,INVOKE_BLOCK ; ;AN000; | ||
| 306 | MOV CS:[BX].RH_PTRO,DI ; ;AN000; | ||
| 307 | MOV CS:[BX].RH_PTRS,ES ; ;AN000; | ||
| 308 | PUSH DX ; ;AN000; | ||
| 309 | CALL INVOKE ; ;AN000; | ||
| 310 | POP DX ; ;AN000; | ||
| 311 | .IF <AL NE ZERO> ; error on invoke? ;AN000; | ||
| 312 | STC ; yes...set error flag. ;AN000; | ||
| 313 | .ELSE ; ;AN000; | ||
| 314 | MOV CS:[BX].STATE,LOCKED ; no, 'lock' the printer device ;AN000; | ||
| 315 | .IF <CS:PREV_LOCK EQ OFF> ; if we were not locked.. ;AN000; | ||
| 316 | MOV CS:[BX].SAVED_CP,DX ; and..save the old code page. ;AN000; | ||
| 317 | .ENDIF ; ;AN000; | ||
| 318 | CLC ; clear error flag. ;AN000; | ||
| 319 | .ENDIF ; ;AN000; | ||
| 320 | .ELSE ; ;AN000; | ||
| 321 | MOV CS:[BX].STATE,LOCKED ; 'lock' the printer device ;AN000; | ||
| 322 | .IF <CS:PREV_LOCK EQ OFF> ; if we were not locked.. ;AN000; | ||
| 323 | MOV CS:[BX].SAVED_CP,DX ; and..save the old code page. ;AN000; | ||
| 324 | .ENDIF ; ;AN000; | ||
| 325 | CLC ; clear the error flag ;AN000; | ||
| 326 | .ENDIF ; ;AN000; | ||
| 327 | .ENDIF ; ;AN000; | ||
| 328 | .ENDIF ; ;AN000; | ||
| 329 | RET ;AN000; | ||
| 330 | LOCK_CP ENDP ;AN000; | ||
| 331 | |||
| 332 | |||
| 333 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 334 | ; | ||
| 335 | ; PROCEDURE_NAME: CHECK_FOR_CP | ||
| 336 | ; | ||
| 337 | ; FUNCTION: | ||
| 338 | ; THIS FUNCTION SEARCHES FOR THE CODE PAGE REQUESTED TO SEE IF IT HAS | ||
| 339 | ; BEEN PREPARED OR IS A HARDWARE CODE PAGE | ||
| 340 | ; | ||
| 341 | ; | ||
| 342 | ; AT ENTRY: BP = CODE PAGE REQUESTED | ||
| 343 | ; BX - POINTS TO LPTx BUFFER | ||
| 344 | ; | ||
| 345 | ; | ||
| 346 | ; AT EXIT: | ||
| 347 | ; NORMAL: CARRY CLEAR - CODE PAGE IS VALID. | ||
| 348 | ; | ||
| 349 | ; ERROR: CARRY SET - CODE PAGE NOT AVAILABLE. | ||
| 350 | ; | ||
| 351 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 352 | |||
| 353 | |||
| 354 | CHECK_FOR_CP PROC NEAR ;AN000; | ||
| 355 | PUSH DX ;AN000; | ||
| 356 | MOV DX,NOT_FOUND ; initialize flag ;AN000; | ||
| 357 | MOV CX,CS:[BX].RSLMX ; load number of RAM slots ;AN000; | ||
| 358 | MOV DI,CS:[BX].RAMSO ; load DI with table offset ;AN000; | ||
| 359 | .WHILE <DX EQ NOT_FOUND> AND ; whil not found and.... ;AN000; | ||
| 360 | .WHILE <CX NE ZERO> ; while still slots to check.. ;AN000; | ||
| 361 | .IF <CS:[DI].SLT_CP EQ BP> ; is it this one?? ;AN000; | ||
| 362 | MOV DX,FOUND ; yes....set flag ;AN000; | ||
| 363 | .ELSE ; ;AN000; | ||
| 364 | ADD DI,TYPE SLTS ; no..point to next entry ;AN000; | ||
| 365 | DEC CX ; decrement the count ;AN000; | ||
| 366 | .ENDIF ; ;AN000; | ||
| 367 | .ENDWHILE ; ;AN000; | ||
| 368 | .IF <DX EQ NOT_FOUND> ; if we didn't find it then.. ;AN000; | ||
| 369 | MOV CX,CS:[BX].HSLMX ; check hardware ;AN000; | ||
| 370 | MOV DI,CS:[BX].HARDSO ; load regs as before. ;AN000; | ||
| 371 | .WHILE <DX EQ NOT_FOUND> AND ; while not found and.. ;AN000; | ||
| 372 | .WHILE <CX NE ZERO> ; still have slots to check.. ;AN000; | ||
| 373 | .IF <CS:[DI].SLT_CP EQ BP> ; is it this one? ;AN000; | ||
| 374 | MOV DX,FOUND ; yes...set flag. ;AN000; | ||
| 375 | .ELSE ; ;AN000; | ||
| 376 | ADD DI,TYPE SLTS ; no ..point to next entry ;AN000; | ||
| 377 | DEC CX ; and decrement count. ;AN000; | ||
| 378 | .ENDIF ; ;AN000; | ||
| 379 | .ENDWHILE ; ;AN000; | ||
| 380 | .ENDIF ; ;AN000; | ||
| 381 | .IF <DX EQ NOT_FOUND> ; ;AN000; | ||
| 382 | STC ; set flag appropriately ;AN000; | ||
| 383 | .ELSE ; ;AN000; | ||
| 384 | CLC ; ;AN000; | ||
| 385 | .ENDIF ; ;AN000; | ||
| 386 | POP DX ; ;AN000; | ||
| 387 | RET ; ;AN000; | ||
| 388 | CHECK_FOR_CP ENDP ;AN000; | ||
| 389 | |||
| 390 | |||
| 391 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 392 | ; | ||
| 393 | ; PROCEDURE_NAME: FIND_ACTIVE_CP | ||
| 394 | ; | ||
| 395 | ; FUNCTION: | ||
| 396 | ; THIS FUNCTION SEARCHES FOR THE ACTIVE CODE PAGE. IF REQUESTED, THE | ||
| 397 | ; CODE PAGE IS MADE INACTIVE. | ||
| 398 | ; | ||
| 399 | ; | ||
| 400 | ; AT ENTRY: | ||
| 401 | ; BX - POINTS TO LPTx BUFFER | ||
| 402 | ; AX = 0 - LEAVE AS ACTIVE | ||
| 403 | ; AX = 1 - DE-ACTIVATE | ||
| 404 | ; | ||
| 405 | ; | ||
| 406 | ; AT EXIT: | ||
| 407 | ; NORMAL: DX - ACTIVE CODE PAGE. (NO ACTIVE = -1) | ||
| 408 | ; | ||
| 409 | ; ERROR: N/A | ||
| 410 | ; | ||
| 411 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 412 | |||
| 413 | |||
| 414 | FIND_ACTIVE_CP PROC NEAR ;AN000; | ||
| 415 | MOV DX,UNDEFINED ; initialize register ;AN000; | ||
| 416 | MOV CX,CS:[BX].RSLMX ; load number of RAM slots ;AN000; | ||
| 417 | MOV DI,CS:[BX].RAMSO ; load DI with table offset ;AN000; | ||
| 418 | .WHILE <DX EQ UNDEFINED> AND ; whil not found and.... ;AN000; | ||
| 419 | .WHILE <CX NE ZERO> ; while still slots to check.. ;AN000; | ||
| 420 | .IF <BIT CS:[DI].SLT_AT AND AT_ACT> ; is it this one?? ;AN000; | ||
| 421 | MOV DX,CS:[DI].SLT_CP ; yes....load value ;AN000; | ||
| 422 | .IF <AX EQ ONE> ; is deactivate requested? ;AN000; | ||
| 423 | MOV CS:[DI].SLT_AT,AT_OCC; yes...change attrib. to occupied ;AN000; | ||
| 424 | .ENDIF ; ;AN000; | ||
| 425 | .ELSE ; ;AN000; | ||
| 426 | ADD DI,TYPE SLTS ; no..point to next entry ;AN000; | ||
| 427 | DEC CX ; decrement the count ;AN000; | ||
| 428 | .ENDIF ; ;AN000; | ||
| 429 | .ENDWHILE ; ;AN000; | ||
| 430 | .IF <DX EQ UNDEFINED> ; if we didn't find it then.. ;AN000; | ||
| 431 | MOV CX,CS:[BX].HSLMX ; check hardware ;AN000; | ||
| 432 | MOV DI,CS:[BX].HARDSO ; load regs as before. ;AN000; | ||
| 433 | .WHILE <DX EQ UNDEFINED> AND ; while not found and.. ;AN000; | ||
| 434 | .WHILE <CX NE ZERO> ; still have slots to check.. ;AN000; | ||
| 435 | .IF <BIT CS:[DI].SLT_AT AND AT_ACT> ; is it this one?? ;AN000; | ||
| 436 | MOV DX,CS:[DI].SLT_CP ; yes....load value ;AN000; | ||
| 437 | .IF <AX EQ ONE> ; is deactivate requested? ;AN000; | ||
| 438 | MOV CS:[DI].SLT_AT,AT_OCC; yes...change attrib to occupied;AN000; | ||
| 439 | .ENDIF ; ;AN000; | ||
| 440 | .ELSE ; ;AN000; | ||
| 441 | ADD DI,TYPE SLTS ; no ..point to next entry ;AN000; | ||
| 442 | DEC CX ; and decrement count. ;AN000; | ||
| 443 | .ENDIF ; ;AN000; | ||
| 444 | .ENDWHILE ; ;AN000; | ||
| 445 | .ENDIF ; ;AN000; | ||
| 446 | RET ; ;AN000; | ||
| 447 | FIND_ACTIVE_CP ENDP ;AN000; | ||
| 448 | |||
| 449 | CSEG ENDS | ||
| 450 | END | ||
diff --git a/v4.0/src/DEV/PRINTER/PTRMSG.ASM b/v4.0/src/DEV/PRINTER/PTRMSG.ASM new file mode 100644 index 0000000..59e3299 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PTRMSG.ASM | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | |||
| 2 | PAGE ,132 | ||
| 3 | |||
| 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 5 | ;; | ||
| 6 | ;; FILENAME: CPS Device Driver -- Message File | ||
| 7 | ;; MODULE NAME: PTRMSG1 | ||
| 8 | ;; TYPE: Message External File | ||
| 9 | ;; LINK PROCEDURE: see CPSPMNN.ASM | ||
| 10 | ;; | ||
| 11 | ;; INCLUDE FILES: | ||
| 12 | ;; | ||
| 13 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 14 | ;; | ||
| 15 | ;; | ||
| 16 | CSEG SEGMENT PUBLIC 'CODE' ;; | ||
| 17 | ASSUME CS:CSEG ;; | ||
| 18 | ASSUME DS:NOTHING ;; | ||
| 19 | ;; | ||
| 20 | PUBLIC msg_no_init_p ;; | ||
| 21 | PUBLIC msg_no_init ;; | ||
| 22 | PUBLIC msg_bad_syntax ;; | ||
| 23 | PUBLIC msg_insuff_mem ;; | ||
| 24 | ;; | ||
| 25 | |||
| 26 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 27 | ;; | ||
| 28 | ;; ************************************ | ||
| 29 | ;; ** ** | ||
| 30 | ;; ** Resident Code ** | ||
| 31 | ;; ** ** | ||
| 32 | ;; ************************************ | ||
| 33 | ;; | ||
| 34 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 35 | |||
| 36 | INCLUDE PTRMSG.INC | ||
| 37 | |||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | CSEG ENDS | ||
| 40 | END | ||
| 41 | \ No newline at end of file | ||
diff --git a/v4.0/src/DEV/PRINTER/ZERO.DAT b/v4.0/src/DEV/PRINTER/ZERO.DAT new file mode 100644 index 0000000..573541a --- /dev/null +++ b/v4.0/src/DEV/PRINTER/ZERO.DAT | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||