8080のTinyBASICで遊ぶ その4 – 走らせる。

走らせる。当時はプログラムを実行することを「走らせる」と表現した。もちろんTinyBASICのユーザープログラムを実行するコマンドも「RUN(走れ)」だ。

※これまでのエントリ

1.8080 C-Sim本体、TinyBASIC入りファーム、ビルド済みWin32 Exe
https://mzex.wordpress.com/2018/05/26/12977/

3.サンプルコード
https://mzex.wordpress.com/2018/05/26/12986/

1のエントリからBase64デコード+unzipしてPATBSIM.EXE、PATBSIM.HEXを取り出したら実行する。

「PALO ALTO TINY BASIC V3.0/OK/>」 と出たら成功。

patbsim-1

PRINT 3+3*3 [Enter]

と入力すると、四則演算の結果として

12

が表示されればそこはもうハローTiny BASICワールド。

TinyBASIC本体には一切の拡張を行っていないしWindows GUI対応とか、64ビット対応なんて、なんてもってのほか。したがって文法、コマンドは完全にPALO ALTO TINY BASIC V3.0仕様。コマンド、ステートメント、変数名は大文字で。小文字はストリング(文字列リテラル)内のみで使用可能。バックスペースはカーソルが戻るだけでコンソールの文字は消えないが、内部のラインバッファは消去される。

Ctrl-Cでシミュレータのコンソールに切り替え、1:LoadResでコンソール読み込みのファイル名を指定 (prime.bas)、指定ファイルがキー入力として流し込まれる。(いわゆるLOADコマンドの代わり)

あとはRUN[Enter]するだけ。省略表記でR.でもよい。

patbsim-2

Ctrl-Cで出てくるメニューで終了を含む各種制御ができる。9:Shutdownで終了。

Tiny BASICのソースを用意すればスタートレックだって遊べる。STARTREK.BASの動作が若干バギーなのでコードは掲載しない。

patbsim-3.JPG

ちょっとだけ解説というか個人的感想。

Tiny BASICを動かしたければ、単純にWindowsで動くインタプリタを用意すればよいのだが、オリジナルのPALO ALTO TINY BASICのコードをできるだけいじらずに動かしたかったので8080シミュレータ(エミュレータ)を作り、その中でPALO ALTO TINY BASICのコードを動かすことにした。8080アセンブラで書かれたインタプリタをWin32なアセンブラやCに移植するよりは、単純な8080エミュレータを新規に組むほうが確実だろう。目的としてタイニーBASICを動かすこと以外は考えていないが、テストプログラムですべてのマシン語命令が動くことは確認しているのでファームとI/OポートやメモリマップドI/Oを追加すれば他の8080マシンのエミュレーションにも使えるとは思う。

今回作ったC-Simがエミュレータというのかシミュレータというのかは微妙で、クロックサイクルや割り込みタイミングの再現やらオペコードの分解解釈などを実装しているのでエミュレーションに近いと思う。再現しているのは8080CPU本体と64kBytesメモリのほかはIOポート3種類と簡易ICE機能のみ。本当はディスクIFとBIOSを実装してCP/M互換機にしたいが「今後の実装」ってことで放置。

自分が生まれる前の市販マイコン登場前夜に個人が作ってたマイコンってこんな雰囲気だったんだろうか。できればその時代の最先端に触れたかった。うらやましい。

広告

8080のTinyBASICで遊ぶ その3 – サンプルコード

前回、前々回で作ったC-SimとPALO ALTO TINY BASICベースのファームで動く簡単なTiny BASICのサンプルコード。どこかの資料から拝借したそのままだと思う。

PRIME.BAS 指定した数値までの素数を表示

1010 INPUT "MAX",M
1100 IF M >= 2 PRINT 2, " IS PRIME NUMBER."
1200 A = 3
1210 GOSUB 2000
1220 A = A+2
1230 IF A<=M GOTO 1210
1340 STOP
2000 I = 3
2005 E = A/3
2010 IF I > E GOTO 2100
2020 IF A/I*I = A RETURN
2030 I = I+2
2040 GOTO 2010
2100 PRINT A," IS PRIME NUMBER."
2110 RETURN

RNDSORT.BAS 10個のランダムな値をソートして表示。

