/*****************************************************************************************/ // 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