269 lines
6.3 KiB
Plaintext
269 lines
6.3 KiB
Plaintext
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
!----------------------------------------------------------------------------
|
|
! 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)
|
|
#if test
|
|
bvs 9f
|
|
#endif
|
|
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 #0+l0,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
|
|
locptr
|
|
heaptr
|
|
extptr
|
|
7: bra e_badptr
|
|
6:
|
|
comp und,(a0) ;bne 3f
|
|
bsr e_iund
|
|
3:
|
|
#endif
|
|
subt #1,(a0)
|
|
#if test
|
|
bvs 9f
|
|
#endif
|
|
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 #0+l0,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
|
|
|
|
#if test
|
|
9: bsr e_iovfl !error routine for integer overflow
|
|
jmp (a4)
|
|
#endif
|
|
|
|
!----------------------------------------------------------------------------
|
|
|
|
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 ; add.l a2,d0
|
|
move.l d0,a0
|
|
#if test
|
|
locptr
|
|
7: bra e_badptr
|
|
6:
|
|
#endif
|
|
cl (a0)
|
|
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 ; add.l a2,d0
|
|
move.l d0,a0 ; cl l0(a0)
|
|
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 ; add.l a6,d0
|
|
move.l d0,a0
|
|
#if test
|
|
extptr
|
|
7: bra e_badptr
|
|
6:
|
|
#endif
|
|
cl (a0)
|
|
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 ; move.l #0,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
|
|
|
|
|