• 締切済み

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 なんでタブやスペースを消すんだぁ・・・みづらい・・・

みんなの回答

回答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 の掛け算です ご参考までにどうぞ

amoban
質問者

お礼

ありがとうございます。 実は自分で次の日に色々試してみたらうまくいきました。 16*16ビットのものを参考に改良してみようかと思います。 わざわざありがとうございました。