サイコロを1番単純に動かすプログラムです。アドレス8400からプログラムが始まっています。
左側からアドレス、マシン語プログラム、アセンプラプログラムの順番で書かれています。
プログラムは、ざっと次の動作をしています。
| ・プログラムの説明 |
|---|
;*************************************
;* サイコロのプログラム (入門編)*
;*************************************
;----- ワーキングテーブル -------------
E002 SKDATA EQU 0E002H ;次のサイコロのデータを保存
;----- I/O テーブル(8255Aのポート)------
0004 PA EQU 04H ;スイッチの入力ポート
0005 PB EQU 05H ;サイコロ1のLED出力ポート
0006 PC EQU 06H ;サイコロ2の :
0007 MODE EQU 07H ;入出力モードの設定ポート
;*********************************************************
;* サイコロのスタート・ストップはスイッチを押して(ON)、 *
;* 放した(OFF)時点で開始する *
;*********************************************************
8400 ORG 8400H ;プログラム開始アドレス
;------ イニシャライズ -------------
8400 3E 91 PINIT: LD A,91H ;ポートAを入力,BとCを出力に定義
8402 D3 07 OUT (MODE),A ;
8404 3E 01 LD A,1 ;サイコロの初期値を1にする
8406 32 02 E0 LD (SKDATA),A ;
;-------- メインルーチン ----------
;スタートスイッチが押されたかどうかを調べる
8409 DB 04 START: IN A,(PA) ;ポートAのデータをAレジスタに読み込む
840B 57 LD D,A
840C DB 04 IN A,(PA) ;正確なデータをとる為2度読みをする
840E BA CP D ;最初に読み込んだデータと比較する
840F C2 09 84 JP NZ,START ;違っていたら再チェック(スタートへ)
8412 CB 77 BIT 6,A ;同じであればデータのbit6を調べる
8414 C2 09 84 JP NZ,START ;bit6が1→スイッチON再チェック
;スタートスイッチが離れたかどうかを調べる
8417 DB 04 SWOFF: IN A,(PA) ;・
8419 57 LD D,A ;・
841A DB 04 IN A,(PA) ;・スイッチONのチェックと同じ
841C BA CP D ;・
841D C2 17 84 JP NZ,SWOFF ;・
8420 CB 77 BIT 6,A ;・
8422 CA 17 84 JP Z,SWOFF ;bit6が0→スイッチOFFの再チェック
;----------サイコロ出力-------------
8425 3A 02 E0 KORO: LD A,(SKDATA) ;サイコロデータをロード
8428 FE 07 CP 7 ;7のとき
842A C2 2F 84 JP NZ,KORO2 ;
842D 3E 01 LD A,1 ;1にする
842F F5 KORO2: PUSH AF ;サイコロデータを一時保存
8430 CD 40 84 CALL KOROME ;1~6までのデータをサイコロのビットデータに変換する
8433 D3 05 OUT (PB),A ;ポートBよりOUT(LED点灯)
8435 F1 POP AF ;一時保存データをAレジスタへ
8436 3C INC A ;Aレジスタをプラス1
8437 32 02 E0 LD (SKDATA),A ;サイコロデータをメモリに保存
843A CD 51 84 CALL TIM ;タイマー(時間調整)
843D C3 09 84 JP START ;STARTに戻り次の入力を待つ
;--------------------------------------------;
; ビットデータ変換ルーチン
; 入力 : A ← サイコロ数字データ
; 出力 : A ← サイコロLEDデータ
;--------------------------------------------;
8440 21 4A 84 KOROME: LD HL,SKTABL ;数字とLEDに対応したテーブルセット
8443 23 LOOP: INC HL ;テーブルを1たす
8444 3D DEC A ;入力(Aレジスタ)から1ひく
8445 C2 43 84 JP NZ,LOOP ;入力がゼロになるまでループ
8448 7E LD A,(HL) ;サイコロLEDデータをAレジスタに入れて
8449 C9 RET ;リターン
844A SKTABL: ; 0 1 2 3 4 5 6
844A 00 08 41 49 DB 00H,08H,41H,49H,55H,5DH,77H ; サイコロLEDデータテーブル
844E 55 5D 77
;----------------------------;
; タイマールーチン
;----------------------------;
8451 21 00 10 TIM: LD HL,1000H ;カウンターセット
8454 2B TLP: DEC HL ;カウンターの値をマイナス1
8455 7C LD A,H ;
8456 B5 OR L ;
8457 C8 RET Z ;ゼロになるまでループ
8458 18 FA JR TLP ;
845A END
|