*** empty log message ***

This commit is contained in:
keie 1984-07-23 11:49:00 +00:00
parent eebc753306
commit 14a3683f85
19 changed files with 3944 additions and 0 deletions

34
mach/mantra/int/Makefile Normal file
View file

@ -0,0 +1,34 @@
P = mloop
em2tl: a.out
cv a.out em2tl
rm a.out
a.out: $P02tl.s $P12tl.s $P22tl.s $P32tl.s $P42tl.s $P52tl.s $P62tl.s $P72tl.s $P82tl.s $P92tl.s $Pa2tl.s $Pb2tl.s $Pc2tl.s $Pe2tl.s
m68k2 -s $P?2tl.s >symem2tl
$P02tl.s: $P0
prep $P0 $P02tl.s
$P12tl.s: $P1
prep $P1 $P12tl.s
$P22tl.s: $P2
prep $P2 $P22tl.s
$P32tl.s: $P3
prep $P3 $P32tl.s
$P42tl.s: $P4
prep $P4 $P42tl.s
$P52tl.s: $P5
prep $P5 $P52tl.s
$P62tl.s: $P6
prep $P6 $P62tl.s
$P72tl.s: $P7
prep $P7 $P72tl.s
$P82tl.s: $P8
prep $P8 $P82tl.s
$P92tl.s: $P9
prep $P9 $P92tl.s
$Pa2tl.s: $Pa
prep $Pa $Pa2tl.s
$Pb2tl.s: $Pb
prep $Pb $Pb2tl.s
$Pc2tl.s: $Pc
prep $Pc $Pc2tl.s
$Pe2tl.s: $Pe
prep $Pe $Pe2tl.s

77
mach/mantra/int/copyright Normal file
View file

@ -0,0 +1,77 @@
! (c) copyright 1980 by the Vrije Universiteit, Amsterdam, The Netherlands.
! Explicit permission is hereby granted to universities to use or duplicate
! this program for educational or research purposes. All other use or dup-
! lication by universities, and all use or duplication by other organiza-
! tions is expressly prohibited unless written permission has been obtained
! from the Vrije Universiteit. Requests for such permissions may be sent to
! Dr. Andrew S. Tanenbaum
! Wiskundig Seminarium
! Vrije Universiteit
! Postbox 7161
! 1007 MC Amsterdam
! The Netherlands
! Organizations wishing to modify part of this software for subsequent sale
! must explicitly apply for permission. The exact arrangements will be
! worked out on a case by case basis, but at a minimum will require the or-
! ganization to include the following notice in all software and documenta-
! tion based on our work:
! This product is based on the Pascal system developed by
! Andrew S. Tanenbaum, Johan W. Stevenson and Hans van Staveren
! of the Vrije Universiteit, Amsterdam, The Netherlands.
!
!=========================================================================
! This is an interpreter for EM programs with no virtual memory for the
! the PMDS-II . This interpreter is adapted from an interpreter which was
! made for the pdp11 by Evert Wattel and Hans van Staveren . The present
! version is made by Freek van Schagen
! Vrije Universiteit
! Amsterdam.
!-------------------------------------------------------------------------
! The program requires preprocessing by the C-preprocessor . There are
! several options :
! lword: 4byte word size in stead of 2 byte word size ;
! test: checking for undefined variables , nil pointers
! array indices , overflow , etc ;
! last: generation of a file with the last 16 lines executed ;
! count: generation of a file with a flow count ;
! flow: generation of a file with a flow bitmap ;
! prof: generation of a file with a runtime profile ;
! opfreq: generation of a file with a frequency count per opcode.
!--------------------------------------------------------------------------
! Memory layout:
! --------------------------------------------------------------------------
! | | | | | | | | | |
! | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 |
! | | | | | | | | | |
! --------------------------------------------------------------------------
! 1: Interpreter text+data+bss.
! 2: EM text.
! 3: EM procedure descriptors.
! 4: EM global data area.
! 5: tables for flow , count , profile.
! 6: EM heap area.
! 7: EM local data and stack.
! 8: Arguments to the interpreter .
!REGISTER USE
! pc programcounter
! a7=sp stackpointer d7 if lword: 1 , if not lword: 0
! a6 external base= eb d6 0
! a5 scratch d5 scratch
! a4 address of loop d4 scratch
! a3 EM programcounter d3 scratch
! a2 local base =lb d2 scratch
! a1 address of return area d1 scratch
! a0 scratch d0 opcode byte and scratch

78
mach/mantra/int/deffile Normal file
View file

@ -0,0 +1,78 @@
#ifdef lword
#define word 4
#define wrd #4
#define wmu #2
#define und #-0x80000000
#define ad add.l
#define an and.l
#define asle asl.l
#define asri asr.l
#define cl clr.l
#define comp cmp.l
#define exor eor.l
#define extend !
#define inor or.l
#define lsle lsl.l
#define lsri lsr.l
#define nega neg.l
#define mov move.l
#define nt not.l
#define rotl rol.l
#define rotr ror.l
#define subt sub.l
#define testen tst.l
#define l0 16
#define l1 20
#define l2 24
#define l3 28
#define l_1 -4
#define l_2 -8
#define l_3 -12
#define l_4 -16
#define l_5 -20
#define l_6 -24
#define l_7 -28
#define l_8 -32
#define checksize cmp.l #4,d0 ; beq 4f ; cmp.l #8,d0 ; bne 9f ; bsr no8bar ; \
9: bra e_oddz
#else
#define word 2
#define wrd #2
#define wmu #1
#define und #-0x8000
#define ad add.w
#define an and.w
#define asle asl.w
#define asri asr.w
#define cl clr.w
#define comp cmp.w
#define exor eor.w
#define extend ext.l
#define inor or.w
#define lsle lsl.w
#define lsri lsr.w
#define nega neg.w
#define mov move.w
#define nt not.w
#define rotl rol.w
#define rotr ror.w
#define subt sub.w
#define testen tst.w
#define l0 16
#define l1 18
#define l2 20
#define l3 22
#define l_1 -2
#define l_2 -4
#define l_3 -6
#define l_4 -8
#define l_5 -10
#define l_6 -12
#define l_7 -14
#define l_8 -16
#define checksize cmp.w #2,d0 ; beq 2f ; cmp.w #4,d0 ; beq 4f ; bra e_oddz
#endif
#define adroff move.b (a3)+,(a1) ; move.b (a3)+,1(a1)
#define claimstack tst.b -1024(sp)

8
mach/mantra/int/header Normal file
View file

@ -0,0 +1,8 @@
!definitions
!#define lword
!#define FLTRAP
#define opfreq 0
#define last 1
#define test 1
#define count 0
#define flow 0

503
mach/mantra/int/mloop0 Normal file
View file

@ -0,0 +1,503 @@
!---------------------------------------------------------------------------
! START OF THE PROGRAM
!---------------------------------------------------------------------------
lea retarea,a1 !a1 POINTS AT RETURN AREA
move.l nd,-(sp) !nd contains endbss
bsr _break
add.l wrd,sp
#if last
move.l #30,d0 !initialise lasttable
lea lasttable,a5
0: clr.l (a5)+
dbra d0,0b
move.l #-1,(a5)
move.l #linused-8,linused
#endif
move.l 4(sp),a2
move.l (a2),filb !interpreter name in filb
sub.l #1,(sp)
bgt 0f
.data
emfile: .asciz "e.out"
.align 2
.text
move.l 4(sp),a0 !4(sp) is argv
move.l #emfile,(a0) !pointer to e.out in argp1
add.l #1,(sp) !only 1 argument in this case
bra 1f
0: add.l #4,4(sp) !skip name of interpreter
1: add.l #4-word,sp
move.l sp,ml
move.l word(sp),a2
cl -(sp)
move.l (a2),-(sp)
lea eb,a6
bsr _open
testen (sp)+
bne nofile
mov (sp)+,savefd
move.l (a2),filb !load file name in filb
!information about file for error mess.
move.l #16,-(sp) ; pea header
mov savefd,-(sp) !skip first header
bsr _read ; testen (sp)+
bne badarg1
move.l #32,(sp)
pea header
mov savefd,-(sp)
bsr _read
testen (sp)+
bne badarg1
cmp.l #32,(sp)+
bne badarg1
lea header,a0
move.l #5,d0 !convert em integer to integer
0: add.l #4,a1
move.b (a0)+,-(a1) ; move.b (a0)+,-(a1)
move.b (a0)+,-(a1) ; move.b (a0)+,-(a1)
move.l (a1),-4(a0) ; dbra d0,0b
move.l nd,a0 ; move.l a0,pb !Bottom emtext
add.l ntext,a0 ; move.l a0,pd !proc. descr. base
move.l nproc,d1 ; asl.l #3,d1 !2 pointers
#if count + prof + flow
mulu #3,d1 !or 6 pointers
#endif
add.l d1,a0 ; move.l a0,eb !external base
add.l szdata,a0 ; move.l a0,tblmax
move.l a0,globmax ; move.l a0,hp
add.l #2000,a0 ; move.l a0,-(sp)
bsr _break !ask for core
testen (sp)+ ; bne toolarge
move.l eb,a6 ; move.l filb,4(a6)
move.l ntext,-(sp)
move.l pb,-(sp)
mov savefd,-(sp)
bsr _read
testen (sp)+ ; bne badarg
add.l #4,sp
#if float
! PM
#endif
lblbuf: sub.l #2048,sp
claimstack
move.l sp,a4 !transport ptr a4
move.l sp,a5
move.l #2048,-(sp) ; move.l a4,-(sp)
mov savefd,-(sp) ; bsr _read
testen (sp)+ ; bne badarg
move.l (sp)+,d0
cmp.l #2048,d0 ; bcs 0f
add.l #1024,a5 ; bra 1f !a5 =buffer middle
0: add.l d0,a5 !a5 = buffer end
1: move.l eb,a3 !At a3 filling has to start
clr.l d1 ; clr.l d2
move.l #datswi,a6
datloop: cmp.l a4,a5 ; bhi 9f !Go on filling data
bsr blshift !shift block down , read next block
9: sub.l #1,ndata ; blt finito
move.b (a4)+,d1 ; beq dat0 !type byte in d1
move.l a3,a2 ; move.b (a4)+,d2 !count byte in d2
asl.l #2,d1 ; move.l -4(a6,d1),a0
jmp (a0)
.data
datswi: .long dat1; .long dat2; .long dat3; .long dat4
.long dat5; .long dat6; .long dat6; .long dofloat
.text
dat0: add.l #4,a1
move.b (a4)+,-(a1) ; move.b (a4)+,-(a1)
move.b (a4)+,-(a1) ; move.b (a4)+,-(a1)
move.l (a1),d0 ; move.l a3,d4 !d0 =count
sub.l a2,d4 !reconstruct byte count of previous describtor
sub.l #1,d0 ; sub.l #1,d4
1: move.l d4,d3
2: move.b (a2)+,(a3)+ ; dbra d3,2b
dbra d0,1b ; bra datloop
dat1: mov und,(a3)+ ; sub.b #1,d2
bne dat1 ; bra datloop
dat2: move.b (a4)+,(a3)+ ; sub.b #1,d2
bne dat2 ; bra datloop
dat3: move.w wrd,d1 ; add.l d1,a3 !wrd = 2 or 4
3: move.b (a4)+,-(a3) ; sub.b #1,d1 ; bgt 3b
add.l wrd,a3 ; sub.b #1,d2
bne dat3 ; bra datloop
dat4: move.l eb,d4 ; bra 4f
dat5: move.l pb,d4
4: add.l #4,a3
move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
add.l d4,(a3)+ ; sub.b #1,d2
bne 4b ; bra datloop
dat6: add.l d2,a3 ; move.l d2,d3
6: move.b (a4)+,-(a3) ; sub.b #1,d2
bne 6b ; add.l d3,a3
bra datloop
dofloat: add.l d2,a3
bsr atof ; bra datloop
!DUMMY ASCII TO FLOAT ROUTINE
atof: tst.b (a4)+ ; bne atof
rts
blshift: move.l a5,a0 ; move.l #1024,d0
sub.l d0,a0 ; move.l d0,-(sp)
sub.l d0,a4 !update pointer
asr.l #2,d0
0: move.l (a5)+,(a0)+ ; sub.w #1,d0
bgt 0b ; move.l a0,a5
move.l a5,-(sp) ; mov savefd,-(sp)
bsr _read
testen (sp)+ ; bne badarg
move.l (sp)+,d0
cmp.l #1024,d0 ; beq 1f
add.l d0,a5
1: rts
finito: cmp.l hp,a3 ; bne badarg !load file error
move.l eb,a6 !eb IN a6 NOW
lea 4(a6),a0 !filb CONTAINS eb+4
move.l a0,filb
!WE START TO READ THE PROCEDURE DESCRIPTORS
move.l nproc,d1 ; move.l pd,a3
asl.l #3,d1 !proc. descr. is 8 bytes
4: move.l a5,d2 ; sub.l a4,d2 !What is available?
add.l #7,d2 ; and.w #-0x8,d2 !multiple of 8!
sub.l d2,d1 !subtract what can
asr.l #3,d2 !be read. divide by 8
sub.l #1,d2
2: add.l #4,a3
move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
add.l #8,a3
move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
move.b (a4)+,-(a3) ; move.b (a4)+,-(a3)
move.l pb,d0 ; add.l d0,(a3)+ !em address to machine address
#if count+prof+flow
clr.l (a3)+
clr.l (a3)+
clr.l (a3)+
clr.l (a3)+
#endif
dbra d2,2b ; tst.l d1
ble 3f ; bsr blshift !more or ready
bra 4b
3: cmp.l eb,a3 ; bne badarg
move.l savefd,-(sp) ; bsr _close
move.l ml,sp !refresh stack
#if count+prof+flow
! |=======================|
! Here we fill the fields in the procedure | current file name |
! descriptor with table information. The |-----------------------|
! procedure descriptor has six fields, | link to next proc |
! like described in this picture. We |-----------------------|
! construct a linked list of the procedure | first line number |
! descriptors, such that the defined |-----------------------|
! order of procedures is compatible | count pointer |
! with the text order. Thereafter we |-----------------------|
! scan the text for line information to | start address |
! fill the count pointer and startline |-----------------------|
! field. The link to the first procedure | bytes for locals |
! is in firstp , links are descriptor |=======================|
! start addresses. The last procedure
! links to the external base. All lines in the text get a count
! number, lines of a procedure get consecutive count numbers,
! the procedure count pointer gives the number of the first line.
! Count pointer zero is reserved for the case that no line number
! is yet defined.
! Register use: a6 is external base ("eb"), a1 points at return area, other
! registers are free
makelink: move.l pd,a0
move.l #0,a2
move.l a0,a3 !a3 will point at the first proc.
move.l a0,a4 !a4 will point at proc descr base
0: move.l a0,a5 !keep former descr pointer in a5
add.l #24,a0 !a0 points at next one
cmp.l a0,a6 !top of descriptor space
bls 4f !yes? ready!
1: move.l 4(a0),d0 !start address of current proc in d0
cmp.l 4(a5),d0 !compair start address with previous
bcc 2f !d0 large? follow link!
sub.l #24,a5 !d0 small? compair with previous
cmp.l a5,a4 !is a5 smaller than pd
bls 1b !no? try again
move.l a3,16(a0) !yes? then smallest text add up to now
move.l a0,a3 !remind a3 is to point at first proc
bra 0b !next descriptor
2: move.l 16(a5),d1 !follow the link to find place
beq 3f !if 0 then no link defined
move.l d1,a2
cmp.l 4(a2),d0 !compair start address
bcs 3f !start addr between those of a5 and a2
move.l a2,a5 !d0 above start address of a5
bra 2b !go on looking
3: move.l a0,16(a5) !a0 follows a5
move.l d1,16(a0) !a2 follows a0
bra 0b
4: move.l a3,firstp !firstp links to first procedure
! Register use: a3 points at first procedure , d0 opcode byte , a5 base of
! table , d1 keeps min line nr , d2 keeps max line nr , d3 current line nr ,
! maxcount in d4
procinf: move.l #1,maxcount !count pointer for first procedure
move.l #1,d4
move.l #0,d3
move.l #0,d0
0: move.l a3,-(sp) !stack current procedure
move.l #-1,d1 !minimal line number on 0xFFFFFFFF
move.l #0,d2 !maximal line number on 0
tst.l 16(a3) !bottom address next procedure
beq 6f !if 0 last procedure
move.l 16(a3),a4
move.l 4(a4),a4 !a4 points at top of current proc
bra 2f
6: move.l pd,a4
2: move.l 4(a3),a3 !start address of current procedure
8: move.b (a3)+,d0 !start scanning
cmp.b #-2,d0
beq 1f !case escape1
cmp.b #-1,d0
beq 6f !case escape2
cmp.b #-106,d0
bhi 7f !ordinary skip at 7
beq 2f !case lni at 2
cmp.b #-108,d0 !lin_l ?
bcs 7f !ordinary skip at 7
beq 3f !lin_l at 3
move.l #0,d3
move.b (a3)+,d3 !lin_s0 here
bra 4f !compare at 4
2: add.l #1,d3
bra 4f
3: adroff
move.l #0,d3
move.w (a1),d3
bra 4f
6: move.b (a3)+,d0
cmp.b #35,d0 !lin_q ?
bne 6f !skip for escape2 at 6f
move.b (a3)+,(a1)+
move.b (a3)+,(a1)+
move.b (a3)+,(a1)+
move.b (a3)+,(a1)
sub.l #3,a1
move.l (a1),d3
4: cmp.l d1,d3 !d3 less than minimum ?
bcc 5f
move.l d3,d1
5: cmp.l d3,d2 !d3 more than maximum ?
bcc 9f
move.l d3,d2
bra 9f
6: add.l #4,a3
bra 9f
1: move.b (a3)+,d0
move.l d0,a2 !escape1 opcodes treated here
add.l #256,a2 !second table
bra 1f
7: move.l d0,a2
1: move.b skipdisp(a2),d0 !look for argument size
add.l d0,a3
9: cmp.l a3,a4 !still more text
bhi 8b
move.l (sp)+,a3 !bottom back
sub.l d1,d2 !compute number of lines
bcs 9f !no line so no information
move.l d4,8(a3)
move.l d1,12(a3)
add.l #1,d2
add.l d2,d4 !this is the new maxcount
move.l d4,maxcount
9: tst.l 16(a3) !follow link to next procedure
beq 1f
move.l 16(a3),a3
bra 0b
1:
countlabel:
.data
skipdisp:
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 1; .byte 0; .byte 0; .byte 2; .byte 0;
.byte 0; .byte 1; .byte 1; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 1; .byte 2; .byte 1; .byte 1; .byte 1; .byte 1;
.byte 1; .byte 1; .byte 1; .byte 2; .byte 1; .byte 1; .byte 1; .byte 1;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 1; .byte 0; .byte 0; .byte 0;
.byte 1; .byte 0; .byte 0; .byte 0; .byte 1; .byte 0; .byte 0; .byte 0;
.byte 1; .byte 1; .byte 0; .byte 1; .byte 0; .byte 2; .byte 0; .byte 2;
.byte 1; .byte 0; .byte 0; .byte 0; .byte 1; .byte 1; .byte 0; .byte 1;
.byte 2; .byte 1; .byte 1; .byte 1; .byte 1; .byte 1; .byte 1; .byte 1;
.byte 2; .byte 2; .byte 0; .byte 0; .byte 1; .byte 1; .byte 1; .byte 0;
.byte 0; .byte 2; .byte 1; .byte 0; .byte 1; .byte 0; .byte 0; .byte 1;
.byte 1; .byte 1; .byte 0; .byte 0; .byte 2; .byte 1; .byte 0; .byte 2;
.byte 0; .byte 1; .byte 1; .byte 2; .byte 1; .byte 1; .byte 1; .byte 1;
.byte 1; .byte 2; .byte 0; .byte 0; .byte 0; .byte 0; .byte 1; .byte 2;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 1; .byte 2; .byte 2;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 0; .byte 0; .byte 0; .byte 1; .byte 1; .byte 0; .byte 0;
.byte 0; .byte 1; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 1;
.byte 0; .byte 0; .byte 1; .byte 0; .byte 0; .byte 1; .byte 1; .byte 1;
.byte 1; .byte 0; .byte 2; .byte 1; .byte 1; .byte 1; .byte 2; .byte 0;
.byte 0; .byte 1; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 1;
.byte 2; .byte 2; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0; .byte 0;
.byte 0; .byte 1; .byte 0; .byte 0; .byte 0; .byte 0; .byte 2; .byte 1;
.byte 1; .byte 1; .byte 1; .byte 1; .byte 1; .byte 1; .byte 1; .byte 1;
.byte 2; .byte 1; .byte 0; .byte 0; .byte 1; .byte 2; .byte 7; .byte 5;
!escaped opcodes
.byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0;
.byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 2; .byte 0; .byte 2;
.byte 2; .byte 2; .byte 2; .byte 2; .byte 0; .byte 2; .byte 2; .byte 0;
.byte 2; .byte 0; .byte 0; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0;
.byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0;
.byte 2; .byte 0; .byte 0; .byte 0; .byte 0; .byte 2; .byte 2; .byte 2;
.byte 2; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2;
.byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 2; .byte 2;
.byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 2; .byte 2;
.byte 2; .byte 2; .byte 2; .byte 2; .byte 0; .byte 2; .byte 0; .byte 1;
.byte 2; .byte 2; .byte 2; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2;
.byte 0; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 0; .byte 2;
.byte 0; .byte 2; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0;
.byte 2; .byte 0; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2;
.byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 2; .byte 2;
.byte 2; .byte 2; .byte 0; .byte 0; .byte 2; .byte 2; .byte 0; .byte 2;
.byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2; .byte 0; .byte 2;
.byte 2; .byte 0; .byte 1; .byte 0; .byte 0; .byte 0; .byte 2; .byte 0;
.byte 2; .byte 0; .byte 2; .byte 2; .byte 2; .byte 2; .byte 2; .byte 2;
.byte 0; .byte 2; .byte 0; .byte 1; .byte 2; .byte 0; .byte 0; .byte 2;
.text
move.l globmax,d1
move.l d1,a3
#if prof
move.l d1,ltime
move.l d1,profile !PROFILE POINTER FOR CURRENT PROC
move.l maxcount,d0
add.l #1,d0
asl.l #2,d0 !4 BYTES FOR EACH LINE
add.l d0,d1
move.l d0,profsiz !profsiz CONTAINS NEEDED MEM SIZE
#endif
#if flow
move.l d1,lflow
move.l maxcount,d0
asr.l #3,d0 !divide by 8 ; byte is 8 bits ,you know
add.l #2,d0
bclr #0,d0 !make integer number of words (2 byte!)
add.l d0,d1
move.l d0,flowsiz
#endif
#if count
move.l d1,lcount
move.l maxcount,d0
add.l #1,d0
asl.l #2,d0
add.l d0,d1
move.l d0,countsiz
#endif
move.l d1,tblmax
add.l #1024,d1
cmp.l nd,d1
bcs 2f
move.l d1,-(sp)
bsr _break
testen (sp)+
bne toolarge
2: sub.l a3,d1
asr.l wmu,d1
3: cl (a3)+
dbra d1,3b
sub.l #1024,a3
move.l a3,hp
cfp: move.l ml,sp !LABEL FOR DEBUGGING
#endif
!----------------------------------------------------------------------------
! START CALLING SEQUENCE HERE
!-----------------------------------------------------------------------------
lea loop,a4
move.l pb,a3
move.l #0,a2
move.l wmu-1,d7
clr.l d6
lblsp: move.l entry,-(sp) !start procedure to call
bra cai_z
nofile: mov #0xD,d0 ; bra notrap1
badarg: move.l eb,a6
badarg1: mov #0xE,d0 ; bra notrap1
toolarge: mov #0xF,d0 ; bra notrap1
.data
retsize: .space 2
retarea: .space 32
.bss
argc: .space 4
argv: .space 4
envp: .space 4
savefd: .space 4
header:
ntext: .space 4
ndata: .space 4
nproc: .space 4
entry: .space 4
nline: .space 4
szdata: .space 4
firstp: .space 4
maxcount: .space 4
tblmax: .space 4
globmax: .space 4
ml: .space 4
eb: .space 4 !EXPLICITELY REQUIRED eb, filb, curproc IN
filb: .space 4 !THIS ORDER
curproc: .space 4
pb: .space 4
pd: .space 4
hp: .space 4
.define filb
.define curproc
.define pd
.define nproc
.define retarea
.define retsize
.define hp
.define globmax
.define tblmax
.define ml
.define argc
.text