100 REM SET 10 RANDOM VALUES
110 FOR I=0 TO 9
120 @(I)=RND(1000) 
130 NEXT I
140 REM SORT
150 FOR I=8 TO 0 STEP -1
160 FOR J=0 TO I
170 GOSUB 510
180 NEXT J
190 NEXT I
200 REM PRINT
210 FOR I=0 TO 9
220 PRINT #5,@(I)
230 NEXT I
240 STOP
500 REM SWAP SUBROUTINE
510 IF @(J)>=@(J+1) GOTO 550
520 T=@(J);@(J)=@(J+1);@(J+1)=T
550 RETURN

8080のTinyBASICで遊ぶ その2 – TinyBASIC本体コード

8年くらい前に作った8080シミュレータで動くPalo Alto Tiny BASICのオブジェクトコード。

前回のエントリ。ソース、ビルド済みExe一式。
https://mzex.wordpress.com/2018/05/26/12977/

次のエントリ。役に立たない学術的なTinyBASICサンプルコード。
https://mzex.wordpress.com/2018/05/26/12986/

前回のMIMEデコードした圧縮ファイルにも含めているが、TinyBASICは本物の8080用のコードを使う。

BASIC Programming Resources and Chipmunk Basic Archive
http://www.nicholson.com/rhn/basic/basic.info.html

ここからもらってきた「Palo Alto Tiny BASIC Interpreter Version 3.0」の最後の部分にある1文字出力、1文字入力、入力チェックルーチンはシミュレータに合わせて変更する。基本的にはCP/M-80の低水準入出力と同じ仕様にしてある。アセンブルはCP/M用のDigital Research Macro Assembler (MAC) を適当なCP/Mシミュレータで動かしてPATBSIM.HEXファイルを作成する。MACが使えない場合はHEXファイルをパッチするのも一興。

PALO ALTO TINY BASIC V3.0 末尾の入出力部抜粋。

;
CRLF: 	MVI 	A, 0DH  		;CR in A
;    				;***********************
OUTCH:	JMP 	USEOUT  	;*** JMP USER-OUTPUT ***
;    				;***********************
CHKIO: 	JMP 	USEINP  	;*** JMP USER-INPUT  ***
;    				;***********************
GETLN: 	LXI 	D, BUFFER 	;*** MODIFY THIS *******
;    				;***********************
GL1: 	CALL 	OUTCH  	;prompt or echo
GL2:
 	CALL 	CHKIO  		;get a character
 	JZ 	GL2  		;wait for input
 	CPI 	LF
 	JZ 	GL2
L3: 	STAX 	D  		;save char.
 	CPI 	08H  		;is it Back-Space?
 	JNZ 	GL4  		;no, more tests
 	MOV 	A, E  		;yes, delete?
 	CPI 	LOW BUFFER
 	JZ 	GL2  		;nothing to delete
 	LDAX 	D  		;delete
 	DCX 	D
 	JMP 	GL1
GL4: 	CPI 	CR  		;was it CR?
 	JZ 	GL5  		;yes, end of line
 	MOV 	A, E  		;else, more free room?
 	CPI 	LOW BUFEND
 	JZ 	GL2  		;no, wait for CR/Rub-Out
 	LDAX 	D  		;yes, bump pointer
 	INX 	D
 	JMP 	GL1
GL5: 	INX 	D  		;end of line
 	INX 	D  		;bump pointer
 	MVI 	A, 0FFH  	;put marker after it
 	STAX 	D
 	DCX 	D
 	JMP 	CRLF
;-------------------------------
USEOUT:
	OUT	1
 	CPI 	CR  		;was it CR?
 	RNZ   			;no, return
 	MVI 	A, LF  		;yes, give LF
 	CALL 	USEOUT
 	MVI 	A, CR
 	RET
;-------------------------------
USEINP:
	IN	2
	ORA	A
 	RZ   			;no input, return zero
;-------------------------------
	IN	3
 	ANI 	7FH
 	CPI 	3  		;is it Control-C?
 	RNZ   			;no, return char
 	JMP 	INIT  		;yes, restart
;-------------------------------
	END

8080のTinyBASICで遊ぶ その1 – C-Sim本体

