この日記はGNSで生成しています。 |
; A*BC = BC*DE = HLを検査 ; A=0 or Z=1なら成立 COMPARE: PUSH DE PUSH HL PUSH DE ; LD D,0 ;A=DE LD E,A ; CALL BC_MUL_DE_TO_HL ;HL=A*BC EX (SP),HL ;A*BCを保存&DE呼び出し EX DE,HL ; CALL BC_MUL_DE_TO_HL ;HL=BC*DE POP DE ;A*BCを呼び出し OR A ;CY=0 SBC HL,DE ;HL(BC*DE)とDE(A*BC)を検査 LD A,H ;H=L=0ならHL(BC*DE)=DE(A*BC) OR L ;CY=0 EX DE,HL ;DE(A*BC)をHLに POP DE ;もとのHLをDEに呼び出し SBC HL,DE ;HL(A*BC)とDE(HL)を検査 OR H ;H=L=0ならHL(A*BC)=DE(HL) OR L ; EX DE,HL POP DE RET ; HL=BC*DE ; BROKEN AF BC_MUL_DE_TO_HL: PUSH BC PUSH DE LD HL,0 ; LD A,C ;BCをCAに置き換える LD C,B ; LD B,16 ;CA=16桁 LP1: SRL C ;CA >>= 1 RRA ;最下位bitはCYに押し出される JP NC,JP2 ;CY=1ならadd ADD HL,DE ; JP2: SLA E ;DE <<= 1 RL D ; DJNZ JP1 ;16桁分ループ POP DE POP BC RET
・・・久しぶりにZ80のコードなぞ書いてみる。注釈しておいたので、Z80を読めなくてもプログラミングするヒトなら読めるんじゃないかな。
_ なお、テストはしてない*1ので、これで合ってるかどーかは分かりません(汗)。
_ そーいや、Z80の昔話が上るたびによく言われること。「21とか3EとかCDとかC9とかC3とかED B0とか・・・死ぬまで忘れないんだろーね」・・・他のCPUではこういう話をあまり聞かない気がするんだが・・・気のせい?
メールはこちらへ...[後藤浩昭 / Hiroaki GOTO / GORRY / gorry@hauN.org]