364
mach/mantra/int/mloop1 Normal file
View file

@ -0,0 +1,364 @@
!-------------------------------------------------------------------------------
! Main loop of the interpreter starts here
!----------------------------------------------------------------------------
loop: move.l #0,d0
move.b (a3)+,d0 !opcode in d0
add.w d0,d0 !opcode to index in table
add.w d0,d0
#if prof
move.l profile,a0
lea timeinf,a5
move.l 0(a5,d0),d1 !get operation time
add.l d1,(a0)
#endif
#if opfreq
lea counttab,a5
add.l #1,0(a5,d0)
#endif
jmp dispat(pc,d0) !jump to branch to the operation
!---------------------------------------------------------------------------
! the BRANCH LIST follows
!--------------------------------------------------------------------------
dispat:
bra loc_0 ; bra loc_1 ; bra loc_2 ; bra loc_3
bra loc_4 ; bra loc_5 ; bra loc_6 ; bra loc_7
bra loc_8 ; bra loc_9 ; bra loc_10 ; bra loc_11
bra loc_12 ; bra loc_13 ; bra loc_14 ; bra loc_15
bra loc_16 ; bra loc_17 ; bra loc_18 ; bra loc_19
bra loc_20 ; bra loc_21 ; bra loc_22 ; bra loc_23
bra loc_24 ; bra loc_25 ; bra loc_26 ; bra loc_27
bra loc_28 ; bra loc_29 ; bra loc_30 ; bra loc_31
bra loc_32 ; bra loc_33 ; bra aar_1W ; bra adf_s0
bra adi_1W ; bra adi_2W ; bra adp_l ; bra adp_1
bra adp_2 ; bra adp_s0 ; bra adp_s_1 ; bra ads_1W
bra and_1W ; bra asp_1W ; bra asp_2W ; bra asp_3W
bra asp_4W ; bra asp_5W ; bra asp_w0 ; bra beq_l
bra beq_s0 ; bra bge_s0 ; bra bgt_s0 ; bra ble_s0
bra blm_s0 ; bra blt_s0 ; bra bne_s0 ; bra bra_l
bra bra_s_1 ; bra bra_s_2 ; bra bra_s0 ; bra bra_s1
bra cal_1 ; bra cal_2 ; bra cal_3 ; bra cal_4
bra cal_5 ; bra cal_6 ; bra cal_7 ; bra cal_8
bra cal_9 ; bra cal_10 ; bra cal_11 ; bra cal_12
bra cal_13 ; bra cal_14 ; bra cal_15 ; bra cal_16
bra cal_17 ; bra cal_18 ; bra cal_19 ; bra cal_20
bra cal_21 ; bra cal_22 ; bra cal_23 ; bra cal_24
bra cal_25 ; bra cal_26 ; bra cal_27 ; bra cal_28
bra cal_s0 ; bra cff_z ; bra cif_z ; bra cii_z
bra cmf_s0 ; bra cmi_1W ; bra cmi_2W ; bra cmp_z
bra cms_s0 ; bra csa_1W ; bra csb_1W ; bra dec_z
bra dee_w0 ; bra del_w_1 ; bra dup_1W ; bra dvf_s0
bra dvi_1W ; bra fil_l ; bra inc_z ; bra ine_lw
bra ine_w0 ; bra inl__1W ; bra inl__2W ; bra inl__3W
bra inl_w_1 ; bra inn_s0 ; bra ior_1W ; bra ior_s0
bra lae_l ; bra lae_w0 ; bra lae_w1 ; bra lae_w2
bra lae_w3 ; bra lae_w4 ; bra lae_w5 ; bra lae_w6
bra lal_p ; bra lal_n ; bra lal_0 ; bra lal__1
bra lal_w0 ; bra lal_w_1 ; bra lal_w_2 ; bra lar_1W
bra ldc_0 ; bra lde_lw ; bra lde_w0 ; bra ldl_0
bra ldl_w_1 ; bra lfr_1W ; bra lfr_2W ; bra lfr_s0
bra lil_w_1 ; bra lil_w0 ; bra lil_0 ; bra lil_1W
bra lin_l ; bra lin_s0 ; bra lni_z ; bra loc_l
bra loc__1 ; bra loc_s0 ; bra loc_s_1 ; bra loe_lw
bra loe_w0 ; bra loe_w1 ; bra loe_w2 ; bra loe_w3
bra loe_w4 ; bra lof_l ; bra lof_1W ; bra lof_2W
bra lof_3W ; bra lof_4W ; bra lof_s0 ; bra loi_l
bra loi_1 ; bra loi_1W ; bra loi_2W ; bra loi_3W
bra loi_4W ; bra loi_s0 ; bra lol_pw ; bra lol_nw
bra lol_0 ; bra lol_1W ; bra lol_2W ; bra lol_3W
bra lol__1W ; bra lol__2W ; bra lol__3W ; bra lol__4W
bra lol__5W ; bra lol__6W ; bra lol__7W ; bra lol__8W
bra lol_w0 ; bra lol_w_1 ; bra lxa_1 ; bra lxl_1
bra lxl_2 ; bra mlf_s0 ; bra mli_1W ; bra mli_2W
bra rck_1W ; bra ret_0 ; bra ret_1W ; bra ret_s0
bra rmi_1W ; bra sar_1W ; bra sbf_s0 ; bra sbi_1W
bra sbi_2W ; bra sdl_w_1 ; bra set_s0 ; bra sil_w_1
bra sil_w0 ; bra sli_1W ; bra ste_lw ; bra ste_w0
bra ste_w1 ; bra ste_w2 ; bra stf_l ; bra stf_1W
bra stf_2W ; bra stf_s0 ; bra sti_1 ; bra sti_1W
bra sti_2W ; bra sti_3W ; bra sti_4W ; bra sti_s0
bra stl_pw ; bra stl_nw ; bra stl_0 ; bra stl_1W
bra stl__1W ; bra stl__2W ; bra stl__3W ; bra stl__4W
bra stl__5W ; bra stl_w_1 ; bra teq_z ; bra tgt_z
bra tlt_z ; bra tne_z ; bra zeq_l ; bra zeq_s0
bra zeq_s1 ; bra zer_s0 ; bra zge_s0 ; bra zgt_s0
bra zle_s0 ; bra zlt_s0 ; bra zne_s0 ; bra zne_s_1
bra zre_lw ; bra zre_w0 ; bra zrl__1W ; bra zrl__2W
bra zrl_w_1 ; bra zrl_nw
.errnz .-dispat-1016
!-----------------------------------------------------------------------------
! Two byte opcodes come here for decoding of second byte
!----------------------------------------------------------------------------
escape1:
move.l #0,d0
bra 1f
bra escape2
1: move.b (a3)+,d0 !second byte ,extended opcode
add.w d0,d0 !make index of address
add.w d0,d0
cmp.w #640,d0 !check for range
bhi e_illins !jump to ill instruction procedure
#if prof
lea timeinf1,a5
move.l 0(a5,d0),d1
add.l d1,(a0)
#endif
#if opfreq
lea counttab+1024,a5
add.l #1,0(a5,d0)
#endif
jmp dispae1(pc,d0) !jump to the operation
!------------------------------------------------------------------------------
! now dispatch table for escaped opcodes
!------------------------------------------------------------------------------
dispae1: !dispatch escaped opcodes 1
bra aar_l ; bra aar_z ; bra adf_l ; bra adf_z
bra adi_l ; bra adi_z ; bra ads_l ; bra ads_z
bra adu_l ; bra adu_z ; bra and_l ; bra and_z
bra asp_lw ; bra ass_l ; bra ass_z ; bra bge_l
bra bgt_l ; bra ble_l ; bra blm_l ; bra bls_l
bra bls_z ; bra blt_l ; bra bne_l ; bra cai_z
bra cal_l ; bra cfi_z ; bra cfu_z ; bra ciu_z
bra cmf_l ; bra cmf_z ; bra cmi_l ; bra cmi_z
bra cms_l ; bra cms_z ; bra cmu_l ; bra cmu_z
bra com_l ; bra com_z ; bra csa_l ; bra csa_z
bra csb_l ; bra csb_z ; bra cuf_z ; bra cui_z
bra cuu_z ; bra dee_lw ; bra del_pw ; bra del_nw
bra dup_l ; bra dus_l ; bra dus_z ; bra dvf_l
bra dvf_z ; bra dvi_l ; bra dvi_z ; bra dvu_l
bra dvu_z ; bra fef_l ; bra fef_z ; bra fif_l
bra fif_z ; bra inl_pw ; bra inl_nw ; bra inn_l
bra inn_z ; bra ior_l ; bra ior_z ; bra lar_l
bra lar_z ; bra ldc_l ; bra ldf_l ; bra ldl_pw
bra ldl_nw ; bra lfr_l ; bra lil_pw ; bra lil_nw
bra lim_z ; bra los_l ; bra los_z ; bra lor_s0
bra lpi_l ; bra lxa_l ; bra lxl_l ; bra mlf_l
bra mlf_z ; bra mli_l ; bra mli_z ; bra mlu_l
bra mlu_z ; bra mon_z ; bra ngf_l ; bra ngf_z
bra ngi_l ; bra ngi_z ; bra nop_z ; bra rck_l
bra rck_z ; bra ret_l ; bra rmi_l ; bra rmi_z
bra rmu_l ; bra rmu_z ; bra rol_l ; bra rol_z
bra ror_l ; bra ror_z ; bra rtt_z ; bra sar_l
bra sar_z ; bra sbf_l ; bra sbf_z ; bra sbi_l
bra sbi_z ; bra sbs_l ; bra sbs_z ; bra sbu_l
bra sbu_z ; bra sde_l ; bra sdf_l ; bra sdl_pw
bra sdl_nw ; bra set_l ; bra set_z ; bra sig_z
bra sil_pw ; bra sil_nw ; bra sim_z ; bra sli_l
bra sli_z ; bra slu_l ; bra slu_z ; bra sri_l
bra sri_z ; bra sru_l ; bra sru_z ; bra sti_l
bra sts_l ; bra sts_z ; bra str_s0 ; bra tge_z
bra tle_z ; bra trp_z ; bra xor_l ; bra xor_z
bra zer_l ; bra zer_z ; bra zge_l ; bra zgt_l
bra zle_l ; bra zlt_l ; bra zne_l ; bra zrf_l
bra zrf_z ; bra zrl_pw ; bra dch_z ; bra exg_s0
bra exg_l ; bra exg_z ; bra lpb_z ; bra gto_l
.errnz .-dispae1-640
!----------------------------------------------------------------------------
escape2:
move.l #0,d0
move.b (a3)+,d0 !opcode
sub.l #4,sp
move.b (a3)+,(sp)
move.b (a3)+,1(sp)
move.b (a3)+,2(sp)
move.b (a3)+,3(sp)
add.w d0,d0
add.w d0,d0
cmp.w #220,d0
bhi e_illins
#if prof
lea timeinf2,a5
move.l 0(a5,d0),d1
add.l d1,(a0)
#endif
#if opfreq
lea counttab+1664,a5
add.l #1,0(a5,d0)
#endif
jmp dispae2(pc,d0)
!---------------------------------------------------------------------------
! BRANCH TABLE FOR SECOND ESCAPED OPCODES
!---------------------------------------------------------------------------
dispae2:
bra ldc_q ; bra lae_q ; bra lal_qp ; bra lal_qn
bra lde_qw ; bra ldf_q ; bra ldl_qpw ; bra ldl_qnw
bra lil_qpw ; bra lil_qnw ; bra loc_q ; bra loe_qw
bra lof_q ; bra lol_qpw ; bra lol_qnw ; bra lpi_q
bra adp_q ; bra asp_qw ; bra beq_q ; bra bge_q
bra bgt_q ; bra ble_q ; bra blm_q ; bra blt_q
bra bne_q ; bra bra_q ; bra cal_q ; bra dee_qw
bra del_qpw ; bra del_qnw ; bra fil_q ; bra gto_q
bra ine_qw ; bra inl_qpw ; bra inl_qnw ; bra lin_q
bra sde_q ; bra sdf_q ; bra sdl_qpw ; bra sdl_qnw
bra sil_qpw ; bra sil_qnw ; bra ste_qw ; bra stf_q
bra stl_qpw ; bra stl_qnw ; bra zeq_q ; bra zge_q
bra zgt_q ; bra zle_q ; bra zlt_q ; bra zne_q
bra zre_qw ; bra zrl_qpw ; bra zrl_qnw
.errnz .-dispae2-220
!------------------------------------------------------------------------------
! timeinf tables, first the unescaped opcodes
! these tables are parallel to the tables dispat , dispae1 and dispae2
! Each entry contains a reasonable estimate of
! the number of processor state cycles needed to
! execute that instruction. The exact amount cannot be
! supplied, since this can depend rather heavily on the
! size of the object in set, array case instructions etc.
! The table timeinf also contains, added to each entry,
! the number of processor state cycles needed to find the instruction.
! This number is currently 22.Also the number of processor state
! cycles to return from the instruction is included.
! The number is computed for
! the case that all check and runinf options are off.
!------------------------------------------------------------------------------
#if prof
.data
timeinf:
.long 33 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 35 ; .long 35
.long 35 ; .long 35 ; .long 127 ; .long 00
.long 36 ; .long 42 ; .long 56 ; .long 40
.long 40 ; .long 42 ; .long 42 ; .long 42
.long 36 ; .long 39 ; .long 39 ; .long 39
.long 39 ; .long 39 ; .long 41 ; .long 67
.long 48 ; .long 48 ; .long 48 ; .long 48
.long 97 ; .long 48 ; .long 48 ; .long 55
.long 45 ; .long 45 ; .long 36 ; .long 43
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 211 ; .long 211 ; .long 211 ; .long 211
.long 213 ; .long 00 ; .long 00 ; .long 66
.long 00 ; .long 50 ; .long 54 ; .long 54
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
timeinf1:
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
timeinf2:
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00 ; .long 00
.long 00 ; .long 00 ; .long 00
#endif
.text

