- 締切済み
Z80アセンブルで16ビット*8ビットの乗算ルーチンを作りたいのですが・・
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 なんでタブやスペースを消すんだぁ・・・みづらい・・・
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- nyannnyannko
- ベストアンサー率15% (14/90)
;*************************************************************** ;* 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ビットのものを参考に改良してみようかと思います。 わざわざありがとうございました。