8年位前に作った8080シミュレータ本体。VC6でコンパイルできたはず。VS2018でもコンパイルは通ったが入力がおかしくなったので入力周りの調整が必要だと思われる。

※生テキストを掲載していたらいつの間にかWordpressのエスケープが半角の山カッコあたりを壊して使い物にならなくなってて「What?」とか言われたのでBase64エンコードに変更。

8080 C-Simソースとビルド済みのWin32 EXE、TinyBASIC入りファームのソースとビルドしたHEXファイルをzip圧縮してmime/base64エンコードしたものを掲載した。Windowsならファイル(patbsim_src_zip.txt)に保存してからcertutilでデコードできる。Linuxならbase64とか。patbsim_src.zipに変換して展開。それだけで実行可能。

certutil -f -decode patbsim_src_zip.txt patbsim_src.zip
unzip patbsim_src.zip
patbsim

使い方は次のエントリで。
8080のTinyBASICで遊ぶ その4 – 走らせる。
https://mzex.wordpress.com/2018/05/26/12989/

[patbsim_src.txt]

-----BEGIN CERTIFICATE-----
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
vMRYtN/UAVBLBQYAAAAABAAEAHIBAACVwQAAAAA=
-----END CERTIFICATE-----

オペコード解析の分岐をテーブル化してないのは意図的。テーブル化すればコンパイラの最適化よりも確実に早くなると思う。

とりあえず、非プログラマだって8080の仕様書見て原理的エミュレータくらい組めるよって言いたかった。

Spectre、Meltdown対策を完全にしてみる。

3日前にようやくSandy Bridge世代以降のSpectre、Meltdown対策のマイクロコード更新が始まったのにあわせて、(放置していた)PCのファームウェア更新をしてみた。

自宅ではこれに該当するのはIvy Bridge世代のDQ77MK、DQ77KBのインテルマザーベースのデスクトップPCとBroadwell世代のHP製i5ノートPC。自分が使っていないECSのSandy BridgeマザーベースのデスクトップPCはBIOS更新が2013年で止まって放置プレイで対象外。

DQ77MKマザーは2018年3月29日にインテルがリリースしたBIOSアップデート [MKQ7710H 86A] 0073を適用する。インテルマザーの常なのかBIOSアップデートがいつもながらうまくいかない。起動時F7キー押下ではIntel MEファームの更新で失敗する。BIOSリカバリーモードで更新するのは分解してジャンパーをいじる必要があって面倒なのでやりたくなかったが、なぜか3回同じF7操作を試したら更新がかかった。更新後デバイスマネージャをよく見るとプライマリNICを認識しておらず、BIOS設定のファクトリーリセットを行ったら回復してきた。

DQ77KBマザーも2018年3月29日にリリースされているBIOSップデート [KBQ7710H 86A] 0060を適用するのだが、これがドはまり。

・起動時F7キー押下でIntel ME Firmware更新がエラーで進まず。
・分解してリカバリーBIOSモードでは更新できたが、セカンダリNIC、WLANアダプタ(Wi-Fi 7260AC)を認識せず使えなくなった。温度、ファン回転数も取得できなくなった。起動時にシャーシイントリュージョンエラーが必ず出る。
・BIOS設定のファクトリーリセットを行ったが変わらず認識しない。
・もう一度ファームバージョン0060でFlash再書き込みしても変わらず。
・更新前のファームバージョン0059に戻したのにNIC、センサーとも回復しない。シャーシイントリュージョンも変わらず。
・バックアップ電池抜き、MBEXリセットとかやっても変わらない。
・Intel MEのファームを上書きで初期化したが特に変わらず。
半日ハマったorz…

結局次の手順でようやく各種デバイスの回復とファーム更新が完了。
ファームバージョン0053(KB0053P.BIO)をBIOSリカバリーモードで書き込んでNIC、センサー、WLANアダプタの認識とChassis Intrusionエラーが出ないことを確認。
・ファームバージョン0060(KB0060.BIO、最新のもの)にBIOSリカバリーモードで更新。

HPノートはメーカサイトから一番簡単そうなWindows EXE版のツールをダウンロードして更新。更新は特に問題なし。起動直後とかSSDのアクセスが多い時の動作が明らかに遅くなったorz…

更新前後で効果があるか確認した。DQ77MKの画面だが、他も同じ。

