$prog &HFF , &HE2 , &HDC , &HF9 'CKDIV8 = 1 , BODLEVEL = 4.3V ' ' ************************************************ ' * * ' * グラフィックLCD使用 ターミナル プログラム * ' * * ' * AVR is using ATmega88 * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2013. 5.31 * ' ************************************************ ' ' Ver 1.01 初回公開バージョン ' Ver 1.02 300〜1200ボーのバグを修正。パワーオン時にボーレートを表示。BODを4.3Vに変更。2013. 5.31 ' ' Const Prgver = "01.02" 'プログラム・バージョン。 ' $regfile = "m88def.dat" $crystal = 8000000 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 16 'ソフトウェア・スタックの容量を設定。 $framesize = 32 'フレーム領域の容量を設定。 ' ' Gldtp Alias Portb 'Graphic-LCDのデータポート名 Glcnp Alias Portc 'Graphic-LCDのコントロールポート名 Const Glce1 = 1 'Graphic-LCDの(CS1)を接続するピン番号 Const Glce2 = 2 'Graphic-LCDの(CS2)を接続するピン番号 Const Glccd = 5 'Graphic-LCDの(D/I)(RS)を接続するピン番号 Const Glcrd = 4 'Graphic-LCDの(R/W)を接続するピン番号 Const Glres = 0 'Graphic-LCDの(/RES)(RST)を接続するピン番号 Const Glena = 3 'Graphic-LCDの(E)を接続するピン番号 ' Ps2ckpt Alias Pind.2 'PS/2キーボードの[CLOCK]ピン接続ポート。 Ps2dtpt Alias Pind 'PS/2キーボードの[DATA]端子接続ポート。 Ps2dtpn Alias 3 'PS/2キーボードの[DATA]端子接続ピン。 Const Kbuflen = 80 'PS/2 キー・データ バッファの大きさ。 Const Sbuflen = 254 'シリアルデータ受信バッファの大きさ。 ' ' Dim Keybuf(kbuflen) As Byte 'PS/2 キー・データ バッファ。 Dim Kbufpoi As Byte 'PS/2 キー・データ バッファのアドレス・ポインタ。 Dim Kbufrdp As Byte 'PS/2 キー・データ バッファの読み込みアドレス・ポインタ。 Dim Ps2kcun As Byte 'PS/2 キー・カウンタ。 Dim Ps2ktmp As Byte 'PS/2 キー・受信テンポラリ。 Dim Ps2tmof As Byte 'PS/2 キー入力、タイムアウト検出フラグ。 Dim Ps2kdat As Byte 'PS/2 キー・データ。 Dim Keysta As Byte 'キー変換処理ステータスフラグ。 Dim Shifkef As Byte ' [Shift] キー処理フラグ。 ' Dim Displin As Byte 'G-LCDの表示行。 Dim Dispcol As Byte 'G-LCDの表示列。 Dim Dispofc As Byte 'G-LCDスクロール制御カウンタ。 Dim Dispofs As Byte 'G-LCDのオフセット値。 Dim Blkcun As Byte 'カーソル・点滅500mSカウンタ。 Dim Blktemp As Byte 'カーソル・点滅位置のデータ保存用。 Dim Curdsf As Byte 'カーソル・表示状態フラグ。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Templ2 As Long '汎用テンポラリ変数 Long型 No.2 Dim Tempstr As String * 20 '汎用テンポラリ変数 文字列型 ' Dim Eepbaud As Eram Long At $10 '[EEPROM] ボーレート保存用。 ' ' Portd = &B11110000 '未使用ポートのプルアップ。 ' ' * グラフィックLCDの初期設定 * ' $lib "GlcdKS108.lbx" 'KS0108チップ用ライブラリの使用を指示 Config Graphlcd = 128 * 64sed , Dataport = Gldtp , Controlport = Glcnp , Ce = Glce1 , Ce2 = Glce2 , Cd = Glccd , Rd = Glcrd , Reset = Glres , Enable = Glena Cls Setfont Offont6x8 'フォント・データを定義 ' ' * Timer0を10mSタイマーに設定 * ' Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer0 = 7,812Hz Ocr0a = 77 '10mS タイマーを設定。 ' ' * PS/2キーボード接続ポートの設定 * ' Config Int0 = Falling '外部割り込みピン[INT0]を、立ち下がりエッジに設定。 On Int0 Ps2kint Nosave '[INT0]の割り込みルーチンを設定。 Enable Int0 '[INT0]の割り込みを許可。 ' ' * シリアル通信ポートの初期設定 * ' $baud = 9600 'シリアル通信ポートを有効にする。 Config Serialin = Buffered , Size = Sbuflen 'シリアルデータ受信を、バッファを使用した割り込み処理にする。 ' ' * EEPROMから、ボーレートの設定値を読み込み、AVRのレジスタに設定 * ' Templ1 = Eepbaud 'EEPROMからボーレート値を読み込む。 If Templ1 < 0 Then 'If EEPROMが初期値? Then Templ1 = 9600 'ボーレートの初期値を9600ボーにセット。 Eepbaud = Templ1 'EEPROMに書き込む。 End If Gosub Baudrgwr 'AVRのレジスタにボーレートを設定する。 ' ' * 変数の初期値を設定 * ' Kbufpoi = 0 'PS/2 キー・データ バッファの書き込みポインタをセット。 Kbufrdp = 0 ' Lcdat 1 , 1 , "Terminal Ver." ; Prgver 'G-LCDへプログラム・バージョンを表示。 Lcdat 2 , 13 , "baud rate=" 'G-LCDへ「ボーレート入力」のメッセージを表示。 Lcdat 2 , 79 , Templ1 'G-LCDへボーレート値を表示。 ' Displin = 3 'G-LCD表示用の初期値。 Dispcol = 1 Dispofc = 3 Dispofs = 0 ' ' Enable Interrupts 'すべての割り込みを許可。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Gosub Ps2krd 'PS/2キー受信バッファから、ASCII文字を取り出す。 If Ps2kdat = &H01 Then Goto Baudset 'If ボーレート設定? Then If Ps2kdat <> 0 Then 'If 有効なキーが押されたか? Then Print Chr(ps2kdat) ; 'シリアル通信ポートへ、キー・データを送信する。 Ps2kdat = 0 End If ' Gosub Rxddisp 'シリアル通信ポートからの受信データを、G-LCDへ表示する。 Gosub T10msec '10mS タイマー処理。 Goto Main ' ' *********************** ' * ボーレート設定 処理 * ' *********************** ' Baudset: Temp1 = &H0D '強制的に改行させる。 Gosub Rxddisps Temp1 = &H0A Gosub Rxddisps Lcdat Displin , Dispcol , "baud rate=" , 1 'G-LCDへ「ボーレート入力」のメッセージを表示。 Dispcol = 67 Tempstr = "" '文字列テンポラリを初期化。 ' Baudset1: Gosub Ps2krd 'PS/2キー受信バッファから、ASCII文字を取り出す。 Gosub T10msec '10mS タイマー処理。 If Ps2kdat = 0 Then Goto Baudset1 'If キーが押されたか? Else ' If Ps2kdat = &H0D Then Goto Baudset3 'If [Enter]キー? Then If Ps2kdat = &H08 Then Goto Baudset2 'If [Backspace]キー? Then If Ps2kdat < &H30 Then Goto Baudset6 'If [数字]キー? Else If Ps2kdat > &H39 Then Goto Baudset6 'If [数字]キー? Else ' Tempstr = Tempstr + Chr(ps2kdat) 'ボーレートの文字列を作成。 Baudset4: Temp1 = Ps2kdat Gosub Rxddisps '入力された[数字]キーを、G-LCDへ表示する。 Baudset6: Ps2kdat = 0 Goto Baudset1 ' ' Baudset2: '[Backspace]キーの処理。 Temp1 = Len(tempstr) If Temp1 = 0 Then Goto Baudset6 'If 文字が無い? Then If Temp1 = 1 Then 'If 文字数が1? Then Tempstr = "" Else Temp1 = Temp1 - 1 Tempstr = Left(tempstr , Temp1) 'ボーレート文字列から1文字を消去。 End If Goto Baudset4 ' Baudset3: '[Enter]キーの処理。 Ps2kdat = 0 If Tempstr = "" Then Goto Baudset5 'If [Enter]キーのみが押された? Then ' Templ1 = Val(tempstr) '文字列を数値に変換。 Eepbaud = Templ1 'EEPROMに書き込む。 Gosub Baudrgwr 'AVRのレジスタにボーレートを設定する。 ' Baudset7: Temp1 = &H0D '強制的に改行させる。 Gosub Rxddisps Temp1 = &H0A Gosub Rxddisps Goto Main 'ボーレート設定モードの終了。 ' Baudset5: '現在設定されているボーレート値を表示。 Templ1 = Eepbaud 'EEPROMからボーレート値を読み込む。 Lcdat Displin , Dispcol , Templ1 , 1 'G-LCDへボーレート値を表示。 Curdsf = 0 'カーソル・表示状態フラグをリセット。 Goto Baudset7 ' ' **************************************************** ' * AVRのレジスタにボーレートを設定する サブルーチン * (Templ1 = ボーレート値) ' **************************************************** ' Baudrgwr: Templ2 = 500000 / Templ1 'ボーレートを計算。 Tempw1 = Templ2 - 1 Ubrrl = Low(tempw1) 'レジスタにボーレートを設定。 Ubrrh = High(tempw1) Return ' ' ************************************************************** ' * PS/2キー受信バッファから、ASCII文字を取り出す サブルーチン * (Ps2kdat = ASCII文字) ' ************************************************************** ' Ps2krd: If Kbufpoi = Kbufrdp Then Return 'PS/2 キー・データが受信されたか? Else Kbufrdp = Kbufrdp + 1 Temp1 = Keybuf(kbufrdp) 'PS/2 キー・データ バッファから1byte取り出す。 ' If Keysta > 0 Then Goto Ps2krd1 'If 拡張・離す キー処理? Then If Temp1 = &H12 Then Goto Ps2krd2 'If [Shift] キーが押された? Then If Temp1 = &H59 Then Goto Ps2krd2 'If [Shift] キーが押された? Then If Temp1 = &HE0 Then Goto Ps2krd3 'If 拡張キーコード? Then If Temp1 = &HF0 Then Goto Ps2krd3 'If キーが離された? Then ' If Shifkef = 0 Then Goto Ps2krd6 'If [Shift] キーが押されている? Else Temp1 = Temp1 + &H80 Ps2krd6: Ps2kdat = Lookup(temp1 , Keydata) 'スキャンコード変換テーブルからASCIIコードを取得。 ' Ps2krd4: If Kbufrdp >= Kbuflen Then Kbufrdp = 0 'If PS/2 キー・データ バッファが最終位置? Then Return ' ' Ps2krd2: '[Shift] キーが押された処理。 Shifkef = 1 Ps2kdat = 0 Goto Ps2krd4 ' Ps2krd3: '拡張キーコード or キーが離された処理。 Keysta = Temp1 Ps2kdat = 0 Goto Ps2krd4 ' Ps2krd1: '拡張・離す キー処理。 Ps2kdat = 0 If Keysta = &HE0 Then Goto Ps2krd5 'If 拡張 キー処理? Then Keysta = 0 '[F0] 離す キー処理。 If Temp1 = &H12 Then Shifkef = 0 'If [Shift] キーが離されたか? Then If Temp1 = &H59 Then Shifkef = 0 'If [Shift] キーが離されたか? Then Goto Ps2krd4 ' Ps2krd5: '[E0] 拡張 キー処理。 If Temp1 = &HF0 Then Goto Ps2krd3 'If 拡張キーが離されたか? Then If Temp1 = &H4A Then Ps2kdat = &H2F 'If テンキーの[/]? Then If Temp1 = &H5A Then Ps2kdat = &H0D 'If テンキーの[Enter]? Then Keysta = 0 Goto Ps2krd4 ' ' ********************************************************************** ' * シリアル通信ポートからの受信データを、G-LCDへ表示する サブルーチン * ' ********************************************************************** ' Rxddisp: Temp1 = Inkey() If Temp1 = 0 Then Return 'If 受信データが有り? Else ' Rxddisps: If Curdsf = 1 Then Gosub Curoffs 'If 点滅カーソルが表示中? Then Blkcun = 0 If Temp1 = &H0A Then Goto Rxddisp4 'If 改行(LF)コード? Then If Temp1 = &H0D Then Goto Rxddisp5 'If 復帰(CR)コード? Then If Temp1 = &H08 Then Goto Rxddisp6 'If 1文字消去(BS)コード? Then ' Lcdat Displin , Dispcol , Chr(temp1) 'G-LCDへ1文字表示。 Dispcol = Dispcol + 6 '列を1文字分右へ。 If Dispcol < 127 Then Return 'If 列が21文字を超えたか? Else Dispcol = 1 Rxddisp4: Displin = Displin + 1 '行を1行下へ。 If Displin < 9 Then Goto Rxddisp1 'If 行が8行を超えたか? Else Displin = 1 Rxddisp1: If Dispofc > 7 Then Goto Rxddisp2 'If 画面をスクロールするか? Then Dispofc = Dispofc + 1 Return ' ' Rxddisp2: '画面をスクロールする。 Cls Displin , 1 , 64 '1行分をブロック・クリアする(左半分)。 Cls Displin , 65 , 128 '1行分をブロック・クリアする(右半分)。 Dispofs = Dispofs + 8 'G-LCDのオフセット値に8をプラス。 If Dispofs < 64 Then Goto Rxddisp3 'If G-LCDのオフセット値が最大を超えたか? Else Dispofs = 0 Rxddisp3: Temp1 = &HC0 Or Dispofs 'G-LCDのオフセットコマンドを作成。 Glcdcmd Temp1 , 1 'チップ1に、オフセットコマンドを送る。 Glcdcmd Temp1 , 2 'チップ2に、オフセットコマンドを送る。 Return ' Rxddisp5: '復帰(CR)コードの処理。 Dispcol = 1 Return ' Rxddisp6: '1文字消去(BS)コードの処理。 If Dispcol = 1 Then Goto Rxddisp7 'If 前行へ移動? Then Dispcol = Dispcol - 6 Rxddisp8: Lcdat Displin , Dispcol , " " 'G-LCDへスペースを表示。 Return ' Rxddisp7: '1文字消去(BS)で、前行へ移動。 Dispcol = 121 Dispofc = Dispofc - 1 Displin = Displin - 1 If Displin <> 0 Then Goto Rxddisp8 'If 行の折り返し? Else Displin = 8 Goto Rxddisp8 ' ' ********************************** ' * 10mS タイマー処理 サブルーチン * ' ********************************** ' T10msec: If Tifr0.ocf0a = 0 Then Return 'If 10mS経過したか? Else Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 ' ' * PS/2キーボードのタイムアウトを検出する * ' Disable Int0 '[INT0]の割り込みを禁止。 If Ps2tmof <> 0 Then 'If PS/2キーボードのタイムアウト検出フラグが立っている? Then Ps2tmof = Ps2tmof - 1 If Ps2tmof = 0 Then 'If タイムアウトが発生したか? Then Ps2kcun = 0 End If End If Enable Int0 '[INT0]の割り込みを許可。 ' ' * カーソルを点滅させる * ' If Blkcun = 0 Then Gosub Curons 'If カーソルを表示する? Then If Blkcun = 50 Then Gosub Curoffs 'If カーソルを消去する? Then Blkcun = Blkcun + 1 If Blkcun > 100 Then Blkcun = 0 Return ' ' ************************************** ' * 点滅カーソルを表示するサブルーチン * ' ************************************** ' Curons: $asm LDS R20,{Dispcol} 'R20 = G-LCD Xアドレス LDS R21,{Displin} 'R21 = G-LCD Yアドレス RCALL _glocate 'G-LCDライブラリのアドレスセット ルーチン RCALL _gRead_data 'G-LCDライブラリのデータ読み込み ルーチン RCALL _gRead_data 'G-LCDライブラリのデータ読み込み ルーチン STS {Blktemp},R1 'カーソル・点滅位置のデータを保存。 ' LDS R20,{Dispcol} 'R20 = G-LCD Xアドレス LDS R21,{Displin} 'R21 = G-LCD Yアドレス RCALL _glocate 'G-LCDライブラリのアドレスセット ルーチン COM R1 MOV R24,R1 RCALL _gwrite_data 'G-LCDライブラリのデータ書き込み ルーチン $end Asm Curdsf = 1 'カーソル・表示状態フラグをセット。 Return ' ' ************************************** ' * 点滅カーソルを消去するサブルーチン * ' ************************************** ' Curoffs: $asm LDS R20,{Dispcol} 'R20 = G-LCD Xアドレス LDS R21,{Displin} 'R21 = G-LCD Yアドレス RCALL _glocate 'G-LCDライブラリのアドレスセット ルーチン LDS R24,{Blktemp} RCALL _gwrite_data 'G-LCDライブラリのデータ書き込み ルーチン $end Asm Curdsf = 0 'カーソル・表示状態フラグをリセット。 Return ' End ' ' ********************************************** ' * PS/2 キーボード Clock 割り込み処理ルーチン * ' ********************************************** ' Ps2kint: $asm PUSH R0 'R0は、拡張I/Oレジスタへのアクセスに使用する。 PUSH R23 'R23は、拡張I/Oレジスタへのアクセスに使用する。 PUSH R1 IN R1,SREG 'ステータス・レジスタを待避。 PUSH R16 PUSH R17 ; LDS R17,{PS2KCUN} 'R17 = PS/2 キー・カウンタ。 CPI R17,$09 BRCC Ps2kint1 'If データbit読み込み終了(Start+8bit) ? Then CPI R16,$00 BRNE Ps2kint2 'If キー・カウンタ <> 0 ? Then LDI R16,$03 STS {PS2TMOF},R16 'キー入力 タイムアウト・フラグをセット。 Ps2kint2: LDS R16,{Ps2ktmp} 'R16 = PS/2 キー・データ。 LSR R16 SBIC PS2DTPT,PS2DTPN 'If PS/2キーボードの[DATA]ピン = 0 ? Then ORI R16,$80 ; STS {Ps2ktmp},R16 'キー・データを保存。 Ps2kint3: INC R17 'キー・カウンタを更新。 Ps2kint4: STS {PS2KCUN},R17 'キー・カウンタを保存。 ; POP R17 POP R16 Out Sreg , R1 'ステータス・レジスタを復帰 POP R1 POP R23 POP R0 $end Asm Return ' $asm Ps2kint1: 'パリティとストップ ビットを読み飛ばす。 CPI R17,$0A BRCS Ps2kint3 'If [CLOCK]が11個目 ? Else ; PUSH XL 'PS/2 キー・データ バッファにデータを書き込み。 PUSH XH Loadadr Keybuf(1) , X 'PS/2 キー・データ バッファの書き込み位置を計算。 LDS R16,{Kbufpoi} CLR R17 ADD XL,R16 ADC XH,R17 LDS R17,{Ps2ktmp} 'R17 = PS/2 キー・データ。 ST X,R17 'キー・データをバッファへ書き込む。 ; INC R16 'ポインタを進める。 CPI R16,Kbuflen 'ポインタの位置をチェック。 BRCS Ps2kint5 'If ポインタがバッファの最終位置? Else CLR R16 Ps2kint5: STS {Kbufpoi},R16 'ポインタの位置を保存。 POP XH POP XL LDI R17,$00 'キー・カウンタをリセットする。 STS {PS2TMOF},R17 'キー入力 タイムアウト・フラグをリセット。 RJMP Ps2kint4 $end Asm ' End ' ' ******************* ' * フォント データ * ' ******************* ' Offont6x8: $asm .db 1 , 6 , 6 , 0 .db $00 , $00 , $00 , $00 , $00 , $00 ' .db $00 , $00 , $00 , $5f , $00 , $00 ' ! .db $00 , $00 , $07 , $00 , $07 , $00 ' ” .db $00 , $14 , $7f , $14 , $7f , $14 ' # .db $00 , $24 , $2a , $7f , $2a , $12 ' $ .db $00 , $23 , $13 , $08 , $64 , $62 ' % .db $00 , $36 , $49 , $55 , $22 , $50 ' & .db $00 , $00 , $05 , $03 , $00 , $00 ' ’ .db $00 , $00 , $1c , $22 , $41 , $00 '( .db $00 , $00 , $41 , $22 , $1c , $00 ' ) .db $00 , $14 , $08 , $3e , $08 , $14 ' * .db $00 , $08 , $08 , $3e , $08 , $08 ' + .db $00 , $00 , $50 , $30 , $00 , $00 ' , .db $00 , $08 , $08 , $08 , $08 , $08 ' - .db $00 , $00 , $60 , $60 , $00 , $00 ' . .db $00 , $20 , $10 , $08 , $04 , $02 ' / .db $00 , $3e , $51 , $49 , $45 , $3e ' 0 .db $00 , $00 , $42 , $7f , $40 , $00 ' 1 .db $00 , $62 , $51 , $49 , $49 , $46 ' 2 .db $00 , $22 , $41 , $49 , $49 , $36 ' 3 .db $00 , $18 , $14 , $12 , $7f , $10 ' 4 .db $00 , $27 , $45 , $45 , $45 , $39 ' 5 .db $00 , $3c , $4a , $49 , $49 , $30 ' 6 .db $00 , $01 , $71 , $09 , $05 , $03 ' 7 .db $00 , $36 , $49 , $49 , $49 , $36 ' 8 .db $00 , $06 , $49 , $49 , $29 , $1e ' 9 .db $00 , $00 , $36 , $36 , $00 , $00 ' : .db $00 , $00 , $56 , $36 , $00 , $00 ' ; .db $00 , $08 , $14 , $22 , $41 , $00 ' < .db $00 , $14 , $14 , $14 , $14 , $14 ' = .db $00 , $00 , $41 , $22 , $14 , $08 ' > .db $00 , $02 , $01 , $51 , $09 , $06 ' ? ' .db $00 , $32 , $49 , $79 , $41 , $3e ' @ .db $00 , $7e , $11 , $11 , $11 , $7e ' A .db $00 , $7f , $49 , $49 , $49 , $36 ' B .db $00 , $3e , $41 , $41 , $41 , $22 ' C .db $00 , $7f , $41 , $41 , $22 , $1c ' D .db $00 , $7f , $49 , $49 , $49 , $41 ' E .db $00 , $7f , $09 , $09 , $09 , $01 ' F .db $00 , $3e , $41 , $49 , $49 , $7a ' G .db $00 , $7f , $08 , $08 , $08 , $7f ' H .db $00 , $00 , $41 , $7f , $41 , $00 ' I .db $00 , $30 , $40 , $40 , $40 , $3f ' J .db $00 , $7f , $08 , $14 , $22 , $41 ' K .db $00 , $7f , $40 , $40 , $40 , $40 ' L .db $00 , $7f , $02 , $0c , $02 , $7f ' M .db $00 , $7f , $04 , $08 , $10 , $7f ' N .db $00 , $3e , $41 , $41 , $41 , $3e ' O .db $00 , $7f , $09 , $09 , $09 , $06 ' P .db $00 , $3e , $41 , $51 , $21 , $5e ' Q .db $00 , $7f , $09 , $19 , $29 , $46 ' R .db $00 , $26 , $49 , $49 , $49 , $32 ' S .db $00 , $01 , $01 , $7f , $01 , $01 ' T .db $00 , $3f , $40 , $40 , $40 , $3f ' U .db $00 , $0f , $30 , $40 , $30 , $0f ' V .db $00 , $1f , $60 , $1c , $60 , $1f ' W .db $00 , $63 , $14 , $08 , $14 , $63 ' X .db $00 , $07 , $08 , $70 , $08 , $07 ' Y .db $00 , $61 , $51 , $49 , $45 , $43 ' Z .db $00 , $00 , $7f , $41 , $41 , $00 ' [ .db $00 , $15 , $16 , $7c , $16 , $15 ' \ .db $00 , $00 , $41 , $41 , $7f , $00 ' ] .db $00 , $04 , $02 , $01 , $02 , $04 ' ^ .db $00 , $40 , $40 , $40 , $40 , $40 ' _ ' .db $00 , $00 , $01 , $02 , $04 , $00 ' ` .db $00 , $20 , $54 , $54 , $54 , $78 ' a .db $00 , $7f , $48 , $48 , $48 , $30 ' b .db $00 , $38 , $44 , $44 , $44 , $28 ' c .db $00 , $30 , $48 , $48 , $48 , $7f ' d .db $00 , $38 , $54 , $54 , $54 , $18 ' e .db $00 , $00 , $08 , $7e , $09 , $01 ' f .db $00 , $0c , $52 , $52 , $52 , $3e ' g .db $00 , $7f , $08 , $04 , $04 , $78 ' h .db $00 , $00 , $00 , $7d , $00 , $00 ' i .db $00 , $20 , $40 , $40 , $3d , $00 ' j .db $00 , $7f , $10 , $28 , $44 , $00 ' k .db $00 , $00 , $00 , $7f , $40 , $00 ' l .db $00 , $7c , $04 , $78 , $04 , $78 ' m .db $00 , $7c , $08 , $04 , $04 , $78 ' n .db $00 , $38 , $44 , $44 , $44 , $38 ' o .db $00 , $7c , $14 , $14 , $14 , $08 ' p .db $00 , $08 , $14 , $14 , $14 , $7c ' q .db $00 , $7c , $08 , $04 , $04 , $08 ' r .db $00 , $48 , $54 , $54 , $54 , $20 ' s .db $00 , $00 , $04 , $3e , $44 , $20 ' t .db $00 , $3c , $40 , $40 , $20 , $7c ' u .db $00 , $0c , $30 , $40 , $30 , $0c ' v .db $00 , $3c , $40 , $38 , $40 , $3c ' w .db $00 , $44 , $28 , $10 , $28 , $44 ' x .db $00 , $0c , $50 , $50 , $30 , $1c ' y .db $00 , $44 , $64 , $54 , $4c , $44 ' z .db $00 , $00 , $08 , $36 , $41 , $00 ' { .db $00 , $00 , $00 , $77 , $00 , $00 ' | .db $00 , $00 , $41 , $36 , $08 , $00 ' } .db $00 , $02 , $01 , $02 , $01 , $00 ' ~ .db $00 , $7f , $7f , $7f , $7f , $7f ' \ $end Asm ' ' **************************************************** ' * キー・スキャンコード → ASCIIコード 変換テーブル * ' **************************************************** ' Keydata: '通常の小文字キー Data &H00 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 '0x Data &H00 , &H00 , &H00 , &H00 , &H00 , &H71 , &H31 , &H00 , &H00 , &H00 , &H7A , &H73 , &H61 , &H77 , &H32 , &H00 '1x Data &H00 , &H63 , &H78 , &H64 , &H65 , &H34 , &H33 , &H00 , &H00 , &H20 , &H76 , &H66 , &H74 , &H72 , &H35 , &H00 '2x Data &H00 , &H6E , &H62 , &H68 , &H67 , &H79 , &H36 , &H00 , &H00 , &H00 , &H6D , &H6A , &H75 , &H37 , &H38 , &H00 '3x Data &H00 , &H2C , &H6B , &H69 , &H6F , &H30 , &H39 , &H00 , &H00 , &H2E , &H2F , &H6C , &H3B , &H70 , &H2D , &H00 '4x Data &H00 , &H5C , &H3A , &H00 , &H40 , &H5E , &H00 , &H00 , &H00 , &H00 , &H0D , &H5B , &H00 , &H5D , &H00 , &H00 '5x Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H08 , &H00 , &H00 , &H31 , &H5C , &H34 , &H37 , &H00 , &H00 , &H00 '6x Data &H30 , &H2E , &H32 , &H35 , &H36 , &H38 , &H1B , &H00 , &H00 , &H2B , &H33 , &H2D , &H2A , &H39 , &H00 , &H00 '7x ' 'シフトした大文字キー Data &H00 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 '0x Data &H00 , &H00 , &H00 , &H00 , &H00 , &H51 , &H21 , &H00 , &H00 , &H00 , &H5A , &H53 , &H41 , &H57 , &H22 , &H00 '1x Data &H00 , &H43 , &H58 , &H44 , &H45 , &H24 , &H23 , &H00 , &H00 , &H20 , &H56 , &H46 , &H54 , &H52 , &H25 , &H00 '2x Data &H00 , &H4E , &H42 , &H48 , &H47 , &H59 , &H26 , &H00 , &H00 , &H00 , &H4D , &H4A , &H55 , &H27 , &H28 , &H00 '3x Data &H00 , &H3C , &H4B , &H49 , &H4F , &H00 , &H29 , &H00 , &H00 , &H3E , &H3F , &H4C , &H2B , &H50 , &H3D , &H00 '4x Data &H00 , &H5F , &H2A , &H00 , &H60 , &H7E , &H00 , &H00 , &H00 , &H00 , &H0D , &H7B , &H00 , &H7D , &H00 , &H00 '5x Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H08 , &H00 , &H00 , &H31 , &H7C , &H34 , &H37 , &H00 , &H00 , &H00 '6x Data &H30 , &H2E , &H32 , &H35 , &H36 , &H38 , &H1B , &H00 , &H00 , &H2B , &H33 , &H2D , &H2A , &H39 , &H00 , &H00 '7x ' 0 1 2 3 4 5 6 7 8 9 A B C D E F