目次
前
次
7セグメントLEDの多桁表示
7セグメントLEDを5桁分並べて表示することを
考えていきます。
8048のI/Oで使えるビット数が少ないので、2つの
デコーダを利用してピン数不足を補います。
ポート1に74HC138、4511を接続して対応。
回路図は、以下。
ポート1にパターンを時間差で出力していく
ダイナミック点灯する方式で実現します。
メモリ上に1桁ごとに1バイトを確保。
DIG0 equ 20h
DIG1 equ 21h
DIG2 equ 22h
DIG3 equ 23h
DIG4 equ 24h
DIG5 equ 25h
5桁であっても6桁分を確保して、6桁目に
最初に戻すためのデータを保存しておきます。
6桁分のデータ確保は、次のサブルーチンを
利用すればよいでしょう。
SET_DIG:
; push
mov a,r0
mov r7,a
; set pointer
mov r0,#DIG0
; store
mov @r0,#00h ; 0000_????
inc r0
mov @r0,#10h ; 0001_????
inc r0
mov @r0,#20h ; 0010_????
inc r0
mov @r0,#30h ; 0011_????
inc r0
mov @r0,#40h ; 0100_????
inc r0
mov @r0,#80h ; 1000_????
; pop
mov a,r7
mov r0,a
;
ret
上位ニブルには、0から4の桁位置を示す情報を
格納しておき、下位ニブルには表示したい数値を
保存する仕様。
ダイナミック点灯するときには、タイマー割込みで
インターバルを生成して対応。
メインルーチンは、以下のように簡単。
MAIN:
; judge event flag
jf0 MAINL
; loop
jmp MAINE
MAINL:
; clear event flag
clr f0
; impress
call SND_DIG
; update counter
call UPD_CNT
; update DIG area
call UPD_DIG
MAINE:
;
jmp MAIN
8048には、PSW(Program Status Word)の中にユーザーが
利用できるフラグがあります。それをイベント通知にし
割込み発生を判定しています。
パターン出力は、サブルーチンを使います。
SND_DIG:
; judge ? MSB = 1
mov a,@r1
rlc a
jc SND_DIG1
; get pattern
rrc a
; impress
outl P1,a
; update pointer
inc r1
; exit
jmp SND_DIGE
;
SND_DIG1:
; set pointer
mov r1,#DIG0
SND_DIGE:
;
ret
出力パターンを左に1ビット回転して
キャリーフラグがセットされたならば
すでに5桁分の情報を出力した後だと
わかるので、出力パターンを格納した
ブロックの先頭アドレスにポインタを
再設定。
データ構造の中に、プログラムに進行を
制御する情報を入れておくのは、ソフト
ウエアの定石なので、その方式を採用。
タイマー割込みの割込みハンドラでは
フラグをセットするようにプログラム
しておけば充分でしょう。
E_TIMX:
; set flag
cpl F0
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; start timer
strt t
;
retr
8048では、フラグF0をセットする命令はなく
コンプリメントを求めて対応。
タイマー割込みの度に、内蔵カウンタを+1する
処理をサブルーチンにしています。
UPD_CNT:
; push
mov a,r1
mov r7,a
; set pointer
mov r1,#MCNT
inc @r1
; pop
mov a,r7
mov r1,a
;
ret
汎用レジスタr7を、1バイトのスタックレジスタにして
ポインタで使える、汎用レジスタr1の値が破壊されない
ようにしました。
カウンタの値を2進数で表現して格納します。
メモリブロックの5バイトには、1バイト中の
上位、下位に分けて情報を格納しますが、下位
だけを更新できるようにしました。
UPD_DIG:
; push
mov a,r1
mov r7,a
; set pointer
mov r1,#MCNT
; get counter values and generate target value
mov a,@r1
mov r6,a ; store 2^4
rl a
mov r5,a ; store 2^3
rl a
mov r4,a ; store 2^2
rl a
mov r3,a ; store 2^1
rl a
mov r2,a ; store 2^0
; get LSB
mov a,r6
anl a,#1
mov r6,a ; store 2^4
mov a,r5
anl a,#1
mov r5,a ; store 2^3
mov a,r4
anl a,#1
mov r4,a ; store 2^2
mov a,r3
anl a,#1
mov r3,a ; store 2^1
mov a,r2
anl a,#1
mov r2,a ; store 2^0
; concatenate
mov r1,#DIG0
mov a,@r1
anl a,#MASKF0
orl a,r6
mov @r1,a ; pattern 2^4
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r5
mov @r1,a ; pattern 2^3
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r4
mov @r1,a ; pattern 2^2
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r3
mov @r1,a ; pattern 2^1
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r2
mov @r1,a ; pattern 2^0
; pop
mov a,r7
mov r1,a
;
ret
タイマー割込み、ポートの初期化等を含めると
プログラムは、以下。
;
; TEST program for 8048 ( PROASM-II )
; Copyright (C) 2017 Kensuke Ooyu
;
INCLUDE 8048.LIB
;*******************
; value and address
;*******************
TZERO equ 6
MASKF0 equ 0f0h
DIG0 equ 18h
DIG1 equ 19h
DIG2 equ 1Ah
DIG3 equ 1Bh
DIG4 equ 1Ch
DIG5 equ 1Dh
MCNT equ 1Eh
;****************
; define symbols
;****************
ENTRY equ 0h
E_INT equ 3h
E_TIM equ 7h
;*******************
; interrupt vectors
;*******************
org ENTRY
jmp START
; external interrupt
org E_INT
retr
; timer interrupt
org E_TIM
jmp E_TIMX
org 10h
;**************
; sub routines
;**************
INIT:
; disable external interrupt
dis i
; disable timer interrupt
dis tcnti
; initialize I/O
mov a,#0
outl p1,a
outl p2,a
; clear flag
clr F0
;
ret
INIT_TIM:
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; start timer
strt t
;
ret
E_TIMX:
; set flag
cpl F0
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; start timer
strt t
;
retr
SET_DIG:
; push
mov a,r0
mov r7,a
; set pointer
mov r0,#DIG0
; store
mov @r0,#00h ; 0000_????
inc r0
mov @r0,#10h ; 0001_????
inc r0
mov @r0,#20h ; 0010_????
inc r0
mov @r0,#30h ; 0011_????
inc r0
mov @r0,#40h ; 0100_????
inc r0
mov @r0,#80h ; 1000_????
; pop
mov a,r7
mov r0,a
;
ret
SND_DIG:
; judge ? MSB = 1
mov a,@r1
rlc a
jc SND_DIG1
; get pattern
rrc a
; impress
outl P1,a
; update pointer
inc r1
; exit
jmp SND_DIGE
;
SND_DIG1:
; set pointer
mov r1,#DIG0
SND_DIGE:
;
ret
UPD_CNT:
; push
mov a,r1
mov r7,a
; set pointer
mov r1,#MCNT
inc @r1
; pop
mov a,r7
mov r1,a
;
ret
UPD_DIG:
; push
mov a,r1
mov r7,a
; set pointer
mov r1,#MCNT
; get counter values and generate target value
mov a,@r1
mov r6,a ; store 2^4
rl a
mov r5,a ; store 2^3
rl a
mov r4,a ; store 2^2
rl a
mov r3,a ; store 2^1
rl a
mov r2,a ; store 2^0
; get LSB
mov a,r6
anl a,#1
mov r6,a ; store 2^4
mov a,r5
anl a,#1
mov r5,a ; store 2^3
mov a,r4
anl a,#1
mov r4,a ; store 2^2
mov a,r3
anl a,#1
mov r3,a ; store 2^1
mov a,r2
anl a,#1
mov r2,a ; store 2^0
; concatenate
mov r1,#DIG0
mov a,@r1
anl a,#MASKF0
orl a,r6
mov @r1,a ; pattern 2^4
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r5
mov @r1,a ; pattern 2^3
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r4
mov @r1,a ; pattern 2^2
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r3
mov @r1,a ; pattern 2^1
inc r1
mov a,@r1
anl a,#MASKF0
orl a,r2
mov @r1,a ; pattern 2^0
; pop
mov a,r7
mov r1,a
;
ret
;**************
; main routine
;**************
org 100h
START:
call INIT
call INIT_TIM
call SET_DIG
; enable
en TCNTI
MAIN:
; judge event flag
jf0 MAINL
; loop
jmp MAINE
MAINL:
; clear event flag
clr f0
; impress
call SND_DIG
; update counter
call UPD_CNT
; update DIG area
call UPD_DIG
MAINE:
;
jmp MAIN
end
カウンタの更新は、外部イベントに対応すると
ゲートの通過カウンタを実現できます。
アセンブル結果のリスティングファイルは、以下。
0000 ;
0000 ; TEST program for 8048 ( PROASM-II )
0000 ; Copyright (C) 2017 Kensuke Ooyu
0000 ;
0000 INCLUDE 8048.LIB
0000 list
0000
0000 ;*******************
0000 ; value and address
0000 ;*******************
0006 TZERO equ 6
00F0 MASKF0 equ 0f0h
0000
0018 DIG0 equ 18h
0019 DIG1 equ 19h
001A DIG2 equ 1Ah
001B DIG3 equ 1Bh
001C DIG4 equ 1Ch
001D DIG5 equ 1Dh
001E MCNT equ 1Eh
0000
0000 ;****************
0000 ; define symbols
0000 ;****************
0000 ENTRY equ 0h
0003 E_INT equ 3h
0007 E_TIM equ 7h
0000
0000 ;*******************
0000 ; interrupt vectors
0000 ;*******************
0000 org ENTRY
0000 2400 + jmp START
0002
0002 ; external interrupt
0002 org E_INT
0003 93 + retr
0004
0004 ; timer interrupt
0004 org E_TIM
0007 041E + jmp E_TIMX
0009
0009 org 10h
0010 ;**************
0010 ; sub routines
0010 ;**************
0010 INIT:
0010 ; disable external interrupt
0010 15 + dis i
0011 ; disable timer interrupt
0011 35 + dis tcnti
0012 ; initialize I/O
0012 2300 + mov a,#0
0014 39 + outl p1,a
0015 3A + outl p2,a
0016 ; clear flag
0016 85 + clr F0
0017 ;
0017 83 + ret
0018
0018 INIT_TIM:
0018 ; stop counter
0018 65 + stop tcnt
0019 ; initialize
0019 2306 + mov a,#TZERO
001B 62 + mov t,a
001C ; start timer
001C 55 + strt t
001D ;
001D 83 + ret
001E
001E E_TIMX:
001E ; set flag
001E 95 + cpl F0
001F ; stop counter
001F 65 + stop tcnt
0020 ; initialize
0020 2306 + mov a,#TZERO
0022 62 + mov t,a
0023 ; start timer
0023 55 + strt t
0024 ;
0024 93 + retr
0025
0025 SET_DIG:
0025 ; push
0025 F8 + mov a,r0
0026 AF + mov r7,a
0027 ; set pointer
0027 B818 + mov r0,#DIG0
0029 ; store
0029 B000 + mov @r0,#00h ; 0000_????
002B 18 + inc r0
002C B010 + mov @r0,#10h ; 0001_????
002E 18 + inc r0
002F B020 + mov @r0,#20h ; 0010_????
0031 18 + inc r0
0032 B030 + mov @r0,#30h ; 0011_????
0034 18 + inc r0
0035 B040 + mov @r0,#40h ; 0100_????
0037 18 + inc r0
0038 B080 + mov @r0,#80h ; 1000_????
003A ; pop
003A FF + mov a,r7
003B A8 + mov r0,a
003C ;
003C 83 + ret
003D
003D SND_DIG:
003D ; judge ? MSB = 1
003D F1 + mov a,@r1
003E F7 + rlc a
003F F646 + jc SND_DIG1
0041 ; get pattern
0041 67 + rrc a
0042 ; impress
0042 39 + outl P1,a
0043 ; update pointer
0043 19 + inc r1
0044 ; exit
0044 0448 + jmp SND_DIGE
0046 ;
0046 SND_DIG1:
0046 ; set pointer
0046 B918 + mov r1,#DIG0
0048 SND_DIGE:
0048 ;
0048 83 + ret
0049
0049 UPD_CNT:
0049 ; push
0049 F9 + mov a,r1
004A AF + mov r7,a
004B ; set pointer
004B B91E + mov r1,#MCNT
004D 11 + inc @r1
004E ; pop
004E FF + mov a,r7
004F A9 + mov r1,a
0050 ;
0050 83 + ret
0051
0051 UPD_DIG:
0051 ; push
0051 F9 + mov a,r1
0052 AF + mov r7,a
0053 ; set pointer
0053 B91E + mov r1,#MCNT
0055 ; get counter values and generate target value
0055 F1 + mov a,@r1
0056 AE + mov r6,a ; store 2^4
0057 E7 + rl a
0058 AD + mov r5,a ; store 2^3
0059 E7 + rl a
005A AC + mov r4,a ; store 2^2
005B E7 + rl a
005C AB + mov r3,a ; store 2^1
005D E7 + rl a
005E AA + mov r2,a ; store 2^0
005F ; get LSB
005F FE + mov a,r6
0060 5301 + anl a,#1
0062 AE + mov r6,a ; store 2^4
0063 FD + mov a,r5
0064 5301 + anl a,#1
0066 AD + mov r5,a ; store 2^3
0067 FC + mov a,r4
0068 5301 + anl a,#1
006A AC + mov r4,a ; store 2^2
006B FB + mov a,r3
006C 5301 + anl a,#1
006E AB + mov r3,a ; store 2^1
006F FA + mov a,r2
0070 5301 + anl a,#1
0072 AA + mov r2,a ; store 2^0
0073 ; concatenate
0073 B918 + mov r1,#DIG0
0075 F1 + mov a,@r1
0076 53F0 + anl a,#MASKF0
0078 4E + orl a,r6
0079 A1 + mov @r1,a ; pattern 2^4
007A 19 + inc r1
007B F1 + mov a,@r1
007C 53F0 + anl a,#MASKF0
007E 4D + orl a,r5
007F A1 + mov @r1,a ; pattern 2^3
0080 19 + inc r1
0081 F1 + mov a,@r1
0082 53F0 + anl a,#MASKF0
0084 4C + orl a,r4
0085 A1 + mov @r1,a ; pattern 2^2
0086 19 + inc r1
0087 F1 + mov a,@r1
0088 53F0 + anl a,#MASKF0
008A 4B + orl a,r3
008B A1 + mov @r1,a ; pattern 2^1
008C 19 + inc r1
008D F1 + mov a,@r1
008E 53F0 + anl a,#MASKF0
0090 4A + orl a,r2
0091 A1 + mov @r1,a ; pattern 2^0
0092 ; pop
0092 FF + mov a,r7
0093 A9 + mov r1,a
0094 ;
0094 83 + ret
0095
0095 ;**************
0095 ; main routine
0095 ;**************
0095 org 100h
0100 START:
0100 1410 + call INIT
0102 1418 + call INIT_TIM
0104 1425 + call SET_DIG
0106 ; enable
0106 25 + en TCNTI
0107 MAIN:
0107 ; judge event flag
0107 B60B + jf0 MAINL
0109 ; loop
0109 2412 + jmp MAINE
010B MAINL:
010B ; clear event flag
010B 85 + clr f0
010C ; impress
010C 143D + call SND_DIG
010E ; update counter
010E 1449 + call UPD_CNT
0110 ; update DIG area
0110 1451 + call UPD_DIG
0112 MAINE:
0112 ;
0112 2407 + jmp MAIN
0114
0114 end
HEXファイルは、以下。
:020000002400DA
:010003009369
:02000700041ED5
:1000100015352300393A8583652306625583956536
:100020002306625593F8AFB818B00018B01018B096
:100030002018B03018B04018B080FFA883F1F7F650
:10004000466739190448B91883F9AFB91E11FFA9D9
:1000500083F9AFB91EF1AEE7ADE7ACE7ABE7AAFEB7
:100060005301AEFD5301ADFC5301ACFB5301ABFAA0
:100070005301AAB918F153F04EA119F153F04DA153
:1000800019F153F04CA119F153F04BA119F153F0B0
:050090004AA1FFA98355
:1001000014101418142525B60B241285143D144917
:04011000145124075B
:00000001FF
SRAMに余裕があるので、表示パターンの生成を
単純にできます。
UPD_DIG:
; push
mov a,r0
mov r7,a
mov a,r1
mov r6,a
; set pointer
mov r0,#TMPX
mov r1,#MCNT
; get counter values and store target value
mov a,@r1
; set counter
mov r2,#5
UPD_DIG1:
; store
mov @r0,a
; update pointer
inc r0
; shift
rl a
; if r0 > DIG0+4 then skip
djnz r2,UPD_DIG1
; set pointer
mov r0,#TMPX
; set counter
mov r2,#5
UPD_DIG2:
; get target
mov a,@r1
; masking (only LSB)
anl a,#1
; store
mov @r1,a
; update pointer
inc r1
; if r0 > DIG0+4 then skip
djnz r2,UPD_DIG2
; set pointer
mov r1,#DIG0
mov r0,#TMPX
; set counter
mov r2,#5
UPD_DIG3:
; get target
mov a,@r1
; masking
anl a,#MASKF0
; concatenate
orl a,@r0
; store
mov @r1,a
; update pointer
inc r1
inc r0
; if r1 > DIG0+4 then skip
djnz r2,UPD_DIG3
; pop
mov a,r7
mov r0,a
mov a,r6
mov r1,a
;
ret
3ループを利用。
第1ループでは、カウンタの値を5ビットに分割。
第2ループでは、1バイトを1ビット情報に変換。
第3ループでは、1バイトを上位、下位にアドレス、数値として結合。
まとめると、以下。
;
; TEST program for 8048 ( PROASM-II )
; Copyright (C) 2017 Kensuke Ooyu
;
INCLUDE 8048.LIB
;*******************
; value and address
;*******************
TZERO equ 6
MASKF0 equ 0f0h
DIG0 equ 18h
MCNT equ 19h
TMPX equ 1Ah
;****************
; define symbols
;****************
ENTRY equ 0h
E_INT equ 3h
E_TIM equ 7h
;*******************
; interrupt vectors
;*******************
org ENTRY
jmp START
; external interrupt
org E_INT
retr
; timer interrupt
org E_TIM
jmp E_TIMX
org 10h
;**************
; sub routines
;**************
INIT:
; disable external interrupt
dis i
; disable timer interrupt
dis tcnti
; initialize I/O
mov a,#0
outl p1,a
outl p2,a
; clear flag
clr F0
;
ret
INIT_TIM:
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; start timer
strt t
;
ret
E_TIMX:
; set flag
cpl F0
; stop counter
stop tcnt
; initialize
mov a,#TZERO
mov t,a
; start timer
strt t
;
retr
SET_DIG:
; push
mov a,r0
mov r7,a
; set pointer
mov r0,#DIG0
; store
mov @r0,#00h ; 0000_????
inc r0
mov @r0,#10h ; 0001_????
inc r0
mov @r0,#20h ; 0010_????
inc r0
mov @r0,#30h ; 0011_????
inc r0
mov @r0,#40h ; 0100_????
inc r0
mov @r0,#80h ; 1000_????
; pop
mov a,r7
mov r0,a
;
ret
SND_DIG:
; judge ? MSB = 1
mov a,@r1
rlc a
jc SND_DIG1
; get pattern
rrc a
; impress
outl P1,a
; update pointer
inc r1
; exit
jmp SND_DIGE
;
SND_DIG1:
; set pointer
mov r1,#DIG0
SND_DIGE:
;
ret
UPD_CNT:
; push
mov a,r1
mov r7,a
; set pointer
mov r1,#MCNT
inc @r1
; pop
mov a,r7
mov r1,a
;
ret
UPD_DIG:
; push
mov a,r0
mov r7,a
mov a,r1
mov r6,a
; set pointer
mov r0,#TMPX
mov r1,#MCNT
; get counter values and store target value
mov a,@r1
; set counter
mov r2,#5
UPD_DIG1:
; store
mov @r0,a
; update pointer
inc r0
; shift
rl a
; if r0 > DIG0+4 then skip
djnz r2,UPD_DIG1
; set pointer
mov r0,#TMPX
; set counter
mov r2,#5
UPD_DIG2:
; get target
mov a,@r1
; masking (only LSB)
anl a,#1
; store
mov @r1,a
; update pointer
inc r1
; if r0 > DIG0+4 then skip
djnz r2,UPD_DIG2
; set pointer
mov r1,#DIG0
mov r0,#TMPX
; set counter
mov r2,#5
UPD_DIG3:
; get target
mov a,@r1
; masking
anl a,#MASKF0
; concatenate
orl a,@r0
; store
mov @r1,a
; update pointer
inc r1
inc r0
; if r1 > DIG0+4 then skip
djnz r2,UPD_DIG3
; pop
mov a,r7
mov r0,a
mov a,r6
mov r1,a
;
ret
;**************
; main routine
;**************
org 100h
START:
call INIT
call INIT_TIM
call SET_DIG
; enable
en TCNTI
MAIN:
; judge event flag
jf0 MAINL
; loop
jmp MAINE
MAINL:
; clear event flag
clr f0
; impress
call SND_DIG
; update counter
call UPD_CNT
; update DIG area
call UPD_DIG
MAINE:
;
jmp MAIN
end
リスティングファイルは、次のようになります。
0000 ;
0000 ; TEST program for 8048 ( PROASM-II )
0000 ; Copyright (C) 2017 Kensuke Ooyu
0000 ;
0000 INCLUDE 8048.LIB
0000 list
0000
0000 ;*******************
0000 ; value and address
0000 ;*******************
0006 TZERO equ 6
00F0 MASKF0 equ 0f0h
0000
0018 DIG0 equ 18h
0019 MCNT equ 19h
001A TMPX equ 1Ah
0000
0000 ;****************
0000 ; define symbols
0000 ;****************
0000 ENTRY equ 0h
0003 E_INT equ 3h
0007 E_TIM equ 7h
0000
0000 ;*******************
0000 ; interrupt vectors
0000 ;*******************
0000 org ENTRY
0000 2400 + jmp START
0002
0002 ; external interrupt
0002 org E_INT
0003 93 + retr
0004
0004 ; timer interrupt
0004 org E_TIM
0007 041E + jmp E_TIMX
0009
0009 org 10h
0010 ;**************
0010 ; sub routines
0010 ;**************
0010 INIT:
0010 ; disable external interrupt
0010 15 + dis i
0011 ; disable timer interrupt
0011 35 + dis tcnti
0012 ; initialize I/O
0012 2300 + mov a,#0
0014 39 + outl p1,a
0015 3A + outl p2,a
0016 ; clear flag
0016 85 + clr F0
0017 ;
0017 83 + ret
0018
0018 INIT_TIM:
0018 ; stop counter
0018 65 + stop tcnt
0019 ; initialize
0019 2306 + mov a,#TZERO
001B 62 + mov t,a
001C ; start timer
001C 55 + strt t
001D ;
001D 83 + ret
001E
001E E_TIMX:
001E ; set flag
001E 95 + cpl F0
001F ; stop counter
001F 65 + stop tcnt
0020 ; initialize
0020 2306 + mov a,#TZERO
0022 62 + mov t,a
0023 ; start timer
0023 55 + strt t
0024 ;
0024 93 + retr
0025
0025 SET_DIG:
0025 ; push
0025 F8 + mov a,r0
0026 AF + mov r7,a
0027 ; set pointer
0027 B818 + mov r0,#DIG0
0029 ; store
0029 B000 + mov @r0,#00h ; 0000_????
002B 18 + inc r0
002C B010 + mov @r0,#10h ; 0001_????
002E 18 + inc r0
002F B020 + mov @r0,#20h ; 0010_????
0031 18 + inc r0
0032 B030 + mov @r0,#30h ; 0011_????
0034 18 + inc r0
0035 B040 + mov @r0,#40h ; 0100_????
0037 18 + inc r0
0038 B080 + mov @r0,#80h ; 1000_????
003A ; pop
003A FF + mov a,r7
003B A8 + mov r0,a
003C ;
003C 83 + ret
003D
003D SND_DIG:
003D ; judge ? MSB = 1
003D F1 + mov a,@r1
003E F7 + rlc a
003F F646 + jc SND_DIG1
0041 ; get pattern
0041 67 + rrc a
0042 ; impress
0042 39 + outl P1,a
0043 ; update pointer
0043 19 + inc r1
0044 ; exit
0044 0448 + jmp SND_DIGE
0046 ;
0046 SND_DIG1:
0046 ; set pointer
0046 B918 + mov r1,#DIG0
0048 SND_DIGE:
0048 ;
0048 83 + ret
0049
0049 UPD_CNT:
0049 ; push
0049 F9 + mov a,r1
004A AF + mov r7,a
004B ; set pointer
004B B919 + mov r1,#MCNT
004D 11 + inc @r1
004E ; pop
004E FF + mov a,r7
004F A9 + mov r1,a
0050 ;
0050 83 + ret
0051
0051 UPD_DIG:
0051 ; push
0051 F8 + mov a,r0
0052 AF + mov r7,a
0053 F9 + mov a,r1
0054 AE + mov r6,a
0055
0055 ; set pointer
0055 B81A + mov r0,#TMPX
0057 B919 + mov r1,#MCNT
0059 ; get counter values and store target value
0059 F1 + mov a,@r1
005A ; set counter
005A BA05 + mov r2,#5
005C UPD_DIG1:
005C ; store
005C A0 + mov @r0,a
005D ; update pointer
005D 18 + inc r0
005E ; shift
005E E7 + rl a
005F ; if r0 > DIG0+4 then skip
005F EA5C + djnz r2,UPD_DIG1
0061
0061 ; set pointer
0061 B81A + mov r0,#TMPX
0063 ; set counter
0063 BA05 + mov r2,#5
0065 UPD_DIG2:
0065 ; get target
0065 F1 + mov a,@r1
0066 ; masking (only LSB)
0066 5301 + anl a,#1
0068 ; store
0068 A1 + mov @r1,a
0069 ; update pointer
0069 19 + inc r1
006A ; if r0 > DIG0+4 then skip
006A EA65 + djnz r2,UPD_DIG2
006C
006C ; set pointer
006C B918 + mov r1,#DIG0
006E B81A + mov r0,#TMPX
0070 ; set counter
0070 BA05 + mov r2,#5
0072 UPD_DIG3:
0072 ; get target
0072 F1 + mov a,@r1
0073 ; masking
0073 53F0 + anl a,#MASKF0
0075 ; concatenate
0075 40 + orl a,@r0
0076 ; store
0076 A1 + mov @r1,a
0077 ; update pointer
0077 19 + inc r1
0078 18 + inc r0
0079 ; if r1 > DIG0+4 then skip
0079 EA72 + djnz r2,UPD_DIG3
007B
007B ; pop
007B FF + mov a,r7
007C A8 + mov r0,a
007D FE + mov a,r6
007E A9 + mov r1,a
007F ;
007F 83 + ret
0080
0080 ;**************
0080 ; main routine
0080 ;**************
0080 org 100h
0100 START:
0100 1410 + call INIT
0102 1418 + call INIT_TIM
0104 1425 + call SET_DIG
0106 ; enable
0106 25 + en TCNTI
0107 MAIN:
0107 ; judge event flag
0107 B60B + jf0 MAINL
0109 ; loop
0109 2412 + jmp MAINE
010B MAINL:
010B ; clear event flag
010B 85 + clr f0
010C ; impress
010C 143D + call SND_DIG
010E ; update counter
010E 1449 + call UPD_CNT
0110 ; update DIG area
0110 1451 + call UPD_DIG
0112 MAINE:
0112 ;
0112 2407 + jmp MAIN
0114
0114 end
HEXファイルは、次のようになります。
:020000002400DA
:010003009369
:02000700041ED5
:1000100015352300393A8583652306625583956536
:100020002306625593F8AFB818B00018B01018B096
:100030002018B03018B04018B080FFA883F1F7F650
:10004000466739190448B91883F9AFB91911FFA9DE
:1000500083F8AFF9AEB81AB919F1BA05A018E7EAF2
:100060005CB81ABA05F15301A119EA65B918B81AB2
:10007000BA05F153F040A11918EA72FFA8FEA9834E
:1001000014101418142525B60B241285143D144917
:04011000145124075B
:00000001FF
目次
前
次