
16ビット*8ビットの掛け算ルーチンを作っています。
HLとAレジスタの掛け算で答えは3バイトで
AHLの順に入れようとしているのですが、
困ったことに符号ありで考えるともうだめです。
HLに入れる値が小さいときはまだいいのですが、
大きくなるとどうしようって感じです。
解決策も浮かばないし・・とほほ
ソースを書いてみますので、お気づきの点があれば
アドバイスをよろしくお願いします。
見づらいプログラムで申し訳ないです(泣)
僕は裏レジ、一切使い(え?)ません(爆)
;IN:HL かけられる数
;:A かける数
;OUT:AHLの順で入る
;-----------------------------------------
muls16_8:
ld B,A
call mul16_8
bit 8,B
jr z,muls16_8_end
neg
muls16_8_end:
ret
;-----------------------------------------
mul16_8:
push BC
ld B,8
ld IX,0
ld C,0
ld DE,0
mul16_8_loop:
rrca
jr nc,mul16_8_skip
push DE
push HL
pop DE
add IX,DE
pop DE
push AF
ld A,E
add A,C
ld E,A
pop AF
mul16_8_skip:
add HL,HL
rl C
djnz mul16_8_loop
push IX
pop HL
ld A,E
pop BC
ret
なんでタブやスペースを消すんだぁ・・・みづらい・・・
No.1ベストアンサー
- 回答日時:
;***************************************************************
;* MULDE_HL: *
;* ★DE * HL の 結果を DEHL に返す *
;* KL5C16030 の MUL DE,HL と 同一動作 *
;* *
;* 入力 DE *
;* HL *
;* *
;* 出力 DE 上位 WORD *
;* HL 下位 WORD *
;* *
;* 使用 AF,BC,DE,HL,IX *
;* 破壊 DE,HL *
;***************************************************************
MULDE_HL: PUSH AF
PUSH BC
PUSH IX
LD IXH,D
LD IXL,E
LD B,H
LD C,L
LD HL,0000H
;;;;;;;;;;;;;; LD DE,0000H ;16回 ローテート するから 初期化不要
LD A,16
MULDEHL_L01: ADD HL,HL
RL E
RL D
ADD IX,IX
JR NC,MULDEHL_S02
ADD HL,BC
JR NC,MULDEHL_S02
INC DE
MULDEHL_S02: DEC A
JR NZ,MULDEHL_L01
POP IX
POP BC
POP AF
RET
;***************************************************************
;* MULSDE_HL: *
;* ★DE * HL の 結果を DEHL に返す *
;* KL5C16030 の MULS DE,HL と 同一動作 *
;* *
;* 入力 DE *
;* HL *
;* *
;* 出力 DE 上位 WORD *
;* HL 下位 WORD *
;* *
;* 使用 AF,BC,DE,HL,IX *
;* 破壊 DE,HL *
;***************************************************************
MULSDE_HL: PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL MULDE_HL
EX DE,HL
POP BC ;HL
EX (SP),HL
BIT 7,H ;DE
EX (SP),HL
JR Z,MULSDEHL_S01
OR A
SBC HL,BC
MULSDEHL_S01: BIT 7,B
POP BC ;DE
JR Z,MULSDEHL_S02
OR A
SBC HL,BC
MULSDEHL_S02: EX DE,HL
POP BC
POP AF
RET
16bit * 16bit の掛け算です ご参考までにどうぞ
ありがとうございます。
実は自分で次の日に色々試してみたらうまくいきました。
16*16ビットのものを参考に改良してみようかと思います。
わざわざありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DOHCとOHC
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
TV出力ポートをOFFにすれば良い...
-
FLEXSOLARパネルからAmazonで買...
-
プログラムについての質問です...
-
PD充電器について
-
RS232cデーターをエクセルに落とす
-
スマホ充電器購入にあたり
-
デスクトップPCでWQHD出力させたい
-
発表会を撮影したDVD(の一部)...
-
VB6で 先頭00をつけたいです...
-
Accessのテーブルからcsv出力す...
-
makeで文字化けする。migwのmak...
-
printfとputcharの違いは
-
cout と cerrの違い
-
KEYENCEのシーケンスプログラム...
-
C#でアクセス権限の取得方法が...
-
【UWSC】WEBページ中の特定文字...
-
無線とかアンテナに関しの質問...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
DOHCとOHC
-
4Kの外部モニターに出力すると...
-
Microsoft365で作ったword文書...
-
プログラムについての質問です...
-
cout と cerrの違い
-
KEYENCEのシーケンスプログラム...
-
FLEXSOLARパネルからAmazonで買...
-
PD充電器について
-
スマホ充電器購入にあたり
-
ACCESS クエリ→フォーム...
-
コンセントの電力は入力と出力...
-
Windows Formアプリからコンソ...
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
MMDでavi出力が出来ない
-
CrystalReportの文字列の折返し...
-
Excel VBAで値を変えながら、pd...
-
充電器の表記についての質問で...
-
VBAのExecメソッドで画面を非表...
おすすめ情報