FORM,WICS,GAME,TL/1..8ビット機の独自言語
とりあえず屏風から出さずに虎退治を語ってても仕方がない。
TL/1は、UCSD Pascal買えない・CP/M買えない、当時の小僧達が
再帰呼び出しの凄さを思い知れただけじゃないかと。
(俺はαβ枝刈りがNegaMax形式になってビックリした)
モティロン、たらい回し関数が帰ってこなかったり、VRAM化けたりもビックリ。
確かこんなコードが落ちるんじゃなかったか>TL/1(Z80)
自信ないけど
VAR I;
VAR SUMH, SUML;
SUML := 0; SUMH := 0;
FOR I := 1 TO 100 DO
BEGIN
SUML := SUML + I; SUMH := SUMH ADC 0;
END;
が
IXをスタックフレームにしたら
LD A,#0; LD (IX+_SUML),A
LD A,#0; LD (IX+_SUMH),A
LD A,#1; LD (IX+_I),A
_1:
LD A,(IX+_I); CMP A,#100; JNC _2
LD A,(IX+_SUML); ADD A,(IX+_I); LD (IX+_SUML),A
LD A,(IX+_SUMH); ADC A,#0; LD (IX+_SUMH),A
LD A,(IX+_I); INC A; LD (IX+_I),A
JMP _1
_2:
アセムブラ怪しくてスマヌ
8bit浮動小数点(1bit符号+3bit指数部+4bit仮数部)フォーマットつーのもあるみたいだから
世が世ならレイトレぐらいできたかもな>TL/1
>>359 そのZ80コードじゃ1から99までしか足さないけどいいの?
ツーか問題なく_2: までフツーに処理して抜けると思うがどこで「落ちる」って
言いたいのかわけわからん。
>こんなコードが落ちるんじゃなかったか
「こんなソースコードを書くと暴走(又は無限ループ)するんじゃなかったか」
と解釈するのが普通。
どうやら
「こんなコードを出力するんじゃなかったか」
とでも言いたかったようではあるが。
一般人・ライトユーザの集まりでならともかく
こんなスレでくらい出力することを落とす/落ちる/吐くあたりの表現で通じていいと思う
「コードが落ちる」じゃ通じないよ
でコンパイラどこで落とせばいいの?
366 :
359:2014/12/29(月) 14:43:05.04
そーか、「コンパイラがコードを落とす」って通じなかったか、スマヌ。
>そのZ80コードじゃ1から99までしか足さないけどいいの?
あー、1足りなかったか。
でも本家のFORループは、も少し複雑だった気がする。
これだと
FOR i :=0 TO 255 DO
などの時の処理が出来ないから。
いやいやコンパイラ絡みの話をしたい人になら通じると考えて当然でしょ…
「(こういうソースを書くと)こういうコードに落ちる」なら通じはするが
「コードが落ちる」は変。クラッシュの意味にしかならない。
ソースをコンパイラがコードに落とす
コードをデコンパイラがソースに、、、なんだろ?
>>366 > そーか、「コンパイラがコードを落とす」って通じなかったか、スマヌ。
自分の投稿見直してみ
起こすでいいんだろうか?
小房の頃「言葉のきまり」って授業あったよね
374 :
366:2014/12/29(月) 19:37:55.51
ソースコードを生成するコンパイラじゃ無いから、
バイナリを逆アセンブルしたらこんな感じになった気がする。
に訂正しておく。ごめんねいろいろ。
お、すげえレスが増えてると思ったら...
まあ冬休みだしね
そいや、TL/1の6502版の実装って、スタックフレームどうやってるんだ?
引数と変数領域は自前で管理か?
TL/1 AppleII版は作者が中学生だか高校生だかじゃなかったか?
>>377 覚えてないけど、ゼロページにフレームポインタを割り当てて
LDY #ARGA
LDA (0),Y
とかでアクセスすればいいんじゃないかな。
Z80でもTL/1が8ビットなのを考えると、引数を積むのにPUSH(16ビット単位)が使えないし、
スタックを使うメリットはあんまり無いような気もする。
>Z80でもTL/1が8ビットなのを考えると、引数を積むのにPUSH(16ビット単位)が使えないし、
使えないわけはない
>>380 Z80だとバイト単位でのPUSHは出来ないよw
上位バイト無視とかだとメモリの無駄が多すぎるし。
>使えないわけはない
まー引数を60個近く渡すバカも居ないとは思うが
6502ユーザーからしたらスタックの1バイトは血の一滴以上だからもったいないっちゃもったいない
>Z80だとバイト単位でのPUSHは出来ないよw
;AをPUSH
PUSH AF
INC SP
>>383 PUSH AFは2バイトPUSHしとるがな
1バイトのPUSH命令はあるの?
そうやって複数命令使ってもいいことにするなら
たいていの「できないこと」は無いことになってしまうな
>そうやって複数命令使ってもいいことにするなら
>たいていの「できないこと」は無いことになってしまうな
プログラミングって複数命令を組み合わせる作業だけど何言ってんの??
>>379「引数を積むのにPUSH(16ビット単位)が使えない」
>>380「使えないわけはない」
>>381「Z80だとバイト単位でのPUSHは出来ないよw」
使える|使えない という話に対して「出来ない」とか言い出した
>>381がアフォ
>>382 >まー引数を60個近く渡すバカも居ないとは思うが
「引数を60個近く」って何の話?
>6502ユーザーからしたらスタックの1バイトは血の一滴以上だからもったいないっちゃもったいない
貧乏CPUのユーザーの話はZ80は関係ないのでは?
お前、35年前の俺だろ?
ワラタ。昔の俺じゃしょうがない
いや、35年前の俺なら「貧乏CPU」などとは言うまい。
ファミコンが出るまでは、なんつーの?「ヤナセの外車」のイメージ>6502
車に興味がないので
「ヤナセの外車」という例えがわかりません・・(´・ω・`)
本国の3倍の値段でぼったくる悪徳輸入業者ってイメージしかないなw
>>391 ファミコンは、コアが6502互換なだけで、ブツはリコーが開発した、今で言うSoCの走りのようなカスタムチップだったような。
>>383 それならHLをフレームポインタにして
DEC HL
LD (HL),A
の方が良いな。
>>395 バイト単位でのPUSHが出来るかどうかって話でしょ
>>395 2バイトのPUSHが混在することは目に見えてんのに馬鹿なの?
>>396 バイト単位でのPUSHは出来ないのが明らかで、
それでもコンパイラの実装として、
>>383のようなコードを使う意味があるかどうかの話だと思うけど。
> バイト単位でのPUSHは出来ないのが明らかで、
DCX SP
LXI H,0
DAD SP
MOV M,A
フツーにできるのでは?
>
>>383のようなコードを使う意味があるかどうかの話だと思うけど。
・1バイトのPUSHをしたい局面では意味はあるんじゃないの?
お前らわざとやってんだろ〜
PUSHができてもPOPができなきゃ意味ないような…
コンパイラ的には関数にパラメータ渡すだけなら、PUSH(つーか積むだけ)が実装出来ればよくて
返ってきた後は、SPを戻すのよ。
PUSH 引数2
PUSH 引数1
CALL 関数
LD HL,引数全部のバイト数
ADD HL,SP
LD SP,HL
とか
>>402 TL/1のZ80はpascal呼び出しだったかもしれん。忘れた。
PUSH arg2
PUSH arg1
CALL func
次の処理
--
func:
;なんかした後
POP DE ; CALL元をDEに
LD HL,引数全部のバイト数
ADD HL,SP
LD SP,HL
EX DE,HL ; CALL元に返る
JP (HL)
Z80ってSPが奇数だと読み書きにwaitが入るんだっけ?
>Z80ってSPが奇数だと読み書きにwaitが入るんだっけ?
そう思った理由が知りたい
8086は4クロック(?)追加だからねぇ。勘違いしたのかも。