C64 basic joystickin luvun keskeytys

Saku-foorumi » Vapaa sana » Viestit 2010 » C64 basic joystickin luvun keskeytys « Edellinen Seuraava »

Kirjoittaja Viesti
 

Tero S.
Käyttäjätunnus: protek

Rekisteröity: 10-2009
Perjantaina, 9. heinäkuuta, 2010 - klo 13.44:   
Löytyykös jostain esimerkkikoodia joystickin luvun keskeytykseen C64 basicilla? Olen jotain pelin tapaista kötöstystä koettanut basicilla vääntää ja tällä hetkellä joystickin luku keskeyttää kaiken muun toiminnan ruudulla, mikä on ihan ymmärrettävää, kun lähdetään kesken kaiken muun ajamaan joystickin liikuttamiseen tai napin painamiseen liittyvää rutiinia.

Jos nyt yhtään oikein muistan ja ymmärrän, minun pitäisi suoran rutiinin kutsumisen sijasta nostaa keskeytyslippu pystyyn ja sitten kutsua se rutiini vai miten se nyt meni?

Piti vähän aikaa lueskella taas tuota koodirimpsua, että pääsee jyvälle, vaikka onkin jonkin verran koittanut sitä REM -lauseilla kommentoida.

Pistän senkin tuohon, niin saatte näytteen allekirjoittaneen kököstä koodaustaidosta.
1 FORT=49152TO49245:READA:POKET,A:NEXT
2 SYS49233
3 DATA24,173,,220,41,1,240,23,173,,220,41,8,240,22,173,,220,41,2,240,21,173
4 DATA,220,41,4,240,20,144,44,169,216,133,144,144,16,169,1,133,144,144,10,169
5 DATA40,133,144,144,4,169,255,133,144,173,,220,41,16,240,8,169,,141,60,3,76,49
6 DATA234,169,1,141,60,3,144,246,169,,133,144,144,228,120,169,,141,20,3,169,192
7 DATA141,21,3,88,96
10 GOSUB1000 : REM ALUSTA MUUTTUJAT
20 GOSUB2000 : REM ALUSTA TAUSTA
30 GOSUB3000 : REM ALUSTA SPRITET
40 GOSUB4000 : REM ALKUTILA
100 GOTO 10500
1000 REM ALUSTA MUUTTUJAT
1010 V=53248
1020 X=200
1030 Y=200
1040 PAL=0
1050 RES=3
1060 PX=30
1070 PY=207
1999 RETURN
2000 REM ALUSTA TAUSTA
2010 PRINT"“"
2020 POKE 53281,1
2999 RETURN
3000 REM ALUSTA SPRITET
3010 POKE 2041,159 : POKE 2042,160 : POKE 2043,161 : POKE2044,162 :POKE2045,163
3020 FORN=0 TO 63 : READQ : POKE159*64+N,Q : NEXT
3021 FORN=0 TO 63 : READQ : POKE160*64+N,Q : NEXT
3022 FORN=0 TO 63 : READQ : POKE161*64+N,Q : NEXT
3023 FORN=0 TO 63 : READQ : POKE162*64+N,Q : NEXT
3024 FORN=0 TO 63 : READQ : POKE163*64+N,Q : NEXT
3030 DATA0,30,0,0,33,0,0,64,128,3,147,64,4,19,192,8,3,192,4,3,64,3,227,128,0,20
3040 DATA0,0,28,0,0,34,0,0,65,0,0,139,0,0,139,0,0,139,0,0,73,0,0,54,0,0,10,0,0
3050 DATA58,0,0,65,0,0,126,0,0
3060 DATA0,0,0,0,0,0,0,0,0,0,128,0,1,192,0,1,192,0,1,192,0,1,192,0,0,128,0,1
3070 DATA224,0,1,152,0,0,96,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
3080 DATA0,0,0,0,0,0,0
3090 DATA0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,26,135,0,65,200,0,42
3100 DATA119,0,65,220,0,42,64,0,29,128,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
3120 DATA0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,112,0,4,204,0,119,34,0,13,118,0,1,86
3130 DATA0,0,182,0,0,136,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
3140 DATA0,0,0,0
3150 DATA0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,60,0,0,60,0,0,60,0
3160 DATA0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
3170 POKEV+40,0 : POKEV+41,0 : POKEV+42,0 : POKEV+43,0 : POKEV+44,0
3999 RETURN
4000 REM ALKUTILA
4010 POKEV+2,242 : POKEV+3,200 : POKEV+4,238 : POKEV+5,200
4011 POKEV+6,235 : POKEV+7,203 : POKEV+8,255 : POKE V+9,205
4020 POKEV+10,30 : POKEV+11,207
4040 POKEV+21,18
4999 RETURN
10000 IF PEEK(828) THEN GOTO 10299
10001 IF STICK=-40 THEN GOTO 10100
10002 IF STICK=40 THEN GOTO 10200
10003 IF STICK=0 THEN GOTO 10400
10100 IF X-75 <50 THEN GOTO 10400
10110 IF X-75 >= 50 THEN X=X-75 : POKEV+3,X : POKEV+5,X:POKEV+7,X+3:POKEV+9,X+5
10115 FOR I=1 TO 100: NEXT I
10120 GOTO 10400
10200 IF X+75 >200 THEN GOTO 10400
10210 IF X+75 <= 200 THEN X=X+75:POKEV+3,X:POKEV+5,X:POKEV+7,X+3:POKEV+9,X+5
10215 FOR I=1 TO 100 : NEXT I
10220 GOTO 10400
10299 IF PAL > 0 THEN GOTO 10350
10300 POKEV+21,6
10310 FOR I=1 TO 100 : NEXT I
10320 POKEV+21,10
10330 FOR I=1 TO 100 : NEXT I
10340 POKEV+21,18
10345 GOTO 10400
10350 POKEV+21,38
10360 FOR I=1 TO 100 : NEXT I
10370 POKEV+21,42
10380 FORI=1 TO 100 : NEXT I
10390 POKEV+21,50
10400 RETURN
10500 IF PAL < 4 THEN GOTO 10510
10505 GOSUB10000
10510 LUO=INT(10*RND(1))
10515 IF LUO=7 THEN GOSUB30000
10550 GOTO 10500
30000 POKEV+21,50
30001 PAL= PAL+1
30002 FORI=1TO1000:PX=PX+2:PY=PY-1:POKEV+10,PX:POKEV+11,PY:GOSUB10000:NEXTI
30020 RETURN

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Maanantaina, 12. heinäkuuta, 2010 - klo 16.54:   
C64 basicissa ei ole keskeytyksiä kuten joissain kehittyneimmissä koneissa
mutta asian voi kyllä kiertää jos välttämättä haluaa alkaa kikkailemaan
monesti tosin joutuu toteamaan että Assy on ainoa oikea vaihto ehto :-(
grafiikan kanssa basic on valitettavasti onnettoman hidas :-(

64 basic taitaa tukea vain yhtä ainoaa komentoa konekieli koodin ja basic kielen välillä
USR ("muuttuja")

tässäkin joutuu pokeilla kikkailemaan
785-786 paikkoihin hi ja lo osotteet
ennenkuin alkaa toimimaan
kone kieli ohjelma saa muuttujan A akkun kautta
ja basic paluuna tulee A akun kautta muuttujan arvon
komennolla on helppo kiertää poke peek kikkailut
ainut hankaluus on että komento tukee vain yhtä hyppyä joten jos haluaa hypätä toiseen rutiiniin poke rutiinit syö hyödyn :-(

esim.
(poket puuttuvat)
Basic:
Z=1
usr(Z) :rem kutsutaan konekieli ohjelmaa
print "arvo";Z

arvo 2
ready.

Assy osa:
tax ;siirretään A X akkuun
inx ;lisätään X=X+1
txa ;siirretään x takaisin akkuun
rts ;palataan basiciin Z=2


köh köh ja loppuun pitänee lisätä etten ole komentoa koskaan käyttänyt enkä ole kenenkään muun nähnyt sitä hyödyntävän...
yhden alirutiinin kutsumiseen se kuitenkin on näppärämpi tapa kuin
poke sys peek yhdistelmä

ps.
rutiinissa ei ole määritelty STICK in arvoa missään ?
30002 rivillä PX ja PY arvot taitavat ylittää 256 limitin ennen kuin I on 10000
Assy koodi olisi hyvä olla erillään harvemmin tuosta octa luvuista saa selville millainen Datariveillä oleva konekieli ohjelma oikein on
yritin kyllä sitä kirjoittaa että olisin sen nähnyt mutta jäi tekemättä...

toivottavasti tästä on apua

 

Juha-Pekka Kuusela
Käyttäjätunnus: jpq

Rekisteröity: 10-2009
Maanantaina, 12. heinäkuuta, 2010 - klo 16.57:   
Itse ajattelin ideoitani kehitellä CC65 c kääntäjällä jossa tiedän tehoa tarpeeksi olevan.
(kuhan VICEn säppis toimis kunnolla Mac os xässä eli functio näppäimet ja * ei toimi täytyy taas tuohonkin jaksaa paneutua). ja c64 basic on todellakin tosi toivoton peli ohjelmointiin tai miksei muuhunnkin jopa tiedoston käsittely on ylettömän tuskaisaa sanoisin.

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Maanantaina, 12. heinäkuuta, 2010 - klo 17.55:   
Vice koitin koko päivän saada vörkkiin mut ei inahdustakaan :-(

 

Tero S.
Käyttäjätunnus: protek

Rekisteröity: 10-2009
Maanantaina, 12. heinäkuuta, 2010 - klo 23.36:   
@virgo: Stick -funktion datalauseet on ihan listauksen alussa. Se ei ole oma tuotokseni vaan jostain poimittu ja jälkikäteen lisätty. Krediitit tekijälle olisi tietty pitänyt laittaa mutta kun tätä lähinnä omaksi huviksi vääntelin.

 

Juha-Pekka Kuusela
Käyttäjätunnus: jpq

Rekisteröity: 10-2009
Tiistaina, 13. heinäkuuta, 2010 - klo 21.17:   
virgo: toimii täällä muuten mutta nuo näppäimet ei.

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Keskiviikkona, 14. heinäkuuta, 2010 - klo 2.14:   
JP:
KEYssi rommiko puuttuu ?

Tero S.
ok
koittaessani selvittää mitä tuo ohjelma tekee
satuin vaan huomaamaan ettei kyseistä muuttujaa
aseteta missään kohtaa ohjelmassa
C64 on vain kaksi muuttujaa joita käyttis rukkaa itse TI &TI (time)

en tiedä olisiko pikkuhiljaa aika alkaa tekeen juttuja vanhojen retro 8bit koneiden ohjelmoinnista
kun ei enään taida kirjastoissakaan olla 8bittisten ohjelmointi oppaita
olis hienoa jos porukka innostus uudelleen ohjelmoimaan niitä

jos on kiinnostusta opetella ainakin minulta voi kysellä neuvoja ja esimerkki rutiineita
muutama puolivalmis pelin tekelekin on kaapeissa odottamassa josko joskus,,,

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Keskiviikkona, 14. heinäkuuta, 2010 - klo 2.24:   
hieman pätkii ajatus näin ehtoolla...
kuten tuossa alussa sanoin niin Data lauseiden sisältö
on täyttä hepreaa ellei sitä pääse katsomaan
Assyn lävitse ja sitä en vielä ole pystynyt tekemään
vai että itse tehty muuttuja... mielenkiintoista :D

 

allu
Käyttäjätunnus: allu

Rekisteröity: 5-2010
Keskiviikkona, 14. heinäkuuta, 2010 - klo 2.58:   
On vielä yksi muuttuja jota kernel päivittää, ST. Eli, levyoperaatioiden status muuttuja. Ja sitähän tuossa on todennäköisesti käytettykin (STick == ST, vain 2 ensimmäistä merkkiä ovat merkitseviä). Asmirutiini asentaa oman keskeytyskoukun jossa tikun tiedot luetaan nollasivulla olevaan ST muistipaikkaan ja basic sitten tarjoilee kyseisen tiedon ST muuttujassa.

Alkuperäisestä jumiutumisongelmasta ei ole mitään käryä...

 

Juha-Pekka Kuusela
Käyttäjätunnus: jpq

Rekisteröity: 10-2009
Keskiviikkona, 14. heinäkuuta, 2010 - klo 3.12:   
JP jos viittaa minuun niin kyllä se kyse emulaatio ohjelman asetuksista ja cocoa versio lienee tuo katselen jos löytyy se toinen x-window versio. ja viceä käyttelisin mieluiten emulaatioon
kun siinä on myös esimerkiksi vic20...
(kun olen pegalla ajaen vakuuttunut sen laadusta ja pegalla koodaisinkin mutta kun mäkki ikävä kyllä nyt pääkoneeni).
virgo: itse ajattelin haastaa itseni ja sitten tykkään raudasta jossa aidot spritet jne.

 

Juha-Pekka Kuusela
Käyttäjätunnus: jpq

Rekisteröity: 10-2009
Keskiviikkona, 14. heinäkuuta, 2010 - klo 3.41:   
ohjeiden neuvot niiden ongelma merkkien syöttöön ei toimi.

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Torstaina, 15. heinäkuuta, 2010 - klo 22.23:   
pitänee purkaa tuo rutiini Assylle ja julkasta se täälä niin voi muutkin mietiskellä...

tosiaan ST muuttujakin oli :-)

 

allu
Käyttäjätunnus: allu

Rekisteröity: 5-2010
Perjantaina, 16. heinäkuuta, 2010 - klo 16.59:   
disassembloin tuon rutiinin ja olin oikeassa. Rutiini asentaa oman keskeytyskäsittelijän joka lukee joystick porttia, tulkkailee jotain omiaan ja tallentaa tiedon ST muistipaikkaan(ja kasettibufferiin) nollasivulle. Tavallaan kiva idea mutta ensinnäkin tuo rutiini on ihan roskaa, yhdistelmiä(viistot+fire) ei tueta ollenkaan ja miksi ihmeessä fire tieto tallennetaan kasettipuskuriin?? Tallentaisi sitten kaikki tiedot kasettipuskuriin eri muistipaikkoihin niin basic puolella säästäisi edes maskaamisen vaivan.

Eli parempi dumpata koko asmi huitsin hittoon ja lukea $dc00(56320) portista suoraan joystick kytkinten tilat. Tässä bitit; joystick #2,bit 0=up,1=down,2=right,3=left,4=fire.

Ja tässä vielä asmi muidenkin pällisteltäväksi:

C000 CLC
C001 LDA $DC00
C004 AND #$01
C006 BEQ $C01F
C008 LDA $DC00
C00B AND #$08
C00D BEQ $C025
C00F LDA $DC00
C012 AND #$02
C014 BEQ $C02B
C016 LDA $DC00
C019 AND #$04
C01B BEQ $C031
C01D BCC $C04B
C01F LDA #$D8
C021 STA $90
C023 BCC $C035
C025 LDA #$01
C027 STA $90
C029 BCC $C035
C02B LDA #$28
C02D STA $90
C02F BCC $C035
C031 LDA #$FF
C033 STA $90
C035 LDA $DC00
C038 AND #$10
C03A BEQ $C044
C03C LDA #$00
C03E STA $033C
C041 JMP $EA31
C044 LDA #$01
C046 STA $033C
C049 BCC $C041
C04B LDA #$00
C04D STA $90
C04F BCC $C035
C051 SEI
C052 LDA #$00
C054 STA $0314
C057 LDA #$C0
C059 STA $0315
C05C CLI
C05D RTS

Käynnistysosoite on $c051, ST muuttujan osoite on $90 ja kasettipuskurin osoite on $33c.

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Lauantaina, 17. heinäkuuta, 2010 - klo 13.56:   
tänks !
ja huh huh mitä spaketti koodia etten sanois
C04F kohdassa on kyl melkonen idiotismi hyppy
jota en todellakaan suosittele käyttämään

luultavasti ST muuttujaa käytetään siksi ettei tarvitsisi käyttää hidasta Peek komentoa...

rutiinista saisi huomattavan määrän dataa pois jo vähän miettis ensinnäkin tallentaisin ST muuttujaan
0-9 välisen luvun josta olisi helppo hypätä basicissa oikeaan rutiiniin

esim.

10 if st = 0 then (ei mitään nappia)
20 on st goto... (tai gosub)

 

Tero S.
Käyttäjätunnus: protek

Rekisteröity: 10-2009
Sunnuntaina, 18. heinäkuuta, 2010 - klo 19.41:   
Mikrobitistä taisin tuon joystickin lukurutiinin löytää. Aikaisemmassa versiossa homma hoitui perinteisemmon poke/peek -lauseilla. Mitään hyötyähän tuon rutiinin käytöstä ei sitten ollut.

Koodista sen verran, että ajatuksena oli tehdä kuusnelosversio Nintendon Game&Watch Snoopy Tennis pelistä. Alkuun tuosta yritti tehdä rakenteellista mutta homma karkasi spagettikoodiksi. Piti näin pitemmän ajan jälkeen itsekin katsoa, että mitä v***ua sitä on tullut kirjoiteltua. Mm. Mailanlyöntianimaatiossa on miettinyt, olisiko ollut kenties fiksumpaa käyttä kolmen spriten sijasta yhtä ja lennossa vaihtaa spriten viittaamaan eri datalauseisiin. Kirjoittelin tämän vajaa viisi vuotta sitten ja se on varmaan pisin koodinpätkä, mitä olen kuusnelosella ikinä kirjoittanut. Ainakin, jos ei lasketa listauksista syöttöä. Yllättäen jäi kesken...

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Maanantaina, 19. heinäkuuta, 2010 - klo 18.57:   
aika yleinen tapa oli tuo vaihtaa vain data osotetta joskus käytettiin montaa spritee päälekkäin kun haluttiin enemmän kuin ne 4 värii
tai siksi että haluttiin käyttää *Hres* moodia jokaisella värille oli oma sprite pinta

mun mielestä ohjelmoinnissa oli hauskinta se ettei ollut yhtä oikeaa tapaa tehdä asioita vaan mahdollisuuksia oli melkein rajattomasti :D

olihan tuosta joy rutiinista sen verran hyötyä että Basic ei ihan niin paljon jumahtanut kuin
Peek poke systeemillä eli huomattavasti nopeampi tapa

mutta jos intoa riittää kirjoittaa pelisi loppuun ollaan täällä tukenas ja neuvomas kun ymmärrys loppuu
Semiä !

 

virgo
Käyttäjätunnus: virgo

Rekisteröity: 10-2009
Torstaina, 22. heinäkuuta, 2010 - klo 0.55:   
kirjoittelin iltapuhteiksi tälläisen esimerkki ohjelman ilman konekieltä...
joikkarin lukemiseen C128 joy muuttuja voi hyödyntää samalla tavalla
ainakin se emussa toimi joten luotan että toimii oikeassa C64 ssakin

10 goto 100
11 return
99 :
100 joy=peek(56320):move=joy and(15)
101 :
120 print "(ruudun tyhjennys)"mo;ti:ti$="000000"
140 if joy and(16) goto 150
141 print "FIRE"
149 :
150 on move gosub 11,11,11,11,370,360,350,11,340,330,320,11,310,300,11
155 goto 100
199 :
200 Rem --- Toiminnat ---
300 print "up":return
310 print "down":return
320 print "left":return
330 print "up/left":return
340 print "down/left":return
350 print "right":return
360 print "up/right":return
370 print "down/right":return

10 hypätään loopiin
11 palautetaan tyhjä hyppy
100 luetaan 56320 paikasta joikan tiedot:erotetaan move muuttujaan alimmat 4 bittiä eli suunnat
120 putsataan ruutu ja tulostetaan Move muuttuja + ti muuttuja
:nollataan ti muuttuja tämä vain kellottamaan kuinka kauvan pää loop kestää
:voi siis poistaa
140 verrataan joy muuttujaa onko 5 bitti laskenut jos ei hypätään riville 150
141 jos 5 bitti oli alhaalla fire nappulaa oli painettu
150 hyppy lista toimintoihin move muuttuja antamien arvojen mukaan
:Move ei voi olla 0 muuten tulee virhe ilmoitus
:11 riville hypyistä käytetään ainoastaan viimeistä move=15 muut ovat mahdottomia joikka asentoja
:esim. ylös/alas tai vasen/oikea tms.
:mutta jos niin käy hypyt menevät turvalliseen paikkaan eivätkä kaada ohjelmaa
155 hommat tehty takaisin loopin alkuun 100 riville
300 mo=14 joikka ylöspäin
310 mo=13 joikka alaspäin
320 mo=11 joikka vasemmalle
330 mo=10 joikka ylös vasemmalle
340 mo=9 joikka alas vasemmalle
350 mo=7 joikka oikealle
360 mo=6 joikka ylös oikealle
370 mo=5 joikka alas oikealle

Move muuttujan antamat luvut ovat seuraavat

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
N N N N d u r N d u l N d u N
. . . . r r . . l l. . . . . .

Lisää viestisi tähän
Viestisi:
Käyttäjätunnus: Postitus informaatiota:
Tämä on yksityinen keskustelupalsta. Vain rekisteröidyt käyttäjät ja moderaattorit voivat postittaa tänne.
Salasana:
valinnat: Aktivoi URL:t automaattisesti tässä viestissä
Toimenpide: