サイコロを1つだけ動かすプログラムです。アドレス8500からプログラムが始まっています。
左側からアドレス、マシン語プログラム、アセンプラプログラムの順番で書かれています。
プログラムは、ざっと次の動作をしています。
| ・プログラムの説明 |
|---|
;*************************************
;* サイコロのプログラム (その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
|