まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

Z8000のエンディアン調査 →ビッグエンディアン

 Z8000のエンディアンはどうなっているのか気になったので調べてみた。電脳伝説さんのSBCZ8002があるので簡易モニタを利用して確認した。

 Z8000のレジスタは以下のとおり。

スクリーンショット 2020-02-28 23.59.52

 基本は16bit幅の汎用レジスタR0〜R15で、R0〜R7は8bit幅のRH0〜7、RL0〜7で上位/下位バイトをアクセスできる。RR0,2,4,6,8,10,12,14は32bit幅のレジスタで16bit幅のレジスタをペアで使う。RQ0,4,8,12は64bit幅の4レジスタペアでこれは直接メモリアクセスはできず、乗算や除算で使用する。

 レジスタの指定は4bitで、どの幅のレジスタ(RH/RL,R,RR,RQ)を使うかは命令によって決まる。
Z8000regassign

 こんな感じで自分の直感とは違っていたのでハンドアセンブルで間違えたのよね。
 RH0~RH7 → 0~7 / RL0~RL7 → 8~15 でした。

 ではエンディアンの確認方法。メモリ上の8100H番地より4バイトのデータを置き、これを元データとする。
(1) 4バイトのRR0にロードし、8108H番地からRH1,RL1,RH0,RL0の順に1バイトずつストア。
(2) 4バイトのRR0にロードし、810CH番地からR1,R0の順に2バイトずつストア。
(3) 2バイトのR0にロードし、8104H番地からRH0,RL0の順に1バイトずつストア。
91F0 PUSHL @R15,RR0
91F2 PUSHL @R15,RR2
2102 8100 LD R2,#8100
2103 8108 LD R3,#8108
1420          LDL RR0,@R2
3231 0000 LDB R3(0),RH1
3239 0001 LDB R3(1),RL1
3230 0002 LDB R3(2),RH0
3238 0003 LDB R3(3),RL0
3331 0004  LD R3(4),R1
3330 0006 LD R3(6),R0
2103 8104 LD R3,#8104
2F20 LD R0,@R2
3230 0000 LDB R3(0),RH0
3238 0001 LDB R3(1),RL0
95F2 POPL RR2,@15
95F0 POPL RR0,@15
9E08 RTS
 前後でレジスタをスタックに保存してます。実行結果はこのとおり。

Z8000-IXUN

 'UNIX'の文字列をロードしてRR0の上位から1バイトずつストアしたら'IXUN'となった。R0は上位バイトがRH0で下位バイトがRL0なので、16bit幅に関してはビッグエンディアンとなる。

 ここで残る疑問が。RR0はR1:R0なのだろうかそれともR0:R1なのだろうか?R1:R0ならばPDP-11とも異なるmiddle endianとなり、R0:R1ならば正真正銘のビッグエンディアンとなる。RQ0についても同様。
仕様書を読んでみてもRR0のペアの順番について明確に書いてあるところが見つかりませんでした!!いかがでしたか!!
 これについてはレジスタペアを使った演算をやってみて確認する予定。次回につづく。

追記:レジスタペアについて調査。以下のとおり上位から小さい番号のレジスタ順に並びます。
32bitレジスタRRのペアは RR0 = R0:R1
64bitレジスタRQのペアは RQ0 = RR0:RR2 = R0:R1:R2:R3

