アセンブラプログラム
|
;------------ 計算 ルーチン --------------------------
;
; w1= AAL
; w2=,AAH
; w3=,BBL
; w4=,BBH
;
;足し算 (SRAM) AAH:AAL +(SRAM) BBH:BBL = (SRAM) ASKH:ASKL
; w1,w2,w3,w4 使用
;
addloop:
lds w1,AAL
lds w2,AAH
lds w3,BBL
lds w4,BBH
add w1,w3 ;AAL+BBL
adc w2,w4 ;AAH + BBH + C =AAH
brcc addloop1 ;キャリーオーバー jmp loop1
ldi w,0xFF
mov w1,w
mov w2,w
addloop1:
sts ASKL,w1
sts ASKH,w2
ret
;引き算 (SRAM) AAH:AAL − BBH:BBL = (SRAM) ASKH:ASKL
; w2 =AAH : w1=AAL
; w4 =BBH : w3=BBL
;
subloop:
lds w1,AAL
lds w2,AAH
lds w3,BBL
lds w4,BBH
clr fuF
cp w2,w4 ;AAH,BBH
BRLO subloop1 ;w2 < w4 then jmp loop1
cpi w2,0 ; AAH=0 then jmp loop end
BRNE subloop3
cp w1,w3 ;AAL,BBL
BRLO subloop2 ;AAL < BBL then jmp loop2
cpi w1,0
breq subloope
;
sub w1,w3 ;AAL-BBL = AAL
rjmp subloope
;
subloop1: ; BBH が大きい時
sub w3,w1 ;BBL,AAL
sbc w4,w2 ;BBH-AAH-C = ASKH
rjmp subloope1
subloop2: ;BBLが大きいとき
sub w3,w1 ;BBL,AAL
rjmp subloope1
subloop3:
cpse w2,w4
rjmp subloop31 ;異なる時 --->jmp
cp w1,w3
BRLO subloop32 ;w1 < w3
subloop31:
sub w1,w3 ;AALが大きい時L
sbc w2,w4 ;AAH-BBH-C = AAH
rjmp subloope
subloop32:
sub w3,w1
sbc w4,w2
rjmp subloope1
subloope:
clr fuF ;プラスフラグ =0
sts zfuf,fuF
sts ASKH,w2
sts ASKL,w1
ret
subloope1:
inc fuF ;マイナスフラグ =1
sts zfuf,fuF
sts ASKL,w3
sts ASKH,w4
ret
; 掛け算 (SRAM) MDAAH:MDAAL × (SRAM) MDsram = (SRAM) ASKH:ASKL
; addloop (w1,w2,w3,w4)
; w5,w6 w7
;
multi:
lds w5,MDAAL
lds w6,MDAAH
lds w7,MDsram
;
ldi w,0
sts AAL,w
sts AAH,w
sts ASKL,w
sts ASKH,w
sts BBL,w5
sts BBH,w6
multi1:
cpi w7,0
breq multie
dec w7
rcall addloop ;AA + BB = ASK
lds w1,ASKL
lds w2,ASKH
sts AAL,w1
sts AAH,w2 ;AA <---ASK
rjmp multi1
multie:
ret
; 割り算 (SRAM) MDAAH:MDAAL ÷ (SRAM) MDBBH:MDBBL = (SRAM) Dans H:L
;
; subloop (w1,w2,w3,w4)
; W5=MDBBL w6= MDBBH w7=DansL w8=DansH
divis:
clr w8 ;DansH
clr w7 ;DansL
lds w1,MDAAL
lds w2,MDAAH
sts AAL,w1
sts AAH,w2
cpi w2,0
brne divis01
cpi w1,0
brne divis01
rjmp divise
divis01:
lds w5,MDBBL
lds w6,MDBBH
sts BBL,w5
sts BBH,w6
cpi w6,0
brne divis1
cpi w5,0
brne divis1
rjmp divise
divis1:
rcall subloop ;AA - BB = ASK
lds w1,ASKL
lds w2,ASKH
sts AAL,w1
sts AAH,w2
sts BBL,w5
sts BBH,w6
inc w7 ;DansL+1
BREQ divis2 ;256 over
sbrs fuF, 0 ;fuFのbit0が1ならスキップする 1=マイナス
rjmp divis1 ;AA > BB なら JMP戻り 引き算する
dec w7 ;DansL ;fuF=1
rjmp divise
divis2:
inc w8 ;DansH ; +1
sbrs fuF, 0 ;fuFのbit0が1ならスキップする (マイナスなら)
rjmp divis1
dec w8 ;DansH
divise:
sts DansH,w8
sts DansL,w7
ret
;-------------カウンター表示 -------------------------
;
; Sram tcouH,tcouL に入れて Rcall
; w,w1,w2,w3,w4,w5,w6 を使用する
count:
rcall XY_YL
clr w2 ;1
clr w3 ;10
clr w4 ;100
clr w5 ;1000
clr w6 ;10000 位
lds w,tcouL
lds w1,tcouH
cpi w1,0
brne count1
cpi w,0
brne count1
rjmp count_e
count1:
cpi w,0
breq count2
count11:
dec w
inc w2 ;1
cpi w2,10
brne count1
clr w2
inc w3 ;10
cpi w3,10
brne count1
clr w3
inc w4 ;100
cpi w4,10
brne count1
clr w4
inc w5 ;1000
cpi w5,10
brne count1
clr w5
inc w6 ;
cpi w6,10
brne count1
rjmp count_e
count2:
cpi w1,0
breq count_e
dec w1
rjmp count11
count_e:
sts tcount1,w2
sts tcount2,w3
sts tcount3,w4
sts tcount4,w5
sts tcount5,w6
count_crt:
lds w,tcount5
ori w,0x30
sts caradat,w
rcall KG_cmd
rcall XY_YL
lds w,tcount4
ori w,0x30
sts caradat,w
rcall KG_cmd
rcall XY_YL
lds w,tcount3
ori w,0x30
sts caradat,w
rcall KG_cmd
rcall XY_YL
lds w,tcount2
ori w,0x30
sts caradat,w
rcall KG_cmd
rcall XY_YL
lds w,tcount1
ori w,0x30
sts caradat,w
rcall KG_cmd
ret
;-------データ ----------------------------------
.dseg
.org 0x0300
tcouH: .byte 1
tcouL: .byte 1
tcount1: .byte 1 ;表示 1
tcount2: .byte 1 ;表示 10
tcount3: .byte 1 ;表示 100
tcount4: .byte 1 ;表示 1000
tcount5: .byte 1 ;表示 10000
AAL: .byte 1 ; dataA-L
AAH: .byte 1 ; dataA-H
BBL: .byte 1 ; dataB-L
BBH: . byte 1 ; dataB-H
ASKL: .byte 1 ; ans L
ASKH: .byte 1 ; ans H
DansL: .byte 1 ; 割り算答え
DansH: .byte 1 ; 割り算答え
MDAAL: .byte 1 ;掛け算、割り算 データ
MDAAH: .byte 1
MDBBL: .byte 1 ;割り算 データ
MDBBH: .byte 1
MDsram: .byte 1 ;掛け算データ
RDcnt: .byte 1 ;read pulse