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

サイコロを1つだけ動かすプログラムです。アドレス8500からプログラムが始まっています。

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

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

  • スイッチを監視
  • スイッチがONで乱数発生、サイコロ目のデータに変換して出力
  • スイッチOFFで出力データを決定

・プログラムの説明
                        ;*************************************
                        ;*    サイコロのプログラム (その1)*
                        ;*************************************
                        ;----- ワーキングテーブル -------------
   E000                 RREGL 	EQU 0E000H	;RANDOM REG L
   E001                 RREGH	EQU 0E001H	;RANDOM REG H
                        
                        ;----- I/O テーブル(8255Aのポート)------
   0004                 PA	EQU 04H		;スイッチの入力ポート
   0005                 PB	EQU 05H		;サイコロのLED出力ポート
   0006                 PC	EQU 06H		;
   0007                 MODE	EQU 07H		;入出力モードの設定ポート
                        
                        
   8500                 	ORG 8500H	;プログラム開始アドレス
                        ;------ イニシャライズ -------------
   8500   3E 91         PINIT:	LD A,91H	;ポートAを入力,BとCを出力に定義
   8502   D3 07                	OUT (MODE),A	;
   8504   06 00                	LD B,0		;スイッチフラグクリア
                        
                        ;-------- メインルーチン ----------
                        ;*********************************************************
                        ;* サイコロのスタート・ストップはスイッチを押して(ON)、 *
                        ;* 放した(OFF)時点で開始する                            *
                        ;*********************************************************
                        ;スタートスイッチが押されたかどうかを調べる
   8506   CD 4D 85      START:	CALL INPTA	;ポートAの読み込み
   8509   CB 77         	BIT 6,A		;同じであればデータのbit6を調べる
   850B   C2 06 85      	JP NZ,START 	;bit6が1→スイッチON再チェック
                        ;スタートスイッチが離れたかどうかを調べる
   850E   CD 4D 85      SWOFF:	CALL INPTA	;ポートAの読み込み
   8511   CB 77         	BIT 6,A		;・
   8513   CA 0E 85      	JP Z,SWOFF	;bit6が0→スイッチOFFの再チェック
                        ;----------------------- ストップスイッチが入るまでサイコロがまわる(LEDが点灯)
                        			;(スイッチが押されても指が離れるまではサイコロがまわっている)
   8516   CD 71 85      KORO:	CALL RDMGEN	;乱数発生ルーチン ワーキングエリアの8000H(RREGH)に数が入る
   8519   3A 01 E0      	LD A,(RREGH)	;それをAレジスタにロードする
   851C   E6 07         	AND 7		;サイコロの目は6までなので、下3ビットをとる
   851E   FE 07         	CP 7		;・
   8520   CA 16 85      	JP Z,KORO	;・7,0をはねる(乱数発生へ)
   8523   FE 00         	CP 0		;・
   8525   CA 16 85      	JP Z,KORO	;・
   8528   CD 57 85      	CALL KOROME	;1~6までのデータをサイコロのデータに変換する	
   852B   D3 05         	OUT (PB),A	;ポートBよりOUT(LED点灯)
   852D   CD 68 85      	CALL TIM	;タイマー(時間調整)
                        ;----------------------- ストップスイッチが押されたまま(指がスイッチから離れていない状態)
   8530   78            	LD A,B		;かどうかを調べる
   8531   FE 00         	CP 0		;押されたままの場合(Bレジスタが1)、指が離れたかどうかのチェック
   8533   C2 40 85      	JP NZ,SWOFF2	;				   (SWOFF2へ)
                        ;----------------------- ストップスイッチが押されたかどうかを調べる
                        			;----- スイッチONのチェック -----
   8536   CD 4D 85      STOPSW:	CALL INPTA	;ポートAの読み込み
   8539   CB 77         	BIT 6,A		;・
   853B   C2 16 85      	JP NZ,KORO	;bit6が0→スイッチoffのチェックへ,1→乱数発生へ 
   853E   06 01         	LD B,1		;スイッチが押された事を示す為Bレジスタを1にする
                        			;----- スイッチOFFのチェック -----
   8540   CD 4D 85      SWOFF2:	CALL INPTA	;ポートAの読み込み
   8543   CB 77         	BIT 6,A		;・
   8545   CA 16 85      	JP Z,KORO	;bit6が1→サイコロストップ スタートへ, 0→乱数発生へ 
   8548   06 00         	LD B,0		;Bレジスタを0にクリア
   854A   C3 06 85      	JP START
                        
                        ;*****************サブルーチン******************
                        ;--------データ入力--------------------------------------------
   854D   DB 04         INPTA:	IN A,(PA)	;ポートAのデータをAレジスタに読み込む
   854F   57            	LD D,A
   8550   DB 04         	IN A,(PA)	;正確なデータをとる為2度読みをする
   8552   BA            	CP D		;最初に読み込んだデータと比較する
   8553   C2 4D 85      	JP NZ,INPTA	;違っていたら再チェック
   8556   C9            	RET
                        
                        ;--------------------------------------------;	
                        ;      ビットデータ変換ルーチン
                        ;       入力 : A ← サイコロ数字データ
                        ;       出力 : A ← サイコロLEDデータ
                        ;--------------------------------------------;
   8557   21 61 85      KOROME:	LD HL,SKTABL	;数字とLEDに対応したテーブルセット
   855A   23            LOOP:	INC HL		;テーブルを1たす
   855B   3D            	DEC A		;入力(Aレジスタ)から1ひく
   855C   C2 5A 85      	JP NZ,LOOP	;入力がゼロになるまでループ
   855F   7E            	LD A,(HL)	;サイコロLEDデータをAレジスタに入れて
   8560   C9            	RET		;リターン
                        
   8561                 SKTABL:	;   0   1   2   3   4   5   6
   8561   00 08 41 49   	DB 00H,08H,41H,49H,55H,5DH,77H	; サイコロLEDデータテーブル
   8565   55 5D 77      
                        
                        ;----------------------------;
                        ;    タイマールーチン 
                        ;----------------------------;
   8568   21 00 10      TIM: 	LD HL,1000H	;カウンターセット
   856B   2B            TLP:	DEC HL		;カウンターの値をマイナス1
   856C   7C            	LD A,H		;
   856D   B5            	OR L		;
   856E   C8            	RET Z		;ゼロになるまでループ
   856F   18 FA         	JR TLP		;
                        
                        ;----------  RANDOM GENERATOR ----------
   8571   3A 01 E0      RDMGEN:	LD A,(RREGH)	;以下、乱数発生ルーチン
   8574   A7            	AND A		;(M系列)
   8575   28 1D         	JR Z,INITLD
   8577   67            	LD H,A
   8578   CB 07         	RLC A		;5ビット左シフト
   857A   CB 07         	RLC A
   857C   CB 07         	RLC A
   857E   CB 07         	RLC A
   8580   CB 07         	RLC A
   8582   AC            	XOR H		;ビット2と7のXORをとる
   8583   E6 80         	AND 80H		;
   8585   F5            	PUSH AF
   8586   3A 00 E0      	LD A,(RREGL)	;
   8589   17            	RLA		;ビット7→キャリーへ
   858A   7C            	LD A,H
   858B   17            	RLA		;データシフト キャリー→ビット0
   858C   32 01 E0      	LD (RREGH),A
   858F   F1            	POP AF
   8590   32 00 E0      	LD (RREGL),A	;次の入力をビット7に保存
   8593   C9            	RET
   8594   3E FF         INITLD:	LD A,0FFH
   8596   32 01 E0      	LD (RREGH),A
   8599   18 D6         	JR RDMGEN
   859B                 	END