以下は確認コード:
93FA PUSH @15,R10
91F4 PUSHL @R10,RR4
91F6 PUSHL @R10,RR6
210A 8100 LD R10,#8100
8D48 CLR R4
8D58 CLR R5
8D68 CLR R6
8D78 CLR R7
2105 0123 LD R5,#0123
1904 4567 MULT RR4,#4567
33A4 0000 LD R10(0),R4
33A5 0002 LD R10(2),R5
33A6 0004 LD R10(4),R6
33A7 0006 LD R10(6),R7
1406 0123 4567 LDL RR6,#01234567
1804 1122 3344 MULTL RQ4,#11223344
33A4 0008 LD R10(8),R4
33A5 000A LD R10(A),R5
33A6 000C LD R10(C),R6
33A7 000E LD R10(E),R7
95F6 POPL RR6,@R15
95F4 POPL RR4,@R15
97FA POP R10,@R15
9E08 RTS
 32bitレジスタペアのRR4について、R4:R5と仮定しR4=0,R5=0x0123を設定、MULT命令で即値0x4567を掛けてRR4に保存。その後8100Hから2バイトずつR4,R5,R6,R7を書き込む。乗算の結果0x004ee415がそのまま見えるので32bitペアの順序は仮定どおり。
 64bitレジスタペアのRQ4について、RR4:RR6と仮定しRR4=0,RR6=0x01234567を設定、MULTL命令で即値0x11223344を掛けてRQ4に保存。その後8108Hから2バイトずつR4,R5,R6,R7を書き込む。乗算の結果0x00137e8562dff45cがそのまま見えるので64bitペアの順序は仮定どおり。
検算はgawk --bignum 'BEGIN{printf "%lx ",0x12345678*0x11223344}' などなど。

Z8000-MULT


 ということでZ8000のレジスタペアは上位側が小さい番号であり、メモリアクセスはビッグエンディアン。

 さて、以上のことはソフトウェア側から見た話であり、ハードウェアでメモリのセレクトを見るとアドレスラインのA0=0のときに奇数アドレスとなるのでバイト単位で入れ替わるという話になります。ややこしいですね。


6805の開発環境とHD68P05V07

 私もHD68P05V07を持ってるのでまねして作ってみました。

ボードは電脳伝説さんの秋月C基板サイズのものとほぼ同じで、セラロックが載せられるようちょっと変えている程度です。

202002a

202002b

 さて開発環境だけれども、ROMライタなどはWindowsしかサポートしていないものが多い。一方アセンブラなどは自分で修正してビルドできるようなものが都合が良いのでunix環境が望ましい。ということでWindows10+wsl(Ubuntu18.04LTS)の組み合わせで一台のPC内で完結できるよう探してみた。

8ビット68系のアセンブラ

これをwsl上でmakeする。
$ git clone https://github.com/JimInCA/motorola-6800-assembler
$ cd motorola-6800-assembler
$ make
これで./bin以下に各種アセンブラが用意された。6805用のアセンブラはas5。

HD68P05V07でHELLO,WORLD(電脳伝説)内にあるhello05.asmのソースを持ってきてアセンブルしてみる。
$ ./bin/as5 hello05.asm
エラーがでるが、これは TST X を TSTX と書き直せばよい。この程度の修正はわかると思います。
アセンブル後はSレコードフォーマットのhello05.s19というファイルが生成される。これをobjcopyを使って手持ちのROMライターで扱えるIntel HEX形式に変換する。
$ objcopy --input-target=srec --output-target=ihex hello05.s19 hello05.hex
変換したhello05.hexをWindows10上に持ってくる。Windows10の1909アップデートを適用している場合は、エクスプローラから\\wsl$でアクセスできる。
 こうしてWindows上に持ってきたhello05.hexをROMに焼く。4Kバイトの2732Aではそのまま、32KバイトのAT28C256では0x7000のオフセットを付けて末尾の4Kバイトの位置に書き込む。

202002c

 さて動作だけれども"HELLO,WORLD"と表示すべきところが"H"のみ表示。その後キー入力のエコーバックはできるため残りの文字列表示がすっぽ抜けている。
 4MHzの水晶振動子と4MHzのセラロックは動作OK。2732A搭載時の電流は約100mA、AT28C256搭載時は約80mA。

 まだHD68P05V07の謎は残るけど8bit68系のアセンブル環境はこれでできた。

 Amsterdam Compiler Kitというのがあってこれは各種高級言語がコンパイルできてターゲットもZ8000や6502とあるのだが肝心のクロスアセンブラの使い方がよくわからない。引き続き挑戦中だけどどなたかわかりましたら教えて下さい。

FM-11 ディップスイッチの設定

 意外とFM-11のDIP-SW情報はWebで検索しても見つからないそうなので。

