LIST 54 ============================================================================ コンパイラ[MC]の出力したアセンブラソース[TEST.ASM]の該当部分 ;#define pio_a 0x1c ;#define pio_b 0x1e ;int disp, sw, counter, table_0[11]; ;void port_out( int port, int data ){ __port_out: ;#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 ;} RET ;int port_in( int port ){ __port_in: ;#asm ld hl,2 add hl,sp ld c,(hl) in a,(c) ld l,a ld h,0 ret ;#endasm ;} RET ;void wait_short(){ __wait_short: ; int timer1; PUSH BC ; for(timer1=0;timer1<10;timer1++){ LD HL,00H ADD HL,SP PUSH HL LD HL,00H CALL mc_pint mc_6: LD HL,00H ADD HL,SP CALL mc_gint PUSH HL LD HL,0AH ← for文を回すカウンター値はここ CALL mc_lt LD A,H OR L JP Z,mc_5 JP mc_7 mc_4: LD HL,00H ADD HL,SP PUSH HL CALL mc_gint INC HL CALL mc_pint DEC HL JP mc_6 mc_7: ;#asm nop nop nop nop nop ;#endasm ; } JP mc_4 mc_5: ;} POP BC RET ;void sw_scan(){ __sw_scan: ; sw = 0x07 & (port_in( pio_b ) / 32); LD HL,07H PUSH HL LD HL,1EH PUSH HL CALL __port_in POP BC PUSH HL LD HL,20H POP DE CALL mc_div CALL mc_and LD (__sw),HL ;} RET ;void led_disp_0(){ __led_disp_0: ; port_out( pio_a+0, table_0[disp] ); LD HL,1CH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,__table_0 PUSH HL LD HL,(__disp) ADD HL,HL POP DE ADD HL,DE CALL mc_gint PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xfe ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FEH PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xff ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FFH PUSH HL CALL __port_out POP BC POP BC ;} RET ;void led_disp_1(){ __led_disp_1: ; port_out( pio_a+0, table_0[disp] ); LD HL,1CH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,__table_0 PUSH HL LD HL,(__disp) ADD HL,HL POP DE ADD HL,DE CALL mc_gint PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xfd ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FDH PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xff ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FFH PUSH HL CALL __port_out POP BC POP BC ;} RET ;void led_disp_2(){ __led_disp_2: ; port_out( pio_a+0, table_0[disp] ); LD HL,1CH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,__table_0 PUSH HL LD HL,(__disp) ADD HL,HL POP DE ADD HL,DE CALL mc_gint PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xfb ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FBH PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xff ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FFH PUSH HL CALL __port_out POP BC POP BC ;} RET ;void led_display(){ __led_display: ; disp = counter % 10; LD HL,(__counter) PUSH HL LD HL,0AH POP DE CALL mc_div EX DE,HL LD (__disp),HL ; led_disp_0(); CALL __led_disp_0 ; if( counter > 9 ) disp = (counter/10) % 10; LD HL,(__counter) PUSH HL LD HL,09H CALL mc_gt LD A,H OR L JP Z,mc_13 ← if文の判定はここ LD HL,(__counter) PUSH HL LD HL,0AH POP DE CALL mc_div PUSH HL LD HL,0AH POP DE CALL mc_div EX DE,HL LD (__disp),HL ; else disp = 10; JP mc_14 mc_13: LD HL,0AH LD (__disp),HL mc_14: ; led_disp_1(); CALL __led_disp_1 ; if( counter > 99 ) disp = counter / 100; LD HL,(__counter) PUSH HL LD HL,63H CALL mc_gt LD A,H OR L JP Z,mc_15 LD HL,(__counter) PUSH HL LD HL,64H POP DE CALL mc_div LD (__disp),HL ; else disp = 10; JP mc_16 mc_15: LD HL,0AH LD (__disp),HL mc_16: ; led_disp_2(); CALL __led_disp_2 ;} RET ;void wait_long(){ __wait_long: ; int timer0; PUSH BC ; for(timer0=0;timer0<50;timer0++){ LD HL,00H ADD HL,SP PUSH HL LD HL,00H CALL mc_pint mc_20: LD HL,00H ADD HL,SP CALL mc_gint PUSH HL LD HL,32H CALL mc_lt LD A,H OR L JP Z,mc_19 JP mc_21 mc_18: LD HL,00H ADD HL,SP PUSH HL CALL mc_gint INC HL CALL mc_pint DEC HL JP mc_20 mc_21: ; sw_scan(); CALL __sw_scan ; if( sw != 0x07 ) counter = 0; LD HL,(__sw) PUSH HL LD HL,07H CALL mc_ne LD A,H OR L JP Z,mc_22 LD HL,00H LD (__counter),HL ; wait_short(); mc_22: CALL __wait_short ; } JP mc_18 mc_19: ;} POP BC RET ;main(){ __main: ; table_0[0] = 0xf5; ← 配列への定数代入だけ LD HL,__table_0 PUSH HL LD HL,00H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,0F5H CALL mc_pint ; table_0[1] = 0x05; LD HL,__table_0 PUSH HL LD HL,01H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,05H CALL mc_pint ; table_0[2] = 0xd3; LD HL,__table_0 PUSH HL LD HL,02H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,0D3H CALL mc_pint ; table_0[3] = 0x57; LD HL,__table_0 PUSH HL LD HL,03H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,57H CALL mc_pint ; table_0[4] = 0x27; LD HL,__table_0 PUSH HL LD HL,04H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,27H CALL mc_pint ; table_0[5] = 0x76; LD HL,__table_0 PUSH HL LD HL,05H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,76H CALL mc_pint ; table_0[6] = 0xf6; LD HL,__table_0 PUSH HL LD HL,06H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,0F6H CALL mc_pint ; table_0[7] = 0x65; LD HL,__table_0 PUSH HL LD HL,07H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,65H CALL mc_pint ; table_0[8] = 0xf7; LD HL,__table_0 PUSH HL LD HL,08H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,0F7H CALL mc_pint ; table_0[9] = 0x77; LD HL,__table_0 PUSH HL LD HL,09H ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,77H CALL mc_pint ; table_0[10] = 0x00; LD HL,__table_0 PUSH HL LD HL,0AH ADD HL,HL POP DE ADD HL,DE PUSH HL LD HL,00H CALL mc_pint ; port_out( pio_a+1, 0xcf ); /* Mode 3 */ LD HL,1CH PUSH HL LD HL,01H POP DE ADD HL,DE PUSH HL LD HL,0CFH PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_a+1, 0x00 ); /* 0:out / 1:in */ LD HL,1CH PUSH HL LD HL,01H POP DE ADD HL,DE PUSH HL LD HL,00H PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_a+0, 0x00 ); LD HL,1CH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,00H PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+1, 0xcf ); /* Mode 3 */ LD HL,1EH PUSH HL LD HL,01H POP DE ADD HL,DE PUSH HL LD HL,0CFH PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+1, 0xe0 ); /* 0:out / 1:in */ LD HL,1EH PUSH HL LD HL,01H POP DE ADD HL,DE PUSH HL LD HL,0E0H PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xff ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FFH PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xf8 ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0F8H PUSH HL CALL __port_out POP BC POP BC ; port_out( pio_b+0, 0xff ); LD HL,1EH PUSH HL LD HL,00H POP DE ADD HL,DE PUSH HL LD HL,0FFH PUSH HL CALL __port_out POP BC POP BC ; counter = 0; LD HL,00H LD (__counter),HL ; while(1){ mc_24: LD HL,01H LD A,H OR L JP Z,mc_25 ← 絶対に成立しない条件比較 ; wait_long(); CALL __wait_long ; counter = (counter+1)%256; LD HL,(__counter) PUSH HL LD HL,01H POP DE ADD HL,DE PUSH HL LD HL,0100H POP DE CALL mc_div EX DE,HL LD (__counter),HL ; led_display(); CALL __led_display ; } JP mc_24 mc_25: ;} RET ORG RAM_TOP __disp: DEFS 02H __counter: DEFS 02H __table_0: DEFS 16H __sw: DEFS 02H ============================================================================