NJSZT-WFSZ
Kiemelt támogatók
Axelero Adatpark Craftcore G'Roby Élelmiszerdiszkont-hálózat Kiskapu LAAZ Szolgáltató Betéti Társaság International PHP Magazine Trans-Europe Kft. Weblabor WEB-SERVER
phpHOST Wish Internet Consulting webthiNgs LevitatorMedia
Jó volt, szép volt.

2005 5+5k PHP 5 compo kiírás barkochba galéria top10

PHP C64 Emulator

PHP C64 Emulator
elkövette:
Magyar Attila Mihály
tesztfok:
A szerveren érvényben levő erőforrás-korlátozás miatt csak otthon tudod kipróbálni! (összes contrib letöltése)
licenc:
ismeretlen

Leírás

PHP-C64 (2005 PHP Konferencia - 5k Compo)
=========================================

Keszitette: Magyar Attila Mihaly
Email:      mogyi925_kukac_inf_elte_hu
Web:        mogyi925.uw.hu
            mogyi925.uw.hu/phpc64
Meret:      PHP:   5104 byte
            Egyeb: 5075 byte
Bongeszok:  Windows 98 SE:
              Mozilla 1.5. (Mozilla/5.0.) - ajanlott
              Internet Explorer 6.0.2800.
              Opera 7.23.
            Linux:
              Epiphany 1.4.4
              Mozilla Firefox 1.0
              Opera 7.54
              Konqueror 3.3.1-4.3
A Compo file-jai:
           c.php      - a C64 "lelke"    - 5104 + 3896 byte
           index.html - kezdolap         -    0 +  528 byte
           z.t        - adatfile         -    0 +  288 byte
           k.js       - billentyukezeles -    0 +  188 byte
           k.htm      - kek keret        -    0 +   42 byte
           b.htm      - fekete hatter    -    0 +   40 byte
           k.gif      - kurzor           -    0 +   93 byte
Osszesen:                                  5104 + 5075 byte

Egyeb file-ok:
          readme.txt    - leiras

A kezelesrol roviden
A programrol
Parancsok
BASIC
Peldak
Hibak

A kezelesrol roviden (a C64-et ismeroknek)
--------------------
A programot nagyjabol ugyanugy kezelhetjuk, mint egy C64-es
gepet (lsd: lentebb), a kovetkezo elteresekkel:

az INS/DEL (PC: Backspace) billentyu helyett a "_" karaktert kell
  hasznalni

NE HASZNALJUK A Backspace billentyut! (Nehany bongeszo "Vissza"
gombjanak ugyanis ez a billentyuparancsa.)

a RUNSTOP (PC: Break) billentyu helyett a "\" karakter mukodik

BASIC program 1 soraban egy utasitas allhat (a ":" nem mukodik)

az IF-THEN szerkezet eseten a THEN-t valamelyik sor szama koveti
  (utasitas nem allhat utana)

nem hasznalhatok tombok (a 2. pelda mutat egy megoldast ennek
athidalasara)

2 valtozotipus van: string ($), real (%)

STEP-et nem ismeri

max 1 betus valtozonevek

a BASIC utasitasokat csak programfutas kozben fogadja el.

a c.php-nek tudnia kell irni a p nevu directory-t.

A programrol
------------
Bar meg eleg fiatal vagyok, meg eppen belefertem abba a korba,
mikor az ember elso szamitogepe egy imadott Commodore 64-es volt.
Eleinte, mint mindenki, csak jatszottam vele, aztan a kezembe
akadt egy konyv, ami a BASIC nyelvrol szolt. Azota az idom nagy
reszet a szamitogep, de legfokepp a programozas teszi ki, bar
mind a gepek, mind a programnyelvek nagyon megvaltoztak azota.

Ugy erzem, a programozashoz szukseges alapveto gondolkodast egy
gyerek, aki erdeklodik a szamitogepek irant, ugy sajatithatja el
legkonnyebben, ahogy sok mai programozo is tette annak idejen:
eloszor a BASIC, utana a Pascal, vegul egy magasabb szintu, 
objektum-orientalt nyelvvel megismerkedve (az Assemblyrol mar nem
is beszelve :-) ).

Ezert aztan elhataroztam, hogy az idei Compo-ra egy Commodore
64-es butitott masolatat keszitem el, ami nagyjabol sikerult is
(marmint eleg buta lett :-) ).

Parancsok
---------
A C64-bol csak a legszuksegesebb parancsokat vettem at, a
meretkorlat miatt. Ezek a kovetkezok:

NEW
torli a tarbol az eppen bent levo BASIC programot

