summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/PRINT/PRINT_T.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/CMD/PRINT/PRINT_T.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/CMD/PRINT/PRINT_T.ASM')
-rw-r--r--v4.0/src/CMD/PRINT/PRINT_T.ASM3504
1 files changed, 3504 insertions, 0 deletions
diff --git a/v4.0/src/CMD/PRINT/PRINT_T.ASM b/v4.0/src/CMD/PRINT/PRINT_T.ASM
new file mode 100644
index 0000000..f09056e
--- /dev/null
+++ b/v4.0/src/CMD/PRINT/PRINT_T.ASM
@@ -0,0 +1,3504 @@
1 page 80,132
2 TITLE 4.00 PRINT TRANSIENT
3; $SALUT (4,25,30,41)
4 INCLUDE pridefs.inc
5
6SaveReg MACRO reglist ;; push those registers
7IRP reg,<reglist>
8 PUSH reg
9ENDM
10ENDM
11
12RestoreReg MACRO reglist ;; pop those registers
13IRP reg,<reglist>
14 POP reg
15ENDM
16ENDM
17
18BREAK <Transient Portion>
19;******************* START OF SPECIFICATIONS ***********************************
20;
21; MODULE NAME: PRINT_T.SAL
22;
23; DESCRIPTIVE NAME: TRANSIENT - Print Initialization and Instalation
24; Routine. DOS PRINT program for background printing
25; of text files to the list device - Transient Portion.
26;
27; FUNCTION: - Call the DOS PARSE Service Routines to process the command
28; line. Search for valid input:
29; - filenames (may be more than one
30; - switches: /D:device
31; /B:buffsize 512 to 16k - 512 default
32; /Q:quesiz 4 to 32 - 10 default
33; /S:timeslice 1 to 255 - 8 default
34; /U:busytick 1 to 255 - 1 default
35; /M:maxtick 1 to 255 - 2 default
36; /T terminate
37; /C cancel
38; /P print
39; - Install the resident component if not already installed
40; - Submit files for printing to the resident component
41;
42; INPUT: Parameter string from command line in the PSP
43;
44; OUTPUT: All parameters specified are updated. Files are submitted to
45; the resident component for printing.
46;
47; REGISTERS USED: T.B.D.
48; (NOT RESTORED)
49;
50; LINKAGE: LINK - TRANSIENT
51;
52; NORMAL -
53; EXIT:
54;
55; ERROR -
56; EXIT:
57;
58; EXTERNAL -
59; REFERENCES:
60;
61; CHANGE 03/11/87 - Major restructureing of TRANSIENT - F. G.
62; LOG:
63;
64;******************* END OF SPECIFICATIONS *************************************
65;******************** START - PSEUDOCODE ***************************************
66;
67; START TRANSIENT
68;
69; If pdb_environ != 0
70; deallocate memory
71; endif
72; call SYSLOADMSG
73; if no error (if there is - SYSLOADMSG is already set to
74; display it - ie DOS ver error
75; if not installed
76; call Load_R_Msg
77; if no error
78; get all interupt values
79; else
80; load error message #
81; set error flag
82; endif
83; else
84; if PSPRINT conflict
85; load error message #
86; set error flag
87; endif
88; endif
89; endif
90; if no error and
91; get and set INT 24 handler
92; update path character
93; Set up for Parse_Input call
94; Do
95; Leave if end of command line
96; Leave if error flag set
97; call parse_input
98; if carry set
99; set up for Invalid_parm message
100; endif
101; Leave if error flag set
102; update Parse_C_B
103; if file_name
104; call Submit_Name
105; endif
106; if switch
107; Do_case switch
108; Bgncase_/D
109; if valid value and not installed
110; move device name to LISTNAME
111; reset carry
112; else
113; set carry
114; endif
115; Endcase_/D
116; Bgncase_/B
117; if valid value and not installed
118; update BLKSIZ
119; reset carry
120; else
121; set carry
122; endif
123; Endcase_/B
124; Bgncase_/Q
125; if valid value and not installed
126; update BLKSIZ
127; reset carry
128; else
129; set carry
130; endif
131; Endcase_/Q
132; Bgncase_/S
133; if valid value and not installed
134; update TIMESLICE, SLICECNT
135; reset carry
136; else
137; set carry
138; endif
139; Endcase_/S
140; Bgncase_/U
141; if valid value and not installed
142; update BUSYTICK
143; reset carry
144; else
145; set carry
146; endif
147; Endcase_/U
148; Bgncase_/M
149; if valid value and not installed
150; update MAXTICK
151; reset carry
152; else
153; set carry
154; endif
155; Endcase_/M
156; Bgncase_/T
157; if installed
158; set up for cancel
159; call IntWhileBusy
160; endif
161; call Set_Buffer
162; reset carry
163; Endcase_/T
164; Bgncase_/C
165; if installed
166; set CanFlag
167; else
168; call Set_Buffer
169; endif
170; reset carry
171; Endcase_/C
172; Bgncase_/P
173; if installed
174; reset CanFlag
175; else
176; call Set_Buffer
177; endif
178; reset carry
179; Endcase_/P
180; end_case
181; if carry set
182; set up for Invalid_parm message
183; endif
184; endif
185; enddo
186; if no error
187; if not installed
188; call Set_Buffer
189; else
190; get queue pointer
191; check for off line
192; display queue
193; endif
194; else
195; call DispMsg (display the fatal error)
196; endif
197;
198; return
199;
200; END TRANSIENT
201;
202;==================== END - PSEUDOCODE =========================================
203
204CodeR Segment public para
205
206 extrn SliceCnt:BYTE, BusyTick:BYTE, MaxTick:BYTE, TimeSlice:BYTE
207 extrn EndRes:WORD, BlkSiz:WORD, QueueLen:BYTE, PChar:BYTE
208 extrn ListName:BYTE, FileQueue:BYTE, EndQueue:WORD, Buffer:WORD
209 extrn EndPtr:WORD, NxtChr:WORD, MoveTrans:FAR, TO_DOS:FAR
210
211 extrn MESBAS:WORD, R_MES_BUFF:WORD
212
213CodeR EndS
214
215
216 BREAK <Transient Data>
217
218;----------------------------------------
219; Transient data
220;----------------------------------------
221
222DATA SEGMENT public BYTE
223
224
225
226 public namebuf
227
228 ORG 0
229
230SWITCHAR DB ?
231PathChar db "\"
232
233SubPack db 0 ; Level
234 dd ? ; pointer to filename
235
236;--- Ints used by print. These ints are loaded here before the
237; resident is installed, just in case an error before print
238; is installed cases it to be never installed and the ints
239; have to be restored.
240
241i28vec dd ? ; SOFTINT
242i2fvec dd ? ; COMINT
243i05vec dd ?
244i13vec dd ?
245i14vec dd ?
246i15vec dd ?
247i17vec dd ?
248i1cvec dd ? ; INTLOC
249
250;--- Temp stack for use durint int 23 and 24 processing
251 db 278 + 80H dup (?) ; 278 == IBM's ROM requirements
252intStk dw ?
253
254
255;--- Print installed flag:
256; 0 = Not installed yet: process only configuration parameters
257; during the command line parse
258; 1 = Partially installed: process only print commands AND flag
259; configuration parameters as errors AND finish by executing
260; the keep process
261; 2 = Already installed: process only print commands AND flag
262; configuration parameters as errors
263PInst db 0 ; defaults to not installed
264CanFlag db 0 ; cancel mode flag (0= no cancel)
265Ambig db ? ; =1 if a filename is ambigous
266DevSpec db 0 ; =1 a device was specified with the
267 ; /d option, do not prompt
268QFullMes db 0 ; =1 queue full message issued already
269HARDCH DD ? ;Pointer to real INT 24 handler
270
271TokBuf DB (MaxFileLen+16) dup(?) ; token buffer for input
272
273NulPtr dw ? ; pointer to the nul in NameBuf
274FNamPtr dw ? ; pointer to name portion of file name
275NameBuf db (MaxFileLen+16) dup(?) ; full name buffer for file
276 ; plus room for ambigous expansion
277
278whichmsg dw (CLASS_C shl 8)+FstMes ; initial message for
279 ; file queue loop
280
281SearchBuf find_buf <> ; search buffer
282
283 ;--------------------------------------
284 ; PARSE Equates
285 ;--------------------------------------
286
287EOL equ -1 ; Indicator for End-Of-Line
288NOERROR equ 0 ; Return Indicator for No Errors
289
290DEVICE equ 0 ; device
291BUFFSIZ equ 1 ; buffsiz
292QUESIZ equ 2 ; quesiz
293TIME equ 3 ; timeslice
294BUSYT equ 4 ; busytick
295MAXT equ 5 ; maxtick
296TERM equ 6 ; Terminate
297CANC equ 7 ; Cancel
298PRINT equ 8 ; Print
299
300file_spec equ 5 ; Parse Type for file spec found
301
302 ;--------------------------------------
303 ; PARSE Control Block
304 ;--------------------------------------
305
306ORDINAL DW 0 ; Current Parse ordinal value
307SCAN_PTR DW 81h ; Current Parse location Pointer
308MSG_PTR DW 81h ; Last Parse location Pointer
309
310 ;--------------------------------------
311 ; STRUCTURE TO DEFINE ADDITIONAL
312 ; COMMAND LINE PARAMETERS
313 ;--------------------------------------
314PARMS LABEL WORD
315 DW OFFSET DG:PARMSX ; POINTER TO PARMS STRUCTURE
316 DB 0 ; NO DELIMITER LIST FOLLOWS
317
318 ;--------------------------------------
319 ; STRUCTURE TO DEFINE SYNTAX
320 ;--------------------------------------
321PARMSX LABEL BYTE
322 DB 0,1 ; A POSITIONAL PARAMETER IS VALID
323 DW OFFSET DG:POS1 ; POINTER TO POSITIONAL DEFINITION
324 DB 9 ; THERE ARE 9 TYPES OF SWITCHES
325 DW OFFSET DG:SW1 ; POINTER TO THE /D:device SWITCH DEFINITION AREA
326 DW OFFSET DG:SW2 ; POINTER TO THE /B:buffsiz SWITCH DEFINITION AREA
327 DW OFFSET DG:SW3 ; POINTER TO THE /Q:quesiz SWITCH DEFINITION AREA
328 DW OFFSET DG:SW4 ; POINTER TO THE /S:timeslice SWITCH DEFINITION AREA
329 DW OFFSET DG:SW5 ; POINTER TO THE /U:busytick SWITCH DEFINITION AREA
330 DW OFFSET DG:SW6 ; POINTER TO THE /M:maxval SWITCH DEFINITION AREA
331 DW OFFSET DG:SW7 ; POINTER TO THE /T TERMINATE SWITCH DEFINITION AREA
332 DW OFFSET DG:SW8 ; POINTER TO THE /C CANCEL SWITCH DEFINITION AREA
333 DW OFFSET DG:SW9 ; POINTER TO THE /P PRINT SWITCH DEFINITION AREA
334 DW 0 ; THERE ARE NO KEYWORDS IN PRINT SYNTAX
335
336 ;--------------------------------------
337 ;
338 ; NOTE: Do NOT change the layout or size
339 ; of the following entries:
340 ; --- SW1 through SW9 ---
341 ; Their size and position are used
342 ; to calculate an index for a
343 ; DO_CASE (jump table). This is
344 ; possible ONLY if the size of all
345 ; 9 entries are exactly the same,
346 ; congruant, and in this exact
347 ; order. Any changes here MUST be
348 ; matched in the Process_A_Switch
349 ; PROC.
350 ;
351 ; The following formula is used:
352 ;
353 ; Index = (offset P_SYN - offset
354 ; SW1) / SW_SIZE
355 ;
356 ;--------------------------------------
357
358
359 ;--------------------------------------
360 ; STRUCTURE TO DEFINE THE POSITIONAL
361 ; PARAMETER (File Name)
362 ;--------------------------------------
363POS1 LABEL WORD
364 DW 0203H ; OPTIONAL, REPEATABLE FILE SPEC
365 DW 0001H ; CAPS BY FILE TABLE
366 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
367 DW OFFSET DG:NOVALS ; NO VALUES LIST REQUIRED
368 DB 0 ; NO KEYWORDS
369
370 ;--------------------------------------
371 ; STRUCTURE TO DEFINE /D:device SWITCH
372 ;--------------------------------------
373SW1 LABEL WORD
374 DW 2001H ; MUST BE PRINT OUTPUT DEVICE
375 ; (optional simple string)
376 DW 1h ; Caps by file table
377 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
378 DW OFFSET DG:NOVALS ; VALUE LIST NOT NECESSARY
379 DB 1 ; ONE SWITCH IN FOLLOWING LIST
380SW_PTR DB "/D",0 ; /D: INDICATES DEVICE SPECIFIED
381
382SW_SIZE equ $ - SW1
383 ;--------------------------------------
384 ; STRUCTURE TO DEFINE /B:buffsiz SWITCH
385 ;--------------------------------------
386SW2 LABEL WORD
387 DW 8001H ; MUST BE NUMERIC (optional)
388 DW 0 ; NO FUNCTION FLAGS
389 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
390 DW OFFSET DG:VALUE_BUF ; NEED VALUE LIST FOR buffsiz
391 DB 1 ; ONE SWITCH IN FOLLOWING LIST
392B_SWITCH DB "/B",0 ; /B: INDICATES buffsiz REQUESTED
393
394 ;--------------------------------------
395 ; STRUCTURE TO DEFINE /Q:quesiz SWITCH
396 ;--------------------------------------
397SW3 LABEL WORD
398 DW 8001H ; MUST BE NUMERIC (optional)
399 DW 0 ; NO FUNCTION FLAGS
400 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
401 DW OFFSET DG:VALUE_QUE ; NEED VALUE LIST FOR quesiz
402 DB 1 ; ONE SWITCH IN FOLLOWING LIST
403Q_SWITCH DB "/Q",0 ; /Q: INDICATES quesiz REQUESTED
404
405 ;--------------------------------------
406 ; STRUCTURE TO DEFINE /S:timeslice SWITCH
407 ;--------------------------------------
408SW4 LABEL WORD
409 DW 8001H ; MUST BE NUMERIC (optional)
410 DW 0 ; NO FUNCTION FLAGS
411 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
412 DW OFFSET DG:VALUE_TIME ; NEED VALUE LIST FOR timeslice
413 DB 1 ; ONE SWITCH IN FOLLOWING LIST
414S_SWITCH DB "/S",0 ; /S: INDICATES timeslice REQUESTED
415
416 ;--------------------------------------
417 ; STRUCTURE TO DEFINE /U:busytick SWITCH
418 ;--------------------------------------
419SW5 LABEL WORD
420 DW 8001H ; MUST BE NUMERIC (optional)
421 DW 0 ; NO FUNCTION FLAGS
422 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
423 DW OFFSET DG:VALUE_BUSY ; NEED VALUE LIST FOR busytick
424 DB 1 ; ONE SWITCH IN FOLLOWING LIST
425U_SWITCH DB "/U",0 ; /U: INDICATES busytick REQUESTED
426
427 ;--------------------------------------
428 ; STRUCTURE TO DEFINE /M:maxtick SWITCH
429 ;--------------------------------------
430SW6 LABEL WORD
431 DW 8001H ; MUST BE NUMERIC (optional)
432 DW 0 ; NO FUNCTION FLAGS
433 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
434 DW OFFSET DG:VALUE_MAXT ; NEED VALUE LIST FOR maxtick
435 DB 1 ; ONE SWITCH IN FOLLOWING LIST
436M_SWITCH DB "/M",0 ; /M: INDICATES maxtick REQUESTED
437
438 ;--------------------------------------
439 ; STRUCTURE TO DEFINE /T Terminate SWITCH
440 ;--------------------------------------
441SW7 LABEL WORD
442 DW 8001H ; SWITCH ONLY
443 ; (optional simple string)
444 DW 0 ; NO FUNCTION FLAGS
445 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
446 DW OFFSET DG:NOVALS ; VALUE LIST NOT NECESSARY
447 DB 1 ; ONE SWITCH IN FOLLOWING LIST
448 DB "/T",0 ; /T: INDICATES Terminate REQUESTED
449
450 ;--------------------------------------
451 ; STRUCTURE TO DEFINE /C Cancel SWITCH
452 ;--------------------------------------
453SW8 LABEL WORD
454 DW 8003H ; SWITCH ONLY
455 ; (optional, repeatable simple string)
456 DW 0 ; NO FUNCTION FLAGS
457 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
458 DW OFFSET DG:NOVALS ; VALUE LIST NOT NECESSARY
459 DB 1 ; ONE SWITCH IN FOLLOWING LIST
460C_SW_ptr DB "/C",0 ; /C: INDICATES Cancel REQUESTED
461
462 ;--------------------------------------
463 ; STRUCTURE TO DEFINE /P Print SWITCH
464 ;--------------------------------------
465SW9 LABEL WORD
466 DW 8003H ; SWITCH ONLY
467 ; (optional, repeatable simple string)
468 DW 0 ; NO FUNCTION FLAGS
469 DW OFFSET DG:PARSE_BUFF ; PLACE RESULT IN BUFFER
470 DW OFFSET DG:NOVALS ; VALUE LIST NOT NECESSARY
471 DB 1 ; ONE SWITCH IN FOLLOWING LIST
472P_SW_ptr DB "/P",0 ; /P: INDICATES Print REQUESTED
473
474 ;--------------------------------------
475 ; VALUE LIST FOR FILE NAMES
476 ;--------------------------------------
477NOVALS LABEL WORD
478 DB 0 ; NO VALUES
479
480 ;--------------------------------------
481 ; VALUE LIST DEFINITION FOR buffsiz
482 ;--------------------------------------
483VALUE_BUF LABEL BYTE
484 DB 1 ; ONE VALUE ALLOWED
485 DB 1 ; ONLY ONE RANGE
486 DB BUFFSIZ ; IDENTIFY IT AS buffsiz
487 ; USER CAN SPECIFY /+512 THROUGH /+16K
488 DD MinBufferLen,MaxBufferLen
489
490 ;--------------------------------------
491 ; VALUE LIST DEFINITION FOR quesiz
492 ;--------------------------------------
493VALUE_QUE LABEL BYTE
494 DB 1 ; ONE VALUE ALLOWED
495 DB 1 ; ONLY ONE RANGE
496 DB QUESIZ ; IDENTIFY IT AS quesiz
497 ; USER CAN SPECIFY /+4 THROUGH /+32
498 DD MinQueueLen,MaxQueueLen
499
500 ;--------------------------------------
501 ; VALUE LIST DEFINITION FOR timeslice
502 ;--------------------------------------
503VALUE_TIME LABEL BYTE
504 DB 1 ; ONE VALUE ALLOWED
505 DB 1 ; ONLY ONE RANGE
506 DB TIME ; IDENTIFY IT AS timeslice
507 ; USER CAN SPECIFY /+1 THROUGH /+255
508 DD MinTimeSlice,MaxTimeSlice
509
510 ;--------------------------------------
511 ; VALUE LIST DEFINITION FOR busytick
512 ;--------------------------------------
513VALUE_BUSY LABEL BYTE
514 DB 1 ; ONE VALUE ALLOWED
515 DB 1 ; ONLY ONE RANGE
516 DB BUSYT ; IDENTIFY IT AS busytick
517 ; USER CAN SPECIFY /+1 THROUGH /+255
518 DD MinBusyTick,MaxBusyTick
519
520 ;--------------------------------------
521 ; VALUE LIST DEFINITION FOR maxtick
522 ;--------------------------------------
523VALUE_MAXT LABEL BYTE
524 DB 1 ; ONE VALUE ALLOWED
525 DB 1 ; ONLY ONE RANGE
526 DB MAXT ; IDENTIFY IT AS maxtick
527 ; USER CAN SPECIFY /+1 THROUGH /+255
528 DD MinMaxTick,MaxMaxTick
529
530 ;--------------------------------------
531 ; RETURN BUFFER FOR PARSE INFORMATION
532 ;--------------------------------------
533PARSE_BUFF LABEL BYTE
534P_TYPE DB ? ; TYPE RETURNED
535P_ITEM_TAG DB ? ; SPACE FOR ITEM TAG
536P_SYN DW ? ; POINTER TO LIST ENTRY
537P_PTR_L DW ? ; SPACE FOR POINTER / VALUE - LOW
538P_PTR_H DW ? ; SPACE FOR POINTER / VALUE - HIGH
539
540 ;----------------------------------------
541 ; SUBLIST for Message call
542 ;----------------------------------------
543
544SUBLIST LABEL WORD
545
546 DB sub_size ; size of sublist
547 DB 0 ; reserved
548insert_ptr_off DW 0 ; pointer to insert - offset
549insert_ptr_seg DW DG ; pointer to insert - segment
550insert_num DB 0 ; number of insert
551 DB Char_Field_ASCIIZ ; data type flag - ASCII Z string
552 DB MaxFileLen ; maximum field size
553 DB 1 ; minimum field size
554 DB " " ; pad character
555
556sub_size equ $ - SUBLIST ; size of sublist
557
558
559OPEN_FILE label dword
560
561 dw offset DG:NameBuf ; name pointer offset
562open_seg dw ? ; name pointer segment
563
564DATA ENDS
565
566 BREAK <Transient Code>
567
568Code Segment public para
569Code EndS
570
571Code Segment public para
572
573 public TransRet,TransSize,GoDispMsg
574
575 extrn SYSLOADMSG:NEAR, SYSGETMSG:NEAR, SYSDISPMSG:NEAR
576 extrn SYSPARSE:NEAR
577
578 ASSUME CS:DG,DS:nothing,ES:nothing,SS:Stack
579
580; $SALUT (4,4,9,41)
581
582TRANSIENT:
583 ;-------------------------------------
584 ; Install Print
585 ;-------------------------------------
586
587 cld
588 mov ax,ds:[pdb_environ]
589 or ax,ax
590
591; $if nz ; if pdb_environ != 0 ;AC000;
592 JZ $$IF1
593
594 push es ; deallocate memory
595 mov es,ax
596 mov ah,dealloc
597 int 21h
598 pop es
599
600; $endif ; ;AC000;
601$$IF1:
602
603 call SYSLOADMSG ; Initialize the Message Service code ;AN000;
604
605; $if c ; if error ;AC000;
606 JNC $$IF3
607
608 mov ah,dh ; set up class for DispMsg
609
610; $else ; else - no error - keep going
611 JMP SHORT $$EN3
612$$IF3:
613
614 push cs
615 pop ax
616 mov ds,ax
617 mov es,ax
618
619 ASSUME DS:DG,ES:DG
620 ; NOTE: es must ALWAYS point to DG
621
622 mov ax,0100h ; Ask if already installed
623 int ComInt
624 or al,al
625
626; $if z ; if not installed ;AC000;
627 JNZ $$IF5
628
629 call Load_R_Msg ; ;AC000;
630
631; $if nc ; if no error ;AC000;
632 JC $$IF6
633
634 call Save_Vectors ; ;AC000;
635
636; $endif ; endif - NB: - If carry IS set, ;AC000;
637$$IF6:
638 ; Load_R_Msg will have loaded the
639 ; error message #
640
641; $else ; else - we are installed ;AC000;
642 JMP SHORT $$EN5
643$$IF5:
644
645 cmp al,1
646
647; $if z ; if PSPRINT conflict ;AC000;
648 JNZ $$IF9
649
650 mov ax,(CLASS_B shl 8) + CONFLICTMES ; load error message # ;AC000;
651
652 stc ; set the error flag ;AC000;
653
654; $else ; ;AC000;
655 JMP SHORT $$EN9
656$$IF9:
657
658 mov [PInst],2 ; remember print already installed
659 ; and that we only do one pass
660 mov al," " ; invalidate install switches ;AN005;
661 mov SW_PTR,al ; /D ;AN005;
662 mov B_SWITCH,al ; /B ;AN005;
663 mov Q_SWITCH,al ; /Q ;AN005;
664 mov S_SWITCH,al ; /S ;AN005;
665 mov U_SWITCH,al ; /U ;AN005;
666 mov M_SWITCH,al ; /M ;AN005;
667 clc ; reset the error flag ;AC000;
668
669; $endif ; ;AC000;
670$$EN9:
671; $endif ; ;AC000;
672$$EN5:
673; $endif ; ;AC000;
674$$EN3:
675
676; $if nc,and ; if no errors so far and..............;AC000;
677 JC $$IF14
678
679 call GetHInt ; save current int 24 vector
680 call SetInts ; set int 23 and 24 vectors
681 mov ax,CHAR_OPER shl 8
682 int 21h
683 mov [SWITCHAR],dl ; Get user switch character
684 cmp dl,"-"
685
686; $if e ; if "-" ;AC000;
687 JNE $$IF14
688 mov [PathChar],"/" ; alternate path character
689; $endif ; ;AC000;
690$$IF14:
691
692 ; Set up for Parse_Input call
693
694; $do ; Do_until end of command line ;AC000;
695$$DO16:
696
697; $leave c ; quit if an error occured ;AC000;
698 JC $$EN16
699
700 call parse_input ; ;AC000;
701
702 mov [ordinal],cx ; update Parse_C_B ;AC000;
703 mov [scan_ptr],si ; ;AC000;
704
705 cmp al,EOL ; are we at the end? ;AC000;
706
707; $leave e ; leave if end of line ;AC000;
708 JE $$EN16
709
710 cmp al,noerror ; ;AC000;
711
712; $if ne ; if error ;AC000;
713 JE $$IF19
714
715 mov ah,Parse_error ; set class to Parse error ;AC000;
716
717
718 stc ; set the error flag ;AC000;
719
720; $endif ; endif ;AC000;
721$$IF19:
722
723; $leave c ; leave the loop if error ocurred ;AC000;
724 JC $$EN16
725
726 cmp [p_type],File_Spec ; is it a file spec? ;AC000;
727
728; $if e ; if it is a file spec ;AC000;
729 JNE $$IF22
730
731 call Submit_File ; ;AC000;
732
733; $else ; else - we must now have a ;AC000;
734 JMP SHORT $$EN22
735$$IF22:
736 ; valid switch!
737
738
739 ; Do_case switch
740
741 push cs ; set up for CASE ;AC000;
742 pop ds ; ;AC000;
743 mov ax,[p_syn] ; ;AC000;
744 sub ax,OFFSET DG:SW_PTR ; ;AC000;
745 mov dl,SW_SIZE ; ;AC000;
746 div dl ; ;AC000;
747 cmp ah,noerror ; ;AC000;
748 mov di,ax ; ;AC000;
749 mov ax,(CLASS_B shl 8) + invparm ; set message in case of error ;AC000;
750
751; $if e ; if no error in jump calculation ;AC000;
752 JNE $$IF24
753
754 call Process_A_Switch ; ;AC000;
755
756; $else
757 JMP SHORT $$EN24
758$$IF24:
759
760 stc ; set the error flag ;AC000;
761
762; $endif ; endif - no error in jump calculation ;AC000;
763$$EN24:
764
765; $endif ; endif - name or switch ;AC000:
766$$EN22:
767
768; $leave c ; leave the loop if error ocurred ;AC000;
769 JC $$EN16
770
771; $enddo ; enddo ;AC000;
772 JMP SHORT $$DO16
773$$EN16:
774
775; $if nc,long ; if no error so far ;AC000;
776 JNC $$XL1
777 JMP $$IF30
778$$XL1:
779
780 cmp [PInst],0 ; is print already installed?
781
782; $if e ; if not installed ;AC000;
783 JNE $$IF31
784
785 call Set_Buffer ; NOTE from now on the TRANSIENT could ;AC000;
786 ; be in a SEGMENT that is different
787 ; than the one set up by the loader!
788 ; *** MOV xx,DG will no longer work ***
789 ; (use PUSH CS , POP xx instead)
790
791; $endif ; endif - installed ;AC000;
792$$IF31:
793
794 ; Grab the pointer to the queue and
795 ; lock it down. Remember that since
796 ; there are threads in the background,
797 ; we may get a busy return. We sit
798 ; here in a spin loop until we can
799 ; actually lock the queue.
800
801 mov ax,0104h ; get status
802 call IntWhileBusy ; on return DS:SI points to queue
803
804 ASSUME DS:nothing
805 ;------------------------------------
806 ; check for off-line
807 ;------------------------------------
808
809 cmp dx,ErrCnt1 ; check count
810
811; $if ae ; if count too high ;AC000;
812 JNAE $$IF33
813
814 mov ax,(CLASS_B shl 8) + CntMes ; printer might be off-line ;AC000;
815 call DispMsg ; ;AC000;
816
817; $endif ; endif - count Too high ;AC000;
818$$IF33:
819
820; ;------------------------------------
821; ; display current queue
822; ; ds:si points to print queue
823; ; ds:di must point to display
824; ; buffer
825; ; xNameTrans will copy the name into
826; ; the name buffer. It will do
827; ; any name truncation if needed
828; ; (including any DBSC characters)
829; ;
830; ;------------------------------------
831; mov di,offset dg:NameBuf ; ;AN009;
832; mov ax,(xNameTrans SHL 8) ; check for name translation ;AN009;
833; int 21h ; get real path and name ;AN009;
834
835;;;;;;;;;;;;;xxxxxxxxxxxxxxxxx
836 call copy_to_arg_buf
837;;;;;;;;;;;;;xxxxxxxxxxxxxxxxx
838
839 mov ax,[whichmsg] ; ;AN000;
840 mov [whichmsg],(CLASS_C shl 8) + SecMes ; set up in queue msg ;AC000;
841 cmp byte ptr ds:[si],0 ; is the queue empty?
842
843; $if ne ; if queue not empty ;AC000;
844 JE $$IF35
845
846; $do ; ;AC000;
847$$DO36:
848
849 push ds
850 call DispMsg ; ;AC000;
851 pop ds
852 add si,MaxFileLen ; point to next entry in queue
853
854;;;;;;;;;;;;;xxxxxxxxxxxxxxxxx
855 call copy_to_arg_buf
856;;;;;;;;;;;;;xxxxxxxxxxxxxxxxx
857
858; mov di,offset dg:NameBuf ; ;AN009;
859; mov ax,(xNameTrans SHL 8) ; check for name translation ;AN009;
860; int 21h ; get real path and name ;AN009;
861 mov ax,[whichmsg] ; ;AC009;
862 cmp byte ptr ds:[si],0 ; end of queue?
863
864; $enddo e ; ;AC000;
865 JNE $$DO36
866
867; $else ; else - queue is empty ;AC000;
868 JMP SHORT $$EN35
869$$IF35:
870
871 mov ax,(CLASS_B shl 8) + NoFils ; ;AC000;
872 call DispMsg ; ;AC000;
873
874; $endif ; endif - queue not empty ;AC000;
875$$EN35:
876
877 ;------------------------------------
878 ; exit transient
879 ;------------------------------------
880
881 mov ax,0105H ; unlock the print queue
882 call IntWhileBusy ; on return DS:SI points to queue
883 cmp [PInst],1 ; are we partially installed ?
884
885; $if e ; if so... complete the process ;AC000;
886 JNE $$IF40
887
888 mov ax,CodeR ; close Std Devices
889 mov ds,ax
890
891 ASSUME DS:CodeR
892
893 xor bx,bx
894 mov cx,5 ; StdIN,StdOUT,StdERR,StdAUX,StdPRN
895
896; $do ; Close STD handles before keep process;AC000;
897$$DO41:
898
899 mov ah,CLOSE
900 int 21h
901 inc bx
902
903; $enddo loop ; ;AC000;
904 LOOP $$DO41
905
906
907 mov dx,[ENDRES] ; install print...
908 mov ax,KEEP_PROCESS shl 8 ; Exit code 0
909
910; $else ; else - ;AC000;
911 JMP SHORT $$EN40
912$$IF40:
913
914 mov ax,(EXIT shl 8) ; quit with no error
915
916; $endif ; endif - ;AC000;
917$$EN40:
918
919; $else ; else - a fatal error occured ;AC000;
920 JMP SHORT $$EN30
921$$IF30:
922
923 call DispMsg ; display the error message ;AC000;
924 mov ax,(EXIT shl 8) ; quit with error
925
926
927; $endif ; erdif - errors ;AC000;
928$$EN30:
929
930
931 int 21h ; either EXIT or KEEP_PROCESS
932
933 push es
934 xor ax,ax
935 push ax
936
937 foo proc far
938 ret ; Must use this method, version may be < 2.00
939 foo endp
940
941 BREAK <Process_A_Switch>
942;******************* START OF SPECIFICATIONS ***********************************
943;
944; NAME: Process_A_Switch
945;
946; FUNCTION: This routine is a DO Case that processes all valid switched for
947; PRINT.
948;
949; INPUT: Jump table offset calculated in the main routine.
950;
951; OUTPUT: Proper processing for the switch
952;
953; REGISTERS USED: T.B.D.
954; (NOT RESTORED)
955;
956; LINKAGE: Call from: TRANSIENT
957;
958; NORMAL -
959; EXIT:
960;
961; ERROR -
962; EXIT:
963;
964; EXTERNAL Call to: DispMsg Parse_Input GetAbsN
965; REFERENCES: IntWhileBusy GetAbsN2
966;
967; CHANGE 04/01/87 - make SWITCH processing a PROC - FJG
968; LOG:
969;
970;******************* END OF SPECIFICATIONS *************************************
971;******************** START - PSEUDOCODE ***************************************
972;
973; START Process_A_Switch
974; END Process_A_Switch
975;
976;******************** END - PSEUDOCODE ***************************************
977
978 Process_A_Switch PROC NEAR
979
980 shl di,1 ; ;AC000;
981
982 jmp cs:JMPTABLE[di] ; ;AC000;
983
984JMPTABLE LABEL WORD ; ;AC000;
985
986 DW CASE_D ; ;AN000;
987 DW CASE_B ; ;AN000;
988 DW CASE_Q ; ;AN000;
989 DW CASE_S ; ;AN000;
990 DW CASE_U ; ;AN000;
991 DW CASE_M ; ;AN000;
992 DW CASE_T ; ;AN000;
993 DW CASE_C ; ;AN000;
994 DW CASE_P ; ;AN000;
995
996 ASSUME ds:DG,es:DG
997
998CASE_D: ; Bgncase_/D ;AN000;
999
1000 cmp [PInst],0 ; ;AC000;
1001
1002; $if e,and ; if not installed ;AC000;
1003 JNE $$IF47
1004
1005 ; move device name to LISTNAME
1006 mov bp,[P_PTR_L] ; ;AC000;
1007 mov di,bp ; save start address ;AC000;
1008 mov ax,[P_PTR_H] ; ;AC000;
1009 mov es,ax ;
1010
1011 ASSUME es:nothing
1012
1013 xor al,al ; find the length of input name ;AN000;
1014 mov cx,9 ; it can not be longer than 8 + : ;AN000;
1015
1016 ASSUME es:DG ; this is a bogus assume to keep the
1017 ; assembler happy
1018 repne scas NameBuf ; (use NameBuf to tell assembler its ;AN000;
1019 ; a byte search)
1020 ASSUME es:nothing ; this puts it back right
1021
1022 dec di ; back up to first null ;AN000;
1023 mov ax,di ; pointer to end ;AN000;
1024 sub ax,bp ; subtract start pointer ;AN000;
1025 mov cx,ax ; difference is the length ;AN000;
1026 or cx,cx ; is it non zero? ;AN000;
1027
1028; $if ne ; if we have a name ;AN000;
1029 JE $$IF47
1030
1031 mov si,di ; set DS:SI up to source (Parse Buffer);AN000;
1032 mov ax,es ; set ES:DI up to LISTNAME (in CodeR) ;AN000;
1033 mov ds,ax ; ;AN000;
1034 mov ax,CodeR ;
1035 mov es,ax ;
1036
1037 ASSUME DS:nothing,ES:CodeR
1038
1039 mov WORD PTR [LISTNAME],2020h ; Nul out default
1040 mov [LISTNAME+2]," " ;
1041 mov di,OFFSET CodeR:LISTNAME ;
1042 dec si ; back up to last character ;AN004;
1043 cmp BYTE PTR [si],':' ; is there a ':' at the end of the name?
1044
1045; $if e ; if it is ;AC000;
1046 JNE $$IF48
1047 dec cx ; Chuck the trailing ':'
1048; $endif ; ;AC000;
1049$$IF48:
1050
1051 cmp cx,8 ; is the name still longer than 8?
1052
1053; $if a ; if it is ;AC000;
1054 JNA $$IF50
1055 mov cx,8 ; Limit to 8 chars for device
1056; $endif ; ;AC000;
1057$$IF50:
1058
1059 mov si,bp ; ;AC000;
1060 rep movsb ; move the device name into LISTNAME ;AC000;
1061 mov si,bp ;
1062 mov [DevSpec],1 ; remember that a device was specified
1063 clc ; reset carry ;AC000;
1064
1065; $else ; else ;AC000;
1066 JMP SHORT $$EN47
1067$$IF47:
1068
1069 stc ; set carry ;AC000;
1070
1071; $endif ; endif ;AC000;
1072$$EN47:
1073
1074 push cs ;
1075 pop cx ;
1076 mov ds,cx ;
1077 mov es,cx ;
1078 mov al," " ; invalidate this switch ;AN005;
1079 mov SW_PTR,al ; /D ;AN005;
1080
1081
1082 JMP CASE_END ; Endcase_/D ;AN000;
1083
1084CASE_B: ; Bgncase_/B ;AN000;
1085
1086 ASSUME ds:DG,es:DG
1087
1088 cmp [PInst],0 ;
1089
1090; $if e ; if not installed ;AC000;
1091 JNE $$IF54
1092
1093 mov ax,[P_PTR_L] ; get the value ;AC000;
1094 push ds ; update BLKSIZ
1095 mov dx,CodeR ;
1096 mov ds,dx ;
1097
1098 ASSUME DS:CodeR
1099
1100 mov [BLKSIZ],ax ;
1101 pop ds ;
1102
1103 ASSUME DS:DG
1104
1105 clc ; reset carry ;AC000;
1106
1107; $else ; else ;AC000;
1108 JMP SHORT $$EN54
1109$$IF54:
1110
1111 stc ; set carry ;AC000;
1112
1113; $endif ; endif ;AC000;
1114$$EN54:
1115
1116 mov al," " ; invalidate this switch ;AN005;
1117 mov B_SWITCH,al ; /B ;AN005;
1118
1119 JMP CASE_END ; Endcase_/B ;AN000;
1120
1121CASE_Q: ; Bgncase_/Q ;AN000;
1122
1123 cmp [PInst],0 ;
1124
1125; $if e ; if not installed ;AC000;
1126 JNE $$IF57
1127
1128 mov ax,[P_PTR_L] ; get the value ;AC000;
1129 push ds ; update BLKSIZ
1130 mov dx,CodeR ;
1131 mov ds,dx ;
1132
1133 ASSUME DS:CodeR
1134
1135 mov [QueueLen],al ;
1136 pop ds ;
1137
1138 ASSUME DS:DG
1139
1140 clc ; reset carry ;AC000;
1141
1142; $else ; else ;AC000;
1143 JMP SHORT $$EN57
1144$$IF57:
1145
1146 stc ; set carry ;AC000;
1147
1148; $endif ; endif ;AC000;
1149$$EN57:
1150
1151 mov al," " ; invalidate this switch ;AN005;
1152 mov Q_SWITCH,al ; /Q ;AN005;
1153
1154 JMP CASE_END ; Endcase_/Q ;AN000;
1155
1156CASE_S: ; Bgncase_/S ;AN000;
1157
1158 cmp [PInst],0 ;
1159
1160; $if e ; if not installed ;AC000;
1161 JNE $$IF60
1162
1163 mov ax,[P_PTR_L] ; get the value ;AC000;
1164 push ds ; update TIMESLICE, SLICECNT
1165 mov dx,CodeR ;
1166 mov ds,dx ;
1167
1168 ASSUME ds:CodeR
1169
1170 mov [TIMESLICE],al ;
1171 mov [SLICECNT],al ;
1172 pop ds ;
1173
1174 ASSUME ds:DG
1175
1176 clc ; reset carry ;AC000;
1177
1178; $else ; else ;AC000;
1179 JMP SHORT $$EN60
1180$$IF60:
1181
1182 stc ; set carry ;AC000;
1183
1184; $endif ; endif ;AC000;
1185$$EN60:
1186
1187 mov al," " ; invalidate this switch ;AN005;
1188 mov S_SWITCH,al ; /S ;AN005;
1189
1190 JMP CASE_END ; Endcase_/S ;AN000;
1191
1192CASE_U: ; Bgncase_/U ;AN000;
1193
1194 cmp [PInst],0 ;
1195
1196; $if e ; if not installed ;AC000;
1197 JNE $$IF63
1198
1199 mov ax,[P_PTR_L] ; get the value ;AC000;
1200 push ds ; update BUSYTICK
1201 mov dx,CodeR ;
1202 mov ds,dx ;
1203
1204 ASSUME ds:CodeR
1205
1206 mov [BUSYTICK],al ;
1207 pop ds ;
1208
1209 ASSUME ds:DG
1210
1211 clc ; reset carry ;AC000;
1212
1213; $else ; else ;AC000;
1214 JMP SHORT $$EN63
1215$$IF63:
1216
1217 stc ; set carry ;AC000;
1218
1219; $endif ; endif ;AC000;
1220$$EN63:
1221
1222 mov al," " ; invalidate this switch ;AN005;
1223 mov U_SWITCH,al ; /U ;AN005;
1224
1225 JMP CASE_END ; Endcase_/U ;AN000;
1226
1227CASE_M: ; Bgncase_/M ;AN000;
1228
1229 cmp [PInst],0 ;
1230
1231; $if e ; if not installed ;AC000;
1232 JNE $$IF66
1233
1234 mov ax,[P_PTR_L] ; get the value ;AC000;
1235 push ds ; update MAXTICK
1236 mov dx,CodeR ;
1237 mov ds,dx ;
1238
1239 ASSUME ds:CodeR
1240
1241 mov [MAXTICK],al ;
1242 pop ds ;
1243
1244 ASSUME ds:DG
1245
1246 clc ; reset carry ;AC000;
1247
1248; $else ; else ;AC000;
1249 JMP SHORT $$EN66
1250$$IF66:
1251
1252 stc ; set carry ;AC000;
1253
1254; $endif ; endif ;AC000;
1255$$EN66:
1256
1257 mov al," " ; invalidate this switch ;AN005;
1258 mov M_SWITCH,al ; /M ;AN005;
1259
1260 JMP CASE_END ; Endcase_/M ;AN000;
1261
1262CASE_T: ; Bgncase_/T ;AN000;
1263
1264 push si ; save parse pointer
1265
1266 cmp [PInst],0 ; has print been installed?
1267
1268; $if e ; if not installed ;AC000;
1269 JNE $$IF69
1270
1271 call Set_Buffer ; do it now ;AC000;
1272
1273; $endif ; endif ;AC000;
1274$$IF69:
1275 ; set up for cancel
1276 mov ax,0103H ; cancel command
1277
1278 call IntWhileBusy ;
1279
1280 pop si ; restore parse pointer
1281
1282 clc ; reset carry ;AC000;
1283
1284 JMP CASE_END ; Endcase_/T ;AN000;
1285
1286CASE_C: ; Bgncase_/C ;AN000;
1287
1288 cmp [PInst],0 ; has print been installed?
1289
1290; $if ne ; if installed ;AC000;
1291 JE $$IF71
1292
1293 mov [CanFlag],1 ; set CanFlag
1294
1295; $else ; else ;AC000;
1296 JMP SHORT $$EN71
1297$$IF71:
1298
1299 call Set_Buffer ; ;AC000;
1300
1301; $endif ; endif ;AC000;
1302$$EN71:
1303
1304 clc ; reset carry ;AC000;
1305
1306 JMP CASE_END ; Endcase_/C ;AN000;
1307
1308CASE_P: ; Bgncase_/P ;AN000;
1309
1310 cmp [PInst],0 ; has print been installed?
1311
1312; $if ne ; if installed ;AC000;
1313 JE $$IF74
1314
1315 mov [CanFlag],0 ; reset CanFlag
1316
1317; $else ; else ;AC000;
1318 JMP SHORT $$EN74
1319$$IF74:
1320
1321 call Set_Buffer ; ;AC000;
1322
1323; $endif ; endif ;AC000;
1324$$EN74:
1325
1326 clc ; reset carry ;AC000;
1327
1328 ; Endcase_/P
1329
1330CASE_END: ; End_case ;AN000;
1331
1332; $if c ; if carry set ;AC000;
1333 JNC $$IF77
1334
1335 mov ax,(Parse_error shl 8) + INVPARM ; set up for Invalid_parm message ;AN000:
1336
1337 cmp [PInst],0 ; has print been installed?
1338
1339; $if ne ; if installed ;AN005;
1340 JE $$IF78
1341
1342 call DispMsg ; display the message and keep going ;AN005;
1343
1344; $endif ; endif ;AN005;
1345$$IF78:
1346
1347; $endif ; endif ;AC000;
1348$$IF77:
1349
1350 ret
1351
1352 Process_A_Switch ENDP
1353
1354 BREAK <Submit_File>
1355;******************* START OF SPECIFICATIONS ***********************************
1356;
1357; NAME: Submit_File - PRINT TRANSIENT to Resident Interface Routine
1358;
1359; FUNCTION: Resolved ambiguous file names (containing ? and *) and submits
1360; the file to the Resident component of PRINT for printing.
1361;
1362; INPUT: File name in Parse buffer
1363;
1364; OUTPUT: None.
1365;
1366; NOTE: This code is primarily old code, but it has been completely
1367; restructured and SALUTed.
1368;
1369; REGISTERS USED: T.B.D.
1370; (NOT RESTORED)
1371;
1372; LINKAGE: Call from: TRANSIENT
1373;
1374; NORMAL -
1375; EXIT:
1376;
1377; ERROR -
1378; EXIT:
1379;
1380; EXTERNAL Call to: DispMsg Parse_Input GetAbsN
1381; REFERENCES: IntWhileBusy GetAbsN2
1382;
1383; CHANGE 04/01/87 - change PaFile to Submit_File - F. G.
1384; LOG:
1385;
1386;******************* END OF SPECIFICATIONS *************************************
1387;******************** START - PSEUDOCODE ***************************************
1388;
1389; START
1390; .
1391; .
1392; .
1393; .
1394; .
1395;
1396; INPUT: CanFlag and Ambig set appropriately
1397;
1398; if CanFlag
1399; set up cancel
1400; call IntWhileBusy
1401; if error
1402; process the error
1403; endif
1404; else
1405; if Ambig and
1406;
1407; call getabsn
1408;
1409; if error
1410; load error message
1411; call DispMsg
1412; else
1413; do (until not Ambig)
1414; call open_file
1415; if error
1416; do error handling
1417; else
1418; close file
1419; submit packet
1420; if error
1421; set up message
1422; endif
1423; endif
1424; if error
1425; call Dispmsg
1426; endif
1427; leave if error
1428; if Ambig
1429; call Absn2 (will set fail if at end)
1430; else
1431; set fail
1432; endif
1433; enddo on fail
1434; if no message
1435; reset fail
1436; endif
1437; endif
1438; endif
1439; .
1440; .
1441; .
1442; if error message
1443; call DispMsg
1444; endif
1445;
1446; ret
1447;
1448; END
1449;
1450;******************** END - PSEUDOCODE ***************************************
1451
1452 Submit_File PROC NEAR
1453
1454 ASSUME ds:DG,es:DG
1455
1456 nop ; for production - uncomment this line and comment the next
1457; int 3
1458 nop
1459
1460 cmp [PInst],0 ; has print been installed?
1461
1462; $if e ; if not ..... ;AC000;
1463 JNE $$IF81
1464
1465 call Set_Buffer ; ... better do it now ;AC000;
1466
1467; $endif ; endif - installed ;AC000;
1468$$IF81:
1469
1470 cld ; just in case...
1471 mov [Ambig],0 ; assume not an ambigous file
1472
1473 ;------------------------------------
1474 ; Check for drive specifier
1475 ;------------------------------------
1476
1477 mov si,P_PTR_L ; ;AC000;
1478 mov ax,P_PTR_H ; ;AC000;
1479 mov ds,ax
1480
1481 ASSUME ds:nothing
1482
1483 mov di,offset dg:NameBuf ; buffer for full file name
1484 cmp byte ptr [si+1],":" ; check if there is a drive designator
1485
1486; $if ne ; if no : ;AC000;
1487 JE $$IF83
1488
1489 mov ah,Get_Default_Drive ; get it...
1490 int 21h
1491 mov dl,al ; save for later (used in DoPath)
1492 inc dl ; adjust to proper code (A=1,B=2,...)
1493 add al,"A" ; conver to letter code
1494 stosb ; store letter code
1495 mov al,":"
1496 stosb
1497 clc ; clear error flag ;AC000;
1498
1499; $else ; else - theres a drive ;AC000;
1500 JMP SHORT $$EN83
1501$$IF83:
1502
1503 mov al,byte ptr [si] ; get drive letter
1504 sub al,"@" ; conver to proper code...
1505
1506; $if a ; if a valid drive ;AC000;
1507 JNA $$IF85
1508
1509 mov dl,al ; save for later (used in DoPath)
1510 movsb ; move the drive letter
1511 movsb ; move the ":"
1512 clc ; ;AC000;
1513
1514; $else ; ;AC000;
1515 JMP SHORT $$EN85
1516$$IF85:
1517
1518 mov ax,(CLASS_B shl 8) + InvDrvMes ; set up error message ;AC000;
1519 stc ; set error flag ;AC000;
1520
1521; $endif ; ;AC000;
1522$$EN85:
1523
1524; $endif ; endif - : ;AC000;
1525$$EN83:
1526
1527
1528 ;------------------------------------
1529 ; could have CF & message # here
1530 ;------------------------------------
1531; $if nc ; if no error so far ;AC000;
1532 JC $$IF89
1533
1534 ;------------------------------------
1535 ; Check for full path
1536 ;------------------------------------
1537 mov al,[PathChar]
1538 cmp byte ptr [si],al ; does it start from the root?
1539
1540; $if ne ; if not get the current path ;AC000;
1541 JE $$IF90
1542
1543 stosb ; store path character
1544 push si
1545 mov si,di ; buffer for current directory
1546 mov ah,Current_Dir ; get current directory
1547 int 21h
1548
1549; $if c ; if an error occures ;AC000;
1550 JNC $$IF91
1551
1552 pop si ; clear the stack
1553
1554 mov ax,(CLASS_B shl 8) + InvDrvMes ; set up error message ;AC000;
1555
1556; $else ; else - no error so far ;AC000;
1557 JMP SHORT $$EN91
1558$$IF91:
1559
1560
1561; $do ; find terminating nul ;AC000;
1562$$DO93:
1563
1564 lodsb
1565 or al,al
1566
1567; $enddo z ; ;AC000;
1568 JNZ $$DO93
1569
1570 dec si ; adjust to point to nul
1571 mov ax,di ; save pointer to beg. of path
1572 mov di,si ; here is were the file name goes
1573 pop si ; points to file name
1574 cmp ax,di ; if equal then file is in the root
1575
1576; $if ne ; if not, add a path char ;AC000;
1577 JE $$IF95
1578
1579 mov al,[PathChar]
1580 stosb ; put path separator before file name
1581
1582; $endif ; ;AC000;
1583$$IF95:
1584 ;------------------------------------
1585 ; Check for valid drive.
1586 ;------------------------------------
1587
1588 ; Done by getting current dir of
1589 ; the drive in question (already in
1590 ; DL) into NameBuf. If no error the
1591 ; valid drive and we throw away the
1592 ; current dir stuf by overwriting it
1593 ; with the filename.
1594
1595 clc ; reset error flag ;AC000;
1596
1597; $endif ; ;AC000;
1598$$EN91:
1599
1600; $else ; else - it starts from the root ;AC000;
1601 JMP SHORT $$EN90
1602$$IF90:
1603 ; DL has drive number (from DrvFound)
1604 push si
1605 mov si,di ; buffer for current directory
1606 mov ah,Current_Dir ; get current directory
1607 int 21h
1608 pop si
1609
1610; $if c ; ;AC000;
1611 JNC $$IF99
1612
1613 mov ax,(CLASS_B shl 8) + InvDrvMes ; ;AC000;
1614
1615; $endif ; ;AC000;
1616$$IF99:
1617
1618; $endif ; ;AC000;
1619$$EN90:
1620
1621; $endif ; endif errors ;AC000;
1622$$IF89:
1623
1624 ;------------------------------------
1625 ; could have CF & message # here
1626 ;------------------------------------
1627
1628; $if nc ; if no error so far ;AC000;
1629 JC $$IF103
1630
1631 mov cx,MaxFileLen ; lets not overflow file name buffer
1632 mov ax,di ; CX := MaxFileLen -
1633 ; long(&NameBuf - &PtrLastchar)
1634 sub ax,offset dg:NameBuf ; size of the filename so far
1635 sub cx,ax ; size left for the filename
1636
1637; $if c ; if too long ;AC000;
1638 JNC $$IF104
1639
1640 mov cx,1 ; Set cx to Fall through to FNTooLong
1641
1642; $endif ; ;AC000;
1643$$IF104:
1644
1645 ; WHILE (Length(FileName) <= MaxFileLen)
1646; $search ; DO copy in the file name ;AC000;
1647$$DO106:
1648
1649 lodsb
1650 stosb
1651 cmp al,"*"
1652
1653; $if e,or ; if its ambigous - *, or...... ;AC000;
1654 JE $$LL107
1655
1656 cmp al,"?" ; :
1657
1658; $if e ; if its ambigous - ?, .......: ;AC000;
1659 JNE $$IF107
1660$$LL107:
1661
1662 mov [Ambig],1 ; ambigous filename found
1663
1664; $endif ; endif - ambigous ;AC000;
1665$$IF107:
1666
1667 or al,al ; end of name?
1668 clc ; ;AC000;
1669
1670; $exitif z ; ;AC000;
1671 JNZ $$IF106
1672
1673; $orelse ; ;AC000;
1674 JMP SHORT $$SR106
1675$$IF106:
1676
1677; $endloop loop ; ;AC000;
1678 LOOP $$DO106
1679
1680 dec di ; the name was too long !
1681 mov [NulPtr],di
1682 mov ax,(CLASS_C shl 8) + NamTMes ; ;AC000;
1683 stc ; ;AN010;
1684
1685; $endsrch ; we have the full absolute name... ;AC000;
1686$$SR106:
1687
1688
1689; $endif ; endif errors ;AC000;
1690$$IF103:
1691
1692 push cs ; restore ds to DG
1693 pop ds
1694
1695 ASSUME ds:DG
1696
1697 ;------------------------------------
1698 ; could have CF & message #
1699 ;------------------------------------
1700; $if nc,long ; ;AC000;
1701 JNC $$XL2
1702 JMP $$IF114
1703$$XL2:
1704
1705 dec di
1706 mov [NulPtr],di ; save pointer to termanting nul
1707
1708 ;------------------------------------
1709 ; check for an option following name
1710 ;------------------------------------
1711 call Parse_Input ; ;AC000;
1712
1713 cmp ax,noerror ; a parse error? ;AC000;
1714
1715; $if e ; if no parse error ;AC000;
1716 JNE $$IF115
1717
1718
1719 cmp [P_SYN],offset DG:C_SW_ptr ; is it the cancel switch /C ;AC000;
1720
1721; $if e ; if it is ;AC000;
1722 JNE $$IF116
1723
1724 mov [CanFlag],1 ; set cancel flag
1725
1726; $else ; else - it is not ;AC000;
1727 JMP SHORT $$EN116
1728$$IF116:
1729
1730 cmp [P_SYN],offset DG:P_SW_ptr ; is it the print switch /P ;AC000;
1731
1732; $if e ; if it is ;AC000;
1733 JNE $$IF118
1734
1735 mov [CanFlag],0 ; reset cancel flag
1736
1737; $endif ; ;AC000;
1738$$IF118:
1739
1740; $endif ; ;AC000;
1741$$EN116:
1742
1743; $if e ; if /C or /P found ;AC000;
1744 JNE $$IF121
1745
1746 mov [ordinal],cx ; ;AC000;
1747 mov [scan_ptr],si ; ;AC000;
1748
1749; $endif ; ;AC000;
1750$$IF121:
1751
1752; $endif ; ;AC000;
1753$$IF115:
1754 ;--------------------------------------
1755 ;------------------------------------
1756 ; check file exists
1757 ;------------------------------------
1758
1759 cmp [CanFlag],1 ; are we in cancel mode
1760
1761; $if e ; if cancel mode ;AC000;
1762 JNE $$IF124
1763 ;------------------------------------
1764 ; Issue a cancel command
1765 ;------------------------------------
1766
1767 ; NOTE: ds:dx MUST point to NameFuf !!!
1768
1769 ; set up cancel
1770 mov dx,offset dg:NameBuf ; filename
1771 mov ax,0102H
1772 call IntWhileBusy
1773
1774; $if c ; ;AC000;
1775 JNC $$IF125
1776
1777 cmp ax,2
1778
1779; $if ne ; Original Print Code timing jump ;AC000;
1780 JE $$IF126
1781 ;------------------------------------
1782 ;***** PROCESS CANCEL ERROR
1783 ;------------------------------------
1784; $endif ; ;AC000;
1785$$IF126:
1786
1787 mov ax,(CLASS_C shl 8) + BadCanMes ; ;AC000;
1788 stc ; ;AC000;
1789
1790; $endif ; ;AC000;
1791$$IF125:
1792
1793; $else long ; submit mode active ;AC000;
1794 JMP $$EN124
1795$$IF124:
1796
1797 cmp [Ambig],1 ; is this an ambigous name?
1798
1799; $if e,and ; if it is ambigous ;AC000;
1800 JNE $$IF130
1801
1802 ; do another ambigous name
1803 call GetAbsN ; get abs name into NameBuf
1804
1805; $if c ; if an error occured ;AC000;
1806 JNC $$IF130
1807
1808 mov ax,(CLASS_C shl 8) + BadNameMes ; ;AC000;
1809 call DispMsg ; call DispMsg ;AN000;
1810
1811; $else long ; there is at least 1 name ;AC000;
1812 JMP $$EN130
1813$$IF130:
1814
1815; $do ; until all names processed ;AC000;
1816$$DO132:
1817
1818 ; Check if this is a local drive -
1819 ; If it is, convert the filename
1820 ; to its physical name.
1821
1822 lea si,NameBuf ; DS:SI = NameBuf containing name ;AN010;
1823 mov bl,ds:[si] ; get DRIVE ID ;AN010;
1824 sub bl,40h ; convert to a number ;AN010;
1825 ; IOCtl call to see if target drive is local
1826 mov ax,(IOCTL SHL 8) + 9 ;AN010;
1827 INT 21h ; IOCtl + dev_local <4409> ;AN010;
1828
1829; $if nc,and ; target drive local and ;AN010;
1830 JC $$IF133
1831
1832 test dx,1200H ; check if (x & 0x1000) ;AN010;
1833 ; (redirected or shared)
1834; $if z,and ; if RC indicates NO network drive ;AN010;
1835 JNZ $$IF133
1836
1837 ; Translate the file name into an
1838 ; absolute path name - note that
1839 ; from this point on only SERVER DOS
1840 ; calls will work with this name!
1841
1842 lea di,TokBuf ; DS:DI = output buffer ;AN010;
1843 mov ax,(xNameTrans SHL 8) ; check for name translation ;AN010;
1844 int 21h ; get real path and name ;AN010;
1845
1846; $if nc ; if no errors so far ;AN010;
1847 JC $$IF133
1848
1849 xchg di,si ; switch source and destination ;AN010;
1850 mov cx,((MaxFileLen+16)/2) ; move Max buffer ;AN010;
1851 cld ;AN010;
1852 rep movsw ; move name back into NameBuf ;AN010;
1853
1854; $endif ; ;AN010;
1855$$IF133:
1856 ; set up to open file
1857 xor cx,cx ; zero attribute type ;AC000;
1858 mov di,cx ; ;AC001;
1859 dec di ; no list supplied ;AC001;
1860 mov dx,(ignore_cp shl 8) + (failopen shl 4) + openit ; ;AC001;
1861 mov open_seg,es ; segment fix up for OPEN_FILE ;AC000;
1862 lds si,OPEN_FILE ; ;AC001;
1863 mov bx,open_mode ; set open mode ;AC000;
1864 mov ah,ExtOpen ; open for reading exist. ;AN010;
1865 mov al,ds:[si] ; recover drive ID ;AN010;
1866
1867 call TO_DOS ; make a SERVER DOS call ;AC010;
1868
1869; $if c ; if error ;AC000;
1870 JNC $$IF135
1871
1872 ; do error handling
1873 SaveReg <SI,DI,BP,ES,DS>
1874
1875 mov ah,GetExtendedError
1876 int 21h
1877 mov ah,DOS_error
1878
1879 RestoreReg <DS,ES,BP,DI,SI>
1880 stc ; ;AC000;
1881
1882; $else ; ;AC000;
1883 JMP SHORT $$EN135
1884$$IF135:
1885 ; close file
1886 mov bx,ax ; copy handle
1887 mov ah,close
1888 int 21h ;
1889 clc ; clear error flag ;AC000;
1890
1891 ; submit packet
1892 mov dx,offset dg:NameBuf ;
1893 mov word ptr [SubPack+1],dx ; store pointer to name in
1894 mov word ptr [SubPack+3],ds ; submit packet
1895 mov dx,offset dg:SubPack ; DS:DX address of packet
1896 mov ax,0101H ; submit a file to resident
1897 call IntWhileBusy
1898
1899; $if nc,and ; if successfull, or ;AC000;
1900 JC $$IF137
1901
1902 cmp ax,error_queue_full
1903
1904; $if ne ; if error but queue not full ;AC000;
1905 JE $$IF137
1906
1907 mov [QFullMes],0 ; queue is not full
1908 clc ; reset the error flag ;AC000;
1909
1910; $else ; else - the queue IS full ;AC000;
1911 JMP SHORT $$EN137
1912$$IF137:
1913
1914 cmp [QFullMes],1 ; has the message already been issued?
1915
1916; $if ne ; if the message has not been posted ;AC000;
1917 JE $$IF139
1918
1919 mov [QFullMes],1 ; set the 'message posted' flag
1920 mov ax,(CLASS_B shl 8) + FullMes ; load msg # ;AC000;
1921 stc ; display the message ;AC000;
1922; $else
1923 JMP SHORT $$EN139
1924$$IF139:
1925 clc ; make sure carry clear
1926; $endif ; message processed ;AC000;
1927$$EN139:
1928
1929; $endif ; queue errors ;AC000;
1930$$EN137:
1931
1932; $endif ; OPENing errors ;AC000;
1933$$EN135:
1934
1935; $if c ; if error ;AC000;
1936 JNC $$IF144
1937
1938 call DispMsg ; display the error with this file ;AC000;
1939
1940; $endif ; ;AC000;
1941$$IF144:
1942
1943; $leave c ; quit if error in displaying message ;AC000;
1944 JC $$EN132
1945
1946 cmp [Ambig],1 ; are we processing an ambigous name?
1947
1948; $if e ; if Ambiguous ;AC000;
1949 JNE $$IF147
1950 ; call Absn2 (will set fail if at end)
1951 call GetAbsN2 ; get another file name
1952
1953; $else ; ;AC000;
1954 JMP SHORT $$EN147
1955$$IF147:
1956
1957 mov ax,0 ; set fail ;AC000;
1958 stc ; ;AC000;
1959
1960; $endif ; ;AC000;
1961$$EN147:
1962
1963; $enddo c,long ; end do on fail ;AC000;
1964 JC $$XL3
1965 JMP $$DO132
1966$$XL3:
1967$$EN132:
1968
1969 cmp ax,0 ; is there a message? ;AC000;
1970
1971; $if e ; if no message ;AC000;
1972 JNE $$IF151
1973
1974 clc ; reset fail ;AC000;
1975
1976; $endif ; no message to display ;AC000;
1977$$IF151:
1978
1979; $endif ; any submission errors ;AC000;
1980$$EN130:
1981
1982; $endif ; submit or cancel ;AC000;
1983$$EN124:
1984
1985; $endif ; any errors so far ;AC000;
1986$$IF114:
1987
1988; $if c ; if error ;AC000;
1989 JNC $$IF156
1990
1991 call DispMsg ; display the submit error ;AC000;
1992
1993; $endif ; ;AC000;
1994$$IF156:
1995
1996 ret ; finished submission ;AC000;
1997
1998 Submit_File ENDP
1999
2000 BREAK <Set_Buffer>
2001;******************* START OF SPECIFICATIONS ***********************************
2002;
2003; NAME: Set_Buffer - PRINT Build Resident Buffer routine.
2004;
2005; FUNCTION: Calculate the buffer size required by the resident component and
2006; move the transient portion accordingly
2007;
2008; NOTE: This code is primarily old code, but it has been partly
2009; restructured in order to SALUT it.
2010;
2011; INPUT: None.
2012;
2013; OUTPUT: Resident Buffer established, and TRANSIENT moved accordingly.
2014;
2015; REGISTERS USED: T.B.D.
2016; (NOT RESTORED)
2017;
2018; LINKAGE: Called from: TRANSIENT
2019;
2020; NORMAL -
2021; EXIT:
2022;
2023; ERROR -
2024; EXIT:
2025;
2026; EXTERNAL Calls to: DispMsg, Parse_Input
2027; REFERENCES:
2028;
2029; CHANGE 03/11/87 - Change SETBUF to Set_Buffer - F. G.
2030; LOG:
2031;
2032;******************* END OF SPECIFICATIONS *************************************
2033;******************** START - PSEUDOCODE ***************************************
2034;
2035; START
2036; END
2037;
2038;******************** END - PSEUDOCODE ***************************************
2039
2040 Set_Buffer PROC NEAR
2041
2042 push cs
2043 pop ds
2044 assume ds:DG
2045 mov dl,[PathChar] ; transfer PathChar (in PRINT_T)
2046 mov ax,CodeR
2047 mov es,ax
2048 assume es:CodeR
2049 mov [PChar],dl ; to PChar (in PRINT_R)
2050
2051
2052 ;------------------------------------
2053 ; check device
2054 ;------------------------------------
2055
2056 cmp [DevSpec],1 ; was it already specified?
2057
2058; $if ne,and ; if not specified ........... ;AC000;
2059 JE $$IF158
2060
2061 lea di,TokBuf ; ES:DI point to TokBuf : ;AC000;
2062 mov [TokBuf],9 ; max of 9 chars :
2063 mov [TokBuf+1],0 ; assume zero in :
2064
2065 push es ; ;AC000;
2066 mov ax,ds ; ;AC000;
2067 mov es,ax ; ;AC000;
2068
2069 assume es:DG ; ;AC000;
2070
2071 mov ax,(CLASS_D shl 8) + prompt ; DispMsg treats 'prompt' as : ;AC000;
2072 ; a special case :
2073 call DispMsg ; : ;AC000;
2074
2075 mov ax,(CLASS_B shl 8) + NEXT_LINE ; advance to next line after : ;AC000;
2076 ; "buffered input" call:
2077 call DispMsg ; : ;AC000;
2078
2079 pop es ; ;AC000;
2080
2081 assume es:CodeR
2082
2083 mov cl,[TokBuf+1] ; check how many read in :
2084 or cl,cl ; :
2085
2086; $if nz ; if a CR was typed..........: ;AC000;
2087 JZ $$IF158
2088
2089 xor ch,ch
2090 mov si,offset dg:TokBuf+2
2091 mov di,offset CodeR:ListName
2092 push si
2093 mov dx,si ; get ready to capitalize ;AN007;
2094 add si,cx
2095 mov byte ptr [si],0 ; turn it into an ascii z string ;AN007;
2096 mov ax,(GetExtCntry SHL 8) + Cap_ASCIIZ ; let DOS capitalize the string ;AN007;
2097 INT 21h ; call DOS to do it ;AN007;
2098 dec si
2099 cmp byte ptr [si],':'
2100
2101; $if e ; if a : ;AC000;
2102 JNE $$IF159
2103 dec cx ; get rid of trailing ':'
2104; $endif ; endif - a : ;AC000;
2105$$IF159:
2106
2107 cmp cx,8 ; is it greater than 8 ? ;AN000;
2108
2109; $if a ; if greater - force it to 8.: ;AC000;
2110 JNA $$IF161
2111
2112 mov cx,8 ; ;AN000;
2113
2114; $endif ; ;AC000;
2115$$IF161:
2116
2117 pop si
2118
2119 rep movsb ; ;AC000;
2120
2121; $endif ; ;AC000;
2122$$IF158:
2123 ;------------------------------------
2124 ; queue size
2125 ;------------------------------------
2126 push es
2127 pop ds
2128
2129 ASSUME ds:CodeR
2130
2131 mov ax,MaxFileLen ; maximum length of a file name
2132 mul [QueueLen] ; AX = result
2133 add ax,offset CodeR:FileQueue
2134 mov [EndQueue],ax ; save pointer to last nul
2135 inc ax
2136 mov [buffer],ax ; beggining of buffer
2137
2138 ;------------------------------------
2139 ;--- buffer size
2140 ;------------------------------------
2141
2142 add ax,[BlkSiz]
2143 mov [ENDPTR],AX ; Set end of buffer pointer
2144 mov [NXTCHR],AX ; Buffer empty
2145 add ax,100h ; allow for header
2146 add ax,16 ; Convert to para
2147 shr ax,1
2148 shr ax,1
2149 shr ax,1
2150 shr ax,1
2151 mov [EndRes],ax ; Add size of buffer to term res size
2152
2153 ; Now JUMP into PRINT_R - the resident
2154 jmp MoveTrans ; code to initialize the buffer space
2155
2156TransRet: ; after moving the transient we come
2157 ; here.
2158 sti ; Ints were off during initialization
2159 push cs ; CAUTION !!!! from here on in DG is
2160 pop ax ; not the ASSEMBLED DG - its bogus -
2161 mov ds,ax ; after the move! Only PUSH/POP will
2162 mov es,ax ; work.
2163 mov WORD PTR [insert_ptr_seg],ax ; fix up segment in SUBLIST for msgs! ;AC002;
2164 mov WORD PTR [P_PTR_H],ax ; fix up segment for PARSE ;AC002;
2165
2166 ASSUME ds:DG,es:DG
2167
2168
2169 call SYSLOADMSG ; RE-Initialize the Message Services ;AN016;
2170 ; - WARNING!!! the Message retriver
2171 ; keeps track of offset and SEGMENT
2172 ; for extended and parse errors
2173 ; EVEN THOUGH WE ARE NEAR!!! since
2174 ; the location could now have been
2175 ; moved - it must now be reset
2176
2177 ;------------------------------------
2178 ; normalize int handlers for new location of dg
2179 ;------------------------------------
2180
2181 mov ax,(SET_INTERRUPT_VECTOR shl 8) or 23h
2182 mov dx,OFFSET DG:INT_23
2183 int 21h
2184 mov ax,(SET_INTERRUPT_VECTOR shl 8) or 24h
2185 mov dx,OFFSET DG:INT_24
2186 int 21h
2187
2188 mov [PInst],1 ; remember we just installed resident part
2189
2190 ret ; finished ;AC000;
2191
2192 Set_Buffer ENDP
2193
2194 BREAK <copy_to_arg_buf>
2195;******************* START OF SPECIFICATIONS ***********************************
2196;
2197; NAME: copy_to_arg_buf
2198;
2199; FUNCTION: Copies the names of the files in the print queue into NameBuf
2200; - one name copied per invocation
2201;
2202; INPUT:
2203;
2204; OUTPUT:
2205;
2206;
2207; REGISTERS USED: T.B.D.
2208;
2209; LINKAGE: Called from:
2210;
2211;
2212; CHANGE 05/20/87 - Header added - F. G.
2213; LOG:
2214;
2215;******************* END OF SPECIFICATIONS *************************************
2216;******************** START - PSEUDOCODE ***************************************
2217;
2218; START copy_to_arg_buf
2219;
2220; ret
2221;
2222; END copy_to_arg_buf
2223;
2224;******************** END - PSEUDOCODE ***************************************
2225
2226 copy_to_arg_buf PROC NEAR
2227
2228 push di
2229 push si
2230 push ax ; must preserve AX (could be message #);AN000;
2231 mov di,offset dg:NameBuf
2232
2233; $do ; ;AC000;
2234$$DO164:
2235
2236 lodsb
2237 or al,al
2238
2239; $leave z ; ;AC000;
2240 JZ $$EN164
2241
2242 stosb
2243
2244; $enddo ; ;AC000;
2245 JMP SHORT $$DO164
2246$$EN164:
2247
2248 stosb
2249 pop ax ; must preserve AX (could be message #);AN000;
2250 pop si
2251 pop di
2252
2253 ret
2254
2255 copy_to_arg_buf ENDP
2256
2257 BREAK <IntWhileBusy>
2258;******************* START OF SPECIFICATIONS ***********************************
2259;
2260; NAME: IntWhileBusy
2261;
2262; FUNCTION:
2263;
2264; INPUT:
2265;
2266; OUTPUT:
2267;
2268;
2269; REGISTERS USED: T.B.D.
2270;
2271; LINKAGE: Called from:
2272;
2273;
2274; CHANGE 05/20/87 - Header added - F. G.
2275; LOG:
2276;
2277;******************* END OF SPECIFICATIONS *************************************
2278;******************** START - PSEUDOCODE ***************************************
2279;
2280; START IntWhileBusy
2281;
2282; ret
2283;
2284; END IntWhileBusy
2285;
2286;******************** END - PSEUDOCODE ***************************************
2287
2288 IntWhileBusy PROC NEAR
2289
2290; $search complex ; ;AC000;
2291 JMP SHORT $$SS167
2292$$DO167:
2293
2294 pop ax
2295
2296; $strtsrch ; ;AC000;
2297$$SS167:
2298
2299 push ax
2300 int ComInt
2301
2302; $exitif nc ; ;AC000;
2303 JC $$IF167
2304
2305 add sp,2 ; clear off AX and clear carry
2306
2307; $orelse ; ;AC000;
2308 JMP SHORT $$SR167
2309$$IF167:
2310
2311 cmp ax,error_busy
2312
2313; $leave nz ; ;AC000;
2314 JNZ $$EN167
2315
2316; $endloop ; ;AC000;
2317 JMP SHORT $$DO167
2318$$EN167:
2319
2320 add sp,2 ; clear off AX
2321 stc ; ;AC000;
2322
2323; $endsrch ; ;AC000;
2324$$SR167:
2325
2326 ret
2327
2328 IntWhileBusy ENDP
2329
2330 BREAK <GetAbsN>
2331;******************* START OF SPECIFICATIONS ***********************************
2332;
2333; NAME: GetAbsN
2334;
2335; FUNCTION: Return first absolute name from ambigous name
2336;
2337; INPUT: NameBuf has the ambigous File Name
2338;
2339; OUTPUT: Carry Set if no files match
2340; else NameBuf has the absolute name
2341;
2342; REGISTERS USED: T.B.D.
2343;
2344; LINKAGE: Called from:
2345;
2346;
2347; CHANGE 05/20/87 - Header added - F. G.
2348; LOG:
2349;
2350;******************* END OF SPECIFICATIONS *************************************
2351;******************** START - PSEUDOCODE ***************************************
2352;
2353; START GetAbsN
2354;
2355; ret
2356;
2357; END GetAbsN
2358;
2359;******************** END - PSEUDOCODE ***************************************
2360
2361 GetAbsN PROC NEAR
2362
2363 ASSUME ds:DG,es:DG
2364
2365 mov ah,Set_DMA ; buffer for ffirst / fnext
2366 mov dx,offset dg:SearchBuf
2367 int 21h
2368 ;------------------------------------
2369 ; look for a match
2370 ;------------------------------------
2371 mov dx,offset dg:NameBuf
2372 mov cx,0 ; no attributes
2373 mov ah,Find_First
2374 int 21h
2375
2376; $if nc ; if no error ;AC000;
2377 JC $$IF174
2378
2379 ;------------------------------------
2380 ; Place new name in NameBuf
2381 ;------------------------------------
2382 mov si,[NulPtr]
2383 std ; scan back
2384
2385; $do ; ;AC000;
2386$$DO175:
2387
2388 lodsb
2389 cmp al,PathChar
2390
2391; $enddo e ; ;AC000;
2392 JNE $$DO175
2393
2394 cld ; just in case...
2395 inc si
2396 inc si
2397 mov [FnamPtr],si
2398 call CopyName
2399 clc ; ;AC000;
2400
2401; $endif ; endif -no error ;AC000;
2402$$IF174:
2403
2404 ret
2405
2406 GetAbsN ENDP
2407
2408 BREAK <GetAbsN2>
2409;******************* START OF SPECIFICATIONS ***********************************
2410;
2411; NAME: GetAbsN2
2412;
2413; FUNCTION: Return next absolute name from ambigous
2414;
2415; INPUT:
2416;
2417; OUTPUT:
2418;
2419; REGISTERS USED: T.B.D.
2420;
2421; LINKAGE: Called from:
2422;
2423;
2424; CHANGE 05/20/87 - Header added - F. G.
2425; LOG:
2426;
2427;******************* END OF SPECIFICATIONS *************************************
2428;******************** START - PSEUDOCODE ***************************************
2429;
2430; START GetAbsN2
2431;
2432; ret
2433;
2434; END GetAbsN2
2435;
2436;******************** END - PSEUDOCODE ***************************************
2437
2438 GetAbsN2 PROC NEAR
2439
2440 mov ah,Set_DMA ; buffer for ffirst / fnext
2441 mov dx,offset dg:SearchBuf
2442 int 21h
2443 mov ah,Find_Next
2444 int 21h
2445
2446; $if nc ; if no error ;AC000;
2447 JC $$IF178
2448
2449 call CopyName ; we found one
2450 clc ; ;AC000;
2451
2452; $endif ; endif - no error ;AC000;
2453$$IF178:
2454
2455 mov ax,0 ; signal no message available
2456
2457 ret ; return
2458
2459 GetAbsN2 ENDP
2460
2461 BREAK <CopyName>
2462;******************* START OF SPECIFICATIONS ***********************************
2463;
2464; NAME: CopyName
2465;
2466; FUNCTION: Copy name from search buf to NameBuf
2467;
2468; INPUT:
2469;
2470; OUTPUT:
2471;
2472; REGISTERS USED: T.B.D.
2473;
2474; LINKAGE: Called from:
2475;
2476;
2477; CHANGE 05/20/87 - Header added - F. G.
2478; LOG:
2479;
2480;******************* END OF SPECIFICATIONS *************************************
2481;******************** START - PSEUDOCODE ***************************************
2482;
2483; START CopyName
2484;
2485; ret
2486;
2487; END CopyName
2488;
2489;******************** END - PSEUDOCODE ***************************************
2490
2491 CopyName PROC NEAR
2492
2493 mov di,[FNamPtr]
2494 mov si,offset dg:SearchBuf.find_buf_pname
2495 cld
2496
2497; $do ; until null is found ;AC000;
2498$$DO180:
2499
2500 lodsb ; move the name
2501 stosb
2502 or al,al ; nul found?
2503
2504; $enddo e ; ;AC000;
2505 JNE $$DO180
2506
2507 ret
2508
2509 CopyName ENDP
2510
2511 BREAK <Save_Vectors>
2512;******************* START OF SPECIFICATIONS ***********************************
2513;
2514; NAME: Save_Vectors
2515;
2516; FUNCTION: save int vectors in case of error
2517;
2518; INPUT:
2519;
2520; OUTPUT:
2521;
2522; REGISTERS USED: T.B.D.
2523;
2524; LINKAGE: Called from:
2525;
2526;
2527; CHANGE 05/20/87 - Header added - F. G.
2528; LOG:
2529;
2530;******************* END OF SPECIFICATIONS *************************************
2531;******************** START - PSEUDOCODE ***************************************
2532;
2533; START Save_Vectors
2534;
2535; ret
2536;
2537; END Save_Vectors
2538;
2539;******************** END - PSEUDOCODE ***************************************
2540
2541 Save_Vectors PROC NEAR
2542
2543 mov ax,(get_interrupt_vector shl 8) or SOFTINT ; (SOFTINT)
2544 int 21h
2545
2546 ASSUME es:nothing
2547
2548 mov word ptr [i28vec+2],es
2549 mov word ptr [i28vec],bx
2550
2551 mov ax,(get_interrupt_vector shl 8) or COMINT ; (COMINT)
2552 int 21h
2553 mov word ptr [i2fvec+2],es
2554 mov word ptr [i2fvec],bx
2555
2556 mov ax,(get_interrupt_vector shl 8) or 13h
2557 int 21h
2558 mov word ptr [i13vec+2],es
2559 mov word ptr [i13vec],bx
2560
2561 mov ax,(get_interrupt_vector shl 8) or 15h
2562 int 21h
2563 mov word ptr [i15vec+2],es
2564 mov word ptr [i15vec],bx
2565
2566 mov ax,(get_interrupt_vector shl 8) or 17h
2567 int 21h
2568 mov word ptr [i17vec+2],es
2569 mov word ptr [i17vec],bx
2570
2571 mov ax,(get_interrupt_vector shl 8) or 14h
2572 int 21h
2573 mov word ptr [i14vec+2],es
2574 mov word ptr [i14vec],bx
2575
2576 mov ax,(get_interrupt_vector shl 8) or 05h
2577 int 21h
2578 mov word ptr [i05vec+2],es
2579 mov word ptr [i05vec],bx
2580
2581 mov ax,(get_interrupt_vector shl 8) or INTLOC ; (INTLOC)
2582 int 21h
2583 mov word ptr [i1cvec+2],es
2584 mov word ptr [i1cvec],bx
2585
2586 push cs
2587 pop es
2588
2589 ASSUME es:DG
2590
2591 Save_Vectors ENDP
2592
2593 BREAK <GetHInt>
2594;******************* START OF SPECIFICATIONS ***********************************
2595;
2596; NAME: GetHInt
2597;
2598; FUNCTION: Install PRINT Interupt Handler routines
2599;
2600; INPUT:
2601;
2602; OUTPUT:
2603;
2604; REGISTERS USED: T.B.D.
2605;
2606; LINKAGE: Called from: TRANSIENT,
2607;
2608;
2609; CHANGE 05/20/87 - Header added - F. G.
2610; LOG:
2611;
2612;******************* END OF SPECIFICATIONS *************************************
2613;******************** START - PSEUDOCODE ***************************************
2614;
2615; START GetHInt
2616;
2617; ret
2618;
2619; END GetHInt
2620;
2621;******************** END - PSEUDOCODE ***************************************
2622
2623 GetHInt PROC NEAR
2624
2625 ASSUME ds:DG,es:DG
2626
2627 push es
2628 mov ax,(GET_INTERRUPT_VECTOR shl 8) OR 24h
2629 int 21h
2630
2631 ASSUME es:nothing
2632
2633 mov WORD PTR [HARDCH],bx
2634 mov WORD PTR [HARDCH+2],es
2635 pop es
2636
2637 ASSUME es:DG
2638
2639 ret
2640
2641 GetHInt ENDP
2642
2643 BREAK <SetInts>
2644;******************* START OF SPECIFICATIONS ***********************************
2645;
2646; NAME: SetInts
2647;
2648; FUNCTION: Install PRINT Interupt Handler routines
2649;
2650; INPUT:
2651;
2652; OUTPUT:
2653;
2654; REGISTERS USED: T.B.D.
2655; (NOT RESTORED)
2656;
2657; LINKAGE: Called from: TRANSIENT,
2658;
2659; NORMAL
2660; EXIT:
2661;
2662; ERROR
2663; EXIT:
2664;
2665; EXTERNAL
2666; REFERENCES:
2667;
2668; CHANGE 05/20/87 - Header added - F. G.
2669; LOG:
2670;
2671;******************* END OF SPECIFICATIONS *************************************
2672;******************** START - PSEUDOCODE ***************************************
2673;
2674; START SetInts
2675;
2676; ret
2677;
2678; END SetInts
2679;
2680;******************** END - PSEUDOCODE ***************************************
2681
2682 SetInts PROC NEAR
2683
2684 ASSUME ds:DG,es:DG
2685
2686 mov AX,(SET_INTERRUPT_VECTOR shl 8) OR 23h
2687 mov DX,OFFSET DG:INT_23
2688 int 21h
2689
2690 mov ax,(SET_INTERRUPT_VECTOR shl 8) OR 24h
2691 mov dx,OFFSET DG:INT_24
2692 int 21h
2693
2694 ret
2695
2696 SetInts ENDP
2697
2698 BREAK <Int_24>
2699;******************* START OF SPECIFICATIONS ***********************************
2700;
2701; NAME: Int_24
2702;
2703; FUNCTION: INT 24 handler
2704;
2705; INPUT:
2706;
2707; OUTPUT:
2708;
2709; NOTE: This is coded as a PROC but is never called
2710;
2711; REGISTERS USED: T.B.D.
2712; (NOT RESTORED)
2713;
2714; LINKAGE: INTerupt 24
2715;
2716; NORMAL
2717; EXIT:
2718;
2719; ERROR
2720; EXIT:
2721;
2722; CHANGE 05/20/87 - Header added - F. G.
2723; LOG:
2724;
2725;******************* END OF SPECIFICATIONS *************************************
2726;******************** START - PSEUDOCODE ***************************************
2727;
2728; START Int_24
2729;
2730; ret
2731;
2732; END Int_24
2733;
2734;******************** END - PSEUDOCODE ***************************************
2735
2736
2737INT_24_RETADDR DW OFFSET DG:INT_24_BACK
2738
2739in_int_23 db 0 ; reentrancy flag
2740
2741
2742 INT_24 PROC FAR
2743
2744 ASSUME ds:nothing,es:nothing,ss:nothing
2745
2746 pushf
2747 push cs
2748 push [INT_24_RETADDR]
2749 push WORD PTR [HARDCH+2]
2750 push WORD PTR [HARDCH]
2751
2752 ret
2753
2754 INT_24 ENDP
2755
2756 BREAK <INT_24_BACK>
2757;******************* START OF SPECIFICATIONS ***********************************
2758;
2759; NAME: INT_24_BACK
2760;
2761; FUNCTION: INT 24 post processor
2762;
2763; INPUT:
2764;
2765; OUTPUT:
2766;
2767; NOTE: This is NOT a PROC
2768;
2769; REGISTERS USED: T.B.D.
2770; (NOT RESTORED)
2771;
2772; LINKAGE: INTerupt 24
2773;
2774; NORMAL
2775; EXIT:
2776;
2777; ERROR
2778; EXIT:
2779;
2780; CHANGE 05/20/87 - Header added - F. G.
2781; LOG:
2782;
2783;******************* END OF SPECIFICATIONS *************************************
2784;******************** START - PSEUDOCODE ***************************************
2785;
2786; START INT_24_BACK
2787;
2788; ret
2789;
2790; END INT_24_BACK
2791;
2792;******************** END - PSEUDOCODE ***************************************
2793
2794INT_24_BACK:
2795
2796 cmp al,2 ; Abort?
2797
2798; $if z ; if abort ;AC000;
2799 JNZ $$IF182
2800
2801 inc [in_int_23] ; no int 23's allowed
2802 push cs
2803 pop ds
2804
2805 ASSUME ds:DG
2806
2807 push cs
2808 pop ss
2809
2810 ASSUME ss:DG
2811
2812 mov sp, offset dg:intStk ; setup local int stack
2813 cmp [PInst],2
2814
2815; $if ne ; if not installed ;AC000;
2816 JE $$IF183
2817
2818 call Restore_ints
2819
2820; $endif ; endif - not installed ;AC000;
2821$$IF183:
2822
2823 mov ah,EXIT
2824 mov al,0FFH
2825 int 21h
2826
2827; $endif ; endif - abort
2828$$IF182:
2829
2830 IRET
2831
2832 BREAK <Int_23>
2833;******************* START OF SPECIFICATIONS ***********************************
2834;
2835; NAME: Int_23
2836;
2837; FUNCTION: INT 23 handler
2838;
2839; INPUT:
2840;
2841; OUTPUT:
2842;
2843; NOTE: This is NOT a PROC
2844;
2845; REGISTERS USED: T.B.D.
2846; (NOT RESTORED)
2847;
2848; LINKAGE: INTerupt 23
2849;
2850; NORMAL
2851; EXIT:
2852;
2853; ERROR
2854; EXIT:
2855;
2856; CHANGE 05/20/87 - Header added - F. G.
2857; LOG:
2858;
2859;******************* END OF SPECIFICATIONS *************************************
2860;******************** START - PSEUDOCODE ***************************************
2861;
2862; START Int_23
2863;
2864; ret
2865;
2866; END Int_23
2867;
2868;******************** END - PSEUDOCODE ***************************************
2869
2870INT_23:
2871
2872 ASSUME ds:nothing,es:nothing,ss:nothing
2873
2874 cmp [in_int_23],0 ; check for a re-entrant call
2875
2876; $if e ; If its OK ;AC000;
2877 JNE $$IF186
2878
2879 inc [in_int_23] ; make sure no more int 23's
2880 push cs
2881 pop ds
2882
2883 ASSUME ds:DG
2884
2885 push cs
2886 pop ss
2887
2888 ASSUME ss:DG
2889
2890 mov sp, offset dg:intStk ; setup local int stack
2891 cmp [PInst],2
2892
2893; $if ne ; if not installed - undo ;AC000;
2894 JE $$IF187
2895
2896 call Restore_ints ; ;AC000;
2897
2898; $else ; else - dont undo ;AC000;
2899 JMP SHORT $$EN187
2900$$IF187:
2901
2902 mov ax,0105H
2903 call IntWhileBusy ; unlock print queue (just in case)
2904
2905; $endif ; endif - undo ;AC000;
2906$$EN187:
2907
2908 mov ah,EXIT
2909 mov al,0FFH
2910 int 21h
2911
2912; $endif ; endif - its OK ;AC000;
2913$$IF186:
2914
2915 iret ;
2916
2917 BREAK <Restore_ints>
2918;******************* START OF SPECIFICATIONS ***********************************
2919;
2920; NAME: Restore_ints
2921;
2922; FUNCTION: Restore all ints used by print to original values
2923;
2924; INPUT:
2925;
2926; OUTPUT:
2927;
2928; REGISTERS USED: T.B.D.
2929; (NOT RESTORED)
2930;
2931; LINKAGE: Called from: TRANSIENT,
2932;
2933; NORMAL
2934; EXIT:
2935;
2936; ERROR
2937; EXIT:
2938;
2939; EXTERNAL
2940; REFERENCES:
2941;
2942; CHANGE 05/20/87 - Header added - F. G.
2943; LOG:
2944;
2945;******************* END OF SPECIFICATIONS *************************************
2946;******************** START - PSEUDOCODE ***************************************
2947;
2948; START Restore_ints
2949;
2950; ret
2951;
2952; END Restore_ints
2953;
2954;******************** END - PSEUDOCODE ***************************************
2955
2956 Restore_ints PROC NEAR
2957
2958 ASSUME ds:DG,es:nothing,ss:DG
2959
2960 cli
2961 mov ax,(set_interrupt_vector shl 8) or SOFTINT ; (SOFTINT)
2962 push ds
2963 lds dx,[i28vec]
2964 int 21h
2965 pop ds
2966
2967 mov ax,(set_interrupt_vector shl 8) or COMINT ; (COMINT)
2968 push ds
2969 lds dx,[i2fvec]
2970 int 21h
2971 pop ds
2972
2973 mov ax,(set_interrupt_vector shl 8) or 13h
2974 push ds
2975 lds dx,[i13vec]
2976 int 21h
2977 pop ds
2978
2979 mov ax,(set_interrupt_vector shl 8) or 15h
2980 push ds
2981 lds dx,[i15vec]
2982 int 21h
2983 pop ds
2984
2985 mov ax,(set_interrupt_vector shl 8) or 17h
2986 push ds
2987 lds dx,[i17vec]
2988 int 21h
2989 pop ds
2990
2991 mov ax,(set_interrupt_vector shl 8) or 14h
2992 push ds
2993 lds dx,[i14vec]
2994 int 21h
2995 pop ds
2996
2997 mov ax,(set_interrupt_vector shl 8) or 05h
2998 push ds
2999 lds dx,[i05vec]
3000 int 21h
3001 pop ds
3002
3003 mov ax,(set_interrupt_vector shl 8) or INTLOC ; (INTLOC)
3004 push ds
3005 lds dx,[i1cvec]
3006 int 21h
3007 pop ds
3008 sti
3009
3010 ret
3011
3012 Restore_ints ENDP
3013
3014
3015 BREAK <Parse_Input>
3016;******************* START OF SPECIFICATIONS ***********************************
3017;
3018; NAME: Parse_Input - PRINT Command Line Parser
3019;
3020; FUNCTION: Call the DOS PARSE Service Routines to process the command
3021; line. Search for valid input:
3022; - filenames (may be more than one
3023; - switches: /D:device
3024; /B:buffsize 512 to 16k - 512 default
3025; /Q:quesiz 4 to 32 - 10 default
3026; /S:timeslice 1 to 255 - 8 default
3027; /U:busytick 1 to 255 - 1 default
3028; /M:maxtick 1 to 255 - 2 default
3029; /T terminate
3030; /C cancel
3031; /P print
3032;
3033; INPUT: Current Parse parameters in the Parse_C_B
3034; [ORDINAL] - CURRENT ORDINAL VALUE
3035; [SCAN_PTR] - CURRENT SCAN POINT
3036; - DS:[SCAN_PTR] - Pionter to Parse string
3037; ES:DI - Pointer to PARMS block
3038;
3039; OUTPUT: PARSE_BUFF filled in:
3040;
3041; P_TYPE - TYPE RETURNED
3042; P_ITEM_TAG - SPACE FOR ITEM TAG
3043; P_SYN - POINTER TO LIST ENTRY
3044; P_PTR_L - SPACE FOR POINTER / VALUE - LOW
3045; P_PTR_H - SPACE FOR POINTER / VALUE - HIGH
3046;
3047; REGISTERS USED: T.B.D.
3048; (NOT RESTORED)
3049;
3050; LINKAGE: Called from: TRANSIENT, Set_Buffer and Submit_File
3051;
3052; NORMAL CF = 0
3053; EXIT:
3054;
3055; ERROR CF = 1 If user enters:
3056; EXIT: - any invalid parameter or switch
3057; - an invalid value for a valid switch
3058; AX = Parse error number
3059;
3060; EXTERNAL - System parse service routines
3061; REFERENCES:
3062;
3063; CHANGE 03/11/87 - First release - F. G.
3064; LOG:
3065;
3066;******************* END OF SPECIFICATIONS *************************************
3067;******************** START - PSEUDOCODE ***************************************
3068;
3069; START
3070; END
3071;
3072;******************** END - PSEUDOCODE ***************************************
3073
3074 Parse_Input PROC NEAR
3075
3076Syntax_Error equ 9 ; Parse syntax error
3077Parse_EOL equ 0FFh ; Parse End Of Line
3078 ;--------------------------------------
3079 ; Load appropriate registers
3080 ; from the Parse_Control_Block
3081 ;--------------------------------------
3082 ASSUME ds:DG,es:DG,ss:nothing
3083
3084 mov cx,[ORDINAL] ; CURRENT ORDINAL VALUE ;AN000;
3085 mov si,[SCAN_PTR] ; CURRENT SCAN POINT ;AN000;
3086 mov [MSG_PTR],si ; Save start in case of error ;AN000;
3087 lea di,PARMS ; ;AN000;
3088 mov dx,0 ; RESERVED ;AN000;
3089 push ds ; ;AN000;
3090 mov ax,CodeR ; ;AN000;
3091 sub ax,10h ; back up 100h to start of psp ;AN000;
3092 mov ds,ax ; DS:SI = command string in PSP ;AN000;
3093
3094 ;--------------------------------------
3095 ASSUME ds:nothing ; Call the Parse service routines
3096 ;--------------------------------------
3097
3098 ; CX - Ordinal value
3099 ; DX - zero (reserved)
3100 ; DS:SI - Pionter to Parse string
3101 ; ES:DI - Pointer to PARMS block
3102
3103 call SYSPARSE ; PARSE IT! ;AN000;
3104
3105 pop ds ; ;AN000;
3106
3107 ASSUME ds:DG
3108
3109 cmp ax,NOERROR ; no errors? ;AN000;
3110
3111; $if e ; if no errors ;AN000;
3112 JNE $$IF191
3113
3114 clc ; WE'ER DONE ;AN000;
3115
3116; $else ; else - there was an error ;AN000;
3117 JMP SHORT $$EN191
3118$$IF191:
3119
3120 cmp al,Parse_EOL ; error FFh ? ;AN000;
3121
3122; $if ne ; if not EOL ;AN000;
3123 JE $$IF193
3124
3125 cmp al,Syntax_Error ; error 1 to 9 ? ;AN000;
3126
3127; $if a ; if parse error ;AN000;
3128 JNA $$IF194
3129
3130 mov al,Syntax_Error ; Parse syntax error
3131
3132; $endif ; endif errors ;AN000;
3133$$IF194:
3134
3135 lea bx,Parse_Ret_Code
3136 xlat cs:[bx]
3137
3138; $endif ; endif errors ;AN000;
3139$$IF193:
3140
3141 stc ; SET ERROR FLAG ;AN000;
3142
3143; $endif ; endif - no error ;AN000;
3144$$EN191:
3145
3146 ret ; NORMAL RETURN TO CALLER ;AN000;
3147
3148Parse_Ret_Code label byte
3149
3150 db 0 ; Ret Code 0 - ;AC003;
3151 db 9 ; Ret Code 1 - Too many parameters ;AC003;
3152 db 9 ; Ret Code 2 - Required parameter msg ;AC003;
3153 db 3 ; Ret Code 3 - Invalid switch ;AC003;
3154 db 9 ; Ret Code 4 - Invalid keyword ;AC003;
3155 db 9 ; Ret Code 5 - (reserved) ;AC003;
3156 db 6 ; Ret Code 6 - Parm val out of range ;AC003;
3157 db 9 ; Ret Code 7 - Parameter val not allow ;AC003;
3158 db 9 ; Ret Code 8 - Parm format not correct ;AC003;
3159 db 9 ; Ret Code 9 - Invalid Parameter ;AC003;
3160
3161 Parse_Input ENDP
3162
3163
3164
3165 BREAK <DispMsg>
3166;******************* START OF SPECIFICATIONS ***********************************
3167;
3168; NAME: DispMsg - PRINT Display Transient Message Routine
3169;
3170; FUNCTION: Display the transient messages for PRINT
3171;
3172; INPUT: Al = message number
3173; Ah = class - 0 - Message Service class
3174; 1 - DOS extended error
3175; 2 - Parse error
3176; A - PRINT_R message
3177; B - PRINT_T message
3178; C - PRINT_T message with insert
3179; DS:SI = sublist
3180; D - PRINT_T message with input buffer where:
3181; ES:DI = input buffer
3182; OUTPUT: - Messages output to Output Device
3183;
3184; REGISTERS USED: CX DX
3185; (NOT RESTORED)
3186;
3187; LINKAGE: Call from PRINT_R, TRANSIENT
3188;
3189; NORMAL -
3190; EXIT:
3191;
3192; ERROR -
3193; EXIT:
3194;
3195; CHANGE 03/11/87 - First release - F. G.
3196; LOG: 09/28/87 - move back to tranient - make 'NEAR'
3197;
3198;******************* END OF SPECIFICATIONS *************************************
3199;******************** START - PSEUDOCODE ***************************************
3200;
3201; START DispMsg
3202;
3203; point to SUBLIST
3204; reset response (DL)
3205; set class to utility (DH)
3206; reset insert (CX)
3207; set output handle (BX)
3208; if CLASS requires insert
3209; load insert required
3210; endif
3211; if CLASS requires response
3212; flush keystroke buffer
3213; load response required (Dir CON in no echo)
3214; endif
3215; if CLASS is not Utility
3216; set CLASS
3217; endif
3218; call SysDispMsg to display message
3219; if error
3220; set class to DOS_error
3221; set error flag
3222; endif
3223;
3224; ret
3225;
3226; END DispMsg
3227;
3228;******************** END - PSEUDOCODE ***************************************
3229
3230 DispMsg PROC NEAR
3231
3232 ASSUME CS:DG,DS:nothing,ES:nothing,SS:nothing
3233
3234 push ds ; ;AN000;
3235 push si ; ;AN000;
3236 push cs ; called before and after relocation ;AC002;
3237 pop ds ; - don't use DG ;AC002;
3238
3239 ASSUME CS:DG,DS:DG,ES:nothing,SS:nothing
3240
3241 lea si,SUBLIST ; point to sublist ;AN000;
3242 xor dx,dx ; reset response (DL) ;AN000;
3243 dec dh ; ;AN000;
3244 xor cx,cx ; reset insert (CX) ;AN000;
3245 mov bx,STDOUT ; set output handle (BX) ;AC014;
3246
3247 cmp ah,CLASS_C ; is it CLASS C ;AN000;
3248
3249; $if e,or ; CLASS C requires insert ;AC012;
3250 JE $$LL198
3251
3252 cmp ah,DOS_Error ; is it a DOS error? ;AN012;
3253
3254; $if e ; DOS requires insert ;AN012;
3255 JNE $$IF198
3256$$LL198:
3257
3258 mov cx,offset DG:NameBuf ; set up insert pointer to NameBuf ;AN005;
3259 mov insert_ptr_off,cx ; ;AN005;
3260 push cs ; ;AN005;
3261 pop [insert_ptr_seg] ; ;AN005;
3262 cmp ah,CLASS_C ; ;AC012;
3263; $if e,and ; ;AC012;
3264 JNE $$IF199
3265 cmp al,BadNameMes ; ;AN010;
3266; $if b ; ;AN010;
3267 JNB $$IF199
3268 mov [insert_num],1 ; ;AN005;
3269; $else ; ;AN010;
3270 JMP SHORT $$EN199
3271$$IF199:
3272 mov [insert_num],0 ; ;AN010;
3273; $endif ; ;AN010;
3274$$EN199:
3275 mov cx,1 ; 1 parameter to replace ;AN005;
3276
3277; $endif ; ;AN000;
3278$$IF198:
3279
3280 cmp ah,CLASS_D ; is it CLASS D ;AN000;
3281
3282; $if e ; CLASS D requires response ;AN000;
3283 JNE $$IF203
3284
3285 ; flush keystroke buffer?
3286 mov dl,buffered_input ; load response required (INT 21h 0A) ;AN000;
3287
3288; $endif ; ;AN000;
3289$$IF203:
3290
3291 cmp ah,Parse_error
3292
3293; $if be ; if Parse or DOS error
3294 JNBE $$IF205
3295
3296 mov dh,ah
3297 mov bx,STDERR ; set output handle (BX) ;AN014;
3298
3299; $endif ;
3300$$IF205:
3301
3302; $if e ; if it is a parse error - show them
3303 JNE $$IF207
3304 ; what is wrong
3305 mov cx,[MSG_PTR] ; set up sublist offset ;AN005;
3306 mov [insert_ptr_off],cx ; ;AN005;
3307 mov cx,CodeR ; set up sublist segment (PSP) ;AN005;
3308 sub cx,10h ; ;AN005;
3309 mov [insert_ptr_seg],cx ; ;AN005;
3310 push si ; save current pointer ;AN005;
3311 push ds ; ;AN005;
3312 mov si,[SCAN_PTR] ; point to end of bad parm ;AN005;
3313 mov ds,cx ; ;AN005;
3314 mov BYTE PTR ds:[si],0 ; terminate the parameter ;AN005;
3315 pop ds ; restore current pointer ;AN005;
3316 pop si ; ;AN005;
3317 mov [insert_num],0 ; ;AN005;
3318 mov cx,1 ; 1 parameter to replace ;AN005;
3319
3320; $endif
3321$$IF207:
3322
3323 xor ah,ah ; ;AN000;
3324
3325 call SysDispMsg ; to display message ;AN002;
3326
3327; $if c ; error .................. ;AN000;
3328 JNC $$IF209
3329
3330 mov ah,DOS_error ; load error exit code ;AN000;
3331 stc ; indicate failure ;AN000;
3332
3333; $endif ; ;AN000;
3334$$IF209:
3335
3336 pop si ; ;AN000;
3337 pop ds ; ;AN000;
3338
3339 ret ; ;AN000;
3340
3341 DispMsg ENDP
3342
3343 GoDispMsg PROC FAR
3344
3345 call DispMsg ; This allows long calls form CODER ;AN000;
3346
3347 ret ; ;AN000;
3348
3349 GoDispMsg ENDP
3350
3351 BREAK <Load_R_Msg>
3352;******************* START OF SPECIFICATIONS ***********************************
3353;
3354; NAME: Load_R_Msg - PRINT Load Resident Message Routine
3355;
3356; FUNCTION: Load the PRINT resident messages into their
3357; current message buffer. Note that PRINT 'pumps' the
3358; error text out as part of the data stream. For this reason
3359; the message service code is NOT used to display RESIDENT messages.
3360;
3361; INPUT: Messages in PRINT_RM, and Message Retriver code in PRINT_TM.
3362;
3363; OUTPUT: Resident messages loaded into the resident message buffer
3364; and Message Sevices code initalized
3365;
3366; NOTE: Messages ERRO through ERR12, ERRMEST through AllCan, FATMES
3367; BADDDRVM, GOODMES and BADMES are used in place - whereever
3368; the Message retriever points to them. BADDRVM is moved directly behind
3369; FATMES.
3370;
3371; REGISTERS USED: DS:SI - points to message text
3372; (NOT RESTORED) ( AX - message # - not destroyed)
3373; ( DH - Class - not destroyed)
3374;
3375; LINKAGE: Call from TRANSIENT
3376;
3377; NORMAL CF = 0
3378; EXIT:
3379;
3380; ERROR CF = 1
3381; EXIT: AX = error number
3382;
3383; CHANGE 03/11/87 - First release - F. G.
3384; LOG: 09/28/87 - P1175 - all resident messages must be moved
3385;
3386;******************* END OF SPECIFICATIONS *************************************
3387;******************** START - PSEUDOCODE ***************************************
3388;
3389; START
3390; END
3391;
3392;******************** END - PSEUDOCODE ***************************************
3393
3394 Load_R_Msg PROC NEAR
3395
3396 ;--------------------------------------
3397 ; Load the Resident Messages
3398 ;--------------------------------------
3399 mov ax,CodeR ; ;AN000;
3400 mov es,ax ; ;AN000;
3401
3402 ASSUME DS:nothing,ES:CodeR
3403
3404 lea di,R_MES_BUFF ; set destination to resident buffer ;AN000;
3405 mov bx,OFFSET CodeR:MESBAS ; use BX as an index to MESBAS (CodeR) ;AN000;
3406
3407 ;--------------------------------------
3408 ; Move messages ERR0 thru ERR12
3409 ;--------------------------------------
3410
3411 mov ax,ERR0 ; message # 19 to start ;AN000;
3412 mov dx,(DOS_error shl 8) ; Class is DOS error ;AN000;
3413
3414; $do ; ;AN000;
3415$$DO211:
3416
3417 call MoveMes ; LOAD the message ;AN000;
3418; $leave c ; leave loop if ERROR ;AN000;
3419 JC $$EN211
3420 mov byte ptr es:[di],DOLLAR ; append a delimiter
3421 inc di ; move to next message ;AN000;
3422 inc al ; advance message # ;AN000;
3423 cmp al,ERR12 ; are we past ERR12 ? ;AN000;
3424
3425; $enddo a ; if not, do it again ;AN000;
3426 JNA $$DO211
3427$$EN211:
3428
3429; $if nc ; if no ERROR ;AN000;
3430 JC $$IF214
3431 ;--------------------------------------
3432 ; Do rocessing for ERRMEST through
3433 ; BADDRVM
3434 ;--------------------------------------
3435
3436 mov ax, errmest ; message # 3 to start ;AN000;
3437 mov dx,(CLASS_Util shl 8) ; Class is Utility ;AN000;
3438
3439; $do ; now we are past ERR12 ;AN000;
3440$$DO215:
3441
3442 call MoveMes ; LOAD the message ;AC002;
3443; $leave c ; leave loop if ERROR ;AC002;
3444 JC $$EN215
3445 inc al ; advance message # ;AC002;
3446 cmp al,BADDRVM ; are we past BADDRVM ;AC002;
3447
3448; $enddo a ; ;AN000;
3449 JNA $$DO215
3450$$EN215:
3451
3452; $endif ; endif - no error ;AN000;
3453$$IF214:
3454
3455 push cs ; ;AN000;
3456 pop es ; ;AN000;
3457 push cs ; ;AN000;
3458 pop ds ; ;AN000;
3459
3460 ASSUME DS:DG,ES:DG
3461
3462 ret ; ;AN000;
3463
3464 Load_R_Msg ENDP
3465 ;--------------------------------------
3466 ; Move the Messages into their
3467 ; final resting place
3468 ;--------------------------------------
3469MoveMes PROC NEAR
3470
3471 mov es:[bx],di ; save the pointer to this message ;AN000;
3472 call SYSGETMSG ; line up the pointer on the message ;AN000;
3473; $if nc ; if no error ;AN000;
3474 JC $$IF219
3475 ; all being well --- WE NOW HAVE---
3476 ; DS:SI - aimed at the message file
3477 ; ES:DI - aimed at the Resident Buffer
3478 ; CX - # of characters
3479 cld ; go ahead ;AN000;
3480 rep movsb ; and copy it! ;AN000;
3481 inc bx ; set up for next pointer ;AN000;
3482 inc bx ; ;AN000;
3483
3484; $endif ; endif - no error ;AN000;
3485$$IF219:
3486
3487 ret ; ;AN000;
3488
3489 MoveMes ENDP
3490
3491
3492CODE ENDS
3493
3494
3495STACK SEGMENT STACK
3496
3497 dw 100 dup(0)
3498
3499TransSize LABEL BYTE ; end of transient
3500 ; only because code is para algned
3501STACK ENDS
3502
3503 END Transient
3504 \ No newline at end of file