344
mach/mantra/int/mloop2 Normal file
View file

@ -0,0 +1,344 @@
!--------------------------------------------------------------------------
! Laod constant , load local , store local
!--------------------------------------------------------------------------
loc_0: mov d6,-(sp)
jmp (a4)
loc_1: loc_2: loc_3: loc_4: loc_5: loc_6: loc_7: loc_8:
loc_9: loc_10: loc_11: loc_12: loc_13: loc_14: loc_15: loc_16:
loc_17: loc_18: loc_19: loc_20: loc_21: loc_22: loc_23: loc_24:
loc_25: loc_26: loc_27: loc_28: loc_29: loc_30: loc_31: loc_32:
loc_33:
asr.w #2,d0 !make the multiplication undone
mov d0,-(sp)
jmp (a4)
loc__1:
mov #-1,-(sp)
jmp (a4)
loc_s0: clr.w d0
move.b (a3)+,d0
mov d0,-(sp)
jmp (a4)
loc_s_1: mov #-1,d0
move.b (a3)+,d0
mov d0,-(sp)
jmp (a4)
lpi_l:
adroff
move.w (a1),d0
move.l d0,-(sp)
jmp (a4)
lpi_q: jmp (a4)
loc_q: jmp (a4)
#ifndef lword
bra e_illins
#endif
loc_l: adroff
move.w (a1),d0
ext.l d0
mov d0,-(sp)
jmp (a4)
ldc_0: cl -(sp)
cl -(sp)
jmp (a4)
ldc_l:
adroff
move.w (a1),d0
ext.l d0 !ext works only on d register
4: move.l d0,-(sp) !adapt for l , then "move.2l" signextended
#ifdef lword
bmi 0f
clr.l -(sp)
bra 1f
0: move.l #-1,-(sp)
1:
#endif
jmp (a4)
ldc_q:
#ifdef lword
clr.l -(sp)
#endif
jmp (a4)
!-------------------------------------------------------------------------
! offsets should be adapted for wordsize 4 .Use identifiers
! l3 to l_8 for the offsets in lol_3W to lol__8 . Use the
! preprocessor for conditional definitions .
lol_0: mov l0(a2),-(sp) ; jmp (a4)
lol_1W: mov l1(a2),-(sp) ; jmp (a4)
lol_2W: mov l2(a2),-(sp) ; jmp (a4)
lol_3W: mov l3(a2),-(sp) ; jmp (a4)
lol__1W: mov l_1(a2),-(sp) ; jmp (a4)
lol__2W: mov l_2(a2),-(sp) ; jmp (a4)
lol__3W: mov l_3(a2),-(sp) ; jmp (a4)
lol__4W: mov l_4(a2),-(sp) ; jmp (a4)
lol__5W: mov l_5(a2),-(sp) ; jmp (a4)
lol__6W: mov l_6(a2),-(sp) ; jmp (a4)
lol__7W: mov l_7(a2),-(sp) ; jmp (a4)
lol__8W: mov l_8(a2),-(sp) ; jmp (a4)
lol_w0: clr.w d0
move.b (a3)+,d0
5: asl.l wmu,d0
mov 16(a2,d0),-(sp)
jmp (a4)
lol_w_1: move.l #-1,d0
move.b (a3)+,d0
2: asl.l wmu,d0
mov 0(a2,d0),-(sp)
jmp (a4)
lol_pw: adroff
move.w (a1),d0
bra 5b
lol_nw: adroff
move.w (a1),d0
ext.l d0
bra 2b
lol_qnw: move.l (sp)+,d0
bra 2b
lol_qpw: move.l (sp)+,d0
bra 5b
!--------------------------------------------------------------------------
ldl_0: mov l1(a2),-(sp) !offset code
mov l0(a2),-(sp) !offset code
jmp (a4)
ldl_w_1: move.l #-1,d0
move.b (a3)+,d0
2: asl.l wmu,d0
mov word(a2,d0),-(sp)
mov 0(a2,d0),-(sp)
jmp (a4)
ldl_pw: adroff
move.w (a1),d0
5: asl.l wmu,d0
mov l1(a2,d0),-(sp)
mov l0(a2,d0),-(sp)
jmp (a4)
ldl_nw: adroff
move.w (a1),d0
ext.l d0
bra 2b
ldl_qpw: move.l (sp)+,d0
bra 5b
ldl_qnw: move.l (sp)+,d0
bra 2b
!-------------------------------------------------------------------------
loe_lw: adroff
move.w (a1),d0
bra 1f
loe_qw: move.l (sp)+,d0
bra 1f
loe_w0: loe_w1: loe_w2: loe_w3: loe_w4:
sub.w #624,d0
asl.w #6,d0
move.b (a3)+,d0
1: ext.l d0
asl.l wmu,d0
mov 0(a6,d0),-(sp)
jmp (a4)
lde_lw: adroff
move.w (a1),d0
bra 1f
lde_qw: move.l (sp)+,d0
bra 1f
lde_w0: clr.w d0
move.b (a3)+,d0
1: asl.l wmu,d0
mov word(a6,d0),-(sp)
mov 0(a6,d0),-(sp)
jmp (a4)
!------------------------------------------------------------------------------
lil_0: move.l l0(a2),a0
mov (a0),-(sp)
jmp (a4)
lil_1W: move.l l1(a2),a0
mov (a0),-(sp)
jmp (a4)
lil_pw: adroff
move.w (a1),d0
bra 1f
lil_qpw: move.l (sp)+,d0
bra 1f
lil_w0: clr.w d0
move.b (a3)+,d0
1: asl.l wmu,d0
move.l l0(a2,d0),a0
mov (a0),-(sp)
jmp (a4)
lil_nw: adroff
move.w (a1),d0
ext.l d0
bra 1f
lil_qnw: move.l (sp)+,d0
bra 1f
lil_w_1: move.l #-1,d0
move.b (a3)+,d0
1: asl.l wmu,d0
move.l 0(a2,d0),a0
mov (a0),-(sp)
jmp (a4)
!---------------------------------------------------------------------------
lof_s0: move.l d6,d0
move.b (a3)+,d0
bra 1f
lof_l: adroff
move.w (a1),d0
ext.l d0
bra 1f
lof_q: move.l (sp)+,d0
bra 1f
lof_1W: move.l #1,d0
2: asl.w wmu,d0
1: move.l (sp)+,a0
mov 0(a0,d0),-(sp)
jmp (a4)
lof_2W: move.l #2,d0 ; bra 2b
lof_3W: move.l #3,d0 ; bra 2b
lof_4W: move.l #4,d0 ; bra 2b
ldf_l: adroff
move.w (a1),d0
ext.l d0
2: move.l (sp)+,a0
mov word(a0,d0),-(sp)
mov 0(a0,d0),-(sp)
jmp (a4)
ldf_q: move.l (sp)+,d0
bra 2b
!-------------------------------------------------------------------------
lal_p: adroff
move.w (a1),d0
bra 1f
lal_qp: move.l (sp)+,d0
bra 1f
lal_0: pea 16(a2)
jmp (a4)
lal_w0: clr.w d0
move.b (a3)+,d0
asl.l wmu,d0
1: add.l #16,d0
bra 3f
lal_n: adroff
move.w (a1),d0
ext.l d0
bra 3f
lal_qn: move.l (sp)+,d0
bra 3f
lal__1: move.l #-1,d0
3: pea 0(a2,d0)
jmp (a4)
lal_w_1: move.l #-1,d0
2: move.b (a3)+,d0
asl.l wmu,d0
bra 3b
lal_w_2: move.l #-512,d0
bra 2b
lae_l: adroff
move.w (a1),d0
bra 1f
lae_q: move.l (sp)+,d0
bra 1f
lae_w0: lae_w1: lae_w2: lae_w3: lae_w4:
lae_w5: lae_w6:
sub.w #484,d0
asl.w #6,d0
move.b (a3)+,d0
asl.w wmu,d0
1: pea 0(a6,d0)
jmp (a4)
!---------------------------------------------------------------------------
lxl_1: move.l 16(a2),-(sp)
jmp (a4)
lxl_l: adroff
move.w (a1),d0
beq 5f
bgt 1f
blt e_oddz
1: sub.l #1,d0
bra 2f
lxl_2: move.w #1,d0
2: move.l a2,a0
3: move.l 16(a0),a0
dbra d0,3b
move.l a0,-(sp)
jmp (a4)
5: move.l a2,-(sp)
jmp (a4)
lxa_1: move.l #0,d0
bra 3f
lxa_l: adroff
move.w (a1),d0
bgt 1f
blt e_oddz
pea 16(a2)
jmp (a4)
1: sub.l #1,d0
3: move.l a2,a0
2: move.l 16(a0),a0
dbra d0,2b
pea 16(a0)
jmp (a4)
!-----------------------------------------------------------------------
loi_l: adroff
clr.l d1
move.w (a1),d1
bra 8f
loi_s0: clr.l d1
move.b (a3)+,d1
8: cmp.w #1,d1
beq loi_1
cmp.w #2,d1
beq 2f
move.w d1,d0
move.w d7,d2
3: asr.w #1,d0 ; dbcs d2,3b
bcs e_oddz
bra 5f
loi_1W: loi_2W: loi_3W: loi_4W:
asr.w #2,d0
sub.w #168,d0
move.l d0,d1
asl.w wmu,d1
5: move.l (sp)+,a0
add.l d1,a0
sub.w #1,d0
1: mov -(a0),-(sp)
dbra d0,1b
jmp (a4)
2: move.l (sp)+,a0
move.w (a0),d0
mov d0,-(sp)
jmp (a4)
loi_1: move.l (sp)+,a0
move.w d6,d0
move.b (a0),d0
mov d0,-(sp)
jmp (a4)
los_z: mov (sp)+,d0
bra 0f
los_l: adroff
move.w (a1),d0
0: checksize
2: move.l #0,d1 ; move.w (sp)+,d1 ; bra 8b
4: move.l (sp)+,d1 ; bra 8b

191
mach/mantra/int/mloop3 Normal file
View file

