Pristine Ack-5.5
[Ack-5.5.git] / mach / mantra / int / mloopa
1         .define e_memflt
2 .sect .text
3 .sect .rom
4 .sect .data
5 .sect .bss
6 .sect .text
7 e_array:        cl      -(sp)    ;      bra     error
8 e_range:        mov     #0x1,-(sp) ;    bra     error
9 e_set:          mov     #0x2,-(sp) ;    bra     error
10 e_iovfl:        mov     #0x3,-(sp) ;    bra     error
11 e_fovfl:        mov     #0x4,-(sp) ;    bra     error
12 e_funfl:        mov     #0x5,-(sp) ;    bra     error
13 e_idivz:        mov     #0x6,-(sp) ;    bra     error
14 e_fdivz:        mov     #0x7,-(sp) ;    bra     error
15 e_iund:         mov     #0x8,-(sp) ;    bra     error
16 e_fund:         mov     #0x9,-(sp) ;    bra     error
17 e_conv:         mov     #0xA,-(sp) ;    bra     error
18 e_stack:        mov     #0x10,-(sp) ;   bra     fatal
19 e_heap:         mov     #0x11,-(sp) ;   bra     error
20 e_illins:       mov     #0x12,-(sp) ;   bra     fatal
21 e_oddz:         mov     #0x13,-(sp) ;   bra     fatal
22 e_case:         mov     #0x14,-(sp) ;   bra     fatal
23 e_memflt:       mov     #0x15,-(sp) ;   bra     fatal
24 e_badptr:       mov     #0x16,-(sp) ;   bra     fatal
25 e_badpc:        mov     #0x17,-(sp) ;   bra     fatal
26 e_badlae:       mov     #0x18,-(sp) ;   bra     error
27 e_badmon:       mov     #0x19,-(sp) ;   bra     error
28 e_badlin:       mov     #0x1A,-(sp) ;   bra     error
29 e_badgto:       mov     #0x1B,-(sp) ;   bra     error
30
31 flnim:          bra     e_illins
32 no8bar:         bra     e_oddz
33 !---------------------------------------------------------------------------
34 !               ERRORS AND TRAPS
35 !----------------------------------------------------------------------------
36 fatal:          clr.l   -(sp)                   !dummy return address
37                 pea     hlt_z                   !RETURN FROM FATAL HALTS
38                 mov     8(sp),-(sp)
39
40 error:          movem.l d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6,-(sp)
41                 mov     60(sp),d0               !ERROR NUMBER IN d0
42                 lea     retsize,a1
43                 move.l  eb,a6                   !JUST TO BE SURE
44                 lea     retarea,a5              !JUST TO BE SURE
45                 lea     loop,a4
46                 move.l  #16,d1
47 1:              move.w  -(a1),-(sp)
48                 dbra    d1,1b
49                 cmp.w   #0xB,d0
50                 bge     0f              !FATAL ERROR , START ERROR HANDLING
51                 move.l  #0x1,d1
52                 asl.l   d0,d1
53                 move.w  ignmask,d2
54                 not.w   d2
55                 and.w   d2,d1
56                 bne     0f
57                 move.l  #16,d1
58                 lea     retsize,a1
59 1:              move.w  (sp)+,(a1)+
60                 dbra    d1,1b
61                 movem.l (sp)+,d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
62
63                 add.l   wrd,sp          !REMOVE ERROR NUMBER
64                 rts
65
66 0:              move.l  uerrorp,a0
67                 cmp.l   #-1,a0
68                 beq     notrap
69                 mov     d0,-(sp)
70                 move.l  uerrorp,-(sp)
71                 move.l  #-1,uerrorp             !USER MUST SET TRAP AGAIN
72                 bra     cai_z
73
74 !-----------------------------------------------------------------------------
75 rtt_z:          move.l  a2,sp
76                 add.l   #0x10,sp                !REMOVE RETURN STATUS BLOCK
77                 add.l   wrd,sp                  !REMOVE  ERROR NUMBER
78                 move.l  #16,d0
79                 lea     retsize,a1
80 1:              move.w  (sp)+,(a1)+
81                 dbra    d0,1b
82                 movem.l (sp)+,d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
83                 add.l   wrd,sp
84                 rts
85
86 trp_z:          sub.l   #4,sp
87                 mov     4(sp),(sp)              !COPY ERROR NUMBER
88                 move.l  a4,word(sp)             !RETURN ADDRESS TO MAIN LOOP
89                 bra     error
90
91 sig_z:          move.l  (sp),d0
92                 move.l  uerrorp,(sp)
93                 move.l  d0,uerrorp
94                 jmp     (a4)
95
96         .sect .data
97 uerrorp:        .data4  0x-1
98         .sect .text
99
100 !-----------------------------------------------------------------------------
101 !FIRST INFORMATION ABOUT THE KIND OF THE ERROR
102 notrap:         add.l   #38,sp
103                 movem.l (sp)+,d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
104 notrap1:        comp    #29,d0                  !ERROR NUMBER STILL IN d0
105                 blt     1f                      !START PRINTING ERROR
106                 extend  d0                      !NUMBER.
107                 move.l  d0,d1
108                 lea     erno+5,a0
109                 bsr     itoa
110                 move.l  #609,d0
111                 bra     2f
112 1:              mulu    #21,d0
113 2:              lea     emerr,a0
114                 move.l  #20,-(sp)
115                 pea     0(a0,d0)
116                 mov     #2,-(sp)                !STANDARD ERROR
117                 bsr     _Xwrite
118                 add.l   wrd+4,sp
119 !NEXT INFORMATION ABOUT THE LINE NUMBER
120                 clr.l   d1
121                 mov     (a6),d1
122                 lea     emess+14,a0
123                 bsr     itoa
124                 move.l  #30,-(sp)
125                 pea     emess
126                 mov     #2,-(sp)
127                 bsr     _Xwrite
128                 add.l   wrd+4,sp
129 !NOW INFORMATION ABOUT THE FILES
130 2:              move.l  4(a6),a0
131                 cmp.l   #0,a0
132                 beq     5f
133                 move.l  a0,a1
134                 sub.l   #4,sp
135                 move.l  a1,-(sp)
136                 move.l  #-1,d0
137 1:              add.l   #1,d0
138                 tst.b   (a1)+
139                 bne     1b
140                 move.l  d0,4(sp)
141                 mov     #2,-(sp)
142                 bsr     _Xwrite
143                 add.l   wrd+4,sp
144 5:              move.w  #0x0A,-(sp)
145                 move.l  #2,-(sp)
146                 pea     4(sp)
147                 mov     #2,-(sp)
148                 bsr     _Xwrite
149                 add.l   wrd+6,sp
150                 comp    #0xB,(sp)
151                 beq     1f
152
153                 move.l  #-1,argc
154                 clr.l   -(sp)           !dummy return address
155                 bra     hlt_z
156
157 1:              add.l   wrd,sp
158                 jmp     (a4)
159
160 !---------------------------------------------------------------------------
161 !               EXIT HANDLING
162 !--------------------------------------------------------------------------
163 hlt_z:          add.l   #4,sp           !remove return address
164 #if     prof
165         .sect .data
166 emprof: .asciz  "em_profile\0"
167         .align 2
168         .sect .bss
169 profile: .space 4
170 ltime:  .space 4
171 profsiz: .space 4
172         .sect .text
173                 tst.l   firstp
174                 beq     lhalt
175                 pea     emprof
176                 bsr     _Xunlink
177                 testen  (sp)+
178                 blt     1f
179                 mov     #0x1B6,-(sp)
180                 pea     emprof
181                 bsr     _Xcreat
182                 testen  (sp)+
183                 blt     1f
184                 mov     (sp)+,d0
185                 move.l  ltime,a4        !a4 points at bottem of prof table
186                 bsr     tabprint
187 1:
188 #endif
189 #if flow
190                 tst.l   firstp
191                 beq     lhalt
192                 pea     emflow
193                 bsr     _Xunlink
194                 testen  (sp)+
195                 blt     1f
196                 mov     #0x1B6,-(sp)
197                 pea     emflow
198                 bsr     _Xcreat
199                 testen  (sp)+
200                 blt     1f
201                 mov     (sp)+,d0
202                 move.l  flowsiz,-(sp)
203                 move.l  lflow,-(sp)
204                 mov     d0,-(sp)
205                 bsr     _Xwrite
206                 testen  (sp)+
207                 blt     1f
208                 add.l   #4,sp
209         .sect .data
210 emflow: .asciz  "em_flow\0"
211         .align 2
212         .sect .bss
213 lflow:  .space 4
214 flowsiz: .space 4
215         .sect .text
216 1:
217 #endif
218 #if     count
219                 tst.l   firstp
220                 beq     lhalt
221                 pea     emcount
222                 bsr     _Xunlink
223                 testen  (sp)+
224                 blt     1f
225                 mov     #0x1B6,-(sp)
226                 pea     emcount
227                 bsr     _Xcreat
228                 testen  (sp)+
229                 blt     1f
230                 mov     (sp)+,d0
231                 move.l  lcount,a4
232                 bsr     tabprint
233 1:
234         .sect .data
235 emcount: .asciz "em_count\0"
236         .align 2
237         .sect .bss
238 lcount: .space 4
239 countsiz: .space 4
240 #endif
241 #if opfreq
242         .sect .data
243 emopf:  .asciz  "em_opfreq\0"
244         .align
245         .sect .bss
246 counttab:  .space       1892
247         .sect .text
248                 pea     emopf
249                 bsr     _Xunlink
250                 testen  (sp)+
251                 blt     1f
252                 mov     #0x1B6,-(sp)
253                 pea     emopf
254                 bsr     _Xcreat
255                 testen  (sp)+
256                 blt     1f
257                 mov     (sp)+,d0
258                 move.l  #1884,-(sp)
259                 pea     counttab
260                 mov     d0,-(sp)
261                 bsr     _Xwrite
262                 testen  (sp)+
263                 blt     1f
264                 add.l   #4,sp
265 1:
266 #endif
267 #if count+flow+prof
268         .sect .bss
269 countfld: .space 4                      !COUNT NUMBER - NUMBER OF LINE 1 OF PROC
270 countptr: .space 4                      !COUNT NUMBER OF CURRENT LINE
271 #endif
272 lhalt:
273 #if     last
274         .sect .text
275                 pea     emlast
276                 bsr     _Xunlink
277                 testen  (sp)+
278                 beq     1f
279                 testen  (sp)+           ! ignore result
280 1:
281                 mov     #0x1B6,-(sp)
282                 pea     emlast
283                 bsr     _Xcreat
284                 testen  (sp)+
285                 bne     halt
286                 mov     (sp)+,d6        !d6 contains file descriptor
287                 cmp.l   #-1,linused-4   !test if buffer is fully used
288                 beq     0f
289                 bsr     nexttab
290                 bra     1f
291 0:              lea     lasttable,a1
292 1:              tst.l   (a1)
293                 bne     2f              !exists entry in table
294                 move.l  #22,-(sp)       !here case no lines processed
295                 pea     mess1
296                 mov     d6,-(sp)
297                 bsr     _Xwrite
298                 testen  (sp)+
299                 bne     halt
300                 add.l   #4,sp
301                 bra     9f
302 2:              move.l  a1,-(sp)
303                 move.l  #7,-(sp)        !announce new file name
304                 pea     mess2
305                 mov     d6,-(sp)
306                 bsr     _Xwrite
307                 testen  (sp)+
308                 bne     halt
309                 add.l   #4,sp
310                 move.l  (sp)+,a1
311                 move.l  (a1),d7
312                 move.l  d7,a0           !keep file pointer in d7
313                 clr.l   (a1)+           !this will stop the printing
314                 move.l  #-1,d1          !d1 will contain length of file name
315 3:              add.l   #1,d1
316                 tst.b   (a0)+
317                 bne     3b
318                 move.l  a1,-(sp)
319                 move.l  d1,-(sp)
320                 move.l  d7,-(sp)
321                 mov     d6,-(sp)
322                 bsr     _Xwrite
323                 testen  (sp)+
324                 bne     halt
325                 add.l   #4,sp
326                 move.l  (sp)+,a1
327 4:              move.l  (a1),d1         !next print line numbers
328                 lea     mess3,a0
329                 bsr     itoa
330                 move.l  a1,-(sp)
331                 move.l  #12,-(sp)
332                 pea     mess3
333                 mov     d6,-(sp)
334                 bsr     _Xwrite
335                 testen  (sp)+
336                 bne     halt
337                 add.l   #4,sp
338                 move.l  (sp)+,a1
339                 bsr     nexttab
340                 tst.l   (a1)            !in case 0 no more lines
341                 beq     9f
342                 cmp.l   (a1),d7
343                 bne     2b              !new file name
344                 clr.l   (a1)+           !skip file name
345                 bra     4b              !only new line
346 9:
347         .sect .data
348 emlast: .asciz  "em_last"
349 mess1:  .asciz  "no line processed yet\n"
350 mess2:  .asciz  "\nfile :"
351 mess3:  .asciz  "           \n"
352         .align 2
353         .sect .bss
354 lasttable:  .space  512
355 linused:    .space  4
356 #endif
357         .sect .text
358 halt:           bsr     _Xexit
359
360         .sect .data
361 emerr:
362 .asciz  "ARRAY BOUND ERROR  \n"
363 .asciz  "RANGE BOUND ERROR  \n"
364 .asciz  "SET BOUND ERROR    \n"
365 .asciz  "INTEGER OVERFLOW   \n"
366 .asciz  "FLOATING OVERFLOW  \n"
367 .asciz  "FLOATING UNDERFLOW \n"
368 .asciz  "INT. DIV. BY ZERO  \n"
369 .asciz  "DIVIDE BY 0.0      \n"
370 .asciz  "UNDEFINED INTEGER  \n"
371 .asciz  "UNDEFINED FLOAT    \n"
372 .asciz  "CONVERSION ERROR   \n"
373 .asciz  "NO FLOATING POINT  \n"
374 .asciz  "NO 8 BYTE ARITH.   \n"
375 .asciz  "NO LOAD FILE       \n"
376 .asciz  "LOAD FILE ERROR    \n"
377 .asciz  "PROGRAM TOO LARGE  \n"
378 .asciz  "STACK OVERFLOW     \n"
379 .asciz  "HEAP OVERFLOW      \n"
380 .asciz  "ILLEGAL INSTRUCTION\n"
381 .asciz  "ILLEGAL SIZE ARG.  \n"
382 .asciz  "CASE  ERROR        \n"
383 .asciz  "ADDRESS NON EX. MEM\n"
384 .asciz  "BAD POINTER USED   \n"
385 .asciz  "PR COUNT. OUT RANGE\n"
386 .asciz  "BAD ARG. OF LAE    \n"
387 .asciz  "BAD MONITOR CALL   \n"
388 .asciz  "ARG OF LIN TOO HIGH\n"
389 .asciz  "GTO DESCR. ERROR   \n"
390 .asciz  "BAD RETURN SIZE    \n"
391 erno:
392 .asciz  "ERRNO              \n"
393 emess:
394 .asciz  "ON SOURCE LINE             OF\n"
395 .align 2
396 !-----------------------------------------------------------------------------
397 !       SUBROUTINES FOR THE INTERPRETOR
398 !------------------------------------------------------------------------------
399         .sect .text
400 #if     last
401 nexttab:        move.l  linused,a1
402                 add.l   #8,a1
403                 cmp.l   #linused,a1     !top of buffer reached?
404                 bne     1f              !if so back to bottom
405                 sub.l   #512,a1
406 1:              move.l  a1,linused
407                 rts
408 #endif
409 #if count+prof
410 !SUBROUTINE FOR PRINTING TABLES . EXPECTS BOTTOM OF TABLE IN a4 AND FILE
411 !DESCRIPTOR IN d0 .IN maxcount NUMBER OF 4 BYTE WORDS IN THE TABLE.
412         .sect .text
413 tabprint:       mov     d0,-(sp)        !KEEP FILE DESCRIPTOR FOR WRITING
414                 lea     buffer,a3
415                 move.l  firstp,a1       !IN a1 POINTER TO CURRENT PROC.
416                 move.l  #0,a2           !IN a2 POINTER TO FILENAME .
417 2:              move.l  16(a1),d0
418                 beq     9f              !LAST PROCEDURE , EXCEPTION .
419                 move.l  d0,a6           !IN a6 POINTER TO NEXT PROCEDURE .
420 7:              move.l  8(a6),d7        !COUNTPTR OF NEXT IN d7
421                 bne     8f
422                 move.l  16(a6),d0
423                 beq     9f
424                 move.l  d0,a6
425                 bra     7b
426 8:              move.l  8(a1),d6        !COUNTPTR OF CURRENT IN d6.
427                 move.l  12(a1),d5       !FIRST LINE NUMBER IN d5.
428                 beq     1f              !NO LINES : GO ON.
429                 cmp.l   20(a1),a2       !START PRINTING FILE NAME .
430                 beq     6f              !NO NEW NAME.
431                 move.l  20(a1),a2       !NEW FILE NAME.
432                 cmp.l   #0,a2           !NO FILE NAME .
433                 beq     6f
434                 move.l  #0,d1           !START SCANNING FILE NAME
435 5:              move.b  (a2),d0         !d1 WILL CONTAIN NUMBER OF SYMBOLS.
436                 beq     4f
437                 add.l   #1,d1
438                 add.l   #1,a2
439                 bra     5b
440 4:              sub.l   d1,a2
441                 move.l  d1,-(sp)
442                 move.l  a2,-(sp)
443                 mov     8(sp),-(sp)     !WRITE FILE NAME.
444                 bsr     _Xwrite
445                 testen  (sp)+
446                 blt     3f
447                 add.l   #4,sp   !CLEAN STACK.
448 6:              sub.l   d6,d7           !IN d7 NUMBER OF LINES OF CURRENT PROC.
449                 asl.l   #2,d6
450 0:              move.l  a3,a0
451                 move.l  d5,d1           !SET UP FOR CALLING itoa.
452                 bsr     itoa
453                 lea     11(a3),a0
454                 move.l  0(a4,d6),d1
455                 bsr     itoa
456                 move.l  #23,-(sp)
457                 pea     buffer
458                 mov     8(sp),-(sp)
459                 bsr     _Xwrite         !PRINT LINE NUMBER AND INTEGER .
460                 testen  (sp)+
461                 blt     3f
462                 add.l   #4,sp   !CLEAN STACK.
463                 add.l   #1,d5           !NEXT LINE NUMBER .
464                 add.l   #4,d6           !NEXT COUNT.
465                 sub.l   #1,d7           !ONE LINE LESS TO GO.
466                 bhi     0b
467 1:              move.l  a6,a1
468                 cmp.l   #0,a1
469                 bne     2b
470                 add.l   wrd,sp          !REMOVE FILE DESCR.
471                 rts                     !READY.
472 9:              move.l  maxcount,d7
473                 move.l  #0,a6           !NO NEXT PROCEDURE.
474                 bra     8b
475 3:
476                 testen  (sp)+
477                 testen  (sp)+
478                 rts
479
480         .sect .data
481 buffer: .asciz "                      \n"
482         .sect .text
483 #endif