このページではJavaScriptを使用しています。
Home > マイコン実用例 > 電子サイコロ > プログラム内容(入門編)
プログラム内容(入門編)

サイコロを1番単純に動かすプログラムです。アドレス8400からプログラムが始まっています。

左側からアドレス、マシン語プログラム、アセンプラプログラムの順番で書かれています。

プログラムは、ざっと次の動作をしています。

  • スイッチを監視
  • スイッチONでデータをプラス1して、サイコロ目のデータに変換して出力

・プログラムの説明
                        ;*************************************
                        ;*    サイコロのプログラム (入門編)*
                        ;*************************************
                        ;----- ワーキングテーブル -------------
   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