diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/DISPLAY/CPS-FUNC.INC | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/CPS-FUNC.INC')
| -rw-r--r-- | v4.0/src/DEV/DISPLAY/CPS-FUNC.INC | 728 |
1 files changed, 728 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/CPS-FUNC.INC b/v4.0/src/DEV/DISPLAY/CPS-FUNC.INC new file mode 100644 index 0000000..91bb3c6 --- /dev/null +++ b/v4.0/src/DEV/DISPLAY/CPS-FUNC.INC | |||
| @@ -0,0 +1,728 @@ | |||
| 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2 | ; | ||
| 3 | ; CODE PAGE DRIVER FUNCTIONS | ||
| 4 | ; | ||
| 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 6 | IF1 ; | ||
| 7 | %OUT . ®CPS-FUNC.INC¯ | ||
| 8 | ENDIF ; | ||
| 9 | ; | ||
| 10 | CP_FUNCTION LABEL BYTE ; | ||
| 11 | DW 4CH,OFFSET DESIGNATE_BEGIN ; | ||
| 12 | DW 4DH,OFFSET DESIGNATE_END ; | ||
| 13 | DW 4AH,OFFSET INVOKE_CP ; | ||
| 14 | DW 6AH,OFFSET QUERY_CP ; | ||
| 15 | DW 6BH,OFFSET QUERY_CP_LIST ; | ||
| 16 | NUM_CP_FUNCTION EQU ($-CP_FUNCTION)/4 ; | ||
| 17 | ; | ||
| 18 | DESG_SEMAPHORE DB 0 ; TEMPORARY | ||
| 19 | G_IOCTL_SEMA DB 0 ; SEMAPHORE TO INDICATE IF CPS IS BUSY! | ||
| 20 | ; | ||
| 21 | CHAR_HEIGHT DB 8 ; | ||
| 22 | DB 14 ; | ||
| 23 | DB 16 ; | ||
| 24 | DB 19 ; | ||
| 25 | DB 0 ; | ||
| 26 | DB 0 ; | ||
| 27 | DB 0 ; | ||
| 28 | DB 0 ; | ||
| 29 | NUM_CHAR_HEIGHT EQU ($-CHAR_HEIGHT) ; | ||
| 30 | ; | ||
| 31 | ; | ||
| 32 | GENERIC_IOCTL PROC ; CON OUTPUT | ||
| 33 | CLI ;S; | ||
| 34 | MOV SI,SP ;S; | ||
| 35 | MOV CS:OLD_STACK_O,SI ;S; | ||
| 36 | MOV SI,SS ;S; | ||
| 37 | MOV CS:OLD_STACK_S,SI ;S; | ||
| 38 | MOV AX,OFFSET STACK_START ;S; | ||
| 39 | MOV SI,CS ;S; | ||
| 40 | MOV SS,SI ;S; | ||
| 41 | MOV SP,AX ;S; | ||
| 42 | STI ;S; | ||
| 43 | PUSH DS ; | ||
| 44 | ; | ||
| 45 | PUSH CS ; | ||
| 46 | POP DS ; FROM HERE IN, DS=CS | ||
| 47 | ; | ||
| 48 | LES DI,DWORD PTR BUF.RH_PTRO; GET RH | ||
| 49 | ; | ||
| 50 | GI_1: MOV AL,RH.MINOR_F ; PUT MINOR VERSION IN AL | ||
| 51 | XOR AH,AH ; CLEAR OUT HIGH BYTE FOR COMPARES | ||
| 52 | ; | ||
| 53 | PUSH DI ; SAVE POINTER!!! | ||
| 54 | PUSH ES ; | ||
| 55 | PUSH CS ; | ||
| 56 | POP ES ; | ||
| 57 | MOV CX,NUM_CP_FUNCTION ; | ||
| 58 | MOV DI,OFFSET CP_FUNCTION ; | ||
| 59 | GI_1A: SCASW ; SEARCH THROUGH THE LIST OF VALID FN's | ||
| 60 | JE GI_2 ; | ||
| 61 | INC DI ; | ||
| 62 | INC DI ; | ||
| 63 | LOOP GI_1A ; | ||
| 64 | POP ES ; | ||
| 65 | POP DI ; | ||
| 66 | JUMP GI_3 ; NOT FOUND! | ||
| 67 | GI_2: POP ES ; | ||
| 68 | MOV SI,DI ; | ||
| 69 | POP DI ; | ||
| 70 | ; | ||
| 71 | MOV G_IOCTL_SEMA,ONE ; SEMAPHORE TO INDICATE CALLS ARE BUSY! | ||
| 72 | CALL [SI] ; JMP OFF TO THE APPROPRIATE CALL! | ||
| 73 | MOV G_IOCTL_SEMA,ZERO ; SEMAPHORE TO INDICATE CALLS ARE DONE! | ||
| 74 | STC ; SET CY not TO TRY ATTACHED CON! | ||
| 75 | JUMP GI_4 ; | ||
| 76 | GI_3: CLC ; CLEAR CY TO TRY ATTACHED CON! | ||
| 77 | GI_4: POP DS ; | ||
| 78 | CLI ;S; | ||
| 79 | MOV AX,CS:OLD_STACK_O ;S; | ||
| 80 | MOV SI,CS:OLD_STACK_S ;S; | ||
| 81 | MOV SS,SI ;S; | ||
| 82 | MOV SP,AX ;S; | ||
| 83 | STI ;S; | ||
| 84 | RET ; | ||
| 85 | GENERIC_IOCTL ENDP ; | ||
| 86 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 87 | ; | ||
| 88 | ; DESIGNATE BEGIN | ||
| 89 | ; | ||
| 90 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 91 | DESIGNATE_BEGIN PROC ; | ||
| 92 | LES DI,RH.REQUEST_PACKET ; AND DI TO POINT TO REQUEST PACKET | ||
| 93 | MOV CX,RH.DESG_N ; MOVE THE NUMBER OF CODE PAGES DESIG'ed | ||
| 94 | ; | ||
| 95 | OR CX,CX ; | ||
| 96 | JZ DB_0C ; CHECK IF ZERO CP's DESIGNATED | ||
| 97 | ; IF SO, THEN THIS IS THE REFRESH CALL | ||
| 98 | DB_0: CMP CX,CPD_DESG_N ; CHECK IF NUMBER > # CONFIGed | ||
| 99 | JA DB_0B ; | ||
| 100 | JUMP DB_1B ; | ||
| 101 | ; | ||
| 102 | DB_0D: OR BUF.STATUS,EIGHT ; Error>> KEYBOARD ERROR!! | ||
| 103 | RET ; | ||
| 104 | DB_2D: POP CX ; RESTORE STACK ELEMENTS | ||
| 105 | POP BX ; | ||
| 106 | POP CX ; RESTORE STACK ELEMENTS | ||
| 107 | POP BX ; | ||
| 108 | DB_0B: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR!! | ||
| 109 | RET ; | ||
| 110 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 111 | ; | ||
| 112 | ; REFRESH ACTIVE CODE PAGE TO DISPLAY | ||
| 113 | ; | ||
| 114 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 115 | DB_0C: MOV DESG_SEMAPHORE,TWO ; SET REFRESH COMMENCED | ||
| 116 | MOV CPD_REQ_DESG,CX ; SAVE NUMBER OF REQUESTED CP'S (0) | ||
| 117 | MOV DX,CPD_ACTIVE ; THIS IS THE REFRESH CALL | ||
| 118 | CMP DX,-1 ; CHECK IF THE ACTIVE_CP = INVALID | ||
| 119 | JE DB_0B ; | ||
| 120 | CLC ; CLEAR OUT THE CARRY FLAG | ||
| 121 | CALL SIGNAL_KBD_INVK ; | ||
| 122 | JC DB_0D ; IF CY SET, THEN KEYBOARD IS WRONG | ||
| 123 | CALL TEST_CP ; | ||
| 124 | JC DB_0B ; | ||
| 125 | CALL INVOKE_DATA ; | ||
| 126 | JC DB_0B ; | ||
| 127 | RET ; | ||
| 128 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 129 | ; | ||
| 130 | ; THIS SECTION FORMS THE NEW DESIGNATE CP LIST IN THE | ||
| 131 | ; CPD_TEMP_DESG. AT THE SAME TIME THE TOTAL NUMBER OF | ||
| 132 | ; REQUESTED CP's ARE FOUND. | ||
| 133 | ; | ||
| 134 | ; DX will contain the real CP's to load | ||
| 135 | ; | ||
| 136 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 137 | DB_1B: CLD ; SET DIRECTION FORWARD | ||
| 138 | PUSH ES ; | ||
| 139 | PUSH CX ; | ||
| 140 | PUSH DI ; | ||
| 141 | PUSH CS ; | ||
| 142 | POP ES ; | ||
| 143 | MOV CX,CPD_DESG_N ; | ||
| 144 | INC CX ; ACCOUNT FOR NUMBER OF CPS | ||
| 145 | LEA SI,CPD_DESG_N ; COPY PREPARED CP LIST TO TEMP BUFFER | ||
| 146 | LEA DI,CPD_TEMP_DESG ; | ||
| 147 | REP MOVSW ; | ||
| 148 | POP DI ; | ||
| 149 | POP CX ; | ||
| 150 | POP ES ; | ||
| 151 | ; | ||
| 152 | XOR DX,DX ; SET COUNT OF CP's TO PREPARE = 0 | ||
| 153 | PUSH CX ; | ||
| 154 | PUSH BX ; | ||
| 155 | MOV CPD_REQ_DESG,CX ; SAVE NUMBER OF REQUESTED CP'S | ||
| 156 | MOV SI,2 ; | ||
| 157 | MOV BX,SI ; | ||
| 158 | DB_1: MOV AX,RH.DESG_N[BX] ; GET REQUESTED CP | ||
| 159 | CMP AX,-1 ; TEST IF REQUESTED IS PLACE HOLDER.. | ||
| 160 | JE DB_1A ; | ||
| 161 | INC DX ; ADD ONE TO THE # VALID DESG | ||
| 162 | MOV CPD_TEMP_DESG[SI],AX ; OVERLAY THE NEWER CP INTO TEMP BUFFER | ||
| 163 | DB_1A: MOV CPD_REQ_DESG[SI],AX ; COPY TO THE REQ DESG LIST | ||
| 164 | INC SI ; | ||
| 165 | INC SI ; | ||
| 166 | INC BX ; | ||
| 167 | INC BX ; | ||
| 168 | LOOP DB_1 ; | ||
| 169 | POP BX ; | ||
| 170 | POP CX ; | ||
| 171 | ; | ||
| 172 | OR DX,DX ; ARE THERE NO CP's TO PREPARE? | ||
| 173 | JZ DB_0B ; IF NONE TO DESG, THEN ERROR!! | ||
| 174 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 175 | ; | ||
| 176 | ; THIS SECTION CHECKS THE LIST OF DESIGed CP's IN THE | ||
| 177 | ; TEMP BUFFER AND SETS AN ERROR FOR DUPLICATES. | ||
| 178 | ; | ||
| 179 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 180 | DB_2: PUSH BX ; CHECK THE DESIGNATE LIST FOR DUP's | ||
| 181 | PUSH CX ; AND FOR INVALIDS | ||
| 182 | MOV CX,CPD_TEMP_DESG ; | ||
| 183 | DEC CX ; NORMALIZE | ||
| 184 | JZ DB_3 ; IF ZERO, THEN NONE TO COMPARE | ||
| 185 | MOV BX,2 ; SET BX TO START OF LIST.... | ||
| 186 | MOV SI,2 ; SETUP SI READY TO MOVE DESG LIST IN! | ||
| 187 | DB_2A: PUSH BX ; | ||
| 188 | PUSH CX ; | ||
| 189 | MOV AX,CPD_TEMP_DESG[BX] ; GET CP DESGINATED | ||
| 190 | CMP AX,-1 ; TEST IF ENTRY = -1 | ||
| 191 | JE DB_2E ; IF SO, THEN SKIP | ||
| 192 | DB_2B: CMP CX,1 ; TEST IF IT IS THE ONLY ONE TO COMPARE | ||
| 193 | JE DB_2E ; AGAINST! | ||
| 194 | INC BX ; ADVANCE POINTER TO NEXT CP DESIGNATED | ||
| 195 | INC BX ; | ||
| 196 | CMP AX,CPD_TEMP_DESG[BX] ; CHECK IF NEXT CP's = ONE TESTED | ||
| 197 | JNE DB_2C ; IF error, THEN GET OUT | ||
| 198 | JUMP DB_2D ; | ||
| 199 | ; | ||
| 200 | DB_2C: LOOP DB_2B ; | ||
| 201 | DB_2E: POP CX ; | ||
| 202 | POP BX ; | ||
| 203 | INC BX ; | ||
| 204 | INC BX ; | ||
| 205 | OR CX,CX ; | ||
| 206 | JE DB_3 ; TEST IF ONLY ONE CP SPECIFIED | ||
| 207 | LOOP DB_2A ; | ||
| 208 | ; | ||
| 209 | DB_3: POP CX ; | ||
| 210 | POP BX ; | ||
| 211 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 212 | ; | ||
| 213 | ; NOW, THE TEMPORARY BUFFER CONTAINS THE NEW LIST | ||
| 214 | ; OF DESGINATED CODE PAGES. COPY THIS TO THE | ||
| 215 | ; PREPARED CP LIST. | ||
| 216 | ; | ||
| 217 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 218 | PUSH ES ; NOW ALL TESTS ARE SUCCESSFUL, | ||
| 219 | PUSH CX ; | ||
| 220 | PUSH DI ; | ||
| 221 | PUSH CS ; | ||
| 222 | POP ES ; | ||
| 223 | MOV CX,CPD_DESG_N ; | ||
| 224 | INC CX ; ACCOUNT FOR NUMBER OF CPS | ||
| 225 | LEA SI,CPD_TEMP_DESG ; COPY TEMP BUFFER INTO NEW CP LIST | ||
| 226 | LEA DI,CPD_DESG_N ; | ||
| 227 | REP MOVSW ; | ||
| 228 | POP DI ; | ||
| 229 | POP CX ; | ||
| 230 | POP ES ; | ||
| 231 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 232 | ; | ||
| 233 | ; NOW THAT THE LIST IS VALID, THE FONT PARSER & PARSING TABLES | ||
| 234 | ; ARE PREPARED FOR INITIALIZATION OF DESIGNATION. | ||
| 235 | ; | ||
| 236 | ; DX is the number of valid CP's | ||
| 237 | ; CX is the number of CP's desginated | ||
| 238 | ; | ||
| 239 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 240 | PUSH BX ; | ||
| 241 | PUSH ES ; | ||
| 242 | PUSH DI ; | ||
| 243 | ; CX=#DESGed, BX=pnter DESG LIST | ||
| 244 | MOV BX,2 ; SET BX TO POINT TO FIRST CP DESGed | ||
| 245 | LEA DI,FTABLE ; SET DI TO POINT TO MAIN PARSER TABLE | ||
| 246 | PUSH CS ; | ||
| 247 | POP ES ; INITIALIZE ES=CS | ||
| 248 | MOV [DI].FLAG,FLAG_RESTART ; SETUP UP MAIN TABLE FOR F-PARSER.SRC | ||
| 249 | MOV [DI].BUFFER_LEN,0 ; PREPARING FOR START OF DESIGNATION | ||
| 250 | MOV [DI].NUM_FTBLK,DX ; DX=#DESG TO PARSE OUT | ||
| 251 | ; | ||
| 252 | LEA SI,CPD_CLASS ; SET DI TO POINT TO (EGA,LCD) CLASSES | ||
| 253 | LEA DI,FTB1 ; SET DI TO POINT TO FIRST PARSING TABLE | ||
| 254 | ; | ||
| 255 | DB_4: MOV AX,CPD_REQ_DESG[BX] ; | ||
| 256 | CMP AX,-1 ; CHECK FOR PLACE HOLDER | ||
| 257 | JE DB_5 ; | ||
| 258 | MOV [DI].FTB_CP,AX ; COPY THE DESG CP VALUE INTO THE TABLE | ||
| 259 | PUSH CX ; AND ALSO THE CPD_CLASS | ||
| 260 | PUSH SI ; | ||
| 261 | PUSH DI ; | ||
| 262 | LEA DI,[DI].FTB_TID ; | ||
| 263 | MOV CX,8 ; | ||
| 264 | REP MOVSB ; | ||
| 265 | POP DI ; | ||
| 266 | POP SI ; | ||
| 267 | POP CX ; | ||
| 268 | ; | ||
| 269 | ADD DI,TYPE FTBLK ; MOVE POINTERS TO NEXT PARSING TABLE | ||
| 270 | DB_5: INC BX ; | ||
| 271 | INC BX ; ADVANCE BX TO NEXT DESG CP | ||
| 272 | LOOP DB_4 ; | ||
| 273 | ; | ||
| 274 | POP DI ; | ||
| 275 | POP ES ; | ||
| 276 | POP BX ; | ||
| 277 | ; | ||
| 278 | CALL FONT_PARSER ; CALL FONT PARSER TO INITIALIZE WRITES | ||
| 279 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 280 | ; | ||
| 281 | ; THIS WILL COPY THE START LOCATION OF THE FONTS (set by INIT) | ||
| 282 | ; INTO THE START LOCATION FOR THE DESIGNATE WRITE, WHICH FOLLOWS! | ||
| 283 | ; | ||
| 284 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 285 | PUSH SI ; | ||
| 286 | PUSH DI ; | ||
| 287 | PUSH ES ; | ||
| 288 | PUSH CS ; | ||
| 289 | POP ES ; SET EXTRA SEG ES = CS | ||
| 290 | LEA SI,CPD_FONT_PNTER ; | ||
| 291 | LEA DI,CPD_FONT_WRITE ; | ||
| 292 | MOV CX,CPD_DESG_N ; GET NUMBER OF DESIGNATES | ||
| 293 | ADD CX,CX ; DOUBLE FOR SEG:OFFSET | ||
| 294 | REP MOVSW ; COPY FONT START LOC's TO START WRITE | ||
| 295 | XOR DI,DI ; | ||
| 296 | LEA SI,CPD_FONT_DATA ; SET THE FONT_DATA COUNTERS BACK TO 0 | ||
| 297 | MOV CX,CPD_DESG_N ; | ||
| 298 | DB_6: MOV [SI],DI ; | ||
| 299 | INC SI ; | ||
| 300 | INC SI ; | ||
| 301 | LOOP DB_6 ; | ||
| 302 | POP ES ; | ||
| 303 | POP DI ; | ||
| 304 | POP SI ; | ||
| 305 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 306 | ; | ||
| 307 | ; CREATE THE FONT_PRIORITY TABLE | ||
| 308 | ; | ||
| 309 | ; THIS IS USED TO PLACE PRIORITY ON THE FONTS BEING DESIGNATED | ||
| 310 | ; ESPECIALLY WHEN THE NUMBER OF DESIGNATED FONTS < FONTS IN THE | ||
| 311 | ; xxx.CPI FILE. THIS IS USED TO SELECT THE NEEDED FONTS FOR | ||
| 312 | ; CP SUPPORT. | ||
| 313 | ; | ||
| 314 | ; RULE: PRIORITY 1 = ACTIVE MODE's FONT RESOLUTION | ||
| 315 | ; PRIORITY 2 = FONT RESOLUTION (non-repeats) OF ALL DISPLAY | ||
| 316 | ; MODES - STARTING FROM MODE (0) - MODE (?) | ||
| 317 | ; | ||
| 318 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 319 | PUSH AX ; | ||
| 320 | PUSH BX ; | ||
| 321 | PUSH CX ; | ||
| 322 | PUSH SI ; | ||
| 323 | PUSH DI ; | ||
| 324 | ; | ||
| 325 | LEA DI,FONT_PRIORITY ; | ||
| 326 | MOV CX,CPD_FONTS_N ; GET THE NUMBER OF SPECIFIED FONTS | ||
| 327 | ; | ||
| 328 | PUSH ES ; | ||
| 329 | PUSH DI ; | ||
| 330 | PUSH CX ; OVER-WRITE THE TABLE WITH 0FFH's | ||
| 331 | PUSH CS ; | ||
| 332 | POP ES ; | ||
| 333 | MOV AL,-1 ; | ||
| 334 | REP STOSB ; | ||
| 335 | POP CX ; | ||
| 336 | POP DI ; | ||
| 337 | POP ES ; | ||
| 338 | ; | ||
| 339 | XOR AH,AH ; AH=0 FOR MODE SET, AL=MODE_TYPE | ||
| 340 | MOV AL,MODE_VALUE ; | ||
| 341 | MOV SI,AX ; ESTABLISH INDEX INTO LOAD_MECH table | ||
| 342 | MOV AL,[SI].FONT_SIZE ; GET FONT_SIZE FOR THIS MODE_VALUE | ||
| 343 | OR AL,AL ; TEST FOR FONT_VALUE=0 | ||
| 344 | JNZ DB_8 ; | ||
| 345 | CALL ASK_BIOS_FONT_SIZE ; GET BIOS TO INDICATE FONT_SIZE | ||
| 346 | DB_8: MOV CS:[DI],AL ; PUT ACTIVE FONT RESOLUTION INTO 1ST! | ||
| 347 | INC DI ; ADVANCE POINTER TO NEXT POSITION | ||
| 348 | DEC CX ; SUBTRACT ONE FONT RESOLUTION... | ||
| 349 | JZ DB_A ; IF THERE WAS ONLY 1 FONT...THEN DONE | ||
| 350 | ; | ||
| 351 | XOR SI,SI ; START WITH MODE = 0 | ||
| 352 | DB_8A: PUSH CX ; | ||
| 353 | PUSH DI ; | ||
| 354 | MOV CX,NUM_FONT_PRIORITY ; | ||
| 355 | LEA DI,FONT_PRIORITY ; SET DI TO START OF TABLE | ||
| 356 | MOV AL,[SI].FONT_SIZE ; GET FONT SIZE FOR THIS MODE | ||
| 357 | CMP AL,-1 ; TEST FOR INVALID FONT SIZE | ||
| 358 | JE DB_9 ; IF SO, THEN TRY NEXT VALUE | ||
| 359 | OR AL,AL ; TEST FOR FONT_VALUE=0 | ||
| 360 | JNZ DB_8C ; | ||
| 361 | ; OTHERWISE, ONLY EGA BIOS WOULD KNOW!!! | ||
| 362 | CMP SI,EIGHT ; ONLY EIGHT DIFFERENT FONTS PERMITTED!! | ||
| 363 | JAE DB_9 ; | ||
| 364 | ; | ||
| 365 | PUSH CX ; | ||
| 366 | CALL ASK_BIOS_SCAN_LINES ; GET ENCODED SCAN LINES VALUE!!! | ||
| 367 | JC DB_9 ; | ||
| 368 | MOV CX,SI ; PUT INDEX INTO CX | ||
| 369 | INC CL ; NORMALIZE INDEX VALUE (1-8) | ||
| 370 | SAR AL,CL ; | ||
| 371 | POP CX ; | ||
| 372 | JNC DB_9 ; | ||
| 373 | MOV AL,CS:CHAR_HEIGHT[SI] ; | ||
| 374 | ; | ||
| 375 | DB_8C: CMP AL,CS:[DI] ; | ||
| 376 | JE DB_9 ; IF EQUAL, THEN ALREADY IN TABLE | ||
| 377 | INC DI ; OTHERWISE, TAKE THIS MODES FONT RES | ||
| 378 | LOOP DB_8C ; AND COMPARE AGAINST NEXT PRIOR.VALUE | ||
| 379 | ; | ||
| 380 | POP DI ; NEW RESOLUTION FOUND...ADD TO LIST | ||
| 381 | POP CX ; | ||
| 382 | MOV CS:[DI],AL ; PUT NEW VALUE IN THE TABLE | ||
| 383 | INC DI ; AND ADVANCE FOR NEXT FONT RESOLUTION | ||
| 384 | JUMP DB_9A ; LOOP WILL DECREMENT #FONTS TO FIND | ||
| 385 | DB_9: POP DI ; | ||
| 386 | POP CX ; | ||
| 387 | INC CX ; MATCH FOUND..SO LEAVE #FONT TO PRIOR. | ||
| 388 | DB_9A: INC SI ; POINT TO NEXT DISPLAY MODE | ||
| 389 | CMP SI,NUM_FONT_SIZES ; | ||
| 390 | JAE DB_A ; | ||
| 391 | LOOP DB_8A ; CONTINUE UNTIL THE #FONTS DESIGNATED | ||
| 392 | ; HAVE BEEN PRIORITIZED OR ALL MODES | ||
| 393 | DB_A: POP DI ; ARE CHECKED OUT! | ||
| 394 | POP SI ; | ||
| 395 | POP CX ; | ||
| 396 | POP BX ; | ||
| 397 | POP AX ; | ||
| 398 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 399 | ; | ||
| 400 | ; | ||
| 401 | ; | ||
| 402 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 403 | MOV DESG_SEMAPHORE,ONE ; SET DESIGNATION TO COMMENCE... | ||
| 404 | RET ; | ||
| 405 | DESIGNATE_BEGIN ENDP ; | ||
| 406 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 407 | ; | ||
| 408 | ; DESIGNATE END | ||
| 409 | ; | ||
| 410 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 411 | DESIGNATE_END PROC ; | ||
| 412 | CMP DESG_SEMAPHORE,ZERO ; TEST IF DESG_SEMAPHORE = DATA WRITTEN | ||
| 413 | JE DE_1 ; | ||
| 414 | ; | ||
| 415 | CMP CPD_REQ_DESG,ZERO ; TEST IF ZERO CP's REQUESTED (REFRESH) | ||
| 416 | JE DE_0 ; | ||
| 417 | ; | ||
| 418 | CALL VERIFY_FPARSER ; CALL ROUTINE TO VERIFY THAT THE | ||
| 419 | JC DE_2 ; FONT PARSER FINISHED OK... | ||
| 420 | ; | ||
| 421 | PUSH ES ; NOW THE DESIGNATE IS OVER... | ||
| 422 | PUSH DI ; | ||
| 423 | MOV CX,CPD_ACTIVE ; CHECK IF ACTIVE_CP IS STILL VALID! | ||
| 424 | CALL FIND_CP ; TRY AND FIND CPD_ACTIVE? | ||
| 425 | POP DI ; | ||
| 426 | POP ES ; | ||
| 427 | JNC DE_0 ; | ||
| 428 | MOV CX,-1 ; | ||
| 429 | MOV CPD_ACTIVE,CX ; | ||
| 430 | DE_0: MOV DESG_SEMAPHORE,ZERO ; | ||
| 431 | RET ; | ||
| 432 | ; | ||
| 433 | DE_1: OR BUF.STATUS,TWELVE ; Error>> NO DESGINATE START | ||
| 434 | JUMP DE_0 ; | ||
| 435 | DE_2: CALL HANDLE_WRITE_ERROR ; RESET ALL DESIGNATED INFORMATION | ||
| 436 | OR BUF.STATUS,FAIL ; Error>> FONT DATA IS BAD | ||
| 437 | JUMP DE_0 ; | ||
| 438 | DESIGNATE_END ENDP ; | ||
| 439 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 440 | ; | ||
| 441 | ; INVOKE | ||
| 442 | ; | ||
| 443 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 444 | INVOKE_CP PROC ; | ||
| 445 | LES DI,RH.REQUEST_PACKET ; AND DI TO POINT TO REQUEST PACKET | ||
| 446 | MOV CX,RH.INVK_LENGTH ; GET LENGTH OF REMAINING HEADER | ||
| 447 | ; | ||
| 448 | CMP CX,TWO ; TEST IF LENGTH OF TABLE IS GREATER | ||
| 449 | JNE ICP_2 ; THAN ONE CP! | ||
| 450 | ; | ||
| 451 | MOV CX,RH.INVK_CP ; GET THE CODE PAGE TO INVOKE | ||
| 452 | MOV DX,CX ; SAVE CP VALUE | ||
| 453 | CMP CX,-1 ; TEST FOR INVALID CODE PAGE! | ||
| 454 | JE ICP_1A ; | ||
| 455 | ; | ||
| 456 | PUSH CPD_ACTIVE ; SAVE ACTIVE_CP, FOR POSSIBLE USE... | ||
| 457 | MOV CPD_ACTIVE,CX ; | ||
| 458 | CALL TEST_CP ; TRY AND LOAD THE REQUESTED CP | ||
| 459 | POP CX ; | ||
| 460 | JC ICP_1AA ; IF ERROR, THEN RESTORE OLD CP | ||
| 461 | ; | ||
| 462 | CMP CX,CPD_ACTIVE ; TEST IF OLD CP=ACTIVE!!! | ||
| 463 | JE ICP_0A ; | ||
| 464 | ; | ||
| 465 | CALL INVOKE_DATA ; IF EVERYTHING OK, THEN LOAD DATA | ||
| 466 | JC ICP_2A ; | ||
| 467 | ; | ||
| 468 | ICP_0A: CALL SIGNAL_KBD_INVK ; DX CONTAINS CODEPAGE | ||
| 469 | JC ICP_1 ; IF CY THEN ERROR | ||
| 470 | RET ; | ||
| 471 | ; | ||
| 472 | ICP_1: OR BUF.STATUS,EIGHT ; Error>> KEYB ERROR | ||
| 473 | RET ; | ||
| 474 | ICP_1AA:MOV CPD_ACTIVE,CX ; PUT OLD CP BACK ACTIVE | ||
| 475 | ICP_1A: OR BUF.STATUS,SEVEN ; Error>> CODE PAGE NOT FOUND | ||
| 476 | RET ; | ||
| 477 | ICP_2A: MOV CPD_ACTIVE,CX ; | ||
| 478 | ICP_2: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR | ||
| 479 | RET ; | ||
| 480 | INVOKE_CP ENDP ; | ||
| 481 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 482 | ; | ||
| 483 | ; QUERY | ||
| 484 | ; | ||
| 485 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 486 | QUERY_CP PROC ; | ||
| 487 | LES DI,RH.REQUEST_PACKET ; SETUP ADDRESSING TO HEADER | ||
| 488 | ; | ||
| 489 | MOV CX,TWO ; | ||
| 490 | MOV RH.INVK_LENGTH,CX ; CREATE RETURN 'N' VALUE | ||
| 491 | ; | ||
| 492 | CALL TEST_CP ; FIND OUT IF CP DATA IS OK! | ||
| 493 | MOV CX,CPD_ACTIVE ; | ||
| 494 | JNC QCP_A ; | ||
| 495 | MOV CX,-1 ; MAKE THE ACTIVE REPONSE AS INVALID | ||
| 496 | ; | ||
| 497 | QCP_A: MOV RH.INVK_CP,CX ; SET THE CODE PAGE IN HEADER | ||
| 498 | CMP CX,-1 ; TEST IF NO CP SPECIFIED? | ||
| 499 | JE QCP_0 ; | ||
| 500 | RET ; | ||
| 501 | ; | ||
| 502 | QCP_0: OR BUF.STATUS,SEVEN ; Error>> NOT CODE PAGE SPECIFIED | ||
| 503 | RET ; | ||
| 504 | QUERY_CP ENDP ; | ||
| 505 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 506 | ; | ||
| 507 | ; QUERY LIST | ||
| 508 | ; | ||
| 509 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 510 | QUERY_CP_LIST PROC ; | ||
| 511 | LES DI,RH.REQUEST_PACKET ; AND DI TO POINT TO REQUEST PACKET | ||
| 512 | ; | ||
| 513 | MOV CX,CPD_HDWR_N ; | ||
| 514 | MOV RH.QLST_N_HDWR,CX ; | ||
| 515 | ADD CX,CPD_DESG_N ; | ||
| 516 | ADD CX,TWO ; ACCOUNT FOR LENGTH OF 'N's | ||
| 517 | ADD CX,CX ; | ||
| 518 | MOV RH.QLST_LENGTH,CX ; CREATE RETURN TABLE LENGTH | ||
| 519 | ; | ||
| 520 | PUSH AX ; | ||
| 521 | PUSH BX ; | ||
| 522 | PUSH SI ; | ||
| 523 | MOV CX,CPD_HDWR_N ; | ||
| 524 | MOV BX,2 ; | ||
| 525 | OR CX,CX ; | ||
| 526 | JE QCP_3 ; | ||
| 527 | QCP_2: MOV AX,CPD_HDWR_N[BX] ; | ||
| 528 | MOV RH.QLST_N_HDWR[BX],AX ; | ||
| 529 | INC BX ; | ||
| 530 | INC BX ; | ||
| 531 | LOOP QCP_2 ; | ||
| 532 | ; | ||
| 533 | QCP_3: MOV CX,CPD_DESG_N ; SET TABLE ENTRY FOR DESIGNATE | ||
| 534 | MOV RH.QLST_N_HDWR[BX],CX ; | ||
| 535 | INC BX ; | ||
| 536 | INC BX ; | ||
| 537 | ; | ||
| 538 | OR CX,CX ; | ||
| 539 | JE QCP_4A ; | ||
| 540 | MOV SI,2 ; | ||
| 541 | QCP_4: MOV AX,CPD_DESG_N[SI] ; | ||
| 542 | MOV RH.QLST_N_HDWR[BX],AX ; | ||
| 543 | INC BX ; | ||
| 544 | INC BX ; | ||
| 545 | INC SI ; | ||
| 546 | INC SI ; | ||
| 547 | LOOP QCP_4 ; | ||
| 548 | QCP_4A: POP SI ; | ||
| 549 | POP BX ; | ||
| 550 | POP AX ; | ||
| 551 | RET ; | ||
| 552 | QCP_5: OR BUF.STATUS,SEVEN ; Error>> NO CODE PAGE INVOKED | ||
| 553 | RET ; | ||
| 554 | QCP_6: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR | ||
| 555 | RET ; | ||
| 556 | QUERY_CP_LIST ENDP ; | ||
| 557 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 558 | ; | ||
| 559 | ; GET HARDWARE CODE PAGE TABLE | ||
| 560 | ; | ||
| 561 | ; INPUT: | ||
| 562 | ; none | ||
| 563 | ; OUTPUT: | ||
| 564 | ; SI = pointer to HARDWARE table (n,h_cp1,h_cp2,...) | ||
| 565 | ; | ||
| 566 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 567 | GET_HDWR_CP PROC ; | ||
| 568 | LEA SI,CP_PNTER_TABLE ; | ||
| 569 | MOV SI,[SI].HDWR_CP_STRUC ; | ||
| 570 | RET ; | ||
| 571 | GET_HDWR_CP ENDP ; | ||
| 572 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 573 | ; | ||
| 574 | ; GET DESIGNATE CODE PAGE TABLE | ||
| 575 | ; | ||
| 576 | ; INPUT: none | ||
| 577 | ; OUTPUT: SI = pointer to DESIGNATE table (n,d_cp1,d_cp2,...) | ||
| 578 | ; | ||
| 579 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 580 | GET_DESG_CP PROC ; | ||
| 581 | LEA SI,CP_PNTER_TABLE ; | ||
| 582 | MOV SI,[SI].DESG_CP_STRUC ; | ||
| 583 | RET ; | ||
| 584 | GET_DESG_CP ENDP ; | ||
| 585 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 586 | ; | ||
| 587 | ; GET FONT POINTER TABLE | ||
| 588 | ; | ||
| 589 | ; INPUT: | ||
| 590 | ; none | ||
| 591 | ; OUTPUT: | ||
| 592 | ; SI = pointer to FONTS table (pnter_cp1,pnter_cp2,...) | ||
| 593 | ; | ||
| 594 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 595 | GET_FONT_CP PROC ; | ||
| 596 | LEA SI,CP_PNTER_TABLE ; | ||
| 597 | MOV SI,[SI].FONT_CP_STRUC ; | ||
| 598 | RET ; | ||
| 599 | GET_FONT_CP ENDP ; | ||
| 600 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 601 | ; | ||
| 602 | ; GET WRITE POINTER | ||
| 603 | ; | ||
| 604 | ; INPUT: | ||
| 605 | ; none | ||
| 606 | ; OUTPUT: | ||
| 607 | ; SI = pointer to WRITE pointers | ||
| 608 | ; | ||
| 609 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 610 | GET_WRITE_PNTR PROC ; | ||
| 611 | LEA SI,CP_PNTER_TABLE ; | ||
| 612 | MOV SI,[SI].WRITE_DATA_STRUC; | ||
| 613 | RET ; | ||
| 614 | GET_WRITE_PNTR ENDP ; | ||
| 615 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 616 | ; | ||
| 617 | ; FIND ACTIVE CODE PAGE | ||
| 618 | ; | ||
| 619 | ; INPUT: | ||
| 620 | ; CX = code page to find | ||
| 621 | ; OUTPUT: | ||
| 622 | ; 'CY' = 0 if found, 1 if NOT | ||
| 623 | ; CX = 0 for hdwr, 1 for designated | ||
| 624 | ; ES : DI = pointer to FONT data table | ||
| 625 | ; | ||
| 626 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 627 | FIND_CP PROC ; | ||
| 628 | PUSH AX ; | ||
| 629 | PUSH BX ; | ||
| 630 | PUSH SI ; | ||
| 631 | MOV AX,CX ; | ||
| 632 | CALL GET_DESG_CP ; SET BX TO DESG TABLE INFO | ||
| 633 | MOV CX,[SI] ; GET THE NUMBER OF DESG CP's | ||
| 634 | OR CX,CX ; | ||
| 635 | JZ FCP_1 ; MOVE ONTO DESG TEST WITH 0 CP's | ||
| 636 | MOV BX,TWO ; ELSE, USE SI TO POINT TO 1ST CP | ||
| 637 | FCP_0: CMP AX,[SI+BX] ; SEARCH FOR CP MATCH | ||
| 638 | JE FCP_4 ; CP MATCHED!! SET DESG INFO & EXIT | ||
| 639 | INC BX ; ADVANCE SI POINTER TO NEXT CP | ||
| 640 | INC BX ; | ||
| 641 | LOOP FCP_0 ; CHECK ACROSS ALL CP's IN TABLE | ||
| 642 | FCP_1: CALL GET_HDWR_CP ; NOW, REPEAT SAME OPERATION | ||
| 643 | MOV CX,[SI] ; WITH THE HARDWARE CP's | ||
| 644 | OR CX,CX ; | ||
| 645 | JZ FCP_3 ; IF THIS FAR, THEN SET ERROR FOR | ||
| 646 | INC SI ; | ||
| 647 | INC SI ; ADVANCE POINTER BY TWO...SINCE | ||
| 648 | MOV BX,ZERO ; PNTER'S DON'T HAVE 'n'... | ||
| 649 | FCP_2: CMP AX,[SI+BX] ; SEARCH AGAIN FOR CP MATCH | ||
| 650 | JE FCP_5 ; CP MATCHED!! SET HDWR INFO & EXIT | ||
| 651 | INC BX ; ADVANCE SI POINTER TO NEXT CP | ||
| 652 | INC BX ; | ||
| 653 | LOOP FCP_2 ; REPEAT FOR ALL CP ENTRIES | ||
| 654 | FCP_3: XOR CX,CX ; SET RETURN VALUES TO ZERO | ||
| 655 | XOR DI,DI ; | ||
| 656 | POP SI ; | ||
| 657 | POP BX ; | ||
| 658 | POP AX ; | ||
| 659 | STC ; CY=1 FOR ERROR | ||
| 660 | RET ; EXIT | ||
| 661 | FCP_4: MOV CX,ONE ; ®®DESIGNATED CODE PAGE FOUND¯¯ | ||
| 662 | CALL GET_FONT_CP ; SET THE BX VALUE TO THE FONT DATA | ||
| 663 | SUB BX,2 ; NORMALIZE BX VALUE;;;;;;;;;;;;;;; | ||
| 664 | ADD SI,BX ; FORMULATE THE SI INDEX BY ADDING | ||
| 665 | ADD SI,BX ; BX INDEX x 2 (dword FONT_PNTER) | ||
| 666 | MOV DI,[SI] ; TAKE OFFSET DATA FROM font_table | ||
| 667 | MOV ES,[SI+2] ; AND SEGMENT ALSO! | ||
| 668 | POP SI ; | ||
| 669 | POP BX ; | ||
| 670 | POP AX ; | ||
| 671 | CLC ; CY=0 FOR OK! | ||
| 672 | RET ; EXIT | ||
| 673 | FCP_5: XOR CX,CX ; ®®HARDWARE CODE PAGE FOUND¯¯ | ||
| 674 | XOR DI,DI ; | ||
| 675 | POP SI ; | ||
| 676 | POP BX ; | ||
| 677 | POP AX ; | ||
| 678 | CLC ; | ||
| 679 | RET ; EXIT | ||
| 680 | FIND_CP ENDP ; | ||
| 681 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 682 | ; | ||
| 683 | ; VERIFY_FPARSER A ROUTINE THAT CHECKS THE | ||
| 684 | ; FONT_BLOCKS FOR INCOMPLETE DESIGNATES? | ||
| 685 | ; IF SO, THEN AN ERROR OCCURRED... | ||
| 686 | ; | ||
| 687 | ; INPUT: | ||
| 688 | ; FONT_PARSER should be completed parsing | ||
| 689 | ; | ||
| 690 | ; OUTPUT: | ||
| 691 | ; CY = 0 if all is correct | ||
| 692 | ; 1 if one or more designates are incomplete | ||
| 693 | ; | ||
| 694 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 695 | VERIFY_FPARSER PROC ; | ||
| 696 | PUSH AX ; | ||
| 697 | PUSH CX ; | ||
| 698 | PUSH ES ; | ||
| 699 | PUSH DI ; | ||
| 700 | ; | ||
| 701 | PUSH CS ; | ||
| 702 | POP ES ; | ||
| 703 | ; | ||
| 704 | MOV CX,CPD_REQ_DESG ; CX = REQUESTED DESG CP's | ||
| 705 | LEA DI,FTB1 ; SET DI TO POINT TO FIRST PARSING TABLE | ||
| 706 | ; | ||
| 707 | VFP_4: MOV AX,[DI].FTB_STATUS ; GET STATUS OF PARSING TABLE #n | ||
| 708 | CMP AX,FSTAT_COMPLETE ; FIND OUT IF THIS CP COMPLETED? | ||
| 709 | JE VFP_6 ; | ||
| 710 | ; | ||
| 711 | CMP AX,FSTAT_FONT ; CHECK IF AT LEAST THE FONT DATA FOUND | ||
| 712 | JNE VFP_8 ; IF NOT, THEN AN ERROR OCCURRED.... | ||
| 713 | CMP [DI].FTB_DLEFT,ZERO ; IF SO, THEN NO DATA CAN BE LEFT.... | ||
| 714 | JNE VFP_8 ; OTHERWISE ANOTHER ERROR ? | ||
| 715 | VFP_6: ADD DI,TYPE FTBLK ; MOVE POINTERS TO NEXT PARSING TABLE | ||
| 716 | LOOP VFP_4 ; | ||
| 717 | CLC ; | ||
| 718 | JUMP VFP_9 ; | ||
| 719 | ; | ||
| 720 | VFP_8: STC ; | ||
| 721 | VFP_9: POP DI ; | ||
| 722 | POP ES ; | ||
| 723 | POP CX ; | ||
| 724 | POP AX ; | ||
| 725 | RET ; | ||
| 726 | VERIFY_FPARSER ENDP ; | ||
| 727 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 728 | \ No newline at end of file | ||