| Indeks | English version |
Program oraz poniższy tekst napisał dr Samir Ribić, Sarajewo, Bośnia i Hercegowina, 10 lipca 2014.
Kalkulator Casio fx-8000G był moim pierwszym kieszonkowym programowalnym urządzeniem. Dostałem go w 1988 roku i nadal go uwielbiam. Napisałem dla niego wiele gier logicznych (między innymi szachy, reversi), przygodowych, wiele programów matematycznych, graficznych, do obliczeń elektrycznych, ale w ciągu 28 lat jego istnienia nikt jeszcze nie napisał gry zręcznościowej. Oryginalny język programowania jest bardzo powolny, nie umożliwia odczytu klawiatury, zawartość ekranu może być wyświetlana tylko statycznie. Dopiero w 2011 roku pojawiła się alternatywa - został opublikowany opis języka maszynowego.
Ale dla hakera nigdy nie jest za późno, żeby zrealizować swoje marzenia. A więc po raz pierwszy przedstawiam grę zręcznościową dla Casio fx-8000G: Space Invaders (z osłonami). Na temat samej gry chyba nie ma co się więcej rozpisywać.
Klawisze strzałek lewo/prawo służą do przesuwania armaty, strzela się za pomocą klawisza ze strzałką w górę. Po utracie trzech jednostek życia następuje powrót do ekranu głównego.

