アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

なんでタブやスペースを消すんだぁ・・・みづらい・・・

A 回答 (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 の掛け算です ご参考までにどうぞ
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/06/26 14:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!