CPUの脆弱性「Meltdown」「Spectre」に関する状態を確認する – マイナビニュース
https://news.mynavi.jp/article/win10tips-247/

更新前
melt1

更新後
melt2

これであと5年戦える。MSはWin10サポート外のはずのSandyに手を打ってるし、Intelもサポート期限切れ製品なのに対応してくれたっていうのはえらいと思う。でもノートPCは明らかに遅くなったわ。

スペクターとメルトダウンから Windows デバイスを保護する
https://support.microsoft.com/ja-jp/help/4073757/protect-your-windows-devices-against-spectre-meltdown

KB4100347: Intel microcode updates
https://support.microsoft.com/en-us/help/4100347/intel-microcode-updates-for-windows-10-version-1803-and-windows-server

Windows 8.1のDOS起動ディスクの中身の使い方。

Windows XP~8.1まであった機能、フロッピーフォーマット時の「MS-DOSの起動ディスクを作成する」オプション。Windows10で無くなったが、これでできるディスクの内容が日本人にとっては意味不明。英語が分からないとかじゃなくて、ファイルの内容が。

win81fd1

Windows MeのDOS部分が普通に起動できるのだが、
win81fd2

これらのファイルの使い道を知りたい。
win81fd3

ggrksると「IO.SYS、MSDOS.SYS、COMMAND.COM以外は要らないので消すべし。」みたいなのが出てきて疑問に答えてくれない。

実際にはこれらのファイルはフォントとキーボードレイアウトを各国仕様に変更するのに使う。フォーマット後のFDにできているCONFIG.SYSとAUTOEXEC.BATを適切に調整すれば自国で使ってる基本的な環境が整う状態になっている。もちろん国際化対応は日本も例外ではないが、2バイト文字フォントは入れられないのでキーボードだけの対応になる。具体的には次のようにCONFIG.SYS、AUTOEXEC.BATを修正する。

CONFIG.SYS

DEVICE=\DISPLAY.SYS CON=(EGA,437,6)

AUTOEXEC.BAT

MODE CON CP PREP=((437 850 852 860 863 865) \EGA.CPI)
MODE CON CP SEL=437
KEYB US,437,\KEYBOARD.SYS

これで表示に関してはmodeコマンドでmode con cp sel=850などコードページを437 850 852 860 863 865の中から切り替えて使える。キーボードはUS配列を指定しているので特に変わらず使えるが、KEYB HU,852,KEYBRD2.SYSでハンガリー用配列になるなど動的に切り替えができる。

win81fd4

外国語のこと知らんし っていう日本人向けおすすめ設定。これで日本語キーボードが使える。

CONFIG.SYS は0バイト(空)のまま。

AUTOEXEC.BAT

KEYB JP,437,KEYBOARD.SYS

AUTOEXEC.BATを作るだけ。フォーマット後にKEYB.COM、KEYBOARD.SYSはすでに入っているからグレーなサイトから持ってきたりする必要無し。KEYBOARD.SYSのJPはコードページ437、932の両方をサポートしているが表示側のJFONT.SYS、JDISP.SYSとフォントファイルが無いから、CP932はどうせ使えないので437を指定する。

CONデバイスのCP437を省略せずきちんと設定する場合はこんな感じ。これ以外のことはできないし、ここまで律儀に書く必要も無い。

CONFIG.SYS

DEVICE=\DISPLAY.SYS CON=(EGA,437,1)

AUTOEXEC.BAT

@ECHO OFF
MODE CON CP PREP=((437) \EGA.CPI)
MODE CON CP SEL=437
KEYB JP,437,\KEYBOARD.SYS

DOS起動ディスクの本来の使用用途は表示・キーボードの設定のためにCONFIG.SYSとAUTOEXEC.BATを作って、後はBIOS FLASHユーティリティをコピーしたらFDでPC起動してFLASHしてね、というのが正しい使い方なのだと思う。

16ビットWindowsプログラムをアセンブラしてみる。

アセンブラでWin16なWindowsプログラムを組んでみる。

リアルモード16ビットDOSのプログラムはいろいろ例が出てるのに、16ビットWindowsのプログラムは探してもほとんど無い。見つけてもINVOKEマクロで手抜きとか。ここではINVOKE無しで通常の呼出規約でAPIコールをする。ぱっと見はWin32に似ているが、結構違う。16ビットなのでレジスタの操作も16ビット単位。

