MSXのプリンタを手に入れた。そしてポケコンにつないでみた。

16日の土曜日。
秋葉原でいつものようにジャンク巡りをしていた。
昔に比べてジャンク屋が確実に減っているよなと思いつつ、まだ入ってみたことがない店があったので、入ってみる。
なんと、昔MSXで使っていたプリンタと同じものがジャンク扱いで480円(税別)で売っていた。
懐かしさもあいまって、値段もお得なのでダメ元で速攻購入。
それがこのPanasonicのFS-PC1というプリンタ。

カラー印刷もできる機種だが、もはやインクリボンは売ってないだろうからもっぱら感熱紙専用のプリンタとしか使いようがない。
早速100円ショップでFAX用の感熱紙ロールを買う。

A4サイズ用の感熱紙ロール用の止め具はついているが、100円ショップで売ってたのはB4サイズの物のみだった。
とりあえず、Lアングルの残材を用いてB4ロールの止め具を作る。
オプションを取り付けるための穴があるのでそれを利用して固定。

高校時代も確かB4サイズのロールを使ったような記憶があるのだが、そのときどうやったのかよく覚えてない。
針金を使って何とかしたような気もするのだがよく思い出せない・・・

本来なら針金でできた印刷された紙が給紙側に巻き込まれるのを防止するための金具があるのだが、ジャンクのためかついてなかったので、塩ビ板を適当に加工して代用品を作って準備完了。

ただ懐かしさと値段の安さだけで買ったわけではない。
高校時代にポケコンとこいつをつないで印刷してみたりしていたこともあったので、今回もこいつでポケコンから印刷をしてみようと思ったわけだ。

まずはCT-431をつないで印刷してみる。

OPEN ”LPRT:”したあとにLLISTコマンド。
ちゃんとリストが印刷された。
いったんCLOSEしてプログラムを実行。
ポケコンの表示はこんな感じ。

FS-PC1(というかMSX用のプリンタ)はPC-PR系のコマンドが使われているのをだいぶ昔に調べたことがあったので、もしやと思って確かめてみる。

うん、OPEN前のHDCOPYは正しく印刷されている。
というか、なぜか左上に「P」と印刷されているが。
OPEN後にLPRINTとかした後とかCLOSE後のHDCOPYコマンドはなぜかゴミが混ざってしまっている。
[SHIFT]+[1]でもハードコピーを取ってみる。

一応うまくいっている。
なぜかやっぱり左上に「P」と印刷されているが。
もひとつおまけに文字コードで印刷してみる。

80h~9FhとE0h~FFhはMSXではひらがなが割り当てられているので、プリンタもその通りに印刷されている。
ちなみにLPRINTで「;」を付けて連続印刷した場合、最後に「;」を付けずでLPRINTしてやらないとプリンタのバッファに残って印刷されないことがあるので注意しなければ。

次に本を参考に自分で作ったインターフェースで確かめてみる。

LLISTが正しく印刷されていない。
ハードコピーもうまくいっていない。
自作のインターフェースが悪いのか、それとも別の何かがあるのか。
高校時代にPC-G803・PC-G813とつないだ時は正しくLLISTで印刷できたのに。
TM-T88IVの場合もLLISTは正しく印刷できているし、いったい何が何やらわけがわからなくなってきた。

ちなみにエプソンのTM-T88IVのページはいつの間にか削除されていた。

カテゴリー: ポケコン, 電子工作 | コメントする

Arduinoでポケコンプリンタインターフェース その2

Arduinoを使ったインターフェースで、ハードコピーのデータをPCに取り込めれば、プリンタがだめでも取り込んだデータをもとに画像ファイルが作れるのではないだろうかと思った。
しかし、取り込んだデータを見たらなんかおかしい。
プリンタでもダンプを取ってみたが、こんな有様。

Arduinoを介したほうのデータがでたらめな状態に。
しかも、データ量もおかしい。
Logicと書かれたほうはICを使って作ったインターフェースのダンプ結果。
Arduinoと書かれたほうは、文字通りArduinoで作ったほうのダンプ結果で、明らかにデータ量が多い。
調べた結果、普通のLPRINTやLLISTで印刷した場合とハードコピーの場合のデータ転送速度が違うようで、ハードコピーの場合のデータ転送速度が速く、Arduinoが取り込むことができないようだ。
少し前に秋月でOSC001 PCB SCOPE (USBミニオシロ)を買ったので、早速使ってみることにした。

オシロのプローブ用にコネクタをつないであるが、今回はそちらは使わない。
ロジアナ用の端子でポケコンとArduino間の通信をモニタしてみた。

LPRINTした時の波形。
とりあえず、普通だ。

次にLLISTした時の波形

USBミニオシロの方がデータを取りこぼしている。
が、一応信号としては問題はなさそうなのはわかる。

最後にハードコピーを取った時の波形。

サンプリンレートを見てもらえればわかるが、LPRINTやLLISTは5KSa/secに対してハードコピーの時は500KSa/secでサンプリングして波形を表示している。
これだけでも100倍近く早いってことになるのか。
しかもポケコンのBusy(プリンタ側のSTROBE)の信号がおかしい。
配線の取り回しが悪くてノイズが乗ってしまっているのだろうか。
とにかくArduinoが信号を取りこぼしていることとBusy(プリンタ側のSTROBE)の信号がおかしいため、ハードコピーのデータは取り込むことはできなさそうだ。

これはハードコピーのデータ取り込みについてはあきらめるしかないかな。
それと、このUSBミニオシロを使って思ったことだけど、使い勝手はあまり良くない。
2,400円だしおもちゃと思って割り切るしかないな。

カテゴリー: Arduino, ポケコン, 電子工作 | コメントする

Arduinoでポケコンプリンタインターフェース

以前に書いたArduinoを使った印刷用のインターフェースについて、暫定版ができた。

基板に実装するため、秋月電子のAE-ATMEGA-328 MINIを使用。
当初はプリンタ側はデジタルポートで、ポケコン側はアナログポートをデジタルとする予定だったが、ポケコン側の信号を割り込み処理で実行するため、一部の配線がめんどいことになってしまった。

仕様としては以下の通り。

インターフェース仕様
・CE-126とLPRTの両方をサポート
・リセット時に文字セット初期化を行うので、ポケコン側から初期化コマンドを送る必要なし
・プリンタへの出力が、そのままシリアルポートに出力される
・プリンタへの出力をOFFにできる(シリアルポートはそのまま出力される)

CE-126 mode
・ポケコン側の仕様に影響される
・1行24桁固定
・シリアルポートの出力は24桁で、不足分は空白で置き換わる。
・空行でも24桁の空白
・7Fh~9Fh,F0h~F4h,F8h~FFhあたりはポケコン側で空白に変換したり、別のコードに変換している
・MONモードやTEXTモードなどでも印刷できる

LPRT mode
・LPRINT CHR$コマンドで、指定したコードをそのまま出力する。
・MONモードやTEXTモードなどでは印刷できない
プリンタが対応していればハードコピーが可能(予定)(暫定版では正常動作せず)9/14追記
・印刷が若干遅い(シフトレジスタICを使ったロジック回路でも同様)

まずはCE-126 modeで印刷してみる。

1行24桁固定で印刷され、一部の文字コードは印刷されない。
MONモードでダンプリストの印刷も行ってみる。

CE-126でなければ印刷できなかったものも印刷できた。
ついでにシリアルポートからの出力は以下のとおり。

 !"#$%&'()*+,-./01234567