@ -0,0 +1,191 @@
!---------------------------------------------------------------------
! STORE GROUP
!---------------------------------------------------------------------
stl_pw: adroff
move.w (a1),d0
3: asl.l wmu,d0
mov (sp)+,16(a2,d0)
jmp (a4)
stl_qpw: move.l (sp)+,d0
bra 3b
stl_nw: adroff
move.w (a1),d0
ext.l d0
bra 1f
stl_qnw: move.l (sp)+,d0
bra 1f
stl_w_1: move.l #-1,d0
move.b (a3)+,d0
1: asl.l wmu,d0
mov (sp)+,0(a2,d0)
jmp (a4)
stl_0: mov (sp)+,16(a2) ; jmp (a4)
stl_1W: mov (sp)+,l1(a2) ; jmp (a4)
stl__1W: mov (sp)+,l_1(a2) ; jmp (a4)
stl__2W: mov (sp)+,l_2(a2) ; jmp (a4)
stl__3W: mov (sp)+,l_3(a2) ; jmp (a4)
stl__4W: mov (sp)+,l_4(a2) ; jmp (a4)
stl__5W: mov (sp)+,l_5(a2) ; jmp (a4)
sdl_w_1: move.l #-1,d0
move.b (a3)+,d0
2: asl.l wmu,d0
mov (sp)+,0(a2,d0)
mov (sp)+,word(a2,d0)
jmp (a4)
sdl_nw: adroff
move.w (a1),d0
ext.l d0
bra 2b
sdl_qnw: move.l (sp)+,d0
bra 2b
sdl_qpw: move.l (sp)+,d0
bra 4f
sdl_pw: adroff
move.w (a1),d0
4: asl.l wmu,d0
mov (sp)+,l0(a2,d0)
mov (sp)+,l1(a2,d0)
jmp (a4)
!------------------------------------------------------------------------
sde_q: move.l (sp)+,d0
bra 1f
sde_l: adroff
move.w (a1),d0
1: mov (sp)+,0(a6,d0)
mov (sp)+,word(a6,d0)
jmp (a4)
ste_qw: move.l (sp)+,d0
bra 1f
ste_lw: adroff
move.w (a1),d0
bra 1f
ste_w2: move.w #512,d0 ; bra 0f
ste_w1: move.w #256,d0 ; bra 0f
ste_w0: clr.w d0
0: move.b (a3)+,d0
1: asl.l wmu,d0
mov (sp)+,0(a6,d0)
jmp (a4)
!-------------------------------------------------------------------------
stf_q: move.l (sp)+,a0
bra 6f
stf_l: adroff
move.l #0,a0
move.w (a1),a0
bra 6f
stf_2W: move.l wrd,a0 ; add.l a0,a0
bra 6f
stf_s0: clr.w d0
move.b (a3)+,d0
move.l d0,a0
bra 6f
stf_1W: move.l wrd,a0
6: add.l (sp)+,a0
mov (sp)+,(a0)
jmp (a4)
sdf_q: move.l (sp)+,a0
bra 7f
sdf_l: adroff
move.l d6,a0
move.w (a1),a0
7: add.l (sp)+,a0
mov (sp)+,(a0)+
mov (sp)+,(a0)
jmp (a4)
!-----------------------------------------------------------------------------
sil_w0: move.w d6,d0
move.b (a3)+,d0
asl.l wmu,d0
5: move.l 16(a2,d0),a0
mov (sp)+,(a0)
jmp (a4)
sil_w_1: move.l #-1,d0
move.b (a3)+,d0
asl.l wmu,d0
2: move.l 0(a2,d0),a0
mov (sp)+,(a0)
jmp (a4)
sil_pw: adroff
move.w (a1),d0
bra 5b
sil_qpw: move.l (sp)+,d0
bra 5b
sil_nw: adroff
move.w (a1),d0
ext.l d0
bra 2b
sil_qnw: move.l (sp)+,d0
bra 2b
!----------------------------------------------------------------------------
sti_1: move.l (sp)+,a0
move.b word-1(sp),(a0) !lsb,msb goed?
add.l wrd,sp
jmp (a4)
sti_l: adroff ; move.w (a1),d0 ; bra 0f
sti_s0: clr.w d0 ; move.b (a3)+,d0
0: asr.l #1,d0 ; bne 1f
bcs sti_1 ; bra e_oddz
1: bcs e_oddz
#ifdef lword
asr.l #1,d0 ; bne 2f
move.l (sp)+,a0; lea 2(sp),sp
move.w (sp)+,(a0); jmp (a4)
2: bcs e_oddz
#endif
sub.w #1,d0 ; bra 3f
sti_1W: sti_2W: sti_3W: sti_4W:
sub.w #876,d0 ; asr.w #2,d0
3: move.l (sp)+,a0
4: mov (sp)+,(a0)+
dbra d0,4b
jmp (a4)
sts_l: adroff ; move.w (a1),d0
6: checksize
4: move.l (sp)+,d0; bra 0b
2: move.w (sp)+,d0; bra 0b
sts_z: mov (sp)+,d0
bra 6b
!------------------------------------------------------------------------------
! POINTER ARITHMETIC
!------------------------------------------------------------------------------
adp_l: adroff ; move.w (a1),d0
ext.l d0
add.l d0,(sp); jmp (a4)
adp_q: move.l (sp)+,d0 ; add.l d0,(sp)
jmp (a4)
adp_1: add.l #1,(sp); jmp (a4)
adp_2: add.l #2,(sp); jmp (a4)
adp_s0: move.l d6,d0 ; move.b (a3)+,d0
add.l d0,(sp); jmp (a4)
adp_s_1: move.l #-1,d0 ; move.b (a3)+,d0
add.l d0,(sp) ; jmp (a4)
ads_l: adroff ; move.w (a1),d0
bra 0f
ads_z: mov (sp)+,d0
0: checksize
4: move.l (sp)+,d1 ; add.l d1,(sp) ; jmp (a4)
2: move.w (sp)+,d1 ; ext.l d1
add.l d1,(sp) ; jmp (a4)
ads_1W: mov (sp)+,d0
#ifndef lword
ext.l d0
#endif
add.l d0,(sp); jmp (a4)
sbs_l: adroff ; move.w (a1),d0
bra 0f
sbs_z: mov (sp)+,d0 !d0 contains objectsize
0: checksize
4: move.l (sp)+,d1 ; sub.l d1,(sp)
jmp (a4)
2: move.l (sp)+,d1 ; sub.l d1,(sp)
clr.w (sp)+ ; jmp (a4)

236
mach/mantra/int/mloop4 Normal file
View file

@ -0,0 +1,236 @@
!----------------------------------------------------------------------------
! CLEARS , INCREMENTS , DECREMENTS
!-----------------------------------------------------------------------------
inc_z: move.l sp,a0
4:
#if test
comp und,(a0)
bne 3f ; bsr e_iund
3:
#endif
ad #1,(a0) ; bvs 9f
jmp (a4)
#ifdef lword
inl__1W: move.l a2,a0 ; sub.l #4,a0 ; bra 4b
inl__2W: move.l a2,a0 ; sub.l #8,a0 ; bra 4b
inl__3W: move.l a2,a0 ; sub.l #12,a0 ; bra 4b
#else
inl__1W: move.l a2,a0 ; sub.l #2,a0 ; bra 4b
inl__2W: move.l a2,a0 ; sub.l #4,a0 ; bra 4b
inl__3W: move.l a2,a0 ; sub.l #6,a0 ; bra 4b
#endif
inl_w_1: move.l #-1,d0 ; move.b (a3)+,d0
2: asl.l wmu,d0
1: move.l a2,a0 ; add.l d0,a0 ; bra 4b
inl_pw: adroff ; move.w (a1),d0
6: asl.l wmu,d0 ; add.l #16,d0
bra 1b
inl_qpw: move.l (sp)+,d0 ; bra 6b
inl_nw: adroff ; move.w (a1),d0
ext.l d0 ; bra 2b
inl_qnw: move.l (sp)+,d0 ; bra 2b
ine_lw: adroff ; move.w (a1),d0 ; bra 5f
ine_qw: move.l (sp)+,d0 ; bra 5f
ine_w0: clr.w d0 ; move.b (a3)+,d0
5: asl.l wmu,d0 ; move.l d0,a0
add.l a6,a0 ; bra 4b
!---------------------------------------------------------------------------
dec_z: move.l sp,a0
4:
#if test
!let op , test gebruikt voor tst?
comp und,(a0) ;bne 3f
bsr e_iund
3:
#endif
subt #1,(a0) ; bvs 9f
jmp (a4)
del_w_1: move.l #-1,d0 ; move.b (a3)+,d0
1: asl.l wmu,d0
2: move.l a2,a0 ; add.l d0,a0 ; bra 4b
del_pw: adroff ; move.w (a1),d0
5: asl.l wmu,d0 ; add.l #16,d0 ; bra 2b
del_qpw: move.l (sp)+,d0 ; bra 5b
del_nw: adroff ; move.w (a1),d0
ext.l d0 ; bra 1f
del_qnw: move.l (sp)+,d0 ; bra 1f
dee_w0: clr.w d0 ; move.b (a3)+,d0
0: asl.l wmu,d0 ; move.l d0,a0
add.l a6,a0 ; bra 4b
dee_lw: adroff ; move.w (a1),d0 ; bra 0b
dee_qw: move.l (sp)+,d0 ; bra 0b
9: bsr e_iovfl !error routine for integer overflow
jmp (a4)
!----------------------------------------------------------------------------
zrl__1W: cl l_1(a2) ; jmp (a4)
zrl__2W: cl l_2(a2) ; jmp (a4)
zrl_w_1: move.l #-1,d0 ; move.b (a3)+,d0
1: asl.l wmu,d0 ; cl 0(a2,d0)
jmp (a4)
zrl_nw: adroff ; move.w (a1),d0
ext.l d0 ; bra 1b
zrl_qnw: move.l (sp)+,d0 ; bra 1b
zrl_pw: adroff ; move.w (a1),d0
2: asl.l wmu,d0 ; cl 16(a2,d0)
jmp (a4)
zrl_qpw: move.l (sp)+,d0 ; bra 2b
zre_lw: adroff ; move.w (a1),d0 ; bra 7f
zre_qw: move.l (sp)+,d0 ; bra 7f
zre_w0: clr.w d0 ; move.b (a3)+,d0
7: asl.l wmu,d0 ; cl 0(a6,d0)
jmp (a4)
zrf_l: adroff ; move.w (a1),d0 ; bra 8f
zrf_z: mov (sp)+,d0
8: move.l d7,d1
3: asr.w #1,d0 ; dbcs d1,3b
bcs e_oddz ; sub.w #1,d0
0: cl -(sp) ; dbra d0,0b
jmp (a4)
zer_s0: clr.w d0 ; move.b (a3)+,d0 ; bra 8b
zer_l: adroff ; move.w (a1),d0 ; bra 8b
zer_z: mov (sp),d0 ; bra 8b
! The test on illegal argument takes some time , specially in 4byte case.
!-----------------------------------------------------------------------
! LOGICAL GROUP
!-------------------------------------------------------------------------
and_1W: mov (sp)+,d1
an d1,(sp)
jmp (a4)
and_l: adroff ; move.w (a1),d0 ; bra 1f
and_z: mov (sp)+,d0
1: ble e_oddz ; move.l d0,a0
move.l d7,d2
2: asr.l #1,d0 ; dbcs d2,2b ; bcs e_oddz
add.l sp,a0 ; sub.l #1,d0
3: mov (sp)+,d1; an d1,(a0)+
dbra d0,3b ; jmp (a4)
!------------------------------------------------------------------------------
ior_1W: mov (sp)+,d1; inor d1,(sp)
jmp (a4)
ior_s0: clr.w d0 ; move.b (a3)+,d0; bra 4f
ior_l: adroff ; move.w (a1),d0 ; bra 4f
ior_z: mov (sp)+,d0
4: ble e_oddz ; move.l d0,a0
move.l d7,d2
5: asr.l #1,d0 ; dbcs d2,5b ; bcs e_oddz
add.l sp,a0 ; sub.l #1,d0
move.l d6,d1
3: mov (sp)+,d1
inor d1,(a0)+; dbra d0,3b
jmp (a4)
!----------------------------------------------------------------------------
xor_l: adroff ; move.w (a1),d0 ; bra 6f
xor_z: mov (sp)+,d0
6: ble e_oddz ; move.l d0,a0
move.l d7,d2
8: asr.l #1,d0 ; dbcs d2,8b ; bcs e_oddz
add.l sp,a0 ; sub.l #1,d0
7: mov (sp)+,d1
exor d1,(a0)+; dbra d0,7b
jmp (a4)
!----------------------------------------------------------------------------
com_l: adroff ; move.w (a1),d0 ; bra 0f
com_z: mov (sp)+,d0
0: ble e_oddz ; move.l d7,d2
1: asr.l #1,d0 ; dbcs d2,1b ; bcs e_oddz
move.l sp,a0 ; sub.l #1,d0
2: nt (a0)+ ; dbra d0,2b
jmp (a4)
!---------------------------------------------------------------------------
rol_l: adroff ; move.w (a1),d0 ; bra 3f
rol_z: mov (sp)+,d0
3: ble e_oddz ; move.l d7,d2
4: asr.l #1,d0 ; dbcs d2,4b
bcs e_oddz
sub.l #1,d0
mov (sp)+,d1
bmi 2f
0: move.l sp,a0 !d0 = #words-1 , d1 = shift count
5: mov (a0),d2 ; rotl d1,d2
mov d2,(a0)+; dbra d0,5b
jmp (a4)
2: nega d1 ; bra 0f
2: nega d1 ; bra 0b
ror_l: adroff ; move.w (a1),d0 ; bra 6f
ror_z: mov (sp)+,d0
6: ble e_oddz ; move.l d7,d2
7: asr.l #1,d0 ; dbcs d2,7b
bcs e_oddz ; sub.l #1,d0
mov (sp)+,d1
bmi 2b
0: move.l sp,a0
8: mov (a0),d2 ; rotr d1,d2
mov d2,(a0)+; dbra d0,8b
jmp (a4)
!-----------------------------------------------------------------------------
! SET GROUP
!------------------------------------------------------------------------------
set_s0: clr.w d0 ; move.b (a3)+,d0
0: ble e_oddz ; clr.l d1
mov (sp)+,d1; move.l d0,d2
move.l d7,d3
1: asr.l #1,d2 ; dbcs d3,1b
bcs e_oddz ; sub.l #1,d2
2: cl -(sp) ; dbra d2,2b
move.l sp,a0 ; move.l d1,d2
asr.l #3,d2 ; cmp.l d0,d2 !d2 byte number
bmi 3f ; bsr e_set
jmp (a4)
3:
#ifdef lword
bchg #1,d2 !0->3,1->2
#endif
bchg #0,d2 ; add.l d2,a0
bset d1,(a0) ; jmp (a4) !d1 mod 8 bit set
set_l: adroff ; move.w (a1),d0 ; bra 0b
set_z: mov (sp)+,d0; bra 0b
!----------------------------------------------------------------------------
inn_s0: clr.w d0 ; move.b (a3)+,d0
0: ble e_oddz
move.l d6,d1 ; mov (sp)+,d1
btst #0,d0 ; bne e_oddz
#ifdef lword
btst #1,d0 ; bne e_oddz
#endif
move.l sp,a0 ; add.l d0,sp
move.l d1,d2 ; asri #3,d2
comp d2,d0 ; bhi 3f
cl -(sp)
!#if test
! bsr e_set
!#endif
jmp (a4)
3:
#ifdef lword
bchg #1,d2
#else
ext.l d2
#endif
bchg #0,d2 ; add.l d2,a0
btst d1,(a0) ; beq 7f
mov #1,-(sp); jmp (a4)
7: cl -(sp) ; jmp (a4)
inn_l: adroff ; move.w (a1),d0 ; bra 0b
inn_z: mov (sp)+,d0; bra 0b

186
mach/mantra/int/mloop5 Normal file
View file

@ -0,0 +1,186 @@
!-----------------------------------------------------------------------------.
! ARRAY GROUP
!-------------------------------------------------------------------------------
!subroutine
calcarr: move.l (sp)+,d3 !save return address
move.l (sp)+,a0 !address of array describtor
mov (sp)+,d0 !index
subt (a0)+,d0 !relative address
blt 9f
comp (a0)+,d0 !check upper bound
bgt 9f
move.l #0,d1
mov (a0),d1
mulu d1,d0 !objectsize in d1
move.l (sp)+,a0
ad d0,a0 !a0 address of array element
move.l d3,-(sp)
rts
9: bsr e_array ;tst.l (sp)+ ; jmp (a4)
aar_1W: bsr calcarr ; move.l a0,-(sp)
jmp (a4)
aar_l: adroff ; cmp.w wrd,(a1)
0: bne e_illins ; bra aar_1W
aar_z: comp wrd,(sp)+ ; bra 0b
lar_1W: bsr calcarr ; add.l d1,a0
asr.w #1,d1 ; bcc 5f
clr.l d1 ; move.b -(a0),d1
mov d1,-(sp); jmp (a4)
5:
#ifdef lword
asr.w #1,d1 ; bcc 6f
move.w -(a0),d1; move.l d1,-(sp)
jmp (a4)
#endif
6: sub.l #1,d1
7: mov -(a0),-(sp); dbra d1,7b
jmp (a4)
lar_l: adroff ; cmp.w wrd,(a1)
8: bne e_illins; bra lar_1W
lar_z: comp wrd,(sp)+ ; bra 8b
sar_1W: bsr calcarr ; asr.w #1,d1
bcc 5f ; testen (sp)+
move.b -1(sp),(a0); jmp (a4)
5:
#ifdef lword
asr.w #1,d1 ; bcc 6f
tst.w (sp)+ ; move.w (sp)+,(a0)
jmp (a4)
#endif
6: sub.l #1,d1
7: mov (sp)+,(a0)+ ; dbra d1,7b
jmp (a4)
sar_z: comp wrd,(sp)+ ; bra 1f
sar_l: adroff ; cmp.w wrd,(a1)
1: bne e_illins ; bra sar_1W
!-------------------------------------------------------------------------
! CONVERT GROUP
!-------------------------------------------------------------------------w
cii_z: mov (sp)+,d0 ; mov (sp)+,d1 ; !d0 destination size
!d1 source size
#if test
cmp.w wrd,d1 ; bne 0f
comp und,(sp) ; bne 0f
bsr e_iund
#endif
0: cmp.w d0,d1 ; bne 1f ; jmp (a4)
1: bge 6f ; mov (sp)+,d2
cmp.w #1,d1 ; bne 3f !d1<d0
ext.w d2
#ifndef lword
cmp.w #2,d0 ; bne 3f
move.w d2,-(sp); jmp (a4)
#endif
3: ext.l d2 ; move.l d2,-(sp); jmp (a4)
6:
#ifdef lword
bsr e_conv ; add.l #4,sp
#else
move.w (sp)+,d2
#if test
bne 7f ; tst.w (sp) ; bge 9f
8: bsr e_conv ; jmp (a4)
7: comp #-1,d2 ; bne 8b
tst.w (sp) ; bge 8b
#endif
#endif
9: jmp (a4)
cui_z: mov (sp)+,d0 ; mov (sp)+,d1
sub.w d1,d0 ; bne 2f
#if test
testen (sp) ; bpl 1f
0: bsr e_conv
#endif
1: jmp (a4)
2:
#ifdef lword
sub.l d0,sp ; bsr e_conv
#else
bgt 3f ; cmp.w #-2,d0 ; beq 5f
bsr e_conv
#if test
tst.w (sp) ; bne 0b
tst.w 2(sp) ; bmi 0b
#endif
5: sub.l #-2,sp ; jmp (a4)
3: cmp.w #2,d0 ; beq 4f
bsr e_conv
4: clr.w -(sp)
#endif
jmp (a4)
ciu_z: mov (sp)+,d0 ; mov (sp)+,d1
#if test
cmp.w wrd,d1 ; bne 0f
comp und,(sp) ; bne 0f
bsr e_iund
#endif
0: sub.w d1,d0 ; bne 1f
jmp (a4)
#ifndef lword
1: bgt 4f ; cmp.w #-2,d0
beq 5f ; bsr e_conv
5:
#if test
move.w (sp),d1 ; beq 6f
not.w d1 ; beq 6f
bsr e_conv
#endif
6: add.l #2,sp ; jmp (a4)
#endif
4: 1: bclr #0,d0 ; beq 2f
#ifdef lword
clr.b 2(sp)
#else
clr.b (sp)
#endif
2: bclr #1,d0 ; beq 3f
#ifdef lword
clr.w (sp)
#else
clr.w -(sp)
#endif
3: jmp (a4)
cuu_z: mov (sp)+,d0 ; mov (sp)+,d1
sub.w d1,d0 ; bne 1f
jmp (a4)
1:
#ifdef lword
bsr e_conv ; sub.l d0,sp
#else
blt 3f
#if test
cmp.w #2,d0 ; beq 2f
bsr e_conv
#endif
2: clr.w -(sp) ; jmp (a4)
3:
#if test
cmp.w #-2,d0 ; beq 4f
bsr e_conv
#endif
4: tst.w (sp)+
#if test
beq 5f ; bsr e_conv
#endif
#endif
5: jmp (a4)
!--------------------------------------------------------------------------
cuf_z: cfu_z: cff_z: cfi_z: cif_z:
mov (sp)+,d0 ; subt (sp)+,d0
ext.l d0
sub.l d0,sp
#ifdef FLTRAP
bra flnim !floating point not implemented
#else
jmp (a4)
#endif

362
mach/mantra/int/mloop6 Normal file
View file

@ -0,0 +1,362 @@
!----------------------------------------------------------------------------
! SIGNED INTEGER ARITHMETIC
!------------------------------------------------------------------------------
adi_l: adroff ; move.w (a1),d0 ; bra 1f
adi_z: mov (sp)+,d0
1: sub.w wrd,d0 ; beq adi_1W
sub.w wrd,d0 ; beq adi_2W
bra e_oddz
adi_1W:
#if test
comp und,(sp) ; beq 6f
comp und,word(sp); bne 7f
6: bsr e_iund
#endif
7: mov (sp)+,d0 ; ad d0,(sp)
#if test
bvs 9f
#endif
jmp (a4)
adi_2W:
#ifdef lword
bsr no8bar ; add.l #8,sp
jmp (a4)
#else
move.l (sp)+,d0 ; add.l d0,(sp)
#endif
#if test
bvs 9f
#endif
jmp (a4)
!--------------------------------------------------------------------------
sbi_z: mov (sp)+,d0 ; bra 1f
sbi_l: adroff ; move.w (a1),d0
1: sub.w wrd,d0 ; beq sbi_1W
sub.w wrd,d0 ; beq sbi_2W
bra e_oddz
sbi_1W:
#if test
comp und,(sp) ; beq 6f
comp und,word(sp) ; bne 7f
6: bsr e_iund
#endif
7: mov (sp)+,d0 ; subt d0,(sp)
#if test
bvs 9f
#endif
jmp (a4)
sbi_2W:
#ifdef lword
add.l #8,sp ; bsr no8bar
jmp (a4)
#else
move.l (sp)+,d0 ; sub.l d0,(sp)
#endif
#if test
bvs 9f
#endif
jmp (a4)
9: bsr e_iovfl ; jmp (a4)
!----------------------------------------------------------------------------
mli_z: mov (sp)+,d0 ; bra 0f
mli_l: adroff ; move.w (a1),d0
0: sub.w wrd,d0 ; beq mli_1W
sub.w wrd,d0 ; beq mli_2W
bra e_oddz
mli_1W: mov (sp)+,d0
#if test
comp und,d0 ; beq 1f
comp und,(sp) ; bne 2f
1: bsr e_iund
#endif
2:
#ifdef lword
move.l (sp)+,d1 ; bra 4f
#else
muls (sp),d0 ; move.w d0,(sp)
#if test
bpl 3f ; not.l d0
3: swap d0 ; tst.w d0 ; bne 9b
#endif
jmp (a4)
#endif
mli_2W:
#ifdef lword
bsr no8bar ; add.l #4,sp
move.l (sp)+,d0 ; add.l #4,sp
move.l (sp)+,d1
#else
move.l (sp)+,d0 ; move.l (sp)+,d1
#endif
4: clr.w d5 ; tst.l d0 ; bpl 5f
neg.l d0 ; not.w d5
5: tst.l d1 ; bpl 6f
neg.l d1 ; not.w d5
6: bsr mlu4
#if test
tst.l d4 ; bne 7f
tst.l d0 ; bpl 8f
7: bsr e_iovfl
#endif
8: tst.w d5 ; beq 0f
neg.l d0
0: move.l d0,-(sp)
!next 4 lines only in case 8 byte arithmetic
!#ifdef lword
! bmi 1f ; clr.l -(sp) ; bra 2f
!1: move.l #-1,-(sp)
!#endif
2: jmp (a4)
!subroutine for unsigned 4byte multiplication . Expects multiplier in d0 and
! multiplicant in d1 . Returns 4 byte result in d0 . If d4=0 overflow did
! not occur on the multiplication , else it did .
.define mlu4
.text
mlu4: move.l d1,d3 ; move.l d0,d2
swap d2 ; swap d3
#if test
move.l d3,d4 ; mulu d2,d4
#endif
mulu d0,d3 ; swap d3
mulu d1,d2 ; swap d2
#if test
or.w d3,d4 ; or.w d2,d4
#endif
clr.w d3 ; clr.w d2
mulu d1,d0 ; add.l d3,d0
#if test
bvc 1f ; bset #0,d4
#endif
1: add.l d2,d0
#if test
bvc 2f ; bset #0,d4
#endif
2: rts
!---------------------------------------------------------------------------
dvi_z: mov (sp)+,d0 ; bra 0f
dvi_l: adroff ; move.w (a1),d0
0: sub.w wrd,d0 ; beq dvi_1W
sub.w wrd,d0 ; beq dvi_2W
bra e_oddz
dvi_1W:
#ifdef lword
bsr dvi4 ; move.l d1,-(sp)
#else
bsr dvi2 ; move.w d1,-(sp)
#endif
jmp (a4)
dvi_2W:
#ifdef lword
bsr no8bar ; tst.l (sp)+
move.l (sp)+,(sp) ; bsr dvi4
move.l d1,-(sp) ; clr.l -(sp)
#else
bsr dvi4 ; move.l d1,-(sp)
#endif
jmp (a4)
rmi_z: mov (sp)+,d0 ; bra 1f
rmi_l: adroff ; move.w (a1),d0
1: sub.l wrd,d0 ; beq rmi_1W
sub.l wrd,d0 ; beq rmi_2W
bra e_oddz
rmi_1W:
#ifdef lword
bsr dvi4 ; move.l d3,-(sp)
#else
bsr dvi2 ; swap d1
move.w d1,-(sp)
#endif
jmp (a4)
rmi_2W:
#ifdef lword
bsr no8bar ; tst.l (sp)+
move.l (sp)+,(sp) ; bsr dvi4
move.l d3,-(sp) ; clr.l -(sp)
#else
bsr dvi4 ; move.l d3,-(sp)
#endif
jmp (a4)
! 2byte division . In d1: quotient=low word ; remainder=high word
dvi2: move.l (sp)+,d2
move.w (sp)+,d0 !divisor
move.w (sp)+,d1 ; ext.l d1 !dividend
#if test
cmp.w und,d1 ; bne 1f
bsr e_iund
1: cmp.w und,d0 ; bne 2f
bsr e_iund
2: tst.w d0 ; bne 3f
bsr e_idivz ; move.l und,d1 ; bra 4f
3:
#endif
divs d0,d1
4: move.l d2,-(sp) ; rts
! long signed division . quotient in d1 , remainder in d3
dvi4: move.l (sp)+,d5
move.l (sp)+,d0 !divisor
move.l (sp)+,d1 !dividend
#ifdef lword
cmp.l und,d0 ; beq 0f
cmp.l und,d1 ; bne 1f
0: bsr e_iund
1:
#endif
clr.l d4 !sign in d4
tst.l d0 ; bpl 1f
neg.l d0 ; not.w d4
1: tst.l d1 ; bpl 2f
neg.l d1
not.w d4 ; swap d4
not.w d4 ; swap d4
2: bsr dvu4
tst.w d4 ; beq 3f
neg.l d1 !quotient
3: tst.l d4 ; bpl 4f
neg.l d3 !remainder
4: move.l d5,-(sp) ; rts
!Expects d0 divisor , d1 dividend. Gives d1 quotient ,d3 remainder
.define dvu4
.text
dvu4:
#if test
tst.l d0 ; bne 1f
bsr e_idivz
1:
#endif
clr.l d3 ; move.l #32,d2
3: lsl.l #1,d1 ; roxl.l #1,d3
cmp.l d0,d3 ; blt 4f
sub.l d0,d3 ; add.l #1,d1
4: sub.w #1,d2 ; bgt 3b
rts
!----------------------------------------------------------------------------
ngi_z: mov (sp)+,d0 ; bra 0f
ngi_l: adroff ; move.w (a1),d0
0: sub.l wrd,d0 ; bne 2f
#if test
comp und,(sp) ; bne 1f
bsr e_iund
1:
#endif
nega (sp) ; jmp (a4)
2: cmp.l wrd,d0 ; beq 3f
bra e_oddz
3:
#ifdef lword
bsr no8bar ; not.l (sp)
neg.l 4(sp)
#else
neg.l (sp)
#endif
#if test
bvc 4f ; bsr e_iovfl
4:
#endif
jmp (a4)
!--------------------------------------------------------------------------
sli_z: mov (sp)+,d0 ; bra 0f
sli_l: adroff ; move.w (a1),d0
0: sub.w wrd,d0 ; beq sli_1W
sub.w wrd,d0 ; beq sli2
bra e_oddz
sli_1W: mov (sp)+,d0 !d0 contains the shift count
bmi 5f
9: mov (sp)+,d1 !integer to shift
#if test
comp und,d0 ; bne 1f
bsr e_iund
1:
#endif
asle d0,d1 ! ASLE
#if test
bvc 2f ; bsr e_iovfl
2:
#endif
mov d1,-(sp) ; jmp (a4)
sli2:
#ifdef lword
bsr no8bar ; move.l (sp)+,d1
move.l (sp)+,d2 ; move.l (sp)+,d0
3: asl.l #1,d0 ; roxl.l #1,d2
sub.l #1,d1 ; bgt 3b
move.l d0,-(sp) ; move.l d2,-(sp)
#else
move.w (sp)+,d0
bmi 6f
8: move.l (sp),d1
asl.l d0,d1
#if test
bvc 4f ; bsr e_iovfl
4:
#endif
move.l d1,(sp)
#endif
jmp (a4)
5: nega d0 ; bra 8f
#ifndef lword
6: neg.w d0 ; bra 9f
#endif
!------------------------------------------------------------------------------
7: nega d0 ; bra 9b
#ifndef lword
6: neg.w d0 ; bra 8b
#endif
sri_z: mov (sp)+,d0 ; bra 0f
sri_l: adroff ; move.w (a1),d0
0: sub.w wrd,d0 ; bne sri2
mov (sp)+,d0
bmi 7b
8: mov (sp)+,d1
#if test
comp und,d0 ; bne 1f
bsr e_iund
1:
#endif
asri d0,d1
#if test
bvc 2f ; bsr e_iovfl
2:
#endif
mov d1,-(sp) ; jmp (a4)
sri2: sub.w wrd,d0 ; beq 3f
bra e_oddz
3:
#ifdef lword
bsr no8bar ; move.l (sp)+,d1
move.l (sp)+,d2 ; move.l (sp),d0
sub.l #1,d1
4: asr.l #1,d2 ; roxr.l #1,d0 ; dbra d1,4b
move.l d0,(sp) ; move.l d2,-(sp)
#else
move.w (sp)+,d0
bmi 6b
9: move.l (sp),d1
asr.l d0,d1
#if test
bvc 5f ; bsr e_iovfl
5:
#endif
move.l d1,(sp)
#endif
jmp (a4)

120
mach/mantra/int/mloop7 Normal file
View file

@ -0,0 +1,120 @@
!------------------------------------------------------------------------------
! UNSIGNED ARITHMETIC
!-----------------------------------------------------------------------------
adu_z: mov (sp)+,d0 ; bra 0f
adu_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d1 ; add.w d1,(sp)
jmp (a4)
4: move.l (sp)+,d1; add.l d1,(sp)
jmp (a4)
sbu_z: mov (sp)+,d0 ; bra 0f
sbu_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d1 ; sub.w d1,(sp)
jmp (a4)
4: move.w (sp)+,d1 ; sub.l d1,(sp)
jmp (a4)
!------------------------------------------------------------------------------
mlu_z: mov (sp)+,d0 ; bra 0f
mlu_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d0 ; mulu (sp),d0
move.w d0,(sp) ; jmp (a4)
4: move.l (sp)+,d0 ; move.l (sp),d1
bsr mlu4 ; move.l d0,(sp)
jmp (a4)
!----------------------------------------------------------------------------
dvu_z: mov (sp)+,d0 ; bra 0f
dvu_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d1 ; beq 3f
move.w (sp),d0 ; divu d1,d0
move.w d0,(sp) ; jmp (a4)
3: bsr e_idivz ; move.w #-1,(sp)
jmp (a4)
4: move.l (sp)+,d0 ; move.l (sp),d1
bsr dvu4 ; move.l d1,(sp)
jmp (a4)
!----------------------------------------------------------------------------
rmu_z: mov (sp)+,d0 ; bra 0f
rmu_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d1 ; beq 3f
move.w (sp),d0 ; divu d1,d0
swap d0 ; move.w d0,(sp)
jmp (a4)
3: bsr e_idivz ; clr.w (sp)
jmp (a4)
4: move.l (sp)+,d0 ; move.l (sp),d1
bsr dvu4 ; move.l d3,(sp)
jmp (a4)
!------------------------------------------------------------------------.
slu_z: mov (sp)+,d0 ; bra 0f
slu_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d0
bmi 7f
3: move.w (sp),d1
lsl.w d0,d1 ; move.w d1,(sp)
jmp (a4)
4: mov (sp)+,d0
bmi 9f
5: move.l (sp),d1
lsl.l d0,d1 ; move.l d1,(sp)
jmp (a4)
7: neg.w d0 ; bra 3f
9: nega d0 ; bra 5f
7: neg.w d0 ; bra 3b
9: nega d0 ; bra 5b
sru_z: mov (sp)+,d0 ; bra 0f
sru_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d0
bmi 7b
3: move.w (sp),d1
lsr.w d0,d1 ; move.w d1,(sp)
jmp (a4)
4: mov (sp)+,d0
bmi 9b
5: move.l (sp),d1
lsr.l d0,d1 ; move.l d1,(sp)
jmp (a4)
!------------------------------------------------------------------------------
! DUMMY FLOATING POINT ROUTINES
!------------------------------------------------------------------------------
adf_l: sbf_l: mlf_l: dvf_l:
adroff ; move.w (a1),d0
1: add.l d0,sp
#ifdef FLTRAP
bra flnim
#else
jmp (a4)
#endif
adf_z: sbf_z: mlf_z: dvf_z:
mov (sp)+,d0 ; bra 1b
adf_s0: sbf_s0: mlf_s0: dvf_s0:
move.l #0,d0 ; move.b (a3)+,d0
bra 1b
fef_l: sub.l wrd,sp
fif_l: ngf_l: adroff
fef_z:
#ifdef FLTRAP
bra flnim
#else
jmp (a4)
#endif
ngf_z: fif_z: add.l wrd,sp ; bra fef_z

234
mach/mantra/int/mloop8 Normal file
View file

@ -0,0 +1,234 @@
!-------------------------------------------------------------------------
! TEST AND BRANCH GROUP
!-------------------------------------------------------------------------
tlt_z: testen (sp)+ ; blt true ; cl -(sp) ; jmp (a4)
tle_z: testen (sp)+ ; ble true ; cl -(sp) ; jmp (a4)
teq_z: testen (sp)+ ; beq true ; cl -(sp) ; jmp (a4)
tne_z: testen (sp)+ ; bne true ; cl -(sp) ; jmp (a4)
tge_z: testen (sp)+ ; bge true ; cl -(sp) ; jmp (a4)
tgt_z: testen (sp)+ ; bgt true ; cl -(sp) ; jmp (a4)
true: mov #1,-(sp) ; jmp (a4)
zlt_s0: testen (sp)+ ; blt bra_s0 ; bra nobr2
zlt_l: testen (sp)+ ; blt bra_l ; bra nobr3
zlt_q: move.l (sp)+,d0
testen (sp)+ ; blt 1f ; jmp (a4)
zle_s0: testen (sp)+ ; ble bra_s0 ; bra nobr2
zle_l: testen (sp)+ ; ble bra_l ; bra nobr3
zle_q: move.l (sp)+,d0
testen (sp)+ ; ble 1f ; jmp (a4)
zeq_s0: testen (sp)+ ; beq bra_s0 ; bra nobr2
zeq_s1: testen (sp)+ ; beq bra_s1 ; bra nobr2
zeq_l: testen (sp)+ ; beq bra_l ; bra nobr3
zeq_q: move.l (sp)+,d0
testen (sp)+ ; beq 1f ; jmp (a4)
zne_s0: testen (sp)+ ; bne bra_s0 ; bra nobr2
zne_s_1: testen (sp)+ ; bne bra_s_1 ; bra nobr2
zne_l: testen (sp)+ ; bne bra_l ; bra nobr3
zne_q: move.l (sp)+,d0
testen (sp)+ ; bne 1f ; jmp (a4)
zge_s0: testen (sp)+ ; bge bra_s0 ; bra nobr2
zge_l: testen (sp)+ ; bge bra_l ; bra nobr3
zge_q: move.l (sp)+,d0
testen (sp)+ ; bge 1f ; jmp (a4)
zgt_s0: testen (sp)+ ; bgt bra_s0 ; bra nobr2
zgt_l: testen (sp)+ ; bgt bra_l ; bra nobr3
zgt_q: move.l (sp)+,d0
testen (sp)+ ; bgt 1f ; jmp (a4)
blt_s0: comp (sp)+,(sp)+ ; blt bra_s0 ; bra nobr2
blt_l: comp (sp)+,(sp)+ ; blt bra_l ; bra nobr3
blt_q: move.l (sp)+,d0
comp (sp)+,(sp)+ ; blt 1f ; jmp (a4)
ble_s0: comp (sp)+,(sp)+ ; ble bra_s0 ; bra nobr2
ble_l: comp (sp)+,(sp)+ ; ble bra_l ; bra nobr3
ble_q: move.l (sp)+,d0
comp (sp)+,(sp)+ ; ble 1f ; jmp (a4)
beq_s0: comp (sp)+,(sp)+ ; beq bra_s0 ; bra nobr2
beq_l: comp (sp)+,(sp)+ ; beq bra_l ; bra nobr3
beq_q: move.l (sp)+,d0
comp (sp)+,(sp)+ ; beq 1f ; jmp (a4)
bne_s0: comp (sp)+,(sp)+ ; bne bra_s0 ; bra nobr2
bne_l: comp (sp)+,(sp)+ ; bne bra_l ; bra nobr3
bne_q: move.l (sp)+,d0
comp (sp)+,(sp)+ ; bne 1f ; jmp (a4)
bge_s0: comp (sp)+,(sp)+ ; bge bra_s0 ; bra nobr2
bge_l: comp (sp)+,(sp)+ ; bge bra_l ; bra nobr3
bge_q: move.l (sp)+,d0
comp (sp)+,(sp)+ ; bge 1f ; jmp (a4)
bgt_s0: comp (sp)+,(sp)+ ; bgt bra_s0 ; bra nobr2
bgt_l: comp (sp)+,(sp)+ ; bgt bra_l ; bra nobr3
bgt_q: move.l (sp)+,d0
comp (sp)+,(sp)+ ; bgt 1f ; jmp (a4)
bra_s0:
move.l d6,d0
0: move.b (a3)+,d0
1: add.l d0,a3 ; jmp (a4)
bra_l: move.b (a3)+,-(sp) ; move.b (a3)+,1(sp)
move.w (sp)+,d0 ; ext.l d0
bra 1b
bra_q:
move.l (sp)+,d0 ; bra 1b
bra_s1: move.w #0x100,d0 ; bra 0b
bra_s_1: move.l #-1,d0 ; bra 0b
bra_s_2: move.l #-0x200,d0 ; bra 0b
nobr2: add.l #1,a3 ; jmp (a4)
nobr3: add.l #2,a3 ; jmp (a4)
!---------------------------------------------------------------------------
! COMPARE GROUP
!-----------------------------------------------------------------------------
cmi_z: mov (sp)+,d0 ; bra 0f
cmi_l: adroff ; move.w (a1),d0
0: sub.w wrd,d0 ; beq cmi_1W
sub.w wrd,d0 ; beq cmi_2W
bra e_oddz
cmi_1W: comp (sp)+,(sp)+ ; bgt 1f ; beq 2f
3: mov #-1,-(sp) ; jmp (a4)
1: mov #1,-(sp) ; jmp (a4)
2: cl -(sp) ; jmp (a4)
cmi_2W:
#ifdef lword
bsr no8bar ; bra e_oddz
#endif
cmp.l (sp)+,(sp)+ ; blt 3b ; beq 2b
bra 1b
cmu_z: mov (sp)+,d0 ; bra 4f
cmu_l: adroff ; move.w (a1),d0
4: sub.w wrd,d0 ; bne 5f
comp (sp)+,(sp)+ ; bcs 3b
beq 2b ; bra 1b
5: sub.w wrd,d0 ; bne e_oddz
#ifdef lword
bsr no8bar ; bra e_oddz
#endif
cmp_z: cmp.l (sp)+,(sp)+ ; bcs 3b
beq 2b ; bra 1b
cms_l: adroff ; move.w (a1),d0
bra 0f
cms_z: mov (sp)+,d0 ; bra 0f
cms_s0: move.l d6,d0 ; move.b (a3)+,d0
0: move.l d0,d1 ; move.l sp,a0
asri wmu,d1 ; subt #1,d1
add.l d0,sp ; move.l sp,d2
1: comp (a0)+,(sp)+ ; bne 2f
dbra d1,1b
mov d6,-(sp) ; jmp (a4)
2: add.l d0,d2 ; move.l d2,sp
move.l #1,d1 ; mov d1,-(sp)
jmp (a4)
! DUMMY FLOAT ROUTINES. POINTER ADJUSTMENT AND WARNING
cmf_s0: move.l d6,d0 ; move.b (a3)+,d0
9: add.w d0,d0 ; add.l d0,sp
cl -(sp)
#ifdef FLTRAP
bra flnim
#else
jmp (a4)
#endif
cmf_l: adroff ; move.w (a1),d0 ; bra 9b
cmf_z: mov (sp)+,d0 ; bra 9b
!-------------------------------------------------------------------------
! CALL AND RETURN GROUP
!----------------------------------------------------------------------------
cai_z: move.l (sp)+,d0 ; bra 1f
cal_q: move.l (sp)+,d0 ; bra 1f
cal_l: adroff ; move.w (a1),d0 ; bra 1f
cal_s0: move.w d6,d0 ; move.b (a3)+,d0 ; bra 1f
cal_1: cal_2: cal_3: cal_4: cal_5: cal_6: cal_7: cal_8:
cal_9: cal_10: cal_11: cal_12: cal_13: cal_14: cal_15: cal_16:
cal_17: cal_18: cal_19: cal_20: cal_21: cal_22: cal_23: cal_24:
cal_25: cal_26: cal_27: cal_28:
asr.w #2,d0 ; sub.w #0x3F,d0
lblcal:
1: cmp.l nproc,d0 ; bhi e_badpc
asl.l #3,d0
#if flow + count + prof
move.l d0,d1 ; asl.l #1,d1
add.l d1,d0 !PROC DES. 24 BYTES
#endif
move.l (a6),-(sp)
move.l 4(a6),-(sp) ; move.l a3,-(sp)
link a2,#0 ; move.l d0,a0
add.l pd,a0 !a0 points at proc. des.
#if prof+count+flow
tst.l 20(a0) !A FILE NAME DEFINED IN THIS PROC
bne 4f !YES ? CONTINUE
move.l 8(sp),20(a0) !NO ? TAKE OLD FILE NAME
4: move.l curproc,8(sp) !SAVE OLD PROCEDURE DESCRIPTOR
move.l a0,curproc !CONTINUE WITH NEW ONE
move.l 8(a0),d0 !COUNT POINTER MINUS LINE NUMBER
sub.l 12(a0),d0 !OF FIRST LINE IN countfld
move.l d0,countfld
#endif
move.l (a0)+,d1 ; sub.l d1,sp
claimstack ; add.l d1,sp
tst.l d1 ; beq 3f
sub.l #1,d1 ; asr.l wmu,d1
2: mov und,-(sp) ; dbra d1,2b
3: move.l (a0),a3 ; jmp (a4)
ret_l: adroff ; move.w (a1),d0
bra 1f
ret_s0: move.l d6,d0 ; move.b (a3)+,d0
bra 1f
ret_1W: move.w d6,d0 ; bra 5f
1: blt e_oddz ; beq ret_0
comp #32,d0 ; ble 2f
bsr e_badlfr
2: sub.w #1,d0 ; asr.w wmu,d0
5: move.w d0,retsize !RETSIZE CONTAINS
3: mov (sp)+,(a1)+ ; dbra d0,3b ! #WORDS-1
lea retarea,a1 ; bra 4f
ret_0: move.w #-1,retsize
4: unlk a2 ; cmp.l a2,d6
beq hlt_z ; move.l (sp)+,a3
move.l (sp)+,a0 !FILE OR PROC DES BASE IN a0
#if count+flow+prof
move.l a0,curproc !SAVE PROC DES BASE CUR PROC
move.l 8(a0),d0 !d0 IS COUNT
sub.l 12(a0),d0 !d0 IS COUNT-FIRST LINE
move.l d0,countfld !RESTORE POINTER
add.l (sp),d0 !ADD LINE NUMBER
move.l d0,countptr
#if prof
beq 5f
asl.l #2,d0
add.l ltime,d0
move.l d0,profile !profile POINTS AT COUNT
5:
#endif
move.l 20(a0),a0 !POINTER TO FILE NAME IN a0
#endif
move.l a0,4(a6) !OLD FILE ADDRESS
move.l (sp)+,(a6) !OLD LINE NUMBER
jmp (a4)
lfr_1W: move.w d6,d0 ; move.l wrd,d1
0: cmp.w retsize,d0 ; beq 1f
bsr e_badlfr
1: add.l d1,a1
2: mov -(a1),-(sp) ; dbra d0,2b
5: jmp (a4)
lfr_l: move.b (a3)+,-(sp) ; move.b (a3)+,1(sp)
move.w (sp)+,d0 ; bra 3f
lfr_s0: move.l d6,d0 ; move.b (a3)+,d0
3: move.l d7,d2 ; move.l d0,d1
4: asr.w #1,d0 ; bcs e_illins
dbra d2,4b ; beq 5b
sub.w #1,d0 ; bra 0b
lfr_2W: move.l wrd,d1 ; add.l d1,d1
move.l #1,d0 ; bra 0b
e_badlfr: mov 0xD,-(sp) ; bra error

296
mach/mantra/int/mloop9 Normal file
View file

@ -0,0 +1,296 @@
!---------------------------------------------------------------------------
! MISCELLANEOUS
!----------------------------------------------------------------------------
ass_z: mov (sp)+,d0 ; bra 5f
ass_l: move.b (a3)+,-(sp) ; move.b (a3)+,1(sp)
move.w (sp)+,d0
5: checksize
bra e_oddz
4: move.l (sp)+,d0 ; bpl 3f
asr.l wmu,d0 ; bra 8f
2: move.w (sp)+,d0 ; bpl 3f
asr.w #1,d0 ; ext.l d0
bra 8f
asp_1W: asp_2W: asp_3W: asp_4W: asp_5W:
sub.w #176,d0
#ifndef lword
asr.l #1,d0
#endif
3: add.l d0,sp ; jmp (a4)
asp_w0: move.l d6,d0 ; move.b (a3)+,d0
5: asl.l wmu,d0 ; bra 3b
asp_lw: move.b (a3)+,-(sp) ; move.b (a3)+,1(sp)
move.w (sp)+,d0 ; ext.l d0
6: bmi 8f
asl.l wmu,d0 ; bra 3b
8: neg.l d0 ; sub.l #1,d0
1: mov und,-(sp) ; dbra d0,1b
jmp (a4)
asp_qw: move.l (sp)+,d0 ; bra 6b
!-----------------------------------------------------------------------------
bls_z: mov (sp)+,d0 ; bra 0f
bls_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d0 ; bra 0f
4: move.l (sp)+,d0 ; bra 0f
blm_q: move.l (sp)+,d0 ; bra 0f
blm_l: adroff ; move.w (a1),d0
bra 0f
blm_s0: move.l d6,d0 ; move.b (a3)+,d0
0: move.l d0,d2 ; asr.w wmu,d2
beq 5f ; move.l a1,d1
sub.w #1,d2 ; move.l (sp)+,a0 !dest. address
move.l (sp)+,a1 ; cmp.l a0,a1
!a1 contains source address. beware of overlap of pieces
beq 3f ; bcs 2f
1: mov (a1)+,(a0)+ ; dbra d2,1b
3: move.l d1,a1
5: jmp (a4)
2: add.l d0,a1 ; add.l d0,a0
4: mov -(a1),-(a0) ; dbra d2,4b
bra 3b
!----------------------------------------------------------------------------
csa_z: mov (sp)+,d0 ; bra 0f
csa_l: adroff ; move.w (a1),d0
0: sub.l wrd,d0 ; bne e_illins
csa_1W: move.l (sp)+,a0 ; mov (sp)+,d0
ext.l d0
add.l #4,a0 ; subt (a0),d0
blt 6f
comp word(a0),d0 ; bhi 6f
asl.l #2,d0 ; add.l wrd,d0
move.l word(a0,d0),d1 ; bne 5f
6: sub.l #4,a0 ; move.l (a0),d1
beq e_case
5: move.l d1,a3 ; jmp (a4)
csb_z: mov (sp)+,d0 ; bra 0f
csb_l: adroff ; move.w (a1),d0
0: comp wrd,d0 ; bne e_illins
csb_1W: move.l (sp)+,a0 ; mov (sp)+,d0
mov 4(a0),d1 ; sub.l #1,d1
move.l a0,a3
!Use a3 as a general register
move.l wrd,d2 ; add.l #4,d2
1: add.l d2,a0 ; comp (a0),d0
dbeq d1,1b ; bne 2f
move.l word(a0),d1 ; beq e_case
move.l d1,a3 ; jmp (a4)
2: move.l (a3),d1 ; beq e_case
move.l d1,a3 ; jmp (a4)
!-----------------------------------------------------------------------------
dch_z: move.l (sp)+,a0 ; move.l (a0),-(sp)
move.l ml,a0 ; cmp.l (sp),a0
bls e_badptr ; jmp (a4)
lpb_z: add.l #16,(sp) ; jmp (a4)
!----------------------------------------------------------------------------
dup_1W: mov (sp),-(sp) ; jmp (a4)
dup_l: adroff ; move.w (a1),d0
bra 1f
dus_z: mov (sp)+,d0 ; bra 0f
dus_l: adroff ; move.w (a1),d0
0: checksize
2: move.w (sp)+,d0 ; bra 1f
4: move.l (sp)+,d0
1: ble e_oddz ; bclr #0,d0
move.l sp,a0 ; add.l d0,a0
asr.l wmu,d0 ; sub.l #1,d0
3: mov -(a0),-(sp) ; dbra d0,3b
jmp (a4)
!We do not test if d0 is indeed a word multiple . This can eventually be done
!in the usual way.
!-----------------------------------------------------------------------------
exg_z: mov (sp)+,d0 ; bra 0f
exg_l: adroff ; move.w (a1),d0
bra 0f
exg_s0: move.l d6,d0 ; move.b (a3)+,d0
0: move.l d7,d1 ; move.l d0,a0
1: asri #1,d0 ; dbcs d1,1b
bcs e_oddz ; sub.l #1,d0
add.l a0,sp ; add.l sp,a0
2: mov -(sp),d1 ; mov -(a0),(sp)
mov d1,(a0) ; dbra d0,2b
jmp (a4)
gto_q: move.l (sp)+,a0 ; bra 3f
gto_l: move.l d6,a0 ; move.b (a3)+,-(sp)
move.b (a3)+,1(sp) ; move.w (sp)+,a0
3: add.l a6,a0 ; move.l (a0)+,a3
move.l (a0)+,sp ; move.l (a0),a2
jmp (a4)
lim_z: move.w ignmask,-(sp) ; jmp (a4)
sim_z: move.w (sp)+,ignmask ; jmp (a4)
.bss
ignmask: .space 2
.define ignmask
.text
!---------------------------------------------------------------------------
lor_s0: move.l d6,d0 ; move.b (a3)+,d0
bne 1f ; move.l a2,-(sp)
jmp (a4)
1: sub.w #1,d0 ; bne 2f
move.l sp,-(sp) ; jmp (a4)
2: sub.w #1,d0 ; bne e_illins
move.l hp,-(sp) ; jmp (a4)
str_s0: move.l d6,d0 ; move.b (a3)+,d0
bne 1f ; move.l (sp)+,a2
jmp (a4)
1: sub.w #1,d0 ; bne 2f
move.l (sp)+,sp ; claimstack
jmp (a4)
2: sub.w #1,d0 ; bne e_illins
move.l (sp)+,d1 ; cmp.l nd,d1
bcc 3f !break
cmp.l tblmax,d1 ; bcs 4f
5: move.l d1,hp ; jmp (a4)
3: move.l d1,-(sp) ; add.l #1280,(sp)
bsr _break ; testen (sp)+
4: bne e_heap ; bra 5b
!----------------------------------------------------------------------------
rck_z: mov (sp)+,d0 ; bra 0f
rck_l: adroff ; move.w (a1),d0
0: sub.l wrd,d0 ; beq rck_1W
sub.l wrd,d0 ; bne e_oddz
move.l (sp)+,a0
mov (sp),d0 ; comp (a0),d0 ; blt 9f
add.l wrd,a0 ; bra 1f
rck_1W: move.l (sp)+,a0
mov (sp),d0 ; comp (a0),d0 ; blt 9f
1: comp word(a0),d0 ; bgt 9f
jmp (a4)
9: bra e_range
!Temp. solution until trp_z is implemented
!--------------------------------------------------------------------------
nop_z:
lblnop: lea nopln+16,a0 ; move.l (a6),d1
bsr itoa
lea nopln+33,a0 ; move.l sp,d1
bsr itoa
move.l #45,-(sp)
pea nopln ; mov #1,-(sp)
bsr _write
add.l wrd+4,sp
jmp (a4)
.data
nopln: .asciz "line number nop sp \n"
.align 2
.text
!unsigned to ascii for integers , a0 is address of first character
! d1 contains integer. Output is 11 characters of which the first is a space.
.define itoa
.text
itoa: move.l #9,d4 ; add.l #11,a0
move.l #10,d0
0: bsr dvu4 ; add.w #48,d3
move.b d3,-(a0) ; tst.l d1
dbeq d4,0b
1: move.b #32,-(a0) ; dbra d4,1b
rts
!------------------------------------------------------------------------------
fil_q: move.l (sp)+,a0 ; bra 3f
fil_l: adroff ; move.w (a1),d0
move.l d0,a0
3: add.l a6,a0 ; cmp.l 4(a6),a0
beq 0f
#if flow+count+prof
move.l curproc,a5
move.l 8(a5),d0
sub.l 12(a5),d0
move.l d0,countfld !START COUNTPTR FOR THIS PROC
move.l a0,20(a5) !FILE POINTER IN PROC DES
#endif
move.l a0,4(a6)
0: jmp (a4)
!-----------------------------------------------------------------------------
lni_z: add.l #1,(a6)
#if count+flow+prof
add.l #1,countptr
#if prof
add.l #4,profile
#endif
#endif
bra 8f
lin_l: adroff ; move.w (a1),d0 ; bra 1f
lin_q: move.l (sp)+,d0 ; bra 1f
lin_s0: move.l #0,d0 ; move.b (a3)+,d0
1: cmp.l (a6),d0 ; beq 9f
move.l d0,(a6)
#if count+flow+prof
move.l countfld,d1
add.l d0,d1
move.l d1,countptr
#if prof
asl.l #2,d1
add.l ltime,d1
move.l d1,profile
#endif
#endif
8:
#if last
bsr nexttab ; move.l 4(a6),(a5)+ !store new line
move.l (a6),(a5) !number in buffer lasttable
#endif
#if count
move.l countptr,d1 !LINE NUMBER IN d1
asl.l #2,d1 !MULTIPLY BY 4
move.l lcount,a0
add.l #1,0(a0,d1) !ADD 1 TO THE CORRESPONDING COUNT
#endif
#if flow
move.l countptr,d1 !LINE NUMBER IN d1
move.l #8,d0
bsr dvu4
!QUOTIENT IN d1 REST IN d3
move.l lflow,a0
bset d3,0(a0,d1)
!ATTENTION BIT 0 CORR TO LINE 0
#endif
!9: bra nop_z
9: jmp (a4)
!----------------------------------------------------------------------------
mon_z: mov (sp)+,d0 ; bmi e_badmon
cmp.l #64,d0 ; bge e_badmon
move.l a4,-(sp) ; asl.l #2,d0
add.l #syscal,d0 ; move.l d0,a0
move.l (a0),a0 ; jmp (a0)
.data
syscal:
.long e_badmon ; .long hlt_z ; .long _fork ; .long _read
.long _write ; .long _open ; .long _close ; .long _wait
.long _creat ; .long _link ; .long _unlink ; .long e_badmon
.long _chdir ; .long e_badmon ; .long _mknod ; .long _chmod
.long _chown ; .long _break ; .long _stat ; .long _lseek
.long _getpid ; .long _mount ; .long _umount ; .long _setuid
.long _getuid ; .long _stime ; .long _ptrace ; .long _alarm
.long _fstat ; .long _pause ; .long _utime ; .long e_badmon
.long e_badmon ; .long _access ; .long _nice ; .long _ftime
.long _sync ; .long _kill ; .long e_badmon ; .long e_badmon
.long e_badmon ; .long _dup ; .long _pipe ; .long _times
.long _profil ; .long e_badmon ; .long _setgid ; .long _getgid
.long _sigtrp ; .long e_badmon ; .long e_badmon ; .long _acct
.long e_badmon ; .long _lock ; .long _ioctl ; .long e_badmon
.long _mpxcall ; .long e_badmon ; .long e_badmon ; .long _exece
.long _umask ; .long _chroot ; .long e_badmon ; .long e_badmon
.text

341
mach/mantra/int/mloopa Normal file
View file

@ -0,0 +1,341 @@
e_array: cl -(sp) ; bra error
e_range: mov #0x1,-(sp) ; bra error
e_set: mov #0x2,-(sp) ; bra error
e_iovfl: mov #0x3,-(sp) ; bra error
e_fovfl: mov #0x4,-(sp) ; bra error
e_funfl: mov #0x5,-(sp) ; bra error
e_idivz: mov #0x6,-(sp) ; bra error
e_fdivz: mov #0x7,-(sp) ; bra error
e_iund: mov #0x8,-(sp) ; bra error
e_fund: mov #0x9,-(sp) ; bra error
e_conv: mov #0xA,-(sp) ; bra error
e_stack: mov #0x10,-(sp) ; bra fatal
e_heap: mov #0x11,-(sp) ; bra fatal
e_illins: mov #0x12,-(sp) ; bra fatal
e_oddz: mov #0x13,-(sp) ; bra fatal
e_case: mov #0x11,-(sp) ; bra fatal
e_memflt: mov #0x15,-(sp) ; bra fatal
e_badptr: mov #0x16,-(sp) ; bra fatal
e_badpc: mov #0x17,-(sp) ; bra fatal
e_badlae: mov #0x18,-(sp) ; bra error
e_badmon: mov #0x19,-(sp) ; bra error
e_badlin: mov #0x1A,-(sp) ; bra error
e_badgto: mov #0x1B,-(sp) ; bra error
flnim: mov #0xB,-(sp) ; bra error
no8bar: mov #0xC,-(sp) ; bra error
.define e_memflt
!---------------------------------------------------------------------------
! ERRORS AND TRAPS
!----------------------------------------------------------------------------
fatal: clr.l -(sp) !dummy return address
pea hlt_z !RETURN FROM FATAL HALTS
mov 8(sp),-(sp)
error: movem.l d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6,-(sp)
mov 60(sp),d0 !ERROR NUMBER IN d0
lea retsize,a5
move.l #16,d1
1: move.w -(a5),-(sp)
dbra d1,1b
cmp.w #0xB,d0
bge 0f !FATAL ERROR , START ERROR HANDLING
move.l #0x1,d1
asl.l d0,d1
move.w ignmask,d2
not.w d2
and.w d2,d1
bne 0f
move.l #16,d1
lea retsize,a5
1: move.w (sp)+,(a5)+
dbra d1,1b
movem.l (sp)+,d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
add.l wrd,sp !REMOVE ERROR NUMBER
rts
0: move.l uerrorp,a0
cmp.l #-1,a0
beq notrap
mov d0,-(sp)
move.l uerrorp,-(sp)
move.l #-1,uerrorp !USER MUST SET TRAP AGAIN
bra cai_z
!-----------------------------------------------------------------------------
rtt_z: move.l a2,sp
add.l #0x10,sp !REMOVE RETURN STATUS BLOCK
add.l wrd,sp !REMOVE ERROR NUMBER
move.l #16,d0
lea retsize,a5
1: move.w (sp)+,(a5)+
dbra d0,1b
movem.l (sp)+,d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
add.l wrd,sp
rts
trp_z: sub.l #4,sp
mov 4(sp),(sp) !COPY ERROR NUMBER
move.l a4,word(sp) !RETURN ADDRESS TO MAIN LOOP
bra error
sig_z: move.l (sp),d0
move.l uerrorp,(sp)
move.l d0,uerrorp
jmp (a4)
.data
uerrorp: .long 0x-1
.text
!-----------------------------------------------------------------------------
!FIRST INFORMATION ABOUT THE KIND OF THE ERROR
notrap: add.l #38,sp
movem.l (sp)+,d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
notrap1: comp #28,d0 !ERROR NUMBER STILL IN d0
!still to make a routine that prints the number of a user set error
1: mulu #21,d0
lea emerr,a0
move.l #20,-(sp)
pea 0(a0,d0)
mov #2,-(sp) !STANDARD ERROR
bsr _write
add.l wrd+4,sp
!NEXT INFORMATION ABOUT THE LINE NUMBER
move.l (a6),d1
lea emess+14,a0
bsr itoa
move.l #30,-(sp)
pea emess
mov #2,-(sp)
bsr _write
add.l wrd+4,sp
!NOW INFORMATION ABOUT THE FILES
2: move.l 4(a6),a0
cmp.l #0,a0
beq 5f
move.l a0,a5
sub.l #4,sp
move.l a5,-(sp)
move.l #-1,d0
1: add.l #1,d0
tst.b (a5)+
bne 1b
move.l d0,4(sp)
mov #2,-(sp)
bsr _write
add.l wrd+4,sp
5: move.w #0x0A,-(sp)
move.l #2,-(sp)
pea 4(sp)
mov #2,-(sp)
bsr _write
add.l wrd+6,sp
comp #0xB,(sp)
beq 1f
move.l #-1,argc
clr.l -(sp) !dummy return address
bra hlt_z
1: add.l wrd,sp
jmp (a4)
!---------------------------------------------------------------------------
! EXIT HANDLING
!--------------------------------------------------------------------------
hlt_z: add.l #4,sp !remove return address
#if prof
.data
emprof: .asciz "em_profile\0"
.align 2
.bss
profile: .space 4
ltime: .space 4
profsiz: .space 4
.text
mov #0x1B6,-(sp)
pea emprof
bsr _creat
testen (sp)+
mov (sp)+,d0
move.l profsiz,-(sp)
move.l ltime,-(sp) !LTIME IS POINTER AT TABLE
mov d0,-(sp)
bsr _write
add.l wrd+4,sp
#endif
#if flow
mov #0x1B6,-(sp)
pea emflow
bsr _creat
testen (sp)+
mov (sp)+,d0
move.l flowsiz,-(sp)
move.l lflow,-(sp)
mov d0,-(sp)
bsr _write
add.l wrd+4,sp
.data
emflow: .asciz "em_flow\0"
.align 2
.bss
lflow: .space 4
flowsiz: .space 4
.text
#endif
#if count
mov #0x1B6,-(sp)
pea emcount
bsr _creat
testen (sp)+
mov (sp)+,d0
move.l countsiz,-(sp)
move.l lcount,-(sp)
mov d0,-(sp)
bsr _write
add.l wrd+4,sp
.data
emcount: .asciz "em_count\0"
.align 2
.bss
lcount: .space 4
countsiz: .space 4
#endif
#if opfreq
.data
emopf: .asciz "em_opfreq\0"
.align
.bss
counttab: .space 1884
.text
mov #0x1B6,-(sp)
pea emopf
bsr _creat
testen (sp)+
mov (sp)+,d0
move.l #1884,-(sp)
pea counttab
mov d0,-(sp)
bsr _write
add.l wrd+4,sp
#endif
#if count+flow+prof
.bss
countfld: .space 4 !COUNT NUMBER - NUMBER OF LINE 1 OF PROC
countptr: .space 4 !COUNT NUMBER OF CURRENT LINE
#endif
#if last
.text
mov #0x1B6,-(sp)
pea emlast
bsr _creat
testen (sp)+
mov (sp)+,d6 !d6 contains file descriptor
cmp.l #-1,linused-4 !test if buffer is fully used
beq 0f
bsr nexttab
bra 1f
0: lea lasttable,a5
1: tst.l (a5)
bne 2f !exists entry in table
move.l #22,-(sp) !here case no lines processed
pea mess1
mov d6,-(sp)
bsr _write
add.l wrd+4,sp
bra 9f
2: move.l #7,-(sp) !announce new file name
pea mess2
mov d6,-(sp)
bsr _write
add.l wrd+4,sp
move.l (a5),d7
move.l d7,a0 !keep file pointer in d7
clr.l (a5)+ !this will stop the printing
move.l #-1,d1 !d1 will contain length of file name
3: add.l #1,d1
tst.b (a0)+
bne 3b
move.l d1,-(sp)
move.l d7,-(sp)
mov d6,-(sp)
bsr _write
add.l wrd+4,sp
4: move.l (a5),d1 !next print line numbers
lea mess3,a0
bsr itoa
move.l #12,-(sp)
pea mess3
mov d6,-(sp)
bsr _write
add.l wrd+4,sp
bsr nexttab
tst.l (a5) !in case 0 no more lines
beq 9f
cmp.l (a5),d7
bne 2b !new file name
clr.l (a5)+ !skip file name
bra 4b !only new line
9:
.data
emlast: .asciz "em_last"
mess1: .asciz "no line processed yet\n"
mess2: .asciz "\nfile :"
mess3: .asciz " \n"
.align 2
.bss
lasttable: .space 128
linused: .space 4
#endif
.text
halt: bsr _exit
.data
emerr:
.asciz "ARRAY BOUND ERROR \n"
.asciz "RANGE BOUND ERROR \n"
.asciz "SET BOUND ERROR \n"
.asciz "INTEGER OVERFLOW \n"
.asciz "FLOATING OVERFLOW \n"
.asciz "FLOATING UNDERFLOW \n"
.asciz "INT. DIV. BY ZERO \n"
.asciz "DIVIDE BY 0.0 \n"
.asciz "UNDEFINED INTEGER \n"
.asciz "UNDEFINED FLOAT \n"
.asciz "CONVERSION ERROR \n"
.asciz "NO FLOATING POINT \n"
.asciz "NO 8 BYTE ARITH. \n"
.asciz "NO LOAD FILE \n"
.asciz "LOAD FILE ERROR \n"
.asciz "PROGRAM TOO LARGE \n"
.asciz "STACK OVERFLOW \n"
.asciz "HEAP OVERFLOW \n"
.asciz "ILLEGAL INSTRUCTION\n"
.asciz "ILLEGAL SIZE ARG. \n"
.asciz "CASE ERROR \n"
.asciz "ADDRESS NON EX. MEM\n"
.asciz "BAD POINTER USED \n"
.asciz "PR COUNT. OUT RANGE\n"
.asciz "BAD ARG. OF LAE \n"
.asciz "BAD MONITOR CALL \n"
.asciz "ARG OF LIN TOO HIGH\n"
.asciz "GTO DESCR. ERROR \n"
.asciz "BAD RETURN SIZE \n"
emess:
.asciz "ON SOURCE LINE OF\n"
.align 2
!-----------------------------------------------------------------------------
! SUBROUTINES FOR THE INTERPRETOR
!------------------------------------------------------------------------------
.text
#if last
nexttab: move.l linused,a5
add.l #8,a5
cmp.l #linused,a5 !top of buffer reached?
bne 1f !if so back to bottom
sub.l #128,a5
1: move.l a5,linused
rts
#endif

58
mach/mantra/int/mloopb Normal file
View file

@ -0,0 +1,58 @@
_sigtrp: mov (sp)+,d1 !trapno in d1
mov (sp)+,d4 !signo in d4
extend d4
extend d1
comp #16,d4
bhi sig_bad
tst.l d4
beq sig_bad
move.l d4,a0
add.l a0,a0
add.l a0,a0
lea sig_trp-4(a0),a5
move.l (a5),d2 !previous trap number in d2
comp #256,d1 !-2 and -1 special
bcc 1f
move.l sig_adr-4(a0),d3 !Get the pointer to the trap-
bne 2f !procedure to give as argument to
sig_bad: mov 22,-(sp) !_signal. If pointer 0 trapping is
mov 22,-(sp) !not legal
jmp (a4)
1: comp #-3,d1 !-2:reset default , -3: ignore
bmi sig_bad
move.l d1,d3
ad #2,d3 !0:reset default for signal, -1: ignore
2: move.l d1,(a5) !set new trapno
move.l d3,-(sp) !set arguments to signal:
mov d4,-(sp) !pointer ,signo to be trapped
bsr _signal
cl -(sp) !set code for no error
.data
sig_adr: .long sig1 ; .long sig2 ; .long sig3 ; .long 0
.long 0 ; .long 0 ; .long 0 ; .long 0
.long 0 ; .long 0 ; .long sig11 ; .long sig12
.long sig13 ; .long sig14 ; .long sig15 ; .long sig16
sig_trp: .long -2 ; .long -2 ; .long -2 ; .long -2
.long -2 ; .long -2 ; .long -2 ; .long -2
.long -2 ; .long -2 ; .long 21 ; .long 25
.long -2 ; .long -2 ; .long -2 ; .long -2
.text
!the next procedures map the catched signal to em errors. The em error
!procedure will handle this.
sig1: sig2: sig3: sig8: sig13: sig14: sig15: sig16:
pea retutrap
mov d1,-(sp)
bra error
retutrap: rtr
sig12: pea sig12
mov #12,-(sp)
bsr _signal
bsr e_badmon
rtr
sig11: move.l 4(a1),d0
sub.l sp,d0
bcs e_memflt !in this case error handling possible
move.l ml,sp !refresh stack and stop .
bra notrap1

503
mach/mantra/int/mloopc Normal file
View file

@ -0,0 +1,503 @@
!THIS FILE CONTAINS THE SYSTEM CALLS FOR PMDS-II AS SUBROUTINES FOR THE
!EM-INTERPRETER. a1 CONTAINS A POINTER TO THE RETURN AREA . EACH SUBROUTINE
!EXPECTS ITS DATA IN THE FORM EM PRODUCES AND GIVES ITS RESULTS AS EM
!REQUIRES
_exit: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 1
_fork: move.l (sp),(a1)
trap #0
.short 2
lea 4(sp),sp
bcs 2f
tst.l d0 !PID OF CHILD IN PARENT, 0 IN CHILD
bne 1f
trap #0
.short 20
mov d1,-(sp) !PID OF PARENT IN d1
mov #1,-(sp) !(PID OF CHILD IN D0),FLAG 1 IN CHILD
bra 0f
1: mov d0,-(sp) !PID OF CHILD IN d0
cl -(sp) !FLAG 0 IN PARENT
0: cl -(sp)
bra 3f
2: mov d0,-(sp)
mov d0,-(sp)
3: move.l (a1),a0
jmp (a0)
!_fork is special
_read: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 3
sys0: lea 16(sp),sp
bcc 1f
mov d0,-(sp)
mov d0,-(sp)
bra 2f
1: move.l d0,-(sp)
cl -(sp)
2: move.l (a1),a0
jmp (a0)
_write: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 4
bra sys0
_open: move.l (sp),(a1)
#ifndef lword
bsr st243
#endif
trap #0
.short 5
sys1: lea 12(sp),sp
sys5: bcc 1f
mov d0,-(sp)
mov d0,-(sp)
bra 2f
1: mov d0,-(sp)
cl -(sp)
2: move.l (a1),a0
jmp (a0)
_close: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 6
sys3: lea 8(sp),sp
sys4: bcc 1f
mov d0,-(sp)
mov d0,-(sp)
bra 2f
1: cl -(sp)
2: move.l (a1),a0
jmp (a0)
_wait: move.l (sp),(a1)
trap #0
.short 7
sys6: lea 4(sp),sp
bcc 1f
mov d0,-(sp)
mov d0,-(sp)
bra 2f
1: mov d1,-(sp) ! ??
mov d0,-(sp)
cl -(sp)
2: move.l (a1),a0
jmp (a0)
_creat: move.l (sp),(a1)
#ifndef lword
bsr st243
#endif
trap #0
.short 8
bra sys1
_link: move.l (sp),(a1)
trap #0
.short 9
lea 12(sp),sp
bra sys4
_unlink: move.l (sp),(a1)
trap #0
.short 10
bra sys3
_chdir: move.l (sp),(a1)
trap #0
.short 12
bra sys3
_mknod: move.l (sp),(a1)
#ifndef lword
bsr st244
#endif
trap #0
.short 14
lea 16(sp),sp
bra sys4
_chmod: move.l (sp),(a1)
#ifndef lword
bsr st243
#endif
trap #0
.short 15
lea 12(sp),sp
bra sys4
_chown: move.l (sp),(a1)
#ifndef lword
bsr st244
#endif
trap #0
.short 16
lea 16(sp),sp
bra sys4
_break: move.l (sp),(a1)
trap #0
.short 17
lea 8(sp),sp
bcc 1f
mov d0,-(sp)
mov d0,-(sp)
bra 2f
1: move.l -4(sp),nd
cl -(sp)
2: move.l (a1),a0
jmp (a0)
.data
nd: .long endbss
.text
_stat: move.l (sp),(a1)
trap #0
.short 18
lea 12(sp),sp
bra sys4
_lseek: move.l (sp),(a1)
#ifndef lword
bsr st245
#endif
trap #0
.short 19
lea 16(sp),sp
bcc 1f
mov d0,-(sp)
mov d0,-(sp)
bra 2f
1: move.l d1,-(sp)
mov d0,-(sp)
cl -(sp)
2: move.l (a1),a0
jmp (a0)
_getpid: move.l (sp),(a1)
trap #0
.short 20
add.l #4,sp
mov d0,-(sp)
move.l (a1),a0
jmp (a0)
_mount: move.l (sp),(a1)
#ifndef lword
bsr st246
#endif
trap #0
.short 21
lea 16(sp),sp
bra sys4
_umount: move.l (sp),(a1)
trap #0
.short 22
bra sys3
_setuid: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 23
bra sys3
_getuid: move.l (sp),(a1)
trap #0
.short 24
sys7: add.l #4,sp
mov d1,-(sp)
mov d0,-(sp)
move.l (a1),a0
jmp (a0)
_stime: move.l (sp),(a1)
trap #0
.short 25
bra sys3
_ptrace: move.l (sp),(a1)
#ifndef lword
bsr st247
#endif
trap #0
.short 26
lea 20(sp),sp
bra sys5
_alarm: move.l (sp),(a1)
#ifndef lword
sub.l #2,sp
clr.w 4(sp)
#endif
trap #0
.short 27
lea 8(sp),sp
mov d0,-(sp)
move.l (a1),a0
jmp (a0)
_fstat: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 28
lea 12(sp),sp
bra sys4
_pause: trap #0
.short 29
rts
_utime: move.l (sp),(a1)
trap #0
.short 30
lea 12(sp),sp
bra sys4
_access: move.l (sp),(a1)
#ifndef lword
bsr st248
#endif
trap #0
.short 33
lea 12(sp),sp
bra sys4
_nice:
#ifndef lword
bsr 241
#endif
trap #0
.short 34
move.l (sp)+,(sp)
rts
_ftime: move.l (sp),(a1)
trap #0
.short 35
bra sys3
_sync: trap #0
.short 36
rts
_kill: move.l (sp),(a1)
#ifndef lword
bsr st248
#endif
trap #0
.short 37
lea 12(sp),sp
bra sys4
_dup: move.l (sp),(a1)
#ifndef lword
bsr st248
#endif
trap #0
.short 38
bra sys1
_pipe: move.l (sp),(a1)
trap #0
.short 42
bra sys6
_times: trap #0
.short 43
move.l (sp),a0
add.l #8,sp
jmp (a0)
_profil: trap #0
.short 44
move.l (sp),a0
lea 20(sp),sp
jmp (a0)
_setgid: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 46
bra sys3
_getgid: move.l (sp),(a1)
trap #0
.short 47
bra sys7
_signal: move.l (sp)+,retaddr
mov (sp)+,d4
extend d4
move.l d4,-(sp)
move.l retaddr,-(sp)
trap #0
.short 48
mov d0,-(sp)
bne 1f
mov d0,-(sp)
1: move.l retaddr,a0
jmp (a0)
.data
retaddr: .long 0
.text
_acct: move.l (sp),(a1)
trap #0
.short 51
bra sys3
_lock: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 53
bra sys3
_ioctl: move.l (sp),(a1)
#ifndef lword
bsr st248
#endif
trap #0
.short 54
lea 16(sp),sp
bra sys4
_mpxcall: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 56
lea 12(sp),sp
bra sys4
_exece: move.l (sp),(a1)
trap #0
.short 59
lea 16(sp),sp
bra sys4
_umask: move.l (sp),(a1)
#ifndef lword
bsr st241
#endif
trap #0
.short 60
add.l #8,sp
mov d0,-(sp)
move.l (a1),a0
jmp (a0)
_chroot: move.l (sp),(a1)
trap #0
.short 61
bra sys3
!----------------------------------------------------------------------------
! STACK ADJUSTMENT FOR THE TWO BYTE INTERPRETER
!-----------------------------------------------------------------------------
#ifndef lword
st241: sub.l #2,sp
move.l 2(sp),(sp)
move.l 6(sp),4(sp)
move.w 10(sp),d0
ext.l d0
move.l d0,8(sp)
rts
st243: sub.l #2,sp
move.l 2(sp),(sp)
move.l 6(sp),4(sp)
move.l 10(sp),8(sp)
move.w 14(sp),d0
ext.l d0
move.l d0,12(sp)
rts
st244: move.l (sp),-(sp)
move.l 8(sp),4(sp)
move.l 12(sp),8(sp)
move.w 16(sp),d0
ext.l d0
move.l d0,12(sp)
move.w 18(sp),d0
ext.l d0
move.l d0,16(sp)
rts
st245: move.l (sp),-(sp)
move.l 8(sp),4(sp)
move.w 12(sp),d0
ext.l d0
move.l d0,8(sp)
move.l 14(sp),12(sp)
move.w 18(sp),d0
ext.l d0
move.l d0,16(sp)
rts
st246: sub.l #2,sp
move.l 2(sp),(sp)
move.l 6(sp),4(sp)
move.l 10(sp),8(sp)
move.l 14(sp),12(sp)
move.w 18(sp),d0
ext.l d0
move.l d0,16(sp)
rts
st247: sub.l #6,sp
move.l 6(sp),(sp)
move.l 10(sp),4(sp)
move.w 14(sp),d0
ext.l d0
move.l d0,8(sp)
move.w 16(sp),d0
ext.l d0
move.l d0,12(sp)
move.l 18(sp),16(sp)
move.w 22(sp),d0
ext.l d0
move.l d0,20(sp)
rts
st248: move.l (sp),-(sp)
move.l 8(sp),4(sp)
move.w 12(sp),d0
ext.l d0
move.l d0,8(sp)
move.w 14(sp),d0
ext.l d0
move.l d0,12(sp)
rts
#endif

6
mach/mantra/int/mloope Normal file
View file

@ -0,0 +1,6 @@
.text
end:
.bss
endbss:
.data
enddata:

3
mach/mantra/int/prep Executable file
View file

@ -0,0 +1,3 @@
rm temp.c
cat header deffile $1 >> temp.c
cpp -P temp.c >$2