RUN
elinditja a tarban levo BASIC programot
a futas a RUNSTOP ("\") billentyu segitsegevel barmikor
megszakithato.

LIST
kepernyore irja a tarban levo program forraskodjat

LIST X
az X szamu sort irja ki

LIST X-Y
az X es Y kozotti sorokat irja ki
ha valamelyiket elhagyjuk, az elhagyott resz helyett a
program elso vagy utolso sorat tekinti

SAVE "programnev"
programnev nevu file-ba menti a tarban levo programot,

LOAD "programnev"
betolti a tarba a programnev nevu programot (a bent levot
felulirja)

BASIC
-----

A BASIC nyelvben (C64-en) minden sort egy szam azonosit.
Az elagazasok kivetelevel a sorokat novekvo sorrendben
hajtja vegre a gep.

Egy BASIC sor a kovetkezokeppen nez ki (pl):

10 utasitas

Erdemes a sorokat tizesevel szamozni, igy kesobb
konnyeb beszurhatunk uj sorokat.

A begepeles sorrendje tetszoleges.

Ha egy sort torolni szeretnenk, irjuk be a szamat, majd
nyomjunk RETURN-t (Enter-t).

Egy BASIC sor hossza max. 255 karakter lehet.

Utasitasok

PRINT "szoveg"
kepernyore iras

IF feltetel THEN szam
Ha a feltetel teljesul, a szam szamu sorral folytatodik a program,
egyebkent a kovetkezo sorral

Pelda:
IF 3>2 THEN 30
IF "ABC"="ABC" THEN 30
IF 4<=8/2 THEN 30
IF "A"<>"B" THEN 30

(az utolso sorban a <> jelentese: nem egyenlo)

Ket feltetelt egymasba is agyazhatunk, az AND es az OR
operatorokkal:

IF "ABC"="CBA" OR 5<6 THEN 20

GOTO szam
a szam szamu sorral folytatodik a program

GOSUB szam ... RETURN
a szam szamu sorral folytatodik a program futasa, viszont ha
RETURN utasitast talal, akkor "visszater", es a kovetkezo sorral
folytatodik

END
kilep a programbol

FOR ... TO ... NEXT
szamlalo ciklus, pl:

10 FOR I%=1 TO 10
20 PRINT "C64"
30 NEXT I%

a fenti program 10-szer kiirja a kepernyore a C64 szoveget
(I% - lasd: valtozok)

nem szukseges kiirni a NEXT utan a ciklusvaltozot, de ajanlott
(foleg egymasba agyazasnal)

REM
a sor tovabbi resze megjegyzes

GET A$
az A$ valtozoba 1 karaktert olvas be a billentyuzetrol
ha nem nyomunk le billentyut, akkor A$ ures marad, egyebkent
a karaktert a billentyuzet-pufferbol veszi

INPUT S$
az S$ valtozoba szoveget olvas be a billentyuzetrol, es a
bevitel ideje alatt megallitja a programot
a bevitel RETURN-nel (Enter) er veget

Valtozok

A valtozokat nevuk azonositja, ami 1 angol betu lehet.
A nev betuje utan a tipus-azonositonak kell kovetkeznie.

Ket tipusu erteket kulonboztetunk meg:

szoveg (string)
mindig "-jelek koze zarjuk. string tipusu valtozokat a "$"
karakter azonositja, pl:

10 INPUT A$
20 IF A$="VEGE" THEN 1000
... tovabbi programreszek
1000 END

valos szam (real):
a "%" karakter azonositja, pl:

N%=-10.0576

Operatorok

Ket ertek kozotti muveletek vegzesere alkalmasak:
= ertekadas (a bal oldali operandus mindig valtozonev!)
+ osszeadas (real ertekek eseten, stringek eseten osszefuzes)
- kivonas
* szorzas
/ osztas

Fuggvenyek

Matematikai fuggvenyek

ABS(X%)
X% abszoluterteke

COS(X%)
X% koszinusza (X% radianban)

EXP(X%)
exponencialis fuggveny (e-alapu)

LOG(X%)
logaritmus fuggveny (e-alapu)

SIN(X%)
szinusz (radian)

TAN(X%)
tangens fuggveny (radian)

ATN(X%)
arcus tangens (az eredmeny radianban)

RND(X%)
X%-tol fuggetlenul egy 0 es 1 koze eso, veletlenszeruen
eloallitott szam

SGN(X%)
elojelfuggveny (ha X%<0, erteke -1, X%=0-ra 0, egyebkent +1)

SQR(X%)
negyzetgyok-fuggveny

INT(X%)
X% egeszreszet adja

String fuggvenyek

ASC(S$)
S$ elso karakterenek ASCII-kodja

CHR(X%)
az X% ASCII-kodu karakter

VAL(S$)
S$-bol szamot kepez

LEN(S$)
S$ karaktereinek szama

MID(S$,X%,L%)
S$ egy resz-stringje, ami az X% karaktertol kezdodik,
es L% karakter hosszu

STR(X%)
X% szamot stringge alakitja

Peldak
------

1. Szamkitalalos jatek

10 PRINT "SZAMKITALALOS JATEK"
20 PRINT "TALALJA KI A 10000-99999 KOZTI SZAMOT!"
30 S$=STR(INT(RND(1)*90000)+10000)
31 FOR I%=1 TO 4
32 FORJ%=I%+1 TO 5
33 IF MID(S$,I%,1)=MID(S$,J%,1) THEN 30
34 NEXT J%
35 NEXT I%
36 P%=0
40 P%=P%+1
50 PRINT "TIPP:"
60 INPUT T$
70 T$=MID(T$,1,5)
80 T$=MID("AAAAA",1,5-LEN(T$))+T$
90 C%=0
95 E%=0
100 FOR I%=1 TO 5
110 K$=MID(T$,I%,1)
120 FOR J%=1 TO 5
130 IF K$=MID(S$,J%,1) THEN 150
140 GOTO 170
150 C%=C%+1
160 J%=5
170 NEXT J%
180 IF K$<>MID(S$,I%,1) THEN 200
190 E%=E%+1
200 NEXT I%
210 PRINT STR(C%)+" JEGY JO"
220 PRINT STR(E%)+" JEGY JO HELYEN"
230 IF E%=5 THEN 250
240 GOTO 40
250 PRINT STR(P%)+" TIPP."
260 PRINT"A SZAM "+S$
270 PRINT"UJ SZAM?(I/N)"
280 GET U$
290 IF U$="" THEN 280
300 IF ASC(U$)=43 THEN 10
310 PRINT "VISZLAT!"

2. ABC-rendezo

10 PRINT "ABC-RENDEZO"
20 PRINT "ELEMEK SZAMA"
30 INPUT N$
40 IF STR(VAL(N$))<>N$ OR VAL(N$)<2 THEN 20
50 IF N$="0" THEN 999
60 N%=VAL(N$)
65 A$=""
70 FOR I%=1 TO N%
80 PRINT STR(I%)+".ELEM"
90 INPUT S$
100 A$=A$+"*"+S$
110 NEXT
120 PRINT "TURELEM"
130 FOR I%=1 TO N%-1
140 FOR J%=I%+1 TO N%
150 M%=I%
160 GOSUB 1000
170 E$=T$
180 M%=J%
190 GOSUB 1000
200 F$=T$
210 IF F$>=E$ THEN 300
230 R$=E$
240 M%=J%
250 GOSUB 2000
260 M%=I%
270 R$=F$
280 GOSUB 2000
300 NEXT J%
305 PRINT STR(INT(I%*100/N%))+"%"
310 NEXT I%
315 PRINT "KESZ:"
320 FOR I%=1 TO N%
330 M%=I%
340 GOSUB 1000
350 PRINT T$
360 NEXT
999 END
1000 REM M% ELEMET T$-BE
1010 O%=0
1020 P%=0
1030 P%=P%+1
1040 IF MID(A$,P%,1)<>"*" AND P%<LEN(A$) THEN 1030
1050 O%=O%+1
1060 IF O%<M% THEN 1030
1070 T$=""
1080 P%=P%+1
1090 T$=T$+MID(A$,P%,1)
1100 IF MID(A$,P%,1)<>"*" AND P%<LEN(A$) THEN 1080
1110 IF MID(T$,LEN(T$),1)<>"*" THEN 1130
1120 T$=MID(T$,1,LEN(T$)-1)
1130 RETURN
2000 REM M% ELEM HELYETT R$
2010 S$=""
2020 Q%=M%
2030 IF M%=1 THEN 2100
2040 FOR K%=1 TO Q%-1
2050 M%=K%
2060 GOSUB 1000
2070 S$=S$+"*"+T$
2080 NEXT
2100 S$=S$+"*"+R$
2110 IF Q%=N% THEN 2200
2120 FOR K%=Q%+1 TO N%
2130 M%=K%
2140 GOSUB 1000
2150 S$=S$+"*"+T$
2160 NEXT
2200 A$=S$
2210 RETURN

Hibak
-----

* a BASIC programok szintaktikai hibait (meretkorlat miatt)
    nem minden esetben talalja meg
* az Internet Explorer a kb 700 byte-nal hosszabb programoktol
    "kiakad"
* ha a c.php-t tartalmazo frame elobb toltodik be, mint ahogy letrejon
    az "s" nevu frame, javascript hibahoz vezet, ilyenkor ujra kell
    tolteni az oldalt (1-2 probalkozas utan mukodni fog), ritkan
    fordul elo a hiba

Tippek
------

* Opera alatt megall a program az INPUT utasitasoknal, es nem megy
    tovabb RETURN-re (Enter); viszont ha atkattintunk egy masik
    fulre, majd vissza a C64-hez, utana mar mukodik a kovetkezo 1 db
    RETURN (a hiba Linux alatt jelentkezett)


Magyar Attila Mihaly
2005. februar 23.