これは前回のVS2017のmlとリンカではできなくてVisual C++ 6.0 SP5用のProcessor Packに入っているMASM 6.15を、リンカはVisual C++ 1.51に付いているものを使った。今のところMSDNで手に入る環境フルセットのMASM 6.11だけでもできると思う。

作成方法

ml msgbx16.asm /link libw.lib

msgbx16.asm

.model	small, pascal, nearstack
.386

MessageBox PROTO FAR PASCAL :WORD, :FAR PTR SBYTE, :FAR PTR SBYTE, :WORD


.code
Start:
	sub	sp, 4
	
	push	word ptr 0
	push	ds
	push	offset strMsg
	push	ds
	push	offset strCapt
	push	word ptr 40h
	call	far ptr MessageBox

	mov	ax, 4c00h
	int	21h


.data
strCapt	db 'msgbx16', 0
strMsg	db 'Hello World !', 0


.stack
	db	100 dup (0)


	end	Start

動作はVMware上のWindwos2000Pro。

masmwin

VS2017のml.exe、ml64.exeを使ってみる。

アセンブラでWindowsのプログラムってどうやったらできるのかな? って思った。ずっと前にMASM32とか調べたら高機能マクロで簡単にできるよとか書いてあって、そんならCでやるわってなってから放置してた。

VS2017に付いてるml.exe(14.13.26132.0)の32ビット版でMessageBoxAを叩いて終わるだけのもの。これでも一応APIの呼び方は分かる。スタックに押し込んでAPIをコール。

msgbx.asm

.model	flat, stdcall

extern	MessageBoxA@16 : proc
extern	ExitProcess@4 : proc

public Start

.code
Start:
	push 40h
	push offset strCapt
	push offset strMsg
	push 0
	call MessageBoxA@16

	push eax
	call ExitProcess@4

.data
strCapt	db 'msgbx', 0
strMsg	db 'Hello World !', 0

end

アセンブルとリンクはml一行で完結。

ml msgbx.asm /link /subsystem:windows /Entry:Start kernel32.lib user32.lib

devenv.exe msgbx.exeでデバッグ。debugやsymdebと同じtやpやrコマンドが使える。

msgbx-devenv

64ビット版も作った。FASTCALL規約でAPIの引数がスタックではなくてレジスタを使う。

msgbx64.asm

extern	MessageBoxA : proc
extern	ExitProcess : proc

public	Start

.code
Start:
	sub rsp, 8h
	
	mov rcx, 0
	lea rdx, strMsg
	lea r8, strCapt
	mov r9, 40h
	call MessageBoxA

	mov ecx, 0
	call ExitProcess

.data
strCapt	db 'msgbx64', 0
strMsg	db 'Hello World !', 0

end
ml64 msgbx64.asm /link /subsystem:windows /entry:Start kernel32.lib user32.lib

ちゃんと確認してないので良くわからないが、APIへのコールは実際にはソースコードには明示されない記述したコードの後ろに暗黙に作られた最初のジャンプテーブル(callではなくjmp)を向いており、そこからリンカがくっつけたkernel32.lib、user32.libに含まれるAPI呼び出しコードへ引き継がれていく。それからライブラリに含まれる何十ステップものコードを経由した後、ローダが初期化したインポートテーブルを介してAPIが呼ばれるっぽい。面倒になってライブラリの内部は追いかけなかった。冒頭でMessageBoxAを叩いているなどと格好良く書いたが、本当はSDKのライブラリを呼んでいるだけ。アセンブラは闇が奥が深い。

Windows 10 EnterpriseをApril 2018 Update(1803)してみる。

ノートPCで使っているVL版(ボリュームライセンス版)のWindows 10 Enterprise、1703なので先日出た1803に更新してみる。

前回のFall Creators Update(1703)それ以前のCreators Updateと比べて、今回は超簡単だった。スタート→設定→更新プログラムのチェック。あとは完了まで若干の操作を除いて放置するだけ。約1.5時間。

Win10EntUpd1803

で終わったところ。前回見た「お使いのPCは監視され、…」の表示は無くなった。

