summaryrefslogtreecommitdiff
path: root/v4.0/src/DOS/PRINT.ASM
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--v4.0/src/DOS/PRINT.ASM199
1 files changed, 199 insertions, 0 deletions
diff --git a/v4.0/src/DOS/PRINT.ASM b/v4.0/src/DOS/PRINT.ASM
new file mode 100644
index 0000000..c2bbe55
--- /dev/null
+++ b/v4.0/src/DOS/PRINT.ASM
@@ -0,0 +1,199 @@
1; SCCSID = @(#)print.asm 1.1 85/04/10
2;
3; PFMT - formatted output. Calling sequence:
4; PUSH BP
5; PUSH fmtstr
6; MOV BP,SP
7; PUSH args
8; CALL PFMT
9; ADD SP,n
10; POP BP
11;
12; The format string contains format directives and normal output characters
13; much like the PRINTF for C. We utilize NO format widths. Special chars
14; and strings are:
15;
16; $x output a hex number
17; $s output an offset string
18; $c output a character
19; $S output a segmented string
20; $p output userid/processid
21; \t output a tab
22; \n output a CRLF
23;
24; The format string must be addressable via CS
25;
26
27Procedure PFMT,NEAR
28 SaveReg <AX,BX,DS,SI>
29 MOV AX,8007h
30 INT 2Ah
31 PUSH CS
32 POP DS
33 SUB BP,2
34 Call FMTGetArg
35 MOV SI,AX
36FmtLoop:
37 LODSB
38 OR AL,AL
39 JZ FmtDone
40 CMP AL,'$'
41 JZ FmtOpt
42 CMP AL,'\'
43 JZ FmtChr
44FmtOut:
45 CALL Out
46 JMP FmtLoop
47Out:
48 SaveReg <SI,DI,BP>
49 INT 29h
50 RestoreReg <BP,DI,SI>
51 return
52FmtDone:
53 MOV AX,8107h
54 INT 2Ah
55 RestoreReg <SI,DS,BX,AX>
56 RET
57;
58; \ leads in a special character. See what the next char is.
59;
60FmtChr: LODSB
61 OR AL,AL ; end of string
62 JZ fmtDone
63 CMP AL,'n' ; newline
64 JZ FmtCRLF
65 CMP AL,'t' ; tab
66 JNZ FmtOut
67 MOV AL,9
68 JMP FmtOut
69FmtCRLF:MOV AL,13
70 CALL Out
71 MOV AL,10
72 JMP FmtOut
73;
74; $ leads in a format specifier.
75;
76FmtOpt: LODSB
77 CMP AL,'x' ; hex number
78 JZ FmtX
79 CMP AL,'c' ; single character
80 JZ FmtC
81 CMP AL,'s' ; offset string
82 JZ FmtSoff
83 CMP AL,'S' ; segmented string
84 JZ FmtSseg
85 CMP AL,'p'
86 JZ FmtUPID
87 JMP FmtOut
88FmtX:
89 Call FMTGetArg
90 MOV BX,AX
91 CALL MNUM
92 JMP FmtLoop
93FmtC:
94 Call FmtGetArg
95 CALL Out
96 JMP FmtLoop
97FmtSoff:
98 SaveReg <SI>
99 Call FmtGetArg
100 MOV SI,AX
101 CALL fmtsout
102 RestoreReg <SI>
103 JMP FmtLoop
104FmtSSeg:
105 SaveReg <DS,SI>
106 CALL FMTGetArg
107 MOV DS,AX
108 CALL FMTGetArg
109 MOV SI,AX
110 CALL fmtsout
111 RestoreReg <SI,DS>
112 JMP FmtLoop
113FmtUPID:
114 SaveReg <DS>
115 MOV BX,0
116 MOV DS,BX
117 MOV DS,DS:[82h]
118 ASSUME DS:DOSGroup
119 MOV BX,User_ID
120 CALL MNUM
121 MOV AL,':'
122 CALL OUT
123 MOV BX,Proc_ID
124 CALL MNUM
125 RestoreReg <DS>
126 Assume DS:NOTHING
127 JMP FmtLoop
128EndProc PFMT
129
130Procedure FMTGetArg,NEAR
131 MOV AX,[BP]
132 SUB BP,2
133 return
134EndProc FMTGetArg
135
136Procedure FmtSOut,NEAR
137 LODSB
138 OR AL,AL
139 retz
140 CALL OUT
141 JMP FmtSOut
142EndProc FMTSout
143
144;
145; MOut - output a message via INT 29h
146; Inputs: BX points to bytes to output relative to CS
147; Outputs: message
148; Registers modified: BX
149Procedure MOut,Near
150 ASSUME DS:NOTHING,SS:NOTHING,ES:NOTHING
151 PUSHF
152 SaveReg <DS,SI,AX>
153 PUSH CS
154 POP DS
155 MOV SI,BX
156 Call FMTSout
157 RestoreReg <AX,SI,DS>
158 POPF
159 return
160EndProc MOut
161
162; MNum - output a number in BX
163; Inputs: BX contains a number
164; Outputs: number in hex appears on screen
165; Registers modified: BX
166
167Procedure MNum,NEAR
168 ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
169 PUSHF
170 SaveReg <ES,DI,AX,BX,CX,SI,DS>
171 PUSH SS
172 POP ES
173 SUB SP,6
174 MOV DI,SP ; p = MNumBuf;
175 SaveReg <DI>
176 MOV CX,4 ; for (i=0; i < 4; i++)
177DLoop: SaveReg <CX>
178 MOV CX,4 ; rotate(n, 4);
179 ROL BX,CL
180 RestoreReg <CX>
181 MOV AL,BL
182 AND AL,0Fh
183 ADD AL,'0'
184 CMP AL,'9'
185 JBE Nok
186 ADD AL,'A'-'0'-10
187Nok: STOSB ; *p++ = "0123456789ABCDEF"[n];
188 LOOP DLoop
189 XOR AL,AL
190 STOSB ; *p++ = 0;
191 RestoreReg <SI>
192 PUSH ES
193 POP DS
194 CALL FMTSOUT ; mout (mNumBuf);
195 ADD SP,6
196 RestoreReg <DS,SI,CX,BX,AX,DI,ES>
197 POPF
198 return
199EndProc MNum