344 lines
5.2 KiB
Plaintext
344 lines
5.2 KiB
Plaintext
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
!-----------------------------------------------------------------------------.
|
|
! 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
|
|
#if test
|
|
locptr
|
|
heaptr
|
|
extptr
|
|
7: bra e_badptr
|
|
6:
|
|
#endif
|
|
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,(a5)
|
|
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,(a5)
|
|
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,(a5)
|
|
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:
|
|
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)
|
|
|
|
!--------------------------------------------------------------------------
|
|
#ifdef FLTRAP
|
|
cuf_z: cfu_z: cff_z: cfi_z: cif_z:
|
|
mov (sp)+,d0 ; subt (sp)+,d0
|
|
ext.l d0
|
|
sub.l d0,sp
|
|
bra flnim !floating point not implemented
|
|
#else
|
|
cfu_z:
|
|
clr.l d0
|
|
mov (sp)+,d0
|
|
clr.l d1
|
|
mov (sp)+,d1
|
|
move.l d1,-(sp)
|
|
move.l d0,-(sp)
|
|
checksize
|
|
2:
|
|
move.l #4,(sp)
|
|
cmp #4,d1
|
|
bne 1f
|
|
jsr .cfu
|
|
add #8,sp
|
|
2:
|
|
mov #4,-(sp)
|
|
mov #2,-(sp)
|
|
bra cuu_z
|
|
1:
|
|
cmp #8,d1
|
|
beq 1f
|
|
bra e_oddz
|
|
1:
|
|
jsr .cfu
|
|
add #12,sp
|
|
bra 2b
|
|
4:
|
|
mov d1,d0
|
|
checkfsize
|
|
4:
|
|
jsr .cfu
|
|
add #8,sp
|
|
jmp (a4)
|
|
8:
|
|
jsr .cfu
|
|
add #12,sp
|
|
jmp (a4)
|
|
cfi_z:
|
|
clr.l d0
|
|
mov (sp)+,d0
|
|
clr.l d1
|
|
mov (sp)+,d1
|
|
move.l d1,-(sp)
|
|
move.l d0,-(sp)
|
|
checksize
|
|
2:
|
|
move.l #4,(sp)
|
|
cmp #4,d1
|
|
bne 1f
|
|
jsr .cfi
|
|
add #8,sp
|
|
2:
|
|
mov #4,-(sp)
|
|
mov #2,-(sp)
|
|
bra cii_z
|
|
1:
|
|
cmp #8,d1
|
|
beq 1f
|
|
bra e_oddz
|
|
1:
|
|
jsr .cfi
|
|
add #12,sp
|
|
bra 2b
|
|
4:
|
|
mov d1,d0
|
|
checkfsize
|
|
4:
|
|
jsr .cfi
|
|
add #8,sp
|
|
jmp (a4)
|
|
8:
|
|
jsr .cfi
|
|
add #12,sp
|
|
jmp (a4)
|
|
cuf_z:
|
|
mov (sp)+,d0
|
|
checkfsize
|
|
4:
|
|
mov (sp)+,d0
|
|
checksize
|
|
2:
|
|
clr.l d0
|
|
move.w (sp)+,d0
|
|
move.l d0,-(sp)
|
|
4:
|
|
move.l #4,-(sp)
|
|
jsr .cuf4
|
|
add #4,sp
|
|
jmp (a4)
|
|
8:
|
|
mov (sp)+,d0
|
|
checksize
|
|
2:
|
|
clr.l d0
|
|
move.w (sp)+,d0
|
|
move.l d0,-(sp)
|
|
4:
|
|
move.l #4,-(sp)
|
|
jsr .cuf8
|
|
jmp (a4)
|
|
|
|
cif_z:
|
|
mov (sp)+,d0
|
|
checkfsize
|
|
4:
|
|
mov (sp)+,d0
|
|
checksize
|
|
2:
|
|
move.w (sp)+,d0
|
|
ext.l d0
|
|
move.l d0,-(sp)
|
|
4:
|
|
move.l #4,-(sp)
|
|
jsr .cif4
|
|
add #4,sp
|
|
jmp (a4)
|
|
8:
|
|
mov (sp)+,d0
|
|
checksize
|
|
2:
|
|
move.w (sp)+,d0
|
|
ext.l d0
|
|
move.l d0,-(sp)
|
|
4:
|
|
move.l #4,-(sp)
|
|
jsr .cif8
|
|
jmp (a4)
|
|
|
|
cff_z:
|
|
mov (sp)+,d0 ;
|
|
checkfsize
|
|
4:
|
|
mov (sp)+,d0 ; cmp #4,d0 ; beq 1f
|
|
cmp #8,d0 ; beq 2f
|
|
bra e_oddz
|
|
2:
|
|
jsr .cff4
|
|
add #4,sp
|
|
1:
|
|
jmp (a4)
|
|
8:
|
|
mov (sp)+,d0 ; cmp #8,d0 ; beq 1f
|
|
cmp #4,d0 ; beq 2f
|
|
bra e_oddz
|
|
2:
|
|
move.l (sp)+,d0
|
|
clr.l -(sp)
|
|
move.l d0,-(sp)
|
|
jsr .cff8
|
|
1:
|
|
jmp (a4)
|
|
#endif
|