├── src ├── switch_game.asm ├── uni-bios.sha256 ├── uni-bios-pnm.sha256 ├── save_soft_dips.asm ├── evict_from_attract_mode.asm ├── load_soft_dips.asm ├── find_names.py ├── games.csv └── build ├── uni-bios_4_0_PICKnMIX.bps ├── uni-bios_4_0_BackToMenu.bps ├── README.MD ├── uni-bios_4_0_PICKnMIX.csv └── LICENSE /src/switch_game.asm: -------------------------------------------------------------------------------- 1 | move.w d0,0x2c0fee ; switch game 2 | rts -------------------------------------------------------------------------------- /src/uni-bios.sha256: -------------------------------------------------------------------------------- 1 | e016ce75097df0b5f5910e8eb4914439f5c77511de65df5a1e089eef147b256b uni-bios.rom 2 | -------------------------------------------------------------------------------- /src/uni-bios-pnm.sha256: -------------------------------------------------------------------------------- 1 | a89e2dddd23ebcb3a46f9481ed3799a566505712f6331dec63245bab0a390617 uni-bios-pnm.rom 2 | -------------------------------------------------------------------------------- /uni-bios_4_0_PICKnMIX.bps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zardam/ub_vortex_multicart/HEAD/uni-bios_4_0_PICKnMIX.bps -------------------------------------------------------------------------------- /uni-bios_4_0_BackToMenu.bps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zardam/ub_vortex_multicart/HEAD/uni-bios_4_0_BackToMenu.bps -------------------------------------------------------------------------------- /src/save_soft_dips.asm: -------------------------------------------------------------------------------- 1 | ; set soft dips as saved 2 | lea 0xd07320,a0 3 | add.w 0x10fd68,a0 4 | st.b (a0) 5 | ; save soft dips 6 | clr.l d0 7 | move.w 0x10fd68,d0 8 | lsl.w #4,d0 9 | lea 0xd07420,a1 10 | add.w d0,a1 11 | lea 0x108120,a0 12 | move.l (a0)+,(a1)+ 13 | move.l (a0)+,(a1)+ 14 | move.l (a0)+,(a1)+ 15 | move.l (a0)+,(a1)+ 16 | rts -------------------------------------------------------------------------------- /src/evict_from_attract_mode.asm: -------------------------------------------------------------------------------- 1 | ;move.w 0x10fd68,d0 2 | ;addq.w #1,d0 3 | 4 | check_overflow: 5 | cmp.w #0x9e,d0 6 | blt.b evict 7 | subi.w #0x9e,d0 8 | 9 | evict: 10 | cmp.w #154,d0 ; XEVIOUS (stuck on splash screen) 11 | beq next 12 | cmp.w #126,d0 ; THE EYE OF TYPHOON (crash) 13 | beq next 14 | 15 | bra exit 16 | next: 17 | addq.w #1,d0 18 | bra check_overflow 19 | 20 | exit: 21 | jmp 0xc0a5ce -------------------------------------------------------------------------------- /src/load_soft_dips.asm: -------------------------------------------------------------------------------- 1 | ; check if saved 2 | clr.l d0 3 | move.w 0x10fd68,d0 4 | lea 0xd07320,a1 5 | add.w d0,a1 6 | lsl.w #4,d0 7 | lea 0xd07420,a0 8 | add.w d0,a0 9 | tst.b (a1) 10 | bne copy 11 | ; load from cartridge 12 | jsr 0xc04418 ; switch to new game 13 | jsr 0xc11612 ; load default soft dips from cartridge 14 | lea 0x10fd84,a0 15 | copy: 16 | ; copy to expected location 17 | lea 0x108120,a1 18 | move.l (a0)+,(a1)+ 19 | move.l (a0)+,(a1)+ 20 | move.l (a0)+,(a1)+ 21 | move.l (a0)+,(a1)+ 22 | rts -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # Patches for UNIBIOS 4.0 2 | 3 | - UNIBIOS created by [Razoola](http://unibios.free.fr) 4 | - Initial patch by [ArcadeTV](https://github.com/ArcadeTV/neogeo-menu) 5 | - Multicart by [Vortex](https://github.com/xvortex/VTXCart) 6 | 7 | ## Patching 8 | 9 | 1. Obtain the [UNIBIOS 4.0 ROM](http://unibios.free.fr/download/uni-bios-40.zip). 10 | 2. Use the BPS patch file to patch your ROM. I recommend [FLIPS](https://dl.smwcentral.net/11474/floating.zip). 11 | 12 | ## [uni-bios_4_0_BackToMenu.bps](uni-bios_4_0_BackToMenu.bps) 13 | 14 | With this patch, keeping B pressed while soft rebooting from the in game menu will make the multicart boot on the menu. 15 | 16 | ## [uni-bios_4_0_PICKnMIX.bps](uni-bios_4_0_PICKnMIX.bps) 17 | 18 | This patch enables PICKnMIX feature for a custom 161in1 cart, with some limitations: 19 | - Always boots to PICKnMIX, even with a normal game cartridge. 20 | - Works on MVS only (backup RAM used to store soft dips). 21 | - No high score save. 22 | - Tested on a MV1A only. 23 | - Game list (titles and order) is hardcoded. The custom 161in1 cart must have been created with this one: [uni-bios_4_0_PICKnMIX.csv](uni-bios_4_0_PICKnMIX.csv). 24 | - Use at your own risk! -------------------------------------------------------------------------------- /src/find_names.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import csv 4 | 5 | def get_name(bytes, index): 6 | name = "" 7 | while bytes[index] != 0xfe: 8 | name = name + chr(bytes[index]) 9 | index += 1 10 | return name 11 | 12 | result = [] 13 | with open('games.csv', newline='') as csvfile: 14 | with open('output/uni-bios_r.rom', 'rb') as bios: 15 | ba = bytearray(bios.read()) 16 | spamreader = csv.reader(csvfile, delimiter=',') 17 | for i, row in enumerate(spamreader): 18 | if len(row) > 2: 19 | game_name = row[2] 20 | else: 21 | game_name = get_name(ba, int(row[1], 16)) 22 | result.append([i, int(row[1], 16) - 4, row[0], game_name]) 23 | #print(", ".join(result[-1])) 24 | 25 | result.sort(key=lambda r: r[-1]) 26 | 27 | with open('output/games.bin', 'wb') as output: 28 | for i, row in enumerate(result): 29 | print(str(i) + ', ' + hex(row[1]) +': ' + str(row)) 30 | output.write(row[0].to_bytes(1, 'big')) 31 | for row in result: 32 | output.write(row[1].to_bytes(2, 'big')) 33 | 34 | output.write(b'\x0a\x20') 35 | # ab4a 36 | output.write('SUPER SIDEKICKS 4 '.encode('utf8')) # 18 37 | output.write(b'\xfe\x00') 38 | 39 | output.write(b'\x0a\x20') 40 | # ab60 41 | output.write('METAL SLUG 2 TURBO'.encode('utf8')) # 18 42 | output.write(b'\xfe\x00') 43 | 44 | output.write(b'\x0f\x20') 45 | # ab76 46 | output.write('XEVIOUS '.encode('utf8')) # 8 47 | output.write(b'\xfe\x00') 48 | 49 | output.write(b'\x0a\x20') 50 | # ab82 51 | output.write('THE EYE OF TYPHOON'.encode('utf8')) # 18 52 | output.write(b'\xfe\x00') 53 | 54 | output.write(b'\x0d\x20') 55 | # ab98 56 | output.write('XENO CRISIS '.encode('utf8')) # 12 57 | output.write(b'\xfe\x00') 58 | 59 | # Padding of titles 60 | #(26-l)/2+6 61 | #2 12 62 | #4 11 63 | #6 10 64 | #8 0f 65 | #10 0e 66 | #12 0d 67 | #14 0c 68 | #16 0b 69 | #18 0a 70 | #20 09 71 | #22 08 72 | #24 07 73 | #26 06 74 | -------------------------------------------------------------------------------- /uni-bios_4_0_PICKnMIX.csv: -------------------------------------------------------------------------------- 1 | nam1975 2 | bstars 3 | tpgolf 4 | mahretsu 5 | maglord 6 | ridhero 7 | alpham2 8 | ncombat 9 | cyberlip 10 | superspy 11 | mutnat 12 | kotm 13 | sengoku 14 | burningf 15 | lbowling 16 | gpilots 17 | joyjoy 18 | bjourney 19 | quizdais 20 | lresort 21 | eightman 22 | minasan 23 | legendos 24 | 2020bb 25 | socbrawl 26 | roboarmy 27 | fatfury1 28 | fbfrenzy 29 | bakatono 30 | crsword 31 | trally 32 | kotm2 33 | sengoku2 34 | bstars2 35 | quizdai2 36 | 3countb 37 | aof 38 | samsho 39 | tophuntr 40 | fatfury2 41 | janshin 42 | androdun 43 | ncommand 44 | viewpoin 45 | ssideki 46 | wh1 47 | crswd2bl 48 | kof94 49 | aof2 50 | wh2 51 | fatfursp 52 | savagere 53 | fightfev 54 | ssideki2 55 | spinmast 56 | samsho2 57 | wh2j 58 | wjammers 59 | karnovr 60 | gururin 61 | pspikes2 62 | fatfury3 63 | zupapa 64 | b2b 65 | panicbom 66 | aodk 67 | sonicwi2 68 | zedblade 69 | galaxyfg 70 | strhoop 71 | quizkof 72 | ssideki3 73 | doubledr 74 | pbobblen 75 | kof95 76 | tws96 77 | samsho3 78 | stakwin 79 | pulstar 80 | whp 81 | kabukikl 82 | neobombe 83 | gowcaizr 84 | rbff1 85 | aof3 86 | sonicwi3 87 | froman2b 88 | turfmast 89 | mslug 90 | puzzledp 91 | moshougi 92 | marukodq 93 | neomrdo 94 | sdodgeb 95 | goalx3 96 | zintrckb 97 | overtop 98 | neodrift 99 | kof96 100 | ssideki4 101 | kizuna 102 | ninjamas 103 | ragnagrd 104 | pgoal 105 | ironclad 106 | magdrop2 107 | samsho4 108 | rbffspec 109 | twinspri 110 | wakuwak7 111 | stakwin2 112 | ghostlop 113 | breakers 114 | miexchng 115 | kof97 116 | magdrop3 117 | lastblad 118 | puzzldpr 119 | irrmaze 120 | popbounc 121 | shocktro 122 | blazstar 123 | rbff2 124 | mslug2 125 | mslug2t 126 | kof98 127 | lastbld2 128 | neocup98 129 | breakrev 130 | shocktr2 131 | flipshot 132 | pbobbl2n 133 | ctomaday 134 | mslugx 135 | kof99b 136 | ganryu 137 | garoub 138 | s1945p 139 | preisle2 140 | mslug3b 141 | kof2000b 142 | bangbead 143 | nitd 144 | sengoku3 145 | kof2001 146 | mslug4b 147 | rotd 148 | kof2002 149 | matrimb 150 | pnyaa 151 | mslug5b 152 | svcb 153 | samsho5 154 | kof2003b 155 | samsh5sp 156 | xevious 157 | teot 158 | xenocrisis 159 | -------------------------------------------------------------------------------- /src/games.csv: -------------------------------------------------------------------------------- 1 | nam1975,b156 2 | bstars,b186 3 | tpgolf,b1b4 4 | mahretsu,b1da 5 | maglord,b22e 6 | ridhero,b2a6 7 | alpham2,b310 8 | ncombat,b38a 9 | cyberlip,b3fa 10 | superspy,b454 11 | mutnat,b4b8 12 | kotm,b4fc 13 | sengoku,b57a 14 | burningf,b5b6 15 | lbowling,b5e6 16 | gpilots,b646 17 | joyjoy,b680 18 | bjourney,b6e6 19 | quizdais,b716 20 | lresort,b790 21 | eightman,b7f4 22 | minasan,b80c 23 | legendos,b842 24 | 2020bb,b878 25 | socbrawl,b8b4 26 | roboarmy,b912 27 | fatfury1,b95c 28 | fbfrenzy,b982 29 | bakatono,b9a2 30 | crsword,ba20 31 | trally,bab2 32 | kotm2,baf2 33 | sengoku2,bb72 34 | bstars2,bbbc 35 | quizdai2,bc2a 36 | 3countb,bc6a 37 | aof,bce0 38 | samsho,bd4e 39 | tophuntr,bdb6 40 | fatfury2,be2a 41 | janshin,be46 42 | androdun,bec0 43 | ncommand,bf2a 44 | viewpoin,bf7e 45 | ssideki,bfc8 46 | wh1,c024 47 | crswd2bl,ba86 48 | kof94,c094 49 | aof2,c116 50 | wh2,c168 51 | fatfursp,c1d4 52 | savagere,c21a 53 | fightfev,c24e 54 | ssideki2,c282 55 | spinmast,c2ce 56 | samsho2,c344 57 | wh2j,c3ac 58 | wjammers,c3f2 59 | karnovr,c426 60 | gururin,c4a0 61 | pspikes2,c4ee 62 | fatfury3,c584 63 | zupapa,c5d6 64 | b2b,afa4 65 | panicbom,c60a 66 | aodk,c63e 67 | sonicwi2,c69e 68 | zedblade,c718 69 | galaxyfg,c76e 70 | strhoop,c7ae 71 | quizkof,c7e8 72 | ssideki3,c826 73 | doubledr,c872 74 | pbobblen,c8a2 75 | kof95,c91a 76 | tws96,c966 77 | samsho3,c9da 78 | stakwin,ca56 79 | pulstar,ca98 80 | whp,cb0a 81 | kabukikl,cb88 82 | neobombe,cbfe 83 | gowcaizr,cc4c 84 | rbff1,ccc6 85 | aof3,cd44 86 | sonicwi3,cdc0 87 | froman2b,afc6 88 | turfmast,ce34 89 | mslug,cf22 90 | puzzledp,cf54 91 | moshougi,cf6a 92 | marukodq,cf98 93 | neomrdo,cfe0 94 | sdodgeb,d03c 95 | goalx3,d080 96 | zintrckb,b028 97 | overtop,d0ae 98 | neodrift,d0fc 99 | kof96,d174 100 | ssideki4,ab4a,SUPER SIDEKICKS 4 101 | kizuna,d1fe 102 | ninjamas,d278 103 | ragnagrd,d2d2 104 | pgoal,d304 105 | ironclad,e7f4 106 | magdrop2,d340 107 | samsho4,d3a8 108 | rbffspec,d43c 109 | twinspri,d4a8 110 | wakuwak7,d526 111 | stakwin2,d596 112 | ghostlop,e67a 113 | breakers,d5e6 114 | miexchng,d628 115 | kof97,d6a8 116 | magdrop3,d706 117 | lastblad,d768 118 | puzzldpr,d7b4 119 | irrmaze,d81c 120 | popbounc,d846 121 | shocktro,d8b8 122 | blazstar,d90c 123 | rbff2,d982 124 | mslug2,da02 125 | mslug2t,ab60,METAL SLUG 2 TURBO 126 | kof98,da78 127 | lastbld2,dafa 128 | neocup98,db32 129 | breakrev,db80 130 | shocktr2,dbfa 131 | flipshot,dc8c 132 | pbobbl2n,dcbe 133 | ctomaday,dd14 134 | mslugx,dd8e 135 | kof99b,de04 136 | ganryu,de86 137 | garoub,deea 138 | s1945p,df6e 139 | preisle2,dfde 140 | mslug3b,e05a 141 | kof2000b,e0dc 142 | bangbead,e130 143 | nitd,e19e 144 | sengoku3,e21e 145 | kof2001,e292 146 | mslug4b,e316 147 | rotd,e386 148 | kof2002,e404 149 | matrimb,e4d2 150 | pnyaa,e698 151 | mslug5b,e652 152 | svcb,e546 153 | samsho5,e5d6 154 | kof2003b,e6f8 155 | samsh5sp,e770 156 | xevious,ab76,XEVIOUS 157 | teot,ab82,THE EYE OF TYPHOON 158 | xenocrisis,ab98,XENO CRISIS -------------------------------------------------------------------------------- /src/build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | 4 | sha256sum -c uni-bios.sha256 5 | 6 | mkdir -p output 7 | cp uni-bios.rom uni-bios-pnm.rom 8 | dd if=uni-bios.rom of=output/uni-bios_r.rom conv=swab status=none 9 | 10 | for f in *.asm; do 11 | vasm/vasmm68k_std -Fbin -m68000 -quiet -o "output/${f%.asm}.bin" "${f}" 12 | done 13 | 14 | patch () { 15 | dd of=uni-bios-pnm.rom obs=1 seek=$(printf "%d" $1) conv=notrunc,swab status=none 16 | } 17 | 18 | printf 'vPnM' | patch 0x1c1ec 19 | 20 | # Bypass protection crash (replace beq.b by bra.b) 21 | printf '\x60' | patch 0x1e9e9 22 | 23 | # Skip checksum test 24 | printf '\x4e\x71\x4e\x71' | patch 0x11c62 25 | 26 | # NOP 161 in 1 detection 27 | printf '\x4e\x71' | patch 0x4478 28 | printf '\x4e\x71' | patch 0x4484 29 | 30 | # Avoid bug/protection in mess_out ? 31 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0x488c 32 | 33 | # Auto press key pnm at boot 34 | printf '\x4e\x71' | patch 0x4498 35 | printf '\x60' | patch 0x449f 36 | 37 | ## Remove calls to original 161 in 1 menu 38 | # ???? 39 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0x44b2 40 | # pnm_init_softdips 41 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0x4574 42 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0x457a 43 | printf '\x4e\x71' | patch 0x4588 44 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0x458a 45 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0x45b2 46 | # Do not call Kof99 RAM routine 47 | printf '\x60' | patch 0x476d 48 | # pnm_save_softdips 49 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0xa830 50 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0xa836 51 | # pnm_load_soft_dips 52 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0xa89c 53 | printf '\x4e\x71\x4e\x71\x4e\x71' | patch 0xa8a2 54 | printf '\x4e\x71' | patch 0xa8b2 55 | 56 | # Patch load/save soft dips to backup ram 57 | printf '\x4e\xb9\x00\xc0\xab\xa6' | patch 0x4572 58 | printf '\x4e\xb9\x00\xc0\xab\xa6' | patch 0xa896 59 | printf '\x4e\xb9\x00\xc0\xab\xe6' | patch 0xa82a 60 | 61 | # Load/save soft dips functions 62 | cat output/load_soft_dips.bin | patch 0xaba6 63 | cat output/save_soft_dips.bin | patch 0xabe6 64 | 65 | # Patch switch game 66 | cat output/switch_game.bin | patch 0x0441c 67 | 68 | # Ignore high score backup 69 | printf '\x60' | patch 0xa74b 70 | printf '\x60' | patch 0xa77d 71 | 72 | # Add new game list, change game count 73 | python3 find_names.py > /dev/null 74 | cat output/games.bin | patch 0xa96e 75 | printf '\x07\x96' | patch 0xa276 # Move game list 76 | printf '\x9e' | patch 0xa2c0 77 | printf '\x9e' | patch 0xa3e4 78 | printf '\x9d' | patch 0xa3f8 79 | printf '\x9e' | patch 0xa408 80 | printf '\x9e' | patch 0xa416 81 | printf '\x9e' | patch 0xa41c 82 | printf '\x9e' | patch 0xa5aa 83 | printf '\x9e' | patch 0xa5b0 84 | printf '\x9e' | patch 0x47f4 85 | printf '\x9e' | patch 0x44f6 86 | printf '\x9d' | patch 0x47ec 87 | 88 | # Game index before 0 and after last in menu 89 | printf '\x99' | patch 0xa266 90 | printf '\xa7' | patch 0xa262 91 | 92 | # Correct earlier signed move 93 | printf '\x1b\x41\x0a\x69' | patch 0x47fa 94 | 95 | # Evict Xevious from attract mode 96 | printf '\x4e\xf9\x00\xc1\xff\xd0' | patch 0xa5a8 97 | cat output/evict_from_attract_mode.bin | patch 0x1ffd0 98 | 99 | sha256sum -c uni-bios-pnm.sha256 100 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | --------------------------------------------------------------------------------