summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/CPS-FUNC.INC
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/CPS-FUNC.INC')
-rw-r--r--v4.0/src/DEV/DISPLAY/CPS-FUNC.INC728
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6IF1 ;
7 %OUT . ®CPS-FUNC.INC¯
8ENDIF ;
9 ;
10CP_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 ;
16NUM_CP_FUNCTION EQU ($-CP_FUNCTION)/4 ;
17 ;
18DESG_SEMAPHORE DB 0 ; TEMPORARY
19G_IOCTL_SEMA DB 0 ; SEMAPHORE TO INDICATE IF CPS IS BUSY!
20 ;
21CHAR_HEIGHT DB 8 ;
22 DB 14 ;
23 DB 16 ;
24 DB 19 ;
25 DB 0 ;
26 DB 0 ;
27 DB 0 ;
28 DB 0 ;
29NUM_CHAR_HEIGHT EQU ($-CHAR_HEIGHT) ;
30 ;
31 ;
32GENERIC_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 ;
50GI_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 ;
59GI_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!
67GI_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 ;
76GI_3: CLC ; CLEAR CY TO TRY ATTACHED CON!
77GI_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 ;
85GENERIC_IOCTL ENDP ;
86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
87;
88; DESIGNATE BEGIN
89;
90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
91DESIGNATE_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
98DB_0: CMP CX,CPD_DESG_N ; CHECK IF NUMBER > # CONFIGed
99 JA DB_0B ;
100 JUMP DB_1B ;
101 ;
102DB_0D: OR BUF.STATUS,EIGHT ; Error>> KEYBOARD ERROR!!
103 RET ;
104DB_2D: POP CX ; RESTORE STACK ELEMENTS
105 POP BX ;
106 POP CX ; RESTORE STACK ELEMENTS
107 POP BX ;
108DB_0B: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR!!
109 RET ;
110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111;
112; REFRESH ACTIVE CODE PAGE TO DISPLAY
113;
114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115DB_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137DB_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 ;
158DB_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
163DB_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
180DB_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!
187DB_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
192DB_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 ;
200DB_2C: LOOP DB_2B ;
201DB_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 ;
209DB_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 ;
255DB_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
270DB_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 ;
298DB_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
346DB_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
352DB_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 ;
375DB_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
385DB_9: POP DI ;
386 POP CX ;
387 INC CX ; MATCH FOUND..SO LEAVE #FONT TO PRIOR.
388DB_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
393DB_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 ;
405DESIGNATE_BEGIN ENDP ;
406;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
407;
408; DESIGNATE END
409;
410;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
411DESIGNATE_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 ;
430DE_0: MOV DESG_SEMAPHORE,ZERO ;
431 RET ;
432 ;
433DE_1: OR BUF.STATUS,TWELVE ; Error>> NO DESGINATE START
434 JUMP DE_0 ;
435DE_2: CALL HANDLE_WRITE_ERROR ; RESET ALL DESIGNATED INFORMATION
436 OR BUF.STATUS,FAIL ; Error>> FONT DATA IS BAD
437 JUMP DE_0 ;
438DESIGNATE_END ENDP ;
439;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
440;
441; INVOKE
442;
443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
444INVOKE_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 ;
468ICP_0A: CALL SIGNAL_KBD_INVK ; DX CONTAINS CODEPAGE
469 JC ICP_1 ; IF CY THEN ERROR
470 RET ;
471 ;
472ICP_1: OR BUF.STATUS,EIGHT ; Error>> KEYB ERROR
473 RET ;
474ICP_1AA:MOV CPD_ACTIVE,CX ; PUT OLD CP BACK ACTIVE
475ICP_1A: OR BUF.STATUS,SEVEN ; Error>> CODE PAGE NOT FOUND
476 RET ;
477ICP_2A: MOV CPD_ACTIVE,CX ;
478ICP_2: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR
479 RET ;
480INVOKE_CP ENDP ;
481;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
482;
483; QUERY
484;
485;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
486QUERY_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 ;
497QCP_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 ;
502QCP_0: OR BUF.STATUS,SEVEN ; Error>> NOT CODE PAGE SPECIFIED
503 RET ;
504QUERY_CP ENDP ;
505;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
506;
507; QUERY LIST
508;
509;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
510QUERY_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 ;
527QCP_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 ;
533QCP_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 ;
541QCP_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 ;
548QCP_4A: POP SI ;
549 POP BX ;
550 POP AX ;
551 RET ;
552QCP_5: OR BUF.STATUS,SEVEN ; Error>> NO CODE PAGE INVOKED
553 RET ;
554QCP_6: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR
555 RET ;
556QUERY_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
567GET_HDWR_CP PROC ;
568 LEA SI,CP_PNTER_TABLE ;
569 MOV SI,[SI].HDWR_CP_STRUC ;
570 RET ;
571GET_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
580GET_DESG_CP PROC ;
581 LEA SI,CP_PNTER_TABLE ;
582 MOV SI,[SI].DESG_CP_STRUC ;
583 RET ;
584GET_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
595GET_FONT_CP PROC ;
596 LEA SI,CP_PNTER_TABLE ;
597 MOV SI,[SI].FONT_CP_STRUC ;
598 RET ;
599GET_FONT_CP ENDP ;
600;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
601;
602; GET WRITE POINTER
603;
604; INPUT:
605; none
606; OUTPUT:
607; SI = pointer to WRITE pointers
608;
609;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
610GET_WRITE_PNTR PROC ;
611 LEA SI,CP_PNTER_TABLE ;
612 MOV SI,[SI].WRITE_DATA_STRUC;
613 RET ;
614GET_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
627FIND_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
637FCP_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
642FCP_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'...
649FCP_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
654FCP_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
661FCP_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
673FCP_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
680FIND_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
695VERIFY_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 ;
707VFP_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 ?
715VFP_6: ADD DI,TYPE FTBLK ; MOVE POINTERS TO NEXT PARSING TABLE
716 LOOP VFP_4 ;
717 CLC ;
718 JUMP VFP_9 ;
719 ;
720VFP_8: STC ;
721VFP_9: POP DI ;
722 POP ES ;
723 POP CX ;
724 POP AX ;
725 RET ;
726VERIFY_FPARSER ENDP ;
727;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
728 \ No newline at end of file