]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/DISPLAY/CPS-FUNC.INC

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / DISPLAY / CPS-FUNC.INC
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 \1a