0001 0000 ; ************************************************ 0002 0000 ; dekompilace hry INVAZE pro PMD85 0003 0000 ; 31.12.2012 opraveny odchylky od originální verze 0004 0000 ; 20.09.2013 formální úpravy textu 0005 0000 ; kontrola provedena na binární úrovni 0006 0000 ; ************************************************ 0007 0000 0008 0000 ; ************************** 0009 0000 ; proměnné a procedury BIOSu 0010 0000 ; ************************** 0011 0000 0012 0000 getklav .equ 84a1h ; vstup znaku z klávesnice 0013 0000 prnchr .equ 8500h ; rutina tisku znaku 0014 0000 plysmpl .equ 88a6h ; přehrát "sample" 0015 0000 warmrst .equ 8c40h ; návrat do OS 0016 0000 stoptst .equ 8c74h ; test klávesy STOP 0017 0000 prevo1 .equ 8125h ; výstup byte na obrazovku 0018 0000 prnmask .equ 0c03ah ; maska pro tisk znaku 0019 0000 prnpos .equ 0c03eh ; adresa pro tisk znaku 0020 0000 0021 0000 ; *************** 0022 0000 ; herní konstanty 0023 0000 ; *************** 0024 0000 0025 0000 CHRLF .equ 0ah ; znak LINE FEED 0026 0000 C_WIDTH .equ 64 ; počet znaků na řádek vram 0027 0000 C_LNFED .equ 0280h ; posun adresy vram při řádkování 0028 0000 t_HEAD .equ 0c2c0h ; pozice hlavičky během hry 0029 0000 t_INFO .equ 0cc08h ; pozice infotextu 0030 0000 t_FINI .equ 0d008h ; pozice "INVADERI TE DOSTALI" 0031 0000 t_SCORE .equ 0ffc0h ; pozice score 0032 0000 t_BODY .equ 0ffc6h ; pozice bodů 0033 0000 t_TIME .equ 0ffd2h ; pozice času 0034 0000 t_STATU .equ 0ffe4h ; pozice stavového řádku 0035 0000 MSBZAKL .equ 0fc00h ; adresa základnové čáry 0036 0000 iPOZSTR .equ 18 ; výchozí pozice střelce 0037 0000 mxPOZST .equ 39 ; max. pozice střelce vpravo 0038 0000 MSBEJCT .equ 7 ; high byte adresy výsadku 0039 0000 MSBMPCT .equ 0ah ; high byte adresy doletu střely 0040 0000 MSBODLE .equ 0deh ; high byte rakety při odletu 0041 0000 MSBMISL .equ 0dfh ; high byte střely při výstřelu 0042 0000 MSBSTRE .equ 0e6h ; high byte adresy střelce 0043 0000 MSBMETA .equ 0eah ; high byte adresy dopadu invadéra 0044 0000 0045 0100 .org 100h 0046 0100 0047 0100 C3 DC 02 jmp istart 0048 0103 0049 0103 ; ************************ 0050 0103 ; v HL vrací větší z HL/DE 0051 0103 ; ************************ 0052 0103 0053 0103 7D mxHLDE: mov a,l 0054 0104 93 sub e 0055 0105 7C mov a,h 0056 0106 9A sbb d 0057 0107 D0 rnc 0058 0108 EB xchg 0059 0109 C9 ret 0060 010A 0061 010A ; ***************** 0062 010A ; odpočet délky hry 0063 010A ; ***************** 0064 010A 0065 010A 21 C7 03 timout: lxi h,tmrate 0066 010D 35 dcr m 0067 010E C0 rnz 0068 010F 23 inx h 0069 0110 7E mov a,m 0070 0111 2B dcx h 0071 0112 77 mov m,a 0072 0113 21 BC 03 lxi h,inrate+1 0073 0116 35 dcr m 0074 0117 C0 rnz 0075 0118 AF xra a 0076 0119 32 CC 03 sta rstinv 0077 011C C9 ret 0078 011D 0079 011D ; ********************************* 0080 011D ; kreslení symbolu na adrese dle HL 0081 011D ; L=horiz./H=vert. 0082 011D ; ********************************* 0083 011D 0084 011D 06 08 paint: mvi b,8 0085 011F 3A 3A C0 paint2: lda prnmask 0086 0122 4F mov c,a 0087 0123 7C mov a,h ; výpočet LSB 0088 0124 0F rrc 0089 0125 0F rrc 0090 0126 67 mov h,a 0091 0127 E6 C0 ani 0c0h ; 2 bity shora z vertikály 0092 0129 B5 ora l ; plus horizontála 0093 012A 6F mov l,a ; LSB adresy hotovo 0094 012B 3E C0 mvi a,0c0h ; posun vram na c000-ffff 0095 012D B4 ora h 0096 012E 67 mov h,a ; MSB hotovo 0097 012F 0098 012F 1A paint3: ldax d 0099 0130 A9 xra c ; respektuje se inverzní režim 0100 0131 77 mov m,a 0101 0132 13 inx d 0102 0133 C5 push b 0103 0134 01 40 00 lxi b,C_WIDTH 0104 0137 09 dad b 0105 0138 C1 pop b 0106 0139 05 dcr b 0107 013A C2 2F 01 jnz paint3 0108 013D C9 ret 0109 013E 0110 013E ; *********************************** 0111 013E ; tisk řetězce na adresu z HL 0112 013E ; řetězec je za volací instrukcí CALL 0113 013E ; *********************************** 0114 013E 0115 013E 22 3E C0 prtstg: shld prnpos 0116 0141 E1 prtst2: pop h 0117 0142 7E mov a,m 0118 0143 23 inx h 0119 0144 E5 push h 0120 0145 B7 ora a 0121 0146 C8 rz 0122 0147 FE 0A cpi CHRLF 0123 0149 CA 52 01 jz prtst3 0124 014C CD 00 85 call prnchr 0125 014F C3 41 01 jmp prtst2 0126 0152 0127 0152 2A 3E C0 prtst3: lhld prnpos 0128 0155 7D mov a,l 0129 0156 E6 C0 ani 256-C_WIDTH ; přesun vozíku na začátek řádku 0130 0158 6F mov l,a 0131 0159 11 80 02 lxi d,C_LNFED ; a řádkování 0132 015C 19 dad d 0133 015D C3 3E 01 jmp prtstg 0134 0160 0135 0160 ; ************************************ 0136 0160 ; reg. HL zvedne o jedničku v kódu BCD 0137 0160 ; ************************************ 0138 0160 0139 0160 7D HLBCD1: mov a,l 0140 0161 C6 01 adi 1 0141 0163 27 daa 0142 0164 6F mov l,a 0143 0165 7C mov a,h 0144 0166 CE 00 aci 0 0145 0168 27 daa 0146 0169 67 mov h,a 0147 016A C9 ret 0148 016B 0149 016B ; *************************************** 0150 016B ; generuje X - souřadnici nového invadéra 0151 016B ; *************************************** 0152 016B 0153 016B E5 gtnewX: push h 0154 016C 21 CA 03 lxi h,x_gen 0155 016F 7E gtnew2: mov a,m 0156 0170 87 add a 0157 0171 87 add a 0158 0172 C5 push b 0159 0173 4F mov c,a 0160 0174 87 add a 0161 0175 81 add c 0162 0176 C1 pop b 0163 0177 86 add m 0164 0178 C6 55 adi 55h 0165 017A 77 mov m,a 0166 017B 0F rrc 0167 017C E1 pop h 0168 017D C9 ret 0169 017E 0170 017E ; ********************************* 0171 017E ; generuje rychlost nového invadéra 0172 017E ; ********************************* 0173 017E 0174 017E E5 gtnewS: push h 0175 017F 21 CB 03 lxi h,spdgen 0176 0182 C3 6F 01 jmp gtnew2 0177 0185 0178 0185 ; ******************************** 0179 0185 ; na pozici HL vytiskne 4xBCD z DE 0180 0185 ; ******************************** 0181 0185 0182 0185 22 3E C0 pr0000: shld prnpos 0183 0188 7A mov a,d 0184 0189 CD 25 81 call prevo1 0185 018C 7B mov a,e 0186 018D CD 25 81 call prevo1 0187 0190 C9 ret 0188 0191 0189 0191 ; ********************* 0190 0191 ; posun střelce doprava 0191 0191 ; ********************* 0192 0191 0193 0191 3A B5 03 str_rt: lda pozstr 0194 0194 FE 27 cpi mxPOZST 0195 0196 D0 rnc 0196 0197 6F mov l,a 0197 0198 3C inr a 0198 0199 32 B5 03 sta pozstr 0199 019C 26 E6 mvi h,MSBSTRE 0200 019E E5 push h 0201 019F 11 DF 06 lxi d,grmpty ; vymazat střelce 0202 01A2 CD 1D 01 call paint 0203 01A5 E1 pop h 0204 01A6 2C inr l 0205 01A7 11 AF 06 str_r2: lxi d,grstrl ; obrázek střelce 0206 01AA CD 1D 01 call paint 0207 01AD C9 ret 0208 01AE 0209 01AE ; ******************** 0210 01AE ; posun střelce doleva 0211 01AE ; ******************** 0212 01AE 0213 01AE 3A B5 03 str_lt: lda pozstr 0214 01B1 B7 ora a 0215 01B2 C8 rz 0216 01B3 6F mov l,a 0217 01B4 3D dcr a 0218 01B5 32 B5 03 sta pozstr 0219 01B8 26 E6 mvi h,MSBSTRE 0220 01BA E5 push h 0221 01BB 11 DF 06 lxi d,grmpty 0222 01BE CD 1D 01 call paint 0223 01C1 E1 pop h 0224 01C2 2D dcr l 0225 01C3 C3 A7 01 jmp str_r2 0226 01C6 0227 01C6 ; *************** 0228 01C6 ; pokus o výstřel 0229 01C6 ; *************** 0230 01C6 0231 01C6 2A B9 03 gofire: lhld strela 0232 01C9 7C mov a,h 0233 01CA B5 ora l 0234 01CB C0 rnz ; poslední střela ještě letí 0235 01CC 2A B5 03 lhld pozstr 0236 01CF 26 DF mvi h,MSBMISL 0237 01D1 22 B9 03 shld strela ; nový výstřel na pozici střelce 0238 01D4 C9 ret 0239 01D5 0240 01D5 ; **************** 0241 01D5 ; doplnění výsadku 0242 01D5 ; **************** 0243 01D5 0244 01D5 3A CC 03 pridej: lda rstinv 0245 01D8 B7 ora a 0246 01D9 C8 rz ; už neletí nikdo 0247 01DA 21 BB 03 lxi h,inrate 0248 01DD 35 dcr m 0249 01DE C0 rnz 0250 01DF 23 inx h 0251 01E0 7E mov a,m 0252 01E1 2B dcx h 0253 01E2 77 mov m,a 0254 01E3 06 28 mvi b,40 0255 01E5 21 E9 06 lxi h,invlst+2 0256 01E8 7E pride2: mov a,m 0257 01E9 23 inx h 0258 01EA B6 ora m 0259 01EB CA F6 01 jz pride3 ; neaktivní invadér 0260 01EE 23 inx h 0261 01EF 23 inx h 0262 01F0 23 inx h 0263 01F1 05 dcr b 0264 01F2 C2 E8 01 jnz pride2 0265 01F5 C9 ret 0266 01F6 0267 01F6 CD 6B 01 pride3: call gtnewX ; doplní invadéra 0268 01F9 E6 3F ani 3fh 0269 01FB FE 28 cpi 28h ; v A je X - souřadnice 0270 01FD D0 rnc ; nového výsadkáře 0271 01FE 36 07 mvi m,MSBEJCT ; startovní výška výsadkáře 0272 0200 2B dcx h 0273 0201 77 mov m,a 0274 0202 EB xchg 0275 0203 0276 0203 CD 7E 01 pride4: call gtnewS 0277 0206 21 C5 03 lxi h,mskspd 0278 0209 A6 ana m 0279 020A 23 inx h 0280 020B BE cmp m 0281 020C DA 03 02 jc pride4 0282 020F EB xchg 0283 0210 2B dcx h 0284 0211 77 mov m,a ; reload hodnota rychlosti 0285 0212 2B dcx h 0286 0213 36 00 mvi m,0 0287 0215 C9 ret 0288 0216 0289 0216 ; ********************** 0290 0216 ; 1 cyklus pádu invadérů 0291 0216 ; ********************** 0292 0216 0293 0216 21 E9 06 padani: lxi h,invlst+2 ; seznam 0294 0219 06 28 mvi b,40 ; 40 padajících kreténů 0295 021B 3A CC 03 lda rstinv 0296 021E 4F mov c,a 0297 021F 5E padan2: mov e,m 0298 0220 23 inx h 0299 0221 56 mov d,m 0300 0222 7A mov a,d 0301 0223 B3 ora e 0302 0224 CA 5E 02 jz padan4 ; nenulová 16bit hodnota (3.-4. byte) 0303 0227 0C inr c ; v C se akumuluje počet aktivních inv. 0304 0228 2B dcx h 0305 0229 2B dcx h 0306 022A 7E mov a,m 0307 022B 2B dcx h 0308 022C 35 dcr m 0309 022D C2 5B 02 jnz padan3 0310 0230 77 mov m,a 0311 0231 14 inr d 0312 0232 7A mov a,d 0313 0233 FE EA cpi MSBMETA 0314 0235 D2 4A 02 jnc dopadl ; invadér dopadl na zem 0315 0238 23 inx h 0316 0239 23 inx h 0317 023A 23 inx h 0318 023B 72 mov m,d ; zápis nové Y - souřadnice 0319 023C E5 push h 0320 023D EB xchg 0321 023E 11 BF 06 lxi d,grinvd 0322 0241 C5 push b 0323 0242 CD 1D 01 call paint ; nakreslit invadéra 0324 0245 C1 pop b 0325 0246 E1 pop h 0326 0247 C3 5E 02 jmp padan4 0327 024A 0328 024A 23 dopadl: inx h 0329 024B 23 inx h 0330 024C 36 00 mvi m,0 ; deaktivovat invadéra 0331 024E 23 inx h ; v seznamu 0332 024F 36 00 mvi m,0 0333 0251 21 C9 03 lxi h,ninvad ; povolený počet dopadnuvších 0334 0254 35 dcr m 0335 0255 21 66 02 lxi h,impcts ; pípnout 0336 0258 C3 A6 88 jmp plysmpl 0337 025B 0338 025B 23 padan3: inx h 0339 025C 23 inx h 0340 025D 23 inx h 0341 025E 23 padan4: inx h 0342 025F 23 inx h 0343 0260 23 inx h 0344 0261 05 dcr b 0345 0262 C2 1F 02 jnz padan2 0346 0265 C9 ret 0347 0266 0348 0266 ; **** 0349 0266 ; zvuk 0350 0266 ; **** 0351 0266 0352 0266 02 10 00 20 impcts: .db 02h,10h,00h,20h,02h,10h,0ffh 0352 026A 02 10 FF 0353 026D 0354 026D ; ********************************************* 0355 026D ; let střely včetně případné kolize s invadérem 0356 026D ; ********************************************* 0357 026D 0358 026D 2A B9 03 letstr: lhld strela ; adresa střely 0359 0270 7C mov a,h 0360 0271 B5 ora l 0361 0272 C2 7E 02 jnz letst3 ; ještě letí 0362 0275 06 70 mvi b,70h 0363 0277 E5 letst2: push h ; časová kompenzace? 0364 0278 E1 pop h 0365 0279 05 dcr b 0366 027A C2 77 02 jnz letst2 0367 027D C9 ret 0368 027E 0369 027E 25 letst3: dcr h ; posun střely nahoru 0370 027F E5 push h 0371 0280 11 B7 06 lxi d,grmsle ; obrázek střely 0372 0283 CD 1D 01 call paint 0373 0286 E1 pop h 0374 0287 7C mov a,h 0375 0288 FE 0A cpi MSBMPCT ; dosáhla střela výšky 10 pix? 0376 028A D2 9A 02 jnc letst5 ; zatím ještě ne 0377 028D 11 DF 06 letst4: lxi d,grmpty 0378 0290 CD 1D 01 call paint ; a pokud ano, tak ji smazat a 0379 0293 21 00 00 lxi h,0 0380 0296 22 B9 03 shld strela ; deaktivovat 0381 0299 C9 ret 0382 029A 22 B9 03 letst5: shld strela ; pokračování letu střely 0383 029D EB xchg 0384 029E 21 E9 06 lxi h,invlst+2 ; seznam invadérů 0385 02A1 06 28 mvi b,40 ; 40 pozic po 4 byte 0386 02A3 7B letst6: mov a,e 0387 02A4 BE cmp m 0388 02A5 C2 AF 02 jnz letst7 ; letí střela na invadera? => ne 0389 02A8 7A mov a,d ; => ano 0390 02A9 23 inx h 0391 02AA BE cmp m 0392 02AB DA B8 02 jc letst8 ; zásah!!! 0393 02AE 2B dcx h 0394 02AF 23 letst7: inx h ; test další pozice 0395 02B0 23 inx h 0396 02B1 23 inx h ; 1. byte X-ová pozice invadera 0397 02B2 23 inx h ; 2. byte Y-ová pozice invadera 0398 02B3 05 dcr b 0399 02B4 C2 A3 02 jnz letst6 0400 02B7 C9 ret ; střela uletěla 1 pixel a letí dál 0401 02B8 0402 02B8 56 letst8: mov d,m ; zásah invadéra 0403 02B9 AF xra a 0404 02BA 77 mov m,a ; deaktivovat souřadnice invadéra 0405 02BB 2B dcx h ; v tabulce 0406 02BC 5E mov e,m 0407 02BD 77 mov m,a 0408 02BE EB xchg ; a na jeho pozici animovat výbuch 0409 02BF CD C5 02 call letst9 0410 02C2 C3 8D 02 jmp letst4 ; pak to smazat a konec 0411 02C5 0412 02C5 CD 7D 04 letst9: call zasah 0413 02C8 2A BD 03 lhld pocbod ; přičíst jeden bod 0414 02CB CD 60 01 call HLBCD1 0415 02CE 22 BD 03 shld pocbod 0416 02D1 EB xchg 0417 02D2 21 C6 FF lxi h,t_BODY 0418 02D5 CD 85 01 call pr0000 ; a zobrazit 0419 02D8 2A B9 03 lhld strela 0420 02DB C9 ret 0421 02DC 0422 02DC ; ************************* 0423 02DC ; start hry - hlavní smyčka 0424 02DC ; ************************* 0425 02DC 0426 02DC 21 00 00 istart: lxi h,0 0427 02DF 22 BF 03 shld maxbod 0428 02E2 22 BD 03 shld pocbod 0429 02E5 0430 02E5 CD 9F 04 start2: call volba ; výběr obtížnosti 0431 02E8 CD CE 03 call screen ; nakreslit propriety 0432 02EB 0433 02EB CD 74 8C start3: call stoptst ; vlastní hrací smyčka 0434 02EE CA 40 8C jz warmrst ; test na návrat do OS 0435 02F1 CD D5 01 call pridej ; přidá dalšího invadéra 0436 02F4 CD 16 02 call padani 0437 02F7 3A C9 03 lda ninvad ; počet dopadnuvších invadérů 0438 02FA B7 ora a 0439 02FB C2 04 03 jnz start4 0440 02FE CD 66 03 call debakl ; poslední invadér přistál.. 0441 0301 C3 E5 02 jmp start2 ; nová hra 0442 0304 0443 0304 79 start4: mov a,c 0444 0305 B7 ora a ; kolik ještě padá invadérů? 0445 0306 CA 60 03 jz hotovo 0446 0309 CD 6D 02 call letstr ; el condor pasa 0447 030C CD 6D 02 call letstr 0448 030F CD 6D 02 call letstr 0449 0312 CD 9A 03 call stopky 0450 0315 CD 0A 01 call timout 0451 0318 CD 1E 03 call ovlad ; ovládání střelce 0452 031B C3 EB 02 jmp start3 0453 031E 0454 031E ; ***************************** 0455 031E ; ovládání střelce z klávesnice 0456 031E ; ***************************** 0457 031E 0458 031E 21 B3 03 ovlad: lxi h,ovldly 0459 0321 35 dcr m 0460 0322 C2 58 03 jnz ovlad5 0461 0325 23 inx h 0462 0326 7E mov a,m 0463 0327 2B dcx h 0464 0328 77 mov m,a 0465 0329 0466 0329 3E 0E mvi a,0eh ; test šipek vpravo 0467 032B CD 92 03 call k_test 0468 032E CA 42 03 jz ovlad3 0469 0331 FE 04 cpi 4 ; rozlišení FAST/SLOW 0470 0333 CA 3C 03 jz ovlad2 0471 0336 CD 91 01 call str_rt 0472 0339 CD 91 01 call str_rt 0473 033C CD 91 01 ovlad2: call str_rt 0474 033F C3 58 03 jmp ovlad5 0475 0342 0476 0342 3E 0C ovlad3: mvi a,0ch ; test šipek vlevo 0477 0344 CD 92 03 call k_test 0478 0347 CA 58 03 jz ovlad5 0479 034A FE 04 cpi 4 ; rozlišení FAST/SLOW 0480 034C CA 55 03 jz ovlad4 0481 034F CD AE 01 call str_lt 0482 0352 CD AE 01 call str_lt 0483 0355 CD AE 01 ovlad4: call str_lt 0484 0358 0485 0358 AF ovlad5: xra a ; test nultého sloupce 0486 0359 CD 92 03 call k_test ; klávesnice 0487 035C C4 C6 01 cnz gofire 0488 035F C9 ret 0489 0360 0490 0360 ; *************************************** 0491 0360 ; sestřelil jsem (téměř) všechny invadéry 0492 0360 ; *************************************** 0493 0360 0494 0360 CD 42 06 hotovo: call odveta 0495 0363 C3 E5 02 jmp start2 0496 0366 0497 0366 ; *************************** 0498 0366 ; třetí invadér dopadl na zem 0499 0366 ; *************************** 0500 0366 0501 0366 3E 80 debakl: mvi a,80h 0502 0368 32 3A C0 sta prnmask 0503 036B 21 08 D0 lxi h,t_FINI 0504 036E CD 3E 01 call prtstg 0505 0371 0506 0371 49 4E 56 41 .db "INVADERI TA DOSTALI",0 0506 0375 44 45 52 49 0506 0379 20 54 41 20 0506 037D 44 4F 53 54 0506 0381 41 4C 49 00 0507 0385 0508 0385 AF xra a 0509 0386 32 3A C0 sta prnmask 0510 0389 CD A1 84 debak2: call getklav 0511 038C FE 89 cpi 89h 0512 038E C8 rz ; počkat na stisk K1 0513 038F C3 89 03 jmp debak2 0514 0392 0515 0392 ; ****************************** 0516 0392 ; letmý vstup znaku z klávesnice 0517 0392 ; ****************************** 0518 0392 0519 0392 D3 F4 k_test: out 0f4h 0520 0394 DB F5 in 0f5h 0521 0396 2F cma 0522 0397 E6 1F ani 1fh 0523 0399 C9 ret 0524 039A 0525 039A ; ************* 0526 039A ; počítání času 0527 039A ; ************* 0528 039A 0529 039A 21 C1 03 stopky: lxi h,timer 0530 039D 35 dcr m 0531 039E C0 rnz 0532 039F 23 inx h 0533 03A0 7E mov a,m 0534 03A1 2B dcx h 0535 03A2 77 mov m,a 0536 03A3 2A C3 03 lhld second 0537 03A6 CD 60 01 call HLBCD1 0538 03A9 22 C3 03 shld second 0539 03AC EB xchg 0540 03AD 21 D2 FF lxi h,t_TIME 0541 03B0 C3 85 01 jmp pr0000 0542 03B3 0543 03B3 0544 03B3 ; ******** 0545 03B3 ; proměnné 0546 03B3 ; ******** 0547 03B3 0548 03B3 0D ovldly .db 0dh ; smyčka zpoždění posunu střelce 0549 03B4 0D ovlspd .db 0dh ; zpoždění posunu střelce 0550 03B5 13 pozstr: .db 13h ; pozice střelce 0551 03B6 02 vystre: .db 02h ; výška střelce při odletu 0552 03B7 00 .db 0 ; ? 0553 03B8 01 .db 1 ; ? 0554 03B9 00 00 strela: .dw 0 ; adresa letící střely 0555 03BB 80 inrate: .db 80h ; rychlost výsadku 0556 03BC 80 .db 80h ; reload pro rychlost výsadku 0557 03BD 00 00 pocbod: .dw 0 ; počet bodů 0558 03BF 00 00 maxbod: .dw 0 ; max. počet bodů 0559 03C1 60 timer: .db 60h ; dělička pro stopky 0560 03C2 60 timdiv: .db 60h ; dělicí poměr pro stopky 0561 03C3 00 00 second: .dw 0 ; počitadlo "sekund" 0562 03C5 7F mskspd: .db 7fh ; rozptyl rychlosti výsadkáře 0563 03C6 04 minspd: .db 4 ; minimální rychlost výsadkáře 0564 03C7 A0 tmrate: .db 0a0h ; základní zpožďovací smyčka 0565 03C8 A0 .db 0a0h ; reload pro předchozí proměnnou 0566 03C9 03 ninvad: .db 3 ; odpočet dopadlých invadérů 0567 03CA 00 x_gen .db 0 ; generátor X - souřadnic 0568 03CB 00 spdgen: .db 0 ; generátor rychlostí padání 0569 03CC 1C rstinv: .db 1ch ; zbývající počet invadérů 0570 03CD 00 level: .db 0 ; level 0571 03CE 0572 03CE ; ************************ 0573 03CE ; nakreslí hrací obrazovku 0574 03CE ; ************************ 0575 03CE 0576 03CE 3E 1C screen: mvi a,1ch 0577 03D0 CD 00 85 call prnchr 0578 03D3 21 C0 C2 lxi h,t_HEAD 0579 03D6 CD 3E 01 call prtstg 0580 03D9 0581 03D9 49 46 4F 20 .db "IFO SOFTWARE - I N V A D E R S - LEVEL:",0 0581 03DD 53 4F 46 54 0581 03E1 57 41 52 45 0581 03E5 20 2D 20 49 0581 03E9 20 4E 20 56 0581 03ED 20 41 20 44 0581 03F1 20 45 20 52 0581 03F5 20 53 20 2D 0581 03F9 20 4C 45 56 0581 03FD 45 4C 3A 00 0582 0401 0583 0401 3A CD 03 lda level 0584 0404 C6 30 adi 30h 0585 0406 CD 00 85 call prnchr ; číslo levelu 0586 0409 3E 12 mvi a,iPOZSTR 0587 040B 32 B5 03 sta pozstr 0588 040E CD 91 01 call str_rt ; nakreslit střelce 0589 0411 3E 03 mvi a,3 ; povolený počet invadérů na zemi 0590 0413 32 C9 03 sta ninvad 0591 0416 2A BD 03 lhld pocbod ; registrace rekordu 0592 0419 EB xchg 0593 041A 2A BF 03 lhld maxbod 0594 041D CD 03 01 call mxHLDE 0595 0420 22 BF 03 shld maxbod 0596 0423 EB xchg 0597 0424 21 00 00 lxi h,0 0598 0427 22 BD 03 shld pocbod 0599 042A 22 C3 03 shld second 0600 042D 22 B9 03 shld strela 0601 0430 21 00 FC lxi h,MSBZAKL 0602 0433 06 28 mvi b,40 0603 0435 3A 3A C0 lda prnmask 0604 0438 EE 3F xri 3fh 0605 043A 77 scree2: mov m,a 0606 043B 23 inx h 0607 043C 05 dcr b 0608 043D C2 3A 04 jnz scree2 0609 0440 21 E7 06 lxi h,invlst 0610 0443 06 00 mvi b,0 0611 0445 36 00 scree3: mvi m,0 0612 0447 23 inx h 0613 0448 05 dcr b 0614 0449 C2 45 04 jnz scree3 0615 044C 21 C0 FF lxi h,t_SCORE 0616 044F CD 3E 01 call prtstg 0617 0452 0618 0452 53 43 4F 52 .db "SCORE:0000 TIME:0000 HIGH SCORE:",0 0618 0456 45 3A 30 30 0618 045A 30 30 20 20 0618 045E 20 54 49 4D 0618 0462 45 3A 30 30 0618 0466 30 30 20 20 0618 046A 20 48 49 47 0618 046E 48 20 53 43 0618 0472 4F 52 45 3A 0618 0476 00 0619 0477 0620 0477 21 E4 FF lxi h,t_STATU 0621 047A C3 85 01 jmp pr0000 0622 047D 0623 047D ; ********************************* 0624 047D ; animace zásahu a výbuchu invadéra 0625 047D ; ********************************* 0626 047D 0627 047D 06 04 zasah: mvi b,4 ; animace výbuchu 0628 047F 11 C7 06 lxi d,grboom ; 1. fáze 0629 0482 E5 zasah2: push h 0630 0483 C5 push b 0631 0484 CD 1D 01 call paint 0632 0487 D5 push d 0633 0488 21 96 04 lxi h,zasahs ; sampl zvuku zásahu 0634 048B CD A6 88 call plysmpl ; přehrát 0635 048E D1 pop d 0636 048F C1 pop b 0637 0490 E1 pop h 0638 0491 05 dcr b 0639 0492 C2 82 04 jnz zasah2 0640 0495 C9 ret 0641 0496 0642 0496 01 03 zasahs: .db 01h,03h ; sample při zásahu 0643 0498 00 03 .db 00h,03h 0644 049A 03 03 .db 03h,03h 0645 049C 00 03 .db 00h,03h 0646 049E FF .db 0ffh 0647 049F 0648 049F ; *********************** 0649 049F ; úvodní volba obtížnosti 0650 049F ; *********************** 0651 049F 0652 049F 3E 1C volba: mvi a,1ch 0653 04A1 32 CC 03 sta rstinv 0654 04A4 CD 00 85 call prnchr 0655 04A7 21 08 CC lxi h,t_INFO 0656 04AA CD 3E 01 call prtstg 0657 04AD 0658 04AD 53 20 50 20 .db "S P A C E I N V A D E R S",CHRLF,CHRLF,CHRLF 0658 04B1 41 20 43 20 0658 04B5 45 20 20 20 0658 04B9 49 20 4E 20 0658 04BD 56 20 41 20 0658 04C1 44 20 45 20 0658 04C5 52 20 53 0A 0658 04C9 0A 0A 0659 04CB 20 20 28 43 .db " (C) 1985 IFO SOFTWARE,UAK BRATISLAVA" 0659 04CF 29 20 31 39 0659 04D3 38 35 20 49 0659 04D7 46 4F 20 53 0659 04DB 4F 46 54 57 0659 04DF 41 52 45 2C 0659 04E3 55 41 4B 20 0659 04E7 42 52 41 54 0659 04EB 49 53 4C 41 0659 04EF 56 41 0660 04F1 0A 0A 0A .db CHRLF,CHRLF,CHRLF 0661 04F4 20 20 20 5A .db " ZEM BOLA NAPADNUTA VOTRELCAMI Z VESMIRU",CHRLF 0661 04F8 45 4D 20 42 0661 04FC 4F 4C 41 20 0661 0500 4E 41 50 41 0661 0504 44 4E 55 54 0661 0508 41 20 56 4F 0661 050C 54 52 45 4C 0661 0510 43 41 4D 49 0661 0514 20 5A 20 56 0661 0518 45 53 4D 49 0661 051C 52 55 0A 0662 051F 41 20 4C 55 .db "A LUDSTVO JE OHROZENE.TVOJOU ULOHOU JE ",CHRLF 0662 0523 44 53 54 56 0662 0527 4F 20 4A 45 0662 052B 20 4F 48 52 0662 052F 4F 5A 45 4E 0662 0533 45 2E 54 56 0662 0537 4F 4A 4F 55 0662 053B 20 55 4C 4F 0662 053F 48 4F 55 20 0662 0543 4A 45 20 0A 0663 0547 4F 44 52 41 .db "ODRAZIT UTOK NA ZEM A ZNICIT NEPRIATELSKE ",CHRLF 0663 054B 5A 49 54 20 0663 054F 55 54 4F 4B 0663 0553 20 4E 41 20 0663 0557 5A 45 4D 20 0663 055B 41 20 5A 4E 0663 055F 49 43 49 54 0663 0563 20 4E 45 50 0663 0567 52 49 41 54 0663 056B 45 4C 53 4B 0663 056F 45 20 0A 0664 0572 52 4F 42 4F .db "ROBOTY.",CHRLF,CHRLF 0664 0576 54 59 2E 0A 0664 057A 0A 0665 057B 56 45 4C 41 .db "VELA STASTIA,OSUD ZEME JE V TVOJICH RUKACH !!! " 0665 057F 20 53 54 41 0665 0583 53 54 49 41 0665 0587 2C 4F 53 55 0665 058B 44 20 5A 45 0665 058F 4D 45 20 4A 0665 0593 45 20 56 20 0665 0597 54 56 4F 4A 0665 059B 49 43 48 20 0665 059F 52 55 4B 41 0665 05A3 43 48 20 21 0665 05A7 21 21 20 20 0666 05AB 0A 0A .db CHRLF,CHRLF 0667 05AD 41 4B 4F 20 .db "AKO SA CITIS ?",CHRLF,"0-ZACIATOCNIK,1-AMATER," 0667 05B1 53 41 20 43 0667 05B5 49 54 49 53 0667 05B9 20 3F 0A 30 0667 05BD 2D 5A 41 43 0667 05C1 49 41 54 4F 0667 05C5 43 4E 49 4B 0667 05C9 2C 31 2D 41 0667 05CD 4D 41 54 45 0667 05D1 52 2C 0668 05D3 32 2D 50 4F .db "2-POKROCILY, ",CHRLF,"3-PROFESIONAL," 0668 05D7 4B 52 4F 43 0668 05DB 49 4C 59 2C 0668 05DF 20 20 0A 33 0668 05E3 2D 50 52 4F 0668 05E7 46 45 53 49 0668 05EB 4F 4E 41 4C 0668 05EF 2C 0669 05F0 34 2D 53 55 .db "4-SUPERMAN ",0 0669 05F4 50 45 52 4D 0669 05F8 41 4E 20 20 0669 05FC 00 0670 05FD 0671 05FD CD A1 84 volba2: call getklav 0672 0600 FE 30 cpi 30h 0673 0602 DA FD 05 jc volba2 ; znaky pod nulou 0674 0605 FE 35 cpi 35h 0675 0607 D2 FD 05 jnc volba2 ; znaky nad čtverkou 0676 060A D6 30 sui 30h 0677 060C 32 CD 03 sta level 0678 060F 21 3F 03 lxi h,033fh 0679 0612 3D dcr a ; tabulka konstant obtížností 0680 0613 CA 38 06 jz volba4 ; 0681 0616 21 3F 02 lxi h,023fh ; mskspd inrate 0682 0619 3D dcr a ; 0683 061A CA 38 06 jz volba4 ; level 0 047fh 8080h 0684 061D 21 1F 02 lxi h,021fh ; level 1 033fh 8080h 0685 0620 3D dcr a ; level 2 023fh 8080h 0686 0621 CA 38 06 jz volba4 ; level 3 021fh 8080h 0687 0624 3D dcr a ; level 4 0101h 0401h 0688 0625 C2 35 06 jnz volba3 0689 0628 21 01 01 lxi h,0101h 0690 062B 22 C5 03 shld mskspd 0691 062E 21 01 04 lxi h,0401h 0692 0631 22 BB 03 shld inrate 0693 0634 C9 ret 0694 0635 0695 0635 21 7F 04 volba3: lxi h,047fh 0696 0638 22 C5 03 volba4: shld mskspd 0697 063B 21 80 80 lxi h,8080h 0698 063E 22 BB 03 shld inrate 0699 0641 C9 ret 0700 0642 0701 0642 ; ************ 0702 0642 ; odlet rakety 0703 0642 ; ************ 0704 0642 0705 0642 06 00 odveta: mvi b,0 0706 0644 0B odvet2: dcx b 0707 0645 78 mov a,b 0708 0646 B1 ora c 0709 0647 C2 44 06 jnz odvet2 0710 064A 3E DE mvi a,MSBODLE 0711 064C 32 B6 03 sta vystre 0712 064F 0713 064F 0E 60 odvet3: mvi c,60h 0714 0651 CD 6B 01 odvet4: call gtnewX 0715 0654 E6 7F ani 7fh 0716 0656 3C inr a 0717 0657 3D odvet5: dcr a 0718 0658 C2 57 06 jnz odvet5 0719 065B DB F6 in 0f6h 0720 065D EE 04 xri 4 0721 065F D3 F6 out 0f6h 0722 0661 0D dcr c 0723 0662 C2 51 06 jnz odvet4 0724 0665 0725 0665 2A B5 03 lhld pozstr 0726 0668 11 AF 06 lxi d,grstrl 0727 066B CD 1D 01 call paint 0728 066E 11 A5 06 lxi d,grplm2 ; fáze plamene 2 0729 0671 3A B6 03 lda vystre 0730 0674 3D dcr a 0731 0675 FE 02 cpi 2 0732 0677 DA 94 06 jc odvet7 ; konec, zhasnout.. 0733 067A 32 B6 03 sta vystre 0734 067D E6 01 ani 1 ; rozlišení fází plamene 0735 067F C2 85 06 jnz odvet6 0736 0682 11 9B 06 lxi d,grplm1 ; fáze plamene 1 0737 0685 01 00 09 odvet6: lxi b,900h ; posun plamene za střelcem 0738 0688 2A B5 03 lhld pozstr 0739 068B 09 dad b 0740 068C 06 0A mvi b,0ah 0741 068E CD 1F 01 call paint2 0742 0691 C3 4F 06 jmp odvet3 0743 0694 0744 0694 DB F6 odvet7: in 0f6h 0745 0696 E6 C0 ani 0c0h 0746 0698 D3 F6 out 0f6h 0747 069A C9 ret 0748 069B 0749 069B ; **************** 0750 069B ; obrázky předmětů 0751 069B ; **************** 0752 069B 0753 069B 0C grplm1: .db 0ch ; ..xx.. plamen fáze 1 0754 069C 12 .db 12h ; .x..x. 0755 069D 0A .db 0ah ; .x.x.. 0756 069E 16 .db 16h ; .xx.x. 0757 069F 0A .db 0ah ; .x.x.. 0758 06A0 14 .db 14h ; ..x.x. 0759 06A1 04 .db 04h ; ..x... 0760 06A2 08 .db 08h ; ...x.. 0761 06A3 04 .db 04h ; ..x... 0762 06A4 00 .db 00h ; ...... 0763 06A5 0764 06A5 0C grplm2: .db 0ch ; ..xx.. plamen fáze 2 0765 06A6 1E .db 1eh ; .xxxx. 0766 06A7 1E .db 1eh ; .xxxx. 0767 06A8 0C .db 0ch ; ..xx.. 0768 06A9 0C .db 0ch ; ..xx.. 0769 06AA 04 .db 04h ; ..x... 0770 06AB 08 .db 08h ; ...x.. 0771 06AC 00 .db 00h ; ...... 0772 06AD 00 .db 00h ; ...... 0773 06AE 00 .db 00h ; ...... 0774 06AF 0775 06AF 0C grstrl: .db 0ch ; ..xx.. střelec 0776 06B0 0C .db 0ch ; ..xx.. 0777 06B1 1E .db 1eh ; .xxxx. 0778 06B2 0C .db 0ch ; ..xx.. 0779 06B3 2D .db 2dh ; x.xx.x 0780 06B4 2D .db 2dh ; x.xx.x 0781 06B5 3F .db 3fh ; xxxxxx 0782 06B6 21 .db 21h ; x....x 0783 06B7 0784 06B7 0C grmsle: .db 0ch ; ..xx.. střela 0785 06B8 0C .db 0ch ; ..xx.. 0786 06B9 0C .db 0ch ; ..xx.. 0787 06BA 0C .db 0ch ; ..xx.. 0788 06BB 00 .db 00h ; ...... 0789 06BC 00 .db 00h ; ...... 0790 06BD 00 .db 00h ; ...... 0791 06BE 00 .db 00h ; ...... 0792 06BF 0793 06BF 00 grinvd: .db 00h ; ...... invader 0794 06C0 11 .db 11h ; x...x. 0795 06C1 04 .db 04h ; ..x... 0796 06C2 0E .db 0eh ; .xxx.. 0797 06C3 1F .db 1fh ; xxxxx. 0798 06C4 0A .db 0ah ; .x.x.. 0799 06C5 0A .db 0ah ; .x.x.. 0800 06C6 0A .db 0ah ; .x.x.. 0801 06C7 0802 06C7 00 grboom: .db 00h ; ...... 1. fáze zásahu 0803 06C8 00 .db 00h ; ...... 0804 06C9 0C .db 0ch ; ..xx.. 0805 06CA 1E .db 1eh ; .xxxx. 0806 06CB 1E .db 1eh ; .xxxx. 0807 06CC 0C .db 0ch ; ..xx.. 0808 06CD 00 .db 00h ; ...... 0809 06CE 00 .db 00h ; ...... 0810 06CF 0811 06CF 00 .db 00h ; ...... 2. fáze zásahu 0812 06D0 08 .db 08h ; ...x.. 0813 06D1 16 .db 16h ; .xx.x. 0814 06D2 33 .db 33h ; xx..xx 0815 06D3 22 .db 22h ; .x...x 0816 06D4 16 .db 16h ; .xx.x. 0817 06D5 0C .db 0ch ; ..xx.. 0818 06D6 00 .db 00h ; ...... 0819 06D7 0820 06D7 2A .db 2ah ; .x.x.x 3. fáze zásahu 0821 06D8 15 .db 15h ; x.x.x. 0822 06D9 20 .db 20h ; .....x 0823 06DA 02 .db 02h ; .x.... 0824 06DB 28 .db 28h ; ...x.x 0825 06DC 15 .db 15h ; x.x.x. 0826 06DD 16 .db 16h ; .xx.x. 0827 06DE 0A .db 0ah ; .x.x.. 0828 06DF 0829 06DF 00 00 00 00 grmpty: .db 0,0,0,0 ; prázdný symbol 0830 06E3 00 00 00 00 .db 0,0,0,0 0831 06E7 0832 06E7 00 invlst: .db 0 ; tabulka invadérů 0833 06E8 0834 06E8 .end