0001 0000 ; ************************************ 0002 0000 ; dekompilace hry AUTO pro PMD-85 0003 0000 ; kontrola provedena na binární úrovni 0004 0000 ; 20.09.2013 dekompilace programu 0005 0000 ; ************************************ 0006 0000 0007 0000 ; ************* 0008 0000 ; konstanty hry 0009 0000 ; ************* 0010 0000 0011 0000 A_LOGO .equ 0c224h ; adresa pro vykreslení loga 0012 0000 A_POHA .equ 0c602h ; adresa textu počet havárií 0013 0000 A_POSC .equ 0c800h ; adresa horního konce cesty 0014 0000 A_POSCL .equ 0c802h ; adresa výchozí hodnoty levé krajnice 0015 0000 A_POSCR .equ 0c82bh ; adresa výchozí hodnoty pravé krajnice 0016 0000 A_POSPA .equ 0c600h ; adresa cílové pásky 0017 0000 A_NAPCL .equ 0c814h ; adresa nápisu cíl 0018 0000 A_POSVL .equ 0efffh ; adresa horizontály autíčka 0019 0000 A_POSV .equ 0f018h ; adresa výchozí pozice autíčka 0020 0000 A_UPSCR .equ 0c2h ; high byte adresy VRAM pro dojezd auta 0021 0000 A_DNPTH .equ 0fch ; high byte adresy dolního konce cesty 0022 0000 A_NKOL .equ 5 ; počet kol po zúžení cesty 0023 0000 A_SPFKT .equ 4 ; poměr rychlosti jízdy a řízení 0024 0000 A_DELAY .equ 1770h ; initial delay 0025 0000 A_VPIXS .equ 8 ; počet vert. scrolů na 1 pohyb 0026 0000 0027 0000 ; ************************** 0028 0000 ; konstanty hardware a BIOSu 0029 0000 ; ************************** 0030 0000 0031 0000 kbdout .equ 0f4h ; výstupní port klávesnice 0032 0000 kbdin .equ 0f5h ; vstupní port klávesnice 0033 0000 kbdled .equ 0f6h ; LED port klávesnice 0034 0000 prnpos .equ 0c03eh ; pozice na obrazovce pro tisk znaku 0035 0000 bios .equ 8000h ; začátek BIOSu - zde vzorek šumu 0036 0000 prtout .equ 8500h ; tisk znaku 0037 0000 0038 0000 ; *************** 0039 0000 ; vlastní program 0040 0000 ; *************** 0041 0000 0042 2000 .org 2000h 0043 2000 0044 2000 ; ************ 0045 2000 ; inicializace 0046 2000 ; ************ 0047 2000 0048 2000 21 A5 22 A_RST: lxi h,A_NHAV ; vynulovat počet kolizí 0049 2003 36 30 mvi m,'0' 0050 2005 2B dcx h 0051 2006 36 30 mvi m,'0' 0052 2008 2B dcx h 0053 2009 36 30 mvi m,'0' 0054 200B 21 70 24 lxi h,A_MLDY ; připravit závěrečnou melodii 0055 200E 22 98 23 shld A_PSND 0056 2011 3E 1C mvi a,1ch ; vymazat obrazovku 0057 2013 CD 00 85 call prtout 0058 2016 21 AE 23 lxi h,A_PATH ; tabulka mapy cesty 0059 2019 22 9A 23 shld A_UPTH 0060 201C 3E 04 mvi a,A_SPFKT ; poměr rychlosti jízdy a řízení 0061 201E 32 9C 23 sta A_SPED 0062 2021 3E 05 mvi a,A_NKOL ; počet okruhů k odjetí 0063 2023 32 9D 23 sta A_KOLA 0064 2026 21 02 C8 lxi h,A_POSCL ; výchozí pozice levé krajnice 0065 2029 22 9E 23 shld A_LPTH 0066 202C 21 2B C8 lxi h,A_POSCR ; výchozí pozice pravé krajnice 0067 202F 22 A0 23 shld A_RPTH 0068 2032 AF xra a ; bitová pozice auta 0069 2033 32 A2 23 sta A_CARS 0070 2036 21 18 F0 lxi h,A_POSV ; výchozí pozice autíčka 0071 2039 22 A3 23 shld A_CARA 0072 203C 3E 08 mvi a,A_VPIXS ; počet jemných vert. scrollů 0073 203E 32 A5 23 sta A_ROLL 0074 2041 21 70 17 lxi h,A_DELAY ; počáteční rychlost jízdy 0075 2044 22 A6 23 shld A_TIMR 0076 2047 22 AC 23 shld A_VDLY 0077 204A 21 C7 22 lxi h,A_SPDT ; zrychlovací tabulka 0078 204D 22 AA 23 shld A_PGAZ 0079 2050 CD F4 21 call A_SHWC ; nakreslit autíčko 0080 2053 CD EF 22 call A_SHLG ; nakreslit logo 0081 2056 CD AC 22 call A_PRNH ; vytisknout počet havárií 0082 2059 C3 36 22 jmp A_LOOP ; a skok do hlavní smyčky 0083 205C 0084 205C ; *************************************** 0085 205C ; posune krajnici a okolí dolů o 8 pixelů 0086 205C ; *************************************** 0087 205C 0088 205C 3E 3F A_SCRL: mvi a,3fh 0089 205E BE A_SCR1: cmp m 0090 205F C2 67 20 jnz A_SCR2 0091 2062 24 inr h ; posunout o 8 mikrořádků dolů 0092 2063 24 inr h 0093 2064 C3 5E 20 jmp A_SCR1 0094 2067 0095 2067 77 A_SCR2: mov m,a 0096 2068 2C inr l 0097 2069 BE cmp m 0098 206A CA 79 20 jz A_SCR3 0099 206D 2D dcr l 0100 206E 2D dcr l 0101 206F BE cmp m 0102 2070 C2 7F 20 jnz A_SCR4 0103 2073 71 mov m,c ; cesta jde směrem dolů doleva 0104 2074 24 inr h 0105 2075 24 inr h 0106 2076 C3 5E 20 jmp A_SCR1 0107 2079 0108 2079 70 A_SCR3: mov m,b ; cesta jde směrem dolů doprava 0109 207A 24 inr h 0110 207B 24 inr h 0111 207C C3 5E 20 jmp A_SCR1 0112 207F 0113 207F 2C A_SCR4: inr l ; návrat zpět do přímého kurzu 0114 2080 7C mov a,h ; a odmazání spodního konce cesty 0115 2081 E6 01 ani 1 0116 2083 F6 FC ori A_DNPTH 0117 2085 67 mov h,a 0118 2086 36 00 mvi m,0 0119 2088 C9 ret 0120 2089 0121 2089 ; ****************** 0122 2089 ; jeden scroll cesty 0123 2089 ; ****************** 0124 2089 0125 2089 2A 9E 23 A_SCRO: lhld A_LPTH ; odscrolovat levou krajnici 0126 208C 01 7F 00 lxi b,7fh ; C = vzorek cesty nalevo od krajnice 0127 208F CD 5C 20 call A_SCRL ; B = vzorek cesty napravo od krajnice 0128 2092 2A 9E 23 lhld A_LPTH ; posun na další mikrořádek 0129 2095 11 40 00 lxi d,64 0130 2098 19 dad d 0131 2099 22 9E 23 shld A_LPTH 0132 209C 0133 209C 2A A0 23 lhld A_RPTH ; adekvátně odscrolovat pravou krajnici 0134 209F 01 00 7F lxi b,7f00h 0135 20A2 CD 5C 20 call A_SCRL 0136 20A5 2A A0 23 lhld A_RPTH 0137 20A8 11 40 00 lxi d,64 0138 20AB 19 dad d 0139 20AC 22 A0 23 shld A_RPTH 0140 20AF 0141 20AF 3A A3 23 lda A_CARA ; zase jeden test na kolizi 0142 20B2 6F mov l,a 0143 20B3 26 F0 mvi h,A_POSV/256 ; část "adresy" autíčka 0144 20B5 3E 3F mvi a,3fh 0145 20B7 BE cmp m 0146 20B8 CA 35 21 jz A_KOLI ; kolize "levým kolem" 0147 20BB 2C inr l 0148 20BC BE cmp m 0149 20BD CA 35 21 jz A_KOLI ; kolize "pravým kolem" 0150 20C0 0151 20C0 21 A5 23 A_NXTP: lxi h,A_ROLL ; další z 8 pixelových rovin 0152 20C3 35 dcr m 0153 20C4 C0 rnz 0154 20C5 36 08 mvi m,A_VPIXS 0155 20C7 0156 20C7 2A 9E 23 lhld A_LPTH ; odmaskovat adresu scrollingu 0157 20CA 7C mov a,h 0158 20CB E6 C8 ani A_POSC/256 0159 20CD 67 mov h,a 0160 20CE 7D mov a,l 0161 20CF E6 3F ani 3fh 0162 20D1 6F mov l,a 0163 20D2 22 9E 23 shld A_LPTH 0164 20D5 0165 20D5 2A A0 23 lhld A_RPTH ; totéž u pravé krajnice 0166 20D8 7C mov a,h 0167 20D9 E6 C8 ani A_POSC/256 0168 20DB 67 mov h,a 0169 20DC 7D mov a,l 0170 20DD E6 3F ani 3fh 0171 20DF 6F mov l,a 0172 20E0 22 A0 23 shld A_RPTH 0173 20E3 0174 20E3 21 9C 23 lxi h,A_SPED 0175 20E6 35 dcr m 0176 20E7 C2 F3 20 jnz A_NXT2 0177 20EA 36 04 mvi m,A_SPFKT 0178 20EC 2A 9A 23 lhld A_UPTH 0179 20EF 23 inx h 0180 20F0 22 9A 23 A_NXT1: shld A_UPTH 0181 20F3 2A 9A 23 A_NXT2: lhld A_UPTH 0182 20F6 7E mov a,m 0183 20F7 FE 80 cpi 80h ; test na konec jednoho kola 0184 20F9 C2 0C 21 jnz A_ADDP 0185 20FC 3A 9D 23 lda A_KOLA ; je-li konec kola, jedno odečíst 0186 20FF 3D dcr a 0187 2100 32 9D 23 sta A_KOLA 0188 2103 CA 09 23 jz A_ENDE ; je-li poslední, závěrečný dojezd 0189 2106 21 C2 23 lxi h,A_PTHL ; jinak další kolo 0190 2109 C3 F0 20 jmp A_NXT1 0191 210C 0192 210C ; **************************** 0193 210C ; přidání dalšího kousku cesty 0194 210C ; **************************** 0195 210C 0196 210C 47 A_ADDP: mov b,a 0197 210D E6 01 ani 1 0198 210F CA 21 21 jz A_ADD2 0199 2112 2A A0 23 lhld A_RPTH ; xxxx xxx1 => pravá krajnice 0200 2115 78 mov a,b 0201 2116 E6 02 ani 2 ; xxxx xx11 => pravá krajnice doprava 0202 2118 23 inx h ; xxxx xx01 => pravá krajnice doleva 0203 2119 C2 1E 21 jnz A_ADD1 0204 211C 2B dcx h 0205 211D 2B dcx h 0206 211E 22 A0 23 A_ADD1: shld A_RPTH 0207 2121 0208 2121 78 A_ADD2: mov a,b 0209 2122 E6 10 ani 10h 0210 2124 C8 rz 0211 2125 2A 9E 23 lhld A_LPTH ; xxx1 xxxx => levá krajnice 0212 2128 78 mov a,b 0213 2129 E6 20 ani 20h ; xx11 xxxx => levá krajnice doprava 0214 212B 23 inx h ; xx01 xxxx => levá krajnice doleva 0215 212C C2 31 21 jnz A_ADD3 0216 212F 2B dcx h 0217 2130 2B dcx h 0218 2131 22 9E 23 A_ADD3: shld A_LPTH 0219 2134 C9 ret 0220 2135 0221 2135 ; ****************** 0222 2135 ; chování při kolizi 0223 2135 ; ****************** 0224 2135 0225 2135 CD 7D 22 A_KOLI: call A_INCR ; zvednout počet havárií 0226 2138 21 FF EF lxi h,A_POSVL 0227 213B 3E 3F mvi a,3fh 0228 213D 23 A_KOLF: inx h 0229 213E BE cmp m 0230 213F C2 3D 21 jnz A_KOLF 0231 2142 3A A3 23 lda A_CARA 0232 2145 BD cmp L 0233 2146 CA 55 21 jz A_KOLL 0234 2149 CD B5 21 call A_LEFT ; posun autíčka o tři fáze doleva 0235 214C CD B5 21 call A_LEFT 0236 214F CD B5 21 call A_LEFT 0237 2152 C3 C0 20 jmp A_NXTP 0238 2155 0239 2155 CD 74 21 A_KOLL: call A_RGHT ; posun autíčka o tři fáze doprava 0240 2158 CD 74 21 call A_RGHT 0241 215B CD 74 21 call A_RGHT 0242 215E C3 C0 20 jmp A_NXTP 0243 2161 0244 2161 ; ********************* 0245 2161 ; ovládání z klávesnice 0246 2161 ; ********************* 0247 2161 0248 2161 3E 04 A_KEYB: mvi a,4 0249 2163 D3 F4 out kbdout 0250 2165 DB F5 in kbdin 0251 2167 E6 20 ani 20h 0252 2169 CA B5 21 jz A_LEFT ; test SHIFTu 0253 216C DB F5 in kbdin 0254 216E E6 10 ani 10h ; test písmene V 0255 2170 CA 74 21 jz A_RGHT 0256 2173 C9 ret 0257 2174 0258 2174 ; ********************************** 0259 2174 ; posun autíčka doprava o jednu fázi 0260 2174 ; ********************************** 0261 2174 0262 2174 3A A2 23 A_RGHT: lda A_CARS ; pohyb doprava 0263 2177 3C inr a 0264 2178 FE 03 cpi 3 0265 217A 32 A2 23 sta A_CARS 0266 217D C2 F4 21 jnz A_SHWC ; buď jen fáze autíčka, 0267 2180 0268 2180 AF xra a ; nebo i změna adresy 0269 2181 32 A2 23 sta A_CARS 0270 2184 2A A3 23 lhld A_CARA 0271 2187 2C inr l 0272 2188 22 A3 23 shld A_CARA 0273 218B 2C inr l 0274 218C 3E 3F mvi a,3fh 0275 218E BE cmp m ; test na stěnu 0276 218F CA 1C 22 jz A_BUMP 0277 2192 11 00 02 lxi d,200h 0278 2195 19 dad d 0279 2196 BE cmp m ; test na stěnu o 4 mikrořádky níže 0280 2197 CA 1C 22 jz A_BUMP 0281 219A 2A A3 23 lhld A_CARA 0282 219D 01 65 23 lxi b,A_CAR0 0283 21A0 11 3E 00 lxi d,62 ; překreslení autíčka o jeden byte 0284 21A3 19 dad d ; více vpravo spolu s odmazáním 0285 21A4 23 inx h ; "opuštěného" sloupce nalevo 0286 21A5 36 00 A_RGHL: mvi m,0 ; od nové pozice autíčka 0287 21A7 23 inx h 0288 21A8 0A ldax b 0289 21A9 A7 ana a 0290 21AA F8 rm 0291 21AB 03 inx b 0292 21AC 77 mov m,a 0293 21AD 0A ldax b 0294 21AE 23 inx h 0295 21AF 03 inx b 0296 21B0 77 mov m,a 0297 21B1 19 dad d 0298 21B2 C3 A5 21 jmp A_RGHL 0299 21B5 0300 21B5 ; ********************************* 0301 21B5 ; posun autíčka doleva o jednu fázi 0302 21B5 ; ********************************* 0303 21B5 0304 21B5 3A A2 23 A_LEFT: lda A_CARS ; a analogicky doleva 0305 21B8 3D dcr a 0306 21B9 32 A2 23 sta A_CARS 0307 21BC F2 F4 21 jp A_SHWC 0308 21BF 3E 02 mvi a,2 0309 21C1 32 A2 23 sta A_CARS 0310 21C4 2A A3 23 lhld A_CARA 0311 21C7 2D dcr l 0312 21C8 22 A3 23 shld A_CARA 0313 21CB 3E 3F mvi a,3fh 0314 21CD BE cmp m 0315 21CE CA 29 22 jz A_BUML 0316 21D1 11 00 02 lxi d,200h 0317 21D4 19 dad d 0318 21D5 BE cmp m 0319 21D6 CA 29 22 jz A_BUML 0320 21D9 2A A3 23 lhld A_CARA 0321 21DC 01 87 23 lxi b,A_CAR2 0322 21DF 11 3E 00 lxi d,62 0323 21E2 23 inx h 0324 21E3 23 inx h 0325 21E4 19 A_LFTL: dad d 0326 21E5 0A ldax b 0327 21E6 B7 ora a 0328 21E7 F8 rm 0329 21E8 77 mov m,a 0330 21E9 23 inx h 0331 21EA 03 inx b 0332 21EB 0A ldax b 0333 21EC 77 mov m,a 0334 21ED 23 inx h 0335 21EE 03 inx b 0336 21EF 36 00 mvi m,0 0337 21F1 C3 E4 21 jmp A_LFTL 0338 21F4 0339 21F4 ; ****************** 0340 21F4 ; nakreslení autíčka 0341 21F4 ; ****************** 0342 21F4 0343 21F4 3A A2 23 A_SHWC: lda A_CARS 0344 21F7 01 65 23 lxi b,A_CAR0 ; bitová fáze 0 0345 21FA 3D dcr a 0346 21FB FA 08 22 jm A_SHCM 0347 21FE 01 76 23 lxi b,A_CAR1 ; bitová fáze 1 0348 2201 3D dcr a 0349 2202 FA 08 22 jm A_SHCM 0350 2205 01 87 23 lxi b,A_CAR2 ; bitová fáze 2 0351 2208 0352 2208 11 3F 00 A_SHCM: lxi d,63 ; vykreslení autíčka 0353 220B 2A A3 23 lhld A_CARA ; dle bitové fáze 0354 220E 23 inx h ; a adresy 0355 220F 19 A_SHCL: dad d 0356 2210 0A ldax b 0357 2211 B7 ora a 0358 2212 F8 rm 0359 2213 77 mov m,a 0360 2214 03 inx b 0361 2215 23 inx h 0362 2216 0A ldax b 0363 2217 77 mov m,a 0364 2218 03 inx b 0365 2219 C3 0F 22 jmp A_SHCL 0366 221C 0367 221C ; ************ 0368 221C ; náraz vpravo 0369 221C ; ************ 0370 221C 0371 221C CD 7D 22 A_BUMP: call A_INCR ; přičíst jednu havárii 0372 221F 2A A3 23 lhld A_CARA ; a odskok o 4 fáze vlevo 0373 2222 2D dcr l 0374 2223 22 A3 23 shld A_CARA 0375 2226 C3 B5 21 jmp A_LEFT 0376 2229 0377 2229 ; *********** 0378 2229 ; náraz vlevo 0379 2229 ; *********** 0380 2229 0381 2229 CD 7D 22 A_BUML: call A_INCR ; přičíst jednu havárii 0382 222C 2A A3 23 lhld A_CARA ; a odskok o 4 fáze vpravo 0383 222F 2C inr l 0384 2230 22 A3 23 shld A_CARA 0385 2233 C3 74 21 jmp A_RGHT 0386 2236 0387 2236 ; ********************* 0388 2236 ; hlavní závodní smyčka 0389 2236 ; ********************* 0390 2236 0391 2236 CD 61 21 A_LOOP: call A_KEYB ; ovládání z klávesnice 0392 2239 CD 89 20 call A_SCRO 0393 223C CD 89 20 call A_SCRO 0394 223F DB F6 in kbdled ; prsknutí BEEPru 0395 2241 EE 04 xri 4 0396 2243 D3 F6 out kbdled 0397 2245 0398 2245 2A A6 23 A_LOO1: lhld A_TIMR ; provést zpoždění 0399 2248 2B dcx h 0400 2249 22 A6 23 shld A_TIMR 0401 224C 7C mov a,h 0402 224D B5 ora l 0403 224E C2 45 22 jnz A_LOO1 0404 2251 2A AC 23 lhld A_VDLY ; obnovit aktuální zpoždění 0405 2254 22 A6 23 shld A_TIMR 0406 2257 EB xchg 0407 2258 2A A8 23 lhld A_GAZ 0408 225B 19 dad d 0409 225C 22 A8 23 shld A_GAZ 0410 225F D2 36 22 jnc A_LOOP 0411 2262 CD 68 22 call A_ACLR 0412 2265 C3 36 22 jmp A_LOOP 0413 2268 0414 2268 ; ****************************** 0415 2268 ; akcelerace dle ukazatele P_GAZ 0416 2268 ; ****************************** 0417 2268 0418 2268 2A AA 23 A_ACLR: lhld A_PGAZ 0419 226B 23 inx h 0420 226C 23 inx h 0421 226D 7E mov a,m 0422 226E FE FF cpi 0ffh 0423 2270 CA 36 22 jz A_LOOP ; chyba - trvale sníží SP 0424 2273 22 AA 23 shld A_PGAZ 0425 2276 23 inx h 0426 2277 66 mov h,m 0427 2278 6F mov l,a 0428 2279 22 AC 23 shld A_VDLY 0429 227C C9 ret 0430 227D 0431 227D ; ***************** 0432 227D ; počitadlo havárií 0433 227D ; ***************** 0434 227D 0435 227D 21 C7 22 A_INCR: lxi h,A_SPDT ; základní rychlost po kolizi 0436 2280 22 AA 23 shld A_PGAZ 0437 2283 CD 68 22 call A_ACLR 0438 2286 21 A5 22 lxi h,A_NHAV 0439 2289 7E A_CRSM: mov a,m ; přidat počet havárií 0440 228A 34 inr m 0441 228B FE 39 cpi '9' 0442 228D C2 AC 22 jnz A_PRNH ; a toto číslo vytisknout 0443 2290 36 30 mvi m,'0' 0444 2292 2B dcx h 0445 2293 C3 89 22 jmp A_CRSM 0446 2296 0447 2296 48 41 56 41 A_THAV: .db "HAVAROVAL SI 00" 0447 229A 52 4F 56 41 0447 229E 4C 20 53 49 0447 22A2 20 30 30 0448 22A5 33 20 4B 52 A_NHAV: .db "3 KRAT",0dh 0448 22A9 41 54 0D 0449 22AC 0450 22AC ; ********************************** 0451 22AC ; vytiskne informaci o počtu havárií 0452 22AC ; ********************************** 0453 22AC 0454 22AC 21 02 C6 A_PRNH: lxi h,A_POHA 0455 22AF 22 3E C0 shld prnpos 0456 22B2 21 96 22 lxi h,A_THAV 0457 22B5 0458 22B5 7E mov a,m 0459 22B6 CD 00 85 A_PRNL: call prtout 0460 22B9 23 inx h 0461 22BA 7E mov a,m 0462 22BB FE 0D cpi 0dh 0463 22BD C2 B6 22 jnz A_PRNL 0464 22C0 0465 22C0 11 00 10 lxi d,1000h ; zvuk při kolizi 0466 22C3 CD 60 24 call A_NOIS 0467 22C6 C9 ret 0468 22C7 0469 22C7 ; ****************************** 0470 22C7 ; tabulka postupného zrychlování 0471 22C7 ; ****************************** 0472 22C7 0473 22C7 88 13 A_SPDT: .dw 1388h ; přičítáním konstanty 0474 22C9 74 0E .dw 0e74h ; z této tabulky se čeká 0475 22CB F0 0A .dw 0af0h ; na přetečení v rámci 0476 22CD 34 08 .dw 0834h ; 16-bitového akumulátoru 0477 22CF 40 06 .dw 0640h 0478 22D1 B0 04 .dw 04b0h ; když k tomu dojde, 0479 22D3 84 03 .dw 0384h ; zvýší se rychlost 0480 22D5 58 02 .dw 0258h ; a přepne na další 0481 22D7 F4 01 .dw 01f4h ; přičítací konstantu 0482 22D9 7C 01 .dw 017ch ; z této tabulky 0483 22DB 18 01 .dw 0118h 0484 22DD C8 00 .dw 00c8h 0485 22DF A0 00 .dw 00a0h 0486 22E1 78 00 .dw 0078h 0487 22E3 50 00 .dw 0050h 0488 22E5 32 00 .dw 0032h 0489 22E7 19 00 .dw 0019h 0490 22E9 0A 00 .dw 000ah 0491 22EB 02 00 .dw 0002h ; už jen max. rychlost 0492 22ED FF 00 .dw 00ffh 0493 22EF 0494 22EF ; ************ 0495 22EF ; zobrazí logo 0496 22EF ; ************ 0497 22EF 0498 22EF 21 24 C2 A_SHLG: lxi h,A_LOGO ; jednoduchý algoritmus 0499 22F2 01 45 23 lxi b,A_PTRN ; kopírování dvouřezového 0500 22F5 16 10 mvi d,16 ; loga do videoram 0501 22F7 0A A_LOGL: ldax b 0502 22F8 77 mov m,a 0503 22F9 03 inx b 0504 22FA 23 inx h 0505 22FB 0A ldax b 0506 22FC 77 mov m,a 0507 22FD 03 inx b 0508 22FE D5 push d 0509 22FF 11 3F 00 lxi d,63 0510 2302 19 dad d 0511 2303 D1 pop d 0512 2304 15 dcr d 0513 2305 C2 F7 22 jnz A_LOGL 0514 2308 C9 ret 0515 2309 0516 2309 ; ******************* 0517 2309 ; závěrečná procedura 0518 2309 ; ******************* 0519 2309 0520 2309 CD 12 23 A_ENDE: CALL A_PASK ; vytiskne cílovou pásku 0521 230C CD 31 23 call A_PCIL ; vytiskne nápis CIEL 0522 230F C3 FE 23 jmp A_CIL ; dojezdová smyčka s hudbou 0523 2312 0524 2312 ; ***************** 0525 2312 ; tisk cílové pásky 0526 2312 ; ***************** 0527 2312 0528 2312 21 00 C6 A_PASK: lxi h,A_POSPA ; imitace cílové pásky 0529 2315 11 10 00 lxi d,16 ; s vyplněním drobnou 0530 2318 06 08 mvi b,8 ; šachovnicí (to jsou 0531 231A 0E 30 A_PAS1: mvi c,48 ; ty střídavé kódy 0532 231C 7D mov a,l ; 2Ah/15h) 0533 231D E6 40 A_PAS2: ani 40h 0534 231F 36 2A mvi m,2ah 0535 2321 CA 26 23 jz A_PAS3 0536 2324 36 15 mvi m,15h 0537 2326 23 A_PAS3: inx h 0538 2327 0D dcr c 0539 2328 C2 1D 23 jnz A_PAS2 0540 232B 19 dad d 0541 232C 05 dcr b 0542 232D C2 1A 23 jnz A_PAS1 0543 2330 C9 ret 0544 2331 0545 2331 ; ****************** 0546 2331 ; vytiskne nápis CÍL 0547 2331 ; ****************** 0548 2331 0549 2331 21 14 C8 A_PCIL: lxi h,A_NAPCL ; potisk cílové pásky 0550 2334 22 3E C0 shld prnpos 0551 2337 21 3E 23 lxi h,A_PCIT 0552 233A 7E mov a,m 0553 233B C3 B6 22 jmp A_PRNL 0554 233E 0555 233E 20 43 49 45 A_PCIT: .db " CIEL ",0dh 0555 2342 4C 20 0D 0556 2345 0557 2345 ; ************ 0558 2345 ; obrázek loga 0559 2345 ; ************ 0560 2345 0561 2345 3F 01 A_PTRN: .db 3fh,01h ; *******..... 0562 2347 02 02 .db 02h,02h ; .*.....*.... 0563 2349 02 02 .db 02h,02h ; .*.....*.... 0564 234B 3A 0F .db 3ah,0fh ; .*.*******.. 0565 234D 12 12 .db 12h,12h ; .*..*..*..*. 0566 234F 12 12 .db 12h,12h ; .*..*..*..*. 0567 2351 12 21 .db 12h,21h ; .*..*.*....* 0568 2353 3E 20 .db 3eh,20h ; .*****.....* 0569 2355 12 21 .db 12h,21h ; .*..*.*....* 0570 2357 12 22 .db 12h,22h ; .*..*..*...* 0571 2359 12 24 .db 12h,24h ; .*..*...*..* 0572 235B 12 24 .db 12h,24h ; .*..*...*..* 0573 235D 12 24 .db 12h,24h ; .*..*...*..* 0574 235F 10 10 .db 10h,10h ; ....*.....*. 0575 2361 10 10 .db 10h,10h ; ....*.....*. 0576 2363 38 0F .db 38h,0fh ; ...*******.. 0577 2365 0578 2365 ; ************** 0579 2365 ; motivy autíčka 0580 2365 ; ************** 0581 2365 0582 2365 1A 01 A_CAR0: .db 1ah,01h ; .*.**.*..... 0583 2367 1A 01 .db 1ah,01h ; .*.**.*..... 0584 2369 3C 00 .db 3ch,00h ; ..****...... 0585 236B 24 00 .db 24h,00h ; ..*..*...... 0586 236D 3C 00 .db 3ch,00h ; ..****...... 0587 236F 1B 03 .db 1bh,03h ; **.**.**.... 0588 2371 3E 01 .db 3eh,01h ; .******..... 0589 2373 1D 03 .db 1dh,03h ; *.***.**.... 0590 2375 80 .db 80h 0591 2376 0592 2376 28 05 A_CAR1: .db 28h,05h ; ...*.**.*... 0593 2378 28 05 .db 28h,05h ; ...*.**.*... 0594 237A 30 03 .db 30h,03h ; ....****.... 0595 237C 10 02 .db 10h,02h ; ....*..*.... 0596 237E 30 03 .db 30h,03h ; ....****.... 0597 2380 2C 0D .db 2ch,0dh ; ..**.**.**.. 0598 2382 38 07 .db 38h,07h ; ...******... 0599 2384 2C 0D .db 2ch,0dh ; ..**.**.**.. 0600 2386 80 .db 80h 0601 2387 0602 2387 20 16 A_CAR2: .db 20h,16h ; .....*.**.*. 0603 2389 20 16 .db 20h,16h ; .....*.**.*. 0604 238B 00 0F .db 00h,0fh ; ......****.. 0605 238D 00 09 .db 00h,09h ; ......*..*.. 0606 238F 00 0F .db 00h,0fh ; ......****.. 0607 2391 30 36 .db 30h,36h ; ....**.**.** 0608 2393 20 1F .db 20h,1fh ; .....******. 0609 2395 30 36 .db 30h,36h ; ....**.**.** 0610 2397 80 .db 80h 0611 2398 0612 2398 ; ******** 0613 2398 ; proměnné 0614 2398 ; ******** 0615 2398 0616 2398 BE 24 A_PSND: .dw 24beh ; ukazatel na přehrávaný zvuk 0617 239A E3 23 A_UPTH: .dw 23e3h ; ukazatel na mapu cesty 0618 239C 01 A_SPED: .db 1 ; poměr rychlosti a řízení 0619 239D 05 A_KOLA: .db 5 ; počitadlo ujetých kol 0620 239E 0A C8 A_LPTH: .dw 0c80ah ; levá krajnice 0621 23A0 17 C8 A_RPTH: .dw 0c817h ; pravá krajnice 0622 23A2 01 A_CARS: .db 1 ; bitový posun autíčka 0623 23A3 9E DC A_CARA: .dw 0dc9eh ; adresa autíčka 0624 23A5 08 A_ROLL: .db 8 ; počitadlo vert. scrollů 0625 23A6 82 06 A_TIMR: .dw 682h ; zpožďovací smyčka 0626 23A8 68 2E A_GAZ: .dw 2e68h ; zrychlovač 0627 23AA C9 22 A_PGAZ: .dw 22c9h ; tabulka pro zrychlovač 0628 23AC 74 0E A_VDLY: .dw 0e74h ; rychlost jízdy 0629 23AE 0630 23AE ; ************************** 0631 23AE ; mapa cesty (zaváděcí kolo) 0632 23AE ; ************************** 0633 23AE 0634 23AE 00 A_PATH: .db 00h 0635 23AF 31 31 30 33 .db 31h,31h,30h,33h,00h,30h,30h 0635 23B3 00 30 30 0636 23B6 33 30 00 10 .db 33h,30h,00h,10h,11h,11h,00h,30h 0636 23BA 11 11 00 30 0637 23BE 00 10 11 01 .db 00h,10h,11h,01h 0638 23C2 0639 23C2 ; ***************************** 0640 23C2 ; mapa cesty (opakovaná smyčka) 0641 23C2 ; ***************************** 0642 23C2 0643 23C2 00 10 11 11 A_PTHL: .db 00h,10h,11h,11h,11h,01h,03h,30h 0643 23C6 11 01 03 30 0644 23CA 10 01 03 33 .db 10h,01h,03h,33h,33h,33h,33h,00h 0644 23CE 33 33 33 00 0645 23D2 11 33 33 33 .db 11h,33h,33h,33h,33h,00h,30h,00h 0645 23D6 33 00 30 00 0646 23DA 10 11 01 03 .db 10h,11h,01h,03h,30h,10h,11h,11h 0646 23DE 30 10 11 11 0647 23E2 11 11 01 03 .db 11h,11h,01h,03h,33h,30h,10h,11h 0647 23E6 33 30 10 11 0648 23EA 11 11 01 00 .db 11h,11h,01h,00h,03h,33h,33h,33h 0648 23EE 03 33 33 33 0649 23F2 11 30 00 03 .db 11h,30h,00h,03h,30h,00h,00h,00h 0649 23F6 30 00 00 00 0650 23FA 00 00 00 80 .db 00h,00h,00h,80h 0651 23FE 0652 23FE ; ******************* 0653 23FE ; dojezd auta do cíle 0654 23FE ; ******************* 0655 23FE 0656 23FE DB F5 A_CIL: in kbdin ; test na SHIFT, kterým 0657 2400 E6 20 ani 20h ; mohu přerušit melodii 0658 2402 CA 00 20 jz A_RST ; a restartovat hru 0659 2405 3E 01 mvi a,1 0660 2407 32 A2 23 sta A_CARS ; bitová fáze autíčka.. 0661 240A 2A A3 23 lhld A_CARA ; postupné sunutí auta 0662 240D 7C mov a,h ; směrem nahoru po obrazovce 0663 240E FE C2 cpi A_UPSCR ; až k cílové pásce 0664 2410 CA FE 23 jz A_CIL 0665 2413 11 C0 FF lxi d,-64 0666 2416 19 dad d 0667 2417 22 A3 23 shld A_CARA 0668 241A CD F4 21 call A_SHWC ; vykreslení autíčka 0669 241D 36 00 mvi m,0 0670 241F 23 inx h 0671 2420 36 00 mvi m,0 0672 2422 CD 28 24 call A_SND ; přehrávání hudby 0673 2425 C3 FE 23 jmp A_CIL 0674 2428 0675 2428 ; **************** 0676 2428 ; přehrávání hudby 0677 2428 ; **************** 0678 2428 0679 2428 2A 98 23 A_SND: lhld A_PSND ; víceméně standardní rutina 0680 242B 7E mov a,m ; pro řazení tónů za sebou 0681 242C FE FF cpi 0ffh 0682 242E 11 80 10 lxi d,1080h 0683 2431 CA 60 24 jz A_NOIS 0684 2434 23 inx h 0685 2435 22 98 23 shld A_PSND 0686 2438 A7 ana a 0687 2439 21 00 D0 lxi h,0D000h 0688 243C C2 4B 24 jnz A_TONE 0689 243F 43 A_SND1: mov b,e 0690 2440 16 00 mvi d,0 0691 2442 05 A_SND2: dcr b 0692 2443 C2 42 24 jnz A_SND2 0693 2446 19 dad d 0694 2447 D2 3F 24 jnc A_SND1 0695 244A C9 ret 0696 244B 0697 244B ; *************** 0698 244B ; generování tónu 0699 244B ; *************** 0700 244B 0701 244B 0E 00 A_TONE: mvi c,0 ; střídáním hodnot 0 a 1 0702 244D 5F mov e,a ; 2. bitu (váha 04h) 0703 244E 16 00 mvi d,0 ; na portu 0F6h, což je 0704 2450 43 A_TON1: mov b,e ; služební PPI 8255, 0705 2451 05 A_TON2: dcr b ; dochází k vyluzování 0706 2452 C2 51 24 jnz A_TON2 ; tónů.. :) 0707 2455 79 mov a,c 0708 2456 EE 04 xri 4 ; ..to jen aby bylo co 0709 2458 4F mov c,a ; napsat.. 0710 2459 D3 F6 out kbdled 0711 245B 19 dad d 0712 245C D2 50 24 jnc A_TON1 0713 245F C9 ret 0714 2460 0715 2460 ; *************** 0716 2460 ; generování šumu 0717 2460 ; *************** 0718 2460 0719 2460 01 00 80 A_NOIS: lxi b,bios ; využívá se pseudonáhodné 0720 2463 0A A_NOIL: ldax b ; posloupnosti bajtů v ROM 0721 2464 E6 04 ani 4 ; a ono to doopravdy gene- 0722 2466 D3 F6 out kbdled ; ruje něco jako šum.. 0723 2468 1B dcx d 0724 2469 03 inx b 0725 246A 7A mov a,d 0726 246B B3 ora e 0727 246C C2 63 24 jnz A_NOIL 0728 246F C9 ret 0729 2470 0730 2470 ; ********************** 0731 2470 ; data závěrečné melodie 0732 2470 ; ********************** 0733 2470 0734 2470 82 00 00 00 A_MLDY: .db 82h,00h,00h,00h,74h,00h,00h,7bh 0734 2474 74 00 00 7B 0735 2478 82 00 74 00 .db 82h,00h,74h,00h,74h,00h,7bh,00h 0735 247C 74 00 7B 00 0736 2480 82 00 00 00 .db 82h,00h,00h,00h,74h,00h,00h,7bh 0736 2484 74 00 00 7B 0737 2488 82 00 74 00 .db 82h,00h,74h,00h,74h,00h,7bh,00h 0737 248C 74 00 7B 00 0738 2490 82 00 00 00 .db 82h,00h,00h,00h,74h,00h,00h,7bh 0738 2494 74 00 00 7B 0739 2498 82 00 74 00 .db 82h,00h,74h,00h,9ch,00h,0afh,00h 0739 249C 9C 00 AF 00 0740 24A0 C5 00 61 61 .db 0c5h,00h,61h,61h,61h,61h,80h,0h 0740 24A4 61 61 80 00 0741 24A8 74 00 74 82 .db 74h,00h,74h,82h,00h,74h,82h,00h 0741 24AC 00 74 82 00 0742 24B0 82 00 00 00 .db 82h,00h,00h,00h,74h,00h,00h,7bh 0742 24B4 74 00 00 7B 0743 24B8 82 00 74 00 .db 82h,00h,74h,00h,74h,00h,7bh,00h 0743 24BC 74 00 7B 00 0744 24C0 82 00 00 00 .db 82h,00h,00h,00h,74h,00h,00h,7bh 0744 24C4 74 00 00 7B 0745 24C8 82 00 74 00 .db 82h,00h,74h,00h,74h,00h,7bh,00h 0745 24CC 74 00 7B 00 0746 24D0 82 00 00 00 .db 82h,00h,00h,00h,74h,00h,00h,7bh 0746 24D4 74 00 00 7B 0747 24D8 82 00 74 00 .db 82h,00h,74h,00h,9ch,00h,0afh,00h 0747 24DC 9C 00 AF 00 0748 24E0 C5 C5 C5 C5 .db 0c5h,0c5h,0c5h,0c5h,0ffh 0748 24E4 FF 0749 24E5 0750 24E5 .end