Indeks English versionEnglish version

Gra Minotaur, 3D FPS dla kalkulatora Casio fx-8000G

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.

zrzut ekranu gry Minotaur


Przepis na wpisanie gry Minotaur:

Usunięcie ograniczeń dostępu do pamięci


  1. Wciśnij Reset.
  2. Mode 2
    Powinno pokazać się 1446 wolnych bajtów
  3. Mode 1
  4. Range
        Xmin -10
         max 10
        scl 1
        Ymin -10
         max 10
        scl 1
    
  5. Wciśnij G↔T
  6. Range
        Xmin -10
         max 10
        scl 0
        Ymin -10
         max 10
        scl 0
    
  7. Wciśnij G↔T
  8. Wciśnij AC, potem Shift i Alpha, a następnie wpisz
    SAVE "A"G
    Pomiędzy SAVE i pierwszym cudzysłowem ma być spacja, pomiędzy drugim cudzysłowem oraz G nie może być spacji.
  9. Wciśnij EXE
    Pojawi się komunikat SYS error
  10. Wciśnij strzałkę w lewo a potem EXE aby powtórzyć ostatnie polecenie
    Pojawi się teraz komunikat Save execution I/O error
  11. Ponownie strzałka w lewo i EXE aby powtórzyć ostatnie polecenie
    Spowoduje to znowu komunikat SYS error
  12. Wciśnij AC i przejdź do mode 3 (PCL). Będzie widać dwa zajęte programy (4 i 5). Skasuj program 4 klawiszem AC. Teraz wszystkie programy będą zajęte. Wciśnij SHIFT DEL żeby skasować wszystkie programy. Obecnie jest 1654 bajtów wolnej pamięci. W tym stanie nie ma już kontroli zakresu indeksów tablic.

    Wprowadzenie programu ładującego


    Najprościej jest umieścić kod maszynowy w pamięci video (za pomocę rysowania grafiki).
  13. Wybierz tryb Comp (Mode +)
  14. Wybierz tryb WRT (Mode 2)
  15. Wybierz Prog 0
  16. Wpisz następujący program
      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
    
  17. Opuść edytor wybierając tryb WRT (Mode 2)
  18. Wybierz Prog 2
  19. Wpisz następujący program
            (-5÷9)×(1E-44)→Z[356]~Z[358]
    
  20. Opuść edytor wybierając tryb RUN (Mode 1)

    Wprowadzenie kodu gry


    Pamięć wideo jest tylko chwilowym miejscem przechowywania kodu z powodu ograniczonego rozmiaru oraz wpływu na treść ekranu.
    Program gry jest normalnie uruchamiany od adresu &h435F. Trzeba go podzielić na mniejsze części mieszczące się w pamięci video razem z procedurą, która przemieści kod do docelowego miejsca w edytorze plików.
  21. Wybierz tryb Base-N (Mode -)
  22. Wybierz tryb WRT (Mode 2)
  23. Wybierz Prog 1
  24. Wpisz następujący program, część 1
    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◿
    
  25. Opuść edytor wybierając tryb RUN (Mode 1)
  26. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  27. Jeżeli wyświetlona suma kontrolna jest różna od 295, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  28. Uruchom Prog 2, który przeniesie część 1 z pamięci video do obszaru edytora plików.
  29. Wybierz tryb WRT (Mode 2)
  30. Wybierz Prog 1
  31. Wpisz następujący program, część 2
    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◿
    
  32. Opuść edytor wybierając tryb RUN (Mode 1)
  33. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  34. Jeżeli wyświetlona suma kontrolna jest różna od 259, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  35. Uruchom Prog 2, który przeniesie część 2 z pamięci video do obszaru edytora plików.
  36. Wybierz tryb WRT (Mode 2)
  37. Wybierz Prog 1
  38. Wpisz następujący program, część 3
    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◿
    
  39. Opuść edytor wybierając tryb RUN (Mode 1)
  40. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  41. Jeżeli wyświetlona suma kontrolna jest różna od 230, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  42. Uruchom Prog 2, który przeniesie część 3 z pamięci video do obszaru edytora plików.
  43. Wybierz tryb WRT (Mode 2)
  44. Wybierz Prog 1
  45. Wpisz następujący program, część 4
    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◿
    
  46. Opuść edytor wybierając tryb RUN (Mode 1)
  47. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  48. Jeżeli wyświetlona suma kontrolna jest różna od 228, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  49. Uruchom Prog 2, który przeniesie część 4 z pamięci video do obszaru edytora plików.
  50. Wybierz tryb WRT (Mode 2)
  51. Wybierz Prog 1
  52. Wpisz następujący program, część 5
    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◿
    
  53. Opuść edytor wybierając tryb RUN (Mode 1)
  54. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  55. Jeżeli wyświetlona suma kontrolna jest różna od 2229, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  56. Uruchom Prog 2, który przeniesie część 5 z pamięci video do obszaru edytora plików.
  57. Wybierz tryb WRT (Mode 2)
  58. Wybierz Prog 1
  59. Wpisz następujący program, część 6
    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◿
    
  60. Opuść edytor wybierając tryb RUN (Mode 1)
  61. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  62. Jeżeli wyświetlona suma kontrolna jest różna od 244, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  63. Uruchom Prog 2, który przeniesie część 6 z pamięci video do obszaru edytora plików.
  64. Wybierz tryb WRT (Mode 2)
  65. Wybierz Prog 1
  66. Wpisz następujący program, część 7
    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◿
    
  67. Opuść edytor wybierając tryb RUN (Mode 1)
  68. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  69. Jeżeli wyświetlona suma kontrolna jest różna od 256, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  70. Uruchom Prog 2, który przeniesie część 7 z pamięci video do obszaru edytora plików.
  71. Wybierz tryb WRT (Mode 2)
  72. Wybierz Prog 1
  73. Wpisz następujący program, część 8
    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◿
    
  74. Opuść edytor wybierając tryb RUN (Mode 1)
  75. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  76. Jeżeli wyświetlona suma kontrolna jest różna od 221, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  77. Uruchom Prog 2, który przeniesie część 8 z pamięci video do obszaru edytora plików.
  78. Wybierz tryb WRT (Mode 2)
  79. Wybierz Prog 1
  80. Wpisz następujący program, część 9
    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◿
    
  81. Opuść edytor wybierając tryb RUN (Mode 1)
  82. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  83. Jeżeli wyświetlona suma kontrolna jest różna od 235, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  84. Uruchom Prog 2, który przeniesie część 9 z pamięci video do obszaru edytora plików.
  85. Wybierz tryb WRT (Mode 2)
  86. Wybierz Prog 1
  87. Wpisz następujący program, część 10
    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◿
    
  88. Opuść edytor wybierając tryb RUN (Mode 1)
  89. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  90. Jeżeli wyświetlona suma kontrolna jest różna od 230, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  91. Uruchom Prog 2, który przeniesie część 10 z pamięci video do obszaru edytora plików.
  92. Wybierz tryb WRT (Mode 2)
  93. Wybierz Prog 1
  94. Wpisz następujący program, część 11
    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◿
    
  95. Opuść edytor wybierając tryb RUN (Mode 1)
  96. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  97. Jeżeli wyświetlona suma kontrolna jest różna od 227, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  98. Uruchom Prog 2, który przeniesie część 11 z pamięci video do obszaru edytora plików.
  99. Wybierz tryb WRT (Mode 2)
  100. Wybierz Prog 1
  101. Wpisz następujący program, część 12
    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◿
    
  102. Opuść edytor wybierając tryb RUN (Mode 1)
  103. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  104. Jeżeli wyświetlona suma kontrolna jest różna od 237, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  105. Uruchom Prog 2, który przeniesie część 12 z pamięci video do obszaru edytora plików.
  106. Wybierz tryb WRT (Mode 2)
  107. Wybierz Prog 1
  108. Wpisz następujący program, część 13
    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◿
    
  109. Opuść edytor wybierając tryb RUN (Mode 1)
  110. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  111. Jeżeli wyświetlona suma kontrolna jest różna od 239, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  112. Uruchom Prog 2, który przeniesie część 13 z pamięci video do obszaru edytora plików.
  113. Wybierz tryb WRT (Mode 2)
  114. Wybierz Prog 1
  115. Wpisz następujący program, część 14
    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◿
    
  116. Opuść edytor wybierając tryb RUN (Mode 1)
  117. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  118. Jeżeli wyświetlona suma kontrolna jest różna od 224, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  119. Uruchom Prog 2, który przeniesie część 14 z pamięci video do obszaru edytora plików.
  120. Wybierz tryb WRT (Mode 2)
  121. Wybierz Prog 1
  122. Wpisz następujący program, część 15
    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◿
    
  123. Opuść edytor wybierając tryb RUN (Mode 1)
  124. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  125. Jeżeli wyświetlona suma kontrolna jest różna od 277, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  126. Uruchom Prog 2, który przeniesie część 15 z pamięci video do obszaru edytora plików.
  127. Wybierz tryb WRT (Mode 2)
  128. Wybierz Prog 1
  129. Wpisz następujący program, część 16
    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◿
    
  130. Opuść edytor wybierając tryb RUN (Mode 1)
  131. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  132. Jeżeli wyświetlona suma kontrolna jest różna od 228, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  133. Uruchom Prog 2, który przeniesie część 16 z pamięci video do obszaru edytora plików.
  134. Wybierz tryb WRT (Mode 2)
  135. Wybierz Prog 1
  136. Wpisz następujący program, część 17
    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◿
    
  137. Opuść edytor wybierając tryb RUN (Mode 1)
  138. Uruchom Prog 1 i poczekaj, aż zakończy się kreślenie grafiki
  139. Jeżeli wyświetlona suma kontrolna jest różna od 145, trzeba uważnie sprawdzić poprawność kodów szesnastkowych w Prog 1, poprawić błąd i uruchomić ponownie.
  140. Uruchom Prog 2, który przeniesie część 17 z pamięci video do obszaru edytora plików

    Test gry i skasowanie niepotrzebnych programów


  141. Przejdź do edytora plików (Mode 0). Powinien się tam znaleźć program o nazwie MINOT zabezpieczony hasłem.
  142. Przejdź do trybu RUN (Mode 1)
  143. Uruchom Prog "MINOT"
  144. Jeżeli gra wystartowała, to gratulacje!
  145. Jeśli gra nie wystartowała, to któraś część mogła zostać pominięta lub zdarzył się błąd wpisywania kodów szesnastkowych nie wykryty przez sumę kontrolną. Trzeba spróbować wprowadzić programy ponownie.
  146. Przejdź do trybu PCL (Mode 3)
  147. Naciśnij Shift Del aby skasować obszar programów, ponieważ ładowarka hex jest już zbędna.

Tekst źródłowy gry


Jest to skomentowany listing programu wraz z kodami rozkazów, które po kawałku są wpisywane do Prog 1
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

Tekst źródłowy procedur przenoszących kod


Jest to skomentowany listing procedur wykonywanych w pamięci wideo, które przenoszą programy z pamięci wideo do pamięci edytora plikó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.
...

Pliki do ściągnięcia

plikminotaur.zip

Zawartość archiwum: