C-64 Koodinpätkiä

Aloittaja fmatic, marraskuu 18, 2002, 18:04

« edellinen - seuraava »

fmatic

Kun nyt noista koodinpätkistä tuli puhetta niin tässäpä yksi mielenkiintoinen viritys. On testattavissa ihan emulaattorillakin.

Kyseessä on kikkailua SID-piirillä jonka äänevoimakkuuden nollauksen ja täydelle asetuksen seuraksena syntyvää napsausta hyväksikäyttäen luodaan uusi ääni eräänlainen "sähkökitara" efekti :)

Koodia naputtelemaan:

10 FORX=54272TO54296:POKEX,0:NEXT
20 POKE54296,15:POKE54296,0:FORX=1TO5:NEXT:GOTO20

Koodin syötettyä ajetaan ohjelma komennolla RUN ja painetaan RETURN emulaattorilla tietenkin PC:n Enter

Tässä koodinpätkässä napsausta luupataan loputtomiin joten emulaattorin sulkeminen pelastaa korva parkasi :)

BEAT!!

Hirosima 45
Tshernobyl 86
Windows 95

FEEL THE BEAT!!

fmatic

BASIC:n alkeita esittelen:
http://commodore.sigmatic.fi/artikkelit/64ohjelmointi.shtml

Artikkeli on alkutekijöissään mutta lisää tulee kun aika suinkin antaa myöden.

Telstar

Koodi sai aikaan vain ja ainoastaan pörinää aidolla kuusnelosella ??? :)
C64 + 2x1541 + C2N.

SYS49152

#4
Koodinpätkiä voi niinikään bongailla tuolta minun blogista niinikään, vanhoja juttuja joita vihdoinkin päätin saattaa julkisuuteen ...
Blogi on juuri (9.5.2007) aloitettu joten toivottavasti aikaa&energiaa skriivailuun riittää ...

bloodycut

Olis hienoo nähä pelejä tän foorumin käyttäjiltä naputeltuina :) tai kootaan tiimi ja naputellaan joku hieno Pirates tai Red Storm Rising tyyppinen geimi.

Syntax_Error

#6
Otetaanpa basic-aloittelijoille ja miksei muillekkin pieni opas ON GOTO ja ON GOSUB lauseista. Oletan että Goto jo Gosub on jo edes jonninverran tuttuja käsitteitä. On goto ja On gosub on varsin näppärät käskyt, mutta niitä näkee ohjelmakoodeissa yllättävän harvoin. Ehkäpä siksi, että asiaa ei olla viitsitty opiskella. Asia on kuitenkin varsin simppeli.

Mutta aloitetaas..

Jos meidän tarvitsisi tehdä ohjelmaamme valikko, jossa ohjelman käyttäjä valitsee jonkin vaihtoehdoista vaikkapa nyt sitten väliltä 1-5, niin tavallisestihan näkee käytettävän seuraavaa muotoa:

10 Input A
20 if A = 1 then goto 100
30 if A = 2 then goto 200
40 if A = 3 then goto 300
50 if A = 4 then goto 400
60 if A = 5 then goto 500


Ohjelmiaan voi rakentaa toki näinkin, mutta if lauseita tarvitaan yhtä monta, mitä valittavia vaihtoehtojakin ja yleensä vielä ylimääräinen if lauseke valvomaan, ettei valintojen ulkopuolisia arvoja voida antaa. Tavallisiminhan se tehdään näin:

80 If A = 0 or A = 6 then goto 10

Eli jos muuttujan A arvo on 0 tai 6 palataan takaisin input lauseeseen riville 10. Jos valittavia vaihtoehtoja on paljon, kasvaa ohjelmakoodi ihan turhaan if lauseiden vuoksi. Mikä siis vaihtoehdoksi?

Apuun tulee on goto. Sen käyttö on varsin helppoa. Seuraava ohjelmakoodi on erittäin näpsä ja lyhyt hoitamaan saman, mitä edellinenkin koodi:

10 Get A
20 on A goto 100,200,300,400,500
30 goto 10


Eli, rivillä 10 on input lauseen sijaan get. Inputtia voidaan käyttää, mutta tuollaiseen toimintaan sopii paremmin GET. Input jää odottamaan käyttäjän vastausta ja että käyttäjä painaa returnia. Get ei samalla tavoin jää odottamaan, vaan se vain tarkistaa, onko jotain näppäintä painettu ja jos on, sen arvo sijoitetaan määriteltyyn muuttujaan. Esimerkissä siis muuttujaan A. Jos mitään ei ole painettu, jatkaa ohjelmakoodi eteenpäin. Jotta saataisiin kone kuitenkin jäämään odottamaan vastausta niin että returnia ei tarvitse painaa, on rivillä 30 goto käsky takaisin get käskylle. Koodissa on siis looppi ja näppäinpainallusta valvova rutiini jää loopin sisään. (rivi 20)

Rivi 20 hoitaakin sitten itseasiassa aika monta hommaa. Se nimittäin On goto rakenteesta johtuen valvoo automaattisesti oikeaan rivinumeroon hyppäämistä. Se toimii siten, että jos esimerkissä A:n arvo on jokin valituista, hypätään järjestyksessä aina sitä vastaavaan rivinumeroon on goto -lauseessa. Ensimmäinen rivinumero toimii arvolla 1, seuraava arvolla 2 jne..

Eli käytännössä: jos painetaan numeroa 1, niin hypätään riviin 100. Jos painetaan 2 tapahtuu hyppäys rivinumeroon 200. 3;lla rivinumeroon 300. 4;lla riville 400 ja 5;lla rivinumeroon 500.

Jos painetaan 0 tai 6, on goto ei tee mitään, mutta koska rivinumerolla 30 on käsky goto 10, palaa ohjelma takasin get käskyyn, jolloin arvojen 0 tai 6 käyttö on siten estetty. Varsin yksinkertainen tapa siis toimia If lauseiden sijaan.

Tuosta rakenteesta on muutakin käytännön hyötyä, kuin vain koodin pieneneminen verrattuna if lauseisiin. Oletetaan, että meidän tuleekin tarve myöhemmin lisätä ohjelmaan vaihtoehto 6. If lauseilla toteutetussa joudutaan tietty lisäämään uusi if lause valvomaan 6's vaihtoehtoa.
Esimerkiksi siis 70 if A = 6 then goto 600 .. ja jos ylisuurien numeroidenkin toiminta on estetty, meidän on lisäksi myös muutettava sitäkin riviä.
Eli siis rivi 80 If A = 0 or A = 6 then goto 10 on uuden If lausekkeen vuoksi muutettava muotoon:
80 If A = 0 or A = 7 then goto 10

On goto rakenteessa taas riittää, kun lisäämme vain 20 on A goto 100,200,300,400,500 -rivin perään pilkun ja uuden halutun rivinumeron ja se tulee siten automaattisesti valvomaan valintanumeroa 6 ja 7 aiheuttaakin taas sen jälkeen paluun get lauseeseen rivinumeron 30 goto lauseen vuoksi.
On gotolla siis riviksi tulisi 20 on A goto 100,200,300,400,500,600 ,eikä mitään muuta muutosta tarvita. Simppeliä!

Jos vaihtoehtoja tarvitaan suurempi määrä, kuin 1-9 eli tarvittaisiin myös vaihtoehto 10, ei get lausetta voida ihan noin vain käyttää. Sehän tulkitsee näppäimen painamisen heti ilman returnia. 10 lukemaan tarvitaan kuitenkin kahta näppäintä, jolloin kannattaa käyttää inputtia. Eli siis: 10 Input A

On gosub toimii hommassa ihan samoin mitä On gotokin. Gosubhan toimii sikäli erilailla, että sitä käytetään aliohjelmassa käymiseen. Eli mikäli gosub lausella hypätään jonnekkin ohjelmariviin, niin ohjelmaa ajetaan siellä siihen asti, kunnes vastaan tulee return käsky ja ohjelmakoodissa palataan gosub käskyä seuraavaan rivinumeroon.

Jospa tästä pienimuotoisesta ohjeesta olisi jollekkin nyt jotain apua.
5 rem - Sekodemo :) -
10 N=INT(200*RND(0)+1)
20 PRINT CHR$(N);
30 GOTO 10

bloodycut

no onhan tämä jotakin jo...ite värkkäilin sellasen tietovisan noilla gosubeilla ja sitte datoissa oli vastaukset. Jos vastasi oikein niin tuli ruutuun yläreunaan sivun tyhjäyksen jälkeen hyvä hyvä teksti. Eiks noilla Art Studioilla ja Koala Paintereilla vois luoda grafiikkaa ja liittää ne sitten ohjelmiin. Esim. oikean vastauksen jälkeen ruutuun hypähtäisi vaikka Samantha Fox Strip Pokerista Samantha ruutuun ja väärästä vastauksesta Wizball tyyppi.

Syntax_Error

#8
Lainaano onhan tämä jotakin jo...ite värkkäilin sellasen tietovisan noilla gosubeilla ja sitte datoissa oli vastaukset. Jos vastasi oikein niin tuli ruutuun yläreunaan sivun tyhjäyksen jälkeen hyvä hyvä teksti. Eiks noilla Art Studioilla ja Koala Paintereilla vois luoda grafiikkaa ja liittää ne sitten ohjelmiin. Esim. oikean vastauksen jälkeen ruutuun hypähtäisi vaikka Samantha Fox Strip Pokerista Samantha ruutuun ja väärästä vastauksesta Wizball tyyppi.
Joo ihan noille aloittelijoille tuota laitoinkin ja siksi se olikin aika rautalangasta väännetty.

Art Studion ja koalapainterin kuvia voi käyttää myös hyvin omissa ohjelmissaan. Ihan aloittelijoiden kannattaa se homma unohtaa ja tyytyä vaikka ihan näppäimistöltä irtoaviin merkkeihin. Jos kummiskin haluaa tehdä dia-shown koalapainter kuvilleen, niin mulla olisi tuossa C= lehdessä basic-listaus siihen. Voisin sen koittaa saada aikaiseksi tännekkin, jos sille on yhtään kiinnostusta (?)

Konekieli olisi kylläkin noihin kuvien käyttämiseen enmmän, kuin paikallaan. C-64 ohjelmien kuvaformaateista löytyy mm: http://www.editorix.org/congo/html/c64_image_formats__part_i.html
5 rem - Sekodemo :) -
10 N=INT(200*RND(0)+1)
20 PRINT CHR$(N);
30 GOTO 10