フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1] 2 3
トピック: STM32 (Blue Pill) 用の VT100 エミュレータ
DEKO
管理者
投稿数: 2690
STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/13 18:18 Tue

STM32 (Blue Pill) 用の VT100 エミュレータ (実装途中) です。
それなりに動作しますが、Turbo Pascal のエディタ画面とかではまだグチャります。

Adafruit のライブラリと、
茶虎たま吉さんの PS2 キーボードライブラリが必要です。
https://github.com/Tamakichi/Arduino_PS2Keyboard

  • シリアルは Serial3 (PB10/PB11) に接続します (5V トレラント)。
  • TFT (ILI9341) の CS / RST / DC はそれぞれ PA4 / PA2 / PA3 です。
  • PS/2 キーボードは PB6 / PB7 に接続します (5V トレラント)。
DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/13 18:30 Tue

備考:

  • アトリビュート用のバッファを持たないので、色を付けてもスクロールしたりすると色は失われます。
  • Ctrl キーを送信できません。
  • デバッグは Serial を開きます (Arduino IDE のシリアルモニタで可)。未実装のコマンドが送られると Serial にメッセージが送信されます。
  • カーソルは実装されていません。

PC <-> STM32
PC <-> 任意のUSB シリアル
STM32 (Serial3) <-> 任意の USB シリアル (TX / RX / GND を結線)

こんな感じで接続し、STM32 のシリアルポートと USB シリアルをそれぞれ PuTTY 等で表示し、
USB シリアル側の PuTTY からコマンドを送ればコマンドのデバッグができます。

DEKO
管理者
投稿数: 2690
VT100 のエスケープシーケンス
on: 2018/11/13 18:39 Tue

VT100 のエスケープシーケンスは以下のサイトを参考にしました。

[VT100のエスケープシーケンス (BK class)]
http://bkclass.web.fc2.com/doc_vt100.html

[対応制御シーケンス - Tera Term ヘルプ 目次 (Tera Term Home Page)]
https://ttssh2.osdn.jp/manual/ja/about/ctrlseq.html

[Chapter 3 Programmer Information - VT100 User Guide (VT100.net)]
https://vt100.net/docs/vt100-ug/chapter3.html

[ANSI/VT100 Terminal Control Escape Sequences (termsys.demon.co.uk)]
http://www.termsys.demon.co.uk/vtansi.htm

[VT100 escape codes]
https://www.csie.ntu.edu.tw/~r92094/c++/VT100.html

[ANSI Escape sequences - VT100 / VT52]
http://ascii-table.com/ansi-escape-sequences-vt-100.php

DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/13 20:06 Tue

どう動作するのが正しいのかの確認は 2 つの USB シリアルを PC に接続し、
TX / RX / GND を互いに接続して、PuTTY とかでコマンドを送ります。

例えば片方で [ESC] # 8 と入力すると、もう片方は下の画像のように E で埋め尽くされます。

片方が STM32 だとこうなります。[ESC] c で画面クリアです。

CP/M 8266 を接続するとこうなります。

DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/14 03:25 Wed

Ctrl キーへの対応は PS2Keyboard.cpp をいじる事で解決できました。

PS2Keyboard.cpp
#define BREAK     0x01
#define MODIFIER 0x02
#define SHIFT_L 0x04
#define SHIFT_R 0x08
#define ALTGR 0x10
/* 追加 BEGIN */
#define ALT 0x20
#define CTRL 0x40
/* 追加 END */

static char get_iso8859_code(void)
{
static uint8_t state = 0;
static uint8_t sState = 0; // 追加
uint8_t s;
char c;

while (1) {
s = get_scan_code();
if (!s) return 0;
if (s == 0xF0) {
state |= BREAK;
} else if (s == 0xE0) {
state |= MODIFIER;
} else {
if (state & BREAK) {
if (s == 0x12) {
state &= ~SHIFT_L;
} else if (s == 0x59) {
state &= ~SHIFT_R;
} else if (s == 0x11 && (state & MODIFIER)) {
state &= ~ALTGR;
}
// CTRL, ALT & WIN keys could be added
// but is that really worth the overhead?
state &= ~(BREAK | MODIFIER);
continue;
}
if (s == 0x12) {
state |= SHIFT_L;
sState |= SHIFT_L; // 追加
continue;
/* 追加 BEGIN */
} else if (s == 0x11) {
sState |= ALT;
continue;
} else if (s == 0x14) {
sState |= CTRL;
continue;
/* 追加 END */
} else if (s == 0x59) {
state |= SHIFT_R;
sState |= SHIFT_R; // 追加
continue;
} else if (s == 0x11 && (state & MODIFIER)) {
state |= ALTGR;
sState |= ALTGR; // 追加
}
c = 0;
if (state & MODIFIER) {
switch (s) {
// case 0x70: c = PS2_INSERT; break;
// case 0x6C: c = PS2_HOME; break;
// case 0x7D: c = PS2_PAGEUP; break;
case 0x71: c = PS2_DELETE; break;
// case 0x69: c = PS2_END; break;
// case 0x7A: c = PS2_PAGEDOWN; break;
case 0x75: c = PS2_UPARROW; break;
case 0x6B: c = PS2_LEFTARROW; break;
case 0x72: c = PS2_DOWNARROW; break;
case 0x74: c = PS2_RIGHTARROW; break;
case 0x4A: c = '/'; break;
case 0x5A: c = PS2_ENTER; break;
default: break;
}
} else if (state & ALTGR) {
// [右ALT]+[カナ/かな]キーが押された
if (s == 0x13) {
kana_f = ~kana_f ;
if (kana_f == 0) {
keymap = &PS2Keymap_JP ; // 日本語キーマップに戻す
} else {
keymap = &PS2Keymap_KANA ; // カタカナキーマップにする
}
c = PS2_KANA ; // この行をコメントにすればキーコードは返りません
}
} else if (state & (SHIFT_L | SHIFT_R)) {
if (s < PS2_KEYMAP_SIZE)
c = pgm_read_byte(keymap->shift + s);
} else {
if (s < PS2_KEYMAP_SIZE)
c = pgm_read_byte(keymap->noshift + s);
}
state &= ~(BREAK | MODIFIER);
if (c) {
/* 追加 BEGIN */
if (sState & 0x40) {
c &= 0x1F;
sState = 0;
}
/* 追加 END */
return c;
}
}
}
}

 
何をやってるかですが、

