6. 9. 2021

Húsenica (wurmi) - 2. pp01 verzia

Pre porovnanie s PMD85 verziou tu máme zdrojový kód pre PP01 od pôvodných autorov. Čo tak trocha farieb ?

screenshot z hry

Na obálke príručky sú podpísaní Doc.Ing. Vladimír Steiner, CSc., Ing. Jozef Wirdzek, rok vydania 1989. V zdrojových kódoch je ale v hlavičke "KME EF 1984". Malo by ísť o katedru mikroelektroniky na elektrofakulte. Kým pán Wirdzek, ktorého som poznal, učil na škole a viedol krúžky, pán Steiner vydal skriptá na SVŠT o elektronických meracích prístrojoch. Viac sa mi o histórií nepodarilo zistiť. Pravdepodobne kód naprogramovaný kdesi v počiatkoch domácich 8-bitov bol použitý aj neskôr na študijné účely pri ich blížiacom sa konci. Určite obom pánom patrí vďaka za rozširovanie vedomostí nás - vtedajšej mládeže.

PP01 verzia

PP01 malo veľkú výhodu, bol to kufor ku ktorému stačilo pripojiť káble a odklopiť kryt, zdroj bol integrovaný. Takto sa ľahšie vybavila dočasná učebňa v škole.

Rozložením obrazovky sa samozrejme počítače líšia. PP01 poskytuje 256x256 bodov, pri znakoch veľkosti 8x8 pixelov je to 32x32 znakov. PMD malo znaky o šírke len 6 pixelov a s takýmito rozmermi pracujú aj BPLOT príkazy Basicu u oboch počítačov.

Pozrime sa na zdrojový kód. Prešiel som rovnakým postupom, najskôr som odstránil preklepy. Na tomto mieste musím poznamenať, že PP01 mi prišiel svojím hlásením chýb intuitívnejší. Teda konkrétne jeho GBasic v5.8 pekne vypísal miesto problému v riadku otáznikom.

Ďalej pre úplne odstránenie logických chýb pri prepise (manuál je už horšie čitateľný a PP01 verzia je písaná užším fontom) som opäť okomentoval zdrojový kód. Princíp je samozrejme rovnaký ale je tu pár zmien o ktorých neskôr.


1 REM ** HUSENICA ** WI-1 **
5 GOSUB 1000				# vypiseme nadpis (ovladanie a autor)
6 GOSUB 1020				# vypiseme zvysok uvodnej stranky
10 SCALE 0,1,0,1
15 CLEAR
20 DEF FN A(WW)=8*WW+40			# funkcia na prepocet posuvu
21 DIM X(1000),Y(1000),Z(32,32)
22 GOSUB 1000
23 FOR I=1 TO 6:READ A:HT$=HT$+CHR$(A):NEXT I
25 DATA 45,12,0,18,45,18
30 FOR I=1 TO 8:READ A:P$=P$+CHR$(A):NEXT I				# do pola P$ vlozime obrazok znaku plota
40 DATA 85,170,85,170,85,170,85,170
45 INK 2								# kreslime najskor plot vrch+spod
50 FOR I=0 TO 31:BMOVE I,216:BPLOT P$,1:BMOVE I,40:BPLOT P$,1
51 Z(I+1,1)=1:Z(I+1,23)=1:NEXT I					# nastavime do pola Z ako 1
60 FOR I=48 TO 216 STEP 8:BMOVE 31,I:BPLOT P$,1:Z(32,(I-40)/8)=1:NEXT I	# kreslime pravy plot
70 FOR I=48 TO 216 STEP 8:BMOVE 0,I:BPLOT P$,1:Z(32,(I-40)/8)=1:NEXT I	# kreslime lavy plot
75 INK 7
80 FOR I=1 TO 8:READ A:T$=T$+CHR$(A):NEXT I				# do pola T$ vlozime telo husenice
90 DATA 8,28,62,127,127,62,28,8,65,62,65,85,73,73,34,28
100 FOR I=1 TO 8:READ A:H$=H$+CHR$(A):NEXT I				# H$ hlava husenice
110 DATA 132,72,48,48,72,132,12,18,33,51,12,31
120 FOR I=1 TO 6:READ A:N$=N$+CHR$(A):NEXT I				# N$ jed
130 FOR I=1 TO 6:READ A:J$=J$+CHR$(A):NEXT I				# J$ list
140 BMOVE 15,FN A(10):BPLOT H$+T$+T$,1:PRINT AT 0,0			# vykreslenie husenice
142 Z(16,11)=3:Z(16,12)=3:Z(16,13)=3					# do pola Z ulozime husenicu ako 3
145 GOTO 200
150 X=TRUNC(RND*30)+2:Y=TRUNC(RND*21)+2					# podprogram pre nahodny posun
160 IF Z(X,Y)>0 THEN 150						# nieco tam uz je, vygeneruj iny
170 BMOVE X-1,FN A(Y-1):RETURN						# posun a vrat sa
200 LI=45:KR=30								# listov 45, jedov 30
201 IF K<>106 THEN 209							# easter egg
202 LI=90:KR=60
209 INK 4:FOR I=1 TO LI:GOSUB 150:BPLOT J$,1:Z(X,Y)=4:NEXT I		# generuj listy
210 INK 3:FOR I=1 TO KR:GOSUB 150:BPLOT N$,1:Z(X,Y)=2:NEXT I		# generuj jedy
215 INK 7
220 FOR I=1 TO 3:X(I)=16:Y(I)=14-I:NEXT I:CM=2				# suradnice tela husenice do x(),y()
225 Z=3
227 AA=1000:Q=1								# AA - dlzka poli x(),y()
230 PRINT AT 29,0 CM;TAB(10)"REKORD ";RC				# aktualna dlzka, rekord
240 REM CYKLUS NA NACITANIE DAT(INAC)
250 REM DATA (INAC)
260 BEEP NO
270 IN=KEY:IF IN=128 THEN 270						# cakame na prvu klavesu
275 IF IN<241 OR IN>244 THEN 270					# nieje sipka, zopakuj
280 GOTO 305
300 FOR S=0 TO 1							# -- HLAVNY CYKLUS
301 IN=KEY								# 2 cykly na stlacenie klavesy
305 IF IN=242 THEN A=0:B=-1:GOTO 310					# nastavime a,b posun a vyskocime
306 IF IN=243 THEN A=0:B=1:GOTO 310
307 IF IN=241 THEN A=-1:B=0:GOTO 310
308 IF IN=244 THEN A=1:B=0:GOTO 310
309 NEXT S
310 Q=Z-CM:IF Q<1 THEN Q=Q+AA						# Q - prvok v poli s koncom chvosta
340 Z1=Z+1:IF Z1>AA THEN Z1=Z1-AA					# Z1 - index kam sa zapise posunuta hlava
350 X(Z1)=X(Z)+A:Y(Z1)=Y(Z)+B						# zapiseme posunutie
351 IF Z(X(Z1),Y(Z1))=2 THEN 501					# v z(,) poli na cielovom mieste jed
352 IF Z(X(Z1),Y(Z1))=1 THEN GOSUB 1220:GOTO 515			# hlavou mur neprerazim
353 IF Z(X(Z1),Y(Z1))=3 THEN GOSUB 1220:GOTO 529			# sam seba nezeriem
355 IF Z(X(Z1),Y(Z1))=4 THEN 380					# zjedol list
356 IF Q>500 THEN X(Q)=1
357 IF Q>500 THEN Y(Q)=1
359 Z(X(Q),Y(Q))=0:INK 0						# cistime za husenicou pole z(,)
360 BMOVE X(Q)-1,FN A(Y(Q)-1):BPLOT T$,1				# mazeme telo
362 BMOVE X(Z)-1,FN A(Y(Z)-1):BPLOT H$,1:INK 7:BPLOT T$,1		# mazeme hlavu, miesto nej daj telo
365 Z=Z1:BMOVE X(Z)-1,FN A(Y(Z)-1):BPLOT H$,1				# posunutu hlavu
370 Z(X(Z),Y(Z))=3:GOTO 300						# -- KONIEC CYKLU, nastavime husenicu (3)
375 BMOVE X(Z)-1,FN A(Y(Z)-1):INK 0:BPLOT H$,1:INK 7:BPLOT T$,1		# ???
380 BMOVE X(Z)-1,FN A(Y(Z)-1):INK 0:BPLOT H$,1:INK 7:BPLOT T$,1		# vymaze hlavu, nakresli telo
382 Z=Z1
385 BMOVE X(Z)-1,FN A(Y(Z)-1):INK 0:BPLOT J$,1:INK 7:BPLOT H$,1		# na novom mieste vymaze list, da hlavu
387 Z(X(Z),Y(Z))=1							# z(,)=1
390 BEEP:CM=CM+1:PRINT AT 29,0 CM					# zvacsime husenicu
400 INK 4:GOSUB 150:BPLOT J$,1:Z(X,Y)=4:BEEP NO:INK 7			# dokreslime nahodne list
410 IF CM<>50 THEN 300							# ak je 50 listov, pochval
420 PRINT AT 29,0"DOBRE, VIDIM ZE SI PROFESIONAL.."
430 FOR I=1 TO 5:BEEP 200*RND.60:NEXT I:WAIT 10
440 PRINT AT 29,0"                                "
450 PRINT AT 29,0 CM;TAB(10)"REKORD ";RC;"         "
460 GOTO 300								# -- KONIEC CYKLU CELKOVO
500 REM--KONIEC
501 GOSUB 1220								# zvucka
502 PRINT AT 29,0"NAZRAL SOM SA JEDU              "			# jed
510 WAIT 15:GOTO 530
515 BMOVE X(Z)-1,FN A(Y(Z)-1):INK 0:BPLOT H$,1:INK 7:BPLOT T$,1		# hlavou mur
520 BMOVE X(Z1)-1,FN A(Y(Z1)-1):BPLOT H$,1
525 PRINT AT 29,0"HLAVOU MUR NEPRERAZIM    ":WAIT 15:GOTO 530
529 PRINT AT 29,0"SAM SEBA NEZERIEM        ":WAIT 15			# sam seba
530 IF CM<RC THEN 850							# menej ako rekord - preskoc
535 WAIT 5:CLEAR
540 Q=75:IF CM>9 THEN Q=50						# vyratame posun pre vypis
550 IF CM>99 THEN Q=25
560 IF CM>999 THEN Q=0
566 IF Q>500 THEN X(Q)=2
600 FOR I=100 TO 120 STEP 5:BEEP I,100*RND:NEXT I			# fanfary
620 PRINT AT 10,10
630 PRINT"ZOZRAL SI"
640 PRINT AT 15,12
650 PRINT CM;" LISTOV"
670 IF CM>RC THEN PRINT AT 20,10"TO JE NOVY REKORD !!":RC=CM:GOTO 920	# novy rekord
680 PRINT AT 20,0"  DOBRE, ALE DNES UZ SOM ZOZRAL"
690 PRINT AT 22,10 RC" LISTOV"
850 PRINT AT 2,0
860 PRINT:PRINT:PRINT"   CHCES HRAT ZNOVU ?"
870 GOTO 925
920 PRINT AT 30,0"CHCES HRAT ZNOVU ?"
925 K=KEY:IF K<>97 AND K<>106 AND K<>110 THEN 925			# cakame tlacitko ci hrat znovu
930 IF K=110 THEN CLEAR:BEEP:STOP					# N-nie
931 CLEAR:BEEP:PRINT AT 5,1"CAKAJ!"					# inak ano
939 FOR X=1 TO 32:FOR Y=1 TO 32						# mazeme cele pole z(,)
940 Z(X,Y)=0:NEXT Y:NEXT X
955 RESTORE
960 T$="":H$="":P$="":HT$="":J$="":N$=""
970 CLEAR:SCALE 0,1,0,1
980 GOTO 22								# skocime na zaciatok, za intro
1000 PRINT CHR$(29)+CHR$(31)						# podprogram pre hlavicku
1001 PRINT "F1 = VLAVO":PRINT "F2 = HORE","KME EF * 1984"
1002 PRINT "F3 = DOLE":PRINT "F4 = VPRAVO":PRINT :PRINT
1005 RETURN
1020 PRINT AT 15,9"H U S E N I C A"					# podprogram pre uvodnu obrazovku
1050 PRINT AT 14,11","
1100 PRINT AT 29,2"STLACTE 'F9'"
1200 K=KEY:IF K<>249 THEN 1200
1210 RETURN
1220 REM								# podprogram pre hudbu
1230 FOR I=90 TO 120 STEP 10:BEEP I,110 :NEXT I
1230 FOR I=90 TO 120 STEP 10:BEEP I,110 :NEXT I
1230 FOR I=90 TO 120 STEP 10:BEEP I,110 :NEXT I
1260 BEEP NO
1270 RETURN

Tento zdrojový kód vyzerá prehľadnejšie vďaka medzerám, ale je mi aj bližší vďaka väčšej podobnosti Basicu so ZX spectrom. Vidieť, že zdrojový kód je upravený podľa možností jednotlivých Basicov. Tu niesú príkazy LABEL, ale je tu hojne použitý PRINT AT.

Húsenica má opäť súradnice v poliach X() a Y(), avšak veľká zmena je použitie dvojrozmerného poľa Z(,), kde je uložená mapa obrazovky. Teda kde sa nachádza plot, list, jed, húsenica. Netreba tak použiť ROM funkcionalitu na čítanie obrazovky, ale jej obsah je zduplikovaný v premennej.

V pôvodnom zdrojovom kóde boli použité len INK 0 a INK 7 pre čiernobiele zobrazenie. Keďže teraz beží program v emulátore, nemusím riešiť či mám špeciálny monitor, môžem si farby vychutnať. Ako bolo vidieť hneď v úvode, dodali šmrnc.

Tento počítač má navyše extra veľkorysú videopamäť, priam plytvajúcu 24KB, kde každý bod môže byť nastavený nezávislou farbou z 8mych možných.

Tiež som oddelil horný nápis s ovládaním na druhý podprogram a tento zobrazujem aj počas hry.


Po pochopení princípu príde teraz na rad môj prepis do Basicu ZX Spectra.

Žiadne komentáre:

Zverejnenie komentára