Indeks | English version |
Program oraz poniższy tekst napisał dr Samir Ribić, Sarajewo, Bośnia i Hercegowina, 10 sierpnia 2014.
Dawno, dawno temu, żył sobie utalentowany architekt i wynalazca Dedal. Król Minos sprowadził go na wyspę Kretę, ponieważ chciał, żeby Dedal zbudował Labirynt jako schronienie dla jego ulubieńca, Minotaura. Minotaur był straszliwym potworem z głową byka i ciałem człowieka. Dedal miał skonstruować budowlę z tak zagmatwanym układem pomieszczeń i korytarzy, że nikt nie mógłby wydostać się z niego o własnych siłach. W ten sposób król byłby szczęśliwy, potwór zamknięty, a ludziom nie zagrażałoby od niego niebezpieczeństwo.Król Minos często atakował Ateny poprzez Morze Śródziemne, a Ateńczykom brakowało floty do obrony. Król Aten Egeusz zaoferował królowi Minosowi układ. Jeżeli ten zobowiąże się nie atakować Aten przez 9 lat, Ateńczycy wyślą 7 chłopców i 7 dziewcząt w ofierze Minotaurowi. Król Minos dotrzymał słowa. Minęło 9 lat. Książę Tezeusz z Aten wiedział jak ważne jest dotrzymywanie słowa. Ale również był pewien, że źle jest posyłać małe dzieci dla potwora na pożarcie. Zgłosił się pojechać na Kretę jako siódma ofiara z zamiarem zabicia Minotaura i zakończenia terroru. Gdy 14 dzieci przybyło na Kretę, córka Minosa, księżniczka Ariadna, podarowała Tezeuszowi magiczny miecz, kłębek nici oraz tajny kod umożliwiający wyjście z Labiryntu. W rewanżu Tezeusz obiecał jej pomóc w ucieczce z Krety. Ariadna uważała się za zbyt piękną na marnowanie tam czasu. Tezeusz pokonał Minotaura, ale jego uczucie do Ariadny trwało krótko. Przy pierwszej okazji porzucił Ariadnę podczas snu na wyspie Naksos, ponieważ wolał jej siostrę Fedrę. Za to Ariadnie trafiła się znacznie lepsza partia. Poślubił ją bóg wina i uciech, Dionizos, dając jej w dodatku nieśmiertelność.
Ten antyczny grecki mit zainspirował mnie do napisania pierwszej trójwymiarowej gry typu "first person" dla Casio fx-8000G, coś w rodzaju mini wersji gry Wolfenstein 3D. Co takiego? Gra FPS zawierająca ok. 35000 pomieszczeń mieszcząca się 1K RAM przy rozdzielczości ekranu 96x64? Naprawdę nie żartuję, jak widać na zrzucie ekranu gry. Celem gry jest zranienie Minotaura 9 razy oraz dotarcie do pomieszczenia oznaczonego μντρ (mi-ni-tau-ro), gdzie Ariadna otworzy drzwi do wyjścia. Pamiętaj, że Minotaur nie pozostanie Ci dłużny. Może Cię zaatakować z każdej strony. Jeżeli nie jesteś do niego zwrócony twarzą (obie strzałki nie są jednakowo skierowane), zrani Cię z tyłu. Tak więc zawsze bądź gotów użyć miecza we właściwym momencie.
Klawisze strzałek lewo/prawo służą do zmiany kierunku, idzie się do przodu za pomocą klawisza ze strzałką w górę, klawiszem Range wyciąga się miecz, klawiszem AC kończy się grę. Po zakończeniu można wcisnąć Disp żeby zagrać ponownie.
Przepis na wpisanie gry Minotaur:
Xmin -10 max 10 scl 1 Ymin -10 max 10 scl 1
Xmin -10 max 10 scl 0 Ymin -10 max 10 scl 0
Ans→B S<2⇒Goto 0 0→M 0.3594→A[42] 1.00419048E41→A[43]~A[44] 1.00419848E41→A[45] 1.0007705E41→A[46] Lbl 0 S=0⇒Goto 1 Range 1,95,0,1,63,0 Cls 8→C Lbl 3 " " Dsz C Goto 3 11→A Lbl 1 53→C 32→D B<0⇒B+2xy32→B Lbl 2 Frac .5B=0⇒Plot A,C Frac .5B≠0⇒Isz M Int .5B→B Isz C C=57⇒49→C Frac ((D-1)÷8)=0⇒Dsz A Dsz D Goto 2 A+8→A 0→S Plot 0,0
(-5÷9)×(1E-44)→Z[356]~Z[358]
2→S Hex 42435E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 FF5FC6F0:Prog 0 5EB5195F:Prog 0 BB8356A1:Prog 0 05FBB2FB:Prog 0 C45F9A61:Prog 0 F3A5F025:Prog 0 70444E2B:Prog 0 C7397C43:Prog 0 951BBA61:Prog 0 7443C05E:Prog 0 B3036046:Prog 0 CF23A106:Prog 0 77444E70:Prog 0 43C02BB4:Prog 0 9B7443C0:Prog 0 2BB58D74:Prog 0 Dec M◿
2→S Hex 42439E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 43C04036:Prog 0 AF60A1BA:Prog 0 6043B677:Prog 0 43607043:Prog 0 A7408384:Prog 0 7043A451:Prog 0 90F61077:Prog 0 0000F610:Prog 0 586043B6:Prog 0 F6107743:Prog 0 F1F61077:Prog 0 43E8F610:Prog 0 7743E2F6:Prog 0 10774415:Prog 0 2B920174:Prog 0 448FFB92:Prog 0 Dec M◿
2→S Hex 4243DE40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 70444E0A:Prog 0 C4017043:Prog 0 EB0BC401:Prog 0 0CC40370:Prog 0 444E2B92:Prog 0 017C448F:Prog 0 5E920123:Prog 0 A1037444:Prog 0 4E549305:Prog 0 23440574:Prog 0 444E56A1:Prog 0 050F9302:Prog 0 0AC70170:Prog 0 444E6046:Prog 0 6C2CA301:Prog 0 74444E2B:Prog 0 Dec M◿
2→S Hex 42441E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 C4017744:Prog 0 337C443C:Prog 0 2BC40377:Prog 0 44427C44:Prog 0 4870444E:Prog 0 0BB40160:Prog 0 46C67044:Prog 0 4E0AB501:Prog 0 7044360A:Prog 0 B4017044:Prog 0 360BB501:Prog 0 70443660:Prog 0 466C6044:Prog 0 920CD23F:Prog 0 60062060:Prog 0 0B5354C6:Prog 0 Dec M◿
2→S Hex 42445E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 0054C740:Prog 0 414708A1:Prog 0 C480A193:Prog 0 609F3580:Prog 0 9F3580B3:Prog 0 14E0F507:Prog 0 C15F8CEF:Prog 0 1404E102:Prog 0 94900295:Prog 0 90029690:Prog 0 029790FB:Prog 0 E7600100:Prog 0 70437A40:Prog 0 5A80415D:Prog 0 80600F99:Prog 0 5E960441:Prog 0 Dec M◿
2→S Hex 42449E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 470CFB94:Prog 0 FE226045:Prog 0 645E9401:Prog 0 FE216045:Prog 0 64FE2377:Prog 0 44C04901:Prog 0 0B960174:Prog 0 44A17045:Prog 0 072B9604:Prog 0 7444D854:Prog 0 93052344:Prog 0 057444D8:Prog 0 23A1067F:Prog 0 44D856A1:Prog 0 05A9A501:Prog 0 54A50256:Prog 0 Dec M◿
2→S Hex 4244DE40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 A4600AA5:Prog 0 01032582:Prog 0 6045B75E:Prog 0 A7042CA5:Prog 0 037444F5:Prog 0 FBA76045:Prog 0 CA0AA501:Prog 0 2B258274:Prog 0 44E72B16:Prog 0 227F451F:Prog 0 54930523:Prog 0 44057445:Prog 0 1F23A104:Prog 0 7F451F40:Prog 0 5BCF5CB0:Prog 0 2260452F:Prog 0 Dec M◿
2→S Hex 42451E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 2B920174:Prog 0 452E405C:Prog 0 EE5EB004:Prog 0 60452F58:Prog 0 4147160A:Prog 0 B001A972:Prog 0 A1720BB0:Prog 0 01744535:Prog 0 BA302054:Prog 0 B1025C95:Prog 0 02A22080:Prog 0 95028495:Prog 0 020B9501:Prog 0 744548AA:Prog 0 15889500:Prog 0 48600BB0:Prog 0 Dec M◿
2→S Hex 42455E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 01744542:Prog 0 58EE14A9:Prog 0 95015495:Prog 0 02A99500:Prog 0 0B950156:Prog 0 A4115CA5:Prog 0 022C9402:Prog 0 7C45830B:Prog 0 A55FE825:Prog 0 5CA7020C:Prog 0 A7036045:Prog 0 B723A411:Prog 0 74459854:Prog 0 B0820A95:Prog 0 012C9401:Prog 0 7445AA5C:Prog 0 Dec M◿
2→S Hex 42459E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 B0822BA7:Prog 0 007C45AA:Prog 0 5EA70460:Prog 0 45CA03A0:Prog 0 01231502:Prog 0 74457558:Prog 0 5EA6015C:Prog 0 B002FE30:Prog 0 FE300CB0:Prog 0 3F0BB010:Prog 0 E8305854:Prog 0 B0620AB0:Prog 0 00FE300A:Prog 0 A6014047:Prog 0 11A0A742:Prog 0 405A2048:Prog 0 Dec M◿
2→S Hex 4245DE40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 600BA601:Prog 0 7445DE80:Prog 0 A5424860:Prog 0 0BB00174:Prog 0 45E624A3:Prog 0 017C45FD:Prog 0 06A2F080:Prog 0 A5425840:Prog 0 37004138:Prog 0 00F3C42C:Prog 0 C0017446:Prog 0 0F56C401:Prog 0 2CC1017C:Prog 0 463E54C0:Prog 0 A40341A4:Prog 0 5CC2A4A0:Prog 0 Dec M◿
2→S Hex 42461E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 C2A404C5:Prog 0 0F54C0C4:Prog 0 0741C45C:Prog 0 C2C4A1C2:Prog 0 C404C60F:Prog 0 5CC2C423:Prog 0 42A47446:Prog 0 3EF3C4A1:Prog 0 C1A4A0C0:Prog 0 C45CC2A4:Prog 0 0F42C40C:Prog 0 C21F7C46:Prog 0 682BC100:Prog 0 7C46682B:Prog 0 41A27C46:Prog 0 682BC000:Prog 0 Dec M◿
2→S Hex 42465E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 7C46682B:Prog 0 40A27446:Prog 0 6B56C401:Prog 0 585FA960:Prog 0 4246E054:Prog 0 C48402C4:Prog 0 014A0803:Prog 0 C4017446:Prog 0 785E9604:Prog 0 9F3580BB:Prog 0 40206046:Prog 0 B66045FE:Prog 0 ECA20A22:Prog 0 846046B6:Prog 0 6045FEEC:Prog 0 A30A2384:Prog 0 Dec M◿
2→S Hex 42469E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 6046B660:Prog 0 45FEECA1:Prog 0 0A218460:Prog 0 46B64E06:Prog 0 0B960174:Prog 0 468C58B2:Prog 0 502007D0:Prog 0 800A4105:Prog 0 07D1800A:Prog 0 40255854:Prog 0 93052344:Prog 0 057446E7:Prog 0 02A10123:Prog 0 A1047446:Prog 0 E756A105:Prog 0 0F93020A:Prog 0 Dec M◿
2→S Hex 4246DE40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 C6012BC6:Prog 0 3A7C43B0:Prog 0 587F7D81:Prog 0 7F81817E:Prog 0 81837F81:Prog 0 817F817F:Prog 0 7E81837F:Prog 0 817F7F82:Prog 0 7F7D817F:Prog 0 7F817F81:Prog 0 82080709:Prog 0 0600101C:Prog 0 242800CC:Prog 0 9933EE20:Prog 0 4724472A:Prog 0 4736474A:Prog 0 Dec M◿
2→S Hex 42471E40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 470101FA:Prog 0 F10103B7:Prog 0 09181A02:Prog 0 0473280C:Prog 0 094870E3:Prog 0 0070F003:Prog 0 05F3380E:Prog 0 0C39180C:Prog 0 08F80000:Prog 0 000C08E0:Prog 0 F1F3F702:Prog 0 03EF0CFB:Prog 0 0000EFEF:Prog 0 00007043:Prog 0 60475547:Prog 0 55475547:Prog 0 Dec M◿
2→S Hex 42475E40:Prog 0 5AF7415B:Prog 0 15600008:Prog 0 70000000:Prog 0 5547203A:Prog 0 30EC3A5D:Prog 0 3835335B:Prog 0 5A0E5D30:Prog 0 3334875B:Prog 0 5A01434D:Prog 0 00544F4E:Prog 0 494D0000:Prog 0 Dec M◿
0000: ORG &H435F 435F: FF db &HFF ; znacznik końca pliku EOF 4360: ; R28 wiersz gracza 4360: ; R29 kolumna gracza 4360: ; R32 wiersz wygenerowanego pomieszczenia 4360: ; R33 kolumna wygenerowanego pomieszczenia 4360: ; R36 kierunek patrzenia: 0 N (północ), 1 E (wschód), 2 S (południe), 3 W (zachód) 4360: ; R81 odległość od Minotaura: 0 daleko, 1 w oddaleniu, 2 średnia, 3 blisko 4 w zwarciu 5+ niewidoczny 4360: 4360: 4360: 4360: 4360: RESTART: 4360: 5FC6F0 ldm r38..r39,'0' ; punkty Tezeusz-Minotaur 4363: 4363: 5EB519 LD R29,&H19 ; początkowa pozycja w Labiryncie, kolumna 4366: 5FBB83 LDM R27..R28,&H3 ; R28 = początkowa pozycja w Labiryncie, wiersz 4366: ; R27 = bardziej znaczący bajt licznika pojawienia się Minotaura 4369: 4369: 56A105 LD R81,5 436C: FBB2 byd r26 ; skasowanie licznika pojawienia się Minotaura 436E: FBC4 byd R36 4370: 4370: 5F9A61 LDM r10..r11,1 ; R10 = miecz, R11 = pierwszy atak będzie ze wschodniej strony 4373: F3A5 byd R85 4375: F025 inv R85 ; unikamy kodu FF żeby nie zakłócać edytora plików (jest to kod znacznika EOF) 4377: 70444E JMP REF 437A: LP: 437A: 2BC739 TSB R39,'9' ; jeżeli ilość punktów Tezeusza wynosi '9' to ... 437D: 7C4395 JMP Z,MINDEAD ; ... Minotaur nie żyje, więc się nie porusza 4380: 1BBA61 SBM R26..R27,1 ; zmniejszenie licznika 4383: 7443C0 JMP NZ,TESTKBD ; okresowe zdarzenia 4386: 5EB303 LD R27,3 ; skasowanie licznika pojawienia się Minotaura 4389: 6046CF CAL APPROACH ; przybliżanie się Minotaura 438C: 23A106 TSB R81,6 ; jeżeli Minotaur jest widoczny to odświeżenie ekranu 438F: 77444E JMP C,REF 4392: 7043C0 JMP TESTKBD ; w przeciwnym razie tylko odczyt klawiatury 4395: MINDEAD: 4395: 2BB49B TSB R28,&H9B ; pomieszczenie gdzie jest Minotaur, wiersz 4398: 7443C0 JMP NZ,TESTKBD 439B: 2BB58D TSB R29,&H8D ; pomieszczenie gdzie jest Minotaur, kolumna 439E: 7443C0 JMP NZ,TESTKBD 43A1: WIN: ; Minotaur nie żyje a Tezeusz znajduje się w jego pomieszczeniu 43A1: 4036AF ldw ix,&H36AF ; komunikat w pamięci ROM "Please" dla wyrażenia zwycięstwa 43A4: WINANDLOSE: 43A4: 60A1BA cal &HA1BA ; wyświetlenie 16-znakowego tekstu 43A7: GAMEEND: 43A7: 6043B6 CAL TESTKB1 ; odczyt klawiatury oraz test klawisza kończącego oraz restartującego grę 43AA: 774360 JMP C,RESTART 43AD: 7043A7 JMP GAMEEND 43B0: LOSE: 43B0: 408384 LDW IX, &H8384 ; komunikat w pamięci ROM "Did not pass" dla wyrażenia przegranej 43B3: 7043A4 JMP WINANDLOSE 43B6: 43B6: TESTKB1: 43B6: 5190 GST R72,KI ; odczyt klawiatury 43B8: F610 ROD R72 ; klawisze Disp/AC kończą grę 43BA: 770000 JMP C,0 43BD: F610 ROD R72 43BF: 58 RTN 43C0: TESTKBD: 43C0: 6043B6 CAL TESTKB1 ; odczyt klawiatury oraz wykonanie akcji przypisanej do klawisza 43C3: F610 ROD R72 43C5: 7743F1 JMP C,RANGEFIRE 43C8: F610 ROD R72 43CA: 7743E8 JMP C,LEFTKEY 43CD: F610 ROD R72 43CF: 7743E2 JMP C,RIGHTKEY 43D2: F610 ROD R72 43D4: 774415 JMP C,FORWARDKEY 43D7: 43D7: 2B9201 TSB R10,1 ; żaden klawisz nie wciśnięty, test czy miecz jest wyciągnięty 43DA: 74448F JMP NZ,REF1 43DD: FB92 byd R10 ; skasowanie znacznika wyciągniętego miecza 43DF: 70444E JMP REF 43E2: RIGHTKEY: ; obrócenie się zmienia zawartość dwóch dolnych bitów rejestru R36 43E2: 0AC401 AD R36,1 43E5: 7043EB JMP LF1 43E8: LEFTKEY: 43E8: 0BC401 SB R36,1 43EB: LF1: 43EB: 0CC403 AN R36,3 43EE: 70444E JMP REF 43F1: RANGEFIRE ; klawisz Range wyciąga miecz 43F1: 2B9201 TSB R10,1 ; jeżeli miecz jest już wyciągnięty to tylko go rysujemy, miecz jest skuteczny tylko wtedy gdy zostanie wyciągnięty blisko Minotaura 43F4: 7C448F JMP Z,REF1 43F7: 5E9201 LD R10,1 ; miecz wyciągnięty 43FA: 23A103 TSB R81,3 ; Minotaur jest w pozycji "blisko" ... 43FD: 74444E JMP NZ,REF 4400: 549305 LD R104,R11 ; ... oraz Minotaur znajduje się przed nami 4403: 234405 TSB R104,R36 4406: 74444E JMP NZ,REF 4409: 56A105 LD R81,&H5 ; Minotaur został trafiony 440C: 0F9302 XR R11,2 ; zmiana kierunku ataku wschód-zachód 440F: 0AC701 AD R39,1 ; Tezeusz wygrał tę rundę 4412: 70444E JMP REF 4415: 4415: FORWARDKEY: 4415: 60466C CAL MAKEROOMBITMAP ; generuj kody krajobrazu w trzech rejestrach 4418: 2CA301 TAN R19,1 ; jeżeli jest przed nami ściana, nie idziemy naprzód 441B: 74444E JMP NZ,REF 441E: 2BC401 TSB R36,1 ; lub idziemy we właściwą stronę 4421: 774433 JMP C,GONORTH 4424: 7C443C JMP Z,GOEAST 4427: 2BC403 TSB R36,3 442A: 774442 JMP C,GOSOUTH 442D: 7C4448 JMP Z,GOWEST 4430: 4430: 70444E JMP REF ; rysowanie krajobrazu 4433: 4433: GONORTH: 4433: 0BB401 SB R28,1 ; zmiana położenia gracza 4436: GN1: 4436: 6046C6 CAL APPROAC1 ; jeżeli jesteśmy skierowani w stronę Minotaura, będzie się on zbliżał szybciej 4439: 70444E JMP REF 443C: GOEAST: 443C: 0AB501 AD R29,1 443F: 704436 JMP GN1 4442: GOSOUTH: 4442: 0AB401 AD R28,1 4445: 704436 JMP GN1 4448: GOWEST: 4448: 0BB501 SB R29,1 444B: 704436 JMP GN1 444E: 444E: 444E: REF: 444E: 60466C CAL MAKEROOMBITMAP ; generuj kody krajobrazu w trzech rejestrach 4451: 604492 CAL SCENE ; narysuj scenerię 4454: 0CD23F AN R42,&H3F ; parametr 4457: 600620 CAL &H0620 ; podprogram ROM przenoszący na ekran zawartość pamięci wideo 445A: 445A: 600B53 cal &H0B53 ; kasowanie łańcucha 445D: 54C600 LD R64,r38 ; punkty Minotaura 4460: 54C740 LD R66,R39 ; punkty Tezeusza 4463: 414708 LDW IY,DIRECTIONCODES 4466: A1C480 LD R68,(IY+R36) ; strzałki z zestawu fontów Casio dla kierunku Tezeusza 4469: A19360 LD R67,(IY+R11) ; strzałki z zestawu fontów Casio dla kierunku Minotaura 446C: 446C: 9F3580 STM -(SP),R29..R28 ; rząd i kolumna gracza, rozdział dwóch bajtów na cztery półbajty 446F: 9F3580 STM -(SP),R29..R28 4472: B314E0 LDM R76..R79,(SP)+ 4475: F507C1 DIDM R79..R78 4478: 5F8CEF LDM R4..R7,&H0F 447B: 1404E1 ANM R76..R79,R4..R7 447E: 447E: 029490 AD R76,&H90 ; ofset greckich liter 4481: 029590 AD R77,&H90 4484: 029690 AD R78,&H90 4487: 029790 AD R79,&H90 448A: 448A: FBE7 byd r55 ; górny róg 448C: 600100 cal &H0100 ;wyświetlenie łańcucha R79..R64 448F: REF1: 448F: 70437A JMP LP ; powrót do głównej pętli 4492: SCENE: 4492: 405A80 LDW IX,&H5A80 ; adres początkowy pamięci video 4495: 415D80 LDW IY,&H5A80+768 4498: 600F99 cal &H0F99 ; kasowanie fragmentu pamięci bajtami &hFF = kasowanie ekranu 449B: 449B: 5E9604 LD R14,4 ; sceneria składa się z czterech stref ... 449E: 41470C LDW IY,ZONES ; ... których początkowa współrzędna x jest wskazywana przez IY 44A1: SCENELP: 44A1: FB94 byd R12 44A3: FE22 ROD R18 44A5: 604564 CAL MAZESHAPE ; lewa ściana 44A8: 5E9401 LD R12,1 44AB: FE21 ROD R17 44AD: 604564 CAL MAZESHAPE ; prawa ściana 44B0: FE23 ROD R19 ; środkowa ściana 44B2: 7744C0 JMP C,DEADEND 44B5: 4901 ADW IY,1 ; wskaźnik do następnego początkowego rzędu 44B7: 0B9601 SB R14,1 44BA: 7444A1 JMP NZ,SCENELP 44BD: 704507 JMP MINOTAUR1 44C0: DEADEND: ; rysowanie ściany przed nami 44C0: 2B9604 TSB R14,4 ; test czy zderzamy się ze ścianą 44C3: 7444D8 JMP NZ,PLOTDEADEND ; skocz gdy nie 44C6: HIDE: 44C6: 549305 LD R104,R11 ; jesteśmy tuż za ścianą, skierowani w stronę Minotaura 44C9: 234405 TSB R104,R36 44CC: 7444D8 JMP NZ,PLOTDEADEND 44CF: 23A106 TSB R81,6 44D2: 7F44D8 JMP NC,PLOTDEADEND 44D5: 56A105 LD R81,5 ; Minotaur niewidoczny 44D8: PLOTDEADEND: ; ściana przed nami składa się z linii o tej samej wysokości 44D8: A9A501 LD R21,(IY+1) ;od x wskazywanego przez IY+1 44DB: 54A502 LD R80,R21 44DE: 56A460 LD R84,96 44E1: 0AA501 AD R21,1 44E4: 032582 SB R84,R21 ; do 95-x 44E7: DELOOP: 44E7: 6045B7 CAL CALCLINEHL ; obliczenie wysokości linii 44EA: 5EA704 LD R23,4 ; wzór cegły 44ED: 2CA503 TAN R21,3 ; co czwarty wzór jest pionową linią 44F0: 7444F5 JMP NZ,DEBRICK 44F3: FBA7 byd R23 44F5: DEBRICK: 44F5: 6045CA CAL VLINE ; rysowanie pionowej linii dla ściany przed graczem 44F8: 0AA501 AD R21,1 44FB: 2B2582 TSB R21,R84 44FE: 7444E7 JMP NZ,DELOOP 4501: MINOTAUR: 4501: 2B1622 TSB R14,R81 4504: 7F451F JMP NC,SWORD 4507: 4507: MINOTAUR1: 4507: 549305 LD R104,R11 ; test czy Minotaur jest skierowany w stronę Tezeusza 450A: 234405 TSB R104,R36 450D: 74451F JMP NZ,SWORD 4510: 23A104 TSB R81,4 4513: 7F451F JMP NC,SWORD ; test czy Minotaur jest w pobliżu 4516: 405BCF LDW IX,&H5B6F+96 ; pozycja Minotaura na ekranie 4519: 5CB022 LD R24,R81 ; kod odległości od Minotaura jest równocześnie numerem sprajta 451C: 60452F CAL SPRITE 451F: 451F: SWORD: 451F: 2B9201 TSB R10,1 4522: 74452E JMP NZ,ENDDRAW ; jeżeli miecz jest wyciągnięty to pomijamy rysowanie go 4525: 405CEE LDW IX,&H5CEE ; pozycja miecza na ekranie 4528: 5EB004 LD R24,4 ; miecz jest sprajtem numer 4 452B: 60452F CAL SPRITE 452E: ENDDRAW: 452E: 58 RTN 452F: 452F: SPRITE: ; podprogram rysowania sprajta 452F: 414716 LDW IY,SPROFFSET 4532: 0AB001 AD R24,1 4535: MST: ; szukanie definicji sprajta 4535: A972 LD R58,(IY)+ 4537: A172 LD R122,(IY)+ ; asembler zapisuje bajty w słowie w kolejności "little-endian" 4539: 0BB001 SB R24,1 ; IZ wskazuje definicję sprajta 453C: 744535 JMP NZ,MST 453F: BA3020 LDM R24..R25,(IZ)+ ; pobranie ilości wierszy (8 pixels) i kolumn (1 pixel) w definicji sprajta 4542: MST1: 4542: 54B102 LD R80,R25 4545: 5C9502 LD R13,R80 4548: MST2: 4548: A220 LD R80,(IZ)+ 454A: 809502 ST (IX+R13),R80 454D: 849502 ST (IX-R13),R80 ; sprajty są symetryczne dla oszczędności pamięci 4550: 0B9501 SB R13,1 4553: 744548 JMP NZ,MST2 4556: AA15 LD R13,(IZ)+ ; środek sprajta jest zapamiętany na końcu 4558: 889500 ST (IX+0),R13 455B: 4860 ADW IX,96 ; następny wiersz sprajta 455D: 0BB001 SB R24,1 4560: 744542 JMP NZ,MST1 4563: ENDSPRITE: 4563: 58 RTN 4564: 4564: MAZESHAPE: ; IY wskazuje pozycję X, R12+carry określa typ 4564: EE14 ROU R12 4566: A99501 LD R13,(IY+1) 4569: SETENDLINE: 4569: 549502 LD R80,R13 456C: A99500 LD R13,(IY+0) 456F: ; na wejściu: R12 typ, R80 linia końcowa, R13 linia początkowa 456F: MAZEPART: ; rysowanie lewej i prawej strony labiryntu 456F: 0B9501 SB R13,1 4572: 56A411 LD R84,17 4575: MPLOOP: 4575: 5CA502 LD R21,R80 4578: 2C9402 TAN R12,2 ; lewa lub prawa ściana 457B: 7C4583 JMP Z,MPLOOP1 457E: 0BA55F SB R21,95 ; prawa strona 4581: E825 CMP R21 4583: MPLOOP1: 4583: 5CA702 LD R23,R80 ; tworzenie kodu wzoru z bieżącej linii 4586: 0CA703 AN R23,3 4589: 6045B7 CAL CALCLINEHL ; oblicz wysokość od x (R80) 458C: 23A411 TSB R84,17 458F: 744598 JMP NZ,SKIPLENREM 4592: 54B082 LD R84,R24 ; zapamiętaj wysokość ściany 4595: 0A9501 AD R13,1 4598: SKIPLENREM: ; jeżeli z boku jest ściana, rysuj w strefie linie o różnej wysokości 4598: 2C9401 TAN R12,1 ; jeżeli z boku jest przestrzeń, linie w strefie mają jednakową wysokość 459B: 7445AA JMP NZ,DRAWLINE 459E: 5CB082 LD R24,R84 ; boczne ściany są różne, cofnij CALCLINEHL 45A1: 2BA700 TSB R23,0 45A4: 7C45AA JMP Z,DRAWLINE 45A7: 5EA704 LD R23,4 ; wzór cegły 45AA: DRAWLINE: 45AA: 6045CA CAL VLINE ; rysowanie pionowej linii 45AD: 03A001 SB R80,1 ; następna współrzędna x 45B0: 231502 TSB R80,R13 45B3: 744575 JMP NZ,MPLOOP 45B6: 58 RTN 45B7: CALCLINEHL: ; oblicza pionową linię od pozycji x 45B7: 5EA601 LD R22,1 45BA: 5CB002 LD R24,R80 45BD: FE30 ROD R24 45BF: FE30 ROD R24 45C1: 0CB03F AN R24,&H3F 45C4: 0BB010 SB R24,16 45C7: E830 CMP R24 45C9: 58 RTN 45CA: ; Rysowanie pionowej linii. Parametry: R21 - kolumna, R22 - wiersz/8, R23 - wzór, R24 - ilość powtórzeń 45CA: 45CA: VLINE: 45CA: 54B062 LD R83,R24 45CD: 0AB000 AD R24,0 ; dzielenie ilosci powtórzeń przez 2 45D0: FE30 ROD R24 45D2: 0AA601 AD R22,1 45D5: 404711 LDW IX,VMASKS 45D8: A0A742 LD R82,(IX+R23) ; pobranie wzoru 45DB: 405A20 LDW IX,&H5A80-96 45DE: VLINEST: 45DE: 4860 ADW IX,96 45E0: 0BA601 SB R22,1 45E3: 7445DE JMP NZ,VLINEST 45E6: VLINEF: 45E6: 80A542 ST (IX+R21),R82 45E9: 4860 ADW IX,96 45EB: 0BB001 SB R24,1 45EE: 7445E6 JMP NZ,VLINEF 45F1: 24A301 TAN R83,1 ; z powodu organizacji pamięci ekranu co druga pionowa linia ma dodatkowy półbajt 45F4: 7C45FD JMP Z,ENDVLINE 45F7: 06A2F0 OR R82,&HF0 ; zamaskuj bardziej znaczący pójbajt 45FA: 80A542 ST (IX+R21),R82 ; umieść na ekranie 45FD: ENDVLINE: 45FD: 58 RTN 45FE: 45FE: 45FE: ROOMCALC: 45FE: ; R32 wiersz generowanego pomieszczenia 45FE: ; R33 kolumna generowanego pomieszczenia 45FE: ; procedura zwraca 1 (ściana) lub 0 (przestrzeń) na podstawie współrzędnych x oraz y pomieszczenia, używając zawartości pamięci ROM do zwiększenia przypadkowości wyboru 45FE: 403700 LDW IX,&H3700 ; partrom 4601: 413800 LDW IY,&H3800 ; partrom2 4604: F3C4 byd R100 ; mazepos1:=0; 4606: 2CC001 TAN R32,1 ; if y and 1 =0 then mazepos1:=1; 4609: 74460F JMP NZ,ROOMCALC1 460C: 56C401 LD R100,1 460F: ; if ((partrom[(y - x) mod 256] and 15) = (partrom2[(y xor x) mod 256] and 15)) and (x mod 2 =1)then mazepos1:=0; 460F: ROOMCALC1: 460F: 2CC101 TAN R33,1 4612: 7C463E JMP Z,ROOMCALC2 4615: 54C0A4 LD R101,R32 4618: 0341A4 SB R101,R33 461B: 5CC2A4 LD R34,R101 461E: A0C2A4 LD R101,(IX+R34) 4621: 04C50F AN R101,15 4624: 4624: 54C0C4 LD R102,R32 4627: 0741C4 XR R102,R33 462A: 5CC2C4 LD R34,R102 462D: A1C2C4 LD R102,(IY+R34) 4630: 04C60F AN R102,15 4633: 5CC2C4 LD R34,R102 4636: 2342A4 TSB R101,R34 4639: 74463E JMP NZ,ROOMCALC2 463C: F3C4 byd R100 463E: ; if (partrom2[x] xor partrom[y]) and 31 =0 then mazepos1:=1; 463E: ROOMCALC2: 463E: A1C1A4 LD R101,(IY+R33) 4641: A0C0C4 LD R102,(IX+R32) 4644: 5CC2A4 LD R34,R101 4647: 0F42C4 XR R34,R102 464A: 0CC21F AN R34,31 464D: 7C4668 JMP Z,MAZEBORDER 4650: ROOMCALC3: 4650: ; if x=0 or x=255 or y=0 or y=255 then mazepos1:=1; 4650: 2BC100 TSB R33,0 4653: 7C4668 JMP Z,MAZEBORDER 4656: 2B41A2 TSB R33,r85 4659: 7C4668 JMP Z,MAZEBORDER 465C: 2BC000 TSB R32,0 465F: 7C4668 JMP Z,MAZEBORDER 4662: 2B40A2 TSB R32,r85 4665: 74466B JMP NZ,ROOMCALCFIN 4668: MAZEBORDER: 4668: 56C401 LD R100,1 466B: ROOMCALCFIN: 466B: 58 RTN 466C: 466C: ; Format zwracany przez MAKEROOMBITMAP 466C: ; R18 R19 R17 466C: ; X 466C: ; X X X 466C: ; X X X 466C: ; X X X 466C: ; X Gracz X 466C: 466C: 466C: MAKEROOMBITMAP: ; procedura ogląda 12 pomieszczeń przed graczem i zapisuje ich konfigurację w bitach rejestrów R17,R18 oraz R19 466C: 466C: 5FA960 LDM R17..R19,0 466F: 4246E0 LDW IZ,NORTH-8 ; tablica wskazywana przez IZ zależy od kierunku patrzenia 4672: 54C484 LD R100,R36 4675: 02C401 AD R100,1 4678: SIDEDETERMINE: 4678: 4A08 ADW IZ,8 467A: 03C401 SB R100,1 467D: 744678 JMP NZ,SIDEDETERMINE ; po opuszczeniu tej pętli IZ będzie wskazywać odpowiednią tablicę przyrostów współrzędnych potrzebnych żeby przejść do sąsiedniego pomieszczenia 4680: 5E9604 LD R14,4 4683: 4683: 9F3580 STM -(SP),R29..R28 4686: BB4020 LDM R32..R33,(SP)+ ; współrzędne sprawdzanych pomieszczeń 4689: 4689: 6046B6 CAL NEXTIZ ; zwiększ x oraz y żeby przejść do sąsiedniego pomieszczenia 468C: LOOKNORTHLP: 468C: 6045FE CAL ROOMCALC ; lewe 468F: ECA2 BIU R18 4691: 0A2284 AD R18,R100 4694: 6046B6 CAL NEXTIZ ; środkowe 4697: 6045FE CAL ROOMCALC 469A: ECA3 BIU R19 469C: 0A2384 AD R19,R100 469F: 6046B6 CAL NEXTIZ ; prawe 46A2: 6045FE CAL ROOMCALC 46A5: ECA1 BIU R17 46A7: 0A2184 AD R17,R100 46AA: 6046B6 CAL NEXTIZ 46AD: 4E06 SBW IZ,6 46AF: 0B9601 SB R14,1 46B2: 74468C JMP NZ,LOOKNORTHLP 46B5: 58 RTN 46B6: NEXTIZ: 46B6: B25020 LDM R104..R105,(IZ)+ 46B9: 07D080 XR R104,&H80 46BC: 0A4105 AD R33,R104 46BF: 07D180 XR R105,&H80 46C2: 0A4025 AD R32,R105 46C5: 46C5: 46C5: 58 RTN 46C6: APPROAC1: 46C6: 549305 LD R104,R11 46C9: 234405 TSB R104,R36 46CC: 7446E7 JMP NZ,ENDEVENT 46CF: APPROACH: 46CF: 02A101 AD R81,1 ; zmniejszenie odległości do Minotaura 46D2: 23A104 TSB R81,4 46D5: 7446E7 JMP NZ,ENDEVENT 46D8: 56A105 LD R81,&H5 ; gdy Minotaur się pojawił a miecz nie był wyciągnięty 46DB: 0F9302 XR R11,2 46DE: 0AC601 AD R38,1 ; punkty Minotaura 46E1: 2BC63A TSB R38,58 46E4: 7C43B0 JMP Z,LOSE ; Tezeusz traci życie 46E7: ENDEVENT: 46E7: 58 RTN 46E8: ; Tablica kierunków poddana operacji XOR 128 żeby uniknąć zabronionego kodu FF w pamięci 46E8: NORTH: 46E8: ; DB -1,-3, 1,-1, 1,1, -2,1 46E8: 7F7D817F81817E81 DB 127,125, 129,127, 129,129, 126,129 46F0: ; dx,dy, dx,dy dx,dy dx,dy 46F0: EAST: 46F0: ; DB 3,-1, 1,1, -1,1, -1,-2 46F0: 837F81817F817F7E db 131,127,129,129,127,129,127,126 46F8: SOUTH: 46F8: ; DB 1,3, -1,1, -1,-1, 2,-1 46F8: 81837F817F7F827F db 129,131,127,129,127,127,130,127 4700: WEST: 4700: ; DB -3,1, -1,-1, 1,-1, 1,2 4700: 7D817F7F817F8182 db 125,129,127,127,129,127,129,130 4708: DIRECTIONCODES: 4708: 08070906 db 8,7,9,6 470C: 470C: ZONES: 470C: 00101C2428 DB 0,16,28,36,40 4711: VMASKS: 4711: 00CC9933EE DB &H00,&HCC,&H99,&H33,&HEE 4716: 4716: SPROFFSET: 4716: 204724472A4736474A47 DW VFARMINDATA,FARMINDATA,MEDMINDATAR1,NEARMINDATAR1,SWORDDATA 4720: ; definicja Minotaura i miecza 4720: VFARMINDATA: 4720: 0101FAF1 DB 1,1,&HFA,&HF1 4724: FARMINDATA: 4724: 0103B709181A DB 1,3,&HB7,&H09,&H18,&H1A 472A: MEDMINDATAR1: 472A: 020473280C0948 DB 2,4,&H73,&H28,&H0C,&H09,&H48 4731: MEDMINDATAR2: 4731: 70E30070F0 DB &H70,&HE3,&H00,&H70,&HF0 4736: NEARMINDATAR1: 4736: 0305F3380E0C3918 DB 3,5,&HF3,&H38,&H0E,&H0C,&H39,&H18 473E: NEARMINDATAR2: 473E: 0C08F8000000 DB &H0C,&H08,&HF8,&H00,&H00,&H00 4744: NEARMINDATAR3: 4744: 0C08E0F1F3F7 DB &H0C,&H08,&HE0,&HF1,&HF3,&HF7 474A: SWORDDATA: 474A: 0203EF0CFB00 DB 2,3, &HEF,&H0C,&HFB,&H00 4750: 00EFEF00 db &H00,&HEF,&HEF,&H00 4754: ORG &H4755 4755: 704360 JMP RESTART 4758: 4755475547554755 db 'GUGUGUGU' ; odpowiada liczbie 4755475547554755 4760: 47203A30EC3A5D3835335B5A0E5D303334875B5A01 DB 'G :0',&HEC,':]853[Z',&H0E,']034',&H87,'[Z',01 4775: 434D00 DB 'CM',00 ; hasło, 2 znaki 4778: 544F4E494D DB 'TONIM' ; nazwa pliku, 5 znaków
5AE8: 42435E LDW IZ,&H435E ; adres docelowy - 1 5AEB: 405AF7 LDW IX,&H5AF7 ; adres źródłowy w pamięci video - 1 5AEE: 415B37 LDW IY,&H5B37 ; koniec źródła w pamięci wideo 5AF1: 600008 CAL 8 ; kopiowanie bloku pamięci 5AF4: 700000 JMP 0 ; ekran główny 5AF7: 00 DB 0 ; adres musi być podzielny przez 4 5AF8: 57A820 db &h57,&hA8,&h20 ; LDM R80..R81,0 itd. ...
Zawartość archiwum: