summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/ANSI/ANSI.ASM
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/ANSI/ANSI.ASM
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/ANSI/ANSI.ASM')
-rw-r--r--v4.0/src/DEV/ANSI/ANSI.ASM1169
1 files changed, 1169 insertions, 0 deletions
diff --git a/v4.0/src/DEV/ANSI/ANSI.ASM b/v4.0/src/DEV/ANSI/ANSI.ASM
new file mode 100644
index 0000000..a1d59c6
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/ANSI.ASM
@@ -0,0 +1,1169 @@
1PAGE ,132
2TITLE CONDEV FANCY CONSOLE DRIVER
3
4;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
5;
6; ADDRESSES FOR I/O
7;
8;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
9;------------------------------------------------------------------------------
10;AN000; New functionality in DOS 4.00
11;AN001; GHG fix scrolling flashes on Mod 25/30's
12;AN002; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K.
13;AN003; D375 /X needs to be supported by ANSI sequence also 12/14/87 J.K.
14;AN004; D397 /L option for Enforcing number of lines 12/17/87 J.K.
15;AN005; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
16;AN006; P4241 AN001 fix be Revised to fix this problem 04/20/88 J.K.
17;AN007; P4532 Scrolling has a snow for CGA adapter 04/27/88 J.K.
18;AN008; P4533 In mode Dh, Eh, Fh, 10h and 13h, Scrolling not working 04/27/88 J.K.
19;AN009; P4766 In mode 11h, and 12h erase display leaves bottom 5 05/24/88 F.G.
20;------------------------------------------------------------------------------
21
22TRUE EQU 0FFFFh
23FALSE EQU 0
24
25BREAK MACRO subtitle
26 SUBTTL subtitle
27 PAGE ,132
28ENDM
29
30AsmVars Macro varlist
31IRP var,<varlist>
32AsmVar var
33ENDM
34ENDM
35
36AsmVar Macro var
37IFNDEF var
38var = FALSE
39ENDIF
40ENDM
41
42INCLUDE VECTOR.INC
43INCLUDE MULT.INC
44INCLUDE ANSI.INC ; WGR equates and structures ;AN000;
45.xlist
46INCLUDE STRUC.INC ; WGR include STRUC macros ;AN000;
47.list
48
49BREAK <ANSI driver code>
50
51 CR=13 ;CARRIAGE RETURN
52 BACKSP=8 ;BACKSPACE
53 ESC_CHAR=1BH
54 BRKADR=6CH ;006C BREAK VECTOR ADDRESS
55 ASNMAX=400 ;WGR (increased) SIZE OF KEY ASSIGNMENT BUFFER
56
57PUBLIC SWITCH_X ; WGR/X option for extended keyboard redefinition support;AN000;
58PUBLIC SCAN_LINES ; WGR ;AN000;
59PUBLIC VIDEO_MODE_TABLE ; WGR ;AN000;
60PUBLIC VIDEO_TABLE_MAX ; WGR ;AN000;
61public MAX_VIDEO_TAB_NUM ;P1767
62PUBLIC PTRSAV ; WGR ;AN000;
63PUBLIC ERR1 ; WGR ;AN000;
64PUBLIC ERR2 ; WGR ;AN000;
65PUBLIC EXT_16 ; WGR ;AN000;
66PUBLIC BRKADR ; WGR ;AN000;
67PUBLIC BRKKY ; WGR ;AN000;
68PUBLIC COUT ; WGR ;AN000;
69PUBLIC BASE ; WGR ;AN000;
70PUBLIC MODE ; WGR ;AN000;
71PUBLIC MAXCOL ; WGR ;AN000;
72PUBLIC TRANS ; WGR ;AN000;
73PUBLIC STATUS ; WGR ;AN000;
74PUBLIC EXIT ; WGR ;AN000;
75PUBLIC NO_OPERATION ; WGR ;AN000;
76PUBLIC HDWR_FLAG ; WGR ;AN000;
77public Switch_L ;AN004;
78public Switch_K ;AN005;
79 ;AN000;
80CODE SEGMENT PUBLIC BYTE
81
82 ASSUME CS:CODE,DS:NOTHING,ES:NOTHING
83;-----------------------------------------------
84;
85; C O N - CONSOLE DEVICE DRIVER
86;
87
88EXTRN CON$INIT:NEAR ; WGR ANSI initialization code
89EXTRN GENERIC_IOCTL:NEAR ; WGR Generic IOCTL code
90EXTRN REQ_TXT_LENGTH:WORD ; WGR current text length
91EXTRN GRAPHICS_FLAG:BYTE ; WGR graphics flag
92
93CONDEV: ;HEADER FOR DEVICE "CON"
94 DW -1,-1
95 DW 1100000001010011B ;WGR changed to match CON ;AC000;
96 DW STRATEGY
97 DW ENTRY
98 DB 'CON '
99
100;--------------------------------------------------------------
101;
102; COMMAND JUMP TABLES
103CONTBL:
104 DW CON$INIT
105 DW NO_OPERATION ; WGR ;AC000;
106 DW NO_OPERATION ; WGR ;AC000;
107 DW NO_OPERATION ; WGR ;AC000;
108 DW CON$READ
109 DW CON$RDND
110 DW NO_OPERATION ; WGR ;AC000;
111 DW CON$FLSH
112 DW CON$WRIT
113 DW CON$WRIT
114 DW NO_OPERATION ; WGR ;AC000;
115 DW NO_OPERATION ; WGR ;AC000;
116 DW NO_OPERATION ; WGR ;AC000;
117 DW NO_OPERATION ; WGR ;AC000;
118 DW NO_OPERATION ; WGR ;AC000;
119 DW NO_OPERATION ; WGR ;AC000;
120 DW NO_OPERATION ; WGR ;AN000;
121 DW NO_OPERATION ; WGR ;AN000;
122 DW NO_OPERATION ; WGR ;AN000;
123 DW GENERIC_IOCTL ; WGR generic IOCTL routine offset ;AN000;
124MAX_CMD EQU ($ - CONTBL)/2 ; WGR size of CONTBL ;AN000;
125
126CMDTABL DB 'A'
127 DW CUU ;cursor up
128 DB 'B'
129 DW CUD ;cursor down
130 DB 'C'
131 DW CUF ;cursor forward
132 DB 'D'
133 DW CUB ;cursor back
134 DB 'H'
135 DW CUP ;cursor position
136 DB 'J'
137 DW ED ;erase display
138 DB 'K'
139 DW EL ;erase line
140 DB 'R'
141 DW CPR ;cursor postion report
142 DB 'f'
143 DW CUP ;cursor position
144 DB 'h'
145 DW SM ;set mode
146 DB 'l'
147 DW RM ;reset mode
148 DB 'm'
149 DW SGR ;select graphics rendition
150 DB 'n'
151 DW DSR ;device status report
152 DB 'p'
153 DW KEYASN ;key assignment
154 db 'q' ;AN003; dynamic support of /X option through ansi sequence
155 dw ExtKey ;AN003; esc[0q = reset it. esc[1q = set it
156 DB 's'
157 DW PSCP ;save cursor postion
158 DB 'u'
159 DW PRCP ;restore cursor position
160 DB 00
161
162GRMODE DB 00,00000000B,00000111B
163 DB 01,11111111B,00001000B
164 DB 04,11111000B,00000001B
165 DB 05,11111111B,10000000B
166 DB 07,11111000B,01110000B
167 DB 08,10001000B,00000000B
168 DB 30,11111000B,00000000B
169 DB 31,11111000B,00000100B
170 DB 32,11111000B,00000010B
171 DB 33,11111000B,00000110B
172 DB 34,11111000B,00000001B
173 DB 35,11111000B,00000101B
174 DB 36,11111000B,00000011B
175 DB 37,11111000B,00000111B
176 DB 40,10001111B,00000000B
177 DB 41,10001111B,01000000B
178 DB 42,10001111B,00100000B
179 DB 43,10001111B,01100000B
180 DB 44,10001111B,00010000B
181 DB 45,10001111B,01010000B
182 DB 46,10001111B,00110000B
183 DB 47,10001111B,01110000B
184 DB 0FFH
185
186;---------------------------------------------------
187;
188; Device entry point
189;
190CMDLEN = 0 ;LENGTH OF THIS COMMAND
191UNIT = 1 ;SUB UNIT SPECIFIER
192CMD = 2 ;COMMAND CODE
193STATUS = 3 ;STATUS
194MEDIA = 13 ;MEDIA DESCRIPTOR
195TRANS = 14 ;TRANSFER ADDRESS
196COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS
197START = 20 ;FIRST BLOCK TO TRANSFER
198
199PTRSAV DD 0
200
201BUF1: BUF_DATA <> ; WGR Next CON Buffer area ;AN000;
202
203STRATP PROC FAR
204
205STRATEGY:
206 MOV WORD PTR CS:[PTRSAV],BX
207 MOV WORD PTR CS:[PTRSAV+2],ES
208 RET
209
210STRATP ENDP
211
212ENTRY:
213 PUSH SI
214 PUSH AX
215 PUSH CX
216 PUSH DX
217 PUSH DI
218 PUSH BP
219 PUSH DS
220 PUSH ES
221 PUSH BX
222;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
223; WGR ;AN000;
224; Check if header link has to be set WGR (Code ported from ;AN000;
225; WGR DISPLAY.SYS) ;AN000;
226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
227 LEA BX, BUF1 ; WGR ;AN000;
228 MOV DI,OFFSET CONDEV ; WGR CON Device header ;AN000;
229 ; WGR ;AN000;
230 MOV CONPTR.DEV_HDRO,DI ; WGR ;AN000;
231 MOV CONPTR.DEV_HDRS,CS ; WGR ;AN000;
232 CLD ; WGR all moves forward ;AN000;
233 ; WGR ;AN000;
234 CMP CONPTR.CON_STRAO, -1 ; WGR ;AN000;
235 JNE L4 ; WGR has been linked to DOS CON ;AN000;
236 CMP CONPTR.CON_STRAS, -1 ; WGR ;AN000;
237 JNE L4 ; WGR has been linked to DOS CON ;AN000;
238 ; WGR next device header : ES:[DI] ;AN000;
239 LDS SI,DWORD PTR CONPTR.DEV_HDRO;WGR ;AN000;
240 LES DI,DWORD PTR HP.DH_NEXTO; WGR ;AN000;
241 ; WGR ;AN000;
242;$SEARCH WHILE ; WGR pointer to next device header is NOT ;AN000;
243L1: ; WGR ;AN000;
244 PUSH ES ; WGR -1 ;AN000;
245 POP AX ; WGR ;AN000;
246 CMP AX,-1 ; WGR ;AN000;
247;$LEAVE E, AND ; WGR leave if both offset and segment are ;AN000;
248 JNE NOT0FFFF ; WGR ;AN000;
249 ; WGR ;AN000;
250 CMP DI,-1 ; WGR 0FFFFH ;AN000;
251;$LEAVE E ; WGR ;AN000;
252 JE L4 ; WGR ;AN000;
253NOT0FFFF: ; WGR ;AN000;
254 PUSH DI ; WGR ;AN000;
255 PUSH SI ; WGR ;AN000;
256 MOV CX,NAME_LEN ; WGR ;AN000;
257 LEA DI,NHD.DH_NAME ; WGR ;AN000;
258 LEA SI,HP.DH_NAME ; WGR ;AN000;
259 REPE CMPSB ; WGR ;AN000;
260 POP SI ; WGR ;AN000;
261 POP DI ; WGR ;AN000;
262 AND CX,CX ; WGR ;AN000;
263;$EXITIF Z ; WGR Exit if name is found in linked hd. ;AN000;
264 JNZ L3 ; WGR Name is not found ;AN000;
265 ; WGR Name is found in the linked header ;AN000;
266 MOV AX,NHD.DH_STRAO ; WGR Get the STRATEGY address ;AN000;
267 MOV CONPTR.CON_STRAO,AX ; WGR ;AN000;
268 MOV AX,ES ; WGR ;AN000;
269X1: MOV CONPTR.CON_STRAS,AX ; WGR ;AN000;
270 ; WGR ;AN000;
271 MOV AX,NHD.DH_INTRO ; WGR Get the INTERRUPT address ;AN000;
272 MOV CONPTR.CON_INTRO,AX ; WGR ;AN000;
273 MOV AX,ES ; WGR ;AN000;
274X2: MOV CONPTR.CON_INTRS,AX ; WGR ;AN000;
275 ; WGR ;AN000;
276;$ORELSE ; WGR FInd next header to have the same ;AN000;
277 JMP L4 ; WGR Device Name ;AN000;
278L3: ; WGR ;AN000;
279 LES DI,DWORD PTR NHD.DH_NEXTO;WGR ;AN000;
280;$ENDLOOP ; WGR ;AN000;
281 JMP L1 ; WGR ;AN000;
282L4: ; WGR ;AN000;
283
284 LDS BX,CS:[PTRSAV] ;GET PONTER TO I/O PACKET
285
286 MOV CX,WORD PTR DS:[BX].COUNT ;CX = COUNT
287
288 MOV AL,BYTE PTR DS:[BX].CMD
289 CBW
290 MOV SI,OFFSET CONTBL
291 ADD SI,AX
292 ADD SI,AX
293 CMP AL,MAX_CMD ; WGR not a call for ANSI...chain to lower device;AC000;
294 JA NO_OPERATION
295
296 LES DI,DWORD PTR DS:[BX].TRANS
297
298 PUSH CS
299 POP DS
300
301 ASSUME DS:CODE
302
303 JMP WORD PTR [SI] ;GO DO COMMAND
304
305;=====================================================
306;=
307;= SUBROUTINES SHARED BY MULTIPLE DEVICES
308;=
309;=====================================================
310;----------------------------------------------------------
311;
312; EXIT - ALL ROUTINES RETURN THROUGH THIS PATH
313;
314BUS$EXIT: ;DEVICE BUSY EXIT
315 MOV AH,00000011B
316 JMP SHORT ERR1
317
318NO_OPERATION: ; WGR ;AN000;
319 CALL PASS_CONTROL ; WGR Pass control to lower CON ;AN000;
320 JMP SHORT ERR2 ; WGR ;AN000;
321
322ERR$EXIT:
323 MOV AH,10000001B ;MARK ERROR RETURN
324 JMP SHORT ERR1
325
326EXITP PROC FAR
327
328EXIT: MOV AH,00000001B
329ERR1: LDS BX,CS:[PTRSAV]
330 MOV WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE
331ERR2:
332 POP BX ; WGR ;AN000;
333 POP ES
334 POP DS
335 POP BP
336 POP DI
337 POP DX
338 POP CX
339 POP AX
340 POP SI
341 RET ;RESTORE REGS AND RETURN
342EXITP ENDP
343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
344; WGR ;AN000;
345; PASS CONTROL WGR ;AN000;
346; WGR ;AN000;
347; This calls the attached device to perform any further ;AN000;
348; action on the call! WGR ;AN000;
349; WGR ;AN000;
350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
351PASS_CONTROL PROC ; WGR ;AN000;
352 LEA SI,BUF1 ; WGR ;AN000;
353 LES BX,CS:[PTRSAV] ; WGR pass the request header to the ;AN000;
354 CALL DWORD PTR CS:[SI].CON_STRAO ; CON strategy routine. ;AN000;
355 CALL DWORD PTR CS:[SI].CON_INTRO ; WGR interrupt the CON ;AN000;
356 RET ; WGR ;AN000;
357PASS_CONTROL ENDP ; WGR ;AN000;
358;----------------------------------------------- ;AN000;
359;
360; BREAK KEY HANDLING
361;
362BRKKY:
363 MOV CS:ALTAH,3 ;INDICATE BREAK KEY SET
364INTRET: IRET
365
366;
367; WARNING - Variables are very order dependent, be careful
368; when adding new ones! - c.p.
369;
370WRAP DB 0 ; 0 = WRAP, 1 = NO WRAP
371ASNPTR DW 4
372STATE DW S1
373MODE DB 3 ;*
374MAXCOL DB 79 ;*
375COL DB 0
376ROW DB 0
377SAVCR DW 0
378INQ DB 0
379PRMCNT LABEL BYTE
380PRMCNTW DW 0
381KEYCNT DB 0
382KEYPTR DW BUF
383REPORT DB ESC_CHAR,'[00;00R',CR ;CURSOR POSTION REPORT BUFFER
384ALTAH DB 0 ;Special key handling
385
386EXT_16 DB 0 ; WGR Extended INT 16h flag ;AN000;
387Switch_X DB OFF ; WGR /X flag ;AN000;
388Switch_L db OFF ;DCR397; 1= /L flag entered.
389Switch_K db OFF ;AN005; To control EXT_16
390SCAN_LINES DB ? ; WGR flag for available scan lines (VGA) ;AN000;
391HDWR_FLAG DW 0 ; WGR byte of flags indicating video support ;AN000;
392
393VIDEO_MODE_TABLE LABEL BYTE ; WGR table containing applicable ;AN000;
394MODE_TABLE <> ; WGR video modes and corresponding ;AN000;
395MODE_TABLE <> ; WGR data. ;AN000;
396MODE_TABLE <> ; WGR this table is initialized at ;AN000;
397MODE_TABLE <> ; WGR INIT time ;AN000;
398MODE_TABLE <> ; WGR ;AN000;
399MODE_TABLE <> ; WGR ;AN000;
400MODE_TABLE <> ; WGR ;AN000;
401MODE_TABLE <> ; WGR ;AN000;
402MODE_TABLE <> ; WGR ;AN000;
403MODE_TABLE <> ; WGR ;AN000;
404MODE_TABLE <> ; WGR ;AN000;
405MODE_TABLE <> ; WGR ;AN000;
406MODE_TABLE <> ; WGR ;AN000;
407MODE_TABLE <> ; WGR ;AN000;
408MODE_TABLE <> ; WGR ;AN000;
409VIDEO_TABLE_MAX EQU $ ; WGR maximum address for video table ;AN000;
410MAX_VIDEO_TAB_NUM EQU ($-VIDEO_MODE_TABLE)/TYPE MODE_TABLE ;P1767 Max number of table
411 ;AN000;
412;-------------------------------------------------------------
413;
414; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE
415;
416ATTRW LABEL WORD
417ATTR DB 00000111B ;CHARACTER ATTRIBUTE
418BPAGE DB 0 ;BASE PAGE
419base dw 0b800h
420screen_seg dw 00000h
421
422chrout: cmp al,13
423 jnz trylf
424 mov [col],0
425 jmp short setit
426
427trylf: cmp al,10
428 jz lf
429 cmp al,7
430 jnz tryback
431torom:
432 mov bx,[attrw]
433 and bl,7
434 mov ah,14
435 int 10h
436ret5: ret
437
438tryback:
439 cmp al,8
440 jnz outchr
441 cmp [col],0
442 jz ret5
443 dec [col]
444 jmp short setit
445
446outchr:
447 mov bx,[attrw]
448 mov cx,1
449 mov ah,9
450 int 10h
451 inc [col]
452 mov al,[col]
453 cmp al,[maxcol]
454 jbe setit
455 cmp [wrap],0
456 jz outchr1
457 dec [col]
458 ret
459outchr1:
460 mov [col],0
461lf: inc [row]
462 MOV AH,30 ; GHG Fix for ROUNDUP/PALACE
463 MOV AL,MODE ; GHG Fix for ROUNDUP/PALACE
464 CMP AL,11H ; GHG Fix for ROUNDUP/PALACE
465 JE LF2 ; GHG Fix for ROUNDUP/PALACE
466 CMP AL,12H ; GHG Fix for ROUNDUP/PALACE
467 JE LF2 ; GHG Fix for ROUNDUP/PALACE
468 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
469 MOV AH,DEFAULT_LENGTH ; WGR ;AN000;
470 .ELSE ; WGR ;AN000;
471 MOV AH,BYTE PTR [REQ_TXT_LENGTH] ; GHG Fix for ROUNDUP/PALACE
472 .ENDIF ; WGR ;AN000;
473LF2: ; GHG Fix for ROUNDUP/PALACE
474 cmp [row],AH ; GHG Fix for ROUNDUP/PALACE
475 jb setit
476 DEC AH ; GHG Fix for ROUNDUP/PALACE
477 mov [row],AH ; GHG Fix for ROUNDUP/PALACE
478 call scroll
479
480setit: mov dh,row
481 mov dl,col
482 mov bh,[bpage]
483 mov ah,2
484 int 10h
485 ret
486
487;AN006;Writing a LF char through Teletype function to scroll the screen
488;has a side effect of changing the color of the cursor when the PROMPT
489;setting in PTM P4241 is used. AN001 uses this method to fix the strobing
490;problem of the palace machine. The old method of scrolling used to directly
491;write into video buffer. The old method has been used by AN001 for
492;CGA adater of mode 2 or 3 only.
493;To solve P4241, but to maintain the fix of the strobing problem of palace
494;machine, we return back to the old logic but the old logic has to be
495;Revised for the displays above CGA level. For the adapters above
496;CGA display, we don't need to turn off/on the video - this will causes
497;a strobing, if you use do this, for Palace machine.
498;This logic will be only applied to mode 2 and 3 only.
499
500scroll:
501;AN006;AN008; Myscroll is only for Mode 2 and 3 of all display unit.
502; .IF <BIT HDWR_FLAG eq CGA_ACTIVE> ; GHG is this the CGA? ;AN000;
503 .IF < MODE eq 2 > or
504 .IF < MODE eq 3 >
505 jmp myscroll
506 .ENDIF
507; .ENDIF
508;AN006;AN008; Other modes (=APA mode) use TeleType function of
509; writing LF to scroll the screen!.
510 mov al,10 ; GHG
511 jmp torom ; GHG
512
513myscroll:
514 mov bh,[attr]
515 mov bl,' '
516 MOV AL,[MAXCOL] ; WGR ;AN000;
517 CBW ; WGR ;AN000;
518 INC AX ; WGR ;AN000;
519 MOV BP,AX ; WGR ;AN000;
520 MOV SI,BP ; WGR ;AN000;
521 ADD SI,BP ; WGR ;AN000;
522 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
523 MOV AX,DEFAULT_LENGTH ; WGR ;AN000;
524 .ELSE ; WGR ;AN000;
525 MOV AX,[REQ_TXT_LENGTH] ; WGR ;AN000;
526 .ENDIF ; WGR ;AN000;
527 DEC AX ; WGR ;AN000;
528 MUL BP ; WGR ;AN000;
529 MOV CX,AX ; WGR ;AN000;
530 mov ax,[base]
531 add ax,[screen_seg]
532 mov es,ax
533 mov ds,ax
534 xor di,di
535 cld
536 cmp cs:[base],0b800h
537 jz colorcard
538
539 rep movsw
540 mov ax,bx
541 mov cx,bp
542 rep stosw
543sret: push cs
544 pop ds
545 ret
546
547colorcard:
548; We must protect this with a critical section
549;
550; INT 29H calls to device drivers do not enter CritDevice
551; The user MIGHT hit Ctrl-NumLock in the middle of this
552; which will leave the screen blanked.
553 mov ax,8000H + CritDevice ; Enter Device critical section
554 int int_IBM
555
556 cmp cs:[Hdwr_Flag], MCGA_ACTIVE ;AN006;AN007;above CGA level?
557 jae Skip_Video_Off ;AN006;AN007;
558
559 mov dx,3dah
560wait2: in al,dx
561 test al,8
562 jz wait2
563 mov al,25h
564 mov dx,3d8h
565 out dx,al ;turn off video
566Skip_Video_Off: ;AN006;
567 rep movsw
568 mov ax,bx
569 mov cx,bp
570 rep stosw
571 cmp cs:[Hdwr_Flag], MCGA_ACTIVE ;AN006;AN007;
572 jae Skip_Video_On ;AN006;AN007;
573 mov al,29h
574 mov dx,3d8h
575 out dx,al ;turn on video
576
577Skip_Video_On: ;AN006;
578 mov ax,8100H + CritDevice ; Leave Device critical section
579 int int_IBM
580
581 jmp sret
582
583;------------------------------------------------------
584;
585; CONSOLE READ ROUTINE
586;
587CON$READ:
588 JCXZ CON$EXIT
589CON$LOOP:
590 PUSH CX ;SAVE COUNT
591 CALL CHRIN ;GET CHAR IN AL
592 POP CX
593 STOSB ;STORE CHAR AT ES:DI
594 LOOP CON$LOOP
595CON$EXIT:
596 JMP EXIT
597;---------------------------------------------------------
598;
599; INPUT SINGLE CHAR INTO AL
600;
601CHRIN: XOR AX,AX
602 XCHG AL,ALTAH ;GET CHARACTER & ZERO ALTAH
603 OR AL,AL
604 JNZ KEYRET
605
606INAGN: CMP KEYCNT,0
607 JNZ KEY5A
608
609 XOR AH,AH
610 .IF <EXT_16 EQ ON> ; WGR extended interrupt available? ;AN000;
611 MOV AH,10h ; WGR yes..perform extended call ;AN000;
612 INT 16H ; WGR ;AN000;
613 .IF <SWITCH_X EQ OFF> ; WGR /X switch used? ;AN000;
614 CALL CHECK_FOR_REMAP ; WGR no....map to normal call ;AN000;
615 .ENDIF ; WGR ;AN000;
616 CALL SCAN ; WGR check for redefinition ;AN000;
617 .IF NZ AND ; WGR no redefinition?...and ;AN000;
618 .IF <SWITCH_X EQ ON> ; WGR /X switch used? ;AN000;
619 CALL CHECK_FOR_REMAP ; WGR then remap.. ;AN000;
620 OR BX,BX ; WGR reset zero flag for jump test in old code ;AN000;
621 .ENDIF ; WGR ;AN000;
622 .ELSE ; WGR extended interrupt not available ;AN000;
623 INT 16H ; WGR ;AN000;
624 CALL SCAN ; WGR check for redefinition ;AN000;
625 .ENDIF ; WGR ;AN000;
626 JNZ ALT10 ;IF NO MATCH JUST RETURN IT
627
628 DEC CX
629 DEC CX
630 INC BX
631 INC BX
632 .IF <AL EQ 0> OR ; WGR check whether the ;AN000;
633 .IF <AL EQ 0E0H> AND ; WGR keypacket is an extended one? ;AN000;
634 .IF <SWITCH_X EQ 1> ; WGR switch must be set for 0E0h extended ;AN000;
635 DEC CX ; WGR adjust pointers ;AN000;
636 INC BX ; WGR appropiately ;AN000;
637 .ENDIF
638 MOV KEYCNT,CL
639 MOV KEYPTR,BX
640KEY5A: ; Jmp here to get rest of translation
641 CALL KEY5 ;GET FIRST KEY FROM TRANSLATION
642ALT10:
643 OR AX,AX ;Check for non-key after BREAK
644 JZ INAGN
645 OR AL,AL ;SPECIAL CASE?
646 JNZ KEYRET
647 MOV ALTAH,AH ;STORE SPECIAL KEY
648KEYRET: RET
649
650KEY5: MOV BX,KEYPTR ;GET A KEY FROM TRANSLATION TABLE
651 MOV AX,WORD PTR [BX]
652 DEC KEYCNT
653 INC BX
654 OR AL,AL
655 JNZ KEY6
656 INC BX
657 DEC KEYCNT
658KEY6: MOV KEYPTR,BX
659 RET
660
661SCAN: MOV BX,OFFSET BUF
662KEYLP: MOV CL,BYTE PTR [BX]
663 XOR CH,CH
664 OR CX,CX
665 JZ NOTFND
666 .IF <AL EQ 0> OR ; WGR check whether the ;AN000;
667 .IF <AL EQ 0E0H> AND ; WGR keypacket is an extended one. ;AN000;
668 .IF <SWITCH_X EQ ON> ; WGR switch must be set for 0E0h extended ;AN000;
669 CMP AX,WORD PTR [BX+1] ; WGR yes...compare the word ;AN000;
670 .ELSE ; WGR ;AN000;
671 CMP AL,BYTE PTR [BX+1] ; WGR no...compare the byte ;AN000;
672 .ENDIF ; WGR ;AN000;
673 JZ MATCH
674 ADD BX,CX
675 JMP KEYLP
676NOTFND: OR BX,BX
677MATCH: RET
678;--------------------------------------------------------------
679;
680; KEYBOARD NON DESTRUCTIVE READ, NO WAIT
681;
682CON$RDND:
683 MOV AL,[ALTAH]
684 OR AL,AL
685 JNZ RDEXIT
686
687 CMP [KEYCNT],0
688 JZ RD1
689 MOV BX,[KEYPTR]
690 MOV AL,BYTE PTR [BX]
691 JMP SHORT RDEXIT
692
693RD1: MOV AH,1
694 .IF <EXT_16 EQ ON> ; WGR extended INT16 available? ;AN000;
695 ADD AH,10H ; WGR yes....adjust to extended call ;AN000;
696 .ENDIF
697 INT 16H
698 JZ CONBUS
699 OR AX,AX
700 JNZ RD2
701 MOV AH,0
702 .IF <EXT_16 EQ ON> ; WGR extended interrupt available? ;AN000;
703 MOV AH,10h ; WGR yes..perform extended call ;AN000;
704 INT 16H ; WGR ;AN000;
705 .IF <SWITCH_X EQ OFF> ; WGR /X switch used? ;AN000;
706 CALL CHECK_FOR_REMAP ; WGR no....map to normal call ;AN000;
707 .ENDIF ; WGR ;AN000;
708 .ELSE ; WGR ;AN000;
709 INT 16H ; WGR ;AN000;
710 .ENDIF ; WGR ;AN000;
711 JMP CON$RDND
712
713RD2: CALL SCAN
714 .IF NZ AND ; WGR if no redefinition ;AN000;
715 .IF <EXT_16 EQ ON> AND ; WGR and extended INT16 used ;AN000;
716 .IF <SWITCH_X EQ ON> ; WGR and /x used ....then ;AN000;
717 CALL CHECK_FOR_REMAP ; WGR remap to standard call ;AN000;
718 OR BX,BX ; WGR reset zero flag for jump test in old code ;AN000;
719 .ENDIF
720 JNZ RDEXIT
721
722 MOV AL,BYTE PTR [BX+2]
723 CMP BYTE PTR [BX+1],0
724 JNZ RDEXIT
725 MOV AL,BYTE PTR [BX+3]
726RDEXIT: LDS BX,[PTRSAV]
727 MOV [BX].MEDIA,AL
728EXVEC: JMP EXIT
729CONBUS: JMP BUS$EXIT
730;--------------------------------------------------------------
731;
732; KEYBOARD FLUSH ROUTINE
733;
734CON$FLSH:
735 MOV [ALTAH],0 ;Clear out holding buffer
736 MOV [KEYCNT],0
737
738; PUSH DS
739; XOR BP,BP
740; MOV DS,BP ;Select segment 0
741; MOV DS:BYTE PTR 41AH,1EH ; Reset KB queue head pointer
742; MOV DS:BYTE PTR 41CH,1EH ;Reset tail pointer
743; POP DS
744
745Flush: mov ah,1
746 .IF <EXT_16 EQ ON> ; WGR is extended call available? ;AN000;
747 ADD AH,10H ; WGR yes....adjust for extended ;AN000;
748 .ENDIF ; WGR ;AN000;
749 int 16h
750 jz FlushDone
751 mov ah,0
752 .IF <EXT_16 EQ ON> ; WGR is extended call available? ;AN000;
753 ADD AH,10H ; WGR yes....adjust for extended ;AN000;
754 .ENDIF ; WGR ;AN000;
755 int 16h
756 jmp Flush
757FlushDone:
758
759 JMP EXVEC
760;----------------------------------------------------------
761;
762; CONSOLE WRITE ROUTINE
763;
764CON$WRIT:
765 JCXZ EXVEC
766
767CON$LP: MOV AL,ES:[DI] ;GET CHAR
768 INC DI
769 CALL OUTC ;OUTPUT CHAR
770 LOOP CON$LP ;REPEAT UNTIL ALL THROUGH
771 JMP EXVEC
772
773COUT: STI
774 PUSH DS
775 PUSH CS
776 POP DS
777 CALL OUTC
778 POP DS
779 IRET
780
781OUTC: PUSH AX
782 PUSH BX
783 PUSH CX
784 PUSH DX
785 PUSH SI
786 PUSH DI
787 PUSH ES
788 PUSH BP
789
790 MOV [BASE],0B800H
791 XCHG AX,SI ; SAVE CHARACTER TO STUFF
792 MOV AX,40H ; POINT TO ROS BIOS
793 MOV DS,AX
794 MOV AX,DS:[49H] ; AL=MODE, AH=MAX COL
795 DEC AH ; ANSI NEEDS 0-79 OR 0-39
796 MOV WORD PTR CS:[MODE],AX ; SAVE MODE AND MAX COL
797 CMP AL,7
798 JNZ NOT_BW
799 MOV WORD PTR CS:[BASE],0B000H
800NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE
801 MOV CS:[BPAGE],AL
802 CBW
803 ADD AX,AX
804 MOV BX,AX
805 MOV AX,DS:[BX+50H] ; AL=COL, AH=ROW
806 MOV WORD PTR CS:[COL],AX ; SAVE ROW AND COLUMN
807 MOV AX,DS:[4EH] ; GET START OF SCREEN SEG
808 MOV CL,4
809 SHR AX,CL ; CONVERT TO A SEGMENT
810 PUSH CS
811 POP DS
812 MOV [SCREEN_SEG],AX
813 XCHG AX,SI ; GET BACK CHARACTER IN AL
814
815 CALL VIDEO
816 POP BP
817 POP ES
818 POP DI
819 POP SI
820 POP DX
821 POP CX
822 POP BX
823 POP AX
824 RET
825
826
827;----------------------------------------------------------
828;
829; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE
830;
831VIDEO: MOV SI,OFFSET STATE
832 JMP [SI]
833
834S2: CMP AL,'['
835 JZ S22
836 JMP S1
837S22: MOV WORD PTR [SI],OFFSET S3
838 XOR BX,BX
839 MOV WORD PTR INQ,BX
840 JMP SHORT S3B
841
842S3: CMP AL,';'
843 JNZ S3C
844S3A: INC PRMCNT
845S3B: CALL GETPTR
846 XOR AX,AX
847 MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO
848 RET
849
850S3C: CMP AL,'0'
851 JB S3D
852 CMP AL,'9'
853 JA S3D
854 CALL GETPTR
855 SUB AL,'0'
856 XCHG AL,BYTE PTR [BX]
857 MOV AH,10
858 MUL AH ;*10
859 ADD BYTE PTR [BX],AL ;MOVE IN DIGIT
860 RET
861
862S3D: CMP AL,'='
863 JZ S3RET
864 CMP AL,'?'
865 JZ S3RET
866 CMP AL,'"' ;BEGIN QUOTED STRING
867 JZ S3E
868 CMP AL,"'"
869 JNZ S7
870S3E: MOV WORD PTR [SI],OFFSET S4
871 MOV [INQ],AL
872S3RET: RET
873
874;
875; ENTER QUOTED STRINGS
876;
877
878S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR
879 JNZ S4A
880 DEC PRMCNT ;TERMINATE STRING
881 MOV WORD PTR [SI],OFFSET S3
882 RET
883
884S4A: CALL GETPTR
885 MOV BYTE PTR [BX],AL
886 MOV WORD PTR [SI],OFFSET S4
887 JMP S3A
888;
889; LOOK FOR ANSI COMMAND SPECIFIED IN AL
890;
891
892S7: MOV BX,OFFSET CMDTABL-3
893;
894S7A: ADD BX,3
895 CMP BYTE PTR [BX],0
896 JZ S1B
897 CMP BYTE PTR [BX],AL
898 JNZ S7A
899;
900S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS
901 MOV BX,OFFSET BUF
902 INC BX
903 ADD BX,ASNPTR ;BX = PTR TO PARM LIST
904 MOV DL,BYTE PTR [BX]
905 XOR DH,DH ;DX = FIRST PARAMETER
906 MOV CX,DX
907 OR CX,CX
908 JNZ S7C
909 INC CX ;CX = DX, CX=1 IF DX=0
910S7C: JMP AX ;AL = COMMAND
911
912S1: CMP AL,ESC_CHAR ;ESCAPE SEQUENCE?
913 JNZ S1B
914 MOV WORD PTR [SI],OFFSET S2
915 RET
916
917S1B: CALL CHROUT
918S1A: MOV WORD PTR [STATE],OFFSET S1
919 RET
920
921MOVCUR: CMP BYTE PTR [BX],AH
922 JZ SETCUR
923 ADD BYTE PTR [BX],AL
924 LOOP MOVCUR
925SETCUR: MOV DX,WORD PTR COL
926 XOR BX,BX
927 MOV AH,2
928 INT 16
929 JMP S1A
930
931CUP: .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
932 CMP CL,DEFAULT_LENGTH ; WGR ;AN000;
933 .ELSE ; WGR ;AN000;
934 CMP CL,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000;
935 .ENDIF ; WGR ;AN000;
936 JA SETCUR
937 MOV AL,MAXCOL
938 MOV CH,BYTE PTR [BX+1]
939 OR CH,CH
940 JZ CUP1
941 DEC CH
942CUP1: CMP AL,CH
943 JA CUP2
944 MOV CH,AL
945CUP2: XCHG CL,CH
946 DEC CH
947 MOV WORD PTR COL,CX
948 JMP SETCUR
949
950CUF: MOV AH,MAXCOL
951 MOV AL,1
952CUF1: MOV BX,OFFSET COL
953 JMP MOVCUR
954
955CUB: MOV AX,00FFH
956 JMP CUF1
957
958CUU: MOV AX,00FFH
959CUU1: MOV BX,OFFSET ROW
960 JMP MOVCUR
961
962CUD: .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
963 MOV AH,DEFAULT_LENGTH ; WGR ;AN000;
964 .ELSE ; WGR ;AN000;
965 MOV AH,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000;
966 .ENDIF ; WGR ;AN000;
967 MOV AL,1 ; WGR ;AN000;
968 JMP CUU1
969
970ExtKey: ;AN003;
971 cmp dl, 0 ;AN003; DL = previous parameter
972 jne ExtKey_1 ;AN003;
973 mov Switch_X, OFF ;AN003; reset it if 0.
974 jmp S1A ;AN003;
975ExtKey_1: ;AN003;
976 cmp dl, 1 ;AN003; 1 ?
977 je SetExtKey ;AN003;
978 jmp S1A ;AN003; ignore it
979SetExtKey: ;AN003;
980 mov Switch_X, ON ;AN003; set it if 1.
981 jmp S1A ;AN003;
982
983PSCP: MOV AX,WORD PTR COL
984 MOV SAVCR,AX
985 JMP SETCUR
986
987PRCP: MOV AX,SAVCR
988 MOV WORD PTR COL,AX
989 JMP SETCUR
990
991SGR: XOR CX,CX
992 XCHG CL,PRMCNT
993 CALL GETPTR
994 INC CX
995SGR1: MOV AL,BYTE PTR [BX]
996 PUSH BX
997 MOV BX,OFFSET GRMODE
998SGR2: MOV AH,BYTE PTR [BX]
999 ADD BX,3
1000 CMP AH,0FFH
1001 JZ SGR3
1002 CMP AH,AL
1003 JNZ SGR2
1004 MOV AX,WORD PTR [BX-2]
1005 AND ATTR,AL
1006 OR ATTR,AH
1007SGR3: POP BX
1008 INC BX
1009 LOOP SGR1
1010 JMP SETCUR
1011
1012ED: XOR CX,CX
1013 MOV WORD PTR COL,CX
1014 MOV DH,30 ; ;AN009;
1015 MOV AL,MODE ; ;AN009;
1016 CMP AL,11H ; ;AN009;
1017 JE ERASE ; ;AN009;
1018 CMP AL,12H ; ;AN009;
1019 JE ERASE ; ;AN009;
1020 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR ;AN000;
1021 MOV DH,DEFAULT_LENGTH ; WGR ;AN000;
1022 .ELSE ; WGR ;AN000;
1023 MOV DH,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000;
1024 .ENDIF ; WGR ;AN000;
1025ERASE: MOV DL,MAXCOL
1026 .IF <GRAPHICS_FLAG EQ GRAPHICS_MODE> ; WGR if we are in a graphics mode.. ;AN000;
1027 XOR BH,BH ; WGR then use 0 as attribute... ;AN000;
1028 .ELSE ; WGR else... ;AN000;
1029 MOV BH,ATTR ; WGR ...use active attribute ;AC000;
1030 .ENDIF ; WGR ;AN000;
1031 MOV AX,0600H
1032 INT 16
1033ED3: JMP SETCUR
1034
1035EL: MOV CX,WORD PTR COL
1036 MOV DH,CH
1037 JMP ERASE
1038
1039BIN2ASC:MOV DL,10
1040 INC AL
1041 XOR AH,AH
1042 DIV DL
1043 ADD AX,'00'
1044 RET
1045DSR: MOV AH,REQ_CRSR_POS ; WGR ;AN000;
1046 PUSH BX ; WGR ;AN000;
1047 XOR BH,BH ; WGR ;AN000;
1048 INT 10H ; WGR ;AN000;
1049 POP BX ; WGR ;AN000;
1050 PUSH DX ; WGR ;AN000;
1051 MOV AL,DH ;REPORT CURRENT CURSOR POSITION
1052 CALL BIN2ASC
1053 MOV WORD PTR REPORT+2,AX
1054 POP DX ; WGR ;AN000;
1055 MOV AL,DL ; WGR ;AN000;
1056 CALL BIN2ASC
1057 MOV WORD PTR REPORT+5,AX
1058 MOV [KEYCNT],9
1059 MOV [KEYPTR],OFFSET REPORT
1060CPR: JMP S1A
1061
1062RM: MOV CL,1
1063 JMP SHORT SM1
1064
1065SM: XOR CX,CX
1066SM1: MOV AL,DL
1067 .IF <AL LT MODE7> OR ;; WGR check to see if valid mode.. ;AN000;
1068 .IF <AL GE MODE13> AND ;; WGR (0-6,13-19) ;AN000;
1069 .IF <AL LE MODE19> ;; WGR ;AN000;
1070 .IF <BIT HDWR_FLAG AND LCD_ACTIVE> ;; WGR is this the LCD? ;AN000;
1071 PUSH DS ;; WGR yes... ;AN000;
1072 PUSH AX ;; WGR save mode ;AN000;
1073 MOV AX,ROM_BIOS ;; WGR ;AN000;
1074 MOV DS,AX ;; WGR get equipment status flag.. ;AN000;
1075 MOV AX,DS:[EQUIP_FLAG] ;; WGR ;AN000;
1076 AND AX,INIT_VID_MASK ;; WGR clear initial video bits.. ;AN000;
1077 OR AX,LCD_COLOR_MODE ;; WGR .....set bits as color ;AN000;
1078 MOV DS:[EQUIP_FLAG],AX ;; WGR replace updated flag. ;AN000;
1079 POP AX ;; WGR restore mode. ;AN000;
1080 POP DS ;; WGR ;AN000;
1081 .ENDIF ;; WGR ;AN000;
1082 MOV AH,SET_MODE ;; WGR yes....set mode.. ;AN000;
1083 INT 10H ;; WGR ;AN000;
1084 .ELSE ;; WGR no...check for 7 (wrap at EOL) ;AN000;
1085 .IF <AL EQ 7> ;; WGR ;AN000;
1086 MOV [WRAP],CL ;; WGR yes....wrap... ;AN000;
1087 .ENDIF ;; WGR ;AN000;
1088 .ENDIF ;; WGR ;AN000;
1089 JMP CPR
1090
1091KEYASN: XOR DX,DX
1092 XCHG DL,PRMCNT ;GET CHARACTER COUNT
1093 INC DX
1094 INC DX
1095
1096 CALL GETPTR
1097 MOV AX,WORD PTR [BX] ;GET CHARACTER TO BE ASSIGNED
1098 CALL SCAN ;LOOK IT UP
1099 JNZ KEYAS1
1100
1101 MOV DI,BX ;DELETE OLD DEFINITION
1102 SUB ASNPTR,CX
1103 MOV KEYCNT,0 ; This delete code shuffles the
1104 ; key definition table all around.
1105 ; This will cause all sorts of trouble
1106 ; if we are in the middle of expanding
1107 ; one of the definitions being shuffled.
1108 ; So shut off the expansion.
1109 MOV SI,DI
1110 ADD SI,CX
1111 MOV CX,OFFSET BUF+ASNMAX
1112 SUB CX,SI
1113 CLD
1114 PUSH ES ;SAVE USER'S ES
1115 PUSH CS
1116 POP ES ;SET UP ES ADDRESSABILITY
1117 REP MOVSB
1118 POP ES ;RESTORE ES
1119
1120KEYAS1: CALL GETPTR
1121 CMP DL,3
1122 JB KEYAS3
1123 MOV BYTE PTR [BX-1],DL ;SET LENGTH
1124 ADD ASNPTR,DX ;REMEMBER END OF LIST
1125 ADD BX,DX
1126 CMP ASNPTR,ASNMAX ; Too much???
1127 JB KEYAS3 ; No
1128 SUB BX,DX ; Next three instructions undo the above
1129 SUB ASNPTR,DX
1130KEYAS3: MOV BYTE PTR [BX-1],00
1131 MOV STATE,OFFSET S1 ;RETURN
1132 RET
1133
1134GETPTR: MOV BX,ASNPTR
1135 INC BX
1136 ADD BX,PRMCNTW
1137 CMP BX,ASNMAX + 8
1138 JB GET1
1139 DEC PRMCNT
1140 JMP GETPTR
1141GET1: ADD BX,OFFSET BUF
1142 RET
1143
1144
1145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
1146; WGR ;AN000;
1147; CHECK_FOR_REMAP: WGR ;AN000;
1148; WGR ;AN000;
1149; This function esnures that the keypacket WGR ;AN000;
1150; passed to it in AX is mapped to a standard INT16h call WGR ;AN000;
1151; WGR ;AN000;
1152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000;
1153 ;AN000;
1154CHECK_FOR_REMAP PROC NEAR ; WGR ;AN000;
1155 .IF <AL EQ 0E0h> ; WGR is this an extended key? ;AN000;
1156 OR AH,AH ; WGR probably...but check for alpha character ;AN000;
1157 .IF NZ ; WGR if it's not an alpha character ....then ;AN000;
1158 XOR AL,AL ; WGR map extended to standard ;AN000;
1159 .ENDIF ; WGR ;AN000;
1160 .ENDIF ; WGR ;AN000;
1161 RET ; WGR ;AN000;
1162CHECK_FOR_REMAP ENDP ; WGR ;AN000;
1163
1164
1165BUF DB 4,00,72H,16,0
1166 DB ASNMAX+8-5 DUP (?)
1167
1168CODE ENDS
1169 END