前回、6502CPUのマイコンボードで機械語モニターが動きました。
機械語でプログラミングできる環境ができましたので、LEDチカチカ(Lチカ)させてみたいとおもいます。
68系SBC用のI/Oボード
LEDをつないでチカチカさせるためにパラレルI/O LSIが載ったI/Oボードがほしいところです。こんなこともあろうかと、私の6502マイコンは68系SBCシリーズ SBC6303とほぼ互換のバス端子を装備しておきました。
68系SBCシリーズ用のI/Oボードとしては、オレンジピコさんにTomi9さん作のSBC-IO REV2という68系SBCシリーズ用のI/Oボードがあります。もともとはSBC6800、SBC6809ボードに外部端子アダプタをつけたとき用のボードであります。SBC6303にもパターンカット等すればつながります。
Tomi9さんのBLOGのSBC-IOの説明記事はこちらです。なんともう2年前。いつか作ろう作ろうと思いつつ2年経ってしまいました。
SBC-IOは上記記事を見てもわかるとおり、パラレルI/O(MC6821 PIA)の他に、シリアル(MC6850)、タイマーIC(MC6840)、メモリー(SRAM)と盛りだくさんです。今回、メモリーとシリアルは6502マイコンに搭載済みでしたので、パラレルI/O(PIA)を搭載してみます。
残念ながら手持ちのタイマーIC(MC6840)は正しく動作しなかったので、動作 未確認です。ちょっとした音楽を演奏できたらと思ったのですが….
SBC-IOへの部品組付けとアドレスデコーダー作成
SBC-IOへパラレルI/O(PIA)とタイマーIC(PTM)を組み付けた写真がこちらです。
手持ちのタイマーIC(PTM)が動作しなかったのでちょっと残念ですが、圧電スピーカをとりつける場所に手持ちの圧電スピーカが大きすぎてつながらなかったのでXHコネクタのジャックをとりつけました。
SBC-IOのバスはSBC6303ボードのバスとほぼ一緒ですが、ちょっとちがいます。Tomi9さんのSBC-IO REV2の回路図の抜粋は以下になります。
SBC6303では汎用I/OポートとなっているところにSBC6800/6809 ルーズキット(CPUボード)のアドレスデコーダ(74HC138)の信号線が出ています。
https://sbc738827564.files.wordpress.com/2018/08/sbcio_rev021.pdf
残念ながら、わたしの6502マイコンはアドレスデコーダーを搭載する場所がなくてこの信号線が出ていません。74HCT138 1つあれば作れる回路なので、別基板として作成ました。回路は、SBC6809ルーズキットに搭載されている回路と同じです。アドレスバスA15、A14、A13をデコードします。チップイネーブル端子はそれぞれVcc/GNDへつなぎます。
空いている場所には、そのうち何かを搭載したいですね。
LED点滅プログラムの作成
いままで出てきた基板を組み合わせて、SBC-IOのパラレルI/O(PIA)用外部端子のAポート側にLEDを接続してみます。
SBC-IOの回路図を見るとわかりますが、PIAの外部端子にVCCも出てますので、VCC→集合抵抗→LEDx8→PIAのAポート(PA0〜7)という感じで接続します。PIAのポートがLに落ちたら(つまりビットがゼロになったら)点灯します。
プログラムはこんな感じです。githubにも添付しました。
いつものThe Macroassembler ASでアセンブリ可能です。
;
; LED BLINK for SBC-IO(PIA)
; KUNI-NET
CPU 6502
TARGET: EQU "6502"
;
; PIA ADDRESS
;
PIACTLB EQU $8053
PIADATB EQU $8052
PIACTLA EQU $8051
PIADATA EQU $8050
;
WORK_AD EQU $30
;
ORG $200
START:
JSR PIA_INIT
LDA #$20
STA CNT
LED_LOOP:
LDA #$55
STA PIADATA
JSR WAIT
LDA #$AA
STA PIADATA
JSR WAIT
DEC CNT
BNE LED_LOOP
;
BRK
;
; PIA INIT
;
PIA_INIT:
LDA #$00
STA PIACTLA
STA PIACTLB
LDA #$FF
STA PIADATA
LDA #$00
STA PIADATB
LDA #$04
STA PIACTLA
STA PIACTLB
RTS
;
; WAIT
;
WAIT:
LDA #$FF
STA WAIT_CNT
WAIT_LOOP:
JSR WAIT2
DEC WAIT_CNT
BNE WAIT_LOOP
RTS
;
WAIT2:
LDA #$FF
STA WAIT_CNT2
WAIT2_LOOP:
DEC WAIT_CNT2
BNE WAIT2_LOOP
RTS
;
; WORK AREA
;
ORG WORK_AD
CNT: RMB 1 ; COUNTER
WAIT_CNT: RMB 1 ; WAIT COUNTER
WAIT_CNT2: RMB 1 ; WAIT COUNTER
WAIT_CNT3: RMB 1 ; WAIT COUNTER
こちらの初6502アセンブラプログラムを作ったときは、Universal MonitorでL(ロード)コマンドが未実装でしたので、Sコマンド(メモリーを1バイトづつ変更)にゆっくりとTeraTERMでWaitをかけながら流し込んでLEDチカチカさせることに成功しました!!やたっ。
おまけ:Universal MonitorのL(ロード)コマンド
The Macroassembler ASでアセンブリした結果は、p2hexコマンドでIntelHex形式で出力できます。
上記のLEDチカチカプログラムにトライしたあと、作者のElectrelicさんがUniversal MonitorにL(ロード)コマンドを装備してくれましたので、最新版のUniversal Monitor for 6502を使うとIntelHex形式のままTeraTERM経由でロードできるのでたいへん便利です!!
最新のUniversal MonitorのLコマンドで お約束の”HELLO”メッセージ表示プログラムを書いてみました。
I/O基板も装備できて、アセンブラによる開発環境も整いました。
そのうちこのマイコンのSBC68系バスにFM音源LSIをつないでみたいと思います。
これまた久々にVGM音楽プレーヤーを6502CPUのアセンブラで移植してみたいと思っています。(だいぶ先かも…)
コメント