83HM-000171-3 FM-11ユーザーズマニュアルAD2+システム解説より。

2020FM11DIPSW


表はこちら。

スクリーンショット 2020-02-03 23.25.55


スクリーンショット 2020-02-03 23.37.51


 さてFM-11だがいまは家のどこかで眠っている。重いから高いところには置いていないはず。むかし会社で引っ越しの時2階から落としてしまったけど動いたとか聞いた。


Arduino MEGA用ブレッドボードシールド

 はんだ付け不要のかんたんな工作です。

 ブレッドボードの片側の電源ラインを外すとArduino MEGAサイズにぴったりだったのでピンソケットを側面に接着してブレッドボードシールドを作りました。

 ブレッドボードは出っ張り部分をカッターナイフで削り、ピンソケットをセメダインスーパーXなどで接着。ピンソケットは10Px1、8Px5。それだけ。

2019BB1

2019BB2

2019BB3




PET2001NのVRAMまわりを読む

 今回はPET2001の回路図を読むだけです。対象は主記憶にDRAMを使っているPET2001N。



 VRAMは40x25文字を表示するので1Kバイト、6114(2114) 1Kx4bitを2個使っている。VRAMはCRT表示のためのリードとMPU 6502からのリードライトがある。

 図は6114の片方だけ:
スクリーンショット 2019-09-01 18.57.27

 その二種類のアクセスはLS157で切り替え。切り替えのためのS入力は1MHzのCLK1。HでMPUからのアクセス、LでCRT表示のアクセスを行っている。サイクルスチールですね。


 74LS157はSA2~SA9を切り替えるためにあと2個ある:
スクリーンショット 2019-09-01 18.58.05


 さて、PET2001には外付けでPCG(Programable Character Generator)がHAL研究所から出ていたのだが、どのような仕組みだったか資料が見つからないので想像する。VRAMは8bitで256種類のキャラクターを表現できるが、PCGで定義したキャラクターかどうかを切り替えるためには最低1bitの属性を増やさなければならない。VRAMとして使っている6114はソケット実装なのでこれを外して*CS信号で切り替えるようにすればよさそう。CRT表示の回路から見てもそのままbit数を増やしたように見えるはず。
 MPUからのアクセスについてはVRAMのアドレス空間を倍に拡張し読み書きできるようにすればよい。LS157はソケット実装ではないのだが、同等の回路を別に作ってやればアドレス1bit分を拡張して
先程の*CSで切り替えるようにすればよい。
 残りはCGROMとPCGのキャラクタ定義に使うRAMの切り替えおよび読み書きだがこれは別途。

 MPU周りを読んでいくと特にプロセッサのサイクルを伸ばしたりウェイトをかけたりする部分が見当たらない。DRAMのリフレッシュもまた裏のサイクルで行っているように思える。



JOYPET(ジョイペット) 天然成分消臭剤ネコのフン・オシッコ臭専用 270ml
B000FQSHK4
5つ星のうち4.0
¥ 529

SANNO Primary Compter 84S(SORD M5 Jr.)にビデオ/オーディオ出力端子をつける

 m5 Jr.にビデオ出力端子を取り付ける(RETROPC.NET)をやってみただけの記事です。

 基板右上のRFモジュレータ近辺。R4左端にVDP TMS9918AのCOMVID出力(36PIN)、すぐ下のR3左端はGND。RFモジュレータの左端の端子はSN76489のAUDIO OUT(PIN7)。GNDは下のCC3電解コンデンサあたりから。
2019SANNO-01


2019SANNO-02

 カセットI/FとRF切り替えの小基板の上にエポキシ系接着剤で固定できるようケースを削る。これはいい感じにできたと思ったら

2019SANNO-03

 上のほうの削り方がへたくそだった。
2019SANNO-04

 これで3.5mmステレオプラグ-RCAピンプラグのケーブルを使用するとAV出力が使えます。

 一部のディスプレイで音にノイズが乗るのでSN76489のオーディオ出力直出しはいいんだっけかと調べてProgress on Audio (BMOW)を参考に330μF-10Ωを付けてみました。これはノイズ対策ではないので結果としては変わらず。ビニール線ではなくシールド線を使ったほうがいいのかも。

