]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/MODE/MODESCRN.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / MODE / MODESCRN.ASM
1 PAGE ,132 ;\ f
2 TITLE MODESCRN.ASM - SCREEN SUPPORT FOR THE MODE COMMAND
3
4 .XLIST
5 INCLUDE STRUC.INC
6 .LIST
7
8 INCLUDE COMMON.STC ;definitions of message sublist blocks ;AC001;
9
10 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
11 ;º º ;AN000;
12 ;AN000;
13 ; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the
14 ; USA.MSG file because it looked like a common message. Now
15 ; I use a different (better) message. It was "Invalid paramters",
16 ; is now "Function not supported - ????".
17
18 ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
19 ; implement the SYSGETMSG method of getting addressability to
20 ; the pieces. This means that the code does a SYSGETMSG call
21 ; which returns a pointer (DS:SI) to the message piece. The
22 ; address is then put in the sublist block for the message
23 ; being issued.
24
25 ; AX002 - P5159: Need to use get extended country call (6523) to get the yes
26 ; 7-14-88 no answer
27
28 ;º º ;AN000;
29 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
30
31 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
32 ;º º
33
34 BREAK MACRO X
35 JMP endcase_&X
36 ENDM
37
38
39 SCRN MACRO COMMAND,MOD
40 MOV AH,COMMAND ;REQUEST FUNCTION OF SCREEN BIOS
41 IFNB <MOD>
42 MOV AL,MOD ;SET MODE TO SCREEN
43 ENDIF
44 INT 10H ;CALL BIOS SCREEN HANDLER
45 ;
46 ENDM
47 ;
48 DISPLAY MACRO MSG
49 IFNB <MSG>
50 MOV DX,OFFSET MSG
51 ENDIF
52 CALL PRINTF
53 ENDM
54
55
56 SET_LEFT_SHIFT_LIMIT MACRO
57 LOCAL LIMIT_SET
58 ASSUME DS:ROM_BIOS
59 ;
60 PUSH DS
61 PUSH AX
62 MOV AX,ROM_BIOS_SEG
63 MOV DS,AX
64 CMP DS:MACHINE_TYPE,JUNIOR ;IF this machine is a Junior THEN
65 JNE LIMIT_SET
66 MOV BYTE PTR CS:LEFT_LIMIT,JR_LEFT_LIMIT ;USE THE JUNIOR'S LEFT LIMIT
67 LIMIT_SET:
68 POP AX
69 POP DS
70 ;
71 ASSUME DS:PRINTF_CODE
72 ;
73 ENDM
74
75 set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
76
77 MOV AX,submessage ;AX=message number ;AN001;
78 MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
79 CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
80 MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
81 MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
82 ENDM ;AN001;
83
84
85 ;---------------------------------------------------------------------------
86 ; SET_UP_FOR_PRINTF
87 ;PRINTF depends on DS containing the segment that the messages are in, so if
88 ;DS is being used to address data areas elsewhere it needs to be temporarily
89 ;set to the message file segment.
90 ;---------------------------------------------------------------------------
91 ;
92 SET_UP_FOR_PRINTF MACRO
93
94 PUSH DS ;SAVE DS
95 PUSH CS
96 POP DS ;DS NOW HAS MESSAGE SEGMENT
97 ;
98 ENDM
99
100 ;----------------------------------------------------------------------------
101 ; REPLACE_DS
102 ;Replace the contents DS had before the PRINTF call. Assume that DS was pushed.
103 ;-----------------------------------------------------------------------------
104
105 REPLACE_DS MACRO
106
107 POP DS
108 ;
109 ENDM
110
111 ;º º
112 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
113
114 CURRENT_VIDEO_STATE EQU 15 ;REQUEST TO BIOS SCREEN TO RETURN SCREEN STATE
115 SET_SCREEN_MODE EQU 0 ;REQUEST TO BIOS SCREEN TO SET SCREEN MODE
116 COL40 EQU 1 ;FLAG BIT TO REQUEST 40 COL
117 COL80 EQU 2 ;FLAG BIT TO REQUEST 80 COL
118 CNT4 EQU 4 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 40COL
119 CNT8 EQU 8 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 80COL
120 FORTY EQU 40 ;SCREEN WIDTH
121 MONO_MODE EQU 7 ;MONOCHROME SCREEN MODE
122 no EQU 0 ;AC002;value to compare with when user responds with no character
123 NOEXIT EQU 0 ;EXIT SWITCH VALUE TO REPEAT LOOP
124 EXIT EQU 1 ;EXIT SWITCH VALUE TO LEAVE LOOP
125 YES EQU 1 ;AC002;value AX will be if user types yes character ("y", "s", "j" etc)
126 ;
127
128
129
130
131
132 ; OFFSETS INTO VIDEO TABLE, AT 40:90
133 SHIFCT40 EQU 02H ;SHIFT COUNT FOR 40 COL
134 SHIFCT80 EQU 012H ;SHIFT COUNT FOR 80 COL
135 SHIFCTGR EQU 022H ;SHIFT COUNT FOR GRAPHICS
136 CR EQU 13 ;CARRIAGE RETURN
137 LF EQU 10 ;LINE FEED
138 BEEP EQU 7 ;SOUND THE AUDIBLE ALARM
139 LOWERCASE EQU 20H ;ADD THIS TO UPPER, GET LOWER CASE
140 TRUE EQU 0FFH
141
142 RIGHT_LIMIT EQU 01 ;SAME FOR ALL TYPES OF MACHINES
143 JUNIOR EQU 0FDH ;MACHINE TYPE SIGNITURE FOR PC JUNIOR
144 JR_LEFT_LIMIT EQU 031H ;LEFT LIMIT FOR SCREEN SHIFT ON PC JUNIOR
145 ;
146 EGA_SIG EQU 0AA55H ;SIGNITURE FOR THE EGA CARD
147 ;
148 ROM_BIOS SEGMENT AT 0F000H
149 ORG 0FFFEH
150 ;
151 MACHINE_TYPE LABEL BYTE ;MACHINE TYPE BURNED IN ROM
152 ;
153 ROM_BIOS ENDS
154
155 ROM_BIOS_SEG EQU 0F000H
156 ;
157 SIGNITURE SEGMENT AT 0C000H ;SEGMENT OF EGA AREA
158 ORG 0
159 SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT
160 SIGNITURE ENDS
161 ;
162 PRINTF_CODE SEGMENT PUBLIC
163 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
164 ;
165
166
167 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
168 ;º º
169
170 PUBLIC HANDLE_40_OR_80 ;make available to "ANALYZE_AND_INVOKE"
171 PUBLIC SHIFT_SCREEN ;make available to "ANALYZE_AND_INVOKE"
172
173
174 ;º º
175 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
176
177
178 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
179 ;º º
180
181 EXTRN CANT_SHIFT:WORD ;CR,LF,"Unable to shift screen",BEEP,EOM
182 EXTRN PRINTF:NEAR ;interface to message service ROUTINE
183 EXTRN SCRNTAB:NEAR ;LOADS VIDEO INIT TABLE RETURNING POINTER TO IT
184 ;
185 EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE
186 ;PARM1 DB 10 DUP(0)
187 ;PARM2 DB 0
188 ;PARM3 DB 0
189 ;MODE DB 0
190 ;FLAG DB 0
191 EXTRN NEW_VIDEO_PARMS_SEGMENT:WORD
192 EXTRN NOERROR:BYTE ;INDICATE IF AN ERROR OCCURED YET
193 ENDPARM EQU MODE
194 EXTRN ALT_SELECT:ABS ;INT 10 FUNCTION GET MONITOR TYPE
195 EXTRN EGA_INFO:ABS ;INT 10 FUNCTION GET INFO
196 EXTRN COLOR_ON_IT:ABS ;INT 10 RETURN FOR COLOR MONITOR HOOKED TO EGA
197 ;
198 LEFT_LIMIT DB 02EH ;SCREEN SHIFT LEFT LIMIT, MAY BE Revised
199 ;
200 SWITCH DB 0 ;LOOP CONTROLLER
201 ;AC000;OK DB 1 ;INDICATOR OF VALID REQUEST:
202 ; 1=BAD, 0=GOOD
203 ;
204 EXTRN L_item_tag:ABS ;see MODEpars.asm ;AN000;
205 EXTRN R_item_tag:ABS ;see MODEpars.asm ;AN000;
206 EXTRN T_item_tag:ABS ;see MODEpars.asm ;AN000;
207
208 EXTRN RIGHTMOST:WORD ;message number for "rightmost 9",EOM ;AC001;
209 EXTRN LEFTMOST:WORD ;message number for "leftmost 0",EOM ;AC001;
210 ;AC001;EXTRN LFTM_OR_RGHTM_PTR:WORD
211 EXTRN SHIFT_MSG:WORD ;CR,LF,"Do you see the ...",CR,LF,EOM ;AX000;
212 ;AC000;EXTRN MSGI:WORD ;CR,LF,"Invalid parameters",BEEP,CR,LF,"$" ;AX000;
213 EXTRN NUMBERS:WORD ;"0123456789" ;AX000;
214 EXTRN LEFT:WORD ;message number for "left",EOM ;AC001;
215 EXTRN RIGHT:WORD ;message number for "right",EOM ;AC001;
216 ;AC001;EXTRN LEFT_OR_RIGHT_PTR:WORD ;PART OF MESSAGE "Unable to shift screen ..."
217 EXTRN sublist_cant_shift:BYTE ;definition of submessage ;AC001;
218 EXTRN sublist_shift_msg:BYTE ;definition of submessage ;AC001;
219 EXTRN SYSGETMSG:NEAR ;used to get the address of a message part ;AC001;
220 EXTRN utility_msg_class:ABS ;input for sysgetmsg ;AC001;
221
222
223 ;º º
224 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
225
226
227
228 ;----------------------------------------------------------------------------
229
230
231 HANDLE_40_OR_80 PROC NEAR ;AN000;
232
233 ; SCREEN WIDTH IN BL
234 ;
235 SCRN CURRENT_VIDEO_STATE,0 ;GET CURRENT SCREEN MODE
236 MOV DS:MODE,AL ;STORE CURRENT MODE
237 ; IF THE REQUEST WAS FOR 40 COL,
238 CMP BL,FORTY ;COMPARE WITH BL, OUTPUT FROM 'MODELENG'
239 JNE ELSE01
240 ;
241 ;AC000; MOV OK,0 ;INDICATE A LEGAL FUNCTION DONE
242 ; CASE current mode =
243
244 ; 0,
245 ; 2,
246 ; 5,
247 ; 6,
248 ; 7,
249 ; 11:
250
251 .IF <DS:mode EQ 0> OR
252 .IF <DS:mode EQ 2> OR
253 .IF <DS:mode EQ 5> OR
254 .IF <DS:mode EQ 6> OR
255 .IF <DS:mode EQ 7> OR
256 .IF <DS:mode EQ 011H> THEN
257 MOV DS:MODE,0 ;SWITCH TO 40 COL, BW
258 BREAK 0
259 .ENDIF
260
261 ; 1,
262 ; 3,
263 ; 4,
264 ; 12,
265 ; 13:
266
267 .IF <DS:mode EQ 1> OR
268 .IF <DS:mode EQ 3> OR
269 .IF <DS:mode EQ 4> OR
270 .IF <DS:mode EQ 012H> OR
271 .IF <DS:mode EQ 013H> THEN
272 MOV DS:MODE,1 ;SWITCH TO 40 COL, COLOR
273 BREAK 0
274 .ENDIF
275
276
277 ENDCASE_0:
278
279
280 SCRN SET_SCREEN_MODE,DS:MODE ;SWITCH TO 40 COL
281 ; ELSE ,SINCE REQUEST NOT FOR 40 COL,
282 JMP SHORT ENDIF01
283 ELSE01:
284 ; : : IF REQUEST FOR 80 COL
285 CMP BL,80
286 JNE ENDIF02
287 ;
288 ;AC000; MOV OK,0 ;INDICATE A LEGAL FUNCTION DONE
289 ; CASE current mode =
290
291 ; 0,
292 ; 2,
293 ; 5,
294 ; 6,
295 ; 7,
296 ; 11:
297
298 .IF <DS:mode EQ 0> OR
299 .IF <DS:mode EQ 2> OR
300 .IF <DS:mode EQ 5> OR
301 .IF <DS:mode EQ 6> OR
302 .IF <DS:mode EQ 7> OR
303 .IF <DS:mode EQ 011H> THEN
304 MOV DS:MODE,2 ;SWITCH TO 80 COL, BW
305 BREAK 1
306 .ENDIF
307
308 ; 1,
309 ; 3,
310 ; 4,
311 ; 12,
312 ; 13:
313
314 .IF <DS:mode EQ 1> OR
315 .IF <DS:mode EQ 3> OR
316 .IF <DS:mode EQ 4> OR
317 .IF <DS:mode EQ 012H> OR
318 .IF <DS:mode EQ 013H> THEN
319 MOV DS:MODE,3 ;SWITCH TO 80 COL, COLOR
320 BREAK 1
321 .ENDIF
322
323
324 ENDCASE_1:
325
326 SCRN SET_SCREEN_MODE,DS:MODE
327 ; : : ENDIF ,END REQUEST FOR 80 COL
328 ENDIF02:
329 ; : ENDIF ,END REQUEST FOR 40 COL
330 ENDIF01:
331
332
333 RET ;AN000;
334
335 HANDLE_40_OR_80 ENDP ;AN000;
336
337
338 ;------------------------------------------------------------------------------
339
340
341 SHIFT_SCREEN PROC NEAR ;AN000;shift the screen
342
343 ; DO SHIFT UNTIL HE CAN SEE END CHAR
344 MOV SWITCH,NOEXIT ;SET TO REPEAT NEXT LOOP
345 DO01:
346 ; : IF second PARM (sd) IS AN "R"?
347 CMP DS:PARM2,R_item_tag ;AC000;
348 JE SKIP03 ;IT'S AN R SO TRY TO SHIFT RIGHT
349 JMP ELSE03 ;NOT AN R SO CHECK FOR L
350 ;
351 SKIP03:
352 ;AC000; MOV CS:OK,0 ;INDICATE A LEGAL FUNCTION DONE
353 SCRN CURRENT_VIDEO_STATE,0 ;CHECK CURRENT VIDEO MODE
354 CMP AL,MONO_MODE ;IF mode >= mono THEN must be EGA mono so ...
355 ; $IF GE
356 JNGE $$IF1
357 ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT ;YELL BECAUSE CAN'T SHIFT AN EGA OR MONO
358 set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right"
359 DISPLAY CANT_SHIFT ;YELL BECAUSE CAN'T SHIFT AN EGA OR MONO
360 ; $ELSE LONG ;JUMP PAST SHIFT LOOP
361 JMP $$EN1
362 $$IF1:
363 ;
364 CHECK_FOR_EGA: ;SEE IF SCREEN IS HOOKED TO EGA
365 MOV AX,SIGNITURE ;GET TO SEGMENT OF SIGNITURE WORD
366 MOV ES,AX ;ADDRESS THROUGH ES
367 CMP WORD PTR ES:SIGWORD,EGA_SIG ;IF EGA card being used THEN
368 JNE TRY_TO_SHIFT
369 MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER
370 MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE
371 MOV BH, COLOR_ON_IT ;protect against RT PC problem
372 not bh ; masm 5.0 won't allow "not color_on_it"
373 INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH
374 CMP BH,COLOR_ON_IT ;IF COLOR HOOKED TO EGA THEN
375 JNE TRY_TO_SHIFT
376 ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT ; YELL BECAUSE CAN'T SHIFT AN EGA
377 set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right"
378 DISPLAY CANT_SHIFT
379 JMP ELSE05 ; JUMP PAST SHIFT LOOP
380 ;
381 TRY_TO_SHIFT:
382 CALL SCRNTAB ;LOAD VIDEO TABLE IN WORK AREA
383 ; DS NOW POINTS TO THE SEGMENT WHERE THE VIDEO TABLE WAS MOVED TO.
384 ; BX HAS THE NEW OFFSET OF THE VIDEO TABLE
385
386 CMP BYTE PTR DS:[BX][SHIFCT40],RIGHT_LIMIT ;IF haven't shifted max right THEN
387 JG SHIFT_RIGHT
388 SET_UP_FOR_PRINTF
389 ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT
390 set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right"
391 DISPLAY CANT_SHIFT ;"Unable to shift screen right"
392 REPLACE_DS
393 JMP ELSE05
394 SHIFT_RIGHT:
395 MOV AL,DS:[BX][SHIFCT40] ;GET SHIFT COUNT FOR 40COL
396 SUB AL,1 ;SHIFT IT LEFT 1
397 MOV DS:[BX][SHIFCT40],AL ;STORE IT BACK
398 MOV AL,DS:[BX][SHIFCT80] ;GET SHIFT COUNT FOR 80COL
399 SUB AL,2 ;SHIFT LEFT 2
400 MOV DS:[BX][SHIFCT80],AL ;STORE IT BACK
401 MOV AL,DS:[BX][SHIFCTGR] ;GET GRAPHICS SHIFT COUNT
402 SUB AL,1 ;SHIFT LEFT 1
403 MOV DS:[BX][SHIFCTGR],AL ;STORE IT BACK
404 ; : ELSE ,SINCE PARM2 IS NOT AN "R"
405 JMP ENDIF03
406 ELSE03:
407 ; : : IF THIS CHAR IS AN "L"?
408 CMP DS:PARM2,L_item_tag ;AC000;
409 JE SKIP05 ;L WAS SPECIFIED SO TRY TO SHIFT LEFT
410 JMP ELSE05 ;WASN'T "L" OR "R" SO DONT'T TRY TO SHIFT
411 ; SINCE IT IS "L",
412 ;
413 SKIP05:
414 ;AC000; MOV CS:OK,0 ;INDICATE A LEGAL FUNCTION DONE
415 SCRN CURRENT_VIDEO_STATE,0 ;CHECK CURRENT VIDEO MODE
416 CMP AL,MONO_MODE ;IF mode >= mono THEN must be EGA or mono so ...
417 JB CHK_FOR_EGA
418 ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT ;YELL BECAUSE CAN'T SHIFT AN EGA
419 set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001;
420 DISPLAY CANT_SHIFT
421 JMP ELSE05 ;JUMP PAST SHIFT LOOP
422 ;
423 CHK_FOR_EGA: ;SEE IF SCREEN IS HOOKED TO EGA
424 MOV AX,SIGNITURE ;GET TO SEGMENT OF SIGNITURE WORD
425 MOV ES,AX ;ADDRESS THROUGH ES
426 CMP WORD PTR ES:SIGWORD,EGA_SIG ;IF EGA card being used THEN
427 JNE TRY_TO_SHIFT_LEFT
428 MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER
429 MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE
430 INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH
431 CMP BH,COLOR_ON_IT ;IF COLOR HOOKED TO EGA THEN
432 JNE TRY_TO_SHIFT_LEFT
433 ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT ; YELL BECAUSE CAN'T SHIFT AN EGA
434 set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001;
435 DISPLAY CANT_SHIFT
436 JMP ELSE05 ; JUMP PAST SHIFT LOOP
437 ;
438 TRY_TO_SHIFT_LEFT:
439 CALL SCRNTAB ;LOAD VIDEO TABLE IN WORK AREA
440 ; DS NOW POINTS TO THE SEGMENT OF THE RESIDENT CODE,
441 ; WHERE THE VIDEO TABLE WAS MOVED TO.
442 ;
443 SET_LEFT_SHIFT_LIMIT ;SET LIMIT TO SUIT MACHINE TYPE
444 ;
445 MOV AL,BYTE PTR DS:[BX][SHIFCT40] ;AL=current horizontal sync position
446 CMP AL,CS:LEFT_LIMIT ;IF haven't shifted max left THEN
447 JL SHIFT_LEFT
448 SET_UP_FOR_PRINTF
449 ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT
450 set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001;
451 DISPLAY CANT_SHIFT
452 REPLACE_DS
453 JMP ELSE05
454 SHIFT_LEFT:
455 MOV AL,DS:[BX][SHIFCT40] ;GET SHIFT COUNT 40COL
456 ADD AL,1 ;SHIFT RIGHT ONE
457 MOV DS:[BX][SHIFCT40],AL ;STORE IT BACK
458 MOV AL,DS:[BX][SHIFCT80] ;GET SHIFT COUNT 80COL
459 ADD AL,2 ;SHIFT RIGHT 2
460 MOV DS:[BX][SHIFCT80],AL ;STORE IT BACK
461 MOV AL,DS:[BX][SHIFCTGR] ;GET GRAPHICS COUNT
462 ADD AL,1 ;SHIFT RIGHT 8 PIXELS
463 MOV DS:[BX][SHIFCTGR],AL ;STORE IT BACK
464 ; : : ELSE ,SINCE CHAR IS NEITHER "R" NOR "L", QUIT
465 JMP SHORT ENDIF05
466 ; $ENDIF ;EGA or MONO
467 $$EN1:
468 ELSE05:
469 MOV CS:SWITCH,EXIT ;REQUEST LOOP BE TERMINATED
470 ; : : ENDIF ,END IS THIS CHAR AN "L"? TEST
471 ENDIF05:
472 ; : ENDIF END, IS PARM2 AN "R"? TEST
473 ENDIF03:
474
475 PUBLIC ENDIF03
476
477 MOV AX,CS ;RESTORE THIS SEG
478 MOV DS,AX ; TO DS
479 ; LEAVE IF THE EXIT SWITCH IS SET
480 ;AC001; CMP SWITCH,EXIT
481 ;AC001; JE ENDDO01
482 .IF <switch NE exit> THEN NEAR
483 ;
484 SCRN CURRENT_VIDEO_STATE,0
485 MOV DS:MODE,AL ;SAVE CURRENT MODE
486 ; LEAVING CURRENT MODE IN AL,
487 SCRN SET_SCREEN_MODE ;RESET IN CURRENT MODE
488 ; : IF THIS IS "T"
489 CMP DS:PARM3,T_item_tag ;AC000;
490 JNE ELSE06
491 ;
492 ; DECIDE WHICH QUESTION TO DISPLAY...
493 ; : : IF REQUESTED FUNCTION IS "R"
494 CMP DS:PARM2,R_item_tag ;AC000;
495 JNE ELSE08
496
497 ;AC001; MOV LFTM_OR_RGHTM_PTR,OFFSET LEFTMOST
498 set_submessage_ptr leftmost,shift_msg ;set up message sublist with pointer to "leftmost" ;AC001;
499 ; : : ELSE ,SINCE WAS NOT "R"
500 JMP SHORT ENDIF08
501 ELSE08:
502 ;AC001; MOV LFTM_OR_RGHTM_PTR,OFFSET RIGHTMOST
503 set_submessage_ptr rightmost,shift_msg ;set up message sublist with pointer to "rightmost" ;AC001;
504 ; : : ENDIF END FUNCTION IS "R"? TEST
505 ENDIF08:
506
507 ; decide how many times to display "0123456789"
508 OR DS:MODE,01H ;SET UP TO TEST FOR COLOR OR B/W
509 MOV CX,CNT8 ;(GUESS IT IS 80COL) SET LOOP CTR TO 8
510 ; : : IF 40 COL?
511 CMP DS:MODE,COL40
512 JNE ENDIF07
513 ;
514 MOV CX,CNT4 ;(FIX ABOVE GUESS) SET LOOP CTR TO 4
515 ; : : ENDIF ,END IS IT 40 COL? TEST
516 ENDIF07:
517 ;
518 .REPEAT
519 SCRN SET_SCREEN_MODE,DS:MODE ;clear the screen
520 PUSH CX ;save loop counter
521 DO02: ;DO UNTIL LINE IS DISPLAYED across entire screen
522 DISPLAY NUMBERS ;DISPLAY 0123456789
523 ; ENDDO WHEN CNT IN CX = 0
524 LOOP DO02
525 DISPLAY SHIFT_MSG ;AN000;DISPLAY QUESTION, msg services will do the keyboard input, see modedefs.inc
526 MOV DL,AL ;AC002;DL=character user entered
527 MOV AX,6523H ;AN002;yes no check get extended error
528 INT 21H ;AN002;AX returned with indication of yes or no
529 POP CX ;restore loop counter
530 .UNTIL <AX EQ yes> OR
531 .UNTIL <AX EQ no>
532 ; : : IF RESPONSE IS "Y"
533 CMP AL,YES
534 JNE ENDIF09
535 MOV SWITCH,EXIT ;TERMINATE THE LOOP
536 ; : : ENDIF ,END IS RESPONSE "N"? TEST
537 ENDIF09:
538 ; : ELSE ,SINCE "T" NOT SPECIFIED
539 JMP SHORT ENDIF06
540 ELSE06:
541 MOV SWITCH,EXIT ;TERMINATE THE LOOP
542 ; : ENDIF ,END IS THIS "T"? TEST
543 ENDIF06:
544 ; LEAVE IF EXIT SWITCH IS SET
545 CMP SWITCH,EXIT
546 JE ENDDO01
547 ;
548 ; ENDDO GO BACK AND SHIFT MORE
549 JMP DO01
550 .ENDIF
551 ENDDO01:
552 ;
553 ; IF NO LEGAL FUNCTIONS DONE,
554 ;AC000;; CMP OK,0
555 ;AC000; JZ ENDIF10
556
557 ;AC000; DISPLAY MSGI ;FUSS ABOUT ILLEGAL PARAMETERS
558 ; ENDIF ,END ARE NO LEGAL FUNCTIONS DONE? TEST
559 ;AC000;ENDIF10:
560 RET ;RETURN TO MODE MAIN ROUTINE
561 SHIFT_SCREEN ENDP ;AN000;
562 PRINTF_CODE ENDS
563 END
564 \1a