目次

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


目次

inserted by FC2 system