Pristine Ack-5.5
[Ack-5.5.git] / mach / mantra / int / mloop9
1         .define ignmask
2         .define itoa
3 .sect .text
4 .sect .rom
5 .sect .data
6 .sect .bss
7 .sect .text
8 !---------------------------------------------------------------------------
9 !               MISCELLANEOUS
10 !----------------------------------------------------------------------------
11 ass_z:          mov     (sp)+,d0 ;      bra     5f
12 ass_l:          move.b  (a3)+,-(sp) ;   move.b  (a3)+,1(sp)
13                 move.w  (sp)+,d0
14 5:              checksize
15                 bra     e_oddz
16 4:              move.l  (sp)+,d0 ;      bpl     3f
17                 asr.l   wmu,d0  ;       bra     8f
18 2:              move.w  (sp)+,d0 ;      bpl     3f
19                 asr.w   #1,d0   ;       ext.l   d0
20                 bra     8f
21
22 asp_1W:         asp_2W:         asp_3W:         asp_4W:         asp_5W:
23                 sub.w   #176,d0
24 #ifndef lword
25                 asr.l   #1,d0
26 #endif
27 3:              add.l   d0,sp   ;       jmp     (a4)
28 asp_w0:         move.l  d6,d0   ;       move.b  (a3)+,d0
29 5:              asl.l   wmu,d0 ;        bra     3b
30 asp_lw:         move.b  (a3)+,-(sp) ;   move.b  (a3)+,1(sp)
31                 move.w  (sp)+,d0  ;     ext.l   d0
32 6:              bmi     8f
33                 asl.l   wmu,d0  ;       bra     3b
34 8:              neg.l   d0      ;       sub.l   #1,d0
35 1:              mov     und,-(sp) ;     dbra    d0,1b
36                 jmp     (a4)
37 asp_qw:         move.l  (sp)+,d0 ;      bra     6b
38
39 !-----------------------------------------------------------------------------
40 bls_z:          mov     (sp)+,d0 ;      bra     0f
41 bls_l:          adroff          ;       move.w  (a5),d0
42 0:              checksize
43 2:              move.w  (sp)+,d0 ;      bra     0f
44 4:              move.l  (sp)+,d0 ;      bra     0f
45
46 blm_q:          move.l  (sp)+,d0 ;      bra     0f
47 blm_l:          adroff          ;       move.w  (a5),d0
48                 bra     0f
49 blm_s0:         move.l  d6,d0   ;       move.b  (a3)+,d0
50 0:              move.l  d0,d2   ;       asr.w   wmu,d2
51                 beq     5f      ;       move.l  a5,d1
52                 sub.w   #1,d2   ;       move.l  (sp)+,a0        !dest. address
53                 move.l  (sp)+,a5 ;      cmp.l   a0,a5
54 !a5 contains source address. beware of overlap of pieces
55                 beq     3f      ;       bcs     2f
56 1:              mov     (a5)+,(a0)+ ;   dbra    d2,1b
57 3:              move.l  d1,a5
58 5:              jmp     (a4)
59 2:              add.l   d0,a5   ;       add.l   d0,a0
60 4:              mov     -(a5),-(a0) ;   dbra    d2,4b
61                 bra     3b
62
63 !----------------------------------------------------------------------------
64 csa_z:          mov     (sp)+,d0 ;      bra     0f
65 csa_l:          adroff          ;       move.w  (a5),d0
66 0:              sub.l   wrd,d0  ;       bne     e_illins
67 csa_1W:         move.l  (sp)+,a0 ;      mov     (sp)+,d0
68                 add.l   #4,a0   ;       subt    (a0),d0
69                 blt     6f
70                 comp    word(a0),d0 ;   bhi     6f
71                 extend  d0
72                 asl.l   #2,d0   ;       add.l   wrd,d0
73                 move.l  a0,a1   ;       add.l   d0,a1
74                 move.l  word(a1),d1 ;   bne     5f
75 6:              sub.l   #4,a0   ;       move.l  (a0),d1
76                 beq     e_case
77 5:              move.l  d1,a3   ;       jmp     (a4)
78
79 csb_z:          mov     (sp)+,d0 ;      bra     0f
80 csb_l:          adroff          ;       move.w  (a5),d0
81 0:              comp    wrd,d0 ;        bne     e_illins
82 csb_1W:         move.l  (sp)+,a0 ;      mov     (sp)+,d0
83                 move.l  a0,a3
84 !Use a3 as a general register
85                 mov     4(a0),d1 ;      sub.l   #1,d1
86                 blt     2f
87                 move.l  wrd,d2 ;        add.l   #4,d2
88 1:              add.l   d2,a0   ;       comp    (a0),d0
89                 dbeq    d1,1b   ;       bne     2f
90                 move.l  word(a0),d1 ;   beq     e_case
91                 move.l  d1,a3   ;       jmp     (a4)
92 2:              move.l  (a3),d1 ;       beq     e_case
93                 move.l  d1,a3   ;       jmp     (a4)
94
95 !-----------------------------------------------------------------------------
96 dch_z:          move.l  (sp)+,a0 ;      move.l  (a0),-(sp)
97                 move.l  ml,a0   ;       cmp.l   (sp),a0
98                 bls     e_badptr ;      jmp     (a4)
99
100 lpb_z:          add.l   #0+l0,(sp) ;    jmp     (a4)
101
102 !----------------------------------------------------------------------------
103
104 dup_1W:         mov     (sp),-(sp) ;    jmp     (a4)
105 dup_l:          adroff          ;       move.w  (a5),d0
106                 bra     1f
107 dus_z:          mov     (sp)+,d0 ;      bra     0f
108 dus_l:          adroff          ;       move.w  (a5),d0
109 0:              checksize
110 2:              move.w  (sp)+,d0 ;      bra     1f
111 4:              move.l  (sp)+,d0
112 1:              ble     e_oddz ;        bclr    #0,d0
113                 move.l  sp,a0   ;       add.l   d0,a0
114                 asr.l   wmu,d0  ;       sub.l   #1,d0
115 3:              mov     -(a0),-(sp) ;   dbra    d0,3b
116                 jmp     (a4)
117 !We do not test if d0 is a word multiple indeed .
118
119 !-----------------------------------------------------------------------------
120 exg_z:          mov     (sp)+,d0 ;      bra     0f
121 exg_l:          adroff          ;       move.w  (a5),d0
122                 bra     0f 
123 exg_s0:         move.l  d6,d0   ;       move.b  (a3)+,d0
124 0:              move.l  d7,d1   ;       move.l  d0,a0
125 1:              asri    #1,d0   ;       dbcs    d1,1b
126                 bcs     e_oddz  ;       sub.l   #1,d0
127                 add.l   a0,sp   ;       add.l   sp,a0
128 2:              mov     -(sp),d1 ;      mov     -(a0),(sp)
129                 mov     d1,(a0) ;       dbra    d0,2b
130                 jmp     (a4)
131
132 gto_q:          move.l  (sp)+,a0 ;      bra     3f
133 gto_l:          move.l  d6,a0   ;       move.b  (a3)+,-(sp)
134                 move.b  (a3)+,1(sp) ;   move.w  (sp)+,a0
135 3:              add.l   a6,a0   ;       move.l  (a0)+,a3
136                 move.l  (a0)+,sp 
137 #if count+prof+flow
138 !To find the procedure descriptor of the procedure we go to ,we cannot use
139 !the memory place curproc . We need to find the last time this procedure
140 !called. In the frame of that procedure we find the pointer to the procedure
141 !descriptor we need.
142 2:              move.l  (a2),d0
143                 cmp.l   (a0),d0
144                 beq     1f
145                 move.l  d0,a2
146                 bra     2b
147 1:              move.l  8(a2),a2        !a2 ponts at procedure descriptor.
148                 move.l  8(a2),d0        !countptr in d0.
149                 move.l  d0,countptr     !initially assume first line
150                 sub.l   12(a2),d0
151                 move.l  d0,countfld
152 #endif
153                 move.l  (a0),a2
154                 jmp     (a4)
155
156 lim_z:          clr.l   d0; move.w ignmask, d0
157                 mov     d0,-(sp) ;      jmp     (a4)
158 sim_z:          clr.l   d0; mov (sp)+, d0
159                 move.w  d0,ignmask ;    jmp     (a4)
160
161         .sect .bss
162 ignmask:  .space 2
163         .sect .text
164
165 !---------------------------------------------------------------------------
166 lor_s0:         move.l  d6,d0   ;       move.b  (a3)+,d0
167                 bne     1f      ;       move.l  a2,-(sp)
168                 jmp     (a4)
169 1:              sub.w   #1,d0   ;       bne     2f
170                 move.l  sp,-(sp) ;      jmp     (a4)
171 2:              sub.w   #1,d0   ;       bne     e_illins
172                 move.l  hp,-(sp) ;      jmp     (a4)
173
174 str_s0:         move.l  d6,d0   ;       move.b  (a3)+,d0
175                 bne     1f      ;       move.l  (sp)+,a2
176                 jmp     (a4)
177 1:              sub.w   #1,d0   ;       bne     2f
178                 move.l  (sp)+,sp ;      claimstack
179                 jmp     (a4)
180 2:              sub.w   #1,d0   ;       bne     e_illins
181                 move.l  (sp)+,d1 ;      cmp.l   nd,d1
182                 bcc     3f                                      !break
183                 cmp.l   tblmax,d1 ;     bcs     4f
184 5:              move.l  d1,hp   ;       jmp     (a4)
185 3:              move.l  d1,-(sp)
186                 move.l  d1,-(sp) ;      add.l   #1280,(sp)
187                 bsr     _Xbreak ;       testen  (sp)+
188 4:              beq     1f ;            testen  (sp)+ ; bsr     e_heap ;
189                 move.l  (sp)+,d1 ;      jmp     (a4)
190 1:              move.l  (sp)+,d1 ;      bra     5b
191
192 !----------------------------------------------------------------------------
193 rck_z:          mov     (sp)+,d0 ;      bra     0f
194 rck_l:          adroff          ;       move.w  (a5),d0
195 0:              sub.l   wrd,d0  ;       beq     rck_1W
196                 sub.l   wrd,d0  ;       bne     e_oddz
197                 move.l  (sp)+,a0
198                 mov     (sp),d0 ;       comp    (a0),d0 ;       blt     9f
199                 add.l   wrd,a0  ;       bra     1f
200 rck_1W:         move.l  (sp)+,a0
201                 mov     (sp),d0 ;       comp    (a0),d0 ;       blt     9f
202 1:              comp    word(a0),d0 ;   bgt     9f
203                 jmp     (a4)
204 9:              bra     e_range
205 !Temp. solution until trp_z is implemented
206
207 !--------------------------------------------------------------------------
208 nop_z:
209 lblnop:         lea     nopln+16,a0 ;   clr.l   d1; mov (a6),d1
210                 bsr     itoa    
211                 lea     nopln+33,a0 ;   move.l  sp,d1
212                 bsr     itoa
213                 move.l  #45,-(sp)
214                 pea     nopln   ;       mov     #1,-(sp)
215                 bsr     _Xwrite
216                 add.l   wrd+4,sp
217                 jmp     (a4)
218
219         .sect .data
220 nopln:  .asciz  "line number nop              sp             \n"
221         .align 2
222         .sect .text
223 !unsigned to ascii for integers  , a0 is address of first character
224 ! d1 contains integer. Output is 11 characters of which the first is a space.
225
226         .sect .text
227
228 itoa:           move.l  #9,d4   ;       add.l   #11,a0
229                 move.l  #10,d0
230 0:              bsr     dvu4    ;       add.w   #48,d3
231                 move.b  d3,-(a0) ;      tst.l   d1
232                 dbeq    d4,0b
233 1:              move.b  #32,-(a0) ;     dbra    d4,1b
234                 rts
235
236 !------------------------------------------------------------------------------
237 fil_q:          move.l  (sp)+,a0 ;      bra     3f
238 fil_l:          adroff          ;       move.w  (a5),d0
239                 move.l  d0,a0
240 3:              add.l   a6,a0   ;       cmp.l   4(a6),a0
241                 beq     0f
242 #if     flow+count+prof
243                 move.l  curproc,a1
244                 move.l  8(a1),d0
245                 sub.l   12(a1),d0
246                 move.l  d0,countfld             !START COUNTPTR FOR THIS PROC
247                 move.l  a0,20(a1)               !FILE POINTER IN PROC DES
248 #endif
249                 move.l  a0,4(a6)
250 0:              jmp     (a4)
251
252 !-----------------------------------------------------------------------------
253 lni_z:          ad      #1,(a6)
254 #if     count+flow+prof
255                 add.l   #1,countptr
256 #if     prof
257                 add.l   #4,profile
258 #endif
259 #endif
260                 bra     8f
261 lin_l:          adroff          ;       clr.l   d0
262                 move.w  (a5),d0 ;       bra 1f
263 lin_q:          move.l  (sp)+,d0 ;      bra     1f
264 lin_s0:         move.l  #0,d0   ;       move.b  (a3)+,d0
265 1:              comp    (a6),d0 ;       beq     9f
266                 mov     d0,(a6)
267 #if     count+flow+prof
268                 move.l  countfld,d1
269                 add.l   d0,d1
270                 move.l  d1,countptr
271 #if     prof
272                 asl.l   #2,d1
273                 add.l   ltime,d1
274                 move.l  d1,profile
275 #endif
276 #endif
277 8:
278 #if     last
279                 bsr     nexttab ;
280                 move.l  4(a6),(a1)+     !store new line
281 #if     lword
282                 move.l  (a6),(a1)       !number in buffer lasttable
283 #else
284                 mov     (a6),d0
285                 extend  d0
286                 move.l  d0,(a1)
287 #endif
288 #endif
289 #if     count
290                 move.l  countptr,d1     !LINE NUMBER IN d1
291                 asl.l   #2,d1           !MULTIPLY BY 4
292                 move.l  lcount,a0
293                 add.l   d1,a0
294                 add.l   #1,(a0)         !ADD 1 TO THE CORRESPONDING COUNT
295 #endif
296 #if     flow
297                 move.l  countptr,d1     !LINE NUMBER IN d1
298                 move.l  #8,d0
299                 bsr     dvu4            !QUOTIENT IN d1 REST IN d3
300                 move.l  lflow,a0
301                 add.l   d1,a0
302                 bset    d3,(a0)         !ATTENTION BIT 0 CORR TO LINE 0
303 #endif
304 !9:             bra     nop_z
305 9:              jmp     (a4)
306 !----------------------------------------------------------------------------
307 mon_z:          mov     (sp)+,d0 ;      bmi     e_badmon
308                 cmp.l   #64,d0  ;       bge     e_badmon
309                 move.l  a4,-(sp) ;      asl.l   #2,d0
310                 add.l   #syscal,d0 ;    move.l  d0,a0
311                 move.l  (a0),a0 ;       jmp     (a0)
312
313         .sect .data
314 syscal:
315 .data4 e_badmon,        hlt_z,          _Xfork,         _Xread
316 .data4 _Xwrite,         _Xopen,         _Xclose,        _Xwait
317 .data4 _Xcreat,         _Xlink,         _Xunlink,       e_badmon
318 .data4 _Xchdir,         e_badmon,       _Xmknod,        _Xchmod
319 .data4 _Xchown,         _Xbreak,        _Xstat,         _Xlseek
320 .data4 _Xgetpid,        _Xmount,        _Xumount,       _Xsetuid
321 .data4 _Xgetuid,        _Xstime,        _Xptrace,       _Xalarm
322 .data4 _Xfstat,         _Xpause,        _Xutime,        e_badmon
323 .data4 e_badmon,        _Xaccess,       _Xnice,         _Xftime
324 .data4 _Xsync,          _Xkill,         e_badmon,       e_badmon
325 .data4 e_badmon,        _Xdup,          _Xpipe,         _Xtimes
326 .data4 _Xprofil,        e_badmon,       _Xsetgid,       _Xgetgid
327 .data4 _sigtrp,         e_badmon,       e_badmon,       _Xacct
328 .data4 e_badmon,        e_badmon,       _Xioctl,        e_badmon
329 .data4 e_badmon,        e_badmon,       e_badmon,       _Xexece
330 .data4 _Xumask,         _Xchroot,       e_badmon,       e_badmon
331
332         .sect .text