サイコロを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 |