パスワードを忘れた? アカウント作成

アカウントを作成して、スラドのモデレーションと日記の輪に参加しよう。

13743864 journal
日記

yasuokaの日記: Z80におけるPaethの回転行列 1

日記 by yasuoka

一昨日昨日の日記を読み返しながら、イキオイ余ってPaethの回転行列を、Z80で汎用的に実装してしまった。IXレジスタにx座標の256倍を、IYレジスタにy座標の256倍を、HLレジスタに-tan(θ/2)の16384倍を、DEレジスタにsinθの16384倍を、それぞれ符号付整数で入れて呼び出すと、θだけ回転(ただし-2π/3≦θ≦2π/3)した結果がIX,IYレジスタに返ってくる。

13743433 journal
日記

yasuokaの日記: Z80における2π/48の回転行列 2

日記 by yasuoka

昨日の日記を読み返しながら、そう言えば当時の私(安岡孝一)は、2π/48の回転行列をZ80で作りたかったが断念した、ということを思い出した。とっくの昔にあきらめた夢のはずだが、今の私ならどうするだろう。

sin(2π/48)を2進数表記すると0.00100001011010100010…、tan(π/48)を2進数表記すると0.00010000110001110111…、どちらもスジの良くないビットパターンなのだが、とりあえずsin(2π/48)≒67/512, tan(π/48)≒67/1024あたりで、Paethの回転アルゴリズムを使ってみよう。

13742732 journal
日記

yasuokaの日記: Z80における「手抜き」回転行列のさらなる改良 2

日記 by yasuoka

昨日の日記の読者から、Alan W. Paethの「A Fast Algorithm for General Raster Rotation」(Proceedings Graphics Interface '86 / Vision Interface '86 (May 1986), pp.77-81)という論文をお教えいただいた。以下の3つの三角行列の積で回転行列をシミュレートする、という優れモノで、かなり速い上に誤差が小さい。

 ┌ 1 a ┐┌ 1 0 ┐┌ 1 a ┐ _ ┌ cosθ -sinθ ┐
 └ 0 1 ┘└ b 1 ┘└ 0 1 ┘  ̄ └ sinθ  cosθ ┘

13742466 comment

yasuokaのコメント: Z80における「手抜き」回転行列の改良の計算誤差 (スコア 1) 9

