親愛なる友人、この記事は、Dos、80x25ビデオモード、および旧式のアプリケーション開発者の他の「素晴らしい小さなこと」を覚えているすべての人に捧げられています。 また、これを知りたい人もいます。
以下は、このストーリーの背景です。 2000年代の初め、私が学生だったとき、素晴らしいデバイス(ポケットパーソナルコンピューター)がありました:Microsoft Windows Pocket PC 2002オペレーティングシステムがインストールされたCompaq iPAQ H3800。この場所にインターネットもパソコンもありません。 そして、このデバイスと脳細胞を伸ばすという学生の大きな欲求だけが、些細なクロス/スキャンワードではなく、もっと興味深いものです。 このデバイスで村に行く前に、私はPocketDOSと呼ばれるDosオペレーティングシステムエミュレーターをインストールし、当時の私の「参考書」であったことを認めます。これは著者S. Zubkovの素晴らしい作品です。 Dos、Windows、およびUNIX用のアセンブラー。 さらに、Windwos Pocket PCオペレーティングシステムのスタイラスと標準ノートブックが便利でした。
(もちろん、現時点では、DosBoxデスクトップエミュレーターでTASMを使用する方が適切です)。
ただし、最近の調査「マトリックスはどの言語で作成しますか?」の結果は、 マトリックスを作成するのと同じプログラミング言語でマトリックスを視覚化する方が良いという推測を確認します。
それでは、iPAQ H3800デバイスでBorlandコンパイラーとリンカーTurbo Assembler(以降TASM)を使用して、Dosオペレーティングシステムで、i80186プロセッサー用のアセンブラー言語の「マトリックス」クロスワードの解決を始めましょう。
ご存知のように、i80186プロセッサーはそれぞれ16ビットであり、このプロセッサーのレジスターはサイズが16ビット(例えば、AXバッテリー・レジスター)で、それぞれ8ビットの2つの部分に分割されています(AHが最も古い部分で、ALが最も小さい部分です)。 また、ビデオ割り込みとキーボードをそれぞれ制御するBIOS割り込み10hと16hも必要です。 Dos割り込みには21hの番号が付けられています。これは、この場合、ディスプレイに行を表示してプログラムを正しく終了するために必要です。
マトリックスを表示するには、少量のRAMで十分なので、実行可能ファイル形式-.comと小さなメモリモデルを使用します。 Dosのアセンブラークラシックによって書かれたように、メモリ100hで後退します。
.model tiny ; .186 ; i80186 .code ; , org 100h ;
以下は、コードの変数と定数を宣言し、実行しないようにメモリのこの部分をすぐに飛び越えるメモリです。
main: jmp start ; W equ 1Fh H equ 18h OFFS equ 04h cells db W + OFFS dup(0) c_n db W + OFFS dup(0) bsymb db 0 _sleep dw 1fffh ; the_matrix db "THEMATRI X" ; , the_matrix_len equ $ - the_matrix ; , $ msg_end db 0ah, 0dh, "Follow the white rabbit.", 0ah, 0dh, "$" timer dw 04ffh ;
そのため、マトリックス文字を表示するコンピューターのビデオ表示モードを指定する必要がありました。 ただし、最初に現在のモードをスタックに保存して、最後に戻るようにします。
mov ax, 0f00h ; int 10h push ax ;
ビデオモードを設定します:テキストCGA、EGA 80x25:
mov ax, 0003h int 10h
次は、信じられないほどの魔法の変換が行われる巨大なコードです。
- ワイプする画面上のキャラクターの位置を決定する
- カーソルを移動してキャラクターを上書きする手順
- 画面上の出力文字の位置を決定する
- ASCIIテーブルからの文字生成
- 特定の色で出力する
- 次の文字出力間の遅延サイクル
- THEMATRIXラベルの期限切れタイマー値の決定
- 碑文「THEMATRIX」の出力
非表示のテキスト
main_loop: imul dx, 4E35h inc dx push dx and dh, W add dh, OFFS shr dx, 08h mov bx, dx lea di, cells add byte ptr [di+ bx], 1 mov dh, byte ptr [di+ bx] cmp dh, H jne next1 mov byte ptr [di+ bx], 0 next1: cmp dh, 0 je draw1 dec dh ; mov bh, 00h mov ah, 02h ; int 10h mov ah, 09h ; / mov al, bsymb ; mov bx, 0002h ; , mov cx, 01h ; ( ) int 10h draw1: inc dh mov bh, 00h mov ah, 02h int 10h mov ah, 09h ; / pop dx imul dx, 4E35h inc dx push dx mov bsymb, dh ; mov al, bsymb mov bx, 000Ah mov cx, 01h int 10h ;... pop dx imul dx, 4E35h inc dx push dx and dh, W add dh, OFFS shr dx, 08h mov bx, dx lea di, c_n add byte ptr [di+ bx], 01h mov dh, byte ptr [di+ bx] cmp dh, H + 01h jne next2 mov byte ptr [di+ bx], 00h next2: dec dh mov bh, 00h mov ah, 2 int 10h mov ah, 09h ; / mov al, 08h ; mov bh, 00h ; mov bl, 00h ; () () mov cx, 0001h ; int 10h ; sleep cycle mov cx, _sleep loop2: nop loop loop2 ;draw message cmp timer, 0 je no_msg dec timer mov ax, 1300h ; mov ch, 00h mov cl, the_matrix_len mov bh, 00h ; mov bl, 20h ; mov dl, 0Bh ; () mov dh, 0Bh ; () lea bp, the_matrix ; int 10h inc dh
そして最後に、マトリックスをもう見たくないという信号を取得する必要があり、すでに白ウサギを追跡できます。 これを行うには、キーボードのキーストロークテストを使用し、文字が押されていない場合は、マトリックス文字の表示を続けます。
mov ah, 01h int 16h pop dx jz loop1 jmp end_prog loop1: jmp main_loop
シンボルが押され、プログラムを閉じますが、最初に以前のビデオモードを復元します。
end_prog: pop ax ; mov ah, 00h mov bh, 00h int 10h
白いウサギに従ってください:
mov ah, 09h ; lea dx, msg_end ; , '$' (ASCII 24H) int 21h
プログラムを正しく終了します。
mov ah, 4ch mov al, 00h ; int 21h end main
これらのコードをすべて一緒にまとめると、次のコマンドを使用してコンパイルおよびリンクできます。
tasm /t /z matrix tlink /t matrix
最後に、これが私たちの持っているものです:
- 垂直に回転する文字を緑色で表示します
- しばらくして消失した中央の碑文「マトリックス」の出力
- キーボードからの文字が出力を中断してプログラムを終了するのを待つ
- コンパイルされたアプリケーションバージョンのサイズは357バイト
更新: Habrユーザーのリクエストにより、「正直な」マトリックスフォントのインストールがコードに追加され、次の結果が得られました。
- 11h BIOS割り込み機能10hを介してフォントをインストールするコード
lea bp, font mov bx, 1000h xor dx, dx mov cx, 100h mov ax, 1100h int 10h
- プログラムサイズは4,472バイトです
- ソースコードとコンパイルされた.COMファイル(DosBoxエミュレーターで実行可能)は、公開リポジトリ-bitbucket.org/andrey_suharev/the-matrixにあります。