LIST 2 ============================================================================ サンプルソース[TEST.ASM]の内容 ;##### RAM Map ##### org 8000h ← RAM領域に変数を定義 disp ds 1 sw ds 1 timer ds 2 counter ds 1 ;##### I/O Map ##### pio_a equ 001ch ← 内蔵PIOのアドレス定義 pio_b equ 001eh ;##### RESET ##### org 0000h ← リセットするとここから始まる ld sp,09fffh ← スタックポインタをセット di ← 割り込みを禁止 jp main ← メインに飛ぶ ;##### INT / NMI ##### org 0066h retn ;##### Main ##### main: ld a,0cfh ; Mode 3 out (pio_a+1),a ld a,00000000b ; 0:Out / 1:In out (pio_a+1),a ld a,0cfh ; Mode 3 out (pio_b+1),a ld a,11100000b ; 0:Out / 1:In out (pio_b+1),a ld a,11111111b out (pio_b+0),a   ld a,11111000b ← 3個のLEDにデータをセット out (pio_b+0),a ld a,11111111b out (pio_b+0),a xor a ld (counter),a loop: call wait_long ← ソフトウェア・タイマ ld a,(counter) inc a ← インクリメントしたデータを ld (counter),a call led_display ← 3桁のLEDで表示 jr loop ;##### Subroutines ##### wait_long: ld a,50 ld (timer+0),a _w_loop_1: call sw_scan ← ウエイト中にスイッチを見る ld a,(sw) cp 0 jr z,_pass xor a ld (counter),a ← スイッチがONなら表示をクリア _pass: call wait_short ← 足踏みルーチンを呼ぶ ld a,(timer+0) dec a ld (timer+0),a cp 0 jr nz,_w_loop_1 ret wait_short: ld a,10 ld (timer+1),a _w_loop_2: nop ← NOPを5回、それを10回ループ nop nop nop nop ld a,(timer+1) dec a ld (timer+1),a cp 0 jr nz,_w_loop_2 ret sw_scan: in a,(pio_b) ← ポートから入力 and 11100000b srl a srl a srl a srl a srl a xor 11111111b and 00000111b ld (sw),a ← スイッチ状態を記憶する ret led_disp_0: ld a,(disp) ld c,a ld b,0 ld hl,table_0 ← 7セグメントの配置テーブル add hl,bc ld a,(hl) out (pio_a),a ld a,11111110b out (pio_b+0),a ← [1]の位のデータをラッチする ld a,11111111b out (pio_b+0),a ret led_disp_1: ld a,(disp) ld c,a ld b,0 ld hl,table_0 add hl,bc ld a,(hl) out (pio_a),a ld a,11111101b out (pio_b+0),a ← [10]の位のデータをラッチする ld a,11111111b out (pio_b+0),a ret led_disp_2: ld a,(disp) ld c,a ld b,0 ld hl,table_0 add hl,bc ld a,(hl) out (pio_a),a ld a,11111011b out (pio_b+0),a ← [100]の位のデータをラッチする ld a,11111111b out (pio_b+0),a ret table_0: db 11110101b,00000101b,11010011b,01010111b ; db 00100111b,01110110b,11110110b,01100101b ; db 11110111b,01110111b,00000000b led_display: ld a,(counter) ld c,a ld b,0 ld hl,table_1 ← (data%10)を求めるテーブル add hl,bc ld a,(hl) ld (disp),a call led_disp_0 ← 1の位を表示 ld a,(counter) ld c,a ld b,0 ld hl,table_2 ← ((data/10)%10)を求めるテーブル add hl,bc ld a,(hl) ld (disp),a call led_disp_1 ← 10の位を表示 ld a,(counter) ld c,a ld b,0 ld hl,table_3 ← (data/100)を求めるテーブル add hl,bc ld a,(hl) ld (disp),a call led_disp_2 ← 100の位を表示 ret table_1: db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 0 - 19 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 20 - 39 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 40 - 59 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 60 - 79 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 80 - 99 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 100 - 119 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 120 - 139 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 140 - 159 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 160 - 179 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 180 - 199 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 200 - 219 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9 ; 220 - 239 db 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5 ; 240 - 255 table_2: db 10,10,10,10,10,10,10,10,10,10,1,1,1,1,1,1,1,1,1,1 ; 0 - 19 db 2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3 ; 20 - 39 db 4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5 ; 40 - 59 db 6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7 ; 60 - 79 db 8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9 ; 80 - 99 db 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1 ; 100 - 119 db 2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3 ; 120 - 139 db 4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5 ; 140 - 159 db 6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7 ; 160 - 179 db 8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9 ; 180 - 199 db 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1 ; 200 - 219 db 2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3 ; 220 - 239 db 4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5 ; 240 - 255 table_3: db 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 db 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 db 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 db 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 db 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 100 - 119 db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 120 - 139 db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 140 - 159 db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 160 - 179 db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; 180 - 199 db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ; 200 - 219 db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ; 220 - 239 db 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ; 240 - 255 end ============================================================================