*** empty log message ***
This commit is contained in:
parent
eebc753306
commit
14a3683f85
19 changed files with 3944 additions and 0 deletions
34
mach/mantra/int/Makefile
Normal file
34
mach/mantra/int/Makefile
Normal 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
77
mach/mantra/int/copyright
Normal 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
78
mach/mantra/int/deffile
Normal 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
8
mach/mantra/int/header
Normal 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
503
mach/mantra/int/mloop0
Normal 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
364
mach/mantra/int/mloop1
Normal 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
344
mach/mantra/int/mloop2
Normal 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
191
mach/mantra/int/mloop3
Normal 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
236
mach/mantra/int/mloop4
Normal 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
186
mach/mantra/int/mloop5
Normal 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
362
mach/mantra/int/mloop6
Normal 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
120
mach/mantra/int/mloop7
Normal 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
234
mach/mantra/int/mloop8
Normal 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
296
mach/mantra/int/mloop9
Normal 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
341
mach/mantra/int/mloopa
Normal 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
58
mach/mantra/int/mloopb
Normal 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
503
mach/mantra/int/mloopc
Normal 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
6
mach/mantra/int/mloope
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
.text
|
||||||
|
end:
|
||||||
|
.bss
|
||||||
|
endbss:
|
||||||
|
.data
|
||||||
|
enddata:
|
3
mach/mantra/int/prep
Executable file
3
mach/mantra/int/prep
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
rm temp.c
|
||||||
|
cat header deffile $1 >> temp.c
|
||||||
|
cpp -P temp.c >$2
|
Loading…
Add table
Reference in a new issue