【CPU】8080やZ80ってリロケータブルなプログラム書けないよな
■ このスレッドは過去ログ倉庫に格納されています
メモリが絶対番地だから、プログラムを置く位置が常に決まっている。
6800や6501や8086は相対番地も使える。
http://xyz.abc x68000みたく絶対番地をすべて実行時に書き換えればいいだけのこと Z80でもリロケータブルなアセンブラは当時リリースされてたし使ってた 空き地の土管の横1mのところに、、、
・・・ある日土管が撤去されていた 8080…電卓
6800…ミニコン
設計思想の違い 絶対と相対についての知識は、表計算ソフトでも役立つ 相対ロードストアをどうするかだねぇ
インデックスレジスタを使っての相対アクセスはあるけど
インデックスレジスタに入れる値をどうやって持ってくるか あの頃は先端を行ってる気分だったのに、もう何も書けない >>19
そうだな。
フラフラするのは良くない。
ココと決めたらココだよな。 まあ50過ぎだろう。Z80のハンドアッセンブルが出来る世代。 >>24
40代でもいるぞ
というか、そこまでだな
あとはパチンコ・パチスロのメイン基板開発してる奴ら
未だに命令がZ80だし Sinclair ZX81 / Timex computer emulator for iOS
https://zx81-ios.weebly.com Z80のマシン語はシンプルで学習にはいい教材だと思うぞ。
あと、マシン語勉強するといいっていうのはマシン語を勉強する過程でプロセッサの理解が進むからいいって言ってるのであって、
マシン語そのものを丸暗記する必要はないからな。 未だに覚えている命令は
NOP
LD
JP
ADD
SUB
アドレス飛ばすのはなんだったっけ? 前後256バイトまでなら相対ジャンプ命令があったような
できるかできないかで言えばできる 再配置可能プログラム
要はデスクトップでもC:直下でも実行可能 FA分野だと84C015とかZ80コアの仕事は今でも有るでよ NFER XFER
これなんだったの なんでおれの頭に焼き付いてるの? 実行可能形式にラベルテーブル付けてロード時に書き換えるだけ
全部インダイレクトアドレッシングなコードなんてその方が希少 6809だと本当に再配置可能なコードかけた。動かしたことはないけど。 >>44
そういう頓知みたいなコードを書けるのも良さではあるけど、可読性が低下するw
まぁ、容量として力業で解読できる限界が8bitまでなんだろうけど フラグのフリップフロップ制御でX=1-Xってのは感動した 8086の場合はセグメントを使えばリロケータブルという理論 system/370とかスタックないんだよね。fortranとか再帰呼出しできないのはそのへんの事情だと思う。 両方やってみて好きなのは6809だったけどZ80もゲームボーイに採用されたのがデカかったな。色々作ってみてた。 プログラムに使われてるデータを
画像テータとして流用してた8ビット時代のゲーム Z80も相対ジャンプはあります。
ニーモニックは、絶対ジャンプの"JP"に対して、相対ジャンプは"JR"
ただし、マイナス128バイトから、プラス127バイトの範囲しかジャンプできない。
それ以上のジャンプをしたいときは、小細工をする必要がある。 >>44
逆アセンブルしてこのコード見たとき3秒考えてなんちゅうオサレなと思ったわ そもそも、メモリが64Kバイトの空間で、相対ジャンプが必要か?
シングルタスクだから、そもそも複数プログラムをロードする必要も無い。
80系CPUのメジャーOSであるCP/Mは、00hからFFhが、カーネル本体。わずか256バイト。
プログラムをロードするのは、0100hがスタートアドレスという決まりだから、絶対ジャンプのプログラムで十分。
ちなみに、OSのBIOS部分は、もっと後ろのメモリに配置している。 これ位のCPUをゴリゴリハンドアセンブリしてると
全メモリやレジスタが自分の思い通りに動かせる万能感に浸れて楽しいわ 今8ビットで遊びたいならAVR一択
レジスタ多くて楽しい >>35
Z84C015 のセカンドソースってあるんだっけ?
東芝はとうの昔に製造中止だよな。Z80 周辺全部入りで好きだったな。 >>62
S-OS懐かしい
今でもOh!石さんのサイトで各機種用やWin用エミュをダウンロードできるな Z-80は相対ジャンプがあるから限定されるが書けないことはない
ただ割り込み処理とかで絶対アドレスが指定されるからそこは仕方ない 8080やZ80ではアドレス空間を全部RAMにすると走るプログラムとか自殺プログラムなんてのが書けたな
トラ技かなにかに出てた MZでSelf Relocatable Debugger使わせてもらってた >>46
int i =0; で
x86のCコンパイラの吐き出すコードも
確実に XOR EAX, EAX だがな AとAをxorするのはマシン語手書きでもよくやってた
1バイトで済むし処理が速い まーEAXの部分はレジスタの利用状況によって変わるけどな ただフラグを変化させたくない場合はLD A,0とやってたな >>70
相対ではなくPUSHとRETをうまく使ってリロケータブル出来るぜ ちなみにPentium4くらいから
レジスタファイルというのが導入されて
MOV EAX, 0 も1サイクルで実行可能になったけど
やっぱり慣例でXORを使う。 >>81
Pen4クラスでアセンブラ使う気になれんわ
予測分岐などはコンバイラに任せるべきだとおもう M68000ではclrよりmoveqの方が速くて何でだよ、って感じだった記憶
lslで2ビットシフトよりadd2回の方が速かったり
乗除算はビット数が限られてたらmulu、muls、divu、divsよりテーブル参照の方が速かったり
妙な癖というかディジタル回路の実装が読めるような感じだった 素直な疑問なんだけどマシン後勉強してた人たちって今どんな仕事してるの? >>61
Z80の事情は知らないのだけど、相対ジャンプ(-128〜127)なら、ニーモニックの中に1バイトで埋め込むことができるけど、番地を直接、間接にポイントするにはそうはいかないのではと >>86
いろいろやってるぞ
単純な帳票印刷から3DCAD、レジだのカーナビだの工場機械とかコピー機とか 8086系もリロケータブルなプログラム書けなかったけど、メモリー上のどこに置いても実行出来るようにプログラムの保存方法とOSを工夫したんだよね。 >>65
84C015ってAKI-80に載ってたやつだよな
モデムやTNCのファームウェア焼くのにAKI-ROMライター重宝したわ >>1
相対ジャンプはあるけど、
CALLは絶対アドレスだけやな ザイログのアセンブラはわかりにくい
インテルのほうがいい >>61
絶対ジャンプ 3バイト
相対ジャンプ 2バイト
アドレス空間が少ないから1バイトでも節約したい 8bit相対ジャンプだけでプログラムあんまり組みたくねえなあ・・・、あれ遅くならない?
どのアドレスにも再配置可能なサブルーチン作れると便利なんだろうけど たしか絶対ジャンプより必要クロック多かったと思う。 M1コード読み出し4クロック
オペランド読み出し3クロック
JPなら10+PCへの代入
JRなら7+PCを加算器にロードしてオペランド足してPCに代入
加算が入るからトータルでJRのほうが遅くなったんやったかな >>94
デクリメントジャンプノンゼロ、なつかしー >>82
MMXやSSEやAVXの出始めは手書きでインラインアセンブラ使うこと多かったよ
ライブラリが整備されるまで unsigned short a[]={0, 1, 1, 2}, b[]={0, 0, 1, 1}, c[4];
_asm{
movq mm0, a
movq mm1, b
paddw mm0, mm1
movq c, mm0
emms
}
// c の中身は {0, 1, 2, 3} になる
くらいの簡単なパック演算なら手動でも書ける >>93
TNC自作したの?
アマチュア無線でパケットですか paddw mm0, mm1
相変わらず演算命令で第一オペランド上書きするんだよね
退避しないと >>93
AKI ROMライターはRAMを使わずに動くよく出来たプログラムだったな MAIN:
JSR FNC001(PC)
RTS
FNC001:
PUSH HL,DE
LEA TBL001(PC), HL
MOVE.W #$4000,DE
ADD.W 2(HL),DE
ADD.W DAT001(PC), DE
MOVE.W DE,8(HL)
POP HL,DE,PC
こういう風に書けないよな?って事なんだろうと書いてみたレジスタ名だけZ80っぽい擬似コード
うーん、キモい >>61
だからcomモデルは0x0100から実行開始するのか
ちぃ、覚えた >>91
まあ、プログラマやコンパイラが実メモリ空間のことを色々考えなくとも、
自由にメモリアクセスできるようにしたのが仮想記憶の原点でもある。
一応 286 より前でもなんちゃってな仮想記憶は使えたけれど、本格的な
仮想記憶、メモリ管理機構が実装されたのが 286/386世代から。
それぞれのプログラム、プロセスからは実メモリ(のアドレス)を気にする
必要がないので、リロケータブルがどうのこうのなんてどうでもいい。
メモリ管理機構がハード的にない Z80 系でも、純粋にソフト的にやろうと
思えばできなくはないけれど、労力に見合うパフォーマンスが出ない。 究極の8ビットと銘打って出した6809はZ80と比べたらパッとしなかったな
リロケータブルなコードは書けるがSEX命令がどうにも気になって仕方なかった 読んでるだけでなつかしい。
でも、もう何の役にも立たない知識なんだよな。
いまは32コア 64スレッド、32GBメモリ対応CPUとかあるし。 44 からはじまった A レジスタを 0 クリアする話。
46 が頓知みたいなコードという。が、当時の Z80
プログラマにとっては LD A, 0 のほうが頓知的で。
当時逆汗して LD A, 0 なんてのを見ると、
1) ここはフラグを変えたくないのか?
2) 00 のところを書き換える、いけないコードか?
3) 文字データを逆汗しているか?
4) 素人が書いたのか?
5) 書いたのジジイか?
6) もしかして XOR A 知らないバカか?
って考えたもんだ。 0を入れる以外の場合と速度揃えたい時、なんてのはないかな? >>86
コンサルからVBAまで
なんでも任せてくれや >>109
昔TNCのキットを頒布していたサークルがあって、それを
そういえば、そのTNCもZ84C015が載ってるんだった >>121
仮想記憶有るから、リロケータブルで有る必要ないしな。 Z80は裏レジスタやら隠し命令だのあった記憶が
CALL先で裏レジスタ使ってPUSH,POP省くという技
とある会社からZ80用のMMUチップが売られてたが流行らなかったな
64180の方が魅力的だったからか お前らいくつだよ?
ってか現在はC言語でプログラム書いてる組み込み屋? >>44
そのあとZフラグ参照する系の命令があった時に死ぬ奴 ファミべやディスクシステムで6502マシン語、MSXでZ80マシン語、X68000でGCC&HAS
PC98でROM BASIC&マシン語モニタやDOSでデバッガやLSI-C試食版で遊んでたのは
40歳前後でも稀によくある(それら以前となると、若干つらい) >>1
Z80は相対ジャンプできるけど?
8080にはない
そのへんごっちゃになってるようじゃあなあ… c使える話でも、ポインタのやり取りで遅くなるから、いつも番地指定で取得、評価、書き換えの繰り返し >>122
ゼビウスのコードはLD A,0だったらしいな 今時のインテルは
xor eax,eax
mov eax,0
どっちもワンクロックで実行可能 今は、普通にアセンブルなんてしなくなったし
コンパイラ任せだから気にもして無かったわ >>93
MYCALL: (^_^;) に出来るようにとかした。 >>135
今時のマイコンは ゼロクリア命令有る。
MIPSとかは、値が常にゼロのレジスタを用意してる。 >>136
コンパイラのバグにはまる事もあるんだ…
以前に別スレで出ていたが、確か20年位前の LSI-C80 で
static char err = 0;
なコードをコンパイルすると、毎回0クリアするバイナリを吐いたりな。 こんなのもあった。何もかも懐かしい。
SUBR1:DB 3E
SUBR2:XOR A
...
...
AND A
JR Z, LABEL1
...
...
LABEL1:
...
...
オペコード 3E は LD A, n R800は速いZ80としてしか使わなかったな。勿体ない。 たまにお前らのことスゲーって思うことあるけど今がそれだわ
伊達にハゲ散らかしてるわけじゃなかったんだな CPU作れば?って言っても何も無かったな?お前らw そもそもZ80で相対分岐を使うのは速度アップの方が大きかったしな
高級言語でリンカを使うのなら重要でない Z80の条件相対分岐はZ,NZ,C,NCしかなかった。 >>148 絶対ジャンプの方が速かった
JR XX - 12 cycle
JP XXXX - 10 cycle
http://clrhome.org/table/ >>135
xorはフラグ書き換えるからアウトオブオーダーやスーパースカラと相性悪そう パチ台スロ台業界じゃZ80互換の石がバリバリ現役なんでそこの開発に聞け >>155 あーそうだった
JR Z,XX 条件成立 12 cycles, 条件不成立 7 cycles 受験が終わったら68000で原始的ワンボードマイコンでも造りますかね・・・と思ってたらメガドライブが出た。 あとインデックスレジスタ関係の命令のためのコードDD(IX用)あるいはFD(IY用)を前置すると、これらのレジスタを8ビット汎用レジスタ的に使える裏命令があった気がする
命令表には載ってないので正式に使うのはまずかっただろうが 未定義命令ね、HとLの代わりに使ったことあります。
いちおうNECの型番忘れたけど互換CPUでは使えた。 思い出した
Z80はI/O空間256バイトって仕様だけど、裏技使うと64k使えたんだよな
ソニーのSMCがVRAM置いてたような、って調べたらWikipediaのZ80 - I/Oポートのところに書いてあったわ >>163>>164
種というかそのままリフレッシュカウンタを読み出して使うことが多かったんじゃね?時代的に
>>166
X1でそんなんアリ?とか思ったけどシャープはZ80のセカンドソース作ってたから動作保証できる、アリだわなと思った >>168
Z80 (というか Intel系 CPU)は、メモリ空間・アクセスと I/Oのそれが完全に別概念で存在する。
アドレス・データバスは共用だけど、それぞれ ~MREQ、~IORQ という負論理な信号線で、
メモリか I/O かを区別する。 out (c), a (ED 79)
という命令があるけど、実際の動作は
out (bc), a
となり、16 ビット I/O アドレス空間へのアクセスが可能っていう裏技 ■ このスレッドは過去ログ倉庫に格納されています