本文へジャンプ 2010年12月05日  

アセンブラプログラム
  1>足し算

  2>引き算
  3>掛け算
  4>割り算

  5>カウンター

;------------ 計算 ルーチン --------------------------
;
; 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