Przepis na wpisanie gry Space Invaders:
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 4244EF40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 FF57A820:Prog 0 F0205EA6:Prog 0 035795F0:Prog 0 5ED00040:Prog 0 5A805EB3:Prog 0 035EB200:Prog 0 80201BBA:Prog 0 61744508:Prog 0 405A805E:Prog 0 B5005EB0:Prog 0 045EB110:Prog 0 56A20F56:Prog 0 A50056A4:Prog 0 2C80200B:Prog 0 B1017445:Prog 0 255EB108:Prog 0 Dec M◿
2→S Hex 42452F40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 C8DEC89C:Prog 0 C87AC870:Prog 0 C87AC89C:Prog 0 C8DE8020:Prog 0 0BB10174:Prog 0 45305EB1:Prog 0 200BB001:Prog 0 74452540:Prog 0 5CD05EA7:Prog 0 045EB008:Prog 0 C8000BB0:Prog 0 01744558:Prog 0 480A0BA7:Prog 0 01744555:Prog 0 5E920A2B:Prog 0 D0017445:Prog 0 Dec M◿
2→S Hex 42456F40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 8C60474C:Prog 0 4C018020:Prog 0 4C606047:Prog 0 4C23F05A:Prog 0 74458C2B:Prog 0 F0807F45:Prog 0 8C5ED000:Prog 0 56A3105E:Prog 0 A704F623:Prog 0 04A30F5B:Prog 0 92627445:Prog 0 B7415A80:Prog 0 425A2140:Prog 0 5A216047:Prog 0 30AE422B:Prog 0 42027445:Prog 0 Dec M◿
2→S Hex 4245AF40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 D1600008:Prog 0 7045D441:Prog 0 5A20425A:Prog 0 7E405A7E:Prog 0 604730AA:Prog 0 422B4202:Prog 0 7445D160:Prog 0 000A7045:Prog 0 D40F1262:Prog 0 0BA70174:Prog 0 45925EA5:Prog 0 04F02207:Prog 0 A160405C:Prog 0 000A7082:Prog 0 80B5020A:Prog 0 35227F46:Prog 0 Dec M◿
2→S Hex 4245EF40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 635EB500:Prog 0 80B50256:Prog 0 F15D5CF1:Prog 0 820AF120:Prog 0 A9322B32:Prog 0 027C4617:Prog 0 0BA6017C:Prog 0 0000405D:Prog 0 20604740:Prog 0 56A50056:Prog 0 F15B5CF1:Prog 0 820AF1A0:Prog 0 A9322BB2:Prog 0 707C465A:Prog 0 2B710274:Prog 0 46205EF1:Prog 0 Dec M◿
2→S Hex 42462F40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 A0A9322B:Prog 0 B2707C46:Prog 0 5A2B7102:Prog 0 74463140:Prog 0 5BA0415A:Prog 0 80425C00:Prog 0 60000A40:Prog 0 5A806047:Prog 0 400BA501:Prog 0 7C44FC70:Prog 0 461754F1:Prog 0 8203A4A0:Prog 0 704675A0:Prog 0 B50180B5:Prog 0 42239000:Prog 0 74467580:Prog 0 Dec M◿
2→S Hex 42466F40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 B5025EB5:Prog 0 00C00051:Prog 0 90239010:Prog 0 7C468E23:Prog 0 90087C46:Prog 0 9A239020:Prog 0 7C46A670:Prog 0 46BE23A5:Prog 0 567C46BE:Prog 0 02A50170:Prog 0 46BE23A5:Prog 0 007C46BE:Prog 0 03A50170:Prog 0 46BE2BD0:Prog 0 017C46BE:Prog 0 5ED00140:Prog 0 Dec M◿
2→S Hex 4246AF40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 5CC40A70:Prog 0 A27F46BB:Prog 0 02F00160:Prog 0 474C405D:Prog 0 200A70A2:Prog 0 8020C80F:Prog 0 C80FC808:Prog 0 C80FC80F:Prog 0 80202BD0:Prog 0 01744712:Prog 0 54D1075C:Prog 0 F084A8C2:Prog 0 002B4202:Prog 0 7C47105E:Prog 0 D000AC42:Prog 0 2B420274:Prog 0 Dec M◿
2→S Hex 4246EF40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 46E75EB2:Prog 0 08604743:Prog 0 0095017E:Prog 0 47125695:Prog 0 30009601:Prog 0 7E471256:Prog 0 96300297:Prog 0 01704712:Prog 0 D0700CD2:Prog 0 3F600620:Prog 0 57908057:Prog 0 80E05EE7:Prog 0 7D600100:Prog 0 5EB3031B:Prog 0 BA617447:Prog 0 2770456B:Prog 0 Dec M◿
2→S Hex 42472F40:Prog 0 5AF7415B:Prog 0 37600008:Prog 0 70000000:Prog 0 54A7A448:Prog 0 6049604A:Prog 0 6003C501:Prog 0 74473358:Prog 0 5EB26080:Prog 0 200BB201:Prog 0 74474358:Prog 0 1CD1071C:Prog 0 F0845800:Prog 0 007044F1:Prog 0 47554755:Prog 0 47554755:Prog 0 47203A30:Prog 0 EC3A5D38:Prog 0 35335B5A:Prog 0 0E5D3033:Prog 0 Dec M◿
2→S Hex 42476F40:Prog 0 5AF7415B:Prog 0 04600008:Prog 0 70000000:Prog 0 34875B5A:Prog 0 01434D00:Prog 0 4E45494C:Prog 0 41000000:Prog 0 Dec M◿
0000: ORG &h44F0
44F0: ; umieszcza Prog "ALIEN" w pamięci edytora plików
44F0: ; Rejestry
44F0: ; R24 - licznik wierszy kosmitów
44F0: ; R25 - puste wiersze
44F0: ; R120,R56 - rejestr indeksowy IX
44F0: ; R121,R57 - rejestr indeksowy IY
44F0: ; R122,R58 - rejestr indeksowy IZ
44F0: ; R10 - zakodowany kierunek każdego wiersza kosmitów
44F0: ; R23 - licznik pętli ROWMOVE
44F0: ; R101 - używany do obliczania pozycji ROWMOVE
44F0: ; R83 - maska bitowa kierunku przesunięcia rzędu
44F0: ; R82 - kształt bomby
44F0: ; R34 - do testowania czy miejsce na ekranie jest puste
44F0: ; R26, R27 - licznik pętli opóźniającej
44F0: ; R29 - względna pozycja bomby
44F0: ; R81 - o ile zwiększyć pozycję bomby
44F0: ; R80 - pusty pionowy pasek o wysokości 8 pikseli
44F0: ; R31 - względna pozycja armaty
44F0: ; R42 - wymagane przez kod w pamięci ROM
44F0: ; R84 - kolumna bomby
44F0: ; R85 - pozycja armaty
44F0: ; R22 - licznik życia
44F0: ; R21 - niewyczyszczone wiersze
44F0: ; R100,R41 - pozycja pocisku
44F0: ; R40 - pocisk leci
44F0: FF db &hFF ; EOF marker
44F1: STARTPROG
44F1: LIFE:
44F1: 57A820 LDM R80..R81,0
44F4: F020 INV R80 ; unikamy kodu FF żeby nie zakłócać edytora plików
44F6: 5EA603 LD R22,3 ; licznik życia
44F9: 5795F0 ldm r77..r79,&h30 ;'0', trzy cyfry ASCII licznika punktów
44FC:
44FC:
44FC: LEVEL:
44FC: 5ED000 LD R40,0 ; pocisk nie wystrzelony
44FF: 405A80 LDW IX,&h5A80 ; początek pamięci video
4502: 5EB303 LD R27,3 ; CLSLOOP 3*256 bajtów
4505: 5EB200 LD R26,0
4508: CLS:
4508: 8020 ST +(IX),R80 ; R80 zawiera &HFF, co jest pustym pionowym paskiem 8 pikseli
450A: 1BBA61 SBM R26..R27,1
450D: 744508 JMP NZ,CLS
4510:
4510: TOP:
4510: 405A80 LDW IX,&h5A80 ; początek pamięci video
4513: 5EB500 LD R29,0 ; pozycja bomby
4516: 5EB004 LD R24,4 ; 4 wiersze kosmitów
4519: 5EB110 LD R25,16 ; kosmici są początkowo od 16 kolumny
451C: 56A20F LD R82,&h0F ; bomba ma 4 piksele
451F: 56A500 LD R85,0 ; armata jest po lewej stronie ekranu
4522: 56A42C LD R84,44 ; bomba jest początkowo w 44 kolumnie
4525: LPSCENE1:
4525: 8020 ST +(IX),R80 ; &HFF jest odstępem na początku kosmitów
4527: 0BB101 SB R25,1
452A: 744525 JMP NZ,LPSCENE1
452D: 5EB108 LD R25,08 ; pętla rysująca 8 kosmitów
4530: LPSCENE2:
4530: C8DE ST +(IX),&hDE ; to jest kształt kosmity
4532: C89C ST +(IX),&h9c
4534: C87A ST +(IX),&h7A
4536: C870 ST +(IX),&h70
4538: C87A ST +(IX),&h7A
453A: C89C ST +(IX),&h9C
453C: C8DE ST +(IX),&hDE
453E: 8020 ST +(IX),R80 ; odstęp między kosmitami
4540: 0BB101 SB R25,1
4543: 744530 JMP NZ,LPSCENE2
4546: 5EB120 LD R25,32 ; w pozostałych rzędach odstęp jest równy 32 piksele, 16 od prawej krawędzi i 16 od lewej
4549: 0BB001 SB R24,1
454C: 744525 JMP NZ,LPSCENE1 ; na koniec tej pętli zostaną narysowane wszystkie cztery rzędy kosmitów (łącznie 32 kosmitów)
454F: 405CD0 LDW IX,&h5CD0 ; IX wskazuje rząd z osłonami w pamięci video
4552: 5EA704 LD R23,4 ; cztery osłony
4555: SHIELDLOOP:
4555: 5EB008 LD R24,8 ; osłona jest prostym blokiem 8x8 pikseli
4558: SHIELDPLOT:
4558: C800 ST +(IX),&h00
455A: 0BB001 SB R24,1
455D: 744558 JMP NZ,SHIELDPLOT ; na koniec tej pętli narysowana jest osłona
4560: 480A ADW IX,10 ; odstęp między osłonami
4562: 0BA701 SB R23,1
4565: 744555 JMP NZ,SHIELDLOOP ; powtórz aż wszytkie cztery osłony zostaną narysowane
4568: GAMELOOP:
4568: 5E920A LD R10,&h0A ; cztery dolne bity R10 zawierają kierunek przesunięcia rzędu kosmitów, jeden bit na każdy rząd, wartość 0 przesuwa rząd w lewo, wartość 1 w prawo
456B: ROWMOVEOOP:
456B:
456B: 2BD001 TSB R40,1 ; gdy pocisk leci, R40 zawiera 1
456E: 74458C JMP NZ,MOVEALIENS ; jeżeli nie, pomiń kasowanie obrazu pocisku
4571:
4571: 60474C CAL XCGIXRP ; pobierz pozycję pocisku
4574: 4C01 SBW IX,1 ; umieść pusty pionowy pasek 8 pikseli na pozycji pocisku
4576: 8020 ST +(IX),R80 ; ze względu na zestaw instrukcji i zabroniony bajt &HFF, kod jest kilka bajtów dłuższy niż mógłby być
4578: 4C60 SBW IX,96 ; zwiększ pozycję pocisku o jeden rząd w górę (8 pikseli)
457A: 60474C CAL XCGIXRP ; zapamiętaj pozycję pocisku
457D: 23F05A TSB R120,&h5A ; sprawdź, czy IX jest poniżej 5A80 (pamięć video)
4580: 74458C JMP NZ,MOVEALIENS
4583: 2BF080 TSB R56,&h80
4586: 7F458C JMP NC,MOVEALIENS
4589: 5ED000 LD R40,0 ; pocisk wypadł poza ekran, więc jest już nieaktywny
458C: MOVEALIENS:
458C: 56A310 LD R83,&h10 ; maska bitowa do testowania R19
458F: 5EA704 LD R23,4 ; cztery wiersze
4592: MULTIROWMOVE:
4592: F623 ROD R83 ; maska kierunku przesunięcia rzędu, może być równa 00001000 00000100 00000010 lub 00000001
4594: 04A30F AN R83,&hF ; po skasowaniu górnych bitów na 0
4597: 5B9262 BIT R10,R83 ; test binarny dla tego rzędu
459A: 7445B7 JMP NZ,TORIGHT
459D: TOLEFT: ; przesuń rząd kosmitów w lewo
459D: 415A80 LDW IY,&h5A80 ; przygotowanie do przesunięcia rzędu kosmitów
45A0: 425A21 LDW IZ,&h5A21
45A3: 405A21 LDW IX,&h5A21
45A6: 604730 CAL OTHERROW ; dodaj 96*R23 do każdego rejestru indeksowego
45A9: AE42 LD R34,(IZ)- ; sprawdź, czy jest miejsce na ekranie
45AB: 2B4202 TSB R34,R80
45AE: 7445D1 JMP NZ,NOROWMOVE ; jeśli nie, to zmień kierunek
45B1: 600008 CAL &h0008 ; instrukcja bup przesunie rząd kosmitów o jeden piksel w lewo
45B4: 7045D4 JMP ENDROWMOVE
45B7: TORIGHT: ; przesuń rząd kosmitów w prawo
45B7: 415A20 LDW IY,&h5A20 ; przygotowanie do przesunięcia rzędu kosmitów
45BA: 425A7E LDW IZ,&h5A7E
45BD: 405A7E LDW IX,&h5A7E
45C0: 604730 CAL OTHERROW ; dodaj 96*R23 do każdego rejestru indeksowego
45C3: AA42 LD R34,(IZ)+ ; sprawdź, czy jest miejsce na ekranie
45C5: 2B4202 TSB R34,R80 ; &hFF
45C8: 7445D1 JMP NZ,NOROWMOVE ; jeśli nie, to zmień kierunek
45CB: 60000A CAL &h000A ; instrukcja bdn przesunie rząd kosmitów o jeden piksel w prawo
45CE: 7045D4 JMP ENDROWMOVE
45D1: NOROWMOVE:
45D1: 0F1262 XR R10,R83 ; XOR z maską zmienia bit kierunku na przeciwny
45D4: ENDROWMOVE:
45D4: 0BA701 SB R23,1
45D7: 744592 JMP NZ,MULTIROWMOVE ; powtarzaj, aż wszystkie cztery rzędy kosmitów zostaną przesunięte
45DA: 5EA504 LD R21,4 ; będziemy sprawdzać, czy któryś z czterech rzędów kosmitów jest pusty
45DD: F022 INV R82 ; zmiana kształtu bomby z górnego paska o wysokości 4 pikseli na dolny
45DF: 07A160 XR R81,&h60; pozycja bomby jest zmieniana o 96 lub 0 co dwa przejścia
45E2: 405C00 LDW IX,&h5C00 ; obliczenie obszaru pamięci wideo, w którym pojawia się bomba
45E5: 0A7082 AD R56,R84 ; młodszy bajt IX
45E8: 80B502 ST (IX+R29),R80 ; umieść bombę
45EB: 0A3522 AD R29,R81 ; zwiększenie pozycji bomby
45EE: 7F4663 JMP NC,MOVEBOMB ; jeśli bomba nie osiągnęła końca
45F1:
45F1:
45F1:
45F1: 5EB500 LD R29,0 ; usuń bombę
45F4: 80B502 ST (IX+R29),R80
45F7: TESTKILL:
45F7: 56F15D LD R121,&h5D ; wiersz armaty w pamięci video
45FA: 5CF182 LD R57,R84
45FD: 0AF120 AD R57,&h20
4600: A932 LD R26,(IY)+ ; sprawdź, co jest w wierszu armaty, kolumnie bomby
4602: 2B3202 TSB R26,R80; &hFF, pomiń jeśli nie pusta
4605: 7C4617 JMP Z,NOTKILLED
4608: 0BA601 SB R22,1 ; zmniejszenie licznika życia
460B: 7C0000 JMP Z,0 ; wyjście z programu gdy życie=0
460E: NEWLIFE:
460E: 405D20 LDW IX,&h5D20 ; skasuj wiersz z armatą
4611: 604740 CAL CLLINE
4614: 56A500 LD R85,0 ; armata po lewej stronie
4617:
4617: NOTKILLED:
4617: 56F15B LD R121,&h5B ; trzeba zrzucić nową bombę, ponieważ poprzednia osiągnęła ziemię
461A: 5CF182 LD R57,R84
461D: 0AF1A0 AD R57,&hA0 ; w wierszu zaczynającym się pod adresem 5BA0 w pamięci video
4620:
4620: FINDBOMBERRT:
4620: A932 LD R26,(IY)+ ; najpierw szukamy bajtu &H70 (środek kosmity) zaczynając od bieżącej pozycji
4622: 2BB270 TSB R26,&h70
4625: 7C465A JMP Z,BOMBERPOS
4628: 2B7102 TSB R57,R80 ; bajt &HFF pod adresem 5BFF jest końcem rzędu bombardujących kosmitów
462B: 744620 JMP NZ,FINDBOMBERRT
462E: 5EF1A0 LD R57,&hA0
4631: FINDBOMBERLT:
4631: A932 LD R26,(IY)+ ; szukamy ponownie, ale teraz zaczynając od dolnego rzędu kosmitów
4633: 2BB270 TSB R26,&h70
4636: 7C465A JMP Z,BOMBERPOS
4639: 2B7102 TSB R57,R80 ;&hFF
463C: 744631 JMP NZ,FINDBOMBERLT
463F: ; wszyscy kosmici w dolnym rzędzie zostali zestrzeleni, przesuwamy pozostałych w dół
463F: 405BA0 LDW IX,&h5BA0
4642: 415A80 LDW IY,&h5A80
4645: 425C00 LDW IZ,&h5C00
4648: 60000A CAL &h000A
464B: 405A80 LDW IX,&h5A80 ; kasowanie górnego rzędu kosmitów
464E: 604740 CAL CLLINE
4651:
4651: 0BA501 SB R21,1
4654: 7C44FC JMP Z,LEVEL ; po przesunięciu w dół czterech rzędów kosmitów następuje restart poziomu
4657: 704617 JMP NOTKILLED
465A:
465A: BOMBERPOS:
465A: 54F182 LD R84,R57
465D: 03A4A0 SB R84,&hA0 ; względna pozycja bomby
4660:
4660: 704675 JMP TESTKBD
4663:
4663: MOVEBOMB:
4663: A0B501 LD R72,(IX+R29) ; pobranie bajtu na pozycji bomby
4666: 80B542 ST (IX+R29),R82 ; umieszczenie tam kształtu bomby
4669: 239000 TSB R72,0 ; czy była tam część osłony?
466C: 744675 JMP NZ,TESTKBD ; jeśli nie, to pomijamy uszkodzenie osłony
466F: 80B502 ST (IX+R29),R80 ; kasowanie jednego pionowego paska pikseli osłony
4672: 5EB500 LD R29,0 ; bomba na górę
4675: TESTKBD:
4675: C000 PST KO,&h00
4677: 5190 GST R72,KI ; odczyt klawiatury
4679: 239010 TSB R72,&h10 ; sprawdź, czy wciśnięty klawisz strzałka w prawo
467C: 7C468E JMP Z,RIGHTKEY
467F: 239008 TSB R72,&h08 ; sprawdź, czy wciśnięty klawisz strzałka w lewo
4682: 7C469A JMP Z,LEFTKEY
4685: 239020 TSB R72,&h20 ; sprawdź, czy wciśnięty klawisz strzałka w górę
4688: 7C46A6 JMP Z,FIREROCKET
468B: 7046BE JMP DRAWCANON
468E:
468E: RIGHTKEY:
468E: 23A556 TSB R85,86 ; test prawej krawędzi ekranu
4691: 7C46BE JMP Z,DRAWCANON
4694: 02A501 AD R85,1 ; przesuń pozycję armaty
4697: 7046BE JMP DRAWCANON
469A: LEFTKEY:
469A: 23A500 TSB R85,0 ; test lewej krawędzi ekranu
469D: 7C46BE JMP Z,DRAWCANON
46A0: 03A501 SB R85,1 ; przesuń pozycję armaty
46A3: 7046BE JMP DRAWCANON
46A6: FIREROCKET:
46A6: 2BD001 TSB R40,1 ; jeśli pocisk jeszcze leci, nie można wystrzelić nowego
46A9: 7C46BE JMP Z,DRAWCANON
46AC: 5ED001 LD R40,1
46AF: 405CC4 LDW IX,&h5CC4; pozycja pocisku, jeden wiersz nad armatą
46B2: 0A70A2 AD R56,R85 ; młodszy bajt IX
46B5: 7F46BB JMP NC,STOREROCKETPOS
46B8: 02F001 AD R120,1 ; używamy 8-bitowej arytmetyki
46BB: STOREROCKETPOS:
46BB:
46BB: 60474C CAL XCGIXRP ; zapamiętaj IX
46BE: DRAWCANON:
46BE: 405D20 LDW IX,&h5D20 ; oblicz pozycję armaty
46C1: 0A70A2 AD R56,R85 ; młodszy bajt IX
46C4: 8020 ST +(IX),R80 ; to jest kształt armaty
46C6: C80F ST +(IX),&h0f
46C8: C80F ST +(IX),&h0f
46CA: C808 ST +(IX),&h08
46CC: C80F ST +(IX),&h0f
46CE: C80F ST +(IX),&h0f
46D0: 8020 ST +(IX),R80
46D2:
46D2: 2BD001 TSB R40,1 ; jeżeli pocisk nie leci, pomiń rysowanie
46D5: 744712 JMP NZ,REFRESH
46D8:
46D8: 54D107 LD R120,R41 ; przywróć pozycję pocisku
46DB: 5CF084 LD R56,R100
46DE: A8C200 LD R34,(IX+0) ; sprawdź co tam jest
46E1: 2B4202 TSB R34,R80 ; jeśli nic &HFF
46E4: 7C4710 JMP Z,PLOTROCKET ; skocz do rysowania pocisku
46E7:
46E7: FINDHOLE:
46E7: 5ED000 LD R40,0 ; trafienie w kosmitę lub w osłonę
46EA: AC42 LD R34,(IX)- ; znajdź początek kształtu
46EC: 2B4202 TSB R34,R80 ;&hFF
46EF: 7446E7 JMP NZ,FINDHOLE
46F2:
46F2: 5EB208 LD R26,8 ; usunięcie kosmity lub w osłony
46F5: 604743 CAL CLLINE1
46F8: 009501 ADB R77,1 ; zwiększenie jednostek licznika punktów
46FB: 7E4712 JMP NH,REFRESH ; arytmetyka BCD, po przekroczeniu '9' ustawia się flag H
46FE: 569530 LD R77,&h30 ; skasowanie jednostek na '0'
4701: 009601 ADB R78,1 ; zwiększenie dziesiątek
4704: 7E4712 JMP NH,REFRESH
4707: 569630 LD R78,&h30 ;'0'
470A: 029701 AD R79,1 ; zwiększenie setek, będzie dziwnie wyglądać powyżej 999 zestrzelonych kosmitów
470D: 704712 JMP REFRESH
4710: PLOTROCKET:
4710: ; rysowanie pocisku
4710: D070 ST (IX),&h70
4712:
4712: REFRESH:
4712: 0CD23F AN R42,&h3F ; parametr
4715: 600620 CAL &h0620 ; podprogram ROM przenoszący na ekran zawartość pamięci wideo
4718: 579080 ldm r72..r76,&h20
471B: 5780E0 ldm r64..r71,&h20
471E: 5EE77D ld r55,&h7D ; pozycja ekranu jest przechowywana w R55
4721: 600100 cal &h0100 ; wyświetlenie łańcucha R79..R64
4724:
4724: 5EB303 LD R27,3 ; pętla opóźniająca 768 razy, żeby gra nie była za szybka
4727: DELAY1:
4727: 1BBA61 SBM R26..R27,1 ; kod maszynowy jest niesamowity, nawet przy 900kHz
472A: 744727 JMP NZ,DELAY1
472D:
472D: 70456B JMP ROWMOVEOOP ; idź do pętli wewnętrznej
4730: OTHERROW: ; korekcja rejestrów indeksowych, żeby wskazywały właściwy rząd kosmitów
4730: 54A7A4 LD R101,R23
4733: OTHER1:
4733: 4860 ADW IX,96
4735: 4960 ADW IY,96
4737: 4A60 ADW IZ,96
4739: 03C501 SB R101,1
473C: 744733 JMP NZ,OTHER1
473F: 58 RTN
4740: CLLINE: ; skasuj wiersz ekranu
4740: 5EB260 LD R26,96
4743: CLLINE1: ; skasuj fragment ekranu
4743: 8020 ST +(IX),R80
4745: 0BB201 SB R26,1
4748: 744743 JMP NZ,CLLINE1
474B: 58 RTN
474C:
474C: XCGIXRP: ; zapamiętaj/przywróć pozycję pocisku
474C: 1CD107 XC R41,R120
474F: 1CF084 XC R100,R56
4752: 58 RTN
4753: ORG &h4755
4755: 7044F1 JMP STARTPROG
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: 4E45494C41
DB 'NEILA' ; nazwa pliku, 5 znaków
477D:
5AE8: 424514 LDW IZ,&H4514 ; 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: