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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / DISPLAY / F-PARSER.INC
1
2 PAGE ,132
3
4 IF1
5 %OUT . ®F-PARSER.SRC¯
6 ENDIF
7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ;;
9 ;; FILENAME: CPS Device Driver -- Font Parser
10 ;; MODULE NAME: CPSFONT
11 ;; TYPE: Font Parser Module
12 ;; LINK PROCEDURE: Link CPSPMnn+CPSFONTn+PTRMSGn+CPSPInn into .EXE format.
13 ;; CPSPM must be first. CPSPInn must be last. Everything
14 ;; before CPSPInn will be resident.
15 ;; INCLUDE FILES:
16 ;; CPSPEQU.INC
17 ;; Remarks :
18 ;;
19 ;; changes are made in stages : PTRSELLO, PTRSELHI, PTRLENLO, PTRLENHI
20 ;; as for Display-type of DEVICE_ID, there will be no printer-type of
21 ;; of DEVICE_TYPE. And these four stages are for the DEVICE_TYPE with
22 ;; the value of printer-type.
23 ;;
24 ;; (most codes in the four stages are masked out as comments than real
25 ;; codes to save spaces. Also mask out lines that contain the
26 ;; following varaibles :
27 ;; -- PTR_SEL_WORD
28 ;; -- PTR_SELOB
29 ;; -- PTR_SEHIB
30 ;; -- PTR_LEN_WORD
31 ;; -- PTR_LNLOB
32 ;; -- PTR_LNHIB
33 ;; -- PRE_FONT_P0
34 ;; -- PRE_FONT_P
35 ;; -- FTB_SELECT
36 ;; -- FTB_SELLEN
37 ;;
38 ;;
39 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
40 ;;
41 ;INCLUDE CPSPEQU.INC ;;
42 ;;
43 STAT_DELETE EQU 08000H ; previous degignate deleted (DST)
44 ; STAT_DELETE : only for FIFO
45 STAT_NOFIND EQU 08008H ; codepage,device not found (DST)
46 STAT_DEVERR EQU 0800AH ; Device error (DST, IVK, QIV, QLS)
47 STAT_BADATA EQU 0800CH ; bad font file (DST)
48 STAT_BADDEN EQU 0800CH ; no DST (DEN)
49 STAT_TOMANY EQU 0800CH ; too manay codepages (DST)
50 STAT_DUPLCP EQU 0800CH ; too manay codepages (DST)
51 STAT_NOCPIV EQU 08007H ; no codepage designated/invoked
52 STAT_NOCP EQU 08007H ; no codepage designated/invoked
53 ; (IVK, QIV, QLS)
54 TYPE_DISPLAY EQU 01H ;; display type device
55 FLAG_RESTART EQU 000001H ;; bit 1 = restart the parsing
56
57 FPKT EQU DS:[SI] ;
58 FTP EQU ES:[BX] ;
59 ; ( I=Input O=Output )
60 FTBLK STRUC ;
61 FTB_LENGTH DW TYPE FTBLK ; (NOT TO BE CHANGED)
62 FTB_STATUS DW 0FFFFH ; (O) parsing compelte
63 FTB_TYPE DW 0 ; (O)
64 FTB_TID DB '........' ; (I)
65 FTB_CP DW 0FFFFH ; (I)
66 FTB_MOD DW 0 ; (O)
67 FTB_FONTS DW 0 ; (O)
68 FTB_ROWS DB 0 ;; (O) DISPLAY TYPE DEVICE
69 FTB_COLS DB 0 ;; (O) DISPLAY TYPE DEVICE
70 FTB_X DB 0 ;; (O) DISPLAY TYPE DEVICE
71 FTB_Y DB 0 ;; (O) DISPLAY TYPE DEVICE
72 FTB_COUNT DW 0 ;; (O) DISPLAY TYPE DEVICE
73 FTB_DLEFT DW 0 ; (O) =0, none to come
74 FTB_DLEN DW 0 ; (O) =0, not in this packet
75 FTB_DALO DW 0 ; (O) in the DOS "packet" buffer
76 FTB_DAHI DW 0 ; (O) " " " " "
77 TARGET_LO DW 0 ; internal registers
78 TARGET_HI DW 0 ; internal registers
79 FTBLK ENDS ;
80 ;
81 FBUFS STRUC ;
82 FLAG DW 0 ;
83 BUFFER_LEN DW 0 ;
84 BUFFER_ADDR DD 0 ;
85 NUM_FTBLK DW 0 ; no. of FTBKL entries
86 FBUFS ENDS ;
87 ; STATUS : (in FTB_STATUS)
88 FSTAT_COMPLETE EQU 0FFFFH ; parsing compeleted. (good status)
89 FSTAT_FONT EQU 0FFFEH ; font data is defined and returned
90 FSTAT_FOUND EQU 0FFFDH ; informations including font-length
91 FSTAT_MATCH EQU 0FFFCH ; font header matches FTBLK
92 FSTAT_SEARCH EQU 0FFFBH ; seraching for header & font
93 FSTAT_BOTTOM EQU 0FFF0H ; below this are the DOS_STATUS.
94 ;
95 ;; the FSTAT with value lower than 0FFF0H is to be returned to the DOS
96 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
97 ;;
98 PUBLIC FTABLE,FONT_PARSER ;;
99 ;;
100 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
101 ;;
102 ;; ************************************
103 ;; ** **
104 ;; ** Resident Code **
105 ;; ** **
106 ;; ************************************
107 ;;
108 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
109 ;;
110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111 ;;
112 ;; FONT_PARSER data
113 ;;
114 ;; -- Interface table : FTABLE
115 ;;
116 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117 FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing
118 FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries
119 FTB2 FTBLK <,,,,,,,,,,,,> ;;
120 FTB3 FTBLK <,,,,,,,,,,,,> ;;
121 FTB4 FTBLK <,,,,,,,,,,,,> ;;
122 FTB5 FTBLK <,,,,,,,,,,,,> ;;
123 FTB6 FTBLK <,,,,,,,,,,,,> ;;
124 FTB7 FTBLK <,,,,,,,,,,,,> ;;
125 FTB8 FTBLK <,,,,,,,,,,,,> ;;
126 FTB9 FTBLK <,,,,,,,,,,,,> ;;
127 FTBa FTBLK <,,,,,,,,,,,,> ;;
128 FTBb FTBLK <,,,,,,,,,,,,> ;;
129 FTBc FTBLK <,,,,,,,,,,,,> ;;
130 ;;
131 FP_ERROR DW 0000H ;; internal error register
132 ;;
133 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
134 ;; the followings are bytes accumulated
135 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136 FTAG_LEN EQU 8 ;; FILE TAGE in the font file header
137 FTAG_COUNT DW 0000H ;;
138 ;;
139 FTAG_PATTERN LABEL BYTE ;;
140 DB 0FFH ;;
141 DB 'FONT ' ;;
142 ;;
143 ;;
144 ;; POINTER in the font file header
145 fptr_LOW LABEL WORD ;;
146 fptr_LOL DB 00H ;; NEXT
147 fptr_LOH DB 00H ;;
148 fptr_HIGH LABEL WORD ;;
149 fptr_HIL DB 00H ;;
150 fptr_HIH DB 00H ;;
151 ;;
152 ;;
153 ;;
154 ENTRY_WORD LABEL WORD ;;
155 ENTRY_LOB DB 00H ;; ENTRY COUNT
156 ENTRY_HIB DB 00H ;;
157 NEXT_LOW LABEL WORD ;;
158 NEXT_LOL DB 00H ;; NEXT
159 NEXT_LOH DB 00H ;;
160 NEXT_HIGH LABEL WORD ;;
161 NEXT_HIL DB 00H ;;
162 NEXT_HIH DB 00H ;;
163 TYPE_WORD LABEL WORD ;;
164 TYPE_LOB DB 00H ;; TYPE
165 TYPE_HIB DB 00H ;;
166 TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8)
167 TYPE_ID : DB ' ' ;; TYPEID
168 CPG_WORD LABEL WORD ;;
169 CPG_LOB DB 00H ;; CODE PAGE
170 CPG_HIB DB 00H ;;
171 FONT_LOW LABEL WORD ;;
172 FONT_LOL DB 00H ;; FONT ADDRESS
173 FONT_LOH DB 00H ;;
174 FONT_HIGH LABEL WORD ;;
175 FONT_HIL DB 00H ;;
176 FONT_HIH DB 00H ;;
177 ;; the followings are contained in the font-block in the exact order & length
178 MOD_WORD LABEL WORD ;;
179 MOD_LOB DB 00H ;; MODIFIER
180 MOD_HIB DB 00H ;;
181 FONTS_WORD LABEL WORD ;;
182 FONTS_LOB DB 00H ;; FONTS
183 FONTS_HIB DB 00H ;;
184 FDLEN_WORD LABEL WORD ;;
185 FDLEN_LOB DB 00H ;; FONT DATA LENGTH
186 FDLEN_HIB DB 00H ;;
187 PRE_FONT_ND EQU ($-MOD_WORD) ;; used to update target for font data
188 ;; to follow. -- for NON-DISPLAY
189 ;DISP_ROWS DB 00H ;; DISPLAY's parameters :
190 ;DISP_COLS DB 00H ;; BOX SIZE
191 ;DISP_X DB 00H ;; ASPECT RATIO
192 ;DISP_Y DB 00H ;;
193 ;COUNT_WORD LABEL WORD ;; NO. OF DISPLAY CHARACTERS
194 ;COUNT_LOB DB 00H ;;
195 ;COUNT_HIB DB 00H ;;
196 ;PRE_FONT_D EQU ($-MOD_WORD) ;; used to update target for font data
197 ;; to follow. -- for DISPLAY
198 ;;
199 ;PTR_SEL_WORD LABEL WORD ;;
200 ;PTR_SELOB DB 00H ;;
201 ;PTR_SEHIB DB 00H ;;
202 ;PRE_FONT_P0 EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data
203 ;; to follow -- for PRINTER with
204 ;; selection type = 0.
205 ;;
206 ;PTR_LEN_WORD LABEL WORD ;;
207 ;PTR_LNLOB DB 00H ;;
208 ;PTR_LNHIB DB 00H ;;
209 ;PRE_FONT_P EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data
210 ;; to follow -- for PRINTER with
211 ;; selection type <> 0.
212 ;;
213 ;;
214 ;; also update STAGE_CASES and indexing constants
215 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
216 ;; the stage the parsing is in : ;;;;;
217 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
218 ;;
219 STAGE_CASES LABEL WORD ;; the stage the parsing is in :
220 ;;
221 ;; *** INDEXED BY STAGE-INDEX
222 ;;
223 DW OFFSET ENTRYLO ;; 0
224 DW OFFSET ENTRYHI ;; 1
225 DW OFFSET NEXTLOL ;; 2
226 DW OFFSET NEXTLOH ;; 3
227 DW OFFSET NEXTHIL ;; 4
228 DW OFFSET NEXTHIH ;; 5
229 DW OFFSET TYPELO ;; 6
230 DW OFFSET TYPEHI ;; 7
231 DW OFFSET TYPEIDS ;; 8
232 DW OFFSET CPGLO ;; 9
233 DW OFFSET CPGHI ;; A
234 DW OFFSET FONTLOL ;; B
235 DW OFFSET FONTLOH ;; C
236 DW OFFSET FONTHIL ;; D
237 DW OFFSET FONTHIH ;; E
238 DW 00H ;; MATCH case -- end of SEARCH stages
239 DW 00H ;; SCAN case -- before PRE-FOUND stage
240 DW OFFSET MODLO ;; 11
241 DW OFFSET MODHI ;; 12
242 DW OFFSET FONTSLO ;; 13
243 DW OFFSET FONTSHI ;; 14
244 DW OFFSET FDLENLO ;; 15
245 DW OFFSET FDLENHI ;; 16 -- lead to FONT case,NON- DISPLAY
246 DW OFFSET DSPROWS ;; 17 -- DISPLAY only
247 DW OFFSET DSPCOLS ;; 18
248 DW OFFSET DSPX ;; 19
249 DW OFFSET DSPY ;; 1A
250 DW OFFSET DSPCOUNTLO ;; 1B
251 DW OFFSET DSPCOUNTHI ;; 1C -- lead to FONT case, DISPLAY
252 DW OFFSET PTRSELLO ;; 1D -- PRINTER only
253 DW OFFSET PTRSELHI ;; 1E
254 DW OFFSET PTRLENLO ;; 1F
255 DW OFFSET PTRLENHI ;; 20 -- lead to FONT case, PRINTER
256 DW 00H ;; FOUND case
257 DW 00H ;; GET_FONT case
258 DW 00H ;; PASS special stage
259 DW OFFSET FILETAG ;; 24
260 DW OFFSET fptrLOL ;; 25
261 DW OFFSET fptrLOH ;; 26
262 DW OFFSET fptrHIL ;; 27
263 DW OFFSET fptrHIH ;; 28
264 DW 00H ;; FPTR_SKIP_CASE
265 ;;
266 ;; The followings are individual stage
267 STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages
268 ;;
269 ;; STAGE-INDEX
270 ;;
271 ;; **** INDEX TO STAGE_CASES ****
272 ENTRY_LOX EQU 00H ;;
273 ENTRY_HIX EQU 01H ;;
274 NEXT_LOLX EQU 02H ;; NEXT
275 NEXT_LOHX EQU 03H ;;
276 NEXT_HILX EQU 04H ;;
277 NEXT_HIHX EQU 05H ;;
278 TYPE_LOBX EQU 06H ;; TYPE
279 TYPE_HIBX EQU 07H ;;
280 TYPE_IDX EQU 08H ;; TYPEID
281 CPG_LOBX EQU 09H ;; CODE PAGE
282 CPG_HIBX EQU 0AH ;;
283 FONT_LOLX EQU 0BH ;; FONT ADDRESS
284 FONT_LOHX EQU 0CH ;;
285 FONT_HILX EQU 0DH ;;
286 FONT_HIHX EQU 0EH ;;
287 ;; ------------------------------
288 MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages
289 SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages
290 ;; ------------------------------
291 MOD_LOBX EQU 11H ;; MODIFIER
292 MOD_HIBX EQU 12H ;;
293 FONTS_LOBX EQU 13H ;; FONTS
294 FONTS_HIBX EQU 14H ;;
295 FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH
296 FDLEN_HIBX EQU 16H ;;
297 DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE
298 DISP_COLSX EQU 18H ;;
299 DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO
300 DISP_YX EQU 1AH ;;
301 COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT
302 COUNT_HIBX EQU 1CH ;;
303 PTRSELLOX EQU 1DH ;;
304 PTRSELHIX EQU 1EH ;;
305 PTRLENLOX EQU 1FH ;;
306 PTRLENHIX EQU 20H ;;
307 ;;
308 ;; ------------------------------
309 FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage
310 GET_FX EQU 22H ;;
311 ;; ------------------------------
312 PASSX EQU 23H ;; see pass_brk table
313 ;; ------------------------------
314 FTAGX EQU 24H ;; RESTART ==> FILE TAG
315 ;;
316 fptr_LOLX EQU 25H ;; POINTER in font file header
317 fptr_LOHX EQU 26H ;;
318 fptr_HILX EQU 27H ;;
319 fptr_HIHX EQU 28H ;; ---------------------------------
320 ;;
321 fptr_SKIPX EQU 29H ;; ==> ENTRY_LOX
322 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
323 ;; PASS -- to skip some bytes ;;;;;;
324 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
325 ;; the PASS mechanism is used to skip
326 ;; a number of bytes between two fields
327 ;; The numbers are tabulated in
328 ;; PASS_BRK table in the accumulative
329 ;; sum. The PASS_POSTX(and PASS_POSTXX)
330 ;; are used to tell what is the stage
331 ;; after all the bytes have skipped.
332 ;;
333 PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage
334 ;;
335 FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file :
336 ;; ( after TAG, before POINTER)
337 ;;
338 PASS_CNT DW 0 ;;
339 PASS_BRK LABEL WORD ;;
340 DW FILE_OFFSET ;; skip in the font file header
341 DW FILE_OFFSET+2 ;; pass header-length, needs to reset
342 ;; PASS_CNT for each of the font_header
343 DW FILE_OFFSET+8 ;; pass header-reserved bytes
344 PASS_INDX EQU ($-PASS_BRK)/2 ;;
345 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
346 ;; the control variables : ;;;;;;;;
347 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
348 STAGE DW STAGE_MAX ;; of the STAGE-INDEX
349 ;;
350 Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA
351 ;;
352 ;;
353 COUNT_LO DW 00000H ;; no. of bytes parsed so far
354 COUNT_hI DW 00000H ;;
355 ;;
356 HIT_LO DW 00000H ;; the next byte that is addressed by :
357 HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK.
358 ;;
359 HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching
360 HIT_BX DW 00000H ;; where FTB is found for nearest hit
361 ;;
362 NUM_FTB DW 00000H ;; as defined in the FP_BUFFER
363 ;;
364 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
365 ;;
366 ;; FONT_PARSER routine
367 ;;
368 ;; -- to be called at every packet received to extract informations
369 ;; from Font File on byte basis.
370 ;;
371 ;; -- Interface though FTABLE
372 ;;
373 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
374 ;;
375 FONT_PARSER PROC ;;
376 PUSH DS ;; save all registers Revised
377 PUSH ES ;;
378 PUSH AX ;;
379 PUSH BX ;;
380 PUSH CX ;;
381 PUSH DX ;;
382 PUSH DI ;;
383 PUSH SI ;;
384 ;; BP isn't used, so it isn't saved
385 LEA BX,FTABLE ;;
386 PUSH CS ;;
387 POP ES ;; ES:[BX]
388 LDS SI,FTP.BUFFER_ADDR ;; DS:[SI]
389 MOV CX,FTP.BUFFER_LEN ;; CX = length of packet
390 MOV DX,FTP.NUM_FTBLK ;; DX = number of FTB
391 MOV cs:num_ftb,DX ;;
392 AND DX,DX ;;
393 JNZ VALID_BUFFER ;;
394 MOV cs:fp_error,0020H ;; ERROR 0020H
395 JMP FP_RET ;;
396 VALID_BUFFER : ;;
397 MOV AX,FTP.FLAG ;;
398 AND AX,FLAG_RESTART ;;
399 Jnz has_RESTART ;;
400 JMP NO_RESTART ;;
401 ;;
402 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
403 has_restart : ;;
404 PUSH BX ;; reset all the output fields
405 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
406 XOR AX,AX ;;
407 ;;
408 MOV cs:ftag_count,AX ;;
409 MOV cs:fptr_low,AX ;;
410 MOV cs:fptr_high,AX ;;
411 MOV cs:pre_font_len,AX ;;
412 MOV cs:count_lo,AX ;;
413 MOV cs:count_hi,AX ;;
414 MOV cs:next_low,AX ;;
415 MOV cs:next_high,AX ;;
416 MOV cs:hit_lo,AX ;;
417 MOV cs:hit_hi,AX ;;
418 MOV cs:hit_flag,AX ;;
419 MOV cs:pass_cnt,AX ;;
420 MOV cs:pass_postx,STAGE_MAX ;;
421 ;;
422 MOV cs:stage,STAGE_MAX ;;
423 ;;
424 RESET_FTB : ;;
425 MOV FTP.FTB_STATUS,FSTAT_SEARCH
426 MOV FTP.FTB_TYPE,AX ;;
427 MOV FTP.FTB_MOD,AX ;;
428 MOV FTP.FTB_FONTS,AX ;;
429 MOV FTP.FTB_ROWS,AL ;;
430 MOV FTP.FTB_COLS,AL ;;
431 MOV FTP.FTB_X,AL ;;
432 MOV FTP.FTB_Y,AL ;;
433 MOV FTP.FTB_COUNT,AX ;;
434 MOV FTP.FTB_DLEFT,AX ;;
435 MOV FTP.FTB_DLEN,AX ;;
436 MOV FTP.FTB_DALO,AX ;;
437 MOV FTP.FTB_DAHI,AX ;;
438 MOV FTP.TARGET_LO,AX ;;
439 MOV FTP.TARGET_HI,AX ;;
440 ;;
441 ADD BX, TYPE FTBLK ;;
442 ;;
443 DEC DX ;;
444 AND DX,DX ;;
445 JNZ RESET_FTB ;;
446 ;;
447 POP BX ;;
448 NO_RESTART : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
449 ;; any FTBLKs have their data all
450 ;; returned ? if so set their status
451 ;; from FOUND to COMPLETE
452 PUSH BX ;;
453 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
454 ;;
455 MOV DX,cs:num_ftb ;;
456 ;;
457 SET_COMPLETE : ;;
458 MOV AX,FTP.FTB_STATUS ;;
459 CMP AX,FSTAT_FONT ;;
460 JNE SET_NEXT ;;
461 ;;
462 MOV AX,FTP.FTB_DLEFT ;;
463 AND AX,AX ;;
464 JNZ SET_NEXT ;;
465 ;;
466 MOV FTP.FTB_STATUS,FSTAT_COMPLETE
467 ;;
468 SET_NEXT : ;;
469 ;;
470 ADD BX,TYPE FTBLK ;;
471 ;;
472 DEC DX ;;
473 AND DX,DX ;;
474 JNZ SET_COMPLETE ;;
475 ;;
476 POP BX ;;
477 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
478 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
479 ;;
480 PUSH CX ;; STACK 1 = CX
481 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
482 ;;
483 ;; DO WHILE CX is not zero :
484 ;;
485 ;; -- on each loop, the CX, COUNTs are updated
486 ;;
487 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
488 ;;
489 ;;
490 FTB_LOOP : ;;
491 POP AX ;; STACK -1
492 SUB AX,CX ;;
493 ADD cs:count_lo,AX ;;
494 JNC NO_CARRY ;;
495 ADD cs:count_hi,1000H ;;
496 NO_CARRY : ;;
497 PUSH CX ;; STACK 1 = CX
498 AND CX,CX ;;
499 JNZ FTB_CONT ;;
500 JMP FTB_LPEND ;;
501 ;; DO CASES :
502 FTB_CONT : ;; ==========
503 ;;
504 MOV AX,cs:stage ;;
505 ;;
506 CMP AX,STAGE_MAX ;;
507 JNE FTB_010 ;;
508 JMP START_CASE ;; ** RESTART **
509 ;;
510 FTB_010 : ;;
511 CMP AX,MATCHX ;;
512 JAE FTB_020 ;;
513 JMP SEARCH_CASE ;; ** SEARCH **
514 ;;
515 FTB_020 : ;;
516 CMP AX,MATCHX ;;
517 JNE FTB_030 ;;
518 JMP MATCH_CASE ;; ** MATCH **
519 ;;
520 FTB_030 : ;;
521 CMP AX,SCANX ;;
522 JNE FTB_040 ;;
523 JMP SCAN_CASE ;; ** SCAN **
524 ;;
525 FTB_040 : ;;
526 CMP AX,FOUNDX ;;
527 JAE FTB_050 ;;
528 JMP PRE_FOUND_CASE ;; ** PRE-FOUND **
529 ;;
530 FTB_050 : ;;
531 CMP AX,FOUNDX ;;
532 JNE FTB_060 ;;
533 JMP FOUND_CASE ;; ** FOUND **
534 ;;
535 FTB_060 : ;;
536 CMP AX,GET_FX ;;
537 JNE FTB_070 ;;
538 JMP GETFONT_CASE ;; ** GET_FONT **
539 ;;
540 FTB_070 : ;;
541 CMP AX,PASSX ;;
542 JNE FTB_080 ;;
543 JMP PASS ;; ** PASS **
544 ;;
545 FTB_080 : ;;
546 CMP AX,FPTR_SKIPX ;;
547 JAE FTB_090 ;;
548 JMP SEARCH_CASE ;; ** SEARCH **
549 ;;
550 FTB_090 : ;;
551 CMP AX,FPTR_SKIPX ;;
552 JNE FTB_FFF ;;
553 JMP FPTR_SKIP_CASE ;; ** SEARCH **
554 ;;
555 FTB_FFF : ;;
556 MOV FTP.FTB_STATUS,STAT_DEVERR
557 JMP FTB_LPEND ;; ** DEVICE ERROR **
558 ;;
559 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
560 ;;
561 ;; at the entry of each STAGES /CASES
562 ;;
563 ;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer
564 ;; -- CX remaining packet length
565 ;; -- ES:[BX] points to the first FTBLK
566 ;; -- COUNT_LO, COUNT_HI, upto but and including the address pointed by FPKT
567 ;;
568 ;;
569 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
570 ;;
571 ;============================================================================
572 START_CASE : ;; pass the FILE leading bytes
573 ;;
574 MOV cs:ftag_count,0 ;;
575 MOV cs:stage,ftagx ;;
576 JMP FTB_LOOP ;;
577 ;;
578 ;=============================================================================
579 FPTR_SKIP_CASE : ;; skip until the ENTRY pointed by
580 ;; POINTER (in FPTR) is reached.
581 ;;
582 ;; **************
583 MOV AX,cs:fptr_low ;; * HIT = FPTR *
584 MOV cs:hit_lo,AX ;; **************
585 MOV DX,cs:fptr_high ;;
586 MOV cs:hit_hi,DX ;;
587 ;;
588 CMP AX,0FFFFH ;;
589 JNE FPTR_SKIP_VALID ;;
590 CMP DX,0FFFFH ;;
591 JNE FPTR_SKIP_VALID ;;
592 ;;
593 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
594 JMP FPTR_SKIP_MORE ;;
595 ;;
596 FPTR_SKIP_VALID : ;;
597 ;; normalised HIT_HI, HIT_LO
598 MOV AX,DX ;;
599 AND AX,00FFFH ;;
600 PUSH CX ;;
601 MOV CX,4 ;;
602 SHL AX,CL ;;
603 POP CX ;;
604 AND DX,0F000H ;;
605 ADD AX,cs:hit_lo ;;
606 JNC NO_CARRY10 ;;
607 ADD DX,01000H ;;
608 NO_CARRY10: ;;
609 MOV cs:hit_lo,AX ;;
610 MOV cs:hit_hi,DX ;;
611 ;; **************************
612 ;; * compare FPTR and COUNT *
613 ;; **************************
614 ;; DX:AX = HIT_HI:HIT_LO (normalised)
615 ;;
616 SUB AX,cs:count_lo ;;
617 Jnc more_fptrlo ;;
618 sub dx,01000h ;;
619 jc fptr_bad ;;
620 ;;
621 more_fptrlo : ;;
622 SUB DX,cs:count_hi ;;
623 JC fptr_BAD ;;
624 ;;
625 INC AX ;; COUNT can be at the HIT, then AX=0
626 JNC NO_CARRY11 ;; INC AX to make AX comparable to CX
627 ADD DX,01000H ;; i.e. AX = offset + 1
628 ;;
629 NO_CARRY11: ;;
630 CMP AX,CX ;;
631 JA fptr_skip_more ;; AX > CX, whole CX to be skipped
632 ;;
633 PUSH DX ;; normalise dx:ax
634 AND DX,00FFFH ;;
635 PUSH CX ;;
636 MOV CX,4 ;;
637 SHL DX,CL ;;
638 POP CX ;;
639 ADD AX,DX ;;
640 POP DX ;;
641 JNC NO_CARRY13 ;;
642 ADD DX,01000H ;;
643 NO_CARRY13: ;;
644 AND DX,0F000H ;;
645 ;;
646 PUSH AX ;;
647 PUSH DX ;; STACK +1 : normalosed DX:AX
648 SUB AX,CX ;;
649 JNC NO_BORROW11 ;;
650 SUB DX,1000H ;;
651 JC fptr_MORE_CXp ;; dx:ax < cx
652 NO_BORROW11: ;;
653 ;; dx:ax >= cx
654 AND AX,AX ;;
655 JNE fptr_skip_MOREP ;;
656 AND DX,DX ;;
657 JNE fptr_skip_MOREP ;;
658 ;; dx:ax = cx, or
659 ;; offset + 1 = CX
660 ;;
661 ;; ************************************
662 ;; * POINTER is within the current CX *
663 ;; ************************************
664 fptr_MORE_CXP : ;;
665 POP DX ;;
666 POP AX ;; STACK -1
667 ;;
668 fptr_MORE_CX : ;; DX = 0,to have more CX than offset+1
669 DEC AX ;; = offset : 0 and above
670 SUB CX,AX ;;
671 ADD SI,AX ;; where the first byte is
672 ;;
673 MOV cs:stage,entry_lox ;; ENTRIES in the font file
674 ;;
675 JMP FTB_LOOP ;; ****** RETURN *******
676 ;;
677 ;; ***********************************
678 ;; * more to skip ==> FPTR_SKIP_CASE *
679 ;; ***********************************
680 fptr_skip_morep: ;;
681 POP DX ;;
682 POP AX ;; STACK -1
683 ;;
684 fptr_skip_more : ;;
685 ADD SI,CX ;;
686 SUB CX,CX ;;
687 JMP FTB_LOOP ;; ****** RETURN *****
688 ;;
689 ;; ***********************************
690 ;; * bad POINTER in font file header *
691 ;; ***********************************
692 ;;
693 fptr_bad : ;;
694 MOV cs:fptr_low,0FFFFH ;;
695 MOV cs:fptr_high,0FFFFH ;;
696 ;;
697 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
698 ;;
699 JMP FPTR_SKIP_MORE ;;
700 ;;
701 ;=============================================================================
702 SEARCH_CASE : ;;
703 ;; still looking for header to match
704 ;; the input : codepage and typeid
705 ;;
706 MOV DI,cs:stage ;;
707 ;;
708 ADD DI,DI ;; double to index to WORD-offset
709 ;;
710 JMP CS:STAGE_CASES[DI] ;; call routine to process the stage
711 ;;
712 ;;
713 ;===========================================================================
714 MATCH_CASE : ;;
715 ;;
716 PUSH BX ;;
717 MOV DX,cs:num_ftb ;;
718 ;;
719 ;;
720 MATCH_LOOP : ;;
721 MOV AX,FTP.FTB_STATUS ;;
722 CMP AX,FSTAT_SEARCH ;;
723 JE MATCH_SEARCH ;;
724 JMP MATCH_NEXT ;;
725 ;;
726 MATCH_SEARCH : ;;
727 MOV AX,FTP.FTB_CP ;; check the FTB with SEARCH status
728 CMP AX,cs:cpg_word ;;
729 JNE MATCH_MORE ;;
730 PUSH DS ;; code page matched
731 PUSH SI ;;
732 PUSH CX ;;
733 ;;
734 PUSH CS ;;
735 POP DS ;;
736 MOV SI,OFFSET TYPE_ID ;;
737 LEA DI,[BX].FTB_TID ;;
738 MOV CX,8 ;;
739 REPE CMPSB ;;
740 ;;
741 POP CX ;;
742 POP SI ;;
743 POP DS ;;
744 ;;
745 JNE MATCH_MORE ;;
746 ;; MATCH !!!!! (type_id matched)
747 MOV FTP.FTB_STATUS,FSTAT_MATCH
748 MOV AX,cs:type_word ;;
749 MOV FTP.FTB_TYPE,AX ;;
750 MOV AX,cs:font_low ;;
751 MOV FTP.TARGET_LO,AX ;;
752 MOV AX,cs:font_high ;;
753 MOV FTP.TARGET_HI,AX ;;
754 ;;
755 JMP MATCH_NEXT ;;
756 ;;
757 MATCH_MORE : ;; if this is the last rounf ?
758 ;;
759 MOV AX,cs:next_low ;; NEXT = FFFF:FFFF means no more
760 CMP AX,-1 ;; header to come.
761 JNE MATCH_NEXT ;;
762 ;;
763 MOV AX,cs:next_high ;;
764 CMP AX,-1 ;;
765 JNE MATCH_NEXT ;;
766 ;;
767 MOV FTP.FTB_STATUS,STAT_NOFIND ;; ERROR : no match
768 ;;
769 MATCH_NEXT : ;;
770 ADD BX,FTP.FTB_LENGTH ;;
771 DEC DX ;;
772 AND DX,DX ;;
773 JZ MATCH_ALL ;;
774 JMP MATCH_LOOP ;;
775 ;;
776 MATCH_ALL : ;;
777 MOV cs:stage,SCANX ;;
778 ;;
779 MATCH_DONE : ;;
780 POP BX ;;
781 JMP FTB_LOOP ;;
782 ;;
783 ;===========================================================================
784 SCAN_CASE : ;;
785 ;; **********************************
786 ;; * determine whether it the font *
787 ;; * data(TARGET),or the next font *
788 ;; * header(NEXT) that is approaching
789 ;; **********************************
790 ;;
791 MOV AX,cs:next_low ;;
792 MOV cs:hit_lo,AX ;;
793 MOV AX,cs:next_high ;;
794 MOV cs:hit_hi,AX ;;
795 XOR AX,AX ;;
796 MOV cs:hit_flag,AX ;;
797 ;;
798 MOV DI,cs:hit_hi ;; normalised HIT_HI, HIT_LO
799 MOV AX,DI ;;
800 AND AX,00FFFH ;;
801 PUSH CX ;;
802 MOV CX,4 ;;
803 SHL AX,CL ;;
804 POP CX ;;
805 AND DI,0F000H ;;
806 ADD AX,cs:hit_lo ;;
807 JNC NO_CARRY2 ;;
808 ADD DI,01000H ;;
809 NO_CARRY2 : ;;
810 MOV cs:hit_lo,AX ;;
811 MOV cs:hit_hi,DI ;;
812 ;;
813 MOV DX,cs:num_ftb ;;
814 ;;
815 PUSH BX ;;
816 SCAN_LOOP : ;;
817 MOV AX,FTP.FTB_STATUS ;;
818 CMP AX,FSTAT_MATCH ;;
819 JNE SCAN_NEXT ;;
820 ;;
821 ;;
822 MOV DI,FTP.TARGET_HI ;; NORMALISED TARGET
823 MOV AX,DI ;;
824 AND AX,00FFFH ;;
825 PUSH CX ;;
826 MOV CX,4 ;;
827 SHL AX,CL ;;
828 POP CX ;;
829 AND DI,0F000H ;;
830 ADD AX,FTP.TARGET_LO ;;
831 JNC NO_CARRY1 ;;
832 ADD DI,01000H ;;
833 NO_CARRY1 : ;; DI:AX = NORMALISED TARGET
834 ;;
835 ;; ** compare the TARGET and the NEXT
836 ;;
837 CMP DI,cs:hit_hi ;;
838 JA SCAN_NEXT ;;
839 ;;
840 JE SCAN_EQU ;;
841 JMP NEAR_FONT ;;
842 ;;
843 SCAN_EQU : ;;
844 CMP AX,cs:hit_lo ;;
845 JA SCAN_NEXT ;;
846 JE SCAN_ERROR_CHK ;;
847 ;; **********************************
848 ;; * the font data is approaching *
849 ;; **********************************
850 NEAR_FONT : ;;
851 MOV cs:hit_flag,-1 ;;
852 MOV cs:hit_lo,AX ;;
853 MOV cs:hit_hi,DI ;;
854 MOV cs:hit_bx,BX ;; used for BAD_BX and in FOUND_CASE
855 JMP SCAN_NEXT ;;
856 ;;
857 ;; **********************************
858 ;; * the NEXT header is approaching *
859 ;; **********************************
860 SCAN_ERROR_CHK : ;;
861 MOV AX,cs:hit_flag ;;
862 AND AX,AX ;;
863 JNZ SCAN_NEXT ;;
864 MOV FTP.FTB_STATUS,STAT_BADATA ;; next header and font cannot be the
865 ;; same
866 ;;
867 SCAN_NEXT : ;;
868 DEC DX ;;
869 AND DX,DX ;;
870 JZ SCAN_DONE ;;
871 ;;
872 ADD BX,FTP.FTB_LENGTH ;;
873 JMP SCAN_LOOP ;; ** is there any closer font data ?
874 ;;
875 ;; ************************************
876 ;; * the HIT is either font data(TARGET
877 ;; * or the font block (NEXT). *
878 ;; ************************************
879 SCAN_DONE : ;;
880 POP BX ;;
881 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
882 MOV DX,cs:hit_hi ;; HIT_FLAG, HIT_LO, HIT_HI defined
883 MOV AX,cs:hit_lo ;;
884 ;;
885 CMP AX,0FFFFH ;;
886 JNE NOT_FFFF_HIT ;;
887 CMP DX,0FFFFH ;;
888 JNE NOT_FFFF_HIT ;;
889 JMP SCAN_MORE ;; stage remained as SCAN, discard data
890 ;;
891 NOT_FFFF_HIT : ;;
892 ;; DX:AX = HIT_HI:HIT_LO (normalised)
893 SUB AX,cs:count_lo ;;
894 JNC NO_BORROW ;;
895 SUB DX,01000H ;;
896 JC SCAN_BAD ;;
897 NO_BORROW: ;;
898 SUB DX,cs:count_hi ;;
899 JC SCAN_BAD ;;
900 ;;
901 INC AX ;; COUNT can be at the HIT, then AX=0
902 JNC NO_CARRYX ;; INC AX to make AX comparable to CX
903 ADD DX,01000H ;; i.e. AX = offset + 1
904 ;;
905 NO_CARRYX : ;;
906 CMP AX,CX ;;
907 JA SCAN_MORE ;;
908 ;;
909 PUSH DX ;;
910 AND DX,00FFFH ;;
911 PUSH CX ;;
912 MOV CX,4 ;;
913 SHL DX,CL ;;
914 POP CX ;;
915 ADD AX,DX ;;
916 POP DX ;;
917 JNC NO_CARRY3 ;;
918 ADD DX,01000H ;;
919 NO_CARRY3 : ;;
920 AND DX,0F000H ;;
921 ;;
922 ;;
923 PUSH AX ;;
924 PUSH DX ;;
925 SUB AX,CX ;;
926 JNC NO_BORROW1 ;;
927 SUB DX,1000H ;;
928 JC MORE_CXp ;;
929 NO_BORROW1 : ;;
930 ;; dx:ax >= cx
931 AND AX,AX ;;
932 JNE SCAN_MOREP ;;
933 AND DX,DX ;;
934 JNE SCAN_MOREP ;;
935 ;;
936 ;; offset + 1 = CX
937 ;;
938 MORE_CXP : ;;
939 POP DX ;;
940 POP AX ;;
941 ;;
942 MORE_CX : ;; DX = 0,to have more CX than offset+1
943 DEC AX ;; = offset : 0 and above
944 SUB CX,AX ;;
945 ADD SI,AX ;; where the first byte is
946 MOV AX,cs:hit_flag ;;
947 AND AX,AX ;;
948 JE NEXT_REACHED ;;
949 ;;
950 MOV cs:stage,MOD_LOBX ;; font-data reached,
951 ;;
952 JMP FTB_LOOP ;; ****** RETURN *******
953 ;;
954 NEXT_REACHED : ;;
955 MOV cs:stage,PASSX ;;
956 MOV cs:pass_postx,next_lolX ;;
957 MOV cs:pass_cnt,FILE_OFFSET ;;
958 ;;
959 ;;
960 JMP FTB_LOOP ;; ****** RETURN *******
961 ;;
962 ;; ***********************************
963 SCAN_MOREP : ;; * scan more FTBLK for the nearest *
964 ;; * font data *
965 ;; ***********************************
966 POP DX ;;
967 POP AX ;;
968 ;;
969 SCAN_MORE : ;;
970 ADD SI,CX ;;
971 SUB CX,CX ;;
972 JMP FTB_LOOP ;; more SCAN stage
973 ;;
974 SCAN_BAD: ;; *************************
975 MOV AX,cs:hit_flag ;; * scan is bad *
976 AND AX,AX ;; *************************
977 JNZ BAD_BX ;;
978 MOV AX,-1 ;; NEXT is pointing backwards
979 MOV cs:next_low,AX ;;
980 MOV cs:next_high,AX ;; no more NEXT
981 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
982 JMP FTB_LOOP ;;
983 ;;
984 BAD_BX : ;;
985 PUSH BX ;; FONT is pointing backwards
986 MOV BX,cs:hit_bx ;;
987 MOV FTP.FTB_STATUS,STAT_BADATA
988 POP BX ;;
989 JMP FTB_LOOP ;;
990 ;;
991 ;===========================================================================
992 PRE_FOUND_CASE : ;;
993 ;; extract informations from the font
994 ;; block until font_length is defined
995 ;;
996 MOV DI,cs:stage ;;
997 ;;
998 ADD DI,DI ;; double to index to WORD-offset
999 ;;
1000 JMP CS:STAGE_CASES[DI] ;; call routine to process the stage
1001 ;;
1002 ;===========================================================================
1003 FOUND_CASE : ;;
1004 MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to
1005 PUSH DI ;;
1006 ;===========================================================================
1007 FOUND_DO : ;;
1008 ;; define informations into FTBLK of
1009 ;; HIT_BX defined in the SCAN case
1010 PUSH BX ;;
1011 MOV BX,cs:hit_bx ;;
1012 ;; FTBLK :
1013 MOV AX,cs:mod_word ;;
1014 MOV FTP.FTB_MOD,AX ;;
1015 MOV AX,cs:fonts_word ;;
1016 MOV FTP.FTB_FONTS,AX ;;
1017 ;;
1018 MOV AX,cs:fdlen_word ;;
1019 MOV FTP.FTB_DLEFT,AX ;;
1020 MOV FTP.FTB_DLEN,0 ;;
1021 MOV FTP.FTB_DALO,0 ;;
1022 MOV FTP.FTB_DAHI,0 ;;
1023 ;;
1024 MOV FTP.FTB_STATUS,FSTAT_FOUND
1025 ;;
1026 ; CMP FTP.FTB_TYPE,TYPE_DISPLAY;
1027 ; JNE CHECK_PTR_TYPE ;;
1028 ; CMP cs:pre_font_len,PRE_FONT_D ;;
1029 ; JNE DISPLAY_BAD ;;
1030 ; JMP DISPLAY_DONE ;;
1031 ; ;;
1032 ;CHECK_PTR_TYPE : ;;
1033 ; CMP FTP.FTB_TYPE,TYPE_PRINTER;
1034 ; JNE SET_STAGE ;;
1035 ; CMP cs:ptr_sel_word,0 ;;
1036 ; JNE PRINTER_HAS_SEL ;;
1037 ; CMP cs:pre_font_len,PRE_FONT_P0;;
1038 ; JNE PRINTER_BAD ;;
1039 ; JMP PRINTER_DONE ;;
1040 ; ;;
1041 ;PRINTER_HAS_SEL : ;;
1042 ; CMP cs:pre_font_len,PRE_FONT_P ;;
1043 ; JNE PRINTER_BAD ;;
1044 ; JMP PRINTER_DONE ;;
1045 ; ;;
1046 ;DISPLAY_BAD : ;;
1047 ; ;;
1048 ; MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0.
1049 ; ;;
1050 ;DISPLAY_DONE : ;;
1051 ; MOV AL,cs:disp_rows ;;
1052 ; MOV FTP.FTB_ROWS,AL ;;
1053 ; MOV AL,cs:disp_cols ;;
1054 ; MOV FTP.FTB_COLS,AL ;;
1055 ; MOV AL,cs:disp_x ;;
1056 ; MOV FTP.FTB_X,AL ;;
1057 ; MOV AL,cs:disp_y ;;
1058 ; MOV FTP.FTB_Y,AL ;;
1059 ; MOV AX,cs:count_word ;;
1060 ; MOV FTP.FTB_COUNT,AX ;;
1061 ; JMP SET_STAGE ;;
1062 ;;
1063 ;PRINTER_BAD : ;;
1064 ; ;;
1065 ; MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0.
1066 ; ;;
1067 ;PRINTER_DONE : ;;
1068 ; MOV AX,cs:ptr_sel_word ;;
1069 ; MOV FTP.FTB_SELECT,AX ;;
1070 ; MOV AX,cs:ptr_len_word ;;
1071 ; MOV FTP.FTB_SELLEN,AX ;;
1072 ; ;;
1073 ;SET_STAGE : ;; STAGE :
1074 MOV AX,cs:fdlen_word ;; if no font data to follow
1075 AND AX,AX ;;
1076 JNZ GET_FDATA ;;
1077 MOV cs:stage,SCANX ;; then scan for next header or font
1078 JMP FONT_RET ;;
1079 ;;
1080 GET_FDATA : ;; update the moving target
1081 MOV cs:stage,GET_FX ;;
1082 MOV AX,cs:pre_font_len ;;
1083 ADD FTP.TARGET_LO,AX ;;
1084 JNC FONT_RET ;;
1085 ADD FTP.TARGET_HI,01000H ;;
1086 ;;
1087 FONT_RET : ;;
1088 POP BX ;;
1089 RET ;;
1090 ;;
1091 ;===========================================================================
1092 GETFONT_CASE : ;; as ES:[SI], at COUNT, there is font
1093 ;; data
1094 MOV DX,cs:num_ftb ;;
1095 PUSH BX ;;
1096 ;;
1097 MOV cs:hit_hi,0 ;; temp. register
1098 MOV cs:hit_flag,0 ;; assumed can be changed to SCAN stage
1099 ;;
1100 MOV DI,cs:count_hi ;; normalised COUNT_HI,COUNT_LO
1101 MOV AX,DI ;;
1102 AND AX,00FFFH ;;
1103 PUSH CX ;;
1104 MOV CX,4 ;;
1105 SHL AX,CL ;;
1106 POP CX ;;
1107 AND DI,0F000H ;;
1108 ADD AX,cs:count_lo ;;
1109 JNC NO_CARRY4 ;;
1110 ADD DI,01000H ;;
1111 NO_CARRY4 : ;;
1112 MOV cs:count_lo,AX ;;
1113 MOV cs:count_hi,DI ;;
1114 ;;
1115 ;;
1116 GETFONT_LOOP : ;;
1117 MOV AX,FTP.FTB_STATUS ;;
1118 CMP AX,FSTAT_FONT ;;
1119 JE GETFONT_CONT ;;
1120 ;;
1121 CMP AX,FSTAT_FOUND ;;
1122 JE GETFONT_FOUND ;;
1123 ;;
1124 JMP NEXT_GETFONT ;;
1125 ;;
1126 GETFONT_FOUND : ;;
1127 MOV AX,FTP.FTB_DLEFT ;;
1128 AND AX,AX ;;
1129 JZ NEXT_GF ;;
1130 MOV FTP.FTB_STATUS,FSTAT_FONT;
1131 JMP GETFONT_CONT1 ;;
1132 ;;
1133 ;;
1134 GETFONT_CONT : ;;
1135 MOV AX,FTP.FTB_DLEFT ;;
1136 AND AX,AX ;;
1137 JNZ GETFONT_CONT1 ;;
1138 NEXT_GF : ;;
1139 JMP NEXT_GETFONT ;;
1140 ;; only on FOUND and DLEFT <> 0
1141 GETFONT_CONT1: ;;
1142 MOV DI,FTP.TARGET_HI ;; normalised TARGET
1143 MOV AX,DI ;;
1144 AND AX,00FFFH ;;
1145 PUSH CX ;;
1146 MOV CX,4 ;;
1147 SHL AX,CL ;;
1148 POP CX ;;
1149 AND DI,0F000H ;;
1150 ADD AX,FTP.TARGET_LO ;;
1151 JNC NO_CARRY5 ;;
1152 ADD DI,01000H ;;
1153 NO_CARRY5 : ;; DI:AX = TARGET (normalised)
1154 ;;
1155 CMP DI,cs:count_hi ;;
1156 JB GETFONT_BAD ;;
1157 JNE NEXT_GETFONT ;;
1158 CMP AX,cs:count_lo ;;
1159 JB GETFONT_BAD ;;
1160 JNE NEXT_GETFONT ;;
1161 ;;
1162 MOV FTP.FTB_DALO,SI ;; where the font data is in the packet
1163 MOV FTP.FTB_DAHI,DS ;;
1164 ;;
1165 MOV AX,FTP.FTB_DLEFT ;;
1166 CMP AX,CX ;;
1167 JAE UPTO_CX ;;
1168 ;; upto FDLEFT
1169 MOV FTP.FTB_DLEFT,0 ;;
1170 MOV FTP.FTB_DLEN,AX ;;
1171 CMP cs:hit_hi,AX ;;
1172 JNB NOT_HIGHER0 ;;
1173 MOV cs:hit_hi,AX ;;
1174 NOT_HIGHER0 : ;;
1175 ADD FTP.TARGET_LO,AX ;;
1176 JNC NEXT_GETFONT ;;
1177 ADD FTP.TARGET_HI,01000H ;;
1178 JMP NEXT_GETFONT ;;
1179 ;;
1180 GETFONT_BAD : ;;
1181 MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards
1182 JMP NEXT_GETFONT ;;
1183 ;;
1184 UPTO_CX : ;;
1185 SUB AX,CX ;;
1186 MOV FTP.FTB_DLEFT,AX ;;
1187 MOV FTP.FTB_DLEN,CX ;;
1188 MOV cs:hit_hi,CX ;;
1189 ADD FTP.TARGET_LO,CX ;;
1190 JNC NO_CARRYOVER ;;
1191 ADD FTP.TARGET_HI,01000H ;;
1192 NO_CARRYOVER : ;;
1193 AND AX,AX ;; all data have been returned ?
1194 JZ NEXT_GETFONT ;;
1195 ;;
1196 MOV cs:hit_flag,-1 ;; no ! stay in the GET_FONT stage
1197 ;;
1198 NEXT_GETFONT : ;;
1199 ADD BX,FTP.FTB_LENGTH ;;
1200 DEC DX ;;
1201 AND DX,DX ;;
1202 JZ GETFONT_END ;;
1203 JMP GETFONT_LOOP ;;
1204 ;;
1205 GETFONT_END : ;;
1206 MOV AX,cs:hit_hi ;;
1207 ADD SI,AX ;;
1208 SUB CX,AX ;;
1209 ;;
1210 CMP cs:hit_flag,0 ;;
1211 Jne GETFONT_DONE ;;
1212 MOV cs:stage,SCANX ;; no more in the GET_FONT stage
1213 ;;
1214 ;;
1215 GETFONT_DONE : ;;
1216 POP BX ;;
1217 JMP FTB_LOOP ;;
1218 ;;
1219 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1220 ;;
1221 ;; STAGES -- "called by" SERACH_CASE
1222 ;;
1223 ;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer
1224 ;; -- CX remaining packet length
1225 ;; -- ES:[BX] points to the first FTBLK
1226 ;; -- COUNT_LO, COUNT_HI, upto but not including the address pointed by FPKT
1227 ;;
1228 ;;
1229 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1230 ;;+++++++++++++++++++++++++++++++++
1231 filetag : ;;
1232 ;;
1233 ; mov ax,ftag_len ;;
1234 cmp cs:ftag_count,ftag_len ;;
1235 jB valid_ftag ;;
1236 JE FTAG_FAILED ;;
1237 ;;
1238 mov ftp.ftb_status,stat_deverr
1239 mov cs:fp_error,00022H ;; ERROR 0022H
1240 ;;
1241 FTAG_FAILED : ;; discard all the bytes, while
1242 ADD SI,CX ;; stage stays as FTAGX
1243 SUB CX,CX ;;
1244 JMP FTB_LOOP ;; **** RETURN (bytes discarded) ****
1245 ;;
1246 VALID_FTAG : ;;
1247 MOV AX,FPKT ;;
1248 INC SI ;;
1249 DEC CX ;;
1250 ;;
1251 MOV DI,cs:ftag_count ;;
1252 CMP AL,cs:ftag_pattern[DI] ;;
1253 JE FTAG_NEXTB ;;
1254 ;;
1255 mov ftp.ftb_status,stat_badata
1256 MOV ax,ftag_len ;; stays in FTAGX to consume all bytes
1257 MOV cs:ftag_count,ax ;; stays in FTAGX to consume all bytes
1258 JMP FTB_LOOP ;; **** RETURN (FAILED !) ****
1259 ;;
1260 FTAG_NEXTB : ;;
1261 INC DI ;;
1262 MOV cs:ftag_count,DI ;;
1263 ;;
1264 CMP DI,ftag_len ;;
1265 JE FTAG_DONE ;;
1266 ;;
1267 JMP FTB_LOOP ;; **** RETURN ( MORE TO COME) ****
1268 ;;
1269 FTAG_DONE : ;;
1270 MOV cs:pass_cnt,0 ;;
1271 MOV cs:stage,PASSX ;;
1272 MOV cs:pass_postx,fptr_lolx ;;
1273 ;;
1274 JMP FTB_LOOP ;; **** NEXT STAGE ****
1275 ;;
1276 ;;+++++++++++++++++++++++++++++++++
1277 fptrLOL : ;; STAGE the low byte of the low fptr
1278 MOV AX,FPKT ;;
1279 INC SI ;; byte by byte
1280 DEC CX ;;
1281 AND CX,CX ;;
1282 JNZ WORD_fptrLO ;;
1283 MOV cs:fptr_lol,AL ;;
1284 MOV cs:stage,fptr_lohX ;;
1285 JMP FTB_LOOP ;;
1286 WORD_fptrLO : ;;
1287 INC SI ;;
1288 DEC CX ;;
1289 MOV cs:fptr_low,AX ;;
1290 MOV cs:stage,fptr_HILX ;;
1291 JMP FTB_LOOP ;;
1292 ;;+++++++++++++++++++++++++++++++++
1293 fptrLOH : ;; STAGE the high byte of the low fptr
1294 MOV AX,FPKT ;;
1295 INC SI ;; byte by byte
1296 DEC CX ;;
1297 MOV cs:fptr_loh,AL ;;
1298 MOV cs:stage,fptr_HILX ;;
1299 JMP FTB_LOOP ;;
1300 ;;+++++++++++++++++++++++++++++++++
1301 fptrHIL : ;; STAGE the low byte of the high fptr
1302 MOV AX,FPKT ;;
1303 INC SI ;; byte by byte
1304 DEC CX ;;
1305 AND CX,CX ;;
1306 JNZ WORD_fptrHI ;;
1307 MOV cs:fptr_hil,AL ;;
1308 MOV cs:stage,fptr_hihX ;;
1309 JMP FTB_LOOP ;;
1310 WORD_fptrHI : ;;
1311 INC SI ;;
1312 DEC CX ;;
1313 MOV cs:fptr_high,AX ;;
1314 MOV cs:stage,FPTR_SKIPX ;;
1315 JMP FTB_LOOP ;;
1316 ;;+++++++++++++++++++++++++++++++++
1317 fptrHIH : ;; STAGE the high byte of the high fptr
1318 MOV AX,FPKT ;;
1319 INC SI ;; byte by byte
1320 DEC CX ;;
1321 MOV cs:fptr_hih,AL ;;
1322 MOV cs:stage,FPTR_SKIPX ;;
1323 JMP FTB_LOOP ;;
1324 ;;+++++++++++++++++++++++++++++++++
1325 ENTRYLO : ;; STAGE - ENTRY LOW BYTE
1326 MOV AX,FPKT ;;
1327 INC SI ;; byte by byte
1328 DEC CX ;;
1329 AND CX,CX ;;
1330 JNZ WORD_ENTRY ;;
1331 MOV cs:entry_lob,AL ;;
1332 MOV cs:stage,ENTRY_HIX ;;
1333 JMP FTB_LOOP ;;
1334 WORD_ENTRY : ;;
1335 INC SI ;;
1336 DEC CX ;;
1337 MOV cs:entry_word,AX ;;
1338 MOV cs:stage,PASSX ;; 2 bytes to be passed
1339 MOV cs:pass_postx,NEXT_LOLX ;;
1340 JMP FTB_LOOP ;;
1341 ;;+++++++++++++++++++++++++++++++++
1342 ENTRYHI : ;; stage - ENTRY HIGN BYTE
1343 MOV AX,FPKT ;;
1344 INC SI ;; byte by byte
1345 DEC CX ;;
1346 MOV cs:entry_hib,AL ;;
1347 MOV cs:stage,PASSX ;; 2 bytes to be passed
1348 MOV cs:pass_postx,NEXT_LOLX ;;
1349 AND CX,CX ;;
1350 JNZ ENTHI_PASS1 ;;
1351 JMP FTB_LOOP ;;
1352 ENTHI_PASS1 : ;;
1353 INC SI ;;
1354 INC cs:pass_cnt ;;
1355 DEC CX ;;
1356 AND CX,CX ;;
1357 JNZ ENTHI_PASS2 ;;
1358 JMP FTB_LOOP ;;
1359 ENTHI_PASS2 : ;;
1360 INC SI ;;
1361 INC cs:pass_cnt ;;
1362 DEC CX ;;
1363 MOV cs:stage,NEXT_LOLX ;;
1364 JMP FTB_LOOP ;;
1365 ;;+++++++++++++++++++++++++++++++++
1366 NEXTLOL : ;; STAGE the low byte of the low NEXT
1367 MOV AX,FPKT ;;
1368 INC SI ;; byte by byte
1369 DEC CX ;;
1370 AND CX,CX ;;
1371 JNZ WORD_NEXTLO ;;
1372 MOV cs:next_lol,AL ;;
1373 MOV cs:stage,NEXT_LOHX ;;
1374 JMP FTB_LOOP ;;
1375 WORD_NEXTLO : ;;
1376 INC SI ;;
1377 DEC CX ;;
1378 MOV cs:next_low,AX ;;
1379 MOV cs:stage,next_hilX ;;
1380 JMP FTB_LOOP ;;
1381 ;;+++++++++++++++++++++++++++++++++
1382 NEXTLOH : ;; STAGE the high byte of the low NEXT
1383 MOV AX,FPKT ;;
1384 INC SI ;; byte by byte
1385 DEC CX ;;
1386 MOV cs:next_loh,AL ;;
1387 MOV cs:stage,next_hilX ;;
1388 JMP FTB_LOOP ;;
1389 ;;+++++++++++++++++++++++++++++++++
1390 NEXTHIL : ;; STAGE the low byte of the high NEXT
1391 MOV AX,FPKT ;;
1392 INC SI ;; byte by byte
1393 DEC CX ;;
1394 AND CX,CX ;;
1395 JNZ WORD_NEXTHI ;;
1396 MOV cs:next_hil,AL ;;
1397 MOV cs:stage,NEXT_HIHX ;;
1398 JMP FTB_LOOP ;;
1399 WORD_NEXTHI : ;;
1400 INC SI ;;
1401 DEC CX ;;
1402 MOV cs:next_high,AX ;;
1403 MOV cs:stage,type_lobX ;;
1404 JMP FTB_LOOP ;;
1405 ;;+++++++++++++++++++++++++++++++++
1406 NEXTHIH : ;; STAGE the high byte of the high NEXT
1407 MOV AX,FPKT ;;
1408 INC SI ;; byte by byte
1409 DEC CX ;;
1410 MOV cs:next_hih,AL ;;
1411 MOV cs:stage,type_lobX ;;
1412 JMP FTB_LOOP ;;
1413 ;;+++++++++++++++++++++++++++++++++
1414 TYPELO : ;; STAGE the low byte of the TYPE
1415 MOV AX,FPKT ;;
1416 INC SI ;; byte by byte
1417 DEC CX ;;
1418 AND CX,CX ;;
1419 JNZ WORD_TYPE ;;
1420 MOV cs:type_lob,AL ;;
1421 MOV cs:stage,type_hibX ;;
1422 JMP FTB_LOOP ;;
1423 WORD_TYPE : ;;
1424 INC SI ;;
1425 DEC CX ;;
1426 MOV cs:type_word,AX ;;
1427 MOV cs:stage,type_idX ;;
1428 MOV cs:tid_cnt,0 ;;
1429 JMP FTB_LOOP ;;
1430 ;;+++++++++++++++++++++++++++++++++
1431 TYPEHI : ;; STAGE the high byte of the TYPE
1432 MOV AX,FPKT ;;
1433 INC SI ;; byte by byte
1434 DEC CX ;;
1435 MOV cs:type_hib,AL ;;
1436 MOV cs:stage,TYPE_IDX ;;
1437 MOV cs:tid_cnt,0 ;;
1438 JMP FTB_LOOP ;;
1439 ;;+++++++++++++++++++++++++++++++++
1440 TYPEIDS : ;; STAGE the type id
1441 CMP cs:tid_cnt,8 ;;
1442 JNA VALID_TID ;;
1443 MOV FTP.FTB_STATUS,STAT_DEVERR
1444 MOV cs:fp_error,00021H ;; ERROR 0021H
1445 ADD SI,CX ;;
1446 SUB CX,CX ;;
1447 JMP FTB_LOOP ;;
1448 ;;
1449 VALID_TID : ;;
1450 MOV AX,8 ;;
1451 SUB AX,cs:tid_cnt ;;
1452 CMP CX,AX ;;
1453 JNB TID_ALL ;;
1454 ;; all data in FPKT are stored
1455 PUSH ES ;;
1456 PUSH CS ;;
1457 POP ES ;;
1458 ;;
1459 MOV DI,OFFSET TYPE_ID ;;
1460 ADD DI,cs:tid_cnt ;;
1461 ADD cs:tid_cnt,CX ;;
1462 REP MOVSB ;; SI is incremented accordingly
1463 POP ES ;;
1464 ;;
1465 MOV CX,0 ;; STAGE remained
1466 JMP FTB_LOOP ;;
1467 TID_ALL : ;;
1468 PUSH CX ;;
1469 ;;
1470 PUSH ES ;;
1471 PUSH CS ;;
1472 POP ES ;;
1473 ;;
1474 MOV DI,OFFSET TYPE_ID ;;
1475 ADD DI,cs:tid_cnt ;;
1476 MOV CX,AX ;;
1477 REP MOVSB ;; SI is incremented accordingly
1478 POP ES ;;
1479 ;;
1480 ADD cs:tid_cnt,AX ;;
1481 POP CX ;;
1482 SUB CX,AX ;;
1483 ;;
1484 MOV cs:stage,CPG_LOBX ;;
1485 JMP FTB_LOOP ;;
1486 ;;+++++++++++++++++++++++++++++++++
1487 CPGLO : ;; STAGE the low byte of the CODE PAGE
1488 MOV AX,FPKT ;;
1489 INC SI ;; byte by byte
1490 DEC CX ;;
1491 AND CX,CX ;;
1492 JNZ WORD_CPG ;;
1493 MOV cs:cpg_lob,AL ;;
1494 MOV cs:stage,CPG_HIBX ;;
1495 JMP FTB_LOOP ;;
1496 WORD_CPG : ;;
1497 INC SI ;;
1498 DEC CX ;;
1499 MOV cs:cpg_word,AX ;;
1500 MOV cs:stage,PASSX ;;
1501 MOV cs:pass_postx,font_lolX ;;
1502 JMP FTB_LOOP ;;
1503 ;;+++++++++++++++++++++++++++++++++
1504 CPGHI : ;; STAGE the high byte of the CODE PAGE
1505 MOV AX,FPKT ;;
1506 INC SI ;; byte by byte
1507 DEC CX ;;
1508 MOV cs:cpg_hib,AL ;;
1509 MOV cs:stage,PASSX ;;
1510 MOV cs:pass_postx,font_lolX ;;
1511 JMP FTB_LOOP ;;
1512 ;;+++++++++++++++++++++++++++++++++
1513 FONTLOL : ;; STAGE the low byte of the low FONT
1514 MOV AX,FPKT ;;
1515 INC SI ;; byte by byte
1516 DEC CX ;;
1517 AND CX,CX ;;
1518 JNZ WORD_FONTLO ;;
1519 MOV cs:font_lol,AL ;;
1520 MOV cs:stage,FONT_LOHX ;;
1521 JMP FTB_LOOP ;;
1522 WORD_FONTLO : ;;
1523 INC SI ;;
1524 DEC CX ;;
1525 MOV cs:font_low,AX ;;
1526 MOV cs:stage,FONT_HILX ;;
1527 JMP FTB_LOOP ;;
1528 ;;+++++++++++++++++++++++++++++++++
1529 FONTLOH : ;; STAGE the high byte of the low FONT
1530 MOV AX,FPKT ;;
1531 INC SI ;; byte by byte
1532 DEC CX ;;
1533 MOV cs:font_loh,AL ;;
1534 MOV cs:stage,FONT_HILX ;;
1535 JMP FTB_LOOP ;;
1536 ;;+++++++++++++++++++++++++++++++++
1537 FONTHIL : ;; STAGE the low byte of the high FONT
1538 MOV AX,FPKT ;;
1539 INC SI ;; byte by byte
1540 DEC CX ;;
1541 AND CX,CX ;;
1542 JNZ WORD_FONTHI ;;
1543 MOV cs:font_hil,AL ;;
1544 MOV cs:stage,FONT_HIHX ;;
1545 JMP FTB_LOOP ;;
1546 WORD_FONTHI : ;;
1547 INC SI ;;
1548 DEC CX ;;
1549 MOV cs:font_high,AX ;;
1550 ;;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN
1551 ;; anymore headers to be processed ?
1552 MOV cs:stage,MATCHX ;;
1553 MOV AX,cs:entry_word ;;
1554 DEC AX ;;
1555 MOV cs:entry_word,AX ;;
1556 AND AX,AX ;;
1557 JNZ CHECK_NEXT ;;
1558 ;; no more header to be processed !
1559 MOV AX,-1 ;;
1560 MOV cs:next_low,AX ;;
1561 MOV cs:next_high,AX ;; as ENTRY has been consumed
1562 JMP FTB_LOOP ;;
1563 ;;
1564 CHECK_NEXT : ;;
1565 MOV AX,cs:next_low ;;
1566 AND AX,AX ;;
1567 JNZ MORE_HEADER ;;
1568 MOV AX,cs:next_high ;;
1569 AND AX,AX ;;
1570 JNZ MORE_HEADER ;;
1571 ;; no more header to be processed !
1572 MOV AX,-1 ;;
1573 MOV cs:next_low,AX ;; as NEXT is nil
1574 MOV cs:next_high,AX ;;
1575 ;;
1576 MORE_HEADER : ;;
1577 JMP FTB_LOOP ;;
1578 ;;+++++++++++++++++++++++++++++++++
1579 FONTHIH : ;; STAGE the high byte of the high FONT
1580 MOV AX,FPKT ;;
1581 INC SI ;; byte by byte
1582 DEC CX ;;
1583 MOV cs:font_hih,AL ;;
1584 ;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN
1585 ;;
1586 MOV cs:stage,MATCHX ;;
1587 ;; anymore headers to be processed ?
1588 MOV AX,cs:entry_word ;;
1589 DEC AX ;;
1590 MOV cs:entry_word,AX ;;
1591 AND AX,AX ;;
1592 JNZ CHECK_NEXT0 ;;
1593 ;; no more header to be processed !
1594 MOV AX,-1 ;;
1595 MOV cs:next_low,AX ;;
1596 MOV cs:next_high,AX ;; as ENTRY has been consumed
1597 JMP FTB_LOOP ;;
1598 ;;
1599 CHECK_NEXT0 : ;;
1600 MOV AX,cs:next_low ;;
1601 AND AX,AX ;;
1602 JNZ MORE_HEADER0 ;;
1603 MOV AX,cs:next_high ;;
1604 AND AX,AX ;;
1605 JNZ MORE_HEADER0 ;;
1606 ;; no more header to be processed !
1607 MOV AX,-1 ;;
1608 MOV cs:next_low,AX ;; as NEXT is nil
1609 MOV cs:next_high,AX ;;
1610 ;;
1611 MORE_HEADER0 : ;;
1612 JMP FTB_LOOP ;;
1613 ;;
1614 ;;+++++++++++++++++++++++++++++++++
1615 MODLO : ;; STAGE the low byte of the MODIFIER
1616 MOV AX,FPKT ;;
1617 INC SI ;; byte by byte
1618 DEC CX ;;
1619 AND CX,CX ;;
1620 JNZ WORD_MOD ;;
1621 MOV MOD_LOB,AL ;;
1622 MOV cs:stage,MOD_HIBX ;;
1623 JMP FTB_LOOP ;;
1624 WORD_MOD : ;;
1625 INC SI ;;
1626 DEC CX ;;
1627 MOV cs:mod_word,AX ;;
1628 MOV cs:stage,fonts_lobX ;;
1629 JMP FTB_LOOP ;;
1630 ;;+++++++++++++++++++++++++++++++++
1631 MODHI : ;; STAGE the high byte of the MODIFIER
1632 MOV AX,FPKT ;;
1633 INC SI ;; byte by byte
1634 DEC CX ;;
1635 MOV cs:mod_hib,AL ;;
1636 MOV cs:stage,FONTS_LOBX ;;
1637 JMP FTB_LOOP ;;
1638 ;;+++++++++++++++++++++++++++++++++
1639 FONTSLO : ;; STAGE the low byte of the FONTS
1640 MOV AX,FPKT ;;
1641 INC SI ;; byte by byte
1642 DEC CX ;;
1643 AND CX,CX ;;
1644 JNZ WORD_FONTS ;;
1645 MOV cs:fonts_lob,AL ;;
1646 MOV cs:stage,FONTS_HIBX ;;
1647 JMP FTB_LOOP ;;
1648 WORD_FONTS : ;;
1649 INC SI ;;
1650 DEC CX ;;
1651 MOV cs:fonts_word,AX ;;
1652 MOV cs:stage,FDLEN_LOBX ;;
1653 JMP FTB_LOOP ;;
1654 ;;+++++++++++++++++++++++++++++++++
1655 FONTSHI : ;; STAGE the high byte of the FONTS
1656 MOV AX,FPKT ;;
1657 INC SI ;; byte by byte
1658 DEC CX ;;
1659 MOV cs:fonts_hib,AL ;;
1660 MOV cs:stage,FDLEN_LOBX ;;
1661 JMP FTB_LOOP ;;
1662 ;;+++++++++++++++++++++++++++++++++
1663 FDLENLO : ;; the low byte of the FONT-LENGTH
1664 MOV AX,FPKT ;;
1665 INC SI ;; byte by byte
1666 DEC CX ;;
1667 AND CX,CX ;;
1668 JNZ WORD_FDLEN ;;
1669 MOV cs:fdlen_lob,AL ;;
1670 MOV cs:stage,FDLEN_HIBX ;;
1671 JMP FTB_LOOP ;;
1672 WORD_FDLEN : ;;
1673 INC SI ;;
1674 DEC CX ;;
1675 MOV cs:pre_font_len,PRE_FONT_ND;;
1676 MOV cs:fdlen_word,AX ;;
1677 ; AND AX,AX ;;
1678 ; JZ NO_DISP_PTR ;;
1679 ; CMP cs:type_word,TYPE_DISPLAY ;;
1680 ; JE DISPLAY_TYPE1 ;;
1681 ; CMP cs:type_word,TYPE_PRINTER ;;
1682 ; JE PRINTER_TYPE1 ;;
1683 ;;
1684 ;NO_DISP_PTR : ;;
1685 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1686 JMP FTB_LOOP ;;
1687 ;DISPLAY_TYPE1 : ;;
1688 ; MOV cs:stage,DISP_ROWSX ;;
1689 ; JMP FTB_LOOP ;;
1690 ;PRINTER_TYPE1 : ;;
1691 ; MOV cs:stage,PTRSELLOX ;;
1692 ; JMP FTB_LOOP ;;
1693 ;;
1694 ;;+++++++++++++++++++++++++++++++++
1695 FDLENHI : ;; STAGE the high byte of the F-LENGTH
1696 MOV cs:pre_font_len,PRE_FONT_ND
1697 MOV AX,FPKT ;;
1698 INC SI ;; byte by byte
1699 DEC CX ;;
1700 MOV cs:fdlen_hib,AL ;;
1701 MOV AX,cs:fdlen_word ;;
1702 ; AND AX,AX ;;
1703 ; JZ NO_DISP_PTR2 ;;
1704 ; CMP cs:type_word,TYPE_DISPLAY ;;
1705 ; JE DISPLAY_TYPE2 ;;
1706 ; CMP cs:type_word,TYPE_PRINTER ;;
1707 ; JE PRINTER_TYPE2 ;;
1708 ;NO_DISP_PTR2: ;;
1709 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1710 JMP FTB_LOOP ;;
1711 ;DISPLAY_TYPE2 : ;;
1712 ; MOV cs:stage,DISP_ROWSX ;;
1713 ; JMP FTB_LOOP ;;
1714 ;PRINTER_TYPE2 : ;;
1715 ; MOV cs:stage,PTRSELLOX ;;
1716 ; JMP FTB_LOOP ;;
1717 ;;
1718 ;;+++++++++++++++++++++++++++++++++
1719 DSPROWS : ;; STAGE : get the rows
1720 ; XOR AX,AX ;;
1721 ; MOV cs:disp_rows,AL ;;
1722 ; MOV cs:disp_cols,AL ;;
1723 ; MOV cs:DISP_X,AL ;;
1724 ; MOV cs:disp_y,AL ;;
1725 ; MOV cs:count_word,AX ;;
1726 ; ;;
1727 ; INC cs:pre_font_len ;;
1728 ; MOV AX,FPKT ;;
1729 ; INC SI ;;
1730 ; DEC CX ;;
1731 ; MOV cs:disp_rows,AL ;;
1732 ; MOV AX,cs:fdlen_word ;;
1733 ; DEC AX ;;
1734 ; MOV cs:fdlen_word,AX ;;
1735 ; JZ NO_DISP_FONT3 ;;
1736 ; MOV cs:stage,disp_colsX ;;
1737 ; JMP FTB_LOOP ;;
1738 ;NO_DISP_FONT3 : ;;
1739 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1740 ; JMP FTB_LOOP ;;
1741 ; ;;+++++++++++++++++++++++++++++++++
1742 DSPCOLS : ;; STAGE : get the COLS
1743 ; INC cs:pre_font_len ;;
1744 ; MOV AX,FPKT ;;
1745 ; INC SI ;;
1746 ; DEC CX ;;
1747 ; MOV cs:disp_cols,AL ;;
1748 ; MOV AX,cs:fdlen_word ;;
1749 ; DEC AX ;;
1750 ; MOV cs:fdlen_word,AX ;;
1751 ; JZ NO_DISP_FONT3 ;;
1752 ; MOV cs:stage,DISP_XX ;;
1753 ; JMP FTB_LOOP ;;
1754 ;;+++++++++++++++++++++++++++++++++
1755 DSPX : ;; STAGE : get the aspect X
1756 ; INC cs:pre_font_len ;;
1757 ; MOV AX,FPKT ;;
1758 ; INC SI ;;
1759 ; DEC CX ;;
1760 ; MOV DISP_X,AL ;;
1761 ; MOV AX,cs:fdlen_word ;;
1762 ; DEC AX ;;
1763 ; MOV cs:fdlen_word,AX ;;
1764 ; JZ NO_DISP_FONT3 ;;
1765 ; MOV cs:stage,DISP_YX ;;
1766 ; JMP FTB_LOOP ;;
1767 ; ;;+++++++++++++++++++++++++++++++++
1768 DSPY : ;; STAGE : get the aspect Y
1769 ; INC cs:pre_font_len ;;
1770 ; MOV AX,FPKT ;;
1771 ; INC SI ;;
1772 ; DEC CX ;;
1773 ; MOV cs:disp_y,AL ;;
1774 ; MOV AX,cs:fdlen_word ;;
1775 ; DEC AX ;;
1776 ; MOV cs:fdlen_word,AX ;;
1777 ; JZ NO_DISP_FONT3 ;;
1778 ; MOV cs:stage,COUNT_LOBX ;;
1779 ; JMP FTB_LOOP ;;
1780 ; ;;
1781 ;;+++++++++++++++++++++++++++++++++
1782 DSPCOUNTLO : ;; the low byte of the FONT-LENGTH
1783 ; INC cs:pre_font_len ;;
1784 ; MOV AX,FPKT ;;
1785 ; INC SI ;; byte by byte
1786 ; DEC CX ;;
1787 ; PUSH AX ;; check if length is enough
1788 ; MOV AX,cs:fdlen_word ;;
1789 ; DEC AX ;;
1790 ; MOV cs:fdlen_word,AX ;;
1791 ; POP AX ;;
1792 ; JNZ A_WORD_COUNT ;;
1793 ; JMP NO_DISP_FONT3 ;;
1794 ;A_WORD_COUNT : ;;
1795 ; AND CX,CX ;;
1796 ; JNZ WORD_COUNT ;;
1797 ; MOV cs:count_lob,AL ;;
1798 ; MOV cs:stage,COUNT_HIBX ;;
1799 ; JMP FTB_LOOP ;;
1800 ;WORD_COUNT : ;;
1801 ; INC cs:pre_font_len ;;
1802 ; INC SI ;;
1803 ; DEC CX ;;
1804 ; MOV cs:count_word,AX ;;
1805 ; MOV cs:pre_font_len,PRE_FONT_D;
1806 ;;
1807 ; MOV AX,cs:fdlen_word ;;
1808 ; DEC AX ;;
1809 ; MOV cs:fdlen_word,AX ;;
1810 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1811 ; JMP FTB_LOOP ;;
1812 ; ;;
1813 ; ;;+++++++++++++++++++++++++++++++++
1814 DSPCOUNTHI : ;; STAGE the high byte of the F-LENGTH
1815 ; INC cs:pre_font_len ;;
1816 ; MOV AX,FPKT ;;
1817 ; INC SI ;; byte by byte
1818 ; DEC CX ;;
1819 ; MOV cs:count_hib,AL ;;
1820 ; MOV cs:pre_font_len,PRE_FONT_D;
1821 ;;
1822 ; MOV AX,cs:fdlen_word ;;
1823 ; DEC AX ;;
1824 ; MOV cs:fdlen_word,AX ;;
1825 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1826 ; JMP FTB_LOOP ;;
1827 ; ;;
1828 ;;
1829 ;;+++++++++++++++++++++++++++++++++
1830 PTRSELLO : ;; the low byte of the SELECTION_TYPE
1831 ;;
1832 ; INC cs:pre_font_len ;;
1833 ; MOV AX,FPKT ;;
1834 ; INC SI ;; byte by byte
1835 ; DEC CX ;;
1836 ; PUSH AX ;; check if length is enough
1837 ; MOV AX,cs:fdlen_word ;;
1838 ; DEC AX ;;
1839 ; MOV cs:fdlen_word,AX ;;
1840 ; POP AX ;;
1841 ; JNZ A_WORD_SEL ;;
1842 ; JMP NO_PTR_FONT3 ;;
1843 ;A_WORD_SEL : ;;
1844 ; AND CX,CX ;;
1845 ; JNZ WORD_SEL ;;
1846 ; MOV cs:ptr_selob,AL ;;
1847 ; MOV cs:stage,PTRSELHIX ;;
1848 ; JMP FTB_LOOP ;;
1849 ;WORD_SEL : ;;
1850 ; INC cs:pre_font_len ;;
1851 ; INC SI ;;
1852 ; DEC CX ;;
1853 ; MOV cs:ptr_sel_word,AX ;;
1854 ; ;;
1855 ; MOV AX,cs:fdlen_word ;;
1856 ; DEC AX ;;
1857 ; MOV cs:fdlen_word,AX ;;
1858 ; ;;
1859 ; CMP cs:ptr_sel_word,0 ;;
1860 ; JNE PTR_SEL_NOT0 ;;
1861 ; ;;
1862 ; ;;
1863 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1864 ; JMP FTB_LOOP ;;
1865 ; ;;
1866 ;PTR_SEL_NOT0 : ;;
1867 ; MOV cs:stage,PTRLENLOX ;;
1868 ; JMP FTB_LOOP ;;
1869 ; ;;
1870 ;;+++++++++++++++++++++++++++++++++
1871 PTRSELHI: ;; STAGE the high byte of SELECT_TYPE
1872 ;;
1873 ; INC cs:pre_font_len ;;
1874 ; MOV AX,FPKT ;;
1875 ; INC SI ;; byte by byte
1876 ; DEC CX ;;
1877 ; MOV cs:ptr_sehib,AL ;;
1878 ; ;;
1879 ; MOV AX,cs:fdlen_word ;;
1880 ; DEC AX ;;
1881 ; MOV cs:fdlen_word,AX ;;
1882 ; ;;
1883 ; CMP cs:ptr_sel_word,0 ;;
1884 ; JNE PTR_SEL_NOT0 ;;
1885 ; ;;
1886 ; ;;
1887 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1888 ; JMP FTB_LOOP ;;
1889 ; ;;
1890 ; ;;
1891 ;;+++++++++++++++++++++++++++++++++
1892 PTRLENLO : ;; the low byte of SELECTION_LENGTH
1893 ;;
1894 ; INC cs:pre_font_len ;;
1895 ; MOV AX,FPKT ;;
1896 ; INC SI ;; byte by byte
1897 ; DEC CX ;;
1898 ; PUSH AX ;; check if length is enough
1899 ; MOV AX,cs:fdlen_word ;;
1900 ; DEC AX ;;
1901 ; MOV cs:fdlen_word,AX ;;
1902 ; POP AX ;;
1903 ; JNZ A_WORD_SELEN ;;
1904 ; JMP NO_PTR_FONT3 ;;
1905 ;A_WORD_SELEN : ;;
1906 ; AND CX,CX ;;
1907 ; JNZ WORD_SELEN ;;
1908 ; MOV cs:ptr_lnlob,AL ;;
1909 ; MOV cs:stage,PTRLENHIX ;;
1910 ; JMP FTB_LOOP ;;
1911 ;WORD_SELEN : ;;
1912 ; INC cs:pre_font_len ;;
1913 ; INC SI ;;
1914 ; DEC CX ;;
1915 ; MOV cs:ptr_len_word,AX ;;
1916 ; ;;
1917 ; MOV AX,cs:fdlen_word ;;
1918 ; DEC AX ;;
1919 ; MOV cs:fdlen_word,AX ;;
1920 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1921 ; JMP FTB_LOOP ;;
1922 ; ;;
1923 ;;+++++++++++++++++++++++++++++++++
1924 PTRLENHI : ;; STAGE the high byte of SELECT_LENGTH
1925 ;;
1926 SUB CX,CX ;D; added for DISPLAY.SYS version
1927 MOV CS:STAGE,STAGE_MAX+1 ;D; added for DISPLAY.SYS version
1928 JMP FTB_LOOP ;D; added for DISPLAY.SYS version
1929 ;;
1930 ;;
1931 ; INC cs:pre_font_len ;;
1932 ; MOV AX,FPKT ;;
1933 ; INC SI ;; byte by byte
1934 ; DEC CX ;;
1935 ; MOV cs:ptr_lnhib,AL ;;
1936 ; ;;
1937 ; MOV AX,cs:fdlen_word ;;
1938 ; DEC AX ;;
1939 ; MOV cs:fdlen_word,AX ;;
1940 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1941 ; JMP FTB_LOOP ;;
1942 ; ;;
1943 ;NO_PTR_FONT3 : ;;
1944 ; MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1945 ; JMP FTB_LOOP ;;
1946 ;;+++++++++++++++++++++++++++++++++
1947 PASS : ;; STAGE - PASS DUMMY BYTES
1948 ;;
1949 PUSH DX ;;
1950 PUSH ES ;;
1951 PUSH DI ;;
1952 ;;
1953 PUSH CS ;;
1954 POP ES ;;
1955 MOV DI,OFFSET PASS_BRK ;;
1956 MOV DX,PASS_INDX ;;
1957 MOV AX,cs:pass_cnt ;;
1958 ;;
1959 NEXT_BRK: ;; find the next pass-break
1960 CMP AX,ES:[DI] ;;
1961 ;;
1962 JB UPTO_BRK ;;
1963 ;;
1964 DEC DX ;;
1965 JZ PASS_ERR ;;
1966 INC DI ;;
1967 INC DI ;;
1968 JMP NEXT_BRK ;;
1969 ;;
1970 UPTO_BRK : ;; next break point found
1971 MOV DX,ES:[DI] ;;
1972 SUB DX,AX ;; bytes to be skipped
1973 CMP CX,DX ;; all to be skipped ?
1974 JAE PASS_ALL ;;
1975 ;;
1976 ADD cs:pass_cnt,CX ;;
1977 ADD SI,CX ;;
1978 SUB CX,CX ;;
1979 JMP PASS_END ;;
1980 ;;
1981 PASS_ALL : ;;
1982 ADD cs:pass_cnt,DX ;;
1983 ADD SI,DX ;;
1984 SUB CX,DX ;;
1985 ;;
1986 MOV AX,cs:pass_postx ;;
1987 MOV cs:stage,AX ;;
1988 ;;
1989 ; cmp ax,passx ;; is the next stage a pass-stage ?
1990 ; jne not_passx ;;
1991 ; mov ax,pass_postxx ;;
1992 ; mov pass_postx,ax ;;
1993 ; mov pass_postxx,stage_max ;; can support only 2 consecutive pass
1994 ;;
1995 ;not_passx : ;;
1996 ;;
1997 JMP PASS_END ;;
1998 ;;
1999 PASS_ERR : ;; DEVICE ERROR, wrong stage
2000 POP DI ;;
2001 POP ES ;;
2002 POP DX ;;
2003 MOV FTP.FTB_STATUS,STAT_DEVERR
2004 SUB CX,CX ;; ignore all the input string
2005 JMP PASS_DONE ;;
2006 ;;
2007 PASS_END : ;;
2008 POP DI ;;
2009 POP ES ;;
2010 POP DX ;;
2011 PASS_DONE : ;;
2012 JMP FTB_LOOP ;;
2013 ;;
2014 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2015 ;;
2016 FTB_LPEND : ;;
2017 ;;
2018 CMP cs:stage,FOUNDX ;;
2019 JNE NOT_FOUNDX ;;
2020 ;;
2021 CALL FOUND_DO ;;
2022 ;;
2023 NOT_FOUNDX : ;;
2024 ;;
2025 POP CX ;; STACK -1
2026 ;;
2027 FP_RET : ;;
2028 POP SI ;; restore registers
2029 POP DI ;;
2030 POP DX ;;
2031 POP CX ;;
2032 POP BX ;;
2033 POP AX ;;
2034 POP ES ;;
2035 POP DS ;;
2036 ;;
2037 RET ;;
2038 FONT_PARSER ENDP ;;
2039 ;;
2040 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;