これまでμP-1 ユニバーサルテストボードを使ってMSXの機能を拡張してきましたが、まだまだ拡張できます。
このμP-1 ユニバーサルテストボードにはPICのソケットがあるので最初にPIC16F819を挿してテストしていました。でもそれ以降放置状態でした。今回はこのPICを使ってMSXの機能拡張をしてみます。
PIC16F819にはPORTAとPORTBそれぞれ8ピンずつあります。ただし、PORTAの3つのピンはリセットとクロック入力で使えません。今回使用しているPICは違いますが、PORTAの5番目のピン(RA4)は多くのPIC16ではオープンドレインとなっています。ユニバーサルテストボードではこのピンをプルアップしてくれているので負理論として使えるようにはなっています。なのでPORTAは5つのピンを自由に使うことが出来ます。PORTBの8ピンは8255のポートにつないでMSXとの通信に使います。
このPORTAの5ピンを使って接続できるデバイスに、以前使用したCE-126Pサーマルプリンタがあります。
もともとポケコンPC-E200で使用していたものですが、ポケコンが壊れたのでPICを使ってシリアル接続で印字できるようにしていました。これをMSXにつないでみます。
今回サーマルプリンタはシリアル接続はせず、ユニバーサルテストボードのPICから直接制御します。需要があるとは思えませんが、参考までにMSXの8255とPICとサーマルプリンタの配線およびPICの制御プログラムを載せておきます。
プリンタには外部の6V電源をつなぐので、ユニバーサルテストボードとはGNDのみ接続します。
- #pragma config FOSC = XT
- #pragma config WDTE = OFF
- #pragma config PWRTE = ON
- #pragma config MCLRE = ON
- #pragma config BOREN = OFF
- #pragma config LVP = OFF
- #pragma config CPD = OFF
- #pragma config WRT = OFF
- #pragma config CCPMX = RB2
- #pragma config CP = OFF
- #include
- #define _XTAL_FREQ 3579000 // 3.579MHz
- #define EN PORTAbits.RA4
- #define BUSY PORTAbits.RA3
- #define DOUT PORTAbits.RA2
- #define ACK PORTAbits.RA1
- #define SEL2 PORTAbits.RA0
- #define ONELINE 24
- void sendChar(uint8_t ch)
- {
- for(int i=0; i<8; i++)
- {
- DOUT = (ch >> i) & 1;
- BUSY = 1;
- __delay_ms(1);
- while(ACK == 0);
- BUSY = 0;
- __delay_ms(2);
- }
- }
- void main(void) {
- CCP1CON = 0b00000000; // CCP1モジュール無効(リセット)
- ADCON0 = 0b00000000; // ADコンバータモジュールOFF
- ADCON1 = 0b00000110; // Vref使わない RA2/RA3はデジタルI/O
- SSPCON = 0b00000000; // SPI/I2C無効 対象ピンはデジタルI/O
- TRISA = 0b00000010; // RA1を入力
- PORTA = 0b00000000;
- TRISB = 0b11111111; // 全て入力
- PORTB = 0b00000000;
- OPTION_REGbits.nRBPU = 0; // PORTBを内部プルアップ
- uint8_t data = 0;
- int pos, endflag = 0;
- while(PORTB != 0); // MSXの8255の初期化を待つ
- // CRかLFか24文字入力で印字
- // 文字の出力は1文字+0
- SEL2 = 1;
- while(1)
- {
- pos = 0;
- //SEL2 = 1;
- for(int i=0; i<ONELINE; i++)
- {
- EN = 1; // 文字送信許可
- while(PORTB == 0); // 文字入力待ち
- EN = 0; // 文字送信禁止
- data = PORTB;
- switch(data)
- {
- case 0xa: // LF
- endflag = 1;
- break;
- case 0xd: // CR
- endflag = 1;
- break;
- case 0x9: // TAB
- data = 0x9B;
- break;
- case 0x5B: // [
- data = 0xA2;
- break;
- case 0x5D: // ]
- data = 0xA3;
- break;
- case 0x27: // '
- data = 0x80;
- break;
- case 0x60: // `
- data = 0x9A;
- break;
- }
- EN = 1; // 文字送信許可
- while(PORTB != 0); // 0で1文字受信完了
- EN = 0; // 文字送信禁止
- if(endflag)
- {
- endflag = 0;
- break;
- }
- sendChar(data);
- ++pos;
- }
- for(int i=pos; i<ONELINE; i++)
- sendChar(' ');
- sendChar(0xd); // CR
- __delay_ms(2000);
- }
- return;
- }
MSXからの印刷はBASICからでも簡単に行えて、8255のポートCを読んで印刷可能ならポートBに1文字と0を出力する(ピンに空きが無くハンドシェイク用の信号線が使えないので1文字ごとに区切るため)という処理の繰り返しになります。試しにBASICでメモリダンプを印字してみました。
MSXのビデオ出力の画面では表示できる情報が少ないので、印字してデータを見ることが出来るのはデバッグなどに大いに役立ちます。MSXの使い勝手が少し良くなりました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます