mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 01:44:21 +00:00
3188 lines
188 KiB
Plaintext
3188 lines
188 KiB
Plaintext
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 1
|
||
|
||
1
|
||
2 title 'DDT86 1.1 10/2/81'
|
||
3 ;
|
||
4 ; modified 5/14/81 R. Silberstein
|
||
5 ; modified 6/15/81 R. Silberstein
|
||
6 ; modified 8/12/81 R. Silberstein
|
||
7 ; modified 9/6/81 R. Silberstein
|
||
8 ; modified 9/16/81 R. Silberstein
|
||
9 ; modified 10/1/81 R. Silberstein
|
||
10 ;
|
||
11 ;
|
||
12 ; *****************************************
|
||
13 ; * *
|
||
14 ; * D D T 8 0 8 6 - 8 0 8 8 *
|
||
15 ; * *
|
||
16 ; *****************************************
|
||
17 ;
|
||
18 0000 debug equ 00h ;if set, use direct bios calls for console io
|
||
19 ;
|
||
20 0100 ddt_org equ 100h ;origin of this module
|
||
21 1400 lasmorg equ ddt_org+1300h ;origin of disassembler
|
||
22 2300 asmorg equ ddt_org+2200h ;origin of assembler
|
||
23 ;
|
||
24 cseg
|
||
25 ;
|
||
26 org 005ch
|
||
27 005C fcb rb 10h
|
||
28 006C fcb2 rb 14h
|
||
29 0080 buff rb 80h
|
||
30 ;
|
||
31 org lasmorg
|
||
32 1400 B80000 disem: mov ax,0
|
||
33 1403 C20400 ret 4 ;remove parameters from stack
|
||
34 ;
|
||
35 org asmorg
|
||
36 2300 B80000 assem: mov ax,0
|
||
37 2303 C20400 ret 4 ;remove parameters from stack
|
||
38 ;
|
||
39 org ddt_org
|
||
40
|
||
41 0100 E94A01 024D jmp ddt86 ;ccp transfers control here
|
||
42 0103 E9EB02 03F1 jmp conin
|
||
43 0106 E9BB02 03C4 jmp plmconout
|
||
44 0109 E9C502 03D1 jmp plmgetline
|
||
45 010C E94B0A 0B5A jmp asment ;get here on error in assem (pl/m)
|
||
46 010F E94508 0957 jmp plmset ;assembler link to ddt set/verify
|
||
47 ;
|
||
48 0112 CDE0 bdosint: int bdosi ;this is only here for user to patch
|
||
49 ;actual bdos link gets set from here
|
||
50 0112 bdosintloc equ offset bdosint
|
||
51 0113 bdosintnum equ offset bdosint+1
|
||
52 ;
|
||
53 00E0 bdosi equ 224 ;bdos interrupt number
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 2
|
||
|
||
54
|
||
55 0060 stsize equ 96 ;stack size
|
||
56 0002 nbps equ 2 ;number of breakpoints
|
||
57 ;
|
||
58 0200 ifmask16 equ 0200h ;16-bit IF mask
|
||
59 0002 ifmask8 equ 02h ;8-bit IF mask
|
||
60 ;
|
||
61 000A lf equ 0ah ;line feed
|
||
62 000D cr equ 0dh ;carriage return
|
||
63 000D eol equ cr
|
||
64 0013 ctls equ 13h ;ascii ctl-s
|
||
65 ;
|
||
66 ; *******************************************
|
||
67 ; * *
|
||
68 ; * m e s s a g e s *
|
||
69 ; * *
|
||
70 ; *******************************************
|
||
71 ;
|
||
72 0114 20434F505952 copyright db ' COPYRIGHT (C) 1981, DIGITAL RESEARCH '
|
||
73 494748542028
|
||
74 432920313938
|
||
75 312C20444947
|
||
76 4954414C2052
|
||
77 455345415243
|
||
78 4820
|
||
79 ;
|
||
80 013A 444454383620 signon db 'DDT86 1.','1' or 80h
|
||
81 312EB1
|
||
82 ;
|
||
83 0143 2031302F3032 DATE DB ' 10/02/81 '
|
||
84 2F383120
|
||
85 014D 41D8 regname db 'A','X' or 80h
|
||
86 014F 42D8 db 'B','X' or 80h
|
||
87 0151 43D8 db 'C','X' or 80h
|
||
88 0153 44D8 db 'D','X' or 80h
|
||
89 0155 53D0 db 'S','P' or 80h
|
||
90 0157 42D0 db 'B','P' or 80h
|
||
91 0159 53C9 db 'S','I' or 80h
|
||
92 015B 44C9 db 'D','I' or 80h
|
||
93 015D 43D3 segreg db 'C','S' or 80h
|
||
94 015F 44D3 db 'D','S' or 80h
|
||
95 0161 53D3 db 'S','S' or 80h
|
||
96 0163 45D3 db 'E','S' or 80h
|
||
97 0165 49D0 db 'I','P' or 80h
|
||
98 ;
|
||
99 0167 4F444954535A flagname db 'ODITSZAPC'
|
||
100 415043
|
||
101 0170 05060708090A flagbits db 5,6,7,8,9,10,12,14,16
|
||
102 0C0E10
|
||
103 ;
|
||
104 0179 43D3 segnames db 'C','S' or 80h
|
||
105 017B 44D3 db 'D','S' or 80h
|
||
106 017D 45D3 db 'E','S' or 80h
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 3
|
||
|
||
107
|
||
108 017F 53D3 db 'S','S' or 80h
|
||
109 0181 58B1 db 'X','1' or 80h
|
||
110 0183 58B2 db 'X','2' or 80h
|
||
111 0185 58B3 db 'X','3' or 80h
|
||
112 0187 58B4 db 'X','4' or 80h
|
||
113 ;
|
||
114 0189 0D0A43414E4E closem db cr,lf,'CANNOT CLOS','E' or 80h
|
||
115 4F5420434C4F
|
||
116 53C5
|
||
117 0197 0D0A494E5355 loadm db cr,lf,'INSUFFICIENT MEMOR','Y' or 80h
|
||
118 464649434945
|
||
119 4E54204D454D
|
||
120 4F52D9
|
||
121 01AC 0D0A4E4F2053 makem db cr,lf,'NO SPAC','E' or 80h
|
||
122 504143C5
|
||
123 01B6 0D0A4D454D4F memm db cr,lf,'MEMORY REQUEST DENIE','D' or 80h
|
||
124 525920524551
|
||
125 554553542044
|
||
126 454E4945C4
|
||
127 01CD 0D0A4E4F2046 openm db cr,lf,'NO FIL','E' or 80h
|
||
128 494CC5
|
||
129 01D6 202053544152 readm db ' START EN','D' or 80h
|
||
130 542020202020
|
||
131 20454EC4
|
||
132 01E6 0D0A56455249 verm db cr,lf,'VERIFY ERROR AT',' ' or 80h
|
||
133 465920455252
|
||
134 4F52204154A0
|
||
135 01F8 0D0A4449534B writem db cr,lf,'DISK WRITE ERRO','R' or 80h
|
||
136 205752495445
|
||
137 204552524FD2
|
||
138 ;
|
||
139 ; ****************************************************
|
||
140 ; * *
|
||
141 ; * i n i t i a l i z a t i o n *
|
||
142 ; * *
|
||
143 ; ****************************************************
|
||
144 ;
|
||
145 setbdosint: ;copy vector at 0:bdosi*4 to (bdosi+1)*4
|
||
146 020A A01301 mov al,byte ptr .bdosintnum ;get bdos interrupt #
|
||
147 020D FEC0 inc al
|
||
148 020F A21E03 mov byte ptr .ddtbdosintnum,al ;ddt uses the next interrupt internally
|
||
149 0212 2AE4 sub ah,ah
|
||
150 0214 D1E0 shl ax,1
|
||
151 0216 D1E0 shl ax,1 ;bdos int # * 4
|
||
152 0218 8BF8 mov di,ax ;[di] points to new bdos interrupt vector
|
||
153 021A 8BF0 mov si,ax
|
||
154 021C 83EE04 sub si,4 ;[si] points to actual bdos interrupt vector
|
||
155 021F 1E push ds ;save ds
|
||
156 0220 2BC0 sub ax,ax
|
||
157 0222 8EC0 mov es,ax ;set es and ds to 0 to move interrupt vectors
|
||
158 0224 8ED8 mov ds,ax
|
||
159 0226 B90400 mov cx,4
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 4
|
||
|
||
160
|
||
161 0229 F3A4 rep movs al,al ;copy bdos interrupt vector to next int vector
|
||
162 022B 1F pop ds ;restore ds
|
||
163 022C C3 ret
|
||
164 ;
|
||
165 checkcmdtail: ;if command tail not empty, assume E command
|
||
166 022D BE8000 mov si,offset buff
|
||
167 0230 B400 mov ah,0
|
||
168 0232 AC lods al ;get count from command tail
|
||
169 0233 0AC0 or al,al
|
||
170 0235 7415 024C jz cctret ;nothing to do if tail empty
|
||
171 0237 3C40 cmp al,conbuffmax
|
||
172 0239 7602 023D jbe movcom
|
||
173 023B B040 mov al,conbuffmax ;truncate, if needed
|
||
174 movcom:
|
||
175 023D 8BC8 mov cx,ax ;count to [cx]
|
||
176 023F BFC311 mov di,offset conbuff
|
||
177 0242 1E push ds
|
||
178 0243 07 pop es ;point destination to ddt seg
|
||
179 0244 F3A4 rep movs al,al ;copy command tail into ddt command buff
|
||
180 0246 B00D mov al,eol
|
||
181 0248 AA stos al ;store terminator
|
||
182 0249 E84B0A 0C97 call execute ;command tail is assumed E command
|
||
183 cctret:
|
||
184 024C C3 ret
|
||
185 ;
|
||
186 ddt86:
|
||
187 024D FC cld
|
||
188 024E 8C16BD11 MOV CCPSS,SS
|
||
189 0252 8926BF11 MOV CCPSP,SP ;SAVE CCP STACK POINTER
|
||
190 0256 2E8C16B011 MOV USERSS,SS
|
||
191 025B 2E8926A411 MOV USERSP,SP ;INITIALIZE USER'S MACHINE STATE TO CCP STACK
|
||
192 ;
|
||
193 0260 9C pushf
|
||
194 0261 58 pop ax ;get flags
|
||
195 0262 250002 and ax,ifmask16 ;mask to IF bit
|
||
196 0265 88266B12 mov sysif,ah ;save system IF state
|
||
197 0269 2EA3B611 mov userfl,ax ;initialize user's flags to sysif
|
||
198 ;
|
||
199 026D 8CC8 mov ax,cs
|
||
200 026F FA cli ;entering critical region
|
||
201 0270 8ED0 mov ss,ax ;set ss = cs
|
||
202 0272 BC1013 mov sp,offset stackp ;set up stack pointer
|
||
203 0275 F6066B1202 test sysif,ifmask8 ;see if interrupts were enabled
|
||
204 027A 7401 027D jz d0 ;don't turn them on if they were off
|
||
205 027C FB sti
|
||
206 d0: ;exiting critical region
|
||
207 ;
|
||
208 027D E88AFF 020A call setbdosint ;copy vector since ddt uses bdosi+1 internally
|
||
209 ;
|
||
210 0280 F6066F12FF test savevecflag,0ffh ;ddt interrupts saved on each g/t/u?
|
||
211 0285 7503 028A jnz d1 ;if so, don't initialize here
|
||
212 0287 E8DA04 0764 call bpvect ;if not, initialize them here
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 5
|
||
|
||
213
|
||
214 d1:
|
||
215 if debug
|
||
216 ;
|
||
217 sub ax,ax
|
||
218 mov es,ax
|
||
219 mov si,bdosi * 4 + 2
|
||
220 mov ax,es:[si] ;get bdos segment
|
||
221 mov es,ax
|
||
222 mov biosentryseg,ax
|
||
223 mov di,biosentryoff
|
||
224 mov al,81h
|
||
225 stos al
|
||
226 mov al,0c3h
|
||
227 stos al
|
||
228 mov al,0h
|
||
229 stos al
|
||
230 mov al,25h
|
||
231 stos al
|
||
232 mov al,0ffh
|
||
233 stos al
|
||
234 mov al,0d3h
|
||
235 stos al
|
||
236 mov al,0cbh
|
||
237 stos al
|
||
238 ;
|
||
239 endif
|
||
240 ;
|
||
241 028A BE3A01 mov si,offset signon ;get sign on message
|
||
242 028D E8AD01 043D call printm ;and print it
|
||
243 ;
|
||
244 0290 E8A700 033A CALL VERSION
|
||
245 0293 3C30 CMP AL,30H ;SEE IF WE ARE UNDER FILE SYSTEM III (MP/M)
|
||
246 0295 B700 MOV BH,0
|
||
247 0297 7207 02A0 JC D2 ;IF EARLIER VERSION, SKIP
|
||
248 0299 B2FE MOV DL,0FEH
|
||
249 029B E8EC00 038A CALL SETERRMODE ;SO BDOS RETURNS TO DDT ON FILE ERRORS
|
||
250 029E B701 MOV BH,1
|
||
251 D2:
|
||
252 02A0 883E7112 MOV ERRMODE,BH
|
||
253 ;
|
||
254 02A4 E886FF 022D call checkcmdtail ;if non-blank, do E command
|
||
255 ;
|
||
256 ; *************************************************
|
||
257 ; * *
|
||
258 ; * w o r k i n g l o o p *
|
||
259 ; * *
|
||
260 ; *************************************************
|
||
261 ;
|
||
262 02A7 FC start: cld ;direction flag points up
|
||
263 02A8 BC1013 mov sp,offset stackp ;make sure stack is right
|
||
264 02AB E86F01 041D call crlf ;print crlf
|
||
265 02AE B02D mov al,'-' ;and prompt
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 6
|
||
|
||
266
|
||
267 02B0 E87300 0326 call conout
|
||
268 02B3 E82101 03D7 call getline ;get command line
|
||
269 02B6 E83801 03F1 call conin ;read first char
|
||
270 02B9 3C0D cmp al,eol
|
||
271 02BB 74EA 02A7 jz start
|
||
272 02BD 3C3B CMP AL,';'
|
||
273 02BF 74E6 02A7 JZ START ;IGNORE COMMENT LINES
|
||
274 02C1 2C41 sub al,'A' ;check range for valid command
|
||
275 02C3 721A 02DF jb err
|
||
276 02C5 3C19 cmp al,'Z'-'A'
|
||
277 02C7 7716 02DF ja err
|
||
278 02C9 D0E0 shl al,1 ;* 2 (2 bytes per ctable entry)
|
||
279 02CB B400 mov ah,0
|
||
280 02CD 93 xchg ax,bx
|
||
281 02CE C6066C1201 mov numreq,1 ;most commands require an argument
|
||
282 02D3 C6066D1200 mov wmode,0 ;most commands are not word mode
|
||
283 02D8 2EFF97E902 call word ptr ctable [bx] ;immed call command routine
|
||
284 02DD EBC8 02A7 jmps start ;start over
|
||
285 ;
|
||
286 err:
|
||
287 02DF E83B01 041D call crlf
|
||
288 02E2 B03F mov al,'?' ;error handler
|
||
289 02E4 E83F00 0326 call conout ;print error char
|
||
290 02E7 EBBE 02A7 jmps start ;stack maybe messed up, keep this jmp
|
||
291 ;
|
||
292 ; **************************************************
|
||
293 ; * *
|
||
294 ; * c o m m a n d j u m p t a b l e *
|
||
295 ; * *
|
||
296 ; **************************************************
|
||
297 ;
|
||
298 02E9 2F0B ctable dw assm ;assemble mnemonics
|
||
299 02EB 600B DW BLOCKCOMPARE ;COMPARE MEMORY BLOCKS
|
||
300 02ED DF02 dw err
|
||
301 02EF D60B dw display ;display memory
|
||
302 02F1 970C dw execute ;load user program for execution
|
||
303 02F3 150D dw fill ;fill memory with constant
|
||
304 02F5 5B0D dw gouser ;go to user program
|
||
305 02F7 BF0D dw hexmath ;compute hex sum and difference
|
||
306 02F9 DE0D dw ifcb ;input file control block
|
||
307 02FB DF02 dw err
|
||
308 02FD DF02 dw err
|
||
309 02FF 2E0E dw lassm ;disassemble memory
|
||
310 0301 A40E dw move ;move block
|
||
311 0303 DF02 dw err
|
||
312 0305 DF02 dw err
|
||
313 0307 DF02 dw err
|
||
314 0309 DF02 dw err
|
||
315 030B F20E dw read ;read file
|
||
316 030D 4C0F dw setmem ;set memory
|
||
317 030F A10F dw trace ;trace program execution
|
||
318 0311 D70F dw untrace ;untraced program execution
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 7
|
||
|
||
319
|
||
320 0313 DE0F dw verify ;display file info
|
||
321 0315 3010 dw write ;write memory block to disk
|
||
322 0317 E410 dw xcom ;display/alter CPU state
|
||
323 0319 DF02 dw err
|
||
324 031B DF02 dw err
|
||
325 ;
|
||
326 ; *************************************************
|
||
327 ; * *
|
||
328 ; * b d o s i n t e r f a c e *
|
||
329 ; * *
|
||
330 ; *************************************************
|
||
331 ;
|
||
332 bdos: ;this interrupt instruction is overwritten on initialization
|
||
333 ;the actual int # used is the one at bdosint: + 1
|
||
334 031E ddtbdosintnum equ offset bdos + 1
|
||
335 ;
|
||
336 031D CDE0 int bdosi
|
||
337 031F C3 ret
|
||
338 ;
|
||
339 if debug
|
||
340 ;
|
||
341 bios:
|
||
342 callf dword ptr biosentryoff
|
||
343 ret
|
||
344 ;
|
||
345 endif
|
||
346 ;
|
||
347 if debug
|
||
348 ;
|
||
349 consin:
|
||
350 mov bx,9
|
||
351 call bios
|
||
352 push ax
|
||
353 call conout
|
||
354 pop ax
|
||
355 ret
|
||
356 ;
|
||
357 endif
|
||
358 ;
|
||
359 if not debug
|
||
360 ;
|
||
361 consin:
|
||
362 0320 B101 mov cl,1
|
||
363 0322 E8F8FF 031D call bdos
|
||
364 0325 C3 ret
|
||
365 ;
|
||
366 endif
|
||
367 ;
|
||
368 if debug
|
||
369 ;
|
||
370 conout:
|
||
371 mov bx,0ch
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 8
|
||
|
||
372
|
||
373 mov cl,al
|
||
374 jmp bios
|
||
375 ;
|
||
376 endif
|
||
377 ;
|
||
378 if not debug
|
||
379 ;
|
||
380 conout:
|
||
381 0326 B102 mov cl,2
|
||
382 0328 8AD0 mov dl,al
|
||
383 032A E8F0FF 031D call bdos
|
||
384 032D C3 ret
|
||
385 ;
|
||
386 endif
|
||
387 ;
|
||
388 rdconbuff:
|
||
389 032E B10A mov cl,10
|
||
390 0330 E8EAFF 031D call bdos
|
||
391 0333 C3 ret
|
||
392 ;
|
||
393 if debug
|
||
394 ;
|
||
395 constat:
|
||
396 mov bx,6
|
||
397 jmp bios
|
||
398 ;
|
||
399 endif
|
||
400 ;
|
||
401 if not debug
|
||
402 ;
|
||
403 constat:
|
||
404 0334 B10B mov cl,11
|
||
405 0336 E8E4FF 031D call bdos
|
||
406 0339 C3 ret
|
||
407 ;
|
||
408 endif
|
||
409 ;
|
||
410 VERSION:
|
||
411 033A B10C MOV CL,12
|
||
412 033C E9DEFF 031D JMP BDOS
|
||
413 ;
|
||
414 open:
|
||
415 033F B10F mov cl,15
|
||
416 0341 E8D9FF 031D call bdos
|
||
417 0344 FEC0 inc al ;test for 0ffh returned
|
||
418 0346 7401 0349 jz openerr
|
||
419 0348 C3 ret
|
||
420 openerr:
|
||
421 0349 BECD01 mov si,offset openm
|
||
422 034C EB70 03BE jmps errm
|
||
423 ;
|
||
424 close:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 9
|
||
|
||
425
|
||
426 034E B110 mov cl,16
|
||
427 0350 E8CAFF 031D call bdos
|
||
428 0353 FEC0 inc al
|
||
429 0355 7401 0358 jz closeerr
|
||
430 0357 C3 ret
|
||
431 closeerr:
|
||
432 0358 BE8901 mov si,offset closem
|
||
433 035B EB61 03BE jmps errm
|
||
434 ;
|
||
435 delete:
|
||
436 035D B113 mov cl,19
|
||
437 035F E9BBFF 031D jmp bdos
|
||
438 ;
|
||
439 readsec:
|
||
440 0362 B114 mov cl,20
|
||
441 0364 E9B6FF 031D jmp bdos
|
||
442 ;
|
||
443 writesec:
|
||
444 0367 B115 mov cl,21
|
||
445 0369 E8B1FF 031D call bdos
|
||
446 036C 0AC0 or al,al
|
||
447 036E 7501 0371 jnz writeerr
|
||
448 0370 C3 ret
|
||
449 writeerr:
|
||
450 0371 BEF801 mov si,offset writem
|
||
451 0374 EB48 03BE jmps errm
|
||
452 ;
|
||
453 make:
|
||
454 0376 B116 mov cl,22
|
||
455 0378 E8A2FF 031D call bdos
|
||
456 037B FEC0 inc al
|
||
457 037D 7401 0380 jz makeerr
|
||
458 037F C3 ret
|
||
459 makeerr:
|
||
460 0380 BEAC01 mov si,offset makem
|
||
461 0383 EB39 03BE jmps errm
|
||
462 ;
|
||
463 setdma:
|
||
464 0385 B11A mov cl,26
|
||
465 0387 E993FF 031D jmp bdos
|
||
466 ;
|
||
467 SETERRMODE:
|
||
468 038A B12D MOV CL,45
|
||
469 038C E98EFF 031D JMP BDOS
|
||
470 ;
|
||
471 setdmab:
|
||
472 038F B133 mov cl,51
|
||
473 0391 E989FF 031D jmp bdos
|
||
474 ;
|
||
475 getmaxmem:
|
||
476 0394 B135 mov cl,53
|
||
477 0396 E884FF 031D call bdos
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 10
|
||
|
||
478
|
||
479 0399 FEC0 inc al
|
||
480 039B 740B 03A8 jz memerr
|
||
481 039D C3 ret
|
||
482 ;
|
||
483 allocabsmem:
|
||
484 039E B138 mov cl,56
|
||
485 03A0 E87AFF 031D call bdos
|
||
486 ; inc al
|
||
487 ; jz memerr
|
||
488 03A3 90 NOP
|
||
489 03A4 90 NOP
|
||
490 03A5 90 NOP
|
||
491 03A6 90 NOP ;REPLACE INC AL, JZ MEMERR
|
||
492 03A7 C3 ret
|
||
493 memerr:
|
||
494 03A8 BEB601 mov si,offset memm
|
||
495 03AB EB11 03BE jmps errm
|
||
496 ;
|
||
497 freemem:
|
||
498 03AD B139 mov cl,57
|
||
499 03AF E96BFF 031D jmp bdos
|
||
500 ;
|
||
501 load:
|
||
502 03B2 B13B mov cl,59
|
||
503 03B4 E866FF 031D call bdos
|
||
504 03B7 40 inc ax ;test for 0ffffh returned
|
||
505 03B8 7401 03BB jz loaderr
|
||
506 03BA C3 ret
|
||
507 loaderr:
|
||
508 03BB BE9701 mov si,offset loadm
|
||
509 ;
|
||
510 errm:
|
||
511 03BE E87C00 043D call printm
|
||
512 03C1 E9E3FE 02A7 jmp start
|
||
513 ;
|
||
514 plmconout:
|
||
515 03C4 55 push bp
|
||
516 03C5 8BEC mov bp,sp
|
||
517 03C7 8B4604 mov ax,4[bp]
|
||
518 03CA E859FF 0326 call conout
|
||
519 03CD 5D pop bp
|
||
520 03CE C20200 ret 2
|
||
521 ;
|
||
522 plmgetline:
|
||
523 03D1 55 push bp
|
||
524 03D2 E80200 03D7 call getline
|
||
525 03D5 5D pop bp ;restore bp for pl/m
|
||
526 03D6 C3 ret
|
||
527 ;
|
||
528 ; ****************************************************
|
||
529 ; * *
|
||
530 ; * c o n s o l e i / o r o u t i n e s *
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 11
|
||
|
||
531
|
||
532 ; * *
|
||
533 ; ****************************************************
|
||
534 ;
|
||
535 if debug
|
||
536 ;
|
||
537 ctlx:
|
||
538 mov al,'#'
|
||
539 call conout
|
||
540 call crlf
|
||
541 getline:
|
||
542 mov conptr,0
|
||
543 get0:
|
||
544 call consin
|
||
545 cmp al,3
|
||
546 jz ctlc
|
||
547 cmp al,8
|
||
548 jz backsp
|
||
549 cmp al,24 ;ctl-x
|
||
550 jz ctlx
|
||
551 cmp al,cr
|
||
552 jz getlinedone
|
||
553 cmp conptr,conbuffmax
|
||
554 jnb getlinedone
|
||
555 mov di,offset conbuff ;normal character store
|
||
556 add di,conptr
|
||
557 mov [di],al
|
||
558 inc conptr
|
||
559 jmps get0
|
||
560 getlinedone:
|
||
561 mov di,offset conbuff
|
||
562 add di,conptr
|
||
563 mov byte ptr [di],eol
|
||
564 mov conptr,0
|
||
565 ret
|
||
566 backsp:
|
||
567 cmp conptr,0
|
||
568 jz get0
|
||
569 dec conptr
|
||
570 call blank
|
||
571 mov al,8
|
||
572 call conout
|
||
573 jmps get0
|
||
574 ctlc:
|
||
575 mov cl,0
|
||
576 mov dl,0
|
||
577 jmp bdos
|
||
578 ;
|
||
579 endif
|
||
580 ;
|
||
581 if not debug
|
||
582 ;
|
||
583 getline:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 12
|
||
|
||
584
|
||
585 03D7 BAC111 mov dx,offset conbuffhdr
|
||
586 03DA E851FF 032E call rdconbuff
|
||
587 03DD 8A1EC211 mov bl,conbuffcnt
|
||
588 03E1 B700 mov bh,0
|
||
589 03E3 81C3C311 add bx,offset conbuff
|
||
590 03E7 C6070D mov byte ptr [bx], eol
|
||
591 03EA C70604120000 mov conptr,0
|
||
592 03F0 C3 ret
|
||
593 ;
|
||
594 endif
|
||
595 ;
|
||
596 conin:
|
||
597 03F1 BEC311 mov si,offset conbuff
|
||
598 03F4 03360412 add si,conptr
|
||
599 03F8 AC lods al
|
||
600 03F9 FF060412 inc conptr
|
||
601 ;fall thru to upper
|
||
602 03FD 3C61 upper: cmp al,'a' ;less than 'a'
|
||
603 03FF 7206 0407 jb upret ;or
|
||
604 0401 3C7A cmp al,'z' ;greater than 'z'
|
||
605 0403 7702 0407 ja upret ;then no change
|
||
606 0405 245F and al,5fh ;else convert to uc
|
||
607 0407 C3 upret: ret
|
||
608 ;
|
||
609 ctlchek: ;check for ctl-s, ctl-q and ctl-c
|
||
610 0408 E829FF 0334 call constat ;keypress?
|
||
611 040B 0AC0 or al,al ;zero?
|
||
612 040D 740D 041C jz ctlexit ;no keypress so return
|
||
613 040F E80EFF 0320 call consin ;if keypress then get the data
|
||
614 0412 3C13 cmp al,ctls ;check for ctl-s
|
||
615 0414 7403 0419 jz kwait
|
||
616 0416 E98EFE 02A7 jmp start ;any other key will restart
|
||
617 0419 E804FF 0320 kwait: call consin ;if ctl-s then wait for another keypress
|
||
618 ctlexit:
|
||
619 041C C3 ret
|
||
620 ;
|
||
621 crlf:
|
||
622 041D B00D mov al,cr ;send cr and lf to console
|
||
623 041F E804FF 0326 call conout
|
||
624 0422 B00A mov al,lf
|
||
625 0424 E8FFFE 0326 call conout
|
||
626 0427 C3 ret
|
||
627 ;
|
||
628 CRLFCHK: ;DO CRLF AND CHECK FOR ABORT
|
||
629 0428 E8F2FF 041D CALL CRLF
|
||
630 042B E8DAFF 0408 CALL CTLCHEK
|
||
631 042E C3 RET
|
||
632 ;
|
||
633 blank: ;print a blank.
|
||
634 042F B020 mov al,' '
|
||
635 0431 E8F2FE 0326 call conout
|
||
636 0434 C3 ret
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 13
|
||
|
||
637
|
||
638 ;
|
||
639 tabs: ;print # blanks in cx
|
||
640 0435 51 push cx
|
||
641 0436 E8F6FF 042F call blank
|
||
642 0439 59 pop cx
|
||
643 043A E2F9 0435 loop tabs
|
||
644 043C C3 ret
|
||
645 ;
|
||
646 printm: ;print the message at [si] on console
|
||
647 ;end of message indicated by parity set.
|
||
648 043D AC lods al ;get a byte
|
||
649 043E A880 test al,80h ;check for end of message
|
||
650 0440 7507 0449 jnz pquit ;quit if parity set
|
||
651 0442 56 push si
|
||
652 0443 E8E0FE 0326 call conout ;otherwise display byte
|
||
653 0446 5E pop si
|
||
654 0447 EBF4 043D jmps printm ;print more message
|
||
655 pquit:
|
||
656 0449 247F and al,7fh ;strip parity
|
||
657 044B E8D8FE 0326 call conout ;print last byte
|
||
658 044E C3 ret
|
||
659 ;
|
||
660 ascout: ;output [al] in ascii
|
||
661 044F 3C20 cmp al,' '
|
||
662 0451 7204 0457 jb perout ;less than blank?
|
||
663 0453 3C7E cmp al,7eh
|
||
664 0455 7602 0459 jna ascend
|
||
665 perout:
|
||
666 0457 B02E mov al,'.' ;output '.'
|
||
667 ascend:
|
||
668 0459 E8CAFE 0326 call conout ;else output ascii
|
||
669 045C C3 ret
|
||
670 ;
|
||
671 print8or16: ;print byte or word at es:[si] depending on wmode
|
||
672 045D 268B04 mov ax,es:[si]
|
||
673 0460 F6066D1201 test wmode,1
|
||
674 0465 7415 047C jz printbyte
|
||
675 0467 EB0C 0475 jmps printword
|
||
676 ;
|
||
677 printdword: ;print double word as ssss:oooo
|
||
678 ; called with:
|
||
679 ; es = segment
|
||
680 ; di = offset
|
||
681 0469 57 push di
|
||
682 046A 8CC0 mov ax,es
|
||
683 046C E80600 0475 call printword ;print segment
|
||
684 046F B03A mov al,':'
|
||
685 0471 E8B2FE 0326 call conout
|
||
686 0474 58 pop ax
|
||
687 ;
|
||
688 printword: ;print value in [ax] as 4 hex digits
|
||
689 0475 50 push ax
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 14
|
||
|
||
690
|
||
691 0476 8AC4 mov al,ah
|
||
692 0478 E80100 047C call printbyte
|
||
693 047B 58 pop ax
|
||
694 ;
|
||
695 printbyte: ;print value in [al] as 2 hex digits
|
||
696 047C 50 push ax
|
||
697 047D B104 mov cl,4
|
||
698 047F D2E8 shr al,cl ;shift al right 4 places
|
||
699 0481 E80100 0485 call printnibble ;output upper nibble
|
||
700 0484 58 pop ax ;restore al (now we do lower nibble)
|
||
701 ;
|
||
702 printnibble: ;print value in low 4 bits of [al] as a hex digit
|
||
703 0485 240F and al,0fh ;mask upper 4 bits
|
||
704 0487 0490 add al,90h
|
||
705 0489 27 daa
|
||
706 048A 1440 adc al,40h
|
||
707 048C 27 daa
|
||
708 048D E896FE 0326 call conout
|
||
709 0490 C3 ret
|
||
710 ;
|
||
711 ; **************************************
|
||
712 ; * *
|
||
713 ; * file name parsing routines *
|
||
714 ; * *
|
||
715 ; **************************************
|
||
716 ;
|
||
717 parse: ;parse into fcb whose offset is in [di]
|
||
718 0491 0E push cs
|
||
719 0492 07 pop es ;set es=cs
|
||
720 0493 57 push di ;save fcb address
|
||
721 0494 2AC0 sub al,al
|
||
722 0496 B92400 mov cx,36 ;fcblen
|
||
723 0499 F3AA rep stos al ;initialize fcb to 0
|
||
724 049B 5F pop di ;restore fcb address
|
||
725 ;
|
||
726 parse2: ;enter here to parse without clearing
|
||
727 ;assumes es = cs from parse:
|
||
728 049C 893EAE12 mov fcbadr,di ;save fcb address
|
||
729 04A0 47 inc di ;point to first byte of filename
|
||
730 04A1 E82200 04C6 call setupdisk ;check for d: and set drive byte
|
||
731 04A4 B90800 mov cx,8
|
||
732 04A7 E84B00 04F5 call fillfield ;first item was disk, now get filename
|
||
733 04AA B90300 mov cx,3 ;length of file type
|
||
734 04AD 803EAD122E cmp lastchar,'.'
|
||
735 04B2 7405 04B9 jz filltype
|
||
736 04B4 E86000 0517 call fillbl ;fill type with blanks if no '.'
|
||
737 04B7 EB03 04BC jmps parseret
|
||
738 filltype:
|
||
739 04B9 E83900 04F5 call fillfield ;if '.', fill field from console buff
|
||
740 parseret:
|
||
741 04BC E85F00 051E call scanq ;count '?'s in fcb
|
||
742 04BF A0AD12 mov al,lastchar
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 15
|
||
|
||
743
|
||
744 04C2 C3 ret ;with last char scanned in [al]
|
||
745 parseerr:
|
||
746 04C3 E919FE 02DF jmp err
|
||
747 ;
|
||
748 setupdisk: ;set byte 0 of fcb according to char in fcb (1)
|
||
749 04C6 E828FF 03F1 call conin
|
||
750 04C9 A2AD12 mov lastchar,al
|
||
751 04CC 3C20 cmp al,' '
|
||
752 04CE 74F6 04C6 jz setupdisk ;deblank input
|
||
753 04D0 3C0D cmp al,eol
|
||
754 04D2 7413 04E7 jz s1 ;can't be drive, decrement conptr to rescan
|
||
755 04D4 E81AFF 03F1 call conin
|
||
756 04D7 3C3A cmp al,':'
|
||
757 04D9 7508 04E3 jnz s0 ;not a drive, subtract 2 from conptr to rescan
|
||
758 04DB A0AD12 mov al,lastchar ;get drive char
|
||
759 04DE 2C40 sub al,'A'-1
|
||
760 04E0 4F dec di ;point to fcb (0)
|
||
761 04E1 AA stos al ;store drive byte
|
||
762 04E2 C3 ret
|
||
763 s0:
|
||
764 04E3 FF0E0412 dec conptr
|
||
765 s1:
|
||
766 04E7 FF0E0412 dec conptr
|
||
767 04EB C3 ret
|
||
768 ;
|
||
769 pdelim: ;check char in [al] for delimiter; return ZF if so.
|
||
770 04EC BFA212 mov di,offset delims
|
||
771 04EF B90B00 mov cx,ndelims
|
||
772 04F2 F2AE repnz scas al ;look in table
|
||
773 04F4 C3 ret
|
||
774 ;
|
||
775 fillfield: ;count in [cx], dest ptr in [di]
|
||
776 04F5 E8F9FE 03F1 call conin
|
||
777 04F8 A2AD12 mov lastchar,al ;save last char scanned
|
||
778 04FB 3C2A cmp al,'*'
|
||
779 04FD 7505 0504 jnz notast
|
||
780 04FF E81100 0513 call fillq ;fill with '?'
|
||
781 0502 EBF1 04F5 jmps fillfield ;continue till delimiter
|
||
782 notast:
|
||
783 0504 57 push di
|
||
784 0505 51 push cx
|
||
785 0506 E8E3FF 04EC call pdelim
|
||
786 0509 59 pop cx
|
||
787 050A 5F pop di
|
||
788 050B 740A 0517 jz fillbl ;if delimiter, fill field with ' '
|
||
789 050D E3B4 04C3 jcxz parseerr ;error if count exceeded
|
||
790 050F AA stos al ;store char in fcb
|
||
791 0510 49 dec cx ;decrement count
|
||
792 0511 EBE2 04F5 jmps fillfield
|
||
793 fillq:
|
||
794 0513 B03F mov al,'?'
|
||
795 0515 EB02 0519 jmps fillx
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 16
|
||
|
||
796
|
||
797 fillbl:
|
||
798 0517 B020 mov al,' '
|
||
799 fillx:
|
||
800 0519 E302 051D jcxz filldone
|
||
801 051B F3AA rep stos al ;store '?' or ' '
|
||
802 filldone:
|
||
803 051D C3 ret
|
||
804 ;
|
||
805 scanq: ;count '?'s in fcb, return ZF set if found
|
||
806 051E 8B3EAE12 mov di,fcbadr
|
||
807 0522 47 inc di ;point to first char of filename
|
||
808 0523 B90B00 mov cx,11 ;11 chars to check
|
||
809 0526 B03F mov al,'?'
|
||
810 0528 F2AE repnz scas al
|
||
811 052A C3 ret
|
||
812 ;
|
||
813 ; ***********************************
|
||
814 ; * *
|
||
815 ; * user CPU state routines *
|
||
816 ; * *
|
||
817 ; ***********************************
|
||
818 ;
|
||
819 chkreg: ;if reg name in [ax] is valid, return with
|
||
820 ;register number in regnum
|
||
821 ;else go to error processor
|
||
822 052B B90E00 mov cx,totreg+1 ;number of names to check + 1
|
||
823 052E BF4D01 mov di,offset regname
|
||
824 0531 0E push cs
|
||
825 0532 07 pop es
|
||
826 0533 F2AF repnz scas ax
|
||
827 0535 E320 0557 jcxz checkerr ;not a valid reg name
|
||
828 0537 BA0D00 mov dx,totreg
|
||
829 053A 2BD1 sub dx,cx
|
||
830 053C 89165512 mov regnum,dx ;save reg number
|
||
831 0540 C3 ret
|
||
832 ;
|
||
833 checkflag: ;check for valid flag name
|
||
834 0541 B90A00 mov cx,nflag+1 ;number of names to check + 1
|
||
835 0544 BF6701 mov di,offset flagname
|
||
836 0547 0E push cs
|
||
837 0548 07 pop es
|
||
838 0549 F2AE repnz scas al
|
||
839 054B E30A 0557 jcxz checkerr ;not a valid flag name
|
||
840 054D BA0900 mov dx,nflag
|
||
841 0550 2BD1 sub dx,cx
|
||
842 0552 89165512 mov regnum,dx ;save flag number
|
||
843 0556 C3 ret
|
||
844 ;
|
||
845 checkerr:
|
||
846 0557 E985FD 02DF jmp err
|
||
847 ;
|
||
848 setreg: ;set reg whose number is in [cx] to value in [ax]
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 17
|
||
|
||
849
|
||
850 055A BE9C11 mov si,offset userreg
|
||
851 055D 03F1 add si,cx
|
||
852 055F 03F1 add si,cx
|
||
853 0561 8904 mov [si],ax
|
||
854 0563 C3 ret
|
||
855 ;
|
||
856 printflags: ;print values of flags
|
||
857 0564 B90000 mov cx,0
|
||
858 pf0:
|
||
859 0567 51 push cx ;save count
|
||
860 0568 E84B00 05B6 call printflag
|
||
861 056B 59 pop cx
|
||
862 056C 41 inc cx
|
||
863 056D 83F909 cmp cx,9
|
||
864 0570 72F5 0567 jb pf0
|
||
865 0572 C3 ret
|
||
866 ;
|
||
867 setflag: ;set flag whose # is in [cx] to value in [bx]
|
||
868 0573 BE7001 mov si,offset flagbits
|
||
869 0576 03F1 add si,cx
|
||
870 0578 AC lods al
|
||
871 0579 8AC8 mov cl,al
|
||
872 057B B8FEFF mov ax,0fffeh
|
||
873 057E D3C8 ror ax,cl
|
||
874 0580 D3CB ror bx,cl
|
||
875 0582 2E2106B611 and userfl,ax
|
||
876 0587 2E091EB611 or userfl,bx
|
||
877 058C C3 ret
|
||
878 ;
|
||
879 printflagname: ;print flag name whose # is in [cx]
|
||
880 058D BE6701 mov si,offset flagname
|
||
881 0590 03F1 add si,cx
|
||
882 0592 AC lods al ;get flag name
|
||
883 0593 E890FD 0326 call conout
|
||
884 0596 C3 ret
|
||
885 ;
|
||
886 getflag: ;check flag whose # is in [cx]
|
||
887 ;return with ZF set if flag is set
|
||
888 0597 B80100 mov ax,1
|
||
889 059A BE7001 mov si,offset flagbits
|
||
890 059D 03F1 add si,cx
|
||
891 059F 8A0C mov cl,[si] ;get flagbits (flagnum)
|
||
892 05A1 D3C8 ror ax,cl ;get mask into position
|
||
893 05A3 2E2306B611 and ax,userfl ;see if bit set in CPU state
|
||
894 05A8 C3 ret
|
||
895 ;
|
||
896 printflagval: ;print value of flag (as 0 or 1) whose # is in [cx]
|
||
897 05A9 E8EBFF 0597 call getflag
|
||
898 05AC B030 mov al,'0'
|
||
899 05AE 7402 05B2 jz pf2 ;if flag not set, print '0'
|
||
900 05B0 B031 mov al,'1' ;else print '1'
|
||
901 pf2:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 18
|
||
|
||
902
|
||
903 05B2 E871FD 0326 call conout
|
||
904 05B5 C3 ret
|
||
905 ;
|
||
906 printflag: ;print flag (as flagname of '-') whose # is in [cx]
|
||
907 05B6 BE6701 mov si,offset flagname
|
||
908 05B9 03F1 add si,cx ;point to flag name
|
||
909 05BB FF34 push word ptr [si] ;save flag char
|
||
910 05BD E8D7FF 0597 call getflag
|
||
911 05C0 58 pop ax ;get flag char
|
||
912 05C1 7502 05C5 jnz pname ;if flag set, use flag char
|
||
913 05C3 B02D mov al,'-' ;else print hyphen
|
||
914 pname:
|
||
915 05C5 E85EFD 0326 call conout
|
||
916 05C8 C3 ret
|
||
917 ;
|
||
918 PREG1: ;PRINT FIRST 6 REGISTER NAMES (FOR 40 COLUMNS)
|
||
919 05C9 B90000 MOV CX,0
|
||
920 05CC C606531206 MOV NREG,6
|
||
921 05D1 EB0D 05E0 JMPS PR0
|
||
922 PREG2: ;PRINT NEXT 7 REGISTER NAMES (FOR 40 COLUMNS)
|
||
923 05D3 B90600 MOV CX,6
|
||
924 05D6 EB03 05DB JMPS PR00
|
||
925 printregs: ;print register values
|
||
926 05D8 B90000 mov cx,0
|
||
927 PR00:
|
||
928 05DB C60653120D MOV NREG,13
|
||
929 pr0:
|
||
930 05E0 E82900 060C call testregcl ;see if reg should be printed
|
||
931 05E3 7308 05ED jnb pr2 ;don't print if carry not set
|
||
932 05E5 51 push cx
|
||
933 05E6 E80C00 05F5 call printregval
|
||
934 05E9 E843FE 042F call blank
|
||
935 05EC 59 pop cx
|
||
936 pr2:
|
||
937 05ED 41 inc cx
|
||
938 05EE 3A0E5312 CMP CL,NREG
|
||
939 05F2 72EC 05E0 jb pr0
|
||
940 05F4 C3 ret
|
||
941 ;
|
||
942 printregval: ;print value of reg whose # is in [cx]
|
||
943 05F5 BE9C11 mov si,offset userreg
|
||
944 05F8 03F1 add si,cx
|
||
945 05FA 03F1 add si,cx
|
||
946 05FC AD lods ax
|
||
947 05FD E875FE 0475 call printword
|
||
948 0600 C3 ret
|
||
949 ;
|
||
950 printregname: ;print name of reg whose # is in [cx]
|
||
951 0601 BE4D01 mov si,offset regname
|
||
952 0604 03F1 add si,cx
|
||
953 0606 03F1 add si,cx
|
||
954 0608 E832FE 043D call printm
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 19
|
||
|
||
955
|
||
956 060B C3 ret
|
||
957 ;
|
||
958 testregcl: ;see if reg whose # is in [cl] should be printed
|
||
959 ;return with carry set if so
|
||
960 060C F6065412FF test segflag,0ffh
|
||
961 0611 7509 061C jnz printit ;print all reg's if segflag set
|
||
962 0613 80F90B cmp cl,11 ;otherwise, see if [cl] has seg reg #
|
||
963 0616 7704 061C ja printit
|
||
964 0618 80F908 cmp cl,8
|
||
965 061B C3 ret
|
||
966 printit:
|
||
967 061C F9 stc
|
||
968 061D C3 ret
|
||
969 ;
|
||
970 SETUPHDR:
|
||
971 061E E8FCFD 041D call crlf
|
||
972 0621 B90B00 mov cx,11
|
||
973 0624 E80EFE 0435 call tabs ;leave space for flags
|
||
974 0627 B90000 mov cx,0
|
||
975 062A C3 RET
|
||
976 ;
|
||
977 PREGHDR1: ;PRINT HEADER FOR FIRST 6 REGS (FOR 40 COL)
|
||
978 062B E8F0FF 061E CALL SETUPHDR
|
||
979 062E C606531206 MOV NREG,6
|
||
980 0633 EB10 0645 JMPS PRH0
|
||
981 PREGHDR2: ;PRINT HEADER FOR NEXT 7 REGISTERS
|
||
982 0635 E8F7FD 042F CALL BLANK
|
||
983 0638 B90600 MOV CX,6
|
||
984 063B EB03 0640 JMPS PRH00
|
||
985 printregheader: ;print header for registers
|
||
986 063D E8DEFF 061E CALL SETUPHDR
|
||
987 PRH00:
|
||
988 0640 C60653120D MOV NREG,13
|
||
989 prh0:
|
||
990 0645 E8C4FF 060C call testregcl ;see if reg should be printed
|
||
991 0648 730B 0655 jnb prh1 ;don't print if carry not set
|
||
992 064A 51 push cx
|
||
993 064B E8B3FF 0601 call printregname
|
||
994 064E B90300 mov cx,3
|
||
995 0651 E8E1FD 0435 call tabs
|
||
996 0654 59 pop cx
|
||
997 prh1:
|
||
998 0655 41 inc cx
|
||
999 0656 3A0E5312 CMP CL,NREG
|
||
1000 065A 72E9 0645 jb prh0
|
||
1001 065C C3 ret
|
||
1002 ;
|
||
1003 printinstr: ;disassemble instruction at [cs:ip]
|
||
1004 065D 2E8E06AC11 mov es,usercs
|
||
1005 0662 2E8B36B411 mov si,userip
|
||
1006 0667 F6063912FF test disempresent,0ffh
|
||
1007 066C 7410 067E jz pi1
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 20
|
||
|
||
1008
|
||
1009 066E 06 push es
|
||
1010 066F 56 push si
|
||
1011 0670 F6065412FF test segflag,0ffh
|
||
1012 0675 7403 067A jz pi0
|
||
1013 0677 E8A3FD 041D call crlf
|
||
1014 pi0:
|
||
1015 067A E8830D 1400 call disem
|
||
1016 067D C3 ret
|
||
1017 pi1:
|
||
1018 067E 268A04 mov al,es:[si]
|
||
1019 0681 E8F8FD 047C call printbyte
|
||
1020 0684 C3 ret
|
||
1021 ;
|
||
1022 printseginfo: ;print name, start and end address of segment whose
|
||
1023 ;number is in [al] if length is non-zero.
|
||
1024 0685 8AC8 mov cl,al ;save seg number
|
||
1025 0687 B306 mov bl,6
|
||
1026 0689 F6E3 mul bl ;6 bytes per segment in base page
|
||
1027 068B 057212 add ax,offset basepagesave
|
||
1028 068E 8BF0 mov si,ax ;si now points to entry in base page
|
||
1029 0690 AD lods ax ;get low 16 bits of length
|
||
1030 0691 8BD8 mov bx,ax ;save in bx
|
||
1031 0693 AC lods al ;get high nibble of length
|
||
1032 0694 8AD0 mov dl,al ;save it
|
||
1033 0696 B400 mov ah,0
|
||
1034 0698 0BC3 or ax,bx ;test for zero length
|
||
1035 069A 7430 06CC jz psiret ;if zero, no display
|
||
1036 069C AD lods ax ;get base
|
||
1037 069D 53 push bx ;save low (length)
|
||
1038 069E 52 push dx ;save high (length)
|
||
1039 069F 50 push ax ;save base
|
||
1040 06A0 B500 mov ch,0 ;zero high byte of segment #
|
||
1041 06A2 D1E1 shl cx,1 ;* 2 (2 bytes per segment name)
|
||
1042 06A4 81C17901 add cx,offset segnames ;cx now points to segment name
|
||
1043 06A8 51 push cx ;save it
|
||
1044 06A9 E871FD 041D call crlf
|
||
1045 06AC 5E pop si
|
||
1046 06AD E88DFD 043D call printm ;print segment name
|
||
1047 06B0 E87CFD 042F call blank
|
||
1048 06B3 07 pop es ;get base
|
||
1049 06B4 06 push es ;save base
|
||
1050 06B5 BF0000 mov di,0
|
||
1051 06B8 E8AEFD 0469 call printdword ;print start address
|
||
1052 06BB E871FD 042F call blank
|
||
1053 06BE 5B pop bx ;get base
|
||
1054 06BF 58 pop ax ;get high (len)
|
||
1055 06C0 B10C mov cl,12
|
||
1056 06C2 D3E0 shl ax,cl ;move ls nibble of al to ms nibble of ah
|
||
1057 06C4 03C3 add ax,bx ;add ms nibble of length to base
|
||
1058 06C6 8EC0 mov es,ax
|
||
1059 06C8 5F pop di ;get low (len)
|
||
1060 06C9 E89DFD 0469 call printdword ;print end address
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 21
|
||
|
||
1061
|
||
1062 psiret:
|
||
1063 06CC C3 ret
|
||
1064 ;
|
||
1065 setcpustate: ;set users regs after E command
|
||
1066 06CD A1BD11 MOV AX,CCPSS
|
||
1067 06D0 2EA3B011 MOV USERSS,AX
|
||
1068 06D4 A1BF11 MOV AX,CCPSP
|
||
1069 06D7 2EA3A411 MOV USERSP,AX ;RESET USER STACK POINTER TO CCP STACK
|
||
1070 06DB 8BC3 mov ax,bx ;get ds base in [ax] (returned from bdos load)
|
||
1071 06DD 2EA3AE11 mov userds,ax ;set user's ds
|
||
1072 06E1 2EA3AC11 mov usercs,ax
|
||
1073 06E5 2EA3B211 mov useres,ax
|
||
1074 06E9 A35A12 mov type1seg,ax
|
||
1075 06EC A35E12 mov type2seg,ax
|
||
1076 06EF 8EC0 mov es,ax
|
||
1077 06F1 26F606050001 test es:byte ptr .5, 1 ;test 8080 flag
|
||
1078 06F7 7405 06FE jz not8080
|
||
1079 06F9 B80001 mov ax,100h ;default for userip, lasloc, disloc
|
||
1080 06FC EB2D 072B jmps setdone
|
||
1081 not8080:
|
||
1082 06FE 26A10300 mov ax,es:.3 ;get cs base
|
||
1083 0702 2EA3AC11 mov usercs,ax
|
||
1084 0706 A35A12 mov type1seg,ax
|
||
1085 0709 26A10F00 mov ax,es:.15 ;get es base
|
||
1086 070D 0BC0 or ax,ax
|
||
1087 070F 7404 0715 jz sc1
|
||
1088 0711 2EA3B211 mov useres,ax ;set it if there was one
|
||
1089 sc1:
|
||
1090 0715 26A11500 mov ax,es:.21 ;get ss base
|
||
1091 0719 0BC0 or ax,ax
|
||
1092 071B 740E 072B jz setdone
|
||
1093 071D 2EA3B011 mov userss,ax ;set it if there was one
|
||
1094 0721 26A11200 mov ax,es:.18 ;get stack length
|
||
1095 0725 2EA3A411 mov usersp,ax ;set user's sp
|
||
1096 0729 2BC0 sub ax,ax ;userip, lasloc, disloc = 0 for non-8080 model
|
||
1097 setdone:
|
||
1098 072B 2EA3B411 mov userip,ax
|
||
1099 072F A33112 mov lasloc,ax
|
||
1100 0732 C3 ret
|
||
1101 ;
|
||
1102 ; *********************************************
|
||
1103 ; * *
|
||
1104 ; * breakpoint/single step procedures *
|
||
1105 ; * *
|
||
1106 ; *********************************************
|
||
1107 ;
|
||
1108 setbp: ;set breakpoint at address stored in dword at [di]
|
||
1109 0733 C435 les si,[di] ;point [es]:[si] to breakpoint location
|
||
1110 0735 B0CC mov al,0cch ;int 3 instruction
|
||
1111 0737 268604 xchg al,es:[si] ;set breakpoint and fetch instruction
|
||
1112 073A 884504 mov 4[di],al ;save user instruction in breakpoint table
|
||
1113 073D FE062612 inc bpcnt ;increment breakpoint count
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 22
|
||
|
||
1114
|
||
1115 0741 C3 ret
|
||
1116 ;
|
||
1117 bpclear: ;clear breakpoint table
|
||
1118 0742 2BC9 sub cx,cx
|
||
1119 0744 8A0E2612 mov cl,bpcnt ;get # of bp's to clear
|
||
1120 0748 BE2712 mov si,offset brk1loc ;point to bp table
|
||
1121 bpcloop:
|
||
1122 074B E30F 075C jcxz bpend ;0..quit
|
||
1123 074D AD lods ax ;get bp offset
|
||
1124 074E 50 push ax ;save it
|
||
1125 074F AD lods ax ;get bp segment
|
||
1126 0750 8EC0 mov es,ax
|
||
1127 0752 AC lods al ;get inst byte
|
||
1128 0753 5F pop di ;get bp offset
|
||
1129 0754 AA stos al ;store user instruction back
|
||
1130 0755 E2F4 074B loop bpcloop
|
||
1131 0757 C606261200 mov bpcnt,0 ;zero bp counter
|
||
1132 075C C3 bpend: ret
|
||
1133 ;
|
||
1134 BPV:
|
||
1135 075D F6066F12FF TEST SAVEVECFLAG,0FFH
|
||
1136 0762 741C 0780 JZ BPVECTRET
|
||
1137 bpvect: ;set up breakpoint/single step vectors
|
||
1138 0764 E81A00 0781 call savevect
|
||
1139 0767 BA0000 mov dx,0
|
||
1140 076A 8EC2 mov es,dx ;make sure dest is absolute 0
|
||
1141 076C BF0400 mov di,4 ;set up single step vector
|
||
1142 076F B8DF07 mov ax,offset ssentry ;single step entry point
|
||
1143 0772 AB stos ax ;save at ss vector
|
||
1144 0773 8CC8 mov ax,cs
|
||
1145 0775 AB stos ax ;save cs
|
||
1146 0776 BF0C00 mov di,12 ;set up breakpoint vector
|
||
1147 0779 B8D707 mov ax,offset breakentry ;set up bp vector
|
||
1148 077C AB stos ax ;save at bp vector
|
||
1149 077D 8CC8 mov ax,cs
|
||
1150 077F AB stos ax ;save cs
|
||
1151 BPVECTRET:
|
||
1152 0780 C3 ret
|
||
1153 ;
|
||
1154 savevect: ;save previous contents of 0:4 thru 0:f
|
||
1155 0781 BE0400 mov si,4
|
||
1156 0784 BF1A12 mov di,offset vectorsave
|
||
1157 0787 1E push ds
|
||
1158 0788 07 pop es ;point to ddt segment
|
||
1159 0789 B90C00 mov cx,12
|
||
1160 078C 1E push ds
|
||
1161 078D BA0000 mov dx,0
|
||
1162 0790 8EDA mov ds,dx
|
||
1163 0792 F3A4 rep movs al,al
|
||
1164 0794 1F pop ds
|
||
1165 svret:
|
||
1166 0795 C3 ret
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 23
|
||
|
||
1167
|
||
1168 ;
|
||
1169 restorevect: ;restore previous contents of 0:4 thru 0:f
|
||
1170 0796 F6066F12FF test savevecflag,0ffh
|
||
1171 079B 7410 07AD jz rvret
|
||
1172 079D BE1A12 mov si,offset vectorsave
|
||
1173 07A0 BF0400 mov di,4
|
||
1174 07A3 B90C00 mov cx,12
|
||
1175 07A6 BA0000 mov dx,0
|
||
1176 07A9 8EC2 mov es,dx
|
||
1177 07AB F3A4 rep movs al,al
|
||
1178 rvret:
|
||
1179 07AD C3 ret
|
||
1180 ;
|
||
1181 SETDEFSEG: ;SET DEFAULT TYPE1SEG, LASLOC
|
||
1182 07AE 2E8B3EB411 mov di,userip
|
||
1183 07B3 893E3112 mov lasloc,di ;set disassembler offset
|
||
1184 07B7 2E8E06AC11 mov es,usercs
|
||
1185 07BC 8C065A12 mov type1seg,es ;set type1seg segment
|
||
1186 07C0 C3 RET
|
||
1187 ;
|
||
1188 breakaddr: ;print address where break occurred
|
||
1189 07C1 E859FC 041D call crlf
|
||
1190 07C4 B02A mov al,'*'
|
||
1191 07C6 E85DFB 0326 call conout
|
||
1192 07C9 2EA1AE11 mov ax,userds
|
||
1193 07CD A35E12 mov type2seg,ax ;set type2 segment to userds
|
||
1194 07D0 E8DBFF 07AE CALL SETDEFSEG
|
||
1195 07D3 E893FC 0469 call printdword ;print break address
|
||
1196 07D6 C3 ret
|
||
1197 ;
|
||
1198 breakentry: ;breakpoint entry
|
||
1199 07D7 2EC606BC1101 mov breakfl,1
|
||
1200 07DD EB06 07E5 jmps savecpu ;common code for break and single step
|
||
1201 ssentry: ;single step entry
|
||
1202 07DF 2EC606BC1100 mov breakfl,0
|
||
1203 savecpu:
|
||
1204 07E5 2EA39C11 mov userax,ax
|
||
1205 07E9 2E891E9E11 mov userbx,bx
|
||
1206 07EE 2E890EA011 mov usercx,cx
|
||
1207 07F3 2E8916A211 mov userdx,dx
|
||
1208 07F8 2E8936A811 mov usersi,si
|
||
1209 07FD 2E893EAA11 mov userdi,di
|
||
1210 0802 2E892EA611 mov userbp,bp
|
||
1211 0807 2E8926A411 mov usersp,sp
|
||
1212 080C 2E8C06B211 mov useres,es
|
||
1213 0811 2E8C1EAE11 mov userds,ds
|
||
1214 0816 2E8C16B011 mov userss,ss
|
||
1215 081B 8BEC mov bp,sp
|
||
1216 081D 8B4600 mov ax,[bp]
|
||
1217 0820 2EA3B411 mov userip,ax
|
||
1218 0824 8B4602 mov ax,2[bp]
|
||
1219 0827 2EA3AC11 mov usercs,ax
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 24
|
||
|
||
1220
|
||
1221 082B 8B4604 mov ax,4[bp]
|
||
1222 082E 2EA3B611 mov userfl,ax
|
||
1223 ;
|
||
1224 0832 8CC8 mov ax,cs
|
||
1225 0834 8ED8 mov ds,ax
|
||
1226 0836 8ED0 mov ss,ax
|
||
1227 0838 BC1013 mov sp,offset stackp
|
||
1228 ;
|
||
1229 083B F6066B1202 test sysif,ifmask8 ;see whether interrupts should be enabled
|
||
1230 0840 7401 0843 jz sav0
|
||
1231 0842 FB sti
|
||
1232 sav0:
|
||
1233 0843 2E8306A41106 add usersp,6 ;to make up for stacked cs, ip, and fl
|
||
1234 0849 FC cld
|
||
1235 084A E849FF 0796 call restorevect
|
||
1236 084D 2EF606BC11FF test breakfl,0ffh
|
||
1237 0853 741A 086F jz sst0
|
||
1238 ;
|
||
1239 break0: ;continuation of break processing
|
||
1240 0855 2EFF0EB411 dec userip ;adjust user ip for breakpoint instr
|
||
1241 085A E8E5FE 0742 call bpclear ;clear all breakpoints
|
||
1242 085D F6064912FF test skipbdos,0ffh ;were we originally in trace mode?
|
||
1243 0862 7506 086A jnz sst00 ;if so, continue tracing
|
||
1244 ;
|
||
1245 tracedone:
|
||
1246 0864 E85AFF 07C1 call breakaddr
|
||
1247 0867 E93DFA 02A7 jmp start
|
||
1248 ;
|
||
1249 sst00: ;get here on breakpoint on return from bdos
|
||
1250 086A C606491200 mov skipbdos,0 ;no longer tracing thru bdos
|
||
1251 sst0: ;continuation of single step processing
|
||
1252 086F 2E8126B611FF and userfl,0feffh ;clear user trap flag
|
||
1253 FE
|
||
1254 0876 F6064A1201 TEST USERIFOFF,1
|
||
1255 087B 740C 0889 JZ SST1
|
||
1256 087D C6064A1200 MOV USERIFOFF,0
|
||
1257 0882 2E810EB61100 OR USERFL,200H ;RESTORE USER IF
|
||
1258 02
|
||
1259 SST1:
|
||
1260 0889 FF0E4612 dec tracecount
|
||
1261 088D 74D5 0864 jz tracedone
|
||
1262 088F E876FB 0408 CALL CTLCHEK ;CHECK FOR ABORT
|
||
1263 0892 F6064812FF test traceprint,0ffh
|
||
1264 0897 7403 089C jz tracerestore
|
||
1265 0899 E80608 10A2 call xnohdr ;display regs without header
|
||
1266 ;
|
||
1267 tracerestore: ;enter here when in trace mode
|
||
1268 089C 2E8E06AC11 mov es,usercs
|
||
1269 08A1 2E8B36B411 mov si,userip
|
||
1270 08A6 A11201 mov ax,word ptr .bdosintloc ;get bdos interrupt instruction
|
||
1271 08A9 263B04 cmp ax,es:[si] ;see if instruction to be traced is bdos int
|
||
1272 08AC 7518 08C6 jnz tr00
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 25
|
||
|
||
1273
|
||
1274 08AE 8C062912 mov brk1seg,es
|
||
1275 08B2 83C602 add si,2 ;point to instruction after bdos int
|
||
1276 08B5 89362712 mov brk1loc,si
|
||
1277 08B9 BF2712 mov di,offset brk1loc
|
||
1278 08BC E874FE 0733 call setbp ;set breakpoint at return from bdos
|
||
1279 08BF C606491201 mov skipbdos,1 ;so we know we were in trace mode when we hit bp
|
||
1280 08C4 EB39 08FF jmps rstore ;without setting single step flag
|
||
1281 tr00:
|
||
1282 08C6 2EA1B611 MOV AX,USERFL
|
||
1283 08CA 0D0001 OR AX,100H ;SET TRACE FLAG
|
||
1284 08CD A90002 TEST AX,200H ;IS USER IF SET?
|
||
1285 08D0 7429 08FB JZ TR01
|
||
1286 08D2 25FFFD AND AX,NOT 200H ;CLEAR IT (SO WE DON'T END UP IN INT HANDLER)
|
||
1287 08D5 2E8E06AC11 MOV ES,USERCS
|
||
1288 08DA 2E8B36B411 MOV SI,USERIP
|
||
1289 08DF 268A1C MOV BL,ES:[SI] ;GET INSTRUCTION TO EXECUTE
|
||
1290 08E2 80FBFA CMP BL,0FAH ;IS IT CLI?
|
||
1291 08E5 7414 08FB JZ TR01
|
||
1292 08E7 80FBCF CMP BL,0CFH ;IRET?
|
||
1293 08EA 740F 08FB JZ TR01
|
||
1294 08EC 80FB9D CMP BL,09DH ;POPF?
|
||
1295 08EF 740A 08FB JZ TR01
|
||
1296 08F1 80FBCD CMP BL,0CDH ;INT?
|
||
1297 08F4 7405 08FB JZ TR01
|
||
1298 08F6 C6064A1201 MOV USERIFOFF,1 ;SET FLAG SO DDT86 WILL TURN IF BACK ON
|
||
1299 TR01:
|
||
1300 08FB 2EA3B611 MOV USERFL,AX
|
||
1301 rstore: ;enter here when in G mode
|
||
1302 08FF E85BFE 075D CALL BPV
|
||
1303 0902 FA cli
|
||
1304 0903 BC9C11 mov sp,offset userreg ;point to reg save area
|
||
1305 0906 58 pop ax
|
||
1306 0907 5B pop bx
|
||
1307 0908 59 pop cx
|
||
1308 0909 5A pop dx
|
||
1309 090A 2E8F06BA11 pop savesp
|
||
1310 090F 5D pop bp
|
||
1311 0910 5E pop si
|
||
1312 0911 5F pop di
|
||
1313 0912 1F pop ds ;throw away cs
|
||
1314 0913 1F pop ds
|
||
1315 0914 2E8F06B811 pop savess
|
||
1316 0919 07 pop es
|
||
1317 091A 2E8E16B811 mov ss,savess ;restore stack
|
||
1318 091F 2E8B26BA11 mov sp,savesp
|
||
1319 0924 2EFF36B611 push userfl ;flags
|
||
1320 0929 2EFF36AC11 push usercs ;cs
|
||
1321 092E 2EFF36B411 push userip ;ip
|
||
1322 0933 CF iret ;transfer to user program
|
||
1323 ;
|
||
1324 ; **********************************
|
||
1325 ; * *
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 26
|
||
|
||
1326
|
||
1327 ; * miscellaneous routines *
|
||
1328 ; * *
|
||
1329 ; **********************************
|
||
1330 ;
|
||
1331 delim:
|
||
1332 0934 3C0D cmp al,eol
|
||
1333 0936 740A 0942 jz delret
|
||
1334 0938 3C2C cmp al,','
|
||
1335 093A 7406 0942 jz delret
|
||
1336 093C 3C20 cmp al,' '
|
||
1337 093E 7402 0942 jz delret
|
||
1338 0940 3C3A cmp al,':'
|
||
1339 delret:
|
||
1340 0942 C3 ret
|
||
1341 ;
|
||
1342 hexcon:
|
||
1343 0943 2C30 sub al,'0'
|
||
1344 0945 3C0A cmp al,10
|
||
1345 0947 720A 0953 jb hexret
|
||
1346 0949 04F9 add al,('0' - 'A' + 10) and 0ffh
|
||
1347 094B 3C10 cmp al,16
|
||
1348 094D 7305 0954 jnb hexerr
|
||
1349 094F 3C0A cmp al,10
|
||
1350 0951 7201 0954 jb hexerr
|
||
1351 hexret:
|
||
1352 0953 C3 ret
|
||
1353 hexerr:
|
||
1354 0954 E988F9 02DF jmp err
|
||
1355 ;
|
||
1356 plmset: ;get here when assembler wants to set memory
|
||
1357 0957 8BEC mov bp,sp ;for parameter fetching
|
||
1358 0959 8B4602 mov ax,2[bp] ;get value in [al]
|
||
1359 095C 8E065A12 mov es,type1seg ;segment used in A command is in type1 seg
|
||
1360 0960 8B7E04 mov di,4[bp] ;get offset from stack
|
||
1361 0963 E81A00 0980 call setbyte ;set and verify
|
||
1362 0966 47 inc di ;increment offset
|
||
1363 0967 7503 096C jnz psret ;if incremented offset is non-zero, return
|
||
1364 0969 E93BF9 02A7 jmp start ;otherwise exit A command, since wrap occurred
|
||
1365 psret:
|
||
1366 096C C20400 ret 4 ;remove 2 parameters
|
||
1367 ;
|
||
1368 set8or16: ;set byte or word at es:[di] depending on wmode
|
||
1369 096F F6066D1201 test wmode,1
|
||
1370 0974 740A 0980 jz setbyte
|
||
1371 ;fall through to setword
|
||
1372 ;
|
||
1373 setword: ;set word at es:[di] to [ax] and verify
|
||
1374 ;
|
||
1375 ; NOTE: THIS CODE COULD BE REPLACED BY THE FOLLOWING 4 INSTRUCTIONS
|
||
1376 ; FOR SYSTEMS IN WHICH MEMORY CAN ONLY BE ADDRESSED BY WORDS.
|
||
1377 ; HOWEVER, THIS WILL WRAP AROUND AND MODIFY LOCATIONS 0 IF
|
||
1378 ; [DI] CONTAINS 0FFFEH.
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 27
|
||
|
||
1379
|
||
1380 ;
|
||
1381 ; MOV ES:[DI],AX
|
||
1382 ; CMP ES:[DI],AX
|
||
1383 ; JNZ BADVER
|
||
1384 ; RET
|
||
1385 ;
|
||
1386 0976 50 push ax ;save hi byte
|
||
1387 0977 E80600 0980 call setbyte ;set low byte
|
||
1388 097A 58 pop ax
|
||
1389 097B 8AC4 mov al,ah
|
||
1390 097D 47 inc di ;point to next location
|
||
1391 097E 7408 0988 jz sret ;don't set byte if wraparound occurred
|
||
1392 ;fall thru to setbyte
|
||
1393 ;
|
||
1394 setbyte: ;set byte at es:[di] to [al] and verify
|
||
1395 0980 268805 mov es:[di],al ;store byte
|
||
1396 0983 263805 cmp es:[di],al ;see if it got stored
|
||
1397 0986 7501 0989 jnz badver
|
||
1398 sret:
|
||
1399 0988 C3 ret
|
||
1400 ;
|
||
1401 badver:
|
||
1402 0989 57 push di
|
||
1403 098A 06 push es
|
||
1404 098B BEE601 mov si,offset verm
|
||
1405 098E E8ACFA 043D call printm ;print verify error message
|
||
1406 0991 07 pop es
|
||
1407 0992 5F pop di
|
||
1408 0993 E8D3FA 0469 call printdword
|
||
1409 0996 E90EF9 02A7 jmp start
|
||
1410 ;
|
||
1411 inc1or2: ;inc pointer at [si] by 1 or 2, depending on wmode
|
||
1412 ;return with carry flag set if wrap occurred
|
||
1413 0999 A06D12 mov al,wmode
|
||
1414 099C 250100 and ax,1 ;mask to 0 or 1
|
||
1415 099F 40 inc ax ;increment value is now 1 or 2
|
||
1416 09A0 0104 add [si],ax ;increment pointer
|
||
1417 09A2 3904 cmp [si],ax ;test for wraparound
|
||
1418 09A4 C3 ret
|
||
1419 ;
|
||
1420 getnumber: ;get number from input buffer
|
||
1421 ;returns:
|
||
1422 ;bx = value of number from input
|
||
1423 ;al = last character scanned (delimiter)
|
||
1424 ;ah = blank flag (0 = blank, 1 = non-blank)
|
||
1425 09A5 2BDB sub bx,bx ;initialize value to 0
|
||
1426 09A7 8AE7 mov ah,bh ;initialize blank flag to blank
|
||
1427 getn0:
|
||
1428 09A9 E845FA 03F1 call conin
|
||
1429 09AC E885FF 0934 call delim ;check for delimiter
|
||
1430 09AF 740D 09BE jz getnret ;delimiter found, exit
|
||
1431 09B1 B104 mov cl,4
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 28
|
||
|
||
1432
|
||
1433 09B3 D3E3 shl bx,cl ;make room for new nibble
|
||
1434 09B5 E88BFF 0943 call hexcon ;convert ascii to binary
|
||
1435 09B8 02D8 add bl,al ;add nibble
|
||
1436 09BA B401 mov ah,1 ;blank flag = non-blank
|
||
1437 09BC EBEB 09A9 jmps getn0
|
||
1438 getnret:
|
||
1439 09BE C3 ret
|
||
1440 ;
|
||
1441 getoffset: ;get offset from input line
|
||
1442 ;offset is a non-blank number not followed by ':'
|
||
1443 ;returns:
|
||
1444 ;al = last char scanned (delimiter)
|
||
1445 ;bx = value
|
||
1446 09BF E8E3FF 09A5 call getnumber ;get value to bx
|
||
1447 09C2 0AE4 or ah,ah ;check for blank entry
|
||
1448 09C4 740D 09D3 jz geterr ;don't allow blank entry
|
||
1449 09C6 3C3A cmp al,':' ;check delimiter for ':'
|
||
1450 09C8 7409 09D3 jz geterr ;don't allow ':' delimiter
|
||
1451 09CA C3 ret
|
||
1452 ;
|
||
1453 getlastoffset: ;same as getoffset but delimiter must be a cr
|
||
1454 09CB E8F1FF 09BF call getoffset
|
||
1455 09CE 3C0D cmp al,eol
|
||
1456 09D0 7501 09D3 jnz geterr
|
||
1457 09D2 C3 ret
|
||
1458 geterr:
|
||
1459 09D3 E909F9 02DF jmp err
|
||
1460 ;
|
||
1461 checkword: ;check for 'W' following command letter
|
||
1462 09D6 E818FA 03F1 call conin
|
||
1463 09D9 3C57 cmp al,'W'
|
||
1464 09DB 7506 09E3 jnz chret
|
||
1465 09DD C6066D1201 mov wmode,1
|
||
1466 09E2 C3 ret
|
||
1467 09E3 FF0E0412 chret: dec conptr ;to rescan character
|
||
1468 09E7 C3 ret
|
||
1469 ;
|
||
1470 checkreg: ;check for valid segment register prefix - <sr>:
|
||
1471 ;called with:
|
||
1472 ;bl = first char
|
||
1473 ;bh = second char
|
||
1474 ;returns:
|
||
1475 ;si = offset to register, if found
|
||
1476 ;zf = found flag (1 = found, 0 = not found)
|
||
1477 09E8 80CF80 or bh,80h ;since they are defined like that
|
||
1478 09EB BD5D01 mov bp,offset segreg ;point to seg reg names
|
||
1479 09EE 2BF6 sub si,si ;initialize index to 0
|
||
1480 check0:
|
||
1481 09F0 3B1A cmp bx,[bp+si] ;is it a seg reg name
|
||
1482 09F2 740A 09FE jz checkret
|
||
1483 09F4 83C602 add si,2 ;point to next name
|
||
1484 09F7 83FE08 cmp si,8 ;check for done (4 seg reg names)
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 29
|
||
|
||
1485
|
||
1486 09FA 75F4 09F0 jnz check0
|
||
1487 09FC 0BF6 or si,si ;unset zero flag
|
||
1488 checkret:
|
||
1489 09FE C3 ret
|
||
1490 ;
|
||
1491 checksegreg: ;check for valid seg reg name
|
||
1492 ;if found, return contents of seg reg
|
||
1493 ;else reset input pointer for rescan
|
||
1494 ;returns:
|
||
1495 ;dx = seg reg value
|
||
1496 ;zf = valid seg reg (1 = valid, 0 = not valid)
|
||
1497 09FF FF360412 push conptr ;save input pointer for possible rescan
|
||
1498 0A03 E8EBF9 03F1 call conin
|
||
1499 0A06 50 push ax
|
||
1500 0A07 E8E7F9 03F1 call conin
|
||
1501 0A0A 50 push ax
|
||
1502 0A0B E8E3F9 03F1 call conin
|
||
1503 0A0E 3C3A cmp al,':' ;valid seg reg must have colon
|
||
1504 0A10 5B pop bx
|
||
1505 0A11 59 pop cx
|
||
1506 0A12 8AF9 mov bh,cl
|
||
1507 0A14 86DF xchg bl,bh
|
||
1508 0A16 750C 0A24 jnz notsr
|
||
1509 0A18 E8CDFF 09E8 call checkreg ;see if it's a valid name
|
||
1510 0A1B 7507 0A24 jnz notsr
|
||
1511 0A1D BDAC11 mov bp,offset usercs ;point to saved user seg reg's
|
||
1512 0A20 8B12 mov dx,[bp+si] ;get value of user seg reg
|
||
1513 0A22 59 pop cx ;throw away saved input pointer
|
||
1514 0A23 C3 ret
|
||
1515 notsr:
|
||
1516 0A24 8F060412 pop conptr ;reset for rescan
|
||
1517 0A28 C3 ret
|
||
1518 ;
|
||
1519 getsegandoff: ;get user location specification
|
||
1520 ;may be one of the following forms:
|
||
1521 ;<empty>
|
||
1522 ;nnnn
|
||
1523 ;sr:nnnn
|
||
1524 ;mmmm:nnnn
|
||
1525 ;if numreq set, <empty> is invalid
|
||
1526 ;called with:
|
||
1527 ;di = offset of 4 byte area containing <offset><segment>
|
||
1528 ;numreq must have been initialized by calling routine
|
||
1529 0A29 E8D3FF 09FF call checksegreg ;see if there is a segment prefix
|
||
1530 0A2C 740D 0A3B jz gets0
|
||
1531 0A2E E874FF 09A5 call getnumber ;no segment prefix, check for number
|
||
1532 0A31 0AE4 or ah,ah ;was there one?
|
||
1533 0A33 7412 0A47 jz gets3
|
||
1534 0A35 8BD3 mov dx,bx ;move number to dx
|
||
1535 0A37 3C3A cmp al,':' ;was delimiter a ':'
|
||
1536 0A39 7509 0A44 jnz gets2
|
||
1537 gets0:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 30
|
||
|
||
1538
|
||
1539 0A3B E881FF 09BF call getoffset ;segment prefix present, must have number
|
||
1540 0A3E 891D mov [di],bx ;number goes to <offset>
|
||
1541 0A40 895502 mov 2[di],dx ;first number (or sr) goes to <segment>
|
||
1542 0A43 C3 ret
|
||
1543 gets2:
|
||
1544 0A44 8915 mov [di],dx ;only one number, put it in <offset>
|
||
1545 getsret:
|
||
1546 0A46 C3 ret
|
||
1547 gets3:
|
||
1548 0A47 F6066C12FF test numreq,0ffh ;blank field, see if ok
|
||
1549 0A4C 74F8 0A46 jz getsret ;ok, return with no change at [di]
|
||
1550 0A4E E98EF8 02DF jmp err ;number was required
|
||
1551 ;
|
||
1552 ; *****************************
|
||
1553 ; * *
|
||
1554 ; * disk i/o routines *
|
||
1555 ; * *
|
||
1556 ; *****************************
|
||
1557 ;
|
||
1558 readfile: ;read file in fcb into memory described in mcb
|
||
1559 ;when done, mcb will have base and length of block to free
|
||
1560 0A51 A16612 mov ax,mcbbase
|
||
1561 0A54 A33C12 mov startreadseg,ax
|
||
1562 0A57 A34012 mov endreadseg,ax
|
||
1563 0A5A A34412 mov dmaseg,ax
|
||
1564 0A5D 2BC0 sub ax,ax
|
||
1565 0A5F A33A12 mov startreadoff,ax
|
||
1566 0A62 A33E12 mov endreadoff,ax
|
||
1567 rf0:
|
||
1568 0A65 8B164412 mov dx,dmaseg
|
||
1569 0A69 E823F9 038F call setdmab ;set dma base
|
||
1570 0A6C C70642120000 mov dmaoff,0
|
||
1571 rf1:
|
||
1572 0A72 8B164212 mov dx,dmaoff
|
||
1573 0A76 E80CF9 0385 call setdma ;set dma offset
|
||
1574 0A79 833E681208 cmp mcblen,8 ;8 paragraphs per sector
|
||
1575 0A7E 7239 0AB9 jb readerr ;if less than 8 pp's left, not enough memory
|
||
1576 0A80 BA5C00 mov dx,offset fcb
|
||
1577 0A83 E8DCF8 0362 call readsec
|
||
1578 0A86 0AC0 or al,al ;test value returned from bdos
|
||
1579 0A88 7528 0AB2 jnz readdone
|
||
1580 0A8A 8306661208 add mcbbase,8 ;point mcb to next available paragraph
|
||
1581 0A8F 832E681208 sub mcblen,8 ;decrement # of available paragraphs
|
||
1582 0A94 A14212 mov ax,dmaoff
|
||
1583 0A97 047F add al,7fh ;add sector size - 1
|
||
1584 0A99 A33E12 mov endreadoff,ax
|
||
1585 0A9C A14412 MOV AX,DMASEG
|
||
1586 0A9F A34012 MOV ENDREADSEG,AX
|
||
1587 0AA2 810642128000 add dmaoff,80h ;increment dma offset
|
||
1588 0AA8 75C8 0A72 jnz rf1 ;if no wrap occurred, simply continue
|
||
1589 0AAA 810644120010 add dmaseg,1000h ;else increment dma segment
|
||
1590 0AB0 EBB3 0A65 jmps rf0
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAG ret
|
||
asmerr:
|
||
1591 0B57 E985F7 02DF jmp err
|
||
1592 asment: ;arrive here on input error in pl/m
|
||
1593 0B5A 8B260712 mov sp,asmspsav ;reset stack to where it was
|
||
1594 0B5E EBE0 0B40 jmps asm0 ;go back for more input
|
||
1595 ;
|
||
1596 ; *****************************
|
||
1597 ; * *
|
||
1598 4
|
||
1599 0AC1 D3E8 shr ax,cl ;divide offset by 16 - truncate ls nibble
|
||
1600 0AC3 03064D12 add ax,startwriteseg ;compute absolute paragraph number
|
||
1601 0AC7 A36612 mov mcbbase,ax
|
||
1602 0ACA A34412 mov dmaseg,ax
|
||
1603 0ACD 8BD8 mov bx,ax ;store start paragraph # in [bx]
|
||
1604 0ACF A14F12 mov ax,endwriteoff
|
||
1605 0AD2 D3E8 shr ax,cl
|
||
1606 0AD4 03065112 add ax,endwriteseg ;calculate absolute paragraph number of end
|
||
1607 0AD8 2BC3 sub ax,bx ;compute # of paragraphs to write
|
||
1608 0ADA 7250 0B2C jb wferr ;start can't be > end
|
||
1609 0ADC A36812 mov mcblen,ax ;store # paragraphs to write
|
||
1610 0ADF BA5C00 mov dx,offset fcb
|
||
1611 0AE2 E878F8 035D call delete
|
||
1612 0AE5 F6067112FF TEST ERRMODE,0FFH
|
||
1613 0AEA 7408 0AF4 JZ WF00
|
||
1614 0AEC FEC0 INC AL ;DID DELETE RETURN 0FFH?
|
||
1615 0AEE 7504 0AF4 JNZ WF00 ;IF NOT, OK
|
||
1616 0AF0 0AE4 OR AH,AH ;SEE IF EXTENDED OR PHYSICAL ERROR
|
||
1617 0AF2 7538 0B2C JNZ WFERR ;IF SO, DON'T CONTINUE
|
||
1618 WF00:
|
||
1619 0AF4 BA5C00 mov dx,offset fcb
|
||
1620 0AF7 E87CF8 0376 call make
|
||
1621 wf0:
|
||
1622 0AFA 8B164412 mov dx,dmaseg
|
||
1623 0AFE E88EF8 038F call setdmab
|
||
1624 0B01 C70642120000 mov dmaoff,0 ;clear dma offset
|
||
1625 wf1:
|
||
1626 0B07 8B164212 mov dx,dmaoff
|
||
1627 0B0B E877F8 0385 call setdma
|
||
1628 0B0E BA5C00 mov dx,offset fcb
|
||
1629 0B11 E853F8 0367 call writesec
|
||
1630 0B14 832E681208 sub mcblen,8 ;8 paragraphs per sector
|
||
1631 0B19 7210 0B2B jb writedone
|
||
1632 0B1B 810642128000 add dmaoff,80h ;increment dma pointer
|
||
1633 0B21 75E4 0B07 jnz wf1 ;loop if no wrap occurred
|
||
1634 0B23 810644120010 add dmaseg,1000h ;if wrap occurred, increment dma segment
|
||
1635 0B29 EBCF 0AFA jmps wf0
|
||
1636 writedone:
|
||
1637 0B2B C3 ret
|
||
1638 wferr:
|
||
1639 0B2C E9B0F7 02DF jmp err
|
||
1640 ;
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 32
|
||
|
||
1641
|
||
1642 eject
|
||
1643 ;
|
||
1644 ; **********************************
|
||
1645 ; * *
|
||
1646 ; * a - assemble mnemonics *
|
||
1647 ; * *
|
||
1648 ; **********************************
|
||
1649 ;
|
||
1650 assm:
|
||
1651 0B2F F6060612FF test assempresent,0ffh
|
||
1652 0B34 7421 0B57 jz asmerr
|
||
1653 0B36 89260712 mov asmspsav,sp ;save in case of error in pl/m
|
||
1654 0B3A BF5812 mov di,offset type1loc
|
||
1655 0B3D E8E9FE 0A29 call getsegandoff ;get start address
|
||
1656 asm0:
|
||
1657 0B40 FF365A12 push type1seg ;for pl/m call
|
||
1658 0B44 FF365812 push type1loc ;for pl/m call
|
||
1659 0B48 E8B517 2300 call assem ;returns offset of next available byte
|
||
1660 0B4B 3B065812 cmp ax,type1loc ;test for no input
|
||
1661 0B4F 7605 0B56 jna asmret ;done unless greater than original type1loc
|
||
1662 0B51 A35812 mov type1loc,ax ;update type1loc
|
||
1663 0B54 EBEA 0B40 jmps asm0
|
||
1664 asmret:
|
||
1665 0B56 C3 ret
|
||
1666 asmerr:
|
||
1667 0B57 E985F7 02DF jmp err
|
||
1668 asment: ;arrive here on input error in pl/m
|
||
1669 0B5A 8B260712 mov sp,asmspsav ;reset stack to where it was
|
||
1670 0B5E EBE0 0B40 jmps asm0 ;go back for more input
|
||
1671 ;
|
||
1672 ; *****************************
|
||
1673 ; * *
|
||
1674 ; * B - BLOCK COMPARE *
|
||
1675 ; * *
|
||
1676 ; *****************************
|
||
1677 ;
|
||
1678 BLOCKCOMPARE:
|
||
1679 0B60 BF5C12 mov di,offset type2loc
|
||
1680 0B63 E8C3FE 0A29 call getsegandoff
|
||
1681 0B66 E856FE 09BF call getoffset ;get end offset
|
||
1682 0B69 891E6012 mov usermax,bx
|
||
1683 0B6D 3C0D cmp al,eol
|
||
1684 0B6F 7451 0BC2 jz cmperr ;need 3 arguments
|
||
1685 0B71 2B1E5C12 sub bx,type2loc
|
||
1686 0B75 724B 0BC2 jb cmperr ;error if start > end
|
||
1687 0B77 A15E12 mov ax,type2seg
|
||
1688 0B7A A36412 mov userseg2,ax ;default to same seg as source
|
||
1689 0B7D BF6212 mov di,offset userloc2
|
||
1690 0B80 E8A6FE 0A29 call getsegandoff ;get destination address
|
||
1691 0B83 3C0D cmp al,eol
|
||
1692 0B85 753B 0BC2 jnz cmperr ;error if more than 3 arguments
|
||
1693 CMP0:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 33
|
||
|
||
1694
|
||
1695 0B87 C4365C12 LES SI,DWORD PTR TYPE2LOC
|
||
1696 0B8B 268A04 MOV AL,ES:[SI]
|
||
1697 0B8E C4366212 LES SI,DWORD PTR USERLOC2
|
||
1698 0B92 263A04 CMP AL,ES:[SI]
|
||
1699 0B95 7415 0BAC JZ CMPCONT
|
||
1700 0B97 E88EF8 0428 CALL CRLFCHK
|
||
1701 0B9A BF5C12 MOV DI,OFFSET TYPE2LOC
|
||
1702 0B9D E82500 0BC5 CALL PRINTERROR
|
||
1703 0BA0 E88CF8 042F CALL BLANK
|
||
1704 0BA3 E889F8 042F CALL BLANK
|
||
1705 0BA6 BF6212 MOV DI,OFFSET USERLOC2
|
||
1706 0BA9 E81900 0BC5 CALL PRINTERROR
|
||
1707 CMPCONT:
|
||
1708 0BAC FF065C12 INC TYPE2LOC
|
||
1709 0BB0 A15C12 MOV AX,TYPE2LOC
|
||
1710 0BB3 39066012 CMP USERMAX,AX
|
||
1711 0BB7 7208 0BC1 JC CMPDONE
|
||
1712 0BB9 FF066212 INC USERLOC2
|
||
1713 0BBD 7402 0BC1 JZ CMPDONE ;PREVENT WRAPAROUND
|
||
1714 0BBF EBC6 0B87 JMPS CMP0
|
||
1715 ;
|
||
1716 CMPDONE:
|
||
1717 0BC1 C3 RET
|
||
1718 CMPERR:
|
||
1719 0BC2 E91AF7 02DF JMP ERR
|
||
1720 ;
|
||
1721 PRINTERROR: ;PRINT DWORD AT [DI], BYTE POINTED TO BY DWORD
|
||
1722 0BC5 C43D LES DI,[DI]
|
||
1723 0BC7 268A05 MOV AL,ES:[DI]
|
||
1724 0BCA 50 PUSH AX ;SAVE BYTE AT ES:DI
|
||
1725 0BCB E89BF8 0469 CALL PRINTDWORD
|
||
1726 0BCE E85EF8 042F CALL BLANK
|
||
1727 0BD1 58 POP AX
|
||
1728 0BD2 E8A7F8 047C CALL PRINTBYTE
|
||
1729 0BD5 C3 RET
|
||
1730 ;
|
||
1731 ; ******************************
|
||
1732 ; * *
|
||
1733 ; * d - display memory *
|
||
1734 ; * *
|
||
1735 ; ******************************
|
||
1736 ;
|
||
1737 display:
|
||
1738 0BD6 C6066C1200 mov numreq,0 ;ok to have no entries
|
||
1739 0BDB A15E12 mov ax,type2seg
|
||
1740 0BDE A30B12 mov disseg,ax ;default to type2 seg
|
||
1741 0BE1 E8F2FD 09D6 call checkword
|
||
1742 0BE4 F6067012FF TEST COL40,0FFH
|
||
1743 0BE9 7411 0BFC JZ DIS01
|
||
1744 0BEB F6066D1201 TEST WMODE,1
|
||
1745 0BF0 7505 0BF7 JNZ DIS00
|
||
1746 0BF2 A01312 MOV AL,ND40
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 34
|
||
|
||
1747
|
||
1748 0BF5 EB08 0BFF JMPS DIS02
|
||
1749 DIS00:
|
||
1750 0BF7 A01412 MOV AL,NDW40 ;CHARS PER LINE FOR DW IN 40 COL MODE
|
||
1751 0BFA EB03 0BFF JMPS DIS02
|
||
1752 DIS01:
|
||
1753 0BFC A01212 MOV AL,ND80 ;16 BYTES PER LINE IN NORMAL MODE
|
||
1754 DIS02:
|
||
1755 0BFF A21112 MOV LINEMAX,AL
|
||
1756 0C02 BF0912 mov di,offset disloc
|
||
1757 0C05 E821FE 0A29 call getsegandoff
|
||
1758 0C08 3C2C cmp al, ','
|
||
1759 0C0A A10B12 mov ax,disseg
|
||
1760 0C0D A35E12 mov type2seg,ax ;update default type2 seg
|
||
1761 0C10 7505 0C17 jnz dis0 ;must be cr, no dismax entered
|
||
1762 0C12 E8B6FD 09CB call getlastoffset ;get dismax
|
||
1763 0C15 EB1A 0C31 jmps dis1
|
||
1764 dis0:
|
||
1765 0C17 8B1E0912 mov bx,disloc ;no dismax entered, calculate default
|
||
1766 0C1B A01112 MOV AL,LINEMAX
|
||
1767 0C1E 8A0E1512 MOV CL,NLINES
|
||
1768 0C22 F6E1 MUL CL
|
||
1769 0C24 FEC8 DEC AL
|
||
1770 0C26 03D8 ADD BX,AX
|
||
1771 0C28 3B1E0912 cmp bx,disloc ;see if we went over ffff
|
||
1772 0C2C 7303 0C31 jnb dis1
|
||
1773 0C2E BBFFFF mov bx,0ffffh ;set dismax if we wrapped around
|
||
1774 dis1:
|
||
1775 0C31 891E0D12 mov dismax,bx
|
||
1776 disp3:
|
||
1777 0C35 E8F0F7 0428 CALL CRLFCHK
|
||
1778 0C38 C43E0912 les di,dword ptr disloc
|
||
1779 0C3C 893E0F12 mov tdisp,di
|
||
1780 0C40 E826F8 0469 call printdword
|
||
1781 disp4:
|
||
1782 0C43 E8E9F7 042F call blank
|
||
1783 0C46 C4360912 les si,dword ptr disloc
|
||
1784 0C4A E810F8 045D call print8or16
|
||
1785 0C4D BE0912 mov si,offset disloc
|
||
1786 0C50 E846FD 0999 call inc1or2
|
||
1787 0C53 7216 0C6B jb disp6 ;stop if wrap occurred
|
||
1788 0C55 A10912 mov ax,disloc
|
||
1789 0C58 2B060F12 sub ax,tdisp ;calculate # bytes printed on line
|
||
1790 0C5C 3A061112 CMP AL,LINEMAX ;SEE IF LINE FULL
|
||
1791 0C60 7409 0C6B jz disp6
|
||
1792 0C62 A10912 mov ax,disloc
|
||
1793 0C65 3B060D12 cmp ax,dismax ;check for done
|
||
1794 0C69 76D8 0C43 jna disp4
|
||
1795 disp6:
|
||
1796 0C6B E8C1F7 042F call blank
|
||
1797 disp7:
|
||
1798 0C6E 8E060B12 mov es,disseg
|
||
1799 0C72 8B360F12 mov si,tdisp
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 35
|
||
|
||
1800
|
||
1801 0C76 268A04 mov al,es:[si]
|
||
1802 0C79 E8D3F7 044F call ascout
|
||
1803 0C7C FF060F12 inc tdisp
|
||
1804 0C80 7411 0C93 jz disp8 ;stop if wrap occurred
|
||
1805 0C82 A10F12 mov ax,tdisp
|
||
1806 0C85 3B060912 cmp ax,disloc
|
||
1807 0C89 75E3 0C6E jnz disp7
|
||
1808 0C8B 3B060D12 cmp ax,dismax
|
||
1809 0C8F 7702 0C93 ja disp8
|
||
1810 0C91 EBA2 0C35 jmps disp3
|
||
1811 disp8:
|
||
1812 0C93 C3 ret
|
||
1813 ;
|
||
1814 ; ******************************************
|
||
1815 ; * *
|
||
1816 ; * e - load program for execution *
|
||
1817 ; * *
|
||
1818 ; ******************************************
|
||
1819 ;
|
||
1820 0C94 434D44 cmd db 'CMD'
|
||
1821 ;
|
||
1822 execute:
|
||
1823 0C97 E857F7 03F1 call conin
|
||
1824 0C9A 3C0D cmp al,eol ;check for no filename
|
||
1825 0C9C 7474 0D12 jz eerr ;don't allow no filename
|
||
1826 0C9E FF0E0412 dec conptr ;to rescan character
|
||
1827 0CA2 BF5C00 mov di,offset fcb
|
||
1828 0CA5 E8E9F7 0491 call parse
|
||
1829 0CA8 7468 0D12 jz eerr ;no '?' or '*' allowed
|
||
1830 0CAA 3C0D cmp al,eol
|
||
1831 0CAC 7564 0D12 jnz eerr ;eol must follow filename
|
||
1832 0CAE 0E push cs
|
||
1833 0CAF 07 pop es ;set es = cs
|
||
1834 0CB0 26803E650020 cmp es:fcb+9, ' ' ;see if filetype blank
|
||
1835 0CB6 750B 0CC3 jnz ex0
|
||
1836 0CB8 BE940C mov si,offset cmd
|
||
1837 0CBB BF6500 mov di,offset fcb+9
|
||
1838 0CBE B90300 mov cx,3
|
||
1839 0CC1 F3A4 rep movs al,al ;set filetype to 'CMD' if empty
|
||
1840 ex0:
|
||
1841 0CC3 BA5C00 mov dx,offset fcb
|
||
1842 0CC6 E876F6 033F call open ;see if file exists
|
||
1843 0CC9 C6066A12FF mov mcbext,0ffh ;free all allocations below DDT86
|
||
1844 0CCE BA6612 mov dx,offset mcb
|
||
1845 0CD1 E8D9F6 03AD call freemem ;free all memory previously allocated under DDT
|
||
1846 0CD4 BA5C00 mov dx,offset fcb
|
||
1847 0CD7 E8D8F6 03B2 call load ;load user program
|
||
1848 0CDA 53 push bx ;save ds base
|
||
1849 0CDB E8EFF9 06CD call setcpustate
|
||
1850 0CDE 5A pop dx ;get ds base back
|
||
1851 0CDF E8ADF6 038F call setdmab ;set dma base
|
||
1852 0CE2 BA8000 mov dx,80h
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 36
|
||
|
||
1853
|
||
1854 0CE5 E89DF6 0385 call setdma ;default to 80h in user's DS
|
||
1855 0CE8 BA5C00 MOV DX,OFFSET FCB
|
||
1856 0CEB E860F6 034E CALL CLOSE
|
||
1857 0CEE C6066E1245 mov mode,'E'
|
||
1858 0CF3 BE0000 mov si,0
|
||
1859 0CF6 BF7212 mov di,offset basepagesave
|
||
1860 0CF9 1E push ds
|
||
1861 0CFA 07 pop es ;set es to ddt's segment
|
||
1862 0CFB 2EA1AE11 mov ax,userds
|
||
1863 0CFF 1E push ds ;save it
|
||
1864 0D00 8ED8 mov ds,ax
|
||
1865 0D02 B93000 mov cx,48
|
||
1866 0D05 F3A4 rep movs al,al ;copy user's base page into ddt save area
|
||
1867 0D07 1F pop ds ;restore ds
|
||
1868 0D08 E8D302 0FDE call verify ;display load info
|
||
1869 0D0B FF0E0412 DEC CONPTR ;TO RESCAN CR
|
||
1870 0D0F E9CC00 0DDE JMP IFCB ;TO CLEAR FCB
|
||
1871 eerr:
|
||
1872 0D12 E9CAF5 02DF jmp err
|
||
1873 ;
|
||
1874 ; ***************************
|
||
1875 ; * *
|
||
1876 ; * f - fill memory *
|
||
1877 ; * *
|
||
1878 ; ***************************
|
||
1879 ;
|
||
1880 fill:
|
||
1881 0D15 E8BEFC 09D6 call checkword ;check for 'FW'
|
||
1882 0D18 BF5C12 mov di,offset type2loc
|
||
1883 0D1B E80BFD 0A29 call getsegandoff
|
||
1884 0D1E E89EFC 09BF call getoffset ;get end address
|
||
1885 0D21 891E6012 mov usermax,bx ;save end address
|
||
1886 0D25 E8A3FC 09CB call getlastoffset ;get fill constant
|
||
1887 0D28 F6066D1201 test wmode,1
|
||
1888 0D2D 7504 0D33 jnz fil0
|
||
1889 0D2F 0AFF or bh,bh ;if not wmode, high byte must be 0
|
||
1890 0D31 7525 0D58 jnz filerr
|
||
1891 fil0:
|
||
1892 0D33 8B0E6012 mov cx,usermax ;get end address
|
||
1893 0D37 2B0E5C12 sub cx,type2loc ;compare for valid range
|
||
1894 0D3B 721B 0D58 jb filerr ;error if start > end
|
||
1895 fil1:
|
||
1896 0D3D C43E5C12 les di,dword ptr type2loc
|
||
1897 0D41 8BC3 mov ax,bx ;get fill constant
|
||
1898 0D43 E829FC 096F call set8or16
|
||
1899 0D46 BE5C12 mov si,offset type2loc
|
||
1900 0D49 E84DFC 0999 call inc1or2
|
||
1901 0D4C 7209 0D57 jb filret ;stop if wrap occurred
|
||
1902 0D4E A15C12 mov ax,type2loc
|
||
1903 0D51 3B066012 cmp ax,usermax
|
||
1904 0D55 76E6 0D3D jbe fil1
|
||
1905 filret:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 37
|
||
|
||
1906
|
||
1907 0D57 C3 ret
|
||
1908 filerr:
|
||
1909 0D58 E984F5 02DF jmp err
|
||
1910 ;
|
||
1911 ; **********************************
|
||
1912 ; * *
|
||
1913 ; * g - go to user program *
|
||
1914 ; * *
|
||
1915 ; **********************************
|
||
1916 ;
|
||
1917 gouser:
|
||
1918 0D5B 2EA1AC11 mov ax,usercs
|
||
1919 0D5F A31812 mov goseg,ax ;default goseg = usercs
|
||
1920 0D62 2EA1B411 mov ax,userip
|
||
1921 0D66 A31612 mov goloc,ax ;default goloc = userip
|
||
1922 0D69 C6066C1200 mov numreq,0 ;number not required in G command
|
||
1923 0D6E BF1612 mov di,offset goloc
|
||
1924 0D71 E8B5FC 0A29 call getsegandoff ;get start address
|
||
1925 0D74 3C0D cmp al,eol
|
||
1926 0D76 742B 0DA3 jz gorestore ;if eol, no breakpoints set
|
||
1927 0D78 A11812 mov ax,goseg
|
||
1928 0D7B A32912 mov brk1seg,ax
|
||
1929 0D7E A32E12 mov brk2seg,ax ;defaults for breakpoint segments = goseg
|
||
1930 0D81 BF2712 mov di,offset brk1loc
|
||
1931 0D84 E8A2FC 0A29 call getsegandoff ;get first breakpoint
|
||
1932 0D87 50 push ax ;save terminating char
|
||
1933 0D88 BF2712 mov di,offset brk1loc
|
||
1934 0D8B E8A5F9 0733 call setbp ;save breakpoint in table
|
||
1935 0D8E 58 pop ax ;get char
|
||
1936 0D8F 3C0D cmp al,eol
|
||
1937 0D91 7410 0DA3 jz gorestore ;only one breakpoint
|
||
1938 0D93 BF2C12 mov di,offset brk2loc
|
||
1939 0D96 E890FC 0A29 call getsegandoff ;get second breakpoint
|
||
1940 0D99 3C0D cmp al,eol
|
||
1941 0D9B 751C 0DB9 jnz goerr ;only 2 breakpoints allowed
|
||
1942 0D9D BF2C12 mov di,offset brk2loc
|
||
1943 0DA0 E890F9 0733 call setbp ;set second breakpoint
|
||
1944 gorestore:
|
||
1945 0DA3 C606491200 mov skipbdos,0 ;make sure it's 0 since we aren't in T/U mode
|
||
1946 0DA8 A11812 mov ax,goseg
|
||
1947 0DAB 2EA3AC11 mov usercs,ax ;usercs = goseg
|
||
1948 0DAF A11612 mov ax,goloc
|
||
1949 0DB2 2EA3B411 mov userip,ax ;userip = goloc
|
||
1950 0DB6 E946FB 08FF jmp rstore ;restore user CPU state
|
||
1951 goerr:
|
||
1952 0DB9 E886F9 0742 call bpclear ;in case any were set
|
||
1953 0DBC E920F5 02DF jmp err
|
||
1954 ;
|
||
1955 ;
|
||
1956 ; ************************
|
||
1957 ; * *
|
||
1958 ; * h - hex math *
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 38
|
||
|
||
1959
|
||
1960 ; * *
|
||
1961 ; ************************
|
||
1962 ;
|
||
1963 hexmath:
|
||
1964 0DBF E8FDFB 09BF call getoffset
|
||
1965 0DC2 53 push bx ;save first value
|
||
1966 0DC3 E805FC 09CB call getlastoffset
|
||
1967 0DC6 58 pop ax ;get first value
|
||
1968 0DC7 50 push ax ;save a copy
|
||
1969 0DC8 03C3 add ax,bx
|
||
1970 0DCA 53 push bx ;save second value
|
||
1971 0DCB 50 push ax ;save sum
|
||
1972 0DCC E84EF6 041D call crlf
|
||
1973 0DCF 58 pop ax ;get sum
|
||
1974 0DD0 E8A2F6 0475 call printword ;print sum
|
||
1975 0DD3 E859F6 042F call blank
|
||
1976 0DD6 5B pop bx ;get second value
|
||
1977 0DD7 58 pop ax ;get first value
|
||
1978 0DD8 2BC3 sub ax,bx
|
||
1979 0DDA E898F6 0475 call printword ;print difference
|
||
1980 0DDD C3 ret
|
||
1981 ;
|
||
1982 ; ****************************************
|
||
1983 ; * *
|
||
1984 ; * i - input file control block *
|
||
1985 ; * *
|
||
1986 ; ****************************************
|
||
1987 ;
|
||
1988 ifcb:
|
||
1989 0DDE FF360412 push conptr ;save input pointer
|
||
1990 0DE2 BF5C00 mov di,offset fcb
|
||
1991 0DE5 E8A9F6 0491 call parse
|
||
1992 0DE8 3C0D cmp al,eol
|
||
1993 0DEA 7504 0DF0 jnz i0 ;only one filename
|
||
1994 0DEC FF0E0412 dec conptr ;to rescan eol and blank second filename in fcb
|
||
1995 i0:
|
||
1996 0DF0 BF6C00 mov di,offset fcb2
|
||
1997 0DF3 E8A6F6 049C call parse2 ;parse second filename
|
||
1998 0DF6 1E push ds
|
||
1999 0DF7 07 pop es ;point to DDT's ds
|
||
2000 0DF8 8F060412 pop conptr ;restore input pointer
|
||
2001 0DFC BF8100 mov di,81h ;move command tail to [es]:[di]
|
||
2002 0DFF 2BC9 sub cx,cx ;zero count
|
||
2003 i1:
|
||
2004 0E01 E8EDF5 03F1 call conin ;get char from command tail
|
||
2005 0E04 3C0D cmp al,eol ;end of command tail?
|
||
2006 0E06 7404 0E0C jz i2
|
||
2007 0E08 AA stos al ;store in user's base page
|
||
2008 0E09 41 inc cx ;increment count
|
||
2009 0E0A EBF5 0E01 jmps i1 ;loop until eol
|
||
2010 i2:
|
||
2011 0E0C B000 mov al,0
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 39
|
||
|
||
2012
|
||
2013 0E0E AA stos al ;store 0 at end of string
|
||
2014 0E0F 26880E8000 mov es:.80h,cl ;store count at start of buffer
|
||
2015 0E14 803E6E1245 cmp mode,'E'
|
||
2016 0E19 750F 0E2A jnz idone ;if no file loaded with E command, we're done
|
||
2017 0E1B BE5C00 mov si,offset fcb
|
||
2018 0E1E 8BFE mov di,si
|
||
2019 0E20 2E8E06AE11 mov es,userds
|
||
2020 0E25 83C126 add cx,38 ;total bytes to move = # in command + 36 (fcb)
|
||
2021 ; +2 (0 at end of command and count byte)
|
||
2022 0E28 F3A4 rep movs al,al ;move fcb from ddt86 basepage to user's basepage
|
||
2023 idone:
|
||
2024 0E2A C3 ret
|
||
2025 ierr:
|
||
2026 0E2B E9B1F4 02DF jmp err
|
||
2027 ;
|
||
2028 ; **********************************
|
||
2029 ; * *
|
||
2030 ; * l - list assembly code *
|
||
2031 ; * *
|
||
2032 ; **********************************
|
||
2033 ;
|
||
2034 lassm:
|
||
2035 0E2E F6063912FF test disempresent,0ffh
|
||
2036 0E33 746C 0EA1 jz laserr
|
||
2037 0E35 C606371200 mov lascntsw,0 ;don't use count if end addr specified
|
||
2038 0E3A C6066C1200 mov numreq,0 ;ok if no entries
|
||
2039 0E3F A15A12 mov ax,type1seg
|
||
2040 0E42 A33312 mov lasseg,ax ;default to type1 seg
|
||
2041 0E45 BF3112 mov di,offset lasloc
|
||
2042 0E48 E8DEFB 0A29 call getsegandoff
|
||
2043 0E4B 3C0D cmp al,eol
|
||
2044 0E4D A13312 mov ax,lasseg
|
||
2045 0E50 A35A12 mov type1seg,ax ;update default type1 seg
|
||
2046 0E53 7405 0E5A jz las0
|
||
2047 0E55 E873FB 09CB call getlastoffset ;if ',', get end address
|
||
2048 0E58 EB0E 0E68 jmps las1
|
||
2049 las0:
|
||
2050 0E5A C606371201 mov lascntsw,1 ;disassemble fixed # of instructions
|
||
2051 0E5F A01512 MOV AL,NLINES
|
||
2052 0E62 A23812 MOV LASCNT,AL
|
||
2053 0E65 BBFFFF mov bx,0ffffh ;set lasmax to big number
|
||
2054 las1:
|
||
2055 0E68 891E3512 mov lasmax,bx
|
||
2056 las2:
|
||
2057 0E6C 8B3E3112 mov di,lasloc
|
||
2058 0E70 3B3E3512 cmp di,lasmax
|
||
2059 0E74 772A 0EA0 ja lasret
|
||
2060 0E76 57 push di
|
||
2061 0E77 E8AEF5 0428 CALL CRLFCHK
|
||
2062 0E7A 5F pop di
|
||
2063 0E7B 8E063312 mov es,lasseg
|
||
2064 0E7F 06 push es
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 40
|
||
|
||
2065
|
||
2066 0E80 57 push di ;for disem call (PL/M)
|
||
2067 0E81 E8E5F5 0469 call printdword
|
||
2068 0E84 E8A8F5 042F call blank
|
||
2069 0E87 E87605 1400 call disem
|
||
2070 0E8A 3B063112 cmp ax,lasloc
|
||
2071 0E8E 7210 0EA0 jb lasret ;stop if wrap occurred
|
||
2072 0E90 A33112 mov lasloc, ax
|
||
2073 0E93 F6063712FF test lascntsw,0ffh
|
||
2074 0E98 74D2 0E6C jz las2
|
||
2075 0E9A FE0E3812 dec lascnt
|
||
2076 0E9E 75CC 0E6C jnz las2
|
||
2077 lasret:
|
||
2078 0EA0 C3 ret
|
||
2079 laserr:
|
||
2080 0EA1 E93BF4 02DF jmp err
|
||
2081 ;
|
||
2082 ; **************************
|
||
2083 ; * *
|
||
2084 ; * m - move block *
|
||
2085 ; * *
|
||
2086 ; **************************
|
||
2087 ;
|
||
2088 move:
|
||
2089 0EA4 BF5C12 mov di,offset type2loc
|
||
2090 0EA7 E87FFB 0A29 call getsegandoff
|
||
2091 0EAA E812FB 09BF call getoffset ;get end offset
|
||
2092 0EAD 891E6012 mov usermax,bx
|
||
2093 0EB1 3C0D cmp al,eol
|
||
2094 0EB3 743A 0EEF jz moverr ;need 3 arguments
|
||
2095 0EB5 2B1E5C12 sub bx,type2loc
|
||
2096 0EB9 7234 0EEF jb moverr ;error if start > end
|
||
2097 0EBB A15E12 mov ax,type2seg
|
||
2098 0EBE A36412 mov userseg2,ax ;default to same seg as source
|
||
2099 0EC1 BF6212 mov di,offset userloc2
|
||
2100 0EC4 E862FB 0A29 call getsegandoff ;get destination address
|
||
2101 0EC7 3C0D cmp al,eol
|
||
2102 0EC9 7524 0EEF jnz moverr ;error if more than 3 arguments
|
||
2103 mov0:
|
||
2104 0ECB C4365C12 les si,dword ptr type2loc
|
||
2105 0ECF 268A04 mov al,es:[si] ;get source byte
|
||
2106 0ED2 C43E6212 les di,dword ptr userloc2
|
||
2107 0ED6 E8A7FA 0980 call setbyte ;put destination byte
|
||
2108 0ED9 FF065C12 inc type2loc
|
||
2109 0EDD 740F 0EEE jz movret ;don't allow wraparound
|
||
2110 0EDF FF066212 inc userloc2
|
||
2111 0EE3 7409 0EEE jz movret ;don't allow wraparound in destination segment
|
||
2112 0EE5 A15C12 mov ax,type2loc
|
||
2113 0EE8 3B066012 cmp ax,usermax ;check for done
|
||
2114 0EEC 76DD 0ECB jna mov0
|
||
2115 movret:
|
||
2116 0EEE C3 ret
|
||
2117 moverr:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 41
|
||
|
||
2118
|
||
2119 0EEF E9EDF3 02DF jmp err
|
||
2120 ;
|
||
2121 ; *************************
|
||
2122 ; * *
|
||
2123 ; * r - read file *
|
||
2124 ; * *
|
||
2125 ; *************************
|
||
2126 ;
|
||
2127 read:
|
||
2128 0EF2 E8FCF4 03F1 call conin ;get first command char
|
||
2129 0EF5 3C0D cmp al,eol ;check for no input
|
||
2130 0EF7 7450 0F49 jz rerr ;filename must be included in command
|
||
2131 0EF9 FF0E0412 dec conptr ;to rescan first char
|
||
2132 0EFD BF5C00 mov di,offset fcb
|
||
2133 0F00 E88EF5 0491 call parse
|
||
2134 0F03 7444 0F49 jz rerr ;no '?' or '*' allowed
|
||
2135 0F05 3C0D cmp al,eol
|
||
2136 0F07 7540 0F49 jnz rerr ;no parameters after filename
|
||
2137 0F09 BA5C00 mov dx,offset fcb
|
||
2138 0F0C E830F4 033F call open
|
||
2139 0F0F C7066812FFFF mov mcblen,0ffffh ;largest memory request
|
||
2140 0F15 BA6612 mov dx,offset mcb
|
||
2141 0F18 E879F4 0394 call getmaxmem ;get size of largest chuck of memory
|
||
2142 0F1B BA6612 mov dx,offset mcb
|
||
2143 0F1E E87DF4 039E call allocabsmem ;allocate block returned from getmaxmem
|
||
2144 0F21 E82DFB 0A51 call readfile ;read file into memory block
|
||
2145 0F24 C6066A1200 mov mcbext,0 ;only free memory at mbase
|
||
2146 0F29 BA6612 mov dx,offset mcb
|
||
2147 0F2C E87EF4 03AD call freemem ;free memory not used in read (read updated mcb)
|
||
2148 0F2F A13C12 mov ax,startreadseg
|
||
2149 0F32 A35E12 mov type2seg,ax ;set default type2 segment to file just read
|
||
2150 0F35 A35A12 mov type1seg,ax ;also type1 segment
|
||
2151 0F38 2BC0 sub ax,ax
|
||
2152 0F3A A30912 mov disloc,ax ;display pointer offset = 0
|
||
2153 0F3D A33112 mov lasloc,ax ;list pointer offset = 0
|
||
2154 0F40 C6066E1252 mov mode,'R' ;last disk input was read (not execute)
|
||
2155 0F45 E89600 0FDE call verify
|
||
2156 0F48 C3 ret
|
||
2157 rerr:
|
||
2158 0F49 E993F3 02DF jmp err
|
||
2159 ;
|
||
2160 ; **************************
|
||
2161 ; * *
|
||
2162 ; * s - set memory *
|
||
2163 ; * *
|
||
2164 ; **************************
|
||
2165 ;
|
||
2166 setmem:
|
||
2167 0F4C E887FA 09D6 call checkword ;check for 'SW'
|
||
2168 0F4F BF5C12 mov di,offset type2loc
|
||
2169 0F52 E8D4FA 0A29 call getsegandoff
|
||
2170 set0:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 42
|
||
|
||
2171
|
||
2172 0F55 E8C5F4 041D call crlf
|
||
2173 0F58 C43E5C12 les di,dword ptr type2loc
|
||
2174 0F5C E80AF5 0469 call printdword
|
||
2175 0F5F E8CDF4 042F call blank
|
||
2176 0F62 C4365C12 les si,dword ptr type2loc
|
||
2177 0F66 E8F4F4 045D call print8or16
|
||
2178 0F69 E8C3F4 042F call blank
|
||
2179 0F6C E868F4 03D7 call getline
|
||
2180 0F6F E87FF4 03F1 call conin
|
||
2181 0F72 3C0D cmp al,eol
|
||
2182 0F74 741F 0F95 jz set2
|
||
2183 0F76 3C2E cmp al,'.'
|
||
2184 0F78 7423 0F9D jz setret
|
||
2185 0F7A FF0E0412 dec conptr ;to rescan first character
|
||
2186 0F7E E84AFA 09CB call getlastoffset
|
||
2187 0F81 8BC3 mov ax,bx ;get new value to ax
|
||
2188 0F83 F6066D1201 test wmode,1
|
||
2189 0F88 7504 0F8E jnz set1
|
||
2190 0F8A 0AFF or bh,bh
|
||
2191 0F8C 7510 0F9E jnz seterr ;must be < 256 if not SW
|
||
2192 set1:
|
||
2193 0F8E C43E5C12 les di,dword ptr type2loc
|
||
2194 0F92 E8DAF9 096F call set8or16
|
||
2195 set2:
|
||
2196 0F95 BE5C12 mov si,offset type2loc
|
||
2197 0F98 E8FEF9 0999 call inc1or2
|
||
2198 0F9B 73B8 0F55 jnb set0
|
||
2199 setret:
|
||
2200 0F9D C3 ret
|
||
2201 seterr:
|
||
2202 0F9E E93EF3 02DF jmp err
|
||
2203 ;
|
||
2204 ; ***************************************
|
||
2205 ; * *
|
||
2206 ; * t - trace program execution *
|
||
2207 ; * *
|
||
2208 ; ***************************************
|
||
2209 ;
|
||
2210 trace:
|
||
2211 0FA1 C606481201 mov traceprint,1
|
||
2212 trace0: ;untrace enters here with traceprint = 0
|
||
2213 0FA6 E848F4 03F1 call conin
|
||
2214 0FA9 3C53 cmp al,'S' ;check for TS
|
||
2215 0FAB B401 mov ah,1
|
||
2216 0FAD 7406 0FB5 jz tr0 ;if TS, set segflag to 1
|
||
2217 0FAF FECC dec ah ;else set segflag to 0, and
|
||
2218 0FB1 FF0E0412 dec conptr ;decrement pointer to rescan character
|
||
2219 tr0:
|
||
2220 0FB5 88265412 mov segflag,ah ;print segment registers or not
|
||
2221 0FB9 C70646120100 mov tracecount,1 ;default to 1 instruction trace
|
||
2222 0FBF E8E3F9 09A5 call getnumber
|
||
2223 0FC2 3C0D cmp al,eol
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 43
|
||
|
||
2224
|
||
2225 0FC4 750E 0FD4 jnz traceerr ;only 1 parameter allowed
|
||
2226 0FC6 0AE4 or ah,ah ;see if a number was entered
|
||
2227 0FC8 7404 0FCE jz trace1 ;skip if no number typed
|
||
2228 0FCA 891E4612 mov tracecount,bx ;store number of instructions to trace
|
||
2229 trace1:
|
||
2230 0FCE E8C400 1095 call xdisp ;display CPU state
|
||
2231 0FD1 E9C8F8 089C jmp tracerestore ;restore user's CPU state and return
|
||
2232 traceerr:
|
||
2233 0FD4 E908F3 02DF jmp err
|
||
2234 ;
|
||
2235 ; ******************************************
|
||
2236 ; * *
|
||
2237 ; * u - untraced program execution *
|
||
2238 ; * *
|
||
2239 ; ******************************************
|
||
2240 ;
|
||
2241 untrace:
|
||
2242 0FD7 C606481200 mov traceprint,0
|
||
2243 0FDC EBC8 0FA6 jmps trace0 ;common code with trace command
|
||
2244 ;
|
||
2245 ; *********************************
|
||
2246 ; * *
|
||
2247 ; * v - display file info *
|
||
2248 ; * *
|
||
2249 ; *********************************
|
||
2250 ;
|
||
2251 verify:
|
||
2252 0FDE A06E12 mov al,mode
|
||
2253 0FE1 3C52 cmp al,'R'
|
||
2254 0FE3 7407 0FEC jz verifyr
|
||
2255 0FE5 3C45 cmp al,'E'
|
||
2256 0FE7 7421 100A jz verifye
|
||
2257 0FE9 E9F3F2 02DF jmp err ;neither R nor E command done
|
||
2258 verifyr:
|
||
2259 0FEC E82EF4 041D call crlf
|
||
2260 0FEF BED601 mov si,offset readm
|
||
2261 0FF2 E848F4 043D call printm
|
||
2262 0FF5 E825F4 041D call crlf
|
||
2263 0FF8 C43E3A12 les di,dword ptr startreadoff
|
||
2264 0FFC E86AF4 0469 call printdword
|
||
2265 0FFF E82DF4 042F call blank
|
||
2266 1002 C43E3E12 les di,dword ptr endreadoff
|
||
2267 1006 E860F4 0469 call printdword
|
||
2268 1009 C3 ret
|
||
2269 ;
|
||
2270 verifye:
|
||
2271 100A E810F4 041D call crlf
|
||
2272 100D B90300 mov cx,3
|
||
2273 1010 E822F4 0435 call tabs
|
||
2274 1013 BED601 mov si,offset readm
|
||
2275 1016 E824F4 043D call printm ;print header
|
||
2276 1019 B000 mov al,0 ;initialize count to 0
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 44
|
||
|
||
2277
|
||
2278 v0:
|
||
2279 101B 50 push ax ;save it
|
||
2280 101C 58 pop ax ;get count
|
||
2281 101D 50 push ax ;save it
|
||
2282 101E E864F6 0685 call printseginfo ;print name, start, end of segment if non-zero
|
||
2283 1021 58 pop ax ;get count
|
||
2284 1022 FEC0 inc al ;increment it
|
||
2285 1024 803E771201 cmp byte ptr basepagesave+5,1 ;check for 8080 model
|
||
2286 1029 7404 102F jz verret ;no more segments if 8080 model
|
||
2287 102B 3C08 cmp al,8 ;max of 8 segments described in base page
|
||
2288 102D 72EC 101B jb v0 ;done when count = 8
|
||
2289 verret:
|
||
2290 102F C3 ret
|
||
2291 ;
|
||
2292 ; ******************************************
|
||
2293 ; * *
|
||
2294 ; * w - write memory block to disk *
|
||
2295 ; * *
|
||
2296 ; ******************************************
|
||
2297 ;
|
||
2298 write:
|
||
2299 1030 A13C12 mov ax,startreadseg
|
||
2300 1033 A34D12 mov startwriteseg,ax
|
||
2301 1036 A13A12 mov ax,startreadoff
|
||
2302 1039 A34B12 mov startwriteoff,ax
|
||
2303 103C A14012 mov ax,endreadseg
|
||
2304 103F A35112 mov endwriteseg,ax
|
||
2305 1042 A13E12 mov ax,endreadoff
|
||
2306 1045 A34F12 mov endwriteoff,ax
|
||
2307 1048 E8A6F3 03F1 call conin
|
||
2308 104B 3C0D cmp al,eol ;check for no parameters
|
||
2309 104D 7443 1092 jz werr ;must have a filename
|
||
2310 104F FF0E0412 dec conptr ;to rescan first char
|
||
2311 1053 BF5C00 mov di,offset fcb
|
||
2312 1056 E838F4 0491 call parse ;get filename
|
||
2313 1059 7437 1092 jz werr ;don't allow '?' or '*'
|
||
2314 105B 3C0D cmp al,eol
|
||
2315 105D 7509 1068 jnz w0 ;not end of input - must be 2 parameters
|
||
2316 105F 803E6E1252 cmp mode,'R' ;see if a file was read in
|
||
2317 1064 752C 1092 jnz werr ;no file read - must have start, end addresses
|
||
2318 1066 EB20 1088 jmps w1 ;continue with write
|
||
2319 w0:
|
||
2320 1068 A15A12 mov ax,type1seg
|
||
2321 106B A34D12 mov startwriteseg,ax ;set default to userds
|
||
2322 106E BF4B12 mov di,offset startwriteoff
|
||
2323 1071 E8B5F9 0A29 call getsegandoff ;get start address
|
||
2324 1074 3C0D cmp al,eol
|
||
2325 1076 741A 1092 jz werr ;need 2 parameters
|
||
2326 1078 A14D12 mov ax,startwriteseg
|
||
2327 107B A35112 mov endwriteseg,ax ;end defaults to start
|
||
2328 107E BF4F12 mov di,offset endwriteoff
|
||
2329 1081 E8A5F9 0A29 call getsegandoff ;get end address
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 45
|
||
|
||
2330
|
||
2331 1084 3C0D cmp al,eol
|
||
2332 1086 750A 1092 jnz werr ;no more than 2 parameters
|
||
2333 w1:
|
||
2334 1088 E831FA 0ABC call writefile
|
||
2335 108B BA5C00 mov dx,offset fcb
|
||
2336 108E E8BDF2 034E call close
|
||
2337 1091 C3 ret
|
||
2338 werr:
|
||
2339 1092 E94AF2 02DF jmp err
|
||
2340 ;
|
||
2341 ; ***************************************
|
||
2342 ; * *
|
||
2343 ; * x - display/alter CPU state *
|
||
2344 ; * *
|
||
2345 ; ***************************************
|
||
2346 ;
|
||
2347 xdisp: ;display CPU state
|
||
2348 1095 E816F7 07AE CALL SETDEFSEG ;SET TYPE1SEG, LASLOC TO CS:IP
|
||
2349 1098 F6067012FF TEST COL40,0FFH
|
||
2350 109D 751A 10B9 JNZ XD40
|
||
2351 109F E89BF5 063D call printregheader
|
||
2352 xnohdr: ;entry point to display CPU state without header
|
||
2353 10A2 F6067012FF TEST COL40,0FFH
|
||
2354 10A7 7517 10C0 JNZ XNH40
|
||
2355 10A9 E871F3 041D call crlf
|
||
2356 10AC E8B5F4 0564 call printflags
|
||
2357 10AF E87DF3 042F call blank
|
||
2358 10B2 E823F5 05D8 call printregs
|
||
2359 10B5 E8A5F5 065D call printinstr ;disassemble instruction at [cs:ip]
|
||
2360 10B8 C3 ret
|
||
2361 ;
|
||
2362 XD40:
|
||
2363 10B9 E86FF5 062B CALL PREGHDR1
|
||
2364 10BC B001 MOV AL,1
|
||
2365 10BE EB02 10C2 JMPS XD0
|
||
2366 XNH40:
|
||
2367 10C0 B000 MOV AL,0
|
||
2368 XD0:
|
||
2369 10C2 50 PUSH AX ;SAVE HEADER/NO HEADER FLAG
|
||
2370 10C3 E857F3 041D CALL CRLF
|
||
2371 10C6 E89BF4 0564 CALL PRINTFLAGS
|
||
2372 10C9 E863F3 042F CALL BLANK
|
||
2373 10CC E8FAF4 05C9 CALL PREG1
|
||
2374 10CF E84BF3 041D CALL CRLF
|
||
2375 10D2 58 POP AX
|
||
2376 10D3 FEC8 DEC AL
|
||
2377 10D5 7506 10DD JNZ XD1
|
||
2378 10D7 E85BF5 0635 CALL PREGHDR2
|
||
2379 10DA E840F3 041D CALL CRLF
|
||
2380 XD1:
|
||
2381 10DD E8F3F4 05D3 CALL PREG2
|
||
2382 10E0 E87AF5 065D CALL PRINTINSTR
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 46
|
||
|
||
2383
|
||
2384 10E3 C3 RET
|
||
2385 xcom:
|
||
2386 10E4 C606541201 mov segflag,1 ;display seg reg's in x command
|
||
2387 10E9 E805F3 03F1 call conin
|
||
2388 10EC 3C0D cmp al,eol ;check for command by itself
|
||
2389 10EE 74A5 1095 jz xdisp ;if so, simply display CPU state
|
||
2390 10F0 A25712 mov xtemp,al ;else save char
|
||
2391 10F3 E8FBF2 03F1 call conin
|
||
2392 10F6 3C0D cmp al,eol ;check for single character after X
|
||
2393 10F8 746A 1164 jz xflag ;if so, must be a flag name
|
||
2394 10FA 8A265712 mov ah,xtemp ;else it's a reg name
|
||
2395 10FE 0C80 or al,80h ;since names are declared that way
|
||
2396 1100 86C4 xchg al,ah ;since that's how it is in memory
|
||
2397 1102 E826F4 052B call chkreg ;check for valid reg name + store number in regnum
|
||
2398 1105 E8E9F2 03F1 call conin
|
||
2399 1108 3C0D cmp al,eol
|
||
2400 110A 7555 1161 jnz xerr ;eol must follow reg name
|
||
2401 x0:
|
||
2402 110C E80EF3 041D call crlf
|
||
2403 110F 8B0E5512 mov cx,regnum
|
||
2404 1113 E8EBF4 0601 call printregname
|
||
2405 1116 E816F3 042F call blank
|
||
2406 1119 8B0E5512 mov cx,regnum
|
||
2407 111D E8D5F4 05F5 call printregval
|
||
2408 1120 E80CF3 042F call blank
|
||
2409 1123 E8B1F2 03D7 call getline
|
||
2410 1126 E8C8F2 03F1 call conin
|
||
2411 1129 3C2E cmp al,'.'
|
||
2412 112B 746E 119B jz xret ;done when '.' entered
|
||
2413 112D FF0E0412 dec conptr ;else rescan character
|
||
2414 1131 E871F8 09A5 call getnumber
|
||
2415 1134 3C0D cmp al,eol
|
||
2416 1136 7529 1161 jnz xerr ;eol must follow number
|
||
2417 1138 0AE4 or ah,ah ;see if non-blank entry
|
||
2418 113A 7419 1155 jz xnext ;if blank, go to next reg
|
||
2419 113C 8B0E5512 mov cx,regnum
|
||
2420 1140 8BC3 mov ax,bx ;get new value
|
||
2421 1142 80F908 cmp cl,8 ;are we updating cs?
|
||
2422 1145 7503 114A jnz x1
|
||
2423 1147 A35A12 mov type1seg,ax ;if so, update default type1 segment
|
||
2424 x1:
|
||
2425 114A 80F909 cmp cl,9 ;are we updating ds?
|
||
2426 114D 7503 1152 jnz x2
|
||
2427 114F A35E12 mov type2seg,ax ;if so, update default type2 segment
|
||
2428 x2:
|
||
2429 1152 E805F4 055A call setreg
|
||
2430 xnext:
|
||
2431 1155 FF065512 inc regnum
|
||
2432 1159 833E55120D cmp regnum,totreg
|
||
2433 115E 72AC 110C jb x0
|
||
2434 1160 C3 ret
|
||
2435 xerr:
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 47
|
||
|
||
2436
|
||
2437 1161 E97BF1 02DF jmp err
|
||
2438 ;
|
||
2439 xflag:
|
||
2440 1164 A05712 mov al,xtemp ;get flag name
|
||
2441 1167 E8D7F3 0541 call checkflag ;check for valid flag name
|
||
2442 116A E8B0F2 041D call crlf
|
||
2443 116D 8B0E5512 mov cx,regnum ;restore flag number
|
||
2444 1171 E819F4 058D call printflagname
|
||
2445 1174 E8B8F2 042F call blank
|
||
2446 1177 8B0E5512 mov cx,regnum
|
||
2447 117B E82BF4 05A9 call printflagval
|
||
2448 117E E8AEF2 042F call blank
|
||
2449 1181 E853F2 03D7 call getline
|
||
2450 1184 E81EF8 09A5 call getnumber
|
||
2451 1187 3C0D cmp al,eol
|
||
2452 1189 75D6 1161 jnz xerr ;eol must follow number
|
||
2453 118B 0AE4 or ah,ah ;see if non-blank entry
|
||
2454 118D 740C 119B jz xret ;if blank, done
|
||
2455 118F 83FB01 cmp bx,1
|
||
2456 1192 77CD 1161 ja xerr ;flag value must be 0 or 1
|
||
2457 1194 8B0E5512 mov cx,regnum
|
||
2458 1198 E8D8F3 0573 call setflag
|
||
2459 xret:
|
||
2460 119B C3 ret
|
||
2461 ;
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 48
|
||
|
||
2462
|
||
2463 eject
|
||
2464 ; *********************************
|
||
2465 ; * *
|
||
2466 ; * d a t a a r e a *
|
||
2467 ; * *
|
||
2468 ; *********************************
|
||
2469 ;
|
||
2470 ; user regs must be in cseg, others may be in dseg
|
||
2471 ;
|
||
2472 119C 0000 userax dw 0
|
||
2473 119E 0000 userbx dw 0
|
||
2474 11A0 0000 usercx dw 0
|
||
2475 11A2 0000 userdx dw 0
|
||
2476 11A4 0000 usersp dw 0
|
||
2477 11A6 0000 userbp dw 0
|
||
2478 11A8 0000 usersi dw 0
|
||
2479 11AA 0000 userdi dw 0
|
||
2480 11AC 0000 usercs dw 0
|
||
2481 11AE 0000 userds dw 0
|
||
2482 11B0 0000 userss dw 0
|
||
2483 11B2 0000 useres dw 0
|
||
2484 11B4 0000 userip dw 0
|
||
2485 11B6 0000 userfl dw 0
|
||
2486 119C userreg equ userax
|
||
2487 ;
|
||
2488 11B8 0000 savess dw 0 ;temp holder for sp
|
||
2489 11BA 0000 savesp dw 0 ;temp holder for sp
|
||
2490 ;
|
||
2491 11BC breakfl rs 1 ;break/single step flag (must be in CS)
|
||
2492 ;
|
||
2493 11BD endcs equ $
|
||
2494 ;
|
||
2495 dseg
|
||
2496 org offset endcs
|
||
2497 ;
|
||
2498 ; CCP STACK LOCATION
|
||
2499 ;
|
||
2500 11BD 0000 CCPSS DW 0
|
||
2501 11BF 0000 CCPSP DW 0
|
||
2502 ;
|
||
2503 ; console buffer declarations
|
||
2504 ;
|
||
2505 0040 conbuffmax equ 64
|
||
2506 11C1 40 conbuffhdr db conbuffmax
|
||
2507 11C2 00 conbuffcnt db 0
|
||
2508 11C3 conbuff rs conbuffmax+1 ;leave room for eol
|
||
2509 1204 0000 conptr dw 0
|
||
2510 ;
|
||
2511 ; a command declarations
|
||
2512 ;
|
||
2513 1206 01 assempresent db 1 ;assembler in memory flag
|
||
2514 1207 asmspsav rw 1 ;temporary save for stack pointer
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 49
|
||
|
||
2515
|
||
2516 ;
|
||
2517 ; d command declarations
|
||
2518 ;
|
||
2519 1209 0000 disloc dw 0 ;offset for display
|
||
2520 120B 0000 disseg dw 0 ;segment for display
|
||
2521 120D dismax rw 1 ;end offset of display
|
||
2522 120F tdisp rw 1 ;temporary storage for disloc
|
||
2523 1211 00 LINEMAX DB 0 ;# OF BYTES PER LINE
|
||
2524 1212 10 ND80 DB 16 ;16 BYTES PER LINE IN 80 COL MODE
|
||
2525 1213 06 ND40 DB 6 ;6 BYTES PER LINE IN 40 COL MODE
|
||
2526 1214 08 NDW40 DB 8 ;8 BYTES (4 WORDS) FOR DW IN 40 COL MODE
|
||
2527 1215 0C NLINES DB 12 ;DEFAULT NUMBER OF LINES FOR L, D COMMANDS
|
||
2528 ;
|
||
2529 ; g command declarations
|
||
2530 ;
|
||
2531 1216 0000 goloc dw 0
|
||
2532 1218 0000 goseg dw 0
|
||
2533 121A vectorsave rs 12 ;save area for bytes at 0004h to 000fh
|
||
2534 1226 00 bpcnt db 0 ;breakpoint count
|
||
2535 1227 0000 brk1loc dw 0
|
||
2536 1229 0000 brk1seg dw 0
|
||
2537 122B 00 brk1byt db 0
|
||
2538 122C 0000 brk2loc dw 0
|
||
2539 122E 0000 brk2seg dw 0
|
||
2540 1230 00 brk2byt db 0
|
||
2541 ;
|
||
2542 ; l command declarations
|
||
2543 ;
|
||
2544 1231 0000 lasloc dw 0
|
||
2545 1233 0000 lasseg dw 0
|
||
2546 1235 0000 lasmax dw 0
|
||
2547 1237 lascntsw rb 1 ;# instructions specified or not
|
||
2548 1238 lascnt rb 1 ;number of instructions to disassemble
|
||
2549 1239 01 disempresent db 1 ;disassembler in memory flag
|
||
2550 ;
|
||
2551 ; r command declarations
|
||
2552 ;
|
||
2553 123A startreadoff rw 1 ;offset where file read starts
|
||
2554 123C startreadseg rw 1 ;segment where file read starts
|
||
2555 123E endreadoff rw 1 ;offset where file read ends
|
||
2556 1240 endreadseg rw 1 ;segment where file read ends
|
||
2557 1242 dmaoff rw 1 ;offset of 20-bit dma address
|
||
2558 1244 dmaseg rw 1 ;segment of 20-bit dma address
|
||
2559 ;
|
||
2560 ; t/u command declarations
|
||
2561 ;
|
||
2562 1246 tracecount rw 1 ;number of instructions to trace
|
||
2563 1248 traceprint rb 1 ;display CPU state on each step flag
|
||
2564 1249 00 skipbdos db 0 ;set when trace suspended during BDOS call
|
||
2565 124A 00 USERIFOFF DB 0 ;SET WHEN DDT86 MUST REENABLE USER IF
|
||
2566 ;
|
||
2567 ; w command declarations
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 50
|
||
|
||
2568
|
||
2569 ;
|
||
2570 124B startwriteoff rw 1 ;offset where file write starts
|
||
2571 124D startwriteseg rw 1 ;segment where file write starts
|
||
2572 124F endwriteoff rw 1 ;offset where file write ends
|
||
2573 1251 endwriteseg rw 1 ;segment where file write ends
|
||
2574 ;
|
||
2575 ; x command declarations
|
||
2576 ;
|
||
2577 1253 00 NREG DB 0 ;CURRENT NUMBER OF REGISTER NAMES TO DISPLAY
|
||
2578 ;(MAY DIFFER FOR 40 COLUMN MODE)
|
||
2579 000D TOTREG EQU 13 ;TOTAL NUMBER OF REGISTER NAMES
|
||
2580 0009 nflag equ 9 ;number of flag names
|
||
2581 1254 01 segflag db 1 ;print segment register flag
|
||
2582 1255 regnum rw 1 ;temp for reg/flag number
|
||
2583 1257 xtemp rb 1 ;temp for first char of reg name
|
||
2584 ;
|
||
2585 1258 0000 type1loc dw 0 ;offset for type 1 commands
|
||
2586 125A 0000 type1seg dw 0 ;segment for type 1 commands
|
||
2587 125C 0000 type2loc dw 0 ;offset for type 2 commands
|
||
2588 125E 0000 type2seg dw 0 ;segment for type 2 commands
|
||
2589 1260 usermax rw 1
|
||
2590 1262 userloc2 rw 1
|
||
2591 1264 userseg2 rw 1
|
||
2592 ;
|
||
2593 ; memory control block declarations
|
||
2594 ;
|
||
2595 1266 mcb rs 0 ;used in reading/writing file
|
||
2596 1266 0000 mcbbase dw 0 ;segment of memory block
|
||
2597 1268 0000 mcblen dw 0 ;length of memory block
|
||
2598 126A 00 mcbext db 0 ;returned value from bdos memory functions
|
||
2599 ;
|
||
2600 126B sysif rb 1 ;system interrupt flag
|
||
2601 126C numreq rb 1 ;number required or optional
|
||
2602 126D wmode rb 1 ;set for DW, FW and SW commands
|
||
2603 126E 49 mode db 'I' ;last disk access with 'R' or 'E' command
|
||
2604 126F 00 savevecflag db 0 ;save/restore bp and ss vectors, or not
|
||
2605 1270 00 COL40 DB 0 ;PATCHED TO 1 FOR 40 COLUMN CONSOLE
|
||
2606 1271 00 ERRMODE DB 0 ;SET IF BDOS RETURN ERR MODE SET (V3.0)
|
||
2607 ;
|
||
2608 1272 basepagesave rb 48 ;copy of user's base page
|
||
2609 ;
|
||
2610 ; parsing declarations
|
||
2611 ;
|
||
2612 12A2 203D2E2C3A3B delims db ' ', '=', '.', ',', ':', ';', '[', ']', '<', '>', eol
|
||
2613 5B5D3C3E0D
|
||
2614 000B ndelims equ offset $ - offset delims
|
||
2615 12AD 00 lastchar db 0
|
||
2616 12AE 0000 fcbadr dw 0 ;temp storage for fcb address
|
||
2617 ;
|
||
2618 12B0 rs stsize ;stack size
|
||
2619 1310 stackp rs 0 ;top of stack
|
||
2620 ;
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 51
|
||
|
||
2621
|
||
2622 if debug
|
||
2623 ;
|
||
2624 biosentryoff dw 0a00h ;empty part of ccp (hopefully)
|
||
2625 biosentryseg dw 0 ;same as bdos segment
|
||
2626 ;
|
||
2627 endif
|
||
2628 ;
|
||
2629 end
|
||
2630
|
||
2631
|
||
2632 END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 32%
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 052
|
||
|
||
ALLOCABSMEM 039E L 483# 2143
|
||
ASCEND 0459 L 664 667#
|
||
ASCOUT 044F L 660# 1802
|
||
ASM0 0B40 L 1594 1656# 1663 1670
|
||
ASMENT 0B5A L 45 1592# 1668#
|
||
ASMERR 0B57 L 1652 1666#
|
||
ASMORG 2300 N 22# 35
|
||
ASMRET 0B56 L 1661 1664#
|
||
ASMSPSAV 1207 V 1593 1653 1669 2514#
|
||
ASSEM 2300 L 36# 1659
|
||
ASSEMPRESENT 1206 V 1651 2513#
|
||
ASSM 0B2F L 298 1650#
|
||
BADVER 0989 L 1397 1401#
|
||
BASEPAGESAVE 1272 V 1027 1859 2285 2608#
|
||
BDOS 031D L 332# 334 363 383 390 405 412 416 427 437
|
||
441 445 455 465 469 473 477 485 499 503
|
||
577
|
||
BDOSI 00E0 N 48 53# 219 336
|
||
BDOSINT 0112 L 48# 50 51
|
||
BDOSINTLOC 0112 N 50# 1270
|
||
BDOSINTNUM 0113 N 51# 146
|
||
BLANK 042F L 570 633# 641 934 982 1047 1052 1703 1704 1726
|
||
1782 1796 1975 2068 2175 2178 2265 2357 2372 2405
|
||
2408 2445 2448
|
||
BLOCKCOMPARE 0B60 L 299 1678#
|
||
BPCLEAR 0742 L 1117# 1241 1952
|
||
BPCLOOP 074B L 1121# 1130
|
||
BPCNT 1226 V 1113 1119 1131 2534#
|
||
BPEND 075C L 1122 1132#
|
||
BPV 075D L 1134# 1302
|
||
BPVECT 0764 L 212 1137#
|
||
BPVECTRET 0780 L 1136 1151#
|
||
BREAK0 0855 L 1239#
|
||
BREAKADDR 07C1 L 1188# 1246
|
||
BREAKENTRY 07D7 L 1147 1198#
|
||
BREAKFL 11BC V 1199 1202 1236 2491#
|
||
BRK1BYT 122B V 2537#
|
||
BRK1LOC 1227 V 1120 1276 1277 1930 1933 2535#
|
||
BRK1SEG 1229 V 1274 1928 2536#
|
||
BRK2BYT 1230 V 2540#
|
||
BRK2LOC 122C V 1938 1942 2538#
|
||
BRK2SEG 122E V 1929 2539#
|
||
BUFF 0080 V 29# 166
|
||
CCPSP 11BF V 189 1068 2501#
|
||
CCPSS 11BD V 188 1066 2500#
|
||
CCTRET 024C L 170 183#
|
||
CHECK0 09F0 L 1480# 1486
|
||
CHECKCMDTAIL 022D L 165# 254
|
||
CHECKERR 0557 L 827 839 845#
|
||
CHECKFLAG 0541 L 833# 2441
|
||
CHECKREG 09E8 L 1470# 1509
|
||
CHECKRET 09FE L 1482 1488#
|
||
CHECKSEGREG 09FF L 1491# 1529
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 053
|
||
|
||
CHECKWORD 09D6 L 1461# 1741 1881 2167
|
||
CHKREG 052B L 819# 2397
|
||
CHRET 09E3 L 1464 1467#
|
||
CLOSE 034E L 424# 1856 2336
|
||
CLOSEERR 0358 L 429 431#
|
||
CLOSEM 0189 V 114# 432
|
||
CMD 0C94 V 1820# 1836
|
||
CMP0 0B87 L 1693# 1714
|
||
CMPCONT 0BAC L 1699 1707#
|
||
CMPDONE 0BC1 L 1711 1713 1716#
|
||
CMPERR 0BC2 L 1684 1686 1692 1718#
|
||
COL40 1270 V 1742 2349 2353 2605#
|
||
CONBUFF 11C3 V 176 555 561 589 597 2508#
|
||
CONBUFFCNT 11C2 V 587 2507#
|
||
CONBUFFHDR 11C1 V 585 2506#
|
||
CONBUFFMAX 0040 N 171 173 553 2505# 2506 2508
|
||
CONIN 03F1 L 42 269 596# 749 755 776 1428 1462 1498 1500
|
||
1502 1823 2004 2128 2180 2213 2307 2387 2391 2398
|
||
2410
|
||
CONOUT 0326 L 267 289 353 370# 380# 518 539 572 623 625
|
||
635 652 657 668 685 708 883 903 915 1191
|
||
CONPTR 1204 V 542 553 556 558 562 564 567 569 591 598
|
||
600 764 766 1467 1497 1516 1826 1869 1989 1994
|
||
2000 2131 2185 2218 2310 2413 2509#
|
||
CONSIN 0320 L 349# 361# 544 613 617
|
||
CONSTAT 0334 L 395# 403# 610
|
||
COPYRIGHT 0114 V 72#
|
||
CR 000D N 62# 63 114 117 121 123 127 132 135 551
|
||
622
|
||
CRLF 041D L 264 287 540 621# 629 971 1013 1044 1189 1972
|
||
2172 2259 2262 2271 2355 2370 2374 2379 2402 2442
|
||
CRLFCHK 0428 L 628# 1700 1777 2061
|
||
CTABLE 02E9 V 283 298#
|
||
CTLCHEK 0408 L 609# 630 1262
|
||
CTLEXIT 041C L 612 618#
|
||
CTLS 0013 N 64# 614
|
||
D0 027D L 204 206#
|
||
D1 028A L 211 214#
|
||
D2 02A0 L 247 251#
|
||
DATE 0143 V 83#
|
||
DDT86 024D L 41 186#
|
||
DDTBDOSINTNUM 031E N 148 334#
|
||
DDTORG 0100 N 20# 21 22 39
|
||
DEBUG 0000 N 18# 215 339 347 359 368 378 393 401 535
|
||
581 2622
|
||
DELETE 035D L 435# 1611
|
||
DELIM 0934 L 1331# 1429
|
||
DELIMS 12A2 V 770 2612# 2614
|
||
DELRET 0942 L 1333 1335 1337 1339#
|
||
DIS0 0C17 L 1761 1764#
|
||
DIS00 0BF7 L 1745 1749#
|
||
DIS01 0BFC L 1743 1752#
|
||
DIS02 0BFF L 1748 1751 1754#
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 054
|
||
|
||
DIS1 0C31 L 1763 1772 1774#
|
||
DISEM 1400 L 32# 1015 2069
|
||
DISEMPRESENT 1239 V 1006 2035 2549#
|
||
DISLOC 1209 V 1756 1765 1771 1778 1783 1785 1788 1792 1806 2152
|
||
2519#
|
||
DISMAX 120D V 1775 1793 1808 2521#
|
||
DISP3 0C35 L 1776# 1810
|
||
DISP4 0C43 L 1781# 1794
|
||
DISP6 0C6B L 1787 1791 1795#
|
||
DISP7 0C6E L 1797# 1807
|
||
DISP8 0C93 L 1804 1809 1811#
|
||
DISPLAY 0BD6 L 301 1737#
|
||
DISSEG 120B V 1740 1759 1798 2520#
|
||
DMAOFF 1242 V 1570 1572 1582 1587 1624 1626 1632 2557#
|
||
DMASEG 1244 V 1563 1568 1585 1589 1602 1622 1634 2558#
|
||
EERR 0D12 L 1825 1829 1831 1871#
|
||
ENDCS 11BD L 2493# 2496
|
||
ENDREADOFF 123E V 1566 1584 2266 2305 2555#
|
||
ENDREADSEG 1240 V 1562 1586 2303 2556#
|
||
ENDWRITEOFF 124F V 1604 2306 2328 2572#
|
||
ENDWRITESEG 1251 V 1606 2304 2327 2573#
|
||
EOL 000D N 63# 180 270 563 590 753 1332 1455 1683 1691
|
||
1824 1830 1925 1936 1940 1992 2005 2043 2093 2101
|
||
2129 2135 2181 2223 2308 2314 2324 2331 2388 2392
|
||
2399 2415 2451 2612
|
||
ERR 02DF L 275 277 286# 300 307 308 311 312 313 314
|
||
323 324 746 846 1354 1459 1550 1591 1639 1667
|
||
1719 1872 1909 1953 2026 2080 2119 2158 2202 2233
|
||
2257 2339 2437
|
||
ERRM 03BE L 422 433 451 461 495 510#
|
||
ERRMODE 1271 V 252 1612 2606#
|
||
EX0 0CC3 L 1835 1840#
|
||
EXECUTE 0C97 L 182 302 1822#
|
||
FCB 005C V 27# 1576 1610 1619 1628 1827 1834 1837 1841 1846
|
||
1855 1990 2017 2132 2137 2311 2335
|
||
FCB2 006C V 28# 1996
|
||
FCBADR 12AE V 728 806 2616#
|
||
FIL0 0D33 L 1888 1891#
|
||
FIL1 0D3D L 1895# 1904
|
||
FILERR 0D58 L 1890 1894 1908#
|
||
FILL 0D15 L 303 1880#
|
||
FILLBL 0517 L 736 788 797#
|
||
FILLDONE 051D L 800 802#
|
||
FILLFIELD 04F5 L 732 739 775# 781 792
|
||
FILLQ 0513 L 780 793#
|
||
FILLTYPE 04B9 L 735 738#
|
||
FILLX 0519 L 795 799#
|
||
FILRET 0D57 L 1901 1905#
|
||
FLAGBITS 0170 V 101# 868 889
|
||
FLAGNAME 0167 V 99# 835 880 907
|
||
FREEMEM 03AD L 497# 1845 2147
|
||
GETERR 09D3 L 1448 1450 1456 1458#
|
||
GETFLAG 0597 L 886# 897 910
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 055
|
||
|
||
GETLASTOFFSET 09CB L 1453# 1762 1886 1966 2047 2186
|
||
GETLINE 03D7 L 268 524 541# 583# 2179 2409 2449
|
||
GETMAXMEM 0394 L 475# 2141
|
||
GETN0 09A9 L 1427# 1437
|
||
GETNRET 09BE L 1430 1438#
|
||
GETNUMBER 09A5 L 1420# 1446 1531 2222 2414 2450
|
||
GETOFFSET 09BF L 1441# 1454 1539 1681 1884 1964 2091
|
||
GETS0 0A3B L 1530 1537#
|
||
GETS2 0A44 L 1536 1543#
|
||
GETS3 0A47 L 1533 1547#
|
||
GETSEGANDOFF 0A29 L 1519# 1655 1680 1690 1757 1883 1924 1931 1939 2042
|
||
2090 2100 2169 2323 2329
|
||
GETSRET 0A46 L 1545# 1549
|
||
GOERR 0DB9 L 1941 1951#
|
||
GOLOC 1216 V 1921 1923 1948 2531#
|
||
GORESTORE 0DA3 L 1926 1937 1944#
|
||
GOSEG 1218 V 1919 1927 1946 2532#
|
||
GOUSER 0D5B L 304 1917#
|
||
HEXCON 0943 L 1342# 1434
|
||
HEXERR 0954 L 1348 1350 1353#
|
||
HEXMATH 0DBF L 305 1963#
|
||
HEXRET 0953 L 1345 1351#
|
||
I0 0DF0 L 1993 1995#
|
||
I1 0E01 L 2003# 2009
|
||
I2 0E0C L 2006 2010#
|
||
IDONE 0E2A L 2016 2023#
|
||
IERR 0E2B L 2025#
|
||
IFCB 0DDE L 306 1870 1988#
|
||
IFMASK16 0200 N 58# 195
|
||
IFMASK8 0002 N 59# 203 1229
|
||
INC1OR2 0999 L 1411# 1786 1900 2197
|
||
KWAIT 0419 L 615 617#
|
||
LAS0 0E5A L 2046 2049#
|
||
LAS1 0E68 L 2048 2054#
|
||
LAS2 0E6C L 2056# 2074 2076
|
||
LASCNT 1238 V 2052 2075 2548#
|
||
LASCNTSW 1237 V 2037 2050 2073 2547#
|
||
LASERR 0EA1 L 2036 2079#
|
||
LASLOC 1231 V 1099 1183 2041 2057 2070 2072 2153 2544#
|
||
LASMAX 1235 V 2055 2058 2546#
|
||
LASMORG 1400 N 21# 31
|
||
LASRET 0EA0 L 2059 2071 2077#
|
||
LASSEG 1233 V 2040 2044 2063 2545#
|
||
LASSM 0E2E L 309 2034#
|
||
LASTCHAR 12AD V 734 742 750 758 777 2615#
|
||
LF 000A N 61# 114 117 121 123 127 132 135 624
|
||
LINEMAX 1211 V 1755 1766 1790 2523#
|
||
LOAD 03B2 L 501# 1847
|
||
LOADERR 03BB L 505 507#
|
||
LOADM 0197 V 117# 508
|
||
MAKE 0376 L 453# 1620
|
||
MAKEERR 0380 L 457 459#
|
||
MAKEM 01AC V 121# 460
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 056
|
||
|
||
MCB 1266 V 1844 2140 2142 2146 2595#
|
||
MCBBASE 1266 V 1560 1580 1601 2596#
|
||
MCBEXT 126A V 1843 2145 2598#
|
||
MCBLEN 1268 V 1574 1581 1609 1630 2139 2597#
|
||
MEMERR 03A8 L 480 493#
|
||
MEMM 01B6 V 123# 494
|
||
MODE 126E V 1857 2015 2154 2252 2316 2603#
|
||
MOV0 0ECB L 2103# 2114
|
||
MOVCOM 023D L 172 174#
|
||
MOVE 0EA4 L 310 2088#
|
||
MOVERR 0EEF L 2094 2096 2102 2117#
|
||
MOVRET 0EEE L 2109 2111 2115#
|
||
NBPS 0002 N 56#
|
||
ND40 1213 V 1746 2525#
|
||
ND80 1212 V 1753 2524#
|
||
NDELIMS 000B N 771 2614#
|
||
NDW40 1214 V 1750 2526#
|
||
NFLAG 0009 N 834 840 2580#
|
||
NLINES 1215 V 1767 2051 2527#
|
||
NOT8080 06FE L 1078 1081#
|
||
NOTAST 0504 L 779 782#
|
||
NOTSR 0A24 L 1508 1510 1515#
|
||
NREG 1253 V 920 928 938 979 988 999 2577#
|
||
NUMREQ 126C V 281 1548 1738 1922 2038 2601#
|
||
OPEN 033F L 414# 1842 2138
|
||
OPENERR 0349 L 418 420#
|
||
OPENM 01CD V 127# 421
|
||
PARSE 0491 L 717# 1828 1991 2133 2312
|
||
PARSE2 049C L 726# 1997
|
||
PARSEERR 04C3 L 745# 789
|
||
PARSERET 04BC L 737 740#
|
||
PDELIM 04EC L 769# 785
|
||
PEROUT 0457 L 662 665#
|
||
PF0 0567 L 858# 864
|
||
PF2 05B2 L 899 901#
|
||
PI0 067A L 1012 1014#
|
||
PI1 067E L 1007 1017#
|
||
PLMCONOUT 03C4 L 43 514#
|
||
PLMGETLINE 03D1 L 44 522#
|
||
PLMSET 0957 L 46 1356#
|
||
PNAME 05C5 L 912 914#
|
||
PQUIT 0449 L 650 655#
|
||
PR0 05E0 L 921 929# 939
|
||
PR00 05DB L 924 927#
|
||
PR2 05ED L 931 936#
|
||
PREG1 05C9 L 918# 2373
|
||
PREG2 05D3 L 922# 2381
|
||
PREGHDR1 062B L 977# 2363
|
||
PREGHDR2 0635 L 981# 2378
|
||
PRH0 0645 L 980 989# 1000
|
||
PRH00 0640 L 984 987#
|
||
PRH1 0655 L 991 997#
|
||
PRINT8OR16 045D L 671# 1784 2177
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 057
|
||
|
||
PRINTBYTE 047C L 674 692 695# 1019 1728
|
||
PRINTDWORD 0469 L 677# 1051 1060 1195 1408 1725 1780 2067 2174 2264
|
||
2267
|
||
PRINTERROR 0BC5 L 1702 1706 1721#
|
||
PRINTFLAG 05B6 L 860 906#
|
||
PRINTFLAGNAME 058D L 879# 2444
|
||
PRINTFLAGS 0564 L 856# 2356 2371
|
||
PRINTFLAGVAL 05A9 L 896# 2447
|
||
PRINTINSTR 065D L 1003# 2359 2382
|
||
PRINTIT 061C L 961 963 966#
|
||
PRINTM 043D L 242 511 646# 654 954 1046 1405 2261 2275
|
||
PRINTNIBBLE 0485 L 699 702#
|
||
PRINTREGHEADER 063D L 985# 2351
|
||
PRINTREGNAME 0601 L 950# 993 2404
|
||
PRINTREGS 05D8 L 925# 2358
|
||
PRINTREGVAL 05F5 L 933 942# 2407
|
||
PRINTSEGINFO 0685 L 1022# 2282
|
||
PRINTWORD 0475 L 675 683 688# 947 1974 1979
|
||
PSIRET 06CC L 1035 1062#
|
||
PSRET 096C L 1363 1365#
|
||
RDCONBUFF 032E L 388# 586
|
||
READ 0EF2 L 315 2127#
|
||
READDONE 0AB2 L 1579
|
||
READERR 0AB9 L 1575
|
||
READFILE 0A51 L 1558# 2144
|
||
READM 01D6 V 129# 2260 2274
|
||
READSEC 0362 L 439# 1577
|
||
REGNAME 014D V 85# 823 951
|
||
REGNUM 1255 V 830 842 2403 2406 2419 2431 2432 2443 2446 2457
|
||
2582#
|
||
RERR 0F49 L 2130 2134 2136 2157#
|
||
RESTOREVECT 0796 L 1169# 1235
|
||
RF0 0A65 L 1567# 1590
|
||
RF1 0A72 L 1571# 1588
|
||
RSTORE 08FF L 1280 1301# 1950
|
||
RVRET 07AD L 1171 1178#
|
||
S0 04E3 L 757 763#
|
||
S1 04E7 L 754 765#
|
||
SAV0 0843 L 1230 1232#
|
||
SAVECPU 07E5 L 1200 1203#
|
||
SAVESP 11BA V 1309 1318 2489#
|
||
SAVESS 11B8 V 1315 1317 2488#
|
||
SAVEVECFLAG 126F V 210 1135 1170 2604#
|
||
SAVEVECT 0781 L 1138 1154#
|
||
SC1 0715 L 1087 1089#
|
||
SCANQ 051E L 741 805#
|
||
SEGFLAG 1254 V 960 1011 2220 2386 2581#
|
||
SEGNAMES 0179 V 104# 1042
|
||
SEGREG 015D V 93# 1478
|
||
SET0 0F55 L 2170# 2198
|
||
SET1 0F8E L 2189 2192#
|
||
SET2 0F95 L 2182 2195#
|
||
SET8OR16 096F L 1368# 1898 2194
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 058
|
||
|
||
SETBDOSINT 020A L 145# 208
|
||
SETBP 0733 L 1108# 1278 1934 1943
|
||
SETBYTE 0980 L 1361 1370 1387 1394# 2107
|
||
SETCPUSTATE 06CD L 1065# 1849
|
||
SETDEFSEG 07AE L 1181# 1194 2348
|
||
SETDMA 0385 L 463# 1573 1627 1854
|
||
SETDMAB 038F L 471# 1569 1623 1851
|
||
SETDONE 072B L 1080 1092 1097#
|
||
SETERR 0F9E L 2191 2201#
|
||
SETERRMODE 038A L 249 467#
|
||
SETFLAG 0573 L 867# 2458
|
||
SETMEM 0F4C L 316 2166#
|
||
SETREG 055A L 848# 2429
|
||
SETRET 0F9D L 2184 2199#
|
||
SETUPDISK 04C6 L 730 748# 752
|
||
SETUPHDR 061E L 970# 978 986
|
||
SETWORD 0976 L 1373#
|
||
SIGNON 013A V 80# 241
|
||
SKIPBDOS 1249 V 1242 1250 1279 1945 2564#
|
||
SRET 0988 L 1391 1398#
|
||
SSENTRY 07DF L 1142 1201#
|
||
SST0 086F L 1237 1251#
|
||
SST00 086A L 1243 1249#
|
||
SST1 0889 L 1255 1259#
|
||
STACKP 1310 V 202 263 1227 2619#
|
||
START 02A7 L 262# 271 273 284 290 512 616 1247 1364 1409
|
||
STARTREADOFF 123A V 1565 2263 2301 2553#
|
||
STARTREADSEG 123C V 1561 2148 2299 2554#
|
||
STARTWRITEOFF 124B V 2302 2322 2570#
|
||
STARTWRITESEG 124D V 1600 2300 2321 2326 2571#
|
||
STSIZE 0060 N 55# 2618
|
||
SVRET 0795 L 1165#
|
||
SYSIF 126B V 196 203 1229 2600#
|
||
TABS 0435 L 639# 643 973 995 2273
|
||
TDISP 120F V 1779 1789 1799 1803 1805 2522#
|
||
TESTREGCL 060C L 930 958# 990
|
||
TOTREG 000D N 822 828 2432 2579#
|
||
TR0 0FB5 L 2216 2219#
|
||
TR00 08C6 L 1272 1281#
|
||
TR01 08FB L 1285 1291 1293 1295 1297 1299#
|
||
TRACE 0FA1 L 317 2210#
|
||
TRACE0 0FA6 L 2212# 2243
|
||
TRACE1 0FCE L 2227 2229#
|
||
TRACECOUNT 1246 V 1260 2221 2228 2562#
|
||
TRACEDONE 0864 L 1245# 1261
|
||
TRACEERR 0FD4 L 2225 2232#
|
||
TRACEPRINT 1248 V 1263 2211 2242 2563#
|
||
TRACERESTORE 089C L 1264 1267# 2231
|
||
TYPE1LOC 1258 V 1654 1658 1660 1662 2585#
|
||
TYPE1SEG 125A V 1074 1084 1185 1359 1657 2039 2045 2150 2320 2423
|
||
2586#
|
||
TYPE2LOC 125C V 1679 1685 1695 1701 1708 1709 1882 1893 1896 1899
|
||
1902 2089 2095 2104 2108 2112 2168 2173 2176 2193
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 059
|
||
|
||
2196 2587#
|
||
TYPE2SEG 125E V 1075 1193 1687 1739 1760 2097 2149 2427 2588#
|
||
UNTRACE 0FD7 L 318 2241#
|
||
UPPER 03FD L 602#
|
||
UPRET 0407 L 603 605 607#
|
||
USERAX 119C V 1204 2472# 2486
|
||
USERBP 11A6 V 1210 2477#
|
||
USERBX 119E V 1205 2473#
|
||
USERCS 11AC V 1004 1072 1083 1184 1219 1268 1287 1320 1511 1918
|
||
1947 2480#
|
||
USERCX 11A0 V 1206 2474#
|
||
USERDI 11AA V 1209 2479#
|
||
USERDS 11AE V 1071 1192 1213 1862 2019 2481#
|
||
USERDX 11A2 V 1207 2475#
|
||
USERES 11B2 V 1073 1088 1212 2483#
|
||
USERFL 11B6 V 197 875 876 893 1222 1252 1257 1282 1300 1319
|
||
2485#
|
||
USERIFOFF 124A V 1254 1256 1298 2565#
|
||
USERIP 11B4 V 1005 1098 1182 1217 1240 1269 1288 1321 1920 1949
|
||
2484#
|
||
USERLOC2 1262 V 1689 1697 1705 1712 2099 2106 2110 2590#
|
||
USERMAX 1260 V 1682 1710 1885 1892 1903 2092 2113 2589#
|
||
USERREG 119C V 850 943 1304 2486#
|
||
USERSEG2 1264 V 1688 2098 2591#
|
||
USERSI 11A8 V 1208 2478#
|
||
USERSP 11A4 V 191 1069 1095 1211 1233 2476#
|
||
USERSS 11B0 V 190 1067 1093 1214 2482#
|
||
V0 101B L 2278# 2288
|
||
VECTORSAVE 121A V 1156 1172 2533#
|
||
VERIFY 0FDE L 320 1868 2155 2251#
|
||
VERIFYE 100A L 2256 2270#
|
||
VERIFYR 0FEC L 2254 2258#
|
||
VERM 01E6 V 132# 1404
|
||
VERRET 102F L 2286 2289#
|
||
VERSION 033A L 244 410#
|
||
W0 1068 L 2315 2319#
|
||
W1 1088 L 2318 2333#
|
||
WERR 1092 L 2309 2313 2317 2325 2332 2338#
|
||
WF0 0AFA L 1621# 1635
|
||
WF00 0AF4 L 1613 1615 1618#
|
||
WF1 0B07 L 1625# 1633
|
||
WFERR 0B2C L 1608 1617 1638#
|
||
WMODE 126D V 282 673 1369 1413 1465 1744 1887 2188 2602#
|
||
WRITE 1030 L 321 2298#
|
||
WRITEDONE 0B2B L 1631 1636#
|
||
WRITEERR 0371 L 447 449#
|
||
WRITEFILE 0ABC L 2334
|
||
WRITEM 01F8 V 135# 450
|
||
WRITESEC 0367 L 443# 1629
|
||
X0 110C L 2401# 2433
|
||
X1 114A L 2422 2424#
|
||
X2 1152 L 2426 2428#
|
||
XCOM 10E4 L 322 2385#
|
||
CP/M ASM86 1.1 SOURCE: DDT86.A86 DDT86 1.1 10/2/81 PAGE 060
|
||
|
||
XD0 10C2 L 2365 2368#
|
||
XD1 10DD L 2377 2380#
|
||
XD40 10B9 L 2350 2362#
|
||
XDISP 1095 L 2230 2347# 2389
|
||
XERR 1161 L 2400 2416 2435# 2452 2456
|
||
XFLAG 1164 L 2393 2439#
|
||
XNEXT 1155 L 2418 2430#
|
||
XNH40 10C0 L 2354 2366#
|
||
XNOHDR 10A2 L 1265 2352#
|
||
XRET 119B L 2412 2454 2459#
|
||
XTEMP 1257 V 2390 2394 2440 2583#
|