OSC京都にサークル参加してきました。
FM-7 2台を持ち込んで片方はFM-7の店頭デモを
えんえん流して、もう片方は当時のゲームを
SPIフラッシュメモリアダプタから起動してデモ
しました。
1月と何が違うのかというと当時は市販ゲームなんて
まずまともなもので動くものはないだろうと考えていたので
disk basicから起動するテープをコンバートしたゲームを
動かした程度でしたが、今回は当時の市販ゲームが
いくつか動かせたのと、転送速度が倍速の2キロバイト/秒に
までなったので速度的違和感がかなり減らせて、地味ながらも
改善できてよかった。
全体的な感じはOSCというイベントの性質上かなり異物感は
あるのですが、その分目立てたのか、足を止めていただいた
方にはわりと評判がよかったです。
よくなかったことは、今現在FM-7を動かしている人というのは
やはりかなり変人なのだなあということです。
確かに当時普通に考えるとFM-7でパソコンを始めたとして
カセットからディスクへのステップアップは型落ちのFM-77なり
77AVを買うのが普通だと思うので仕方がないといえば仕方がない
のですが。
進捗がなかったのでほったらかしてました。
十数年前にデジットで買ったロムライタです。
買っただけでおなかいっぱいになっていままで部屋のこやしになっていました。
28ピンまでのrom、27512が焼けるらしいです。googleでこのロムライタcwr-980について検索してもまったく出てこないので、相当マイナーな製品という気がします。
9801用なので、これを動かすためにEPSON PC486SEを起こしました。 最初、思うようにロムを焼くことができなかったのですが、速度を最低に落とすことにより正常に動作するようになりました。どこかにタイミングに依存した部分があるんでしょうね。
例によってファミリーベーシックです。
enri氏のファミリーベーシックの解析の成果から、オペレータ部分の動作をちょっといじって、「PF1」(ハイ)+リターンだけでGAME BASICのメニュー画面までいけるようにしました。また、ファミリーベーシック活用テクニックスレッドの情報をもとに、起動時にメモリを4キロバイト有効としました。
ファミリーベーシックは2.0と2.1をあわせて5つほどあるんですが、今まではずっと2.0をいじってたんですが、2.1の解析資料ということで2.1にしました。
なんのへんてつもないファミベのキーボード。
右端に注目。
インテルhexファイルをパソコンからファミリーベーシックにRS232C経由で流し込むプログラムというのを去年作ったんですが、そのときは信号線だけキーボードから取り出して、外部にレベル変換基板をつけてたんですが、非常に邪魔だったので思い切って内蔵しました。トグルスイッチによって、4069(だっけ?)にテープとRS232Cのどちらをつなぐか設定します。
ついでに、ファンクションキーの初期状態を変更して、ファミリーベーシック起動後すぐにintelヘックスローダが使えるようにしました。今までは暴走させるごとに外部の機器からローダを読み込んでいたのでだいぶリズム良く開発できるようになった気がします。
ローダをロムのどこに置くか悩んだのですが、逆アセンブルしても大意をつかむにいたらなかったので、enri氏の解析の成果にただのりさせていただきました。ほんとうにありがとうございます。
ローダは去年作ったファミリーベーシック汎用のものを開始番地とワークメモリの番地を変更してアセンブルしなおすだけで問題なく動作しました。2.1のロムでは動かしたことがなかったのでひやひやしましたが問題なくてよかったです。
次はいよいよキャラクタramを増設して、独自に定義したパターンをmoveコマンド等で動かせるようにしたいと考えています。
メモリを増設したファミリーベーシックにrs232c経由でパソコンをつないで、
パソコンからインテルhexファイルを流し込むプログラムを作ったので、
あまりにも少ない需要であるのはわかっているのですが、せっかくなので置いておきます。
テープにセーブするなり、romのすみに焼くなりしてつかってください。
ファイルを添付する方法がよくわからないのでそのままコピペです。
そのままソースと使える状態でこぴぺできるんだろうか?
アセンブラはアークピット様のxasmを使用しましたが、まあどうにでもなるんじゃないでしょうか。
;
; fbld1.asm
; ファミリーベーシック用インテルHEXファイルローダ
; Copyright (C) 2011, PuruPoo
;
; ファミリーベーシックキーボードカセット入力(READ)は4069の9番8番ピンを経由して
; $4016のD1につながっていますが、ここにMAX232等でレベル変換したRS232C入力を接続し、
; インテルHEXファイルを読み込みます。
;
; BASICのプロンプトよりCALL &H7E00としてプログラムを実行するとデータ待ち状態に
; なりますので、パソコンなどから4800bpsでインテルHEXファイルを送信してください。
; ロードが終了すればBASICのプロンプトに戻ります。PEEKなどで$7FE1の内容を確認し、
; 0なら正常終了です。
;
; $7E00からアセンブルされていますので、最低限メモリが4キロバイト必要ですが、
; アドレスを変更してアセンブルすれば標準の2キロバイトでも動作するはずですが、
; あまり意味はないと思います。
; オススメはメモリを標準の16キロビット(2キロバイト)・32キロビット(4キロバイト)
; SRAMを256キロビット(32キロバイト)SRAMに交換して若干の配線変更・追加で8キロバイト
; として使用することです。これならばBASICで3キロバイトちょっと、機械語で4キロバイトの
; フリーエリアが確保でき、わりとバランスのよい環境といえると思います。
;
; バイナリは以下の通りで、$FFが続いている場所はだいたいパッチのための隙間です。
;
;7E00:20 40 7E 20 D0 7E 20 30 7E 60 FF FF FF FF FF FF:74
;7E10:AD 16 40 29 02 D0 F9 60 A9 0B 8D E2 7F EA EA CE:9B
;7E20:E2 7F D0 F9 60 FF FF FF FF FF FF FF FF FF FF FF:7F
;7E30:A9 90 8D 00 20 60 FF FF FF FF FF FF FF FF FF FF:3C
;7E40:A9 10 8D 00 20 60 FF FF FF FF FF FF FF FF FF FF:BC
;7E50:A9 00 8D E5 7F 20 10 7E 20 18 7E A9 08 8D E6 7F:A1
;7E60:20 18 7E 20 18 7E A9 01 8D 40 40 AD 16 40 29 02:51
;7E70:18 2A 2A 2A 2A 2A 2A 8D E7 7F AD E5 7F 18 6A 0D:A7
;7E80:E7 7F 8D E5 7F A9 00 8D 40 40 CE E6 7F D0 D1 20:01
;7E90:18 7E 20 18 7E 60 FF FF FF FF FF FF FF FF FF FF:A2
;7EA0:38 E9 30 C9 0A 90 03 38 E9 07 60 FF FF FF FF FF:3A
;7EB0:20 50 7E AD E5 7F 20 A0 7E 18 2A 2A 2A 2A 8D E9:73
;7EC0:7F 20 50 7E AD E5 7F 20 A0 7E 0D E9 7F 60 FF FF:8F
;7ED0:A9 8D 8D EC 7F A9 60 8D EF 7F 20 50 7E AD E5 7F:31
;7EE0:C9 3A D0 7C 20 B0 7E 8D EB 7F 8D F0 7F 20 B0 7E:DE
;7EF0:8D EE 7F 18 6D F0 7F 8D F0 7F 20 B0 7E 8D ED 7F:31
;7F00:18 6D F0 7F 8D F0 7F 20 B0 7E C9 01 F0 57 C9 00:18
;7F10:D0 4E 20 B0 7E 20 EC 7F 18 6D F0 7F 8D F0 7F 18:FF
;7F20:EE ED 7F 90 03 EE EE 7F CE EB 7F D0 E5 20 B0 7E:83
;7F30:8D F1 7F 18 6D F0 7F C9 00 D0 25 20 50 7E AD E5:2F
;7F40:7F C9 3A D0 F6 4C E4 7E FF FF FF FF FF FF FF FF:EE
;7F50:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF:F0
;7F60:A9 02 4C 73 7F 20 B0 7E C9 FF D0 05 A9 00 4C 73:3C
;7F70:7F A9 01 8D E1 7F 60 FF FF FF FF FF FF FF FF FF:6D
;
; 以下ソースリスト
;
org $7e00
LED equ $4040
;CNTRD equ $4044
;CNTRST equ $4045
PPUC1 equ $2000
SIN equ $4016
HALFWAIT equ 11 ;4800BPS
;HALFWAIT equ 25 ;2400BPS
;割り込み停止
jsr disint
;インテルhexロード
jsr ihx
;割り込み再開
jsr enint
rts
ifndef RUN
ds 6
endif
;=====================================================
;
;
;スタートビットを待つ(1->0になるのを待つ)
wtsb lda SIN
and #$02
bne wtsb
rts
;=====================================================
;
;
;カウンタを初期化し指定値まで待つ
wait lda #HALFWAIT
sta wcnth
waitlp1 nop
nop
dec wcnth
bne waitlp1
rts
ifndef RUN
ds 11
endif
;=====================================================
;
;割り込み再開
enint lda #$90
sta PPUC1
rts
ifndef RUN
ds 10
endif
;
;
;
;=====================================================
;
;割り込み停止
;
disint lda #$10
sta PPUC1
rts
ifndef RUN
ds 10
endif
;
;
;
;=====================================================
;
;1文字取得
get1c equ *
;
lda #0
sta sdata
jsr wtsb
jsr wait
lda #8
sta bcnt
lp5 jsr wait
jsr wait
lda #1
sta LED
lda SIN
and #$02
clc
rol a
rol a
rol a
rol a
rol a
rol a
sta ord
lda sdata
clc
ror a
ora ord
sta sdata
lda #0
sta LED
dec bcnt
bne lp5
;ストップビット待ち
jsr wait
jsr wait
rts
ifndef RUN
ds 10
endif
;
;
;=====================================================
;
;
;ASCII -> HEX (1バイト)
;
a2hh equ *
sec
sbc #$30
cmp #$a
bcc a2hhl1
sec
sbc #7
a2hhl1 equ *
rts
ifndef RUN
ds 5
endif
;
;
;=====================================================
;
;16進文字列2バイト取得して1バイトとして返す
a2h equ *
jsr get1c
lda sdata
jsr a2hh
clc
rol a
rol a
rol a
rol a
sta a2hb
jsr get1c
lda sdata
jsr a2hh
ora a2hb
rts
ifndef RUN
ds 2
endif
;=====================================================
;
;
;intelHEXデコード
;
;
;エントリ
ihx equ *
;データ格納用命令初期化
lda #$8d ;sta abs
sta addra
lda #$60 ;rts
sta addrr
;':'確認
jsr get1c
lda sdata
cmp #':'
bne ihxl1 ;':'以外のものが来たのでエラー処理に
ihxl5 equ *
;データ長取得
jsr a2h
sta dlen
sta sum ;チェックサム初期化
;アドレス取得
jsr a2h
sta addrh
clc
adc sum
sta sum
jsr a2h
sta addrl
clc
adc sum
sta sum
;レコードタイプ確認
jsr a2h
cmp #1
beq ihxl6 ;エンドレコードの処理に
cmp #0
bne ihxl1 ;知らないレコードタイプなのでエラー処理に
;データレコード処理
ihxl2 equ *
jsr a2h
jsr addra
clc
adc sum
sta sum
clc
inc addrl
bcc ihxl3
inc addrh
ihxl3 equ *
dec dlen
bne ihxl2
;チェックサム処理
jsr a2h
sta orgsum
; nop
; nop
; nop
; nop
clc
adc sum
; sta sum
cmp #0
bne ihxl1 ;チェックサムが合わなかったのでエラー処理に
;':'待ち
ihxl4 equ *
jsr get1c
lda sdata
cmp #':'
bne ihxl4
jmp ihxl5
ifndef RUN
ds 24
endif
;=====================================================
;
;
;intelHEXデコードエラー処理、エンドレコード処理
;
;
;エラー処理
ihxl1 equ *
lda #2
jmp ihxl8
;エンドレコード処理
ihxl6 equ *
jsr a2h
cmp #$ff
bne ihxl7
lda #0
jmp ihxl8
ihxl7 lda #1
ihxl8 sta ihxres
rts
;=====================================================
;
;変数
org $7fe0
adj ds 1
ihxres ds 1
wcnth ds 1
wcntl ds 1
wc ds 1
sdata ds 1
bcnt ds 1
ord ds 1
smax ds 1
a2hb ds 1
hl ds 1
dlen ds 1
addra ds 1 ;sta abs
addrl ds 1
addrh ds 1
addrr ds 1 ;rts
sum ds 1
orgsum ds 1
usb-blaster化ファームを入れてみた。
asとかpsには対応していないみたいだけど、これはこれで便利。