Win10Ent1803-1

Win10Ent1803-2

今回もちょっと不具合。

・スキャナのユーティリティEPSON SCANが消えた。前回も、前々回も発生したのと同じ症状。EPSON SCANを再インストールして復活。読み取り設定などは消えずに残っていた。

・Synapticsのトラックパッドが使えなくなった。今回初めて。Win+X→デバイスマネージャ→マウスと他の…からSynaptic PS/2…を関連ファイルごと削除→再起動で自動的に再認識。設定→デバイス→マウス→その他のマウスオプションを開くと新しいツールのセットアップが始まった。

不具合はこれくらいだった。細かいところがいろいろ変わってる。表示切替時の効果が早くなった(アニメーションが完了するまでの時間が短くなった)気がするが気のせい?

『インサイド Visual InterDev』を読んだ。

ASPとVisual InterDevをいまさらちゃんと知りたくなったので『インサイド Visual InterDev』を古書で買ってきた。この本はアマゾンの英語版のレビューも「最悪!」っていう感じで書かれてるから、よっぽどひどいのだろう。今回読んだのはもちろん日本語版だが同じように感じた。

vid-ms1

「マイクロソフト公式解説書」シリーズって微妙で、詳しすぎてわけわからんすぎるか、とんでもない良書か、そうでなければただのウォークスルー・製品・新機能紹介。この本は後者。今更クラシックASPってのもどうかと思うが、なんでかASP.netな現在も「ASP最高!」ていう人もいるようで、ほーんそんなにええんかーと思ったのが起因。VIDがまだ現役だったころのウェブサイトといえばLAMP(Linux+Apache+MySQL+Perlとかの構成)がはやりだったが、個人的に管理してたイントラサイトはWIOP (Windows+IIS+Oracle+JSP)という変態構成だった。Windows ServerやOracleが比較的自由に使えたことと、MySQLとPHPが嫌いなことと、Linuxは他に使える人が居ないという理由で。MSのプロダクトはLinuxより好みだが、でもASPは「ダメなテクノロジー」と考えてたから使わなかった。

今回はVMWare14上にWindows NT 4.0 Workstation SP6にVisual Studio 97をセットアップして動作を確認した。すごくシンプルな感じで確かに「(ASP.netにはついてけないから)ASP最高!」になるのも分からなくも無いと思った。

vid-ms2

本の帯に「VB,VJ++を両方使いたいならコレ!!」って書いてあるからVJ++も使うんかと思ってわくわくしてたけど「VJと同じIDEが使える」とか「VJのプロジェクトも含めることができる」とかそういうことしか書いてない。サンプルプロジェクトもサンプルコードの1つも無し。この本ではVJ++は全然使えるようにならない。VBは「VBあればDesign-Time Control作れる」って書いてあってサンプルが載ってるけど「インターフェース」やら「コントロール」やらさらっと出てきて、この本だけではたぶん無理。しかもちゃんとやろうとすると(VB CCEでがんばるのでなければ)VB5 Professional以上が要るし、Design-Time Control SDKなんてのを追加で入れないといけないしで結構しんどい。しかもDesign-Time Control SDKは今は公開されておらず、MSDNサブスクライバダウンロードで「Web Control SDK and DDKs」という名で入手できたからMSDN入っててよかったと心底思った。この帯は「VBScript,JScriptを両方使いたいなら」を書き間違えたんだろう。

Web系・オープン系な人ですらもはや知らない人が多い気がする自称高機能Web開発環境Visual InterDev。この本はVisual InterDev 1.0がターゲットでこの環境もたいがいひどい。Visual Studio 97の開発環境とは言ってるが、オートコンプリートはおろかWYSIWYG編集もほぼできないしデバッガ機能も無いしできないことはFrontPageやその他のツールに丸投げ。自動FTP機能付きマルチファイルテキストエディタっていうくらいのが良い。もっと高機能なVisual InterDev 6.0は持ってるけどあえて使わないプレイ。

今更ASPでなんかしようというのは、いろいろ無理ゲーだとわかった。「(レガシー|クラシック)ASP最高!」と今から始めようとするのはよした方がいい。すでにMS含めてウェブ上の資料もかなり消滅してるし、ASPがダメだったのは歴史が証明している。