|
|
1.1 root 1: .386P
2:
3: vseg equ 0b000h ;video ram segment address
4:
5: ;****************************************************************************
6: ;* *
7: ;* Procedure msout On entry ds:si -> text, terminated with 0. *
8: ;* *
9: ;* Display message on standard output, convert parameters to hex ascii or *
10: ;* decimal ascii for each �n, �n, �n in message where n=number of digits. *
11: ;* Repeat character c for �nc, where n=(number of repetitions plus 30h). *
12: ;* *
13: ;****************************************************************************
14:
15: litsg equ '�' ;next character is to be output directly
16: hexsg equ '�' ;hexadecimal conversion signal
17: decsg equ '�' ;decimal conversion signal
18: decsgn equ '�' ;decimal conversion, leading spaces suppressed
19: decsgc equ '�' ;decimal conversion, use commas
20: repsg equ '�' ;repeat character signal
21: sgchk equ '�' ;all characters below this value are literals
22:
23: msout proc near
24: pushad
25: push ds
26: push es
27: push ax
28:
29: mov ax,cs
30: mov ds,ax
31: mov es,ax
32: mov di,os iobuf ;output buffer
33: mov bx,os msval ;parameter list
34: cld
35:
36: msorc: lodsb ;read character
37: cmp al,sgchk
38: jc short msowc ;not conversion character
39:
40: cmp al,hexsg
41: jz short mscvh ;hex conversion character
42: xor dh,dh ;decimal type flag
43: cmp al,decsg
44: jz short mscvd ;decimal conversion
45: mov dh,40h ;leading space suppress, bit 6
46: cmp al,decsgn
47: jz short mscvd ;decimal, suppress leading spaces
48: shl dh,1 ;include commas, bit 7
49: cmp al,decsgc
50: jz short mscvd ;decimal with commas
51: cmp al,repsg
52: jnz short msolc ;not repeat character
53: lodsb ;get number of repeats
54: sub al,30h ;ascii zero based
55: movzx cx,al ;count
56: lodsb ;character to repeat
57: rep stosb ;expand
58: jmp short msorc
59:
60: msolc: cmp al,litsg
61: jnz short msowc ;not literal signal
62: lodsb ;no translation on character following
63:
64: msowc: stosb ;write character to buffer
65: or al,al
66: jnz short msorc ;not at end
67:
68: mov si,os iobuf
69: sub di,si ;length
70: dec di
71: ; jz msox ;what?
72: mov cx,di
73: pop di ;dest
74: ; mov ah,40h
75: ; mov bx,1 ;stdout
76: ; int 21h ;write line
77: mov ax,vseg
78: mov es,ax ;video segment
79: mov ah,7 ;attr
80: wrsc: lodsb
81: stosw
82: loop wrsc ;write ms to screen
83:
84: msox: pop es
85: pop ds
86: popad
87: ret
88:
89:
90: ; Binary to Hex Ascii Conversion
91:
92: ; ds:si->source text, es:di->output text, ds:bx->current binary parameter
93:
94: mscvh: lodsb ;read character after signal
95: dec al
96: and al,7 ;number of digits (0-7 for 1-8)
97: shl al,2 ;times bits per digit
98: movzx cx,al ;number of bits minus 4
99: mov eax,[bx] ;get parameter
100: add bx,4 ;address next parameter
101: ror eax,cl ;bits 3-0 are ms digit
102: shr cx,2
103: inc cx ;number of digits
104:
105: mshxd: mov dh,al ;save 2 digits
106: call cvhn ;convert al{3:0}
107: mov al,dh ;restore 2 digits
108: rol eax,4 ;pull up next digit
109: loop mshxd
110: jmp short msorc ;continue with text
111:
112: ; Convert Binary in al to Hex Ascii at es:[di]+
113: ; Affects: ax, di
114:
115: cvhb: cld
116: push ax ;save low digit
117: shr al,4
118: call cvhn ;convert high digit
119: pop ax ;convert low digit
120: cvhn: and al,0fh
121: or al,90h ;90-99, 9A-9F
122: daa ;90-99, 100-105
123: adc al,40h ;D0-D9, 41-46
124: daa ;130-139, 41-46
125: stosb ;store ascii 0-9, A-F
126: ret
127:
128:
129: ; Binary to Decimal Ascii Conversion
130:
131: ; ds:si->source text, es:di->output text, ds:bx->current binary parameter
132:
133: ; dh = 80h, include commas; dh = 40h, suppress leading spaces
134:
135: mscvd: lodsb ;read character after signal
136: xor ecx,ecx ;clear for use as index
137: cmp al,'w'
138: jz short msdwp ;16-bit conversion
139: cmp al,'b'
140: jnz short msdlp ;32-bit conversion
141:
142: mov 1[bx],cl ;8-bit conversion, zero high byte of low word
143: msdwp: mov 2[bx],cx ;zero high word for 8/16-bit
144: lodsb ;get next source character
145:
146: msdlp: dec al
147: and al,0fh
148: mov cl,al ;number of decimal digits (0-9 for 1-10)
149: mov ebp,[bx] ;get parameter
150: add bx,4 ;update current parameter address
151: push bx
152:
153: msdsc: sub al,3
154: jnc short msdsc ;reduce al mod 3
155: add al,3 ;add remainder
156: mov bl,al ;number of digits before first comma
157: push si ;save place in source text
158:
159: jcxz msd1 ;one digit only
160: lea si,dcval[ecx*4] ;index into 10� list for number of digits
161:
162: msdxd: std ;count downward
163: lodsd ;get 10� where n is current digit
164: cld ;count upward
165:
166: mov dl,2fh ;ascii count
167: msdxi: inc dl
168: js short msdov ;overflow
169: sub ebp,eax ;subtract 10� from parameter value
170: jnc short msdxi
171: msdov: add ebp,eax ;leave remainder
172:
173: cmp dl,3ah
174: jc short msdno ;no overflow
175: stc
176: rcr ebp,1 ;make sure it propagates
177: mov dl,'*' ;overflow character
178:
179: msdno: or dh,dl ;bits 3-0 are zero if this is a leading zero
180: test dh,0fh ;check whether all zeros so far
181: mov al,dl ;current digit
182: jnz short msdpc ;display non-leading-zero
183: mov al,' ' ;change leading zero to space
184:
185: test dh,40h
186: jnz short msdx ;skip leading spaces and commas
187:
188: msdpc: stosb ;write digit to output buffer
189:
190: or dh,dh
191: jns short msdx ;no commas
192:
193: dec bl ;decrement comma counter
194: jns short msdx ;no action until zero
195: cmp al,' '
196: jz short msdco ;leave leading space
197: mov al,','
198: msdco: stosb ;write comma to output buffer
199:
200: mov bl,2 ;reload counter
201: msdx: loop msdxd ;next digit
202: msd1: mov ax,bp ;last digit
203: cmp ax,10
204: jc short msd1n ;no overflow
205: mov al,1ah ;display *
206: msd1n: xor al,30h
207: stosb
208:
209: pop si ;restore current index in source text
210: pop bx ;restore current parameter index
211: jmp msorc ;continue with text
212:
213: align 4
214:
215: dcval equ $-4 ;10� table
216:
217: dd 10,100,1000,10000,100000,1000000
218: dd 10000000,100000000,1000000000
219:
220: msval: ;parameter list
221: mv1: dd 0
222: mv2: dd 0
223: mv3: dd 0
224: mv4: dd 0
225: mv5: dd 0
226: mv6: dd 0
227: mv7: dd 0
228: mv8: dd 0
229:
230: iobuf: db 512 dup (99h) ;output buffer
231:
232: msout endp
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.