From 594bae844ef81a836fbeeaee652605899d7cd68f Mon Sep 17 00:00:00 2001 From: Andre Zeps Date: Fri, 20 Feb 2026 08:42:34 +0100 Subject: [PATCH] FMV: Fixed timing of frame events and parameters - Decoupled SEQ event from GOP event. Now behaves like real VMPEG hardware - Fixes Lost Ride gameplay after vehicle charge intro - Fixes timing accuracy of temp ref and time code Measurable with mv_status() --- CDi.sdc | 11 +- CDi.sv | 2 +- README.md | 2 + doc/scratchpad/Notes.md | 10 + rtl/cditop.sv | 3 +- rtl/mcd212.sv | 2 +- rtl/mpeg/fma/mpeg_audio.sv | 5 + rtl/mpeg/fmv/firmware.mem | 3296 ++++++++++++++++++----------------- rtl/mpeg/fmv/mpeg_video.sv | 43 +- rtl/mpeg/util.svh | 3 +- rtl/vmpeg.sv | 56 +- sim2/sim_top.cpp | 13 +- sim2/testroms/vmpegtest.asm | 6 +- sw/mpeg_video/hwreg.h | 3 + sw/mpeg_video/main.c | 6 + sw/mpeg_video/pl_mpeg.h | 34 +- 16 files changed, 1825 insertions(+), 1670 deletions(-) diff --git a/CDi.sdc b/CDi.sdc index bc1ffc1..ba2f05a 100644 --- a/CDi.sdc +++ b/CDi.sdc @@ -34,4 +34,13 @@ set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|latched_window_offs set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|latched_window_offset_x*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|frameplayer:frameplayer|window_x_clkddr*} # protection not required because of context -set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|fmv_slow_motion*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|slow_motion_clkddr*} \ No newline at end of file +set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|fmv_slow_motion*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|slow_motion_clkddr*} + +# protected by latency between latch_frame_for_display and latch_frame_for_display_clk_mpeg +set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|yuv_frame_adr_fifo:readyframes|*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|display_timecode*} +set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|yuv_frame_adr_fifo:readyframes|*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|display_tempref*} +set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|yuv_frame_adr_fifo:readyframes|*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|display_width*} +set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|yuv_frame_adr_fifo:readyframes|*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|display_height*} +set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|yuv_frame_adr_fifo:readyframes|*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|first_intra_frame_of_gop_clk30} +set_false_path -from {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|yuv_frame_adr_fifo:readyframes|*} -to {emu:emu|cditop:cditop|vmpeg:vmpeg_inst|mpeg_video:video|first_intra_frame_of_seq_clk30} + diff --git a/CDi.sv b/CDi.sv index 65970c1..6a680f9 100644 --- a/CDi.sv +++ b/CDi.sv @@ -230,7 +230,7 @@ module emu ( "P2F1,ROM,Replace Boot ROM;", "P2O[2],Disable Audio Att.,No,Yes;", "P2O[3],UART Fake Space,No,Yes;", - "P2O[7:6],Force Video Plane,Original,A,B;", + "P2O[7:6],Force Video Plane,Original,A,B,DVC;", "P2O[12],SERVO Audio CD,No,Yes;", "P2O[17],Disable VCD pixel clock,No,Yes;", "P2O[18],Activate VCD filter,Yes,No;", diff --git a/README.md b/README.md index 5725d7a..6f829a0 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,8 @@ by emulation errors but are also present on the real machine. * During the intro of "The Ultimate Noah's Ark", the Mike Wilks artwork has repeated pixels on the bottom and right edge. * This looks wrong but real hardware does that too. * There is also a weirdly wrong column of pixels during the title page on the left inside the black frame +* "Marlboro – Follow Your Dreams" is not booting and hangs on a cyan screen + * You are probably using NTSC mode. Being made by a German publisher, this title was probably only tested on European models. It behaves like this on real hardware as well ## Simulation diff --git a/doc/scratchpad/Notes.md b/doc/scratchpad/Notes.md index 75c107b..ce11458 100644 --- a/doc/scratchpad/Notes.md +++ b/doc/scratchpad/Notes.md @@ -223,3 +223,13 @@ cat log | grep 'FMV INT\|XFER\|DVC Read e04062\|PIC2\|GOP' > log2 1 Overclock input device No, Yes (it is rather long. It could be shorter?) + + +Lost Ride: + +Syscall @ ded9b2 8e I$SetStt 00000006 00000122 00000002 00000900 0000ab00 00001999 0000bca0 00000000 00df9340 00000000 00d0d1d8 00dffd90 00d0bc98 00d0bb26 00d08000 00dfd428 SetStt MA_Loop +Syscall @ deda82 8e I$SetStt 00000006 00000124 00000002 00000000 0000bd00 00000000 0000ffff 00000000 00df9340 00040e20 00d0d1d8 00dffd90 00d03b56 00d0bb26 00d08000 00dfd428 SetStt MA_Play +FMA Write Stream Number 1804 0000 +FMA IER 180e 013d +FMA CMD 1800 0002 +Syscall @ ded8c6 8e I$SetStt 00000006 00000120 00000002 00800080 f5020000 00000000 0000bca0 00000000 00df9340 00000000 00d0d1d8 00dffd90 00d0bc98 00d0bb26 00d08000 00dfd428 SetStt MA_Cntrl diff --git a/rtl/cditop.sv b/rtl/cditop.sv index b8c464a..3ce0845 100644 --- a/rtl/cditop.sv +++ b/rtl/cditop.sv @@ -385,7 +385,8 @@ module cditop ( .ddrif ); - assign vidout = mcd212_vsd ? fmv_video_out : mcd212_video_out; + wire force_dvc_video = debug_force_video_plane == 2'b11; + assign vidout = (mcd212_vsd || force_dvc_video) ? fmv_video_out : mcd212_video_out; `ifndef DISABLE_MAIN_CPU wire reset68k; diff --git a/rtl/mcd212.sv b/rtl/mcd212.sv index 565bcd9..0dbb70b 100644 --- a/rtl/mcd212.sv +++ b/rtl/mcd212.sv @@ -1353,7 +1353,7 @@ module mcd212 ( vsd = backdrop_pixel && image_coding_method_register.ev; `ifdef VERILATOR - // vsd = 1; + //vsd = 1; `endif end diff --git a/rtl/mpeg/fma/mpeg_audio.sv b/rtl/mpeg/fma/mpeg_audio.sv index cefb4e9..a1bc456 100644 --- a/rtl/mpeg/fma/mpeg_audio.sv +++ b/rtl/mpeg/fma/mpeg_audio.sv @@ -55,6 +55,11 @@ module mpeg_audio ( event_frame_decoded <= 0; event_underflow <= 0; + if (fifo_full) begin + $display("AUDIO FIFO FULL"); + $finish(); + end + if (reset || reset_input_fifo) begin mpeg_stream_fifo_write_adr <= 0; mpeg_stream_bit_index <= 0; diff --git a/rtl/mpeg/fmv/firmware.mem b/rtl/mpeg/fmv/firmware.mem index 3873a87..b7a4b2d 100644 --- a/rtl/mpeg/fmv/firmware.mem +++ b/rtl/mpeg/fmv/firmware.mem @@ -1,16 +1,16 @@ 00003117 -c7010113 +dc010113 00003517 -86450513 +99c50513 00003597 -9af58593 +afb58593 00b50763 00052023 4de30511 10effeb5 -a0010e30 +a0012010 a703678d -11019b47 +1101afc7 c64ec84a cc22ce06 89aaca26 @@ -29,11 +29,11 @@ cb15892e 00230731 640d00d7 05134485 -46519884 -aa234581 -10ef9a97 -05133430 -40f29884 +4651ad04 +ae234581 +10efae97 +051347b0 +40f2ad04 20234462 22230125 26230125 @@ -71,1246 +71,122 @@ fcf513e3 0067ae23 27378082 431c1000 -05934354 -078e43f0 -36378f95 -ed631000 -565c00f5 -561cc781 -28078263 -4354431c +45e14354 8f95078e -fef5f7e3 -10002737 -4354431c -078e45ad -36378f95 -ed631000 -565c00f5 -561cc781 -28078663 -4354431c -8f95078e -fef5f7e3 -100027b7 -c7984731 -0087a883 -10002737 -4354431c -078e45ad -36378f95 -ed631000 -565c00f5 -561cc781 -22078063 -4354431c -8f95078e -fef5f7e3 -100027b7 -c7984731 -5363479c -51632110 -680d20f0 -9c080813 -00882703 -cc221101 -4405ce06 -01171763 -00c82703 -34338f1d -242300e0 -26230118 -273700f8 -431c1000 -458d4354 -8f95078e -10003637 -00f5ec63 -c399565c -cf81561c -4354431c -8f95078e -fef5f8e3 -100027b7 -c7984711 -2223479c -273700f8 -431c1000 -458d4354 -8f95078e -10003637 -00f5ec63 -c399565c -cf81561c -4354431c -8f95078e -fef5f8e3 -100027b7 -c7984711 -2023479c -26b700f8 -429c1000 -45f542d8 -8f99078e 00f5ee63 10003637 c399565c -cb99561c +cfe9561c +4354431c +8f95078e +fef5f8e3 +100026b7 42d8429c -8f99078e -fef5f8e3 -27b70779 +9d63078e +363700e7 +565c1000 +561cc399 +429ccb91 +078e42d8 +fee789e3 +27b70705 c3d81000 -273788aa -431c1000 -36374354 -078e1000 -00d79c63 -c781565c -8f63561c -431c1007 -078e4354 -fed788e3 -10002737 -c71c4785 -8363471c -65091007 -7a050513 -04050e13 -3637459d -4ea11000 -00054303 -4354431c -8f95078e -10f5e663 -dbed565c -f7fd561c -07b34681 -86230068 -050502d7 -fcae1ee3 10002737 4354431c -10003637 -9b63078e -565c00d7 +078e45a9 +36378f95 +ec631000 +565c00f5 561cc399 -431cc3f5 +431cc7c1 078e4354 -fed789e3 +f8e38f95 +27b7fef5 +472d1000 +a803c798 +08320087 +100026b7 +42d8429c +1d63078e +363700f7 +565c1000 +561cc399 +429ccb91 +078e42d8 +fee789e3 +27b70705 +c3d81000 10002737 -c71c4785 -c7f9471c -05136509 -0e137a05 -459d0405 -10003637 -43034ea1 -431c0005 +4354431c +078e45ad +36378f95 +ec631000 +565c00f5 +561cc399 +431ccf91 078e4354 -ed638f95 -565c08f5 -561cdbed -4681f7fd -006807b3 -06d78623 -1ee30505 -2f83fcae -2f030088 -233700c8 -85131000 -059300ff -571300ff -d7934045 -0eb34045 -994102f7 -161399c1 -96930037 -4e050037 -00e82823 -00a82e23 -00f82a23 -02b82023 -01d82c23 -02c82223 -02d82423 -01c32823 -40f2e035 -45054462 -80826105 +f8e38f95 +27b7fef5 +47311000 +479cc798 +00f86833 +01052a23 80824501 -650d6589 -76058593 -9ec50513 -04000613 -10efc646 -678d0cf0 -881348b2 -bf299c07 -01d72423 -b7bd4714 -01d72423 -bdf54714 -b3794881 -650d6589 -72058593 -a2c50513 -04000613 -10efc646 -678d09b0 -881348b2 -bf819c07 -02d60733 -0ac82303 -010002b7 -07f8a823 -0868a023 -07e8aa23 -06a8ac23 -06b8ae23 -08c8a223 -08d8a423 -02b50eb3 -00171793 -08c8a823 -08d8aa23 -873397f6 -0e3340e7 -ac2300e3 -0e3309c8 -937600f3 -0868a623 -00fe0333 -00536463 -4e01833e -01de02b3 -0bc8ac23 -a2239e3a -a8230c58 -a4230dc8 -a6230bf8 -a8230be8 -aa230aa8 -ae230ab8 -a0230ac8 -a4230cd8 -a6230cc8 -0e330cd8 -02b700f3 -64630100 -8e3e005e -97f24301 -010002b7 -0057b7b3 -446240f2 -40f007b3 -971a9e9a -00fe7e33 -0ea8a423 -0fd8ae23 -10e8a423 -0ff8a023 -0fe8a223 -0eb8a623 -0e68a823 -0ec8aa23 -0ed8ac23 -10c8a023 -10d8a223 -0bc82623 -61054505 -11018082 -648dca26 -c84acc22 -892ac64e -841389ae -851386c4 -061386c4 -458111c0 -10efce06 -24236a20 -22230734 -27b70724 -4b981000 -43d8c725 -57fd4390 -1671830d -7563c41c -278304c7 -458500c9 -0b300513 -a02997ba -07850705 -02c77a63 -0007c683 -c683faf5 -f6fd0017 -0027c683 -feb694e3 -0037c683 -fea690e3 -00470793 -078ec408 +bf494801 10002737 -8513c35c -3e4186c4 -852240f2 -44d24462 -49b24942 -80826105 -06442903 -3611854a -f4d50793 -00150713 -fb6dc391 -57fdc408 -fcf50ce3 -86c48513 -b7f93eb9 -63094e05 -00be1eb3 -1e830313 -27374881 -35371000 -88461000 4354431c -9a63078e -555c02d7 -551cdbf5 -080afbe5 -1883981a -42e30008 -1683ff10 -c2910028 -8533e59d -979300c6 -4063004e -0e960af5 -41d50533 -24238082 -280301c7 -98460087 -981a080a -00081883 -fb1049e3 -7179b7f9 -2737d606 +43f00593 +8f95078e +10003637 +00f5ed63 +c781565c +8563561c +431c2807 +078e4354 +f7e38f95 +2737fef5 431c1000 -38374348 -078e1000 -fe638f89 -278300b7 -c78102c8 -02882783 -431ccbc1 -078e4348 -e6e38f89 -27b7feb7 -c78c1000 -85364798 -cc2ece32 -c876ca3a -10efc636 -45e25460 -46b24752 -fff50793 -00b797b3 -46724ec2 -c96397ba -86930206 -85330017 -979300c6 -4963004e -0e9602f5 -41d50533 -614550b2 -07b38082 -079241d0 -00f55563 -95760e96 -80828082 -fff7c693 -00c68533 -004e9793 -fcf55be3 -41d007b3 -59e30792 -50b2fcf5 -95760e96 -80826145 -b7514701 -11014d1c +45ad4354 +8f95078e +10003637 +00f5ed63 +c781565c +8963561c +431c2807 +078e4354 +f7e38f95 +27b7fef5 +47311000 +a883c798 +27370087 +431c1000 +45ad4354 +8f95078e +10003637 +00f5ed63 +c781565c +8363561c +431c2207 +078e4354 +f7e38f95 +27b7fef5 +47311000 +479cc798 +21105663 +20f05463 +0813680d +2703b0c8 +11010088 ce06cc22 -e3a1842a -47894558 -00f70863 -eb99545c -446240f2 -80826105 -2023545c -22230205 -d7fd0205 -5850580c -c62e8522 -5c103575 -d84845b2 -354d8522 -dc0840f2 -61054462 -4d4c8082 -c62e5110 -50503d41 -d00845b2 -35598522 -bf5dd048 -8893688d -ae839c08 -2e030108 -a8830485 -8eb30148 -2f0303d7 -529304c5 -df934017 -03334016 -853302fe -08b30317 -0e330053 -8d1d03de -9e7a0505 -03d888b3 -02ff0f33 -03d50533 -98fe98fa -0e338346 -8d1d02fe -01c8f363 -67638372 -6f8d0865 -9b8fa303 -0f136f0d -030a99cf -006f0533 -00052283 -0513650d -951a8605 -93134108 -93160032 -8a850316 -951a8b05 -11c54303 -fe031ee3 -9b8fa303 -01052823 -1813d11c -07b30023 -439c010f -c514c558 -2e23c10c -2c230115 -c15001c5 -01d52a23 -47710785 -02e78563 -0713670d -933a9bc7 -00034703 -20239f42 -079300ff -00230017 -0ea300f3 -478910f5 -10f50e23 -47818082 -495cbfe1 -cc221101 -5114ce06 -842a5158 -0686c399 -444c0706 -2603478d -92630804 -541c0ef5 -03442303 -03842883 -0306c399 -4c1c0886 -2583e3a5 -07b70f04 -47651000 -869adb98 -48018746 -852247c1 -c01ac246 -430235e1 -26034892 -258308c4 -56930fc4 -d71301f3 -969a01f8 -86859746 -85228705 -47a14801 -c03ac236 -26033545 -25830984 -47021084 -85224692 -44624801 -47a140f2 -b5596105 -0b842583 -c41ac646 -10000e37 -282347dd -480102fe -852247c1 -c036c23a -468235a5 -26034712 -d79308c4 -258301f6 -96be0c44 -01f75793 -8685973e -85228705 -47a14801 -c03ac236 -47023581 -09842603 -0d042583 -47a14692 -48018522 -545c3535 -48b24322 -10000737 -40f2ebb1 -61054462 -25838082 -07b70b84 -45691000 -4801db88 -852247c1 -c036c23a -46823501 -26034712 -d79308c4 -258301f6 -96be0c44 -01f75793 -8685973e -85228705 -47a14801 -c03ac236 -26033be1 -25830984 -bf250d04 -08042603 -0f042583 -db1c47e1 -8746869a -47c14805 -c2468522 -3b4dc01a -48924302 -08c42603 -0fc42583 -01f35693 -01f8d713 -9746969a -87058685 -48058522 -c23647a1 -3369c03a -09842603 -10842583 -46924702 -48058522 -7179b5ed -ca5acc56 -07b7c662 -47211000 -d426d622 -d04ed24a -c85ece52 -db986b0d -9b8b2703 -8a936a8d -070a99ca -00ea87b3 -678d4394 -86078793 -a30397ba -97930007 -97b60036 -8c2e0796 -4783933e -fff511c3 -00032023 -00032223 -00032423 -00032623 -00032823 -00032a23 -00032c23 -00032e23 -02032023 -02032223 -02032423 -02032623 -02032823 -02032a23 -02032c23 -02032e23 -04032023 -04032223 -04032423 -04032623 -04032823 -04032a23 -04032c23 -04032e23 -06032023 -06032223 -06032423 -06032623 -06032823 -06032a23 -06032c23 -06032e23 -08032023 -100007b7 -08032223 -08032423 -08032623 -08032823 -08032a23 -08032c23 -08032e23 -0a032023 -0a032223 -0a032423 -0a032623 -0a032823 -0a032a23 -0a032c23 -0a032e23 -0c032023 -0c032223 -0c032423 -0c032623 -0c032823 -0c032a23 -0c032c23 -0c032e23 -0e032023 -0e032223 -0e032423 -0e032623 -0e032823 -0e032a23 -0e032c23 -0e032e23 -db984745 -05452e03 -2e0e1b63 -8593658d -03b7a2c5 -83931000 -4a510303 -6bc16e89 -64096489 -dcce8e93 -84931bfd -04137a04 -27376e04 -49bd1000 -10003637 -09134f85 -42950200 -a0234f1d -431c0143 -078e4354 -e9638f95 -488120f9 -431c8846 -078e4354 -0ef69963 -dbf5565c -fbe5561c -9876080a -00081883 -ff1042e3 -00285803 -0123a023 -fff80793 -0263e3fd -431c0e0e -078e4354 -10f69f63 -dbf5565c -fbe5561c -8693668d -4ed09c06 -0737453c -45991000 -458ddb0c -02f607b3 -ce634578 -97ba3385 -001c7713 -070e0792 -002c7c13 -08052583 -056397ba -1713000c -97ba0036 -9b8b2703 -05452883 -15134871 -86b30027 -429400aa -10f32623 -11132023 -11c32223 -10632423 -10032c23 -10b32823 -10c32a23 -00168793 -2d078a63 -8693668d -97369bc6 -00074683 -a0239aaa -879300fa -00230016 -0ea300f7 -478510f3 -10f30e23 -100007b7 -db984731 -54a25432 -59825912 -4ae24a72 -4bc24b52 -61454c32 -24238082 -280301f7 -98460087 -9876080a -00081883 -ef104ae3 -1763bf01 -431c0578 -078e4354 -e3638f95 -565c12f2 -561cdbed -431cf7fd -078e4354 -6a638f95 -565c0eff -561cdbed -431cf7fd -078e4354 -66638f95 -565c10ff -561cdbed -4801f7fd -2423a025 -471c01f7 -ee0784e3 -00885893 -0ff87813 -4354431c -9463078e -565c0af6 -5614dbf5 -9e46fae5 -03f00793 -f7c7e2e3 -05452883 -86b347fd -a02301c4 -c68300f3 -17930006 -0e050018 -00089a63 -fff7c813 -41f85813 -00287813 -97c2187d -03c52883 -00d58833 -00084803 -031787b3 -030787b3 -f8138791 -15630017 -50630008 -17fd08f0 -7ff00813 -00f84863 -0793883e -53638000 -883e00f8 -00d407b3 -0007c883 -00269793 -86b3979a -c3940308 -0143a023 -4354431c -8f95078e -def9fbe3 -00072623 -00c75803 -2423bd01 -471c01f7 -dfb99e46 -41000833 -47a1bfa1 -2803c71c -08e30087 -0793f008 -03630800 -d1e302f8 -0813f507 -bf2df008 -c71c4799 -9e3e471c -0785bdf9 -47a1b771 -2803c71c -b70d0087 -4354431c -078e489d -38378f95 -26b71000 -e3631000 -c46602f8 -02c82783 -2783c789 -81630288 -429c1007 -0046ac83 -87b3078e -f3e34197 -4ca2fef8 -100027b7 -c79446a1 -0087a803 -f0080813 -478dbde1 -40638762 -678908fc -00271693 -14c78793 -0e33070a -97b600e5 -ff47ae83 -04ce2883 -27374801 -36371000 -4f051000 -431c85c2 -078e4354 -02d79b63 -dbf5565c -fbe5561c -00259793 -980397f6 -41e30007 -9703ff00 -4a630027 -262302e0 -658d051e -202308a2 -85930113 -4e059ec5 -2423b16d -470c01e7 -979395c2 -97f60025 -00079803 -fb0048e3 -873eb7f9 -26b7b749 -429c1000 -363742cc -078e1000 -fc638f8d -565c00e7 -561cc399 -429cc3b1 -078e42cc -e8e38f8d -27b7fee7 -c7981000 -0693479c -d6b3fff7 -8a8540d7 -98bec2b9 -051e2623 -08a2658d -01132023 -9ec58593 -b9354e05 -08134ca2 -bbddf000 -b33d4781 -56fd4785 -00e69733 -98be8fd9 -4611bfd1 -00cc0b63 -08c52583 -070e078a -97ba52d0 -0785b9d1 -2583bff9 -b7fd0985 -cc221101 -100007b7 -ce064739 -c84aca26 -670ddb98 -9b872783 -842a4689 -d3630785 -478100f6 -9af72c23 -10002737 -4350431c -078e46b1 -ea638f91 -68092ef6 -5a080813 -36374501 -48851000 -431c85aa -078e4354 -24f69663 -dbf5565c -fbe5561c -00259793 -950397c2 -41e30007 -9483fea0 -07930027 -97630220 -680904f4 -08138e26 -27375a08 -43311000 -36374885 -431c1000 -078e4354 -61638f95 -450122f3 -431c85aa -078e4354 -1ef69363 -dbf5565c -fbe5561c -95c2058a -00059503 -fea042e3 -00259483 -fdc487e3 -02300793 -04f49b63 -8e266809 -5a080813 -27374481 -43311000 -36374885 -84931000 -431c0214 -078e4354 -6b638f95 -45011cf3 -431c85aa -078e4354 -16d79c63 -dbf5565c -fbe5561c -95c2058a -00059503 -fea042e3 -00259783 -fdc785e3 -407c94be -07374034 -46411000 -690ddb10 -00f48733 -12068663 -04042023 -9c090913 -01092783 -46b3c078 -673302f7 -c43402f7 -5d63c478 -278310f7 -d9630149 -445810f6 -87936789 -070a4f07 -a80397ba -45010007 -10002737 -10003637 -85aa4885 -4354431c -9c63078e -565c18f6 -561cdbf5 -9793fbe5 -97c20025 -00079503 -fea041e3 -00279783 -0017f713 -0087f613 -0047f693 -c878c83c -d454cc10 -9e638bc1 -00631a07 -483c1807 -02042023 -02042a23 -02042223 -02042c23 -85638b89 -68091807 -2f880813 -27374501 -36371000 -48851000 -431c85aa -078e4354 -1cf69363 -dbf5565c -fbe5561c -00259793 -950397c2 -41e30007 -9903fea0 -77930027 -84ca0209 -1a079663 -01097913 -14091663 -0084f793 -4589c789 -f0ef8522 -f79387df -c7890044 -8522458d -86fff0ef -0024f793 -4591c789 -f0ef8522 -8885861f -8522c085 -40f24462 -494244d2 -61054595 -84bff06f -9c090913 -01892683 -06d74663 -446240f2 -494244d2 -80826105 -01172423 -95aa470c -95c2058a -00059503 -e6a048e3 -2423b571 -470c0117 -058a95aa -950395c2 -41e30005 -bd39e0a0 -01172423 -95aa470c -00259793 -950397c2 -4de30007 -bb65d8a0 -01172623 -88e34744 -b509ddc4 -01172623 -8ce3475c -b5b9e1c7 -5f634705 -44540297 -08000713 -cc38c64e -d038cc78 -81634709 -49850ce6 -01092703 -c07c0785 -02e7c6b3 -14fd8522 -02e7e7b3 -c47cc434 -dfeff0ef -91e3407c -49b2ff34 -00178713 -2423b525 -470c0117 -979395aa -97c20025 -00079503 -e4a047e3 -4785b5b5 -4744c75c -0793bb3d -cc3c0800 -d03ccc7c -f0ef8522 -8522c76f -dbaff0ef -8b89483c -e80791e3 -db89487c -85224581 -f46ff0ef -03f00493 -85224585 -f3aff0ef -2737bd45 -431c1000 -46914350 -8f91078e -10003637 -00f6ec63 -c399565c -cf81561c -434c431c -8f8d078e -fef6f8e3 -100027b7 -c7984715 -4878479c -bd01dc5c -02042023 -02042223 -2423bf2d -470c0117 -bd3d95aa -85224581 -ee2ff0ef -1101bd81 -698dc64e -9c098993 -0109a703 -fff58793 -87b3c452 -ce0602e7 -ca26cc22 -4705c84a -0713c138 -8a2a0800 -02052023 -2a2317fd -22230205 -2c230205 -cd380205 -cd78c17c -2737d138 -431c1000 -45914354 -8f95078e -10003637 -00f5ec63 -c399565c -cf81561c -4354431c -8f95078e -fef5f8e3 -100027b7 -c7984715 -2e23479c -273702fa -36b71000 -45051000 -431c459d -078e4350 -04c79663 -dbf556dc -fbe5569c -10002437 -34b74959 -85521000 -a7833e61 -27030189 -17fd044a -00f75c63 -4058401c -8f99078e -04f96463 -dbed54dc -f7fd549c -446240f2 -494244d2 -4a2249b2 -80826105 -471cc708 -431cdfd5 -078e4350 -ec638f91 -56dc00f5 -569cdbed -431cdbd9 -078e4350 -f8e38f91 -0621fef5 -b751c350 -4058401c -8f99078e -02f96363 -dbed54dc -f7fd549c -10002737 -40f2435c -17a54462 -44d2c35c -49b24942 -61054a22 -27b78082 -475d1000 -43d8c798 -17254794 -f2a5c3d8 -07b7b751 -470d1000 -2737db98 -431c1000 -45a54354 -8f95078e -10003637 -00f5ec63 -c399565c -cf81561c -4354431c -8f95078e -fef5f8e3 -100027b7 -c7984729 -c91c479c +17634405 +27030117 +8f1d00c8 +00e03433 +01182423 +00f82623 10002737 4354431c -078e4589 +078e458d 36378f95 ec631000 565c00f5 @@ -1319,176 +195,1336 @@ ec631000 078e4354 f8e38f95 27b7fef5 -470d1000 +47111000 479cc798 -26b7c55c -429c1000 -45bd42d8 -8f99078e -00f5ee63 -10003637 -c399565c -cb99561c +00f82223 +10002737 +4354431c +078e458d +36378f95 +ec631000 +565c00f5 +561cc399 +431ccf81 +078e4354 +f8e38f95 +27b7fef5 +47111000 +479cc798 +00f82023 +100026b7 42d8429c -8f99078e -fef5f8e3 -27b70741 -c3d81000 -47894554 -fff68713 -30e7e163 -100007b7 -db984711 -ffe68793 -7c634705 -07b71cf7 -47151000 -478ddb98 -24f68263 -ce86711d -caa6cca2 -c6cec8ca -0793c4d2 -00380a45 -0d450613 -0007a303 -0047a883 -0087a803 -202347cc -22230067 -24230117 -c74c0107 -074107c1 -fec790e3 -43dc4390 -c31016fd -4785c35c -f263842a -506826d7 -b4ffe0ef -0793c408 -0513f4b5 -dbe5f4e5 -648dd57d -9c048493 -549450cc -4cd0509c -02d58533 -0ac4a703 -dc7cdc30 -08b42223 -08b42823 -08d42423 -08d42a23 -0084a303 -00c4a883 -02f60633 -00151793 -01000837 -08e42023 -06642823 -07142a23 -10000937 -0ae00993 -03090913 -97b24a1d -00f705b3 -00f586b3 -0106b6b3 -97ba8f89 -40d006b3 -2c239732 -262308f4 -8df508e4 -0ab4a623 -4818445c -2e23440c -202308f4 -87930ae4 -fc63fff5 -a8b900f9 -e0ef5068 -c408aa5f -fff50793 -e76385aa -202304f9 -85220149 -4c9c39d9 -17fd4078 -fef740e3 -100037b7 -cf984705 -17fd445c -04f77363 -446640f6 -494644d6 -4a2649b6 -80826125 -07854898 -c6b3c07c -852202e7 -02e7e7b3 -c47cc434 -9d2ff0ef -407c4c98 -c1e3177d -37b7fee7 -47051000 -445ccf98 -61e317fd -0793fcf7 -071306c4 -06930dc4 -479009c4 -43cc4388 -c308c710 -47d0c34c -074107c1 -fec72e23 -fed795e3 -04134390 -003406c4 -43dcc310 -c35c1830 -42cc4288 -46dc4698 -c04cc008 -c45cc418 -044106c1 -fec696e3 -42dc4298 -c05cc018 -2737b7a5 +078e45f5 +ee638f99 +363700f5 +565c1000 +561cc399 +429ccb99 +078e42d8 +f8e38f99 +0779fef5 +100027b7 +88aac3d8 +10002737 +4354431c +10003637 +9c63078e +565c00d7 +561cc781 +12078263 +4354431c +88e3078e +2737fed7 +47851000 +471cc71c +10078663 +0513650d +0e138d85 +459d0405 +10003637 +43034ea1 +431c0005 +078e4354 +e9638f95 +565c10f5 +561cdbed +4681f7fd +006807b3 +02d78623 +1ee30505 +2737fcae 431c1000 36374354 078e1000 -00f69b63 +00d79b63 c399565c -cb99561c +c7ed561c 4354431c 89e3078e -27b7fed7 -47051000 +2737fed7 +47851000 +471cc71c +650dcbf1 +8d850513 +04050e13 +3637459d +4ea11000 +00054303 +4354431c +8f95078e +0af5e063 +dbed565c +f7fd561c +07b34681 +86230068 +050506d7 +fcae1ee3 +00882f83 +00c82f03 +10002337 +00ff8513 +00ff0593 +40455713 +4045d793 +02f70eb3 +99c19941 +00371613 +00379693 +28234e05 +2e2300e8 +2a2300a8 +202300f8 +2c2302b8 +222301d8 +242302c8 +282302d8 +e42d01c3 +446240f2 +678d4505 +b0a7a023 +80826105 +80824501 +650d658d +89858593 +b3850513 +04000613 +10efc646 +678d1030 +881348b2 +bf11b0c7 +01d72423 +b7a54714 +01d72423 +bddd4714 +b3614881 +650d658d +85858593 +b7850513 +04000613 +10efc646 +678d0cf0 +881348b2 +b7a9b0c7 +02d60733 +0ac82303 +010002b7 +07f8aa23 +0868a223 +07e8ac23 +06a8ae23 +08b8a023 +08c8a423 +08d8a623 +02b50eb3 +00171793 +08c8aa23 +08d8ac23 +873397f6 +0e3340e7 +ae2300e3 +0e3309c8 +937600f3 +0868a823 +00fe0333 +00536463 +4e01833e +01de02b3 +0dc8a023 +a6239e3a +ac230c58 +a8230dc8 +aa230bf8 +ac230be8 +ae230aa8 +a2230ab8 +a4230cc8 +a8230cd8 +aa230cc8 +0e330cd8 +02b700f3 +64630100 +8e3e005e +97f24301 +010002b7 +0057b7b3 +40f007b3 +971a9e9a +00fe7e33 +11d8a423 +10e8aa23 +0ff8a623 +0fe8a823 +0ea8aa23 +0eb8ac23 +0e68ae23 +10c8a023 +10d8a223 +10c8a623 +10d8a823 +0bc82623 +446240f2 +678d4505 +b0a7a023 +80826105 +ca261101 +cc22648d +c64ec84a +89ae892a +9a448413 +9a448513 +12c00613 +ce064581 +6d0010ef +07342623 +07242423 +100027b7 +c7254b98 +439043d8 +830d57fd +c41c1671 +04c77563 +00c92783 +05134585 +97ba0b30 +0705a029 +7a630785 +c68302c7 +faf50007 +0017c683 +c683f6fd +94e30027 +c683feb6 +90e30037 +0793fea6 +c4080047 +2737078e +c35c1000 +9a448513 +40f23651 +44628522 +494244d2 +610549b2 +29038082 +854a0684 +07933aed +0713f4d5 +c3910015 +c408fb6d +0ce357fd +8513fcf5 +3e899a44 +4e05b7f9 +1eb36309 +031300be +48813203 +10002737 +10003537 +431c8846 +078e4354 +02d79a63 +dbf5555c +fbe5551c +981a080a +00081883 +ff1042e3 +00281683 +e59dc291 +00c68533 +004e9793 +0af54063 +05330e96 +808241d5 +01c72423 +00872803 +080a9846 +1883981a +49e30008 +b7f9fb10 +d6067179 +10002737 +4348431c +10003837 +8f89078e +00b7fe63 +02c82783 +2783c781 +cbc10288 +4348431c +8f89078e +feb7e6e3 +100027b7 +4798c78c +ce328536 +ca3acc2e +c636c876 +574010ef +475245e2 +079346b2 +97b3fff5 +4ec200b7 +97ba4672 +0206c963 +00178693 +00c68533 +004e9793 +02f54963 +05330e96 +50b241d5 +80826145 +41d007b3 +55630792 +0e9600f5 +80829576 +c6938082 +8533fff7 +979300c6 +5be3004e +07b3fcf5 +079241d0 +fcf559e3 +0e9650b2 +61459576 +47018082 +4d5cb751 +cc221101 +842ace06 +4558e3a1 +08634789 +581c00f7 +40f2eb99 +61054462 +581c8082 +02052223 +02052423 +584cd7fd +85225c10 +3575c62e +45b25c50 +8522dc08 +40f2354d +4462dc48 +80826105 +5150510c +3d41c62e +45b25410 +8522d048 +d4083559 +688dbf5d +b0c88893 +0108ae83 +04c52e03 +0148a883 +03d78eb3 +05052f03 +40175293 +4016df93 +02fe0333 +03178533 +005308b3 +03de0e33 +05058d1d +88b39e7a +0f3303d8 +053302ff +98fa03d5 +834698fe +02fe0e33 +f3638d1d +837201c8 +08656763 +a3036f8d +6f0db04f +ae4f0f13 +0533030a +2283006f +650d0005 +99850513 +4108951a +00329313 +03169316 +8b058a85 +4303951a +1ee311c5 +a303fe03 +2823b04f +d11c0105 +00231813 +010f07b3 +c558439c +c10cc514 +01152e23 +01c52c23 +2a23c150 +078501d5 +85634771 +670d02e7 +b0870713 +4703933a +9f420003 +00ff2023 +00170793 +00f30023 +10f50ea3 +0e234789 +808210f5 +bfe14781 +11014d1c +ce06cc22 +55185154 +c399842a +07060686 +478d444c +08442603 +0ef59263 +2303545c +28830384 +c39903c4 +08860306 +e3a54c5c +0fc42583 +100007b7 +db984765 +8746869a +47c14801 +c2468522 +35e1c01a +48924302 +09042603 +10842583 +01f35693 +01f8d713 +9746969a +87058685 +48018522 +c23647a1 +3545c03a +09c42603 +11442583 +46924702 +48018522 +40f24462 +610547a1 +2583b559 +c6460c04 +0e37c41a +47dd1000 +02fe2823 +47c14801 +c23a8522 +35a5c036 +47124682 +09042603 +01f6d793 +0cc42583 +579396be +973e01f7 +87058685 +48018522 +c23647a1 +3581c03a +26034702 +258309c4 +46920d84 +852247a1 +35354801 +4322581c +073748b2 +ebb11000 +446240f2 +80826105 +0c042583 +100007b7 +db884569 +47c14801 +c23a8522 +3501c036 +47124682 +09042603 +01f6d793 +0cc42583 +579396be +973e01f7 +87058685 +48018522 +c23647a1 +3be1c03a +09c42603 +0d842583 +2603bf25 +25830844 +47e10fc4 +869adb1c +48058746 +852247c1 +c01ac246 +43023b4d +26034892 +25830904 +56931084 +d71301f3 +969a01f8 +86859746 +85228705 +47a14805 +c03ac236 +26033369 +258309c4 +47021144 +85224692 +b5ed4805 +cc567179 +c662ca5a +100007b7 +d6224721 +d24ad426 +ce52d04e +6b0dc85e +2703db98 +6a8db04b +ae4a8a93 +87b3070a +439400ea +8793678d +97ba9987 +0007a303 +00369793 +079697b6 +933e8c2e +11c34783 +2023fff5 +22230003 +24230003 +26230003 +28230003 +2a230003 +2c230003 +2e230003 +20230003 +22230203 +24230203 +26230203 +28230203 +2a230203 +2c230203 +2e230203 +20230203 +22230403 +24230403 +26230403 +28230403 +2a230403 +2c230403 +2e230403 +20230403 +22230603 +24230603 +26230603 +28230603 +2a230603 +2c230603 +2e230603 +20230603 +07b70803 +22231000 +24230803 +26230803 +28230803 +2a230803 +2c230803 +2e230803 +20230803 +22230a03 +24230a03 +26230a03 +28230a03 +2a230a03 +2c230a03 +2e230a03 +20230a03 +22230c03 +24230c03 +26230c03 +28230c03 +2a230c03 +2c230c03 +2e230c03 +20230c03 +22230e03 +24230e03 +26230e03 +28230e03 +2a230e03 +2c230e03 +2e230e03 +47450e03 +2e03db98 +1b630585 +658d2e0e +b7858593 +100003b7 +03038393 +6e894a51 +648d6bc1 +8e93640d +1bfdf04e +8d848493 +81840413 +10002737 +363749bd +4f851000 +02000913 +4f1d4295 +0143a023 +4354431c +8f95078e +20f9e963 +88464881 +4354431c +9963078e +565c0ef6 +561cdbf5 +080afbe5 +18839876 +42e30008 +5803ff10 +a0230028 +07930123 +e3fdfff8 +0e0e0263 +4354431c +9f63078e +565c10f6 +561cdbf5 +668dfbe5 +b0c68693 +457c4ed0 +10000737 +db0c4599 +07b3458d +493802f6 +3385ce63 +771397ba +0792001c +7c13070e +2583002c +97ba0845 +000c0563 +00361713 +270397ba +2883b04b +48710585 +00271513 +00aa86b3 +26234294 +202310f3 +22231113 +242311c3 +2c231063 +28231003 +2a2310b3 +879310c3 +8a630016 +668d2d07 +b0868693 +46839736 +9aaa0007 +00faa023 +00168793 +00f70023 +10f30ea3 +0e234785 +07b710f3 +47311000 +5432db98 +591254a2 +4a725982 +4b524ae2 +4c324bc2 +80826145 +01f72423 +00872803 +080a9846 +18839876 +4ae30008 +bf01ef10 +05781763 +4354431c +8f95078e +12f2e363 +dbed565c +f7fd561c +4354431c +8f95078e +0eff6a63 +dbed565c +f7fd561c +4354431c +8f95078e +10ff6663 +dbed565c +f7fd561c +a0254801 +01f72423 +84e3471c +5893ee07 +78130088 +431c0ff8 +078e4354 +0af69463 +dbf5565c +fae55614 +07939e46 +e2e303f0 +2883f7c7 +47fd0585 +01c486b3 +00f3a023 +0006c683 +00181793 +9a630e05 +c8130008 +5813fff7 +781341f8 +187d0028 +288397c2 +88330405 +480300d5 +87b30008 +87b30317 +87910307 +0017f813 +00081563 +08f05063 +081317fd +48637ff0 +883e00f8 +80000793 +00f85363 +07b3883e +c88300d4 +97930007 +979a0026 +030886b3 +a023c394 +431c0143 +078e4354 +fbe38f95 +2623def9 +58030007 +bd0100c7 +01f72423 +9e46471c +0833dfb9 +bfa14100 +c71c47a1 +00872803 +f00808e3 +08000793 +02f80363 +f507d1e3 +f0080813 +4799bf2d +471cc71c +bdf99e3e +b7710785 +c71c47a1 +00872803 +431cb70d +489d4354 +8f95078e +10003837 +100026b7 +02f8e363 +2783c466 +c78902c8 +02882783 +10078163 +ac83429c +078e0046 +419787b3 +fef8f3e3 +27b74ca2 +46a11000 +a803c794 +08130087 +bde1f008 +8762478d +08fc4063 +16936789 +87930027 +070a2847 +00e50e33 +ae8397b6 +2883ff47 +4801050e +10002737 +10003637 +85c24f05 +4354431c +9b63078e +565c02d7 +561cdbf5 +9793fbe5 +97f60025 +00079803 +ff0041e3 +00279703 +02e04a63 +051e2823 +08a2658d +01132023 +b3858593 +b16d4e05 +01e72423 +95c2470c +00259793 +980397f6 +48e30007 +b7f9fb00 +b749873e +100026b7 +42cc429c +10003637 +8f8d078e +00e7fc63 +c399565c +c3b1561c +42cc429c +8f8d078e +fee7e8e3 +100027b7 479cc798 -2737c95c +fff70693 +40d7d6b3 +c2b98a85 +282398be +658d051e +202308a2 +85930113 +4e05b385 +4ca2b935 +f0000813 +4781bbdd +4785b33d +973356fd +8fd900e6 +bfd198be +0b634611 +258300cc +078a0905 +52d0070e +b9d197ba +bff90785 +09c52583 +1101b7fd +07b7cc22 +47391000 +ca26ce06 +db98c84a +2783670d +4689b047 +0785842a +00f6d363 +22234781 +2737b0f7 +431c1000 +46b14350 +8f91078e +2ef6ea63 +08136809 +45016d88 +10003637 +85aa4885 +4354431c +9663078e +565c24f6 +561cdbf5 +9793fbe5 +97c20025 +00079503 +fea041e3 +00279483 +02200793 +04f49763 +8e266809 +6d880813 +10002737 +48854331 +10003637 +4354431c +8f95078e +22f36163 +85aa4501 +4354431c +9363078e +565c1ef6 +561cdbf5 +058afbe5 +950395c2 +42e30005 +9483fea0 +87e30025 +0793fdc4 +9b630230 +680904f4 +08138e26 +44816d88 +10002737 +48854331 +10003637 +02148493 +4354431c +8f95078e +1cf36b63 +85aa4501 +4354431c +9c63078e +565c16d7 +561cdbf5 +058afbe5 +950395c2 +42e30005 +9783fea0 +85e30025 +94befdc7 +4074443c +10000737 +db104641 +8733690d +866300f4 +22231206 +09130404 +2783b0c9 +c4380109 +02f746b3 +02f76733 +c838c474 +10f75d63 +01492783 +10f6d963 +67894458 +62878793 +97ba070a +0007a803 +27374501 +36371000 +48851000 +431c85aa +078e4354 +18f69c63 +dbf5565c +fbe5561c +00259793 +950397c2 +41e30007 +9783fea0 +f7130027 +f6130017 +f6930087 +c87c0047 +cc50cc38 +8bc1d814 +1a079e63 +18070063 +2223487c +2c230204 +24230204 +2e230204 +8b890204 +18078563 +08136809 +45014308 +10002737 +10003637 +85aa4885 +4354431c +9363078e +565c1cf6 +561cdbf5 +9793fbe5 +97c20025 +00079503 +fea041e3 +00279903 +02097793 +966384ca +79131a07 +16630109 +f7931409 +c7890084 +85224589 +87dff0ef +0044f793 +458dc789 +f0ef8522 +f79386ff +c7890024 +85224591 +861ff0ef +c0858885 +44628522 +44d240f2 +45954942 +f06f6105 +091384bf +2683b0c9 +46630189 +40f206d7 +44d24462 +61054942 +24238082 +470c0117 +058a95aa +950395c2 +48e30005 +b571e6a0 +01172423 +95aa470c +95c2058a +00059503 +e0a041e3 +2423bd39 +470c0117 +979395aa +97c20025 +00079503 +d8a04de3 +2623bb65 +47440117 +ddc488e3 +2623b509 +475c0117 +e1c78ce3 +4705b5b9 +02975f63 +07134454 +c64e0800 +d038cc78 +4709d078 +0ce68163 +27034985 +07850109 +c6b3c43c +852202e7 +e7b314fd +c47402e7 +f0efc83c +443cdfef +ff3491e3 +871349b2 +b5250017 +01172423 +95aa470c +00259793 +950397c2 +47e30007 +b5b5e4a0 +c75c4785 +bb3d4744 +08000793 +d03ccc7c +8522d07c +c76ff0ef +f0ef8522 +487cdbaf +91e38b89 +4c3ce807 +4581db89 +f0ef8522 +0493f46f +458503f0 +f0ef8522 +bd45f3af +10002737 +4350431c +078e4691 +36378f91 +ec631000 +565c00f6 +561cc399 +431ccf81 +078e434c +f8e38f8d +27b7fef6 +47151000 +479cc798 +c03c4c38 +2223bd01 +24230204 +bf2d0204 +01172423 +95aa470c +4581bd3d +f0ef8522 +bd81ee2f +c64e1101 +8993698d +a703b0c9 +87930109 +c452fff5 +02e787b3 +cc22ce06 +c84aca26 +c1784705 +08000713 +22238a2a +17fd0205 +02052c23 +02052423 +02052e23 +c53ccd78 +d178d138 +10002737 +4354431c +078e4591 +36378f95 +ec631000 +565c00f5 +561cc399 +431ccf81 +078e4354 +f8e38f95 +27b7fef5 +47151000 +479cc798 +04fa2023 +10002737 +100036b7 +459d4505 +4350431c +9663078e +56dc04c7 +569cdbf5 +2437fbe5 +49591000 +100034b7 +3e618552 +0189a783 +048a2703 +5c6317fd +401c00f7 +078e4058 +64638f99 +54dc04f9 +549cdbed +40f2f7fd +44d24462 +49b24942 +61054a22 +c7088082 +dfd5471c +4350431c +8f91078e +00f5ec63 +dbed56dc +dbd9569c +4350431c +8f91078e +fef5f8e3 +c3500621 +401cb751 +078e4058 +63638f99 +54dc02f9 +549cdbed +2737f7fd +435c1000 +446240f2 +c35c17a5 +494244d2 +4a2249b2 +80826105 +100027b7 +c798475d +479443d8 +c3d81725 +b751f2a5 +100007b7 +db98470d +10002737 +4354431c +078e45a5 +36378f95 +ec631000 +565c00f5 +561cc399 +431ccf81 +078e4354 +f8e38f95 +27b7fef5 +47291000 +479cc798 +2737c91c 431c1000 45894354 8f95078e 10003637 00f5ec63 c399565c -c7f1561c +cf81561c 4354431c 8f95078e fef5f8e3 100027b7 c798470d -cbdd479c -455417fd -4715cd5c +c55c479c +100026b7 +42d8429c +078e45bd +ee638f99 +363700f5 +565c1000 +561cc399 +429ccb99 +078e42d8 +f8e38f99 +0741fef5 +100027b7 +4554c3d8 +87134789 +ef63fff6 +07b72ee7 +47111000 +8793db98 +4705ffe6 +1cf77c63 100007b7 -478ddb98 -dcf692e3 +db984715 +8263478d +711d24f6 +0ac50793 +c0dac2d6 +cca2ce86 +c8cacaa6 +c4d2c6ce +00588abe +0e850b13 +0007a303 +0047a883 +0087a803 +4b9047cc +00672023 +01172223 +01072423 +cb10c74c +075107d1 +fd679ee3 +478516fd +f163842a +542826d7 +a43fe0ef +0793c408 +0513f4b5 +dbe5f4e5 +648dd57d +b0c48493 +549450cc +4cd0509c +02d58533 +0ac4a703 +2023dc70 +242308f4 +2a2308b4 +262308b4 +2c2308d4 +a30308d4 +a8830084 +063300c4 +179302f6 +08370015 +22230100 +2a2308e4 +2c230664 +09370714 +09931000 +09130ae0 +4a1d0309 +05b397b2 +86b300f7 +b6b300f5 +8f890106 +06b397ba +973240d0 +2e238df5 +282308f4 +a62308e4 +445c0ab4 +48584814 +2023440c +22230af4 +24230ad4 +87930ae4 +fc63fff5 +a08d00f9 +e0ef5428 +c408991f +fff50793 +e96385aa +202304f9 +85220149 +4c9c31f1 +17fd4438 +fef740e3 +100037b7 +cf984705 +17fd445c +04f77563 +446640f6 +494644d6 +4a2649b6 +4b064a96 +80826125 +07854898 +c6b3c43c +852202e7 +02e7e7b3 +c83cc474 +9c4ff0ef +443c4c98 +c1e3177d +37b7fee7 +47051000 +445ccf98 +6fe317fd +87dafaf7 +07040713 +43084754 +4710434c +c3ccc388 +c7d4c790 +07514b14 +ae2307d1 +13e3fed7 +0413ff57 +005c0704 +43884b98 +479043cc +c81847d4 +c04cc008 +c454c410 +009807d1 +93e30451 +bf8dfee7 10002737 4354431c 10003637 @@ -1500,7 +1536,7 @@ dcf692e3 fed789e3 100027b7 c7984705 -d51c479c +cd1c479c 10002737 4354431c 078e4589 @@ -1508,77 +1544,112 @@ d51c479c ec631000 565c00f5 561cc399 -431ccba9 +431cc7e1 078e4354 f8e38f95 27b7fef5 470d1000 479cc798 -17fdcf9d -d91c4554 -0793bb91 -07130dc5 -06930a45 -479010c5 -43cc4388 -c308c710 -47d0c34c -074107c1 -fec72e23 -fed795e3 -c3144394 -c35c43dc -8082bb8d +17fdcbcd +d11c4554 +07b74715 +db981000 +92e3478d +2737dcf6 +431c1000 +36374354 +078e1000 +00f69b63 +c399565c +cb99561c +4354431c +89e3078e +27b7fed7 +47051000 +479cc798 +2737d55c +431c1000 +45894354 +8f95078e +10003637 +00f5ec63 +c399565c +c7b9561c +4354431c +8f95078e +fef5f8e3 +100027b7 +c798470d +cf8d479c +455417fd +bb91d95c +875687da +12450693 +a80347d0 +43c80007 +2023478c +c3480107 +c750c70c +07d14b90 +2e230751 +91e3fec7 +bba5fed7 80828082 -d2267179 -a783648d -d4229b04 -ce4ed04a -ca56cc52 -c65ec85a +71798082 +648dd226 +af84a783 +d04ad422 +cc52ce4e +c85aca56 +c462c65e 0a13d606 09370b30 842a1000 01452423 03090913 -5b7d4989 +0b134989 +5bfd0b80 10002ab7 -20234b8d +20234c0d cb910139 -a8234408 -ed099a04 +ac234408 +ed09ae04 010aa783 2023e78d -50680139 -86bfe0ef -a823c408 -d56d9a04 +54280139 +f5efe0ef +ac23c408 +d56dae04 03451963 -11442783 -8522efd1 -8c7fe0ef -9b04a783 +12442783 +8522e7dd +8b9fe0ef +af84a783 8522b7d9 -27833ed9 -e3b11184 -8c63445c -27830777 -c3b51144 -0a440513 -1ee3a81d -2783fb65 -c3bd1144 -11842783 -2737e3a5 +27833ed1 +ebb11284 +8563445c +27830987 +cbbd1244 +0ac40513 +1863a099 +85220165 +f8efe0ef +01392023 +16e3bf4d +2783fb75 +c7a51244 +12842783 +2737e3ad 431c1000 477d4354 8f95078e -04f76863 +04f76963 4705445c -636317fd -2a2304f7 -05131004 -405c0dc4 +646317fd +222304f7 +05131204 +405c0e84 07374014 463d1000 c114db10 @@ -1587,191 +1658,198 @@ c05c0785 59025492 4a6249f2 4b424ad2 -61454bb2 -47858082 -10f42a23 -9b04a783 -0513b789 -b7e106c4 -bfd94501 -100027b7 -10042a23 -0007a823 -a8234785 -05139af4 -b7750dc4 -c4a2715d -c6864785 -c0cac2a6 -dc52de4e -d85ada56 -d462d65e -d06ad266 -0437ce6e -d81c1000 -2bc005b7 -20000537 -ef8fe0ef -d81c47f5 -10002737 -3e700593 -10003637 -4354431c -8f95078e -00f5ec63 -dbed565c -d7fd561c -4354431c -8f95078e -fef5f8e3 -100007b7 -db984779 -e0ef4581 -6489b95f -3d9dc62a -7e048793 -6c8d6a8d -690d698d -8a93c43e -8c9399ca -89939bcc -09139c09 -6b0d8209 -648d6a0d -14050263 -10000d37 -030d0d13 -063745ed -4bf14000 -4c05440d -410006b7 -a7034d89 -2023000a -2c2300bd -17939a0b +4c224bb2 +80826145 +22234785 +a78312f4 +bf05af84 +07040513 +4501b7d9 +27b7bfd1 +22231000 +a8231204 +47850007 +aef4ac23 +0e840513 +715db76d +4785c4a2 +c2a6c686 +de4ec0ca +da56dc52 +d65ed85a +d266d462 +ce6ed06a +10000437 +05b7d81c +05372bc0 +e0ef2000 +47f5ddaf +2737d81c +05931000 +36373e70 +431c1000 +078e4354 +ec638f95 +565c00f5 +561cdbed +431cd7fd +078e4354 +f8e38f95 +07b7fef5 +47791000 +4581db98 +b81fe0ef +3585c42a +6b0d678d +698d6d0d +690d648d +0b13c63e +0d13ae4b +8993b08d +8493b0c9 +09139584 +6b8d9189 +6a0d6a8d +14050363 +10000db7 +030d8d93 +05b7486d +4c714000 +4c85440d +41000637 +27034689 +a023000b +a223010d +1793b00b +97ba0037 +97ae0796 +11c7c703 +a703ff75 +1f13b04b +0e330027 +2e0301eb +0e05000e +018e1363 +976a4e01 +00074e83 +20239f5a +8e1301cf +0023001e +8ea301c7 +8e2311c7 +c7031087 +0ee311c7 +2703fe87 +a223004b +1793b19b 97ba0037 97b20796 11c7c703 -2703ff75 -1e939b8b -83330027 -230301da -03050003 -01731363 -97664301 -00074e03 -a0239ed6 -0313006e +a703ff75 +1f13b04b +0e330027 +2e0301eb +0e05000e +018e1363 +976a4e01 +00074e83 +20239f5a +8e1301cf 0023001e -8ea30067 -8e231067 +8ea301c7 +8e2311c7 c7031087 0ee311c7 -a703fe87 -2c23004a -17939b8b +2703fe87 +0e37008b +a2234200 +1793b0db 97ba0037 -97b60796 +97f20796 11c7c703 -2703ff75 -1e939b8b -83330027 -230301da -03050003 -01731363 -97664301 -00074e03 -a0239ed6 -0313006e +a703ff75 +1f13b04b +0e330027 +2e0301eb +0e05000e +018e1363 +976a4e01 +00074e83 +20239f5a +8e1301cf 0023001e -8ea30067 -8e231067 -c7031087 -0ee311c7 -a703fe87 -0337008a -2c234200 -17939bbb -97ba0037 -979a0796 -11c7c703 -2703ff75 -1e939b8b -83330027 -230301da -03050003 -01731363 -97664301 -00074e03 -a0239ed6 -0313006e -0023001e -8ea30067 -8e231067 +8ea301c7 +8e2311c7 c7031087 0ee311c7 591cfe87 -017d2023 -03878763 -9aca2783 -4532e78d -06373b31 -06b74000 -45ed4100 -ec051fe3 -100037b7 -d3d84705 -33094532 -ea051ae3 -2623bfe5 -33379b8a -27831000 -47650283 -00f77663 -02832783 -fef76ee3 -01452f83 -02c52f03 -02052e83 -03452303 -10000e37 +018da023 +03978863 +af4aa783 +4522e795 +05b73309 +06374000 +46894100 +1ee3486d +37b7ec05 +47051000 +4522d3d8 +19e331dd +bfe5ea05 +af9aaa23 +10003e37 +028e2783 +76634765 +278300f7 +6ee3028e +2283fef7 +2f830145 +2f0302c5 +2e830205 +0e370345 +37371000 +28231000 +202300ae +22230057 +242301f7 +9d6301e7 +2823060e +5918ae0a +07970c63 +42814e01 +0009af03 10003737 -00ae2823 -01f72023 -01e72223 -01d72423 -06031b63 -9a04a423 -02635918 -43810787 -0009ae03 -37374822 -1e931000 -0f33002e -228301d8 -2f830045 -2f030085 -5f48000f -ae839eca -2023000e -28230277 -262303c7 -28230057 -2c2301f7 -2a230267 -071303e7 -07330015 -e66303d7 -678500fd -2ac78793 -37b7973e -cbd81000 -0587a023 -a423b73d -83e29b84 -a703bf71 -fb519a84 -0000b771 +05c72423 +002f1e13 +01c90fb3 +00452383 +02572023 +000faf83 +00852283 +28239e26 +2f0303e7 +5f480385 +000e2e03 +00772623 +00572823 +03d72c23 +05e72223 +03f72a23 +00150713 +03c70733 +00f6e663 +87936785 +973e2ac7 +100037b7 +a023cbd8 +b7050597 +af0a2703 +b761fb41 +28234732 +82e6af9a +b0072e03 +b0072023 +0000b741 41f55793 00a7c533 40f50533 @@ -2129,9 +2207,9 @@ ffff0000 1d010000 1c010000 1b010000 -000021a0 -00002158 -00002158 +000022d8 +00002290 +00002290 00000002 00000004 00000000 @@ -2363,9 +2441,9 @@ fff50000 002f0000 001f0000 00000000 -00002590 -00002558 -00002500 +000026c8 +00002690 +00002638 00000002 00000004 00000006 diff --git a/rtl/mpeg/fmv/mpeg_video.sv b/rtl/mpeg/fmv/mpeg_video.sv index 8e86013..c014329 100644 --- a/rtl/mpeg/fmv/mpeg_video.sv +++ b/rtl/mpeg/fmv/mpeg_video.sv @@ -37,12 +37,16 @@ module mpeg_video ( output event_buffer_underflow, output bit event_picture_starts_display, output event_last_picture_starts_display, - output bit event_first_intra_frame_starts_display, + output bit event_first_intra_frame_gop_starts_display, + output bit event_first_intra_frame_seq_starts_display, output [4:0] pictures_in_fifo, output bit [10:0] decoder_width, output bit [ 8:0] decoder_height, - output bit [ 7:0] decoder_tempref, + output bit [10:0] display_width, + output bit [ 8:0] display_height, + output bit [ 7:0] display_tempref, + output bit [31:0] display_timecode, output bit [15:0] decoder_frameperiod_90khz, output bit [ 7:0] decoder_frameperiod_rawhdr ); @@ -594,6 +598,12 @@ module mpeg_video ( if (dmem_cmd_payload_address_1[15:0] == 16'h3038) begin just_decoded.tempref <= dmem_cmd_payload_data_1[7:0]; end + if (dmem_cmd_payload_address_1[15:0] == 16'h3044) begin + just_decoded.timecode <= dmem_cmd_payload_data_1; + end + if (dmem_cmd_payload_address_1[15:0] == 16'h3048) begin + just_decoded.first_intra_frame_of_seq <= dmem_cmd_payload_data_1[0]; + end if (dmem_cmd_payload_address_1[15:0] == 16'h2010) begin has_sequence_header <= dmem_cmd_payload_data_1[0]; @@ -638,8 +648,8 @@ module mpeg_video ( bit [23:0] playback_frame_cnt; bit latch_frame_until_vblank = 0; - bit first_intra_frame_of_gop_in_prep; bit first_intra_frame_of_gop_clk30; + bit first_intra_frame_of_seq_clk30; bit vblank_q1; bit vblank_q2; @@ -658,14 +668,18 @@ module mpeg_video ( .flag_out_clk_b(just_decoded_commit_clk30) ); + always_ff @(posedge clk30) begin vblank_q1 <= vblank; vblank_q2 <= vblank_q1; if (latch_frame_for_display) begin - decoder_width <= for_display.width; - decoder_height <= for_display.height; - decoder_tempref <= for_display.tempref; + display_width <= for_display.width; + display_height <= for_display.height; + display_tempref <= for_display.tempref; + display_timecode <= for_display.timecode; + first_intra_frame_of_gop_clk30 <= for_display.first_intra_frame_of_gop; + first_intra_frame_of_seq_clk30 <= for_display.first_intra_frame_of_seq; end if (just_decoded_commit_clk30) begin @@ -680,16 +694,18 @@ module mpeg_video ( decoder_width <= 0; decoder_height <= 0; frame_period <= 0; - decoder_tempref <= 0; + display_tempref <= 0; + display_timecode <= 0; decoder_frameperiod_90khz <= 0; decoder_frameperiod_rawhdr <= 0; end for_display_valid <= for_display_valid_clk_mpeg; - first_intra_frame_of_gop_clk30 <= for_display.first_intra_frame_of_gop; + event_picture_starts_display <= 0; - event_first_intra_frame_starts_display <= 0; + event_first_intra_frame_gop_starts_display <= 0; + event_first_intra_frame_seq_starts_display <= 0; event_last_picture_starts_display <= 0; latch_frame_for_display <= 0; @@ -697,7 +713,8 @@ module mpeg_video ( if (latch_frame_until_vblank && !vblank && vblank_q1 && vblank_q2) begin latch_frame_until_vblank <= 0; event_picture_starts_display <= 1; - event_first_intra_frame_starts_display <= first_intra_frame_of_gop_in_prep; + event_first_intra_frame_gop_starts_display <= first_intra_frame_of_gop_clk30; + event_first_intra_frame_seq_starts_display <= first_intra_frame_of_seq_clk30; event_last_picture_starts_display <= !for_display_valid; end @@ -708,16 +725,14 @@ module mpeg_video ( if (playback_frame_cnt >= frame_period - 1) playback_frame_cnt <= 0; if (playback_frame_cnt == 0 && for_display_valid) begin - latch_frame_for_display <= 1; + latch_frame_for_display <= 1; latch_frame_until_vblank <= 1; - first_intra_frame_of_gop_in_prep <= first_intra_frame_of_gop_clk30; end end if (single_step) begin latch_frame_until_vblank <= 1; - latch_frame_for_display <= 1; - first_intra_frame_of_gop_in_prep <= first_intra_frame_of_gop_clk30; + latch_frame_for_display <= 1; end end diff --git a/rtl/mpeg/util.svh b/rtl/mpeg/util.svh index 899126d..0baf67f 100644 --- a/rtl/mpeg/util.svh +++ b/rtl/mpeg/util.svh @@ -6,9 +6,11 @@ typedef struct { bit [28:0] u_adr; bit [28:0] v_adr; bit first_intra_frame_of_gop; + bit first_intra_frame_of_seq; bit [10:0] width; bit [8:0] height; bit [7:0] tempref; + bit [31:0] timecode; } planar_yuv_s; typedef struct packed { @@ -18,7 +20,6 @@ typedef struct packed { bit [7:0] factor_l2l; } linear_volume_s; - function [31:0] ones_mask(bit [4:0] n); begin ones_mask = (32'h1 << n) - 1; // n ones at LSB diff --git a/rtl/vmpeg.sv b/rtl/vmpeg.sv index 010dacd..08bb30e 100644 --- a/rtl/vmpeg.sv +++ b/rtl/vmpeg.sv @@ -106,10 +106,8 @@ module vmpeg ( wire fmv_event_picture_starts_display; wire fmv_event_last_picture_starts_display; - wire fmv_event_first_intra_frame_starts_display; - wire fmv_event_sequence_header = fmv_event_first_intra_frame_starts_display; - wire fmv_event_group_of_pictures = fmv_event_first_intra_frame_starts_display; - wire fmv_event_picture = fmv_event_picture_starts_display; + wire fmv_event_first_intra_frame_seq_starts_display; + wire fmv_event_first_intra_frame_gop_starts_display; // TIMECD @ 00E04058 // example 0x07800280 -> 10:00:30.0 // mv_info() would have MD_TimeCd=0x0a001e00 @@ -117,7 +115,7 @@ module vmpeg ( // [27:22] 6 Bit Seconds. Not BCD // [5:0] 6 Bit Minutes. Not BCD // [10:6] 5 Bits Hours. Not BCD - wire [31:0] fmv_timecode; + wire [31:0] fmv_display_timecode; bit fmv_playback_active; bit fmv_single_step; wire fmv_event_sequence_end; @@ -163,11 +161,15 @@ module vmpeg ( .event_buffer_underflow(fmv_event_buffer_underflow), .event_picture_starts_display(fmv_event_picture_starts_display), .event_last_picture_starts_display(fmv_event_last_picture_starts_display), - .event_first_intra_frame_starts_display(fmv_event_first_intra_frame_starts_display), + .event_first_intra_frame_gop_starts_display(fmv_event_first_intra_frame_gop_starts_display), + .event_first_intra_frame_seq_starts_display(fmv_event_first_intra_frame_seq_starts_display), .pictures_in_fifo(fmv_pictures_in_fifo), .decoder_width(fmv_decoder_width), .decoder_height(fmv_decoder_height), - .decoder_tempref(fmv_decoder_tempref), + .display_width(fmv_display_width), + .display_height(fmv_display_height), + .display_tempref(fmv_display_tempref), + .display_timecode(fmv_display_timecode), .decoder_frameperiod_90khz(fmv_decoder_frameperiod_90khz), .decoder_frameperiod_rawhdr(fmv_decoder_frameperiod_rawhdr) ); @@ -182,18 +184,6 @@ module vmpeg ( end end - mpeg_video_start_code_decoder startcode ( - .clk, - .reset, - .mpeg_data(mpeg_data), - .data_valid(fmv_data_valid && fmv_packet_body), - .event_sequence_header(), - .event_group_of_pictures(), - .event_picture(), - .tmpref(), - .timecode(fmv_timecode) - ); - wire signed [32:0] fma_system_clock_reference_start_time; wire fma_system_clock_reference_start_time_valid; wire signed [32:0] fmv_system_clock_reference_start_time; @@ -398,7 +388,10 @@ module vmpeg ( wire [10:0] fmv_decoder_width; wire [ 8:0] fmv_decoder_height; - wire [ 7:0] fmv_decoder_tempref; + wire [10:0] fmv_display_width; + wire [ 8:0] fmv_display_height; + + wire [ 7:0] fmv_display_tempref; wire [15:0] fmv_decoder_frameperiod_90khz; wire [ 7:0] fmv_decoder_frameperiod_rawhdr; @@ -468,14 +461,16 @@ module vmpeg ( 15'h2001: dout = image_width; // 00E04002 ?? Written then Read 15'h2002: dout = image_height; // 00E04004 ?? Written then Read 15'h2003: dout = image_rt; // 00E04006 ?? - 15'h2004: dout = fmv_timecode[31:16]; // 00E04008 Temporal time code High. During scan - 15'h2005: dout = fmv_timecode[15:0]; // 00E0400C Temporal time code Low. During scan - 15'h2029: dout = {5'b0, fmv_decoder_width}; // e04052 Picture Width ?? Only read - 15'h202a: dout = {7'b0, fmv_decoder_height}; // e04054 Picture Height ?? Only read + 15'h2004: + dout = fmv_display_timecode[15:0]; // 00E04008 Temporal time code High. During scan + 15'h2005: + dout = fmv_display_timecode[31:16]; // 00E0400C Temporal time code Low. During scan + 15'h2029: dout = {5'b0, fmv_display_width}; // e04052 Picture Width ?? Only read + 15'h202a: dout = {7'b0, fmv_display_height}; // e04054 Picture Height ?? Only read 15'h202b: dout = {8'b0, fmv_decoder_frameperiod_rawhdr}; // e04056 Pic Rt ?? - 15'h202c: dout = fmv_timecode[31:16]; // 00E04058 Time Code High ?? - 15'h202d: dout = fmv_timecode[15:0]; // 00E0405A Time Code Low ?? - 15'h202e: dout = {6'b0, fmv_decoder_tempref, 2'b0}; // 00E0405C TMP REF?? SYS_VSR? + 15'h202c: dout = fmv_display_timecode[15:0]; // 00E04058 Time Code High ?? + 15'h202d: dout = fmv_display_timecode[31:16]; // 00E0405A Time Code Low ?? + 15'h202e: dout = {6'b0, fmv_display_tempref, 2'b0}; // 00E0405C TMP REF?? SYS_VSR? 15'h202f: dout = fmv_fifo_full ? 0 : 16'h2000; // 00E0405E ? SYS_STS 15'h2030: dout = fmv_interrupt_enable_register; // 0E04060 15'h2031: dout = fmv_interrupt_status_register; // 0E04062 @@ -613,12 +608,13 @@ module vmpeg ( end end - if (fmv_event_sequence_header) begin + if (fmv_event_first_intra_frame_seq_starts_display) begin fmv_interrupt_status_register.seq <= 1; $display("Cause FMV Seq Event"); end - if (fmv_event_group_of_pictures) fmv_interrupt_status_register.gop <= 1; - if (fmv_event_picture) begin + if (fmv_event_first_intra_frame_gop_starts_display) + fmv_interrupt_status_register.gop <= 1; + if (fmv_event_picture_starts_display) begin fmv_interrupt_status_register.pic <= 1; image_width <= {5'b0, fmv_decoder_width}; diff --git a/sim2/sim_top.cpp b/sim2/sim_top.cpp index 623192c..4f0335f 100644 --- a/sim2/sim_top.cpp +++ b/sim2/sim_top.cpp @@ -21,7 +21,7 @@ #define SCC68070 #define SLAVE -// #define TRACE +#define TRACE // #define SIMULATE_RC5 #define PL_MPEG_IMPLEMENTATION @@ -888,7 +888,7 @@ class CDi { dut.rootp->emu__DOT__cditop__DOT__fdrvs1_static = cpu_a[2]; } -#if 0 +#if 1 executing_dvc_rom_instructions = m_pc >= 0xe40000 && m_pc < 0xe7ffff; #endif if (print_instructions || executing_dvc_rom_instructions) { @@ -929,6 +929,7 @@ class CDi { // PAL // space_ace_pal(); // braindead13_pal(); + lost_ride_pal(); } #endif @@ -971,9 +972,9 @@ class CDi { } // Simulate Audio - if (dut.rootp->emu__DOT__cditop__DOT__sample_tick44) { - int16_t sample_l = dut.rootp->emu__DOT__cditop__DOT__vmpeg_inst__DOT__audio__DOT__fifo_out_left; - int16_t sample_r = dut.rootp->emu__DOT__cditop__DOT__vmpeg_inst__DOT__audio__DOT__fifo_out_right; + if (dut.rootp->emu__DOT__cditop__DOT__cdic_inst__DOT__sample_tick) { + int16_t sample_l = dut.rootp->emu__DOT__cditop__DOT__cdic_inst__DOT__adpcm__DOT__fifo_out_left; + int16_t sample_r = dut.rootp->emu__DOT__cditop__DOT__cdic_inst__DOT__adpcm__DOT__fifo_out_right; fwrite(&sample_l, 2, 1, f_audio_left); fwrite(&sample_r, 2, 1, f_audio_right); } @@ -1306,7 +1307,7 @@ int main(int argc, char **argv) { switch (machineindex) { case 0: - f_cd_bin = fopen("images/braindead13.bin", "rb"); + f_cd_bin = fopen("images/nonis2.bin", "rb"); break; case 1: f_cd_bin = fopen("images/braindead13.bin", "rb"); diff --git a/sim2/testroms/vmpegtest.asm b/sim2/testroms/vmpegtest.asm index 6592e18..9988525 100644 --- a/sim2/testroms/vmpegtest.asm +++ b/sim2/testroms/vmpegtest.asm @@ -10,7 +10,7 @@ main: move.w #$0000,$303FFE ; Data buffer move.w #$0002,$E03000 ; FMA CMD - On - move.w #$0006,$E03008 ; FMA Stream + move.w #$0000,$E03008 ; FMA Stream move.w #$2000,$E040C0 ; FMV SYSCMD - Decoder off nop @@ -56,7 +56,7 @@ main: move.w #$0100,$303C06 ; File Register move.l #$ffffffff,$303C08 ; Channel Register move.w #$0000,$303C0C ; Audio Channel Register - move.l #$01133900,$303C02 ; Timer Register + move.l #$00323400,$303C02 ; Timer Register move.w #$C000,$303FFE ; Start the Read by setting bit 15 of the data buffer move.l #0,$0E0407C ;FMV_DECOFF @@ -68,7 +68,7 @@ main: ; But I feel lazy and use the number of pics instead waitforpics: jsr WaitForSectorAndUse - cmp.w #4,$00E040A4 ; Compare 5 against pictures in FIFO + cmp.w #2,$00E040A4 ; Compare 5 against pictures in FIFO bmi waitforpics move.w #$0008,$E040C0 ; FMV SYSCMD - Play diff --git a/sw/mpeg_video/hwreg.h b/sw/mpeg_video/hwreg.h index b2167b0..e500de5 100644 --- a/sw/mpeg_video/hwreg.h +++ b/sw/mpeg_video/hwreg.h @@ -30,6 +30,9 @@ struct frame_display_fifo uint32_t temporal_ref; // @0x10003038 Write only uint32_t slow_motion; // @0x1000303c Read only uint32_t commit_frame; // @0x10003040 Write only + uint32_t timecode; // @0x10003044 Write only + uint32_t first_intra_frame_of_seq; // @0x10003048 Write only + }; struct io_fifo_control *const fifo_ctrl = (struct io_fifo_control *)0x10002000; diff --git a/sw/mpeg_video/main.c b/sw/mpeg_video/main.c index 7dac65e..0203e18 100644 --- a/sw/mpeg_video/main.c +++ b/sw/mpeg_video/main.c @@ -30,6 +30,7 @@ void print_str(const char *p); void stop_verilator(); // #define SOFT_CONVOLVE +int seq_hdr_latched; #define PL_MPEG_IMPLEMENTATION #define PLM_NO_STDIO @@ -109,10 +110,14 @@ static void push_frame(plm_frame_t *frame) { first_intra_frame_of_gop_occured = true; frame_display_fifo->first_intra_frame_of_gop = 1; + + frame_display_fifo->first_intra_frame_of_seq = seq_hdr_latched; + seq_hdr_latched = false; } else { frame_display_fifo->first_intra_frame_of_gop = 0; + frame_display_fifo->first_intra_frame_of_seq = 0; } frame_display_fifo->width = frame->width; @@ -124,6 +129,7 @@ static void push_frame(plm_frame_t *frame) frame_display_fifo->frameperiod_90khz = period90khz; frame_display_fifo->frameperiod_rawhdr = seq_hdr_conf.frameperiod; frame_display_fifo->temporal_ref = frame->temporal_ref; + frame_display_fifo->timecode = frame->timecode; if (frame_display_fifo->pictures_in_fifo < 3) { diff --git a/sw/mpeg_video/pl_mpeg.h b/sw/mpeg_video/pl_mpeg.h index db3de60..954f910 100755 --- a/sw/mpeg_video/pl_mpeg.h +++ b/sw/mpeg_video/pl_mpeg.h @@ -186,6 +186,8 @@ typedef struct plm_video_t plm_video_t; typedef struct plm_audio_t plm_audio_t; +int seq_hdr_latched; + // Demuxed MPEG PS packet // The type maps directly to the various MPEG-PES start codes. PTS is the // presentation time stamp of the packet in seconds. Note that not all packets @@ -229,6 +231,7 @@ typedef struct { plm_plane_t cb; int picture_type; int temporal_ref; + int timecode; } plm_frame_t; @@ -1504,6 +1507,7 @@ static const int PLM_START_SLICE_LAST = 0xAF; static const int PLM_START_PICTURE = 0x00; static const int PLM_START_EXTENSION = 0xB5; static const int PLM_START_USER_DATA = 0xB2; +static const int PLM_START_GROUP_OF_PICTURES = 0xB8; #define PLM_START_IS_SLICE(c) \ (c >= PLM_START_SLICE_FIRST && c <= PLM_START_SLICE_LAST) @@ -1985,6 +1989,7 @@ struct plm_video_t { int start_code; int picture_type; int temporal_ref; + int timecode; // from GOP plm_video_motion_t motion_forward; plm_video_motion_t motion_backward; @@ -2022,6 +2027,7 @@ static inline uint8_t plm_clamp(int n) { return n; } +int plm_video_decode_group_of_pictures(plm_video_t *self); int plm_video_decode_sequence_header(plm_video_t *self); void plm_video_init_frame(plm_video_t *self, plm_frame_t *frame); void plm_video_decode_picture(plm_video_t *self); @@ -2155,6 +2161,9 @@ plm_frame_t *plm_video_decode(plm_video_t *self) { } plm_video_decode_sequence_header(self); } + else if (self->start_code == PLM_START_GROUP_OF_PICTURES){ + plm_video_decode_group_of_pictures(self); + } else if (self->start_code == -1) { // If we reached the end of the file and the previously decoded // frame was a reference frame, we still have to return it. @@ -2176,7 +2185,6 @@ plm_frame_t *plm_video_decode(plm_video_t *self) { } while (!frame); - OUT_DEBUG = 15; frame->time = self->time; @@ -2205,6 +2213,24 @@ int plm_video_has_header(plm_video_t *self) { return TRUE; } +int plm_video_decode_group_of_pictures(plm_video_t *self) { + if (!plm_dma_buffer_has(self->buffer, 11+2+12)) { + return FALSE; + } + + // skip drop frame flag + plm_dma_buffer_skip(self->buffer, 1); + + uint32_t hours_minutes = plm_dma_buffer_read(self->buffer, 11); + + // skip marker + plm_dma_buffer_skip(self->buffer, 1); + + uint32_t seconds_frame = plm_dma_buffer_read(self->buffer, 12); + + self->timecode = (hours_minutes<<12) | seconds_frame; +} + int plm_video_decode_sequence_header(plm_video_t *self) { int max_header_size = 64 + 2 * 64 * 8; // 64 bit header + 2x 64 byte matrix if (!plm_dma_buffer_has(self->buffer, max_header_size)) { @@ -2273,6 +2299,8 @@ int plm_video_decode_sequence_header(plm_video_t *self) { plm_video_init_frame(self, &self->frame_forward); plm_video_init_frame(self, &self->frame_backward); } + __asm volatile("": : :"memory"); + seq_hdr_latched=1; return TRUE; } @@ -2361,10 +2389,10 @@ void plm_video_decode_picture(plm_video_t *self) { // Decode all slices plm_video_init_frame(self, &self->frame_current); - self->frame_current.picture_type = self->picture_type; self->frame_current.temporal_ref = self->temporal_ref; - + self->frame_current.timecode = self->timecode; + while (PLM_START_IS_SLICE(self->start_code)) { OUT_DEBUG = 7;