89:;<=>?@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_`abcdefg
hijklmnopqrstuvwxyz{|}~ 
                        
        。「」、・ヲァィゥェォャュョッ
ーアイウエオカキクケコサシスセソタチツテトナニヌ
ネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚
10:REM OPEN "LPRT:"     
11:REM LPRINT CHR$ &H1B;
  "t"; CHR$ 1           
12:REM LPRINT CHR$ &H1B;
  "R"; CHR$ 8           
20:FOR A=32 TO 255      
29:PRINT CHR$ A;        
30:LPRINT CHR$ A;       
40:NEXT                 
50:LPRINT               
0100 : AF CD 5F 11  ッヘ_.
(CB)   11 04 02 21  ...!
       42 01 CD 20  B.ヘ 
       11 CD 8F 0A  .ヘ .
0110 : 2A A2 11 56  *「.V
(E8)   23 5E 23 ED  #^# 
       53 01 7D 7E  S.}~
       32 03 7D 23  2.}#
0120 : 7E B7 F4 7B  ~キ
(1E)   0A 2A A4 11  .*、.
       22 04 7D 3E  ".}>
       01 32 00 7D  .2.}

次にLPRTモードで印刷した場合。

こちらは、20h以降の文字がすべて印刷されている。
また、1行も用紙の幅いっぱい印刷されている。
シリアルポートからの出力は以下の通り。

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	


。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚珮粤蒟跚韜・・ⅰ涇・

80h~9Fh,E0h~FFhの部分はShiftJISで使っている領域になるので文字が化けている。

10:OPEN "LPRT:"
11:REM LPRINT CHR$ &H1B;"t"; CHR$ 1
12:REM LPRINT CHR$ &H1B;"R"; CHR$ 8
20:FOR A=32 TO 255
29:PRINT CHR$ A;
30:LPRINT CHR$ A;
40:NEXT
50:LPRINT

最後に、暫定版Arduinoスケッチ。

// Emulator Sharp CE-126P fur PC-1401 u. PC-E500
const int OUT_ACK = 17; // ACK  Sharp CE-126P, pin 9 der 11-pol. Buchsenleiste
const int IN_Xout = 3;  // Xout Sharp PC-1401, pin 7 der 11-pol. Buchsenleiste / INT1
const int IN_Dout = 16; // Dout Sharp PC-1401, pin 5 der 11-pol. Buchsenleiste
const int IN_Busy = 2;  // Busy Sharp PC-1401, pin 4 der 11-pol. Buchsenleiste / INT0
const int InfoLED = 13;

// printer interface
const int Pstrb = 15;  // Printer STROBE
const int PD0out = 14; // Printer D0
const int PD1out = 4;  // Printer D1
const int PD2out = 5;  // Printer D2
const int PD3out = 6;  // Printer D3
const int PD4out = 7;  // Printer D4
const int PD5out = 8;  // Printer D5
const int PD6out = 9;  // Printer D6
const int PD7out = 10; // Printer D7
const int Pbusy = 11;  // Printer BUSY

// Mode SW
const int EMmode = 12; // Emulator mode SW (Hi:CE126P/Lo:LPRT)
const int EMsw = 18;   // Emulator SW (Hi:serial and pararel / Lo:serial only)

boolean Busy;  // Busy signal
boolean Xout;  // Xout signal
boolean Dout;  // Dout signal

int DataBit;   // work of CE-126P mode
int DataByte;  // work of CE-126P mode
long Timeout;
int i; 

byte SPif;       // work of LPRT mode

boolean PrtBusy; // work of Printer interface

////////////////////////////////////////////////////////////////////////////////////////////

void setup() {
  // Serial port 98600BPS
	Serial.begin(9600);

	// E500/G8xx interface set
	pinMode(OUT_ACK, OUTPUT);
	pinMode(IN_Xout, INPUT);
	pinMode(IN_Dout, INPUT);
	pinMode(IN_Busy, INPUT);
	pinMode(InfoLED, OUTPUT);

  // Printer interface set
  pinMode(PD0out, OUTPUT);
  pinMode(PD1out, OUTPUT);
  pinMode(PD2out, OUTPUT);
  pinMode(PD3out, OUTPUT);
  pinMode(PD4out, OUTPUT);
  pinMode(PD5out, OUTPUT);
  pinMode(PD6out, OUTPUT);
  pinMode(PD7out, OUTPUT);
  pinMode(Pstrb, OUTPUT);
  pinMode(Pbusy, INPUT);

  // Emulator mode SW
  pinMode(EMmode, INPUT);
  pinMode(EMsw, INPUT);

  // Sirial header
  Serial.println();
  Serial.println("Bereit:");
  Serial.println();

  // Printer STROBE is HIGH
  digitalWrite(Pstrb, HIGH);
  
  // Printer BUSY pull up
  digitalWrite(Pbusy, HIGH);

  // sw port pull up
  digitalWrite(EMmode, HIGH);
  digitalWrite(EMsw, HIGH);

  // ESC/POS printer init
  PRTinit ();
}

////////////////////////////////////////////////////////////////////////////////////////////

void loop() {

  if (digitalRead(EMmode) == HIGH ){
    ce126pemu();
  } else {
    lprtemu();
  }

} // Ende loop

////////////////////////////////////////////////////////////////////////////////////////////

// Emulator Sharp CE-126P
void ce126pemu() {
  do{
    digitalWrite(InfoLED, LOW);
    Xout = digitalRead(IN_Xout);
  
    if (Xout) {
      // DeviceSelect:
      digitalWrite(InfoLED, HIGH);
      delayMicroseconds(50);
      i = 0;
      do {
        digitalWrite(OUT_ACK, HIGH);
        Timeout = millis();
        do {
          Busy = digitalRead(IN_Busy);
          if (millis() - Timeout > 50) break;
        } while (!Busy);
        delayMicroseconds(50);
        digitalWrite(OUT_ACK, LOW);
        do {
          Busy = digitalRead(IN_Busy);
        } while (Busy);
        delayMicroseconds(150);
        i++;
      } while (i < 8);
    }
  
    Busy = digitalRead(IN_Busy);
  
    if (Busy && !Xout) { 
      // Daten:
      digitalWrite(InfoLED, HIGH);
      i = 0;
      DataByte = 0;
      do {
        do {
          Busy = digitalRead(IN_Busy);
        } while (!Busy);
        delayMicroseconds(50);
        DataBit = digitalRead(IN_Dout);
        digitalWrite(OUT_ACK, HIGH);
        do {
          Busy = digitalRead(IN_Busy);
        } while (Busy);
        delayMicroseconds(50);
        if (i != 8) digitalWrite(OUT_ACK, LOW); // add : now receve to low. but printing is high 
        DataByte = DataByte | (DataBit << i);
        i++;
      } while (i < 8); // Ausgabe: switch (DataByte) { case 13: Serial.println(); praout(0x0d); // CR praout(0x0A); // LF break; case 48: Serial.print("O"); // Buchstabe "O" praout(0x4f); break; case 240: Serial.print("0"); // Ziffer Null praout(0x30); break; default: if (DataByte >= 31 && DataByte <= 255) {
            Serial.print(char(DataByte));
            praout(byte(DataByte));
          }
      }
      if (i == 8) digitalWrite(OUT_ACK, LOW); // add : print after ack low
    }
  } while (digitalRead(EMmode) == HIGH );

}

////////////////////////////////////////////////////////////////////////////////////////////

// Emulator LPRT:
void lprtemu() {

  // Interrupt set
  attachInterrupt(0,IntBusy,RISING);
  attachInterrupt(1,IntXout,RISING);

  do{
    digitalRead(EMmode); // dummy
  } while (digitalRead(EMmode) == LOW );

  // Interrupt off
  detachInterrupt(0);
  detachInterrupt(1);
  
}

////////////////////////////////////////////////////////////////////////////////////////////

// Interrupt routine
// BUSY to High (strobe)
void IntBusy() {
  digitalWrite(OUT_ACK, HIGH);
  digitalWrite(InfoLED, HIGH);
  Serial.print(char(SPif));
  praout(SPif);
  digitalWrite(InfoLED, LOW);
  digitalWrite(OUT_ACK, LOW);
}

// Xout to High (data clock)
void IntXout() {
  SPif = SPif << 1 ; if (digitalRead(IN_Dout) == HIGH) { SPif++; } } //////////////////////////////////////////////////////////////////////////////////////////// // init ESC/POS printer caractor set to Jananese void PRTinit () { // init print char set // ESC t n : Select international character set praout(0x1b); // ESC praout(0x74); // t praout(0x01); // 1:Katakana // ESC R n : Select character code table praout(0x1b); // ESC praout(0x52); // R praout(0x08); // 8:Japan delay(10); } //////////////////////////////////////////////////////////////////////////////////////////// // Parallel Printer interface void praout (byte POdata) { // If EMsw is low as no operation if (digitalRead(EMsw) == LOW) return; // wait busy low PrtBusy=digitalRead(Pbusy); do { PrtBusy=digitalRead(Pbusy); } while (PrtBusy != LOW); // Printer data output digitalWrite(PD0out, bitRead(POdata,0)); digitalWrite(PD1out, bitRead(POdata,1)); digitalWrite(PD2out, bitRead(POdata,2)); digitalWrite(PD3out, bitRead(POdata,3)); digitalWrite(PD4out, bitRead(POdata,4)); digitalWrite(PD5out, bitRead(POdata,5)); digitalWrite(PD6out, bitRead(POdata,6)); digitalWrite(PD7out, bitRead(POdata,7)); delayMicroseconds(1); // Strobe to low digitalWrite(Pstrb,LOW); // wait busy high Timeout = millis(); do { PrtBusy=digitalRead(Pbusy); //if (millis() - Timeout > 50) break;
  } while (PrtBusy == HIGH);

  // Strobe to high
  delayMicroseconds(50);
  digitalWrite(Pstrb, HIGH);
  
  // wait busy low
  do {
    PrtBusy=digitalRead(Pbusy);
  } while (PrtBusy != LOW);
  delayMicroseconds(50);
}

シリアルポートから印刷データを垂れ流しているので、少し手直しすればプリンタシールドでも利用可能かもしれない。
雑な作りなので少し手直しは必要かも。

カテゴリー: Arduino, ポケコン, 電子工作 | コメントする

ポケコンのハードコピーのDumpとESC/PとESC/POS

ポケコンのハードコピーについて、ダンプした内容とネットで拾ってきた情報をてらしあわせてみる。

とりあえず上の画像は、brotherのESC/PのマニュアルとシチズンのESC/POSのマニュアルから引用したものでビットイメージを印刷するためのコマンドである。。
他のESC/P、ESC/POSのマニュアルについても確認してみたが、おおむね同じ内容であった。

ESC/P ESC * m n1 n2 data
(16進)1B 2A m n1 n2 datam=0,1,2,3,4,6,32,33,38,39,40,71,72,73
0≦n1≦255
0≦n2≦11
ESC/POS ESC * m n1 n2 data k
(16進)1B 2A m n1 n2 data km=0,1,2,32,33
0≦n1≦255
0≦n2≦2
k=n1+256*n2 (m=0,1)
k=(n1+256*n2)*3 (m=32,33)

コマンド自体は同じだが、微妙な差異がある。
まずは、mで指定できる値が異なる。
ESC/Pの場合は、0~6および32~40、71~73(10進数)と多いのに対し、ESC/POSの場合は0、1、32、33(10進数)の4つだけ。
あとは、ESC/POSにあるkというパラメータ。
このkはマニュアルによってあったりなかったりして、謎である。

これらを踏まえ、以前ダンプした結果を見てみる。

mで指定された値が10進数で39となっており、ESC/POSでは存在しない値であった。
ここさえ何とかなればハードコピーできたのかもしれない。
パラレルポートを持ったプリンタなんて、もはやジャンクで探すしかないのかなぁ・・・

カテゴリー: ポケコン, 電子工作 | コメントする

ポケコンのハードコピーについて

PC-G850VSだが、どうやら画面上の表示のハードコピーをとることができるようだ。
とりあえず確認できたのは、BASICの隠しコマンドでHDCOPYがあること。
引数に0と1が使えることだけで、実際プリンタをつないで試してみても印刷することはできなかった。

そこでナガイSCT株式会社に問い合わせてプリンタ・パソコンインターフェイス CT-431の在庫と一般販売の可否について問い合わせてみる。
そうしたら、在庫もあり一般向けにも売ってくれるとのことで、早速注文してみた。

届いたセットを早速試してみる。

まずは普通にBASICで印刷してみる。

OPEN ”LPRT:”コマンドでポートを開いて印刷するのは、本を参考に自作したインターフェースと同じである。

次にハードコピーを試してみる。
取説によると、以下の方法でハードコピーが取れるようだ。

表示済みの画面のハードコピー
[SHIFT]+[0] → ESC/P
[SHIFT]+[1] → PC-PR

BASICの画面のハードコピー
HDCOPY 0 → ESC/P
HDCOPY 1 → PC-PR

C言語の画面のハードコピー
void hdcopy (unsigned short printer);
printer = 0 → ESC/P
printer = 1 → PC-PR

試した結果は以下のとおり。
どうやらハードコピーをする際にはOPEN ”LPRT:”コマンドは必要がないみたいだ。

なんか三本線が大量に印刷されている。
やはりESC/PとESC/POSは別物なのだろうか。

それはともかく、CT-431だとハードコピーできるのはなぜだろうかと思い基板を見てみる。

なんかGALがのっている。
何かしら特別な処理を行って自作は不可なのだろうかと思いつつ、基板をひっくり返してみる。

・・・
・・・・・・
・・・・・・・・・
何だろう、この後付け感たっぷりな抵抗は。
もしやと思い自作のインターフェースの2番ピンと8番ピンを同じように10KΩでつないで確かめてみる。

早速ハードコピーを取ってみたら、三本線が大量に印刷された。
これでESC/Pに対応していたらちゃんと画像が印刷されるのだろうか。

とりあえずプリンタのダンプモードで印刷してみた。
ネットで拾ったESC/POSとESC/Pのコマンドと見比べて、ダンプされた内容を確認してみようと思う。
ESC-POSコマンド比較(ESC-POS.pdf)

ついでに、Arduinoを使って印刷用のインターフェースを作ってみようとしている。

使っているのは、秋月のAE-ATMEGA-328 MINI
ネットで調べて分かったことだが、ポケコン用のプリンタCE-126Pがあるが、Sharp_PC-G850VS_Interface.pdfによると独自のプロトコルで動いているらしい。
更に調べていくと、Arduinoを使ってプリンタをエミュレートしている人もいた。
公開されているソースをベースにパラレルインターフェースに出力するプログラムを書き足して実際に印刷できることを確認した。
CE-126Pの場合、
・BASICでOPENコマンドでポートを開く必要がない。
・TEXTモードで印刷できる。(パラレル変換インターフェース経由では印刷できない)
・MONモードで印刷できる。(パラレル変換インターフェース経由では印刷できない)
と、パラレルインターフェースでは印刷できないモードでも印刷が可能。
現在、CE-126PモードとLPRT:モードを切り替えて印刷できるArduinoのスケッチを作っているところ。
とはいえ、すごい今更感があるんだよなぁ・・・

カテゴリー: ポケコン, 電子工作 | コメントする

ポケコンの電源とシステムバス

この前買ったポケコンPC-G850VSなのだが、ACアダプタ用のジャックがついている。
昔、高校の頃に使っていた機種(PC-G803/813)にはついてなかった。
さて対応しているACアダプタなのだが、今は珍しいセンターマイナス型。
折角なので、ポケコン用アダプタを作ってみた。

12VのACアダプタをつないで8.5Vに降圧させるためにAZ1117D-ADJを利用している。
電流に余裕があるのでTA48M05Fも追加して5Vの出力もできるようにした。

システムバスだが、こちらのコネクタはもはや入手不可。
いま、代替できる物はないか探しているところ。
高校か社会人になって間もないころに購入したコネクタとコネクタ付き基板が未使用なまま保管してあったので引っ張り出してみる。

せっかくポケコンを手に入れたので、貴重なこれらを使ってみることにした。

ところでこの基板、ピンヘッダを取り付けようと思ったら1番ピンの位置に気を付ける必要がある。
ポケコンのシステムバスの1番ピンの位置が、上記写真の位置に来るので、フラットケーブルの1番ピンの位置と逆になる。

さて、コネクタの方だが、これを取り付けることができる基板がないものか探してみる。

1.27mmピッチの基板を使おうとしても細かすぎるし、基板に足が入らない。
ところがスイッチサイエンスで奇天烈(ジグザグ)ユニバーサル基板 Cタイプ(72×48mm)というものを見つけてもしかしたら使えそうかもと思い入手してみた。

思った通り、足の位置がちょうどぴったりだったので、基板をカットして取り付ける。


表面部分の足も延ばして、穴位置に合わせてまげて取り付ける。

ピンヘッダは、サンハヤトの基板に合わせたものにするか、フラットケーブルの1番ピンに合わせるかどっちにするか迷ったが、結局、シール基板の残りを見つけて両方に対応できるようにした。
これで、コネクタの心配をせずフラットケーブルを使ってシステムバスを使った工作を行うことができる。

さて、基板やコネクタだけあっても仕方ないので、貴重な最後の基板を使って82C55ボードを作ってみることにした。
高校時代にも作ったはずだが、どの本のどの回路をもとに作ったか思い出せない。
結局「ポケコン活用研究2」の3章に載っていた回路をアレンジして組み立てた。
最小のICの数で、アドレスデコードで手を抜いていないところがよいのだが、回路図に誤記があるので気を付ける必要がある。
他に見つけたものでは、74HC244,245でバスを切り分けているものがあって、最初はそっちで組み立てたかったが、ICの数が多く基板のサイズ上載せきれなさそうなので却下。
他にもICの数が少なくて済むものがあったが、そっちはA2,A3かつながってないものだったため却下した。

出来上がった82C55ボード。
I/Oアドレスは。ショートピンで選択できるようにしてある。
74HC32のOR回路が余っているので、/IORQが出ているときのみ82C55の/CSに信号が行くように手直ししたのと、割り込み用に利用。
/INTのところは単体で使う分にはいいけど、ちょっと手直しが必要かな。

ポケコンにつないでみたところ。

I/O確認ボードにつないで動作確認。

BASICでプログラムを組み、モード0でポートA,Bを出力、ポートCを入力に指定。
ポートA,Bに順次データを送りながらポートCの状態を読み込んでポケコンに値を表示するプログラムを組んで正しく動くことを確認。

先に 作ったコネクタ基板をフラットケーブルを使って延長してみる。

サンハヤト基板に合わせたほうのピンヘッダにフラットケーブルコネクタを接続し、反対側に82C55ボードに接続してみる。
延長した状態で正しく動くことを確認。

さて、次はなんとするかな。

カテゴリー: ポケコン, 電子工作 | コメントする

アンノカントク

テレビを見ていても、CMに入ると別のことをしていてテレビを見ていなかったりする。
ふと、テレビから何か聞き覚えのある声が。

 『!?』

しかしテレビの方を見てもすでに「HONDA」のロゴが。
あの独特の声は、でも、まさか。
2、3回同じことを繰り返していたら先日ようやく件のCMを見ることができた。

やっぱ庵野監督やんけ!

YouTubeでONE OK ROCK×庵野秀明 「Go, Vantage Point.」というタイトルでCM動画を見ることができる。

ついでにおおきなカブ(株)の動画も見ることができた。
原作についてもこちら。

そういえば、去年「シン・ゴジラ」を2,3回ぐらい見に行って、島本和彦「アンノ対ホノオ」も手に入れて、今年になってBDをてに入れたらなんか「アオイホノオ」や「監督不行届」も見たくなって、ネットでいろいろ記事を検索したりしてみた。

続きを読む →

カテゴリー: ひとりごと, マンガ・アニメ | コメントする

ポケコンにプリンタをつないでみた2

プリンタのコネクタについてピンアサインを眺めてみる。
アンフェノール14ピン、36ピン、Dサブ25ピンと種類があり、信号名を眺めていたら、もう一台作ってみたくなった。

今回作ったインターフェース基板・

コネクタはDサブ25ピンの物とした。
LEDバー2つ付けて、信号の状態を表示させている。
さらに、Init,AutoFeedのスイッチもつけてみた。

まずはポケコンに接続。
ポケコン本体の電源が切れていても、5V の電圧は出っ放しになっている。
昔使ってたやつは、電源と連動していたと思ったけど、どうだったけかな。

左のLEDはオプトサプライ10バーLEDアレイ 3色(赤4緑3青3)タイプのもの。
右のLEDは全色緑のものを使用。

プリンタをつないだところ。

順番に接続直後、プリンタ電源ON直後、プリンタ初期化終了。
電源ON直後に、SelectとBusyが出力。
初期化終了でBusyが消灯した。

印刷中、

右側のLEDはD0~D7、STROBE、Clockを表示させている。

プリンタの蓋を開けたところ。

BusyのLEDが点灯。

ついでに感熱紙ロールも取り外す。

Busyのほかに、PaperEnd、ErrorのLEDも点灯。

プリンタの電源を落としたところ。

Busy、PaperEnd、Errorのランプが一瞬ついて、ErrorのLEDだけ点灯状態となった。

前回作成したものと並べてみる。

コネクタから繋がっているケーブルと、UEWの配線で大変なことになっている。

LEDとタクトスイッチの部分。
テプラで信号名を書いたシールを作って貼った。

ちなみに、一番左のPOWはポケコンの電源で、次のDは、ポケコンから送信されるデータ(Dout)の状態を表示。
×印は未使用のところ。
左のLEDは、青、緑、赤の3色をうまく利用している。

Dサブコネクタの部分。

垂直取付用ブロック CB26-6
ジュラコン(R)スペーサー(2個入) M3用 4mm
ジュラコン(R)スペーサー(2個入) M3用 2mm
ジュラコン(R)スペーサー(2個入) M3用 3mm
スペーサー 六角両メネジ M3 (L=12mm)
これらを駆使して、基板、コネクタ、アクリル板を取り付けている。

印刷するときに各LEDがキラキラ点滅するだけの物だけど、見ているとそれなりに面白いので、ちょっとだけいい物ができたと思う。

カテゴリー: ポケコン, 電子工作 | コメントする

ポケコンのPIC開発環境

ポケコンのエミュレータをみつけたので、試してみることにした。
Linux/Windows/MacOSX用ソフトウェアから「g800win32.0.10.14.zip」(エミュレータ)と「copyrom.zip」(ROM吸出し)でPC上で動かすことに成功。

各ページのROMのアドレス0xC000-0xFFFF内容を0x1000-0x4FFFに転送して、それをHEXファイル(拡張子はTXT)として吸い出してエミュレータで動かすものだが、HEXファイルをバイナリにして中身をざっと覗いたところ、どうやら「rom14.txt」にPICのINIファイルが存在してるようなので、ちょっと調べてみた。

もう10年以上前のポケコンで、わざわざ制限付きのアセンブラ環境でPICのプログラムなんてする人なんてもういないだろうけど、ネットで調べてもあまり情報がなく、なんとなく気になったので調べてみる。

0x208DのところからINCファイルの一覧がある。

INCファイル定義部分

       00010203 04050607 08090A0B 0C0D0E0F  0123456789ABCDEF
02080                               075049               .PI
02090  432E494E 433ED10B 50313646 3632372E  C.INC>..P16F627.
020A0  494E43CB D10A5031 36463833 2E494E43  INC...P16F83.INC
020B0  F4D60A50 31364638 342E494E 43F4D60B  ...P16F84.INC...
020C0  50313646 3834412E 494E43F4 D60B5031  P16F84A.INC...P1
020D0  36463632 382E494E 43CBD10B 50313646  6F628.INC...P16F
020E0  3837302E 494E43CB D80B5031 36463837  870.INC...P16F87
020F0  312E494E 4394DE0B 50313646 3837322E  1.INC...P16F872.
02100  494E43DF E40B5031 36463837 332E494E  INC...P16F873.IN
02110  4334EB0B 50313646 3837342E 494E432D  C4..P16F874.INC-
02120  F30B5031 36463837 362E494E 4334EB0B  ..P16F876.INC4..
02130  50313646 3837372E 494E432D F3        P16F877.INC-.  

構成としては、
ファイル名長さ(1バイト)+ファイル名(可変長)+参照先ROMアドレス下上(2バイト)
となっているようなので、わかりやすく並べなおす。

長 P 1 6 F  x x x  . I N C  下上    ファイル名 参照先 転送後読み替え
+- +-+-+-+- +-+-+- +-+-+-+- +-+- ------------ ----    ----
07         504943 2E494E43 3ED1      PIC.INC D13E -> 213E
0B 50313646 363237 2E494E43 CBD1  P16F627.INC D1CB -> 21CB
0A 50313646 3833   2E494E43 F4D6   P16F83.INC D6F4 -> 26F4
0A 50313646 3834   2E494E43 F4D6   P16F84.INC D6F4 -> 26F4
0B 50313646 383441 2E494E43 F4D6  P16F84A.INC D6F4 -> 26F4
0B 50313646 363238 2E494E43 CBD1  P16F628.INC D1CB -> 21CB
0B 50313646 383730 2E494E43 CBD8  P16F870.INC D8CB -> 28CB
0B 50313646 383731 2E494E43 94DE  P16F871.INC DE94 -> 2E94
0B 50313646 383732 2E494E43 DFE4  P16F872.INC E4DF -> 34DF
0B 50313646 383733 2E494E43 34EB  P16F873.INC EB34 -> 3B34
0B 50313646 383734 2E494E43 2DF3  P16F874.INC F32D -> 432D
0B 50313646 383736 2E494E43 34EB  P16F876.INC EB34 -> 3B34
0B 50313646 383737 2E494E43 2DF3  P16F877.INC F32D -> 432D

マニュアルに書かれている以外にも対応しているPICがあるようだ。

ROMの内容が0xC000-0xFFFF内容を0x1000-0x4FFFに転送されているため、参照先のアドレスも読み替えてPIC.INCの参照先(0x213E )を見てみる。

PIC.INCファイル

       00010203 04050607 08090A0B 0C0D0E0F  0123456789ABCDEF
02130                                 0E57                .W
02140  00000000 00000000 00460000 00000000  .........F......
02150  00010049 4E444600 00000000 00544D52  ...INDF......TMR
02160  30000000 00010050 434C0000 00000002  0......PCL......
02170  00535441 54555300 00030046 53520000  .STATUS....FSR..
02180  00000004 00504F52 54410000 00050050  .....PORTA.....P
02190  4F525442 00000006 0050434C 41544800  ORTB.....PCLATH.
021A0  000A0049 4E54434F 4E00000B 004F5054  ...INTCON....OPT
021B0  494F4E5F 52810054 52495341 00000085  ION_R..TRISA....
021C0  00545249 53420000 008600             .TRISB.....     

どうやら、
1個目:定義数(1バイト)+定数名(8バイト)+値(1バイト)
2個目以降:0x00 or 0x01(1バイト)+定数名(8バイト)+値(1バイト)
と10バイトの固定長になっているようだ。

一つ一つ手作業で変換するのも面倒なので、ポケコンでBASICでプログラムを組んでみる。
前提条件としては、copyromでAレジスタで0x14を指定した後、ROMの内容を0xC000-0xFFFFから0x1000-0x4FFFに転送済みになっていること。
PCとポケコンを通信ケーブルでつないでTeraTermなどでデータを受信できる状態であること。

定数定義吸出しプログラム

 
100OPEN "COM1:"
110INPUT "ADDRESS: ";AD$
120IF AD$="END" OR AD$="EXIT" THEN PRINT "==END==":CLOSE :END
130DC= PEEK ( VAL ("&H"+AD$))
140PRINT #1,""
150PRINT #1,"ADD:"+AD$
160PRINT #1,"CNT:"+ STR$ DC
170PRINT #1,"     LABEL    VAL"
180PRINT #1,"---- -------- ----"
190FOR LC=1 TO DC
200PP$=""
210PB$=""
220PP$= RIGHT$ ("    "+ STR$ ( PEEK ( VAL ("&H"+AD$)+(LC-1)*10)),4)+" "
230FOR C=1 TO 8
240 DT= PEEK ( VAL ("&H"+AD$)+(LC-1)*10+C)
250 IF DT>=&H30 AND DT <&H7F THEN PP$=PP$+ CHR$ DT ELSE PP$=PP$+ " "
260NEXT
270PB$= " &H"+ RIGHT$ ("0"+ HEX$ ( PEEK ( VAL ("&H"+AD$)+9+(LC-1)*10)),2)
280PRINT #1,PP$;PB$
290NEXT
300PRINT #1,"==== ======== ===="
310PRINT #1,""
320GOTO 110


実行した結果は以下の通り。
長いので、実行結果は次のページで。
続きを読む →

カテゴリー: ポケコン | コメントする

ポケコンにプリンタをつないでみた

ポケコンを買って今度はプリンタを買って印刷をしてみることをした。
今回Amazonで買ったプリンタはエプソンのTM-T88IVというものだ。
中古で2,980円+送料手数料740円で合計3,720円と手ごろな値段。
当初の考えていたArduinoのプリンタシールドよりもはるかに安い。
しかし、ちょっとでかいしちょっと重い。
ACアダプタの大きさも半端ない。
これに感熱紙ロールを追加で買って印刷を行う準備をする。

『ポケコン・エレクトロニクス』に掲載されているセントロニクス・インターフェイスの回路図をもとに基板を組む。

たしか高校生の頃にも作ったはずだが、もう残ってないはず。
あの頃よりも配線はきれいにできているはずだ。

次に、ポケコンとプリンタをつなぐ。
アンフェノールコネクタなんてかなり久々に見た気がする。
14ピン-36ピンのケーブルなんて見かけないので自作する。
製作費の半分以上がこのコネクタに掛かってんじゃないだろうか。

実際につないで印刷してみたところ。

左は文字コードを印刷するプログラムを実行したところで、右はLLISTでプログラムを印刷しているところ。
BASICなんて何年ぶりだろうか。
ちなみにLLISTで印刷するためには、まずOPEN ”LPRT:”コマンドでプリンタポートを開く必要がある。

ちなみにインターフェース基板にLEDを追加している。
一番上にポケコンの電源表示の赤LED
二番目以降はオレンジのLEDで、ポケコンのXOUT(クロック)
三番目にポケコン側のBUSY~プリンタ側の/STROBE
四番目にプリンタ側のBUSY~ポケコン側のACK
ところが、二番目のBUSYは基本点灯しっぱなし(実際は点滅しているはず)
三番目のBUSYは消灯(一瞬だけついているのだろうけど視認できない)
唯一わかりやすいのは4番目のプリンタ側のBUSYだけだった。

印刷中に一瞬点灯することがあるし、プリンタ側でエラーなどが発生すると点灯する。
上の写真は、ロール紙のカバーを開けてプリンタ側でエラー状態にしている状態で、インターフェース基板上のLEDが点灯しているところ。

印刷した内容の前に、ポケコンの文字コードを表示させてみる。

次に、印刷したものを並べてみる。

なぜ2種類あるかというと、プリンタの文字コードセットがデフォルトではポケコンのコードとは異なっているのである。
プリンタの制御コードでESC/Pというものがあるが、このプリンタはESC/POSというもので制御している。
どうやらPOS用に特化した制御コードらしいが、基本的に使い方は似たようなもののようだ。
ただ、エプソンのサイトに登録しないとESC/POSの資料はもらえないようだが、ググってみたら資料はそれなりに見つかる。
ググった結果、シチズンの「モデル:CMP-20/30」用のコマンドリファレンスが見つかったので、それをもとに設定を変えてみる。

左がデフォルトの状態、右が国際文字セットとページ1を指定したもの。

&HF8(0xF8)以降の文字が異なっているが、まあ特に大きな問題ではなかろう。

デフォルト設定のまま

10:OPEN "LPRT:"
20:LPRINT "     0123456789ABCDEF"
30:LPRINT "---------------------"
40:FOR H=&H20 TO &HF0 STEP &H10
50: CC$=""
60: FOR L=0 TO 15
70:  CC$=CC$+ CHR$ (H+L)
80: NEXT
90: LPRINT HEX$ H;" : ";CC$
100:NEXT
110:FOR I=1 TO 10
120: LPRINT
130:NEXT
140:CLOSE
150:END

 

文字コードの初期化をして日本語の文字コードに設定。
20行目でESC tで文字コードテーブルの選択(ページ1カタカナ)
30行目でESC Rで国際文字セットの選択(日本)

10:OPEN "LPRT:"
20:LPRINT CHR$ &H1B;"t"; CHR$ 1
30:LPRINT CHR$ &H1B;"R"; CHR$ 8
40:LPRINT "     0123456789ABCDEF"
50:LPRINT "---------------------"
60:FOR H=&H20 TO &HF0 STEP &H10
70: CC$=""
80: FOR L=0 TO 15
90: CC$=CC$+ CHR$ (H+L)
100: NEXT
110: LPRINT HEX$ H;" : ";CC$
120:NEXT
130:FOR I=1 TO 10
140: LPRINT
150:NEXT
160:CLOSE
170:END

プリンタインターフェースのほかに、カセットインターフェースも作った。

こちらも高校時代に作ったが、実装密度は2倍近くになってサイズは約半分ぐらいになっているはず。
一応、ステレオプラグを使うかアナログプラグを使うかでジャンパーピンで選択できるようにしている。
時間がなかったので、手書きなのはご愛敬、


追記 2017/07/20
ESC/POSのコマンドリファレンスで、他にもいいものがあったので忘備もかねて記載しておく。
三栄電機プリンターコマンドリファレンス
ESC/POS – Epson
FAQ for ESC/POS

カテゴリー: ポケコン, 電子工作 | コメントする