2019SANNO-05



SANNO Primary Computer 84S(SORD M5 Jr.)基板写真

 SANNO Primary Compter 84S。外観からわかるようにSORD m5 Jr. 。海外ではSORD M2 Computerという名前らしい。

2019SANNO-a

 底面のラベル。産業能率大学が販売してたようだ。なので、サンノープライマリーコンピューターと読むのかな?SANNOの後継シリーズはMSX。

2019SANNO-b


 キーボードは上部2箇所のツメで固定されているのだが……

2019SANNO-d

 強力な両面テープで貼り付けてあった。底面のネジ3個を外せばカバーを外せる。

2019SANNO-e

 内部。かなり余裕がある。スイッチング電源を内蔵している。

2019SANNO-c

 メインの基板。基板名はM2C-01A。プリンタインターフェースの端子はない。

2019SANNO-f

 メイン基板裏面。ジャンパはない。

2019SANNO-g

 SRAMはHM6116が2個で4Kバイト。HN61364PはマスクROM。

2019SANNO-h

 RFモジュレータのチャンネルを切り替えるスライドスイッチとカセットインターフェースのジャックを載せた小基板。右側はRFモジュレータ。カセットのモーターを制御するリレーはない。

2019SANNO-i

 スイッチング電源。

2019SANNO-j


 さて、内蔵しているIPL ROMはSORD M5(TAKARA ゲームパソコンM5)と違いはあるのだろうか。簡単なチェックサムを取ってみた。結果は一致。IPLROMの内容は同じものと思われる。

2019SANNO-l

タカラ ゲームパソコンM5(SORD M5) 基板写真

SORD M5(OLD COMPUTERS.COM) ←これによるとチェコスロバキアではやったと。

タカラ ゲームパソコンM5はキーボードの色がSORD M5と違って青っぽい。手前の底面3ヶ所のネジを外すと簡単に分解できる。黄色い部分のカバーははめ込んであるだけ。

2019TAKARAM5

 シールドをはずしたところ。シンプルですね。ROMカートリッジははんだ面が手前になる。

2019TAKARAM5a


 基板名はM5C-01。空きエリアにROM用のソケットをはんだ付けしたのは気の迷いですので以降無視してください。

2019TAKARAM5c

 裏面。

2019TAKARAM5d

 ビデオ・オーディオ出力、キーボードのコネクタ、カセットI/F用のリレーなど。

2019TAKARAM5e

 CPU Z80A(LH0080A)とカスタムICのSORD GA015。GA015がアドレスデコード全般を担っているおかげで部品点数が少なくなっている。GAはたぶんゲートアレイのこと。

2019TAKARAM5f

 プリンタI/F、カセットI/F、電源コネクタ、カートリッジスロット、IPL ROM。

2019TAKARAM5g

 IPL ROMの下に2Kx8のSRAMが2個。その左にSN76489。CPUの下はZ80 CTC(LH0082A)。

2019TAKARAM5h

 VDP TMS9918Aと16Kx1のDRAM 8個。VRAM。

2019TAKARAM5i

Další z mnoha BlogůにあるSORD M5の回路図だとTMS9918A(コンポジット出力/60Hz)のかわりにTMS9929A(コンポーネント出力/50Hz)があってその出力に多数の回路が付いているがこれは海外仕様かな?

2019TAKARAM5l


SORD M5 ROM/RAM EXPANDER(ROMカートリッジの改造)

 SORD M5のROMカートリッジの基板を見ていると空いたパターンに部品を実装したら簡単に拡張できそうな気がするのでちょっと考えた。BASIC-Gは16Kバイトなので2764を1個にするより27128あたりで載せられそう。そうすると空いたROM1の場所に32KバイトRAMを実装できるんじゃないか?ではデコーダをどうするか。TTL 1個でできるか?

 ROMのCSはROMCS0(2000-3FFF)、ROMCS1(4000-5FFF)の2つだが同時にアサートされることはないのでXORで2000-5FFFの16Kバイトをセレクトできる。A13をスイッチで反転することで16Kバイトの前半と後半を入れ替えて8KのROMイメージを切り替えられるようにする。A14,A15はROM 27128/27256/27512内のイメージを選択できるようにする。SRAMについてはA15を反転して*CSに与えることで8000-FFFFにマップする。これが74LS86(74HC86) 1個でできた。
SORDM5_2019-08-14 00_22_39

 LS86をLS139の空きパターンに実装する検討。GND側に寄せてICソケットのピン上げ、基板の上側と下側で配線。パターンカットと部品面/半田面へ配線を渡す穴も必要。
2019SORDROM0


 さて改造。基板上ROM0,ROM1,LS139の端子部分のハンダを抜き、ROM0に実装されているBASIC-IのROMを外す。私はカプトンテープで周囲を保護してからハンダ取り外しキットの低融点はんだで外しました。
2019SORDROM1

 部品面での配線カット。
2019SORDROM2

 ハンダ面での配線カット。
2019SORDROM3

 ここまでやってからROM0,ROM1にソケットを実装し、カットした配線をジャンパ線で戻して動作確認。
2019SORDROM4

 このBASIC-Iカートリッジは動かないという説明のTAKARA M5と同時に入手したのですが、このカートリッジ上で*WEとA12がどこかでショートしてました。*WE近辺をカットして動作。

 LS86を実装するための準備。カプトンテープでソケットの端子と基板を分離、パターンカット、配線を逃がすためのバカ穴あけ。
2019SORDROM5

 こんな感じの立体配線に。
2019SORDROM6

 先にSRAMの方を配線し、BASIC-IのROMを起動すると本体内蔵の4K+32K=36Kバイトを確認できます。
2019SORDROM7

 さてA15/A14/A13RでROMイメージをセレクトするスイッチですが、SRAM 6116の空きパターン上に基板を重ねて実装することに。写真右下にバカ穴。ここからA15/A14/A13Rの信号線を引き出し。
2019SORDROM8

 できました。
2019SORDROM9

2019SORDROM9R

 思ったとおりにいったので満足度は高いのですが、プリント基板を作製できるスキルのある方はそちらが楽だと思います。また、BASIC-Fはイメージが20Kバイトなのでこの改造では動作しません。おそらくカートリッジ基板が異なると思われます。




goot はんだ吸取器 GS-108
B0016V5KHU
5つ星のうち3.4
¥ 964


サンハヤト 表面実装部品取り外しキット SMD-21
B00J7LER02
5つ星のうち3.9
¥ 5,103


SORD M5 ROMカートリッジ調査

 SORD M5のROMカートリッジについて。

 基板上にM5E-00の文字。レジストなしの両面基板。SRAM 6116(2Kx8)のパターンが2つ、ROM 2764(8Kx8)のパターンが2つ、16pinのTTL、RAMのアドレスデコード用74LS139のパターンが1つ。
2019SORDM5ROM1

右の方からRAM0、RAM1、ROM0、ROM1と呼ぶことにする。BASIC-IやゲームのROMはROM0に直接はんだ付けされている。これはBASIC-Iの写真でROMのラベルにはM5 BA4と書いてありますね。
RAM0の*OE(SRAM/ROM共通)は471(470pF)のコンデンサでGNDに接続してある。信号のタイミングを遅くして調整しているのだろうか。

BASIC-Gカートリッジ内部構成(RettoPC.net)を参考に見ていくとBASIC-Gも同じ基板。ただし16KバイトあるのでROM0/ROM1を使用し、SRAMも4Kバイト分実装している。

RAMのアドレスデコードは以下のとおり。
SORDM5_2019-08-13 22_52_41

 カードエッジの端子は以下のとおり。ただし必要のない*IORDなどは端子ごと削除されている。

スクリーンショット 2019-08-13 23.01.03


 次回はSRAMを32K、ROMを512Kからソフトを選択できるよう改造します。

記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