| 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: