summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/MODE/MODESCRN.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/MODE/MODESCRN.ASM')
-rw-r--r--v4.0/src/CMD/MODE/MODESCRN.ASM564
1 files changed, 564 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/MODESCRN.ASM b/v4.0/src/CMD/MODE/MODESCRN.ASM
new file mode 100644
index 0000000..3c529b3
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODESCRN.ASM
@@ -0,0 +1,564 @@
1PAGE ,132 ;
2TITLE MODESCRN.ASM - SCREEN SUPPORT FOR THE MODE COMMAND
3
4.XLIST
5INCLUDE STRUC.INC
6.LIST
7
8INCLUDE 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
34BREAK MACRO X
35 JMP endcase_&X
36ENDM
37
38
39SCRN 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;
48DISPLAY MACRO MSG
49IFNB <MSG>
50 MOV DX,OFFSET MSG
51ENDIF
52 CALL PRINTF
53ENDM
54
55
56SET_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;
73ENDM
74
75set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
76
77MOV AX,submessage ;AX=message number ;AN001;
78MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
79CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
80MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
81MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
82ENDM ;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;
92SET_UP_FOR_PRINTF MACRO
93
94 PUSH DS ;SAVE DS
95 PUSH CS
96 POP DS ;DS NOW HAS MESSAGE SEGMENT
97;
98ENDM
99
100;----------------------------------------------------------------------------
101; REPLACE_DS
102;Replace the contents DS had before the PRINTF call. Assume that DS was pushed.
103;-----------------------------------------------------------------------------
104
105REPLACE_DS MACRO
106
107 POP DS
108;
109ENDM
110
111;º º
112;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
113
114CURRENT_VIDEO_STATE EQU 15 ;REQUEST TO BIOS SCREEN TO RETURN SCREEN STATE
115SET_SCREEN_MODE EQU 0 ;REQUEST TO BIOS SCREEN TO SET SCREEN MODE
116COL40 EQU 1 ;FLAG BIT TO REQUEST 40 COL
117COL80 EQU 2 ;FLAG BIT TO REQUEST 80 COL
118CNT4 EQU 4 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 40COL
119CNT8 EQU 8 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 80COL
120FORTY EQU 40 ;SCREEN WIDTH
121MONO_MODE EQU 7 ;MONOCHROME SCREEN MODE
122no EQU 0 ;AC002;value to compare with when user responds with no character
123NOEXIT EQU 0 ;EXIT SWITCH VALUE TO REPEAT LOOP
124EXIT EQU 1 ;EXIT SWITCH VALUE TO LEAVE LOOP
125YES 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
133SHIFCT40 EQU 02H ;SHIFT COUNT FOR 40 COL
134SHIFCT80 EQU 012H ;SHIFT COUNT FOR 80 COL
135SHIFCTGR EQU 022H ;SHIFT COUNT FOR GRAPHICS
136CR EQU 13 ;CARRIAGE RETURN
137LF EQU 10 ;LINE FEED
138BEEP EQU 7 ;SOUND THE AUDIBLE ALARM
139LOWERCASE EQU 20H ;ADD THIS TO UPPER, GET LOWER CASE
140TRUE EQU 0FFH
141
142RIGHT_LIMIT EQU 01 ;SAME FOR ALL TYPES OF MACHINES
143JUNIOR EQU 0FDH ;MACHINE TYPE SIGNITURE FOR PC JUNIOR
144JR_LEFT_LIMIT EQU 031H ;LEFT LIMIT FOR SCREEN SHIFT ON PC JUNIOR
145;
146EGA_SIG EQU 0AA55H ;SIGNITURE FOR THE EGA CARD
147;
148ROM_BIOS SEGMENT AT 0F000H
149 ORG 0FFFEH
150;
151 MACHINE_TYPE LABEL BYTE ;MACHINE TYPE BURNED IN ROM
152;
153ROM_BIOS ENDS
154
155ROM_BIOS_SEG EQU 0F000H
156;
157SIGNITURE SEGMENT AT 0C000H ;SEGMENT OF EGA AREA
158 ORG 0
159SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT
160SIGNITURE ENDS
161;
162PRINTF_CODE SEGMENT PUBLIC
163 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
164;
165
166
167;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
168;º º
169
170PUBLIC HANDLE_40_OR_80 ;make available to "ANALYZE_AND_INVOKE"
171PUBLIC 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
181EXTRN CANT_SHIFT:WORD ;CR,LF,"Unable to shift screen",BEEP,EOM
182EXTRN PRINTF:NEAR ;interface to message service ROUTINE
183EXTRN SCRNTAB:NEAR ;LOADS VIDEO INIT TABLE RETURNING POINTER TO IT
184;
185EXTRN 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
191EXTRN NEW_VIDEO_PARMS_SEGMENT:WORD
192EXTRN NOERROR:BYTE ;INDICATE IF AN ERROR OCCURED YET
193ENDPARM EQU MODE
194EXTRN ALT_SELECT:ABS ;INT 10 FUNCTION GET MONITOR TYPE
195EXTRN EGA_INFO:ABS ;INT 10 FUNCTION GET INFO
196EXTRN COLOR_ON_IT:ABS ;INT 10 RETURN FOR COLOR MONITOR HOOKED TO EGA
197;
198LEFT_LIMIT DB 02EH ;SCREEN SHIFT LEFT LIMIT, MAY BE Revised
199;
200SWITCH DB 0 ;LOOP CONTROLLER
201;AC000;OK DB 1 ;INDICATOR OF VALID REQUEST:
202; 1=BAD, 0=GOOD
203;
204EXTRN L_item_tag:ABS ;see MODEpars.asm ;AN000;
205EXTRN R_item_tag:ABS ;see MODEpars.asm ;AN000;
206EXTRN T_item_tag:ABS ;see MODEpars.asm ;AN000;
207
208EXTRN RIGHTMOST:WORD ;message number for "rightmost 9",EOM ;AC001;
209EXTRN LEFTMOST:WORD ;message number for "leftmost 0",EOM ;AC001;
210;AC001;EXTRN LFTM_OR_RGHTM_PTR:WORD
211EXTRN 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;
213EXTRN NUMBERS:WORD ;"0123456789" ;AX000;
214EXTRN LEFT:WORD ;message number for "left",EOM ;AC001;
215EXTRN RIGHT:WORD ;message number for "right",EOM ;AC001;
216;AC001;EXTRN LEFT_OR_RIGHT_PTR:WORD ;PART OF MESSAGE "Unable to shift screen ..."
217EXTRN sublist_cant_shift:BYTE ;definition of submessage ;AC001;
218EXTRN sublist_shift_msg:BYTE ;definition of submessage ;AC001;
219EXTRN SYSGETMSG:NEAR ;used to get the address of a message part ;AC001;
220EXTRN utility_msg_class:ABS ;input for sysgetmsg ;AC001;
221
222
223;º º
224;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
225
226
227
228;----------------------------------------------------------------------------
229
230
231HANDLE_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
283ELSE01:
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
328ENDIF02:
329; : ENDIF ,END REQUEST FOR 40 COL
330ENDIF01:
331
332
333RET ;AN000;
334
335HANDLE_40_OR_80 ENDP ;AN000;
336
337
338;------------------------------------------------------------------------------
339
340
341SHIFT_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
345DO01:
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;
364CHECK_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;
381TRY_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
406ELSE03:
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;
438TRY_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:
468ELSE05:
469 MOV CS:SWITCH,EXIT ;REQUEST LOOP BE TERMINATED
470; : : ENDIF ,END IS THIS CHAR AN "L"? TEST
471ENDIF05:
472; : ENDIF END, IS PARM2 AN "R"? TEST
473ENDIF03:
474
475PUBLIC 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
501ELSE08:
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
505ENDIF08:
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
516ENDIF07:
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
537ENDIF09:
538; : ELSE ,SINCE "T" NOT SPECIFIED
539 JMP SHORT ENDIF06
540ELSE06:
541 MOV SWITCH,EXIT ;TERMINATE THE LOOP
542; : ENDIF ,END IS THIS "T"? TEST
543ENDIF06:
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
551ENDDO01:
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
561SHIFT_SCREEN ENDP ;AN000;
562PRINTF_CODE ENDS
563 END
564 \ No newline at end of file