復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第353回]
●内蔵タイマーの設定と割り込み開始
前回からの続きです。
前回は演奏速度を設定するための計算処理について説明をしました。
MIDIでは、音符の長さをティックという単位で表しています。
たとえば1分間当たりの4分音符=120という速さで、4分音符の分解能=480という場合のティックは1041μsになります(端数切捨て)。
MIDI演奏プログラムではZ8S180内蔵のタイマーの割込みを利用して演奏を行ないます。
Z8S180内蔵のタイマーは単純な構造をしていて、CPUクロックを20分周したクロックを使って、設定値をダウンカウントします。
したがってCPUクロックが10MHzの場合、内蔵タイマーの1クロックタイムは2μsになります。
そこで上記ティックの値1041/2=520を内蔵タイマーに与えれば、1040μsごとに割り込みを発生させることができます。
1ティックごとに1μsの誤差が発生しますが1/1000の誤差ですから普通に演奏する分には問題はないでしょう(2分で約0.1秒の誤差です)。
前回はその内蔵タイマーに与える値を計算によって求めるサブルーチン(TMPSB)の説明をしました。
求められた値は(TIMEDT)に保存されます。
今回は(TIMEDT)の値をZ8S180の内蔵タイマーに設定し、割込みをスタートさせます。
前回もお見せした下のプログラムの
CALL TMSB
です。
808A 01A107 START10:LD BC,$07A1;(tempodata=0.5s) 808D CD8281 CALL TMPSB 8090 CDD381 CALL TMSB |
;timer set 81D3 010C00 TMSB:LD BC,$000C 81D6 2AD682 LD HL,(TIMEDT) 81D9 ED69 OUT (C),L;timer0 data registerL 81DB 0C INC C 81DC ED61 OUT (C),H;timer0 data registerH 81DE 0C INC C 81DF ED69 OUT (C),L;timer0 reload registerL 81E1 0C INC C 81E2 ED61 OUT (C),H;timer0 reload registerH 81E4 0C INC C 81E5 3E11 LD A,11;INT enable,countdown start 81E7 ED79 OUT (C),A 81E9 FB EI 81EA C9 RET |
;INT routine
;
827F DDE5 INT:PUSH IX
8281 E5 PUSH HL
8282 D5 PUSH DE
8283 C5 PUSH BC
8284 F5 PUSH AF
8285 011000 LD BC,$0010
8288 ED78 IN A,(C);
828A 0E0C LD C,0C
828C ED78 IN A,(C);clear TIF0 flag
828E DD21DE82 LD IX,TPRMTOP
8292 3A0B84 LD A,(TRKNO)
8295 4F LD C,A
8296 DD7E01 INT1:LD A,(IX+01)
8299 B7 OR A
829A CAC182 JP Z,INT2
829D DD6E02 LD L,(IX+02)
82A0 DD6603 LD H,(IX+03)
82A3 DD4604 LD B,(IX+04)
82A6 78 LD A,B
82A7 B7 OR A
82A8 CAB482 JP Z,INT12
82AB 7C LD A,H
82AC B5 OR L
82AD C2B482 JP NZ,INT12
82B0 05 DEC B
82B1 DD7004 LD (IX+04),B
82B4 2B INT12:DEC HL
82B5 DD7502 LD (IX+02),L
82B8 DD7403 LD (IX+03),H
82BB 7C LD A,H
82BC B5 OR L
82BD B0 OR B
82BE DD7701 LD (IX+01),A
82C1 0D INT2:DEC C
82C2 CACD82 JP Z,INT3
82C5 110800 LD DE,$0008
82C8 DD19 ADD IX,DE
82CA C39682 JP INT1
82CD F1 INT3:POP AF
82CE C1 POP BC
82CF D1 POP DE
82D0 E1 POP HL
82D1 DDE1 POP IX
82D3 FB EI
82D4 ED4D RETI
|