24 !---------------------------------------------------------------------------
25 ! START OF THE PROGRAM
26 !---------------------------------------------------------------------------
33 add.l #0x10000,d0 ! rough guess. What is the
37 lea retarea,a5 !a5 POINTS AT RETURN AREA
38 move.l nd,-(sp) !nd contains endbss
42 move.l #126,d0 !initialise lasttable
47 move.l #linused-8,linused
50 move.l (a2),filb !interpreter name in filb
54 emfile: .asciz "e.out"
57 move.l 4(sp),a0 !4(sp) is argv
58 move.l #emfile,(a0) !pointer to e.out in argp1
59 add.l #1,(sp) !only 1 argument in this case
61 0: add.l #4,4(sp) !skip name of interpreter
72 move.l (a2),filb !load file name in filb
73 !information about file for error mess.
74 move.l #16,-(sp) ; pea header
75 mov savefd,-(sp) !skip first header
76 bsr _Xread ; testen (sp)+
87 move.l #5,d0 !convert em integer to integer
89 move.b (a0)+,-(a5) ; move.b (a0)+,-(a5)
90 move.b (a0)+,-(a5) ; move.b (a0)+,-(a5)
91 move.l (a5),-4(a0) ; dbra d0,0b
92 move.l nd,a0 ; move.l a0,pb !Bottom emtext
93 add.l ntext,a0 ; move.l a0,pd !proc. descr. base
94 move.l nproc,d1 ; asl.l #3,d1 !2 pointers
95 #if count + prof + flow
96 mulu #3,d1 !or 6 pointers
98 add.l d1,a0 ; move.l a0,eb !external base
99 add.l szdata,a0 ; move.l a0,tblmax
100 move.l a0,globmax ; move.l a0,hp
101 add.l #2000,a0 ; move.l a0,-(sp)
102 bsr _Xbreak !ask for core
103 testen (sp)+ ; bne toolarge
104 move.l eb,a6 ; move.l filb,4(a6)
109 testen (sp)+ ; bne badarg
115 lblbuf: sub.l #2048,sp
117 move.l sp,a4 !transport ptr a4
120 move.l #2048,-(sp) ; move.l a4,-(sp)
121 mov savefd,-(sp) ; bsr _Xread
122 testen (sp)+ ; bne badarg
125 cmp.l #2048,d0 ; bcs 0f
126 add.l #1024,a1 ; bra 1f !a1 =buffer middle
127 0: add.l d0,a1 !a1 = buffer end
128 1: move.l eb,a3 !At a3 filling has to start
132 datloop: cmp.l a4,a1 ; bhi 9f !Go on filling data
133 bsr blshift !shift block down , read next block
134 9: sub.l #1,ndata ; blt finito
136 move.b (a4)+,d1 ; beq dat0 !type byte in d1
137 move.l a3,a2 ; move.b (a4)+,d2 !count byte in d2
138 asl.l #2,d1 ; move.l -4(a6,d1),a0
142 datswi: .data4 dat1; .data4 dat2; .data4 dat3; .data4 dat4
143 .data4 dat5; .data4 dat6; .data4 dat6; .data4 dofloat
147 move.b (a4)+,-(a5) ; move.b (a4)+,-(a5)
148 move.b (a4)+,-(a5) ; move.b (a4)+,-(a5)
149 move.l (a5),d0 ; move.l a3,d4 !d0 =count
150 sub.l a2,d4 !reconstruct byte count of previous describtor
151 sub.l #1,d0 ; sub.l #1,d4
153 2: move.b (a2)+,(a3)+ ; dbra d3,2b
154 dbra d0,1b ; bra datloop
156 dat1: mov und,(a3)+ ; sub.b #1,d2
157 bne dat1 ; bra datloop
159 dat2: move.b (a4)+,(a3)+ ; sub.b #1,d2
160 bne dat2 ; bra datloop
162 dat3: move.w wrd,d1 ; add.l d1,a3 !wrd = 2 or 4
163 3: move.b (a4)+,-(a3) ; sub.b #1,d1 ; bgt 3b
164 add.l wrd,a3 ; sub.b #1,d2
165 bne dat3 ; bra datloop
167 dat4: move.l eb,d4 ; bra 4f
170 move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
171 move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
172 add.l d4,(a3)+ ; sub.b #1,d2
175 dat6: add.l d2,a3 ; move.l d2,d3
176 6: move.b (a4)+,-(a3) ; sub.b #1,d2
188 movem.l a0/a1/d0-d2,-(sp)
197 movem.l (sp)+,a0/a1/d0-d2
203 !DUMMY ASCII TO FLOAT ROUTINE
216 blshift: move.l a1,a0 ; move.l #1024,d0
219 sub.l d0,a0 ; move.l d0,-(sp)
220 sub.l d0,a4 !update pointer
222 0: move.l (a1)+,(a0)+ ; sub.w #1,d0
223 bgt 0b ; move.l a0,a1
225 move.l a1,-(sp) ; mov savefd,-(sp)
227 testen (sp)+ ; bne badarg
231 cmp.l #1024,d0 ; beq 1f
235 finito: cmp.l hp,a3 ; bne badarg !load file error
236 move.l eb,a6 !eb IN a6 NOW
237 lea 4(a6),a0 !filb CONTAINS eb+4
240 !WE START TO READ THE PROCEDURE DESCRIPTORS
242 move.l nproc,d1 ; move.l pd,a3
243 asl.l #3,d1 !proc. descr. is 8 bytes
244 4: move.l a1,d2 ; sub.l a4,d2 !What is available?
245 add.l #7,d2 ; and.w #-0x8,d2 !multiple of 8!
246 sub.l d2,d1 !subtract what can
247 asr.l #3,d2 !be read. divide by 8
250 move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
251 move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
253 move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
254 move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
255 move.l pb,d0 ; add.l d0,(a3)+ !em address to machine address
263 dbra d2,2b ; tst.l d1
264 ble 3f ; bsr blshift !more or ready
266 3: cmp.l eb,a3 ; bne badarg
267 move.l savefd,-(sp) ; bsr _Xclose
268 move.l ml,sp !refresh stack
271 ! |=======================|
272 ! Here we fill the fields in the procedure | current file name |
273 ! descriptor with table information. The |-----------------------|
274 ! procedure descriptor has six fields, | link to next proc |
275 ! like described in this picture. We |-----------------------|
276 ! construct a linked list of the procedure | first line number |
277 ! descriptors, such that the defined |-----------------------|
278 ! order of procedures is compatible | count pointer |
279 ! with the text order. Thereafter we |-----------------------|
280 ! scan the text for line information to | start address |
281 ! fill the count pointer and startline |-----------------------|
282 ! field. The link to the first procedure | bytes for locals |
283 ! is in firstp , links are descriptor |=======================|
284 ! start addresses. The last procedure
285 ! links to the external base. All lines in the text get a count
286 ! number, lines of a procedure get consecutive count numbers,
287 ! the procedure count pointer gives the number of the first line.
288 ! Count pointer zero is reserved for the case that no line number
291 ! Register use: a6 is external base ("eb"), a5 points at return area, other
294 makelink: move.l pd,a0
296 move.l a0,a3 !a3 will point at the first proc.
297 move.l a0,a4 !a4 will point at proc descr base
298 0: move.l a0,a1 !keep former descr pointer in a1
299 add.l #24,a0 !a0 points at next one
300 cmp.l a0,a6 !top of descriptor space
302 1: move.l 4(a0),d0 !start address of current proc in d0
303 cmp.l 4(a1),d0 !compair start address with previous
304 bcc 2f !d0 large? follow link!
305 sub.l #24,a1 !d0 small? compair with previous
306 cmp.l a1,a4 !is a1 smaller than pd
307 bls 1b !no? try again
308 move.l a3,16(a0) !yes? then smallest text add up to now
309 move.l a0,a3 !remind a3 is to point at first proc
310 bra 0b !next descriptor
311 2: move.l 16(a1),d1 !follow the link to find place
312 beq 3f !if 0 then no link defined
314 cmp.l 4(a2),d0 !compair start address
315 bcs 3f !start addr between those of a1 and a2
316 move.l a2,a1 !d0 above start address of a1
317 bra 2b !go on looking
318 3: move.l a0,16(a1) !a0 follows a1
319 move.l d1,16(a0) !a2 follows a0
321 4: move.l a3,firstp !firstp links to first procedure
323 ! Register use: a3 points at first procedure , d0 opcode byte , a1 base of
324 ! table , d1 keeps min line nr , d2 keeps max line nr , d3 current line nr ,
327 procinf: move.l #1,maxcount !count pointer for first procedure
331 0: move.l a3,-(sp) !stack current procedure
332 move.l #-1,d1 !minimal line number on 0xFFFFFFFF
333 move.l #0,d2 !maximal line number on 0
334 tst.l 16(a3) !bottom address next procedure
335 beq 6f !if 0 last procedure
337 move.l 4(a4),a4 !a4 points at top of current proc
340 2: move.l 4(a3),a3 !start address of current procedure
341 8: move.b (a3)+,d0 !start scanning
347 bhi 7f !ordinary skip at 7
348 beq 2f !case lni at 2
349 cmp.b #-108,d0 !lin_l ?
350 bcs 7f !ordinary skip at 7
353 move.b (a3)+,d3 !lin_s0 here
362 cmp.b #35,d0 !lin_q ?
363 bne 6f !skip for escape2 at 6f
370 4: cmp.l d1,d3 !d3 less than minimum ?
373 5: cmp.l d3,d2 !d3 more than maximum ?
380 move.l d0,a2 !escape1 opcodes treated here
381 add.l #256,a2 !second table
384 1: move.b skipdisp(a2),d0 !look for argument size
386 9: cmp.l a3,a4 !still more text
388 move.l (sp)+,a3 !bottom back
389 sub.l d1,d2 !compute number of lines
390 bcs 9f !no line so no information
394 add.l d2,d4 !this is the new maxcount
396 9: tst.l 16(a3) !follow link to next procedure
405 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
406 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
407 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
408 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
409 .data1 0; .data1 0; .data1 0; .data1 1; .data1 0; .data1 0; .data1 2; .data1 0;
410 .data1 0; .data1 1; .data1 1; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
411 .data1 0; .data1 0; .data1 1; .data1 2; .data1 1; .data1 1; .data1 1; .data1 1;
412 .data1 1; .data1 1; .data1 1; .data1 2; .data1 1; .data1 1; .data1 1; .data1 1;
414 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
415 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
416 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
417 .data1 0; .data1 0; .data1 0; .data1 0; .data1 1; .data1 0; .data1 0; .data1 0;
418 .data1 1; .data1 0; .data1 0; .data1 0; .data1 1; .data1 0; .data1 0; .data1 0;
419 .data1 1; .data1 1; .data1 0; .data1 1; .data1 0; .data1 2; .data1 0; .data1 2;
420 .data1 1; .data1 0; .data1 0; .data1 0; .data1 1; .data1 1; .data1 0; .data1 1;
421 .data1 2; .data1 1; .data1 1; .data1 1; .data1 1; .data1 1; .data1 1; .data1 1;
423 .data1 2; .data1 2; .data1 0; .data1 0; .data1 1; .data1 1; .data1 1; .data1 0;
424 .data1 0; .data1 2; .data1 1; .data1 0; .data1 1; .data1 0; .data1 0; .data1 1;
425 .data1 1; .data1 1; .data1 0; .data1 0; .data1 2; .data1 1; .data1 0; .data1 2;
426 .data1 0; .data1 1; .data1 1; .data1 2; .data1 1; .data1 1; .data1 1; .data1 1;
427 .data1 1; .data1 2; .data1 0; .data1 0; .data1 0; .data1 0; .data1 1; .data1 2;
428 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 1; .data1 2; .data1 2;
429 .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
430 .data1 0; .data1 0; .data1 0; .data1 0; .data1 1; .data1 1; .data1 0; .data1 0;
432 .data1 0; .data1 1; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 1;
433 .data1 0; .data1 0; .data1 1; .data1 0; .data1 0; .data1 1; .data1 1; .data1 1;
434 .data1 1; .data1 0; .data1 2; .data1 1; .data1 1; .data1 1; .data1 2; .data1 0;
435 .data1 0; .data1 1; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 1;
436 .data1 2; .data1 2; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0; .data1 0;
437 .data1 0; .data1 1; .data1 0; .data1 0; .data1 0; .data1 0; .data1 2; .data1 1;
438 .data1 1; .data1 1; .data1 1; .data1 1; .data1 1; .data1 1; .data1 1; .data1 1;
439 .data1 2; .data1 1; .data1 0; .data1 0; .data1 1; .data1 2; .data1 7; .data1 5;
443 .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0;
444 .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 2; .data1 0; .data1 2;
445 .data1 2; .data1 2; .data1 2; .data1 2; .data1 0; .data1 2; .data1 2; .data1 0;
446 .data1 2; .data1 0; .data1 0; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0;
447 .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0;
448 .data1 2; .data1 0; .data1 0; .data1 0; .data1 0; .data1 2; .data1 2; .data1 2;
449 .data1 2; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2;
450 .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 2; .data1 2;
452 .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 2; .data1 2;
453 .data1 2; .data1 2; .data1 2; .data1 2; .data1 0; .data1 2; .data1 0; .data1 1;
454 .data1 2; .data1 2; .data1 2; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2;
455 .data1 0; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 0; .data1 2;
456 .data1 0; .data1 2; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0;
457 .data1 2; .data1 0; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2;
458 .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 2; .data1 2;
459 .data1 2; .data1 2; .data1 0; .data1 0; .data1 2; .data1 2; .data1 0; .data1 2;
461 .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2; .data1 0; .data1 2;
462 .data1 2; .data1 0; .data1 1; .data1 0; .data1 0; .data1 0; .data1 2; .data1 0;
463 .data1 2; .data1 0; .data1 2; .data1 2; .data1 2; .data1 2; .data1 2; .data1 2;
464 .data1 0; .data1 2; .data1 0; .data1 1; .data1 2; .data1 0; .data1 0; .data1 2;
471 move.l d1,profile !PROFILE POINTER FOR CURRENT PROC
474 asl.l #2,d0 !4 BYTES FOR EACH LINE
476 move.l d0,profsiz !profsiz CONTAINS NEEDED MEM SIZE
481 asr.l #3,d0 !divide by 8
483 bclr #0,d0 !make integer number of words (2 byte!)
509 cfp: move.l ml,sp !LABEL FOR DEBUGGING
513 !----------------------------------------------------------------------------
514 ! START CALLING SEQUENCE HERE
515 !-----------------------------------------------------------------------------
522 lblsp: move.l entry,-(sp) !start procedure to call
526 nofile: mov #0xD,d0 ; bra notrap1
528 badarg1: mov #0xE,d0 ; bra notrap1
529 toolarge: mov #0xF,d0 ; bra notrap1
554 eb: .space 4 !EXPLICITELY REQUIRED eb, filb, curproc IN
555 filb: .space 4 !THIS ORDER