247 lines
4.5 KiB
C
247 lines
4.5 KiB
C
/*****************************************************************************************/
|
|
// opertionen
|
|
/*****************************************************************************************/
|
|
ii_lset_shd:.macro
|
|
ii_lset_shdx e0 //r d0
|
|
ii_lset_shdx e2 //r d1
|
|
ii_lset_shdx e4 //r d2
|
|
ii_lset_shdx e6 //r d3
|
|
ii_lset_shdx e8 //r d4
|
|
ii_lset_shdx ea //r d5
|
|
ii_lset_shdx ec //r d6
|
|
ii_lset_shdx ee //r d7
|
|
|
|
ii_lset_shdx e1 //l d0
|
|
ii_lset_shdx e3 //l d1
|
|
ii_lset_shdx e4 //l d2
|
|
ii_lset_shdx e5 //l d3
|
|
ii_lset_shdx e9 //l d4
|
|
ii_lset_shdx eb //l d5
|
|
ii_lset_shdx ed //l d6
|
|
ii_lset_shdx ef //l d7
|
|
.endm
|
|
|
|
ii_lset_shdx:.macro
|
|
//byt
|
|
ii_lset_opea \1,0 // as,ls #im,dx
|
|
ii_lset_opea \1,1 // rox,ro #im,dx
|
|
ii_lset_opea \1,2 // as,ls dy,dx
|
|
ii_lset_opea \1,3 // rox,ro dy,dx
|
|
//word
|
|
ii_lset_opea \1,4 // as,ls #im,dx
|
|
ii_lset_opea \1,5 // rox,ro #im,dx
|
|
ii_lset_opea \1,6 // as,ls dy,dx
|
|
ii_lset_opea \1,7 // rox,ro dy,dx
|
|
//long
|
|
// ii_lset_opea \1,8 // as,ls #im,dx -> vorhanden
|
|
ii_lset_opea \1,9 // rox,ro #im,dx
|
|
// ii_lset_opea \1,a // as,ls dy,dx -> vorhanden
|
|
ii_lset_opea \1,b // rox,ro dy,dx
|
|
.endm
|
|
/******************************************************/
|
|
ii_shd:.macro // 1=code 2=operation 3 = normal, direct oder immediat
|
|
// byt
|
|
opdx \1,\2,b,0,\3 // dx
|
|
// word
|
|
opdx \1,\2,w,4,\3 // dx
|
|
// long
|
|
opdx \1,\2,l,8,\3 // dx
|
|
.endm
|
|
/******************************************************/
|
|
// byt word long routinen
|
|
/******************************************************/
|
|
sh_asr: .macro // asr -> 1=operation 2 = dx 3 = dy/im 4 = size b/w
|
|
mvs.\4 \2,d1
|
|
sh_shal \1,\2,\3,\4
|
|
.endm
|
|
|
|
sh_lsr: .macro // asl -> 1=operation 2 = dx 3 = dy/im 4 = size b/w
|
|
mvz.\4 \2,d1
|
|
sh_shal \1,\2,\3,\4
|
|
.endm
|
|
|
|
sh_shal:.macro
|
|
move.w \3,d0
|
|
\1.l d0,d1
|
|
set_cc0
|
|
move.\4 d1,\2
|
|
.endm
|
|
|
|
sh_all: .macro // asl/lsl -> 1=operation 2 = dx 3 = dy/im 4 = size b/w
|
|
mvz.\4 \2,d1
|
|
.ifc \4,b
|
|
byterev.l d1
|
|
.else
|
|
swap.w d1
|
|
.endif
|
|
sh_asr \1,\2,\3,\4
|
|
.endm
|
|
|
|
sh_ror: .macro // ror -> 1=operation 2 = dx 3 = dy/im 4 = size b/w/l
|
|
move.\4 \2,d1 /
|
|
move.w \3,d0
|
|
.ifc \4,b
|
|
lsl.l #8,d1
|
|
move.b \2,d1
|
|
and.l #0x7,d0
|
|
lsr.l d0,d1
|
|
.else
|
|
.ifc \4,w
|
|
swap.w d1
|
|
move.w \2,d1
|
|
and.l #0xf,d0
|
|
lsr.l d0,d1
|
|
.else
|
|
and.l #0x1f,d0
|
|
lsr.l d0,d1
|
|
move.l d1,a1
|
|
move.l \2,d1
|
|
sub.l #32,d0
|
|
neg.l d0
|
|
lsl.l d0,d1
|
|
add.l a1,d1
|
|
.endif
|
|
.endif
|
|
move.\4 d1,\2
|
|
move.w ccr,d0
|
|
and.l #1,d1 // ist auch carry bit
|
|
or.l d1,d0
|
|
move.b d0,ccr_off(a7)
|
|
.endm
|
|
|
|
sh_rol: .macro // rol -> 1=operation 2 = dx 3 = dy/im 4 = size b/w/l
|
|
move.\4 \2,d1
|
|
move.w \3,d0
|
|
.ifc \4,b
|
|
lsl.l #8,d1
|
|
move.b \2,d1
|
|
and.l #0x7,d0
|
|
lsl.l d0,d1
|
|
lsr.l #8,d1
|
|
moveq #7,d0
|
|
.else
|
|
.ifc \4,w
|
|
swap.w d1
|
|
move.w \2,d1
|
|
and.l #0xf,d0
|
|
lsr.l d0,d1
|
|
swap.w d1
|
|
moveq #15,d0
|
|
.else
|
|
and.l #0x1f,d0
|
|
lsl.l d0,d1
|
|
move.l d1,a1
|
|
move.l \2,d1
|
|
sub.l #32,d0
|
|
neg.l d0
|
|
lsr.l d0,d1
|
|
add.l a1,d1
|
|
moveq #31,d0
|
|
.endif
|
|
.endif
|
|
move.\4 d1,\2
|
|
lsr.l d0,d1 // carry bit schieben
|
|
move.w ccr,d0
|
|
and.l #1,d1
|
|
or.l d1,d0
|
|
move.b d0,ccr_off(a7)
|
|
.endm
|
|
|
|
sh_roxr: .macro // roxr -> 1=operation 2 = dx 3 = dy/im 4 = size b/w/l
|
|
clr.l d0
|
|
addx.l d0,d0
|
|
ifc \4,b
|
|
mvz.b \2,d1
|
|
lsl.l #1,d1
|
|
add.l d0,d1
|
|
lsl.l #8,d1
|
|
move.b \2,d1
|
|
move.w \3,d0
|
|
and.l #0x7,d0
|
|
lsr.l d0,d1
|
|
set_cc0
|
|
else
|
|
.ifc \4,w
|
|
mvz.b \2,d1
|
|
lsl.l #1,d1
|
|
add.l d0,d1
|
|
lsl.l #8,d1
|
|
lsl.l #8,d1
|
|
move.w \2,d1
|
|
move.w \3,d0
|
|
and.l #0xf,d0
|
|
lsr.l d0,d1
|
|
set_cc0
|
|
.else
|
|
bitrev.l d0
|
|
move.l \2,d1
|
|
lsr.l #1,d1
|
|
add.l d0,d1
|
|
move.w \3,d0
|
|
subq.l #1,d0
|
|
and.l #0x1f,d0
|
|
lsr.l d0,d1
|
|
move.l d1,a1
|
|
set_cc1
|
|
move.l \2,d1
|
|
sub.l #32,d0
|
|
neg.l d0
|
|
lsl.l d0,d1
|
|
add.l a1,d1
|
|
.endif
|
|
.endif
|
|
move.\4 d1,\2
|
|
.endm
|
|
|
|
sh_roxl: .macro // roxl -> 1=operation 2 = dx 3 = dy/im 4 = size b/w/l
|
|
clr.l d0
|
|
addx.l d0,d0
|
|
ifc \4,b
|
|
mvz.b \2,d1
|
|
lsl.l #1,d1
|
|
add.l d0,d1
|
|
lsl.l #8,d1
|
|
move.b \2,d1
|
|
lsl.l #8,d1
|
|
lsl.l #7,d1
|
|
move.w \3,d0
|
|
and.l #0x7,d0
|
|
lsl.l d0,d1
|
|
set_cc0
|
|
byterev.l d1
|
|
else
|
|
.ifc \4,w
|
|
mvz.b \2,d1
|
|
lsl.l #1,d1
|
|
add.l d0,d1
|
|
lsl.l #8,d1
|
|
lsl.l #7,d1
|
|
mvz.w \2,d0
|
|
lsr.l #1,d0
|
|
add.l d0,d1
|
|
move.w \3,d0
|
|
and.l #0xf,d0
|
|
lsl.l d0,d1
|
|
set_cc0
|
|
swap.w d1
|
|
.else
|
|
move.l \2,d1
|
|
lsl.l #1,d1
|
|
add.l d0,d1
|
|
move.w \3,d0
|
|
subq.l #1,d0
|
|
and.l #0x1f,d0
|
|
lsl.l d0,d1
|
|
move.l d1,a1
|
|
set_cc1
|
|
move.l \2,d1
|
|
sub.l #32,d0
|
|
neg.l d0
|
|
lsr.l d0,d1
|
|
add.l a1,d1
|
|
.endif
|
|
.endif
|
|
move.\4 d1,\2
|
|
.endm
|
|
|
|
|