とりあえずquartus2でちゃんと認識して使えてます。

バッファと

抵抗のみはさんである。
バッファにはシリコンハウスにで買ったTC74VHC9541をつけてみた。
バッファいれたので5Vには対応しているはず。
2.5Vは抵抗入れてるのでいけるのかな?
(2番目の写真が間違ってたのでいれかえ)
コンテック製のpciシリアルカードを見かけたので買ってみたけど、これは敗北。
無償ツールで使えるのはsparntan2からなのね。これはおぼえておかないと。
まあ、100円だったから基板を割ってrs232cレベルコンバータ基板として使おう。
買ってきたまま。

fpgaアップ

解析用にチップを剥がした状態。

これを元にでっちあげた評価ボードの写真もとってきたんだけど、致命的にぼけてるのでまた明日。
カノープスezdv ntscというpciカードが積んであって、
よくみたらaltera acex 1k(ep21k50)という昔の低価格fpgaが載ってた。
昔のものだから性能は低そうだけど、規模的にはデザインウェーブ2007/7付録基板や
デジタルデザインテクノロジ付属基板と同じくらいはありそうに見えるので、
ちょっと買い込んできた。
後で写真とか載せる
itとかよくわからない・・・
さいきん電子工作とかを趣味ではじめたので
ガラクタとかさらしてみようかと思う。