*このパートはH8/300/TinyにMidiを導入するためのノウハウを蓄積するための場所です*
関連項目:

  
H8/3664
  
AKI-H8
  
PallarellPort増設
  
VHDL coding

  前の頁  次の頁
前回から初期化のルーティンの説明を行っているが、この項ではRAM及び入出力ポートの初期化について解説する。


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;Stack and work RAM init
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
memory_set:

  mov.l #h'f780,er2 ; ram start addr for 3664
  
mov.w #h'0400,r1 ; clear 1k bites
  
  
mov.b #0,r0l

_ram_clear:
  
mov.b r0l,@er2
  
inc.l #1,er2
  
dec.w #1,r1
  
bne _ram_clear
  
sub.l er4,er4
  
sub.l er5,er5
  
sub.l er6,er6
  
rts


上記の例はRAMの初期化ルーティンである。1、2段目でレジスタに代入している数値は、RAMの開始アドレス、及びその容量である。3段目でカウンタの値を設定した後、消去ルーティンに入っている。


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Input channels initialization
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

input_enable:

  
mov.b #b'10000000,r0l
 
 mov.b r0l,@pcr1

  
jsr @wait_10msec

  
mov.b #b'11111111,r0l
  mov.b r0l,@pcr5
  mov.b r0l,@pcr8

  
jsr @wait_10msec

  rts


入出力の初期設定を行うルーティンを示す。
ポートのディスティネーション(方向)設定を行っている。ポートの属性は1で出力、0で入力に設定される。jsr はJumpSubRoutineの略で、この場合は待機時間のルーティンに飛んでいる。


最後にタイマー/カウンタールーティンの解説を行う。このパートは待機ルーティンといって、実際には何も作業を行わず、ただクルクルと数を数えることで時間待ちをすることが仕事だ。よって、待機時間の設定は、マイコンのマスタークロックの周波数に準拠するので、厳密な時間設定が必要な場合は、その都度確認を行う必要がある。3052から移植したこの項は修正を行っていないので、実時間は長くなる方向にシフトしている。ルーティンは入れ子構造になっていて、最初に最小単位のルーティンを造り、それを取りこむことで各時間を設定している。メインルーティンで記録されているレジスタの内容を確保するために、各waitルーティンの最初にデータを待避している点に注意。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Timer / Counter Routines
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wait_500msec:
  push.l er1
  push.l er2
  mov.l #500,er1
_wait_1:
  jsr @wait_1msec
  sub.l #1,er1
  bne _wait_1
  pop.l er2
  pop.l er1
  rts

wait_100msec:
  push.l er1
  push.l er2
  mov.l #100,er1
_wait_2:
  jsr @wait_1msec
  sub.l #1,er1
  bne _wait_2
  pop.l er2
  pop.l er1
  rts

wait_10msec:
  push.l er1
  push.l er2
  mov.l #10,er1
_wait_3:
  jsr @wait_1msec
  sub.l #1,er1
  bne _wait_3
  pop.l er2
  pop.l er1
  rts

wait_1msec:
  mov.l #2048,er2
_wait_4:
  sub.l #1,er2
  bne _wait_4
  rts

つづく→