あなたの天然記念物
ホーム更新雑談鉄ゲタランドナーコースガイド自転車JKFFハードソフトダウンロードLinuxリンク(Amiga)リンク(その他)連絡先経歴
    目次 ↓下へ ↑上へ
  1. メールソフトYAMでJISを使う方…
  2. 簡単なMakefile作成方法
  3. WWWサーバー Apacheを使ってみる
  4. ネットワークプログラミング
  5. Scala MM400を使いました
  6. メールソフトYAMで漢字を使う方法
  7. AWebIIで漢字を表示する方法
  8. インターネットでNiftyServeへログイ…
  9. チャットしませんか?
  10. インターネットでチャット(IRC)…
  11. あなたのブラウザに挑戦
  12. JKFFについて知っている二、三の…
  13. CD-ROMを焼き焼き
  14. Professional File System 2を使用開…
  15. 日本語エディタJKED
  16. P-MODELから曲を買ってCD-ROMに
  17. OS3.5インストール方法
  18. TAINACO-Eスクリーンブランカ
  19. Linuxとパラレル接続
  20. 動画ファイルを再生
  21. Real time graphics display trigger …
  22. JKFF最新リリース
  23. AmigaDOS3.9(アイコン編)
  24. AmigaDOS3.9(ファイルリクエスタ…
  25. AmigaDOS3.9(パーティション編)
  26. AmigaDOS3.9(AmiDock編)
  27. AmigaDOS3.9(Unarc編)
  28. AmigaDOS3.9(アイコン修正編)
  29. JKFFDisp最新リリース
  30. YAM用日本語マクロ
  31. 最強のAmigaエミュレータAmithlon
  32. MSでぇ得ぬ
  33. HDToolBoxの使い方
  34. 超高速起動のAmithlon
  35. HTMLのテンプレート処理(解説)
  36. ARexxでWorkbenchを制御(Ram D…
  37. ARexxでWorkbenchを制御(メニュ…
  38. あなたのブラウザに挑戦2
  39. BIOS変更で便利に楽しく
  40. Amithlon Contrib3bリリース
  41. Amithlonでキーボードマップを変更
  42. Amithlonでディジタルサウンド
  43. Perlに夢中
  44. ホームページ製作に夢中
  45. ホームページ作成スクリプト完成
  46. スクリプトのモジュール追加
  47. 文字コードチェックのモジュール追加
  48. 画像サイズ追加のモジュール追加
  49. 確率計算スクリプト
  50. タグIMG自動生成スクリプト
  51. ヘッダ生成モジュール改良
  52. 変換モジュール作成
  53. メニューを簡単に変更してみました
  54. Amithlonでアナログ録音
  55. 行変換のモジュール追加
  56. ページ末尾用のモジュール改善
  57. AmigaOSのシャットダウン用スクリ…
  58. ダウンロード用のモジュール追加
  59. ドローソフトの作成
  60. hpwakeのフロントエンド
  61. AmithlonでMIDI演奏
  62. 改行用のモジュール追加
  63. EはエンハンスドのEです
  64. Amithlonを使う方法-01
  65. Amithlonを使う方法-02
  66. Amithlonを使う方法-03
  67. Amithlonを使う方法-04
  68. フォント名の秘密
  69. 画像収集スクリプト
  70. やったね!AmigaOS4.0漢字表示サポ…
  71. 一言メモ-1
  72. DVD-Rを焼き焼き
  73. 海外送金も楽じゃない
  74. シューティングゲーム(の土台)作りま…
  75. Amithlonと行くLinux Kernelの旅
  76. メールソフトYAMで漢字を使う方法
  77. CDプレーヤ MCDPlayer
  78. 痛車が北海道に来るとAmigaで音声合…
  79. はちゅねをAmigaに連れてって
  80. パレット再配置スクリプト
  81. アクセス規制チェックスクリプト
  82. ニコニコ動画のサムネ表示モジュール…
  83. favicon表示対応
はちゅねをAmigaに連れてって (2009.03.22)

ニコニコ動画では、ある動画を自分の得意なプラットホーム(パソコンに限りません)で再生させるのが流行しています。
ではAmigaで再生したのはあるかなと…これがありません。
1980年代のAmiga以外のパソコンでは画像処理なんて物はなく(正しくは私が知らない)、見るも無惨な画像(と呼べるのか?)表示となっています。Amigaの世界では9Fingers(デモ)に代表されるようなすばらしい画像処理能力が既知のため、あまりやる気が起きませんでした。だってできるに決まってるもん、いやマジで。しかしながら、ブラウン管を知らない世代がニコニコ動画にいらっしゃる事を考えますと、ブラウン管と一緒に歩んできたAmigaをそういう世代に知ってもらう必要があるなと感じ始めました。
例えば、Amigaはブラウン管のビーム位置を常に把握しているのです。で、他のOSはそんな事をやっていますか?
例えば、Amigaはフレームバッファを持ちません。ビデオ出力用LSIへ出力に必要なメモリを指定、出力方法も指示しています。それではフレームバッファと同じじゃないかって?うーん。画面の途中から全く別の解像度の画面にできるんですが。うーん。スキャンラインの途中でパレットを別物に変更できるんですが。うーん。スキャン途中でカラーレジスタをばんばん更新できるんですが。未経験の人に説明するのは骨が折れますね。

こんなとき、平沢進さんの一言を思い出します。「私はAmigaユーザーです。」

苦労がよくわかりました。Amigaの事をどーやって説明すりゃいいんだ?もういいや、あっきらっめたーっと(苦笑)。
これからやってみる事を簡単に説明しますと、

   1987年にリリースされたAmiga500でネギ振り

をできるのがわかってるのに挑戦しようと言うものです。
おまけにせっかく作っても、Amigaユーザは「そんなのできて当然だよね。」と言うだろうし(まず私が言う)、知らない人が見たら、本家の動画と同じ物見せられて「これのどこがスゴい訳?(ポカーン)」となります。言っとくけど、このページを見ているあなたのパソコンは、まだAmigaに追いついていませんから。積んでるCPUがコアをいくつ持っていようが、クロックが3GHz越えようが、無理。あきらめることも大事です。
※わざとショボい画像で同情を誘い「古いから仕方ないよね、よくやった。」とか評価してもらう手もありだな(おおうそ)。

前フリはこの辺にして、プログラムの仕様は下記の通り。

・表示フレーム数は99枚(本家の全フレームを確認して整理)
・画像ファイルはILBMで320x240の4096色同時発色。
 ここでクイズ。ファイルサイズはどのくらい?
 正解は57,716バイト、ここにAmigaのスゴさが出てます。
 普通に考えると、320 x 240 x (1 x 1.5) = 115,200バイト(+パレット分)。だからAmigaに追いつくのは無理なのよ。
 ※もちろん圧縮なしですよ。
・フレームレート25fps
・全フレーム3,369枚を表示
・音声ファイル8SVXでモノラル/PCM/8ビット/7kHz
・PAL(NTSCで240ラインは無理)
 ※昔々、日立製作所がスーパーコンピュータS-820にスパコンで世界初の「動画像出力機構」を塔載したんだけど
  公式フォーマットがNTSCだったよーな。ヨーロッパへの輸出するときコッソリPAL改造したんだろうか?
  知らずに輸出してヨーロッパのビデオ(当然PAL)に録画できず、落ち穂拾いとか。
  「PALの対応をどうしますか?」「PALって何ですか?」という会話だったから(実話)。
  日本人はPAL知らなくても仕方ない。あたりまえのように質問した私が悪い。
  当時、PALを出せないスパコンはNTSC/PALなAmigaに追いついていなかったのです。
  もしかしてAmigaのBootPALみたいに「この特製マイクロコード入り8インチフロッピーをS-820に読ませて起動すると
  PALで出力します。」とかだったりして(ありがち)。


寄り道はこの位にして、今は私のメインPC(Amithlon)で開発中。AmithlonはAmigaエミュレータです。
・表示フレーム数は99枚(本家の全フレームを確認して整理)
・画像ファイルはILBMで320x240の4096色同時発色。
・フレームレート25fps
ここまでできました。HAMはAmithlonでは表示不可なので代わりに24ビットフルカラー表示のスクリーンを用意、HAM→RGB変換をリアルタイムにやってます。時間制御なしで再生するとフレームレートが50fps位になってしまい、モトローラ68040/1.5GHzの馬鹿力を使っている感覚になります。
8SVXの再生ができたらAmithlon版で動画を上げる予定です。乞う御期待。
2009.02.26 Amithlon版が完成、動画を上げました。 8SVXの再生はamithlonでのaudio.deviceが調子悪いのでMultiViewを起動、ARexxで再生を制御しています。 複数のプログラムを同時に動かして連係させるのは、Amigaの得意とする点なのでAmiga500でもストレスなく可能です。 最後のPALは実機で確認しますので、Amithlonでコンパイル←→Amiga500でテストの繰返し、又はAmiga500でコンパイル。 Amiga500でのコンパイル時間と、Amithlon→Amiga500のプログラム転送時間(フロッピー1枚)のどちらが短かいかな。
2009.03.06 Amigaを知らない方々向けに解説編を作成、上記リンクの動画に追加しました。 動画の説明文から解説編にリンクもしてありますので、ご覧ください。 2009.03.22 ようやくプログラムが完成し、無事収録、動画を上げました。 ※このページをblogと呼んだ方がいらっしゃいましたね。なんかウレシイ。  その訳→ホームページ作成プリプロセッサ ppmod ニコニコ動画の会員でない方々は、YouTube(日本語版)をどうぞ。 【MC68000】はちゅねをAmigaに連れてって【7.14MHz】 残念ながら、動画に字幕を入れていません。 以下に今回の動画に使った品々を並べます。

本編に入れたコメント
本家の動画をコマ送りでチェック
全3669コマを99コマに整理
本家3669コマとの対応順序を手作業で作成

Amigaのメモリは
1)CPU専用FastMem
2)CPU/カスタムチップ共用ChipMem
の2種類

ChipMemに格納したコマを画面に表示
容量はFastMem8MB、ChipMem2MB
99コマは4.5MB強→ChipMemの容量不足

99コマをFastMemに格納
ChipMemに充填コピーで時間稼ぎ
不要コマ削除のタイミングでFast→Chip転送
正確な40mSタイマーで画面切替
静止画を25fpsの動画にしています


動画の再生順序
frame.txt
項番フレーム番号表示ファイル番号
100
210
320
430
540
650
760
870
980
1090
11100
12110
13120
14130
15140
16150
17160
18170
19180
20190
21200
22210
23220
24230
25240
26250
27260
28270
29280
30290
31300
32310
33320
34330
35340
36350
37360
38370
39380
40390
41400
42410
43420
44430
45440
46450
47460
48470
49480
50490
51500
52510
53520
54530
55540
56550
57560
58570
59580
60590
61600
62610
63620
64630
65640
66650
67660
68670
69680
70690
71700
72710
73720
74730
75740
76750
77760
78770
79780
80790
81800
82810
83820
84830
85840
86850
87860
88870
89880
90890
91900
92910
93920
94930
95940
96950
97960
98970
99980
100990
1011000
1021010
1031020
1041030
1051040
1061050
1071060
1081070
1091080
1101090
1111100
1121110
1131120
1141130
1151140
1161150
1171160
1181170
1191180
1201190
121120120
122121121
123122122
124123123
125124124
126125125
127126126
128127127
129128128
130129129
131130130
132131131
133132132
134133133
135134134
136135135
137136136
138137137
139138138
140139139
141140140
142141141
143142142
144143143
145144144
146145145
147146146
148147147
149148148
150149149
151150150
152151151
153152152
154153153
155154153
156155153
157156153
158157153
159158153
160159153
161160153
162161153
163162153
164163153
165164153
166165153
167166153
168167153
169168153
170169153
171170153
172171153
173172153
174173153
175174153
176175153
177176153
178177153
179178153
180179153
181180153
182181153
183182153
184183153
185184153
186185153
187186153
188187153
189188153
190189153
191190153
192191153
193192153
194193153
195194153
196195153
197196153
198197153
199198153
200199153
201200153
202201153
203202153
204203153
205204153
206205153
207206153
208207153
209208153
210209153
211210153
212211153
213212153
214213213
215214214
216215215
217216216
218217217
219218218
220219219
221220220
222221221
223222222
224223223
225224224
226225225
227226225
228227225
229228225
230229225
231230225
232231225
233232225
234233225
235234225
236235225
237236225
238237225
239238225
240239225
241240225
242241225
243242225
244243225
245244225
246245225
247246225
248247225
249248225
250249225
251250225
252251225
253252225
254253225
255254225
256255225
257256225
258257225
259258225
260259225
261260225
262261225
263262225
264263225
265264225
266265225
267266225
268267225
269268225
270269225
271270225
272271225
273272225
274273225
275274225
276275225
277276225
278277225
279278225
280279225
281280225
282281225
283282225
284283225
285284225
286285225
287286225
288287225
289288225
290289225
291290225
292291225
293292225
294293225
295294225
296295225
297296225
298297225
299298225
300299225
301300225
302301225
303302225
304303225
305304225
306305225
307306225
308307225
309308225
310309225
311310225
312311225
313312225
314313225
315314225
316315225
317316225
318317225
319318225
320319225
321320225
322321225
323322225
324323225
325324225
326325225
327326225
328327225
329328225
330329225
331330225
332331225
333332225
334333225
335334225
336335225
337336225
338337225
339338225
340339225
341340225
342341225
343342225
344343225
345344225
346345225
347346225
348347225
349348225
350349225
351350225
352351225
353352225
354353225
355354225
356355225
357356225
358357225
359358225
360359225
361360225
362361225
363362225
364363225
365364225
366365225
367366225
368367225
369368225
370369225
371370225
372371225
373372225
374373225
375374225
376375225
377376225
378377225
379378225
380379225
381380225
382381225
383382225
384383225
385384225
386385225
387386225
388387225
389388225
390389225
391390225
392391225
393392225
394393225
395394225
396395225
397396225
398397225
399398225
400399225
401400225
402401225
403402213
404403403
405404403
406405403
407406403
408407403
409408403
410409403
411410403
412411403
413412403
414413403
415414403
416415403
417416403
418417403
419418403
420419403
421420403
422421403
423422403
424423403
425424403
426425425
427426426
428427427
429428427
430429429
431430429
432431403
433432403
434433403
435434403
436435403
437436403
438437426
439438438
440439427
441440427
442441429
443442403
444443403
445444403
446445403
447446403
448447403
449448403
450449403
451450425
452451426
453452427
454453427
455454429
456455429
457456403
458457403
459458403
460459403
461460403
462461403
463462426
464463438
465464427
466465427
467466429
468467403
469468403
470469403
471470403
472471403
473472403
474473403
475474403
476475425
477476426
478477427
479478427
480479429
481480429
482481403
483482403
484483403
485484403
486485403
487486403
488487426
489488438
490489427
491490427
492491429
493492403
494493403
495494403
496495403
497496403
498497403
499498403
500499403
501500425
502501426
503502427
504503427
505504429
506505429
507506403
508507403
509508403
510509403
511510403
512511403
513512426
514513438
515514427
516515427
517516429
518517403
519518403
520519403
521520403
522521403
523522403
524523403
525524403
526525425
527526426
528527427
529528427
530529429
531530429
532531403
533532403
534533403
535534403
536535403
537536403
538537426
539538438
540539427
541540427
542541429
543542403
544543403
545544403
546545403
547546403
548547403
549548403
550549403
551550425
552551426
553552427
554553427
555554429
556555429
557556403
558557403
559558403
560559403
561560403
562561403
563562426
564563438
565564427
566565427
567566429
568567403
569568403
570569403
571570403
572571403
573572403
574573403
575574403
576575425
577576426
578577427
579578427
580579429
581580429
582581403
583582403
584583403
585584403
586585403
587586403
588587426
589588438
590589427
591590427
592591429
593592403
594593403
595594403
596595403
597596403
598597403
599598403
600599403
601600425
602601426
603602427
604603427
605604429
606605429
607606403
608607403
609608403
610609403
611610403
612611403
613612426
614613438
615614427
616615427
617616429
618617403
619618403
620619403
621620403
622621403
623622403
624623403
625624403
626625403
627626403
628627425
629628426
630629427
631630427
632631429
633632429
634633403
635634403
636635403
637636403
638637403
639638403
640639426
641640438
642641427
643642427
644643429
645644403
646645403
647646403
648647403
649648403
650649403
651650403
652651403
653652425
654653426
655654427
656655427
657656429
658657429
659658403
660659403
661660403
662661403
663662403
664663403
665664426
666665438
667666427
668667427
669668429
670669403
671670403
672671403
673672403
674673403
675674403
676675403
677676403
678677425
679678426
680679427
681680427
682681429
683682429
684683403
685684403
686685403
687686403
688687403
689688403
690689426
691690438
692691427
693692427
694693429
695694403
696695403
697696403
698697403
699698403
700699403
701700403
702701403
703702425
704703426
705704427
706705427
707706429
708707429
709708403
710709403
711710403
712711403
713712403
714713403
715714426
716715438
717716427
718717427
719718429
720719403
721720403
722721403
723722403
724723403
725724403
726725403
727726403
728727425
729728426
730729427
731730427
732731429
733732429
734733403
735734403
736735403
737736403
738737403
739738403
740739426
741740438
742741427
743742427
744743429
745744403
746745403
747746403
748747403
749748403
750749403
751750403
752751403
753752425
754753426
755754427
756755427
757756429
758757429
759758403
760759403
761760403
762761403
763762403
764763403
765764426
766765438
767766427
768767427
769768429
770769403
771770403
772771403
773772403
774773403
775774403
776775403
777776403
778777425
779778426
780779427
781780427
782781429
783782429
784783403
785784403
786785403
787786403
788787403
789788403
790789426
791790438
792791427
793792427
794793429
795794403
796795403
797796403
798797403
799798403
800799403
801800403
802801403
803802425
804803426
805804427
806805427
807806429
808807403
809808403
810809403
811810403
812811403
813812403
814813403
815814403
816815403
817816403
818817403
819818403
820819403
821820403
822821403
823822403
824823403
825824403
826825403
827826403
828827425
829828426
830829438
831830427
832831427
833832429
834833403
835834403
836835403
837836403
838837403
839838403
840839425
841840426
842841438
843842427
844843429
845844429
846845403
847846403
848847403
849848403
850849403
851850403
852851403
853852425
854853426
855854438
856855427
857856427
858857429
859858403
860859403
861860403
862861403
863862403
864863403
865864425
866865426
867866438
868867427
869868429
870869429
871870403
872871403
873872403
874873403
875874403
876875403
877876403
878877403
879878426
880879438
881880427
882881427
883882429
884883403
885884403
886885403
887886403
888887403
889888403
890889425
891890426
892891438
893892427
894893429
895894429
896895403
897896403
898897403
899898403
900899403
901900403
902901403
903902403
904903426
905904438
906905427
907906427
908907429
909908403
910909403
911910403
912911403
913912403
914913403
915914425
916915426
917916438
918917427
919918429
920919429
921920403
922921403
923922403
924923403
925924403
926925403
927926403
928927403
929928426
930929438
931930427
932931427
933932429
934933403
935934403
936935403
937936403
938937403
939938403
940939425
941940426
942941438
943942427
944943429
945944429
946945403
947946403
948947403
949948403
950949403
951950403
952951403
953952403
954953426
955954438
956955427
957956427
958957429
959958403
960959403
961960403
962961403
963962403
964963403
965964425
966965426
967966438
968967427
969968429
970969429
971970403
972971403
973972403
974973403
975974403
976975403
977976403
978977403
979978426
980979438
981980427
982981427
983982429
984983403
985984403
986985403
987986403
988987403
989988403
990989425
991990426
992991438
993992427
994993429
995994429
996995403
997996403
998997403
999998403
1000999403
10011000403
10021001403
10031002403
10041003426
10051004438
10061005427
10071006427
10081007429
10091008403
10101009403
10111010403
10121011403
10131012403
10141013403
10151014425
10161015426
10171016438
10181017427
10191018429
10201019429
10211020403
10221021403
10231022403
10241023403
10251024403
10261025403
10271026403
10281027403
10291028403
10301029425
10311030426
10321031438
10331032427
10341033429
10351034429
10361035403
10371036403
10381037403
10391038403
10401039403
10411040403
10421041425
10431042438
10441043427
10451044427
10461045429
10471046429
10481047403
10491048403
10501049403
10511050403
10521051403
10531052403
10541053403
10551054425
10561055426
10571056438
10581057427
10591058429
10601059429
10611060403
10621061403
10631062403
10641063403
10651064403
10661065403
10671066425
10681067438
10691068427
10701069427
10711070429
10721071429
10731072403
10741073403
10751074403
10761075403
10771076403
10781077403
10791078403
10801079425
10811080426
10821081438
10831082427
10841083429
10851084429
10861085403
10871086403
10881087403
10891088403
10901089403
10911090403
10921091425
10931092438
10941093427
10951094427
10961095429
10971096429
10981097403
10991098403
11001099403
11011100403
11021101403
11031102403
11041103403
11051104425
11061105426
11071106438
11081107427
11091108429
11101109429
11111110403
11121111403
11131112403
11141113403
11151114403
11161115403
11171116425
11181117438
11191118427
11201119427
11211120429
11221121429
11231122403
11241123403
11251124403
11261125403
11271126403
11281127403
11291128403
11301129425
11311130426
11321131438
11331132427
11341133429
11351134429
11361135403
11371136403
11381137403
11391138403
11401139403
11411140403
11421141425
11431142438
11441143427
11451144427
11461145429
11471146429
11481147403
11491148403
11501149403
11511150403
11521151403
11531152403
11541153403
11551154425
11561155426
11571156438
11581157427
11591158429
11601159429
11611160403
11621161403
11631162403
11641163403
11651164403
11661165403
11671166425
11681167438
11691168427
11701169427
11711170429
11721171429
11731172403
11741173403
11751174403
11761175403
11771176403
11781177403
11791178403
11801179425
11811180426
11821181438
11831182427
11841183429
11851184429
11861185403
11871186403
11881187403
11891188403
11901189403
11911190403
11921191425
11931192438
11941193427
11951194427
11961195429
11971196429
11981197403
11991198403
12001199403
12011200403
12021201403
12031202403
12041203403
12051204425
12061205426
12071206438
12081207427
12091208429
12101209429
12111210403
12121211403
12131212403
12141213403
12151214403
12161215403
12171216403
12181217403
12191218403
12201219403
12211220403
12221221403
12231222403
12241223403
12251224403
12261225403
12271226403
12281227403
12291228403
12301229403
12311230403
12321231403
12331232403
123412331233
123512341233
123612351233
123712361233
123812371233
123912381233
124012391233
124112401233
124212411233
124312421233
124412431233
124512441233
124612451233
124712461246
124812471246
124912481246
125012491246
125112501246
125212511246
125312521246
125412531246
125512541246
125612551246
125712561246
125812571246
125912581246
126012591233
126112601233
126212611233
126312621233
126412631233
126512641233
126612651233
126712661233
126812671233
126912681233
127012691233
127112701233
127212711233
127312721246
127412731246
127512741246
127612751246
127712761246
127812771246
127912781246
128012791246
128112801246
128212811246
128312821246
128412831246
128512841233
128612851233
128712861233
128812871233
128912881233
129012891233
129112901233
129212911233
129312921233
129412931233
129512941233
129612951233
129712961233
129812971246
129912981246
130012991246
130113001246
130213011246
130313021246
130413031246
130513041246
130613051246
130713061246
130813071246
130913081246
131013091246
131113101233
131213111233
131313121233
131413131233
131513141233
131613151233
131713161233
131813171233
131913181233
132013191233
132113201233
132213211233
132313221246
132413231246
132513241246
132613251246
132713261246
132813271246
132913281246
133013291246
133113301246
133213311246
133313321246
133413331246
133513341233
133613351233
133713361233
133813371233
133913381233
134013391233
134113401233
134213411233
134313421233
134413431233
134513441233
134613451233
134713461233
134813471246
134913481246
135013491246
135113501246
135213511246
135313521246
135413531246
135513541246
135613551246
135713561246
135813571246
135913581246
136013591246
136113601233
136213611233
136313621233
136413631233
136513641233
136613651233
136713661233
136813671233
136913681233
137013691233
137113701233
137213711233
137313721246
137413731246
137513741246
137613751246
137713761246
137813771246
137913781246
138013791246
138113801246
138213811246
138313821246
138413831246
138513841246
138613851233
138713861233
138813871233
138913881233
139013891233
139113901233
139213911233
139313921233
139413931233
139513941233
139613951233
139713961233
139813971246
139913981246
140013991246
140114001246
140214011246
140314021246
140414031246
140514041246
140614051246
140714061246
140814071246
140914081246
141014091246
141114101246
141214111233
141314121233
141414131233
141514141233
141614151233
141714161233
141814171233
141914181233
142014191233
142114201233
142214211233
142314221233
142414231246
142514241246
142614251246
142714261246
142814271246
142914281246
143014291246
143114301246
143214311246
143314321246
143414331246
143514341246
143614351233
143714361233
143814371233
143914381233
144014391233
144114401233
144214411233
144314421233
144414431233
144514441233
144614451233
144714461233
144814471246
144914481246
145014491246
145114501246
145214511246
145314521246
145414531246
145514541246
145614551246
145714561246
145814571246
145914581246
146014591246
146114601246
146214611233
146314621233
146414631233
146514641233
146614651233
146714661233
146814671233
146914681233
147014691233
147114701233
147214711233
147314721233
147414731246
147514741246
147614751246
147714761246
147814771246
147914781246
148014791246
148114801246
148214811246
148314821246
148414831246
148514841246
148614851246
148714861233
148814871233
148914881233
149014891233
149114901233
149214911233
149314921233
149414931233
149514941233
149614951233
149714961233
149814971246
149914981246
150014991246
150115001246
150215011246
150315021246
150415031246
150515041246
150615051246
150715061246
150815071246
150915081246
151015091246
151115101246
151215111246
151315121233
151415131233
151515141233
151615151233
151715161233
151815171233
151915181233
152015191233
152115201233
152215211233
152315221233
152415231233
152515241246
152615251246
152715261246
152815271246
152915281246
153015291246
153115301246
153215311246
153315321246
153415331246
153515341246
153615351246
153715361233
153815371233
153915381233
154015391233
154115401233
154215411233
154315421233
154415431233
154515441233
154615451233
154715461233
154815471233
154915481246
155015491246
155115501246
155215511246
155315521246
155415531246
155515541246
155615551246
155715561246
155815571246
155915581246
156015591246
156115601246
156215611246
156315621233
156415631233
156515641233
156615651233
156715661233
156815671233
156915681233
157015691233
157115701233
157215711233
157315721233
157415731233
157515741246
157615751246
157715761246
157815771246
157915781246
158015791246
158115801246
158215811246
158315821246
158415831246
158515841246
158615851246
158715861246
158815871233
158915881233
159015891233
159115901233
159215911233
159315921233
159415931233
159515941233
159615951233
159715961233
159815971233
159915981233
160015991246
160116001246
160216011246
160316021246
160416031246
160516041246
160616051246
160716061246
160816071246
160916081246
161016091246
161116101246
161216111246
161316121233
161416131233
161516141233
161616151233
161716161233
161816171233
161916181233
162016191233
162116201233
162216211621
162316221622
162416231622
162516241622
162616251622
162716261622
162816271622
162916281622
163016291622
163116301622
163216311622
163316321622
163416331622
163516341622
163616351622
163716361622
163816371637
163916381638
164016391639
164116401639
164216411641
164316421642
164416431637
164516441638
164616451639
164716461639
164816471622
164916481642
165016491637
165116501638
165216511639
165316521641
165416531622
165516541642
165616551637
165716561638
165816571639
165916581641
166016591622
166116601642
166216611637
166316621638
166416631639
166516641641
166616651622
166716661642
166816671637
166916681638
167016691639
167116701641
167216711622
167316721637
167416731638
167516741639
167616751639
167716761641
167816771642
167916781637
168016791638
168116801639
168216811639
168316821622
168416831642
168516841637
168616851638
168716861639
168816871641
168916881622
169016891642
169116901637
169216911638
169316921639
169416931641
169516941622
169616951642
169716961637
169816971639
169916981639
170016991641
170117001622
170217011642
170317021638
170417031639
170517041639
170617051641
170717061622
170817071637
170917081638
171017091639
171117101639
171217111641
171317121642
171417131637
171517141638
171617151639
171717161639
171817171622
171917181642
172017191637
172117201638
172217211639
172317221641
172417231622
172517241642
172617251637
172717261638
172817271639
172917281641
173017291622
173117301642
173217311637
173317321639
173417331639
173517341639
173617351641
173717361622
173817371637
173917381638
174017391639
174117401639
174217411641
174317421642
174417431637
174517441638
174617451639
174717461639
174817471622
174917481642
175017491637
175117501638
175217511639
175317521641
175417531622
175517541642
175617551637
175717561638
175817571639
175917581641
176017591622
176117601642
176217611637
176317621639
176417631639
176517641641
176617651622
176717661642
176817671638
176917681639
177017691639
177117701641
177217711622
177317721637
177417731638
177517741639
177617751639
177717761641
177817771642
177917781637
178017791638
178117801639
178217811639
178317821622
178417831642
178517841637
178617851638
178717861639
178817871641
178917881622
179017891642
179117901637
179217911638
179317921639
179417931641
179517941622
179617951642
179717961637
179817971639
179917981639
180017991641
180118001622
180218011642
180318021638
180418031639
180518041639
180618051641
180718061622
180818071637
180918081638
181018091639
181118101639
181218111641
181318121642
181418131637
181518141638
181618151639
181718161639
181818171622
181918181642
182018191637
182118201638
182218211639
182318221641
182418231622
182518241642
182618251637
182718261638
182818271639
182918281641
183018291622
183118301642
183218311637
183318321639
183418331639
183518341641
183618351641
183718361622
183818371637
183918381638
184018391639
184118401639
184218411641
184318421642
184418431637
184518441638
184618451639
184718461639
184818471622
184918481642
185018491637
185118501638
185218511639
185318521641
185418531622
185518541642
185618551637
185718561638
185818571639
185918581641
186018591622
186118601642
186218611637
186318621639
186418631639
186518641641
186618651622
186718661642
186818671638
186918681639
187018691639
187118701641
187218711622
187318721637
187418731638
187518741639
187618751639
187718761641
187818771642
187918781637
188018791638
188118801639
188218811639
188318821622
188418831642
188518841637
188618851638
188718861639
188818871641
188918881622
189018891642
189118901637
189218911638
189318921639
189418931641
189518941622
189618951642
189718961637
189818971639
189918981639
190018991641
190119001622
190219011642
190319021638
190419031639
190519041639
190619051641
190719061622
190819071637
190919081638
191019091639
191119101639
191219111641
191319121642
191419131637
191519141638
191619151639
191719161639
191819171622
191919181642
192019191637
192119201638
192219211639
192319221641
192419231622
192519241642
192619251637
192719261638
192819271639
192919281641
193019291622
193119301642
193219311637
193319321639
193419331639
193519341641
193619351622
193719361642
193819371638
193919381639
194019391639
194119401641
194219411641
194319421642
194419431637
194519441638
194619451639
194719461639
194819471622
194919481642
195019491637
195119501638
195219511639
195319521641
195419531622
195519541642
195619551637
195719561638
195819571639
195919581641
196019591622
196119601642
196219611637
196319621639
196419631639
196519641641
196619651622
196719661642
196819671638
196919681639
197019691639
197119701641
197219711622
197319721637
197419731638
197519741639
197619751639
197719761641
197819771642
197919781637
198019791638
198119801639
198219811639
198319821622
198419831642
198519841637
198619851638
198719861639
198819871641
198919881622
199019891642
199119901637
199219911638
199319921639
199419931641
199519941622
199619951642
199719961637
199819971639
199919981639
200019991641
200120001622
200220011642
200320021637
200420031639
200520041639
200620051641
200720061622
200820071642
200920081637
201020091639
201120101639
201220111641
201320121622
201420131622
201520141622
201620151622
201720161622
201820171622
201920181622
202020191622
202120201622
202220211622
202320221622
202420231622
202520241622
202620251622
202720261622
202820271622
202920281622
203020291622
203120301622
203220311622
203320321622
203420331622
203520341622
203620351622
203720361642
203820371638
203920381639
204020391639
204120401641
204220411641
204320421622
204420431622
204520441622
204620451622
204720461622
204820471622
204920481642
205020491637
205120501638
205220511639
205320521641
205420531641
205520541622
205620551622
205720561622
205820571622
205920581622
206020591622
206120601622
206220611642
206320621638
206420631639
206520641639
206620651641
206720661641
206820671622
206920681622
207020691622
207120701622
207220711622
207320721622
207420731642
207520741637
207620751638
207720761639
207820771641
207920781641
208020791622
208120801622
208220811622
208320821622
208420831622
208520841622
208620851622
208720861642
208820871638
208920881639
209020891639
209120901641
209220911641
209320921622
209420931622
209520941622
209620951622
209720961622
209820971622
209920981642
210020991637
210121001638
210221011639
210321021641
210421031641
210521041622
210621051622
210721061622
210821071622
210921081622
211021091622
211121101622
211221111642
211321121638
211421131639
211521141639
211621151641
211721161641
211821171622
211921181622
212021191622
212121201622
212221211622
212321221622
212421231642
212521241637
212621251638
212721261639
212821271641
212921281641
213021291622
213121301622
213221311622
213321321622
213421331622
213521341622
213621351622
213721361642
213821371638
213921381639
214021391639
214121401641
214221411641
214321421622
214421431622
214521441622
214621451622
214721461622
214821471622
214921481642
215021491637
215121501638
215221511639
215321521641
215421531641
215521541622
215621551622
215721561622
215821571622
215921581622
216021591622
216121601622
216221611642
216321621638
216421631639
216521641639
216621651641
216721661641
216821671622
216921681622
217021691622
217121701622
217221711622
217321721622
217421731642
217521741637
217621751638
217721761639
217821771641
217921781641
218021791622
218121801622
218221811622
218321821622
218421831622
218521841622
218621851622
218721861642
218821871638
218921881639
219021891639
219121901641
219221911641
219321921622
219421931622
219521941622
219621951622
219721961622
219821971622
219921981642
220021991637
220122001638
220222011639
220322021641
220422031641
220522041622
220622051622
220722061622
220822071622
220922081622
221022091622
221122101622
221222111642
221322121638
221422131639
221522141639
221622151641
221722161641
221822171622
221922181622
222022191622
222122201622
222222211622
222322221622
222422231642
222522241637
222622251638
222722261639
222822271641
222922281641
223022291622
223122301622
223222311622
223322321622
223422331622
223522341622
223622351622
223722361622
223822371642
223922381637
224022391638
224122401639
224222411639
224322421641
224422431622
224522441622
224622451622
224722461622
224822471622
224922481622
225022491622
225122501642
225222511637
225322521639
225422531639
225522541641
225622551641
225722561622
225822571622
225922581622
226022591622
226122601622
226222611622
226322621642
226422631637
226522641638
226622651639
226722661639
226822671641
226922681622
227022691622
227122701622
227222711622
227322721622
227422731622
227522741642
227622751637
227722761638
227822771639
227922781641
228022791641
228122801622
228222811622
228322821622
228422831622
228522841622
228622851622
228722861622
228822871622
228922881637
229022891638
229122901639
229222911639
229322921641
229422931622
229522941622
229622951622
229722961622
229822971622
229922981622
230022991642
230123001637
230223011638
230323021639
230423031641
230523041641
230623051622
230723061622
230823071622
230923081622
231023091622
231123101622
231223111622
231323121637
231423131638
231523141639
231623151639
231723161641
231823171622
231923181622
232023191622
232123201622
232223211622
232323221622
232423231622
232523241642
232623251637
232723261638
232823271639
232923281641
233023291641
233123301622
233223311622
233323321622
233423331622
233523341622
233623351622
233723361622
233823371622
233923381642
234023391637
234123401638
234223411639
234323421641
234423431641
234523441622
234623451622
234723461622
234823471622
234923481622
235023491622
235123501622
235223511642
235323521638
235423531639
235523541639
235623551641
235723561641
235823571622
235923581622
236023591622
236123601622
236223611622
236323621622
236423631642
236523641637
236623651638
236723661639
236823671641
236923681641
237023691622
237123701622
237223711622
237323721622
237423731622
237523741622
237623751642
237723761637
237823771639
237923781639
238023791641
238123801641
238223811622
238323821622
238423831622
238523841622
238623851622
238723861622
238823871622
238923881642
239023891637
239123901638
239223911639
239323921641
239423931641
239523941622
239623951622
239723961622
239823971622
239923981622
240023991642
240124001637
240224011638
240324021641
240424031622
240524041642
240624051637
240724061638
240824071641
240924081622
241024091642
241124101637
241224111638
241324121641
241424131622
241524141642
241624151637
241724161638
241824172417
241924182418
242024192419
242124202420
242224212421
242324222422
242424232423
242524242424
242624252425
242724262426
242824272427
242924282428
243024292429
243124302430
243224312431
243324322432
243424332433
243524342434
243624352435
24372436403
24382437403
24392438403
24402439403
24412440425
24422441426
24432442427
24442443427
24452444429
24462445429
24472446403
24482447403
24492448403
24502449403
24512450403
24522451403
24532452426
24542453438
24552454427
24562455427
24572456429
24582457403
24592458403
24602459403
24612460403
24622461403
24632462403
24642463403
24652464403
24662465425
24672466426
24682467427
24692468427
24702469429
24712470429
24722471403
24732472403
24742473403
24752474403
24762475403
24772476403
24782477426
24792478438
24802479427
24812480427
24822481429
24832482403
24842483403
24852484403
24862485403
24872486403
24882487403
24892488403
24902489403
24912490425
24922491426
24932492427
24942493427
24952494429
24962495429
24972496403
24982497403
24992498403
25002499403
25012500403
25022501403
25032502426
25042503438
25052504427
25062505427
25072506429
25082507403
25092508403
25102509403
25112510403
25122511403
25132512403
25142513403
25152514403
25162515425
25172516426
25182517427
25192518427
25202519429
25212520429
25222521403
25232522403
25242523403
25252524403
25262525403
25272526403
25282527426
25292528438
25302529427
25312530427
25322531429
25332532403
25342533403
25352534403
25362535403
25372536403
25382537403
25392538403
25402539403
25412540425
25422541426
25432542427
25442543427
25452544429
25462545429
25472546403
25482547403
25492548403
25502549403
25512550403
25522551403
25532552426
25542553438
25552554427
25562555427
25572556429
25582557403
25592558403
25602559403
25612560403
25622561403
25632562403
25642563403
25652564403
25662565425
25672566426
25682567427
25692568427
25702569429
25712570429
25722571403
25732572403
25742573403
25752574403
25762575403
25772576403
25782577426
25792578438
25802579427
25812580427
25822581429
25832582403
25842583403
25852584403
25862585403
25872586403
25882587403
25892588403
25902589403
25912590425
25922591426
25932592427
25942593427
25952594429
25962595429
25972596403
25982597403
25992598403
26002599403
26012600403
26022601403
26032602426
26042603438
26052604427
26062605427
26072606429
26082607403
26092608403
26102609403
26112610403
26122611403
26132612403
26142613403
26152614403
26162615425
26172616426
26182617427
26192618427
26202619429
26212620429
26222621403
26232622403
26242623403
26252624403
26262625403
26272626403
26282627426
26292628438
26302629427
26312630427
26322631429
26332632403
26342633403
26352634403
26362635403
26372636403
26382637403
26392638403
26402639403
26412640403
26422641403
26432642426
26442643438
26452644427
26462645427
26472646429
26482647403
26492648403
26502649403
26512650403
26522651403
26532652403
26542653425
26552654426
26562655438
26572656427
26582657429
26592658429
26602659403
26612660403
26622661403
26632662403
26642663403
26652664403
26662665403
26672666403
26682667426
26692668438
26702669427
26712670427
26722671429
26732672403
26742673403
26752674403
26762675403
26772676403
26782677403
26792678425
26802679426
26812680438
26822681427
26832682429
26842683429
26852684403
26862685403
26872686403
26882687403
26892688403
26902689403
26912690403
26922691403
26932692426
26942693438
26952694427
26962695427
26972696429
26982697403
26992698403
27002699403
27012700403
27022701403
27032702403
27042703425
27052704426
27062705438
27072706427
27082707429
27092708429
27102709403
27112710403
27122711403
27132712403
27142713403
27152714403
27162715403
27172716403
27182717426
27192718438
27202719427
27212720427
27222721429
27232722403
27242723403
27252724403
27262725403
27272726403
27282727403
27292728425
27302729426
27312730438
27322731427
27332732429
27342733429
27352734403
27362735403
27372736403
27382737403
27392738403
27402739403
27412740403
27422741403
27432742426
27442743438
27452744427
27462745427
27472746429
27482747403
27492748403
27502749403
27512750403
27522751403
27532752403
27542753425
27552754426
27562755438
27572756427
27582757429
27592758429
27602759403
27612760403
27622761403
27632762403
27642763403
27652764403
27662765403
27672766403
27682767426
27692768438
27702769427
27712770427
27722771429
27732772403
27742773403
27752774403
27762775403
27772776403
27782777403
27792778425
27802779426
27812780438
27822781427
27832782429
27842783429
27852784403
27862785403
27872786403
27882787403
27892788403
27902789403
27912790403
27922791403
27932792426
27942793438
27952794427
27962795427
27972796429
27982797403
27992798403
28002799403
28012800403
28022801403
28032802403
28042803425
28052804426
28062805438
28072806427
28082807429
28092808429
28102809403
28112810403
28122811403
28132812403
28142813403
28152814403
28162815403
28172816403
28182817426
28192818438
28202819427
28212820427
28222821429
28232822403
28242823403
28252824403
28262825403
28272826403
28282827403
28292828403
28302829403
28312830403
28322831403
28332832403
28342833403
28352834403
28362835403
28372836403
28382837403
28392838403
28402839403
28412840403
28422841403
28432842425
28442843426
28452844438
28462845427
28472846427
28482847429
28492848403
28502849403
28512850403
28522851403
28532852403
28542853403
28552854425
28562855426
28572856438
28582857427
28592858429
28602859429
28612860403
28622861403
28632862403
28642863403
28652864403
28662865403
28672866403
28682867425
28692868426
28702869438
28712870427
28722871427
28732872429
28742873403
28752874403
28762875403
28772876403
28782877403
28792878403
28802879425
28812880426
28822881438
28832882427
28842883429
28852884429
28862885403
28872886403
28882887403
28892888403
28902889403
28912890403
28922891403
28932892425
28942893426
28952894438
28962895427
28972896427
28982897429
28992898403
29002899403
29012900403
29022901403
29032902403
29042903403
29052904425
29062905426
29072906438
29082907427
29092908429
29102909429
29112910403
29122911403
29132912403
29142913403
29152914403
29162915403
29172916403
29182917425
29192918426
29202919438
29212920427
29222921427
29232922429
29242923403
29252924403
29262925403
29272926403
29282927403
29292928403
29302929425
29312930426
29322931438
29332932427
29342933429
29352934429
29362935403
29372936403
29382937403
29392938403
29402939403
29412940403
29422941403
29432942425
29442943426
29452944438
29462945427
29472946427
29482947429
29492948403
29502949403
29512950403
29522951403
29532952403
29542953403
29552954425
29562955426
29572956438
29582957427
29592958429
29602959429
29612960403
29622961403
29632962403
29642963403
29652964403
29662965403
29672966403
29682967403
29692968426
29702969438
29712970427
29722971427
29732972429
29742973403
29752974403
29762975403
29772976403
29782977403
29792978403
29802979425
29812980426
29822981438
29832982427
29842983429
29852984429
29862985403
29872986403
29882987403
29892988403
29902989403
29912990403
29922991403
29932992425
29942993426
29952994438
29962995427
29972996427
29982997429
29992998403
30002999403
30013000403
30023001403
30033002403
30043003403
30053004425
30063005426
30073006438
30083007427
30093008429
30103009429
30113010403
30123011403
30133012403
30143013403
30153014403
30163015403
30173016403
30183017425
30193018426
30203019438
30213020427
30223021427
30233022429
30243023403
30253024403
30263025403
30273026403
30283027403
30293028403
30303029425
30313030426
30323031438
30333032427
30343033429
30353034429
30363035403
30373036403
30383037403
30393038403
30403039403
30413040403
30423041403
30433042403
30443043403
30453044403
30463045426
30473046438
30483047427
30493048429
30503049429
30513050403
30523051403
30533052403
30543053403
30553054403
30563055403
30573056425
30583057438
30593058427
30603059427
30613060429
30623061429
30633062403
30643063403
30653064403
30663065403
30673066403
30683067403
30693068403
30703069425
30713070426
30723071438
30733072427
30743073429
30753074429
30763075403
30773076403
30783077403
30793078403
30803079403
30813080403
30823081425
30833082438
30843083427
30853084427
30863085429
30873086429
30883087403
30893088403
30903089403
30913090403
30923091403
30933092403
30943093403
30953094425
30963095426
30973096438
30983097427
30993098429
31003099429
31013100403
31023101403
31033102403
31043103403
31053104403
31063105403
31073106425
31083107438
31093108427
31103109427
31113110429
31123111429
31133112403
31143113403
31153114403
31163115403
31173116403
31183117403
31193118403
31203119425
31213120426
31223121438
31233122427
31243123429
31253124429
31263125403
31273126403
31283127403
31293128403
31303129403
31313130403
31323131425
31333132438
31343133427
31353134427
31363135429
31373136429
31383137403
31393138403
31403139403
31413140403
31423141403
31433142403
31443143403
31453144425
31463145426
31473146438
31483147427
31493148429
31503149429
31513150403
31523151403
31533152403
31543153403
31553154403
31563155403
31573156425
31583157438
31593158427
31603159427
31613160429
31623161429
31633162403
31643163403
31653164403
31663165403
31673166403
31683167403
31693168403
31703169425
31713170426
31723171438
31733172427
31743173429
31753174429
31763175403
31773176403
31783177403
31793178403
31803179403
31813180403
31823181425
31833182438
31843183427
31853184427
31863185429
31873186429
31883187403
31893188403
31903189403
31913190403
31923191403
31933192403
31943193403
31953194425
31963195426
31973196438
31983197427
31993198429
32003199429
32013200403
32023201403
32033202403
32043203403
32053204403
32063205403
32073206425
32083207438
32093208427
32103209427
32113210429
32123211429
32133212403
32143213403
32153214403
32163215403
32173216403
32183217403
32193218403
32203219425
32213220426
32223221438
32233222427
32243223429
32253224429
32263225403
32273226403
32283227403
32293228403
32303229403
32313230403
32323231403
32333232403
32343233403
32353234403
32363235403
32373236403
32383237403
32393238403
32403239403
32413240403
32423241403
32433242403
32443243403
32453244403
32463245403
32473246403
32483247403
324932481233
325032491233
325132501233
325232511233
325332521233
325432531233
325532541233
325632551233
325732561233
325832571233
325932581233
326032591233
326132601233
326232611246
326332621246
326432631246
326532641246
326632651246
326732661246
326832671246
326932681246
327032691246
327132701246
327232711246
327332721246
327432731246
327532741233
327632751233
327732761233
327832771233
327932781233
328032791233
328132801233
328232811233
328332821233
328432831233
328532841233
328632851233
328732861233
328832871246
328932881246
329032891246
329132901246
329232911246
329332921246
329432931246
329532941246
329632951246
329732961246
329832971246
329932981246
330032991246
330133001233
330233011233
330333021233
330433031233
330533041233
330633051233
330733061233
330833071233
330933081233
331033091233
331133101233
331233111233
331333121246
331433131246
331533141246
331633151246
331733161246
331833171246
331933181246
332033191246
332133201246
332233211246
332333221246
332433231246
332533241246
332633251233
332733261233
332833271233
332933281233
333033291233
333133301233
333233311233
333333321233
333433331233
333533341233
333633351233
333733361233
333833371246
333933381246
334033391246
334133401246
334233411246
334333421246
334433431246
334533441246
334633451246
334733461246
334833471246
334933481246
335033491233
335133501233
335233511233
335333521233
335433531233
335533541233
335633551233
335733561233
335833571233
335933581233
336033591233
336133601233
336233611233
336333621246
336433631246
336533641246
336633651246
336733661246
336833671246
336933681246
337033691246
337133701246
337233711246
337333721246
337433731246
337533741246
337633751233
337733761233
337833771233
337933781233
338033791233
338133801233
338233811233
338333821233
338433831233
338533841233
338633851233
338733861233
338833871246
338933881246
339033891246
339133901246
339233911246
339333921246
339433931246
339533941246
339633951246
339733961246
339833971246
339933981246
340033991246
340134001233
340234011233
340334021233
340434031233
340534041233
340634051233
340734061233
340834071233
340934081233
341034091233
341134101233
341234111233
341334121246
341434131246
341534141246
341634151246
341734161246
341834171246
341934181246
342034191246
342134201246
342234211246
342334221246
342434231246
342534241246
342634251246
342734261233
342834271233
342934281233
343034291233
343134301233
343234311233
343334321233
343434331233
343534341233
343634351233
343734361233
343834371233
343934381246
344034391246
344134401246
344234411246
344334421246
344434431246
344534441246
344634451246
344734461246
344834471246
344934481246
345034491246
345134501233
345234511233
345334521233
345434531233
345534541233
345634551233
345734561233
345834571233
345934581233
346034591233
346134601233
346234611233
346334621246
346434631246
346534641246
346634651246
346734661246
346834671246
346934681246
347034691246
347134701246
347234711246
347334721246
347434731246
347534741246
347634751246
347734761233
347834771233
347934781233
348034791233
348134801233
348234811233
348334821233
348434831233
348534841233
348634851233
348734861233
348834871233
348934881246
349034891246
349134901246
349234911246
349334921246
349434931246
349534941246
349634951246
349734961246
349834971246
349934981246
350034991246
350135001246
350235011233
350335021233
350435031233
350535041233
350635051233
350735061233
350835071233
350935081233
351035091233
351135101233
351235111233
351335121233
351435131246
351535141246
351635151246
351735161246
351835171246
351935181246
352035191246
352135201246
352235211246
352335221246
352435231246
352535241246
352635251246
352735261246
352835271233
352935281233
353035291233
353135301233
353235311233
353335321233
353435331233
353535341233
353635351233
353735361233
353835371233
353935381233
354035391246
354135401246
354235411246
354335421246
354435431246
354535441246
354635451246
354735461246
354835471246
354935481246
355035491246
355135501246
355235511233
355335521233
355435531233
355535541233
355635551233
355735561233
355835571233
355935581233
356035591233
356135601233
356235611233
356335621233
356435631246
356535641246
356635651246
356735661246
356835671246
356935681246
357035691246
357135701246
357235711246
357335721246
357435731246
357535741246
357635751246
357735761246
357835771233
357935781233
358035791233
358135801233
358235811233
358335821233
358435831233
358535841233
358635851233
358735861233
358835871233
358935881233
359035891246
359135901246
359235911246
359335921246
359435931246
359535941246
359635951246
359735961246
359835971246
359935981246
360035991246
360136001246
360236011246
360336021233
360436031233
360536041233
360636051233
360736061233
360836071233
360936081233
361036091233
361136101233
361236111233
361336121233
361436131233
361536141246
361636151246
361736161246
361836171246
361936181246
362036191246
362136201246
362236211246
362336221246
362436231246
362536241246
362636251246
362736261246
362836273627
362936283628
363036293629
363136303630
363236313631
363336323632
363436333633
363536343634
363636353635
363736363635
363836373635
363936383635
364036393635
364136403635
364236413635
364336423635
364436433635
364536443635
364636453635
364736463635
364836473635
364936483635
365036493635
365136503635
365236513635
365336523635
365436533635
365536543635
365636553635
365736563635
365836573635
365936583635
366036593635
366136603635
366236613635
366336623635
366436633635
366536643635
366636653635
366736663635
366836673635
366936683635

プログラム
今時のPCが追いつけない状況がこのプログラムに現れています。
プログラマでなくてもハッキリわかるので、ぜひご覧ください。
dispframe_amithlonと書かれた処理がAmithlon用で今時のPCと同じ、固定式フレームバッファです。
dispframe_amiga500がAmiga500用です。見てください、この処理の簡潔さ。
表示したい画像データを指定してOSを2コールでおしまい。
この2コールでは画像を1バイトもコピーしません。なのに画面切換が完了します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#include <proto/asl.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/iffparse.h>
#include <proto/intuition.h>
#include <proto/timer.h>
#include <proto/utility.h>
#include <clib/alib_protos.h>

#include <datatypes/pictureclass.h>
#include <exec/exec.h>
#include <libraries/iffparse.h>
#include <intuition/screens.h>

#define FRAME_WIDTH    320L
#define FRAME_HEIGHT    240L
#define FRAME_PLANES    5
#define FRAME_CMAPS    32

#define BGM_LOAD    1
#define BGM_PLAY    2
#define BGM_STOP    3

extern struct Device *TimerBase = NULL;

struct FrameMapBody
{
    long fn_DispCount;
    long fn_DispNum;
    long fn_LastTime;
    struct BitMap *fn_pBitMap;
    struct ColorRegister fn_Cmap[FRAME_CMAPS];
    UWORD fn_ColorTable[FRAME_CMAPS];
    UBYTE fn_Body[FRAME_WIDTH / 8 * FRAME_HEIGHT * FRAME_PLANES];
};



struct DispNode
{
    struct Node dn_Node;
    long dn_Position;
    long dn_File;
    struct FrameMapBody *dn_Frame;
};



struct BitMapNode
{
    struct Node bn_Node;
    struct FrameMapBody *bn_pFrame;
    struct BitMap *bn_pBitMap;
};



struct DispInfo
{
    struct Screen *di_screen;
    long di_dispcount;
    long di_dispstep;
    struct List di_DispList;
    struct FrameMapBody **di_disparray;
    struct List di_BitMapList;
};



struct FrameMapBody *loadframe(struct IFFHandle *pIff, char *pFname)
{
    UBYTE *pBody = NULL;
    struct FrameMapBody *pNewFrame = NULL;
    long error = -1;

    pBody = (UBYTE *)AllocMem(sizeof(pNewFrame->fn_Body), MEMF_PUBLIC | MEMF_CLEAR);
    if (pBody)
    {
        pNewFrame = (struct FrameMapBody *)AllocMem(sizeof(*pNewFrame), MEMF_PUBLIC | MEMF_CLEAR);
    }

    if (pNewFrame)
    {
        error = 0;
        pIff->iff_Stream = (ULONG)Open(pFname, MODE_OLDFILE);
    }

    if (pIff->iff_Stream)
    {
        InitIFFasDOS(pIff);

        error = OpenIFF(pIff, IFFF_READ);
        if (error < 0)
        {
            printf("error OpenIFF '%s'\n", pFname);
        }
    }
    else
    {
        printf("error Open '%s'\n", pFname);
        error = -1;
    }

    if (!error)
    {
        struct StoredProperty *pProp = NULL;
        struct ColorRegister *pColorRegister = NULL; 

        if (!error)
        {
            error = PropChunk(pIff, ID_ILBM, ID_CMAP);
        }
        if (error < 0)
        {
            printf("error PropChunk\n");
        }

        if (!error)
        {
            error = PropChunk(pIff, ID_ILBM, ID_BODY);
        }
        if (error < 0)
        {
            printf("error PropChunk\n");
        }

        if (!error)
        {
            error = StopChunk(pIff, ID_ILBM, ID_BODY);
        }
        if (error < 0)
        {
            printf("error StopChunk\n");
        }

        if (!error)
        {
            error = ParseIFF(pIff, IFFPARSE_SCAN);
        }

        if (IFFERR_EOF == error)
        {
            error = 0;
            printf("ParseIFF IFFERR_EOF\n");
        }
        else if (error)
        {
            printf("error ParseIFF = %d\n", error);
        }

        if (!error)
        {
            pProp = FindProp(pIff, ID_ILBM, ID_CMAP);
        }

        if (!pProp)
        {
            printf("error FindProp\n");
        }

        if (pProp)
        {
            pColorRegister = (struct ColorRegister *)pProp->sp_Data;
        }

        if (pColorRegister)
        {
            long i;

            CopyMem(pColorRegister, pNewFrame->fn_Cmap, sizeof(pNewFrame->fn_Cmap));

            for (i = 0; i < FRAME_CMAPS; i++)
            {
                pNewFrame->fn_ColorTable[i] = (UWORD)(
                        ((pNewFrame->fn_Cmap[i].red << 4) & 0x0f00) |
                        ((pNewFrame->fn_Cmap[i].green) & 0x00f0) |
                        ((pNewFrame->fn_Cmap[i].blue >> 4) & 0x000f)
                        );
            }

            pColorRegister = NULL;
        }

        if (!error)
        {
            error = ReadChunkBytes(pIff, pBody, sizeof(pNewFrame->fn_Body));
            if (0 <= error)
            {
                error = 0;
            }
        }

        CloseIFF(pIff);
    }

    if (pIff->iff_Stream)
    {
        Close(pIff->iff_Stream);
        pIff->iff_Stream = NULL;
    }

    if (!error)
    {
        UBYTE *pFrom = pBody;
        long y;
        for (y = 0; y < FRAME_HEIGHT; y++)
        {
            UBYTE *pTo = pNewFrame->fn_Body + (FRAME_WIDTH / 8) * y;
            long p;
            for (p = 0; p < FRAME_PLANES; p++)
            {
                CopyMem(pFrom, pTo, FRAME_WIDTH / 8);
                pFrom += FRAME_WIDTH / 8;
                pTo += FRAME_WIDTH / 8 * FRAME_HEIGHT;
            }
        }
    }

    if (pBody)
    {
        FreeMem(pBody, sizeof(pNewFrame->fn_Body));
        pBody = NULL;
    }

    if (error && pNewFrame)
    {
        FreeMem(pNewFrame, sizeof(*pNewFrame));
        pNewFrame = NULL;
    }

    return pNewFrame;
}



void dispframe_amithlon(struct DispInfo *pInfo, struct FrameMapBody *pFrame)
{
    if (pInfo->di_screen && pFrame && pFrame->fn_pBitMap)
    {
        UBYTE *pBGR = pInfo->di_screen->RastPort.BitMap->Planes[0];
        long bpr = pInfo->di_screen->RastPort.BitMap->BytesPerRow;
        long y;

        for (y = 0; y < FRAME_HEIGHT; y++)
        {
            long x;

            for (x = 0; x < FRAME_WIDTH; x++)
            {
                UBYTE p[FRAME_PLANES];
                UBYTE pmask = 0x0080 >> (x % 8);
                UBYTE selPalette = 0x00;
                long i;

                for (i = 0; i < sizeof(p) / sizeof(p[0]); i++)
                {
                    if ((*(pFrame->fn_pBitMap->Planes[i] + FRAME_WIDTH / 8 * y + x / 8)) & pmask)
                        selPalette |= 0x0001 << i;
                }

                pBGR[bpr * y + 4 * x + 0] = pFrame->fn_Cmap[selPalette].blue;
                pBGR[bpr * y + 4 * x + 1] = pFrame->fn_Cmap[selPalette].green;
                pBGR[bpr * y + 4 * x + 2] = pFrame->fn_Cmap[selPalette].red;
            }
        }
    }
}



void dispframe_amiga500(struct Screen *pScreen, struct FrameMapBody *pFrame)
{
    if (pScreen && pFrame && pFrame->fn_pBitMap)
    {
        pScreen->RastPort.BitMap = pFrame->fn_pBitMap;
        pScreen->ViewPort.RasInfo->BitMap = pFrame->fn_pBitMap;

        MakeScreen(pScreen);
        RethinkDisplay();
/*
        LoadRGB4(&pScreen->ViewPort, pFrame->fn_ColorTable, FRAME_CMAPS);
*/
    }
}



void dispframe(struct DispInfo *pInfo)
{
    struct FrameMapBody *pFrame = NULL;

    if (pInfo && pInfo->di_screen)
    {
        pFrame = pInfo->di_disparray[pInfo->di_dispstep];
    }

    if (pFrame)
    {
        if (FRAME_PLANES == pInfo->di_screen->RastPort.BitMap->Depth)
        {
            dispframe_amiga500(pInfo->di_screen, pFrame);
        }
        else
        {
            dispframe_amithlon(pInfo, pFrame);
        }

        pFrame->fn_DispCount++;
        pFrame->fn_LastTime = pInfo->di_dispstep;
    }
    else
    {
        printf("error dispframe not found frame.\n");
    }
}



struct Screen *setupscreen(void)
{
    struct Screen *pScreen = NULL;
    long lDepth = 0;
    struct Rectangle qRect = {0, 0, 0, 0};
    struct DimensionInfo di;
    struct NewScreen ns;
    struct TagItem tl[] = {
        {SA_Depth, 0},
        {SA_Width, 0},
        {SA_Height, 0},
        {SA_Type, CUSTOMSCREEN},
        {SA_DisplayID, 0},
        {SA_ShowTitle, FALSE},
        {SA_Behind, TRUE},
        {SA_Quiet, TRUE},
        {TAG_DONE, 0}
    };
    struct TagItem *pTag = NULL;
    LONG ulModeID = INVALID_ID;

    ulModeID = BestModeID(
            BIDTAG_Depth, 24,
            BIDTAG_NominalWidth, FRAME_WIDTH,
            BIDTAG_NominalHeight, FRAME_HEIGHT,
            TAG_DONE, 0
        );

    if (INVALID_ID == ulModeID)
    {
        ulModeID = BestModeID(
                BIDTAG_Depth, FRAME_PLANES,
                BIDTAG_NominalWidth, FRAME_WIDTH,
                BIDTAG_NominalHeight, FRAME_HEIGHT,
                TAG_DONE, 0
            );
    }

    if (INVALID_ID != ulModeID)
    {
        QueryOverscan(ulModeID, &qRect, OSCAN_MAX);

        memset(&di, 0x00, sizeof(di));
        GetDisplayInfoData(NULL, &di, sizeof(di), DTAG_DIMS, ulModeID);
        if (di.MaxDepth < 24)
        {
            lDepth = FRAME_PLANES;
        }

        pTag = FindTagItem(SA_Depth, tl);
        if (pTag)
        {
            if (lDepth)
            {
                pTag->ti_Data = lDepth;
            }
            else
            {
                pTag->ti_Tag = TAG_IGNORE;
            }
        }

        pTag = FindTagItem(SA_Width, tl);
        if (pTag)
        {
            pTag->ti_Data = FRAME_WIDTH;
        }

        pTag = FindTagItem(SA_Height, tl);
        if (pTag)
        {
            pTag->ti_Data = FRAME_HEIGHT;
        }

        pTag = FindTagItem(SA_DisplayID, tl);
        if (pTag)
        {
            pTag->ti_Data = ulModeID;
        }

        memset(&ns, 0x00, sizeof(ns));
        pScreen = OpenScreenTagList(&ns, tl);
        if (!pScreen)
        {
            printf("OpenScreenTagList can not open screen.\n");
        }
    }
    else
    {
        printf("BestModeID can not select mode id.\n");
    }

    if (pScreen)
    {
        if (lDepth)
        {
            pScreen->RastPort.Flags |= DBUFFER;
        }
    }

    return pScreen;
}



void loadframeinfo(struct DispInfo *pInfo)
{
    FILE *fpFrame = NULL;

    pInfo->di_dispcount = 0;
    pInfo->di_DispList.lh_Type = NT_USER;

    fpFrame = fopen("frame.txt", "r");

    if (fpFrame)
    {
        char linebuff[256];
        memset(linebuff, 0x00, sizeof(linebuff));

        while (fgets(linebuff, sizeof(linebuff), fpFrame))
        {
            struct DispNode *pDispNode = NULL;
            long pos = -1, ref = -1;
            char *tp;

            tp = strtok(linebuff, " \t");
            if (tp)
            {
                pos = atol(tp);
            }

            if (tp)
            {
                tp = strtok(NULL, " \t");
            }

            if (tp)
            {
                ref = atol(tp);
            }

            if (pos < 0 || ref < 0)
            {
                printf("error can not to load index.\n");
            }
            else
            {
                pDispNode = AllocMem(sizeof(*pDispNode), MEMF_CLEAR);
            }

            if (pDispNode)
            {
                memset(pDispNode, 0x00, sizeof(*pDispNode));
                pDispNode->dn_Position = pos;
                pDispNode->dn_File = ref;
                AddTail(&pInfo->di_DispList, &pDispNode->dn_Node);
                pDispNode = NULL;

                pInfo->di_dispcount++;
            }
        }

        fclose(fpFrame);
        fpFrame = NULL;
    }
    else
    {
        printf("error can not open frame.txt\n");
    }
}



void loadframes(struct DispInfo *pInfo)
{
    struct IFFHandle *pIff = NULL;
    struct Node *pDisp;

    pIff = AllocIFF();
    for (pDisp = pInfo->di_DispList.lh_Head; pDisp->ln_Succ; pDisp = pDisp->ln_Succ)
    {
        struct DispNode *pDispNode = (struct DispNode *)pDisp;
        if (pDispNode->dn_Position == pDispNode->dn_File)
        {
            char framename[256];
            memset(framename, 0x00, sizeof(framename));
            sprintf(framename, "frames/frame_%04d", pDispNode->dn_File);

            pDispNode->dn_Frame = loadframe(pIff, framename);
        }
    }

    if (0 < pInfo->di_dispcount)
    {
        pInfo->di_disparray = (struct FrameMapBody **)AllocMem(sizeof(struct FrameMapBody *) * pInfo->di_dispcount,
                                    MEMF_CLEAR);
    }

    if (pInfo->di_disparray)
    {
        long i = 0;
        for (pDisp = pInfo->di_DispList.lh_Head; pDisp->ln_Succ; pDisp = pDisp->ln_Succ)
        {
            struct DispNode *pDispNode = (struct DispNode *)pDisp;
            if (pDispNode->dn_Position == pDispNode->dn_File)
            {
                pInfo->di_disparray[i] = pDispNode->dn_Frame;
            }
            else if (0 <= pDispNode->dn_File)
            {
                pInfo->di_disparray[i] = pInfo->di_disparray[pDispNode->dn_File];
            }

            if (pInfo->di_disparray[i])
            {
                pInfo->di_disparray[i]->fn_DispNum++;
            }

            i++;
        }
    }

    if (pIff)
    {
        FreeIFF(pIff);
        pIff = NULL;
    }
}



void unloadinfo(struct DispInfo *pInfo)
{
    struct Node *pDisp;
    if (pInfo->di_disparray)
    {
        FreeMem(pInfo->di_disparray, sizeof(struct FrameMapBody *) * pInfo->di_dispcount);
        pInfo->di_disparray = NULL;
    }

    for (pDisp = RemHead(&pInfo->di_DispList); pDisp; pDisp = RemHead(&pInfo->di_DispList))
    {
        struct DispNode *pDispNode = (struct DispNode *)pDisp;
        if (pDispNode->dn_Frame)
        {
            FreeMem(pDispNode->dn_Frame, sizeof(*pDispNode->dn_Frame));
            pDispNode->dn_Frame = NULL;
        }
        FreeMem(pDispNode, sizeof(*pDispNode));
        pDispNode = NULL;
        pDisp = NULL;
    }
}



void bgm(long lCommand)
{
    if (BGM_LOAD == lCommand)
    {
        char gcd[256];
        char cmd_assign[256];

        memset(gcd, 0x00, sizeof(gcd));
        GetCurrentDirName(gcd, sizeof(gcd));

        memset(cmd_assign, 0x00, sizeof(cmd_assign));
        sprintf(cmd_assign, "assign HACHUNE: %s", gcd);
        system(cmd_assign);

        system("REXXC:rx HACHUNE:load_bgm.rexx");
    }
    else if (BGM_PLAY == lCommand)
    {
        system("REXXC:rx HACHUNE:play_bgm.rexx");
    }
    else if (BGM_STOP == lCommand)
    {
        system("REXXC:rx HACHUNE:quit_bgm.rexx");
    }
}



void allocbuff(struct DispInfo *pInfo)
{
    pInfo->di_BitMapList.lh_Type = NT_USER;

    while (200L * 1024 < AvailMem(MEMF_CHIP))
    {
        struct BitMapNode *pBitMapNode;
        pBitMapNode = AllocMem(sizeof(*pBitMapNode), MEMF_PUBLIC | MEMF_CLEAR);

        if (pBitMapNode)
        {
            memset(pBitMapNode, 0x00, sizeof(*pBitMapNode));
            pBitMapNode->bn_pBitMap = AllocBitMap(FRAME_WIDTH, FRAME_HEIGHT, FRAME_PLANES,
                                BMF_DISPLAYABLE | BMF_CLEAR, NULL);
        }

        if (pBitMapNode && pBitMapNode->bn_pBitMap)
        {
            AddTail(&pInfo->di_BitMapList, &pBitMapNode->bn_Node);
            pBitMapNode = NULL;
        }

        if (pBitMapNode)
        {
            FreeMem(pBitMapNode, sizeof(*pBitMapNode));
            pBitMapNode = NULL;

            printf("AllocBitMap error.\n");
            break;
        }
    }
}



void freebuff(struct DispInfo *pInfo)
{
    struct Node *pNode;

    WaitBlit();

    for (pNode = RemHead(&pInfo->di_BitMapList); pNode; pNode = RemHead(&pInfo->di_BitMapList))
    {
        struct BitMapNode *pBitMapNode = (struct BitMapNode *)pNode;
        if (pBitMapNode->bn_pBitMap)
        {
            FreeBitMap(pBitMapNode->bn_pBitMap);
            pBitMapNode->bn_pBitMap = NULL;
        }

        if (pBitMapNode->bn_pFrame)
        {
            pBitMapNode->bn_pFrame->fn_pBitMap = NULL;
            pBitMapNode->bn_pFrame = NULL;
        }

        FreeMem(pBitMapNode, sizeof(*pBitMapNode));
        pBitMapNode = NULL;
        pNode = NULL;
    }
}



void fast2chip_preload(struct DispInfo *pInfo)
{
    struct Node *pNode;
    for (pNode = pInfo->di_BitMapList.lh_Head; pNode->ln_Succ; pNode = pNode->ln_Succ)
    {
        long foundit = -1;
        struct BitMapNode *pBitMapNode = (struct BitMapNode *)pNode;
        if (!pBitMapNode->bn_pFrame)
        {
            long i;
            for (i = 0; i < pInfo->di_dispcount; i++)
            {
                if (pInfo->di_disparray[i] && !pInfo->di_disparray[i]->fn_pBitMap)
                {
                    foundit = i;
                    break;
                }
            }
        }

        if (0 <= foundit)
        {
            long p;

            pBitMapNode->bn_pFrame = pInfo->di_disparray[foundit];
            pInfo->di_disparray[foundit]->fn_pBitMap = pBitMapNode->bn_pBitMap;

            for (p = 0; p < FRAME_PLANES; p++)
            {
                CopyMem(pInfo->di_disparray[foundit]->fn_Body + FRAME_WIDTH / 8 * FRAME_HEIGHT * p,
                    pBitMapNode->bn_pBitMap->Planes[p], FRAME_WIDTH / 8 * FRAME_HEIGHT);
            }
        }
    }
}



void fast2chip(struct DispInfo *pInfo)
{
    struct BitMapNode *pRoom = NULL;
    struct FrameMapBody *pLoad = NULL;
    struct Node *pNode;
    for (pNode = pInfo->di_BitMapList.lh_Head; pNode->ln_Succ; pNode = pNode->ln_Succ)
    {
        struct FrameMapBody *pFrame = ((struct BitMapNode *)pNode)->bn_pFrame;
        if (pFrame)
        {
            if (pFrame->fn_DispCount < pFrame->fn_DispNum)
            {
            }
            else if (pFrame->fn_LastTime < pInfo->di_dispstep)
            {
                pRoom = (struct BitMapNode *)pNode;
            }
        }
    }

    if (pRoom)
    {
        long i;
        for (i = pInfo->di_dispstep; i < pInfo->di_dispcount; i++)
        {
            if (!pInfo->di_disparray[i]->fn_pBitMap)
            {
                pLoad = pInfo->di_disparray[i];
                break;
            }
        }
    }

    if (pLoad)
    {
        long p;

        pRoom->bn_pFrame->fn_pBitMap = NULL;
        pRoom->bn_pFrame = NULL;

        pLoad->fn_pBitMap = pRoom->bn_pBitMap;
        pRoom->bn_pFrame = pLoad;
        pRoom = NULL;

        for (p = 0; p < FRAME_PLANES; p++)
        {
            CopyMem(pLoad->fn_Body + FRAME_WIDTH / 8 * FRAME_HEIGHT * p,
                pLoad->fn_pBitMap->Planes[p], FRAME_WIDTH / 8 * FRAME_HEIGHT);
        }
    }
}



void adjustpalette(struct DispInfo *pInfo)
{
    if (FRAME_PLANES == pInfo->di_screen->RastPort.BitMap->Depth
        && pInfo->di_DispList.lh_Head->ln_Succ)
    {
        struct DispNode *pDisp = (struct DispNode *)pInfo->di_DispList.lh_Head;
        if (pDisp->dn_Frame)
        {
            LoadRGB4(&pInfo->di_screen->ViewPort, pDisp->dn_Frame->fn_ColorTable, FRAME_CMAPS);
        }
    }
}



void main()
{
    struct DispInfo dispinfo;
    struct Screen *pScreen = NULL;
    struct MsgPort *pTimerMP = NULL;
    struct timerequest *pTimerIO = NULL;
    BOOL bIsOpenTimer = FALSE;
    struct BitMap *pLastBitMap = NULL;

    pTimerMP = CreatePort(0, 0);
    if (pTimerMP)
    {
        pTimerIO = (struct timerequest *)CreateExtIO(pTimerMP, sizeof(*pTimerIO));
    }

    if (pTimerIO)
    {
        if (!OpenDevice((unsigned char *)TIMERNAME,
            (unsigned long)UNIT_WAITUNTIL, (struct IORequest *)pTimerIO, 0UL))
        {
            TimerBase = pTimerIO->tr_node.io_Device;
            bIsOpenTimer = TRUE;
        }
    }

    if (bIsOpenTimer)
    {
        pScreen = setupscreen();
    }

    if (pScreen && pScreen->RastPort.BitMap)
    {
        pLastBitMap = pScreen->RastPort.BitMap;
    }

    memset(&dispinfo, 0x00, sizeof(dispinfo));
    /* for 'IsListEmpty' */
    NewList(&dispinfo.di_DispList);
    NewList(&dispinfo.di_BitMapList);
    dispinfo.di_screen = pScreen;
    pScreen = NULL;

    if (dispinfo.di_screen)
    {
        loadframeinfo(&dispinfo);
    }
    else
    {
        printf("can not setupscreen().\n");
    }

    if (!IsListEmpty(&dispinfo.di_DispList))
    {
        bgm(BGM_LOAD);

        loadframes(&dispinfo);

        adjustpalette(&dispinfo);
    }

    if (dispinfo.di_disparray)
    {
        struct timeval line_tv;
        struct timeval step_tv;
        ULONG ulTimerSig = 1UL << pTimerMP->mp_SigBit;
        BOOL bIsDoDisp = TRUE;
        long j;
        long delay_adjust = 0;

        allocbuff(&dispinfo);

        fast2chip_preload(&dispinfo);

        memset(&line_tv, 0x00, sizeof(line_tv));
        GetSysTime(&line_tv);

        memset(&step_tv, 0x00, sizeof(step_tv));
        if (FRAME_PLANES == dispinfo.di_screen->RastPort.BitMap->Depth)
        {
            step_tv.tv_secs = 0;
            step_tv.tv_micro = 40 * 1000L;
            delay_adjust = 15;
        }
        else
        {
            step_tv.tv_secs = 0;
            step_tv.tv_micro = 40 * 1000L;
            delay_adjust = 15;
        }

        for (j = 0; j < delay_adjust; j++)
        {
            AddTime(&line_tv, &step_tv);
        }

        ScreenToFront(dispinfo.di_screen);

        bgm(BGM_PLAY);

        while (dispinfo.di_dispstep < dispinfo.di_dispcount)
        {
            ULONG ulSig = 0L;

            if (bIsDoDisp && dispinfo.di_dispstep < dispinfo.di_dispcount)
            {
                struct timeval now_tv;

                bIsDoDisp = FALSE;

                pTimerIO->tr_node.io_Command = TR_ADDREQUEST;
                pTimerIO->tr_time.tv_secs = line_tv.tv_secs;
                pTimerIO->tr_time.tv_micro = line_tv.tv_micro;
                SendIO((struct IORequest *)pTimerIO);

                AddTime(&line_tv, &step_tv);

                dispframe(&dispinfo);

                memset(&now_tv, 0x00, sizeof(now_tv));
                GetSysTime(&now_tv);
                if (0 < CmpTime(&now_tv, &line_tv))
                {
                    fast2chip(&dispinfo);
                }

                dispinfo.di_dispstep++;
            }

            ulSig = Wait(ulTimerSig);
            if (ulSig & ulTimerSig)
            {
                struct Message *pNormalMsg = NULL;
                while (pNormalMsg = GetMsg(pTimerMP))
                {
                    if (pNormalMsg == (struct Message *)pTimerIO)
                    {
                        bIsDoDisp = TRUE;
                    }
                }
            }
        }

        bgm(BGM_STOP);
    }

    if (dispinfo.di_screen && pLastBitMap)
    {
        dispinfo.di_screen->RastPort.BitMap = pLastBitMap;
        pLastBitMap = NULL;

        MakeScreen(dispinfo.di_screen);
        RethinkDisplay();
    }

    freebuff(&dispinfo);

    if (bIsOpenTimer)
    {
        if (!CheckIO((struct IORequest *)pTimerIO))
        {
            AbortIO((struct IORequest *)pTimerIO);
            WaitIO((struct IORequest *)pTimerIO);
        }

        CloseDevice((struct IORequest *)pTimerIO);
        TimerBase = NULL;
        bIsOpenTimer = FALSE;
    }

    if (pTimerIO)
    {
        DeleteExtIO((struct IORequest *)pTimerIO);
        pTimerIO = NULL;
    }

    if (pTimerMP)
    {
        DeletePort(pTimerMP);
        pTimerMP = NULL;
    }

    unloadinfo(&dispinfo);

    if (dispinfo.di_screen)
    {
        CloseScreen(dispinfo.di_screen);
        dispinfo.di_screen = NULL;
    }
}
どのページも無断でリンクして構いません。
Valid HTML 4.01 Transitional