by yasuoka (#3496635) ネタ元: Z80における「手抜き」回転行列の改良

以下のプログラムを作ってみて、IX=6400H,IY=0000Hから回したところ、434回よびだしたところでIX=BF73H,IY=B251Hとなって、誤差が1%を超えました。sinθ≒1/8が190回だったので、まあまあ良くなってるんですけど、分数部8ビットだと「もう一声」かなぁ…。

DD E5 PUSH IX
FD E5 PUSH IY
06 02   LD B,2
E1     POP HL
7C      LD A,H
2F     CPL
5F      LD E,A
CB 2B  SRA E
07    RLCA
4F      LD C,A
9F     SBC A,A
57      LD D,A
19     ADD HL,DE
59      LD E,C
78      LD A,B
06 03   LD B,3
CB 2C  SRA H
CB 1D   RR L
10 FA DJNZ -4
D9     EXX
47      LD B,A
10 E7 DJNZ -23
FD 19  ADD IY,DE
E5    PUSH HL
D9     EXX
EB      EX DE,HL
FD 19  ADD IY,DE
D1     POP DE
B7      OR A
ED 52  SBC HL,DE
EB      EX DE,HL
DD 19  ADD IX,DE
C9     RET

13741419 comment

yasuokaのコメント: Re:sinθ=1/128 はどうでしょうか? (スコア 1) 9

by yasuoka (#3495867) ネタ元: Z80における「手抜き」回転行列の改良

えっと、イマイチ良くわからないのですけど、32767/32768って、16ビットじゃほとんど計算できない気がするのです。すみません、整数部と分数部に何ビットずつ使う実装を想定してるんでしょうか?

13741399 comment

yasuokaのコメント: Re:sinθ=1/16とすると (スコア 1) 9

by yasuoka (#3495849) ネタ元: Z80における「手抜き」回転行列の改良

k=9の場合ですね。これ、4ビットシフトを無理矢理

7C         LD A,H
07       RLCA
9F        SBC A,A
E5       PUSH HL
21 01 00   LD HL,1
39        ADD HL,SP
ED 67     RRD
2B        DEC HL
ED 67     RRD
E1        POP HL

でやってみようとしたり、結構たのしく考えたんですけど、ちょっと回転量が小さすぎて、結局k=7の方を採用した覚えがあるのです。

13741312 journal
日記

yasuokaの日記: Z80における「手抜き」回転行列の改良 9

日記 by yasuoka

一昨日昨日の日記を読み返していて、これ、今の私(安岡孝一)だったら、sinθ≒1/8じゃなくて、sinθ≒511/4096にしちゃうんだろうな、と思えてきた。その方がcosθ=127/128に近いからだ。

 ┌ cosθ -sinθ ┐  ┌ x ┐
 └ sinθ  cosθ ┘  └ y ┘

ただ、sinθ≒1/8に比べると、sinθ≒511/4096はインパクトが弱いし、何よりプログラムが長くなる。HLレジスタのHレジスタに符号付整数、Lレジスタに256を分母とする分数が入っているとすると、511/4096の乗算は

13740855 journal
日記

yasuokaの日記: Z80における「手抜き」回転行列の計算誤差

日記 by yasuoka

昨日の日記に対して、計算誤差はどうしたのか、という趣旨の御質問をいただいた。私(安岡孝一)の記憶が確かなら、何もやってなかった気がする。どのくらい誤差が出ていたのか、ちょっと確かめてみよう。

 ┌ 127/128  -1/8   ┐  ┌ x ┐
 └   1/8   127/128 ┘  └ y ┘

画面中心を(0,0)とするxy座標系において、cosθ=127/128, sinθ≒1/8の回転行列を用いて「手抜き」回転をおこなう。対象とするCPUがZ80なので、IXレジスタにx座標(上位8ビットが符号付整数、下位8ビットが256を分母とする分数)を、IYレジスタにy座標を入れることにすると、当時の私が組んだプログラムは、だいたい以下のような感じである。

13739653 journal
日記

yasuokaの日記: Z80における「手抜き」回転行列 4

日記 by yasuoka

ネットサーフィンしていたところ、このtweetで35年ほど前の悪行がバラされてしまっていたので、当時の記憶を辿りつつ、ざっと書いてみようと思う。

 ┌ cosθ -sinθ ┐  ┌ x ┐
 └ sinθ  cosθ ┘  └ y ┘

画面中心を(0,0)とするxy座標系において、適当な微小角度θで回転をおこないたい。θの値は、まあ何でも良くて、とにかく見た目が「回って」いる雰囲気を出したい。ただ、対象とするCPUがZ80なので、乗算は自分で実装するしかなく、そのあたりの「手抜き」を考える。

13728947 comment

yasuokaのコメント: 『和英語林集成』第3版と『日本大文典』 (スコア 1) 3

by yasuoka (#3487738) ネタ元: 島津製作所の「dzu」と標準式ローマ字

『和英語林集成』第3版(1886年)が「zu」を採用したので、まあ、その影響が大きいんだろうと思うのです。一方「dzu」という表記自体は、João Rodriguesの『日本大文典』(1604年~1608年)にも出てくるのですが、この頃は「zzu」という表記も見られるので、なかなかにヤヤコシかったりします。

13727848 journal
日本

yasuokaの日記: 島津製作所の「dzu」と標準式ローマ字 3

日記 by yasuoka

私(安岡孝一)の9月20日の日記「島津製作所の考えるQWERTY配列の歴史」の読者から、Shimadzuの「dzu」に関するコメントをいただいた。とりあえず、島津製作所の沿革のページを見てみよう。

ローマ字の綴り方には、ヘボン式、訓令式、日本式、標準式(別名:修正ヘボン式)の4つがあります。現在国によって公式に認められているのは、このうちの、訓令式、日本式、標準式の3つです。 島津の「づ」は、ヘボン式、訓令式、日本式ではzuとなりますが、標準式ではdzuとなります。3種類の公式表記法のうち標準式が最も欧米語になじみやすいところから、英字新聞などでは古くから標準式が使われており、当社の社名にも当初からdzuが採用されて今日に至っています。

typodupeerror

Stableって古いって意味だっけ? -- Debian初級

読み込み中...