LIST 53 ============================================================================ アセンブラ版を置き換えたサンプルソース[TEST.C]の内容 #define pio_a 0x1c #define pio_b 0x1e int disp, sw, counter, table_0[11]; ← テーブルは配列で用意 void port_out( int port, int data ){ ← 汎用ポート出力 #asm ld hl,4 add hl,sp ld c,(hl) ld hl,2 add hl,sp ld a,(hl) out (c),a nop ret #endasm } int port_in( int port ){ ← 汎用ポート入力 #asm ld hl,2 add hl,sp ld c,(hl) in a,(c) ld l,a ld h,0 ret #endasm } void wait_short(){ int timer1; for(timer1=0;timer1<10;timer1++){ #asm nop ← NOPを5回、それを10回ループ nop nop nop nop #endasm } } void sw_scan(){ sw = 0x07 & (port_in( pio_b ) / 32); ← スイッチ入力は簡潔 } void led_disp_0(){ port_out( pio_a+0, table_0[disp] ); ← テーブルから1の位を表示 port_out( pio_b+0, 0xfe ); port_out( pio_b+0, 0xff ); } void led_disp_1(){ port_out( pio_a+0, table_0[disp] ); ← テーブルから10の位を表示 port_out( pio_b+0, 0xfd ); port_out( pio_b+0, 0xff ); } void led_disp_2(){ port_out( pio_a+0, table_0[disp] ); ← テーブルから100の位を表示 port_out( pio_b+0, 0xfb ); port_out( pio_b+0, 0xff ); } void led_display(){ disp = counter % 10; led_disp_0(); if( counter > 9 ) disp = (counter/10) % 10; else disp = 10; led_disp_1(); if( counter > 99 ) disp = counter / 100; else disp = 10; led_disp_2(); } void wait_long(){ int timer0; for(timer0=0;timer0<50;timer0++){ sw_scan(); ← ウエイト中にスイッチを見る if( sw != 0x07 ) counter = 0; wait_short(); ← 足踏みルーチンを呼ぶ } } main(){ table_0[0] = 0xf5; ← テーブルの初期値をセット table_0[1] = 0x05; table_0[2] = 0xd3; table_0[3] = 0x57; table_0[4] = 0x27; table_0[5] = 0x76; table_0[6] = 0xf6; table_0[7] = 0x65; table_0[8] = 0xf7; table_0[9] = 0x77; table_0[10] = 0x00; port_out( pio_a+1, 0xcf ); /* Mode 3 */ port_out( pio_a+1, 0x00 ); /* 0:out / 1:in */ port_out( pio_a+0, 0x00 ); port_out( pio_b+1, 0xcf ); /* Mode 3 */ port_out( pio_b+1, 0xe0 ); /* 0:out / 1:in */ port_out( pio_b+0, 0xff ); port_out( pio_b+0, 0xf8 ); port_out( pio_b+0, 0xff ); counter = 0; while(1){ wait_long(); ← ソフトウェア・タイマ counter = (counter+1)%256; ← インクリルントしたデータを led_display(); ← 3桁のLEDで表示 } } ============================================================================