pax_global_header00006660000000000000000000000064131405751240014514gustar00rootroot0000000000000052 comment=5b3ebb65c3f34df15daa98d1d44bf71d3058a013 openMSX-RELEASE_0_14_0/000077500000000000000000000000001314057512400144315ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/.gitignore000066400000000000000000000001261314057512400164200ustar00rootroot00000000000000/derived /*.diff /*.log *.swp *~ *.suo *.sdf *.opensdf core.* core .cproject .project openMSX-RELEASE_0_14_0/Contrib/000077500000000000000000000000001314057512400160315ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/Contrib/README000066400000000000000000000006421314057512400167130ustar00rootroot00000000000000About Contrib ============= This directory contains third-party software that is distributed together with openMSX. These packages are not part of openMSX: they are maintained and licensed separately. Please read the README. file and the documentation files of the contributed packages for details. We would like to thank the contributors for the software they created and for allowing us to distribute it. openMSX-RELEASE_0_14_0/Contrib/README.cbios000066400000000000000000000236441314057512400200200ustar00rootroot00000000000000C-BIOS 0.28 =========== This software is a substitute BIOS which is can be used for running MSX emulators. It currently supports only execution of cartridge image ("ROMs"). Before you use it, you should read and accept the license (see below). On the C-BIOS web site, you can download newer versions, download the source code, and report bugs. http://cbios.sourceforge.net/ License ------- Copyright (c) 2002-2005 BouKiCHi. All rights reserved. Copyright (c) 2003 Reikan. All rights reserved. Copyright (c) 2004-2006,2008-2010 Maarten ter Huurne. All rights reserved. Copyright (c) 2004-2006,2008-2011 Albert Beevendorp. All rights reserved. Copyright (c) 2004-2005 Patrick van Arkel. All rights reserved. Copyright (c) 2004,2010-2011 Manuel Bilderbeek. All rights reserved. Copyright (c) 2004-2006 Joost Yervante Damad. All rights reserved. Copyright (c) 2004-2006 Jussi Pitkänen. All rights reserved. Copyright (c) 2004-2007 Eric Boon. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. History ------- ver 0.01 Initial ver 0.02 2002-08-15(JST) * Added original font and drawing screen. * Added dump-mode. * Changed recognition method of cartridges to recognize cartridges taking priority. ver 0.03 2002-08-19(JST) * Based on a suggestion from Ms.Okei, wrote 20h of BIOS(compare HL and DE). In the result, shooting game of a certain company became runnable more correctly. Thank Ms.Okei!! ver 0.04 2002-08-20(JST) * Added initialize of FCC2h-FCC4h. * Added function of GTSTCK and GTTRIG temporarily. * Divided msxb.bin to halfs. doing combining/copying with setb.bat now. ver 0.05 2002-08-27(JST) * Added INITGRP(only screen2), CHGMOD(graphic mode change routine), a routine calls H.STKE. * Rewrite memory recognition routine. * Some bug fixes. * Added sound test function. ver 0.06 2002-09-01(JST) * Fixed around of color. ver 0.07 2002-09-09(JST) * Added some sorts of keyboard routines. * Added joystich function to GTSTCK and GTTRIG. ver 0.08 2002-09-12(JST) * Restructured memory initialize routine. * Added error display routine. * Fixed routine of finding kinds of cartridges. * Fixed using method of EXPTBL. * Added initialize of from RG8SAV to RG23SA. * Now return within disabled interrupt from ENASLT routine. ver 0.09 2002-09-19(JST) * Made the rest half of font. * Improved key input routine. * Added CHPUT. With it, rewrote display routine. * Fixed init_grp. * Changed filenames to CBIOS.ROM, CBIOS_SUB.ROM. ver 0.10 2002-09-20(JST) * Fixed indent. * and so on... ver 0.10a 2002-09-22(JST) * Fixed license. * Added support of ROMs in page3. ver 0.11 2002-09-22(JST) * Small fix in init_sc5. ver 0.12beta 2002-09-25(JST) * Added test routine for disk access. need DISK.ROM. * Added init_sc7. * Improved ENASLT. now finding cartridge uses ENASLT. * Improved RAM detection. ver 0.12 2002-09-27(JST) * Changed finding cartridge again. * Changed screen mode of cartridge running time. * Fixed keyboard routine. * Fixed stick routine against to interrupt. ver 0.13 2002-10-02(JST) * Based on info from Mr.Maarten (a member of openMSX developers), fixed around of SCREEN 5. For detail, switching line numbers, temporary treatment for a bug of reading from VDP status register, and so on. ver 0.14 2002-10-10(JST) * Rewrote comments in source within Japanese. ver 0.15 2003-02-26(JST) * Rewrote some of comments back to English again. * Fixed non-assemblable condition becauseof lack of font file. * Changed filename, some of label name, strings and so on. ver 0.16 2003-04-16(JST) * Separated sound test from source. (Disabled) ver 0.16a 2003-06-01(JST) * CHGMOD: When screen0/1, now load font to VRAM. * CHPUT: Now support also screen1 not only screen0. ver 0.16b 2003-08-10(JST) * Added entry: INITXT, INIT32. These were exist only as internal routine of CHGMOD. * INITXT, INIT32: Fixed screen clear failure. * CHPUT: Fixed scroll failure. ver 0.17 2003-08-10(JST) * Changed LICENSE. New LICENSE will be suitable in various situations. e.g. use as a firmware for hand-made hardware. ver 0.18 2004-12-18(CET) * First release since moving to SourceForge. * Much improved support for MSX2 games. * Graphical boot logo. * Included machine config files for several MSX emulators. * Various bug fixes. ver 0.19 2004-12-24(CET) * Added support for SCREEN4 and SCREEN8. * Added support for clock chip. * Added support for palette. This fixes a lot of wrong colours. * Stubbed many calls: non-implemented calls print their name on the openMSX debugdevice (if present). * Various bug fixes. ver 0.20 2005-02-09(CET) * Added an MSX2+ configuration, which includes V9958 and MSX MUSIC. * Separate main ROMs for MSX1/MSX2/MSX2+. * Implemented several MSX2 specific routines, including BLT*. * Display is disabled when switching to a different screen mode. * Improved CHPUT a lot; implemented control and escape codes. * Rewrote key buffering; fixes bug of keys being repeated. * New boot logo, even cooler than the previous one. * New font, placed at a fixed address so all games can find it. * Started work on a disk ROM, but it is not functional yet, so it is not enabled in the configurations. * Stubbed all non-implemented calls. * Various bug fixes. ver 0.21 2005-06-07(CET) * Fixed RuMSX configuration files, thanks to Rudolf Lechleitner. * Rewrote ROM search code; now all ROMs are recognized. Also a clear error message is printed for BASIC ROMs. * New boot logo for MSX2 and MSX2+. * Changed boot sequence: Show logo, switch to SCREEN 1 and search for ROMs. * Improved video code; fixes several games. * Various bug fixes. ver 0.22 2008-12-27(CET) * Use separate logo ROM to save space in the main ROM. * Set lower bits of PSG reg 15 before reading joystick trigger status. * Improved RAM search. * Many new routines implemented and existing implementations made more complete, especially character I/O and bitmap graphics. * Added lots of documentation to system variables. * Added support for GNU assembler. * Various bug fixes. ver 0.23 2009-01-04(CET) * Updated blueMSX configuration files, thanks to Benoît Delvaux. * Fixed version reported by MSX1 logo ROM. * Fixed several video routines so they work on MSX1 VDPs (TMS99xx). * A couple of other bug fixes. ver 0.24 2010-05-24(CET) * VRAM size is now properly checked, fixing R-Type's V9938 detection. * C-BIOS doesn't lie anymore about the interrupt frequency. * Don't di; halt when no ROM is found, the warning in openMSX may be confusing * A few minor bug fixes and tweaks. ver 0.25 2011-02-01(CET) * C-BIOS now offers localized versions in the flavours INT (default), JP and BR. * Bug fixes for compatibility with Mirai, Family Billiards. * A couple of other bug fixes. * This version only compiles with Pasmo 0.5.3, due to lack of standards in assembler directives... ver 0.26 2014-11-02(CET) * Restored support to compile with tniASM (v1.0 Beta 17 or higher) * Moved to git, which means a.o.: archived changelog.txt, use git log from now on * Fixed VDP VRAM access timing for MSX1 VDP's * Update openMSX configurations to the new structure * Fixed bug blueMSX configurations * Fixed build on Mac OS X and add support for "make dist" ver 0.27 2014-11-05(CET) * Fixed bug (regression) in filvrm on non-MSX1-VDP's * Fixed some small bugs in openMSX configs * Fixed line endings of this file ver 0.28 2017-07-30(CEST) * Fixed bug that prevented brackets and a few other keys from generating characters when pressed Special Thanks -------------- People uploading MSX information to the internet. People developing any kind of emulators. All users. Font edit tool: Gameboy Tile Designer version 2.2 Copyright H. Mulder 1999 openMSX-RELEASE_0_14_0/Contrib/README.openmsx-control000066400000000000000000000010561314057512400220610ustar00rootroot00000000000000openMSX Control Example ======================= Using the "-control" command line parameter, the openMSX process can be controlled from another process. The control protocol XML-based. In openmsx-control.cc you'll find an example client application which communicates with openMSX using the control protocol. Note: We try to keep the control protocol stable, but there is no hard guarantee it won't change in the next release. author: Wouter Vermaelen openmsx-control.cc is public domain, use it as you see fit. There is no warranty of any kind. openMSX-RELEASE_0_14_0/Contrib/base64.cc000066400000000000000000000043001314057512400174210ustar00rootroot00000000000000// compile with: // g++ -Wall -Os base64.cc -I ../src/utils/ ../src/utils/Base64.cc -lz -o encode-gz-base64 // g++ -Wall -Os base64.cc -I ../src/utils/ ../src/utils/Base64.cc -lz -o decode-gz-base64 #include "Base64.hh" #include #include #include #include #include #include #include using namespace std; string encode(const void* data, unsigned len) { uLongf dstLen = len + len / 1000 + 12 + 1; // worst-case vector buf(dstLen); if (compress2(buf.data(), &dstLen, reinterpret_cast(data), len, 9) != Z_OK) { cerr << "Error while compressing blob." << endl; exit(1); } return Base64::encode(buf.data(), dstLen); } string decode(const char* data, unsigned len) { static const unsigned MAX_SIZE = 1024 * 1024; // 1MB string tmp = Base64::decode(string(data, len)); vector buf(MAX_SIZE); uLongf dstLen = MAX_SIZE; if (uncompress(reinterpret_cast(buf.data()), &dstLen, reinterpret_cast(tmp.data()), uLong(tmp.size())) != Z_OK) { cerr << "Error while decompressing blob." << endl; exit(1); } return string(buf.data(), dstLen); } int main(int argc, char** argv) { if (argc != 3) { cerr << "Usage: " << argv[0] << " \n"; exit(1); } FILE* inf = fopen(argv[1], "rb"); if (!inf) { cerr << "Error while opening " << argv[1] << endl; exit(1); } struct stat st; fstat(fileno(inf), &st); size_t size = st.st_size; vector inBuf(size); if (fread(inBuf.data(), size, 1, inf) != 1) { cerr << "Error whle reading " << argv[1] << endl; exit(1); } string result; if (strstr(argv[0], "encode-gz-base64")) { result = encode(inBuf.data(), inBuf.size()); } else if (strstr(argv[0], "decode-gz-base64")) { result = decode(inBuf.data(), inBuf.size()); } else { cerr << "This executable should be named 'encode-gz-base64' or " "'decode-gz-base64'." << endl; exit(1); } FILE* outf = fopen(argv[2], "wb+"); if (!outf) { cerr << "Error while opening " << argv[2] << endl; exit(1); } if (fwrite(result.data(), result.size(), 1, outf) != 1) { cerr << "Error whle writing " << argv[2] << endl; exit(1); } } openMSX-RELEASE_0_14_0/Contrib/basictorom.tcl000066400000000000000000000041411314057512400206770ustar00rootroot00000000000000### basictorom.tcl ### # # This script was developed together with Daniel Vik to have an automated tool # to convert BASIC programs to ROM files. See this forum thread for more # details: # # http://www.msx.org/forumtopic9249.html # # To use it, put a file 'prog.bas' in the current directory (can be either in # ascii format or an already tokenized basic file). Then execute this script by # using the openMSX commandline. And after a few seconds the ROM image # 'prog.rom' will be generated. # # input: prog.bas # output prog.rom # start with: openmsx -script basictorom.tcl # # Note: This script only works on MSX machines that have a disk drive and have # MSX-BASIC built-in. So for example it won't work on the default C-bios # based machines. So either select a different MSX machine as your # default machine, or pass the '-machine ' as extra # option when starting openMSX. # proc do_stuff1 {} { # insert openMSX ramdisk in the MSX disk drive diska ramdsk # import host file to ramdisk diskmanipulator import diska "prog.bas" # change basic start address poke16 0xf676 0x8011 # add rom header poke 0x8000 0x41 poke 0x8001 0x42 poke16 0x8002 0x0000 poke16 0x8004 0x0000 poke16 0x8006 0x0000 poke16 0x8008 0x8010 poke16 0x800a 0x0000 poke16 0x800c 0x0000 poke16 0x800e 0x0000 poke 0x8010 0x00 # instruct MSX to load the BASIC program type "load\"prog.bas\"\r" # give MSX some time to process this # wait long enough so that even very long BASIC programs can be loaded after time 100 do_stuff2 } proc do_stuff2 {} { # save rom file set data [debug read_block "memory" 0x8000 0x4000] set file [open "prog.rom" "WRONLY CREAT TRUNC"] fconfigure $file -translation binary puts -nonewline $file $data close $file # exit emulator exit } # don't store the settings below for future openmsx sessions set save_settings_on_exit false # don't show MSX screen (remove if you want to see what's going on) set renderer none # go as fast as possible set throttle off # give emulated MSX some time to boot after time 20 do_stuff1 openMSX-RELEASE_0_14_0/Contrib/cbios/000077500000000000000000000000001314057512400171305ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX1.xml000066400000000000000000000035601314057512400214020ustar00rootroot00000000000000 C-BIOS MSX1 2003 An MSX1 machine using C-BIOS, with an international keyboard layout and 50Hz interrupt frequency. MSX 61be882d690ac0ba9d6067fcf33f6f40287bf52e cbios_main_msx1.rom 16000 false int false false false TMS9929A 16 YM2149 21000 openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX1_BR.xml000066400000000000000000000035551314057512400217710ustar00rootroot00000000000000 C-BIOS MSX1 BR 2010 An MSX1 machine using C-BIOS, with Brazillian settings, like 60Hz interrupt frequency. MSX 2d2df4a7cba89805c80315125d3ac0c0bd7488a4 cbios_main_msx1_br.rom 16000 false int true false false TMS99X8A 16 YM2149 21000 openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX1_JP.xml000066400000000000000000000036431314057512400217750ustar00rootroot00000000000000 C-BIOS MSX1 JP 2010 An MSX1 machine using C-BIOS, with an Japanese keyboard layout and 60Hz interrupt frequency. MSX 6a2868faf6c3de590fa86a911dbc6e051680cf3a cbios_main_msx1_jp.rom 16000 false jp_ansi false true false TMS99X8A 16 50on YM2149 21000 openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX2+.xml000066400000000000000000000060211314057512400214510ustar00rootroot00000000000000 C-BIOS MSX2+ 2005 An MSX2+ machine using C-BIOS, with MSX-MUSIC, an international keyboard layout and 50Hz interrupt frequency. MSX2+ largest 12ebcebc65de0e8927c75d7b9b38e53ade65ce7c cbios_main_msx2+.rom 2fcb40413e7d373f0f2dbdc815ce18746ddf3684 cbios_sub.rom 5c5eb001e6a1fe29edb7abd428a3967bb388e5db cbios_music.rom 9000 512 16000 false int true false false V9958 128 YM2149 21000 cbios-msx2+.cmos true openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX2+_BR.xml000066400000000000000000000060301314057512400220340ustar00rootroot00000000000000 C-BIOS MSX2+ BR 2010 An MSX2+ machine using C-BIOS, with MSX-MUSIC, and Brazillian style settings like 60Hz interrupt frequency. MSX2+ largest 6f7bb07d04c22beacc04f55405af72272d85e905 cbios_main_msx2+_br.rom 2fcb40413e7d373f0f2dbdc815ce18746ddf3684 cbios_sub.rom 5c5eb001e6a1fe29edb7abd428a3967bb388e5db cbios_music.rom 9000 512 16000 false int true false false V9958 128 YM2149 21000 cbios-msx2+_br.cmos true openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX2+_JP.xml000066400000000000000000000061061314057512400220460ustar00rootroot00000000000000 C-BIOS MSX2+ JP 2010 An MSX2+ machine using C-BIOS, with MSX-MUSIC, a Japanese keyboard layout and 60Hz interrupt frequency. MSX2+ largest 9489d48e9618e480aa6082ebfce9b6dc2f543bca cbios_main_msx2+_jp.rom 2fcb40413e7d373f0f2dbdc815ce18746ddf3684 cbios_sub.rom 5c5eb001e6a1fe29edb7abd428a3967bb388e5db cbios_music.rom 9000 512 16000 false jp_ansi true true false V9958 128 YM2149 50on 21000 cbios-msx2+_jp.cmos true openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX2.xml000066400000000000000000000047141314057512400214050ustar00rootroot00000000000000 C-BIOS MSX2 2003 An MSX2 machine using C-BIOS, with an international keyboard layout and 50Hz interrupt frequency. MSX2 largest 8339f5f2be69a166af128ceb0c9c7799f25a6f35 cbios_main_msx2.rom 2fcb40413e7d373f0f2dbdc815ce18746ddf3684 cbios_sub.rom 512 16000 false int true false false V9938 128 YM2149 21000 cbios-msx2.cmos openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX2_BR.xml000066400000000000000000000047121314057512400217660ustar00rootroot00000000000000 C-BIOS MSX2 BR 2010 An MSX2 machine using C-BIOS, with Brazillian settings, like 60Hz interrupt frequency. MSX2 largest 5ac97614abd0044c9cbf0a8bf7101959f5865b4d cbios_main_msx2_br.rom 2fcb40413e7d373f0f2dbdc815ce18746ddf3684 cbios_sub.rom 512 16000 false int true false false V9938 128 YM2149 21000 cbios-msx2_br.cmos openMSX-RELEASE_0_14_0/Contrib/cbios/C-BIOS_MSX2_JP.xml000066400000000000000000000050011314057512400217640ustar00rootroot00000000000000 C-BIOS MSX2 JP 2010 An MSX2 machine using C-BIOS, with a Japanese keyboard layout and 60Hz interrupt frequency. MSX2 largest e8ab07d341539c40bd97666fad63e7bda8961eff cbios_main_msx2_jp.rom 2fcb40413e7d373f0f2dbdc815ce18746ddf3684 cbios_sub.rom 512 16000 false jp_ansi true true false V9938 128 YM2149 50on 21000 cbios-msx2_jp.cmos openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_basic.rom000066400000000000000000000400001314057512400221010ustar00rootroot00000000000000AB@>_3B!$0@!IbB!JbBE@!">w!-J!IbB!_@!-A!͖@͟( (͢w#͢> ͢wɯ(+>͢> ͢>͢A(!IbBͦ@!J~ #~+@(##!J(## ~#fo~#fo@ɯ( #>ɯ(=($( #>!IbB!oA~0(890>ɯ~a(8z0 w#~#foeA(~#fo#F#N#xAA> ͢~# ҢAҿAAAWO!nB ~#fo z͢ÇAbBÇA͢ÇAAAÇA!JbBoAn#f#A!JbB*BB*BB*BB*BB}0͢ɷ(B0â <8B=8O! _~(_####~ {~mB͢#nFrFvF{FFFFFFFFFFFFFFFFFFFFFFFFFFGG GGGG!G'G.G5G:G@GGGNGUG\GaGfGlGpGtGzGGGGGGGGGGGGGGGGGGGGGGGGHH HHHH H%H*H.H3H7H>HAHFHKHPHTHWH\H`HdHhHpHvH|HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHII IIIIII#I'I+I0I5I;IBIGILIQIVI[I`IeIiIoIuIyI}IIIIIIIIIIIENDFORNEXTDATAINPUTDIMREADLETGOTORUNIFRESTOREGOSUBRETURNSTOPPRINTCLEARLISTNEWONWAITDEFPOKECONTCSAVECLOADOUTLPRINTLLISTCLSWIDTHTRONTROFFSWAPERASEERRORRESUMEDELETEAUTORENUMDEFSTRDEFINTDEFSNGDEFDBLLINEOPENFIELDGETPUTCLOSELOADMERGEFILESLSETRSETSAVELFILESCIRCLECOLORDRAWPAINTBEEPPLAYPSETPRESETSOUNDSCREENVPOKESPRITEVDPBASECALLTIMEKEYMAXMOTORBLOADBSAVEDSKO$SETNAMEKILLIPLCOPYCMDLOCATETOTHENTAB(STEPUSRFNSPC(NOTERLERRSTRING$USINGINSTRVARPTRCSRLINATTR$DSKI$OFFINKEY$POINT>=<+-*/^ANDORXOREQVIMPMOD\LEFT$RIGHT$MID$SGNINTABSSQRRNDSINLOGEXPCOSTANATNREMINPPOSLENSTR$VALASCCHR$PEEKVPEEKSPACE$OCT$HEX$LPOSBIN$CINTCSNGCDBLFIXSTICKSTRIGPDLPADDSKFFPOSCVICVSCVDEOFLOCLOFMKI$MKS$MKD$C-BASIC ver 0.02 (050607) Copyright (C) BouKiCHi Ok recognized Line num Not implemented yet "J'JA ALISTVLIST III IopenMSX-RELEASE_0_14_0/Contrib/cbios/cbios_disk.rom000066400000000000000000000400001314057512400217520ustar00rootroot00000000000000AB0@@)BRByBúBB C7/CVC}C!@́DۨO:/! !Aw#w#w#w!!6#}CwgD}CC!1͠@C!͠@/C!͠@@!͠@>!12}"~>2`6#w#s#r#6C-DISK is initializing!@́D!@!>7C-DISK booting͠A8> 7ښAA|@88")E)))|2`xG!` >2`:C}C&$2<2d&$:B&@$)E)))|2xG! >2&@$ɯ7>#.!A͍D!A8!A͍D!A͍DkbͲD!B͍DxͥD!B͍DͲD!B͍DyͥD>.disk: READWRITE sectors: first $, num $, to $, media $!6B́Ddisk: DSKCHG ($4013) called!]B́Ddisk: GETDPB ($4016) called!}B 1 - Single sided, 80 tracks 2 - Double sided, 80 tracks !B́D7disk: DSKFMT ($401C) called!B́Ddisk: LOC_DS ($401F) called!ĆDdisk: BASIC ($4022) called!:ĆDdisk: FORMAT ($4026) called!aĆDdisk: DSKSTP ($4029) called>@y10!Co>g~#fo>oCC>DCCCCCCSDCCC`DCCCCCCCCCCCdDjDCCCCCCCCCCCCCCCCCCCoDpDC>#.!D͍DyͥD>.disk: BDOS ($F37D/$0005) called, function $!*{$_>DgDɯoS=}D*=̀C8<>#.͍D>.~#/ 00/7/͕D͕D|ͥD}ͥDopenMSX-RELEASE_0_14_0/Contrib/cbios/cbios_logo_msx1.rom000066400000000000000000000400001314057512400227300ustar00rootroot00000000000000C-BIOS Logo ROMo>22b*">VGGG:G:*V*$ 0!\*$ * \* 0!\*>V*" ! \  ????????????|??|?????????|<<<????????~~~~?~xxx|??????|||||????~~~~<🟟|~~>???>??}!R؂!">_!EA!"b:G G>!1_G !q w> ә>ә!q>ә>ә>!1_G( !!"!a">2>2!҂T2D!O~(0O~wO~(0<=O~w#O~(0<=w#!Ev ! # !^#V#Evvә>ә :0 ~͢#~!_#U''''''''''''''''3Uwtcsrrrpp'3Uwtcsrrrpw'3Uwtcsrrrwp'3Uwtcsrrwpp'3Uwtcsrwrpp'3Uwtcswrrpp'3Uwtcwrrrpp'3Uwwcsrrrpp'3Uwtwsrrrpp @`V0.28.8~#(0_P0....8˻;bkB:bk+!~#O! !.0.j#~3@Cy64}c:j$a~?~~Y~g~}[~j+~CrWcPzfٶa 8M9<ҩ7_ ~&9l戗8_wcfA1|W9~ɓ|+fN|6!WwvN5?|Vg<(3|fGUVdCwc93?:3k/yĊw ΰ:z?c!8Dw{gKWQ\#v'C>Rg~xfǀY+#ySzYgeUn8vc9FV#f+zU8CVgsfEޏHgf-=f_of1'< ۭi;Yfc#C=K^fNfҙ7z;S 8;cߨ8~f)Gf_f6{܏WVviDN>se >sVޠJOӡ}):.G583ҔZ|4ΞSfEfCi*dODFd~C| 6Wv>-wfHe|%EVS.̭~4FPpD'VUf?2)S|rheG)4UTC~3e6̀uS{|[e7UeDUgUe|o*eU$eUSUgGD8rS(ɀ6%gDÔNVgbD~Rd͉ U0"qUbĀEf ~?8_ͺ9Cg~73߀7ۀkm8?R:k>:?~~dS9|QJj>~^(/e~/$~)? })8c΃$|4"~3>A3@"D>_~c?30~#^}C34~8K#~ȀLcD~ȀS4D~~-@c/openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_logo_msx2.rom000066400000000000000000000400001314057512400227310ustar00rootroot00000000000000C-BIOS Logo ROM!H΂!">_!v;A!"b:G G>!1_G !g w> ә>ә!g>ә>ә>!1_G( !v!"!a">2>2!ȂJ2D!O~(0O~wO~(0<=O~w#O~(0<=w#!;v ! # !^#V#;vvә>ә :0 ~͢#~!_#U''''''''''''''''3Uwtcsrrrpp'3Uwtcsrrrpw'3Uwtcsrrrwp'3Uwtcsrrwpp'3Uwtcsrwrpp'3Uwtcswrrpp'3Uwtcwrrrpp'3Uwwcsrrrpp'3Uwtwsrrrppց6VvV0.28$8~#(0_P0$$$$8˻1bkB0bk+!~#O! !$0$j#~3@Cy64}c:j$a~?~~Y~g~}[~j+~CrWcPzfٶa 8M9<ҩ7_ ~&9l戗8_wcfA1|W9~ɓ|+fN|6!WwvN5?|Vg<(3|fGUVdCwc93?:3k/yĊw ΰ:z?c!8Dw{gKWQ\#v'C>Rg~xfǀY+#ySzYgeUn8vc9FV#f+zU8CVgsfEޏHgf-=f_of1'< ۭi;Yfc#C=K^fNfҙ7z;S 8;cߨ8~f)Gf_f6{܏WVviDN>se >sVޠJOӡ}):.G583ҔZ|4ΞSfEfCi*dODFd~C| 6Wv>-wfHe|%EVS.̭~4FPpD'VUf?2)S|rheG)4UTC~3e6̀uS{|[e7UeDUgUe|o*eU$eUSUgGD8rS(ɀ6%gDÔNVgbD~Rd͉ U0"qUbĀEf ~?8_ͺ9Cg~73߀7ۀkm8?R:k>:?~~dS9|QJj>~^(/e~/$~)? })8c΃$|4"~3>A3@"D>_~c?30~#^}C34~8K#~ȀLcD~ȀS4D~~-@c/openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx1.rom000066400000000000000000001000001314057512400227110ustar00rootroot00000000000000 ÿ#$4$!s$'9NX".EMU`mÁ×í^ÂCÏ÷oÂÌ×:R\j|Ïô6TK%ASVõfj{ÍßÏGYò!jyDVgvÆ×éù  & 7 G Y k } Î çajmpsÂÆÊópO #(##N#fi:G.:@G.˹xәyә!x wUۘ`Ә}ә|?ә}ә|?@ә` xAO Ә U xA<= ` xA<£= !C!xQ ":(:=:o:G.:!* `Ә x :G.:H:8*(%%:m*&m:8*(`:W {Ә>ӘyӘ ͌0 zӘ>22:2>22*""*"$*"(*"&͏ͨþ>22>22*""*"$*"&*"(ͨ:2ͷSþ>2*""`Ә< *"$*"(*"&Sþ>2*""` Ә< *"$*"(*"&Sþ:G.:G .J J:G.:G .JJJJJ:G.:G .J>J>JJJ:G.:G .JJJJJ!h F~#fo)GG.   &o)))͌0))[&ɇ*(_:>> 8 :("0 * "!""[K͹:2**K @:O  :/O* ":͛:(:,/2, ͛:,/2, WXK O:GE( /z(MMAә}әۘӘә>әۙә>әۙ......>22>!m>!  m.!͗![$×:!:(8*"> m>!wE*$om:*m:G*$mK o&))) @:Ϳ##!O͟ RIGHTC!a͟ LEFTC!r͟ UPC!͟ TUPC!͟ DOWNC!͟ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC! ͟ STOREC! ͟ SETATR!1 ͟ READC!B ͟ SETC!R ͟ NSETCX!d ͟ GTASPC!v ͟ PNTINI! ͟ SCANR! ͟ SCANL>#.ͫ >.~#/ 00/7/ͳ ͳ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%ÇxӨy2!CMN!:Ϳ# #!*4$>22!V%͎x͊>2>2>2>2!V%͎">22)!&͎eC-BIOS Logo ROM!?6!!@iv!iv(g(#< GͿ##xͿ##W_xY!AB!x!%͎G0ʹxx(>.ʹx0ʹ> ʹ> ʹ##(Oۙ4$(((G _x0_|!_qxYzx!@~(!%͎#>!w} >!w>!wM>!w>!w'!"""H!"J"t!;%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0v:0 ~ʹ#~!?# :(:)Pͫ:DR:!c͟ INIFNK!u͟ STRTMS*[> *[ v~#} !"ͤ:0:2a(:½ 8*ͽM*:$8"&w*l. !> : *:,0 E͐-"!".*l:!0..">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!4(5(.y2(y2"22> > >>2:!<2:=2l!:_w: ͽml*E:2G:ͽ=2ͽ"&:W=O!bk+.l*E:G:ͽ<2ͽ."&:=OT]#:Ó!͗ :> Ò:::ͽM::ͽE2_! **́: !!~/w#!͗ͽ>MV  . E  lrxjEK.JLl+LLMY ABCD"HExyͶ%8( > 27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:T>2T? !H͎*"&}w͏ 0!22:ċ*"> 2ͽE (*: &~(:ͽM*"> :27ɯ۪Ӫ۩۪Ӫ۩7!L͟ ISCNTCA!a͟ BEEP"!u͟ FNKSB!͟ ERAFNK!͟ DSPFNK::ͽʂ!͟ 7TAPION!͟ 7TAPIN!͟ TAPIOF!͟ 7TAPOON!͟ 7TAPOUT!͟ TAPOOFG۪( ( ˧(Ӫ>RRӠ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >s/!_~=(>\濳_>R>\/!O ~>0 >s<=G(L>\濳_>Rx( >\Ѡ(>ɯ!S͟ GTPAD!d͟ GTPDL͚F#~##o&͚~2/2c*[ :=2 ! q#c>2E۪O !yӪ۩w# !:!&8!& ݾĴ/ݦw8## y !'>2y((x >! > 5>x > $>!_(  ~( â*w#} !["?W:4$^%Ç!͟ %ÇCALBASۙ!' Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә e#_E#GۨẀ{z%Wէ$|oG>#_Ez#GۨWYͅz%W$zG(= !g$ۨÌz%oG>U{$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: EU/INT Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-=\[];'`,./abcdefghijklmnopqrstuvwxyz)!@#$%^&*(_+|{}:"~<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ     ˩ٿڷ冦椢ح궸  *+/0123456789-,.p@{( !1͟ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:͟ BASIC statements are not implemented yet͎!"}͟ unknown@7D179}!?!?!~͟ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx1_br.rom000066400000000000000000001000001314057512400233740ustar00rootroot00000000000000 ÿ#$4$!s$'!9NX".EMU`mÁ×í^ÂCÏ÷oÂÌ×:R\j|Ïô6TK%ASVõfj{ÍßÏGYò!jyDVgvÆ×éù  & 7 G Y k } Î çajmpsÂÆÊópO #(##N#fi:G.:@G.˹xәyә!x wUۘ`Ә}ә|?ә}ә|?@ә` xAO Ә U xA<= ` xA<£= !C!xQ ":(:=:o:G.:!* `Ә x :G.:H:8*(%%:m*&m:8*(`:W {Ә>ӘyӘ ͌0 zӘ>22:2>22*""*"$*"(*"&͏ͨþ>22>22*""*"$*"&*"(ͨ:2ͷSþ>2*""`Ә< *"$*"(*"&Sþ>2*""` Ә< *"$*"(*"&Sþ:G.:G .J J:G.:G .JJJJJ:G.:G .J>J>JJJ:G.:G .JJJJJ!h F~#fo)GG.   &o)))͌0))[&ɇ*(_:>> 8 :("0 * "!""[K͹:2**K @:O  :/O* ":͛:(:,/2, ͛:,/2, WXK O:GE( /z(MMAә}әۘӘә>әۙә>әۙ......>22>!m>!  m.!͗![$×:!:(8*"> m>!wE*$om:*m:G*$mK o&))) @:Ϳ##!O͟ RIGHTC!a͟ LEFTC!r͟ UPC!͟ TUPC!͟ DOWNC!͟ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC! ͟ STOREC! ͟ SETATR!1 ͟ READC!B ͟ SETC!R ͟ NSETCX!d ͟ GTASPC!v ͟ PNTINI! ͟ SCANR! ͟ SCANL>#.ͫ >.~#/ 00/7/ͳ ͳ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%ÇxӨy2!CMN!:Ϳ# #!*4$>22!V%͎x͊>2>2>2>2!V%͎">22)!%͎eC-BIOS Logo ROM!?6!!@iv!iv(g(#< GͿ##xͿ##W_xY!AB!x!%͎G0ʹxx(>.ʹx0ʹ> ʹ> ʹ##(Oۙ4$(((G _x0_|!_qxYzx!@~(!%͎#>!w} >!w>!wM>!w>!w'!"""H!"J"t!;%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0v:0 ~ʹ#~!?# :(:)Pͫ:DR:!c͟ INIFNK!u͟ STRTMS*[> *[ v~#} !"ͤ:0:2a(:½ 8*ͽM*:$8"&w*l. !> : *:,0 E͐-"!".*l:!0..">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!4(5(.y2(y2"22> > >>2:!<2:=2l!:_w: ͽml*E:2G:ͽ=2ͽ"&:W=O!bk+.l*E:G:ͽ<2ͽ."&:=OT]#:Ó!͗ :> Ò:::ͽM::ͽE2_! **́: !!~/w#!͗ͽ>MV  . E  lrxjEK.JLl+LLMY ABCD"HExyͶ%8( > 27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:T>2T? !H͎*"&}w͏ 0!22:ċ*"> 2ͽE (*: &~(:ͽM*"> :27ɯ۪Ӫ۩۪Ӫ۩7!L͟ ISCNTCA!a͟ BEEP"!u͟ FNKSB!͟ ERAFNK!͟ DSPFNK::ͽʂ!͟ 7TAPION!͟ 7TAPIN!͟ TAPIOF!͟ 7TAPOON!͟ 7TAPOUT!͟ TAPOOFG۪( ( ˧(Ӫ>RRӠ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >s/!_~=(>\濳_>R>\/!O ~>0 >s<=G(L>\濳_>Rx( >\Ѡ(>ɯ!S͟ GTPAD!d͟ GTPDL͚F#~##o&͚~2/2c*[ :=2 ! q#c>2E۪O !yӪ۩w# !:!&8!& ݾĴ/ݦw8## y !'>2y((x >! > 5>x > $>!_(  ~( â*w#} !["?W:4$^%Ç!͟ %ÇCALBASۙ!' Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә e#_E#GۨẀ{z%Wէ$|oG>#_Ez#GۨWYͅz%W$zG(= !g$ۨÌz%oG>U{$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: BR Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-=\[];'`,./abcdefghijklmnopqrstuvwxyz)!@#$%^&*(_+|{}:"~<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ     ˩ٿڷ冦椢ح궸  *+/0123456789-,.p@{( !1͟ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:͟ BASIC statements are not implemented yet͎!"}͟ unknown@7D179}!?!?!~͟ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx1_jp.rom000066400000000000000000001000001314057512400234020ustar00rootroot00000000000000 ÿ#$4$!s$'9NX".EMU`mÁ×í^ÂCÏ÷oÂÌ×:R\j|Ïô6TK%ASVõfj{ÍßÏGYò!jyDVgvÆ×éù  & 7 G Y k } Î çajmpsÂÆÊópO #(##N#fi:G.:@G.˹xәyә!x wUۘ`Ә}ә|?ә}ә|?@ә` xAO Ә U xA<= ` xA<£= !C!xQ ":(:=:o:G.:!* `Ә x :G.:H:8*(%%:m*&m:8*(`:W {Ә>ӘyӘ ͌0 zӘ>22:2>22*""*"$*"(*"&͏ͨþ>22>22*""*"$*"&*"(ͨ:2ͷSþ>2*""`Ә< *"$*"(*"&Sþ>2*""` Ә< *"$*"(*"&Sþ:G.:G .J J:G.:G .JJJJJ:G.:G .J>J>JJJ:G.:G .JJJJJ!h F~#fo)GG.   &o)))͌0))[&ɇ*(_:>> 8 :("0 * "!""[K͹:2**K @:O  :/O* ":͛:(:,/2, ͛:,/2, WXK O:GE( /z(MMAә}әۘӘә>әۙә>әۙ......>22>!m>!  m.!͗![$×:!:(8*"> m>!wE*$om:*m:G*$mK o&))) @:Ϳ##!O͟ RIGHTC!a͟ LEFTC!r͟ UPC!͟ TUPC!͟ DOWNC!͟ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC! ͟ STOREC! ͟ SETATR!1 ͟ READC!B ͟ SETC!R ͟ NSETCX!d ͟ GTASPC!v ͟ PNTINI! ͟ SCANR! ͟ SCANL>#.ͫ >.~#/ 00/7/ͳ ͳ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%ÇxӨy2!CMN!:Ϳ# #!*4$>22!V%͎x͊>2>2>2>2!V%͎">22)!%͎eC-BIOS Logo ROM!?6!!@iv!iv(g(#< GͿ##xͿ##W_xY!AB!x!%͎G0ʹxx(>.ʹx0ʹ> ʹ> ʹ##(Oۙ4$(((G _x0_|!_qxYzx!@~(!%͎#>!w} >!w>!wM>!w>!w'!"""H!"J"t!;%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0v:0 ~ʹ#~!?# :(:)Pͫ:DR:!c͟ INIFNK!u͟ STRTMS*[> *[ v~#} !"ͤ:0:2a(:½ 8*ͽM*:$8"&w*l. !> : *:,0 E͐-"!".*l:!0..">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!4(5(.y2(y2"22> > >>2:!<2:=2l!:_w: ͽml*E:2G:ͽ=2ͽ"&:W=O!bk+.l*E:G:ͽ<2ͽ."&:=OT]#:Ó!͗ :> Ò:::ͽM::ͽE2_! **́: !!~/w#!͗ͽ>MV  . E  lrxjEK.JLl+LLMY ABCD"HExyͶ%8( > 27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:T>2T? !H͎*"&}w͏ 0!22:ċ*"> 2ͽE (*: &~(:ͽM*"> :27ɯ۪Ӫ۩۪Ӫ۩7!L͟ ISCNTCA!a͟ BEEP"!u͟ FNKSB!͟ ERAFNK!͟ DSPFNK::ͽʂ!͟ 7TAPION!͟ 7TAPIN!͟ TAPIOF!͟ 7TAPOON!͟ 7TAPOUT!͟ TAPOOFG۪( ( ˧(Ӫ>RRӠ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >s/!_~=(>\濳_>R>\/!O ~>0 >s<=G(L>\濳_>Rx( >\Ѡ(>ɯ!S͟ GTPAD!d͟ GTPDL͚F#~##o&͚~2/2c*[ :=2 ! q#c>2E۪O !yӪ۩w# !:!&8!& ݾĴ/ݦw8## y ! (>2y((x >! > 5>x > $>!_(  ~( â*w#} !["?W:4$^%Ç!͟ %ÇCALBASۙ!3( Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә e|D|D|D 0H8T|8T8T8T||DD|DD|@||P (D|$DH$UbD| |D|D|p@@|D|((HHB$$B|(H|T|TT0ll$$~$~$$>TT>>"T(%B8DD(2J|`` T88T|`` ~`` @8LTTd8088D8@|x8xDDD||@xx8@xDD8|D8D8DD88DD<8 @ ||  8D#_E#GۨẀ{z%Wէ$|oG>#_Ez#GۨWYͅz%W$zG(= !g$ۨÌz%oG>U{$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: JP Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-^\@[;:],./_abcdefghijklmnopqrstuvwxyz0!"#$%&'()=~|`{+*}<>?_ABCDEFGHIJKLMNOPQRSTUVWXYZ          쑓᚟ꗘ̱Ͱڹʷ׾Ķû†  *+/0123456789-,.p@{( !1͟ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:͟ BASIC statements are not implemented yet͎!"}͟ unknown@7D179}!?!?!~͟ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx2+.rom000066400000000000000000001000001314057512400227650ustar00rootroot00000000000000 Ò#ä$G$Æ$Ú".Z`hzÎí>ÝæïøH{!4YÍ÷ 2/ASCö fyËÝð-Yk|ËÛìþ  ) ; L \ n À Ò ã [!$'6:>gy}Ó$5;;PZÖÜLPO #(##N#fi:G.:@G.˹xәyә!y8!8 ( 0!x whۘzӘә>ә}ә|?әә>ә}ә|?@ә:0zZ xAO Ә :0hP xA<= :0zZ xA<= !:(:=:o:G.:!* zӘ x :G.:h:8*(%%:;*&;:8*(Z:W {Ә>ӘyӘ 0 zӘ!!!!:)0(:G.:G .ͬ ͬ:G.:G .">ͬ ͬ:G.:G .ͬͬͬͬͬ:G.:G .ͬ>ͬ>ͬͬͬ:G.:G .ͬͬͬͬͬ! F~#fo)GG.   &o)))0))[&ɇ*(_:>> 8 :(+0 * "!"!7[K:2**K @:O } :/O}* "::(:,/2, :,/2, WXK O:GZ( /z(``Aә}әPۘZӘә>әۙә>әۙ......>22c>!͎>!  ͎.!.;..![$: !BTc:(8*"> ͎>!w*$o͎:*Î:G*$Î:G!):G!:G!:!.,$(!*!$:g.&>-$>.$.}$ |әyә>ͤ8K o&))) @:##!dʹ RIGHTC!vʹ LEFTC!ʹ UPC!ʹ TUPC!ʹ DOWNC!ʹ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC!" ʹ STOREC!4 ʹ SETATR!F ʹ READC!W ʹ SETC!g ʹ NSETCX!y ʹ GTASPC! ʹ PNTINI! ʹ SCANR! ʹ SCANL>#. >.~#/ 00/7/ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%TxӨy2!S͗͸O!:# #!*G$>22ͦ!i%3>ә>әә@ә>vӘә!әۘv(֯ә>әx/Ϳ#>2>2>2>2ͦ!A!i%3^=>22)!&3C-BIOS Logo ROM!?6!!@̲ͥ!̲ͥ(g(#< G##x##W_x͕!ABx!%3G0Yxx(>.Yx0Y> Y> Y##4(OۙG$4(4(4(G _x0_|!_qx͕zx!@~(!%3#>!w} >!w>!wM>!w>!w'>!w>2>2!"""H!"J"t!N%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!Y"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0!y  # 2 O2!&C #&Dy7ȷy#v:0 ~Y#~!# :(:)PP:D!ʹ INIFNK!ʹ STRTMS*[> *[ v~#} !"ͤ:0͸:2a(:b 8*ʪb`*:$8"&w* !<> ͗: *:,0 5-"!"*:!0">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!`4(5(.y2(y2"22> > >>2:!<2:=2!:_w: bÎ*E:2G:b=2bs"&:W=O!bk+*E:G:b<2bs"&:=OT]#:O)8 (͐:(O͐ͭ! :> ͗7:::b`::bZ2_! **ͭ: !!~/w#!b>` 7    3 7LUj3E3KJlLM5YALBUCDHxyͶ8ͷ( > ͪ27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:>2? !3*"&}w4ʘ 0!22:?͸*"> 2bZ (*: &~(:b`*"> :27ɯ۪Ӫ۩۪Ӫ۩7!ʹ ISCNTC!ʹ BEEP"!)ʹ FNKSB!:ʹ ERAFNK!Lʹ DSPFNK::ͽʝæ!rʹ 7TAPION!ʹ 7TAPIN!ʹ TAPIOF!ʹ 7TAPOON!ʹ 7TAPOUT!ʹ TAPOOFG۪( ( ˧(Ӫ><<<>Ӡ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >'/!_~=(>濳_>>/!O ~>0 >'<=G(L>濳_>x( >Ѡ(>ɯ!ʹ GTPAD!ʹ GTPDLNF#~##o&N~2Ͷ/2*[ :=2 ! q#>2E۪O !yӪ۩w# !:!&8!& ݾh/ݦw8## y !'>2y((x >! > 5>x > $>!_( ~(V*w#} !["W:G$&T!4ʹ %TCALBAS["S//ۙ!' Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә  $_E $GۨẀ{z-%Wէ$|oG> $_Ez $GۨWYͅz-%W$zG(= !z$ۨÌz-%oG>U$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: EU/INT Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-=\[];'`,./abcdefghijklmnopqrstuvwxyz)!@#$%^&*(_+|{}:"~<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ     ˩ٿڷ冦椢ح궸  *+/0123456789-,.p@{( !1ʹ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:ʹ BASIC statements are not implemented yet3!"}ʹ unknown@7D179}!!!~ʹ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx2+_br.rom000066400000000000000000001000001314057512400234500ustar00rootroot00000000000000 Ò#ä$G$Æ$!Ú".Z`hzÎí>ÝæïøH{!4YÍ÷ 2/ASCö fyËÝð-Yk|ËÛìþ  ) ; L \ n À Ò ã [!$'6:>gy}Ó$5;;PZÖÜLPO #(##N#fi:G.:@G.˹xәyә!y8!8 ( 0!x whۘzӘә>ә}ә|?әә>ә}ә|?@ә:0zZ xAO Ә :0hP xA<= :0zZ xA<= !:(:=:o:G.:!* zӘ x :G.:h:8*(%%:;*&;:8*(Z:W {Ә>ӘyӘ 0 zӘ!!!!:)0(:G.:G .ͬ ͬ:G.:G .">ͬ ͬ:G.:G .ͬͬͬͬͬ:G.:G .ͬ>ͬ>ͬͬͬ:G.:G .ͬͬͬͬͬ! F~#fo)GG.   &o)))0))[&ɇ*(_:>> 8 :(+0 * "!"!7[K:2**K @:O } :/O}* "::(:,/2, :,/2, WXK O:GZ( /z(``Aә}әPۘZӘә>әۙә>әۙ......>22c>!͎>!  ͎.!.;..![$: !BTc:(8*"> ͎>!w*$o͎:*Î:G*$Î:G!):G!:G!:!.,$(!*!$:g.&>-$>.$.}$ |әyә>ͤ8K o&))) @:##!dʹ RIGHTC!vʹ LEFTC!ʹ UPC!ʹ TUPC!ʹ DOWNC!ʹ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC!" ʹ STOREC!4 ʹ SETATR!F ʹ READC!W ʹ SETC!g ʹ NSETCX!y ʹ GTASPC! ʹ PNTINI! ʹ SCANR! ʹ SCANL>#. >.~#/ 00/7/ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%TxӨy2!S͗͸O!:# #!*G$>22ͦ!i%3>ә>әә@ә>vӘә!әۘv(֯ә>әx/Ϳ#>2>2>2>2ͦ!A!i%3^=>22)!&3C-BIOS Logo ROM!?6!!@̲ͥ!̲ͥ(g(#< G##x##W_x͕!ABx!%3G0Yxx(>.Yx0Y> Y> Y##4(OۙG$4(4(4(G _x0_|!_qx͕zx!@~(!%3#>!w} >!w>!wM>!w>!w'>!w>2>2!"""H!"J"t!N%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!Y"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0!y  # 2 O2!&C #&Dy7ȷy#v:0 ~Y#~!# :(:)PP:D!ʹ INIFNK!ʹ STRTMS*[> *[ v~#} !"ͤ:0͸:2a(:b 8*ʪb`*:$8"&w* !<> ͗: *:,0 5-"!"*:!0">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!`4(5(.y2(y2"22> > >>2:!<2:=2!:_w: bÎ*E:2G:b=2bs"&:W=O!bk+*E:G:b<2bs"&:=OT]#:O)8 (͐:(O͐ͭ! :> ͗7:::b`::bZ2_! **ͭ: !!~/w#!b>` 7    3 7LUj3E3KJlLM5YALBUCDHxyͶ8ͷ( > ͪ27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:>2? !3*"&}w4ʘ 0!22:?͸*"> 2bZ (*: &~(:b`*"> :27ɯ۪Ӫ۩۪Ӫ۩7!ʹ ISCNTC!ʹ BEEP"!)ʹ FNKSB!:ʹ ERAFNK!Lʹ DSPFNK::ͽʝæ!rʹ 7TAPION!ʹ 7TAPIN!ʹ TAPIOF!ʹ 7TAPOON!ʹ 7TAPOUT!ʹ TAPOOFG۪( ( ˧(Ӫ><<<>Ӡ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >'/!_~=(>濳_>>/!O ~>0 >'<=G(L>濳_>x( >Ѡ(>ɯ!ʹ GTPAD!ʹ GTPDLNF#~##o&N~2Ͷ/2*[ :=2 ! q#>2E۪O !yӪ۩w# !:!&8!& ݾh/ݦw8## y !'>2y((x >! > 5>x > $>!_( ~(V*w#} !["W:G$&T!4ʹ %TCALBAS["S//ۙ!' Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә  $_E $GۨẀ{z-%Wէ$|oG> $_Ez $GۨWYͅz-%W$zG(= !z$ۨÌz-%oG>U$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: BR Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-=\[];'`,./abcdefghijklmnopqrstuvwxyz)!@#$%^&*(_+|{}:"~<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ     ˩ٿڷ冦椢ح궸  *+/0123456789-,.p@{( !1ʹ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:ʹ BASIC statements are not implemented yet3!"}ʹ unknown@7D179}!!!~ʹ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx2+_jp.rom000066400000000000000000001000001314057512400234560ustar00rootroot00000000000000 Ò#ä$G$Æ$Ú".Z`hzÎí>ÝæïøH{!4YÍ÷ 2/ASCö fyËÝð-Yk|ËÛìþ  ) ; L \ n À Ò ã [!$'6:>gy}Ó$5;;PZÖÜLPO #(##N#fi:G.:@G.˹xәyә!y8!8 ( 0!x whۘzӘә>ә}ә|?әә>ә}ә|?@ә:0zZ xAO Ә :0hP xA<= :0zZ xA<= !:(:=:o:G.:!* zӘ x :G.:h:8*(%%:;*&;:8*(Z:W {Ә>ӘyӘ 0 zӘ!!!!:)0(:G.:G .ͬ ͬ:G.:G .">ͬ ͬ:G.:G .ͬͬͬͬͬ:G.:G .ͬ>ͬ>ͬͬͬ:G.:G .ͬͬͬͬͬ! F~#fo)GG.   &o)))0))[&ɇ*(_:>> 8 :(+0 * "!"!7[K:2**K @:O } :/O}* "::(:,/2, :,/2, WXK O:GZ( /z(``Aә}әPۘZӘә>әۙә>әۙ......>22c>!͎>!  ͎.!.;..![$: !BTc:(8*"> ͎>!w*$o͎:*Î:G*$Î:G!):G!:G!:!.,$(!*!$:g.&>-$>.$.}$ |әyә>ͤ8K o&))) @:##!dʹ RIGHTC!vʹ LEFTC!ʹ UPC!ʹ TUPC!ʹ DOWNC!ʹ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC!" ʹ STOREC!4 ʹ SETATR!F ʹ READC!W ʹ SETC!g ʹ NSETCX!y ʹ GTASPC! ʹ PNTINI! ʹ SCANR! ʹ SCANL>#. >.~#/ 00/7/ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%TxӨy2!S͗͸O!:# #!*G$>22ͦ!i%3>ә>әә@ә>vӘә!әۘv(֯ә>әx/Ϳ#>2>2>2>2ͦ!A!i%3^=>22)!&3C-BIOS Logo ROM!?6!!@̲ͥ!̲ͥ(g(#< G##x##W_x͕!ABx!%3G0Yxx(>.Yx0Y> Y> Y##4(OۙG$4(4(4(G _x0_|!_qx͕zx!@~(!%3#>!w} >!w>!wM>!w>!w'>!w>2>2!"""H!"J"t!N%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!Y"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0!y  # 2 O2!&C #&Dy7ȷy#v:0 ~Y#~!# :(:)PP:D!ʹ INIFNK!ʹ STRTMS*[> *[ v~#} !"ͤ:0͸:2a(:b 8*ʪb`*:$8"&w* !<> ͗: *:,0 5-"!"*:!0">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!`4(5(.y2(y2"22> > >>2:!<2:=2!:_w: bÎ*E:2G:b=2bs"&:W=O!bk+*E:G:b<2bs"&:=OT]#:O)8 (͐:(O͐ͭ! :> ͗7:::b`::bZ2_! **ͭ: !!~/w#!b>` 7    3 7LUj3E3KJlLM5YALBUCDHxyͶ8ͷ( > ͪ27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:>2? !3*"&}w4ʘ 0!22:?͸*"> 2bZ (*: &~(:b`*"> :27ɯ۪Ӫ۩۪Ӫ۩7!ʹ ISCNTC!ʹ BEEP"!)ʹ FNKSB!:ʹ ERAFNK!Lʹ DSPFNK::ͽʝæ!rʹ 7TAPION!ʹ 7TAPIN!ʹ TAPIOF!ʹ 7TAPOON!ʹ 7TAPOUT!ʹ TAPOOFG۪( ( ˧(Ӫ><<<>Ӡ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >'/!_~=(>濳_>>/!O ~>0 >'<=G(L>濳_>x( >Ѡ(>ɯ!ʹ GTPAD!ʹ GTPDLNF#~##o&N~2Ͷ/2*[ :=2 ! q#>2E۪O !yӪ۩w# !:!&8!& ݾh/ݦw8## y !(>2y((x >! > 5>x > $>!_( ~(V*w#} !["W:G$&T!4ʹ %TCALBAS["S//ۙ!F( Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә |D|D|D 0H8T|8T8T8T||DD|DD|@||P (D|$DH$UbD| |D|D|p@@|D|((HHB$$B|(H|T|TT0ll$$~$~$$>TT>>"T(%B8DD(2J|`` T88T|`` ~`` @8LTTd8088D8@|x8xDDD||@xx8@xDD8|D8D8DD88DD<8 @ ||  8D $_E $GۨẀ{z-%Wէ$|oG> $_Ez $GۨWYͅz-%W$zG(= !z$ۨÌz-%oG>U$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: JP Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-^\@[;:],./_abcdefghijklmnopqrstuvwxyz0!"#$%&'()=~|`{+*}<>?_ABCDEFGHIJKLMNOPQRSTUVWXYZ          쑓᚟ꗘ̱Ͱڹʷ׾Ķû†  *+/0123456789-,.p@{( !1ʹ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:ʹ BASIC statements are not implemented yet3!"}ʹ unknown@7D179}!!!~ʹ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx2.rom000066400000000000000000001000001314057512400227120ustar00rootroot00000000000000 Ò#ä$G$Æ$Ú".QW_qÅä5ÔÝæïø?r!4YÍ÷ )/ASCö fyËÝð-PbsÂÒãõ  2 C S e w É Ú [!$'6:>gy}Ó$,;2GQÍÓO #(##N#fi:G.:@G.˹xәyә!y80!x w_ۘqӘә>ә}ә|?әә>ә}ә|?@ә:0qQ xAO Ә :0_G xA<= :0qQ xA<= !:(:=:o:G.:!* qӘ x :G.:_:8*(%%:2*&2:8*(Q:W {Ә>ӘyӘ 0 zӘ!!!!:)0(:G.:G .ͣ ͣ:G.:G .">ͣ ͣ:G.:G .ͣͣͣͣͣ:G.:G .ͣ>ͣ>ͣͣͣ:G.:G .ͣͣͣͣͣ! F~#fo)GG.   &o)))0))[&ɇ*(_:>> 8 :(+0 * "!"!.[K:2**K @:O t :/Ot* "::(:,/2, :,/2, WXK O:GQ( /z(WWAә}әGۘQӘә>әۙә>әۙ......>22Z>!ͅ>!  ͅ.!.;..![$: !9KZvv:(8*"> ͅ>!w*$oͅ:*Å:G*$Å:G!):G!:G!:!%,(!*!$:g.&>->.%} |әyә>͛8K o&))) @:##![ͫ RIGHTC!mͫ LEFTC!~ͫ UPC!ͫ TUPC!ͫ DOWNC!ͫ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC! ͫ STOREC!+ ͫ SETATR!= ͫ READC!N ͫ SETC!^ ͫ NSETCX!p ͫ GTASPC! ͫ PNTINI! ͫ SCANR! ͫ SCANL>#.ͷ >.~#/ 00/7/Ϳ Ϳ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%LxӨy2!S͗ͯO!:# #!*G$>22͝!i%3>ә>әә@ә>vӘә!әۘv(֯ә>әx/Ϳ#>2>2>2>2͝!A!i%3^=>22)!&3C-BIOS Logo ROM!?6!!@̲ͥ!̲ͥ(g(#< G##x##W_x͕!ABx!%3G0Yxx(>.Yx0Y> Y> Y##4(OۙG$4(4(4(G _x0_|!_qx͕zx!@~(!%3#>!w} >!w>!wM>!w>!w'>!w>2>2!"""H!"J"t!N%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!Y"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0!y  # 2 O2!&C #&Dy7ȷy#v:0 ~Y#~!# :(:)PP:D!ͫ INIFNK!ͫ STRTMS*[> *[ v~#} !"ͤ:0͸:2a(:b 8*ʪbW*:$8"&w* !<> ͗: *:,0 5-"!"*:!0">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!`4(5(.y2(y2"22> > >>2:!<2:=2!:_w: bÅ*E:2G:b=2bs"&:W=O!bk+*E:G:b<2bs"&:=OT]#:O)8 (͐:(O͐ͤ! :> ͗7:::bW::bQ2_! **ͤ: !!~/w#!b>W 7    * 7LUj*E*KJlLM5YALBUCDHxyͶ8ͷ( > ͪ27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:>2? !3*"&}w4ʘ 0!22:?͸*"> 2bQ (*: &~(:bW*"> :27ɯ۪Ӫ۩۪Ӫ۩7!ͫ ISCNTC!ͫ BEEP"!)ͫ FNKSB!:ͫ ERAFNK!Lͫ DSPFNK::ͽʔÝ!rͫ 7TAPION!ͫ 7TAPIN!ͫ TAPIOF!ͫ 7TAPOON!ͫ 7TAPOUT!ͫ TAPOOFG۪( ( ˧(Ӫ><<<>Ӡ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >'/!_~=(>濳_>>/!O ~>0 >'<=G(L>濳_>x( >Ѡ(>ɯ!ͫ GTPAD!ͫ GTPDLNF#~##o&N~2Ͷ/2*[ :=2 ! q#>2E۪O !yӪ۩w# !:!&8!& ݾh/ݦw8## y !'>2y((x >! > 5>x > $>!_( ~(V*w#} !["W:G$&L!4ͫ %LCALBAS["Sۙ!' Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә  $_E $GۨẀ{z-%Wէ$|oG> $_Ez $GۨWYͅz-%W$zG(= !z$ۨÌz-%oG>U$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: EU/INT Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-=\[];'`,./abcdefghijklmnopqrstuvwxyz)!@#$%^&*(_+|{}:"~<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ     ˩ٿڷ冦椢ح궸  *+/0123456789-,.p@{( !1ͫ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:ͫ BASIC statements are not implemented yet3!"}ͫ unknown@7D179}!!!~ͫ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx2_br.rom000066400000000000000000001000001314057512400233750ustar00rootroot00000000000000 Ò#ä$G$Æ$!Ú".QW_qÅä5ÔÝæïø?r!4YÍ÷ )/ASCö fyËÝð-PbsÂÒãõ  2 C S e w É Ú [!$'6:>gy}Ó$,;2GQÍÓO #(##N#fi:G.:@G.˹xәyә!y80!x w_ۘqӘә>ә}ә|?әә>ә}ә|?@ә:0qQ xAO Ә :0_G xA<= :0qQ xA<= !:(:=:o:G.:!* qӘ x :G.:_:8*(%%:2*&2:8*(Q:W {Ә>ӘyӘ 0 zӘ!!!!:)0(:G.:G .ͣ ͣ:G.:G .">ͣ ͣ:G.:G .ͣͣͣͣͣ:G.:G .ͣ>ͣ>ͣͣͣ:G.:G .ͣͣͣͣͣ! F~#fo)GG.   &o)))0))[&ɇ*(_:>> 8 :(+0 * "!"!.[K:2**K @:O t :/Ot* "::(:,/2, :,/2, WXK O:GQ( /z(WWAә}әGۘQӘә>әۙә>әۙ......>22Z>!ͅ>!  ͅ.!.;..![$: !9KZvv:(8*"> ͅ>!w*$oͅ:*Å:G*$Å:G!):G!:G!:!%,(!*!$:g.&>->.%} |әyә>͛8K o&))) @:##![ͫ RIGHTC!mͫ LEFTC!~ͫ UPC!ͫ TUPC!ͫ DOWNC!ͫ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC! ͫ STOREC!+ ͫ SETATR!= ͫ READC!N ͫ SETC!^ ͫ NSETCX!p ͫ GTASPC! ͫ PNTINI! ͫ SCANR! ͫ SCANL>#.ͷ >.~#/ 00/7/Ϳ Ϳ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%LxӨy2!S͗ͯO!:# #!*G$>22͝!i%3>ә>әә@ә>vӘә!әۘv(֯ә>әx/Ϳ#>2>2>2>2͝!A!i%3^=>22)!&3C-BIOS Logo ROM!?6!!@̲ͥ!̲ͥ(g(#< G##x##W_x͕!ABx!%3G0Yxx(>.Yx0Y> Y> Y##4(OۙG$4(4(4(G _x0_|!_qx͕zx!@~(!%3#>!w} >!w>!wM>!w>!w'>!w>2>2!"""H!"J"t!N%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!Y"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0!y  # 2 O2!&C #&Dy7ȷy#v:0 ~Y#~!# :(:)PP:D!ͫ INIFNK!ͫ STRTMS*[> *[ v~#} !"ͤ:0͸:2a(:b 8*ʪbW*:$8"&w* !<> ͗: *:,0 5-"!"*:!0">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!`4(5(.y2(y2"22> > >>2:!<2:=2!:_w: bÅ*E:2G:b=2bs"&:W=O!bk+*E:G:b<2bs"&:=OT]#:O)8 (͐:(O͐ͤ! :> ͗7:::bW::bQ2_! **ͤ: !!~/w#!b>W 7    * 7LUj*E*KJlLM5YALBUCDHxyͶ8ͷ( > ͪ27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:>2? !3*"&}w4ʘ 0!22:?͸*"> 2bQ (*: &~(:bW*"> :27ɯ۪Ӫ۩۪Ӫ۩7!ͫ ISCNTC!ͫ BEEP"!)ͫ FNKSB!:ͫ ERAFNK!Lͫ DSPFNK::ͽʔÝ!rͫ 7TAPION!ͫ 7TAPIN!ͫ TAPIOF!ͫ 7TAPOON!ͫ 7TAPOUT!ͫ TAPOOFG۪( ( ˧(Ӫ><<<>Ӡ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >'/!_~=(>濳_>>/!O ~>0 >'<=G(L>濳_>x( >Ѡ(>ɯ!ͫ GTPAD!ͫ GTPDLNF#~##o&N~2Ͷ/2*[ :=2 ! q#>2E۪O !yӪ۩w# !:!&8!& ݾh/ݦw8## y !'>2y((x >! > 5>x > $>!_( ~(V*w#} !["W:G$&L!4ͫ %LCALBAS["Sۙ!' Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә  $_E $GۨẀ{z-%Wէ$|oG> $_Ez $GۨWYͅz-%W$zG(= !z$ۨÌz-%oG>U$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: BR Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-=\[];'`,./abcdefghijklmnopqrstuvwxyz)!@#$%^&*(_+|{}:"~<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ     ˩ٿڷ冦椢ح궸  *+/0123456789-,.p@{( !1ͫ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:ͫ BASIC statements are not implemented yet3!"}ͫ unknown@7D179}!!!~ͫ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_main_msx2_jp.rom000066400000000000000000001000001314057512400234030ustar00rootroot00000000000000 Ò#ä$G$Æ$Ú".QW_qÅä5ÔÝæïø?r!4YÍ÷ )/ASCö fyËÝð-PbsÂÒãõ  2 C S e w É Ú [!$'6:>gy}Ó$,;2GQÍÓO #(##N#fi:G.:@G.˹xәyә!y80!x w_ۘqӘә>ә}ә|?әә>ә}ә|?@ә:0qQ xAO Ә :0_G xA<= :0qQ xA<= !:(:=:o:G.:!* qӘ x :G.:_:8*(%%:2*&2:8*(Q:W {Ә>ӘyӘ 0 zӘ!!!!:)0(:G.:G .ͣ ͣ:G.:G .">ͣ ͣ:G.:G .ͣͣͣͣͣ:G.:G .ͣ>ͣ>ͣͣͣ:G.:G .ͣͣͣͣͣ! F~#fo)GG.   &o)))0))[&ɇ*(_:>> 8 :(+0 * "!"!.[K:2**K @:O t :/Ot* "::(:,/2, :,/2, WXK O:GQ( /z(WWAә}әGۘQӘә>әۙә>әۙ......>22Z>!ͅ>!  ͅ.!.;..![$: !9KZvv:(8*"> ͅ>!w*$oͅ:*Å:G*$Å:G!):G!:G!:!%,(!*!$:g.&>->.%} |әyә>͛8K o&))) @:##![ͫ RIGHTC!mͫ LEFTC!~ͫ UPC!ͫ TUPC!ͫ DOWNC!ͫ TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC! ͫ STOREC!+ ͫ SETATR!= ͫ READC!N ͫ SETC!^ ͫ NSETCX!p ͫ GTASPC! ͫ PNTINI! ͫ SCANR! ͫ SCANL>#.ͷ >.~#/ 00/7/Ϳ Ϳ | } >ӫ>PӪ<<w /w %$|(ټ8( .gxGyOyO0xG0}(%LxӨy2!S͗ͯO!:# #!*G$>22͝!i%3>ә>әә@ә>vӘә!әۘv(֯ә>әx/Ϳ#>2>2>2>2͝!A!i%3^=>22)!&3C-BIOS Logo ROM!?6!!@̲ͥ!̲ͥ(g(#< G##x##W_x͕!ABx!%3G0Yxx(>.Yx0Y> Y> Y##4(OۙG$4(4(4(G _x0_|!_qx͕zx!@~(!%3#>!w} >!w>!wM>!w>!w'>!w>2>2!"""H!"J"t!N%!"!"!"! "!"!"!8"!"! "!"!"!8"!"!"!"!8"!Y"!u"]!"c!u"i>2\2b2h>'2> 2:2>2>2>2>2>2:2*" >!Y"2!ۨW?OӨ:/_2G:/ {P2G:/ {{/2zӨp#y@O0!y  # 2 O2!&C #&Dy7ȷy#v:0 ~Y#~!# :(:)PP:D!ͫ INIFNK!ͫ STRTMS*[> *[ v~#} !"ͤ:0͸:2a(:b 8*ʪbW*:$8"&w* !<> ͗: *:,0 5-"!"*:!0">2>2:!0<:!<2:= :=2:2:=2:!<2G< 2!`4(5(.y2(y2"22> > >>2:!<2:=2!:_w: bÅ*E:2G:b=2bs"&:W=O!bk+*E:G:b<2bs"&:=OT]#:O)8 (͐:(O͐ͤ! :> ͗7:::bW::bQ2_! **ͤ: !!~/w#!b>W 7    * 7LUj*E*KJlLM5YALBUCDHxyͶ8ͷ( > ͪ27ӑ>Ӑ/Ӑͻې>0/!w  w@8 `0@P7:>2? !3*"&}w4ʘ 0!22:?͸*"> 2bQ (*: &~(:bW*"> :27ɯ۪Ӫ۩۪Ӫ۩7!ͫ ISCNTC!ͫ BEEP"!)ͫ FNKSB!:ͫ ERAFNK!Lͫ DSPFNK::ͽʔÝ!rͫ 7TAPION!ͫ 7TAPIN!ͫ TAPIOF!ͫ 7TAPOON!ͫ 7TAPOUT!ͫ TAPOOFG۪( ( ˧(Ӫ><<<>Ӡ{ӡӠۢɷ>(<ӫۨӨۙO۪Ӫ۩ͧͬ:d >'/!_~=(>濳_>>/!O ~>0 >'<=G(L>濳_>x( >Ѡ(>ɯ!ͫ GTPAD!ͫ GTPDLNF#~##o&N~2Ͷ/2*[ :=2 ! q#>2E۪O !yӪ۩w# !:!&8!& ݾh/ݦw8## y !(>2y((x >! > 5>x > $>!_( ~(V*w#} !["W:G$&L!4ͫ %LCALBAS["Sۙ!F( Ә x !~Ә# x >ә>@ә!%~Ә#~ Ә |D|D|D 0H8T|8T8T8T||DD|DD|@||P (D|$DH$UbD| |D|D|p@@|D|((HHB$$B|(H|T|TT0ll$$~$~$$>TT>>"T(%B8DD(2J|`` T88T|`` ~`` @8LTTd8088D8@|x8xDDD||@xx8@xDD8|D8D8DD88DD<8 @ ||  8D $_E $GۨẀ{z-%Wէ$|oG> $_Ez $GۨWYͅz-%W$zG(= !z$ۨÌz-%oG>U$W|gG>$_/OzG}$G>U$GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘ӨC-BIOS 0.28 cbios.sf.net Localization: JP Init ROM in slot: Cannot execute a BASIC ROM. ERROR:MEMORY NOT FOUND.CALLED NON EXISTING BASIC.STACK ERROR. No cartridge found. This version of C-BIOS can only start cartridges. Please restart your MSX (emulator) with a cartridge inserted.0123456789-^\@[;:],./_abcdefghijklmnopqrstuvwxyz0!"#$%&'()=~|`{+*}<>?_ABCDEFGHIJKLMNOPQRSTUVWXYZ          쑓᚟ꗘ̱Ͱڹʷ׾Ķû†  *+/0123456789-,.p@{( !1ͫ > .z/{/ROMBAS>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:!I:ͫ BASIC statements are not implemented yet3!"}ͫ unknown@7D179}!!!~ͫ unknown@7E14openMSX-RELEASE_0_14_0/Contrib/cbios/cbios_music.rom000066400000000000000000000400001314057512400221400ustar00rootroot00000000000000ABAPRLOPLL%AMAuAÝAAAB!0A#.HB>.~#/ 00/7/PBPB|`B}`BopenMSX-RELEASE_0_14_0/Contrib/cbios/cbios_sub.rom000066400000000000000000000400001314057512400216110ustar00rootroot00000000000000CD~|}!8*ME sygÊÅ× ×é ú é ó`åPòf%u n M aü|ÌÞðÒ%6HOa~O #(##N#fi>#.">.~#/ 00/7/**|:}:Wo|oG>͉_E͉GۨẀ{zīWէo|oG>͉_Ez͉GۨWYͅzīWozG(= !ۨÌzīoG>U W|gG>_/OzG}gG>U6GzgۨoӨ:/O2}Ө!zo|gywۨӨW_oۨO?Ө{o|&))@0|/g:/_2oyӨzO}! wzGۨO?Ө{2yӨzO! sӨ^ӨszӨӨ͘Ө:G:@G˹xәyә!y80!x w0ۘBӘә>ә}ә|?әә>ә}ә|?@ә:0B͈ xAO Ә :00~ xA<= :0B͈ xA<= !`s [  !:0˾22!xQ >ә>ә!###>ә>ә:(:=:o:G:!* BӘ x :G:͐:8*(%%:i *&i :8*(͈ :W {Ә>ӘyӘ %0 zӘ>2222:2>22*""*:)8!"$*"(*"&\ ͏ >22>22*""*"$*"&*"(\ :222P͛͞ >2*""BӘ< *"$*"(*"&22͛ͽ >2*""B Ә< *"$*"(*"&22Ͳ͛ :)0(:G:G  :G:G "> :G:G :G:G >>:G:G ! F~#fo)GG   &o)))%0))[&ɇ*(_:>> 8 :("0 * "!"u [K :2**K @:O ͫ :/Oͫ* ":4 :(:,/2, 4 :,/2, WXK O:G"( /z(((Aә}ә~ ͈ۘ Әә>әۙә>әۙ>22͞ >!V>!  V!*!\;![$*!\>2*""BӘ< *"$*"(*"&:G:G >> >!6#6͛ͽ >2:G: G !""!x"&!v"(22 ͗ >2:G:G !""!x"&!v"(22 ͗ >2: G:G !""!"&!"(22 ͗ >2:G:G !""!"&!"(22 ͗ : !} ɏ  :(8*"> V!"}!wɯ*$oV:*V:G*$V:G!):G!:G!:!l ,b (\ !*\ !$\ :g.&\ >-b >.b l }b |әyә> 8K o&))) @:P#! RIGHTC! LEFTC! UPC! TUPC! DOWNC! TDOWNCK[SCALXYCS*))))).>2,y( G>2,yO "*MAPXY:,**FETCHC!`STOREC!rSETATR!READC!SETC!NSETCX!GTASPC!PNTINI!SCANR!SCANL!DOGRPHu :2*"f ":*g"hCjCl!@:8:2n:y>ә>ә!@:8:ӛ #!~MAPXYC!TRIGHT!TRIGHT:WCfSh*B"j!"l2o:2n*:g"hSh>2o:2j*"f:py*0R#"l:WSh*0R#"jSf2o:2n:y!Zn CLRTXT*":G: :G:G:O: !*()o>GE '͈  !\~Ә#Ӛ'~  ۘӚ'O ~ ۘGۘO'zO ͈ BӚӘ{ӚӘ:> 8> ә>ә!bx7z7!:: $B!RKj[l~y*bN#F#Cj^#V#Sl( (NC2nB~y>ә>ә> G(x(ůCӛyO#NB*fKj[lq#p#s#r#( (~>yB>  G > COq#> 8!BLTVD!BLTDV!BLTMD!0BLTDM!ANEWPADͳͼ!ZKNJPRT> ӴyG۵ӵyӴ۵G> ӴyG۵ӵyӴxӵopenMSX-RELEASE_0_14_0/Contrib/codec/000077500000000000000000000000001314057512400171065ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/Contrib/codec/Win32/000077500000000000000000000000001314057512400200105ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/Contrib/codec/Win32/README000066400000000000000000000004521314057512400206710ustar00rootroot00000000000000The ZMBV codec was written by the DOSBox project, see http://dosbox.sf.net/ - the source code is in their CVS repository. This binary has been built by the author, for the openMSX project. Thanks guys! Copyright (C) 2002-2007 The DOSBox Team It is licensed under the GNU GPL version 2 or later. openMSX-RELEASE_0_14_0/Contrib/codec/Win32/zmbv.dll000066400000000000000000003300001314057512400214570ustar00rootroot00000000000000MZ@ !L!This program cannot be run in DOS mode. $r]u!]u!]u!z!Lu!z!u!z!Tu!]u!u!z!zu!z!\u!z!\u!z!\u!Rich]u!PELE! W0nFhdHT Pha@.text `.rdatav^`@@.datapp@.rsrcH@@.reloc` @BD$ =@T$wptXH $HD$P D$t P6!QL$/!T$D$L$RPd#=P$pT$D$L$RP#L$QL$R'D$PQL$ z#T$D$L$RP#L$h'L$QL$R%D$PQL$ R(T$D$L$RP%L$QL$R 'D$PQL$ &L$&T$D$L$RP$ $L$ƒu؃PL$ƒu؃PT$D$L$RPL$QL$Rt '3=@sT$D$ %$$,<$$U$$$1 YmG-  -̋D$} QSU3VWAA݉t$;Fƙ3+;t Ǚ3+;u @t@|;~ċt$;~+݃t$}_^][YËD$T$Dj8 hl@HǁLTjQ?̋D$T$D j8@HǁLThlQ@ QSUVW7HPD39\$L$~0L$;@} QL$ RV蠀 ;\$|_^][ỸD$ SVD@ʃL$ \$KUL$ W$H|$LPP$3? /BA@D;|3 oыʃʁف|ʃʃ D;|\$3I oыʃʁفʃ ʃ D;|\$33Ʌ~-WWD;|D$l$ۉ\$k_]^[4|}JV0W3;tPρ0;tP趁 ;tP蝁 $;tP脁$_^V3j8P0 $TPO ^̃SVDD$(3ۃ<w$džPdž<džP džP@ PHWP(蘁(P膁(Q t$D|$< ;ӉT$ t@|$4U;ӉT$D$tl$3ɉ,  Q90l9 `9$T;L;\$D$D$ I3҅3\$ \$($H\$0\ (\$$to;u 0\(0l$4l|$t\$l$9\$tl$80L$4l ;|\$(l$D$L$8L$;ʼnD$H(RjP( QjR~($PjQ~ L$T$]_L^[ ]_^2[ ^2[ I ̋D$SU;LtjjP!u][ \$ T$Vt$W3\$}U]u 48EE XXLH@@E9<t$;t@h@WR} 39<~rA $d$4$L$ H 244$ 4H4$ L$ 4˃;<|TU4_^][<;AT$;5@L$r:;9ustY29+u<+ӅtA29+u(+Ӆt-29+u+Ӆt2+tt$  t$ 339<~}L$A$P2Q4$4Q24$4P24$4;<|<L$T$PQR]x _^][̃H4$ЉT$D,SDP3ۃ;Ӊ4\$$0UVW\$43ۋ0l$4E<D$H‹U;Ӊl$,\$D\$(\$|$ D$8T$$~T+ljD$@T$u;~0Ǎ|$@<+߁)\$u܋|$ H3ۃl$|$ u9D$D$D$ @\$@qt$ $It$|$ c|$XF>H\$HD$Å҉D$LD$~]t$Pt$8z+\$< \$<~5D$S0(+)l$ul$,D$LT$PT$u|$T$$l$ 3ҋ؉\$~aut$t$8+T$<I|$~3T$ÍI0(++ul$,T$$\$Hl$<\$u;|$}D$p|$t$DD$(D$@D$ ;D$@T$D\$(|$Tt$0ۃ|$w\w wHD$(u‹փ}T$DD$@~g]3~@+l$Pl$P.24$+4l$,];|ЋT$DHƋt$@;uT$Dt$@|D$0D$4 ;,D$0_^][H̃H4$ЉT$,WDP3;׉4|$]SUV|$430l$4U];ߍPT$LVl$<|$0|$H|$D$$T$8\$(~cH+Љt$ T$D\$U;~5$t$D48+)|$u܋t$ D$$3l$D$$u9T$T$D$$@|$DQT$|$$u|$jH|$LzۍxD$ D$PD$Ut$Tt$8{+T$@T$@~5D$0(+)l$ uD$Pl$+ $I8$6$6F.F"FFL$D$WxD$tD$T$hUjQL$$Q FC3D$ 9n~#IT$L$ Q j)|$ ;n|D$D$L$A_tS]^3[ C]^3[ ]^[ 555)575UKV1;0ust]1(+uEtF1(+u.t/1(+ut1+t3^]t2ÅtufuK;OuS;WuܰS\$W|$1_[Vt$WNU9;8ust]9(+uEtF9(+u.t/9(+ut9+t3]t _^D$u _(^ H IH_f@ (f@H@@ @$3^VWt8t$ t0FPFRPNtNQ_3^_^_^̸Vt P&`3^jh dPVWp3PD$ dt P_|$L$ juL$ d Y_^ h`D$ D$t 3D$uL$ d Y_^ OWQRHL$ d Y_^ jh dPSVWp3PD$dt P^|$$\$ iuL$d Y_^[ h_D$$D$t '3D$uL$d Y_^[ KSQRL$d Y_^[ VpWx>xpP :p_^VFNWx;vt5@N WPQ{ZF~ x~)~F)xv ~uVV_^VW|$ wL$ ?u F=u |uGG_^Ã*V(SU>T$N(9FjjjOG0NF^FV^FN^Fn V*^FN^FV^FN^FV^ Nu} |3V^FN ^FqP$H,҃ɃыHɃыHɃу8NЈ)^FVRN^NIFV ^VRFN^NIFV ^ Nu} |3V^NFI V ^FxNt!@V^NIFV ^NVz,tFQO0PQM G0F FEN0 9};|}3҃3 ȃ~lt B+ˋ+ȋFq~ltO2rO0ijjjN- G0~EFx@9F NslIF;F u6Vz,t;v+PFO0PQL G0,F;F t)VR^ n(FF FP9V rFx,tF;vV+PG0RPwL G0NV ;QuF FI~IFxVF;F u6Ny,t;vO0+PFPQL G0eF;F t!N ^[ ͉N Nnu݋Fx,tF;vN+PʋW0QRK G0u ^ F[~[Fx$VF;F u6Ny,t;vO0+PFPQaK G0F;F t"N ^[$ N Nnu݋Fx,tF;vN+PʋW0QRK G0uFg~gu[Fx,tKN;N v2FP;V w5W0NnW1FNjjnjJ G0Fq~tu5F(][_3^Ã\$u!;\$tG][G_^Ë\$F=ut G][O_^Ãu~tu=@SVЃtuF:1;uW;u VC7jjjVlBu#NLVDfDJFLVDLQjRV F][_^ÃW0NFnW1FNnW2FNnW3FNnWFNnW FNnW FNnW FNnO2O0F~؉F]39F[_^Ã][_F(3^áGG_^Vt$FWx*t)Et$It[tgtqtt_^Ë@t N$PF(PуVBDt N$PF(PуVB@t N$PF(PуVB8t N$PF(PуVF(N$RPу3q_F^ø^̋FW;vu3_+ljFF@uV0WQR'uN0WPQKGF0 D$WRP7Q>~ _̋F,NLVDWF<3f|JFLVDLQWRhT@ ~l~\~t~h~HV|FxF`_̃O|WlSUoxVL$O8t$w,;v+ցT$D$;T)T$)T$rl$Wt9T$vT$W8\$8*\$8\*:Z:YY:u_Y:uRY:uEY:u8Y:u+Y:uY:uY:u;r+ց;Ս~;T$Gp},\  \$T$W4#ЋG@P;D$v l$ Gt;w^][̋N8FlUl$):WQ:PP:u_P:uRP:uEP:u8P:u+P:uP:uP:u;r+|Nt;npv _]ø_]S_,UVo<+otGlO, +;r_G8S QPNWLGD)_p)_l )_\ PA;r+3fuO@Ӎ YA;r+3fu7~tSWtWlW8RGtWtr GlO84OXGHN3#GTGHs z-^][VW|$ G ;sGtwGtGlO\WlGt1t;r9+ЅɉWtGl|W83j+PRWG>GlG\GytGO\WlG,+-;r|G83jRPW>OlO\zO_3^Ët$tO\|G833҃RWl+RPW=GlG\39Au_^Ã_^DSUVW|$3Gt=s#Gt=t$s~rIGHOXWlw4O8L3#GTODGHfA#W@frOl#O4W@,JGHODfWlfAtBGlO,+Ł;w0ttu;uUUG``8fWlf+WpG`ʋf V,2%ffs # $f 3+9G`)Gt;OtwjreG`_lWlO8D oHOXOD3#GTo4#W@GHfAfjOl#O4W@,JGHODfWlfAG`uGlGlO8OXG`GHR3#GTGH^GlO8fQ f3+9Gt_lO\|G83Wlj+RPW:GlG\y\_^]3[ËO\|G833҃RWl+RPW:GlG\39Au_^][Ã_^][DQSUVW|$D$Gt=s#Gt=t$s[rMGHOXWlw4O8L3#GTODGHA#W@frOl#O4W@JOHWDD$GlfJWpO`WdT$һOx_`tq;sgGlO,+;wU;ttu;uR G`G`w9tuWl+Wpv_`Gxp9G`gfWlf+WdGlOttGxf+ʋf S,%ffs # $f Gx+39+OtGxolWl;wOGHOXo4O8L3#GTODGHA#W@fjOl#O4W@JOHWDD$GlfJGxuolۋGlGhG`W\|O83j+PQW7OlO\z_^]3[YÃhGlO8DfQ f+9u/O\|G83Wlj+RPWF7GlG\FolGtyTolGtohhtJWlG8DfJfGhO\|G833҃RWl+RPW6GlG\39Au_^][YÃ_^][DYSVW|$3;tyw;tr9_ tm9_$th___G,FFF;É^}؉FFɃSqSNSu: G0V^(/p_^3[_^[̋D$3;U81|$$8W|$ ;u_]9O Ou G `O(9O$uG$|$uD$S\$;}3 ~D$ }|$rKf|$ [|$$Pu W(G VhjRЋ wn˽^0\$$MN4KNP>FLFTFn,VXW(G jURЋN,F8W(G jQRЋNLF@W(G jQRЉFDKjO(W PQҋ0~8FV tN~@tH~DtBt>PHL$T$(WF$^[_]FGWG^[_][_]ø]̋D$L$ T$PD$QjjjjRP ̋T$3;tMB;tFHJJJB0HH H H(H,H0H8H<0@HlHPHL3ø̋D$ W3;81|$8Vt$ ;9~ ~u F `~(9~$uF$F(N h0%jPу ;u^_ËL$;ωF}x0P}QwVH$x4^_ËN$PF(Pу~^_ø_̋D$ L$T$PQjR@Lh@T @Ph@XUVs39n4Wu)N$S K(jPQ҃ ;ʼnF4u _^]9n(uN$n0n,F(+{F(;r"K V4P+QRV@F( _n0F,^3]+F0;vK V4V0U+QR&@ +t"C N4W+PQ@V( ~0_V,^3]n0N0F(;uF0N,;s͉N,_^3]̋D$,WLxAx 78u x(? u H PS_8U(L$$HVw 3ۉG@\$3G@D$;v‰T$L$;vD$b L$T$(QUR6D$ )D$)D$(D$4T$ )G@ s$$ E؃T$r܋˃ÉO`˃`GdO\\$GhOh;O\sUs$ E؃T$r܋GhE˃fLGpGhOh;O\\$rhs+3 $WhUfDWpOhhr獇0OlGLRGTPQjGpPjz0T$(D$0t L$@As D$@@c GhGdG`9Gh8OTOL#Ë;ΉD$vD~ EOTظOLT$#Ë;ΉD$wsW;s*$ E؋D$;T$r̋Gh+fL$fLGpGh\$_fL$fuk̍A;L$$s*EL$$؍A;T$r֋Gh+\$oLGnÃL$$D$f̉L$$uIA;s*OEL$$؍A;T$rÃD$IA;s,EL$$؍A;T$rà D$+D$D$$OhȋGdG`\$;|$tD$$Ohl$fDOpGh|$uGdG`9Gh? 0OlRGLGTPQO`QWpRj -D$0t4D$@T$@L$@AD$@@WlOlWPRGXPQO`GdPTOpRjR-T$(D$0tD$@@Ke|$r[D$@T$L$(PT$,H L$R(HP_8w<.(D$HPH (@_8w;s$E;wHT$r܋OH#G@+OX#ËȋGP;ΉD$vK$$EOXظOPT$#Ë;ΉD$wL$4ɉL$$L$$D$L$$#L$ȋGPL$4D$;]EL$ȉD$$L$$T$#L$OPD$D$$;wL$D$++@L$$\$tD$@@`ODGHGHtB;s$E;wHT$r܋OH#GD+\$O,+L$L$,9ODvD$@@@|$iL$,+L$GD;v<+O0;D$v+O4O(D$+ O4+O0D$L$$O@;L$4vL$(+ȋG@L$$D$4D$L$;vD$+ȉL$L$4+ȋD$(O@L$$ D$$l$u@D$(eZ|$D$(O@l$D$(/ s*tE؃ T$\$r؋D$,+D$L$@AGD$,t/L$(WP+ȃQRt"L$LT$G A0D$D$,u%3Ɋl$;GtD$@@(d3ۉ\$3 s-IE؃ T$\$r;_tSL$@Aw^][_,ËD$@L$(H L$(HPw<^]_8[_,33D$0D$0D$@L$(H L$H(P(_8w fT$tvt$ I6t$tR\ Ml$;L$$l$,.|;tt +l$,fl$t$u|$t$ ҉t$ u_^][ ̃ SUl$VWx3҅D$u fD\$D$Nj|$?;};tn;} f| 0t;D$tf| f   f f 3҅D$u ;u  D$)\$p_^][ ̃SUjV3WD$l$u T$\$ \$T$;T$$\$t$};;I~ +;~[| Hf PhHPh*fL:T$$ft$f| ff +t$f;T$~ +;ˉ|$~[| Hf x9hHxh*fL$L ft$f| ff |$+t$ +;ˉ|$~Z Hf x9hHxh*fL$L ft$f ff |$σ~SHf x9hxHh*f򉘼f f   +;ˉ|$~Z Hf x9hHxh*fL$L ft$f ff |$σ ~SHf x9hxHh*f󉘼ff  +;ˉ|$~Z Hf x9hHxh*fL$L ft$f ff |$σ ~PHf x9hxHh*fff L$3ɉT$u ;u  D$)l$ G_^][Q S\$UVW~^t$Hf PhHPh\$ *ffT$f  ~_t$H\$f PhHPh\$*ffT$f  ~[sH\$f PhHPh\$*f􉐼fSf 3I D~\~ Hf PhHPh\$ *f󉐼ff~ ff ;mL$L$_^] [̃ S\$U39VW9$,J4L$|+;~\4H\$f P@HP@\$*fL:ffff r%+;ˉ|$|$ T$~cHf P@HP@*fL$T T$ffff |$ω<\$ tz+4&+;~QHf P@HP@\$ *fL:f f ωs # $L$$T+;ΉT$~cT$$4Hf P@HP@\$ *fL$T ft$$f4ff ʉ4X~+,&+;~UH\$f P@HP@\$*fL2f f ΉL$;+;~sH\$ f P@hH\$ )@*fL:_f^][ fff _^][ 3f9u  | Ifyf9u5fyu?fyuIfy uSfyu] |ȋ3Ƀ J,Ë3Ƀ J,Ë3Ƀ J,Ë3Ƀ J,Ë3Ƀ J,Ã3Ƀ J,3V ƃ^̋Su9PH@HP@3ɉf[Ã|)HPf@f[̋SV~=PHPpHp3^f[3;~pP2@^f[SVWًt|$ǀt:HPxHP<xPUhш *xhPш,*x]tHP+߉\$\$xu_^[̋T$ | 0 3 ǂ (p$ ǂ, PAl$TQAuӋl$TtQvAl$T$;;t$,T$H+HNPHL$TL$Tw̅tPv@냋L$PT$l$A@3D$P@` t T$ D$P@xL$T$++ϸL$P+Ճ#؍EFA D$,+AD$Qx<_^]X8[<́p3ĉ$$$S$U$V$D$3l$P\$8T$HD$TD$XD$\D$`D$dD$hD$lD$pvLEfDLTLLT;rD$f|LTus;L$vL$uAfL$ D$ @D$ D$  ^]3[$3Čþ$f|tTu+Dž~;T$ rt$HD$($D$Du|$(֋t$< D$DL$$+T$4fLM|$<*ÅD$@D$fD$tVt$$tL$@#;L$4tD$73ۉD$D$ЋˋL$ Jtut H#ȋuT$(L$LT$3$_^][3ČUWVu M};v;r=܉tWV;^_u^_]X ur*$Ǻr $ȕ$Ė$Hؕ(#ъFGFGr$I#ъFGr$#ъr$IxphDDDDDDDDDDDDDD$Ė̖ؖE^_ÐE^_ÐFGE^_ÍIFGFGE^_Ðt1|9u$r $P$IǺr +$T$PdF#шGr$PIF#шGFGr$PF#шGFGFGV$PI $,4GDDDDDDDDD D DDDD$P`hxE^_ÐFGE^_ÍIFGFGE^_ÐFGFGFGE^_ ̋T$ L$ti3D$ur=܉tQ Wr1كt +шuʃtt uD$_ËD$Vjhpp H^H, VH D$tV(Vju P$ދF~ E FEFEP$E tM4Ej<@ D=8{(Ysu (`' r&} }n%| ##|jYu }"3;u59=} }9=pu"9}u{"&(juYhj;YYV5q5$7YЅtWVYYNVEYmuWEY3@_^[ j hd)]3@Eu 9}e;tu.HtWVSЉE}WVSEWVSrEu$u WPSrWjSHtWjSЅtu&WVS~u!E}tHtWVSЉEEEE PQ(YYËeE3(Ã|$u*t$L$T$ Y j h d(eu;5w"jv,YeV4YEE E(js+YUl$S,VW395u8jJ7hYYu;t3@Pu US;Yu;u3GWV5Ӌu&9j _t UYu8888_^[]UxY8 3]j h@dz'utu=uCjc+YeV+YEt VP+YYE }u7u jQ*YVj5$uS84P 8Y>'U}uu }MfofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fpIuu}]U}u]] ÙȋE3+ʃ3+ʙ3+3+ uJu΃M;t+VSP' EMtw]U +щU+ى]u}MES;u5كMu }MMMU UE+EPRQL Eu }MʃE]u}]Ã%؉)7؉3U}}M f$ffGfG fG0fG@fGPfG`fGpIuЋ}]U}E3+3+ucsmuB~uWt?s9t+>MOCt#u$u uuuu V} u uEPEPVu WE;Es[S;7|G;wBG OHtyu*X@u"u$u u juuuuuEE;Er[_^U,M S]C=VWEIIM|;| ucsm9>~ )F;t=!t ="~J8u*jVEa-YYu 9>u&~u F;t=!t="u ~uV u3Yu\39~GLhpu F;7|junYYEPME`IheEPEXIucsm9>~~F;t=!t ="e} EPEPuu WE;EE9;G|GEG E~lF@ XE~#vPuE uM9EME}(u$]u EuuuuVu @uE]}}t jV7YY}%=!VY}$MVuu u$kujVuu v]{ v&}u$u uSuuu V t_^[Vt$XI^USVWO EMcsm"u ;t&t#;r @ Aft#x}u}jPuu jx u#ց!rXxtR99u2yr,9Yv'QRtu$Vu uPuuu Q҃ u uu$Puuu Q 3@_^[]V5q5Xօt!qtP5qЅthITthpIPPt t$ЉD$D$^jYV5q5Xօt!qtP5qЅthITthIPPt t$ЉD$D$^\5qXu5 yYP5q`áqtP5(TYЃ qqtPd qj hehITEuF\@q3G~t$hpIPPӉhIuӉ~pƆCƆKCvFhPhj lYeE FluvFlvl,YEj [YVW45q5qXЋuNhjYYt:V5q5$*YЅtjVYYN V7Y3Wl_^VwujY^jheuF$tPYF,tPYF4tPYFYj]YV tЃ;t$r^Vt$3utу;t$ r^ËL$V3;u/VVVVV83jX^á4;tډ3^ËD$V3;uVVVVV3jX^954tۋ @3^Ã=ЉthЉ3Yt t$ЉY2h0h6YYuTVWhxƿ;YstЃ;r=ԉ_^thԉ3Yt jjjԉ3j hHf jYe3F95ttk5pEl} uG5ȉ5ĉYYEtm9}r Eth84FYhD<6YE}u(5tjqYu3F}tjXYn jjt$ % jjj VAVV4VE0Vz4Vj4VZ2VK Vh($q^VW3t$ fYu'9xvVx;xvuɋ_^VW3jt$t$4 u'9xvVx;xvu_^VW3t$t$5YYu-9D$t'9xvVx;xvu_^jThhf 3}EPEj(j ^V@YY;5)@@ x@$@% @& ( ;rf9}E;8X;E;|3FRj(j YYtM  &@@ ``$@% @& (;rF9=|=e~mEtVtQtKu Qt%uN@ uNhF P1YYt7F N@Cg5|33@ËeEVW>t1t G P(;r6&Y|_^S39̉VWuY*5}3;u<=tGVYt:ujGW;YY=Ttˋ5}U@V{E>=Yt/jUn;YYtJVUP t SSSSS*,8u5},}3Y]_^[5TTUQMS39EVU t ]EE>"u39E"FE<tBU PF/4Yt} t M E FۋU Mt2}u t utBe>< t< uFN>}t EE3C3FA>\t>"u&u}t F8"u 339EEtIt\BuU tU}u< tK< tGt=Pt#J3Yt M E FM E  '3YtFU FVtBU ME^[t U S39̉VWu'hVS;É5dt8EuuUEPSS}E =?sJMsB;r6P;Yt)UEPWV}E HH5L3_^[QQSUVW=33;j]u-׋;t "4xu ţ;u׋;u3f9tf9uf9u=SSS+S@PVSSD$4׋;t2U;YD$t#SSUPt$$VSSׅut$Y\$\$VX;t;u;p8t @8u@8u+@Un;Yu VDUVW V_^][YYVWDcDc;NjstЃ;r_^VWLcLc;NjstЃ;r_^UQQVE3PuuYt VVVVV'EPYt VVVVV'}^u }r3@jX39D$jhPu3}u$hNYu5%3@U3=uTS$W39-~1V5hUv6U5ӃG;=|^5U5_[5-]UQQVNuu DMV\qW}S99tk ;rk ;s99u3t Xۉ]uu Du `3@N`MM N`H q=q;}$k ~\d9=qqB߃ ;|]=~du Fd^=u FdN=u Fd>=u Fd.=u Fd=u Fd=uFdvdjY~d`QӋEYF`[_^øcsm9D$u t$P|YY3hd5D$l$l$+SVWp1E3PeuEEEEdËMd Y__^[]Q̃S\$ UVs35pWD$D${t N3 8 N F3 8D$(@fk L$0T$D$L$ St^DmLɍ\D$t.D$|DLD$ù|$t$t N3 8N F3 8sD$_^][D$ƋL$(9csmu*=PIt!hPI%tT$(jRPIL$,-D$,9h thpWՋ-D$,L$H t N3 8N V3 :KL-{ PhpW˺c-UpeeSWN@;ǻt t Уp`VEPu3u333EPE3E3;uO@ u 5p։5p^_[VW3t~t WW&Yr|ܾq_t ~uPӃr|^[UE4q]j hf3G}39ur j h7YYu4q9tnjY;u 3Qj YY]9u,hW%YYuWYx ] >WYE EOj *YUEV4q>uP$Yuj7Y6^]h@j5,uËL$%%3 @Ë kT$+P r ;r3UMAVu W+y iDMIMS1UVUU] utJ?vj?ZK;KuB sL!\D u#M!JL! uM!Y] S[MMZU ZRSMJ?vj?Z]]+u]j?u K^;vMJ;։Mv;t^M q;qu; s!tDLu!M!1K!LuM!qM qINM qINu ]}u;M ыYN^qNqN;Nu`LM Ls%}uʻM DD )}uJM YJꍄ ED0E 5h@H SQ֋  P@ @HCHyCu `xueSjp ֡pj5$ k+ȍLQHQP-E ;vmE=[_^áV5W3;u4kP5W5;u3x5k5hAj5,;ljFtjh hW;ljF uvW5$뛃N>~F_^UQQMASVqW3C}i0Dj?EZ@@Jujhy hWup;UwC+ GAH@PǀIuˋUEO HAJ HAdD3GFCENCu x!P_^[U MASVuW} +Q iDMOI;|9M]UE;;MI?Mvj?YM_;_uC sML!\D u&M!ML! uM!YO_YOyM+M}}M O?L1vj?_]][Y]YKYKY;YuWLM Ls}uϻM DD }uOM YO U MD2LU FBD2<38/] )uNK\3uN?] Kvj?^EuN?vj?^O;OuB st!\Du#M!NL! uM!Y] OwqwOquuuN?vj?^M yK{YKYK;KuWLM Ls}uοM 9DD }uNM yN ED3@_^[UMkMSI VW} M 3U S;#U# u ;؉]r;uS;#U# u ;ى]r;u[ {u ];r;u1 {u ;ى]r;u؅ۉ]u3 S@YKC8tCUt|D#M# u)eHD9#U# uEUiDMLD3#u#Mj _G}MT +MN?M~j?^;J;Ju\ }&M|8Ӊ]#\D\Du3M]! ,OM|8!]u ]M!K]}JzyJzyM yJzQJQJ;Ju^LM L}#} u ;οM |D)} u N {MN 7Mt LMuэN L2uɍy>u;uM; u%MB_^[QS\$ VW33;rtG|wUj"Y1j"Yu =}?hOSUs t VVVVVhVju&hpOhV1 t3PPPPPkV@Yu0utVxY^3j hgOt|Fpt"~ltpluj Ybj YeFl=viEEj Yu-t"t t Ht3øøøøSUVWU3^WS~~~ 3~v +Ɗ  CMuANu_^][U$dp3ʼnSWEPv3@;rEƅ t+];w+@P j RN CCujv EvPWPjj3SvWPWPWv SDSvWPWPhv S$3LEtLtL Ƅ@;rME3)EUЍZ w Lр wL р A;rŋ_3[聲Ŝj h(gt|Gptltwhuj Yj Yewhu;5@zt6tVpuvtVY@zGh5@zuVhE뎋uj ]YËD$VF ucqFHlHhN; vt t|HpuF;@ztF t|HpuFF@puHpF  @F^US3SMl4u48]tEMapEDzD;FG;v}FF>uыuE}urlj{C/jC CLzZf1Af0A@@JuL@;vFF~4C@IuCC Ss3{954M_^3[0jhHgM}_huE;CWh Y؅Fwh#SuYYEuvhpuFh=vtPvY^hS=hFpt|j YeCDCHC L3E}fLCf E8@3E=} L8x@3E=}@y@5@zpu@z=vtP轵Y@zSE0j LY%u vtS臵YKeE8Ã=̉ujVỶ3U$X(p3ʼn8{Vtj YmtjoY8{]|ux}tfff]pfElfehfmdE@jPEjPtE EЍEjE@uEHEPDjUSVWUjjhu]_^[]ËL$At2D$H3BUhP(RP$R]D$T$SVWD$UPjhd5p3PD$dD$(Xp t:|$,t;t$,v-4v L$ H |uhDID_뷋L$d _^[3d yuQ R 9QuSQ<{ SQ<{L$ KCk UQPXY]Y[ËD$PU$X(p3ʼnV]|ux}tfff]pfElfehfmdE@jPEjPnEEЍE؃ E uELjHEPDu uj(Yh @P<3^MŨU5PYt]jY]VW3L{6J(Yr_^ËL$f9MZt3ËA<8PEu3fx ̋D$H<ASVq3҅WDv|$H ;r X;r (;r3_^[jhhgeRsYt=E+PRYYt+@$ЃE E3=ËeE3ËD$TX\`ËD$ qV9Ptk t$ ;rk L$^;s9Pt35\rYj hg3}}؋] LtjY+t"+t+td+uD}؅uaTT`w\`ZÃt<t+Ht3PPPPP뮾\\XX ``EPEY3}9Euj"9EtP?Y3Et tuO`MԉG`u@OdMGdu. qM܋ qq9M}Mk W\DEEuwdSUY]}؃}tjYSUYt tuEԉG`uEЉGd3ËD$hËD$tËD$xt$3@jhg>3}5xvY;uSEP#Y;t WWWWWp}t!hTPT;th,PPP;uVYx}u u։E/EE3=Ëe}ujleEEj hgyM3;v.jX3;E @u WWWWW3M u;u3F3ۉ]wi=uKu E;w7jY}uEYEE_];tuWS7 ;uaVj5,;uL9=t3V菲YrE;P E3u jY;u E;t jhg[]uu Yu u S賬Y=3}jY}SYE;;5wIVSPY t]5V&YE;t'CH;rPSu譟S0ESPQ9}uH;u3Fu u VW5,E;t CH;rPSuYSuE.}u1uFu VSj5u ]jDYË}9=t,VY79}ul4PY_9}th quFVSj5uV9t4VzYtvVjY 3|u4P\YUuME MUTu}tMA#E3t3@}tMapjjt$ jSVWT$D$L$URPQQhd5p3ĉD$d%D$0XL$,3p t;T$4t;v.4v\ H {uhCCd_^[ËL$At3D$H3ڡUhp pp> ]D$T$UL$)qqq( ]UVWS33333[_^]Ëj33333USVWjjhQ_^[]Ul$RQt$ ]U SVWƼ39|E]]]hP;u3Y5PhPW;tP$PW|P$PWPEP YYt SSSSSV}u,h|PWP躻;YthdPWP袻Yu;tm95tePY;t%MQj MQjP5ϻYЅtEu3EPYt SSSSS}r M :M1;t(P耻Y;ÉEt;tuPdYЉEuu uu5|GY_^[ËD$S3;VWt|$;w!j^0SSSSS+=t$;uً8tBOu;t BF:tOu;uj"Y3_^[USVu39]Wu;u9] u3_^[];t} ;wj^0SSSSS9]uʋU;uу}u @B:tOu @B:tOtMu9]u;u}uE jP\Xx j"Y낋L$V3;|~ u}^á} }^VVVVV^Vt$vvv vڥvҥvʥ6åv 軥v$賥v(諥v,裥v0蛥v4蓥v若v8胥v<{@v@pvDhvH`vLXvPPvTHvX@v\8v`0vd(vh vlvpvtvxv|@ߤԤɤ辤賤訤蝤蒤臤|,^Vt$t5;@|tP^YF;D|tPLYv;5H|tV:Y^Vt$t~F ;L|tPYF;P|tP YF;T|tPYF;X|tPYF;\|tPգYF ;`|tPãYv$;5d|tV豣Y^ËD$t8uP蕣YUV3PPPPPPPPU I t $uI t $s ^UQQp3ʼnĖSV3;Wu:EP3FVh$aVt5̇44xu jẊ̇;9]]u@E539] SSuu Pu֋;~<w4D?=w;tP裡;Yt ؅ti?PjS, WSuu juօtuPSuESkEYu39]u@E9]u@Eu!Yu3G;EtSSMQu PuG;t܉u uuu uu;tV衡YǍe_^[M3趙UuMu$Mu uuuuu }tMapUV3PPPPPPPPU I t $u t $sF ^Up3ʼnESV39ЇWu8SS3GWh$ahS t=Ї4xu Ї9]~"MEI8t@;uE+H;E}@EЇ;9] ]u@E 539]$SSuuPu ֋;~Cj3Xr7D?=w;tP;;Yt E]9]=Wuuuju օ5 SSWuu u֋;ˉMfE t)9];MuuWuu u;~Ej3Xr9D =wZ;tjPz;Yt 3;tAuVWuu u t"9]SSuSSuuuVSu EV7Yu.EYY9]]]u@E9] u@E uYEu3!;E SSMQuPu ;ÉEtԋ5SSuPu u;ÉEu3~=w8=wD;tPd;Yt 3;tuSW uWuuu u;ÉEu3%uEuPWu uHu#uW Yuuuuu u9]t u萝YE;t 9EtP}Yƍe_^[M3蒕UuMu(Mu$u uuuuu - }tMapjYVD$ u(L$D$ 3؋D$d$ȋd$Gȋ\$T$ D$ ud$ȋD$r;T$ wr;D$v N+D$T$3+D$T$ ؃ʋӋًȋ^̋D$L$ ȋL$ u D$S؋D$d$؋D$[j jt$ E Uu MwEMA%}tMapQL$+ȃ YQL$+ȃ YU p3ʼnEjEPhuEu EPNYM3豓U4p3ʼnEEME؋ESEЋVE܋EW3;E M̉}}_5MQPօt^}uXEPu օtK}uEu܃Eu uYF;~[wSD6=w/;t8-WWuujuӋ;u3P;Yt E}9}t؍6PWup VuuujuӅt];tWWuSVuWu t`][9}ԋuWWWWVuWu Ӌ;tt }w u,9uv'!E"tME$ƉEEt8Et]}tE`pEEt0}tE`p3[_^U39Puu uuhvP]QL$+#ȋ%;r Y$-UWVSM tMu} AZ I& t' t#:r:w:r:w:u u3:t rً[^_̍B[Í$d$3D$ST$t :tτtQu WV ؋ ~333ƃu%t%uu^_[3ËB:t6t:t't:tt:tt^_B[ÍB^_[ÍB^_[ÍB^_[%̋EPYËT$BJ3VXc̋EPYËT$BJ3&c鴍T$B J3 d降}H}ukiin nm jj.j@jLj\jhjzjjjjjjjk$k8kFkRk`kjkkkkkkkk l l:lRllllllllllm m8mPm`mnmzmmmmmmmmiiixi£W^gEFaa1.2.3http://dosbox.sf.netmailto:db.crew@gmail.comZMBV deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly GII I0L 0L0L 0L 0L 0L1.2.3`Psp0  ` @ X ;x8 h( H T+t4  d$ D \ S|< l,  L R#r2  b" B Z Cz: j*  J V@3v6 f& F  ^ c~> n. N `Qq1  a! A Y ;y9 i)  I U+u5  e% E ] S}= m-  M S#s3  c# C [ C{; k+  K W@3w7 g' G  _ c? o/ O `Psp0  ` @ X ;x8 h( H T+t4  d$ D \ S|< l,  L R#r2  b" B Z Cz: j*  J V@3v6 f& F  ^ c~> n. N `Qq1  a! A Y ;y9 i)  I U+u5  e% E ] S}= m-  M S#s3  c# C [ C{; k+  K W@3w7 g' G  _ c? o/ O A@!  @a`10  @     incorrect length checkincorrect data checkinvalid distance too far backinvalid distance codeinvalid literal/length codeinvalid distances setinvalid bit length repeatinvalid literal/lengths settoo many length or distance symbolsinvalid code lengths setinvalid stored block lengthsinvalid block typeheader crc mismatchunknown header flags setincorrect header checkinvalid window sizeunknown compression method       L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}   S S  3 3  s s    K K  + +  k k     [ [  ; ;  { {     G G  ' '  g g     W W  7 7  w w     O O  / /  o o     _ _  ? ?     @ `P0pH(hX8xD$dT4tC#c         (08@P`p  0@`  0@`0w,aQ mjp5c飕d2yҗ+L |~-d jHqA}mQDžӃVlkdzbeO\lcc=  n;^iLA`rqgjm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-A1b62S-+ldEw}ZVǖAOIъ OM~-QJ#SpxAaU׮.7׵Y-6]]wll?AԞZ͢$ Faw$eڪ]]FD(koipvk19Z* ,  m86F߲]qTp0ek*1u4yީ%8S1bSWĔՖk1**ykʬHpo].*F6fcTT"eM©g0&):{ϼkZ> 8$,52F*sw1pHkQ6Fzw]cN̵J #pAF]#l8?1(BOgT~yUbL8^#ܖTZ1ObbSyOIV~P-{b-R4٠~^eGnHl/Su6: #jT$+e?yHf'*b#ٽЧ ?&~?$pi;FBzw[keZ~7 Sv8H 3?r$7jnԄYFܨ |OQ;օ U d S - =G\ p&Gw)` /a߫i5&LsZ<#0zMzFM8,9; :R:(q-v,.7/pXqYs3r%w+OQvrtEux܉~OK }!b|tyBxʠz{.lD~m8onlk[wjR1h58ib?mcf+aQ`צedd"fig HINSKyuJcO NZLݘMFGN@E$DD2AsX@*IBCPhTg3U>uW ַVS:R|P~Q9ZS [fYX4])\ZEo^m/_5qϱ٥s\ۼqދ!K7 kfֶԁ-b3Πjp]$^'~*I@VW<âM˟ŏ{ tDCm-@wm.B+(铜>Td"ŀǼϭ~8y$owJ1}05_K^ iϏ은BI#ƈdX܁T̓cQ: rՆ⩗ fn|xK)o%ƭ/3vUuA?)C:|sĵ@͂ Ͳ;bIUeh"׻_HS1޼^Z4eg Wb27_k%8ם(ŊO}do׸Jj3wVcXWP0qB{߭gCru&op-?'Bs ưGz>2[Ȏg; i8P/ _Y=чe:ZO?(3wwXR @hQ+ğH*0"ZOWoI}@mNП5+#*'G| AH=XX?#1jvʬ`p^Y<L~i/{kHwâ hs)aLoD~Pf7VM'(@ﰤ ہg9x+n&;f?/X)T`D1 ߨMߒ.FgTp'Hq/L0UEc?kǃh6ry7]P\@TN%s7@'>$!AxUʰ\3;Y^U~PGl!;b F2ȂpԞ(Q_V:1X: n3 m:@/)IJNv"2x+ٗ Kx.HҥfAj^y9*O]#kM`~b_R 7zFh!1߈Vc0a"j6nS Nr)Υ{t*F8#vufz`rs"WG9^EMvc΍&DAdQy/4Aڱ&S֚E biLQ<6'5P..T&q]w4.6IE? v\[YI>U!lDa>Ԫ΋ϩ7~8A]&nv|oY yKiw\¹9~$ 66nQfq>,o,IӔ 渱{I .H>C-Yn馑gQz tafw0a, Qmpjc5dۈ2yܸو L+~|-dj qHA}mԵQӅlVdkbze\Ocl=c ;n Li^`Agqr<KG k5Blۻ֬@2lE\u ϫ=Y&0Q:Qa!V#Ϻ(_ ٲ $/o|XhLaf-=vAq *q3xɢ4 j m=-dlc\kkQlabe0bNl{WeP|b-I|LeMaX:QΣtԻ0JߥA=ؕפmCij4ngF`D-s3 L_ |Pq<'A  Wh% of a^)ɘИ"רY=. \;l  tҚG9w&sc d; mj>zjZ '}DhibW]egl6qnkv+zZgJoC`֣ѓ~8ORѻgWg?H6K +گ L6JAz``ègU1nFiyaf%oҠRh6 w G"U&/ź; (+Z\j1,ٞ[ޮd°c&ujm 6?rgWJz{+ 8Ҏվ | !Bhݳڃn&[owGwZjpf; \ebiaklE x NT9§g&a`IiGM>nwۮjJZ@ f7;𩼮S޻G0齽ʺŠS0$6TW)#gfz.aJ]h*o+ 7 Z-1A26b+-Sdl}wEVZOAي»IˬO ~M-JQS#xpaA.U7Y-۩6˚w]]llA?Z$㧲F waރ$Ųe]]DFok(vpi91k *Z  ,8mF6]pTqke0*1¶u4%y<8syjHA}X*ݹ1SbSW§ٖծ1k**kypH]oF*.f6TTcMe"¤0g)&Ůޟ:{kZ >8,$5*F21wsHpQkzF6c]wN̵ׄJ# pȄA#]F8l1?(gOB~TUyLbˁ8#^TO1ZbbySIOP~V{-b-4R^~Ge­lHnuS/:6# $Tj?e+y䏼Hf*'˼Ѝb# &??~p$iBF;[wzek~ZS 7H8v ?3$rj7nFY |OQ; U dؓS - \G=&pGw`)/ ai5&sL <:R=Pe6^X7}o5641W0ճ2k3$k%'1&-[#bML"'{ "!$*x(+)`F(> q-q,v.Ț/7pqXsYr3w%vQO+tru՛E~xKO} |b!ytxBz{l.m~Do8nkljw[h1Ri85bcm?a+f`Qeddf"giH IKSNJuyOcN LZMݥFĚGE@ND$A2D@XsBI*CThPU3gWu>V SR:P|Q~Z9[ SYfX]4\)^oEZ_/m5qs<\kg2z &J8 좞V`a/6i\lU,zB\uHƒ=&FW A+Ox]`غ7W>9q߳!7Kk ֩fض-bѠ3pj$]^Ĝ'*~@IWVÕ<ӂMʏş{ Dt͆mC-@mw+B.(>dT"ş~Ϝ8yo$w1J}50K_ ^ϋiBۉI#dXфTQc:r Р fΫnx|)Ko%3/uUv?A)ġ:C|sд@͉ ;IbeU"hH_S1ފZ^ھ4ge ȋbW72%k_ܝ8Ŵ(}OodJֿjw3XcVPW0Bq{gǧurCo&p-?О'sB zGɠ2>[ ;g/P8i_ Y=嗇e:ϏOZw3(?RXw@ Qh+HZ"0*WOIo@}m5N#+'*GA |􏒨HX=#?X1vjʨ`^pYL'!$UxAׯ3\Y;U^GP~b;!lڇF 2p(ԐQV_:X1: 3n :m@I)/NJ2"v+x xKH.jAf^O*9y]#Mk~`bю_޶ Rz7hFм!10cV"ajحn6 SrN){t*8Fv#fu`zrϮsɛW"G9E^vMcD&dA/yQA4S&ֿ EbLil!>aDƋΪ~7A8n&]|vYoᡱ Kyi׫w¡\~9$66 Qnf>q,o,ӹI 散 I{.C>HnY-Qg̰t zfaincompatible versionbuffer errorinsufficient memorydata errorstream errorfile errorstream endneed dictionaryxGlGkG`GPGDG0G GGkG inflate 1.2.3 Copyright 1995-2005 Mark Adler  #+3;CScs !1Aa  0@`@@bad allocationaNxbUnknown exceptionbǥcsm }P~bbad exceptionEncodePointerKERNEL32.DLLDecodePointerFlsFreeFlsSetValueFlsGetValueFlsAllocCorExitProcessmscoree.dllruntime error TLOSS error SING error DOMAIN error R6034 An application has made an attempt to load the C runtime library incorrectly. Please contact the application's support team for more information. R6033 - Attempt to use MSIL code from this assembly during native code initialization This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. R6032 - not enough space for locale information R6031 - Attempt to initialize the CRT more than once. This indicates a bug in your application. R6030 - CRT not initialized R6028 - unable to initialize heap R6027 - not enough space for lowio initialization R6026 - not enough space for stdio initialization R6025 - pure virtual function call R6024 - not enough space for _onexit/atexit table R6019 - unable to open console device R6018 - unexpected heap error R6017 - unexpected multithread lock error R6016 - not enough space for thread data This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. R6009 - not enough space for environment R6008 - not enough space for arguments R6002 - floating point not loaded Microsoft Visual C++ Runtime Library ...Runtime Error! Program:   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~=InitializeCriticalSectionAndSpinCountkernel32.dllGetProcessWindowStationGetUserObjectInformationAGetLastActivePopupGetActiveWindowMessageBoxAUSER32.DLL Complete Object Locator' Class Hierarchy Descriptor' Base Class Array' Base Class Descriptor at ( Type Descriptor'`local static thread guard'`managed vector copy constructor iterator'`vector vbase copy constructor iterator'`vector copy constructor iterator'`dynamic atexit destructor for '`dynamic initializer for '`eh vector vbase copy constructor iterator'`eh vector copy constructor iterator'`managed vector destructor iterator'`managed vector constructor iterator'`placement delete[] closure'`placement delete closure'`omni callsig' delete[] new[]`local vftable constructor closure'`local vftable'`RTTI`EH`udt returning'`copy constructor closure'`eh vector vbase constructor iterator'`eh vector destructor iterator'`eh vector constructor iterator'`virtual displacement map'`vector vbase constructor iterator'`vector destructor iterator'`vector constructor iterator'`scalar deleting destructor'`default constructor closure'`vector deleting destructor'`vbase destructor'`string'`local static guard'`typeof'`vcall'`vbtable'`vftable'^=|=&=<<=>>=%=/=-=+=*=||&&|^~(),>=><=<%/->*&+---++*->operator[]!===!<<>> delete new__unaligned__restrict__ptr64__clrcall__fastcall__thiscall__stdcall__pascal__cdecl__based(`VXVLV@V4V(VVVVUkG@Q$QQPPUU(PUUUUUUUUUUUUUUUUUUUUUUUUU|UxUtUpUlUhUdU`U\UXUTUPULU@U4U,U UUTTTTThTHT$TTSSSSpSlSdSTS0S(SS SRRRRXR,RRQQQpQTQkG ((((( H h(((( H H  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~HH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecHp cRSDSGF$ >c:\prog\dosbox\src\libs\zmbv\Release\zmbv.pdbtp bb(bDbtp@ bp@`bpbDbp`bpbbbp@bpbbcDbp@bś    "Pc "|cCccctp pp "t /ت@d"dd`i׮ۮpteecp 0øϸ8<G_%'piihhidii\ijkiin nm jj.j@jLj\jhjzjjjjjjjk$k8kFkRk`kjkkkkkkkk l l:lRllllllllllm m8mPm`mnmzmmmmmmmmiiixiDefDriverProcWINMM.dllGetStdHandleuMultiByteToWideCharKERNEL32.dllEndDialogDialogBoxParamAUSER32.dllShellExecuteASHELL32.dllRtlUnwindFGetCurrentThreadIdGetCommandLineAHeapFreeGetVersionExAHeapAllocGetProcessHeapqGetLastErrorRaiseException^TerminateProcessBGetCurrentProcessnUnhandledExceptionFilterJSetUnhandledExceptionFilter9IsDebuggerPresentGetProcAddressGetModuleHandleAeTlsGetValuecTlsAllocfTlsSetValuedTlsFree,InterlockedIncrement(SetLastError(InterlockedDecrementExitProcessVSleep$SetHandleCountfGetFileTypeGetStartupInfoADeleteCriticalSection}GetModuleFileNameAFreeEnvironmentStringsAUGetEnvironmentStringsFreeEnvironmentStringsWWideCharToMultiByteWGetEnvironmentStringsWHeapDestroyHeapCreateVirtualFreeQueryPerformanceCounterGetTickCountCGetCurrentProcessIdGetSystemTimeAsFileTimeQLeaveCriticalSectionEnterCriticalSectionVirtualAllocHeapReAllocWriteFileHeapSizeGetCPInfoGetACPGetOEMCPRLoadLibraryA#InitializeCriticalSectiontGetLocaleInfoAGetStringTypeAGetStringTypeWDLCMapStringAELCMapStringWEbnXn\n`nknZMBV.dllDriverProcZipped Motion Block Video v0.1ZMBV "XH$I.?AVbad_alloc@std@@$I.?AVexception@std@@N@DHH$I.?AVtype_info@@H$I.?AVbad_exception@std@@(  x ON N (NMMM|MDMMLLLdLL K!J"0JxJy JzIII        ! 5A CPR S WY l m pr   )    HZC(u(u(u(u(u@|Xx]^{0u0uv abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZv`y!@~ڣ @ڣ AϢ[@~QQ^ _j21~ XZ aaaaa aaa````````````````````x`p``h```X`L`D`8`,`(`$```_ {.<|ʇʇʇʇʇʇʇʇʇ@|.pPSTPDT||;Zx0Nm:Yw/Ml @eXfp   Аt|VȀ7DOSBox Video Codec v0.1MS Sans SerifP"OKPZipped Motion Block Video v 0.1 Copyright 2005, DOSBox TeamP"2Email authorP;":Visit home pagePAȀZMBV configuration dialogMS Sans SerifP,V2Email authorPmW:Visit home pageP,}2OKPu}2CancelP9\msctls_trackbar32 PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXl 00011>2H2L2P2T2X2\2`2d2h2l2p2t2x2|22222222222222233 405666667:: :$:(: S????`\222356I78d9::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;p8}:$;3;;;h<}<pj0z000s3333o8t88889949>9P9Z9u9|9999999999:: :,:9:S:Z:k:u:::::::::!;???W0L2T2_2m2j555555555#6A6H6L6P6T6X6\6`6d666666&717L7S7X7\7`777777777778J8P8T8X8\88.9;9E9S9~99999999M:;;;q====>>:>P>b>g>m>s>>>>>>? ?R?X?s????+0X0001"1C1{1111.242E23345,55556666666-747c7777777777777777888$8)8/898B8M8Y8^8n8s8y888888r9:;;o=>D232=2H2>4/555@5L5a5g5p5w55555555556 66#6)6/6;6I6O6[6a6n6x6~66666666#70767<7_7e7777)8L8V888888999919?9F9L9b9g9o9u9|9999999999999999999:::*:/:::?:L:Z:`:p:::::;";L;W;;;;;;<~<<<<<<<<===3===S=]=w==========>>>>>>>?=?F?R?j?~???? 0(0b0l00001011111112@2H222222q444444 55"5,5E5Q5]5d555506G6W6\6{66 77#7:7@7F7V7`7i7r77777777777,8i8o888Q9n99::::0;M;p;};;;;;;;;;;<&<,@>h>n>y>>>>>>>>*?_?x????????00 00000 0$0n0t0x0|0000 1111 1A1k1111111111 22222z2?3e33394}444 5E5556|77777777C8K8`8k8888888 9W9q999F:::<;H;[;m;;;;;;;;;;<<7<`>>>>]?g?q?????e0s0000001+1r1w1111111H2Q2W22222 33K3Q3Z3a3l3x333*4?444445W55566C6f66666}7788888999+919>9e9v9}99999 :#:H:;;;`=r======== >>>>>>>>> ??H00000011?1o1222V3'46 6J666o77::p<<<<<<<(1 1$1(1,1@11122 2,282D2P2\2@87777777777888999 9$9H9L9P9T9X9\9Pp6t6x6|666666666666666666666666666666666777 77777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|77777777777777777777777777777`112222 2(2@2D2\2l2p2222222222222233T3`333333333334484X4x444444445585@5D5\5`5|555555555566 6<6@6`6|6666667 7@7`7|7777778p(0,0<0@0T0p0t00000000012223 333$3,343<3D3L3T3\3d3l3t3|333335 55555555566666@:L;P;T;X;\;`;d;h;l;p;t;x;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<< <<<<< <$<(<8<@ addr_buffer ld (addr_buf_end),de ld hl,0 jr addr_found addr_done ld (addr_buf_end),de ; Now each address mark is read for at least 3 full revolutions. Analyze this ; data to detect the number of address marks in one revolution. Note that it's ; possible a single track contains several identical address marks. So ; detecting the number of sectors in the track is not as simple as searching ; for the 2nd occurrence of the 1st read address mark. ; ; Some examples (the latters 'A'-'Z' each represent a unique address mark): ; * ABCDEFGHIABCDEFGHIABCDEFGHIABCD ; -> 'normal' track with 9 unique address marks ; * ABCDABEABCDABEABCDABEABC ; -> 8 unique address marks, the marks A and B appear twice ; * ABCABCABCABCABCABCABCA ; -> the current algorithm detects a track with 3 unique address marks ; so it cannot distinguish the track 'ABC' from 'ABCABC' ; TODO fix this by taking the timing into account ; ; Note that the detection can fail if we did not read at least 2 full ; revolutions. For example, suppose the actual track contains these marks: ; 'AAAAAAABAA' (10 unique marks, mark A is duplicated 9 times). Now suppose we ; only read 'AAAAAAABAAAAAAA'. Valid periods for this sequence could be 8, 9 ; or 10. (The current algorithm would return 8). This ambiguity disappears if ; we read at least 2 full revolutions. ld hl,0 next_period ld ix,(addr_buf_end) ld a,ixl and 7 jp nz,read_addr_err ld de,addr_buffer call get_period addr_found ld (nb_sectors),hl ; TODO check not more than 64 (DMK cannot handle that) ; if (nb_sectors > 64) error("not supported by dmk"); call print_pc db " found ",0 ld hl,(nb_sectors) call print_dec_hl ; TODO print_dec_a call print_pc db " sectors",13,10,0 ; We now know the period after which the address marks start repeating. ; Take the difference of the counter value that was stored at the 1st ; and address mark and the 1st replica of this mark. ; ; This difference should be around 0x38E0 (tested on real machine). ; TODO if measured value is far below 0x38E0, try doubling, tripling, ... ; until it gets in range. ld hl,(nb_sectors) ld a,h or l jp z,read_track ; skip ticks-check add hl,hl add hl,hl add hl,hl ld de,addr_buffer add hl,de ld de,(addr_buf_end) or a sbc hl,de jr c,ok_periodic ; period is whole buffer -> not periodic call print_pc db "Not periodic (read noise?)",13,10,0 jp addr_retry ok_periodic add hl,de ld de,ofst_amark_tick add hl,de ld a,(hl) inc hl ld h,(hl) ld l,a ld de,(addr_buffer+ofst_amark_tick) or a sbc hl,de ld (ticks),hl ld a,(debug) or a jr z,debug_2 call print_pc db ", ticks: ",0 ld hl,(ticks) call print_dec_hl ; is this info useful? call print_pc db 13,10,0 debug_2 ; If there were read errors during the 'read address' command, then it's ; possible the detected period is larger than one disk revolution. This for ; example happened for the disks of 'New Vision Benelux'. ; We read the address marks for about 3 revolutions, but if there was a read ; error for e.g. an address mark in the 2nd revolution (so the read address ; command didn't return the exact same 6 bytes than for revolution 1 and 3), ; then the get_period routine won't detect the true period, but instead it ; returns the full 3 revolutions as the period (without internal repetition). ; We can detect this error by looking at the detected number of ticks for ; the period. If the detected period is for a single revolution, it should ; be in range [13834, 15290]. But if it's higher we've probably estimated ; more than one revolution. ; TODO also check for lower than 13834. ld hl,(ticks) ld de,(ticks_min) ; depends on driver or a sbc hl,de jr c,too_short add hl,de ld de,(ticks_max) ; depends on driver or a sbc hl,de jp nc,addr_retry ; maybe it works in the next attempt jr read_track too_short ld hl,(nb_sectors) jp next_period ; Use the WD2793 "read track" command to get the raw track data. ; Also store the number of read bytes. This is the track length. ; The 'normal' track length is 6250 bytes, but this can also vary. read_track ld a,'t' call debug_log call print_pc db "Read track ...",0 ;; TODO is this call required? ;; Quibus reported a hang during 'Read track' at one point. ;; The LED of drive B was turned on when that happened. ;; The only way I can see how that's possible is that the ;; slot in page was somehow changed. Any other explanations??? track_retry call select_fdc ld iy,(driver_rd_trck) jp (iy) track_too_much call print_pc db "Read track returned too much data",13,10,0 jr read_track track_err call print_pc db "Read track error",13,10,0 jp debug_exit track_no_start call print_pc db "Read track command failed to start!",13,10,0 jp debug_exit track_end ex de,hl ld (track_stop),hl ; store for later ld de,trck_buffer or a sbc hl,de ld (track_len),hl ; TODO check in range [5938, 6562]? call print_pc db " length: ",0 ld hl,(track_len) call print_dec_hl call print_pc db 13,10,0 ; Quibus reported a hang after the tool printed "Read track .. length=12438" ; So it seemed the FDC somehow missed the index pulse and read the track data ; twice. This causes a buffer overflow later in the tool. To workaround this ; hardware quirk, we check that the tracklength in in range [5800..6700]. ; That's +/-5% of the nominal track length. ld hl,(track_len) ld bc,6700+1 or a sbc hl,bc jr nc,wrong_length ld hl,(track_len) ld bc,5800 or a sbc hl,bc jr nc,length_ok wrong_length call print_pc db "Unexpected track length .. retrying ...",0 jp track_retry length_ok ; Calculate the ratio between the number of ticks (the difference in counter ; value) and the track length. A typical value for the former is around 14560, ; for the latter it's around 6250. So the ratio between the two is smaller ; than 1. We calculate this ration as a 0.16-bit fractional number. ; Later this ratio will be used to estimate the position of the address marks ; in the raw track. ld hl,(track_len) ld bc,(ticks) call frac_div ld (ratio),de ; Copy the track data so that it is twice directly after each other in memory. ; This is a cheap way to implement 'circular-reads': on a real disk, if you ; read past the end of a track, you simply wrap around to the beginning of the ; track. With the copy reads (that only wrap once!) now behave the same. ; ; Note that the first dozen or so bytes returned by the read track command are ; totally unreliable. This is because the FDC has not yet seen any ; synchronization marks, so it has no idea which bit in the stream is the first ; bit of a byte. For us this is not a big problem because in the code below we ; only scan for these synchronization marks. ld bc,(track_len) ld hl,trck_buffer ld d,h ld e,l add hl,bc ex de,hl ldir ; Clear the DMK header. There is room for 64 IDAM entries. Unused position ; should contain the value 0x0000. ld hl,dmk_header ld de,dmk_header+1 ld bc,sizeof_dmk_h-1 ld (hl),0 ldir ; Later we fill search the position of address and data marks in the raw track ; data. Clear that table now. Note that this table partly overlaps with the ; addr_buffer (where we stored the result of the "read address" commands). ; That's OK, from this point on we only need the first 64 entries from the ; that table anymore. ld hl,offset_buffer ld de,offset_buffer+1 ld bc,sizeof_off_buf-1 ld (hl),0 ldir ; Now, for each data adress mark (returned by the "read address" command), try ; to locate it in the raw track data. For this we use the recorded counter ; value for that address mark and the earlier calculated ratio. ld a,(nb_sectors) or a ; if there are no address marks on jp z,no_sectors ; this track we're done ld a,'A' call debug_log ld a,(debug) or a jr z,skip_ana_prt call print_pc db "Analyze raw track ... ",0 skip_ana_prt ld a,(nb_sectors) ld hl,offset_buffer ; store results in this table ld (ofst_buf_ptr),hl ld hl,addr_buffer addr_mark_loop ld (sector_cntr),a ld (addr_buf_ptr),hl ld a,(debug) or a jr z,skip_ana_prt2 push hl ld a,(sector_cntr) call print_dec_a call print_pc db " ",0 pop hl skip_ana_prt2 ld a,'a' call debug_log ld de,ofst_amark_tick add hl,de ld e,(hl) inc hl ld d,(hl) ld bc,(ratio) call mul_hi ; hl = (de * bc) >> 16 ld bc,trck_buffer add hl,bc ld (addr_estimate),hl ; We can only use this calculated position as a (fairly good) estimate of the ; position. The real position can be different for the following reasons: ; - we recorded the counter at the end of the "read address" command, while ; here we're looking for the start of the address mark ; - the counter we've used does not 100% increase with a constant rate (e.g. ; at the end of a command we have to do some extra stuff, and we don't ; increase the counter during that time) ; - the rotation speed (and maybe also the flux density?) is not 100% ; constant ; To compensate for this we only use the calculated position as the starting ; point for the search. If we don't find the mark at exactly this position, we ; try the adjacent few bytes (both up and down). Tests on a real machine have ; shown that usually we find the mark withing 2 or 3 bytes from the calculated ; position (but here we try up to 5 bytes (up and down) from the calculated ; position). ; TODO more tests on Quibus machine indicated that (in rare cases?) 5 bytes is ; not enough. I've currently increased it up to 20 bytes. But that's most ; likely too much (searching too far from the initial position has a risk of ; finding a different mark in the wrong position) ; ; We look for the bytes 0xA1 0xA1 0xFE. The real address mark still has a 3rd ; byte 0xA1 in front of this sequence. But tests on a real WD2793 have shown ; that this byte is very often read wrong by the "read track" command. (Later ; we will correct this so that the data in the DMK file has the correct ; sequence A1 A1 A1 FE). ; ; The disk "Demo Kit Deluxe" has at the start of the track the sequence ; "A1 A1 A1 FC" (instead of the usual sequence C2 C2 C2 FC). When doing tests ; with this disk on a real machine, we found that the "read address" command ; also returns the 6 bytes following the "A1 A1 A1 FC" sequence (the expected ; sequence for an address mark is A1 A1 A1 FE). So it seems the WD2793 accepts ; both FC and FE in the address mark sequence. ld de,ofst_tab ofst_next ld hl,(addr_estimate) ; restore initial estimate ld a,(de) inc de cp #80 jp z,ofst_err ; reached the end of the offset table ld c,a ld a,(de) inc de ld b,a ; 16-bit offset add hl,bc ; add offset ld a,(hl) cp #A1 jr nz,ofst_next inc hl ld a,(hl) cp #A1 jr nz,ofst_next inc hl ld a,(hl) cp #FE jr z,ofst_1 cp #FC ; see comments above jr nz,ofst_next ofst_1 dec hl dec hl dec hl ; points to start of A1 A1 A1 FE sequence ex de,hl ld hl,(ofst_buf_ptr) ld (hl),e inc hl ld (hl),d ; store location in offset_buffer ;;push de ;;call print_pc ;;db " addr_mark=0x",0 ;;pop hl ;;call print_hex_hl ; Now verify the CRC of the address mark. We use the data returned by the ; "read address" command (not the data in the raw track). If there is a CRC ; error we don't need to look for the data mark. ; ; Alternatively we could use the CRC-error-bit in the WD2793 status register ; to see if there was a CRC error. Though I prefered to not do that to keep ; the read-all-address-marks loop as fast as possible. ; ; The CRC value includes the 4 bytes of the address mark header (A1 A1 A1 FE) ; and the 4 actual "C H R N" bytes stored in the address. ld hl,#B230 ; precalculated CRC for A1 A1 A1 FE ld de,(addr_buf_ptr) ld a,(de) ; C call crc_byte inc de ld a,(de) ; H call crc_byte inc de ld a,(de) ; R call crc_byte inc de ld a,(de) ; N call crc_byte inc de ld a,(de) ; CRC (high byte) cp h jr nz,addr_crc_err inc de ld a,(de) ; CRC (low byte) cp l jr nz,addr_crc_err ;;call print_pc ;;db " CRC-OK",0 ; We found the address mark and it has a valid CRC. Now search for the data ; mark. According to the WD2793 datasheet, the data mark should occur within ; 43 bytes from (the end of) the address mark. ; ; A data mark starts with the sequence "A1 A1 A1 FB" (normal data mark) or ; "A1 A1 A1 F8" (deleted data mark). But just as for the address mark, the ; WD2793 "read track" command cannot reliably read the first A1 byte of this ; sequence, so we ignore it while searching. ld hl,(ofst_buf_ptr) ld a,(hl) inc hl ld h,(hl) ld l,a ; hl = start of address mark ld de,10-1 add hl,de ; end of address mark ld b,43+4 ; should find data mark within 43 bytes data_mark_1 dec b jp z,data_err inc hl ld a,(hl) cp #A1 jr nz,data_mark_1 data_mark_2 dec b jp z,data_err inc hl ld a,(hl) cp #A1 jr nz,data_mark_1 data_mark_3 dec b jp z,data_err inc hl ld a,(hl) ; data mark type (deleted or normal) cp #A1 jr z,data_mark_3 cp #FB jr z,data_mark_found cp #F8 jr nz,data_mark_1 data_mark_found dec hl dec hl dec hl ; points to start of A1 A1 A1 FB sequence ex de,hl ld hl,(ofst_buf_ptr) inc hl inc hl ld (hl),e inc hl ld (hl),d ; data mark offset inc hl ld (hl),a ; data mark type ;;push af ;;push de ;;call print_pc ;;db " data_mark=0x",0 ;;pop hl ;;call print_hex_hl ;;call print_pc ;;db " type=0x",0 ;;pop af ;;call print_hex_a jr next_addr_mark addr_crc_err ; address mark had a CRC error (not an error for us) ;;call print_pc ;;db " CRC-ERR",0 jr next_addr_mark data_err ; didn't find data mark in time (not an error for us) ;;call print_pc ;;db " data mark not found",0 jr next_addr_mark ; Also locate address and data marks for the other sectors in this track next_addr_mark ;;call print_pc ;;db 13,10,0 ld hl,(ofst_buf_ptr) ld de,sizeof_offinfo add hl,de ld (ofst_buf_ptr),hl ld hl,(addr_buf_ptr) ld de,sizeof_amark add hl,de ld a,(sector_cntr) dec a jp nz,addr_mark_loop ld a,(debug) or a jr z,skip_ana_prt3 call print_pc db 13,10,0 skip_ana_prt3 ; We've located the address and data mark for each sector in the raw track ; data. Now start overwriting the sector data in the raw track data with ; data from an actual "read sector" command. Do this because tests on a real ; WD2793 have shown that the data returned by "read sector" is more reliable ; than the same data returned by "read track". This is especially true for a ; sector that wrap around the end of the track (so past the index point). ld a,'S' call debug_log call print_pc db "Read sectors ... ",0 ld hl,sector_buffer ld (sector_buf_ptr),hl ; The appraoch below reads the correct sector data even if there are multiple ; sectors with the same ID present in the same track. It works well, but it's ; very slow (see below for details about the used approach). It can take 45 ; minutes to dump a whole disk using this appraoch! ; In the majority of the cases the track does not have duplicate sectors IDs, ; in that case we can use a much faster approach. ld hl,unique_buffer ld de,unique_buffer+1 ld bc,256-1 ld (hl),#ff ldir ; fill unique_buffer with #ff ld a,(nb_sectors) ld bc,sizeof_amark ld hl,addr_buffer+ofst_amark_R ld d,unique_buffer/256 count_loop ld e,(hl) ; 'R'-value of address-mark ex de,hl inc (hl) jr nz,read_slow ; if we increase #ff more than once ex de,hl ; it's non-zero, in that case there's add hl,bc ; a duplicate and we must use the dec a ; slow approach jr nz,count_loop read_fast ld a,1 jr set_speed read_slow xor a set_speed ld (read_speed),a ld hl,offset_buffer ld (ofst_buf_ptr),hl ld a,(nb_sectors) ld hl,addr_buffer sector_loop ld (sector_cntr),a ld (addr_buf_ptr),hl call print_dec_a call print_pc db " ",0 ; Skip sectors for which we didn't find a data mark previously. ld hl,(ofst_buf_ptr) inc hl inc hl ld a,(hl) inc hl or (hl) jp z,next_sector ; Reading a specific sector on some copy protected disks is not that simple ; because it can happen that a sector with the same identification header (so ; same address mark) appears multiple times on the same track. It's really ; important that we read the correct version. ; ; To solve this, we wait till the index pulse, then execute some delay loop ; (delay is based on the counter value we recorded during the "read address" ; phase above) and only then we execute the "read sector" command. For extra ; safety we measure the time between the start of the command and the moment ; we receive the first data from the command. If this difference is too big we ; adjust the delay value and try again. ld a,'s' call debug_log ld hl,64 ld (adjust_ofst),hl ld (adjust_scale),hl try_read_sector xor a retry_crc ld (crc_retries),a ld hl,(addr_buf_ptr) ld b,(hl) ; 'C' value from read address command inc hl ; 'H' inc hl ld c,(hl) ; 'R' inc hl ; 'N' inc hl ; CRC1 inc hl ; CRC2 inc hl ld a,(hl) inc hl ld h,(hl) ld l,a ; hl = counter value ld de,(adjust_ofst) or a ; counter value was recorded at end of the sbc hl,de ; "read address" command, we need to wait ; till the start of the address mark, so ; wait a bit less ld de,(sector_buf_ptr) ld iy,(driver_rd_sect) jp (iy) sector_end ex de,hl ld de,(sector_buf_ptr) or a ; sector length, should be one of sbc hl,de ; 128, 256, 512 or 1024 ld (sector_size),hl ex de,hl ld hl,(ofst_buf_ptr) ld bc,ofst_oi_size add hl,bc ld (hl),e inc hl ld (hl),d ; store sector size inc hl ld bc,(sector_buf_ptr) ld (hl),c inc hl ld (hl),b ; store pointer to sector data ld b,a and 8 ; crc error? jr z,read_no_crc_err ld a,(crc_retries) ; Only when we have 5 crc errors, we inc a ; believe it's an intentional crc error cp 5 ; on the disk (and not some random read jp c,retry_crc ; error on an (old) disk). read_no_crc_err ld a,(read_speed) or a jr nz,sector_ok ld a,ixh or a jr nz,sector_retry ld a,ixl cp 150 jr c,sector_ok sector_retry ld a,'t' call debug_log ld a,(debug) or a jr z,debug_1 push ix call print_pc db 13,10,"|",0 pop hl push hl call print_hex_hl call print_pc db " ",0 ld hl,(adjust_ofst) call print_hex_hl call print_pc db " ",0 ld hl,(adjust_scale) call print_hex_hl call print_pc db "|",0 pop ix debug_1 ld hl,(adjust_scale) ld d,h ld e,l srl d rr e srl d rr e srl d rr e or a sbc hl,de ld (adjust_scale),hl ; scale = scale - scale/8 ex de,hl ld hl,(adjust_ofst) ld a,ixh cp 5 jr c,sector_sub add hl,de jr sector_2 sector_sub or a sbc hl,de sector_2: ld (adjust_ofst),hl jp try_read_sector sector_ok ld a,'o' call debug_log ld hl,(ofst_buf_ptr) ld de,ofst_oi_status add hl,de ld (hl),b ; b = status register ; We've read the sector, now copy it to the correct location in the raw track ; buffer. We can't immediately read it in the correct place because we have ; to perform a copy to a circular destination buffer (doing it inside the ; read-sector loop might be too slow). ld hl,(ofst_buf_ptr) ld bc,ofst_oi_ptr+1 add hl,bc ld b,(hl) dec hl ld c,(hl) dec hl ; bc = pointer to sector data push bc ld b,(hl) dec hl ld c,(hl) ; bc = sector size dec hl dec hl dec hl dec hl ld a,(hl) inc hl ld h,(hl) ld l,a ; hl = pos of data mark inc hl inc hl inc hl inc hl ; position of actual sector data ld de,(track_stop) or a sbc hl,de jr c,circular_1 ld de,trck_buffer circular_1 add hl,de ex de,hl pop hl ; hl = pointer to sector data call circular_ldir ld (sector_stop),de ; Did the "read sector" command return a CRC error? If so, we keep the CRC value ; from the raw track data. But if there was no CRC error, we calculate the ; correct CRC value and store that in the raw track data. Most of the time this ; calculated value will be the same as the value that is already present in the ; raw track data, though not in case the sector wrapped around the end of the ; track. ld hl,(ofst_buf_ptr) ld bc,ofst_oi_status add hl,bc ld a,(hl) ; sector status and 8 jr nz,sector_crc_err ; skip calculating CRC ;;push hl ;;call print_pc ;;db " CRC-OK",0 ;;pop hl dec hl ld a,(hl) ; a = data mark type (is part of CRC) inc hl inc hl ld c,(hl) inc hl ld b,(hl) ; bc = sector size inc hl ld e,(hl) inc hl ld d,(hl) ; de = pointer to sector data ld hl,#CDB4 ; precalculated CRC for sequence "A1 A1 A1" push bc call crc_byte pop bc sector_crc_loop ld a,(de) inc de push bc call crc_byte pop bc dec bc ld a,b or c jr nz,sector_crc_loop ex de,hl ; de = CRC value ld hl,(sector_stop) ld (hl),d ; CRC is stored big endian inc hl ld a,(track_stop) cp l jr nz,copy_crc_next ld a,(track_stop+1) cp h jr nz,copy_crc_next ld hl,trck_buffer copy_crc_next ld (hl),e jr next_sector sector_crc_err ;;call print_pc ;;db " CRC-ERR",0 ; Sector data (and possibly CRC value) is stored in raw track buffer. ; Continue with the next sector. next_sector ld hl,(sector_buf_ptr) ld bc,(sector_size) add hl,bc ld (sector_buf_ptr),hl ld a,h cp unique_buffer/256 jp nc,buffer_overflow ;;call print_pc ;;db 13,10,0 ld hl,(ofst_buf_ptr) ld de,sizeof_offinfo add hl,de ld (ofst_buf_ptr),hl ld hl,(addr_buf_ptr) ld de,sizeof_amark add hl,de ld a,(sector_cntr) dec a jp nz,sector_loop call print_pc db 13,10,0 ; At this point we've read the raw track data and overwritten it with data ; from "read sector" commands. Though we still need to make some more ; adjustments: ; - the read track command doesn't reliably read the first A1 byte in a ; address or data mark sequence. ; - I found that sometimes the "read sector" command had overwritten the ; address mark of another sector with different data (e.g. this happened ; while experimenting with the Pixess game disk which intentionally has ; overlapping sector) ; To fix both problems we now restore the address and data marks. ; ; We also record the position of the address marks in the DMK track header. ld a,'F' call debug_log ld a,(debug) or a jr z,skip_fix_prt call print_pc db "Fixup markers ...",13,10,0 skip_fix_prt ld hl,offset_buffer ld (ofst_buf_ptr),hl ld hl,dmk_header ld (dmk_ptr),hl ld a,(nb_sectors) ld hl,addr_buffer fixup_loop ld (sector_cntr),a ld (addr_buf_ptr),hl ld a,'f' call debug_log ld hl,(ofst_buf_ptr) ld e,(hl) inc hl ld d,(hl) ; de = pos of addr mark inc hl push hl push de ld hl,addr_mark ld bc,4 call circular_ldir ld hl,(addr_buf_ptr) ld bc,6 call circular_ldir pop hl ; pos of addr mark ld de,trck_buffer or a sbc hl,de ld de,#8083 add hl,de ex de,hl ld hl,(dmk_ptr) ld (hl),e inc hl ld (hl),d inc hl ld (dmk_ptr),hl pop hl ld e,(hl) inc hl ld d,(hl) ld a,e or d jr z,fixup_next ; no data mark inc hl push hl ld hl,addr_mark ld bc,3 call circular_ldir pop hl ld a,(hl) ld (de),a ; copy data mark type fixup_next ld hl,(ofst_buf_ptr) ld de,sizeof_offinfo add hl,de ld (ofst_buf_ptr),hl ld hl,(addr_buf_ptr) ld de,sizeof_amark add hl,de ld a,(sector_cntr) dec a jr nz,fixup_loop ; Done. ... Well, not quite ... ; In theory everything should be done at this point. However tests on a real ; machine have shown that for some disks we *sometimes* still get the wrong ; data at this point. This happened for disks which have overlapping sectors ; (e.g. sunrise disks). When I did a "read track" on such a disk, I found that ; the distance in bytes between the start of the sectors is sometimes N but ; sometimes N+1! Normally this doesn't matter (and this variation might be the ; reason why there are gaps between sectors). Though in case of overlapping ; sectors, if the relative start of the two sectors is shifted by a byte, then ; the CRC of the sectors will be different (in case of the sunrise protection, ; the CRC of the first sector is part of the data of the second sector). The ; only way I found to detect/correct this problem is to verify the CRCs of the ; sectors and if we find one that is not correct (while it should be) just try ; again and hope we get the correct relative distance on the next attempt. ; On a real machine I found that trying 3-4 times is enough to get the correct ; data. Here we try up to 20 times. ld a,'V' call debug_log call print_pc db "Verifying ... ",0 ld hl,offset_buffer ld a,(nb_sectors) verify_loop ld (sector_cntr),a ld (ofst_buf_ptr),hl ld a,'v' call debug_log ;;push hl ;;call print_dec_a ; TODO print_dec ;;call print_pc ;;db ": ",0 ;;pop hl inc hl inc hl ld e,(hl) inc hl ld d,(hl) ; de = location of data mark ld a,e or d jp z,verify_next inc hl inc hl ld a,(hl) ; a = read sector status ld (crc_status),a inc hl ld c,(hl) inc hl ld b,(hl) ; bc = sector length inc hl push bc ld c,(hl) inc hl ld b,(hl) ; bc = sector data push bc pop ix ; ix = sector data ld b,4 ; length of data mark ld hl,#ffff ; initialize CRC circular_crc1 ld a,(de) inc de push bc call crc_byte pop bc ld a,(track_stop) cp e jr nz,circ_crc_next1 ld a,(track_stop+1) cp d jr nz,circ_crc_next1 ld de,trck_buffer circ_crc_next1 djnz circular_crc1 ld a,'w' call debug_log pop bc ; bc = sector length circular_crc ld a,(de) cp (ix+0) jr nz,verify_data inc de inc ix push bc call crc_byte pop bc ld a,(track_stop) cp e jr nz,circ_crc_next ld a,(track_stop+1) cp d jr nz,circ_crc_next ld de,trck_buffer circ_crc_next dec bc ld a,b or c jr nz,circular_crc ld a,'x' call debug_log ex de,hl ld b,(hl) inc hl ld c,(hl) ; bc = on-disk CRC (stored big endian) ex de,hl ; hl = calculated CRC or a sbc hl,bc jr z,crc_match ;;call print_pc ;;db " should have CRC error ... ", 0 crc_mismatch ld a,'m' call debug_log ld a,(crc_status) and 8 jr nz,verify_next ; ok, read sector command also returned CRC err ld a,'M' jr verify_retry verify_data ld a,'D' verify_retry call debug_log call print_pc db "FAILED",13,10,0 maybe_retry ld a,(retries) inc a ld (retries),a cp 20 jr c,do_retry jp retry_error do_retry ld a,(debug) or a jr z,no_debug_write call write_debug call select_fdc call seek no_debug_write jp retry crc_match ld a,'n' call debug_log ;;call print_pc ;;db " should not have CRC error ... ", 0 ld a,(crc_status) and 8 ld a,'N' jr nz,verify_retry ; CRC did match, but it shouldn't have verify_next ;;call print_pc ;;db "OK",13,10,0 ld hl,(ofst_buf_ptr) ld de,sizeof_offinfo add hl,de ld a,(sector_cntr) dec a jp nz,verify_loop verify_done ; Really done. ; Write the data to disk (the second drive). ; TODO this tool should also be usuable on machines with only one disk drive. ; So we should ask the user to swap disks. To make it more comfortable, we ; should try to minimize the number of required swaps. So we should buffer the ; data in (v)ram. success call enable_irq call print_pc db "Success!!!",13,10,0 ld a,(cylinder) ld hl,fcb+1+4 ld b,'0'-1 dec_loop inc b sub 10 jr nc,dec_loop ld (hl),b add a,'0'+10 inc hl ld (hl),a ld a,(side) add a,'0' inc hl inc hl ld (hl),a retry_open ld de,fcb ld c,#16 ; create file call #0005 or a jp nz,open_error ld hl,1 ld (fcb+14),hl ; set record size (1 byte) ld hl,0 ld (fcb+33),hl ld (fcb+35),hl ; record number ld de,dmk_header ld c,#1a ; set disk transfer address call #0005 ld hl,(track_len) ld bc,128 add hl,bc ; hl = #bytes to write ld de,fcb ld c,#26 ; random block write call #0005 or a jp nz,write_error ld de,fcb ld c,#10 ; close file call #0005 or a jp nz,close_error ld a,(side) inc a cp 2 jp nz,side_loop ;; TODO use step-in ld a,(stop_track) inc a ld b,a ld a,(cylinder) inc a cp b jp nz,cylinder_loop exit call deselect_fdc call enable_irq ld c,#00 jp #0005 ; exit program ; We didn't find any sectors in this track. If we're already at cylinder 80 or ; higher this means we're done. Though if the user explicitly set the ; stop-cylinder, we continue until that cylinder. ; ; In case there's a 81th track on side 0, but not on side 1 we don't want to ; stop dumping because the combine-dmk tool expects to see always track info ; for both sides. no_sectors ld a,(cylinder) cp 80 jp c,verify_done ; not yet at cylinder 80 ld a,(stop_set) or a jp nz,verify_done ; user explicitly set end-cylinder ld a,(side) or a jp nz,verify_done ; if we're not on side 0, then continue call print_pc db 13,10 db "End of disk detected.",13,10,0 jp exit open_error call print_pc db "Error opening file",0 err_retry call print_pc db " ... press key to retry ...",0 ld ix,#009f ld iy,(#fcc0) call #001c call print_pc db 13,10,0 jp retry_open write_error call print_pc db "Error writing file",13,10,0 delete_file ld de,fcb ld c,#13 ; delete file call #0005 ; when the disk is full we get a write error ; but it also leaves a zero-sized file behind jr err_retry ; so here we delete it close_error call print_pc db "Error closing file",13,10,0 jr delete_file ofst_err call print_pc db "Failed to find address mark in raw track data 0x",0 ld hl,(addr_estimate) call print_hex_hl call print_pc db 13,10,0 jp maybe_retry sector_err call print_pc db "Read sector command didn't find sector",0 jp maybe_retry retry_error call print_pc db "Unsuccessful after 20 retries :-(",13,10,0 jr debug_exit buffer_overflow call print_pc db "Sector buffer overflow",13,10,0 debug_exit call write_debug jp exit write_debug call print_pc db "Writing debug file ...",13,10,0 ld de,fcb_debug ld c,#16 ; create file call #0005 or a jr nz,debug_error ld hl,1 ld (fcb_debug+14),hl ; set record size (1 byte) ld hl,0 ld (fcb_debug+33),hl ld (fcb_debug+35),hl ; record number ld de,#8000 ld c,#1a ; set disk transfer address call #0005 ld hl,#4000 ld de,fcb_debug ld c,#26 ; random block write call #0005 or a jr nz,debug_error ld de,fcb_debug ld c,#10 ; close file call #0005 or a jr nz,debug_error ret debug_error call print_pc db "Error while writing debug file",13,10,0 ret unknown_option call print_pc db "Unknown command line option",13,10,0 jp exit expected_int call print_pc db "Error parsing command line: expected integer",13,10,0 jp exit ; We disable VDP IRQs because the BIOS print routine enables interrupts (EI) ; and that interferes with the low level drive settings we're doing (e.g. it ; can turn the motor off) a better solution would be to make sure we only print ; at non-critical places and/or restore all FDC state after a print. Or write ; our own printing routine. And of course there could be other IRQ sources in ; the MSX machine, so this is really only a hack (though would those other ; sources also trigger the motor timeout mechanism??) disable_irq di ld a,(#f3e0) and #df out (#99),a ld (#f3e0),a ld a,1+128 out (#99),a ; disable VDP IRQs ret enable_irq di ld a,(#f3e0) or #20 out (#99),a ld (#f3e0),a ld a,1+128 out (#99),a ei ret select_fdc call disable_irq ld iy,(driver_select) jp (iy) deselect_fdc ld iy,(driver_deselect) jp (iy) seek ld iy,(driver_seek) jp (iy) circular_ldir ld a,(hl) ld (de),a inc de inc hl ld a,(track_stop) cp e jr nz,ldir_next ld a,(track_stop+1) cp d jr nz,ldir_next ld de,trck_buffer ldir_next dec bc ld a,b or c jr nz,circular_ldir ret delay: ld hl,50000 delay0 ex (sp),hl ex (sp),hl dec hl ld a,h or l jr nz,delay0 ret ; Input: [DE] = ptr to start of block ; [IX] = ptr to end of block (right after end) ; [HL] = previous result (or zero), now search for a longer period ; Output [HL] = period get_period: inc hl p_loop: push hl push de call test_period pop de pop hl ret z inc hl jr p_loop ; In: [de] = start ; [ix] = end ; [hl] = candidate period ; Out: Z -> period found ; NZ -> period not found test_period: add hl,hl add hl,hl add hl,hl add hl,de t_loop: ld a,l cp ixl jr nz,test_1 ld a,h cp ixh ret z test_1: ld b,6 c_loop ld a,(de) cp (hl) ret nz inc hl inc de djnz c_loop inc de inc de inc hl inc hl jr t_loop ; Fractional division. ; Requires that the divisor is strictly bigger than the dividend (BC > HL). ; In: [HL] Dividend ; [BC] Divisor ; Out: [DE] = fractional part of [HL]/[BC] frac_div: ld a,b cpl ld b,a ld a,c cpl ld c,a inc bc ; bc = -divider ld de,1 ; stop after 16 iterations fdiv_loop add hl,hl ; hl <<= 1 add hl,bc ; hl -= divider jr c,fdiv1 ; hl.prev >= divider sbc hl,bc ; restore hl (carry flag remains clear) fdiv1 rl e rl d ; adc de,de jr nc,fdiv_loop ret ; [HL] = mul-high([DE], [BC]) mul_hi: ld hl,0 ld a,16 mul_loop srl d rr e jr nc,mul_skip add hl,bc mul_skip rr h rr l dec a jr nz,mul_loop ret ; In: [HL] = current CRC value ; [A] = input byte ; Out [HL] = updated CRC Value crc_byte: ld c,a ld b,8 crc_l: add hl,hl jr c,crc_1 crc_0: rlc c jr c,crc_2 jr crc_3 crc_1: rlc c jr c,crc_3 crc_2 ld a,h xor #10 ld h,a ld a,l xor #21 ld l,a crc_3: djnz crc_l ret parse_dec ld b,0 ld a,(hl) parse_dec_loop inc hl sub '0' jp c,expected_int cp '9'+1 jp nc,expected_int ld c,a ld a,b add a,a add a,a add a,a add a,b add a,b ; b*10 add a,c ld b,a ld a,(hl) or a jr z,parse_dec_end cp 13 jr z,parse_dec_end cp ' ' jr z,parse_dec_end cp 9 jr nz,parse_dec_loop parse_dec_end ld a,b ret print_pc: pop hl call print_str jp (hl) print_str: ld a,(hl) or a ret z ld ix,#00A2 ld iy,(#fcc0) call #001c inc hl jr print_str print_hex_hl: ld a,h call print_hex_a ld a,l print_hex_a: ld b,a rrca rrca rrca rrca call print_hdig ld a,b print_hdig: and #0f cp 10 jr c,prt_1 add a,'A'-'0'-10 prt_1 add a,'0' ld ix,#00A2 ld iy,(#fcc0) jp #001c print_dec_hl ld e,0 ; number of non-zero digits ld a,h or l jr z,print_dec_hl_3 ; hl==0 -> print at least one 0-digit ld bc,-10000 call print_dec_hl_1 ld bc,-1000 call print_dec_hl_1 ld bc,-100 call print_dec_hl_1 ld c,-10 call print_dec_hl_1 ld c,-1 print_dec_hl_1 ld a,-1 print_dec_hl_2 inc a add hl,bc jr c,print_dec_hl_2 sbc hl,bc inc e or a jr nz,print_dec_hl_3 dec e ret z ; skip leading zeros print_dec_hl_3 add a,'0' ld ix,#00A2 ld iy,(#fcc0) jp #001c print_dec_a ld e,0 or a jr z,print_dec_a_3 ld b,100 call print_dec_a_1 ld b,10 call print_dec_a_1 ld b,1 print_dec_a_1 ld c,-1 print_dec_a_2 inc c sub b jr nc,print_dec_a_2 add a,b ld b,a inc e ld a,c or a jr nz,print_dec_a_3 dec e jr z,print_dec_a_4 print_dec_a_3 add a,'0' ld ix,#00A2 ld iy,(#fcc0) call #001c print_dec_a_4 ld a,b ret debug_log push hl ld hl,(debug_ptr) ld (hl),a inc l ld (debug_ptr),hl pop hl ret ;--- ; Machine specific routines ; All these routine are still very much based on a WD2793 FDC. They only ; differ in how the WD2793 is connected to the MSX. Each 'driver' needs ; to implement 6 routines: ; 1) select ; input: ; 'side' global variable ; output: - ; description: ; Needs to select the disk rom in page 1 (for memory mapped FDCs). ; Needs to select correct side, select drive A, turn motor on. ; 2) deselct ; input: - ; output: - ; description: ; Called right before program exit. Should e.g. turn drive motor off. ; 3) seek ; input: 'cylinder' ; output: - ; description: ; Should seek to the correct cylinder. E.g. by first seeking to track 0 ; and then seek to the requested cylinder. It's not allowed to use the data ; in the track for this seek (e.g. verify the destination track). ; TODO in the future we may add a step-in command as well. ; 4) rd_addr ; input: - ; output: ; 'addr_buffer' is filled in ; [DE] points to end of addr_buffer ; description: ; Executes 'read address' commands in a loop and put the result in a buffer. ; During this loop it keep a counter running and on each successful read ; address command, the value of this counter is also stored in the buffer. ; return: ; on success this routine jumps to 'addr_done' ; on error it jumps to 'addr_error' ; 5) rd_track ; input: - ; output: ; 'trck_buffer' is filled in ; [DE] points to the end of trck_buffer ; description: ; return: ; on success this routine jumps to 'track_end' ; on error it jumps to 'track_err' or 'track_too_much' ; 6) rd_sector ; input: ; [B] = track number (number found in address mark, not physical track number) ; [C] = Sector number (found in address mark) ; [DE] = pointer to output buffer ; [HL] = delay value ; 'read_speed' global variable ; output: ; buffer is filled in ; [A] = WD2793 status register after command has ended (e.g. contains CRC status) ; [DE] = points to end of buffer ; [IX] = time between end-of-delay and first-byte-received ; description: ; Reads the sector with given number in the given buffer. This routine should ; wait for the index pulse and then delay for the given amount of time before ; actually starting the read sector command ; return: ; on success this routine jumps to sector_end ; on error it jumps to sector_err driver_routines driver_select dw 0 driver_deselect dw 0 driver_seek dw 0 driver_rd_addr dw 0 driver_rd_trck dw 0 driver_rd_sect dw 0 ticks_min dw 0 ticks_max dw 0 driver_size equ $ - driver_routines driver dw phil_driver ;--- ; Philips phil_status equ #7ff8 phil_command equ #7ff8 phil_track equ #7ff9 phil_sector equ #7ffa phil_data equ #7ffb phil_control1 equ #7ffc phil_control2 equ #7ffd phil_stat2 equ #7fff phil_driver dw phil_select dw phil_deselect dw phil_seek dw phil_rd_addr dw phil_rd_trck dw phil_rd_sector dw 13834 dw 15290 ; 1) select phil_select ld a,(#f348) ld h,#40 call #0024 ; select FDC slot in page 1 ld a,(side) ld (phil_control1),a ld a,#c0 ; motor on, led on, drive A ld (phil_control2),a ret ; 2) deselct phil_deselect ld a,3 ld (phil_control2),a ret ; 3) seek phil_seek wait_busy_3 ld a,(phil_status) and 1 jr nz,wait_busy_3 ld a,#0b ; restore, load head ld (phil_command),a call delay wait_busy_4 ld a,(phil_status) and 1 jr nz,wait_busy_4 ld a,(cylinder) ld (phil_data),a ; track ld a,#18 ; seek ld (phil_command),a ret ; 4) rd_addr phil_rd_addr: ld de,addr_buffer ld ix,0 ; counter ld hl,phil_stat2 ; irq/dtrq ld bc,phil_data wait_busy_1 ld a,(phil_status) and 1 jr nz,wait_busy_1 ld a,#d0 ; Forced interrupt command ld (phil_command),a ; otherwise we don't see the index ex (sp),hl ex (sp),hl ; needed? wait_index_a1 ld a,(phil_status) and 2 ; wait till index pulse = 0 jr nz,wait_index_a1 wait_index_b1 ld a,(phil_status) and 2 ; wait till index pulse = 1 jr z,wait_index_b1 addr_loop ld a,#c0 ld (phil_command),a ; read addr ; Note: the timinig of this loop is important! Don't change ; the instructions (e.g. JP->JR) without also changing the ; other timing critical routines below. addr_wait inc ix ; 12 cycles <-- this subset ld a,(hl) ; 8 <-- of the loop add a,a ; 5 <-- takes jp p,addr_end ; 11 <-- 47 jp c,addr_wait ; 11 <-- cycles ld a,(bc) ; 8 ld (de),a ; 8 inc de ; 7 jp addr_wait ; 11 addr_end ld a,(phil_status) and 16 jr nz,addr_error_ ; prefer to keep this a short jump ld a,ixl ld (de),a inc de ld a,ixh ld (de),a ; store counter inc de inc ix inc ix cp #c0 jp c,addr_loop jp addr_done addr_error_ jp addr_error ; 5) rd_track phil_rd_trck ld de,trck_buffer ld hl,phil_stat2 ; irq/dtrq ld bc,phil_data ld ix,0 ld a,#e0 ; read track ld (phil_command),a track_wait2 ld a,(hl) add a,a jp p,track_err jp nc,track_first inc ix ld a,ixh inc a jp nz,track_wait2 jp track_no_start track_wait ld a,(hl) add a,a jp p,track_end jp c,track_wait track_first ld a,(bc) ld (de),a inc de ld a,d cp #be jp c,track_wait jp track_too_much ; 6) rd_sector phil_rd_sector ld a,#d0 ; Forced interrupt command ld (phil_command),a ; otherwise we don't see the index ; pulse status bits ld a,b ld (phil_track),a ld a,c ld (phil_sector),a ld bc,phil_data ld ix,0 ld a,(read_speed) or a jr nz,fast_read_1 wait_index_a2 ld a,(phil_status) and 2 ; wait till index pulse = 0 jr nz,wait_index_a2 wait_index_b2 ld a,(phil_status) and 2 ; wait till index pulse = 1 jr z,wait_index_b2 ; This loop is tuned for an exact number of Z80 cycles! delay_loop dec hl ; 7 cycles ld a,(0) ; dummy read 14 cycles nop ; 5 cycles ld a,h ; 5 or l ; 5 jp nz,delay_loop ; 11 together 47 cycles fast_read_1 ld hl,phil_stat2 ; irq/dtrq ld a,#80 ; read sector ld (phil_command),a sector_wait1 inc ix ; count till first byte is received ld a,(hl) add a,a jp p,sector_err ; command stopped before we got 1st byte jp c,sector_wait1 ld a,(bc) ld (de),a inc de sector_wait2 ld a,(hl) add a,a jp p,sector_end_ jp c,sector_wait2 ld a,(bc) ld (de),a inc de jp sector_wait2 sector_end_ ld a,(phil_status) jp sector_end ;--- ; National natl_status equ #7fb8 natl_command equ #7fb8 natl_track equ #7fb9 natl_sector equ #7fba natl_data equ #7fbb natl_control equ #7fbc natl_stat2 equ #7fbc natl_driver dw natl_select dw natl_deselect dw natl_seek dw natl_rd_addr dw natl_rd_trck dw natl_rd_sector dw 13834 dw 15290 ; 1) select natl_select ld a,(#f348) ld h,#40 call #0024 ; select FDC slot in page 1 ld a,(side) rlca rlca ; bit 2 = side or #09 ; motor on, drive A ld (natl_control),a ret ; 2) deselct natl_deselect xor a ld (natl_control),a ret ; 3) seek natl_seek natl_wait_3 ld a,(natl_status) and 1 jr nz,natl_wait_3 ld a,#0b ; restore, load head ld (natl_command),a call delay natl_wait_4 ld a,(natl_status) and 1 jr nz,natl_wait_4 ld a,(cylinder) ld (natl_data),a ; track ld a,#18 ; seek ld (natl_command),a ret ; 4) rd_addr natl_rd_addr: ld de,addr_buffer ld ix,0 ; counter ld hl,natl_stat2 ; irq/dtrq ld bc,natl_data natl_busy_1 ld a,(natl_status) and 1 jr nz,natl_busy_1 ld a,#d0 ; Forced interrupt command ld (natl_command),a ; otherwise we don't see the index ex (sp),hl ex (sp),hl ; needed? natl_index_a1 ld a,(natl_status) and 2 ; wait till index pulse = 0 jr nz,natl_index_a1 natl_index_b1 ld a,(natl_status) and 2 ; wait till index pulse = 1 jr z,natl_index_b1 natl_addr_loop ld a,#c0 ld (natl_command),a ; read addr ; Note: the timinig of this loop is important! Don't change ; the instructions (e.g. JP->JR) without also changing the ; other timing critical routines below. natl_addr_wait inc ix ; 12 cycles <-- this subset ld a,(hl) ; 8 <-- of the loop add a,a ; 5 <-- takes jp c,natl_addr_end ; 11 <-- 47 jp m,natl_addr_wait; 11 <-- cycles ld a,(bc) ; 8 ld (de),a ; 8 inc de ; 7 jp natl_addr_wait ; 11 natl_addr_end ld a,(natl_status) and 16 jr nz,natl_addr_err ; prefer to keep this a short jump ld a,ixl ld (de),a inc de ld a,ixh ld (de),a ; store counter inc de inc ix inc ix cp #c0 jp c,natl_addr_loop jp addr_done natl_addr_err jp addr_error ; 5) rd_track natl_rd_trck ld de,trck_buffer ld hl,natl_stat2 ; irq/dtrq ld bc,natl_data ld ix,0 ld a,#e0 ; read track ld (natl_command),a natl_trk_wt2 ld a,(hl) add a,a jp c,track_err jp p,natl_trk_first inc ix ld a,ixh inc a jp nz,natl_trk_wt2 jp track_no_start natl_trk_wait ld a,(hl) add a,a jp c,track_end jp m,natl_trk_wait natl_trk_first ld a,(bc) ld (de),a inc de ld a,d cp #be jp c,natl_trk_wait jp track_too_much ; 6) rd_sector natl_rd_sector ld a,#d0 ; Forced interrupt command ld (natl_command),a ; otherwise we don't see the index ; pulse status bits ld a,b ld (natl_track),a ld a,c ld (natl_sector),a ld bc,natl_data ld ix,0 ld a,(read_speed) or a jr nz,natl_fast_read natl_index_a2 ld a,(natl_status) and 2 ; wait till index pulse = 0 jr nz,natl_index_a2 natl_index_b2 ld a,(natl_status) and 2 ; wait till index pulse = 1 jr z,natl_index_b2 ; This loop is tuned for an exact number of Z80 cycles! natl_delay dec hl ; 7 cycles ld a,(0) ; dummy read 14 cycles nop ; 5 cycles ld a,h ; 5 or l ; 5 jp nz,natl_delay ; 11 together 47 cycles natl_fast_read ld hl,natl_stat2 ; irq/dtrq ld a,#80 ; read sector ld (natl_command),a natl_sect_wt1 inc ix ; count till first byte is received ld a,(hl) add a,a jp c,sector_err ; command stopped before we got 1st byte jp m,natl_sect_wt1 ld a,(bc) ld (de),a inc de natl_sect_wt2 ld a,(hl) add a,a jp c,natl_sect_end jp m,natl_sect_wt2 ld a,(bc) ld (de),a inc de jp natl_sect_wt2 natl_sect_end ld a,(natl_status) jp sector_end ;--- ; Microsol mics_status equ #d0 mics_command equ #d0 mics_track equ #d1 mics_sector equ #d2 mics_data equ #d3 mics_control equ #d4 mics_stat2 equ #d4 mics_driver dw mics_select dw mics_deselect dw mics_seek dw mics_rd_addr dw mics_rd_trck dw mics_rd_sector dw 14135 dw 15622 ; 1) select mics_select ld a,(side) rlca rlca rlca rlca ; bit 4 = side or #21 ; bit 5 = motor, bit 0 = drive A out (mics_control),a ret ; 2) deselct mics_deselect xor a ; no drive selected, motor off out (mics_control),a ret ; 3) seek mics_seek mics_busy_3 in a,(mics_status) and 1 jr nz,mics_busy_3 ld a,#0b ; restore, load head out (mics_command),a call delay mics_busy_4 in a,(mics_status) and 1 jr nz,mics_busy_4 ld a,(cylinder) out (mics_data),a ; track ld a,#18 ; seek out (mics_command),a ret ; 4) rd_addr mics_rd_addr: ld de,addr_buffer ld hl,0 ; counter mics_busy_1 in a,(mics_status) and 1 jr nz,mics_busy_1 ld a,#d0 ; Forced interrupt command out (mics_command),a ; otherwise we don't see the index ex (sp),hl ex (sp),hl ; needed? mics_index_a1 in a,(mics_status) and 2 ; wait till index pulse = 0 jr nz,mics_index_a1 mics_index_b1 in a,(mics_status) and 2 ; wait till index pulse = 1 jr z,mics_index_b1 mics_addr_loop ld a,#c0 ; read addr out (mics_command),a ; Note: the timinig of this loop is important! Don't change ; the instructions (e.g. JP->JR) without also changing the ; other timing critical routines below. mics_addr_wait inc hl ; 7 cycles <-- this in a,(mics_stat2) ; 12 <-- takes add a,a ; 5 <-- 46 jp c,mics_addr_end ; 11 <-- cycles jp m,mics_addr_wait ; 11 <-- in a,(mics_data) ; 12 ld (de),a ; 8 inc de ; 7 jp mics_addr_wait ; 11 mics_addr_end in a,(mics_status) and 16 ; record not found jr nz,mics_addr_err ; prefer to keep this a short jump ld a,l ld (de),a inc de ld a,h ld (de),a ; store counter inc de inc hl inc hl cp #c0 jp c,mics_addr_loop jp addr_done mics_addr_err jp addr_error ; 5) rd_track mics_rd_trck ld de,trck_buffer ld hl,0 ld a,#e0 ; read track out (mics_command),a mics_trk_wait2 in a,(mics_stat2) add a,a jp c,track_err jp p,mics_trk_first inc hl ld a,h inc a jp nz,mics_trk_wait2 jp track_no_start mics_trk_wait in a,(mics_stat2) add a,a jp c,track_end jp m,mics_trk_wait mics_trk_first in a,(mics_data) ld (de),a inc de ld a,d cp #be jp c,mics_trk_wait jp track_too_much ; 6) rd_sector mics_rd_sector ld a,#d0 ; Forced interrupt command out (mics_command),a ; otherwise we don't see the index ; pulse status bits ld a,b out (mics_track),a ld a,c out (mics_sector),a ld ix,0 ld a,(read_speed) or a jr nz,mics_fast_1 mics_index_a2 in a,(mics_status) and 2 ; wait till index pulse = 0 jr nz,mics_index_a2 mics_index_b2 in a,(mics_status) and 2 ; wait till index pulse = 1 jr z,mics_index_b2 ; This loop is tuned for an exact number of Z80 cycles! mics_delay dec hl ; 7 cycles cp 0 ; 8 (dummy compare) nop ; 5 nop ; 5 ld a,h ; 5 or l ; 5 jp nz,mics_delay ; 11 together 46 cycles mics_fast_1 ld a,#80 ; read sector out (mics_command),a mics_sctr_wt1 inc ix ; count till first byte is received in a,(mics_stat2) add a,a jp c,sector_err ; command stopped before we got 1st byte jp m,mics_sctr_wt1 in a,(mics_data) ld (de),a inc de mics_sctr_wt2 in a,(mics_stat2) add a,a jp c,mics_sctr_end jp m,mics_sctr_wt2 in a,(mics_data) ld (de),a inc de jp mics_sctr_wt2 mics_sctr_end in a,(mics_status) jp sector_end ; ----- ofst_tab: dw -6,-7,-5,-8,-4,-9,-3,-10,-2,-11,-1,-12,0 dw -13,1,-14,2,-15,3,-16,4,-17,5,-18,6,-19,7 dw -20,8,-21,9,-22,10,-23,11,-24,12,-25,13,-26 dw 14,-27,15,-28,16,-29,17,-30,18,-31,29,-32 dw 20,-33,21,-34,22,-35,23,-36,24,-37,25,-38 dw 26,-39,27,-40,28,-41,29,-42,30,-43,31,-44 dw #8080 addr_mark db #A1,#A1,#A1,#FE debug db 0 start_track db 0 ; initial value matters stop_track db 81 ; by default we try 2 extra cylinders stop_set db 0 fcb db 2 ; drive B db "DMK-TT-S" ; filename db "DAT" ; extension ds 37-12 fcb_debug db 2 ; drive B db "DEBUG " ; filename db "DAT" ; extension ds 37-12 ; struct Addr_Mark ; byte C ; byte H ; byte R ; byte N ; word CRC ; word ticks sizeof_amark equ 8 ofst_amark_C equ 0 ofst_amark_H equ 1 ofst_amark_R equ 2 ofst_amark_N equ 3 ofst_amark_CRC equ 4 ofst_amark_tick equ 6 ; struct Offset_Info ; word address_mark_offset ; word data_mark_offset ; byte data_mark_type ; byte read_sector_status ; word sector_size sizeof_offinfo equ 10 ofst_oi_addr equ 0 ofst_oi_data equ 2 ofst_oi_type equ 4 ofst_oi_status equ 5 ofst_oi_size equ 6 ofst_oi_ptr equ 8 sizeof_off_buf equ 64 * sizeof_offinfo sizeof_dmk_h equ 128 cylinder equ #8000 ; db 0 0 side equ cylinder+ 1 ; db 0 1 retries equ side+1 ; db 0 2 nb_sectors equ retries+1 ; dw 0 3 track_len equ nb_sectors+2 ; dw 0 5 track_stop equ track_len+2 ; dw 0 7 ticks equ track_stop+2 ; dw 0 9 ratio equ ticks+2 ; dw 0 11 crc_retries equ ratio+2 ; db 0 13 adjust_ofst equ crc_retries+1 ; dw 0 14 adjust_scale equ adjust_ofst+2 ; dw 0 16 sector_cntr equ adjust_scale+2 ; db 0 18 sector_stop equ sector_cntr+1 ; dw 0 19 addr_buf_ptr equ sector_stop+2 ; dw 0 21 ofst_buf_ptr equ addr_buf_ptr+2 ; dw 0 23 dmk_ptr equ ofst_buf_ptr+2 ; dw 0 25 addr_estimate equ dmk_ptr+2 ; dw 0 27 read_speed equ addr_estimate+2 ; db 0 29 sector_buf_ptr equ read_speed+1 ; dw 0 30 crc_status equ sector_buf_ptr+2; db 0 32 debug_ptr equ crc_status+1 ; dw 0 33 sector_size equ debug_ptr+2 ; dw 0 35 addr_buf_end equ sector_size+2 ; dw 0 37 addr_retries equ addr_buf_end+2 ; db 0 39 addr_buffer equ #8100 offset_buffer equ addr_buffer+64*sizeof_amark ; can overlap part of addr_buffer dmk_header equ offset_buffer+sizeof_off_buf trck_buffer equ dmk_header+sizeof_dmk_h sector_buffer equ trck_buffer+#1A00 ; overlaps 2nd copy of track`` unique_buffer equ #BE00 ; possibly overlaps sector buffer (that's OK) ; must start at a 256-byte boundary debug_buffer equ #BF00 ; must be 256-bytes aligned openMSX-RELEASE_0_14_0/Contrib/dmk/READ-DMK_instructions.txt000066400000000000000000000055211314057512400233200ustar00rootroot00000000000000Instructions: * It only works on MSX systems with 2 disk drives * Your disk drive controller needs to be WD2793 compatible * The output of the tool is a DAT file for each cylinder/head combination. Typically that means 160 DAT files for a 720kB DS DD disk How to make a DMK file (happy flow): * Start the tool from MSX-DOS. Extra command line options below. * As the tool instructs you: put the disk to dump in drive A and the destination disk in drive B. * Not all DAT files will fit on a single MSX disk. Swap disks when the tool reports a write error when saving the DAT file. You can use 2 different destination disks or first copy the DAT files to another place and erase the destination disk to continue. * Get the DAT files to your PC. You'll need a PC program to combine the DAT files into a single DMK disk image. A Windows binary can be found here: http://openmsx.org/temp/combine-dmk.exe (source code is in this directory). Run this tool in a command shell from a directory where you put all the DAT files created by the read-dmk tool. It will output the file out.dmk, which is the DMK disk image which works in openMSX. If the tool gives any error, please let us know. * You can test the resulting DMK image on openMSX Command line options: * type=[PHILIPS|NATIONAL|MICROSOL]: specify the way the FDC registers are mapped into memory or I/O ports. Philips is mostly for the Philips and Sony machines/drives (e.g. Sony HBK-30/HBD-F1/HBD-50, Sharp HB-3600, Philips VY-0010, Philips NMS 8245/8250/8255/8280, Philips VG 8230/35, Sony HB-F1XD/F900/F1XDJ/F700x/G900/F500, Sanyo MPC-35FD), National for National and some others (e.g. National FS-5500F2/4700/4600/5000/5500F1, National CF-3300, Yamaha AX350II, Daewoo CPC-400S, Gradiente Expert DDPlus, Spectrtavideo SVI-738, Yamaha YIS-805/128R2 and probably Talent TPC-310) and Microsol for the port-based ones often seen in Brazil (like Microsol CDX-2). If you don't specify this option, the program will assume you use the Philips type. Note that only the Philips type has been tested on real hardware so far... (feedback welcome!) * debug=1: enable debugging mode. When dumping fails, the tool will write a DEBUG.DAT file. Please provide us with a photo of your MSX screen and the DEBUG.DAT file when dumping fails, so we can improve the tool :) * start=NN: specify start cylinder (use if you don't want to start from the beginning of the disk, first cylinder is 0) * stop=NN: specify stop cylinder (use if you don't need the whole disk dumped, stop earlier than end-of-disk detection finds) Example: read-dmk type=national debug=1 start=38 end=38 This will dump only cylinder 38 (for both sides, so 2 DAT files) with debug enabled and for national-type disk drives (see above). Usually you don't specify any options, except for the type if you don't have a Philips-like drive. openMSX-RELEASE_0_14_0/Contrib/dmk/analyze-dmk.cc000066400000000000000000000141241314057512400213310ustar00rootroot00000000000000#include #include #include #include #include #include using namespace std; typedef unsigned char byte; typedef unsigned short word; struct DmkHeader { byte writeProtected; byte numTracks; byte trackLen[2]; byte flags; byte reserved[7]; byte format[4]; }; class File { public: File(const string& filename, const char* mode) : f(fopen(filename.c_str(), mode)) { if (!f) { throw runtime_error("Couldn't open: " + filename); } } ~File() { fclose(f); } void read(void* data, int size) { if (fread(data, size, 1, f) != 1) { throw runtime_error("Couldn't read file"); } } private: FILE* f; }; // global variables for circular buffer vector buffer; int dmkTrackLen; static int modulo(int x, int y) { int z = x % y; // this calculates the remainder, not modulo! if (z < 0) z += y; return z; } static int trackIdx(int idx) { return modulo(idx, dmkTrackLen - 128); } static byte readCircular(int idx) { return buffer[128 + trackIdx(idx)]; } static void updateCrc(word& crc, byte val) { for (int i = 8; i < 16; ++i) { crc = (crc << 1) ^ ((((crc ^ (val << i)) & 0x8000) ? 0x1021 : 0)); } } static bool isValidDmkHeader(const DmkHeader& header) { if (!((header.writeProtected == 0x00) || (header.writeProtected == 0xff))) { return false; } int trackLen = header.trackLen[0] + 256 * header.trackLen[1]; if (trackLen >= 0x4000) return false; // too large track length if (trackLen <= 128) return false; // too small if (header.flags & ~0xd0) return false; // unknown flag set const byte* p = header.reserved; for (int i = 0; i < 7 + 4; ++i) { if (p[i] != 0) return false; } return true; } static void analyzeTrack() { for (int i = 0; i < 64; ++i) { // Get (and check) pointer into track data int dmkIdx = buffer[2 * i + 0] + 256 * buffer[2 * i + 1]; if (dmkIdx == 0) { // end of table reached break; } printf("%2d: ", i); if ((dmkIdx & 0xC000) != 0x8000) { printf("... skipping single-density sector\n"); continue; } dmkIdx &= ~0xC000; // clear flags if ((dmkIdx < 128) || (dmkIdx >= dmkTrackLen)) { printf("... skipping invalid IDAM offset (wrong DMK file)\n"); continue; } dmkIdx -= 128; // read (and check) address mark int addrIdx = trackIdx(dmkIdx - 3); byte d0 = readCircular(addrIdx + 0); byte d1 = readCircular(addrIdx + 1); byte d2 = readCircular(addrIdx + 2); byte d3 = readCircular(addrIdx + 3); byte c = readCircular(addrIdx + 4); byte h = readCircular(addrIdx + 5); byte r = readCircular(addrIdx + 6); byte n = readCircular(addrIdx + 7); byte ch = readCircular(addrIdx + 8); byte cl = readCircular(addrIdx + 9); if ((d0 != 0xA1) || (d1 != 0xA1) || (d2 != 0xA1) || (d3 != 0xFE)) { printf("... skipping wrong IDAM entry, does not point to an address mark\n"); continue; } // address mark CRC word addrCrc = 0xFFFF; updateCrc(addrCrc, d0); updateCrc(addrCrc, d1); updateCrc(addrCrc, d2); updateCrc(addrCrc, d3); updateCrc(addrCrc, c); updateCrc(addrCrc, h); updateCrc(addrCrc, r); updateCrc(addrCrc, n); int onDiskAddrCrc = 256 * ch + cl; bool addrCrcErr = onDiskAddrCrc != addrCrc; // print address mark info printf("AOfst=%4d C=%3d H=%3d R=%3d N=%3d ACrc=%04x,%s", addrIdx, c, h, r, n, onDiskAddrCrc, (addrCrcErr ? "ERR\n" : "ok ")); if (onDiskAddrCrc != addrCrc) { continue; } // locate data mark, should be within 43 bytes from end // of address mark (according to WD2793 datasheet) int j; for (j = 10; j < 53; ++j) { int dataIdx = addrIdx + j; byte a0 = readCircular(dataIdx + 0); byte a1 = readCircular(dataIdx + 1); byte a2 = readCircular(dataIdx + 2); byte t = readCircular(dataIdx + 3); if ((a0 != 0xA1) || (a1 != 0xA1) || (a2 != 0xA1)) { continue; } // calculate data CRC, data mark part word dataCrc = 0xFFFF; updateCrc(dataCrc, a0); updateCrc(dataCrc, a1); updateCrc(dataCrc, a2); updateCrc(dataCrc, t); // actual sector data int sectorSize = 128 << (n & 7); for (int j = 0; j < sectorSize; ++j) { byte d = readCircular(dataIdx + 4 + j); updateCrc(dataCrc, d); } byte crc1 = readCircular(dataIdx + 4 + sectorSize + 0); byte crc2 = readCircular(dataIdx + 4 + sectorSize + 1); int onDiskDataCrc = 256 * crc1 + crc2; bool dataCrcErr = onDiskDataCrc != dataCrc; char type = (t == 0xFB) ? 'n' : (t == 0xF8) ? 'd' : '?'; printf(" DOfst=%4d T=%c DCrc=%04x,%s\n", dataIdx, type, onDiskDataCrc, (dataCrcErr ? "ERR" : "ok ")); break; } if (j == 53) { printf(" data mark not found within 43 bytes from address mark\n"); } } } static void analyzeDisk(const string& input) { File inf(input, "rb"); DmkHeader header; inf.read(&header, sizeof(header)); if (!isValidDmkHeader(header)) { throw runtime_error("Invalid DMK header"); } int numCylinders = header.numTracks; int numSides = (header.flags & 0x10) ? 1 : 2; dmkTrackLen = header.trackLen[0] + 256 * header.trackLen[1]; buffer.resize(dmkTrackLen); printf("Legend:\n" " AOfst: address mark offset in track\n" " C: cylinder\n" " H: head\n" " R: record (sector number)\n" " N: sector size (in bytes: 128 << N)\n" " ACrc: CRC value of the address block\n" " DOfst: data mark offset in track\n" " T: data mark type (n = normal, d = deleted, ? = unknown)\n" " DCrc: CRC value of data block\n" "\n"); printf("Raw track length = %d bytes\n\n", dmkTrackLen - 128); for (int t = 0; t < numCylinders; ++t) { for (int h = 0; h < numSides; ++h) { printf("-- physical track %d, head %d\n", t, h); inf.read(&buffer[0], dmkTrackLen); analyzeTrack(); } } } int main(int argc, char** argv) { if (argc != 2) { printf("analyze-dmk\n" "\n" "Analyze the content of a DMK disk image.\n" "\n" "usage: %s \n", argv[0]); exit(1); } try { analyzeDisk(argv[1]); } catch (std::exception& e) { fprintf(stderr, "Error: %s\n", e.what()); } } openMSX-RELEASE_0_14_0/Contrib/dmk/combine-dmk.cc000066400000000000000000000216621314057512400213070ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned char byte; typedef unsigned short word; struct DmkHeader { byte writeProtected; byte numTracks; byte trackLen[2]; byte flags; byte reserved[7]; byte format[4]; }; /////// class Gaps { public: Gaps(int totalSize); void addInterval(int start, int stop); int getLargestGap(); private: void addUse2(int start, int stop); const int totalSize; vector v; }; Gaps::Gaps(int totalSize_) : totalSize(totalSize_) { } // [start, stop) void Gaps::addInterval(int start, int stop) { start %= totalSize; stop %= totalSize; if (start < stop) { addUse2(start, stop); } else if (start > stop) { addUse2(start, totalSize); if (stop != 0) addUse2(0, stop); } } void Gaps::addUse2(int start, int stop) { assert(start < stop); assert(stop <= totalSize); v.push_back(2 * start + 0); v.push_back(2 * stop + 1); } int Gaps::getLargestGap() { if (v.empty()) return totalSize / 2; // sort begin and end point sort(v.begin(), v.end()); // largest gap found so far (and its start and stop position) int maxLen = 0; int maxStart = 0; int maxStop = 0; // last end point is start of first gap int start = v.back() / 2; if (start == totalSize) start = 0; int count = 0; for (vector::const_iterator it = v.begin(); it != v.end(); ++it) { int i = *it; if (i & 1) { // interval end point --count; // no more overlapping intervals -> start of new gap if (count == 0) start = i / 2; } else { // interval begin point int stop = i / 2; if (count == 0) { // found gap: [start, stop) int len = stop - start; if (len < 0) len += totalSize; if (len > maxLen) { maxLen = len; maxStart = start; maxStop = stop; } } ++count; } } assert(count == 0); if (maxLen == 0) return -1; if (maxStop < maxStart) maxStop += totalSize; int mid = (maxStart + maxStop) / 2; return mid % totalSize; } /////// static byte readCircular(const vector& buffer, int idx) { int dmkTrackLen = buffer.size(); return buffer[128 + idx % (dmkTrackLen - 128)]; } static void updateCrc(word& crc, byte val) { for (int i = 8; i < 16; ++i) { crc = (crc << 1) ^ ((((crc ^ (val << i)) & 0x8000) ? 0x1021 : 0)); } } static void verifyDMK(bool b, const char* message) { if (!b) { fprintf(stderr, "Invalid input: %s\n", message); exit(1); } } static int analyzeTrack(vector& buffer) { int dmkTrackLen = buffer.size(); int trackLen = dmkTrackLen - 128; Gaps gaps(trackLen); for (int i = 0; i < 64; ++i) { // Get (and check) pointer into track data int dmkIdx = buffer[2 * i + 0] + 256 * buffer[2 * i + 1]; if (dmkIdx == 0) { // end of table reached break; } verifyDMK((dmkIdx & 0xC000) == 0x8000, "double density flag"); dmkIdx &= ~0xC000; // clear flags verifyDMK(dmkIdx >= 128, "IDAM offset too small"); verifyDMK(dmkIdx < dmkTrackLen, "IDAM offset too large"); dmkIdx -= 128; // read address mark int addrIdx = dmkIdx - 3; // might be negative byte d0 = readCircular(buffer, addrIdx + 0); byte d1 = readCircular(buffer, addrIdx + 1); byte d2 = readCircular(buffer, addrIdx + 2); byte d3 = readCircular(buffer, addrIdx + 3); byte c = readCircular(buffer, addrIdx + 4); byte h = readCircular(buffer, addrIdx + 5); byte r = readCircular(buffer, addrIdx + 6); byte n = readCircular(buffer, addrIdx + 7); byte ch = readCircular(buffer, addrIdx + 8); byte cl = readCircular(buffer, addrIdx + 9); // address mark CRC word addrCrc = 0xFFFF; updateCrc(addrCrc, d0); updateCrc(addrCrc, d1); updateCrc(addrCrc, d2); updateCrc(addrCrc, d3); updateCrc(addrCrc, c); updateCrc(addrCrc, h); updateCrc(addrCrc, r); updateCrc(addrCrc, n); word onDiskAddrCrc = 256 * ch + cl; if (onDiskAddrCrc != addrCrc) { // only mark address mark as in-use gaps.addInterval(addrIdx, addrIdx + 10); continue; } // locate data mark, should be within 43 bytes from end // of address mark (according to WD2793 datasheet) for (int i = 10; i < 53; ++i) { int dataIdx = addrIdx + i; byte a0 = readCircular(buffer, dataIdx + 0); byte a1 = readCircular(buffer, dataIdx + 1); byte a2 = readCircular(buffer, dataIdx + 2); byte t = readCircular(buffer, dataIdx + 3); if ((a0 != 0xA1) || (a1 != 0xA1) || (a2 != 0xA1) || ((t != 0xFB) && (t != 0xF8))) { continue; } // Mark whole region from begin of address mark to end // of data as in-use (so including the gap between // address and data section). int sectorSize = 128 << (n & 3); int end = dataIdx + 4 + sectorSize + 2; // header + data + crc gaps.addInterval(addrIdx, end); break; } // if (i == 53) --> data mark not found } return gaps.getLargestGap(); } int main() { vector > data; // buffer all .DAT files string name = "DMK-tt-s.DAT"; for (int t = 0; t <= 99; ++t) { for (int h = 0; h < 2; ++h) { name[4] = (t / 10) + '0'; name[5] = (t % 10) + '0'; name[7] = h + '0'; FILE* file = fopen(name.c_str(), "rb"); if (!file) { if (h == 0) goto done_read; fprintf(stderr, "Couldn't open file %s, but the " "corresponding file for side 0 was " "found.\n", name.c_str()); exit(1); } struct stat st; fstat(fileno(file), &st); size_t size = st.st_size; if (size < 128) { fprintf(stderr, "File %s is too small.\n", name.c_str()); exit(1); } vector dat(size); if (fread(dat.data(), size, 1, file) != 1) { fprintf(stderr, "Error reading file %s.\n", name.c_str()); exit(1); } data.push_back(dat); } } done_read: assert((data.size() & 1) == 0); int numTracks = data.size() / 2; // Check that no .dat files with higher track number are found. for (int t = numTracks; t <= 99; ++t) { for (int h = 0; h < 2; ++h) { name[4] = (t / 10) + '0'; name[5] = (t % 10) + '0'; name[7] = h + '0'; FILE* file = fopen(name.c_str(), "rb"); if (!file) continue; // ok, we should have this file string name2 = "DMK-tt-0.DAT"; name2[4] = (numTracks / 10) + '0'; name2[5] = (numTracks % 10) + '0'; fprintf(stderr, "Found file %s, but file %s is missing.\n", name.c_str(), name2.c_str()); exit(1); } } printf("Found .dat files for %d tracks (double sided).\n", numTracks); // Create histogram of tracklengths. map sizes; // length, count for (vector >::iterator it = data.begin(); it != data.end(); ++it) { unsigned size = it->size(); ++sizes[size]; } // Search the peak in this histogram (= the tracklength that occurs // most often). unsigned maxCount = 0; unsigned trackSize = 0; for (map::const_iterator it = sizes.begin(); it != sizes.end(); ++it) { if (it->second >= maxCount) { maxCount = it->second; trackSize = it->first; } } // Open output file. FILE* file = fopen("out.dmk", "wb+"); if (!file) { fprintf(stderr, "Couldn't open output file out.dmk.\n"); exit(1); } // Write DMK header. DmkHeader header; memset(&header, 0, sizeof(header)); header.numTracks = numTracks; header.trackLen[0] = trackSize % 256; header.trackLen[1] = trackSize / 256; if (fwrite(&header, sizeof(header), 1, file) != 1) { fprintf(stderr, "Error writing out.dmk.\n"); exit(1); } // Process each track. for (vector >::iterator it = data.begin(); it != data.end(); ++it) { vector& v = *it; // Adjust track size while (v.size() != trackSize) { // Locate (middle of) largest gap in this track. int mid = analyzeTrack(v) + 128; if (mid == -1) { fprintf(stderr, "Couldn't adjust track length.\n"); exit(1); } assert(mid < int(v.size())); // We insert or delete one byte at a time. This may not // be the most efficient approach (but still more than // fast enough, we typically only nned to adjust a few // bytes anyway). This has the advantage of being very // simple: it can easily handle gaps that wrap around // from the end to the beginning of the track and it // can handle the case that after decreasing a gap with // a few bytes another gaps becomes the largest gap. int delta; if (trackSize > v.size()) { delta = 1; v.insert(v.begin() + mid, v[mid]); } else { delta = -1; v.erase(v.begin() + mid); } // After inserting/deleting byte(s), we need to adjust // the IDAM table. for (int i = 0; i < 64; ++i) { int t = v[2 * i + 0] + 256 * v[2 * i + 1]; if (t == 0) break; if ((t & 0x3fff) > mid) t += delta; v[2 * i + 0] = t % 256; v[2 * i + 1] = t / 256; } } // Write track to DMK file. if (fwrite(v.data(), v.size(), 1, file) != 1) { fprintf(stderr, "Error writing out.dmk.\n"); exit(1); } } if (fclose(file)) { fprintf(stderr, "Error closing out.dmk.\n"); exit(1); } printf("Successfully wrote out.dmk.\n"); exit(0); } openMSX-RELEASE_0_14_0/Contrib/dmk/der2dmk.cc000066400000000000000000000133631314057512400204510ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned char byte; // 8 bit typedef unsigned short word; // 16 bit struct DiskInfo { int gap1; int gap2; int gap3; int gap4a; int gap4b; int sectorsPerTrack; int numberCylinders; int sectorSizeCode; bool doubleSided; }; struct DmkHeader { byte writeProtected; byte numTracks; byte trackLen[2]; byte flags; byte reserved[7]; byte format[4]; }; class File { public: File(const string& filename, const char* mode) : f(fopen(filename.c_str(), mode)) { if (!f) { throw runtime_error("Couldn't open: " + filename); } } ~File() { fclose(f); } void read(void* data, int size) { if (fread(data, size, 1, f) != 1) { throw runtime_error("Couldn't read file"); } } void write(const void* data, int size) { if (fwrite(data, size, 1, f) != 1) { throw runtime_error("Couldn't write file"); } } private: FILE* f; }; static void updateCrc(word& crc, byte val) { for (int i = 8; i < 16; ++i) { crc = (crc << 1) ^ ((((crc ^ (val << i)) & 0x8000) ? 0x1021 : 0)); } } static void fill(byte*& p, int len, byte value) { memset(p, value, len); p += len; } void convert(const DiskInfo& info, const string& dsk, const string& der, const string& dmk) { int numSides = info.doubleSided ? 2 : 1; int sectorSize = 128 << info.sectorSizeCode; int totalTracks = numSides * info.numberCylinders; int totalSectors = totalTracks * info.sectorsPerTrack; int totalSize = totalSectors * sectorSize; struct stat st; stat(dsk.c_str(), &st); if (st.st_size != totalSize) { throw runtime_error("Wrong input filesize"); } File inf (dsk, "rb"); File derf(der, "rb"); File outf(dmk, "wb"); static const char* const DER_HEADER = "DiskImage errors\r\n\032"; char derHeader[20]; derf.read(derHeader, 20); if (memcmp(derHeader, DER_HEADER, 20) != 0) { throw runtime_error("Invalid .der file."); } int derSize = (totalSectors + 7) / 8; vector derBuf(derSize); derf.read(derBuf.data(), derSize); int rawSectorLen = 12 + 10 + info.gap2 + 12 + 4 + sectorSize + 2 + info.gap3; int rawTrackLen = info.gap4a + 12 + 4 + info.gap1 + info.sectorsPerTrack * rawSectorLen + info.gap4b; assert(rawTrackLen == 6250); int dmkTrackLen = rawTrackLen + 128; DmkHeader header; memset(&header, 0, sizeof(header)); header.numTracks = info.numberCylinders; header.trackLen[0] = dmkTrackLen & 0xff; header.trackLen[1] = dmkTrackLen >> 8; header.flags = (info.doubleSided ? (0 << 4) : (1 << 4)) | (0 << 6); // double density (MFM) outf.write(&header, sizeof(header)); vector addrPos(info.sectorsPerTrack); vector dataPos(info.sectorsPerTrack); vector buf(dmkTrackLen); // zero-initialized byte* ip = &buf[ 0]; // pointer in IDAM table byte* tp = &buf[128]; // pointer in actual track data fill(tp, info.gap4a, 0x4e); // gap4a fill(tp, 12, 0x00); // sync fill(tp, 3, 0xc2); // index mark fill(tp, 1, 0xfc); // fill(tp, info.gap1, 0x4e); // gap1 for (int sec = 0; sec < info.sectorsPerTrack; ++sec) { fill(tp, 12, 0x00); // sync fill(tp, 3, 0xa1); // ID addr mark int pos = tp - &buf[0]; assert(pos < 0x4000); *ip++ = pos & 0xff; *ip++ = (pos >> 8) | 0x80; // double density (MFM) sector fill(tp, 1, 0xfe); // ID addr mark (cont) addrPos[sec] = tp; fill(tp, 6, 0x00); // C H R N CRC (overwritten later) fill(tp, info.gap2, 0x4e); // gap2 fill(tp, 12, 0x00); // sync fill(tp, 3, 0xa1); // data mark fill(tp, 1, 0xfb); // dataPos[sec] = tp; fill(tp, sectorSize, 0x00); // sector data (overwritten later) fill(tp, 2, 0x00); // CRC (overwritten later) fill(tp, info.gap3, 0x4e); // gap3 } fill(tp, info.gap4b, 0x4e); // gap4b assert((tp - &buf[0]) == dmkTrackLen); int derCount = 0; for (int cyl = 0; cyl < info.numberCylinders; ++cyl) { for (int head = 0; head < numSides; ++head) { for (int sec = 0; sec < info.sectorsPerTrack; ++sec) { byte* ap = addrPos[sec]; *ap++ = cyl; *ap++ = head; *ap++ = sec + 1; *ap++ = info.sectorSizeCode; word addrCrc = 0xffff; const byte* t1 = ap - 8; for (int i = 0; i < 8; ++i) { updateCrc(addrCrc, t1[i]); } *ap++ = addrCrc >> 8; *ap++ = addrCrc & 0xff; byte* dp = dataPos[sec]; inf.read(dp, sectorSize); dp += sectorSize; word dataCrc = 0xffff; const byte* t2 = dp - sectorSize - 4; for (int i = 0; i < sectorSize + 4; ++i) { updateCrc(dataCrc, t2[i]); } if (derBuf[derCount / 8] & (0x80 >> (derCount % 8))) { // create CRC error for this sector dataCrc ^= 0xffff; } ++derCount; *dp++ = dataCrc >> 8; *dp++ = dataCrc & 0xff; } outf.write(&buf[0], dmkTrackLen); } } } int main(int argc, char** argv) { if (argc != 4) { printf("der2dmk\n" "\n" "Utility to convert a dsk disk image with associated disk\n" "error file into a dmk disk image. At the moment this utility\n" "is limited to 720kB double sided, double density dsk images.\n" "\n" "Usage: %s \n", argv[0]); exit(1); } // TODO add command line options to make these parameters configurable DiskInfo info; info.gap1 = 50; info.gap2 = 22; info.gap3 = 84; info.gap4a = 80; info.gap4b = 182; // TODO calculate from other values info.sectorsPerTrack = 9; info.numberCylinders = 80; info.sectorSizeCode = 2; // 512 = 128 << 2 info.doubleSided = true; try { convert(info, argv[1], argv[2], argv[3]); } catch (std::exception& e) { fprintf(stderr, "Error: %s\n", e.what()); } } openMSX-RELEASE_0_14_0/Contrib/dmk/dsk2dmk.cc000066400000000000000000000122121314057512400204500ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned char byte; // 8 bit typedef unsigned short word; // 16 bit static const unsigned int TRACK_LENGTH = 6250; struct DiskInfo { int gap1; int gap2; int gap3; int gap4a; int sectorsPerTrack; int numberCylinders; int sectorSizeCode; bool doubleSided; }; struct DmkHeader { byte writeProtected; byte numTracks; byte trackLen[2]; byte flags; byte reserved[7]; byte format[4]; }; class File { public: File(const string& filename, const char* mode) : f(fopen(filename.c_str(), mode)) { if (!f) { throw runtime_error("Couldn't open: " + filename); } } ~File() { fclose(f); } void read(void* data, int size) { if (fread(data, size, 1, f) != 1) { throw runtime_error("Couldn't read file"); } } void write(const void* data, int size) { if (fwrite(data, size, 1, f) != 1) { throw runtime_error("Couldn't write file"); } } private: FILE* f; }; static void updateCrc(word& crc, byte val) { for (int i = 8; i < 16; ++i) { crc = (crc << 1) ^ ((((crc ^ (val << i)) & 0x8000) ? 0x1021 : 0)); } } static void fill(byte*& p, int len, byte value) { memset(p, value, len); p += len; } void convert(const DiskInfo& info, const string& input, const string& output) { int numSides = info.doubleSided ? 2 : 1; int sectorSize = 128 << info.sectorSizeCode; int totalTracks = numSides * info.numberCylinders; int totalSectors = totalTracks * info.sectorsPerTrack; int totalSize = totalSectors * sectorSize; struct stat st; stat(input.c_str(), &st); if (st.st_size != totalSize) { throw runtime_error("Wrong input filesize"); } File inf(input, "rb"); File outf(output, "wb"); int rawSectorLen = 12 + 10 + info.gap2 + 12 + 4 + sectorSize + 2 + info.gap3; int gap4b = TRACK_LENGTH - (info.gap4a + 12 + 4 + info.gap1 + info.sectorsPerTrack * rawSectorLen); assert(gap4b > 0); int dmkTrackLen = TRACK_LENGTH + 128; DmkHeader header; memset(&header, 0, sizeof(header)); header.numTracks = info.numberCylinders; header.trackLen[0] = dmkTrackLen & 0xff; header.trackLen[1] = dmkTrackLen >> 8; header.flags = (info.doubleSided ? (0 << 4) : (1 << 4)) | (0 << 6); // double density (MFM) outf.write(&header, sizeof(header)); vector addrPos(info.sectorsPerTrack); vector dataPos(info.sectorsPerTrack); vector buf(dmkTrackLen); // zero-initialized byte* ip = &buf[ 0]; // pointer in IDAM table byte* tp = &buf[128]; // pointer in actual track data fill(tp, info.gap4a, 0x4e); // gap4a fill(tp, 12, 0x00); // sync fill(tp, 3, 0xc2); // index mark fill(tp, 1, 0xfc); // fill(tp, info.gap1, 0x4e); // gap1 for (int sec = 0; sec < info.sectorsPerTrack; ++sec) { fill(tp, 12, 0x00); // sync fill(tp, 3, 0xa1); // ID addr mark int pos = tp - &buf[0]; assert(pos < 0x4000); *ip++ = pos & 0xff; *ip++ = (pos >> 8) | 0x80; // double density (MFM) sector fill(tp, 1, 0xfe); // ID addr mark (cont) addrPos[sec] = tp; fill(tp, 6, 0x00); // C H R N CRC (overwritten later) fill(tp, info.gap2, 0x4e); // gap2 fill(tp, 12, 0x00); // sync fill(tp, 3, 0xa1); // data mark fill(tp, 1, 0xfb); // dataPos[sec] = tp; fill(tp, sectorSize, 0x00); // sector data (overwritten later) fill(tp, 2, 0x00); // CRC (overwritten later) fill(tp, info.gap3, 0x4e); // gap3 } fill(tp, gap4b, 0x4e); // gap4b assert((tp - &buf[0]) == dmkTrackLen); for (int cyl = 0; cyl < info.numberCylinders; ++cyl) { for (int head = 0; head < numSides; ++head) { for (int sec = 0; sec < info.sectorsPerTrack; ++sec) { byte* ap = addrPos[sec]; *ap++ = cyl; *ap++ = head; *ap++ = sec + 1; *ap++ = info.sectorSizeCode; word addrCrc = 0xffff; const byte* t1 = ap - 8; for (int i = 0; i < 8; ++i) { updateCrc(addrCrc, t1[i]); } *ap++ = addrCrc >> 8; *ap++ = addrCrc & 0xff; byte* dp = dataPos[sec]; inf.read(dp, sectorSize); dp += sectorSize; word dataCrc = 0xffff; const byte* t2 = dp - sectorSize - 4; for (int i = 0; i < sectorSize + 4; ++i) { updateCrc(dataCrc, t2[i]); } *dp++ = dataCrc >> 8; *dp++ = dataCrc & 0xff; } outf.write(&buf[0], dmkTrackLen); } } } int main(int argc, char** argv) { if (argc != 3) { printf("dsk2dmk\n" "\n" "Utility to convert a dsk disk image into a dmk disk\n" "image. At the moment this utility is limited to 720kB\n" "double sided, double density dsk images.\n" "\n" "Usage: %s \n", argv[0]); exit(1); } // TODO add command line options to make these parameters configurable DiskInfo info; info.gap1 = 50; info.gap2 = 22; info.gap3 = 84; info.gap4a = 80; info.sectorsPerTrack = 9; info.numberCylinders = 80; info.sectorSizeCode = 2; // 512 = 128 << 2 info.doubleSided = true; try { convert(info, argv[1], argv[2]); } catch (std::exception& e) { fprintf(stderr, "Error: %s\n", e.what()); } } openMSX-RELEASE_0_14_0/Contrib/dmk/empty-dmk.cc000066400000000000000000000020211314057512400210150ustar00rootroot00000000000000#include #include #include typedef unsigned char byte; struct DmkHeader { byte writeProtected; byte numTracks; byte trackLen[2]; byte flags; byte reserved[7]; byte format[4]; }; static const int RAW_TRACK_SIZE = 6250; // 250kbps, 300rpm int main(int argc, char** argv) { if (argc != 2) { printf("empty-dmk\n" "\n" "Utility to create an empty DMK disk image.\n" "The disk image is double sided and contains\n" "80 unformatted tracks.\n" "\n" "usage: %s \n", argv[0]); exit(1); } FILE* f = fopen(argv[1], "wb"); DmkHeader header; memset(&header, 0, sizeof(header)); header.numTracks = 80; header.trackLen[0] = (128 + RAW_TRACK_SIZE) & 255; header.trackLen[1] = (128 + RAW_TRACK_SIZE) >> 8; fwrite(&header, sizeof(header), 1, f); byte buf[128 + RAW_TRACK_SIZE]; memset(&buf[ 0], 0, 128); memset(&buf[128], 0x4e, RAW_TRACK_SIZE); for (int i = 0; i < 2 * 80; ++i) { fwrite(buf, sizeof(buf), 1, f); } fclose(f); } openMSX-RELEASE_0_14_0/Contrib/dmk/svi2dmk.cc000066400000000000000000000125461314057512400205020ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using namespace std; static const int TRACK_LENGTH = 6250; static const int DMK_TRACK_LEN = TRACK_LENGTH + 128; static const int NUM_CYLINDERS = 40; static const int GAP1 = 50; static const int GAP2 = 22; static const int GAP3 = 34; static const int GAP4a = 80; struct DmkHeader { uint8_t writeProtected; uint8_t numTracks; uint8_t trackLen[2]; uint8_t flags; uint8_t reserved[7]; uint8_t format[4]; }; class File { public: File(const char* filename, const char* mode) : f(fopen(filename, mode)) { if (!f) { throw runtime_error(string("Couldn't open: ") + filename); } } ~File() { fclose(f); } void read(void* data, int size) { if (fread(data, size, 1, f) != 1) { throw runtime_error("Couldn't read file"); } } void write(const void* data, int size) { if (fwrite(data, size, 1, f) != 1) { throw runtime_error("Couldn't write file"); } } private: FILE* f; }; static uint16_t calculateCrc(const uint8_t* p, int n) { uint16_t crc = 0xffff; for (int i = 0; i < n; ++i) { for (int j = 8; j < 16; ++j) { crc = (crc << 1) ^ ((((crc ^ (p[i] << j)) & 0x8000) ? 0x1021 : 0)); } } return crc; } static void fill(uint8_t*& p, int len, uint8_t value) { memset(p, value, len); p += len; } static void convertTrack(int cyl, int head, int sectorsPerTrack, int sectorSizeCode, int gap3, File& inf, File& outf) { int sectorSize = 128 << sectorSizeCode; int rawSectorLen = 12 + 10 + GAP2 + 12 + 4 + sectorSize + 2 + gap3; int gap4b = TRACK_LENGTH - (GAP4a + 12 + 4 + GAP1 + sectorsPerTrack * rawSectorLen); assert(gap4b > 0); uint8_t buf[DMK_TRACK_LEN]; memset(buf, 0, sizeof(buf)); uint8_t* ip = &buf[ 0]; // pointer in IDAM table uint8_t* tp = &buf[128]; // pointer in actual track data fill(tp, GAP4a, 0x4e); // gap4a fill(tp, 12, 0x00); // sync fill(tp, 3, 0xc2); // index mark fill(tp, 1, 0xfc); // fill(tp, GAP1, 0x4e); // gap1 for (int sec = 0; sec < sectorsPerTrack; ++sec) { fill(tp, 12, 0x00); // sync fill(tp, 3, 0xa1); // ID addr mark int pos = tp - &buf[0]; assert(pos < 0x4000); *ip++ = pos & 0xff; *ip++ = (pos >> 8) | 0x80; // double density (MFM) sector fill(tp, 1, 0xfe); // ID addr mark (cont) *tp++ = cyl; // C *tp++ = head; // H *tp++ = sec + 1; // R *tp++ = sectorSizeCode; // N auto addrCrc = calculateCrc(tp - 8, 8); *tp++ = addrCrc >> 8; // CRC-1 *tp++ = addrCrc & 0xff; // CRC-2 fill(tp, GAP2, 0x4e); // gap2 fill(tp, 12, 0x00); // sync fill(tp, 3, 0xa1); // data mark fill(tp, 1, 0xfb); // inf.read(tp, sectorSize); auto dataCrc = calculateCrc(tp - 4, sectorSize + 4); tp += sectorSize; *tp++ = dataCrc >> 8; *tp++ = dataCrc & 0xff; fill(tp, gap3, 0x4e); // gap3 } fill(tp, gap4b, 0x4e); // gap4b assert((tp - &buf[0]) == DMK_TRACK_LEN); outf.write(&buf[0], DMK_TRACK_LEN); } static void convert(const char* input, const char* output) { // Single or double sided input image? struct stat st; stat(input, &st); bool doubleSided; switch (st.st_size) { case 172032: doubleSided = false; break; case 346112: doubleSided = true; break; default: throw runtime_error( "input filesize should be exactly 172032 or 346112 bytes.\n"); } // Write DMK header DmkHeader header; memset(&header, 0, sizeof(header)); header.numTracks = NUM_CYLINDERS; header.trackLen[0] = DMK_TRACK_LEN & 0xff; header.trackLen[1] = DMK_TRACK_LEN >> 8; header.flags = (doubleSided ? (0 << 4) : (1 << 4)) | (0 << 6); // double density (MFM) File outf(output, "wb"); outf.write(&header, sizeof(header)); // Read input image and convert to DMK, track per track File inf(input, "rb"); int numSides = doubleSided ? 2 : 1; for (int cyl = 0; cyl < NUM_CYLINDERS; ++cyl) { for (int head = 0; head < numSides; ++head) { // first track has different layout int sectorsPerTrack; int sectorSizeCode; int gap3; if ((head == 0) && (cyl == 0)) { sectorsPerTrack = 18; sectorSizeCode = 0; // 128 bytes gap3 = 84; } else { sectorsPerTrack = 17; sectorSizeCode = 1; // 256 bytes gap3 = 34; } convertTrack(cyl, head, sectorsPerTrack, sectorSizeCode, gap3, inf, outf); } } } int main(int argc, char** argv) { if (argc != 3) { printf("svi2dmk\n" "-------\n" "\n" "Utility to convert a SVI disk image into a DMK disk image.\n" "\n" "The SVI image is expected to have to following format:\n" " - 1st track (track 0, side 0) contains 18 sectors of 128 bytes.\n" " - All other tracks contain 17 sectors of 256 bytes.\n" " - There are 40 tracks on the disk.\n" " - The disk can be either single or double sided.\n" "This means that the size of the input image should be exactly\n" "172032 bytes for single sided disks or 346112 bytes for double\n" "sided disks.\n" "\n" "Usage: %s \n", argv[0]); exit(1); } try { convert(argv[1], argv[2]); } catch (std::exception& e) { fprintf(stderr, "Error: %s\n", e.what()); exit(2); } } openMSX-RELEASE_0_14_0/Contrib/openmsx-complete.bash000066400000000000000000000010761314057512400221730ustar00rootroot00000000000000# This file enables openmsx specific tab-completion in the bash shell. # # To enable it system-wide, copy and rename this file to # /etc/bash_completion.d/openmsx # To enable it only for the current user, source this file from e.g. your # ~/.bashrc # file. # # This needs an openMSX version newer than openmsx-0.9.1 (TODO replace with # actual version number once that number is known). _openmsx_complete() { local cur tmp cur=${COMP_WORDS[COMP_CWORD]} tmp=$(openmsx -bash $3) COMPREPLY=($(compgen -W '$tmp' -- "$cur")) } complete -f -F _openmsx_complete openmsx openMSX-RELEASE_0_14_0/Contrib/openmsx-control-socket.cc000066400000000000000000000243471314057512400230070ustar00rootroot00000000000000/** * Example implementation for bidirectional communication with openMSX. * * requires: libxml2 * compile: * *nix: g++ `xml2-config --cflags` `xml2-config --libs` openmsx-control-socket.cc * win32: g++ `xml2-config --cflags` `xml2-config --libs` openmsx-control-socket.cc -lwsock32 */ #include #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 #include #include #else #include #include #include #include #endif using std::cout; using std::endl; using std::deque; using std::string; using std::vector; class ReadDir { public: ReadDir(const std::string& directory) { dir = opendir(directory.c_str()); } ~ReadDir() { if (dir) { closedir(dir); } } dirent* getEntry() { if (!dir) { return 0; } return readdir(dir); } private: DIR* dir; }; static string getTempDir() { const char* result = NULL; if (!result) result = getenv("TMPDIR"); if (!result) result = getenv("TMP"); if (!result) result = getenv("TEMP"); if (!result) { #ifdef _WIN32 result = "C:/WINDOWS/TEMP"; #else result = "/tmp"; #endif } return result; } static string getUserName() { #ifdef _WIN32 return "default"; #else struct passwd* pw = getpwuid(getuid()); return pw->pw_name ? pw->pw_name : ""; #endif } class OpenMSXComm { public: // main loop void start(int sd); // send a command to openmsx void sendCommand(const string& command); private: // XML parsing call-back functions static void cb_start_element(OpenMSXComm* comm, const xmlChar* name, const xmlChar** attrs); static void cb_end_element(OpenMSXComm* comm, const xmlChar* name); static void cb_text(OpenMSXComm* comm, const xmlChar* chars, int len); void parseReply(const char** attrs); void parseLog(const char** attrs); void parseUpdate(const char** attrs); void doReply(); void doLog(); void doUpdate(); // commands being executed deque commandStack; // XML parsing enum State { START, TAG_OPENMSX, TAG_REPLY, TAG_LOG, TAG_UPDATE, } state; unsigned unknownLevel; string content; xmlSAXHandler sax_handler; xmlParserCtxt* parser_context; enum ReplyStatus { REPLY_UNKNOWN, REPLY_OK, REPLY_NOK } replyStatus; enum LogLevel { LOG_UNKNOWN, LOG_INFO, LOG_WARNING } logLevel; string updateType; string updateName; // communication with openmsx process int sd; }; void OpenMSXComm::cb_start_element(OpenMSXComm* comm, const xmlChar* name, const xmlChar** attrs) { if (comm->unknownLevel) { ++(comm->unknownLevel); return; } switch (comm->state) { case START: if (strcmp((const char*)name, "openmsx-output") == 0) { comm->state = TAG_OPENMSX; } else { ++(comm->unknownLevel); } break; case TAG_OPENMSX: if (strcmp((const char*)name, "reply") == 0) { comm->state = TAG_REPLY; comm->parseReply((const char**)attrs); } else if (strcmp((const char*)name, "log") == 0) { comm->state = TAG_LOG; comm->parseLog((const char**)attrs); } else if (strcmp((const char*)name, "update") == 0) { comm->state = TAG_UPDATE; comm->parseUpdate((const char**)attrs); } else { ++(comm->unknownLevel); } break; default: ++(comm->unknownLevel); break; } comm->content.clear(); } void OpenMSXComm::parseReply(const char** attrs) { replyStatus = REPLY_UNKNOWN; if (attrs) { for ( ; *attrs; attrs += 2) { if (strcmp(attrs[0], "result") == 0) { if (strcmp(attrs[1], "ok") == 0) { replyStatus = REPLY_OK; } else if (strcmp(attrs[1], "nok") == 0) { replyStatus = REPLY_NOK; } } } } } void OpenMSXComm::parseLog(const char** attrs) { logLevel = LOG_UNKNOWN; if (attrs) { for ( ; *attrs; attrs += 2) { if (strcmp(attrs[0], "level") == 0) { if (strcmp(attrs[1], "info") == 0) { logLevel = LOG_INFO; } else if (strcmp(attrs[1], "warning") == 0) { logLevel = LOG_WARNING; } } } } } void OpenMSXComm::parseUpdate(const char** attrs) { updateType = "unknown"; if (attrs) { for ( ; *attrs; attrs += 2) { if (strcmp(attrs[0], "type") == 0) { updateType = attrs[1]; } else if (strcmp(attrs[0], "name") == 0) { updateName = attrs[1]; } } } } void OpenMSXComm::cb_end_element(OpenMSXComm* comm, const xmlChar* name) { if (comm->unknownLevel) { --(comm->unknownLevel); return; } switch (comm->state) { case TAG_OPENMSX: comm->state = START; break; case TAG_REPLY: comm->doReply(); comm->state = TAG_OPENMSX; break; case TAG_LOG: comm->doLog(); comm->state = TAG_OPENMSX; break; case TAG_UPDATE: comm->doUpdate(); comm->state = TAG_OPENMSX; break; default: break; } } void OpenMSXComm::doReply() { switch (replyStatus) { case REPLY_OK: cout << "OK: "; break; case REPLY_NOK: cout << "ERR: "; break; } cout << commandStack.front() << endl; commandStack.pop_front(); if (!content.empty()) { cout << content << endl; } } void OpenMSXComm::doLog() { switch (logLevel) { case LOG_INFO: cout << "INFO: "; break; case LOG_WARNING: cout << "WARNING: "; break; } cout << content << endl; } void OpenMSXComm::doUpdate() { cout << "UPDATE: " << updateType << " " << updateName << " " << content << endl; } void OpenMSXComm::cb_text(OpenMSXComm* comm, const xmlChar* chars, int len) { switch (comm->state) { case TAG_REPLY: case TAG_LOG: case TAG_UPDATE: comm->content.append((const char*)chars, len); break; default: break; } } void OpenMSXComm::sendCommand(const string& command) { write(sd, "", 9); write(sd, command.c_str(), command.length()); write(sd, "", 10); commandStack.push_back(command); } void OpenMSXComm::start(int sd_) { sd = sd_; // init XML parser state = START; unknownLevel = 0; memset(&sax_handler, 0, sizeof(sax_handler)); sax_handler.startElement = (startElementSAXFunc)cb_start_element; sax_handler.endElement = (endElementSAXFunc) cb_end_element; sax_handler.characters = (charactersSAXFunc) cb_text; parser_context = xmlCreatePushParserCtxt(&sax_handler, this, 0, 0, 0); write(sd, "", 17); // event loop string command; // (partial) input from STDIN while (true) { char buf[4096]; fd_set rdfs; FD_ZERO(&rdfs); FD_SET(sd, &rdfs); FD_SET(STDIN_FILENO, &rdfs); select(sd + 1, &rdfs, NULL, NULL, NULL); if (FD_ISSET(sd, &rdfs)) { // data available from openMSX ssize_t size = read(sd, buf, 4096); if (size == 0) { // openmsx process died break; } xmlParseChunk(parser_context, buf, size, 0); } if (FD_ISSET(STDIN_FILENO, &rdfs)) { // data available from STDIN ssize_t size = read(STDIN_FILENO, buf, 4096); char* oldpos = buf; while (true) { char* pos = (char*)memchr(oldpos, '\n', size); if (pos) { unsigned num = pos - oldpos; command.append(oldpos, num); sendCommand(command); command.clear(); oldpos = pos + 1; size -= num + 1; } else { command.append(pos, size); break; } } } } // cleanup xmlFreeParserCtxt(parser_context); } static bool checkSocketDir(const string& dir) { struct stat st; if (stat(dir.c_str(), &st)) { // cannot stat return false; } if (!S_ISDIR(st.st_mode)) { // not a directory return false; } #ifndef _WIN32 // only do permission and owner checks on *nix if ((st.st_mode & 0777) != 0700) { // wrong permissions return false; } if (st.st_uid != getuid()) { // wrong uid return false; } #endif return true; } static bool checkSocket(const string& socket) { string dir = socket.substr(0, socket.find_last_of('/')); string name = socket.substr(socket.find_last_of('/') + 1); if (name.substr(0, 7) != "socket.") { // wrong name return false; } struct stat st; if (stat(socket.c_str(), &st)) { // cannot stat return false; } #ifdef _WIN32 if (!S_ISREG(st.st_mode)) { // not a regular file return false; } #else if (!S_ISSOCK(st.st_mode)) { // not a socket return false; } #endif #ifndef _WIN32 // only do permission and owner checks on *nix if ((st.st_mode & 0777) != 0600) { // check will be different on win32 (!= 777) thus actually useless // wrong permissions return false; } if (st.st_uid != getuid()) { // does this work on win32? is this check meaningful? // wrong uid return false; } #endif return true; } static void deleteSocket(const string& socket) { unlink(socket.c_str()); // ignore errors string dir = socket.substr(0, socket.find_last_of('/')); rmdir(dir.c_str()); // ignore errors } static int openSocket(const string& socketName) { if (!checkSocket(socketName)) { return -1; } #ifdef _WIN32 int port = -1; std::ifstream in(socketName.c_str()); in >> port; if (port == -1) { return -1; } int sd = socket(AF_INET, SOCK_STREAM, 0); if (sd == -1) { return -1; } sockaddr_in addr; memset((char*)&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_port = htons(port); #else int sd = socket(AF_UNIX, SOCK_STREAM, 0); if (sd == -1) { return -1; } sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, socketName.c_str()); #endif if (connect(sd, (sockaddr*)&addr, sizeof(addr)) == -1) { // It appears to be a socket but we cannot connect to it. // Must be a stale socket. Try to clean it up. deleteSocket(socketName); close(sd); return -1; } return sd; } void collectServers(vector& servers) { string dir = getTempDir() + "/openmsx-" + getUserName(); if (!checkSocketDir(dir)) { return; } ReadDir readDir(dir); while (dirent* entry = readDir.getEntry()) { string socketName = dir + '/' + entry->d_name; int sd = openSocket(socketName); if (sd != -1) { close(sd); servers.push_back(socketName); } } } int main() { #ifdef _WIN32 WSAData wsaData; WSAStartup(MAKEWORD(1, 1), &wsaData); #endif vector servers; collectServers(servers); if (servers.empty()) { cout << "No running openmsx found." << endl; return 0; } // TODO let the user pick one if there is more than 1 int sd = openSocket(servers.front()); OpenMSXComm comm; comm.start(sd); return 0; } openMSX-RELEASE_0_14_0/Contrib/openmsx-control-stdio.cc000066400000000000000000000227301314057512400226330ustar00rootroot00000000000000/** * Example implementation for bidirectional communication with openMSX. * * requires: libxml2 * compile: g++ `xml2-config --cflags` `xml2-config --libs` openmsx-control.cc */ #include #include #include #include #include #include #include using std::cout; using std::endl; using std::list; using std::string; class OpenMSXComm { public: // main loop void start(); // send a command to openmsx void sendCommand(const string& command); private: // therse methods get called when openMSX has send the corresponding tag void openmsx_cmd_ok(const string& msg); void openmsx_cmd_nok(const string& msg); void openmsx_cmd_info(const string& msg); void openmsx_cmd_warning(const string& msg); void openmsx_cmd_update(const string& name, const string& value); // XML parsing call-back functions static void cb_start_element(OpenMSXComm* comm, const xmlChar* name, const xmlChar** attrs); static void cb_end_element(OpenMSXComm* comm, const xmlChar* name); static void cb_text(OpenMSXComm* comm, const xmlChar* chars, int len); void parseReply(const char** attrs); void parseLog(const char** attrs); void parseUpdate(const char** attrs); void doReply(); void doLog(); void doUpdate(); void deprecated(); // commands being executed list commandStack; // XML parsing enum State { START, TAG_OPENMSX, TAG_REPLY, TAG_LOG, TAG_UPDATE, TAG_OK, TAG_NOK, TAG_INFO, TAG_WARNING, } state; unsigned unknownLevel; string content; xmlSAXHandler sax_handler; xmlParserCtxt* parser_context; enum ReplyStatus { REPLY_UNKNOWN, REPLY_OK, REPLY_NOK } replyStatus; enum LogLevel { LOG_UNKNOWN, LOG_INFO, LOG_WARNING } logLevel; enum UpdateType { UPDATE_UNKNOWN, UPDATE_LED } updateType; string updateName; // communication with openmsx process int fd_out; }; void OpenMSXComm::openmsx_cmd_ok(const string& msg) { const string& command = commandStack.front(); cout << "CMD: '" << command << "' executed" << endl; if (!msg.empty()) { cout << msg << endl; } commandStack.pop_front(); } void OpenMSXComm::openmsx_cmd_nok(const string& msg) { const string& command = commandStack.front(); cout << "CMD: '" << command << "' failed" << endl; if (!msg.empty()) { cout << msg << endl; } commandStack.pop_front(); } void OpenMSXComm::openmsx_cmd_info(const string& msg) { cout << "INFO: " << msg << endl; } void OpenMSXComm::openmsx_cmd_warning(const string& msg) { cout << "WARNING: " << msg << endl; } void OpenMSXComm::openmsx_cmd_update(const string& name, const string& value) { cout << "UPDATE: " << name << " " << value << endl; } void OpenMSXComm::deprecated() { static bool alreadyPrinted = false; if (!alreadyPrinted) { alreadyPrinted = true; cout << "The openMSX you're running still uses the old communication protocol." << endl << "Because of this some stuff will not work (LED status for example)." << endl << "Please upgrade to openMSX 0.4.0 or higher." << endl; } } void OpenMSXComm::cb_start_element(OpenMSXComm* comm, const xmlChar* name, const xmlChar** attrs) { if (comm->unknownLevel) { ++(comm->unknownLevel); return; } switch (comm->state) { case START: if (strcmp((const char*)name, "openmsx-output") == 0) { comm->state = TAG_OPENMSX; } else { ++(comm->unknownLevel); } break; case TAG_OPENMSX: if (strcmp((const char*)name, "reply") == 0) { comm->state = TAG_REPLY; comm->parseReply((const char**)attrs); } else if (strcmp((const char*)name, "log") == 0) { comm->state = TAG_LOG; comm->parseLog((const char**)attrs); } else if (strcmp((const char*)name, "update") == 0) { comm->state = TAG_UPDATE; comm->parseUpdate((const char**)attrs); } // backwards compatibilty stuff else if (strcmp((const char*)name, "ok") == 0) { comm->state = TAG_OK; comm->replyStatus = REPLY_OK; comm->deprecated(); } else if (strcmp((const char*)name, "nok") == 0) { comm->state = TAG_NOK; comm->replyStatus = REPLY_NOK; comm->deprecated(); } else if (strcmp((const char*)name, "info") == 0) { comm->state = TAG_INFO; comm->logLevel = LOG_INFO; comm->deprecated(); } else if (strcmp((const char*)name, "warning") == 0) { comm->state = TAG_WARNING; comm->logLevel = LOG_WARNING; comm->deprecated(); } else { ++(comm->unknownLevel); } break; default: ++(comm->unknownLevel); break; } comm->content.clear(); } void OpenMSXComm::parseReply(const char** attrs) { replyStatus = REPLY_UNKNOWN; if (attrs) { for ( ; *attrs; attrs += 2) { if (strcmp(attrs[0], "result") == 0) { if (strcmp(attrs[1], "ok") == 0) { replyStatus = REPLY_OK; } else if (strcmp(attrs[1], "nok") == 0) { replyStatus = REPLY_NOK; } } } } } void OpenMSXComm::parseLog(const char** attrs) { logLevel = LOG_UNKNOWN; if (attrs) { for ( ; *attrs; attrs += 2) { if (strcmp(attrs[0], "level") == 0) { if (strcmp(attrs[1], "info") == 0) { logLevel = LOG_INFO; } else if (strcmp(attrs[1], "warning") == 0) { logLevel = LOG_WARNING; } } } } } void OpenMSXComm::parseUpdate(const char** attrs) { updateType = UPDATE_UNKNOWN; if (attrs) { for ( ; *attrs; attrs += 2) { if (strcmp(attrs[0], "type") == 0) { if (strcmp(attrs[1], "led") == 0) { updateType = UPDATE_LED; } } else if (strcmp(attrs[0], "name") == 0) { updateName = attrs[1]; } } } } void OpenMSXComm::cb_end_element(OpenMSXComm* comm, const xmlChar* name) { if (comm->unknownLevel) { --(comm->unknownLevel); return; } switch (comm->state) { case TAG_OPENMSX: comm->state = START; break; case TAG_REPLY: comm->doReply(); comm->state = TAG_OPENMSX; break; case TAG_LOG: comm->doLog(); comm->state = TAG_OPENMSX; break; case TAG_UPDATE: comm->doUpdate(); comm->state = TAG_OPENMSX; break; // backwards compatibilty stuff case TAG_OK: comm->openmsx_cmd_ok(comm->content); comm->state = TAG_OPENMSX; break; case TAG_NOK: comm->openmsx_cmd_nok(comm->content); comm->state = TAG_OPENMSX; break; case TAG_INFO: comm->openmsx_cmd_info(comm->content); comm->state = TAG_OPENMSX; break; case TAG_WARNING: comm->openmsx_cmd_warning(comm->content); comm->state = TAG_OPENMSX; break; default: break; } } void OpenMSXComm::doReply() { switch (replyStatus) { case REPLY_OK: openmsx_cmd_ok(content); break; case REPLY_NOK: openmsx_cmd_nok(content); break; } } void OpenMSXComm::doLog() { switch (logLevel) { case LOG_INFO: openmsx_cmd_info(content); break; case LOG_WARNING: openmsx_cmd_warning(content); break; } } void OpenMSXComm::doUpdate() { switch (updateType) { case UPDATE_LED: openmsx_cmd_update(updateName, content); break; } } void OpenMSXComm::cb_text(OpenMSXComm* comm, const xmlChar* chars, int len) { switch (comm->state) { case TAG_REPLY: case TAG_LOG: case TAG_UPDATE: case TAG_OK: case TAG_NOK: case TAG_INFO: case TAG_WARNING: comm->content.append((const char*)chars, len); break; default: break; } } void OpenMSXComm::sendCommand(const string& command) { write(fd_out, "", 9); write(fd_out, command.c_str(), command.length()); write(fd_out, "", 10); commandStack.push_back(command); } void OpenMSXComm::start() { // init XML parser state = START; unknownLevel = 0; memset(&sax_handler, 0, sizeof(sax_handler)); sax_handler.startElement = (startElementSAXFunc)cb_start_element; sax_handler.endElement = (endElementSAXFunc) cb_end_element; sax_handler.characters = (charactersSAXFunc) cb_text; parser_context = xmlCreatePushParserCtxt(&sax_handler, this, 0, 0, 0); // create pipes int pipe_to_child[2]; int pipe_from_child[2]; pipe(pipe_to_child); pipe(pipe_from_child); fd_out = pipe_to_child[1]; // start openmsx sub-process pid_t pid = fork(); if (pid == 0) { dup2(pipe_to_child[0], STDIN_FILENO); dup2(pipe_from_child[1], STDOUT_FILENO); close(pipe_to_child[0]); close(pipe_to_child[1]); close(pipe_from_child[0]); close(pipe_from_child[1]); execlp("openmsx", "openmsx", "-control", "stdio:", 0); exit(0); } close(pipe_to_child[0]); close(pipe_from_child[1]); // send initial commands write(pipe_to_child[1], "", 17); sendCommand("set power on"); sendCommand("restoredefault renderer"); // event loop string command; // (partial) input from STDIN while (true) { char buf[4096]; fd_set rdfs; FD_ZERO(&rdfs); FD_SET(pipe_from_child[0], &rdfs); FD_SET(STDIN_FILENO, &rdfs); select(pipe_from_child[0] + 1, &rdfs, NULL, NULL, NULL); if (FD_ISSET(pipe_from_child[0], &rdfs)) { // data available from openMSX ssize_t size = read(pipe_from_child[0], buf, 4096); if (size == 0) { // openmsx process died break; } xmlParseChunk(parser_context, buf, size, 0); } if (FD_ISSET(STDIN_FILENO, &rdfs)) { // data available from STDIN ssize_t size = read(STDIN_FILENO, buf, 4096); char* oldpos = buf; while (true) { char* pos = (char*)memchr(oldpos, '\n', size); if (pos) { unsigned num = pos - oldpos; command.append(oldpos, num); sendCommand(command); command.clear(); oldpos = pos + 1; size -= num + 1; } else { command.append(pos, size); break; } } } } // cleanup xmlFreeParserCtxt(parser_context); } int main() { OpenMSXComm comm; comm.start(); return 0; } openMSX-RELEASE_0_14_0/Contrib/tas/000077500000000000000000000000001314057512400166205ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/Contrib/tas/README.txt000066400000000000000000000074621314057512400203270ustar00rootroot00000000000000Speedrun tools for openMSX ========================== The omr2txt.py tool allows extracting the input event log of an openMSX replay (OMR file) to a plain text format. The txt2omr.py tool performs the opposite operation: it reads an input event log in text format and inserts it into an OMR file. Together, these tools can be used to view and edit your event logs in a text editor. They can also be used to filter events and align them to frame boundaries. And you could use them if you want to write your own scripts to generate or optimize event logs. Another use for these tools is to be able to generate a version of your speedrun in progress that can be stored in a version control system with human-readable diffs. The tools require Python version 3.x. Limitations ----------- Currently omr2txt.py will only convert key presses listed in its "inputMap" dictionary. If your game uses keys other than the cursors and space, add the name and the keyboard matrix row/column in this dictionary near the top of the script. I wrote these tools when working on my King's Valley TAS, so I could replace the recording of one pyramid's solution without having to re-record all pyramids that come after it. While I did implement some rudimentary error handling, don't expect them to be robust to bad input. Format ------ Empty lines and lines starting with "#" are ignored. Lines starting with "=" are processing instructions: = base wsx-kv1.omr = base wsx-kv1.xml Specifies the recording to use as a base when converting back to OMR. The initial snapshot of this recording sets up the MSX machine and the game. Both ".omr" (OMR file, which is gzip-ed XML) and ".xml" (uncompressed XML from OMR file) file name extensions are supported. = out kings_valley_mth_v0.omr Pathname of the output file that txt2omr.py will write. = scale 57346560 Number of master clock ticks per time unit (frame). All following time intervals in the event log will be multiplied by this number. = input r key 8 7 Defines an input name "r" as a key press of keyboard matrix row 8, column 7. Currently key presses are the only supported types of events. = include pyramid01.txt Includes another text file. Can be used to store the input events for every level in a separate file, for example. All other lines are event log entries. Log entries are whitespace-separated lists, where the first element is a time interval length and the following elements are the input events that are active during that interval. For example: 2 r 1 r s 24 This will press the "r" input, as defined earlier with a "=input" processing instruction, for two frames. Then it will hold "r" pressed while also pressing the "s" input for one frame. Finally it will release both inputs and wait for 24 frames. License ------- Copyright (c) 2015 Maarten ter Huurne Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. openMSX-RELEASE_0_14_0/Contrib/tas/omr2txt.py000077500000000000000000000210641314057512400206170ustar00rootroot00000000000000#!/usr/bin/env python3 from collections import defaultdict from gzip import GzipFile from math import modf from sys import stderr from xml.sax import make_parser from xml.sax.handler import feature_external_ges from xml.dom import pulldom cpuClock = 3579545 vdpClock = cpuClock * 6 masterClock = cpuClock * 960 vdpTicksPerLine = 1368 # The keys we're interested in: the letter to be used in the text file, # followed by the keyboard matrix location (row, column). # This should probably be made configurable at some point, but for now you # can edit them here. inputMap = { 'r': (8, 7), 'd': (8, 6), 'u': (8, 5), 'l': (8, 4), 's': (8, 0) } inputMapReverse = dict((pos, name) for name, pos in inputMap.items()) def readEvents(filename): '''Reads input events from an openMSX replay file (OMR). Returns a list of tuples consisting of a timestamp, keyboard row, press mask and release mask. ''' print('reading replay:', filename, file=stderr) inputEvents = [] def getText(node): return ''.join( child.data for child in node.childNodes if child.nodeType == child.TEXT_NODE ) def parseItem(): time = None row = None press = None release = None for event, node in xmlEvents: if event == pulldom.START_ELEMENT: doc.expandNode(node) if node.tagName == 'StateChange': assert time is None, time timeNode1, timeNode2 = node.getElementsByTagName('time') time = int(getText(timeNode2)) elif node.tagName == 'row': assert row is None, row row = int(getText(node)) elif node.tagName == 'press': assert press is None, press press = int(getText(node)) elif node.tagName == 'release': assert release is None, release release = int(getText(node)) else: pass #print(node.toxml()) elif event == pulldom.END_ELEMENT: if node.tagName == 'item': break assert time is not None assert row is not None assert press is not None assert release is not None inputEvents.append((time, row, press, release)) def parseEvents(): for event, node in xmlEvents: if event == pulldom.START_ELEMENT: if node.tagName == 'item' \ and node.getAttribute('type') == 'KeyMatrixState': parseItem() elif event == pulldom.END_ELEMENT: if node.tagName == 'events': break def parseTopLevel(): for event, node in xmlEvents: if event == pulldom.START_ELEMENT: if node.tagName == 'events': parseEvents() parser = make_parser() parser.setFeature(feature_external_ges, False) with GzipFile(filename) as inp: doc = pulldom.parse(inp, parser) xmlEvents = iter(doc) parseTopLevel() print('read %d input events' % len(inputEvents), file=stderr) return inputEvents def combineEvents(inputEvents): '''Combines multiple events on the same keyboard row at the same timestamp into a single event. ''' pendingTime = None def outputPending(): if pendingTime is not None: for row in sorted(pressForRow.keys() | releaseForRow.keys()): press = pressForRow[row] release = releaseForRow[row] if press != 0 or release != 0: yield pendingTime, row, press, release for time, row, press, release in inputEvents: if time != pendingTime: assert pendingTime is None or time > pendingTime, time # Output previous event. yield from outputPending() # Start new event. pendingTime = time pressForRow = defaultdict(int) releaseForRow = defaultdict(int) pressForRow[row] = (pressForRow[row] | press) & ~release releaseForRow[row] = (releaseForRow[row] | release) & ~press else: yield from outputPending() def removeRedundantEvents(inputEvents): '''Remove (parts of) events that don't change the keyboard matrix state. ''' matrix = [0] * 12 for time, row, press, release in inputEvents: old = matrix[row] press &= ~old release &= old if press != 0 or release != 0: matrix[row] = (old | press) & ~release yield time, row, press, release def filterEvents(inputEvents, wantedKeys): '''Filter the given input events to contain only presses and releases of the given keys. The wantedKeys argument should be mapping from row to a column bitmask, where bits are set if we want to preserve changes in the corresponding position in the keyboard matrix. ''' for time, row, press, release in inputEvents: mask = wantedKeys.get(row, 0) press &= mask release &= mask if press != 0 or release != 0: yield time, row, press, release def scaleTime(inputEvents, tickScale): '''Yields the given input events, with the time stamps divided by the given scale and rounded to the nearest integer. ''' for time, row, press, release in inputEvents: yield int(time / tickScale + 0.5), row, press, release def checkAlignment(timestamps, alignment): '''Returns the number of timestamps from the given sequence that are close to multiples of the given alignment. ''' aligned = 0 for time in timestamps: offset = modf(time / alignment)[0] if offset < 0.001 or offset > 0.999: aligned += 1 return aligned def detectTicksPerFrame(timestamps): '''Determine the most likely number of master clock ticks per frame, by looking at how well the timestamps align with frame boundaries when using the two frame timings that openMSX supports. This assumes that the frame timing is the same throughout the replay, which is not guaranteed in general, but will hopefully be the case for tool-assisted speedruns. ''' ticksPerFrame50 = (masterClock * vdpTicksPerLine * 313) // vdpClock ticksPerFrame60 = (masterClock * vdpTicksPerLine * 262) // vdpClock timestamps = tuple(timestamps) aligned50 = checkAlignment(timestamps, ticksPerFrame50) aligned60 = checkAlignment(timestamps, ticksPerFrame60) if aligned50 > aligned60: print('event timestamps align with 50 fps timing: %.2f%%' % (100 * aligned50 / len(timestamps)), file=stderr) return ticksPerFrame50 else: print('event timestamps align with 60 fps timing: %.2f%%' % (100 * aligned60 / len(timestamps)), file=stderr) return ticksPerFrame60 def eventsToState(inputEvents): '''Yields pairs of a timestamp and a set of the active keys at that time. ''' active = set() prevTime = None for time, row, press, release in inputEvents: assert (press & release) == 0, (press, release) if prevTime != time: if prevTime is not None: yield prevTime, frozenset(active) prevTime = time col = 0 while press: if press & 1: active.add((row, col)) col += 1 press >>= 1 col = 0 while release: if release & 1: active.remove((row, col)) col += 1 release >>= 1 if prevTime is not None: yield prevTime, frozenset(active) def formatState(active): return ' '.join( inputMapReverse[pos] for pos in sorted(active, key=lambda pos: (pos[0], -pos[1])) ) def convert(inFilename, outFilename): wantedKeys = {} for name, (row, col) in inputMap.items(): wantedKeys[row] = wantedKeys.get(row, 0) | (1 << col) inputEvents = list(removeRedundantEvents( filterEvents(combineEvents(readEvents(inFilename)), wantedKeys) )) print('after cleanup %d events remain' % len(inputEvents), file=stderr) ticksPerFrame = detectTicksPerFrame(evt[0] for evt in inputEvents) scaledEvents = list(removeRedundantEvents( combineEvents(scaleTime(inputEvents, ticksPerFrame)) )) with open(outFilename, 'w') as out: print('writing output:', outFilename) print('= base', inFilename, file=out) print('= out', 'replay.omr', file=out) print('= scale', ticksPerFrame, file=out) for name, (row, col) in sorted( inputMap.items(), key=lambda item: (item[1][0], -item[1][1]) ): print('= input', name, 'key', row, col, file=out) print(file=out) def printMilestone(frame, seconds): print('# frame %d (%d:%02d)' % ((frame,) + divmod(seconds, 60)), file=out) milestone = 10 # seconds prevFrame = 0 prevSeconds = 0 printMilestone(prevFrame, prevSeconds) prevActive = set() for frame, active in eventsToState(scaledEvents): delta = frame - prevFrame print(('%4d %s' % (delta, formatState(prevActive))).rstrip(), file=out) seconds = (frame * ticksPerFrame) // masterClock if seconds // milestone != prevSeconds // milestone: printMilestone(frame, seconds) prevFrame = frame prevSeconds = seconds prevActive = active printMilestone(prevFrame, prevSeconds) if __name__ == '__main__': from sys import argv if len(argv) != 2: print('Usage: omr2txt.py file1.omr', file=stderr) print('Converts an openMSX replay to a text file.', file=stderr) exit(2) else: inFilename = argv[1] if inFilename.endswith('.omr'): outFilename = inFilename[:-4] + '.txt' convert(inFilename, outFilename) else: print('File name does not end in ".omr":', inFilename) exit(2) openMSX-RELEASE_0_14_0/Contrib/tas/txt2omr.py000077500000000000000000000170161314057512400206210ustar00rootroot00000000000000#!/usr/bin/env python3 from collections import defaultdict from datetime import datetime from gzip import GzipFile from io import TextIOWrapper from sys import stderr from xml.etree.ElementTree import SubElement, parse as parseXML import platform cpuClock = 3579545 masterClock = cpuClock * 960 def readStates(topFilename): openFilenames = [] base = None out = None scale = 1 inputMap = {} inputStates = [] time = 0 def handleProcessingInstruction(words): if not words: raise ValueError('Missing processing instruction') elif words[0] == 'base': if len(words) != 2: raise ValueError( 'Processing instruction "base" expects 1 argument, ' 'got %d' % (len(words) - 1)) nonlocal base if base is not None: raise ValueError('Attempt to change base file name') base = words[1] elif words[0] == 'out': if len(words) != 2: raise ValueError( 'Processing instruction "out" expects 1 argument, ' 'got %d' % (len(words) - 1)) nonlocal out if out is not None: raise ValueError('Attempt to change output file name') out = words[1] elif words[0] == 'scale': if len(words) != 2: raise ValueError( 'Processing instruction "scale" expects 1 argument, ' 'got %d' % (len(words) - 1)) nonlocal scale scale = int(words[1]) print('time scale: %.2f frames per second' % (masterClock / scale)) elif words[0] == 'input': if len(words) != 5: raise ValueError( 'Processing instruction "input" expects 4 arguments, ' 'got %d' % (len(words) - 1)) name, inpType, rowStr, colStr = words[1:] if inpType != 'key': raise ValueError('Unknown input type "%s"' % inpType) row = int(rowStr) col = int(colStr) inputMap[name] = (row, col) elif words[0] == 'include': if len(words) != 2: raise ValueError( 'Processing instruction "include" expects 1 argument, ' 'got %d' % (len(words) - 1)) readFile(words[1]) else: raise ValueError('Unknown processing instruction: %s' % words[0]) def handleState(words): frames = int(words[0]) try: inputs = [inputMap[name] for name in words[1:]] except KeyError as ex: raise ValueError('Undefined input: %s' % ex) nonlocal time inputStates.append((time, inputs)) time += frames * scale return frames def readFile(filename): if filename in openFilenames: raise ValueError('Circular include: %s' % filename) localStateCount = 0 localFrameCount = 0 startTime = time openFilenames.append(filename) try: with open(filename, 'r') as stream: for lineNr, line in enumerate(stream, 1): try: line = line.strip() if not line or line[0] == '#': # Ignore empty line or comment. continue if line[0] == '=': handleProcessingInstruction(line[1:].split()) else: localFrameCount += handleState(line.split()) localStateCount += 1 except ValueError: role = 'In' if filename == openFilenames[-1] \ else 'included from' print('%s "%s" line %d,' % (role, filename, lineNr), file=stderr) raise except OSError as ex: print('Failed to open input file "%s",' % filename, file=stderr) raise ValueError(str(ex)) from ex del openFilenames[-1] localTime = time - startTime print('%-17s %5d states, %6d frames, %7.2f seconds' % ( filename + ':', localStateCount, localFrameCount, localTime / masterClock ), file=stderr) readFile(topFilename) inputStates.append((time, [])) if base is None: raise ValueError('Base file not defined') return base, out, inputStates def statesToEvents(inputStates): active = {} for time, state in inputStates: stateByRow = defaultdict(int) for row, col in state: stateByRow[row] |= 1 << col for row in sorted(active.keys() | stateByRow.keys()): old = active.get(row, 0) new = stateByRow.get(row, 0) press = new & ~old release = ~new & old if press != 0 or release != 0: yield time, row, press, release active[row] = new def replaceEvents(inp, out, inputEvents): doc = parseXML(inp) # Set the serialization date to now. rootElem = doc.getroot() rootElem.attrib['date_time'] = \ datetime.now().strftime('%a %b %d %H:%M:%S %Y') rootElem.attrib['openmsx_version'] = 'txt2omr' rootElem.attrib['platform'] = platform.system().lower() # Remove snapshots except the one at timestamp 0. snapshots = doc.find('replay/snapshots') if snapshots is None: print('Base replay lacks snapshots', file=stderr) else: seenInitialSnapshot = False for snapshot in snapshots.findall('item'): timeElem = snapshot.find('scheduler/currentTime/time') time = int(timeElem.text) if time == 0: seenInitialSnapshot = True else: snapshots.remove(snapshot) if not seenInitialSnapshot: print('No snapshot found with timestamp 0', file=stderr) # Replace event log. eventsElem = doc.find('replay/events') if eventsElem is None: print('No events tag found; cannot insert events', file=stderr) else: tail = eventsElem.tail eventsElem.clear() eventsElem.text = '\n' eventsElem.tail = tail # IDs must be unique for the entire document. We look for the highest # in-use ID and generate new IDs counting up from there. baseID = max( int(elem.attrib['id']) for elem in doc.iterfind('.//*[@id]') ) + 1 def createEvent(i, time): itemElem = SubElement(eventsElem, 'item', id=str(baseID + i), type='KeyMatrixState') itemElem.tail = '\n' stateChangeElem = SubElement(itemElem, 'StateChange') timeElem1 = SubElement(stateChangeElem, 'time') timeElem2 = SubElement(timeElem1, 'time') timeElem2.text = str(time) return itemElem for i, (time, row, press, release) in enumerate(inputEvents): itemElem = createEvent(i, time) SubElement(itemElem, 'row').text = str(row) SubElement(itemElem, 'press').text = str(press) SubElement(itemElem, 'release').text = str(release) endTime = inputEvents[-1][0] if inputEvents else 0 createEvent(len(inputEvents), endTime).attrib['type'] = 'EndLog' # Reset re-record count. reRecordCount = doc.find('replay/reRecordCount') if reRecordCount is not None: reRecordCount.text = '0' # Reset the current time. currentTime = doc.find('replay/currentTime/time') if currentTime is not None: currentTime.text = '0' out.write(b'\n') out.write(b"\n") doc.write(out, encoding='utf-8', xml_declaration=False) def convert(inFilename): try: base, outFilename, inputStates = readStates(inFilename) except ValueError as ex: print('ERROR: %s' % ex, file=stderr) exit(1) inputEvents = list(statesToEvents(inputStates)) def createOutput(inp): if outFilename is None: print('No output file name set', file=stderr) else: try: with GzipFile(outFilename, 'wb') as out: replaceEvents(inp, out, inputEvents) except OSError as ex: print('Failed to open output replay:', ex) exit(1) else: print('wrote output replay:', outFilename) try: if base.endswith('.omr'): with GzipFile(base, 'rb') as inp: createOutput(inp) elif base.endswith('.xml'): with open(base, 'rb') as inp: createOutput(inp) else: print('Unknown base file type in "%s" ' '(".xml" and ".omr" are supported)' % base, file=stderr) exit(1) except OSError as ex: print('Failed to open base replay:', ex, file=stderr) exit(1) if __name__ == '__main__': from sys import argv if len(argv) != 2: print('Usage: txt2omr.py replay.txt', file=stderr) print('Converts the text version of an openMSX replay to an OMR file.', file=stderr) exit(2) else: convert(argv[1]) openMSX-RELEASE_0_14_0/GNUmakefile000066400000000000000000000000271314057512400165020ustar00rootroot00000000000000include build/entry.mk openMSX-RELEASE_0_14_0/README000066400000000000000000000025311314057512400153120ustar00rootroot00000000000000---------------------------------------------------------------------------- openMSX - the MSX emulator that aims for perfection ---------------------------------------------------------------------------- openMSX comes with a set of HTML manuals that tell what you need to know to install, configure and run openMSX. You can find these manuals in the directory 'manual' inside the directory 'doc'. You can read them using a web browser. You can read what has changed in this and the previous releases in the release notes. You can find the release notes of this release in the file 'release-notes.txt' in the directory 'doc'. Highlights of previous releases can be found in 'release-history.txt'. All source code and other works that are part of, or distributed with openMSX are copyrighted by their respective authors. The file 'authors.txt' contains a list of people who made works for openMSX or contributed works to openMSX. Some source files contain a license notice; all other source files are licensed under the GNU Public License (GPL), of which you can find a copy in the file 'GPL.txt'. If you got a binary release of openMSX and are interested in the sources, please visit our home page: http://openmsx.org/ Happy MSX-ing! the openMSX developers ---------------------------------------------------------------------------- openMSX-RELEASE_0_14_0/build/000077500000000000000000000000001314057512400155305ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/build/.gitignore000066400000000000000000000000071314057512400175150ustar00rootroot00000000000000/*.pyc openMSX-RELEASE_0_14_0/build/3rdparty.mk000066400000000000000000000264211314057512400176360ustar00rootroot00000000000000# Compiles 3rd party libraries needed by openMSX. # It enables only the features needed by openMSX. ifeq ($(origin PYTHON),undefined) $(error You should pass PYTHON) endif ifeq ($(origin BUILD_PATH),undefined) $(error You should pass BUILD_PATH) endif ifeq ($(origin OPENMSX_TARGET_OS),undefined) $(error You should pass OPENMSX_TARGET_OS) endif ifeq ($(origin OPENMSX_TARGET_CPU),undefined) $(error You should pass OPENMSX_TARGET_CPU) endif .PHONY: all all: default # Get information about packages. -include derived/3rdparty/packages.mk ifneq ($(origin PACKAGE_SDL),undefined) # These libraries are part of the base system, therefore we do not need to # link them statically for building a redistributable binary. SYSTEM_LIBS:=$(shell $(PYTHON) build/list_system_libs.py $(OPENMSX_TARGET_OS)) # Compiler selection, compiler flags, SDK selection. # These variables are already exported, but we make it explicit here. export CC export NEXT_ROOT CC=$(_CC) TIMESTAMP_DIR:=$(BUILD_PATH)/timestamps BUILD_DIR:=$(BUILD_PATH)/build INSTALL_DIR:=$(BUILD_PATH)/install # Create a GNU-style system triple. TRIPLE_VENDOR:=unknown ifeq ($(OPENMSX_TARGET_CPU),x86) TRIPLE_MACHINE:=i686 else ifeq ($(OPENMSX_TARGET_CPU),ppc) TRIPLE_MACHINE:=powerpc else ifeq ($(OPENMSX_TARGET_CPU),ppc64) TRIPLE_MACHINE:=powerpc64 else TRIPLE_MACHINE:=$(OPENMSX_TARGET_CPU) endif endif endif ifeq ($(OPENMSX_TARGET_OS),dingux) TRIPLE_OS:=linux else TRIPLE_OS:=$(OPENMSX_TARGET_OS) endif ifeq ($(OPENMSX_TARGET_OS),mingw-w64) TRIPLE_OS:=mingw32 TRIPLE_VENDOR:=w64 endif TARGET_TRIPLE:=$(TRIPLE_MACHINE)-$(TRIPLE_VENDOR)-$(TRIPLE_OS) # Ask the compiler for the names and locations of other toolchain components. # This works with GCC and Clang at least, so it should be pretty safe. export LD:=$(shell $(CC) -print-prog-name=ld) export AR:=$(shell $(CC) -print-prog-name=ar) export RANLIB:=$(shell $(CC) -print-prog-name=ranlib) export STRIP:=$(shell $(CC) -print-prog-name=strip) ifeq ($(TRIPLE_OS),mingw32) # SDL calls it WINDRES, Tcl calls it RC; provide both. export WINDRES export RC:=$(WINDRES) endif # Work around some autoconf versions returning "universal" for endianess when # compiling with "-arch" in the CFLAGS, even in a single arch compile. BIGENDIAN:=$(shell PYTHONPATH=build/ $(PYTHON) -c 'from cpu import getCPU ; print "yes" if getCPU("$(OPENMSX_TARGET_CPU)").bigEndian else "no"') ifeq ($(BIGENDIAN),) $(error Could not determine endianess of "$(OPENMSX_TARGET_CPU)") endif # Although X11 is available on Windows and Mac OS X, most people do not have # it installed, so do not link against it. ifeq ($(filter linux freebsd netbsd openbsd gnu,$(OPENMSX_TARGET_OS)),) USE_VIDEO_X11:=disable else USE_VIDEO_X11:=enable endif PACKAGES_BUILD:=$(shell $(PYTHON) build/3rdparty_libraries.py $(OPENMSX_TARGET_OS) $(LINK_MODE)) ifneq ($(TRIPLE_OS),linux) PACKAGES_BUILD:=$(filter-out ALSA,$(PACKAGES_BUILD)) endif PACKAGES_NOBUILD:= PACKAGES_3RD:=$(PACKAGES_BUILD) $(PACKAGES_NOBUILD) BUILD_TARGETS:=$(foreach PACKAGE,$(PACKAGES_BUILD),$(TIMESTAMP_DIR)/build-$(PACKAGE_$(PACKAGE))) INSTALL_BUILD_TARGETS:=$(foreach PACKAGE,$(PACKAGES_BUILD),$(TIMESTAMP_DIR)/install-$(PACKAGE_$(PACKAGE))) INSTALL_NOBUILD_TARGETS:=$(foreach PACKAGE,$(PACKAGES_NOBUILD),$(TIMESTAMP_DIR)/install-$(PACKAGE_$(PACKAGE))) INSTALL_PARAMS_GLEW:=\ GLEW_DEST=$(PWD)/$(INSTALL_DIR) \ LIBDIR=$(PWD)/$(INSTALL_DIR)/lib # Function which, given a variable name prefix and the variable's value, # returns the name of the package. findpackage=$(strip $(foreach PACKAGE,$(PACKAGES_3RD),$(if $(filter $(2),$($(1)_$(PACKAGE))),$(PACKAGE),))) .PHONY: default default: $(INSTALL_BUILD_TARGETS) $(INSTALL_NOBUILD_TARGETS) .PHONY: clean clean: rm -rf $(SOURCE_DIR) rm -rf $(BUILD_DIR) rm -rf $(INSTALL_DIR) # Install. $(INSTALL_BUILD_TARGETS): $(TIMESTAMP_DIR)/install-%: $(TIMESTAMP_DIR)/build-% $(MAKE) -C $(BUILD_DIR)/$* install \ $(MAKEVAR_OVERRIDE_$(call findpackage,PACKAGE,$*)) \ $(INSTALL_PARAMS_$(call findpackage,PACKAGE,$*)) mkdir -p $(@D) touch $@ # Build. $(BUILD_TARGETS): $(TIMESTAMP_DIR)/build-%: $(BUILD_DIR)/%/Makefile $(MAKE) -C $( $@ openMSX-RELEASE_0_14_0/build/3rdparty/000077500000000000000000000000001314057512400173005ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/build/3rdparty/3rdparty.props000066400000000000000000000115531314057512400221420ustar00rootroot00000000000000 ..\.. $(OpenMSXRootDir)\derived $(DerivedDir)\$(Platform)-VC-$(Configuration) $(BuildDir)\3rdParty $(DerivedDir)\3rdParty\src $(ThirdPartyBuildDir)\build $(ThirdPartyBuildDir)\install\lib $(OpenMSXRootDir)\src $(BuildDir)\build $(BuildDir)\install $(BuildDir)\config freetype-2.4.12 glew-1.9.0 libpng-1.6.20 libogg-1.3.0 SDL-1.2.15 SDL_ttf-2.0.11 SDLmain tcl8.5.18 libtheora-1.1.1 libvorbis-1.3.3 zlib-1.2.8 <_ProjectFileVersion>10.0.30319.1 $(OpenMSXRootDir) true $(DerivedDir) true $(BuildDir) true $(ThirdPartyBuildDir) true $(ThirdPartySrcDir) true $(ThirdPartyIntDir) true $(ThirdPartyOutDir) true $(OpenMSXSrcDir) true $(OpenMSXIntDir) true $(OpenMSXOutDir) true $(OpenMSXConfigDir) true $(LibNameFreeType) true $(LibNameGlew) true $(LibNameLibPng) true $(LibNameOgg) true $(LibNameSDL) true $(LibNameSDL_ttf) true $(LibNameSDLmain) true $(LibNameTcl) true $(LibNameTheora) true $(LibNameVorbis) true $(LibNameZlib) true openMSX-RELEASE_0_14_0/build/3rdparty/3rdparty.sln000066400000000000000000000552711314057512400216000ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26228.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glew", "glew.vcxproj", "{E78E1412-E9F8-475B-9504-72031C8FBAEA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "libogg.vcxproj", "{15CBFEFF-7965-41F5-B4E2-21E8795C9159}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcxproj", "{0008960E-E0DD-41A6-8265-00B31DDB4C21}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora", "libtheora.vcxproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis", "libvorbis.vcxproj", "{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL", "SDL.vcxproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL_ttf", "SDL_ttf.vcxproj", "{DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDLmain", "SDLmain.vcxproj", "{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcl", "tcl.vcxproj", "{CCCEA506-D026-4915-BEE0-374F65D7C764}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{05A68CD4-A282-4475-B9F7-ED3C9A0109B5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Developer|Win32 = Developer|Win32 Developer|x64 = Developer|x64 LIB ASM Debug|Win32 = LIB ASM Debug|Win32 LIB ASM Debug|x64 = LIB ASM Debug|x64 LIB ASM Release|Win32 = LIB ASM Release|Win32 LIB ASM Release|x64 = LIB ASM Release|x64 Release_STDIO|Win32 = Release_STDIO|Win32 Release_STDIO|x64 = Release_STDIO|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Debug|Win32.ActiveCfg = Debug|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Debug|Win32.Build.0 = Debug|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Debug|x64.ActiveCfg = Debug|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Debug|x64.Build.0 = Debug|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Developer|Win32.ActiveCfg = Developer|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Developer|Win32.Build.0 = Developer|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Developer|x64.ActiveCfg = Developer|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Developer|x64.Build.0 = Developer|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Debug|x64.Build.0 = Debug|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Release|Win32.Build.0 = Release|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Release|x64.ActiveCfg = Release|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.LIB ASM Release|x64.Build.0 = Release|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Release_STDIO|Win32.ActiveCfg = Release|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Release_STDIO|x64.ActiveCfg = Release|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Release_STDIO|x64.Build.0 = Release|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Release|Win32.ActiveCfg = Release|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Release|Win32.Build.0 = Release|Win32 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Release|x64.ActiveCfg = Release|x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA}.Release|x64.Build.0 = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.ActiveCfg = Debug|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.Build.0 = Debug|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Developer|Win32.ActiveCfg = Developer|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Developer|Win32.Build.0 = Developer|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Developer|x64.ActiveCfg = Developer|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Developer|x64.Build.0 = Developer|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Debug|x64.Build.0 = Debug|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Release|Win32.Build.0 = Release|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Release|x64.ActiveCfg = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB ASM Release|x64.Build.0 = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release_STDIO|Win32.ActiveCfg = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release_STDIO|x64.ActiveCfg = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release_STDIO|x64.Build.0 = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.ActiveCfg = Debug|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.Build.0 = Debug|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.ActiveCfg = Debug|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.Build.0 = Debug|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Developer|Win32.ActiveCfg = Developer|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Developer|Win32.Build.0 = Developer|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Developer|x64.ActiveCfg = Developer|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Developer|x64.Build.0 = Developer|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Debug|x64.Build.0 = Debug|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Release|Win32.Build.0 = Release|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Release|x64.ActiveCfg = Release|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.LIB ASM Release|x64.Build.0 = Release|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release_STDIO|Win32.ActiveCfg = Release|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release_STDIO|x64.ActiveCfg = Release|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release_STDIO|x64.Build.0 = Release|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.ActiveCfg = Release|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.Build.0 = Release|Win32 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.ActiveCfg = Release|x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.Build.0 = Release|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Debug|Win32.ActiveCfg = Debug|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Debug|Win32.Build.0 = Debug|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Debug|x64.ActiveCfg = Debug|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Debug|x64.Build.0 = Debug|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Developer|Win32.ActiveCfg = Developer|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Developer|Win32.Build.0 = Developer|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Developer|x64.ActiveCfg = Developer|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Developer|x64.Build.0 = Developer|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Debug|x64.Build.0 = Debug|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Release|Win32.Build.0 = Release|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Release|x64.ActiveCfg = Release|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.LIB ASM Release|x64.Build.0 = Release|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Release_STDIO|Win32.ActiveCfg = Release|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Release_STDIO|x64.ActiveCfg = Release|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Release_STDIO|x64.Build.0 = Release|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Release|Win32.ActiveCfg = Release|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Release|Win32.Build.0 = Release|Win32 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Release|x64.ActiveCfg = Release|x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21}.Release|x64.Build.0 = Release|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.ActiveCfg = Debug|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.Build.0 = Debug|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Developer|Win32.ActiveCfg = Developer|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Developer|Win32.Build.0 = Developer|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Developer|x64.ActiveCfg = Developer|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Developer|x64.Build.0 = Developer|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Debug|x64.Build.0 = Debug|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Release|Win32.Build.0 = Release|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Release|x64.ActiveCfg = Release|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.LIB ASM Release|x64.Build.0 = Release|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_STDIO|Win32.ActiveCfg = Release|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_STDIO|x64.ActiveCfg = Release|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_STDIO|x64.Build.0 = Release|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.ActiveCfg = Release|x64 {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.Build.0 = Release|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Developer|Win32.ActiveCfg = Developer|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Developer|Win32.Build.0 = Developer|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Developer|x64.ActiveCfg = Developer|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Developer|x64.Build.0 = Developer|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Debug|x64.Build.0 = Debug|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Release|Win32.Build.0 = Release|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Release|x64.ActiveCfg = Release|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.LIB ASM Release|x64.Build.0 = Release|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_STDIO|Win32.ActiveCfg = Release|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_STDIO|x64.ActiveCfg = Release|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_STDIO|x64.Build.0 = Release|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.ActiveCfg = Debug|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.Build.0 = Debug|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.ActiveCfg = Debug|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.Build.0 = Debug|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Developer|Win32.ActiveCfg = Developer|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Developer|Win32.Build.0 = Developer|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Developer|x64.ActiveCfg = Developer|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Developer|x64.Build.0 = Developer|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Debug|x64.Build.0 = Debug|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Release|Win32.Build.0 = Release|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Release|x64.ActiveCfg = Release|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.LIB ASM Release|x64.Build.0 = Release|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_STDIO|Win32.ActiveCfg = Release|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_STDIO|x64.ActiveCfg = Release|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release_STDIO|x64.Build.0 = Release|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.ActiveCfg = Release|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.Build.0 = Release|Win32 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.ActiveCfg = Release|x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.Build.0 = Release|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Debug|Win32.ActiveCfg = Debug|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Debug|Win32.Build.0 = Debug|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Debug|x64.ActiveCfg = Debug|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Debug|x64.Build.0 = Debug|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Developer|Win32.ActiveCfg = Developer|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Developer|Win32.Build.0 = Developer|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Developer|x64.ActiveCfg = Developer|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Developer|x64.Build.0 = Developer|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Debug|x64.Build.0 = Debug|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Release|Win32.Build.0 = Release|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Release|x64.ActiveCfg = Release|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.LIB ASM Release|x64.Build.0 = Release|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Release_STDIO|Win32.ActiveCfg = Release|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Release_STDIO|x64.ActiveCfg = Release|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Release_STDIO|x64.Build.0 = Release|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Release|Win32.ActiveCfg = Release|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Release|Win32.Build.0 = Release|Win32 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Release|x64.ActiveCfg = Release|x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255}.Release|x64.Build.0 = Release|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.ActiveCfg = Debug|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.Build.0 = Debug|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.ActiveCfg = Debug|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.Build.0 = Debug|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Developer|Win32.ActiveCfg = Developer|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Developer|Win32.Build.0 = Developer|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Developer|x64.ActiveCfg = Developer|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Developer|x64.Build.0 = Developer|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Debug|x64.Build.0 = Debug|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Release|Win32.Build.0 = Release|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Release|x64.ActiveCfg = Release|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.LIB ASM Release|x64.Build.0 = Release|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release_STDIO|Win32.ActiveCfg = Release_STDIO|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release_STDIO|Win32.Build.0 = Release_STDIO|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release_STDIO|x64.ActiveCfg = Release_STDIO|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release_STDIO|x64.Build.0 = Release_STDIO|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.ActiveCfg = Release|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.Build.0 = Release|Win32 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.ActiveCfg = Release|x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.Build.0 = Release|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Debug|Win32.ActiveCfg = Debug|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Debug|Win32.Build.0 = Debug|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Debug|x64.ActiveCfg = Debug|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Debug|x64.Build.0 = Debug|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Developer|Win32.ActiveCfg = Developer|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Developer|Win32.Build.0 = Developer|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Developer|x64.ActiveCfg = Developer|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Developer|x64.Build.0 = Developer|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Debug|x64.ActiveCfg = Debug|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Debug|x64.Build.0 = Debug|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Release|Win32.Build.0 = Release|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Release|x64.ActiveCfg = Release|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.LIB ASM Release|x64.Build.0 = Release|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Release_STDIO|Win32.ActiveCfg = Release|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Release_STDIO|x64.ActiveCfg = Release|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Release_STDIO|x64.Build.0 = Release|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Release|Win32.ActiveCfg = Release|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Release|Win32.Build.0 = Release|Win32 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Release|x64.ActiveCfg = Release|x64 {CCCEA506-D026-4915-BEE0-374F65D7C764}.Release|x64.Build.0 = Release|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Debug|Win32.ActiveCfg = Debug|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Debug|Win32.Build.0 = Debug|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Debug|x64.ActiveCfg = Debug|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Debug|x64.Build.0 = Debug|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Developer|Win32.ActiveCfg = Developer|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Developer|Win32.Build.0 = Developer|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Developer|x64.ActiveCfg = Developer|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Developer|x64.Build.0 = Developer|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Debug|Win32.ActiveCfg = LIB ASM Debug|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Debug|Win32.Build.0 = LIB ASM Debug|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Debug|x64.ActiveCfg = LIB ASM Debug|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Debug|x64.Build.0 = LIB ASM Debug|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Release|Win32.ActiveCfg = LIB ASM Release|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Release|Win32.Build.0 = LIB ASM Release|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Release|x64.ActiveCfg = LIB ASM Release|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.LIB ASM Release|x64.Build.0 = LIB ASM Release|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Release_STDIO|Win32.ActiveCfg = Release|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Release_STDIO|x64.ActiveCfg = Release|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Release_STDIO|x64.Build.0 = Release|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Release|Win32.ActiveCfg = Release|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Release|Win32.Build.0 = Release|Win32 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Release|x64.ActiveCfg = Release|x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal openMSX-RELEASE_0_14_0/build/3rdparty/SDL-1.2.15.diff000066400000000000000000000062071314057512400213030ustar00rootroot00000000000000diff -ru SDL-1.2.15.org/src/video/quartz/SDL_QuartzEvents.m SDL-1.2.15/src/video/quartz/SDL_QuartzEvents.m --- SDL-1.2.15.org/src/video/quartz/SDL_QuartzEvents.m 2012-01-19 07:30:06.000000000 +0100 +++ SDL-1.2.15/src/video/quartz/SDL_QuartzEvents.m 2013-10-23 07:16:42.000000000 +0200 @@ -345,7 +345,9 @@ the scancode/keysym. */ if (SDL_TranslateUNICODE && state == SDL_PRESSED) { - [field_edit interpretKeyEvents:[NSArray arrayWithObject:event]]; + if (!([event modifierFlags] & NSCommandKeyMask)) { + [field_edit interpretKeyEvents:[NSArray arrayWithObject:event]]; + } chars = [ event characters ]; numChars = [ chars length ]; if (numChars > 0) @@ -383,7 +385,7 @@ } } - if (SDL_getenv ("SDL_ENABLEAPPEVENTS")) + if (SDL_getenv ("SDL_ENABLEAPPEVENTS") && !(mode_flags & SDL_FULLSCREEN)) [ NSApp sendEvent:event ]; } diff -ru SDL-1.2.15.org/src/video/quartz/SDL_QuartzVideo.h SDL-1.2.15/src/video/quartz/SDL_QuartzVideo.h --- SDL-1.2.15.org/src/video/quartz/SDL_QuartzVideo.h 2012-01-19 07:30:06.000000000 +0100 +++ SDL-1.2.15/src/video/quartz/SDL_QuartzVideo.h 2014-04-04 23:48:34.000000000 +0200 @@ -91,7 +91,9 @@ CGDirectDisplayID display; /* 0 == main display (only support single display) */ const void *mode; /* current mode of the display */ const void *save_mode; /* original mode of the display */ +#if (MAC_OS_X_VERSION_MIN_REQUIRED < 1070) CGDirectPaletteRef palette; /* palette of an 8-bit display */ +#endif NSOpenGLContext *gl_context; /* OpenGL rendering context */ NSGraphicsContext *nsgfx_context; /* Cocoa graphics context */ Uint32 width, height, bpp; /* frequently used data about the display */ diff -ru SDL-1.2.15.org/src/video/quartz/SDL_QuartzWindow.h SDL-1.2.15/src/video/quartz/SDL_QuartzWindow.h --- SDL-1.2.15.org/src/video/quartz/SDL_QuartzWindow.h 2012-01-19 07:30:06.000000000 +0100 +++ SDL-1.2.15/src/video/quartz/SDL_QuartzWindow.h 2013-10-23 07:16:42.000000000 +0200 @@ -38,6 +38,7 @@ - (void)appWillUnhide:(NSNotification*)note; - (void)appDidUnhide:(NSNotification*)note; - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag; +- (BOOL)performKeyEquivalent:(NSEvent*)event; @end /* Delegate for our NSWindow to send SDLQuit() on close */ diff -ru SDL-1.2.15.org/src/video/quartz/SDL_QuartzWindow.m SDL-1.2.15/src/video/quartz/SDL_QuartzWindow.m --- SDL-1.2.15.org/src/video/quartz/SDL_QuartzWindow.m 2012-01-19 07:30:06.000000000 +0100 +++ SDL-1.2.15/src/video/quartz/SDL_QuartzWindow.m 2013-10-23 07:16:42.000000000 +0200 @@ -197,6 +197,14 @@ return [ super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag ]; } +- (BOOL)performKeyEquivalent:(NSEvent*)event +{ + /* give the menu a chance to handle the key equivalent */ + [[NSApp mainMenu] performKeyEquivalent:event]; + /* avoid beep by pretending we handled it */ + return YES; +} + @end @implementation SDL_QuartzWindowDelegate openMSX-RELEASE_0_14_0/build/3rdparty/SDL.vcxproj000066400000000000000000000650521314057512400213470ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68} SDL StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL)\ _DEBUG;%(PreprocessorDefinitions) true true Win32 .\Debug/SDL.tlb Disabled $(DXSDK_DIR)\include;$(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 MachineX86 _DEBUG;%(PreprocessorDefinitions) true true X64 .\Debug/SDL.tlb Disabled $(DXSDK_DIR)\include;$(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 MachineX64 NDEBUG;%(PreprocessorDefinitions) true true Win32 .\Release/SDL.tlb Full AnySuitable true Size true true true $(DXSDK_DIR)\include;$(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;NDEBUG;_WINDOWS;_WIN32_WINNT=0x0400;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 /LTCG %(AdditionalOptions) MachineX86 NDEBUG;%(PreprocessorDefinitions) true true X64 .\Release/SDL.tlb Full AnySuitable true Size true true true $(DXSDK_DIR)\include;$(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;NDEBUG;_WINDOWS;_WIN32_WINNT=0x0400;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 /LTCG %(AdditionalOptions) MachineX64 _DEBUG;%(PreprocessorDefinitions) true true Win32 .\Debug/SDL.tlb Disabled $(DXSDK_DIR)\include;$(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 MachineX86 _DEBUG;%(PreprocessorDefinitions) true true X64 .\Debug/SDL.tlb Disabled $(DXSDK_DIR)\include;$(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_DEBUG;_WINDOWS;_WIN32_WINNT=0x0400;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 MachineX64 openMSX-RELEASE_0_14_0/build/3rdparty/SDL_ttf-2.0.11.diff000066400000000000000000000011351314057512400221460ustar00rootroot00000000000000diff -ru SDL_ttf-2.0.11.org/Makefile.in SDL_ttf-2.0.11/Makefile.in --- SDL_ttf-2.0.11.org/Makefile.in 2012-01-15 05:44:08.000000000 +0100 +++ SDL_ttf-2.0.11/Makefile.in 2012-08-05 22:55:28.000000000 +0200 @@ -353,7 +353,7 @@ rm -f "$${dir}/so_locations"; \ done libSDL_ttf.la: $(libSDL_ttf_la_OBJECTS) $(libSDL_ttf_la_DEPENDENCIES) - $(libSDL_ttf_la_LINK) -rpath $(libdir) $(libSDL_ttf_la_OBJECTS) $(libSDL_ttf_la_LIBADD) $(LIBS) + $(libSDL_ttf_la_LINK) -rpath $(libdir) $(libSDL_ttf_la_OBJECTS) $(libSDL_ttf_la_LIBADD) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ openMSX-RELEASE_0_14_0/build/3rdparty/SDL_ttf.vcxproj000066400000000000000000000467701314057512400222320ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {DDDBD07D-DC76-4AF6-8D02-3E2DEB6EE255} SDL_ttf StaticLibrary false v141 StaticLibrary false true v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false true v141 StaticLibrary false v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL_ttf)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL_ttf)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL_ttf)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL_ttf)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL_ttf)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDL_ttf)\ _DEBUG;%(PreprocessorDefinitions) true true Win32 .\Debug/SDL_ttf.tlb Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 true .\Debug/SDL_ttf.bsc MachineX86 _DEBUG;%(PreprocessorDefinitions) true true X64 .\Debug/SDL_ttf.tlb Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 true .\Debug/SDL_ttf.bsc MachineX64 NDEBUG;%(PreprocessorDefinitions) true true Win32 .\Release/SDL_ttf.tlb Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 true .\Release/SDL_ttf.bsc MachineX86 NDEBUG;%(PreprocessorDefinitions) true true X64 .\Release/SDL_ttf.tlb Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 true .\Release/SDL_ttf.bsc MachineX64 _DEBUG;%(PreprocessorDefinitions) true true Win32 .\Debug/SDL_ttf.tlb Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 true .\Debug/SDL_ttf.bsc MachineX86 _DEBUG;%(PreprocessorDefinitions) true true X64 .\Debug/SDL_ttf.tlb Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 true .\Debug/SDL_ttf.bsc MachineX64 %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) openMSX-RELEASE_0_14_0/build/3rdparty/SDLmain.vcxproj000066400000000000000000000461061314057512400222130ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release_STDIO Win32 Release_STDIO x64 Release Win32 Release x64 {DA956FD3-E142-46F2-9DD5-C78BEBB56B7A} SDLmain StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameSDLmain)\ Full AnySuitable true true true true $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true MultiThreaded true Level3 true Default /LTCG %(AdditionalOptions) true X64 Full AnySuitable true true true true $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true MultiThreaded true Level3 true Default /LTCG %(AdditionalOptions) true Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;NDEBUG;_WINDOWS;NO_STDIO_REDIRECT;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true Default /LTCG %(AdditionalOptions) true MachineX86 X64 Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;NDEBUG;_WINDOWS;NO_STDIO_REDIRECT;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true Default /LTCG %(AdditionalOptions) true MachineX64 Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true ProgramDatabase Default true MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true ProgramDatabase Default true MachineX64 Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase Default true MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameSDL)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase Default true MachineX64 openMSX-RELEASE_0_14_0/build/3rdparty/freetype-2.4.12.diff000066400000000000000000000240771314057512400225110ustar00rootroot00000000000000diff -ru freetype-2.4.12.orig/include/freetype/config/ftoption.h freetype-2.4.12/include/freetype/config/ftoption.h --- freetype-2.4.12.orig/include/freetype/config/ftoption.h 2013-01-22 14:31:11.000000000 +0100 +++ freetype-2.4.12/include/freetype/config/ftoption.h 2013-05-18 12:01:54.000000000 +0200 @@ -148,7 +148,7 @@ /* */ /* Define this macro if you want to enable this `feature'. */ /* */ -#define FT_CONFIG_OPTION_USE_LZW +/* #define FT_CONFIG_OPTION_USE_LZW */ /*************************************************************************/ @@ -163,7 +163,7 @@ /* Define this macro if you want to enable this `feature'. See also */ /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ /* */ -#define FT_CONFIG_OPTION_USE_ZLIB +/* #define FT_CONFIG_OPTION_USE_ZLIB */ /*************************************************************************/ @@ -296,7 +296,7 @@ /* able to synthesize a Unicode charmap out of the glyphs found in the */ /* fonts. */ /* */ -#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST +#undef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST /*************************************************************************/ @@ -309,7 +309,7 @@ /* */ /* Note that the `FOND' resource isn't checked. */ /* */ -#define FT_CONFIG_OPTION_MAC_FONTS +/* #define FT_CONFIG_OPTION_MAC_FONTS */ /*************************************************************************/ @@ -487,7 +487,7 @@ /* embedded bitmaps in all formats using the SFNT module (namely */ /* TrueType & OpenType). */ /* */ -#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS +/* #define TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ /*************************************************************************/ @@ -502,7 +502,7 @@ /* */ /* (By default, the module uses `PSNames' to extract glyph names.) */ /* */ -#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#undef TT_CONFIG_OPTION_POSTSCRIPT_NAMES /*************************************************************************/ @@ -516,7 +516,7 @@ /* Accessing SFNT names is done through the functions declared in */ /* `freetype/ftsnames.h'. */ /* */ -#define TT_CONFIG_OPTION_SFNT_NAMES +/* #define TT_CONFIG_OPTION_SFNT_NAMES */ /*************************************************************************/ @@ -669,7 +669,7 @@ /* and avar tables). This has many similarities to Type 1 Multiple */ /* Masters support. */ /* */ -#define TT_CONFIG_OPTION_GX_VAR_SUPPORT +/* #define TT_CONFIG_OPTION_GX_VAR_SUPPORT */ /*************************************************************************/ @@ -677,7 +677,7 @@ /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ /* an embedded `BDF ' table within SFNT-based bitmap formats. */ /* */ -#define TT_CONFIG_OPTION_BDF +/* #define TT_CONFIG_OPTION_BDF */ /*************************************************************************/ @@ -723,7 +723,7 @@ /* files into an existing face. Note that if set, the T1 driver will be */ /* unable to produce kerning distances. */ /* */ -#undef T1_CONFIG_OPTION_NO_AFM +#define T1_CONFIG_OPTION_NO_AFM /*************************************************************************/ diff -ru freetype-2.4.12.orig/modules.cfg freetype-2.4.12/modules.cfg --- freetype-2.4.12.orig/modules.cfg 2011-11-26 13:19:10.000000000 +0100 +++ freetype-2.4.12/modules.cfg 2013-05-18 12:06:58.000000000 +0200 @@ -37,35 +37,35 @@ # PostScript Type 1 font driver. # # This driver needs the `psaux', `pshinter', and `psnames' modules. -FONT_MODULES += type1 +#FONT_MODULES += type1 # CFF/OpenType font driver. # # This driver needs the `sfnt', `pshinter', and `psnames' modules. -FONT_MODULES += cff +#FONT_MODULES += cff # Type 1 CID-keyed font driver. # # This driver needs the `psaux', `pshinter', and `psnames' modules. -FONT_MODULES += cid +#FONT_MODULES += cid # PFR/TrueDoc font driver. See optional extension ftpfr.c below also. -FONT_MODULES += pfr +#FONT_MODULES += pfr # PostScript Type 42 font driver. # # This driver needs the `truetype' and `psaux' modules. -FONT_MODULES += type42 +#FONT_MODULES += type42 # Windows FONT/FNT font driver. See optional extension ftwinfnt.c below # also. -FONT_MODULES += winfonts +#FONT_MODULES += winfonts # PCF font driver. -FONT_MODULES += pcf +#FONT_MODULES += pcf # BDF font driver. See optional extension ftbdf.c below also. -FONT_MODULES += bdf +#FONT_MODULES += bdf # SFNT files support. If used without `truetype' or `cff', it supports # bitmap-only fonts within an SFNT wrapper. @@ -79,10 +79,10 @@ #### # FreeType's auto hinter. -HINTING_MODULES += autofit +#HINTING_MODULES += autofit # PostScript hinter. -HINTING_MODULES += pshinter +#HINTING_MODULES += pshinter # The TrueType hinting engine doesn't have a module of its own but is # controlled in file include/freetype/config/ftoption.h @@ -94,7 +94,7 @@ #### # Monochrome rasterizer. -RASTER_MODULES += raster +#RASTER_MODULES += raster # Anti-aliasing rasterizer. RASTER_MODULES += smooth @@ -107,7 +107,7 @@ # FreeType's cache sub-system (quite stable but still in beta -- this means # that its public API is subject to change if necessary). See # include/freetype/ftcache.h. Needs ftglyph.c. -AUX_MODULES += cache +#AUX_MODULES += cache # TrueType GX/AAT table validation. Needs ftgxval.c below. # AUX_MODULES += gxvalid @@ -115,12 +115,12 @@ # Support for streams compressed with gzip (files with suffix .gz). # # See include/freetype/ftgzip.h for the API. -AUX_MODULES += gzip +#AUX_MODULES += gzip # Support for streams compressed with LZW (files with suffix .Z). # # See include/freetype/ftlzw.h for the API. -AUX_MODULES += lzw +#AUX_MODULES += lzw # Support for streams compressed with bzip2 (files with suffix .bz2). # @@ -134,13 +134,13 @@ # Auxiliary PostScript driver component to share common code. # # This module depends on `psnames'. -AUX_MODULES += psaux +#AUX_MODULES += psaux # Support for PostScript glyph names. # # This module can be controlled in ftconfig.h # (FT_CONFIG_OPTION_POSTSCRIPT_NAMES). -AUX_MODULES += psnames +#AUX_MODULES += psnames #### @@ -150,12 +150,12 @@ # Exact bounding box calculation. # # See include/freetype/ftbbox.h for the API. -BASE_EXTENSIONS += ftbbox.c +#BASE_EXTENSIONS += ftbbox.c # Access BDF-specific strings. Needs BDF font driver. # # See include/freetype/ftbdf.h for the API. -BASE_EXTENSIONS += ftbdf.c +#BASE_EXTENSIONS += ftbdf.c # Utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp bitmaps into # 8bpp format, and for emboldening of bitmap glyphs. @@ -166,17 +166,17 @@ # Access CID font information. # # See include/freetype/ftcid.h for the API. -BASE_EXTENSIONS += ftcid.c +#BASE_EXTENSIONS += ftcid.c # Access FSType information. Needs fttype1.c. # # See include/freetype/freetype.h for the API. -BASE_EXTENSIONS += ftfstype.c +#BASE_EXTENSIONS += ftfstype.c # Support for GASP table queries. # # See include/freetype/ftgasp.h for the API. -BASE_EXTENSIONS += ftgasp.c +#BASE_EXTENSIONS += ftgasp.c # Convenience functions to handle glyphs. Needs ftbitmap.c. # @@ -186,32 +186,32 @@ # Interface for gxvalid module. # # See include/freetype/ftgxval.h for the API. -BASE_EXTENSIONS += ftgxval.c +#BASE_EXTENSIONS += ftgxval.c # Support for LCD color filtering of subpixel bitmaps. # # See include/freetype/ftlcdfil.h for the API. -BASE_EXTENSIONS += ftlcdfil.c +#BASE_EXTENSIONS += ftlcdfil.c # Multiple Master font interface. # # See include/freetype/ftmm.h for the API. -BASE_EXTENSIONS += ftmm.c +#BASE_EXTENSIONS += ftmm.c # Interface for otvalid module. # # See include/freetype/ftotval.h for the API. -BASE_EXTENSIONS += ftotval.c +#BASE_EXTENSIONS += ftotval.c # Support for FT_Face_CheckTrueTypePatents. # # See include/freetype/freetype.h for the API. -BASE_EXTENSIONS += ftpatent.c +#BASE_EXTENSIONS += ftpatent.c # Interface for accessing PFR-specific data. Needs PFR font driver. # # See include/freetype/ftpfr.h for the API. -BASE_EXTENSIONS += ftpfr.c +#BASE_EXTENSIONS += ftpfr.c # Path stroker. Needs ftglyph.c. # @@ -221,24 +221,24 @@ # Support for synthetic embolding and slanting of fonts. Needs ftbitmap.c. # # See include/freetype/ftsynth.h for the API. -BASE_EXTENSIONS += ftsynth.c +#BASE_EXTENSIONS += ftsynth.c # Interface to access data specific to PostScript Type 1 and Type 2 (CFF) # fonts. # # See include/freetype/t1tables.h for the API. -BASE_EXTENSIONS += fttype1.c +#BASE_EXTENSIONS += fttype1.c # Interface for accessing data specific to Windows FNT files. Needs winfnt # driver. # # See include/freetype/ftwinfnt.h for the API. -BASE_EXTENSIONS += ftwinfnt.c +#BASE_EXTENSIONS += ftwinfnt.c # Support functions for X11. # # See include/freetype/ftxf86.h for the API. -BASE_EXTENSIONS += ftxf86.c +#BASE_EXTENSIONS += ftxf86.c #### #### The components `ftsystem.c' (for memory allocation and stream I/O openMSX-RELEASE_0_14_0/build/3rdparty/freetype.vcxproj000066400000000000000000002642711314057512400225540ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} freetype StaticLibrary false MultiByte v141 StaticLibrary false MultiByte v141 StaticLibrary false MultiByte true v141 StaticLibrary false MultiByte v141 StaticLibrary false MultiByte v141 StaticLibrary false MultiByte true v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameFreeType)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameFreeType)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameFreeType)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameFreeType)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameFreeType)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameFreeType)\ Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Sync Default MultiThreaded true true true Level4 Default 4001;%(DisableSpecificWarnings) NDEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX86 X64 Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Sync Default MultiThreaded true true true Level4 Default 4001;%(DisableSpecificWarnings) NDEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX64 set LibFullName=Foo Disabled $(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) _DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) false false true EnableFastChecks MultiThreadedDebug true Level4 ProgramDatabase Default 4001;%(DisableSpecificWarnings) _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX86 set LibFullName=Foo X64 Disabled $(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) _DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) false false true EnableFastChecks MultiThreadedDebug true Level4 ProgramDatabase Default 4001;%(DisableSpecificWarnings) _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX64 set LibFullName=Foo Disabled $(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) _DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) false false true true Default MultiThreadedDebug true Level4 ProgramDatabase Default 4001;%(DisableSpecificWarnings) _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX86 set LibFullName=Foo X64 Disabled $(ThirdPartySrcDir)\$(LibNameFreeType)\include;%(AdditionalIncludeDirectories) _DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) false false true true Default MultiThreadedDebug true Level4 ProgramDatabase Default 4001;%(DisableSpecificWarnings) _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX64 Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks false Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks false Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks false Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks false MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) false MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) false Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) openMSX-RELEASE_0_14_0/build/3rdparty/freetype.vcxproj.filters000066400000000000000000000140141314057512400242070ustar00rootroot00000000000000 {62c90e15-3afc-4349-8061-9d4644f7b19c} cpp;c;cxx;rc;def;r;odl;idl;hpj;bat {b30a8e21-f649-4e57-88c5-ea62fc84dd51} h;hpp;hxx;hm;inl Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files openMSX-RELEASE_0_14_0/build/3rdparty/glew-1.9.0.diff000066400000000000000000000137061314057512400215420ustar00rootroot00000000000000diff -ru glew-1.9.0.orig/build/glew.rc glew-1.9.0/build/glew.rc --- glew-1.9.0.orig/build/glew.rc 2012-08-06 17:59:08.000000000 +0200 +++ glew-1.9.0/build/glew.rc 2013-05-25 21:44:27.000000000 +0200 @@ -56,7 +56,7 @@ BEGIN BLOCK "040904b0" BEGIN - VALUE "Comments", "The OpenGL Extension Wrangler Library\r\nCopyright (C) 2002-2008, Milan Ikits \r\nCopyright (C) 2002-2008, Marcelo E. Magallon \r\nCopyright (C) 2002, Lev Povalahev\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without \r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n* Redistributions of source code must retain the above copyright notice, \r\n this list of conditions and the following disclaimer.\r\n* Redistributions in binary form must reproduce the above copyright notice, \r\n this list of conditions and the following disclaimer in the documentation \r\n and/or other materials provided with the distribution.\r\n* The name of the author may be used to endorse or promote products \r\n derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' \r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n\r\nMesa 3-D graphics library\r\n\r\nVersion: 7.0\r\n\r\nCopyright (C) 1999-2007 Brian Paul All Rights Reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and associated documentation files (the ''Software''),\r\nto deal in the Software without restriction, including without limitation\r\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\r\nand/or sell copies of the Software, and to permit persons to whom the\r\nSoftware is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED ''AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r\nBRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\r\nAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n\r\nCopyright (c) 2007 The Khronos Group Inc.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and/or associated documentation files (the\r\n''Materials''), to deal in the Materials without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Materials, and to\r\npermit persons to whom the Materials are furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Materials.\r\n\r\nTHE MATERIALS ARE PROVIDED ''AS IS'', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nMATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\0" + VALUE "Comments", "The description that was here fails to compile on Visual Studio, see https://sourceforge.net/p/glew/bugs/201/. It doesn't end up in any openMSX binary anyway.\0" VALUE "CompanyName", "\0" VALUE "FileDescription", "The OpenGL Extension Wrangler Library\0" VALUE "FileVersion", "1,9,0,0\0" diff -ru glew-1.9.0.orig/include/GL/glew.h glew-1.9.0/include/GL/glew.h --- glew-1.9.0.orig/include/GL/glew.h 2012-08-06 17:59:08.000000000 +0200 +++ glew-1.9.0/include/GL/glew.h 2013-05-25 21:39:27.000000000 +0200 @@ -113,7 +113,7 @@ #define GLEW_APIENTRY_DEFINED # if defined(__MINGW32__) || defined(__CYGWIN__) # define APIENTRY __stdcall -# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# elif (defined(_MSC_VER) && (_MSC_VER >= 800)) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) # define APIENTRY __stdcall # else # define APIENTRY diff -ru glew-1.9.0.orig/Makefile glew-1.9.0/Makefile --- glew-1.9.0.orig/Makefile 2012-08-06 17:59:08.000000000 +0200 +++ glew-1.9.0/Makefile 2013-05-25 21:39:27.000000000 +0200 @@ -72,7 +72,9 @@ OPT = $(POPT) endif INCLUDE = -Iinclude -CFLAGS = $(OPT) $(WARN) $(INCLUDE) $(CFLAGS.EXTRA) +# openMSX dedicated build: use flavour's optimization flags instead: +#CFLAGS = $(OPT) $(WARN) $(INCLUDE) $(CFLAGS.EXTRA) +CFLAGS += $(WARN) $(INCLUDE) $(CFLAGS.EXTRA) all debug: glew.lib glew.lib.mx glew.bin @@ -262,7 +264,7 @@ install.bin: glew.bin $(INSTALL) -d -m 0755 $(BINDIR) - $(INSTALL) -s -m 0755 bin/$(GLEWINFO.BIN) bin/$(VISUALINFO.BIN) $(BINDIR)/ +# $(INSTALL) -s -m 0755 bin/$(GLEWINFO.BIN) bin/$(VISUALINFO.BIN) $(BINDIR)/ install.include: $(INSTALL) -d -m 0755 $(INCDIR) openMSX-RELEASE_0_14_0/build/3rdparty/glew.vcxproj000066400000000000000000000461771314057512400216720ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {E78E1412-E9F8-475B-9504-72031C8FBAEA} glew_static 10.0.14393.0 StaticLibrary false MultiByte v141 StaticLibrary false MultiByte true v141 StaticLibrary false MultiByte v141 StaticLibrary false MultiByte v141 StaticLibrary false MultiByte true v141 StaticLibrary false MultiByte v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameGlew)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameGlew)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameGlew)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameGlew)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameGlew)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameGlew)\ Disabled $(ThirdPartySrcDir)\$(LibNameGlew)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;VC_EXTRALEAN;GLEW_STATIC;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;GLEW_MX;GLEW_STATIC;%(PreprocessorDefinitions) 0x0409 true MachineX86 true .\glew/lib/glew_static.bsc X64 Disabled $(ThirdPartySrcDir)\$(LibNameGlew)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;VC_EXTRALEAN;GLEW_STATIC;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;GLEW_MX;GLEW_STATIC;%(PreprocessorDefinitions) 0x0409 true MachineX64 true .\glew/lib/glew_static.bsc Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameGlew)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;VC_EXTRALEAN;GLEW_STATIC;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true NDEBUG;GLEW_MX;GLEW_STATIC;%(PreprocessorDefinitions) 0x0409 true MachineX86 true .\glew/lib/glew_static.bsc X64 Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameGlew)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;VC_EXTRALEAN;GLEW_STATIC;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true NDEBUG;GLEW_MX;GLEW_STATIC;%(PreprocessorDefinitions) 0x0409 true MachineX64 true .\glew/lib/glew_static.bsc Disabled $(ThirdPartySrcDir)\$(LibNameGlew)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;VC_EXTRALEAN;GLEW_STATIC;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;GLEW_MX;GLEW_STATIC;%(PreprocessorDefinitions) 0x0409 true MachineX86 true .\glew/lib/glew_static.bsc X64 Disabled $(ThirdPartySrcDir)\$(LibNameGlew)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;VC_EXTRALEAN;GLEW_STATIC;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;GLEW_MX;GLEW_STATIC;%(PreprocessorDefinitions) 0x0409 true MachineX64 true .\glew/lib/glew_static.bsc %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) openMSX-RELEASE_0_14_0/build/3rdparty/glew.vcxproj.filters000066400000000000000000000024541314057512400233270ustar00rootroot00000000000000 {16b0a29f-ab69-458e-9125-149ccd95d72c} cpp;c;cxx;rc;def;r;odl;idl;hpj;bat {86b057dd-7908-43d0-b8ff-6e7630b2d0b1} h;hpp;hxx;hm;inl {1fc2b525-9c62-4fc0-8055-27e54fe40b7f} Source Files Header Files Header Files Resources openMSX-RELEASE_0_14_0/build/3rdparty/libogg.vcxproj000066400000000000000000000331501314057512400221620ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {15CBFEFF-7965-41F5-B4E2-21E8795C9159} libogg Win32Proj StaticLibrary Unicode v141 StaticLibrary Unicode true v141 StaticLibrary Unicode v141 StaticLibrary Unicode v141 StaticLibrary Unicode true v141 StaticLibrary Unicode v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameOgg)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameOgg)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameOgg)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameOgg)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameOgg)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameOgg)\ Disabled $(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level4 EditAndContinue CompileAsC MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level4 ProgramDatabase CompileAsC MachineX64 Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level4 CompileAsC 4244;%(DisableSpecificWarnings) MachineX86 X64 Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level4 CompileAsC 4244;%(DisableSpecificWarnings) MachineX64 Disabled $(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level4 EditAndContinue CompileAsC MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level4 ProgramDatabase CompileAsC MachineX64 openMSX-RELEASE_0_14_0/build/3rdparty/libogg.vcxproj.filters000066400000000000000000000025611314057512400236330ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx Source Files Source Files Header Files Header Files openMSX-RELEASE_0_14_0/build/3rdparty/libpng.vcxproj000066400000000000000000000414071314057512400221760ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {0008960E-E0DD-41A6-8265-00B31DDB4C21} libpng StaticLibrary v141 StaticLibrary v141 StaticLibrary v141 StaticLibrary v141 StaticLibrary v141 StaticLibrary v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameLibPng)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameLibPng)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameLibPng)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameLibPng)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameLibPng)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameLibPng)\ Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameZlib);%(AdditionalIncludeDirectories) WIN32;NDEBUG;PNG_USE_PNGVCRD;PNG_LIBPNG_SPECIALBUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Sync MultiThreaded true true png.h Level3 Default /LTCG %(AdditionalOptions) MachineX86 copy $(ThirdPartySrcDir)\$(LibNameLibPng)\scripts\pnglibconf.h.prebuilt $(ThirdPartySrcDir)\$(LibNameLibPng)\pnglibconf.h X64 Full AnySuitable true Size true true true $(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameZlib);%(AdditionalIncludeDirectories) WIN32;NDEBUG;PNG_USE_PNGVCRD;PNG_LIBPNG_SPECIALBUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Sync MultiThreaded true true png.h Level3 Default /LTCG %(AdditionalOptions) MachineX64 copy $(ThirdPartySrcDir)\$(LibNameLibPng)\scripts\pnglibconf.h.prebuilt $(ThirdPartySrcDir)\$(LibNameLibPng)\pnglibconf.h Disabled $(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameZlib);%(AdditionalIncludeDirectories) WIN32;_DEBUG;DEBUG;PNG_DEBUG=1;PNG_USE_PNGVCRD;PNG_LIBPNG_SPECIALBUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug png.h Level3 EditAndContinue Default MachineX86 copy $(ThirdPartySrcDir)\$(LibNameLibPng)\scripts\pnglibconf.h.prebuilt $(ThirdPartySrcDir)\$(LibNameLibPng)\pnglibconf.h X64 Disabled $(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameZlib);%(AdditionalIncludeDirectories) WIN32;_DEBUG;DEBUG;PNG_DEBUG=1;PNG_USE_PNGVCRD;PNG_LIBPNG_SPECIALBUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug png.h Level3 ProgramDatabase Default MachineX64 copy $(ThirdPartySrcDir)\$(LibNameLibPng)\scripts\pnglibconf.h.prebuilt $(ThirdPartySrcDir)\$(LibNameLibPng)\pnglibconf.h Disabled $(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameZlib);%(AdditionalIncludeDirectories) WIN32;_DEBUG;DEBUG;PNG_DEBUG=1;PNG_USE_PNGVCRD;PNG_LIBPNG_SPECIALBUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug png.h Level3 ProgramDatabase Default MachineX86 copy $(ThirdPartySrcDir)\$(LibNameLibPng)\scripts\pnglibconf.h.prebuilt $(ThirdPartySrcDir)\$(LibNameLibPng)\pnglibconf.h X64 Disabled $(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameZlib);%(AdditionalIncludeDirectories) WIN32;_DEBUG;DEBUG;PNG_DEBUG=1;PNG_USE_PNGVCRD;PNG_LIBPNG_SPECIALBUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug png.h Level3 ProgramDatabase Default MachineX64 copy $(ThirdPartySrcDir)\$(LibNameLibPng)\scripts\pnglibconf.h.prebuilt $(ThirdPartySrcDir)\$(LibNameLibPng)\pnglibconf.h openMSX-RELEASE_0_14_0/build/3rdparty/libpng.vcxproj.filters000066400000000000000000000064531314057512400236470ustar00rootroot00000000000000 {cfb12311-2c25-406d-90fa-1a94e04b9107} cpp;c;cxx;rc;def;r;odl;idl;hpj;bat {dadb6a38-0397-4c12-958f-43fc35c69553} h;hpp;hxx;hm;inl {d19955fe-f136-45bb-baa2-ab0c5710c4f1} ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Resource Files openMSX-RELEASE_0_14_0/build/3rdparty/libtheora-1.1.1.diff000066400000000000000000000012471314057512400225430ustar00rootroot00000000000000diff -ru libtheora-1.1.1.org/configure libtheora-1.1.1/configure --- libtheora-1.1.1.org/configure 2009-10-01 20:04:08.000000000 +0200 +++ libtheora-1.1.1/configure 2014-04-05 00:00:32.000000000 +0200 @@ -11863,7 +11863,7 @@ case $host in *) DEBUG="-g -Wall -Wno-parentheses -DDEBUG -D__NO_MATH_INLINES" - CFLAGS="-Wall -Wno-parentheses -O3 -fforce-addr -fomit-frame-pointer -finline-functions -funroll-loops" + CFLAGS="-Wall -Wno-parentheses -O3 -fomit-frame-pointer -finline-functions -funroll-loops" PROFILE="-Wall -Wno-parentheses -pg -g -O3 -fno-inline-functions -DDEBUG";; esac fi openMSX-RELEASE_0_14_0/build/3rdparty/libtheora.vcxproj000066400000000000000000000603131314057512400226710ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {653F3841-3F26-49B9-AFCF-091DB4B67031} libtheora Win32Proj StaticLibrary Unicode v141 StaticLibrary Unicode true v141 StaticLibrary Unicode v141 StaticLibrary Unicode v141 StaticLibrary Unicode true v141 StaticLibrary Unicode v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTheora)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTheora)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTheora)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTheora)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTheora)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTheora)\ Disabled $(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;OC_X86_ASM;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level3 ProgramDatabase MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level3 ProgramDatabase MachineX64 Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;OC_X86_ASM;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level4 CompileAsC 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) MachineX86 X64 Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level4 CompileAsC 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) MachineX64 Disabled $(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;OC_X86_ASM;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 ProgramDatabase MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level3 ProgramDatabase MachineX64 true true true true true true $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc $(IntDir)%(Filename)1.obj $(IntDir)%(Filename)1.xdc openMSX-RELEASE_0_14_0/build/3rdparty/libtheora.vcxproj.filters000066400000000000000000000200231314057512400243320ustar00rootroot00000000000000 {83741e6a-3d10-476a-b1ec-e9098fabacb7} {7f957e1c-7cef-42de-858b-962247fff00b} {e0aa57f5-2050-46a2-b36c-2a9e6ac323ff} {ba0ac045-9ac6-442e-9b34-8573540c5e6e} {8c1d2b59-d884-4c59-8ae2-6f33fc26187e} {e8759675-802a-4da8-b9e9-c845f9952a12} {965f7fba-63ea-4828-8dac-2ee27d82acd8} include\theora include\theora include\theora lib lib lib\enc lib\enc lib\enc lib\enc lib\enc lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc lib\enc\x86_vc lib\enc\x86_vc lib\enc\x86_vc lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec lib\dec\x86_vc lib\dec\x86_vc lib\dec\x86_vc lib\dec\x86_vc openMSX-RELEASE_0_14_0/build/3rdparty/libvorbis.vcxproj000066400000000000000000000456171314057512400227250ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {3A214E06-B95E-4D61-A291-1F8DF2EC10FD} libvorbis Win32Proj StaticLibrary Unicode v141 StaticLibrary Unicode true v141 StaticLibrary Unicode v141 StaticLibrary Unicode v141 StaticLibrary Unicode true v141 StaticLibrary Unicode v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameVorbis)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameVorbis)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameVorbis)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameVorbis)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameVorbis)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameVorbis)\ Disabled $(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level4 EditAndContinue CompileAsC X64 Disabled $(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level4 ProgramDatabase CompileAsC Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level4 ProgramDatabase CompileAsC 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) X64 Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level4 ProgramDatabase CompileAsC 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) Disabled $(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level4 EditAndContinue CompileAsC X64 Disabled $(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) true Default MultiThreadedDebug Level4 ProgramDatabase CompileAsC openMSX-RELEASE_0_14_0/build/3rdparty/libvorbis.vcxproj.filters000066400000000000000000000225341314057512400243650ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files openMSX-RELEASE_0_14_0/build/3rdparty/tcl.vcxproj000066400000000000000000001007151314057512400215030ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {CCCEA506-D026-4915-BEE0-374F65D7C764} tcl Win32Proj StaticLibrary MultiByte v141 StaticLibrary MultiByte true v141 StaticLibrary MultiByte v141 StaticLibrary MultiByte v141 StaticLibrary MultiByte true v141 StaticLibrary MultiByte v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTcl)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTcl)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTcl)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTcl)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTcl)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameTcl)\ Disabled $(ThirdPartySrcDir)\$(LibNameTcl)\win;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameTcl)\libtommath;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;TCL_TOMMATH;MP_PREC=4;TCL_CFGVAL_ENCODING="cp1252";STDC_HEADERS;STATIC_BUILD;TCL_CFG_DEBUG;TCL_USE_STATIC_PACKAGES=1;BUILD_tcl;inline=__inline;TCL_PIPE_DLL="tclpip85sg.dll";CFG_INSTALL_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_INSTALL_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_INSTALL_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_INSTALL_INCDIR="C:\\Program Files\\Tcl\\include";CFG_INSTALL_DOCDIR="C:\\Program Files\\Tcl\\doc";CFG_RUNTIME_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_RUNTIME_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_RUNTIME_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_RUNTIME_INCDIR="C:\\Program Files\\Tcl\\include";CFG_RUNTIME_DOCDIR="C:\\Program Files\\Tcl\\doc";%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameTcl)\win;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameTcl)\libtommath;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;TCL_TOMMATH;MP_PREC=4;TCL_CFGVAL_ENCODING="cp1252";STDC_HEADERS;STATIC_BUILD;TCL_CFG_DEBUG;TCL_USE_STATIC_PACKAGES=1;BUILD_tcl;inline=__inline;TCL_PIPE_DLL="tclpip85sg.dll";CFG_INSTALL_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_INSTALL_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_INSTALL_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_INSTALL_INCDIR="C:\\Program Files\\Tcl\\include";CFG_INSTALL_DOCDIR="C:\\Program Files\\Tcl\\doc";CFG_RUNTIME_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_RUNTIME_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_RUNTIME_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_RUNTIME_INCDIR="C:\\Program Files\\Tcl\\include";CFG_RUNTIME_DOCDIR="C:\\Program Files\\Tcl\\doc";_stati64=_stat64;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase MachineX64 /MP %(AdditionalOptions) Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameTcl)\win;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameTcl)\libtommath;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;TCL_TOMMATH;MP_PREC=4;TCL_CFGVAL_ENCODING="cp1252";STDC_HEADERS;STATIC_BUILD;TCL_CFG_DEBUG;TCL_USE_STATIC_PACKAGES=1;BUILD_tcl;inline=__inline;TCL_PIPE_DLL="tclpip85sg.dll";CFG_INSTALL_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_INSTALL_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_INSTALL_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_INSTALL_INCDIR="C:\\Program Files\\Tcl\\include";CFG_INSTALL_DOCDIR="C:\\Program Files\\Tcl\\doc";CFG_RUNTIME_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_RUNTIME_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_RUNTIME_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_RUNTIME_INCDIR="C:\\Program Files\\Tcl\\include";CFG_RUNTIME_DOCDIR="C:\\Program Files\\Tcl\\doc";%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 ProgramDatabase MachineX86 X64 /MP %(AdditionalOptions) Full AnySuitable true Size true true $(ThirdPartySrcDir)\$(LibNameTcl)\win;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameTcl)\libtommath;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;TCL_TOMMATH;MP_PREC=4;TCL_CFGVAL_ENCODING="cp1252";STDC_HEADERS;STATIC_BUILD;TCL_CFG_DEBUG;TCL_USE_STATIC_PACKAGES=1;BUILD_tcl;inline=__inline;TCL_PIPE_DLL="tclpip85sg.dll";CFG_INSTALL_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_INSTALL_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_INSTALL_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_INSTALL_INCDIR="C:\\Program Files\\Tcl\\include";CFG_INSTALL_DOCDIR="C:\\Program Files\\Tcl\\doc";CFG_RUNTIME_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_RUNTIME_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_RUNTIME_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_RUNTIME_INCDIR="C:\\Program Files\\Tcl\\include";CFG_RUNTIME_DOCDIR="C:\\Program Files\\Tcl\\doc";_stati64=_stat64;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 ProgramDatabase MachineX64 Disabled $(ThirdPartySrcDir)\$(LibNameTcl)\win;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameTcl)\libtommath;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;TCL_TOMMATH;MP_PREC=4;TCL_CFGVAL_ENCODING="cp1252";STDC_HEADERS;STATIC_BUILD;TCL_CFG_DEBUG;TCL_USE_STATIC_PACKAGES=1;BUILD_tcl;inline=__inline;TCL_PIPE_DLL="tclpip85sg.dll";CFG_INSTALL_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_INSTALL_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_INSTALL_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_INSTALL_INCDIR="C:\\Program Files\\Tcl\\include";CFG_INSTALL_DOCDIR="C:\\Program Files\\Tcl\\doc";CFG_RUNTIME_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_RUNTIME_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_RUNTIME_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_RUNTIME_INCDIR="C:\\Program Files\\Tcl\\include";CFG_RUNTIME_DOCDIR="C:\\Program Files\\Tcl\\doc";%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 ProgramDatabase MachineX86 X64 Disabled $(ThirdPartySrcDir)\$(LibNameTcl)\win;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameTcl)\libtommath;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;TCL_TOMMATH;MP_PREC=4;TCL_CFGVAL_ENCODING="cp1252";STDC_HEADERS;STATIC_BUILD;TCL_CFG_DEBUG;TCL_USE_STATIC_PACKAGES=1;BUILD_tcl;inline=__inline;TCL_PIPE_DLL="tclpip85sg.dll";CFG_INSTALL_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_INSTALL_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_INSTALL_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_INSTALL_INCDIR="C:\\Program Files\\Tcl\\include";CFG_INSTALL_DOCDIR="C:\\Program Files\\Tcl\\doc";CFG_RUNTIME_LIBDIR="C:\\Program Files\\Tcl\\lib";CFG_RUNTIME_BINDIR="C:\\Program Files\\Tcl\\bin";CFG_RUNTIME_SCRDIR="C:\\Program Files\\Tcl\\lib\\tcl8.5";CFG_RUNTIME_INCDIR="C:\\Program Files\\Tcl\\include";CFG_RUNTIME_DOCDIR="C:\\Program Files\\Tcl\\doc";_stati64=_stat64;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 ProgramDatabase MachineX64 openMSX-RELEASE_0_14_0/build/3rdparty/tcl.vcxproj.filters000066400000000000000000000606141314057512400231550ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files openMSX-RELEASE_0_14_0/build/3rdparty/tcl8.5.18.diff000066400000000000000000000007401314057512400213770ustar00rootroot00000000000000diff -ru tcl8.5.18.orig/win/Makefile.in tcl8.5.18/win/Makefile.in --- tcl8.5.18.orig/win/Makefile.in 2015-03-06 16:13:58.000000000 +0100 +++ tcl8.5.18/win/Makefile.in 2015-10-04 22:14:02.109235175 +0200 @@ -606,7 +606,7 @@ $(COPY) $(REG_LIB_FILE) $(LIB_INSTALL_DIR)/reg$(REGDOTVER); \ fi -install-libraries: libraries install-tzdata install-msgs +install-libraries: libraries @for i in $(prefix)/lib $(INCLUDE_INSTALL_DIR) \ $(SCRIPT_INSTALL_DIR); \ do \ openMSX-RELEASE_0_14_0/build/3rdparty/unzip.py000066400000000000000000000011741314057512400210220ustar00rootroot00000000000000import sys import zipfile import os import os.path def UnzipFile(file, outputdir): if not os.path.exists(outputdir): os.mkdir(outputdir, 755) zip = zipfile.ZipFile(open(file, 'rb')) for name in zip.namelist(): output = os.path.join(outputdir, name) if name.endswith('/'): if not os.path.exists(output): os.mkdir(output) else: output = open(output, 'wb') output.write(zip.read(name)) output.close() if __name__ == '__main__': if len(sys.argv) == 3: UnzipFile(sys.argv[1], sys.argv[2]) else: print >> sys.stderr, \ 'Usage: python unzip.py zipfile outputdir' sys.exit(2) openMSX-RELEASE_0_14_0/build/3rdparty/zlib-1.2.8.diff000066400000000000000000000012111314057512400215310ustar00rootroot00000000000000diff -ru zlib-1.2.8.orig/configure zlib-1.2.8/configure --- zlib-1.2.8.orig/configure 2013-03-24 06:30:09.000000000 +0100 +++ zlib-1.2.8/configure 2013-05-18 18:22:58.000000000 +0200 @@ -192,9 +192,9 @@ EXE='.exe' ;; MINGW* | mingw*) # temporary bypass - rm -f $test.[co] $test $test$shared_ext - echo "Please use win32/Makefile.gcc instead." | tee -a configure.log - leave 1 +# rm -f $test.[co] $test $test$shared_ext +# echo "Please use win32/Makefile.gcc instead." | tee -a configure.log +# leave 1 LDSHARED=${LDSHARED-"$cc -shared"} LDSHAREDLIBC="" EXE='.exe' ;; openMSX-RELEASE_0_14_0/build/3rdparty/zlib.vcxproj000066400000000000000000001072121314057512400216600ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 LIB ASM Debug Win32 LIB ASM Debug x64 LIB ASM Release Win32 LIB ASM Release x64 Release Win32 Release x64 {05A68CD4-A282-4475-B9F7-ED3C9A0109B5} zlib StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 StaticLibrary false v141 <_ProjectFileVersion>10.0.30319.1 $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ $(ThirdPartyOutDir)\ $(ThirdPartyIntDir)\$(LibNameZlib)\ Disabled WIN32;_DEBUG;ASMV;ASMINF;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL .\Win32_LIB_ASM_Debug/zlib.pch .\Win32_LIB_ASM_Debug/ .\Win32_LIB_ASM_Debug/ .\Win32_LIB_ASM_Debug/ Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 Win32_LIB_ASM_Debug\zlibd.lib true true .\Win32_LIB_ASM_Debug/zlib.bsc Disabled WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX86 true .\Win32_LIB_Debug/zlib.bsc Full AnySuitable true Size true true true WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 /LTCG %(AdditionalOptions) true MachineX86 true .\Win32_LIB_Release/zlib.bsc MaxSpeed OnlyExplicitInline WIN32;NDEBUG;ASMV;ASMINF;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true .\Win32_LIB_ASM_Release/zlib.pch .\Win32_LIB_ASM_Release/ .\Win32_LIB_ASM_Release/ .\Win32_LIB_ASM_Release/ Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 .\Win32_LIB_ASM_Release\zlib.lib true true .\Win32_LIB_ASM_Release/zlib.bsc Disabled WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX86 true .\Win32_LIB_Debug/zlib.bsc X64 Disabled WIN32;_DEBUG;ASMV;ASMINF;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL .\Win32_LIB_ASM_Debug/zlib.pch .\Win32_LIB_ASM_Debug/ .\Win32_LIB_ASM_Debug/ .\Win32_LIB_ASM_Debug/ Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 Win32_LIB_ASM_Debug\zlibd.lib true true .\Win32_LIB_ASM_Debug/zlib.bsc X64 Disabled WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX64 true .\Win32_LIB_Debug/zlib.bsc X64 Full AnySuitable true Size true true true WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Sync MultiThreaded true true Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 /LTCG %(AdditionalOptions) true MachineX64 true .\Win32_LIB_Release/zlib.bsc X64 MaxSpeed OnlyExplicitInline WIN32;NDEBUG;ASMV;ASMINF;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true .\Win32_LIB_ASM_Release/zlib.pch .\Win32_LIB_ASM_Release/ .\Win32_LIB_ASM_Release/ .\Win32_LIB_ASM_Release/ Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 .\Win32_LIB_ASM_Release\zlib.lib true true .\Win32_LIB_ASM_Release/zlib.bsc X64 Disabled WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true true Default MultiThreadedDebug Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 true MachineX64 true .\Win32_LIB_Debug/zlib.bsc %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) true true true true %(PreprocessorDefinitions) \Scratch\Build\openmsx\external\zlib-1.2.3\win32;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \Scratch\Build\openmsx\external\zlib-1.2.3\win32;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \Scratch\Build\openmsx\external\zlib-1.2.3\win32;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \Scratch\Build\openmsx\external\zlib-1.2.3\win32;%(AdditionalIncludeDirectories) openMSX-RELEASE_0_14_0/build/3rdparty/zlib.vcxproj.filters000066400000000000000000000114601314057512400233260ustar00rootroot00000000000000 {269dfb7b-8e1f-4ee4-9e90-6694ad6d215d} cpp;c;cxx;rc;def;r;odl;idl;hpj;bat {087dbb60-2787-47d2-9ae0-07f401f8e7a4} h;hpp;hxx;hm;inl {63bf4111-ea8c-486d-9d72-a9edb977d301} ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe {2e1192dc-b6bb-4833-96e9-7588f23bb7dc} asm;obj;c;cpp;cxx;h;hpp;hxx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Assembler Files %28Unsupported%29 Assembler Files %28Unsupported%29 Resource Files Source Files openMSX-RELEASE_0_14_0/build/3rdparty_libraries.py000066400000000000000000000017301314057512400217070ustar00rootroot00000000000000# Prints which 3rd party libraries are desired for the given configuration. from components import requiredLibrariesFor from configurations import getConfiguration from libraries import allDependencies, librariesByName from packages import iterDownloadablePackages def main(platform, linkMode): configuration = getConfiguration(linkMode) components = configuration.iterDesiredComponents() # Compute the set of all directly and indirectly required libraries, # then filter out system libraries. thirdPartyLibs = set( makeName for makeName in allDependencies(requiredLibrariesFor(components)) if not librariesByName[makeName].isSystemLibrary(platform) ) print ' '.join(sorted(thirdPartyLibs)) if __name__ == '__main__': import sys if len(sys.argv) == 3: try: main(*sys.argv[1 : ]) except ValueError, ex: print >> sys.stderr, ex sys.exit(2) else: print >> sys.stderr, ( 'Usage: python 3rdparty_libraries.py TARGET_OS LINK_MODE' ) sys.exit(2) openMSX-RELEASE_0_14_0/build/3rdparty_packages2make.py000066400000000000000000000041301314057512400224260ustar00rootroot00000000000000from packages import getPackage, iterDownloadablePackages import sys def printPackagesMake(): patchesDir = 'build/3rdparty' sourceDir = 'derived/3rdparty/src' tarballsDir = 'derived/3rdparty/download' print 'SOURCE_DIR:=%s' % sourceDir print print '# Information about packages.' print '# Generated from the data in "build/packages.py".' print tarballs = [] for package in iterDownloadablePackages(): makeName = package.getMakeName() tarball = tarballsDir + '/' + package.getTarballName() tarballs.append(tarball) print '# %s' % package.niceName print 'PACKAGE_%s:=%s' % (makeName, package.getSourceDirName()) print 'TARBALL_%s:=%s' % (makeName, tarball) print '# Download:' print '%s:' % tarball print '\tmkdir -p %s' % tarballsDir print '\t$(PYTHON) build/download.py %s/%s %s' % ( package.downloadURL, package.getTarballName(), tarballsDir ) packageSourceDirName = package.getSourceDirName() packageSourceDir = sourceDir + '/' + packageSourceDirName patchFile = '%s/%s.diff' % (patchesDir, packageSourceDirName) print '# Verify:' verifyMarker = '%s.verified' % tarball print '%s: %s' % (verifyMarker, tarball) print '\t$(PYTHON) build/checksum.py %s %d %s' % ( tarball, package.fileLength, ' '.join('%s=%s' % item for item in package.checksums.iteritems()) ) print '\ttouch %s' % verifyMarker print '# Extract:' extractMarker = '%s/.extracted' % packageSourceDir print '%s: %s $(wildcard %s)' % (extractMarker, verifyMarker, patchFile) print '\trm -rf %s' % packageSourceDir print '\tmkdir -p %s' % sourceDir print '\t$(PYTHON) build/extract.py %s %s %s' % ( tarball, sourceDir, packageSourceDirName ) print '\ttest ! -e %s || $(PYTHON) build/patch.py %s %s' % ( patchFile, patchFile, sourceDir ) print '\ttouch %s' % extractMarker print print '# Convenience target to download all source packages.' print '.PHONY: download' print 'download: %s' % ' '.join(tarballs) if __name__ == '__main__': if len(sys.argv) == 1: printPackagesMake() else: print >> sys.stderr, \ 'Usage: python 3rdparty_packages2make.py' sys.exit(2) openMSX-RELEASE_0_14_0/build/android/000077500000000000000000000000001314057512400171505ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/build/android/openmsx/000077500000000000000000000000001314057512400206415ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/build/android/openmsx/.gitignore000066400000000000000000000002131314057512400226250ustar00rootroot00000000000000# TODO: make sure that these do not end up in this dir... AndroidAppSettings.cfg AndroidData/ environment.props icon.png libapplication.so openMSX-RELEASE_0_14_0/build/android/openmsx/AndroidAppSettings.cfg.template.noVersion000066400000000000000000000330141314057512400306600ustar00rootroot00000000000000# The application settings for Android libSDL port # Specify application name (e.x. My Application) AppName="openMSX" # Specify reversed site name of application (e.x. com.mysite.myapp) AppFullName=org.openmsx.android.openmsx # Application version code (integer) AppVersionCode=VERSION_CODE_PLACEHOLDER # Application user-visible version name (string) AppVersionName="VERSION_NAME_PLACEHOLDER" # Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...' # If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu # If the URL in in the form ':dir/file.dat:http://URL/' it will be downloaded as binary BLOB to the application dir and not unzipped # If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir - # these files are put inside .apk package by build system # Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS AppDataDownloadUrl="Application data|appdata.zip" # Reset SDL config when updating application to the new version (y) / (n) ResetSdlConfigForThisVersion=y # Delete application data files when upgrading (specify file/dir paths separated by spaces) DeleteFilesOnUpgrade="libsdl-DownloadFinished-0.flag openmsx_system" # Here you may type readme text, which will be shown during startup. Format is: # Text in English, use \\\\\\\\n to separate lines (that's four backslashes)^de:Text in Deutsch^ru:Text in Russian^button:Button that will open some URL:http://url-to-open/ ReadmeText='^Readme text' # libSDL version to use (1.2/1.3/2.0) LibSdlVersion=1.2 # Specify screen orientation: (v)ertical/(p)ortrait or (h)orizontal/(l)andscape ScreenOrientation=h # Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer InhibitSuspend=y # Video color depth - 16 BPP is the fastest and supported for all modes, 24 bpp is supported only # with SwVideoMode=y, SDL_OPENGL mode supports everything. (16)/(24)/(32) VideoDepthBpp=16 # Enable OpenGL depth buffer (needed only for 3-d applications, small speed decrease) (y) or (n) NeedDepthBuffer=n # Enable OpenGL stencil buffer (needed only for 3-d applications, small speed decrease) (y) or (n) NeedStencilBuffer=n # Try to use GLES 2.x context - will revert to GLES 1.X if unsupported by device # you need this option only if you're developing 3-d app (y) or (n) NeedGles2=n # Application uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL, # this will allow small speed optimization. Enable this even when you're using SDL_HWSURFACE. (y) or (n) SwVideoMode=y # Application video output will be resized to fit into native device screen (y)/(n) SdlVideoResize=y # Application resizing will keep 4:3 aspect ratio, with black bars at sides (y)/(n) SdlVideoResizeKeepAspect=y # Application does not call SDL_Flip() or SDL_UpdateRects() appropriately, or draws from non-main thread - # enabling the compatibility mode will force screen update every 100 milliseconds, which is laggy and inefficient (y) or (n) CompatibilityHacks=n # Application initializes SDL audio/video inside static constructors (which is bad, you won't be able to run ndk-gdb) (y)/(n) CompatibilityHacksStaticInit=n # On-screen Android soft text input emulates hardware keyboard, this will only work with Hackers Keyboard app (y)/(n) CompatibilityHacksTextInputEmulatesHwKeyboard=y # Hack for broken devices: prevent audio chopping, by sleeping a bit after pushing each audio chunk (y)/(n) CompatibilityHacksPreventAudioChopping=n # Hack for broken apps: application ignores audio buffer size returned by SDL (y)/(n) CompatibilityHacksAppIgnoresAudioBufferSize=n # Hack for VCMI: preload additional shared libraries before aplication start CompatibilityHacksAdditionalPreloadedSharedLibraries="" # Hack for Free Heroes 2, which redraws the screen inside SDL_PumpEvents(): slow and compatible SDL event queue - # do not use it with accelerometer/gyroscope, or your app may freeze at random (y)/(n) CompatibilityHacksSlowCompatibleEventQueue=n # Save and restore OpenGL state when drawing on-screen keyboard for apps that use SDL_OPENGL CompatibilityHacksTouchscreenKeyboardSaveRestoreOpenGLState= # Application uses SDL_UpdateRects() properly, and does not draw in any region outside those rects. # This improves drawing speed, but I know only one application that does that, and it's written by me (y)/(n) CompatibilityHacksProperUsageOfSDL_UpdateRects= # Application uses mouse (y) or (n), this will show mouse emulation dialog to the user AppUsesMouse=y # Application needs two-button mouse, will also enable advanced point-and-click features (y) or (n) AppNeedsTwoButtonMouse=n # Show SDL mouse cursor, for applications that do not draw cursor at all (y) or (n) ShowMouseCursor=n # Generate more touch events, by default SDL generates one event per one video frame, this is useful for drawing apps (y) or (n) GenerateSubframeTouchEvents= # Force relative (laptop) mouse movement mode, useful when both on-screen keyboard and mouse are needed (y) or (n) ForceRelativeMouseMode=n # Application needs arrow keys (y) or (n), will show on-screen dpad/joystick (y) or (n) AppNeedsArrowKeys=y # Application needs text input (y) or (n), enables button for text input on screen AppNeedsTextInput=y # Application uses joystick (y) or (n), the on-screen DPAD will be used as joystick 0 axes 0-1 AppUsesJoystick=y # Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n) AppUsesSecondJoystick=n # Application uses accelerometer (y) or (n), the accelerometer will be used as joystick 1 axes 0-1 and 5-7 AppUsesAccelerometer=n # Application uses gyroscope (y) or (n), the gyroscope will be used as joystick 1 axes 2-4 AppUsesGyroscope=n # Application uses multitouch (y) or (n), multitouch events are passed as SDL_JOYBALLMOTION events for the joystick 0 AppUsesMultitouch=n # Application records audio (it will use any available source, such a s microphone) # API is defined in file SDL_android.h: int SDL_ANDROID_OpenAudioRecording(SDL_AudioSpec *spec); void SDL_ANDROID_CloseAudioRecording(void); # This option will add additional permission to Android manifest (y)/(n) AppRecordsAudio=n # Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n) AccessSdCard= # Immersive mode - Android will hide on-screen Home/Back keys. Looks bad if you invoke Android keyboard. (y) / (n) ImmersiveMode=n # Application implements Android-specific routines to put to background, and will not draw anything to screen # between SDL_ACTIVEEVENT lost / gained notifications - you should check for them # rigth after SDL_Flip(), if (n) then SDL_Flip() will block till app in background (y) or (n) # This option is reported to be buggy, sometimes failing to restore video state NonBlockingSwapBuffers=y # Redefine common hardware keys to SDL keysyms # BACK hardware key is available on all devices, MENU is available on pre-ICS devices, other keys may be absent # SEARCH and CALL by default return same keycode as DPAD_CENTER - one of those keys is available on most devices # Use word NO_REMAP if you want to preserve native functionality for certain key (volume keys are 3-rd and 4-th) # Keys: TOUCHSCREEN (works only when AppUsesMouse=n), DPAD_CENTER/SEARCH, VOLUMEUP, VOLUMEDOWN, MENU, BACK, CAMERA RedefinedKeys="SPACE RETURN NO_REMAP NO_REMAP MENU WORLD_92 NO_REMAP" # Number of virtual keyboard keys (currently 6 is maximum) AppTouchscreenKeyboardKeysAmount=4 # Number of virtual keyboard keys that support autofire (currently 2 is maximum) AppTouchscreenKeyboardKeysAmountAutoFire=0 # Redefine on-screen keyboard keys to SDL keysyms - 6 keyboard keys + 4 multitouch gestures (zoom in/out and rotate left/right) RedefinedKeysScreenKb="WORLD_93 WORLD_94 WORLD_95 F10 F1 F2 F3 F4 F5 0" # Names for on-screen keyboard keys, such as Fire, Jump, Run etc, separated by spaces, they are used in SDL config menu RedefinedKeysScreenKbNames="Joystick-button-1 Joystick-button-2 Console F10 F1 F2 F3 F4 F5 0" # On-screen keys theme # 0 = Ultimate Droid by Sean Stieber (green, with gamepad joystick) # 1 = Simple Theme by Beholder (white, with gamepad joystick) # 2 = Sun by Sirea (yellow, with round joystick) # 3 = Keen by Gerstrong (multicolor, with round joystick) TouchscreenKeysTheme=2 # Redefine gamepad keys to SDL keysyms, button order is: # A B X Y L1 R1 L2 R2 LThumb RThumb RedefinedKeysGamepad="WORLD_93 WORLD_94 WORLD_95 MENU F1 F2 F3 F4 F5 F10" # How long to show startup menu button, in msec, 0 to disable startup menu StartupMenuButtonTimeout=3000 # Menu items to hide from startup menu, available menu items: # SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout HiddenMenuOptions='SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout' # Menu items to show at startup - this is Java code snippet, leave empty for default # new SettingsMenuMisc.ShowReadme(), (AppUsesMouse \&\& \! ForceRelativeMouseMode \? new SettingsMenuMouse.DisplaySizeConfig(true) : new SettingsMenu.DummyMenu()), new SettingsMenuMisc.OptionalDownloadConfig(true), new SettingsMenuMisc.GyroscopeCalibration() # Available menu items: # SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout FirstStartMenuOptions='SettingsMenu.DummyMenu SettingsMenuMisc.OptionalDownloadConfig' # Enable multi-ABI binary, with hardware FPU support - it will also work on old devices, # but .apk size is 2x bigger (y) / (n) / (x86) / (all) MultiABI=n # Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower AppMinimumRAM=50 # Optional shared libraries to compile - removing some of them will save space # MP3 support by libMAD is encumbered by patents and libMAD is GPL-ed # Available libraries: mad (GPL-ed!) sdl_mixer sdl_image sdl_ttf sdl_net sdl_blitpool sdl_gfx sdl_sound intl xml2 lua jpeg png ogg flac tremor vorbis freetype xerces curl theora fluidsynth lzma lzo2 mikmod openal timidity zzip bzip2 yaml-cpp python boost_date_time boost_filesystem boost_iostreams boost_program_options boost_regex boost_signals boost_system boost_thread glu avcodec avdevice avfilter avformat avresample avutil swscale swresample bzip2 CompiledLibraries="freetype sdl_ttf png ogg vorbis theora tcl8.5" # Application uses custom build script AndroidBuild.sh instead of Android.mk (y) or (n) CustomBuildScript=y # Aditional CFLAGS for application AppCflags='-frtti -fexceptions' # Additional LDFLAGS for application AppLdflags='' # If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable AppOverlapsSystemHeaders= # Build only following subdirs (empty will build all dirs, ignored with custom script) AppSubdirsBuild='' # Exclude these files from build AppBuildExclude='' # Application command line parameters, including app name as 0-th param AppCmdline='' # Screen size is used by Google Play to prevent an app to be installed on devices with smaller screens # Minimum screen size that application supports: (s)mall / (m)edium / (l)arge MinimumScreenSize=s # Your AdMob Publisher ID, (n) if you don't want advertisements AdmobPublisherId=n # Your AdMob test device ID, to receive a test ad AdmobTestDeviceId= # Your AdMob banner size (BANNER/IAB_BANNER/IAB_LEADERBOARD/IAB_MRECT/IAB_WIDE_SKYSCRAPER/SMART_BANNER) AdmobBannerSize= openMSX-RELEASE_0_14_0/build/android/openmsx/AndroidBuild.sh000077500000000000000000000115101314057512400235360ustar00rootroot00000000000000#!/bin/bash #set -xv # TODO: find out if flavour can be passed from SDL build environment #openmsx_flavour="android-debug" openmsx_flavour="android" echo "AB:INFO Starting AndroidBuild.sh, #params: $#, params: $*" echo "AB:INFO pwd: $(pwd)" # Read environment.props (if it exists) to get following two params: # sdl_android_port_path # my_home_dir if [ ! -f environment.props ]; then echo "AB:ERROR: No file environment.props in $(pwd)" exit 1 fi . ./environment.props # Remember location of the current directory, which is the directory # with all android specific code for the app my_app_android_dir="$(pwd)" # Use latest version of the setEnvironment script; it is the one that uses GCC 4.6 set_sdl_app_environment="${sdl_android_port_path}/project/jni/application/setEnvironment.sh" # Parsing the CPU architecture information CPU_ARCH="$1" if [ "${CPU_ARCH}" = "armeabi" ]; then so_file=libapplication.so openmsx_target_cpu=arm else echo "AB:ERROR Unsupported architecture: $1" exit 1 fi #echo "AB:INFO current shell: ${SHELL}" #echo "AB:INFO BEGIN all environment params:" #set #echo "AB:INFO END all environment params:" #cd ${my_home_dir} # Unset make related environment parameters that get set by the # SDL for Android build system and that conflict with openMSX # build system unset BUILD_NUM_CPUS unset MAKEFLAGS unset MAKELEVEL unset MAKEOVERRIDES unset MFLAGS unset V cpu_count=1 if [ -f /proc/cpuinfo ]; then cpu_count=$(grep "processor[[:space:]]*:" /proc/cpuinfo | wc -l) if [ ${cpu_count} -eq 0 ]; then cpu_count=1 fi fi echo "AB:INFO Detected ${cpu_count} CPUs for parallel build" echo "AB:INFO Making this app for CPU architecture ${CPU_ARCH}" export SDL_ANDROID_PORT_PATH="${sdl_android_port_path}" export CXXFLAGS='-frtti -fexceptions -marm' export LDFLAGS='-lpng' unset BUILD_EXECUTABLE if [ $openmsx_flavour = "android" ]; then CXX_FLAGS_FILTER="sed -e 's/\\-mthumb//'" elif [ $openmsx_flavour = "android-debug" ]; then CXX_FLAGS_FILTER="sed -e 's/\\-mthumb//' -e 's/\\-DNDEBUG//g'" else echo "AB:ERROR Unknown openmsx_flavour: $openmsx_flavour" fi echo "AB:DEBUG CXX_FLAGS_FILTER: $CXX_FLAGS_FILTER" #"${set_sdl_app_environment}" /bin/bash -c "set" "${set_sdl_app_environment}" /bin/bash -c "\ echo \"AB:INFO entering openMSX home directory: ${my_home_dir}\"; \ cd ${my_home_dir};\ echo \"AB:INFO CXX: \${CXX}\";\ echo \"AB:INFO CXXFLAGS: \${CXXFLAGS}\";\ export _CC=\${CC};\ export _LD=\${LD};\ export ANDROID_LDFLAGS=\${LDFLAGS};\ export ANDROID_CXXFLAGS=\$(echo \${CXXFLAGS} | $CXX_FLAGS_FILTER);\ echo \"AB:INFO ANDROID_CXXFLAGS: \${ANDROID_CXXFLAGS}\";\ unset CXXFLAGS;\ make -k -j ${cpu_count} all\ OPENMSX_TARGET_CPU=${openmsx_target_cpu}\ OPENMSX_TARGET_OS=android\ OPENMSX_FLAVOUR=${openmsx_flavour}\ " if [ $? -ne 0 ]; then echo "AB:ERROR Make failed" exit 1 fi # Return to the directory containing this script and all data about this application # that the SDL APK build system requires cd "${my_app_android_dir}" # Copy the shared library overhere echo "AB:INFO Copying output file into android directory $(pwd)" cp "${my_home_dir}/derived/${openmsx_target_cpu}-android-${openmsx_flavour}/lib/openmsx.so" "${so_file}" if [ $? -ne 0 ]; then echo "AB:ERROR Copy failed" fi echo "AB:INFO Done with build of app" echo "AB:INFO Copying icon file" openmsx_icon_file="${my_home_dir}/share/icons/openMSX-logo-256.png" cp -p "${openmsx_icon_file}" icon.png echo "AB:INFO Validating if appdata.zip must be rebuild" if [ ! -f AndroidData/appdata.zip ]; then newfiles=1 else newfiles=$(find ${my_home_dir}/share ${my_home_dir}/Contrib/cbios ${my_app_android_dir}/AndroidBuild.sh -newer AndroidData/appdata.zip | wc -l) fi if [ ${newfiles} -gt 0 ]; then echo "AB:INFO Rebuilding appdata.zip" rm -f AndroidData/appdata.zip rm -rf AndroidData/appdata mkdir -p AndroidData/appdata/openmsx_system cd "${my_home_dir}"/share tar -c --exclude-vcs -f - . | ( cd "${my_app_android_dir}"/AndroidData/appdata/openmsx_system ; tar xf - ) cd "${my_home_dir}"/Contrib/cbios tar -c --exclude-vcs -f - . | ( cd "${my_app_android_dir}"/AndroidData/appdata/openmsx_system/machines ; tar xf - ) cd "${my_app_android_dir}"/AndroidData/appdata zip -r ../appdata.zip * > /dev/null cd .. rm -rf appdata echo "AB:INFO Done rebuilding appdata.zip" else echo "AB/INFO appdata.zip is still fine" fi MANIFEST="${sdl_android_port_path}/project/AndroidManifest.xml" # Patch manifest file to target android 2.3 and older so that the # virtual menu button will be rendered by newer Android versions sed -i "s^android:targetSdkVersion=\"[0-9]*\"^android:targetSdkVersion=\"10\"^" ${MANIFEST} # Remove network permissions from manifest. OpenMSX does not need it sed -i "s/<\/uses-permission>/<\!-- -->/" ${MANIFEST} exit 0 openMSX-RELEASE_0_14_0/build/android/openmsx/generate_AndroidAppSettings.sh000077500000000000000000000062741314057512400266250ustar00rootroot00000000000000#!/bin/bash echo "LAB:INFO Generating AndroidAppSettings.cfg from template file" # Read environment.props (if it exists) to get following two params: # sdl_android_port_path # my_home_dir if [ ! -f environment.props ]; then echo "LAB:ERROR: No file environment.props in $(pwd)" exit 1 fi . ./environment.props # Determine current revision and version name PYTHONPATH="${my_home_dir}/build" export PYTHONPATH cd "${my_home_dir}" # The (Android) version code must be an increasing number so that Android application # manager can recognize that it is a new version of the same application and take # appropriate action like retaining or migrating the user settings # The easiest way to get an increasing number for new builds in git is by # counting the number of commit messages. #VERSION_CODE=$(git log --oneline | wc -l) VERSION_CODE=$(python -c "import version; print version.getAndroidVersionCode()") # The (Android) version name can be any arbitrary string that is hopefully # meaningfull to the user. Best is to use the version package name # to be aligned with the version name used for builds for other platforms. VERSION_NAME=$(python -c "import version; print version.getVersionedPackageName()") # Return to the directory containing this script and the AndroidAppSettings files cd "${my_home_dir}/build/android/openmsx" # Determine version number of AndroidAppSettings supported # by current version of anddev Android build script CHANGE_APP_SETTINS_SCRIPT="${sdl_android_port_path}/changeAppSettings.sh" if [ ! -f "${CHANGE_APP_SETTINS_SCRIPT}" ]; then echo "LAB:ERROR: No such file ${CHANGE_APP_SETTINS_SCRIPT}." echo " Please follow instructions in compilation guide for android" echo " port to correctly set-up the android build environment." exit 1 fi CHANGE_APP_SETTINGS_VERSION=$(grep 'CHANGE_APP_SETTINGS_VERSION=[0-9][0-9]*' "${CHANGE_APP_SETTINS_SCRIPT}") CHANGE_APP_SETTINGS_VERSION=${CHANGE_APP_SETTINGS_VERSION#*=} if [ -z "${CHANGE_APP_SETTINGS_VERSION}" ]; then # Latest version of changeAppSettings.sh no longer contains an explicit version # number for the app-settings # However, it does have a mechanism to automagically upgrade to newer app-settings # with (hopefully sane) default values # As such, use a non-versioned template when the changeAppSettings.sh does not # contain an explicit settings version CHANGE_APP_SETTINGS_VERSION=noVersion fi APP_SETTINGS_CFG="AndroidAppSettings.cfg" APP_SETTINGS_TEMPLATE="${APP_SETTINGS_CFG}.template.${CHANGE_APP_SETTINGS_VERSION}" if [ ! -f ${APP_SETTINGS_TEMPLATE} ]; then echo "LAB:ERROR: No such file ${APP_SETTINGS_TEMPLATE}." echo " Please create one manually. It can be based on one" echo " of the existing app settings template file" exit 1 fi cp ${APP_SETTINGS_TEMPLATE} ${APP_SETTINGS_CFG} . ${APP_SETTINGS_CFG} if [ "$AppVersionCode" != "${VERSION_CODE}" ]; then sed -i "s/^AppVersionCode=.*$/AppVersionCode=${VERSION_CODE}/" ${APP_SETTINGS_CFG} fi if [ "$AppVersionName" != "${VERSION_NAME}" ]; then sed -i "s/^AppVersionName=.*$/AppVersionName=${VERSION_NAME}/" ${APP_SETTINGS_CFG} fi echo "LAB:INFO AndroidAppSettings.cfg generated for version ${VERSION_CODE} with version name ${VERSION_NAME}" openMSX-RELEASE_0_14_0/build/android/openmsx/launch_anddev_build.sh000077500000000000000000000010251314057512400251500ustar00rootroot00000000000000#!/bin/bash echo "LAB:INFO Starting launch_anddev_build.sh" # Read environment.props (if it exists) to get following two params: # sdl_android_port_path # my_home_dir if [ ! -f environment.props ]; then echo "LAB:ERROR: No file environment.props in $(pwd)" exit 1 fi . ./environment.props export GCCVER=4.8 export NDK_TOOLCHAIN_VERSION=${GCCVER} ./generate_AndroidAppSettings.sh if [ $? -ne 0 ]; then exit 1 fi echo "LAB:INFO launching commandergenius build file" cd "${sdl_android_port_path}" ./build.sh $* exit $? openMSX-RELEASE_0_14_0/build/android/openmsx/sign_official_build_with_xelasoft_key.sh000077500000000000000000000012711314057512400307640ustar00rootroot00000000000000#!/bin/bash echo "LAB:INFO Signing APK with xelasoft certificate, for publication in keystore" # Read environment.props (if it exists) to get following two params: # sdl_android_port_path # my_home_dir if [ ! -f environment.props ]; then echo "LAB:ERROR: No file environment.props in $(pwd)" exit 1 fi . ./environment.props export ANDROID_KEYSTORE_FILE=~awulms/Ontwikkel/android/release_certificate/xelasoft_eu.keystore export ANDROID_KEYSTORE_ALIAS=xelasoft if [ ! -f ${ANDROID_KEYSTORE_FILE} ]; then echo "LAB:ERROR Keystore not found ${ANDROID_KEYSTORE_FILE}" exit 1 fi echo "LAB:INFO launching commandergenius sign.sh script" cd "${sdl_android_port_path}" ./sign.sh exit $? openMSX-RELEASE_0_14_0/build/android/setup_anddev.sh000077500000000000000000000130311314057512400221660ustar00rootroot00000000000000#!/bin/bash function explain_usage() { echo "This script configures the \"commandergenius\" SDL Android port" echo "for the build of openMSX." echo "" echo "The script depends on the Android SDK and NDK and on the" echo "\"commandergenius\" SDL Android port." echo "" echo "First download and install the Android SDK and NDK" echo "as per the instructions on the Android website." echo "" echo "Please make sure to add the Android SDK and NDK tools locations" echo "to your PATH variable, as per the instructions on the Android" echo "website. Otherwise the setup will fail." echo "" echo "Subsequently download the \"commandergenius\" SDL Android port" echo "into your favorite location." echo "" echo "Example:" echo "> cd /opt" echo "> git clone https://github.com/pelya/commandergenius.git" echo "" echo "Once that is done, you can launch this script." echo "You must specify the path to the \"commandergenius\" SDL Android port" echo "on the command line or in environment parameter SDL_ANDROID_PORT_PATH." echo "" echo "Example 1:" echo "> export SDL_ANDROID_PORT_PATH=/opt/commandergenius" echo "> ./setup_anddev.sh" echo "" echo "Example 2:" echo "> ./setup_anddev.sh /opt/commandergenius" echo "" } if [ $# -eq 0 -a -z "$SDL_ANDROID_PORT_PATH" ]; then explain_usage exit 1 fi if [ $# -eq 1 ]; then sdl_android_port_path="$1" else sdl_android_port_path="$SDL_ANDROID_PORT_PATH" fi if [ ! -d "${sdl_android_port_path}" ]; then echo "Can not find directory ${sdl_android_port_path}" exit 1 fi sdl_port_app_dir="${sdl_android_port_path}/project/jni/application" if [ ! -d "${sdl_port_app_dir}" ]; then echo "Can not find expected sub-directory project/jni/application" echo "in specified directory ${sdl_android_port_path}" exit 1 fi this_script_dir=$(dirname $0) this_script_dir=$(cd ${this_script_dir}; pwd) my_home_dir=${this_script_dir%/*} my_home_dir=${my_home_dir%/*} my_android_dir="${my_home_dir}/build/android/openmsx" my_relative_dir="${my_android_dir##*/}" tcl_build=8.5.11 tcl_version=${tcl_build%.*} tcl_archive="${my_home_dir}/derived/3rdparty/download/tcl${tcl_build}-src.tar.gz" tcl_sdl_dir="${sdl_android_port_path}/project/jni/tcl${tcl_version}" if [ -d "${tcl_sdl_dir}" ]; then if [ ! -f "${tcl_sdl_dir}/${tcl_build}.txt" ]; then echo "ERROR: expecting TCL build ${tcl_build} in ${tcl_sdl_dir}" exit 1 fi fi export GCCVER=4.8 export NDK_TOOLCHAIN_VERSION=${GCCVER} if [ ! -d "${tcl_sdl_dir}" ]; then if [ ! -f "${tcl_archive}" ]; then cd "${my_home_dir}" echo "Downloading TCL" python build/android_download.py if [ $? -ne 0 ]; then echo "ERROR: Failed to download TCL" exit 1 fi if [ ! -f "${tcl_archive}" ]; then echo "ERROR: Failed to download TCL ${tcl_build}" exit 1 fi fi cd "${sdl_android_port_path}/project/jni" tar xzf "${tcl_archive}" tcl_relative_dir=tcl${tcl_version} mv tcl${tcl_build} ${tcl_relative_dir} touch ${tcl_relative_dir}/${tcl_build}.txt cp -p "${my_home_dir}/build/android/tcl${tcl_build}_Android.mk" ${tcl_relative_dir}/Android.mk cd ${tcl_relative_dir} mkdir -p lib/armeabi mkdir -p lib/armeabi-v7a mkdir -p include cp -p generic/*.h include cd unix if [ ! -f Makefile.in.original ]; then cp -p Makefile.in Makefile.in.original patch -i "${my_home_dir}/build/android/tcl${tcl_build}_unix_Makefile.in.patch" fi export BUILD_EXECUTABLE=yes ../../setCrossEnvironment.sh ./configure --host=arm-eabi make clean ../../setCrossEnvironment.sh make mv libtcl8.5.so ../lib/armeabi ../../setCrossEnvironment.sh ./configure --host=arm-eabi-v7a make clean ../../setCrossEnvironment.sh make mv libtcl8.5.so ../lib/armeabi-v7a fi echo "Setting-up softlink to this application in the SDL android port." if [ -h "${sdl_port_app_dir}/${my_relative_dir}" ]; then rm "${sdl_port_app_dir}/${my_relative_dir}" fi if [ -d "${sdl_port_app_dir}/${my_relative_dir}" ]; then echo "ERROR: found directory ${my_relative_dir} in ${sdl_port_app_dir}" echo "This seems to be another app with the same name." echo "Please resolve the conflict and then re-run this script." exit 1 fi ln -s "${my_android_dir}" "${sdl_port_app_dir}/${my_relative_dir}" rm -f "${sdl_port_app_dir}/src" ln -s "${my_relative_dir}" "${sdl_port_app_dir}/src" echo "Making environment.props file for the build script" cat > "${my_android_dir}/environment.props" << @EOT # Do not edit this file. It is generated by setup_anddev.sh sdl_android_port_path="${sdl_android_port_path}" my_home_dir="${my_home_dir}" @EOT cd "${my_android_dir}" ./generate_AndroidAppSettings.sh if [ $? -ne 0 ]; then exit 1 fi echo "Configuring SDL android port to build this application" cd "${sdl_android_port_path}" ./changeAppSettings.sh -a if [ $? -ne 0 ]; then echo "ERROR: an unexpected problem occurred while running changeAppSettings.sh -a" echo " in ${sdl_android_port_path}" exit 1 fi android update project -p project -t android-19 if [ $? -ne 0 ]; then echo "ERROR: an unexpected problem occurred while running \"android update ...\"" exit 1 fi echo "" echo "You can now build the application from the openMSX android build directory" echo "" echo "Example" echo "> cd ${my_android_dir}" echo "> ./launch_anddev_build.sh" echo "" echo "Note: the first time that you run the launch_anddev_build.sh script, you may get some error" echo " message. It is due to a subtle bug in the SDL android port." echo " Simply re-run the build.sh script a second time and it will work fine." openMSX-RELEASE_0_14_0/build/android/tcl8.5.11_Android.mk000066400000000000000000000012641314057512400224010ustar00rootroot00000000000000LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := tcl8.5 LOCAL_C_INCLUDES := $(LOCAL_PATH)/include #ifneq ($(NDK_R5_TOOLCHAIN),) LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/lib$(LOCAL_MODULE).so include $(PREBUILT_SHARED_LIBRARY) #else #LOCAL_SRC_FILES := dummy.c #include $(BUILD_SHARED_LIBRARY) #$(abspath $(LOCAL_PATH)/../../obj/local/armeabi/lib$(LOCAL_MODULE).so): $(LOCAL_PATH)/lib/armeabi/lib$(LOCAL_MODULE).so OVERRIDE_CUSTOM_LIB # cp -f $< $@ #$(abspath $(LOCAL_PATH)/../../obj/local/armeabi-v7a/lib$(LOCAL_MODULE).so): $(LOCAL_PATH)/lib/armeabi-v7a/lib$(LOCAL_MODULE).so OVERRIDE_CUSTOM_LIB # cp -f $< $@ #.PHONY: OVERRIDE_CUSTOM_LIB #OVERRIDE_CUSTOM_LIB: #endif openMSX-RELEASE_0_14_0/build/android/tcl8.5.11_unix_Makefile.in.patch000066400000000000000000000026331314057512400246770ustar00rootroot00000000000000*** Makefile.in 2011-11-04 13:47:57.000000000 +0100 --- Makefile.in.android 2012-11-03 15:40:36.000000000 +0100 *************** *** 211,217 **** COMPAT_OBJS = @LIBOBJS@ ! AC_FLAGS = @DEFS@ AR = @AR@ RANLIB = @RANLIB@ DTRACE = @DTRACE@ --- 211,217 ---- COMPAT_OBJS = @LIBOBJS@ ! AC_FLAGS = -DPACKAGE_NAME=\"tcl\" -DPACKAGE_TARNAME=\"tcl\" -DPACKAGE_VERSION=\"8.5\" -DPACKAGE_STRING=\"tcl\ 8.5\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DNO_VALUES_H=1 -DHAVE_LIMITS_H=1 -DHAVE_SYS_PARAM_H=1 -DTCL_CFGVAL_ENCODING=\"iso8859-1\" -DSTATIC_BUILD=1 -DMODULE_SCOPE=extern\ __attribute__\(\(__visibility__\(\"hidden\"\)\)\) -DTCL_SHLIB_EXT=\".so\" -DTCL_CFG_OPTIMIZED=1 -DTCL_CFG_DEBUG=1 -DTCL_TOMMATH=1 -DMP_PREC=4 -DTCL_WIDE_INT_TYPE=long\ long -DHAVE_OPENDIR=1 -DHAVE_STRTOL=1 -DHAVE_WAITPID=1 -DNO_GETWD=1 -DHAVE_GETADDRINFO=1 -DNO_FD_SET=1 -DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_GMTIME_R=1 -DHAVE_LOCALTIME_R=1 -DHAVE_MKTIME=1 -DHAVE_TM_GMTOFF=1 -DHAVE_STRUCT_STAT_ST_BLOCKS=1 -DHAVE_STRUCT_STAT_ST_BLKSIZE=1 -DHAVE_BLKCNT_T=1 -DHAVE_INTPTR_T=1 -DHAVE_UINTPTR_T=1 -DNO_UNION_WAIT=1 -DHAVE_SIGNED_CHAR=1 -DHAVE_SYS_IOCTL_H=1 -DTCL_UNLOAD_DLLS=1 -DTCL_CROSS_COMPILE=1 AR = @AR@ RANLIB = @RANLIB@ DTRACE = @DTRACE@ openMSX-RELEASE_0_14_0/build/android_download.py000066400000000000000000000006401314057512400214110ustar00rootroot00000000000000from thirdparty_download import fetchPackageSource import sys def main(tarballsDir, sourcesDir, patchesDir): fetchPackageSource('TCL_ANDROID', tarballsDir, sourcesDir, patchesDir) if __name__ == '__main__': if len(sys.argv) == 1: main( 'derived/3rdparty/download', 'derived/3rdparty/src', 'build/3rdparty' ) else: print >> sys.stderr, ( 'Usage: python android_download.py' ) sys.exit(2) openMSX-RELEASE_0_14_0/build/buildinfo2code.py000066400000000000000000000065341314057512400210020ustar00rootroot00000000000000from cpu import getCPU, X86, X86_64 from makeutils import extractMakeVariables, parseBool from outpututils import rewriteIfChanged import sys def iterBuildInfoHeader(targetPlatform, cpuName, flavour, installShareDir): platformVars = extractMakeVariables( 'build/platform-%s.mk' % targetPlatform, dict.fromkeys( ('COMPILE_FLAGS', 'LINK_FLAGS', 'TARGET_FLAGS', 'ANDROID_LDFLAGS', 'ANDROID_CXXFLAGS', 'OPENMSX_TARGET_CPU'), '' ) ) setWindowIcon = parseBool(platformVars.get('SET_WINDOW_ICON', 'true')) targetCPU = getCPU(cpuName) # TODO: Add support for device-specific configuration. platformDingux = targetPlatform == 'dingux' platformPandora = targetPlatform == 'pandora' platformAndroid = targetPlatform == 'android' # Defaults. have16BPP = True have32BPP = True minScaleFactor = 1 maxScaleFactor = 4 # Platform overrides. if platformDingux: maxScaleFactor = 1 elif platformAndroid: # At the moment, libsdl android crashes when trying to dynamically change the scale factor # TODO: debug why it crashes and then change the maxScaleFactor parameter here # so that people with a powerfull enough android device can use a higher scale factor have32BPP = False maxScaleFactor = 1 elif platformPandora: have32BPP = False maxScaleFactor = 3 yield '// Automatically generated by build process.' yield '' yield '#ifndef BUILD_INFO_HH' yield '#define BUILD_INFO_HH' yield '' # Use a macro i.s.o. a boolean to prevent compilation errors on inline asm. # Assembly doesn't appear to work with MINGW64... TODO: find out why yield '#ifdef __MINGW64__' yield '#define ASM_X86 0' yield '#define ASM_X86 0' yield '#define ASM_X86_32 0' yield '#define ASM_X86_64 0' yield '#else' # A compiler will typically only understand the instruction set that it # generates code for. yield '#define ASM_X86 %d' % (targetCPU is X86 or targetCPU is X86_64) yield '#define ASM_X86_32 %d' % (targetCPU is X86) yield '#define ASM_X86_64 %d' % (targetCPU is X86_64) yield '#endif' # Use a macro iso integer because we really need to exclude code sections # based on this. yield '#define PLATFORM_DINGUX %d' % platformDingux yield '#define PLATFORM_ANDROID %d' % platformAndroid yield '#define HAVE_16BPP %d' % have16BPP yield '#define HAVE_32BPP %d' % have32BPP yield '#define MIN_SCALE_FACTOR %d' % minScaleFactor yield '#define MAX_SCALE_FACTOR %d' % maxScaleFactor yield '' yield 'namespace openmsx {' yield '' # Note: Don't call it "BIG_ENDIAN", because some system header may #define # that. yield 'static const bool OPENMSX_BIGENDIAN = %s;' \ % str(targetCPU.bigEndian).lower() yield 'static const bool OPENMSX_UNALIGNED_MEMORY_ACCESS = %s;' \ % str(targetCPU.unalignedMemoryAccess).lower() yield 'static const bool OPENMSX_SET_WINDOW_ICON = %s;' \ % str(setWindowIcon).lower() yield 'static const char* const DATADIR = "%s";' % installShareDir yield 'static const char* const BUILD_FLAVOUR = "%s";' % flavour yield 'static const char* const TARGET_PLATFORM = "%s";' % targetPlatform yield '' yield '} // namespace openmsx' yield '' yield '#endif // BUILD_INFO_HH' if __name__ == '__main__': if len(sys.argv) == 6: rewriteIfChanged(sys.argv[1], iterBuildInfoHeader(*sys.argv[2 : ])) else: print >> sys.stderr, \ 'Usage: python buildinfo2code.py CONFIG_HEADER ' \ 'platform cpu flavour share-install-dir' sys.exit(2) openMSX-RELEASE_0_14_0/build/checksum.py000066400000000000000000000033731314057512400177120ustar00rootroot00000000000000from hashlib import new as newhash from os import stat from os.path import isfile import sys def verifyFile(filePath, fileLength, checksums): actualLength = stat(filePath).st_size if actualLength != fileLength: raise IOError( 'Expected length %d, actual length %d' % (fileLength, actualLength) ) hashers = {} for algo in checksums.iterkeys(): try: hashers[algo] = newhash(algo) except ValueError, ex: raise IOError('Failed to create "%s" hasher: %s' % (algo, ex)) inp = open(filePath, 'rb') bufSize = 16384 try: while True: buf = inp.read(bufSize) if not buf: break for hasher in hashers.itervalues(): hasher.update(buf) finally: inp.close() for algo, hasher in sorted(hashers.iteritems()): if checksums[algo] != hasher.hexdigest(): raise IOError('%s checksum mismatch' % algo) def main(filePath, fileLengthStr, checksumStrs): if not isfile(filePath): print >> sys.stderr, 'No such file: %s' % filePath sys.exit(2) try: fileLength = int(fileLengthStr) except ValueError: print >> sys.stderr, 'Length should be an integer' sys.exit(2) checksums = {} for checksumStr in checksumStrs: try: algo, hashval = checksumStr.split('=') except ValueError: print >> sys.stderr, 'Invalid checksum format: %s' % checksumStr sys.exit(2) else: checksums[algo] = hashval print 'Validating: %s' % filePath try: verifyFile(filePath, fileLength, checksums) except IOError, ex: print >> sys.stderr, 'Validation FAILED: %s' % ex sys.exit(1) else: print 'Validation passed' sys.exit(0) if __name__ == '__main__': if len(sys.argv) >= 3: main( sys.argv[1], sys.argv[2], sys.argv[3 : ] ) else: print >> sys.stderr, ( 'Usage: python checksum.py FILE LENGTH (ALGO=HASH)*' ) sys.exit(2) openMSX-RELEASE_0_14_0/build/compilers.py000066400000000000000000000105131314057512400200770ustar00rootroot00000000000000from msysutils import msysActive, msysPathToNative from os import environ from shlex import split as shsplit from subprocess import PIPE, STDOUT, Popen if msysActive(): def fixArgs(args): for arg in args: if arg.startswith('-I') or arg.startswith('-L'): yield arg[ : 2] + msysPathToNative(arg[2 : ]) elif arg.startswith('/'): yield msysPathToNative(arg) else: yield arg else: def fixArgs(args): return iter(args) class _Command(object): @classmethod def fromLine(cls, commandStr, flagsStr): commandParts = shsplit(commandStr) flags = shsplit(flagsStr) env = {} while commandParts: if '=' in commandParts[0]: name, value = commandParts[0].split('=', 1) del commandParts[0] env[name] = value else: return cls( env, commandParts[0], list(fixArgs(commandParts[1 : ] + flags)) ) else: raise ValueError('No command specified in "%s"' % commandStr) def __init__(self, env, executable, flags): self.__env = env self.__executable = executable self.__flags = flags mergedEnv = dict(environ) mergedEnv.update(env) self.__mergedEnv = mergedEnv def __str__(self): return ' '.join( [ self.__executable ] + self.__flags + ( [ '(%s)' % ' '.join( '%s=%s' % item for item in sorted(self.__env.iteritems()) ) ] if self.__env else [] ) ) def _run(self, log, name, args, inputSeq, captureOutput): commandLine = [ self.__executable ] + args + self.__flags try: proc = Popen( commandLine, bufsize = -1, env = self.__mergedEnv, stdin = None if inputSeq is None else PIPE, stdout = PIPE, stderr = PIPE if captureOutput else STDOUT, ) except OSError, ex: print >> log, 'failed to execute %s: %s' % (name, ex) return None if captureOutput else False inputText = None if inputSeq is None else '\n'.join(inputSeq) + '\n' stdoutdata, stderrdata = proc.communicate(inputText) if captureOutput: assert stderrdata is not None messages = stderrdata else: assert stderrdata is None messages = stdoutdata if messages: log.write('%s command: %s\n' % (name, ' '.join(commandLine))) if inputText is not None: log.write('input:\n') log.write(inputText) if not inputText.endswith('\n'): log.write('\n') log.write('end input.\n') # pylint 0.18.0 somehow thinks 'messages' is a list, not a string. # pylint: disable-msg=E1103 messages = messages.replace('\r', '') log.write(messages) if not messages.endswith('\n'): log.write('\n') if proc.returncode == 0: return stdoutdata if captureOutput else True else: print >> log, 'return code from %s: %d' % (name, proc.returncode) return None if captureOutput else False class CompileCommand(_Command): __expandSignature = 'EXPAND_MACRO_' def compile(self, log, sourcePath, objectPath): return self._run( log, 'compiler', [ '-c', sourcePath, '-o', objectPath ], None, False ) def expand(self, log, headers, *keys): signature = self.__expandSignature def iterLines(): for header in headers: yield '#include %s' % header for key in keys: yield '%s%s %s' % (signature, key, key) output = self._run( log, 'preprocessor', [ '-E', '-' ], iterLines(), True ) if output is None: if len(keys) == 1: return None else: return (None, ) * len(keys) else: expanded = {} prevKey = None for line in output.split('\n'): line = line.strip() if not line or line.startswith('#'): continue if line.startswith(signature): prevKey = None keyValueStr = line[len(signature) : ] try: key, value = keyValueStr.split(None, 1) except ValueError: key, value = keyValueStr, '' if key not in keys: log.write( 'Ignoring macro expand signature match on ' 'non-requested macro "%s"\n' % key ) continue elif value == '': # GCC5 puts value on separate line. prevKey = key continue elif prevKey is not None: key = prevKey value = line prevKey = None else: continue if value != key: expanded[key] = value if len(keys) == 1: return expanded.get(keys[0]) else: return tuple(expanded.get(key) for key in keys) class LinkCommand(_Command): def link(self, log, objectPaths, binaryPath): return self._run( log, 'linker', objectPaths + [ '-o', binaryPath ], None, False ) openMSX-RELEASE_0_14_0/build/components.py000066400000000000000000000027141314057512400202730ustar00rootroot00000000000000# Defines the building blocks of openMSX and their dependencies. class Component(object): niceName = None makeName = None dependsOn = None @classmethod def canBuild(cls, probeVars): return all( probeVars.get('HAVE_%s_H' % makeName) and probeVars.get('HAVE_%s_LIB' % makeName) for makeName in cls.dependsOn ) class EmulationCore(Component): niceName = 'Emulation core' makeName = 'CORE' dependsOn = ('SDL', 'SDL_TTF', 'PNG', 'TCL', 'ZLIB') class GLRenderer(Component): niceName = 'GL renderer' makeName = 'GL' dependsOn = ('GL', 'GLEW') class Laserdisc(Component): niceName = 'Laserdisc' makeName = 'LASERDISC' dependsOn = ('OGG', 'VORBIS', 'THEORA') class ALSAMIDI(Component): niceName = 'ALSA MIDI' makeName = 'ALSAMIDI' dependsOn = ('ALSA', ) def iterComponents(): '''Iterates through all components of openMSX. ''' yield EmulationCore yield GLRenderer yield Laserdisc yield ALSAMIDI def iterBuildableComponents(probeVars): '''Iterates through those components of openMSX that can be built on the probed system. ''' for component in iterComponents(): if component.canBuild(probeVars): yield component def requiredLibrariesFor(components): '''Compute the library packages required to build the given components. Only the direct dependencies from openMSX are included, not dependencies between libraries. Returns a set of Make names. ''' return set( makeName for comp in components for makeName in comp.dependsOn ) openMSX-RELEASE_0_14_0/build/components2code.py000066400000000000000000000021541314057512400212060ustar00rootroot00000000000000# Creates the components header file. from components import iterComponents from makeutils import extractMakeVariables from outpututils import rewriteIfChanged import sys def iterComponentsHeader(probeMakePath): probeVars = extractMakeVariables(probeMakePath) buildComponents = set( component.makeName for component in iterComponents() if component.canBuild(probeVars) ) yield '// Automatically generated by build process.' yield '' yield '#ifndef COMPONENTS_HH' yield '#define COMPONENTS_HH' yield '' for component in iterComponents(): varName = component.makeName yield '#define COMPONENT_%s %d' % (varName, varName in buildComponents) yield '' yield 'namespace openmsx {' yield '' yield 'static const char* const BUILD_COMPONENTS = "%s";' \ % ' '.join(sorted(buildComponents)) yield '' yield '} // namespace openmsx' yield '' yield '#endif // COMPONENTS_HH' if __name__ == '__main__': if len(sys.argv) == 3: rewriteIfChanged(sys.argv[1], iterComponentsHeader(sys.argv[2])) else: print >> sys.stderr, ( 'Usage: python components2code.py COMPONENTS_HEADER PROBE_MAKE' ) sys.exit(2) openMSX-RELEASE_0_14_0/build/components2defs.py000066400000000000000000000020531314057512400212130ustar00rootroot00000000000000# Generates the contents of "components_defs.mk". from components import ( EmulationCore, iterBuildableComponents, iterComponents, requiredLibrariesFor ) from makeutils import extractMakeVariables from outpututils import rewriteIfChanged import sys def iterComponentDefs(probeMakePath): probeVars = extractMakeVariables(probeMakePath) yield '# Automatically generated by build process.' yield '' yield 'LIBRARY_COMPILE_FLAGS:=' yield 'LIBRARY_LINK_FLAGS:=' for libName in requiredLibrariesFor(iterBuildableComponents(probeVars)): yield '# %s' % libName yield 'LIBRARY_COMPILE_FLAGS+=' + probeVars.get(libName + '_CFLAGS', '') yield 'LIBRARY_LINK_FLAGS+=' + probeVars.get(libName + '_LDFLAGS', '') yield '' for component in iterComponents(): yield 'COMPONENT_%s:=%s' % ( component.makeName, str(component.canBuild(probeVars)).lower() ) if len(sys.argv) == 3: rewriteIfChanged(sys.argv[1], iterComponentDefs(sys.argv[2])) else: print >> sys.stderr, ( 'Usage: python components2defs.py COMPONENTS_DEFS PROBE_MAKE' ) sys.exit(2) openMSX-RELEASE_0_14_0/build/configurations.py000066400000000000000000000030301314057512400211300ustar00rootroot00000000000000from components import ( EmulationCore, GLRenderer, Laserdisc, iterComponents ) class Configuration(object): def __init__(self, requiredComponents, optionalComponents, linkStatic): self.__requiredComponents = requiredComponents self.__optionalComponents = optionalComponents self.__linkStatic = linkStatic def iterRequiredComponents(self): return iter(self.__requiredComponents) def iterOptionalComponents(self): return iter(self.__optionalComponents) def iterDesiredComponents(self): return iter(self.__requiredComponents | self.__optionalComponents) def linkStatic(self): '''Returns True iff static linking should be used for non-system libs. ''' return self.__linkStatic def getConfiguration(name): if name == 'SYS_DYN': requiredComponents = set((EmulationCore, )) optionalComponents = set(iterComponents()) - requiredComponents linkStatic = False elif name == '3RD_STA': requiredComponents = set((EmulationCore, GLRenderer)) optionalComponents = set(iterComponents()) - requiredComponents linkStatic = True elif name == '3RD_STA_GLES': # TODO: We don't have an OpenGL ES component yet. requiredComponents = set((EmulationCore, )) optionalComponents = \ set(iterComponents()) - requiredComponents - set((GLRenderer, )) linkStatic = True elif name == '3RD_STA_MIN': requiredComponents = set((EmulationCore, )) optionalComponents = set() linkStatic = True else: raise ValueError('No configuration named "%s"' % name) return Configuration(requiredComponents, optionalComponents, linkStatic) openMSX-RELEASE_0_14_0/build/cpu.py000066400000000000000000000044761314057512400167040ustar00rootroot00000000000000class CPU(object): '''Abstract base class for CPU families. ''' # String that we use to identify this CPU type. name = None # Big (True) or little (False) endian? # Note that some CPUs can do both; if both settings are used in practice # we treat them like different CPUs (see MIPS/MIPSel). bigEndian = None # Allow unaligned memory accesses? unalignedMemoryAccess = False # GCC flags to pass to the compile and link commands. gccFlags = () class Alpha(CPU): '''DEC Alpha. ''' name = 'alpha' bigEndian = False class ARM(CPU): '''ARM. ''' name = 'arm' bigEndian = False class ARM64(CPU): '''ARM 64-bit, little endian mode. ''' name = 'aarch64' bigEndian = False class ARM64BE(CPU): '''ARM 64-bit, big endian mode. ''' name = 'aarch64_be' bigEndian = True class AVR32(CPU): '''Atmel AVR32, an embedded RISC CPU. ''' name = 'avr32' bigEndian = True class HPPA(CPU): '''HP PA-RISC. ''' name = 'hppa' bigEndian = True class IA64(CPU): '''Intel Itanium. ''' name = 'ia64' bigEndian = False class M68k(CPU): '''Motorola 680x0. ''' name = 'm68k' bigEndian = True class MIPS(CPU): '''Big endian MIPS. ''' name = 'mips' bigEndian = True class MIPSel(MIPS): '''Little endian MIPS. ''' name = 'mipsel' bigEndian = False class PPC(CPU): '''32-bit Power PC. ''' name = 'ppc' bigEndian = True class PPC64(CPU): '''64-bit Power PC. ''' name = 'ppc64' bigEndian = True class S390(CPU): '''IBM S/390. ''' name = 's390' bigEndian = True class SH(CPU): '''Little endian Renesas SuperH. ''' name = 'sh' bigEndian = False class SHeb(CPU): '''Big endian Renesas SuperH. ''' name = 'sheb' bigEndian = True class Sparc(CPU): '''Sun Sparc. ''' name = 'sparc' bigEndian = True class X86(CPU): '''32-bit x86: Intel Pentium, AMD Athlon etc. ''' name = 'x86' bigEndian = False unalignedMemoryAccess = True gccFlags = '-m32', class X86_64(CPU): '''64-bit x86. Also known as AMD64 or x64. ''' name = 'x86_64' bigEndian = False unalignedMemoryAccess = True gccFlags = '-m64', # Build a dictionary of CPUs using introspection. def _discoverCPUs(localObjects): for obj in localObjects: if isinstance(obj, type) and issubclass(obj, CPU): if not (obj is CPU): yield obj.name, obj _cpusByName = dict(_discoverCPUs(locals().itervalues())) def getCPU(name): return _cpusByName[name] openMSX-RELEASE_0_14_0/build/cpu2flags.py000066400000000000000000000006111314057512400177660ustar00rootroot00000000000000from cpu import getCPU import sys def getCPUFlags(cpuName): cpu = getCPU(cpuName) return ' '.join(cpu.gccFlags) if __name__ == '__main__': if len(sys.argv) == 2: cpuName = sys.argv[1] try: print getCPUFlags(cpuName) except KeyError: print >> sys.stderr, 'Unknown CPU "%s"' % cpuName else: print >> sys.stderr, 'Usage: python cpu2flags.py OPENMSX_TARGET_CPU' sys.exit(2) openMSX-RELEASE_0_14_0/build/custom.mk000066400000000000000000000015111314057512400173710ustar00rootroot00000000000000# Customize openMSX to your system/preferences. # Directory to install to. # openMSX is always installed into a single self-contained directory. # But you can change that directory to for example /usr/local/openMSX # or /usr/games/openMSX if you like. INSTALL_BASE:=/opt/openMSX # Add revision number to executable file name? This applies only to # development versions, not to release versions (see version.py). VERSION_EXEC:=false # Create a symbolic link to the installed binary? # This link is placed in a location that is typically in a user's path: # /usr/local/bin for system-wide installs and ~/bin for personal installs. # This setting is only relevant on systems that support symbolic links. SYMLINK_FOR_BINARY:=true # Install content of Contrib/ directory? # Currently this contains a version of C-BIOS. INSTALL_CONTRIB:=true openMSX-RELEASE_0_14_0/build/detectsys.py000066400000000000000000000074041314057512400201160ustar00rootroot00000000000000# Detect the native CPU and OS. # Actually we rely on the Python "platform" module and map its output to names # that the openMSX build understands. from executils import captureStdout from platform import architecture, machine, system from subprocess import PIPE, STDOUT, Popen import sys def detectCPU(): '''Detects the CPU family (not the CPU model) of the machine were are running on. Raises ValueError if no known CPU is detected. ''' cpu = machine().lower() dashIndex = cpu.find('-') if dashIndex != -1: # Hurd returns "cputype-cpusubtype" instead of just "cputype". cpu = cpu[ : dashIndex] if cpu in ('x86_64', 'amd64'): return 'x86_64' elif cpu in ('x86', 'i386', 'i486', 'i586', 'i686'): return 'x86' elif cpu.startswith('ppc') or cpu.endswith('ppc') or cpu.startswith('power'): return 'ppc64' if cpu.endswith('64') else 'ppc' elif cpu.startswith('arm'): return 'arm' elif cpu == 'aarch64': return 'aarch64' elif cpu == 'aarch64_be': return 'aarch64_be' elif cpu.startswith('mips') or cpu == 'sgi': return 'mipsel' if cpu.endswith('el') else 'mips' elif cpu == 'm68k': return 'm68k' elif cpu == 'ia64': return 'ia64' elif cpu.startswith('alpha'): return 'alpha' elif cpu.startswith('hppa') or cpu.startswith('parisc'): return 'hppa' elif cpu.startswith('s390'): return 's390' elif cpu.startswith('sparc') or cpu.startswith('sun4u'): return 'sparc' elif cpu.startswith('sh'): return 'sheb' if cpu.endswith('eb') else 'sh' elif cpu == 'avr32': return 'avr32' elif cpu == '': # Python couldn't figure it out. os = system().lower() if os == 'windows': # Relatively safe bet. return 'x86' raise ValueError('Unable to detect CPU') else: raise ValueError('Unsupported or unrecognised CPU "%s"' % cpu) def detectOS(): '''Detects the operating system of the machine were are running on. Raises ValueError if no known OS is detected. ''' os = system().lower() if os in ( 'linux', 'darwin', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'gnu' ): return os elif os.startswith('gnu/'): # GNU userland on non-Hurd kernel, for example Debian GNU/kFreeBSD. # For openMSX the kernel is not really relevant, so treat it like # a generic GNU system. return 'gnu' elif os.startswith('mingw') or os == 'windows': return 'mingw-w64' elif os == 'sunos': return 'solaris' elif os == '': # Python couldn't figure it out. raise ValueError('Unable to detect OS') else: raise ValueError('Unsupported or unrecognised OS "%s"' % os) def getCompilerMachine(): # Note: Recent GCC and Clang versions support this option. machine = captureStdout(sys.stderr, 'cc -dumpmachine') if machine is not None: machineParts = machine.split('-') if len(machineParts) >= 3: return machineParts[0], machineParts[2] return None, None if __name__ == '__main__': try: hostCPU = detectCPU() if hostCPU == 'mips': # Little endian MIPS is reported as just "mips" by Linux Python. compilerCPU, compilerOS = getCompilerMachine() if compilerCPU == 'mips': pass elif compilerCPU == 'mipsel': hostCPU = compilerCPU else: print >>sys.stderr, ( 'Warning: Unabling to determine endianess; ' 'compiling for big endian' ) hostOS = detectOS() if hostOS == 'mingw32' and hostCPU == 'x86_64': # It is possible to run MinGW on 64-bit Windows, but producing # 64-bit code is not supported yet. hostCPU = 'x86' elif hostOS == 'darwin' and hostCPU == 'x86': # If Python is 64-bit, both the CPU and OS support it, so we can # compile openMSX for x86-64. Compiling in 32-bit mode might seem # safer, but will fail if using MacPorts on a 64-bit capable system. if architecture()[0] == '64bit': hostCPU = 'x86_64' print hostCPU, hostOS except ValueError, ex: print >> sys.stderr, ex sys.exit(1) openMSX-RELEASE_0_14_0/build/download.py000066400000000000000000000045141314057512400177150ustar00rootroot00000000000000from os import remove, stat from os.path import basename, isdir, isfile, join as joinpath from urllib import FancyURLopener from urlparse import urlparse import sys # FancyURLOpener, which is also used in urlretrieve(), does not raise # an exception on status codes like 404 and 500. However, for downloading it is # critical to write either what we requested or nothing at all. class DownloadURLOpener(FancyURLopener): def http_error_default(self, url, fp, errcode, errmsg, headers): raise IOError('%s: http:%s' % (errmsg, url)) _urlOpener = DownloadURLOpener() class StatusLine(object): def __init__(self, out): self._out = out def __call__(self, message, progress = False): raise NotImplementedError class InteractiveStatusLine(StatusLine): __length = 0 def __call__(self, message, progress = False): self._out.write(('\r%-' + str(self.__length) + 's') % message) self.__length = max(self.__length, len(message)) class NoninteractiveStatusLine(StatusLine): def __call__(self, message, progress = False): if not progress: self._out.write(message + '\n') def createStatusLine(out): if out.isatty(): return InteractiveStatusLine(out) else: return NoninteractiveStatusLine(out) def downloadURL(url, localDir): if not isdir(localDir): raise IOError('Local directory "%s" does not exist' % localDir) fileName = basename(urlparse(url).path) localPath = joinpath(localDir, fileName) prefix = 'Downloading %s: ' % fileName statusLine = createStatusLine(sys.stdout) statusLine(prefix + 'contacting server...') def reportProgress(blocksDone, blockSize, totalSize): doneSize = blocksDone * blockSize statusLine(prefix + ( '%d/%d bytes (%1.1f%%)...' % ( doneSize, totalSize, (100.0 * doneSize) / totalSize ) if totalSize > 0 else '%d bytes...' % doneSize ), True) try: try: _urlOpener.retrieve(url, localPath, reportProgress) except IOError: statusLine(prefix + 'FAILED.') raise else: statusLine(prefix + 'done.') finally: print except: if isfile(localPath): statusLine(prefix + 'removing partial download.') remove(localPath) raise if __name__ == '__main__': if len(sys.argv) == 3: try: downloadURL(*sys.argv[1 : ]) except IOError, ex: print >> sys.stderr, ex sys.exit(1) else: print >> sys.stderr, \ 'Usage: python download.py url localdir' sys.exit(2) openMSX-RELEASE_0_14_0/build/entry-seq.mk000066400000000000000000000011461314057512400200120ustar00rootroot00000000000000# Declares a dependency chain of sequence- on sequence, sequence- # on sequence etc, where N is the number of words in ACTION_COUNTER. .PHONY: sequence-$(words $(ACTION_COUNTER)) ifeq ($(words $(ACTION_COUNTER)),0) sequence-0: else NEXT_ACTION_COUNTER:=$(wordlist 2,999999,$(ACTION_COUNTER)) sequence-$(words $(ACTION_COUNTER)): sequence-$(words $(NEXT_ACTION_COUNTER)) @echo Action: $(word $(@:sequence-%=%),$(MAKECMDGOALS)) @$(MAKE) --no-print-directory -f build/main.mk \ $(word $(@:sequence-%=%),$(MAKECMDGOALS)) ACTION_COUNTER:=$(NEXT_ACTION_COUNTER) include build/entry-seq.mk endif openMSX-RELEASE_0_14_0/build/entry.mk000066400000000000000000000024371314057512400172300ustar00rootroot00000000000000# Entry point of build system. # # Do a sanity check on the given action(s) and processes them sequentially. # Sequential processing is needed because for example "clean" and "all" cannot # run in parallel. Some actions might be able to run in parallel, but that is # an optimization we can do later, if it is really worth it. # All actions we want to expose to the user. USER_ACTIONS:=\ 3rdparty all app bindist clean createsubs dist install probe run \ staticbindist # Mark all actions as logical targets. .PHONY: $(USER_ACTIONS) # Reject unknown actions. UNKNOWN_ACTIONS:=$(filter-out $(USER_ACTIONS),$(MAKECMDGOALS)) ifneq ($(UNKNOWN_ACTIONS),) ifeq ($(words $(UNKNOWN_ACTIONS)),1) $(error Unknown action: $(UNKNOWN_ACTIONS)) else $(error Unknown actions: $(UNKNOWN_ACTIONS)) endif endif ifeq ($(MAKECMDGOALS),) # Make default action explicit. MAKECMDGOALS:=all .PHONY: default default: all endif ifeq ($(words $(MAKECMDGOALS)),1) # Single action, run it in this Make process. include build/main.mk else # Multiple actions are given, process them sequentially. # If the same action is given more than once, some warnings will be displayed, # but they will all be executed. ACTION_COUNTER:=$(MAKECMDGOALS:%=x) include build/entry-seq.mk $(MAKECMDGOALS): sequence-$(words $(MAKECMDGOALS)) @true endif openMSX-RELEASE_0_14_0/build/executils.py000066400000000000000000000036721314057512400201170ustar00rootroot00000000000000from msysutils import msysActive, msysShell from os import environ from shlex import split as shsplit from subprocess import PIPE, Popen def captureStdout(log, commandLine): '''Run a command and capture what it writes to stdout. If the command fails or writes something to stderr, that is logged. Returns the captured string, or None if the command failed. ''' # TODO: This is a modified copy-paste from compilers._Command. commandParts = shsplit(commandLine) env = dict(environ) while commandParts: if '=' in commandParts[0]: name, value = commandParts[0].split('=', 1) del commandParts[0] env[name] = value else: break else: raise ValueError( 'No command specified in "%s"' % commandLine ) if msysActive() and commandParts[0] != 'sh': commandParts = [ msysShell(), '-c', shjoin(commandParts) ] try: proc = Popen( commandParts, bufsize = -1, env = env, stdin = None, stdout = PIPE, stderr = PIPE, ) except OSError, ex: print >> log, 'Failed to execute "%s": %s' % (commandLine, ex) return None stdoutdata, stderrdata = proc.communicate() if stderrdata: severity = 'warning' if proc.returncode == 0 else 'error' log.write('%s executing "%s"\n' % (severity.capitalize(), commandLine)) # pylint 0.18.0 somehow thinks stderrdata is a list, not a string. # pylint: disable-msg=E1103 stderrdata = stderrdata.replace('\r', '') log.write(stderrdata) if not stderrdata.endswith('\n'): log.write('\n') if proc.returncode == 0: return stdoutdata else: print >> log, 'Execution failed with exit code %d' % proc.returncode return None def shjoin(parts): '''Joins the given sequence into a single string with space as a separator. Characters that have a special meaning for the shell are escaped. This is the counterpart of shlex.split(). ''' def escape(part): return ''.join( '\\' + ch if ch in '\\ \'"$()[]' else ch for ch in part ) return ' '.join(escape(part) for part in parts) openMSX-RELEASE_0_14_0/build/extract.py000066400000000000000000000076131314057512400175630ustar00rootroot00000000000000# Extract files from archives. from os import O_CREAT, O_WRONLY, fdopen, mkdir, open as osopen, utime try: from os import O_BINARY except ImportError: # Platforms that do not define O_BINARY do not need it either. O_BINARY = 0 try: from os import symlink except ImportError: def symlink(source, link_name): raise RuntimeError( 'OS does not support symlink creation: %s -> %s' % (link_name, source) ) from os.path import abspath, isdir, join as joinpath, sep, split as splitpath from stat import S_IRWXU, S_IRWXG, S_IRWXO, S_IXUSR, S_IXGRP, S_IXOTH import sys import tarfile from detectsys import detectOS hostOS = detectOS() # Note: Larger buffers might make extraction slower. bufSize = 16384 def extract(archivePath, destDir, rename = None): '''Extract the given archive to the given directory. If a rename function is given, it is called with the output path relative to the destination directory; the value returned by the rename function is used as the actual relative destination file path. This function sets file ownership and permissions like is done in newly created files and ignores the ownership and permissions from the archive, since we are not restoring a backup. ''' absDestDir = abspath(destDir) + sep if not isdir(absDestDir): raise ValueError( 'Destination directory "%s" does not exist' % absDestDir ) tar = tarfile.open(archivePath) # Note: According to the Python 2.6 docs, errorlevel can be passed as a # keyword argument to the open() call, but on Python 2.5 this does # not work. tar.errorlevel = 2 try: for member in tar.getmembers(): absMemberPath = abspath(joinpath(absDestDir, member.name)) if member.isdir(): absMemberPath += sep if not absMemberPath.startswith(absDestDir): raise ValueError( 'Refusing to extract tar entry "%s" ' 'outside destination directory' % member.name ) if rename: absMemberPath = absDestDir + rename( absMemberPath[len(absDestDir) : ] ) if member.isfile(): mode = S_IRWXU | S_IRWXG | S_IRWXO if not (member.mode & S_IXUSR): mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH) out = fdopen( osopen(absMemberPath, O_CREAT | O_WRONLY | O_BINARY, mode), 'wb' ) try: inp = tar.extractfile(member) bytesLeft = member.size while bytesLeft > 0: buf = inp.read(bufSize) out.write(buf) bytesLeft -= len(buf) buf = None finally: out.close() elif member.isdir(): if not isdir(absMemberPath): mkdir(absMemberPath) elif member.issym(): symlink(member.linkname, absMemberPath) else: raise ValueError( 'Cannot extract tar entry "%s": ' 'not a regular file, symlink or directory' % member.name ) # Set file/directory modification time to match the archive. # For example autotools track dependencies between archived files # and will attempt to regenerate them if the time stamps indicate # one is older than the other. # Note: Apparently Python 2.5's utime() cannot set timestamps on # directories in Windows. if member.isfile() or ( member.isdir() and not hostOS.startswith('mingw') ): utime(absMemberPath, (member.mtime, member.mtime)) finally: tar.close() class TopLevelDirRenamer(object): def __init__(self, newName): self.newName = newName def __call__(self, oldPath): head, tail = splitpath(oldPath) headParts = head.split(sep) if not headParts: raise ValueError( 'Directory part is empty for entry "%s"' % oldPath ) headParts[0] = self.newName return sep.join(headParts + [ tail ]) if __name__ == '__main__': if 3 <= len(sys.argv) <= 4: if len(sys.argv) == 4: renameTopLevelDir = TopLevelDirRenamer(sys.argv[3]) else: renameTopLevelDir = None extract(sys.argv[1], sys.argv[2], renameTopLevelDir) else: print >> sys.stderr, \ 'Usage: python extract.py archive destination [new-top-level-dir]' sys.exit(2) openMSX-RELEASE_0_14_0/build/fileutils.py000066400000000000000000000120441314057512400201030ustar00rootroot00000000000000from os import altsep, chmod, mkdir, remove, sep, stat, walk from os.path import dirname, exists, isdir, isfile, islink, join as joinpath from shutil import copyfile try: from os import symlink except ImportError: def symlink(src, dst): # pylint: disable-msg=W0613 raise OSError('This platform does not support symbolic links') def scanTree(baseDir): '''Scans files and directories from the given base directory and iterates through the paths of the files and directories it finds; these paths are relative to the base directory. Directories will always be returned before any of the files they contain. The base directory itself is not returned. Hidden files and directories are not returned. All paths returned use the OS native separator character (os.sep), regardless of which separator characters were used in the arguments. Raises IOError if there is an I/O error scanning the base directory. ''' if altsep is not None: # Make sure all paths use the OS native separator, so we can safely # compare paths and have consistent error messages. baseDir = baseDir.replace(altsep, sep) baseDir = baseDir.rstrip(sep) if not isdir(baseDir): raise IOError('Directory "%s" does not exist' % baseDir) def escalate(ex): raise IOError( 'Error scanning directory entry "%s": %s' % (ex.filename, ex) ) for dirPath, dirNames, fileNames in walk(baseDir, onerror = escalate): # Skip hidden directories. # We are deleting items from the list we are iterating over; that # requires some extra care. index = 0 while index < len(dirNames): if dirNames[index].startswith('.'): del dirNames[index] else: index += 1 # Skip hidden files. fileNames = [ name for name in fileNames if not name.startswith('.') ] if dirPath == baseDir: relDir = '' else: assert dirPath.startswith(baseDir + sep), dirPath relDir = dirPath[len(baseDir) + 1 : ] yield relDir for fileName in fileNames: yield joinpath(relDir, fileName) def installDir(path): '''Creates the given path, excluding parent directories. The directory is created with permissions such that all users can read what is installed and only the owner can modify what is installed. If the given path already exists, nothing happens. ''' if not isdir(path): # We have to do chmod() separately because the "mode" argument of # mkdir() is modified by umask. mkdir(path) chmod(path, 0755) def _installDirsRec(path): '''Like installDirs(), except that "altsep" is not supported as directory separator in "path". ''' path = path.rstrip(sep) if path and not isdir(path): index = path.rfind(sep) if index != -1: _installDirsRec(path[ : index]) mkdir(path) chmod(path, 0755) def installDirs(path): '''Creates the given path, including any parent directories if necessary. Any newly created directories are created with permissions such that all users can read what is installed and only the owner can modify what is installed. If the given path already exists, nothing happens. ''' if altsep is not None: path = path.replace(altsep, sep) _installDirsRec(path) def installFile(srcPath, destPath): '''Copies a file from the given source path to the given destination path. The destination file is created with permissions such that all users can read (and execute, if appropriate) what is installed and only the owner can modify what is installed. Raises IOError if there is a problem reading or writing files. ''' copyfile(srcPath, destPath) chmod(destPath, 0755 if (stat(srcPath).st_mode & 0100) else 0644) def installSymlink(target, link): '''Creates a symbolic link with the given name to the given target. If a symbolic link with the given name already exists, it is replaced. If a different file type with the given name already exists, OSError is raised. Also raises OSError if this platform lacks os.symlink(). ''' if islink(link): remove(link) symlink(target, link) def installTree(srcDir, destDir, paths): '''Copies files and directories from the given source directory to the given destination directory. The given paths argument is a sequence of paths relative to the source directory; only those files and directories are copied. The scanTree() function is suitable to provide paths. Files and directories are created with permissions such that all users can read (and execute, if appropriate) what is installed and only the owner can modify what is installed. Raises IOError if there is a problem reading or writing files or directories. ''' if not isdir(destDir): raise IOError('Destination directory "%s" does not exist' % destDir) for relPath in paths: if altsep is not None: relPath = relPath.replace(altsep, sep) srcPath = joinpath(srcDir, relPath) destPath = joinpath(destDir, relPath) if islink(srcPath): print 'Skipping symbolic link:', srcPath elif isdir(srcPath): _installDirsRec(destPath) elif isfile(srcPath): _installDirsRec(dirname(destPath)) installFile(srcPath, destPath) elif exists(srcPath): print 'Skipping unknown kind of file system entry:', srcPath else: print 'Skipping non-existing path:', srcPath openMSX-RELEASE_0_14_0/build/flavour-android-debug.mk000066400000000000000000000005561314057512400222470ustar00rootroot00000000000000# Android flavour. Copy all ANDROID_CXXFLAGS into TARGET_FLAGS # Otherwise, probe fails as it won't be able to find the include files include build/flavour-android.mk TARGET_FLAGS+=-fPIE #CXXFLAGS+=-O0 -g -DDEBUG -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC \ # -D_GLIBCPP_CONCEPT_CHECKS CXXFLAGS+=-DDEBUG -O0 -fPIE # Strip executable? OPENMSX_STRIP:=false openMSX-RELEASE_0_14_0/build/flavour-android.mk000066400000000000000000000003071314057512400211550ustar00rootroot00000000000000# Android flavour. Copy all ANDROID_CXXFLAGS into TARGET_FLAGS # Otherwise, probe fails as it won't be able to find the include files TARGET_FLAGS+=$(ANDROID_CXXFLAGS) CXXFLAGS:=$(ANDROID_CXXFLAGS) openMSX-RELEASE_0_14_0/build/flavour-bindist.mk000066400000000000000000000003041314057512400211660ustar00rootroot00000000000000# Generic flavour for binary distributions. # It disables debugging and aims for a small binary. # Optimisation flags. CXXFLAGS+=-Os -DNDEBUG -ffast-math # Strip executable? OPENMSX_STRIP:=true openMSX-RELEASE_0_14_0/build/flavour-debug.mk000066400000000000000000000003741314057512400206270ustar00rootroot00000000000000# Configuration for "debug" flavour: # Build with all debugging info, no optimisations. # Debug flags. CXXFLAGS+=-O0 -g -DDEBUG -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC \ -D_GLIBCPP_CONCEPT_CHECKS # Strip executable? OPENMSX_STRIP:=false openMSX-RELEASE_0_14_0/build/flavour-devel.mk000066400000000000000000000004711314057512400206360ustar00rootroot00000000000000# Configuration for "devel" flavour: # Build with debug symbols, no debug prints, some optimisations. # Debug flags. CXXFLAGS+=-O2 -g # Extra warnings, only works with recent gcc versions #CXXFLAGS+=-ansi -pedantic -Wno-long-long -Wextra -Wno-missing-field-initializers # Strip executable? OPENMSX_STRIP:=false openMSX-RELEASE_0_14_0/build/flavour-i686.mk000066400000000000000000000003611314057512400202310ustar00rootroot00000000000000# Configuration for "i686" flavour: # Optimised for Pentium 3, but compatible with Pentium 2 and higher. # Start with generic optimisation flags. include build/flavour-opt.mk # Add x86 specific flags. CXXFLAGS+=-march=i686 -mtune=pentium3 openMSX-RELEASE_0_14_0/build/flavour-lto.mk000066400000000000000000000014671314057512400203430ustar00rootroot00000000000000# This flavour enables link-time optimization (LTO). # This requires GCC 4.5 or higher; it's known to work on GCC 4.6.3. include build/flavour-opt.mk # Enable LTO for compiling and linking. # Don't bother with native code output in the compile phase, since new code # will be generated in the link phase. # Ideally LTO would be enabled for the 3rdparty libs as well, but I haven't # been able to make that work. COMPILE_FLAGS+=-flto LINK_FLAGS+=-flto=jobserver # Enable this line to speed up compilation. This is supported from gcc-4.7 # onward. Quote from the gcc manual: # -fno-fat-lto-objects improves compilation time over plain LTO, but # requires the complete toolchain to be aware of LTO. It requires a # linker with linker plugin support for basic functionality. #COMPILE_FLAGS+=-fno-fat-lto-objects openMSX-RELEASE_0_14_0/build/flavour-m68k.mk000066400000000000000000000003111314057512400203150ustar00rootroot00000000000000# ARM specific optimization flags # Optimisation flags: # overrule optimization level for m68k # TODO: is this still strictly needed? CXXFLAGS+=-O1 -DNDEBUG # Strip executable? OPENMSX_STRIP:=true openMSX-RELEASE_0_14_0/build/flavour-opt-debug.mk000066400000000000000000000002531314057512400214230ustar00rootroot00000000000000# Generic optimisation flavour: # does not target any specific CPU. # Optimisation flags. CXXFLAGS+=-O3 -DNDEBUG -ffast-math -g # Strip executable? OPENMSX_STRIP:=false openMSX-RELEASE_0_14_0/build/flavour-opt.mk000066400000000000000000000005711314057512400203420ustar00rootroot00000000000000# Generic optimisation flavour: # does not target any specific CPU. # Optimisation flags. CXXFLAGS+=-O3 -DNDEBUG -ffast-math # openMSX crashes when the win32 version is built with -fomit-frame-pointer # TODO: investigate and recheck when new compiler is used. ifneq ($(OPENMSX_TARGET_OS),mingw32) CXXFLAGS+=-fomit-frame-pointer endif # Strip executable? OPENMSX_STRIP:=true openMSX-RELEASE_0_14_0/build/flavour-ppc.mk000066400000000000000000000002721314057512400203200ustar00rootroot00000000000000# Configuration for "ppc" flavour: # Optimised for G3 PPC. # Start with generic optimisation flags. include build/flavour-opt.mk # Add PPC specific flags. CXXFLAGS+=-mcpu=G3 -mtune=G4 openMSX-RELEASE_0_14_0/build/flavour-ppcg4.mk000066400000000000000000000003561314057512400205560ustar00rootroot00000000000000# Configuration for "ppc" flavour: # Optimised for PPC-G4 and higher. # Start with generic optimisation flags. include build/flavour-opt.mk # Add PPC specific flags. CXXFLAGS+=-mcpu=G4 -mtune=G4 -mpowerpc-gfxopt -maltivec -mabi=altivec openMSX-RELEASE_0_14_0/build/flavour-super-opt.mk000066400000000000000000000021671314057512400215010ustar00rootroot00000000000000# This flavour enables some extra optimizations, though these options may # not work everywhere or may not be benefical in all cases. # Start with generic optimisation flags. include build/flavour-opt.mk # Add CPU specific optimization flags: # march=native is only supported starting from gcc-4.2.x # comment out this line if you're compiling on an older gcc version CXXFLAGS+=-march=native -mtune=native # Use computed goto's to speedup Z80 emulation: # - Computed goto's are a gcc extension, it's not part of the official c++ # standard. So this will only work if you use gcc as your compiler (it # won't work with visual c++ for example) # - This is only beneficial on CPUs with branch prediction for indirect jumps # and a reasonable amout of cache. For example it is very benefical for a # intel core2 cpu (10% faster), but not for a ARM920 (a few percent slower) # - Compiling src/cpu/CPUCore.cc with computed goto's enabled is very demanding # on the compiler. On older gcc versions it requires upto 1.5GB of memory. # But even on more recent gcc versions it still requires around 700MB. CXXFLAGS+=-DUSE_COMPUTED_GOTO openMSX-RELEASE_0_14_0/build/flavour-win32.mk000066400000000000000000000005671314057512400205070ustar00rootroot00000000000000# Configuration for Win32 flavour: # Optimised for Pentium 3 but runnable at MMX-Pentium or higher. # Optimisation flags. CXXFLAGS+= \ -Os -mpreferred-stack-boundary=4 \ -mtune=pentium3 -march=pentium-mmx -mmmx \ -fstrength-reduce -fexpensive-optimizations -fschedule-insns2 \ -fomit-frame-pointer -fno-default-inline # -DNDEBUG # Strip executable? OPENMSX_STRIP:=true openMSX-RELEASE_0_14_0/build/gitdist.py000077500000000000000000000066651314057512400175710ustar00rootroot00000000000000#!/usr/bin/env python2 # Creates a source distribution package. from os import makedirs, remove from os.path import isdir from subprocess import CalledProcessError, PIPE, Popen, check_output from tarfile import TarError, TarFile import stat, sys verbose = False def archiveFromGit(versionedPackageName, committish): prefix = '%s/' % versionedPackageName distBase = 'derived/dist/' umask = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH ) def exclude(info): '''Returns True iff the given tar entry should be excluded. ''' return any(( info.name.endswith('/.gitignore'), info.name.startswith(prefix + 'doc/internal'), )) proc = Popen( ('git', 'archive', '--prefix=' + prefix, '--format=tar', committish), bufsize = -1, stdin = None, stdout = PIPE, stderr = sys.stderr, ) try: outTarPath = distBase + versionedPackageName + '.tar.gz' print 'archive:', outTarPath if not isdir(distBase): makedirs(distBase) outTar = TarFile.open(outTarPath, 'w:gz') try: # Copy entries from "git archive" into output tarball, except for # excluded entries. numIncluded = numExcluded = 0 inTar = TarFile.open(mode = 'r|', fileobj = proc.stdout) try: for info in inTar: if exclude(info): if verbose: print 'EX', info.name numExcluded += 1 else: if verbose: print 'IN', info.name numIncluded += 1 info.uid = info.gid = 1000 info.uname = info.gname = 'openmsx' info.mode = info.mode & umask outTar.addfile(info, inTar.extractfile(info)) finally: inTar.close() print 'entries: %d included, %d excluded' % ( numIncluded, numExcluded) except: # Clean up partial output file. outTar.close() remove(outTarPath) raise else: outTar.close() except: proc.terminate() raise else: data, _ = proc.communicate() if len(data) != 0: print >> sys.stderr, ( 'WARNING: %d more bytes of data from "git archive" after ' 'tar stream ended' % len(data)) def niceVersionFromGitDescription(description): '''Our release tag names are still based on naming limitations from CVS; convert them to something more pleasing to the eyes. ''' parts = description.split('-') tag = parts[0] if tag.startswith('RELEASE_'): tagParts = tag.split('_')[1 : ] i = 0 while i < len(tagParts) and tagParts[i].isdigit(): i += 1 version = '-'.join( ['.'.join(tagParts[ : i])] + [s.lower() for s in tagParts[i : ]] ) else: version = tag if len(parts) >= 2: parts[1] = 'dev' + parts[1] return '-'.join([version] + parts[1 : ]) def getDescription(committish): args = ['git', 'describe', '--abbrev=9'] if committish is not None: args.append(committish) try: return check_output(args).rstrip('\n') except CalledProcessError as ex: print >> sys.stderr, '"%s" returned %d' % ( ' '.join(args), ex.returncode ) raise def main(committish = None): try: description = getDescription(committish) except CalledProcessError: sys.exit(1) version = niceVersionFromGitDescription(description) try: archiveFromGit('openmsx-%s' % version, description) except (OSError, TarError) as ex: print >> sys.stderr, 'ERROR: %s' % ex sys.exit(1) if __name__ == '__main__': if len(sys.argv) == 1: main() elif len(sys.argv) == 2: main(sys.argv[1]) else: print >> sys.stderr, 'Usage: gitdist.py [branch | tag]' sys.exit(2) openMSX-RELEASE_0_14_0/build/install.py000066400000000000000000000101431314057512400175470ustar00rootroot00000000000000from fileutils import ( installDirs, installFile, installSymlink, installTree, scanTree ) from makeutils import extractMakeVariables, parseBool from os import listdir from os.path import basename, expanduser, isdir, splitext import os import sys def installAll( installPrefix, binaryDestDir, shareDestDir, docDestDir, binaryBuildPath, targetPlatform, cbios, symlinkForBinary ): platformVars = extractMakeVariables( 'build/platform-%s.mk' % targetPlatform, dict.fromkeys( ('COMPILE_FLAGS', 'LINK_FLAGS', 'TARGET_FLAGS', 'OPENMSX_TARGET_CPU'), '' ) ) binaryFileName = 'openmsx' + platformVars.get('EXEEXT', '') docNodeVars = extractMakeVariables('doc/node.mk') docsToInstall = [ 'doc/' + fileName for fileName in docNodeVars['INSTALL_DOCS'].split() ] print ' Executable...' installDirs(installPrefix + binaryDestDir) installFile( binaryBuildPath, installPrefix + binaryDestDir + '/' + binaryFileName ) print ' Data files...' installDirs(installPrefix + shareDestDir) installTree('share', installPrefix + shareDestDir, scanTree('share')) print ' Documentation...' installDirs(installPrefix + docDestDir) for path in docsToInstall: installFile(path, installPrefix + docDestDir + '/' + basename(path)) installDirs(installPrefix + docDestDir + '/manual') for fileName in listdir('doc/manual'): if splitext(fileName)[1] in ('.html', '.css', '.png'): installFile( 'doc/manual/' + fileName, installPrefix + docDestDir + '/manual/' + fileName ) if cbios: print ' C-BIOS...' installFile( 'Contrib/README.cbios', installPrefix + docDestDir + '/cbios.txt' ) installTree( 'Contrib/cbios', installPrefix + shareDestDir + '/machines', scanTree('Contrib/cbios') ) if hasattr(os, 'symlink'): print ' Creating symlinks...' for machine, alias in ( ('Toshiba_HX-10', 'msx1'), ('Philips_NMS_8250', 'msx2'), ('Panasonic_FS-A1WSX', 'msx2plus'), ('Panasonic_FS-A1GT', 'turbor'), ): installSymlink( machine + ".xml", installPrefix + shareDestDir + '/machines/' + alias + ".xml" ) if symlinkForBinary and installPrefix == '': def createSymlinkToBinary(linkDir): if linkDir != binaryDestDir and isdir(linkDir): try: installSymlink( binaryDestDir + '/' + binaryFileName, linkDir + '/' + binaryFileName ) except OSError: return False else: return True else: return False success = createSymlinkToBinary('/usr/local/bin') if not success: createSymlinkToBinary(expanduser('~/bin')) def main( installPrefix, binaryDestDir, shareDestDir, docDestDir, binaryBuildPath, targetPlatform, verboseStr, cbiosStr ): customVars = extractMakeVariables('build/custom.mk') try: verbose = parseBool(verboseStr) cbios = parseBool(cbiosStr) symlinkForBinary = parseBool(customVars['SYMLINK_FOR_BINARY']) except ValueError, ex: print >> sys.stderr, 'Invalid argument:', ex sys.exit(2) if installPrefix and not installPrefix.endswith('/'): # Just in case the destination directories are not absolute. installPrefix += '/' if verbose: print 'Installing openMSX:' try: installAll( installPrefix, binaryDestDir, shareDestDir, docDestDir, binaryBuildPath, targetPlatform, cbios, symlinkForBinary ) except IOError, ex: print >> sys.stderr, 'Installation failed:', ex sys.exit(1) if verbose: print 'Installation complete... have fun!' print ( 'Notice: if you want to emulate real MSX systems and not only the ' 'free C-BIOS machines, put the system ROMs in one of the following ' 'directories: %s/systemroms or ' '~/.openMSX/share/systemroms\n' 'If you want openMSX to find MSX software referred to from replays ' 'or savestates you get from your friends, copy that MSX software to ' '%s/software or ' '~/.openMSX/share/software' ) % (shareDestDir, shareDestDir) if __name__ == '__main__': if len(sys.argv) == 9: main(*sys.argv[1 : ]) else: print >> sys.stderr, \ 'Usage: python install.py ' \ 'DESTDIR INSTALL_BINARY_DIR INSTALL_SHARE_DIR INSTALL_DOC_DIR ' \ 'BINARY_FULL OPENMSX_TARGET_OS INSTALL_VERBOSE INSTALL_CONTRIB' sys.exit(2) openMSX-RELEASE_0_14_0/build/libraries.py000066400000000000000000000434711314057512400200670ustar00rootroot00000000000000# Some notes about static linking: # There are two ways of linking to static library: using the -l command line # option or specifying the full path to the library file as one of the inputs. # When using the -l option, the library search paths will be searched for a # dynamic version of the library, if that is not found, the search paths will # be searched for a static version of the library. This means we cannot force # static linking of a library this way. It is possible to force static linking # of all libraries, but we want to control it per library. # Conclusion: We have to specify the full path to each library that should be # linked statically. from executils import captureStdout, shjoin from msysutils import msysActive, msysPathToNative from os import listdir from os.path import isdir, isfile from os import environ class Library(object): libName = None makeName = None header = None configScriptName = None dynamicLibsOption = '--libs' staticLibsOption = None function = None # TODO: A library can give an application compile time and run time # dependencies on other libraries. For example SDL_ttf depends on # FreeType only at run time, but depends on SDL both compile time # and run time, since SDL is part of its interface and FreeType is # only used by the implementation. As a result, it is possible to # compile against SDL_ttf without having the FreeType headers # installed. But our getCompileFlags() does not support this. # In pkg-config these are called private dependencies. dependsOn = () @classmethod def isSystemLibrary(cls, platform): # pylint: disable-msg=W0613 '''Returns True iff this library is a system library on the given platform. A system library is a library that is available systemwide in the minimal installation of the OS. The default implementation returns False. ''' return False @classmethod def getConfigScript( # pylint: disable-msg=W0613 cls, platform, linkStatic, distroRoot ): scriptName = cls.configScriptName if scriptName is None: return None elif platform == 'dingux' and cls.isSystemLibrary(platform): # TODO: A generic mechanism for locating config scripts in SDKs. # Note that distroRoot is for non-system libs only. # Trying a path relative to the compiler location would # probably work well. return '/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/%s' % scriptName elif distroRoot is None: return scriptName else: return '%s/bin/%s' % (distroRoot, scriptName) @classmethod def getHeaders(cls, platform): # pylint: disable-msg=W0613 header = cls.header return header if hasattr(header, '__iter__') else (header, ) @classmethod def getLibName(cls, platform): # pylint: disable-msg=W0613 return cls.libName @classmethod def getCompileFlags(cls, platform, linkStatic, distroRoot): if platform == 'android': return environ['ANDROID_CXXFLAGS'] configScript = cls.getConfigScript(platform, linkStatic, distroRoot) if configScript is not None: flags = [ '`%s --cflags`' % configScript ] elif distroRoot is None or cls.isSystemLibrary(platform): flags = [] else: flags = [ '-I%s/include' % distroRoot ] dependentFlags = [ librariesByName[name].getCompileFlags( platform, linkStatic, distroRoot ) for name in cls.dependsOn ] return ' '.join(flags + dependentFlags) @classmethod def getLinkFlags(cls, platform, linkStatic, distroRoot): if platform == 'android': return environ['ANDROID_LDFLAGS'] configScript = cls.getConfigScript(platform, linkStatic, distroRoot) if configScript is not None: libsOption = ( cls.dynamicLibsOption if not linkStatic or cls.isSystemLibrary(platform) else cls.staticLibsOption ) if libsOption is not None: return '`%s %s`' % (configScript, libsOption) if distroRoot is None or cls.isSystemLibrary(platform): return '-l%s' % cls.getLibName(platform) else: flags = [ '%s/lib/lib%s.a' % (distroRoot, cls.getLibName(platform)) ] if linkStatic else [ '-L%s/lib -l%s' % (distroRoot, cls.getLibName(platform)) ] dependentFlags = [ librariesByName[name].getLinkFlags( platform, linkStatic, distroRoot ) for name in cls.dependsOn ] return ' '.join(flags + dependentFlags) @classmethod def getVersion(cls, platform, linkStatic, distroRoot): '''Returns the version of this library, "unknown" if there is no mechanism to retrieve the version, None if there is a mechanism to retrieve the version but it failed, or a callable that takes a CompileCommand and a log stream as its arguments and returns the version or None if retrieval failed. ''' configScript = cls.getConfigScript(platform, linkStatic, distroRoot) if configScript is None: return 'unknown' else: return '`%s --version`' % configScript class ALSA(Library): libName = 'asound' makeName = 'ALSA' header = '' function = 'snd_seq_open' @classmethod def isSystemLibrary(cls, platform): return platform in ('dingux',) @classmethod def getLinkFlags(cls, platform, linkStatic, distroRoot): flags = super(ALSA, cls).getLinkFlags(platform, linkStatic, distroRoot) if linkStatic: flags += ' -lpthread' return flags @classmethod def getVersion(cls, platform, linkStatic, distroRoot): def execute(cmd, log): version = cmd.expand(log, cls.getHeaders(platform), 'SND_LIB_VERSION_STR' ) return None if version is None else version.strip('"') return execute class FreeType(Library): libName = 'freetype' makeName = 'FREETYPE' header = ('', 'FT_FREETYPE_H') configScriptName = 'freetype-config' function = 'FT_Open_Face' @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') @classmethod def getConfigScript(cls, platform, linkStatic, distroRoot): if platform in ('netbsd', 'openbsd'): if distroRoot == '/usr/local': # FreeType is located in the X11 tree, not the ports tree. distroRoot = '/usr/X11R6' return super(FreeType, cls).getConfigScript( platform, linkStatic, distroRoot ) @classmethod def getVersion(cls, platform, linkStatic, distroRoot): configScript = cls.getConfigScript(platform, linkStatic, distroRoot) return '`%s --ftversion`' % configScript class GL(Library): libName = 'GL' makeName = 'GL' function = 'glGenTextures' @classmethod def isSystemLibrary(cls, platform): # On *BSD, OpenGL is in ports, not in the base system. return not platform.endswith('bsd') @classmethod def getHeaders(cls, platform): if platform == 'darwin': return ('', ) else: return ('', ) @classmethod def getCompileFlags(cls, platform, linkStatic, distroRoot): if platform in ('netbsd', 'openbsd'): return '-I/usr/X11R6/include -I/usr/X11R7/include' else: return super(GL, cls).getCompileFlags( platform, linkStatic, distroRoot ) @classmethod def getLinkFlags(cls, platform, linkStatic, distroRoot): if platform == 'darwin': return '-framework OpenGL' elif platform.startswith('mingw'): return '-lopengl32' elif platform in ('netbsd', 'openbsd'): return '-L/usr/X11R6/lib -L/usr/X11R7/lib -lGL' else: return super(GL, cls).getLinkFlags(platform, linkStatic, distroRoot) @classmethod def getVersion(cls, platform, linkStatic, distroRoot): def execute(cmd, log): versionPairs = tuple( ( major, minor ) for major in range(1, 10) for minor in range(0, 10) ) version = cmd.expand(log, cls.getHeaders(platform), *( 'GL_VERSION_%d_%d' % pair for pair in versionPairs )) try: return '%d.%d' % max( ver for ver, exp in zip(versionPairs, version) if exp is not None ) except ValueError: return None return execute class GLEW(Library): makeName = 'GLEW' header = '' function = 'glewInit' dependsOn = ('GL', ) @classmethod def getLibName(cls, platform): if platform.startswith('mingw'): return 'glew32' else: return 'GLEW' @classmethod def getCompileFlags(cls, platform, linkStatic, distroRoot): flags = super(GLEW, cls).getCompileFlags( platform, linkStatic, distroRoot ) if platform.startswith('mingw') and linkStatic: return '%s -DGLEW_STATIC' % flags else: return flags class LibPNG(Library): libName = 'png16' makeName = 'PNG' header = '' configScriptName = 'libpng-config' dynamicLibsOption = '--ldflags' function = 'png_write_image' dependsOn = ('ZLIB', ) @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') class OGG(Library): libName = 'ogg' makeName = 'OGG' header = '' function = 'ogg_stream_init' @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') class SDL(Library): libName = 'SDL' makeName = 'SDL' header = '' configScriptName = 'sdl-config' staticLibsOption = '--static-libs' function = 'SDL_Init' @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') class SDL_ttf(Library): libName = 'SDL_ttf' makeName = 'SDL_TTF' header = '' function = 'TTF_OpenFont' dependsOn = ('SDL', 'FREETYPE') @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') @classmethod def getLinkFlags(cls, platform, linkStatic, distroRoot): flags = super(SDL_ttf, cls).getLinkFlags( platform, linkStatic, distroRoot ) if not linkStatic: # Because of the SDLmain trickery, we need SDL's link flags too # on some platforms even though we're linking dynamically. flags += ' ' + SDL.getLinkFlags(platform, linkStatic, distroRoot) return flags @classmethod def getVersion(cls, platform, linkStatic, distroRoot): def execute(cmd, log): version = cmd.expand(log, cls.getHeaders(platform), 'SDL_TTF_MAJOR_VERSION', 'SDL_TTF_MINOR_VERSION', 'SDL_TTF_PATCHLEVEL', ) return None if None in version else '%s.%s.%s' % version return execute class TCL(Library): libName = 'tcl' makeName = 'TCL' header = '' function = 'Tcl_CreateInterp' @classmethod def isSystemLibrary(cls, platform): return platform in ('android',) @classmethod def getTclConfig(cls, platform, distroRoot): '''Tcl has a config script that is unlike the typical lib-config script. Information is gathered by sourcing the config script, instead of executing it and capturing the queried value from stdout. This script is located in a library directory, not in a directory in the PATH. Also, it does not have the executable bit set. This method returns the location of the Tcl config script, or None if it could not be found. ''' if hasattr(cls, 'tclConfig'): # Return cached value. return cls.tclConfig def iterLocations(): if platform == 'android': # Under Android, the tcl set-up apparently differs from # other cross-platform setups. the search algorithm to find the # directory that will contain the tclConfig.sh script and the shared libs # is not applicable to Android. Instead, immediately return the correct # subdirectories to the routine that invokes iterLocations() sdl_android_port_path = environ['SDL_ANDROID_PORT_PATH'] libpath = sdl_android_port_path + '/project/libs/armeabi' yield libpath tclpath = sdl_android_port_path + '/project/jni/tcl8.5/unix' yield tclpath else: if distroRoot is None or cls.isSystemLibrary(platform): if msysActive(): roots = (msysPathToNative('/mingw32'), ) else: roots = ('/usr/local', '/usr') else: roots = (distroRoot, ) for root in roots: if isdir(root): for libdir in ('lib', 'lib64', 'lib/tcl'): libpath = root + '/' + libdir if isdir(libpath): yield libpath for entry in listdir(libpath): if entry.startswith('tcl8.'): tclpath = libpath + '/' + entry if isdir(tclpath): yield tclpath tclConfigs = {} log = open('derived/tcl-search.log', 'w') print >> log, 'Looking for Tcl...' try: for location in iterLocations(): path = location + '/tclConfig.sh' if isfile(path): print >> log, 'Config script:', path text = captureStdout( log, "sh -c '. %s && echo %s'" % ( path, '$TCL_MAJOR_VERSION $TCL_MINOR_VERSION' ) ) if text is not None: try: # pylint: disable-msg=E1103 major, minor = text.split() version = int(major), int(minor) except ValueError: pass else: print >> log, 'Found: version %d.%d' % version tclConfigs[path] = version try: # Minimum required version is 8.5. # Pick the oldest possible version to minimize the risk of # running into incompatible changes. tclConfig = min( ( version, path ) for path, version in tclConfigs.iteritems() if version >= (8, 5) )[1] except ValueError: tclConfig = None print >> log, 'No suitable versions found.' else: print >> log, 'Selected:', tclConfig finally: log.close() cls.tclConfig = tclConfig return tclConfig @classmethod def evalTclConfigExpr(cls, platform, distroRoot, expr, description): tclConfig = cls.getTclConfig(platform, distroRoot) if tclConfig is None: return None log = open('derived/tcl-search.log', 'a') try: print >> log, 'Getting Tcl %s...' % description text = captureStdout( log, shjoin([ 'sh', '-c', '. %s && eval "echo \\"%s\\""' % (tclConfig, expr) ]) ) if text is not None: print >> log, 'Result: %s' % text.strip() finally: log.close() return None if text is None else text.strip() @classmethod def getCompileFlags(cls, platform, linkStatic, distroRoot): if platform == 'android': # Use the current ANDROID cross-compilation flags and not the TCL flags. Otherwise, the # wrong version of libstdc++ will end-up on the include path; the minimal Android NDK # version instead of the more complete GNU version. This is because TCL for Android has # been configured with the minimal libstdc++ on the include path in the C(XX) flags and # not with the more complete GNU version return environ['ANDROID_CXXFLAGS'] wantShared = not linkStatic or cls.isSystemLibrary(platform) # The -DSTATIC_BUILD is a hack to avoid including the complete # TCL_DEFS (see 9f1dbddda2) but still being able to link on # MinGW (tcl.h depends on this being defined properly). return cls.evalTclConfigExpr( platform, distroRoot, '${TCL_INCLUDE_SPEC}' + ('' if wantShared else ' -DSTATIC_BUILD'), 'compile flags' ) @classmethod def getLinkFlags(cls, platform, linkStatic, distroRoot): if platform == 'android': # Use the current ANDROID cross-compilation flags and not the TCL flags to # prevent issues with libstdc++ version. See also getCompileFlags() return environ['ANDROID_LDFLAGS'] # Tcl can be built as a shared or as a static library, but not both. # Check whether the library type of Tcl matches the one we want. wantShared = not linkStatic or cls.isSystemLibrary(platform) tclShared = cls.evalTclConfigExpr( platform, distroRoot, '${TCL_SHARED_BUILD}', 'library type (shared/static)' ) log = open('derived/tcl-search.log', 'a') try: if tclShared == '0': if wantShared: print >> log, ( 'Dynamic linking requested, but Tcl installation has ' 'static library.' ) return None elif tclShared == '1': if not wantShared: print >> log, ( 'Static linking requested, but Tcl installation has ' 'dynamic library.' ) return None else: print >> log, ( 'Unable to determine whether Tcl installation has ' 'shared or static library.' ) return None finally: log.close() # Now get the link flags. if wantShared: return cls.evalTclConfigExpr( platform, distroRoot, '${TCL_LIB_SPEC}', 'dynamic link flags' ) else: return cls.evalTclConfigExpr( platform, distroRoot, '${TCL_EXEC_PREFIX}/lib/${TCL_LIB_FILE} ${TCL_LIBS}', 'static link flags' ) @classmethod def getVersion(cls, platform, linkStatic, distroRoot): return cls.evalTclConfigExpr( platform, distroRoot, '${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_PATCH_LEVEL}', 'version' ) class Theora(Library): libName = 'theoradec' makeName = 'THEORA' header = '' function = 'th_decode_ycbcr_out' dependsOn = ('OGG', ) @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') class Vorbis(Library): libName = 'vorbis' makeName = 'VORBIS' header = '' function = 'vorbis_synthesis_pcmout' dependsOn = ('OGG', ) @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') class ZLib(Library): libName = 'z' makeName = 'ZLIB' header = '' function = 'inflate' @classmethod def isSystemLibrary(cls, platform): return platform in ('android', 'dingux') @classmethod def getVersion(cls, platform, linkStatic, distroRoot): def execute(cmd, log): version = cmd.expand(log, cls.getHeaders(platform), 'ZLIB_VERSION') return None if version is None else version.strip('"') return execute # Build a dictionary of libraries using introspection. def _discoverLibraries(localObjects): for obj in localObjects: if isinstance(obj, type) and issubclass(obj, Library): if not (obj is Library): yield obj.makeName, obj librariesByName = dict(_discoverLibraries(locals().itervalues())) def allDependencies(makeNames): '''Compute the set of all directly and indirectly required libraries to build and use the given set of libraries. Returns the make names of the required libraries. ''' # Compute the reflexive-transitive closure. transLibs = set() newLibs = set(makeNames) while newLibs: transLibs.update(newLibs) newLibs = set( depMakeName for makeName in newLibs for depMakeName in librariesByName[makeName].dependsOn if depMakeName not in transLibs ) return transLibs openMSX-RELEASE_0_14_0/build/list_system_libs.py000066400000000000000000000007401314057512400214730ustar00rootroot00000000000000# Prints the Make names of those libraries that are present in the base OS. from libraries import librariesByName def main(platform): systemLibs = set( name for name, library in librariesByName.iteritems() if library.isSystemLibrary(platform) ) print ' '.join(sorted(systemLibs)) if __name__ == '__main__': import sys if len(sys.argv) == 2: main(*sys.argv[1 : ]) else: print >> sys.stderr, ( 'Usage: python list_system_libs.py TARGET_OS' ) sys.exit(2) openMSX-RELEASE_0_14_0/build/main.mk000066400000000000000000000511601314057512400170100ustar00rootroot00000000000000# openMSX Build System # ==================== # # This is the home made build system for openMSX, which replaced the # autoconf/automake combo. # # Used a lot of ideas from Peter Miller's excellent paper # "Recursive Make Considered Harmful". # http://miller.emu.id.au/pmiller/books/rmch/ # Verbosity # ========= # V=0: Summary only # V=1: Command only # V=2: Summary + command V?=0 SUM:=@echo ifeq ($V,0) CMD:=@ else CMD:= ifeq ($V,1) SUM:=@\# else ifneq ($V,2) $(warning Unsupported value for verbosity flag "V": $V) endif endif # Python Interpreter # ================== # We need Python from the 2.x series, version 2.6 or higher. # Usually this executable is available as just "python", but on some systems # you might have to be more specific, for example "python2" or "python2.6". # Or if the Python interpreter is not in the search path, you can specify its # full path. ifeq ($(PYTHON),) PYTHON:=$(shell build/python-search.sh) ifeq ($(PYTHON),) $(error No suitable Python interpreter found. Please install Python version 2.x where x >= 5. If your Python interpreter is installed in a non-standard location, please set the environment variable PYTHON to the full path of the interpreter binary.) endif endif $(info Using Python: $(PYTHON)) # Delete on Error # =============== # Delete output if rule fails. # This is a flag that applies to all rules. .DELETE_ON_ERROR: # Logical Targets # =============== ifneq ($(words $(MAKECMDGOALS)),1) $(error main.mk can only handle once goal at a time) endif # TODO: "dist" and "createsubs" are missing # TODO: more missing? # Logical targets which require dependency files. DEPEND_TARGETS:=all default install run bindist # Logical targets which do not require dependency files. NODEPEND_TARGETS:=clean config probe 3rdparty run-3rdparty staticbindist # Mark all logical targets as such. .PHONY: $(DEPEND_TARGETS) $(NODEPEND_TARGETS) # Settings # ======== # # There are platform specific settings and flavour specific settings. # platform: architecture, OS # flavour: optimisation levels, debugging, profiling # Function to check a variable has been defined and has a non-empty value. # Usage: $(call DEFCHECK,VARIABLE_NAME) DEFCHECK=$(strip \ $(if $(filter _undefined,_$(origin $(1))), \ $(error Variable $(1) is undefined) ) \ ) # Function to check a boolean variable has value "true" or "false". # Usage: $(call BOOLCHECK,VARIABLE_NAME) BOOLCHECK=$(DEFCHECK)$(strip \ $(if $(filter-out _true _false,_$($(1))), \ $(error Value of $(1) ("$($(1))") should be "true" or "false") ) \ ) # Will be added to by platform specific Makefile, by flavour specific Makefile # and by this Makefile. # Note: CXXFLAGS is overridable from the command line; COMPILE_FLAGS is not. # We use CXXFLAGS for flavour specific flags and COMPILE_FLAGS for # platform specific flags. CXXFLAGS:= COMPILE_FLAGS:=-pthread # Note: LDFLAGS are passed to the linker itself, LINK_FLAGS are passed to the # compiler in the link phase. LDFLAGS:= LINK_FLAGS:=-pthread # Flags that specify the target platform. # These should be inherited by the 3rd party libs Makefile. TARGET_FLAGS:= # Customisation # ============= include build/custom.mk $(call DEFCHECK,INSTALL_BASE) $(call BOOLCHECK,VERSION_EXEC) $(call BOOLCHECK,SYMLINK_FOR_BINARY) $(call BOOLCHECK,INSTALL_CONTRIB) # Platforms # ========= # Note: # A platform currently specifies both the host platform (performing the build) # and the target platform (running the created binary). When we have real # experience with cross-compilation, a more sophisticated system can be # designed. LINK_MODE:=$(if $(filter true,$(3RDPARTY_FLAG)),3RD_STA,SYS_DYN) # Do not perform autodetection if platform was specified by the user. ifneq ($(filter undefined,$(origin OPENMSX_TARGET_CPU) $(origin OPENMSX_TARGET_OS)),) DETECTSYS_SCRIPT:=build/detectsys.py LOCAL_PLATFORM:=$(shell $(PYTHON) $(DETECTSYS_SCRIPT)) ifeq ($(LOCAL_PLATFORM),) $(error No platform specified using OPENMSX_TARGET_CPU and OPENMSX_TARGET_OS and autodetection of local platform failed) endif OPENMSX_TARGET_CPU:=$(word 1,$(LOCAL_PLATFORM)) OPENMSX_TARGET_OS:=$(word 2,$(LOCAL_PLATFORM)) endif # OPENMSX_TARGET_CPU && OPENMSX_TARGET_OS PLATFORM:= ifneq ($(origin OPENMSX_TARGET_OS),undefined) ifneq ($(origin OPENMSX_TARGET_CPU),undefined) PLATFORM:=$(OPENMSX_TARGET_CPU)-$(OPENMSX_TARGET_OS) endif endif # Ignore rest of Makefile if autodetection was not performed yet. # Note that the include above will force a reload of the Makefile. ifneq ($(PLATFORM),) # Default flavour. $(call DEFCHECK,OPENMSX_TARGET_CPU) ifeq ($(OPENMSX_TARGET_CPU),x86) ifeq ($(filter darwin%,$(OPENMSX_TARGET_OS)),) # To run openMSX with decent speed, at least a Pentium 2 class machine # is needed, so let's optimise for that. OPENMSX_FLAVOUR?=i686 else # The system headers of OS X use SSE features, which are not available on # i686, so we only use the generic optimisation flags instead. OPENMSX_FLAVOUR?=opt endif else ifeq ($(OPENMSX_TARGET_CPU),ppc) OPENMSX_FLAVOUR?=ppc else ifeq ($(OPENMSX_TARGET_CPU),m68k) OPENMSX_FLAVOUR?=m68k else OPENMSX_FLAVOUR?=opt endif endif endif # Load OS specific settings. $(call DEFCHECK,OPENMSX_TARGET_OS) include build/platform-$(OPENMSX_TARGET_OS).mk # Check that all expected variables were defined by OS specific Makefile: # - library file name extension $(call DEFCHECK,LIBRARYEXT) # - executable file name extension $(call DEFCHECK,EXEEXT) # - platform supports symlinks? $(call BOOLCHECK,USE_SYMLINK) # Get CPU specific flags. TARGET_FLAGS+=$(shell $(PYTHON) build/cpu2flags.py $(OPENMSX_TARGET_CPU)) # Flavours # ======== # Load flavour specific settings. include build/flavour-$(OPENMSX_FLAVOUR).mk # Paths # ===== BUILD_PATH:=derived/$(PLATFORM)-$(OPENMSX_FLAVOUR) ifeq ($(3RDPARTY_FLAG),true) BUILD_PATH:=$(BUILD_PATH)-3rd endif # Own build of 3rd party libs. ifeq ($(3RDPARTY_FLAG),true) 3RDPARTY_INSTALL_DIR:=$(BUILD_PATH)/3rdparty/install endif SOURCES_PATH:=src BINARY_PATH:=$(BUILD_PATH)/bin BINARY_FILE:=openmsx$(EXEEXT) BINDIST_DIR:=$(BUILD_PATH)/bindist BINDIST_PACKAGE:= ifeq ($(VERSION_EXEC),true) REVISION:=$(shell PYTHONPATH=build $(PYTHON) -c \ "import version; print version.extractRevisionString()" \ ) BINARY_FULL:=$(BINARY_PATH)/openmsx-$(REVISION)$(EXEEXT) else BINARY_FULL:=$(BINARY_PATH)/$(BINARY_FILE) endif LIBRARY_FILE:=openmsx$(LIBRARYEXT) LIBRARY_PATH:=$(BUILD_PATH)/lib LIBRARY_FULL:=$(LIBRARY_PATH)/$(LIBRARY_FILE) BUILDINFO_SCRIPT:=build/buildinfo2code.py CONFIG_HEADER:=$(BUILD_PATH)/config/build-info.hh PROBE_SCRIPT:=build/probe.py PROBE_MAKE:=$(BUILD_PATH)/config/probed_defs.mk VERSION_SCRIPT:=build/version2code.py VERSION_HEADER:=$(BUILD_PATH)/config/Version.ii COMPONENTS_HEADER_SCRIPT:=build/components2code.py COMPONENTS_DEFS_SCRIPT:=build/components2defs.py COMPONENTS_HEADER:=$(BUILD_PATH)/config/components.hh COMPONENTS_DEFS:=$(BUILD_PATH)/config/components_defs.mk GENERATED_HEADERS:=$(VERSION_HEADER) $(CONFIG_HEADER) $(COMPONENTS_HEADER) # Configuration # ============= ifneq ($(filter $(DEPEND_TARGETS),$(MAKECMDGOALS)),) -include $(PROBE_MAKE) -include $(COMPONENTS_DEFS) endif # goal requires dependencies # Filesets # ======== SOURCE_DIRS:=$(sort $(shell find src -type d)) SOURCES_FULL:=$(foreach dir,$(SOURCE_DIRS),$(sort $(wildcard $(dir)/*.cc))) SOURCES_FULL:=$(filter-out %Test.cc,$(SOURCES_FULL)) SOURCES_FULL:=$(filter-out src/sound/generate%.cc,$(SOURCES_FULL)) # TODO: This doesn't work since MAX_SCALE_FACTOR is not a Make variable, # only a #define in build-info.hh. ifeq ($(MAX_SCALE_FACTOR),1) define SOURCES_UPSCALE Scanline Scaler2 Scaler3 Simple2xScaler Simple3xScaler SaI2xScaler SaI3xScaler Scale2xScaler Scale3xScaler HQ2xScaler HQ2xLiteScaler HQ3xScaler HQ3xLiteScaler RGBTriplet3xScaler MLAAScaler Multiply32 endef SOURCES_FULL:=$(filter-out $(foreach src,$(strip $(SOURCES_UPSCALE)),src/video/scalers/$(src).cc),$(SOURCES_FULL)) endif ifneq ($(COMPONENT_GL),true) SOURCES_FULL:=$(filter-out src/video/GL%.cc,$(SOURCES_FULL)) SOURCES_FULL:=$(filter-out src/video/SDLGL%.cc,$(SOURCES_FULL)) SOURCES_FULL:=$(filter-out src/video/scalers/GL%.cc,$(SOURCES_FULL)) endif ifneq ($(COMPONENT_LASERDISC),true) SOURCES_FULL:=$(filter-out src/laserdisc/%.cc,$(SOURCES_FULL)) SOURCES_FULL:=$(filter-out src/video/ld/%.cc,$(SOURCES_FULL)) endif ifneq ($(COMPONENT_ALSAMIDI),true) SOURCES_FULL:=$(filter-out src/serial/MidiSessionALSA.cc,$(SOURCES_FULL)) endif # Apply subset to sources list. SOURCES_FULL:=$(filter $(SOURCES_PATH)/$(OPENMSX_SUBSET)%,$(SOURCES_FULL)) ifeq ($(SOURCES_FULL),) $(error Sources list empty $(if \ $(OPENMSX_SUBSET),after applying subset "$(OPENMSX_SUBSET)*")) endif SOURCES:=$(SOURCES_FULL:$(SOURCES_PATH)/%.cc=%) DEPEND_PATH:=$(BUILD_PATH)/dep DEPEND_FULL:=$(addsuffix .d,$(addprefix $(DEPEND_PATH)/,$(SOURCES))) OBJECTS_PATH:=$(BUILD_PATH)/obj OBJECTS_FULL:=$(addsuffix .o,$(addprefix $(OBJECTS_PATH)/,$(SOURCES))) ifneq ($(filter mingw%,$(OPENMSX_TARGET_OS)),) RESOURCE_SRC:=src/resource/openmsx.rc RESOURCE_OBJ:=$(OBJECTS_PATH)/resources.o RESOURCE_SCRIPT:=build/win_resource.py RESOURCE_HEADER:=$(BUILD_PATH)/config/resource-info.h else RESOURCE_OBJ:= endif # Compiler and Flags # ================== COMPILE_FLAGS+=$(TARGET_FLAGS) LINK_FLAGS+=$(TARGET_FLAGS) # Determine compiler. CXX?=g++ WINDRES?=windres DEPEND_FLAGS:= ifneq ($(filter %clang++,$(CXX))$(filter clang++%,$(CXX)),) # Enable C++11 COMPILE_FLAGS+=-std=c++11 # Clang does support -Wunused-macros, but it triggers on SDL's headers, # causing way too many false positives that we cannot fix. COMPILE_FLAGS+=-Wall -Wextra -Wundef -Wno-invalid-offsetof -Wshadow # TODO: Remove the overloading from the code instead. COMPILE_FLAGS+=-Wno-overloaded-virtual # Hardware descriptions can contain constants that are not used in the code # but still useful as documentation. COMPILE_FLAGS+=-Wno-unused-const-variable CC:=$(shell clang++ -print-prog-name=clang) DEPEND_FLAGS+=-MP else ifneq ($(filter %g++,$(CXX))$(filter g++%,$(CXX))$(findstring /g++-,$(CXX)),) # Generic compilation flags. COMPILE_FLAGS+=-pipe # Enable C++11 COMPILE_FLAGS+=-std=c++11 # Stricter warning and error reporting. COMPILE_FLAGS+=-Wall -Wextra -Wundef -Wno-invalid-offsetof -Wunused-macros -Wdouble-promotion -Wmissing-declarations -Wshadow # Flag that is not accepted by old GCC versions. COMPILE_FLAGS+=$(shell \ echo | $(CXX) -E -Wno-missing-field-initializers - >/dev/null 2>&1 \ && echo -Wno-missing-field-initializers \ ) # -Wzero-as-null-pointer-constant is available from gcc-4.7 ## IMHO this is a useful but not very important warning. It triggers in ## quite a few places via macros defined in tcl8.5/tclDecls.h, so we can't ## easily suppress it. So for now I'll disable this warning again. ##COMPILE_FLAGS+=$(shell \ ## echo | $(CXX) -E -Wzero-as-null-pointer-constant - >/dev/null 2>&1 \ ## && echo -Wzero-as-null-pointer-constant \ ## ) # Empty definition of used headers, so header removal doesn't break things. DEPEND_FLAGS+=-MP # Plain C compiler, for the 3rd party libs. CC:=$(subst g++,gcc,$(CXX)) else ifneq ($(filter %gcc,$(CXX))$(filter gcc%,$(CXX)),) $(error Set CXX to your "g++" executable instead of "gcc") else $(warning Unsupported compiler: $(CXX), please update Makefile) endif endif endif # Strip binary? OPENMSX_STRIP?=false $(call BOOLCHECK,OPENMSX_STRIP) STRIP_SEPARATE:=false ifeq ($(OPENMSX_STRIP),true) ifeq ($(OPENMSX_TARGET_OS),darwin) # Current (mid-2006) GCC 4.x for OS X will strip too many symbols, # resulting in a binary that cannot run. # However, the separate "strip" tool does work correctly. STRIP_SEPARATE:=true else # Tell GCC to produce a stripped binary. LINK_FLAGS+=-s endif endif # Determine common compile flags. COMPILE_FLAGS+=$(addprefix -I,$(SOURCE_DIRS) $(BUILD_PATH)/config) # Determine common link flags. LINK_FLAGS_PREFIX:=-Wl, LINK_FLAGS+=$(addprefix $(LINK_FLAGS_PREFIX),$(LDFLAGS)) # Add compile and link flags for libraries (from COMPONENTS_DEFS). COMPILE_FLAGS+=$(LIBRARY_COMPILE_FLAGS) LINK_FLAGS+=$(LIBRARY_LINK_FLAGS) # Build Rules # =========== # Force a probe if "probe" target is passed explicitly. ifeq ($(MAKECMDGOALS),probe) probe: $(PROBE_MAKE) .PHONY: $(PROBE_MAKE) endif # Probe for headers and functions. $(PROBE_MAKE): $(PROBE_SCRIPT) build/custom.mk \ build/systemfuncs2code.py build/systemfuncs.py $(CMD)$(PYTHON) $(PROBE_SCRIPT) \ "$(CXX) $(TARGET_FLAGS)" \ $(@D) $(OPENMSX_TARGET_OS) $(LINK_MODE) "$(3RDPARTY_INSTALL_DIR)" $(CMD)touch $@ # Generate configuration header. # TODO: One platform file may include another, so the real solution would be # for the Python script to write dependency info. $(CONFIG_HEADER): $(BUILDINFO_SCRIPT) \ build/custom.mk build/platform-$(OPENMSX_TARGET_OS).mk $(CMD)$(PYTHON) $(BUILDINFO_SCRIPT) $@ \ $(OPENMSX_TARGET_OS) $(OPENMSX_TARGET_CPU) $(OPENMSX_FLAVOUR) \ $(INSTALL_SHARE_DIR) $(CMD)touch $@ # Generate version header. .PHONY: forceversionextraction forceversionextraction: $(VERSION_HEADER): forceversionextraction $(CMD)$(PYTHON) $(VERSION_SCRIPT) $@ # Generate components header. $(COMPONENTS_HEADER): $(COMPONENTS_HEADER_SCRIPT) $(PROBE_MAKE) \ build/components.py $(CMD)$(PYTHON) $(COMPONENTS_HEADER_SCRIPT) $@ $(PROBE_MAKE) $(CMD)touch $@ # Generate components Makefile. $(COMPONENTS_DEFS): $(COMPONENTS_DEFS_SCRIPT) $(PROBE_MAKE) \ build/components.py $(CMD)$(PYTHON) $(COMPONENTS_DEFS_SCRIPT) $@ $(PROBE_MAKE) $(CMD)touch $@ # Default target. ifeq ($(OPENMSX_TARGET_OS),darwin) all: app else ifeq ($(OPENMSX_TARGET_OS),android) all: $(LIBRARY_FULL) else all: $(BINARY_FULL) endif endif # This is a workaround for the lack of order-only dependencies in GNU Make # versions older than 3.80 (for example Mac OS X 10.3 still ships with 3.79). # It creates a dummy file, which is never modified after its initial creation. # If a rule that produces a file does not modify that file, Make considers the # target to be up-to-date. That way, the targets "init-dummy-file" depends on # will always be checked before compilation, but they will not cause all object # files to be considered outdated. INIT_DUMMY_FILE:=$(BUILD_PATH)/config/init-dummy-file $(INIT_DUMMY_FILE): config $(GENERATED_HEADERS) $(CMD)touch -a $@ # Print configuration. config: ifeq ($(COMPONENT_CORE),false) # Do not build if core component dependencies are not met. @echo 'Cannot build openMSX because essential libraries are unavailable.' @echo 'Please install the needed libraries and their header files and rerun "configure"' @false endif @echo "Build configuration:" @echo " Platform: $(PLATFORM)" @echo " Flavour: $(OPENMSX_FLAVOUR)" @echo " Compiler: $(CXX)" @echo " Subset: $(if $(OPENMSX_SUBSET),$(OPENMSX_SUBSET)*,full build)" # Include dependency files. ifneq ($(filter $(DEPEND_TARGETS),$(MAKECMDGOALS)),) -include $(DEPEND_FULL) endif # Clean up build tree of current flavour. clean: $(SUM) "Cleaning up..." $(CMD)rm -rf $(BUILD_PATH) # Create Makefiles in source subdirectories, to conveniently build a subset. ifeq ($(MAKECMDGOALS),createsubs) # Function that concatenates list items to form a single string. # Usage: $(call JOIN,TEXT) JOIN=$(if $(1),$(firstword $(1))$(call JOIN,$(wordlist 2,999999,$(1))),) RELPATH=$(call JOIN,$(patsubst %,../,$(subst /, ,$(@:%/GNUmakefile=%)))) SUB_MAKEFILES:=$(addsuffix GNUmakefile,$(sort $(dir $(SOURCES_FULL)))) createsubs: $(SUB_MAKEFILES) $(SUB_MAKEFILES): $(SUM) "Creating $@..." $(CMD)echo "export OPENMSX_SUBSET=$(@:$(SOURCES_PATH)/%GNUmakefile=%)" > $@ $(CMD)echo "all:" >> $@ $(CMD)echo " @\$$(MAKE) -C $(RELPATH) -f build/main.mk all" >> $@ # Force re-creation every time this target is run. .PHONY: $(SUB_MAKEFILES) endif # Compile and generate dependency files in one go. DEPEND_SUBST=$(patsubst $(SOURCES_PATH)/%.cc,$(DEPEND_PATH)/%.d,$<) $(OBJECTS_FULL): $(INIT_DUMMY_FILE) $(OBJECTS_FULL): $(OBJECTS_PATH)/%.o: $(SOURCES_PATH)/%.cc $(DEPEND_PATH)/%.d $(SUM) "Compiling $(patsubst $(SOURCES_PATH)/%,%,$<)..." $(CMD)mkdir -p $(@D) $(CMD)mkdir -p $(patsubst $(OBJECTS_PATH)%,$(DEPEND_PATH)%,$(@D)) $(CMD)$(CXX) \ $(DEPEND_FLAGS) -MMD -MF $(DEPEND_SUBST) \ -o $@ $(CXXFLAGS) $(COMPILE_FLAGS) -c $< $(CMD)touch $@ # Force .o file to be newer than .d file. # Generate dependencies that do not exist yet. # This is only in case some .d files have been deleted; # in normal operation this rule is never triggered. $(DEPEND_FULL): # Windows resources that are added to the executable. ifneq ($(filter mingw%,$(OPENMSX_TARGET_OS)),) $(RESOURCE_HEADER): $(INIT_DUMMY_FILE) forceversionextraction $(CMD)$(PYTHON) $(RESOURCE_SCRIPT) $@ $(RESOURCE_OBJ): $(RESOURCE_SRC) $(RESOURCE_HEADER) $(SUM) "Compiling resources..." $(CMD)mkdir -p $(@D) $(CMD)$(WINDRES) $(addprefix --include-dir=,$(^D)) -o $@ -i $< endif # Link executable. $(BINARY_FULL): $(OBJECTS_FULL) $(RESOURCE_OBJ) ifeq ($(OPENMSX_SUBSET),) $(SUM) "Linking $(notdir $@)..." $(CMD)mkdir -p $(@D) $(CMD)+$(CXX) -o $@ $(CXXFLAGS) $^ $(LINK_FLAGS) ifeq ($(STRIP_SEPARATE),true) $(SUM) "Stripping $(notdir $@)..." $(CMD)strip $@ endif ifeq ($(USE_SYMLINK),true) $(CMD)ln -sf $(@:derived/%=%) derived/$(BINARY_FILE) else $(CMD)cp $@ derived/$(BINARY_FILE) endif else $(SUM) "Not linking $(notdir $@) because only a subset was built." endif # subset $(LIBRARY_FULL): $(OBJECTS_FULL) $(RESOURCE_OBJ) $(SUM) "Linking $(notdir $@)..." $(CMD)mkdir -p $(@D) $(CMD)$(CXX) -o $@ $(CXXFLAGS) $^ $(LINK_FLAGS) # Run executable. run: all $(SUM) "Running $(notdir $(BINARY_FULL))..." $(CMD)$(BINARY_FULL) # Installation and Binary Packaging # ================================= ifneq ($(filter $(MAKECMDGOALS),bindist)$(filter $(OPENMSX_TARGET_OS),darwin),) # Create binary distribution directory. BINDIST_DIR:=$(BUILD_PATH)/bindist BINDIST_PACKAGE:= # Override install locations. INSTALL_ROOT:=$(BINDIST_DIR)/install ifneq ($(filter mingw%,$(OPENMSX_TARGET_OS)),) # In Windows the "share" dir is expected at the same level as the executable, # so do not put the executable in "bin". INSTALL_BINARY_DIR:=$(INSTALL_ROOT) else INSTALL_BINARY_DIR:=$(INSTALL_ROOT)/bin endif INSTALL_SHARE_DIR:=$(INSTALL_ROOT)/share INSTALL_DOC_DIR:=$(INSTALL_ROOT)/doc # C-BIOS should be included. INSTALL_CONTRIB:=true # Do not display header and post-install instructions. INSTALL_VERBOSE:=false .PHONY: bindist bindistclean bindist: install # Force removal of old destination dir before installing to new dir. install: bindistclean bindistclean: $(BINARY_FULL) $(SUM) "Removing any old binary package..." $(CMD)rm -rf $(BINDIST_DIR) $(CMD)$(if $(BINDIST_PACKAGE),rm -f $(BINDIST_PACKAGE),) $(SUM) "Creating binary package:" endif ifeq ($(OPENMSX_TARGET_OS),darwin) # Application directory for Darwin. # This handles the "bindist" target, but can also be used with the "install" # target to create an app folder but no DMG. include build/package-darwin/app.mk else ifeq ($(OPENMSX_TARGET_OS),dingux) # ZIP file package for Dingux. include build/package-dingux/opk.mk else # Note: Use OPENMSX_INSTALL only to create binary packages. # To change installation dir for actual installations, edit "custom.mk". OPENMSX_INSTALL?=$(INSTALL_BASE) # Allow full customization of locations, used by Debian packaging. INSTALL_BINARY_DIR?=$(OPENMSX_INSTALL)/bin INSTALL_SHARE_DIR?=$(OPENMSX_INSTALL)/share INSTALL_DOC_DIR?=$(OPENMSX_INSTALL)/doc INSTALL_VERBOSE?=true endif endif # DESTDIR is a convention shared by at least GNU and FreeBSD to specify a path # prefix that will be used for all installed files. install: $(BINARY_FULL) $(CMD)$(PYTHON) build/install.py "$(DESTDIR)" \ $(INSTALL_BINARY_DIR) $(INSTALL_SHARE_DIR) $(INSTALL_DOC_DIR) \ $(BINARY_FULL) $(OPENMSX_TARGET_OS) \ $(INSTALL_VERBOSE) $(INSTALL_CONTRIB) # Source Packaging # ================ dist: $(CMD)$(PYTHON) build/gitdist.py # Binary Packaging Using 3rd Party Libraries # ========================================== # Recursive invocation with 3RDPARTY_FLAG=true. 3rdparty: $(MAKE) -f build/main.mk run-3rdparty \ OPENMSX_TARGET_CPU=$(OPENMSX_TARGET_CPU) \ OPENMSX_TARGET_OS=$(OPENMSX_TARGET_OS) \ OPENMSX_FLAVOUR=$(OPENMSX_FLAVOUR) \ 3RDPARTY_FLAG=true \ PYTHON=$(PYTHON) # Call third party Makefile with the right arguments. # This is an internal target, users should select "3rdparty" instead. run-3rdparty: $(MAKE) -f build/3rdparty.mk \ BUILD_PATH=$(BUILD_PATH)/3rdparty \ OPENMSX_TARGET_CPU=$(OPENMSX_TARGET_CPU) \ OPENMSX_TARGET_OS=$(OPENMSX_TARGET_OS) \ _CC=$(CC) _CFLAGS="$(TARGET_FLAGS) $(CXXFLAGS)" \ _LDFLAGS="$(TARGET_FLAGS)" \ WINDRES=$(WINDRES) \ LINK_MODE=$(LINK_MODE) \ PYTHON=$(PYTHON) staticbindist: 3rdparty $(MAKE) -f build/main.mk bindist \ OPENMSX_TARGET_CPU=$(OPENMSX_TARGET_CPU) \ OPENMSX_TARGET_OS=$(OPENMSX_TARGET_OS) \ OPENMSX_FLAVOUR=$(OPENMSX_FLAVOUR) \ 3RDPARTY_FLAG=true \ PYTHON=$(PYTHON) endif # PLATFORM openMSX-RELEASE_0_14_0/build/makeutils.py000066400000000000000000000076311314057512400201070ustar00rootroot00000000000000from os.path import isdir import re def filterLines(lines, regex): '''Filters each line of the given line iterator using the given regular expression string. For each match, a tuple containing the text matching each capture group from the regular expression is yielded. ''' matcher = re.compile(regex) for line in lines: if line.endswith('\n'): line = line[ : -1] match = matcher.match(line) if match: yield match.groups() def filterFile(filePath, regex): '''Filters each line of the given text file using the given regular expression string. For each match, a tuple containing the text matching each capture group from the regular expression is yielded. ''' inp = open(filePath, 'r') try: for groups in filterLines(inp, regex): yield groups finally: inp.close() def joinContinuedLines(lines): '''Iterates through the given lines, replacing lines that are continued using a trailing backslash with a single line. ''' buf = '' for line in lines: if line.endswith('\\\n'): buf += line[ : -2] elif line.endswith('\\'): buf += line[ : -1] else: yield buf + line buf = '' if buf: raise ValueError('Continuation on last line') _reEval = re.compile('(\$\(|\))') def evalMakeExpr(expr, makeVars): '''Evaluates variable references in an expression. Raises ValueError if there is a syntax error in the expression. Raises KeyError if the expression references a non-existing variable. ''' stack = [ [] ] for part in _reEval.split(expr): if part == '$(': stack.append([]) elif part == ')' and len(stack) != 1: name = ''.join(stack.pop()) if name.startswith('addprefix '): prefix, args = name[len('addprefix') : ].split(',') prefix = prefix.strip() value = ' '.join(prefix + arg for arg in args.split()) elif name.startswith('addsuffix '): suffix, args = name[len('addsuffix') : ].split(',') suffix = suffix.strip() value = ' '.join(arg + suffix for arg in args.split()) elif name.startswith('shell '): # Unsupported; assume result is never used. value = '?' elif name.startswith('call DIR_IF_EXISTS,'): # This is our function, not a Make function, but the goal is # not to emulate Make, so we emulate our function instead. path = name[len('call DIR_IF_EXISTS,'): ] value = path if isdir(path) else '' elif name.isdigit(): # This is a function argument; assume the evaluated result is # never used. value = '?' else: value = makeVars[name] stack[-1].append(value) else: stack[-1].append(part) if len(stack) != 1: raise ValueError('Open without close in "%s"' % expr) return ''.join(stack.pop()) def extractMakeVariables(filePath, makeVars = None): '''Extract all variable definitions from the given Makefile. The optional makeVars argument is a dictionary containing the already defined variables. These variables will be included in the output; the given dictionary is not modified. Returns a dictionary that maps each variable name to its value. ''' makeVars = {} if makeVars is None else dict(makeVars) inp = open(filePath, 'r') try: for name, assign, value in filterLines( joinContinuedLines(inp), r'[ ]*([A-Za-z0-9_]+)[ ]*([+:]?=)(.*)' ): if assign == '=': makeVars[name] = value.strip() elif assign == ':=': makeVars[name] = evalMakeExpr(value, makeVars).strip() elif assign == '+=': # Note: Make will or will not evaluate the added expression # depending on how the variable was originally defined, # but we don't store that information. makeVars[name] = makeVars[name] + ' ' + value.strip() else: assert False, assign finally: inp.close() return makeVars def parseBool(valueStr): '''Parses a string containing a boolean value. Accepted values are "true" and "false"; anything else raises ValueError. ''' if valueStr == 'true': return True elif valueStr == 'false': return False else: raise ValueError('Invalid boolean "%s"' % valueStr) openMSX-RELEASE_0_14_0/build/msvc/000077500000000000000000000000001314057512400165005ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/build/msvc/genconfig.py000066400000000000000000000041371314057512400210160ustar00rootroot00000000000000# Generates configuration headers for VC++ builds import sys import os.path import outpututils import buildinfo2code import components2code import systemfuncs2code import win_resource import version2code # # platform: one of { Win32, x64 } # configuration: one of { Debug, Developer, Release } # outputPath: the location in which to generate config files # def genConfig(platform, configuration, outputPath): buildPath = 'build' msvcPath = os.path.join(buildPath, 'msvc') probeMakePath = os.path.join(msvcPath, 'probed_defs.mk') # # build-info.hh # buildInfoHeader = os.path.join(outputPath, 'build-info.hh') targetPlatform = 'mingw32' if platform == 'Win32': targetCPU = 'x86' elif platform == 'x64': targetCPU = 'x86_64' else: raise ValueError('Invalid platform: ' + platform) flavour = configuration installShareDir = '/opt/openMSX/share' #not used on Windows, so whatever generator = buildinfo2code.iterBuildInfoHeader(targetPlatform, targetCPU, flavour, installShareDir) outpututils.rewriteIfChanged(buildInfoHeader, generator) # # components.hh # componentsHeader = os.path.join(outputPath, 'components.hh') generator = components2code.iterComponentsHeader(probeMakePath) outpututils.rewriteIfChanged(componentsHeader, generator) # # systemfuncs.hh # systemFuncsHeader = os.path.join(outputPath, 'systemfuncs.hh') generator = systemfuncs2code.iterSystemFuncsHeader(systemfuncs2code.getSystemFuncsInfo()) outpututils.rewriteIfChanged(systemFuncsHeader, generator) # # resource-info.hh # resourceInfoHeader = os.path.join(outputPath, 'resource-info.h') generator = win_resource.iterResourceHeader() outpututils.rewriteIfChanged(resourceInfoHeader, generator) # # version.ii # versionHeader = os.path.join(outputPath, 'version.ii') generator = version2code.iterVersionInclude() outpututils.rewriteIfChanged(versionHeader, generator) if len(sys.argv) == 4: genConfig(sys.argv[1], sys.argv[2], sys.argv[3]) else: print >> sys.stderr, 'Usage: python genconfig.py platform configuration outputPath' sys.exit(2) openMSX-RELEASE_0_14_0/build/msvc/openmsx.sln000066400000000000000000000033171314057512400207130ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Express 2013 for Windows Desktop VisualStudioVersion = 12.0.30110.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openmsx", "openmsx.vcxproj", "{9563D96E-BBDC-410C-8BED-189102B0866F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Developer|Win32 = Developer|Win32 Developer|x64 = Developer|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {9563D96E-BBDC-410C-8BED-189102B0866F}.Debug|Win32.ActiveCfg = Debug|Win32 {9563D96E-BBDC-410C-8BED-189102B0866F}.Debug|Win32.Build.0 = Debug|Win32 {9563D96E-BBDC-410C-8BED-189102B0866F}.Debug|x64.ActiveCfg = Debug|x64 {9563D96E-BBDC-410C-8BED-189102B0866F}.Debug|x64.Build.0 = Debug|x64 {9563D96E-BBDC-410C-8BED-189102B0866F}.Developer|Win32.ActiveCfg = Developer|Win32 {9563D96E-BBDC-410C-8BED-189102B0866F}.Developer|Win32.Build.0 = Developer|Win32 {9563D96E-BBDC-410C-8BED-189102B0866F}.Developer|x64.ActiveCfg = Developer|x64 {9563D96E-BBDC-410C-8BED-189102B0866F}.Developer|x64.Build.0 = Developer|x64 {9563D96E-BBDC-410C-8BED-189102B0866F}.Release|Win32.ActiveCfg = Release|Win32 {9563D96E-BBDC-410C-8BED-189102B0866F}.Release|Win32.Build.0 = Release|Win32 {9563D96E-BBDC-410C-8BED-189102B0866F}.Release|x64.ActiveCfg = Release|x64 {9563D96E-BBDC-410C-8BED-189102B0866F}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal openMSX-RELEASE_0_14_0/build/msvc/openmsx.vcxproj000066400000000000000000003200541314057512400216120ustar00rootroot00000000000000 Debug Win32 Debug x64 Developer Win32 Developer x64 Release Win32 Release x64 {9563D96E-BBDC-410C-8BED-189102B0866F} openmsx Win32Proj x64 Application Unicode v141 Application Unicode true v141 Application Unicode v141 Application Unicode v141 Application Unicode true v141 Application Unicode v141 <_ProjectFileVersion>10.0.30319.1 $(OpenMSXOutDir)\ $(OpenMSXIntDir)\ $(OpenMSXOutDir)\ $(OpenMSXIntDir)\ $(OpenMSXOutDir)\ $(OpenMSXIntDir)\ $(OpenMSXOutDir)\ $(OpenMSXIntDir)\ $(OpenMSXOutDir)\ $(OpenMSXIntDir)\ $(OpenMSXOutDir)\ $(OpenMSXIntDir)\ /MP %(AdditionalOptions) Disabled $(OpenMSXConfigDir);$(DXSDK_DIR)\Include;$(ThirdPartySrcDir)\$(LibNameFreeType);$(ThirdPartySrcDir)\$(LibNameGlew)\include;$(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameSDL_ttf);$(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameZlib);$(OpenMSXSrcDir);$(OpenMSXSrcDir)\cassette;$(OpenMSXSrcDir)\commands;$(OpenMSXSrcDir)\config;$(OpenMSXSrcDir)\console;$(OpenMSXSrcDir)\cpu;$(OpenMSXSrcDir)\debugger;$(OpenMSXSrcDir)\events;$(OpenMSXSrcDir)\fdc;$(OpenMSXSrcDir)\file;$(OpenMSXSrcDir)\ide;$(OpenMSXSrcDir)\input;$(OpenMSXSrcDir)\laserdisc;$(OpenMSXSrcDir)\memory;$(OpenMSXSrcDir)\resource;$(OpenMSXSrcDir)\security;$(OpenMSXSrcDir)\serial;$(OpenMSXSrcDir)\settings;$(OpenMSXSrcDir)\sound;$(OpenMSXSrcDir)\thread;$(OpenMSXSrcDir)\utils;$(OpenMSXSrcDir)\video;$(OpenMSXSrcDir)\video\scalers;$(OpenMSXSrcDir)\video\ld;$(OpenMSXSrcDir)\video\v9990;%(AdditionalIncludeDirectories) __SSE2__;WIN32;WIN32_LEAN_AND_MEAN;UNICODE;_UNICODE;SECURITY_WIN32;DEBUG;_DEBUG;_CONSOLE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NOMINMAX;GLEW_STATIC;STATIC_BUILD;%(PreprocessorDefinitions) MultiThreadedDebug Level4 ProgramDatabase 4324;4063;4121;4125;4127;4189;4201;4244;4310;4355;4505;4512;4611;4702;%(DisableSpecificWarnings) $(OpenMSXConfigDir);$(ThirdPartySrcDir)\$(LibNameTcl)\generic;%(AdditionalIncludeDirectories) wsock32.lib;winmm.lib;secur32.lib;opengl32.lib;dxguid.lib;dsound.lib;SDL.lib;SDLmain.lib;SDL_ttf.lib;freetype.lib;glew.lib;libogg.lib;libpng.lib;libtheora.lib;libvorbis.lib;tcl.lib;zlib.lib;%(AdditionalDependencies) $(OutDir)openmsx.exe $(DXSDK_DIR)\Lib\$(PlatformShortName);$(ThirdPartyOutDir);%(AdditionalLibraryDirectories) %(IgnoreSpecificDefaultLibraries) shell32.dll;%(DelayLoadDLLs) true Console MachineX86 /SAFESEH:NO %(AdditionalOptions) X64 /MP %(AdditionalOptions) Disabled $(OpenMSXConfigDir);$(DXSDK_DIR)\Include;$(ThirdPartySrcDir)\$(LibNameFreeType);$(ThirdPartySrcDir)\$(LibNameGlew)\include;$(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameSDL_ttf);$(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameZlib);$(OpenMSXSrcDir);$(OpenMSXSrcDir)\cassette;$(OpenMSXSrcDir)\commands;$(OpenMSXSrcDir)\config;$(OpenMSXSrcDir)\console;$(OpenMSXSrcDir)\cpu;$(OpenMSXSrcDir)\debugger;$(OpenMSXSrcDir)\events;$(OpenMSXSrcDir)\fdc;$(OpenMSXSrcDir)\file;$(OpenMSXSrcDir)\ide;$(OpenMSXSrcDir)\input;$(OpenMSXSrcDir)\laserdisc;$(OpenMSXSrcDir)\memory;$(OpenMSXSrcDir)\resource;$(OpenMSXSrcDir)\security;$(OpenMSXSrcDir)\serial;$(OpenMSXSrcDir)\settings;$(OpenMSXSrcDir)\sound;$(OpenMSXSrcDir)\thread;$(OpenMSXSrcDir)\utils;$(OpenMSXSrcDir)\video;$(OpenMSXSrcDir)\video\scalers;$(OpenMSXSrcDir)\video\ld;$(OpenMSXSrcDir)\video\v9990;%(AdditionalIncludeDirectories) __SSE2__;WIN32;_WIN64;__x86_64;UNICODE;_UNICODE;WIN32_LEAN_AND_MEAN;SECURITY_WIN32;DEBUG;_DEBUG;_CONSOLE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NOMINMAX;GLEW_STATIC;STATIC_BUILD;%(PreprocessorDefinitions) MultiThreadedDebug Level4 ProgramDatabase 4324;4063;4121;4125;4127;4189;4201;4244;4310;4355;4505;4512;4611;4702;%(DisableSpecificWarnings) $(OpenMSXConfigDir);$(ThirdPartySrcDir)\$(LibNameTcl)\generic;%(AdditionalIncludeDirectories) wsock32.lib;winmm.lib;secur32.lib;opengl32.lib;dxguid.lib;dsound.lib;SDL.lib;SDLmain.lib;SDL_ttf.lib;freetype.lib;glew.lib;libogg.lib;libpng.lib;libtheora.lib;libvorbis.lib;tcl.lib;zlib.lib;%(AdditionalDependencies) $(OutDir)openmsx.exe $(DXSDK_DIR)\Lib\$(Platform);$(ThirdPartyOutDir);%(AdditionalLibraryDirectories) shell32.dll;%(DelayLoadDLLs) true Console MachineX64 /MP %(AdditionalOptions) Full AnySuitable true Size true true true $(OpenMSXConfigDir);$(DXSDK_DIR)\Include;$(ThirdPartySrcDir)\$(LibNameFreeType);$(ThirdPartySrcDir)\$(LibNameGlew)\include;$(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameSDL_ttf);$(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameZlib);$(OpenMSXSrcDir);$(OpenMSXSrcDir)\cassette;$(OpenMSXSrcDir)\commands;$(OpenMSXSrcDir)\config;$(OpenMSXSrcDir)\console;$(OpenMSXSrcDir)\cpu;$(OpenMSXSrcDir)\debugger;$(OpenMSXSrcDir)\events;$(OpenMSXSrcDir)\fdc;$(OpenMSXSrcDir)\file;$(OpenMSXSrcDir)\ide;$(OpenMSXSrcDir)\input;$(OpenMSXSrcDir)\laserdisc;$(OpenMSXSrcDir)\memory;$(OpenMSXSrcDir)\resource;$(OpenMSXSrcDir)\security;$(OpenMSXSrcDir)\serial;$(OpenMSXSrcDir)\settings;$(OpenMSXSrcDir)\sound;$(OpenMSXSrcDir)\thread;$(OpenMSXSrcDir)\utils;$(OpenMSXSrcDir)\video;$(OpenMSXSrcDir)\video\scalers;$(OpenMSXSrcDir)\video\ld;$(OpenMSXSrcDir)\video\v9990;%(AdditionalIncludeDirectories) __SSE2__;WIN32;WIN32_LEAN_AND_MEAN;UNICODE;_UNICODE;SECURITY_WIN32;NDEBUG;_CONSOLE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NOMINMAX;GLEW_STATIC;STATIC_BUILD;%(PreprocessorDefinitions) true false MultiThreaded true Level4 ProgramDatabase 4324;4063;4121;4125;4127;4189;4201;4244;4310;4355;4505;4512;4611;4702;%(DisableSpecificWarnings) $(OpenMSXConfigDir);$(ThirdPartySrcDir)\$(LibNameTcl)\generic;%(AdditionalIncludeDirectories) wsock32.lib;winmm.lib;secur32.lib;opengl32.lib;dxguid.lib;dsound.lib;SDL.lib;SDLmain.lib;SDL_ttf.lib;freetype.lib;glew.lib;libogg.lib;libpng.lib;libtheora.lib;libvorbis.lib;tcl.lib;zlib.lib;%(AdditionalDependencies) $(OutDir)openmsx.exe $(DXSDK_DIR)\Lib\$(PlatformShortName);$(ThirdPartyOutDir);%(AdditionalLibraryDirectories) shell32.dll;%(DelayLoadDLLs) true Console true true MachineX86 /SAFESEH:NO %(AdditionalOptions) X64 /MP %(AdditionalOptions) Full AnySuitable true Size true true $(OpenMSXConfigDir);$(DXSDK_DIR)\Include;$(ThirdPartySrcDir)\$(LibNameFreeType);$(ThirdPartySrcDir)\$(LibNameGlew)\include;$(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameSDL_ttf);$(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameZlib);$(OpenMSXSrcDir);$(OpenMSXSrcDir)\cassette;$(OpenMSXSrcDir)\commands;$(OpenMSXSrcDir)\config;$(OpenMSXSrcDir)\console;$(OpenMSXSrcDir)\cpu;$(OpenMSXSrcDir)\debugger;$(OpenMSXSrcDir)\events;$(OpenMSXSrcDir)\fdc;$(OpenMSXSrcDir)\file;$(OpenMSXSrcDir)\ide;$(OpenMSXSrcDir)\input;$(OpenMSXSrcDir)\laserdisc;$(OpenMSXSrcDir)\memory;$(OpenMSXSrcDir)\resource;$(OpenMSXSrcDir)\security;$(OpenMSXSrcDir)\serial;$(OpenMSXSrcDir)\settings;$(OpenMSXSrcDir)\sound;$(OpenMSXSrcDir)\thread;$(OpenMSXSrcDir)\utils;$(OpenMSXSrcDir)\video;$(OpenMSXSrcDir)\video\scalers;$(OpenMSXSrcDir)\video\ld;$(OpenMSXSrcDir)\video\v9990;%(AdditionalIncludeDirectories) __SSE2__;WIN32;_WIN64;__x86_64;WIN32_LEAN_AND_MEAN;UNICODE;_UNICODE;SECURITY_WIN32;NDEBUG;_CONSOLE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NOMINMAX;GLEW_STATIC;STATIC_BUILD;%(PreprocessorDefinitions) true MultiThreaded true Level4 ProgramDatabase 4324;4063;4121;4125;4127;4189;4201;4244;4310;4355;4505;4512;4611;4702;%(DisableSpecificWarnings) $(OpenMSXConfigDir);$(ThirdPartySrcDir)\$(LibNameTcl)\generic;%(AdditionalIncludeDirectories) wsock32.lib;winmm.lib;secur32.lib;opengl32.lib;dxguid.lib;dsound.lib;SDL.lib;SDLmain.lib;SDL_ttf.lib;freetype.lib;glew.lib;libogg.lib;libpng.lib;libtheora.lib;libvorbis.lib;tcl.lib;zlib.lib;%(AdditionalDependencies) $(OutDir)openmsx.exe $(DXSDK_DIR)\Lib\$(Platform);$(ThirdPartyOutDir);%(AdditionalLibraryDirectories) shell32.dll;%(DelayLoadDLLs) true Console true true MachineX64 /MP %(AdditionalOptions) Disabled $(OpenMSXConfigDir);$(DXSDK_DIR)\Include;$(ThirdPartySrcDir)\$(LibNameFreeType);$(ThirdPartySrcDir)\$(LibNameGlew)\include;$(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameSDL_ttf);$(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameZlib);$(OpenMSXSrcDir);$(OpenMSXSrcDir)\cassette;$(OpenMSXSrcDir)\commands;$(OpenMSXSrcDir)\config;$(OpenMSXSrcDir)\console;$(OpenMSXSrcDir)\cpu;$(OpenMSXSrcDir)\debugger;$(OpenMSXSrcDir)\events;$(OpenMSXSrcDir)\fdc;$(OpenMSXSrcDir)\file;$(OpenMSXSrcDir)\ide;$(OpenMSXSrcDir)\input;$(OpenMSXSrcDir)\laserdisc;$(OpenMSXSrcDir)\memory;$(OpenMSXSrcDir)\resource;$(OpenMSXSrcDir)\security;$(OpenMSXSrcDir)\serial;$(OpenMSXSrcDir)\settings;$(OpenMSXSrcDir)\sound;$(OpenMSXSrcDir)\thread;$(OpenMSXSrcDir)\utils;$(OpenMSXSrcDir)\video;$(OpenMSXSrcDir)\video\scalers;$(OpenMSXSrcDir)\video\ld;$(OpenMSXSrcDir)\video\v9990;%(AdditionalIncludeDirectories) __SSE2__;WIN32;WIN32_LEAN_AND_MEAN;UNICODE;_UNICODE;SECURITY_WIN32;_DEBUG;_CONSOLE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NOMINMAX;GLEW_STATIC;STATIC_BUILD;%(PreprocessorDefinitions) true MultiThreadedDebug Level4 ProgramDatabase 4324;4063;4121;4125;4127;4189;4201;4244;4310;4355;4505;4512;4611;4702;%(DisableSpecificWarnings) $(OpenMSXConfigDir);$(ThirdPartySrcDir)\$(LibNameTcl)\generic;%(AdditionalIncludeDirectories) wsock32.lib;winmm.lib;secur32.lib;opengl32.lib;dxguid.lib;dsound.lib;SDL.lib;SDLmain.lib;SDL_ttf.lib;freetype.lib;glew.lib;libogg.lib;libpng.lib;libtheora.lib;libvorbis.lib;tcl.lib;zlib.lib;%(AdditionalDependencies) $(OutDir)openmsx.exe $(DXSDK_DIR)\Lib\$(PlatformShortName);$(ThirdPartyOutDir);%(AdditionalLibraryDirectories) %(IgnoreSpecificDefaultLibraries) shell32.dll;%(DelayLoadDLLs) true Console MachineX86 /SAFESEH:NO %(AdditionalOptions) X64 /MP %(AdditionalOptions) Disabled $(OpenMSXConfigDir);$(DXSDK_DIR)\Include;$(ThirdPartySrcDir)\$(LibNameFreeType);$(ThirdPartySrcDir)\$(LibNameGlew)\include;$(ThirdPartySrcDir)\$(LibNameLibPng);$(ThirdPartySrcDir)\$(LibNameSDL)\include;$(ThirdPartySrcDir)\$(LibNameSDL_ttf);$(ThirdPartySrcDir)\$(LibNameTheora)\include;$(ThirdPartySrcDir)\$(LibNameVorbis)\include;$(ThirdPartySrcDir)\$(LibNameOgg)\include;$(ThirdPartySrcDir)\$(LibNameTcl)\generic;$(ThirdPartySrcDir)\$(LibNameZlib);$(OpenMSXSrcDir);$(OpenMSXSrcDir)\cassette;$(OpenMSXSrcDir)\commands;$(OpenMSXSrcDir)\config;$(OpenMSXSrcDir)\console;$(OpenMSXSrcDir)\cpu;$(OpenMSXSrcDir)\debugger;$(OpenMSXSrcDir)\events;$(OpenMSXSrcDir)\fdc;$(OpenMSXSrcDir)\file;$(OpenMSXSrcDir)\ide;$(OpenMSXSrcDir)\input;$(OpenMSXSrcDir)\laserdisc;$(OpenMSXSrcDir)\memory;$(OpenMSXSrcDir)\resource;$(OpenMSXSrcDir)\security;$(OpenMSXSrcDir)\serial;$(OpenMSXSrcDir)\settings;$(OpenMSXSrcDir)\sound;$(OpenMSXSrcDir)\thread;$(OpenMSXSrcDir)\utils;$(OpenMSXSrcDir)\video;$(OpenMSXSrcDir)\video\scalers;$(OpenMSXSrcDir)\video\ld;$(OpenMSXSrcDir)\video\v9990;%(AdditionalIncludeDirectories) __SSE2__;WIN32;_WIN64;__x86_64;UNICODE;_UNICODE;WIN32_LEAN_AND_MEAN;SECURITY_WIN32;_DEBUG;_CONSOLE;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NOMINMAX;GLEW_STATIC;STATIC_BUILD;%(PreprocessorDefinitions) true MultiThreadedDebug Level4 ProgramDatabase 4324;4063;4121;4125;4127;4189;4201;4244;4310;4355;4505;4512;4611;4702;%(DisableSpecificWarnings) $(OpenMSXConfigDir);$(ThirdPartySrcDir)\$(LibNameTcl)\generic;%(AdditionalIncludeDirectories) wsock32.lib;winmm.lib;secur32.lib;opengl32.lib;dxguid.lib;dsound.lib;SDL.lib;SDLmain.lib;SDL_ttf.lib;freetype.lib;glew.lib;libogg.lib;libpng.lib;libtheora.lib;libvorbis.lib;tcl.lib;zlib.lib;%(AdditionalDependencies) $(OutDir)openmsx.exe $(DXSDK_DIR)\Lib\$(Platform);$(ThirdPartyOutDir);%(AdditionalLibraryDirectories) shell32.dll;%(DelayLoadDLLs) true Console MachineX64 Document Document Document Document Document Document Document Document Document Document Generating config headers... for /f "delims=" %%d in ("$(OpenMSXConfigDir)") do set CONFIG_DIR=%%~fd rem echo CONFIG_DIR=%CONFIG_DIR% for /f "delims=" %%d in ("$(OpenMSXRootDir)") do set ROOT_DIR=%%~fd rem echo ROOT_DIR=%ROOT_DIR% set BUILD_DIR=%ROOT_DIR%\build rem echo BUILD_DIR=%BUILD_DIR% set MSVC_DIR=%BUILD_DIR%\msvc rem echo MSVC_DIR=%MSVC_DIR% set PYTHONPATH=%PYTHONPATH%;%BUILD_DIR% rem echo PYTHONPATH=%PYTHONPATH% pushd %ROOT_DIR% python "%MSVC_DIR%\genconfig.py" $(Platform) "$(Configuration)" "%CONFIG_DIR%" popd build-info.hh;components.hh;probed_defs.hh;resource-info.h;Version.ii;%(Outputs) Generating config headers... for /f "delims=" %%d in ("$(OpenMSXConfigDir)") do set CONFIG_DIR=%%~fd rem echo CONFIG_DIR=%CONFIG_DIR% for /f "delims=" %%d in ("$(OpenMSXRootDir)") do set ROOT_DIR=%%~fd rem echo ROOT_DIR=%ROOT_DIR% set BUILD_DIR=%ROOT_DIR%\build rem echo BUILD_DIR=%BUILD_DIR% set MSVC_DIR=%BUILD_DIR%\msvc rem echo MSVC_DIR=%MSVC_DIR% set PYTHONPATH=%PYTHONPATH%;%BUILD_DIR% rem echo PYTHONPATH=%PYTHONPATH% pushd %ROOT_DIR% python "%MSVC_DIR%\genconfig.py" $(Platform) "$(Configuration)" "%CONFIG_DIR%" popd build-info.hh;components.hh;probed_defs.hh;resource-info.h;Version.ii;%(Outputs) Generating config headers... for /f "delims=" %%d in ("$(OpenMSXConfigDir)") do set CONFIG_DIR=%%~fd rem echo CONFIG_DIR=%CONFIG_DIR% for /f "delims=" %%d in ("$(OpenMSXRootDir)") do set ROOT_DIR=%%~fd rem echo ROOT_DIR=%ROOT_DIR% set BUILD_DIR=%ROOT_DIR%\build rem echo BUILD_DIR=%BUILD_DIR% set MSVC_DIR=%BUILD_DIR%\msvc rem echo MSVC_DIR=%MSVC_DIR% set PYTHONPATH=%PYTHONPATH%;%BUILD_DIR% rem echo PYTHONPATH=%PYTHONPATH% pushd %ROOT_DIR% python "%MSVC_DIR%\genconfig.py" $(Platform) "$(Configuration)" "%CONFIG_DIR%" popd build-info.hh;components.hh;probed_defs.hh;resource-info.h;Version.ii;%(Outputs) Generating config headers... for /f "delims=" %%d in ("$(OpenMSXConfigDir)") do set CONFIG_DIR=%%~fd rem echo CONFIG_DIR=%CONFIG_DIR% for /f "delims=" %%d in ("$(OpenMSXRootDir)") do set ROOT_DIR=%%~fd rem echo ROOT_DIR=%ROOT_DIR% set BUILD_DIR=%ROOT_DIR%\build rem echo BUILD_DIR=%BUILD_DIR% set MSVC_DIR=%BUILD_DIR%\msvc rem echo MSVC_DIR=%MSVC_DIR% set PYTHONPATH=%PYTHONPATH%;%BUILD_DIR% rem echo PYTHONPATH=%PYTHONPATH% pushd %ROOT_DIR% python "%MSVC_DIR%\genconfig.py" $(Platform) "$(Configuration)" "%CONFIG_DIR%" popd build-info.hh;components.hh;probed_defs.hh;resource-info.h;Version.ii;%(Outputs) Generating config headers... for /f "delims=" %%d in ("$(OpenMSXConfigDir)") do set CONFIG_DIR=%%~fd rem echo CONFIG_DIR=%CONFIG_DIR% for /f "delims=" %%d in ("$(OpenMSXRootDir)") do set ROOT_DIR=%%~fd rem echo ROOT_DIR=%ROOT_DIR% set BUILD_DIR=%ROOT_DIR%\build rem echo BUILD_DIR=%BUILD_DIR% set MSVC_DIR=%BUILD_DIR%\msvc rem echo MSVC_DIR=%MSVC_DIR% set PYTHONPATH=%PYTHONPATH%;%BUILD_DIR% rem echo PYTHONPATH=%PYTHONPATH% pushd %ROOT_DIR% python "%MSVC_DIR%\genconfig.py" $(Platform) "$(Configuration)" "%CONFIG_DIR%" popd build-info.hh;components.hh;probed_defs.hh;resource-info.h;Version.ii;%(Outputs) Generating config headers... for /f "delims=" %%d in ("$(OpenMSXConfigDir)") do set CONFIG_DIR=%%~fd rem echo CONFIG_DIR=%CONFIG_DIR% for /f "delims=" %%d in ("$(OpenMSXRootDir)") do set ROOT_DIR=%%~fd rem echo ROOT_DIR=%ROOT_DIR% set BUILD_DIR=%ROOT_DIR%\build rem echo BUILD_DIR=%BUILD_DIR% set MSVC_DIR=%BUILD_DIR%\msvc rem echo MSVC_DIR=%MSVC_DIR% set PYTHONPATH=%PYTHONPATH%;%BUILD_DIR% rem echo PYTHONPATH=%PYTHONPATH% pushd %ROOT_DIR% python "%MSVC_DIR%\genconfig.py" $(Platform) "$(Configuration)" "%CONFIG_DIR%" popd build-info.hh;components.hh;probed_defs.hh;resource-info.h;Version.ii;%(Outputs) openMSX-RELEASE_0_14_0/build/msvc/openmsx.vcxproj.filters000066400000000000000000003370171314057512400232700ustar00rootroot00000000000000 {27eaf1e2-f5da-477a-99a5-7be15006d6a0} {878501bc-d7f0-49ec-bc35-d2e22835aaf6} {a5140952-ef4a-4d86-b93f-8562cf838f1f} {2bd3c002-6e7b-444b-a02f-75e6e57aa28e} {99b1a5c3-9248-4127-bb7a-bffc6052fa1d} {2f1531a3-2bff-4bb2-b737-8b5bc263a5d0} {4b659948-74af-4e70-9469-71cf9e8ff90e} {0d4a99d7-3f0c-4bd7-94c9-73f2ad724887} {a36193d1-ca1d-4188-aefc-60d10a41573b} {db111771-419a-4e9f-a046-87a88f567ce5} {39b914e9-534c-42eb-8b1c-7078665cd464} {e010ea5f-02d9-420a-af08-577f6fac9b71} {4790c7a8-2904-4fda-9248-fc5357d9751f} {6bf182df-f9bf-43c3-9d2a-c0984b19716c} {234f2a7b-0398-45c2-9149-a918a0d564bd} {c12b54ed-4653-4ee0-b86a-e5c90a8b9b8d} {5db6c172-d415-41b3-b89d-876e94c600d7} {f34953a9-8bb9-4fe7-9d92-38dd046b936a} {dc7744b4-c613-43ff-8e2b-d89fb8b90f2b} {441fef5c-d4c3-4cb1-8bd9-27253f5a929a} {8fe6dae8-765e-428c-abf4-662e83a99385} {ce8126f9-f849-4f95-85bf-f6919a3a4e9a} {3b3e10a3-7923-46c0-b78f-46acd840d7c2} cassette cassette cassette cassette cassette cassette cassette cassette commands commands commands commands commands commands commands commands commands commands config config config config console console console console console console console console console console cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu debugger debugger debugger debugger debugger events events events events events events events events events events events events events events fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc file file file file file file file file file file file file file file ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide input input input input input input input input input input input input input input input input input input input input memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory settings settings settings settings settings settings settings settings settings settings settings sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound thread thread utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\ld video\ld video\ld serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial security security security laserdisc laserdisc laserdisc laserdisc laserdisc memory cassette cassette cassette cassette cassette cassette cassette cassette commands commands commands commands commands commands commands commands commands commands commands commands config config config config config config console console console console console console console console console console cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu cpu debugger debugger debugger debugger debugger debugger events events events events events events events events events events events events events events events events fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc fdc file file file file file file file file file file file file file file file ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide ide input input input input input input input input input input input input input input input input input input input input input input input memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory memory resource settings settings settings settings settings settings settings settings settings settings settings settings settings sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound sound thread thread utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils utils video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 video\v9990 serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial serial security security security memory resource sound video\ld video\ld video\ld video\ld video\ld laserdisc laserdisc laserdisc laserdisc laserdisc openMSX-RELEASE_0_14_0/build/msvc/probed_defs.mk000066400000000000000000000011031314057512400213000ustar00rootroot00000000000000# Hardcoded probe results for Visual C++ build. # Non-empty value means found, empty means not found. HAVE_GL_H:=true HAVE_GL_LIB:=true HAVE_GLEW_H:=true HAVE_GLEW_LIB:=true HAVE_LASERDISC_H:=true HAVE_LASERDISC_LIB:=true HAVE_OGG_H:=true HAVE_OGG_LIB=true HAVE_PNG_H:=true HAVE_PNG_LIB:=true HAVE_SDL_H:=true HAVE_SDL_LIB:=true HAVE_SDL_IMAGE_H:=true HAVE_SDL_IMAGE_LIB:=true HAVE_SDL_TTF_H:=true HAVE_SDL_TTF_LIB:=true HAVE_TCL_H:=true HAVE_TCL_LIB:=true HAVE_THEORA_H:=true HAVE_THEORA_LIB:=true HAVE_VORBIS_H:=true HAVE_VORBIS_LIB:=true HAVE_ZLIB_H:=true HAVE_ZLIB_LIB:=true openMSX-RELEASE_0_14_0/build/msysutils.py000066400000000000000000000043261314057512400201630ustar00rootroot00000000000000from os import environ from os.path import isfile from subprocess import PIPE, Popen import sys def _determineMounts(): # The MSYS shell provides a Unix-like file system by translating paths on # the command line to Windows paths. Usually this is transparent, but not # for us since we call GCC without going through the shell. # Figure out the root directory of MSYS. proc = Popen( [ msysShell(), '-c', '"%s" -c \'import sys ; print sys.argv[1]\' /' % sys.executable.replace('\\', '\\\\') ], stdin = None, stdout = PIPE, stderr = PIPE, ) stdoutdata, stderrdata = proc.communicate() if stderrdata or proc.returncode: if stderrdata: print >> sys.stderr, 'Error determining MSYS root:', stderrdata if proc.returncode: print >> sys.stderr, 'Exit code %d' % proc.returncode raise IOError('Error determining MSYS root') msysRoot = stdoutdata.strip() # Figure out all mount points of MSYS. mounts = {} fstab = msysRoot + '/etc/fstab' if isfile(fstab): try: inp = open(fstab, 'r') try: for line in inp: line = line.strip() if line and not line.startswith('#'): nativePath, mountPoint = ( path.rstrip('/') + '/' for path in line.split()[:2] ) if nativePath != 'none': mounts[mountPoint] = nativePath finally: inp.close() except IOError, ex: print >> sys.stderr, 'Failed to read MSYS fstab:', ex except ValueError, ex: print >> sys.stderr, 'Failed to parse MSYS fstab:', ex mounts['/'] = msysRoot + '/' return mounts def msysPathToNative(path): if path.startswith('/'): if len(path) == 2 or (len(path) > 2 and path[2] == '/'): # Support drive letters as top-level dirs. return '%s:/%s' % (path[1], path[3 : ]) longestMatch = '' for mountPoint in msysMounts.iterkeys(): if path.startswith(mountPoint): if len(mountPoint) > len(longestMatch): longestMatch = mountPoint return msysMounts[longestMatch] + path[len(longestMatch) : ] else: return path def msysActive(): return environ.get('OSTYPE') == 'msys' or 'MSYSCON' in environ def msysShell(): return environ.get('SHELL') or 'sh.exe' if msysActive(): msysMounts = _determineMounts() else: msysMounts = None if __name__ == '__main__': print 'MSYS mounts:', msysMounts openMSX-RELEASE_0_14_0/build/outpututils.py000066400000000000000000000020331314057512400205210ustar00rootroot00000000000000# Various utility functions for generating output files and directories. from os import makedirs from os.path import dirname, isdir, isfile def createDirFor(filePath): '''Creates an output directory for containing the given file path. Nothing happens if the directory already exsits. ''' dirPath = dirname(filePath) if dirPath and not isdir(dirPath): makedirs(dirPath) def rewriteIfChanged(path, lines): '''Writes the file with the given path if it does not exist yet or if its contents should change. The contents are given by the "lines" sequence. Returns True if the file was (re)written, False otherwise. ''' newLines = [ line + '\n' for line in lines ] if isfile(path): inp = open(path, 'r') try: oldLines = inp.readlines() finally: inp.close() if newLines == oldLines: print 'Up to date: %s' % path return False else: print 'Updating %s...' % path else: print 'Creating %s...' % path createDirFor(path) out = open(path, 'w') try: out.writelines(newLines) finally: out.close() return True openMSX-RELEASE_0_14_0/build/package-arch/000077500000000000000000000000001314057512400200365ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/build/package-arch/PKGBUILD000066400000000000000000000011421314057512400211600ustar00rootroot00000000000000# PKGBUILD for openMSX # Contributor: Theo Smit pkgname=openmsx pkgver=0.6.2 pkgrel=1 pkgdesc="openMSX, a great opensource MSX emulator with lots of great features" arch=('i686') url="openmsx.org" license=('GPL') depends=(gcc sdl_image tcl) makedepends=() provides=() conflicts=() replaces=() backup=() install= source=(http://downloads.sourceforge.net/$pkgname/$pkgname-$pkgver.tar.gz) noextract=() md5sums=('282acf2ea7bf67e15a7b8d961c9556a5') build() { cd $startdir/src/$pkgname-$pkgver ./configure make || return 1 make OPENMSX_INSTALL=$startdir/pkg/opt/openMSX install } openMSX-RELEASE_0_14_0/build/package-arch/README000066400000000000000000000021501314057512400207140ustar00rootroot00000000000000PKGBUILD file for building an openMSX package for archlinux/i686, contributed by Theo Smit . This PKGBUILD was only tested on i686 (32-bit), if you want to build for an x86_64 machine you can try to modify the PKGBUILD accordingly. If you're lucky you only have to modify the "arch=" line. Usage: - Create a temporary working directory and go there: $ mkdir /tmp/build-openmsx $ cd /tmp/build-openmsx - Copy the PKGBUILD file there: $ cp path/to/PKGBUILD . - Run the "makepkg" tool: $ makepkg This will download the sources for openMSX 0.6.2, verify the dependencies, compile openMSX, install it in the temporary directory and archive that installation into a binary openMSX package. - Install the binary package with the standard Arch package manager: $ pacman -A openmsx-0.6.2-1-i686.pkg.tar.gz - Now you can start openMSX: $ /opt/openMSX/bin/openmsx Please read the documentation in /opt/openMSX/doc/manual to learn more about openMSX, for example how to install additional system ROMs. ------------------------------------------------------------------------------ openMSX-RELEASE_0_14_0/build/package-darwin/000077500000000000000000000000001314057512400204055ustar00rootroot00000000000000openMSX-RELEASE_0_14_0/build/package-darwin/Info.plist000066400000000000000000000036771314057512400223720ustar00rootroot00000000000000 CFAppleHelpAnchor index CFBundleDocumentTypes CFBundleTypeExtensions rom CFBundleTypeName ROM image CFBundleTypeRole Shell LSTypeIsPackage CFBundleTypeExtensions dsk CFBundleTypeName Disk image CFBundleTypeRole Shell LSTypeIsPackage CFBundleTypeExtensions cas CFBundleTypeName Cassette image CFBundleTypeRole Shell LSTypeIsPackage CFBundleExecutable openmsx CFBundleGetInfoHTML openMSX %VERSION% CFBundleIconFile %ICON% CFBundleIdentifier org.openmsx.openmsx CFBundleName openMSX CFBundlePackageType APPL CFBundleShortVersionString %VERSION% CFBundleSignature oMSX CFBundleVersion %VERSION% LSMinimumSystemVersionByArchitecture x86_64 10.6.0 i386 10.4.0 ppc 10.4.0 LSRequiresCarbon NSPrefPaneIconFile %ICON% NSPrefPaneIconLabel openMSX openMSX-RELEASE_0_14_0/build/package-darwin/README.html000066400000000000000000000053311314057512400222320ustar00rootroot00000000000000 openMSX README

openMSX README

Documentation

In the Documentation directory you can find the documentation for openMSX. Some sections you might want to read first:

Key Mapping
Lists which keys you need to press for special MSX key and for emulator functions.
System ROMs
Describes how openMSX deals with system ROMs. This binary distribution has C-BIOS inside of it. Should you decide to install additional system ROMs, I suggest you put them in ~/.openMSX/share/systemroms. That way, if you upgrade openMSX later, they will automatically be found by the new version.
Release History
Lists the changes made in each release of openMSX. Read this to learn about new features or changed behaviour.
Authors and License
Tells you about the people who made openMSX and the conditions for distributing it.

Running MSX Software

ROM files (ROM images)
Open the OSD (On-Screen Display) menu using Cmd+O, then choose "Load ROM...".
DSK files (disk images)
Open the OSD menu using Cmd+O, then choose "Insert Disk...". Make sure you select a machine that supports disks; C-BIOS does not yet have disk support. If you installed system ROMs (see above), you can change the MSX model that is emulated in the OSD menu under "Hardware... > Change Machine...".
CAS files (cassette images)
Open the OSD menu using Cmd+O, then choose "Set Tape...". As for disks, you will need to select a machine that supports cassettes; C-BIOS does not yet support cassettes.

Double clicking a file in the Finder to open it in openMSX unfortunately doesn't always work; this might be fixed in future openMSX versions.

To shorten the loading times of disks and cassettes, you can type set fullspeedwhenloading on on the openMSX console, which can be opened with Cmd+L.

openMSX on the Web

Home Page
Contains everything about openMSX.
Project Page on SourceForge
You can download new versions here, or report bugs.
Forum
Discuss openMSX with other users.
openMSX-RELEASE_0_14_0/build/package-darwin/app.mk000066400000000000000000000034421314057512400215210ustar00rootroot00000000000000# Create an application directory for Darwin. APP_SUPPORT_DIR:=build/package-darwin APP_DIR:=openMSX.app APP_EXE_DIR:=$(APP_DIR)/Contents/MacOS APP_PLIST:=$(APP_DIR)/Contents/Info.plist APP_RES:=$(APP_DIR)/Contents/Resources APP_ICON:=$(APP_RES)/openmsx-logo.icns # Override install locations. DESTDIR:=$(BINDIST_DIR) INSTALL_BINARY_DIR:=$(APP_EXE_DIR) INSTALL_SHARE_DIR:=$(APP_DIR)/share INSTALL_DOC_DIR:=Documentation PACKAGE_FULL:=$(shell PYTHONPATH=build $(PYTHON) -c \ "import version; print version.getVersionedPackageName()" \ ) BINDIST_PACKAGE:=$(BUILD_PATH)/$(PACKAGE_FULL)-mac-$(OPENMSX_TARGET_CPU)-bin.dmg BINDIST_README:=README.html BINDIST_LICENSE:=$(INSTALL_DOC_DIR)/GPL.txt # TODO: What is needed for an app folder? app: install $(DESTDIR)/$(APP_PLIST) $(DESTDIR)/$(APP_ICON) bindist: app $(DESTDIR)/$(BINDIST_README) $(DESTDIR)/$(BINDIST_LICENSE) @echo "Creating disk image:" @hdiutil create -srcfolder $(BINDIST_DIR) \ -volname openMSX \ -imagekey zlib-level=9 \ -ov $(BINDIST_PACKAGE) @hdiutil internet-enable -yes $(BINDIST_PACKAGE) $(DESTDIR)/$(APP_PLIST): $(DESTDIR)/$(APP_DIR)/Contents/%: $(APP_SUPPORT_DIR)/% bindistclean @echo " Writing meta-info..." @mkdir -p $(@D) @sed -e 's/%ICON%/$(notdir $(APP_ICON))/' \ -e 's/%VERSION%/$(PACKAGE_DETAILED_VERSION)/' < $< > $@ @echo "APPLoMSX" > $(@D)/PkgInfo $(DESTDIR)/$(APP_ICON): $(DESTDIR)/$(APP_RES)/%: $(APP_SUPPORT_DIR)/% bindistclean @echo " Copying resources..." @mkdir -p $(@D) @cp $< $@ $(DESTDIR)/$(BINDIST_README): $(APP_SUPPORT_DIR)/README.html @echo " Copying README..." @mkdir -p $(@D) @cp $< $@ $(DESTDIR)/$(BINDIST_LICENSE): doc/GPL.txt app @echo " Copying license..." @mkdir -p $(@D) # Remove form feeds from the GPL document, so Safari will treat it as text. @awk '!/\f/ ; /\f/ { print "" }' $< > $@ openMSX-RELEASE_0_14_0/build/package-darwin/openmsx-logo.icns000066400000000000000000001733421314057512400237240ustar00rootroot00000000000000icnsTOC @is32s8mkil32ql8mkit32)%t8mk@ic08is32U/Za/*jX2F82Td дn=ܹ ә q̲ͿuWU/Za.'_fR 2VF82T] n4Ǽ¾ h m̲yeKZa:moUL֡SeWL1BE7|.BUrR< NVzM=}gXPF; p^SH>= ĮU -VӸgs8mkc{_rIE HX0&2D8CXJ#il32q8Aʘ8[Z]lʭ='sV6@u) ˜*116{j,g(!I9P+- QP# 6"ʶȋrʢ*׀ӵ܇>dVO͢9րޞ ʣؙ >EgۚyO.8Aʘ8ZZ]l§:%ӬlQ3< ?y V*116{j,g(!I9P(-Ÿ QP# 6ԶƋhг &̸܇> ȨdV Ơ E÷v)¬Ѐs Ȅp >z2KqupX :!zx uՃqo nl GHkZki {J gf iY0'?A:dc U 3a_ urJ7d][[ [nqn=sWSSf^\AcepnePIzoUjdX0ix^ne`\Gdme wgb\WN)7W yimic^XSM@ {upje_ZTOI/c wqlfa[VPK>$%u݃ rmhb]WRMY^6 jOPl1+ ܇TLdj;W1 `2 +&#>k`R l8mkVdQjNN0=E>:4 aZe xFccR^ M :5No I^Y|x8@!it32)%??@_}w] Ʉ M ߆_=WGAe}bǴst(ր5S(ށs/bGZb5ObE]uuʅ-[rut 2sՊ̃zze OnOLd F̲6t 0r z״ f qLZpCNtJ"vܸ E(y9z)ڣ ZhLsLwZ 1=Lj}Q5frѳDg.xs{tV.`i>2 mS`VulHy`ۈo!&*)& [ 7K#smْنiC܃e "\ jל)w Ϝ `q!"lV֞WOq}& Iݲq+Cߚ xG@5N}cd\VMex%.րBލ9WmR ;~ MI XhqG| 0׋qN V{c<&Cz; ׸yh &ߴo W4ڴT pŮ 0H¬զQb [0ګ$j?پ{{{n YMML=d#lCz:̀|hʩH6TdKj Rjnt9fM穥xc-b}ڡ"}߁iV\؁׌ KY σ7 ޻B@/ׄ?n1_ORڄ mT afO4{ɬ1HR 64罅?bŌ gץ-؀KVΈ\=Fځ8V%c{GEmׂܱ85[ \{A֔%-OiyzjQ,1sp .rlmw؂'ބHم~M߂hQ؃WׂكHۀىR׀2׃٫܀"q֯QۄX?f8gFznV(5FXJ76??@_}w] Ʉ M ߆_=WGAe}bǴst(ր5S({s/bGW^5MaEWsuʅ-|}[rum 1q֋ʿ{{e LكٟlJI] A俧~ۏ3߃u -끿߂s s˪`߉ޔ kHUj?ImF oϭ ၅ A%q7s'ΚUbGwT 9Ljv _rѴ3 ss{oE ai>2 lH1RuiDy`܈p!&*)& [ 7K#smْنiC܃e "\ jל)w Ϝ `q!"lV֞QJr}& Cz̤h'Cߚ xB96N}[\UNH]ܼx%.ր=܀ˁ4PcR ;~ۀFBُ XhqG|ڀ؀ ,w֣׋qN V{[ڀ׀ v5ԗف؀׀ չt'ׁՀ ;z7؀րӀ׸y_؀ՀԀӀ"ϕߴoׁՀԀӀҁ ϩM-ڴTՀӁЀcͶŮրՀрπ*?¬զJԀҀрЀπ ̶VͲӀ΁ P)ګ$_ՀҀπ́˺ɐ@ـҀЀρˁ پ{{{bрЀ́MMMLсπ́ˀɁ>d#b<ρ̀Ɂzρ΀ˀȀ1̀|ā̀ʀɀǁuhʩ́ʀɁĦJ6J̀ˀȁǀŀdK\ˀʀǀŀ< \ȀƁ¸ht9Gi CǁƀĀŽXH 'ŁÀR|uŁÀ}`ԁĀ€EEf L€…V (޻>Á w?1^w=[ȧ'YP;~ mVOS?'yɬ24<a64细<bŌ Kx 7VΈ\=Fz)?%c{GEP)'dp[ \]/l.PjyzkQ.%UR !s_UOPWdw4[z{8L;?`4d<$}^R;@-J)Kj3YP>&3@6(( {~|~}|}|v }~ ~~}}||{z{{ ܡ} |yzzy䆀~wyxwvtuwvvwnuvutupŊyutsstręorrqqpn}}rqponpoonomponnmmjnnmmnlbǴsfmlko( 5dmllkf(a sellkkjlh~bGQ"5fkkjiihi~~{.Phjjiihgj~~}y܄xzjihhgl}|{{%PLǀihffl}|{{ztz7 ΅yiihhfem||{zyy' Zghhgfedk{zzyx jhgfeedcjzyyx|CDaYyݛzygjggffeddcbi{yxg#GBRkfeddcbfxx{('  /gdcbaaexwN(  bdcbbaa`fwv;$\cbaa`dvvMebaa``_^b uur  !dbaa`__^^autsa 3baa``_]]dvsrri+ a``_^]\_Vtsqqpt4 Xa`_`_^]]\[\[\rqpodEb``_^^]]\[[ZZ`O zqpponon^ vOY^]\[ZZYYZWpponnmmn@,ܳLT[[ZZYYXXQ]ponnmmlkn- SXYXWWV\tnml k[ PXWVU].qnml ka-eRUY9Jmmllkk߃ `  ]lhfeylkaJ nmg_*/9mls3iv `lpnggemC isqP hlsqpmejP 8{utJ yqomlkjhgedca`_]\[YXWUTRRPNMMPib`9"@}|{yv tsrpnmljhgfedba_^\[YXWVTSQPNNLJM9^_J,t~|{yywvtsqpnnljjhgedc``^][ZXWVTSRPOMLKIK)1k,g}{{yxvusqqonlkjhgfdbb__]\[YXWUTRQONLKJHO#",Cx~~|{yxvutsqonmhjhgfecb`_]\[YXWUTSQPNMLJIHL@ǝ+3|z|{yxvvtsqpomliihgddb`_]][ZXWVTSQPONLKIHFCT+*|{{zywutsrponlkjhgedba`^][ZYXVUSRQONLKIHGL(v+0|yzyxvutrqonlkjigeeca`_^\ZZXWUTSQONLKJIHHQ)+@tzyxvusrqonmkjigfecba_^\[ZXWVTSQPNMKKIHFG) 8+e~zxwutsqpomlkiggedb``^][ZYWVTSRQONLKIHGEA4I$zxwvtsrqomlkiiffdca`^][[YWVUTRQONMKJIF68Z,Ltvutrponlliigfeca`_]\[YXVUTRQPNMLJIIMP>@=.)x+Bxutsqpnmljigfdcba_]][YYWVTRRPONLKLMMR7A@5( Kٚ]tsqpnnlkihfedba`^\\ZYWVTSRPOMLI-@?9A*Zvtpomlkjhgfcca`_]\ZYXVUTRQPNLKKMS:}?>5-u!1wqqmkjigfccb`_^\[YYWUTRQOMSSJL9?ՀB=01!X[vkljlmgno`_^\[YXWUTSRQPQRS2H<24bEVxr6&XY`[\ZXVUTUTSF1R4/8 ։re%(?bx*(9)'9,(&6z'&1ָ'%+ߴ&%& ڴl%* Ů=#¬  ګ>D پ{{ MMaDd=z̀|.hP6$dK !Kt9 }!-/  PG ޽)=54 :Sm_rӬ564 絆1(>~Ќ /(0sֈ\<H4&"H{EF4  $[ ]  1SkzzlT2 t8mk@D~ }D EP MA IAMK  |K } | ~"q[6dyH6D^=DjO:6KB3D ,S|\*yys5_|~E t |^Y}{X7yuj'|(%-'g|,2F0%osuK%xaDo~|tNT/s=WkwRL6$3rG8rhic08݉PNG  IHDR\rf$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+@IDATx]`T>I "Ez"Hћ *OX~ vgDY)ʳg  ,tMzfٝ\6d{ٙ9{9S\ $H @ @ $H @ Pixwsև++kh%RP $(K# z Of8z-)\:B*p)ᓏN! @(%TJg+E+/ S[ \~%5Q:-Z΍K poG ;50[ %%qJcjBIirhWn [0>n8Ÿ=C"Kb?0źGG52\&Ώ)Nuäk<^Ag1p!=0*$P, ߳ſ `t+zaܥa7GŻ~NF"y; A=1!př$2.P*(~p(~P%Uwäa0W=h8t\6dxPl KV?0{©HYᘇg^n9/Qڔ?D.30WK3"@տ %qW_+0iSYD ؊Rﭔܚi@u{?v JtOg؟Kwץk8X$|"WLb%_|ݙi.I GݻtRWڷ WK7jȋm^RzLKȨsj@?I5L_PS1)yp7"*f~`@b]|=(U9uV[ӧQlE33婧:g@U 1lׯ,VOڵ-U:u*T HicGlذ]V,V|s|R7o{=eNg}̝F@S.p;F-ȑ7߫;zΡG,+j2xA2`@+ӻh޼D4iLZٲ;{x7F G$اp vhCP~#:ʫ"-Z^ӞsNYj̘pQuT_ArͥC:~BxF Ҷmmiժlݺ=5eExsMD"BH7 |rᢕ@`!*VCFꊖ[@!/%}dēYR%o'q6=GRSSiBCj9GA kB `;1WPq}VG5 toqG#h"jBn2vl_Z/ *WN6mjˊeΜUPt-500}"|G] EH AxBG67?%a2fRLj^P,XN.\^ҜQPK$ۚ=#u({fȻԁq(T]a6}`; 'I la3^**s箔իN16_lO 09lPbqh*|k*?J˖{?ᗗ[޽rJoдi5Yf̞Bmp'>i11Us(&a?D9g*UfͪI {7ٗ[+W .4pU~c. VpD*s(f@.?_07GsAO$pn_AZeѢu믫dvw@n㈕.&P1C?uoNЩ.FpzW ^kwb->aOV[ PW=#}‘7x:CucǺf!A口M( A0ɜh҂>@` \l୸gՊ[e˦bه`M:RbaAfsdP(pamu7޽!3;Qcwy|ly-×F]. \ FwCK:_!pwrFA C5 ezL88%P?mn]@T3KKKž'k[6S3dx,@cl_+9ߵ/Mw 5}P]5yy{/>P`B6?#N܌cO)K[2^^75L?^NF*BP`WzBJm+祔׬YѼ)hUe_!`S_D @vZ `*mJ_zl҄;PwBPY1/Kc@ 'Cf7lX @ZZUOx&wHF0aSX@t[[3mlkvj[n 7ocQ'ÅKxn_n_%5k jٹs'-/jՒjzp ܸ1BP]],fb85bnFA$| 6ύ?m3OOǶ\rˏ?(1s\y{4 l>hy_IrϏ6p{EלU^0Zm % oa Vbf\b37nSrW9qݺua"OqP*8 [~?[opK0%˅qeay'*0EP @̳BWnfKl:ѭRnFiT]z|gdFwO5[r kG?y2 | T2p%yq != %&[٬sUX>[mxѢ$ T"={܅7ڵKG9˽rɿIaىs8vJvC1_n-ONq~=w¡=6ʁ.*#=6C\\gB% WbzRnŎ├ J͚5qbp9#D\jj*f˩* gaאΑIjz?I_^;CB0̈ʋOɔOoYs~\a([99B PH93b|{ظq,^͕xu3IyD5BJd2ib+Dd|*B-p>}F]?Cc哷R~^m37<7eXIGO@! C'H:R墋.2ƅ㘟 zҤ{Z9lW0KW>%ϞBr`O!?@E V\5Sy++FG,]T=X~V{ݱ+gήL{o?x*eas ~0e3 % %( 7%V^)oD|qm۶SR0)W~*OVϽڀ@RT`n`'z[h8$24!Oi Jȷ$0ZyVZ+WW{e%rډ+*e*]$fr/~C5o԰]UyEC&dM;"o1/1ဟ,VSXtZ1@aI 0ltV9mvqWEx6MAzk'MA?KRv/+VajUgʊ3d޼y{NK~ +a7;OvnfGD!_r_3ʭq-[vwG"~UW1GL*7#-¹_Jwڛ%ʔɐsT.,'<309s<췻IG _NdJ++5VyNi;3W{;:xۇ ? h<3IzMK/{HM _]ĴK7cM%KtB}MxkEb߂@`-(]3ϘcןÒv>"qJel+k44 ICr}y رg+?U̝a?8s ixAH 0bԳ]̿j\pkveאU97ӆ׬Y+=:y^a B駟f%nz曅+?ƍğ*rUy)My\NFɁ_ @E@+q ˨Q Bth_O*VIjc}+lriP A&Aq~!YOYݵDi۶XIt!L䗁 fH$[ѿmZ_G5+rgrW} /i Mݢū^*eFfHڴ\ՀuK/a̘s77~yhܕ%q q/K̠i܊KPئ; $Vw?iִRe/ɬ}gN(Mv0v:d; @%|8kTD5 mwE76v]Fl2!/c=%~0_i*}*>ߕ&40Mc|'@!K`jM!Te5|&j v1 6^QB}.4?3FjUCI):D/-%`%𽁶C ɰaL}$itXuyt\{9yRڑi6Y`9 2;ٔٻ1G7 ^+p <ғ ̾?[krqK嗟NG Zd=䍷Mr1Y2⼰th\%'p{dJi-j,~;G?@&A?+V3 S-*[<!3d8d45[YYԮVTVO#+f¥Qz txn<=D;҂@ȿTQkV`ğM_A)rCy]Ѳq\pXLy4kDeG|ȤQ9:CP6vJZ!J^{`;ٷ($v"5Aa98-לVʼ%2 FPG O;1gw"!J z9ȿ0!C۬Xy3N͔׌[_^C.˨ۢ2̝ DMkE~o,a!J@Аd5D⤤sdގ"E ފמ2''9?JS,1 @`-(Z**VpfiNmC_ rxo g.u.  H x˴= N8אġy06hx WԮ%rejuDbh'MV^WUPXg)J|AV^aʴekT&r)FyL{T ӥ˓2wte^i!/9%5$lي. c GNa<}n,XIC("th*qb~dҿ8N-j!#Xbi _O~a&ʕsc7á@Vo}1 `f1Tg&#4/Ɣ"@rHNPrc% XXi~I]N:hf/FCFogD;QgoT'tPX @%5uZZ}0(?`*];֡VreWeh.{v/J8[!-]67@U0W>"r mKZ\%r\dƨ  ;nR8MC/5Ƀp$\iLjE|VĘ@931B9{d|WҮk<+"s9$a p*2Mvbe{#{kPԯ"ҬCe9S˒IBLw8*5Ӷj!{;P.*202ϖ,f_ qAtWr)P  >:*+u;wɲ}剧+'P ~Rr饮#J/.~n/K.&SVu ԱB[i͋5rRi٪s+l"r ZUc^*o)Ҧ%y mՙOgۀW7#轨|4>q~Pq?_/( Kr,u\?[?V(Zs|/M9Oz+Z-PBKdBD&5im؏_)[u7 Ia9#'<K"yg0qL'^_(9w n2;l a." &Wb{gpd|yT>/Eڶfڲr}LOONa& ;srULȇlI# 7ܶʜ^ Ug&z0$?(Kʖ8wRl82,Wv]JV~tN,;rwD\cMn^CڙL{h2*7sո\WאP.w.8 C@$c:‡ ϪWzUk6JfFniۡ%y wzxS ɿx~Nĵ;]9F{{)\^xPIgc3kϤ`3<2t+{~ r 3ičRf#l/Z*2+J|KD@wǭaY<_60JӡmHk9`8.#b߁U$~xQֿWd_ȏ_pRJ_c M@~hPGC C R|?zRZq֋!r,mP ӌwǓ8/vU)Ҹ!WDHf鎡uCUU?ѽ3-/)wD0`v0 B*K4F*{W`Ƴ+F$R_f]Z6/#MJfavC? 41[[o ˀ}`۱s32P<=2O5I}#P*@$<{v+YYaY49g?io"+ܶiBx 'Rzeb'w$0 Sz܀-_*>U~؇+ˀSF8\ك |* Ίw ,HѰ~Ҳ o 7sȯ!KkQ`e K߭.>住;W-})a*px6gAݝ#|u70 x;|T|OC`{OZ{9%Sz\&6+;Avas*8 @g/E;&Vjܸ鷒y=U3$/M ˈa8).@8W@6(`ng|w:R5$_~ lWhWz ѳÝSIժͻV)eap6f'`E0ʧ`?VNun\îo t.2Vr䉕1f[1>|1؄强RD^n˄K4OAih v#ܛҔg\{yH^oXᚄǞn( r:vl g ?^4&?@ʐ~7j (Du-Y`sI_`{PVR*4ÊKޕ/#o}C7i'׌+{ |!X䙿 |=hƼS?އ#Wl(Wʓr7 ːrr˿KjgCӦI׮姟˪UDGRd4tp2i}s}1] 0{'pVb8j8>b65o\z!cP g-U𕡐i%~"_tB{>+QSSf#NyjDCp׻/~tfׄeإ{rۑpY2bҢ2u\leK w^@8ak}.XGț8wА,4gTZ`1X8w_y#D>}=A --50ދ$KWX8'asgr؛嘾MY7ΝrmweR_/;w2l>e ^S S(0ya gtJ/[I5>Ŭaox?&v?dm#ϗٳn.g*/3Dez-T{L?h\"EeI̘!Cdž}fJk:u7o2eO8:!,\J??\/]PfR`Gb  |g)8AVLUnUpƵ8Aշwq22r%h<.ʧ8c +3߭*@g>ǝKKSǿH-y?{K.$a8dyd藰=nyl9! vY@%5"J%{K<8 ұ @ʂ  gg`ȑAK.:a ز }S{w`pṡ>].$%L=xqR9]H .]+Tx}^ĥ4 E  @.|]QY\eG4VI3D ?HYv\xFÞHv` jsCGE 8(ۥstW;sLr@]_=c@n*I9P$DRJ4Z%+(?QF~e4jٺ+WAd_dN +ha?\-aϠ F$Xaqpg8,E: J H?N2a™WbɅ!C {O;:,Y<]hHksn5]n&M<ś2fβ@cy! T /a'@Z #(rY =-`8@l.6H*qpxx4^XJӉ*~!~ʼyMd|wȓYKq@ŠX r#"s $PSr&qgxSX V,[6U|L(?R`P<ZmiiiW2#l8Ekӵ3Dcz ޺OvA9? OQ鶺%8q{l( is,ZDnmR ZF U[[tۆ⋩Zi6=Ǧ ܡp8CAC<ʯ-ii&s*qWwaOl N{ j8fJ >ׄpSxԩMaq2{_l\h,*c/DZ"w#'2q%*Vʾ =4s]+qt2>3_6Jc@aK͛у7ͫi1̞8w_=&CE.xrlؽ;LGU7ݟ{bhEW~+Upi-eڴC ի9C`308 OKtᶡn )mP MU"0Js}߁1'⅙J+I6$PreV\Nv̲rA.N Bzș >4)@[><(?7% B~+>X> pM:KIϞ`_K %i-#"Nd`ΰ;Х;G1h◔K:0s=wtJƏc+%ch\"7|v{k lə1ëYV.<]0Npyoތ=ů/B 9ʭ !<O<>8xZ˖-ë2tBq╏< TnR%_ߍ΂#>itqָ'\߿7JWƥ7Żq˙q qegG'#9Rnnνa" H+ V W<ÄpĹ+< f+k1RիWkp ;TwLX˕4U_8:aIŖtOp:nݵ] 8>67piOq fO/>@QJ 33o46;Zzgf^îa-{6bб`nAăJ147|(mw 0BU.`v+]O'tKg=[Zb %_c' WQZ~]P|N8gȄ{GxH#J4$eka*;PN^ #\=2h!P$ jέ,\]i.ޥiX- aJ6$8-Yʉaai!2ƉwqJS!e͂[mo<OJJ)+믿!' a9*#кqna=aRhtB9h}Up38Iaw? lR{ Kp%)ɰۯ5lXR05FˣO'tK/:8ȣ|8sC,Dɧx+ WiyIfiXPPsCo&N|AfS22'Yq۰i}aҡ{zNJ@;$ٱ'*D W}#;jT4ْg2j q|2jY4t']Z+0 n<RHp2ث y0s]LpO {<("3<_ʕTnI9;T:}4~] :W=sAWb}P99;CKw]7< +^ПG {7739V"+o[$ eKm"wNѸ4-Vuc'"X"hIv?Y J{cABn!nr1aW*¹*5ڍ+qϞb8>z{9VG(x}p;|2&-Gw-oOFJAѸ.{vxx4Wd`' D_E]hwVSO(UpxE-7xx8fOĭpܯerTp ++5Nq|.oKlIL!b i:+8 CqYp?g^mAj87%M7$ݺjjaoDq 7zh!OA>*{1tLp #K~e(]}v? T7j LB09}b-PJYB0LGq? m㯫<9r晝X|[KVPIk0z,D ;itT#%0k"9/ N+oJV1E6\Yΐ[x<$j驽 5LY;8̣#hxmuzOpLxwyy\^Ic`>lldn:ȗ)No N%|7 Pp0uTӧ w1_A嬲T%աeƌkw0F=>]ύXW:}\>ű]#nD<$1O{y/RPBOGаҴ ղ ogt{w#&(#aPn3'aֳHk9&> QB[`;@n.@WˏFN#<-ל|a̓*Ӱc@uQC@?'[,e` ha0╦%Z&&OBb0I d0 Zj8Up*90A H}o7pzjҖ}ݸq}9Rp($J0ea/,t[;Ӱ#h/)=,7W_S}ϑŋ됬e(%ƣ|J=SZnx;mX0<=w ' 8O:ȑGK7\xs̝˭ ](1LD \%wZHq`7n|R+"ӧϔE\(+*ܸ]Hv °WLuWkBSpX<&oc׏5wʧy+}u~a) z[ E\WOnBsq883-eKtХ?oe۶k'J]&Sc&/peq x(,qU@MG͋a?(Mq')^iUKiaf9T\rDќ5JkKT]_,_e9R^*O`־*4Z5NQI iX4@^ asjM(Y1ϓ8ð+ݥ)säk:ĘeEPA5l7!fLF :Y+H +pʕC|p+4I*G O& F~έuxGWOauYq<~ 㼯6'be$  OݭOR }?&4.]h)pٲE_TvJS*#8W*;1?3w@#MAW?' c-4,~2!p Q4npɃb_{R3ϼ%: nUYUJcq*ݼ4y|5 FZy]_yKGq.!= 1"~ 16 ᴐs*n'AYiVB<ʑx1|JS?'=IQxsçykn8 ݋f5ר\S47r݂`Y9*828VxA sZ<G+W)C~`8q+vPOSX-ſ?&*@4uV&L% NW>}%S:i 8Ż4ũ4UP6塯4qq.aưE 2n\@I3*0 @ {ѱ:]onXKWj%u`\_qauO(\\%YH3b9U|wj0O˯tOMG_(Mn8'^B߀M hY2Ir({ܼnqVEߎF%tīмӰ. +t1asqn9XT47y?%);<Uпmj2<`IDATTUŦTIsi.&y8MKfqU?1L4+sӸ|~^SO&_ FӔD4wQi&P~iiiҪJ1%88u&|8͏ti\xW>7=î#Jc˯%TN6(Z_S8{GoŊ|YZqJMߏcܥ3Lx O~ WG Qqy&i.hZ4?7ҕiϮ4jH?Up.i5:0Qٳts+b͚7YiJ>Op}YUiDii4?\ּ\>WSy&)̣ ?;)xC59u̚f[fv 9`QFR>vMJD>qW,U'ΏW:}Mø*`\.Ҽ F;01iיKSh!,_^Zlw"\ uVhEswi qG8}Ź|a3╮xٕ_\F;ʝl~I3W1Q9t'k:t% wds +?+UJœ7S~?Qy(ޛxUŻaҙ0!QG9_>Ab+P+[X]4/%;t邓f{9Q.Vɫ#.QO\MaJ┏FDxr3kWC̔IZ(I\yĢ8 (I:vI'Hٲ?!#*?*ְjOP:îW8Wx_]Ż8 w%q.^׵~i=~ux W:D1>)dxnxqSTQ0p@|_6 (NJW<@ӐKy\Ík~%mZa^j{kO?q1S}֡ .)'ٷIZX 59wf2oNYYduD#@N3_Iڇ,իT^F` rmNJVqv}7<.ƖőOxu87Oʛ_ 87g)4bb1IՕm ([VA?Z-u;`\z եEү rი,ƍxN,{xDkX UJw}؍V^TԀ=1ۨ./O Jx9=9i j-#'J?zcNٿ\D[B4 I#tIeLro tyTX̊ʌ2lڬ"h,mwoSA)j_-˖KK"JkWj?]ӑOi~?4+NW:=%VS؄aLQr#W){mn #0F89!hτf=v3tlbErV-S'{l᨞.C.AZn逗_~Yn6YPJ\G9xB)+Q{RNyh5?SDt !=oG.yO駟J))G!zmxsAfq i@%Pn # G EO ?^Y3ydEd Q|RdȐr57Jv혢À/7ᣝFŀR#fUJҴzi:]X5-}\Yވ#D:i2~xi,'σV>A#0=~)}s2> TagR<-,MyH3 а!3yxYGȿ'XK.&y|VɅ+Je녯;u!&;NOq*ӍixU~WJ0a9y׿CdG2l}м3d |;zw y0[LqqLٺ Uu3s3*θ]c I"6I6!912d1 75[Tm0Kr]wJ-4=;8—y8ͧr;@0]_V-X8!Q|q]87?2޿ tI>! d̞hd dyӈtOD/9G_ |r'Jgʊv8\@>S}c5uG+҉c)q0Jc$ʘ17˩z/ZbMv7],w3}Ns^/~X.LlY@ tN؎_'<OHO'N kzXlN ,YҗB3%q v&fi,rWoC`{,8(hko >E}q?}r~sKl -UJ*;jtJJ4}uf_}MGWCXcn4lX^/~/r' ]!33H7_]( 2Œ`:%5돧Dk#ü9F)w+-nC=&v-7ԭ[oĜL͛̕iTTs -̝SvธEfhhX~N4&|)PL(|Xv"ӧx*1s6ff![3cd!> $6HeXM+`Sϖ{o ?TXr!Ek CJaټΝQT\0l)0LeNݰ+0Q(reޒʻ+|2=2RbLnΝ2 WOW,ME{^zY?!Fyäf62e|A'(`uQPϞ*!74ia¶c㏗C9Yȋp# =*lan04U ,>%ęS 5E # ٪1JX<;;qSTƎE9Ï^6L..zYYx٥ȃ=%geWL΄)m0akrVXaz_|̛76Z-4>n+FOGe<˂g K{Yx1$*ee7lذ(* 1N`.Bqp5XmG~N * dB>ʌQL]xe@%AyD3r}Y&v$,׌`tfacџ-J GZرcƒ0.S˓ر KˬY?Paz 1e! Tx-%^_.ۧf=yj?xX0qaQJGJR\T,Kz(*}d-a׾=Cd|SϒU56׽Q~isw r۷g`NC2kNgX>=phHNkrSDӿ\98%[e)}jr M/185*џ0W]"oN ?,śK2_xxɱh}->\J4S(L['zz Ӥ7R:bQ 4nX⧨ @?;&6O;S| De!5ŋLn޼KzXX>|!EnAFL\q茹mEwb,eJqpF2H *Rj+R:ErU3w( ~L=5qe3SQ];E'؇^g@\/6q3HCnpIEiBt#THrA4)!GI2qCUӳf(3 D|`D~8ü $__d3 ~KLE7 n<9P[FuOYr4kfR3 gFLSʼn34~&n8l9i@&/ W.,?zxu:D^|Ey䑒4P M ZK @^A'S 'H c>Ȩ7IJXƯC$\,lNLkz@? #`@0T]-$w]oW\izP2%s'#Bi`փ=p2s IG16؎)vÞ`Q@X:x*>1dG GJ뚗D>a6KV8Tj' X$}X9 b䶬bymahH=yrXo~a@ c`Cc L6 z{'ˇ"2KG^;('z+W`c˭<@2+V,t 4LZr@Q5Xz6Y]ˆLcbE({LV ΀:n:K޸fY&ʨKA'䲛p^1# aICQW%& DضM{Msst1~AT/pp< lǡڴ Ʃ8 pDl+oZh?&ǩFHUpLɴz!˴1eϛP1|U9Q XCC>Wcip_3a4i I";wݲF˟1gϠxAQthѡM/;vr 4KL,ˀLE#n7cV"2y SkD^ q4oX{|E,εzȾ*F@BFF|t<$d qq XA/kj4ȃ:C7 7=0JCaX-knxU8<<^RMBL%,g ĐWcsG5Ï KE/ lڴfN)9M= +7SJ?*`Y-E/*:8~W^Mʫ1+7@Q&q1!xwtM0a")c| } `Ifö@&[hJgh~-YxLzx,c[l%`l ỶbEe(UđD̩_V**j:u-cFjAkɑQtf?%^Zp=0ɋ fpZ'j!6lذ!XHܟ쁿$].G:?]>`>􅖴( ZCydj oL_2j G%xA&B-Dl`p&l%aؼx@N:ѐGށZ1O8Q/f}_˵3c/K/ߋM@Mx/F"5xpb׎ʢ aT">Q' ʄeW>/U7^2Լ!0~>箿M{w'VTP܊%1&rȇS-?#lR(ar)lؠuTQ%XBc` z8MBәE+dKK睛l sI"N;sEdҭ[7N@7]v^0:t(>sSDj׮m>3e;*~P#O_ڃ371Ok+~'᥏x]xBnzv5[ W&ykz,Hf~]ҪmɦPh)`ԍ;VQ6Ib¶Pb[y!o[xj~Hgr54nBP& ɑ-O? TwG#*ȼ(?ٳg'kpy[<&lX]qV~g1grUFe0QMO(bv­yopt^2Oie:&a-fe{0H k=Զd~^>دjH:u$?m9 ~~n̿?@[.^-I@eWwr'ќ,g>ȉ8ዕ`6o}-#v{iP8^V|V-CEcIͯmIlF߽ilq?o]ia zH5Nj ~Sqf:&L y,'Tp'T9W67jr:CkyWyӒAb'8qgKrV<21D柀0Le$0DzXX~b/X\h߽d="nɐߏJݺudsJիWݻˈ#zaJ(Y񥮕+,y=y)X:nIPlrՌh!BFckmЄUOi]sZ3>EE⭹kh~ OY3Pp jk)k?_FxÕ+O#ѳgO7}1>6^7Y)ڶm%VLҼYPG8[*@diH3:0'i1gg꒏8<\i-aTf< &3imF'=>ۻ*s% ’v$ " "*kEx(>W-pT B*uA Q@A -R˾/BHȝy@6܅IΝ3ߜw.mdÆ ꘰f]te˖ŋ2P嫈b2J![Dɀyجp~|^9ă?A{E)T?@@+wv ZJ!fOo[#Ψ9gkiP?zaZC3VE7jj۶H\K/ -ZHڴiNr㐣|GZUU\>hS00ȃϚzÃm1 haT#MKPM3/S p342`18DҴIٱclW<8DC Ç WxqOQQM-Kd YpL݁TRܷ;)nղ{SۆrL; *j@9;Y$[Ʉ= ]iz =WRzP.A*p{"cĔ&+Ȱa }u`Jwbh5k֔k&H߄{q,hɛ; IzZǹx{bƩ,,? &pf,+6k: , zx V`OXFgF冒Qw2u!l߾]U((idĉɓb|xp+[VC]rՖ5GdBJ5hz,rk'_Y/IwM}xft LcAʅތp6Z%Ke1r73:Uy{p&# yꩧ pZt`qa #3FWi$<؜쒧q'yBT\ln.WmԠb$ͼFG Ls_(J0 qbyn#M z>L#O++i1 i4TdǸpŁqsIyxȱPOV+IcǎIXXT 4h\ |K~~&/IGdJL-N@c$ -5)`ulHͣ>aϏ>=Q$` e{2yǷNv &h2 ͈ܯKtLi+Pq1W`Oޫ4iK-w-Qkx^8,D\dKzu9󃴇Fh. J`QXnXOM©yV(·›U 2+A?0&ľ'MH_)LLl^a7bJΝxK#+ SNc̙3+07$mqN"zIln 4*`}`f$e`/flp䞃@' gbՂz 3YK9X vpPQ&TR$뉳b!nc# PB\R?@M˿ 0,D 9ϸ$ 0Id! &^Af5L^ 궔::ؚFTQ@<}foNLV&0m%+u=ҶC_;O-6|i֬<1 v>7Y{ʦM[}Ӣwl\r[ ƒA/%ԭHI)u2#wmnVlh tfSϴ0z`IK0Q-O8};3ޔjMU|_'>w"Eo)JlOH/#:'\QY%,?Rۍ]E]|"!$*IR6*<דc*Af͒#F(ceJ^lAGvueP$hM~AVm5.I[DU%@R@kQi_s_@Hx+`4[Tm(Tkp6iJ $ g2n7XbO111l_ʫNgq ON_[TWސyB\ovZbȅ 6->GgOkۅH*! 7?rD\~.i >"r`󒘘(55YgktyUQ8xptzkΝڧ&i?"/,ZD3Z䶛F-=a*L?OZqdܢ+D]->RQݶ{?;Po7Zg}VBѿK`M(./oup5_2erJٲ5Cfʼozh{5Vv_yrut%S۠"҄<yP~w*v*`ov73vM6? |w%CP;w[ Vx~*1 <ä\xO82 S4iT ͔Q?,zfԊN=Bfv76Mp 8w;S PIPJFk ^غup+5 /;d~?M{eON,4o_xxz_d<]t-W{F561J2مp3Wn@QfU馛~ WZ*τHW% rMc<=d3CѬ! C^|]?kHB,zQ%+ooWP>m3Qvw7bhyN`2z(ᭃW꺺R,潆|Ux wYB-]=\uq{u@ñ5kEWlk0iW$[[sF{נbʸ{2E]~2sY7E\!y]Lª֏7#p7enl& Ito87PgΜQ_j܉Q۟G/LV0Gey`޾W ǁL9 Ń33}Gfϙ+իUqME" 9{A}G .kAIz12?n)c{HHD3Җ2ә41?7P^czyI]xV,6r[e|y.C3U盐:=䓉ڵ1/… ܹsdeKzpc7ne IO.?C2-~M4[-йspHm;V'KPVo9o! `X$ $!!.VP?<;# sqrϺ73{.gHhQj23z U[kG Ʉn|*wDen)>x7 %2\e(M46?*X:Q^\C=׮?~&c_| ym!6$ '&v/[2`Z; T/uih-~ (sZSS*^bcB`T *1EQ dd\R~!dU#GQFIJ*`v޿2.i[( H\hjx!ڐ% SCmZ9ƼK2|~h~WK !@l `[0pi3z9TINNSh$uQ1i)B`8IMHUzc'Oɮ]e-˥K'e*_=7WnD(OxG}$|rO=:ח=X̀?_*Ž4d:C'I߷l=(W׼R%hUqM4˛CTb3!؍xƠׁSPE ˝޽o3&횜j=m]Oo1 0(0w dX%kN-rdd˥+:Nf`"=?"LHX"\) pRi*_~ȐL_wIak:ZK* r?J[KrSeY|]o1dNr蔚5mr+K*"nu*NJWkhˆ2/K&VMJ4츩g=fM/ۊfjdɋAN9 >I( ~ٸk:6Ƹ"K(M6ңͥٮv>-&sV r +/PyCGJeF nuZy@ +q7$aSɊ- /u*4*NPl5x*8Z5LNOТtʨ.& k70<!L9= `Nq1Xfw4>{ Қ]Q]Mcs5^Ωs~'kD@̏oO" 5D cE:oM׆B> XAp*wsJm`ش4TMD\2%B. `DziR7{ (d><7X2וŒ/|67sJ\<XZA'` CfXpkʹX΃ڜh