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