summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/F-PARSER.INC
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/DISPLAY/F-PARSER.INC
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/F-PARSER.INC')
-rw-r--r--v4.0/src/DEV/DISPLAY/F-PARSER.INC2040
1 files changed, 2040 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/F-PARSER.INC b/v4.0/src/DEV/DISPLAY/F-PARSER.INC
new file mode 100644
index 0000000..47c166b
--- /dev/null
+++ b/v4.0/src/DEV/DISPLAY/F-PARSER.INC
@@ -0,0 +1,2040 @@
1
2 PAGE ,132
3
4IF1
5 %OUT . ®F-PARSER.SRC¯
6ENDIF
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 ;;
43STAT_DELETE EQU 08000H ; previous degignate deleted (DST)
44 ; STAT_DELETE : only for FIFO
45STAT_NOFIND EQU 08008H ; codepage,device not found (DST)
46STAT_DEVERR EQU 0800AH ; Device error (DST, IVK, QIV, QLS)
47STAT_BADATA EQU 0800CH ; bad font file (DST)
48STAT_BADDEN EQU 0800CH ; no DST (DEN)
49STAT_TOMANY EQU 0800CH ; too manay codepages (DST)
50STAT_DUPLCP EQU 0800CH ; too manay codepages (DST)
51STAT_NOCPIV EQU 08007H ; no codepage designated/invoked
52STAT_NOCP EQU 08007H ; no codepage designated/invoked
53 ; (IVK, QIV, QLS)
54TYPE_DISPLAY EQU 01H ;; display type device
55FLAG_RESTART EQU 000001H ;; bit 1 = restart the parsing
56
57FPKT EQU DS:[SI] ;
58FTP EQU ES:[BX] ;
59 ; ( I=Input O=Output )
60FTBLK STRUC ;
61FTB_LENGTH DW TYPE FTBLK ; (NOT TO BE CHANGED)
62FTB_STATUS DW 0FFFFH ; (O) parsing compelte
63FTB_TYPE DW 0 ; (O)
64FTB_TID DB '........' ; (I)
65FTB_CP DW 0FFFFH ; (I)
66FTB_MOD DW 0 ; (O)
67FTB_FONTS DW 0 ; (O)
68FTB_ROWS DB 0 ;; (O) DISPLAY TYPE DEVICE
69FTB_COLS DB 0 ;; (O) DISPLAY TYPE DEVICE
70FTB_X DB 0 ;; (O) DISPLAY TYPE DEVICE
71FTB_Y DB 0 ;; (O) DISPLAY TYPE DEVICE
72FTB_COUNT DW 0 ;; (O) DISPLAY TYPE DEVICE
73FTB_DLEFT DW 0 ; (O) =0, none to come
74FTB_DLEN DW 0 ; (O) =0, not in this packet
75FTB_DALO DW 0 ; (O) in the DOS "packet" buffer
76FTB_DAHI DW 0 ; (O) " " " " "
77TARGET_LO DW 0 ; internal registers
78TARGET_HI DW 0 ; internal registers
79FTBLK ENDS ;
80 ;
81FBUFS STRUC ;
82FLAG DW 0 ;
83BUFFER_LEN DW 0 ;
84BUFFER_ADDR DD 0 ;
85NUM_FTBLK DW 0 ; no. of FTBKL entries
86FBUFS ENDS ;
87 ; STATUS : (in FTB_STATUS)
88FSTAT_COMPLETE EQU 0FFFFH ; parsing compeleted. (good status)
89FSTAT_FONT EQU 0FFFEH ; font data is defined and returned
90FSTAT_FOUND EQU 0FFFDH ; informations including font-length
91FSTAT_MATCH EQU 0FFFCH ; font header matches FTBLK
92FSTAT_SEARCH EQU 0FFFBH ; seraching for header & font
93FSTAT_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 ;;
98PUBLIC 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing
118FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries
119FTB2 FTBLK <,,,,,,,,,,,,> ;;
120FTB3 FTBLK <,,,,,,,,,,,,> ;;
121FTB4 FTBLK <,,,,,,,,,,,,> ;;
122FTB5 FTBLK <,,,,,,,,,,,,> ;;
123FTB6 FTBLK <,,,,,,,,,,,,> ;;
124FTB7 FTBLK <,,,,,,,,,,,,> ;;
125FTB8 FTBLK <,,,,,,,,,,,,> ;;
126FTB9 FTBLK <,,,,,,,,,,,,> ;;
127FTBa FTBLK <,,,,,,,,,,,,> ;;
128FTBb FTBLK <,,,,,,,,,,,,> ;;
129FTBc FTBLK <,,,,,,,,,,,,> ;;
130 ;;
131FP_ERROR DW 0000H ;; internal error register
132 ;;
133 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
134 ;; the followings are bytes accumulated
135 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136FTAG_LEN EQU 8 ;; FILE TAGE in the font file header
137FTAG_COUNT DW 0000H ;;
138 ;;
139FTAG_PATTERN LABEL BYTE ;;
140 DB 0FFH ;;
141 DB 'FONT ' ;;
142 ;;
143 ;;
144 ;; POINTER in the font file header
145fptr_LOW LABEL WORD ;;
146fptr_LOL DB 00H ;; NEXT
147fptr_LOH DB 00H ;;
148fptr_HIGH LABEL WORD ;;
149fptr_HIL DB 00H ;;
150fptr_HIH DB 00H ;;
151 ;;
152 ;;
153 ;;
154ENTRY_WORD LABEL WORD ;;
155ENTRY_LOB DB 00H ;; ENTRY COUNT
156ENTRY_HIB DB 00H ;;
157NEXT_LOW LABEL WORD ;;
158NEXT_LOL DB 00H ;; NEXT
159NEXT_LOH DB 00H ;;
160NEXT_HIGH LABEL WORD ;;
161NEXT_HIL DB 00H ;;
162NEXT_HIH DB 00H ;;
163TYPE_WORD LABEL WORD ;;
164TYPE_LOB DB 00H ;; TYPE
165TYPE_HIB DB 00H ;;
166TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8)
167TYPE_ID : DB ' ' ;; TYPEID
168CPG_WORD LABEL WORD ;;
169CPG_LOB DB 00H ;; CODE PAGE
170CPG_HIB DB 00H ;;
171FONT_LOW LABEL WORD ;;
172FONT_LOL DB 00H ;; FONT ADDRESS
173FONT_LOH DB 00H ;;
174FONT_HIGH LABEL WORD ;;
175FONT_HIL DB 00H ;;
176FONT_HIH DB 00H ;;
177;; the followings are contained in the font-block in the exact order & length
178MOD_WORD LABEL WORD ;;
179MOD_LOB DB 00H ;; MODIFIER
180MOD_HIB DB 00H ;;
181FONTS_WORD LABEL WORD ;;
182FONTS_LOB DB 00H ;; FONTS
183FONTS_HIB DB 00H ;;
184FDLEN_WORD LABEL WORD ;;
185FDLEN_LOB DB 00H ;; FONT DATA LENGTH
186FDLEN_HIB DB 00H ;;
187PRE_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 ;;
219STAGE_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
267STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages
268 ;;
269 ;; STAGE-INDEX
270 ;;
271 ;; **** INDEX TO STAGE_CASES ****
272ENTRY_LOX EQU 00H ;;
273ENTRY_HIX EQU 01H ;;
274NEXT_LOLX EQU 02H ;; NEXT
275NEXT_LOHX EQU 03H ;;
276NEXT_HILX EQU 04H ;;
277NEXT_HIHX EQU 05H ;;
278TYPE_LOBX EQU 06H ;; TYPE
279TYPE_HIBX EQU 07H ;;
280TYPE_IDX EQU 08H ;; TYPEID
281CPG_LOBX EQU 09H ;; CODE PAGE
282CPG_HIBX EQU 0AH ;;
283FONT_LOLX EQU 0BH ;; FONT ADDRESS
284FONT_LOHX EQU 0CH ;;
285FONT_HILX EQU 0DH ;;
286FONT_HIHX EQU 0EH ;;
287 ;; ------------------------------
288MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages
289SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages
290 ;; ------------------------------
291MOD_LOBX EQU 11H ;; MODIFIER
292MOD_HIBX EQU 12H ;;
293FONTS_LOBX EQU 13H ;; FONTS
294FONTS_HIBX EQU 14H ;;
295FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH
296FDLEN_HIBX EQU 16H ;;
297DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE
298DISP_COLSX EQU 18H ;;
299DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO
300DISP_YX EQU 1AH ;;
301COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT
302COUNT_HIBX EQU 1CH ;;
303PTRSELLOX EQU 1DH ;;
304PTRSELHIX EQU 1EH ;;
305PTRLENLOX EQU 1FH ;;
306PTRLENHIX EQU 20H ;;
307 ;;
308 ;; ------------------------------
309FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage
310GET_FX EQU 22H ;;
311 ;; ------------------------------
312PASSX EQU 23H ;; see pass_brk table
313 ;; ------------------------------
314FTAGX EQU 24H ;; RESTART ==> FILE TAG
315 ;;
316fptr_LOLX EQU 25H ;; POINTER in font file header
317fptr_LOHX EQU 26H ;;
318fptr_HILX EQU 27H ;;
319fptr_HIHX EQU 28H ;; ---------------------------------
320 ;;
321fptr_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 ;;
333PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage
334 ;;
335FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file :
336 ;; ( after TAG, before POINTER)
337 ;;
338PASS_CNT DW 0 ;;
339PASS_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
344PASS_INDX EQU ($-PASS_BRK)/2 ;;
345 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
346 ;; the control variables : ;;;;;;;;
347 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
348STAGE DW STAGE_MAX ;; of the STAGE-INDEX
349 ;;
350Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA
351 ;;
352 ;;
353COUNT_LO DW 00000H ;; no. of bytes parsed so far
354COUNT_hI DW 00000H ;;
355 ;;
356HIT_LO DW 00000H ;; the next byte that is addressed by :
357HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK.
358 ;;
359HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching
360HIT_BX DW 00000H ;; where FTB is found for nearest hit
361 ;;
362NUM_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 ;;
375FONT_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 ;;
396VALID_BUFFER : ;;
397 MOV AX,FTP.FLAG ;;
398 AND AX,FLAG_RESTART ;;
399 Jnz has_RESTART ;;
400 JMP NO_RESTART ;;
401 ;;
402 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
403has_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 ;;
424RESET_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 ;;
448NO_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 ;;
457SET_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 ;;
468SET_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 ;;
490FTB_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 ;;
496NO_CARRY : ;;
497 PUSH CX ;; STACK 1 = CX
498 AND CX,CX ;;
499 JNZ FTB_CONT ;;
500 JMP FTB_LPEND ;;
501 ;; DO CASES :
502FTB_CONT : ;; ==========
503 ;;
504 MOV AX,cs:stage ;;
505 ;;
506 CMP AX,STAGE_MAX ;;
507 JNE FTB_010 ;;
508 JMP START_CASE ;; ** RESTART **
509 ;;
510FTB_010 : ;;
511 CMP AX,MATCHX ;;
512 JAE FTB_020 ;;
513 JMP SEARCH_CASE ;; ** SEARCH **
514 ;;
515FTB_020 : ;;
516 CMP AX,MATCHX ;;
517 JNE FTB_030 ;;
518 JMP MATCH_CASE ;; ** MATCH **
519 ;;
520FTB_030 : ;;
521 CMP AX,SCANX ;;
522 JNE FTB_040 ;;
523 JMP SCAN_CASE ;; ** SCAN **
524 ;;
525FTB_040 : ;;
526 CMP AX,FOUNDX ;;
527 JAE FTB_050 ;;
528 JMP PRE_FOUND_CASE ;; ** PRE-FOUND **
529 ;;
530FTB_050 : ;;
531 CMP AX,FOUNDX ;;
532 JNE FTB_060 ;;
533 JMP FOUND_CASE ;; ** FOUND **
534 ;;
535FTB_060 : ;;
536 CMP AX,GET_FX ;;
537 JNE FTB_070 ;;
538 JMP GETFONT_CASE ;; ** GET_FONT **
539 ;;
540FTB_070 : ;;
541 CMP AX,PASSX ;;
542 JNE FTB_080 ;;
543 JMP PASS ;; ** PASS **
544 ;;
545FTB_080 : ;;
546 CMP AX,FPTR_SKIPX ;;
547 JAE FTB_090 ;;
548 JMP SEARCH_CASE ;; ** SEARCH **
549 ;;
550FTB_090 : ;;
551 CMP AX,FPTR_SKIPX ;;
552 JNE FTB_FFF ;;
553 JMP FPTR_SKIP_CASE ;; ** SEARCH **
554 ;;
555FTB_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;============================================================================
572START_CASE : ;; pass the FILE leading bytes
573 ;;
574 MOV cs:ftag_count,0 ;;
575 MOV cs:stage,ftagx ;;
576 JMP FTB_LOOP ;;
577 ;;
578;=============================================================================
579FPTR_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 ;;
596FPTR_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 ;;
608NO_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 ;;
621more_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 ;;
629NO_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 ;;
643NO_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
652NO_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 ;; ************************************
664fptr_MORE_CXP : ;;
665 POP DX ;;
666 POP AX ;; STACK -1
667 ;;
668fptr_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 ;; ***********************************
680fptr_skip_morep: ;;
681 POP DX ;;
682 POP AX ;; STACK -1
683 ;;
684fptr_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 ;;
693fptr_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;=============================================================================
702SEARCH_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;===========================================================================
714MATCH_CASE : ;;
715 ;;
716 PUSH BX ;;
717 MOV DX,cs:num_ftb ;;
718 ;;
719 ;;
720MATCH_LOOP : ;;
721 MOV AX,FTP.FTB_STATUS ;;
722 CMP AX,FSTAT_SEARCH ;;
723 JE MATCH_SEARCH ;;
724 JMP MATCH_NEXT ;;
725 ;;
726MATCH_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 ;;
757MATCH_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 ;;
769MATCH_NEXT : ;;
770 ADD BX,FTP.FTB_LENGTH ;;
771 DEC DX ;;
772 AND DX,DX ;;
773 JZ MATCH_ALL ;;
774 JMP MATCH_LOOP ;;
775 ;;
776MATCH_ALL : ;;
777 MOV cs:stage,SCANX ;;
778 ;;
779MATCH_DONE : ;;
780 POP BX ;;
781 JMP FTB_LOOP ;;
782 ;;
783;===========================================================================
784SCAN_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 ;;
809NO_CARRY2 : ;;
810 MOV cs:hit_lo,AX ;;
811 MOV cs:hit_hi,DI ;;
812 ;;
813 MOV DX,cs:num_ftb ;;
814 ;;
815 PUSH BX ;;
816SCAN_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 ;;
833NO_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 ;;
843SCAN_EQU : ;;
844 CMP AX,cs:hit_lo ;;
845 JA SCAN_NEXT ;;
846 JE SCAN_ERROR_CHK ;;
847 ;; **********************************
848 ;; * the font data is approaching *
849 ;; **********************************
850NEAR_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 ;; **********************************
860SCAN_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 ;;
867SCAN_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 ;; ************************************
879SCAN_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 ;;
891NOT_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 ;;
897NO_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 ;;
905NO_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 ;;
919NO_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 ;;
929NO_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 ;;
938MORE_CXP : ;;
939 POP DX ;;
940 POP AX ;;
941 ;;
942MORE_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 ;;
954NEXT_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 ;; ***********************************
963SCAN_MOREP : ;; * scan more FTBLK for the nearest *
964 ;; * font data *
965 ;; ***********************************
966 POP DX ;;
967 POP AX ;;
968 ;;
969SCAN_MORE : ;;
970 ADD SI,CX ;;
971 SUB CX,CX ;;
972 JMP FTB_LOOP ;; more SCAN stage
973 ;;
974SCAN_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 ;;
984BAD_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;===========================================================================
992PRE_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;===========================================================================
1003FOUND_CASE : ;;
1004 MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to
1005 PUSH DI ;;
1006;===========================================================================
1007FOUND_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 ;;
1080GET_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 ;;
1087FONT_RET : ;;
1088 POP BX ;;
1089 RET ;;
1090 ;;
1091;===========================================================================
1092GETFONT_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 ;;
1111NO_CARRY4 : ;;
1112 MOV cs:count_lo,AX ;;
1113 MOV cs:count_hi,DI ;;
1114 ;;
1115 ;;
1116GETFONT_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 ;;
1126GETFONT_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 ;;
1134GETFONT_CONT : ;;
1135 MOV AX,FTP.FTB_DLEFT ;;
1136 AND AX,AX ;;
1137 JNZ GETFONT_CONT1 ;;
1138NEXT_GF : ;;
1139 JMP NEXT_GETFONT ;;
1140 ;; only on FOUND and DLEFT <> 0
1141GETFONT_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 ;;
1153NO_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 ;;
1174NOT_HIGHER0 : ;;
1175 ADD FTP.TARGET_LO,AX ;;
1176 JNC NEXT_GETFONT ;;
1177 ADD FTP.TARGET_HI,01000H ;;
1178 JMP NEXT_GETFONT ;;
1179 ;;
1180GETFONT_BAD : ;;
1181 MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards
1182 JMP NEXT_GETFONT ;;
1183 ;;
1184UPTO_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 ;;
1192NO_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 ;;
1198NEXT_GETFONT : ;;
1199 ADD BX,FTP.FTB_LENGTH ;;
1200 DEC DX ;;
1201 AND DX,DX ;;
1202 JZ GETFONT_END ;;
1203 JMP GETFONT_LOOP ;;
1204 ;;
1205GETFONT_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 ;;
1215GETFONT_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 ;;+++++++++++++++++++++++++++++++++
1231filetag : ;;
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 ;;
1241FTAG_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 ;;
1246VALID_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 ;;
1260FTAG_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 ;;
1269FTAG_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 ;;+++++++++++++++++++++++++++++++++
1277fptrLOL : ;; 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 ;;
1286WORD_fptrLO : ;;
1287 INC SI ;;
1288 DEC CX ;;
1289 MOV cs:fptr_low,AX ;;
1290 MOV cs:stage,fptr_HILX ;;
1291 JMP FTB_LOOP ;;
1292 ;;+++++++++++++++++++++++++++++++++
1293fptrLOH : ;; 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 ;;+++++++++++++++++++++++++++++++++
1301fptrHIL : ;; 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 ;;
1310WORD_fptrHI : ;;
1311 INC SI ;;
1312 DEC CX ;;
1313 MOV cs:fptr_high,AX ;;
1314 MOV cs:stage,FPTR_SKIPX ;;
1315 JMP FTB_LOOP ;;
1316 ;;+++++++++++++++++++++++++++++++++
1317fptrHIH : ;; 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 ;;+++++++++++++++++++++++++++++++++
1325ENTRYLO : ;; 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 ;;
1334WORD_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 ;;+++++++++++++++++++++++++++++++++
1342ENTRYHI : ;; 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 ;;
1352ENTHI_PASS1 : ;;
1353 INC SI ;;
1354 INC cs:pass_cnt ;;
1355 DEC CX ;;
1356 AND CX,CX ;;
1357 JNZ ENTHI_PASS2 ;;
1358 JMP FTB_LOOP ;;
1359ENTHI_PASS2 : ;;
1360 INC SI ;;
1361 INC cs:pass_cnt ;;
1362 DEC CX ;;
1363 MOV cs:stage,NEXT_LOLX ;;
1364 JMP FTB_LOOP ;;
1365 ;;+++++++++++++++++++++++++++++++++
1366NEXTLOL : ;; 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 ;;
1375WORD_NEXTLO : ;;
1376 INC SI ;;
1377 DEC CX ;;
1378 MOV cs:next_low,AX ;;
1379 MOV cs:stage,next_hilX ;;
1380 JMP FTB_LOOP ;;
1381 ;;+++++++++++++++++++++++++++++++++
1382NEXTLOH : ;; 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 ;;+++++++++++++++++++++++++++++++++
1390NEXTHIL : ;; 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 ;;
1399WORD_NEXTHI : ;;
1400 INC SI ;;
1401 DEC CX ;;
1402 MOV cs:next_high,AX ;;
1403 MOV cs:stage,type_lobX ;;
1404 JMP FTB_LOOP ;;
1405 ;;+++++++++++++++++++++++++++++++++
1406NEXTHIH : ;; 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 ;;+++++++++++++++++++++++++++++++++
1414TYPELO : ;; 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 ;;
1423WORD_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 ;;+++++++++++++++++++++++++++++++++
1431TYPEHI : ;; 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 ;;+++++++++++++++++++++++++++++++++
1440TYPEIDS : ;; 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 ;;
1449VALID_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 ;;
1467TID_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 ;;+++++++++++++++++++++++++++++++++
1487CPGLO : ;; 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 ;;
1496WORD_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 ;;+++++++++++++++++++++++++++++++++
1504CPGHI : ;; 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 ;;+++++++++++++++++++++++++++++++++
1513FONTLOL : ;; 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 ;;
1522WORD_FONTLO : ;;
1523 INC SI ;;
1524 DEC CX ;;
1525 MOV cs:font_low,AX ;;
1526 MOV cs:stage,FONT_HILX ;;
1527 JMP FTB_LOOP ;;
1528 ;;+++++++++++++++++++++++++++++++++
1529FONTLOH : ;; 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 ;;+++++++++++++++++++++++++++++++++
1537FONTHIL : ;; 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 ;;
1546WORD_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 ;;
1564CHECK_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 ;;
1576MORE_HEADER : ;;
1577 JMP FTB_LOOP ;;
1578 ;;+++++++++++++++++++++++++++++++++
1579FONTHIH : ;; 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 ;;
1599CHECK_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 ;;
1611MORE_HEADER0 : ;;
1612 JMP FTB_LOOP ;;
1613 ;;
1614 ;;+++++++++++++++++++++++++++++++++
1615MODLO : ;; 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 ;;
1624WORD_MOD : ;;
1625 INC SI ;;
1626 DEC CX ;;
1627 MOV cs:mod_word,AX ;;
1628 MOV cs:stage,fonts_lobX ;;
1629 JMP FTB_LOOP ;;
1630 ;;+++++++++++++++++++++++++++++++++
1631MODHI : ;; 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 ;;+++++++++++++++++++++++++++++++++
1639FONTSLO : ;; 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 ;;
1648WORD_FONTS : ;;
1649 INC SI ;;
1650 DEC CX ;;
1651 MOV cs:fonts_word,AX ;;
1652 MOV cs:stage,FDLEN_LOBX ;;
1653 JMP FTB_LOOP ;;
1654 ;;+++++++++++++++++++++++++++++++++
1655FONTSHI : ;; 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 ;;+++++++++++++++++++++++++++++++++
1663FDLENLO : ;; 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 ;;
1672WORD_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 ;;+++++++++++++++++++++++++++++++++
1695FDLENHI : ;; 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 ;;+++++++++++++++++++++++++++++++++
1719DSPROWS : ;; 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; ;;+++++++++++++++++++++++++++++++++
1742DSPCOLS : ;; 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 ;;+++++++++++++++++++++++++++++++++
1830PTRSELLO : ;; 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 ;;+++++++++++++++++++++++++++++++++
1871PTRSELHI: ;; 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 ;;+++++++++++++++++++++++++++++++++
1892PTRLENLO : ;; 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 ;;+++++++++++++++++++++++++++++++++
1947PASS : ;; 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 ;;
1959NEXT_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 ;;
1970UPTO_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 ;;
1981PASS_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 ;;
1999PASS_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 ;;
2007PASS_END : ;;
2008 POP DI ;;
2009 POP ES ;;
2010 POP DX ;;
2011PASS_DONE : ;;
2012 JMP FTB_LOOP ;;
2013 ;;
2014;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2015 ;;
2016FTB_LPEND : ;;
2017 ;;
2018 CMP cs:stage,FOUNDX ;;
2019 JNE NOT_FOUNDX ;;
2020 ;;
2021 CALL FOUND_DO ;;
2022 ;;
2023NOT_FOUNDX : ;;
2024 ;;
2025 POP CX ;; STACK -1
2026 ;;
2027FP_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 ;;
2038FONT_PARSER ENDP ;;
2039 ;;
2040;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;