※この段落には、デスネタが含まれています(^_^;)。
1998年、Baboo! JAPANの伝言板でWRSLT症候群が猛威(?)を振るっていた。
「WRSLTで大量書き込みしたらどれくらい時間がかかるのか?」
ビーバーは数年前の記憶に突き動かされるものを感じ、「せっかくだから試してみよう」。
というわけで、2つのケースに分けて、WRSLTで大量データの書き込みにかかる時間を測ることにしました。
;======================================= ;BIOS WRSLT: EQU 0014H ;WORK AREA RAM0SA: EQU 0F341H;ページ0ノ RAM ノ スロットアドレス(ヨウ FDD) ;======================================= ;MAIN ORG 0D000H;プログラム カイシ アドレス LD HL,00000H;カキコミ カイシ アドレス LD BC,04000H;カキコム リョウ LD E,0;カキコム アタイ(ベツニ 0デナクテモ イインダケド) LOOP: LD A,(RAM0SA) PUSH BC CALL WRSLT EI POP BC INC HL DEC BC ;BC == 0? LD A,B OR C JP NZ,LOOP ; RET
;======================================= ;BIOS WRSLT: EQU 0014H ;WORK AREA RAM0SA: EQU 0F341H;ページ0ノ RAM ノ スロットアドレス(ヨウ FDD) ;======================================= ;MAIN ORG 0D000H;プログラムノ スタートアドレス LD BC,04000H;コピーリョウ LD DE,08000H;コピーモト アドレス LD HL,00000H;コピーサキ アドレス LOOP: LD A,(DE) PUSH DE LD E,A LD A,(RAM0SA) PUSH BC CALL WRSLT EI POP BC POP DE INC HL INC DE DEC BC ;BC == 0? LD A,B OR C JP NZ,LOOP ; RET
両プログラムとも、実行にあたっては、BASICからUSR関数で呼び出し、呼ぶ直前から戻ってきた直後の時間を測りました。
機種や割り込みの使用状態等によって、多少の違いは出るかもしれませんが、他の機種でも大体同じ結果になると思います(MSX2+ 以下の機種では、標準モードと同じかそれに近い値が出ると思います)。
ソースについて: WRSLTは、必ずDI(割り込み禁止)状態で帰ってくるので、今回は帰ってきたら直ちにEI(割り込み許可)するようにしました。
でも、書き込み中は割込み禁止状態でも構わないのであれば、ソース中のEI(Z80の場合、M1サイクル込みで5ステート)を省けば、少しは高速化できるかもしれません(でも、たかが知れてると思います。
Z80でも、(5×16384)/3570000 = 約0.02秒短くなるだけだし)。
また、今回は、転送量が奇麗な数字(256バイト単位とか)になるとは限らないという前提で作ったので(あるいはビーバーの技術不足で)、転送量チェックの部分がやや汚くなっているかも知れませんが、ここも場合によっては、少し高速化できるかもしれません。
少しはWRSLT症候群患者の参考になるでしょうか(^_^;)?
その後、A to Cさんに確認したところによると、この方法でインタースロットコール前には、DIしておくべきとのことでした。
この方法でもそうですが、ページ0に対してインタースロットコール/リード/ライトする場合は、基本的にDIしなければならないんだそうです(つまり、前からあるサンプルも、WRSLT前にDIしていないので、実はやばかったと(^_^;))。
※ページ0がBIOS以外のものになっている時に、割り込みが発生するとやばいからですね。
また、
インタースロットコールでの割り込みの変化は不定です。 その時のスロット状態によって、DIされたり保存されたりします。とのことでした。
A to Cさん、アドバイスありがとうございました。m(_ _)m