Initial revision
This commit is contained in:
parent
31b5e111bf
commit
945d6a0188
24
mach/m68020/libem/LIST
Normal file
24
mach/m68020/libem/LIST
Normal file
|
@ -0,0 +1,24 @@
|
|||
libem_s.a
|
||||
aar.s
|
||||
lar.s
|
||||
sar.s
|
||||
csa.s
|
||||
csb.s
|
||||
shp.s
|
||||
set.s
|
||||
inn.s
|
||||
fat.s
|
||||
trp.s
|
||||
mon.s
|
||||
nop.s
|
||||
dia.s
|
||||
printf.s
|
||||
cii.s
|
||||
cuu.s
|
||||
cmi.s
|
||||
cms.s
|
||||
cmu.s
|
||||
cvf.s
|
||||
exg.s
|
||||
los.s
|
||||
sts.s
|
28
mach/m68020/libem/Makefile
Normal file
28
mach/m68020/libem/Makefile
Normal file
|
@ -0,0 +1,28 @@
|
|||
# $Header$
|
||||
MACH=m68020
|
||||
all: libem_o.a end.o
|
||||
|
||||
install: all
|
||||
../../install libem_o.a tail_em
|
||||
../../install end.o end_em
|
||||
|
||||
cmp: all
|
||||
-../../compare libem_o.a tail_em
|
||||
-../../compare end.o end_em
|
||||
|
||||
end.o: end.s
|
||||
$(MACH) -I../../../h -c end.s
|
||||
|
||||
libem_o.a: libem_s.a
|
||||
ASAR=aal ; export ASAR ;\
|
||||
march . libem_o.a
|
||||
|
||||
clean:
|
||||
rm -f *.o libem_o.a
|
||||
|
||||
opr :
|
||||
make pr | opr
|
||||
|
||||
pr:
|
||||
@arch pv libem_s.a | pr -h `pwd`/libem_s.a
|
||||
@pr `pwd`/end.s
|
32
mach/m68020/libem/aar.s
Normal file
32
mach/m68020/libem/aar.s
Normal file
|
@ -0,0 +1,32 @@
|
|||
.define .aar
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
.sect .text
|
||||
|
||||
.aar: ! (on entry d0 contains the integer size in the descriptor)
|
||||
|
||||
cmp.l #4, d0
|
||||
beq 9f
|
||||
move.l #EILLINS, -(sp)
|
||||
jmp (.fatal)
|
||||
9:
|
||||
! register usage:
|
||||
! a0: descriptor address
|
||||
! a1: return address
|
||||
! d0: index
|
||||
|
||||
! The address is calculated by taking the relative index
|
||||
! (index - lower bound), multiplying that with the element
|
||||
! size and adding the result to the array base address.
|
||||
|
||||
move.l (sp)+, a1 ! return address
|
||||
move.l (sp)+, a0 ! descriptor address
|
||||
move.l (sp)+, d0 ! index
|
||||
sub.l (a0), d0 ! relative index
|
||||
muls.l (8,a0), d0
|
||||
move.l (sp)+, a0 ! array base address
|
||||
add.l d0, a0 ! address of array element
|
||||
jmp (a1) ! return
|
||||
.align 2
|
27
mach/m68020/libem/cii.s
Normal file
27
mach/m68020/libem/cii.s
Normal file
|
@ -0,0 +1,27 @@
|
|||
.define .cii
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
.cii:
|
||||
move.l (sp)+, a0 ! return address
|
||||
move.l (sp)+, d0 ! destination size
|
||||
sub.l (sp)+, d0 ! destination - source size
|
||||
bgt 1f
|
||||
sub.l d0, sp ! pop extra bytes
|
||||
jmp (a0)
|
||||
1:
|
||||
clr.l d1
|
||||
tst.l (sp)
|
||||
bne 4f
|
||||
not.l d1 ! d1 contains sign of source
|
||||
4:
|
||||
asr.l #2, d0
|
||||
sub.l #1, d0
|
||||
2:
|
||||
move.l d1, -(sp)
|
||||
dbf d0, 2b
|
||||
jmp (a0)
|
||||
.align 2
|
28
mach/m68020/libem/cmi.s
Normal file
28
mach/m68020/libem/cmi.s
Normal file
|
@ -0,0 +1,28 @@
|
|||
.define .cmi
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
! on entry d0: # bytes in 1 block
|
||||
! on exit d0: result
|
||||
.cmi:
|
||||
move.l (sp)+, d2 ! return address
|
||||
move.l sp, a0 ! address of top block
|
||||
lea (sp,d0.l), a1 ! address of lower block
|
||||
move.l d0, d1
|
||||
asr.l #2, d0
|
||||
1:
|
||||
cmp.l (a0)+, (a1)+
|
||||
bne 2f
|
||||
sub.l #1, d0
|
||||
bne 1b
|
||||
2:
|
||||
bge 3f
|
||||
neg.l d0 ! less
|
||||
3:
|
||||
lea (sp,d1.l*2), sp ! new sp; two blocks popped
|
||||
move.l d2,a0
|
||||
jmp (a0) ! return
|
||||
.align 2
|
25
mach/m68020/libem/cms.s
Normal file
25
mach/m68020/libem/cms.s
Normal file
|
@ -0,0 +1,25 @@
|
|||
.define .cms
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
! d0 contains set size
|
||||
! on exit d0 is zero for equal, non-zero for not equal
|
||||
.cms:
|
||||
move.l (sp)+, d2 ! return address
|
||||
move.l sp, a0 ! address of top block
|
||||
lea (sp,d0.l), a1 ! address of lower block
|
||||
move.l d0, d1
|
||||
asr.l #2, d0
|
||||
1:
|
||||
cmp.l (a0)+, (a1)+
|
||||
bne 2f
|
||||
sub.l #1, d0
|
||||
bne 1b
|
||||
2:
|
||||
lea (sp,d1.l*2), sp ! new sp; two blocks popped
|
||||
move.l d2,a0
|
||||
jmp (a0)
|
||||
.align 2
|
28
mach/m68020/libem/cmu.s
Normal file
28
mach/m68020/libem/cmu.s
Normal file
|
@ -0,0 +1,28 @@
|
|||
.define .cmu
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
! on entry d0: # bytes in 1 block
|
||||
! on exit d0: result
|
||||
.cmu:
|
||||
move.l (sp)+, d2 ! return address
|
||||
move.l sp, a0 ! address of top block
|
||||
lea (sp,d0.l), a1 ! address of lower block
|
||||
move.l d0, d1
|
||||
asr.l #2, d0
|
||||
1:
|
||||
cmp.l (a0)+, (a1)+
|
||||
bne 2f
|
||||
sub.l #1, d0
|
||||
bne 1b ! note: on equal carry is set
|
||||
2:
|
||||
bcc 3f
|
||||
neg.l d0 ! less
|
||||
3:
|
||||
lea (sp,d1.l*2), sp ! new sp; two blocks popped
|
||||
move.l d2, a0
|
||||
jmp (a0)
|
||||
.align 2
|
4
mach/m68020/libem/compmodule
Executable file
4
mach/m68020/libem/compmodule
Executable file
|
@ -0,0 +1,4 @@
|
|||
if ${MACH?} -c $1 1>&2
|
||||
then echo `basename $1 $2`.o
|
||||
else exit 1
|
||||
fi
|
25
mach/m68020/libem/csa.s
Normal file
25
mach/m68020/libem/csa.s
Normal file
|
@ -0,0 +1,25 @@
|
|||
.define .csa
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
|
||||
.csa:
|
||||
move.l (sp)+, a0 ! jump table address
|
||||
move.l (a0)+, a1 ! default address
|
||||
move.l (sp)+, d0 ! index
|
||||
sub.l (a0)+, d0 ! index - lower bound
|
||||
blt 1f
|
||||
cmp.l (a0)+, d0 ! rel. index, upper - lower bound
|
||||
bgt 1f
|
||||
move.l (a0,d0.l*4), a1 ! jump address
|
||||
1:
|
||||
move.l a1, d0
|
||||
beq 2f
|
||||
jmp (a1) ! jump to specified address
|
||||
2:
|
||||
move.l #ECASE, -(sp)
|
||||
jmp (.fatal)
|
||||
.align 2
|
28
mach/m68020/libem/csb.s
Normal file
28
mach/m68020/libem/csb.s
Normal file
|
@ -0,0 +1,28 @@
|
|||
.define .csb
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
|
||||
.csb:
|
||||
move.l (sp)+, a0 ! case descriptor
|
||||
move.l (sp)+, d0 ! index
|
||||
move.l (a0)+, a1 ! default jump address
|
||||
move.l (a0)+, d1 ! # entries
|
||||
beq 3f
|
||||
sub.l #1, d1
|
||||
1:
|
||||
cmp.l (a0,d1.w*8), d0
|
||||
dbeq d1, 1b
|
||||
bne 3f
|
||||
move.l (4,a0,d1.w*8), a1 ! jump address
|
||||
3:
|
||||
move.l a1, d0
|
||||
beq 4f
|
||||
jmp (a1)
|
||||
4:
|
||||
move.l #ECASE, -(sp)
|
||||
jmp (.fatal)
|
||||
.align 2
|
25
mach/m68020/libem/cuu.s
Normal file
25
mach/m68020/libem/cuu.s
Normal file
|
@ -0,0 +1,25 @@
|
|||
.define .ciu, .cui, .cuu
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
! only converts between sizes of multiples of four
|
||||
.ciu:
|
||||
.cui:
|
||||
.cuu:
|
||||
move.l (sp)+, a0 ! return address
|
||||
move.l (sp)+, d0 ! destination size
|
||||
sub.l (sp)+, d0
|
||||
bgt 1f
|
||||
sub.l d0, sp
|
||||
jmp (a0)
|
||||
1:
|
||||
asr.l #2, d0
|
||||
sub.l #1, d0
|
||||
2:
|
||||
clr.l -(sp)
|
||||
dbf d0, 2b
|
||||
jmp (a0)
|
||||
.align 2
|
20
mach/m68020/libem/cvf.s
Normal file
20
mach/m68020/libem/cvf.s
Normal file
|
@ -0,0 +1,20 @@
|
|||
.define .cfi, .cif,.cfu,.cuf,.cff
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
|
||||
! this is a dummy float conversion routine
|
||||
.cfi:
|
||||
.cif:
|
||||
.cfu:
|
||||
.cuf:
|
||||
.cff:
|
||||
move.l (sp)+, a0 ! return address
|
||||
move.l (sp)+, d0 ! destination size
|
||||
sub.l (sp)+, d0 ! diff. in sizes
|
||||
sub.l d0, sp
|
||||
jmp (a0)
|
||||
.align 2
|
48
mach/m68020/libem/dia.s
Normal file
48
mach/m68020/libem/dia.s
Normal file
|
@ -0,0 +1,48 @@
|
|||
.define .diagnos
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
space = 040
|
||||
del = 0177
|
||||
|
||||
.sect .data
|
||||
.range: .data1 space, del-1
|
||||
.align 2
|
||||
|
||||
.sect .text
|
||||
.diagnos:
|
||||
movem.l d0/d1/d2/a0, -(sp)
|
||||
move.l (.lino), -(sp)
|
||||
move.l (.filn), d2
|
||||
beq 1f
|
||||
move.l d2, a0
|
||||
move.l #40, d0
|
||||
3:
|
||||
move.b (a0)+, d1
|
||||
beq 2f
|
||||
cmp2.b (.range), d1
|
||||
bcs 1f
|
||||
dbf d0, 3b
|
||||
2:
|
||||
move.l d2, -(sp)
|
||||
pea (fmt)
|
||||
jsr (_printf)
|
||||
lea (8, sp), sp
|
||||
move.l (28, sp), (sp)
|
||||
jsr (_printf)
|
||||
lea (4, sp), sp
|
||||
movem.l (sp)+, d0/d1/d2/a0
|
||||
move.l (sp), (4, sp)
|
||||
lea (4, sp), sp
|
||||
rts
|
||||
|
||||
1:
|
||||
move.l #unknwn, d2
|
||||
bra 2b
|
||||
|
||||
.sect .data
|
||||
fmt: .asciz "%s, line %d: "
|
||||
unknwn: .asciz "unknown file"
|
||||
.align 2
|
20
mach/m68020/libem/end.s
Normal file
20
mach/m68020/libem/end.s
Normal file
|
@ -0,0 +1,20 @@
|
|||
.define endtext,enddata,endbss,_etext,_edata,_end
|
||||
.sect .text
|
||||
.align 4
|
||||
.sect .rom
|
||||
.align 4
|
||||
.sect .data
|
||||
.align 4
|
||||
.sect .bss
|
||||
.align 4
|
||||
.sect .end ! only for declaration of _end and endbss.
|
||||
|
||||
.sect .text
|
||||
endtext:
|
||||
_etext:
|
||||
.sect .data
|
||||
enddata:
|
||||
_edata:
|
||||
.sect .end
|
||||
_end:
|
||||
endbss:
|
20
mach/m68020/libem/exg.s
Normal file
20
mach/m68020/libem/exg.s
Normal file
|
@ -0,0 +1,20 @@
|
|||
.define .exg
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
! d0 : exchange size in bytes
|
||||
.exg:
|
||||
lea (4,sp,d0), a0 ! address of bottom block
|
||||
lea (4,sp), a1 ! address of top block
|
||||
asr.l #2, d0
|
||||
sub.l #1, d0
|
||||
1:
|
||||
move.l (a1), d1
|
||||
move.l (a0), (a1)+
|
||||
move.l d1, (a0)+
|
||||
dbf d0, 1b
|
||||
rts
|
||||
.align 2
|
11
mach/m68020/libem/fat.s
Normal file
11
mach/m68020/libem/fat.s
Normal file
|
@ -0,0 +1,11 @@
|
|||
.define .fatal
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
.fatal:
|
||||
jsr (.trp)
|
||||
jmp (EXIT)
|
||||
.align 2
|
32
mach/m68020/libem/inn.s
Normal file
32
mach/m68020/libem/inn.s
Normal file
|
@ -0,0 +1,32 @@
|
|||
.define .inn
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
.sect .text
|
||||
|
||||
.inn: ! d0 bitnumber
|
||||
! d1 setsize in bytes
|
||||
! on exit: 0 or 1 in d0
|
||||
|
||||
move.l d2, -(sp)
|
||||
move.l d0, d2
|
||||
asr.l #3, d2 ! offset from sp in bytes
|
||||
eor.l #3, d2 ! longs are stored in high-to-low order
|
||||
cmp.l d1, d2
|
||||
bge 1f ! bitnumber too large
|
||||
btst d0, (8,sp,d2.l)
|
||||
beq 2f
|
||||
move.l #1, d0
|
||||
bra 3f
|
||||
1:
|
||||
move.l #ESET, -(sp)
|
||||
jsr (.trp)
|
||||
2:
|
||||
clr.l d0
|
||||
3:
|
||||
move.l (sp)+, d2
|
||||
move.l (sp)+, a0 ! return address
|
||||
add.l d1, sp ! pop bitset
|
||||
jmp (a0) ! return
|
||||
.align 2
|
52
mach/m68020/libem/lar.s
Normal file
52
mach/m68020/libem/lar.s
Normal file
|
@ -0,0 +1,52 @@
|
|||
.define .lar
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
.sect .text
|
||||
! (on entry d0 contains the integer size in the descriptor)
|
||||
.lar:
|
||||
cmp.l #4, d0
|
||||
beq 9f
|
||||
move.l #EILLINS, -(sp)
|
||||
jmp (.fatal)
|
||||
9:
|
||||
! register usage:
|
||||
! a0: descriptor address
|
||||
! a1: base address
|
||||
! d0: index
|
||||
! d1: # bytes / element
|
||||
! d2: save return address
|
||||
|
||||
! For address calculation; see comment in 'aar.s'.
|
||||
|
||||
move.l (sp)+, d2 ! return address
|
||||
move.l (sp)+, a0 ! descriptor address
|
||||
move.l (sp)+, d0 ! index
|
||||
move.l (sp)+, a1 ! array base address
|
||||
sub.l (a0), d0 ! relative index
|
||||
move.l (8,a0), d1 ! # bytes / element
|
||||
cmp.l #1, d1
|
||||
bne 2f
|
||||
clr.l -(sp)
|
||||
move.b (a1,d0.l), (3,sp) ! one byte element
|
||||
bra 5f
|
||||
2:
|
||||
cmp.l #2, d1
|
||||
bne 4f
|
||||
clr.l -(sp)
|
||||
move.w (a1,d0.l*2), (2,sp) ! two byte element
|
||||
bra 5f
|
||||
4:
|
||||
muls.l d1, d0
|
||||
add.l d0, a1 ! address of 4n byte element
|
||||
add.l d1, a1 ! because of predecrement
|
||||
asr.l #2, d1
|
||||
sub.l #1, d1
|
||||
1:
|
||||
move.l -(a1), -(sp)
|
||||
dbf d1, 1b
|
||||
5:
|
||||
move.l d2,a0
|
||||
jmp (a0)
|
||||
.align 2
|
35
mach/m68020/libem/los.s
Normal file
35
mach/m68020/libem/los.s
Normal file
|
@ -0,0 +1,35 @@
|
|||
.define .los
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
! d0 : # bytes
|
||||
! a0 : source address
|
||||
! a1 : return address
|
||||
.sect .text
|
||||
.los:
|
||||
move.l (sp)+, a1
|
||||
move.l (sp)+, d0
|
||||
move.l (sp)+, a0
|
||||
cmp.l #1, d0
|
||||
bne 1f
|
||||
clr.l -(sp)
|
||||
move.b (a0), (3,sp) !1 byte
|
||||
bra 3f
|
||||
1:
|
||||
cmp.l #2, d0
|
||||
bne 2f
|
||||
clr.l -(sp)
|
||||
move.w (a0), (2,sp) !2 bytes
|
||||
bra 3f
|
||||
2:
|
||||
add.l d0, a0 !>=4 bytes
|
||||
asr.l #2, d0
|
||||
sub.l #1, d0
|
||||
|
||||
4: move.l -(a0), -(sp)
|
||||
dbf d0, 4b
|
||||
3:
|
||||
jmp (a1)
|
||||
.align 2
|
17
mach/m68020/libem/mon.s
Normal file
17
mach/m68020/libem/mon.s
Normal file
|
@ -0,0 +1,17 @@
|
|||
.define .mon
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
.mon:
|
||||
move.l (sp)+,a0
|
||||
pea (fmt)
|
||||
jsr (.diagnos)
|
||||
add.l #8, sp
|
||||
jmp (EXIT)
|
||||
|
||||
.sect .data
|
||||
fmt: .asciz "system call %d not implemented\n"
|
||||
.align 2
|
20
mach/m68020/libem/nop.s
Normal file
20
mach/m68020/libem/nop.s
Normal file
|
@ -0,0 +1,20 @@
|
|||
.define .nop
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
.nop:
|
||||
move.l (.limhp),-(sp)
|
||||
move.l (.reghp),-(sp)
|
||||
pea (12, sp)
|
||||
move.l (.lino),-(sp)
|
||||
pea (fmt)
|
||||
jsr (.diagnos)
|
||||
lea (20, sp), sp
|
||||
rts
|
||||
|
||||
.sect .data
|
||||
fmt: .asciz "test %d, sp 0x%x, .reghp 0x%x, .limhp 0x%x.\n"
|
||||
.align 2
|
83
mach/m68020/libem/printf.s
Normal file
83
mach/m68020/libem/printf.s
Normal file
|
@ -0,0 +1,83 @@
|
|||
.define _printf, _putchar, _getal, _char
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
.sect .bss
|
||||
_getal:
|
||||
.space 12
|
||||
_char:
|
||||
.space 1
|
||||
.align 2
|
||||
.sect .data
|
||||
hexs:
|
||||
.ascii "0123456789abcdef"
|
||||
.align 2
|
||||
.sect .text
|
||||
_printf:
|
||||
movem.l d0/d1/d2/a0/a1/a2/a3/a4/a5/a6, -(sp)
|
||||
lea (44, sp), a6 ! a6 <- address of arguments
|
||||
move.l (a6)+, a5 ! a5 <- address of format
|
||||
next: move.b (a5)+, d0
|
||||
beq out
|
||||
cmp.b #'%', d0
|
||||
beq procnt
|
||||
put: move.l d0, -(sp)
|
||||
jsr (_putchar) ! long argument on stack
|
||||
tst.l (sp)+
|
||||
bra next
|
||||
|
||||
procnt: move.b (a5)+, d0
|
||||
cmp.b #'d', d0 ! NOTE: %d means unsigned.
|
||||
beq digit
|
||||
cmp.b #'x', d0
|
||||
beq hex
|
||||
cmp.b #'s', d0
|
||||
beq string
|
||||
cmp.b #'%', d0 ! second % has to be printed.
|
||||
beq put
|
||||
tst.b -(a5) ! normal char should be printed
|
||||
bra next
|
||||
|
||||
string: move.l (a6)+, a2 ! a2 <- address of string
|
||||
sloop: move.b (a2)+, d0
|
||||
beq next
|
||||
move.l d0, -(sp)
|
||||
jsr (_putchar) ! long argument on stack
|
||||
tst.l (sp)+
|
||||
bra sloop
|
||||
|
||||
digit: move.l (a6)+, d1 ! d1 <- integer
|
||||
move.l #_getal+12, a2 ! a2 <- ptr to last part of buf
|
||||
clr.b -(a2) ! stringterminator
|
||||
1: divul.l #10, d2:d1 ! d1 <- qotient; d2 <- remainder
|
||||
add.l #'0', d2
|
||||
move.b d2, -(a2)
|
||||
tst.l d1 ! if quotient = 0 then ready
|
||||
bne 1b
|
||||
bra sloop ! print digitstring.
|
||||
|
||||
hex: move.l (a6)+, d1 ! d1 <- integer
|
||||
move.l #_getal+12, a2 ! a2 <- ptr to last part of buf
|
||||
clr.b -(a2) ! stringterminator
|
||||
move.l #7, d2 ! loop control
|
||||
1: move.l d1, d0
|
||||
and.l #15, d0
|
||||
move.b (hexs,d0.w), -(a2) ! hex digit
|
||||
asr.l #4, d1
|
||||
dbf d2, 1b
|
||||
bra sloop
|
||||
|
||||
out:
|
||||
movem.l (sp)+, d0/d1/d2/a0/a1/a2/a3/a4/a5/a6
|
||||
rts
|
||||
|
||||
|
||||
_putchar:
|
||||
move.l #1, -(sp)
|
||||
pea (11,sp)
|
||||
move.l #1, -(sp)
|
||||
jsr (_write)
|
||||
lea (12, sp), sp
|
||||
rts
|
||||
.align 2
|
54
mach/m68020/libem/sar.s
Normal file
54
mach/m68020/libem/sar.s
Normal file
|
@ -0,0 +1,54 @@
|
|||
.define .sar
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
! (on entry d0 contains the integer size in the descriptor)
|
||||
.sar:
|
||||
cmp.l #4, d0
|
||||
beq 9f
|
||||
move.l #EILLINS, -(sp)
|
||||
jmp (.fatal)
|
||||
9:
|
||||
! register usage:
|
||||
! a0: descriptor address
|
||||
! a1: base address
|
||||
! d0: index
|
||||
! d1: # bytes / element
|
||||
! d2: return address
|
||||
|
||||
! For address calculation; see comment in 'aar.s'.
|
||||
! If the element size is a fraction of EM_WSIZE (4)
|
||||
! the calculation is done by adding.
|
||||
|
||||
move.l (sp)+, d2 ! return address
|
||||
move.l (sp)+, a0
|
||||
move.l (sp)+, d0
|
||||
move.l (sp)+, a1
|
||||
sub.l (a0), d0
|
||||
move.l (8,a0), d1 ! # bytes / element
|
||||
cmp.l #1, d1
|
||||
bne 2f
|
||||
move.l (sp)+, d1
|
||||
move.b d1, (a1,d0.l) ! store one byte element
|
||||
bra 5f
|
||||
2:
|
||||
cmp.l #2, d1
|
||||
bne 4f
|
||||
move.l (sp)+, d1
|
||||
move.w d1, (a1,d0.l*2) ! store two byte element
|
||||
bra 5f
|
||||
4: ! here: 4n byte element
|
||||
muls.l d1, d0
|
||||
add.l d0, a1 ! address of 4n byte element
|
||||
asr.l #2, d1
|
||||
sub.l #1, d1
|
||||
1:
|
||||
move.l (sp)+, (a1)+
|
||||
dbf d1, 1b
|
||||
5:
|
||||
move.l d2,a0
|
||||
jmp (a0)
|
||||
.align 2
|
33
mach/m68020/libem/set.s
Normal file
33
mach/m68020/libem/set.s
Normal file
|
@ -0,0 +1,33 @@
|
|||
.define .set
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
.sect .text
|
||||
|
||||
.set: ! d0 bitnumber
|
||||
! d1 setsize in bytes
|
||||
|
||||
move.l (sp)+, a0
|
||||
move.l d2, a1
|
||||
move.l d1, d2
|
||||
asr.l #2, d2
|
||||
sub.l #1, d2
|
||||
1:
|
||||
clr.l -(sp)
|
||||
dbf d2, 1b
|
||||
|
||||
move.l d0, d2
|
||||
asr.l #3, d2 ! offset from sp in bytes
|
||||
eor.l #3, d2 ! longs are stored in high-to-low order
|
||||
cmp.l d1, d2
|
||||
blt 2f
|
||||
move.l #ESET, -(sp) ! bitnumber too large
|
||||
move.l a1, d2
|
||||
move.l a0, -(sp)
|
||||
jmp (.trp)
|
||||
2:
|
||||
bset d0, (sp, d2.l)
|
||||
move.l a1, d2
|
||||
jmp (a0) ! return
|
||||
.align 2
|
26
mach/m68020/libem/shp.s
Normal file
26
mach/m68020/libem/shp.s
Normal file
|
@ -0,0 +1,26 @@
|
|||
.define .strhp
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
.strhp:
|
||||
move.l (sp)+, a0
|
||||
move.l (sp), d1 ! new heap pointer
|
||||
cmp.l (.limhp), d1 ! compare new heap pointer with limit
|
||||
blt 1f
|
||||
add.l #0x400, d1
|
||||
and.l #~0x3ff, d1
|
||||
move.l d1, (.limhp)
|
||||
move.l d1, -(sp)
|
||||
jsr (_brk) ! allocate 1K bytes of extra storage
|
||||
add.l #4, sp
|
||||
bcs 2f
|
||||
1:
|
||||
move.l (sp)+, (.reghp) ! store new value
|
||||
jmp (a0) ! return
|
||||
2:
|
||||
move.l #EHEAP, -(sp)
|
||||
jmp (.fatal)
|
||||
.align 2
|
34
mach/m68020/libem/sts.s
Normal file
34
mach/m68020/libem/sts.s
Normal file
|
@ -0,0 +1,34 @@
|
|||
.define .sts
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
! d0 : # bytes
|
||||
! a0 : destination address
|
||||
! a1 : return address
|
||||
.sect .text
|
||||
.sts:
|
||||
move.l (sp)+, a1
|
||||
move.l (sp)+, d0
|
||||
move.l (sp)+, a0
|
||||
cmp.l #1, d0
|
||||
bne 1f
|
||||
move.l (sp)+, d0
|
||||
move.b d0, (a0)
|
||||
bra 4f
|
||||
|
||||
1: cmp.l #2, d0
|
||||
bne 2f
|
||||
move.l (sp)+, d0
|
||||
move.w d0, (a0)
|
||||
bra 4f
|
||||
2:
|
||||
asr.l #2, d0
|
||||
sub.l #1, d0
|
||||
3:
|
||||
move.l (sp)+, (a0)+
|
||||
dbf d0, 3b
|
||||
4:
|
||||
jmp (a1) ! return
|
||||
.align 2
|
40
mach/m68020/libem/trp.s
Normal file
40
mach/m68020/libem/trp.s
Normal file
|
@ -0,0 +1,40 @@
|
|||
.define .trp
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
.trp:
|
||||
movem.l d0/d1/a0, -(sp)
|
||||
move.l (16, sp), a0 ! return address
|
||||
move.l (20, sp), d0 ! error number
|
||||
move.l a0, (20, sp)
|
||||
move.l d0, (16, sp)
|
||||
move.l d0,-(sp)
|
||||
cmp.l #16, d0
|
||||
bcc 1f
|
||||
move.l (.trpim), d1
|
||||
btst d0, d1
|
||||
bne 3f
|
||||
1:
|
||||
move.l (.trppc), a0
|
||||
move.l a0, d0
|
||||
beq 9f
|
||||
clr.l (.trppc)
|
||||
jsr (a0)
|
||||
3:
|
||||
add.l #4, sp
|
||||
movem.l (sp)+, d0/d1/a0
|
||||
add.l #4, sp
|
||||
rts
|
||||
9:
|
||||
pea (fmt)
|
||||
jsr (.diagnos)
|
||||
lea (4, sp), sp
|
||||
jsr (__cleanup)
|
||||
jmp (EXIT)
|
||||
|
||||
.sect .data
|
||||
fmt: .asciz "trap %d called\n"
|
||||
.align 2
|
Loading…
Reference in a new issue