Mercurial > hg > Members > kono > nitros9-code
comparison level2/modules/krnp4_regdump.asm @ 747:27033c1dd023
Moved os9p3 and os9p4 to OS-9 Level Two distribution
author | boisy |
---|---|
date | Wed, 08 Jan 2003 03:40:21 +0000 |
parents | |
children | d13864ef3317 |
comparison
equal
deleted
inserted
replaced
746:b2d917ea47fc | 747:27033c1dd023 |
---|---|
1 ******************************************************************** | |
2 * OS9p4 - User Register Dump System Call for OS9 Level Two | |
3 * | |
4 * $Id$ | |
5 * | |
6 * Copyright February,1989 by Ron Lammardo | |
7 * | |
8 * This system call can be used in an application program to dump the | |
9 * current contents of all user registers in Hex,Decimal,Binary and Ascii | |
10 * (Registers "A" and "B" Only). This module MUST be present in the | |
11 * bootfile. If no OS9P3 module is found,change the "mname" and "nextname" | |
12 * as appropriate. | |
13 * | |
14 * If there is a conflict with the code used for this system called, it can | |
15 * be changed by resetting the equate at "F$RegDmp" | |
16 * | |
17 * NOTE: All registers EXCEPT 'CC' are preserved....OS9 internally resets | |
18 * the condition code register upon service call exit. | |
19 * | |
20 * Ed. Comments Who YY/MM/DD | |
21 * ------------------------------------------------------------------ | |
22 * 1 Started RL 89/02/?? | |
23 | |
24 nam os9p4 | |
25 ttl User Register Dump System Call for OS9 Level Two | |
26 | |
27 ifp1 | |
28 use defsfile | |
29 endc | |
30 | |
31 tylg set systm+objct | |
32 atrv set reent+revision | |
33 revision set 1 | |
34 edition set 1 | |
35 | |
36 mod eom,name,tylg,atrv,start,0 | |
37 | |
38 name fcs /OS9p4/ name of this module | |
39 fcb edition | |
40 | |
41 svctabl fcb F$RegDmp F$RegDmp code | |
42 fdb regdmp-*-2 offset to actual code | |
43 fcb $80 end of table | |
44 | |
45 start leay <svctabl,pcr point to service table | |
46 os9 F$SSvc insert the new op code in the table | |
47 lda #tylg get next module type (same as this one!) | |
48 leax <nextname,pcr get address of next module name | |
49 os9 F$Link attempt to link to it | |
50 bcs endsetup no good...skip this | |
51 jsr ,y else go execute it | |
52 endsetup rts return back to previous module | |
53 | |
54 nextname fcc /OS9P5/ next module name to link to | |
55 fcb $0d | |
56 | |
57 regdmp equ * | |
58 IFNE H6309 | |
59 pshs cc,a,b,e,f,dp,x,y,u save all registers | |
60 ELSE | |
61 pshs cc,a,b,dp,x,y,u save all registers | |
62 ENDC | |
63 tfr u,y transfer addresses | |
64 leas -60,s back up for some variable storage | |
65 leau 4,s buffer starts here | |
66 clr ,u+ set flag to print ascii char | |
67 lda #$20 get a space | |
68 ldb #50 number of chars to clear | |
69 tfr u,x set register for loop | |
70 | |
71 clrloop sta ,x+ initialize a space | |
72 decb decrement counter | |
73 bne clrloop if more..loop back & clear another | |
74 lbsr reg060 send a <cr> | |
75 leax reg080,pcr point to start of control table | |
76 clra clear msb of register | |
77 ldb R$A,y get register from stack | |
78 bsr reg000 dump register A | |
79 ldb R$B,y get register from stack | |
80 bsr reg000 dump register B | |
81 IFNE H6309 | |
82 ldb R$E,y get register from stack | |
83 bsr reg000 dump register E | |
84 ldb R$F,y get register from stack | |
85 bsr reg000 dump register F | |
86 ENDC | |
87 inc -1,u turn off ascii char print flag | |
88 ldd R$X,y get register from stack | |
89 bsr reg000 dump register X | |
90 ldd R$Y,y get register from stack | |
91 bsr reg000 dump regisetr Y | |
92 ldd R$U,y get register from stack | |
93 bsr reg000 dump register U | |
94 ldb R$CC,y get register from stack | |
95 bsr reg000 dump register CC | |
96 ldb R$DP,y get register from stack | |
97 bsr reg000 dump register DP | |
98 ldd R$PC,y get user Task Number | |
99 bsr reg000 dump register PC | |
100 ldy <D.Proc get address of users process descriptor | |
101 ldd P$SP,y get users stack address | |
102 IFNE H6309 | |
103 addd #14 add on for registers which were saved | |
104 ELSE | |
105 addd #12 add on for registers which were saved | |
106 ENDC | |
107 bsr reg000 dump register S | |
108 lbsr reg060 send a <CR> | |
109 leas 60,s restore stack pointer | |
110 IFNE H6309 | |
111 puls cc,a,b,e,f,dp,x,y,u,pc restore all registers and return | |
112 ELSE | |
113 puls cc,a,b,dp,x,y,u,pc restore all registers and return | |
114 ENDC | |
115 | |
116 * Dump a register in "D" | |
117 * X = Control Table Location | |
118 * U = Output buffer Location | |
119 | |
120 reg000 pshs y save y register | |
121 tfr d,y register in y | |
122 lda ,x # of bytes | |
123 leax 3,x point past table entry | |
124 pshs a,x,y,u save registers | |
125 ldd -2,x get register name | |
126 std ,u++ move to buffer | |
127 ldd #"=$ get chars | |
128 std ,u++ move to buffer | |
129 ldd 3,s get reg | |
130 lbsr gethex convert to hex | |
131 tst 0,s 1 byte ? | |
132 bne reg010 no...skip this | |
133 ldd 2,u get 2 lsb's | |
134 std ,u store in msb's | |
135 ldd #$2020 get two blanks | |
136 std 2,u store in lsb's | |
137 | |
138 reg010 ldd #$2023 get a space and "#" | |
139 std 4,u move in two spaces | |
140 leau 6,u point to start of decimal output buffer | |
141 ldd 3,s get register | |
142 lbsr getdec convert to decimal | |
143 tst 0,s is it one byte | |
144 bne reg020 no..skip this | |
145 ldd 2,u else get third & fourth chars | |
146 std ,u store as first two | |
147 lda 4,u get fifth char | |
148 sta 2,u store as third | |
149 ldd #$2020 get two spaces | |
150 std 3,u store as 4th & 5th chars | |
151 | |
152 reg020 ldd #$2025 get a blank & "%" | |
153 std 5,u move it to buffer | |
154 leau 7,u point to start of binary output area | |
155 tfr a,b space in 'b' | |
156 std 16,u space out ascii char | |
157 ldd 3,s get register | |
158 bsr getbin convert to binary | |
159 tst 0,s check byte count | |
160 bne reg040 skip if two bytes | |
161 ldb #8 loop counter | |
162 | |
163 reg030 lda 8,u get two chars from second 8 digits | |
164 sta ,u+ store in first 8 digits | |
165 lda #$20 get two blanks | |
166 sta 7,u store in second 8 digits | |
167 decb decrement counter | |
168 bne reg030 loop back if not done | |
169 leau -8,u back up to beginning of binary digit output | |
170 ldb 4,s get lsb of register | |
171 tst -18,u check if we want to print ascii char | |
172 bne reg040 nope..skip this | |
173 cmpb #$20 compare char with space | |
174 blo reg040 if lower..skip this | |
175 cmpb #'z compare with last alpha char | |
176 bhi reg040 if higher..skip this | |
177 stb 17,u else store the char | |
178 | |
179 reg040 lda #C$CR get a <cr> | |
180 sta 18,u and store it | |
181 leax -17,u back up to buffer start | |
182 bsr reg070 send it | |
183 clra clear msb for next reg | |
184 puls b,x,y,u restore registers | |
185 puls y,pc restore y & return | |
186 | |
187 reg050 fcb $0d | |
188 | |
189 reg060 leax <reg050,pcr point to <cr> | |
190 | |
191 reg070 pshs x,y,u,a,b save registers | |
192 ldy <D.Proc get process descriptor address | |
193 lda P$Path+2,y get user error path number | |
194 pshs a save it | |
195 ldu P$SP,y get user stack address | |
196 leau -50,u back off to make room | |
197 lda <D.SysTsk get system task number | |
198 ldb P$Task,y get users task number | |
199 ldy #40 chars to move | |
200 os9 F$Move move from system to user space | |
201 tfr u,x restore buffer address | |
202 puls a restore user error path number | |
203 os9 I$WritLn send it | |
204 puls x,y,u,a,b,pc restore registers & return | |
205 | |
206 * Control Table - Format is : | |
207 * Byte count (0=1,1=2) | |
208 * Register name (Two chars) | |
209 | |
210 reg080 fcb 0 | |
211 fcc /a / | |
212 fcb 0 | |
213 fcc /b / | |
214 IFNE H6309 | |
215 fcb 0 | |
216 fcc /e / | |
217 fcb 0 | |
218 fcc /f / | |
219 ENDC | |
220 fcb 1 | |
221 fcc /x / | |
222 fcb 1 | |
223 fcc /y / | |
224 fcb 1 | |
225 fcc /u / | |
226 fcb 0 | |
227 fcc /cc/ | |
228 fcb 0 | |
229 fcc /dp/ | |
230 fcb 1 | |
231 fcc /pc/ | |
232 fcb 1 | |
233 fcc /s / | |
234 | |
235 | |
236 * Convert "D" to binary digits in buffer "U" | |
237 | |
238 getbin pshs u,b save 'u', second byte of register | |
239 bsr bin010 convert first byte | |
240 puls a get second byte | |
241 bsr bin010 convert it | |
242 puls u,pc restore 'u' and return | |
243 | |
244 bin010 bita #%10000000 check bit | |
245 bsr bin020 print result | |
246 bita #%01000000 | |
247 bsr bin020 | |
248 bita #%00100000 | |
249 bsr bin020 | |
250 bita #%00010000 | |
251 bsr bin020 | |
252 bita #%00001000 | |
253 bsr bin020 | |
254 bita #%00000100 | |
255 bsr bin020 | |
256 bita #%00000010 | |
257 bsr bin020 | |
258 bita #%00000001 | |
259 | |
260 bin020 beq bin030 skip this if bit was set | |
261 ldb #'1 else get an ascii '1' | |
262 bra bin040 skip next | |
263 | |
264 bin030 ldb #'0 bit not set...get an ascii '0' | |
265 | |
266 bin040 stb ,u+ store the ascii char | |
267 rts | |
268 | |
269 * Convert "D" to 4 hex digits in buffer "U" | |
270 | |
271 gethex pshs u,b save 'u',second register byte | |
272 bsr gth010 convert first byte | |
273 puls a restore second byte | |
274 bsr gth010 convert it | |
275 puls u,pc restore 'u' and return | |
276 | |
277 gth010 pshs a save the byte | |
278 lsra shift left 4 bits to right | |
279 lsra | |
280 lsra | |
281 lsra | |
282 bsr gth020 convert to hex digit | |
283 puls a restore the byte | |
284 anda #$0f strip off high 4 digits | |
285 | |
286 gth020 adda #'0 make it ascii | |
287 cmpa #$3a is it a letter | |
288 blt gth030 nope..skip this | |
289 adda #7 else add bias | |
290 | |
291 gth030 sta ,u+ store the ascii character | |
292 rts return | |
293 | |
294 * Convert "D" to 5 decimal digits in buffer at "U" | |
295 getdec pshs x,y,u save registers | |
296 ldx #10000 get decimal number for subtraction | |
297 bsr gtd010 get the decimal digit | |
298 ldx #01000 | |
299 bsr gtd010 | |
300 ldx #00100 | |
301 bsr gtd010 | |
302 ldx #00010 | |
303 bsr gtd010 | |
304 ldx #00001 | |
305 bsr gtd010 | |
306 puls x,y,u,pc restore registers & return | |
307 | |
308 gtd010 pshs x,a save x register & extra byte | |
309 clr ,s clear counter | |
310 | |
311 gtd020 cmpd 1,s compare 'd' with 'x' on stack | |
312 blo gtd030 less...skip this | |
313 subd 1,s else subtract number on stack | |
314 inc ,s increment digit counter | |
315 bra gtd020 and loop back | |
316 | |
317 gtd030 std 1,s save remainder of number | |
318 ldb ,s+ get counter | |
319 addb #$30 make it ascii | |
320 stb ,u+ and move it as output | |
321 puls d,pc restore remainder & return | |
322 | |
323 emod | |
324 eom equ * | |
325 end |