MAIN START
LD GR0,X ; GR0 ← X
LAD GR1,Y ; GR1 ← Yのアドレス
LD GR2,=42 ; GR2 ← m
LAD GR3,Z ; GR3 ← Zのアドレス
LD GR4,=4
CALL BITINSL
RET
X DC #5E96
Y DC #1234
DC #5678
DC #EF18
DC #CDEF
Z DS 5
BITINSL START
RPUSH
LOOP1 CPA GR2,=17
JMI INS
CALL COPY ; ビット列 Y の先頭から挿入位置の直前の
SUBA GR2,=16 ; 語までを結果の領域ヘコピー
JUMP LOOP1
INS CALL BITINS
LAD GR1,1,GR1
LAD GR3,2,GR3
SUBA GR4,=1
JZE FIN
LOOP2 CALL COPY ; ビット列 Y の残りの部分を
JNZ LOOP2 ; 結果の領域ヘコピー
FIN RPOP
RET
COPY START ; ビット列 Y の1語を結果の領域ヘコピー
LD GR5,0,GR1
ST GR5,0,GR3
LAD GR1,1,GR1
LAD GR3,1,GR3
SUBA GR4,=1
RET
BITINS START
RPUSH
LD GR6,=16
SUBA GR6,GR2 ; GR6 ← シフト数
LD GR1,0,GR1 ; GR1 ← ビット列 B
LD GR4,GR1 ; GR4 ← ビット列 B
LD GR5,GR0 ; GR5 ← ビット列 A
SRL GR1,0,GR6
SLL GR1,0,GR6 ; GR1 ← ビット列 B の左 n ビット(b1)
SLL GR4,0,GR2
SRL GR4,0,GR2 ; GR4 ← ビット列 B の右(16-n)ビット(b2)
SRL GR0,0,GR2 ; GR0 ← ビット列 A の左(16-n) ビット(a1)
SLL GR5,0,GR6 ; GR5 ← ビット列 A の右 n ビット(a2)
OR GR1,GR0 ; C1 ← b1+a1
OR GR4,GR5 ; C2 ← a2+b2
ST GR1,0,GR3
ST GR4,1,GR3
RPOP
RET
END
X:#5E96
m:42
Y:#1234 5678 EF18 CDEF
N:4
Z:#1234 5678 EF17 A598 CDEF