[キャレット記法 (Wikipedia)]
https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%AC%E3%83%83%E3%83%88%E8%A8%98%E6%B3%95
[制御コードの入力 (通信用語の基礎知識)]
https://www.wdic.org/w/TECH/Ctrl%E3%82%AD%E3%83%BC#xE5x88xB6xE5xBExA1xE3x82xB3xE3x83xBCxE3x83x89xE3x81xAExE5x85xA5xE5x8Ax9B
[ Delphi で ^ は "べき乗" の演算子ではないけれど? (DEKO のざつだん)]
https://ht-deko.com/ft1210.html#121019 <- 下にちょっとスクロールしてください

を参照してみてください。

DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/14 04:43 Wed

loop() の中を書き換えればカーソルキーにも対応できますね。

vt100_stm32.ino
void loop() {
//checkButtons();

if (keyboard.available()) {
char c = keyboard.read();
switch (c) {
case PS2_UPARROW:
Serial3.print("\e[A");
break;
case PS2_DOWNARROW:
Serial3.print("\e[B");
break;
case PS2_RIGHTARROW:
Serial3.print("\e[C");
break;
case PS2_LEFTARROW:
Serial3.print("\e[D");
break;
default:
Serial3.print(c);
break;
}
}
while (Serial3.available())
printChar(Serial3.read());
}
DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/14 08:35 Wed

うまく動作しなかった原因は、115200 bps とかでは描画コマンドが追い付かない事があるからでした。
9600bps でもダメだったので 2400bps まで落としたらうまくいきました。
バッファサイズを変更するなり、自前でバッファ処理を書けばもっと高 bps でイケると思います。

申し訳程度にカーソルも実装してみました。緩慢なカーソルですがないよりはマシかと。
カーソル座標が更新されたと同時にカーソル描画をやろうとすると、
またもや描画コマンドが追い付かない事があるので、今のような実装になっています。
 
これで CP/M8266 と通信できました!Turbo Pascal もちゃんと動きます。

※ PS2Keyboard.cpp をいじらないと [Ctrl] + K D が押せないので Turbo Pascal のエディタから戻ってこれなくなりますヨ。

DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/14 08:47 Wed

いっそシリアルバッファを増やしてみるとか。

[Serial buffer (STM32duino.com)]
https://www.stm32duino.com/viewtopic.php?f=3&t=1070&sid=ffd27e6413dc3c4009afedd3df84f569&start=10#p24957

DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/14 09:09 Wed

シリアルバッファを 512 とかにすれば 9600bps でも追い付くようです。

usart.h
/*
* Devices
*/

#ifndef USART_RX_BUF_SIZE
#define USART_RX_BUF_SIZE 512
#endif

#ifndef USART_TX_BUF_SIZE
#define USART_TX_BUF_SIZE 128
#endif

 
ただ、setAddrWindow() を伴う処理には delay() を入れないと TFT がハング (真っ白になる) する事があるようです。

DEKO
管理者
投稿数: 2690
Re: STM32 (Blue Pill) 用の VT100 エミュレータ
on: 2018/11/14 10:55 Wed

後はアトリビュートの実装ですねー。

VT100 だとフォワグラウンドカラーとバックグラウンドカラーがあるのでそれだけで 6bit。
太字 / 下線 / 点滅 / 反転の属性で 4bit。カラー無視しようかなぁ…。

アトリビュートが 8bit で収まるとスクリーンバッファと計算が同じでいいので楽できるんですよねぇ…。

※ 続きは ↓ の [2] をクリック!

ページ: [1] 2 3
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.052 sec.