DOS-debug
1
2;--- debug printf - all registers preserved, including flags
3;--- DEBUGR variant, compatible with 32-bit stack
4
5handle_char proc
6
7cmp al,10
8jnz @F
9mov al,13
10call @F
11mov al,10
12@@:
13push bx
14xor bx,bx
15mov ah,0Eh
16call cs:[int10vec]
17pop bx
18ret
19
20handle_char endp
21
22;--- ltob(long n, char * s, int base);
23;--- convert long to string
24;--- eax=number
25;--- ss:ebx=buffer
26;--- cx=base
27
28ltob PROC
29
30push edi
31movzx edi, cx
32mov ch,0
33cmp di,-10
34jne @F
35mov di,10
36and eax,eax
37jns @F
38neg eax
39mov ch,'-'
40@@:
41add ebx,10
42mov BYTE PTR ss:[ebx],0
43dec ebx
44@@nextdigit:
45xor edx, edx
46div edi
47add dl,'0'
48cmp dl,'9'
49jbe @F
50add dl,7+20h
51@@:
52mov ss:[ebx],dl
53dec ebx
54and eax, eax
55jne @@nextdigit
56cmp ch,0
57je @F
58mov ss:[ebx],ch
59dec ebx
60@@:
61inc ebx
62mov eax,ebx
63pop edi
64ret
65
66ltob ENDP
67
68;--- ds unused; ss unknown, may be 16- or 32-bit.
69;--- tiny model ( strings may be addressed with CS ) assumed.
70
71dprintf PROC
72
73d_esp equ <dword ptr [ebp+32+2]>
74d_ret equ <word ptr [ebp+32+2+4]>
75d_fmt equ <word ptr [ebp+32+2+4+2]>
76d_args equ <[ebp+32+2+4+2+2]>
77
78d_size equ <word ptr [ebp-2]>
79d_flag equ <byte ptr [ebp-3]>
80d_longarg equ <byte ptr [ebp-4]>
81d_fill equ <byte ptr [ebp-5]>
82d_szTmp equ <[ebp-18]>
83
84push esp
85pushf
86pushad
87mov ebp, esp
88sub esp, 18
89mov ax, ss
90lar eax, eax
91bt eax, 22
92jc @F
93movzx ebp, bp
94@@:
95lea edi, d_args
96@@L335:
97mov si, d_fmt
98nextchar:
99lodsb cs:[si]
100or al,al
101je done
102cmp al,'%'
103je formatitem
104call handle_char
105jmp nextchar
106done:
107sub edi, 2
108mov ax, d_ret
109mov ss:[edi], ax
110mov d_esp, edi
111add esp, 18
112popad
113popf
114pop esp
115ret
116
117formatitem:
118push @@L335
119xor dx,dx
120mov d_longarg,dl
121mov bl,1
122mov cl,' '
123cmp BYTE PTR cs:[si],'-'
124jne @F
125dec bx
126inc si
127@@:
128mov d_flag, bl
129cmp BYTE PTR cs:[si],'0'
130jne @F
131mov cl,'0'
132inc si
133@@:
134mov d_fill,cl
135mov bx,dx
136@@:
137lodsb cs:[si]
138cmp al, '0'
139jb numdone
140cmp al, '9'
141ja numdone
142sub al,'0'
143cbw
144imul cx,bx,10 ;cx = bx * 10
145add ax,cx
146mov bx,ax
147jmp @B
148numdone:
149dec si
150mov d_size, bx
151cmp BYTE PTR cs:[si],'l'
152jne @F
153mov d_longarg,1
154inc si
155@@:
156lodsb cs:[si]
157mov d_fmt,si
158cmp al,'x'
159je handle_x
160cmp al,'X'
161je handle_x
162cmp al,'c'
163je handle_c
164cmp al,'d'
165je handle_d
166cmp al,'i'
167je handle_i
168cmp al,'s'
169je handle_s
170cmp al,'u'
171je handle_u
172cmp al,0
173jnz @@L359
174pop ax
175jmp done
176handle_c:
177mov ax,ss:[edi]
178add edi,2
179@@L359:
180call handle_char
181retn
182
183handle_x:
184mov cx,16
185jmp @@lprt262
186handle_d:
187handle_i:
188mov cx,-10
189jmp @@lprt262
190handle_u:
191mov cx,10
192@@lprt262:
193mov ax,ss:[edi]
194add edi,2
195sub dx,dx
196cmp cx,0 ;signed or unsigned?
197jge @F
198cwd
199@@:
200cmp d_longarg,0
201je @F
202mov dx,ss:[edi]
203add edi,2
204@@:
205lea ebx, d_szTmp
206
207push dx
208push ax
209pop eax
210; invoke ltob, eax, bx, cx
211call ltob
212mov esi,eax
213.while byte ptr ss:[esi]
214lodsb ss:[esi]
215call handle_char
216.endw
217retn
218
219handle_s:
220mov si,ss:[edi]
221add edi,2
222
223output_string: ;display string at ds:si
224mov ax,si
225mov bx,d_size
226.while byte ptr cs:[si]
227inc si
228.endw
229sub si,ax
230xchg ax,si
231sub bx,ax
232.if d_flag == 1
233.while sword ptr bx > 0
234mov al, d_fill
235call handle_char
236dec bx
237.endw
238.endif
239
240.while byte ptr cs:[si]
241lodsb cs:[si]
242call handle_char
243.endw
244
245.while sword ptr bx > 0
246mov al, d_fill
247call handle_char
248dec bx
249.endw
250retn
251
252dprintf ENDP
253
254d_esp equ <>
255d_ret equ <>
256d_fmt equ <>
257d_args equ <>
258d_size equ <>
259d_flag equ <>
260d_longarg equ <>
261d_fill equ <>
262d_szTmp equ <>
263
264