C64 Midillä Korg ia vaan roplataan hieno löytö !
Tämä jakso sallii sinun katsoa tämän jäsenen kaikkia viestejä. Huomaa, että näet vain niiden alueiden viestit, joihin sinulla on nyt pääsy.
Näytä viestit Menu
;-------------------------------
; color scroll
;-------------------------------
.word $0801 ;oma assemplerini ei kirjoita
;ohjelma fileen alkuun lataus osoitetta joten
;kehvelivieköön kirjoitan se siis itse
*=$0801 ;kerromme vielä assemplerille että ohjelma alkaa tästä
;BASIC LINE START
.BYTE $0B,$08,$90,$06,$9E,$32
.BYTE $30,$34,$39,$00,$A0,$00
;--------------------------
set_irq_hero
lda #0
sta $d021
sta $d020
sei ;Keskeytykset seis
bit $dc0d ;nollaamme Irq A ajastimen varmuuden vuoksi
lda #<irq_hero ;ala tavu XX!!
sta $0314
lda #>irq_hero ;ylätävu !!XX
sta $0315
lda #$7f ;keskeytykset pois päältä
sta $dc0d
lda #1 ;asetamme rasteri keskeytykset päälle
sta $d019
sta $d01a ;varsinainen rekisteri
lda #$fb ;millä rasterilla keskeytys tapahtuu
sta $d012
lda $d011 ;varmistamme vielä että keskeytys tapahtuu
and #$7f ;näytön näkyvällä osalla
sta $d011
cli ;keskeytykset päälle
rts ;valmista paluu Bacikkiin
irq_hero lda #1
sta $d019 ;nollataan keskeytys ettei jää looppiin
inc $d020 ;muutellaan borderi värejä +1
inc $d020
jsr color
dec $d020 ;palautetaan värit -1
dec $d020
bit $dc0d ;extra safe nollataan vielä A&B keskeytykset
jmp $ea31 ;normaali basic keskeytys rutiini
;-----------------------------
col =$d800 ;leibelille näytön värimuistin alku osoite
color ldx #0 ;x=0
colo lda col+1,x ;lukeva osa yhden tavin edelle
sta col,x ;tallennetaan
lda col+40+1,x ;sama seuraavalle riville (+40)
sta col+40,x
lda col+80+1,x ;ja niin edes päin
sta col+80,x
lda col+120+1,x
sta col+120,x
lda col+160+1,x
sta col+160,x
lda col+200+1,x
sta col+200,x
inx ;lisätään X rekisteriä yhdellä X=X+1
cpx #40 ;joko se on 40 ?
bne colo ;ei vielä uusi lenkki
a_again ldx miss ;missä mennään väri listassa ?
cpx #20 ;ollaankko listasta jo ulkona ?
beq back_to_start ;nollataan "miss" jos X = 20
lda list_color,x ;otetaan väri X rekisterin määräämästä paikasta
sta col+39 ;asetamme sen näytön oikeaan laitaan
sta col+39+40 ;ja seuraavillekin riveille sama
sta col+39+80
sta col+39+120
sta col+39+160
sta col+39+200
inc miss ;lisätään Miss iä yhdellä
rts ;ja pois
;-----------------------------
miss .byte 0
list_color ;käytettävät värit täällä
.byte 2,2,4,4,7,7,1,1,1,1,7,7,4,4,2,2,0,0,0,0
;-----------------------------
back_to_start
lda #0 ;asetamme "miss" takaisin nollaksi
sta miss
jmp a_again ;ja palaamme rutiiniimme
;-----------------------------
itse Hero lista tässä
Muistettavaa: piste laskussa käytämme siis Desimaali lukuja ei hexsoja 0-99 ei siis 0-$ff
se ei suoraan tässä näy mutta 6502 prossassa on lippu
joka siirtää akun laskenta prosesseista osan Desimaali laskentaan
mikä voi olla todella hämäävää jos kyseinen lippu unohtuu kytkeä pois xD
;--------------------------
score .byte 1,8,0,0 pelaajan pisteet pelissä
;--------------------------
gamer .asc "!!!!!!!" pelaajan nimi
;--------------------------
tophero sijoitus
.asc "1 1" ;1 asc pelaajan nimi
.byte 2,0,0,1 pelaajan pisteet, tässä yhteydessä emme käytä
hexsa lukja vaan normaalia kymmen järjestelmää
yksi tavu pystyy esittämään numerot 0-99
maxsimi tulos on siis 99999999 kunnes
laskuri menee ylikierroksille
.asc "2 2" ;2
.byte 1,9,0,2
.asc "3 3" ;3
.byte 1,8,0,3
.asc "4 4" ;4
.byte 1,7,0,4
.asc "5 5" ;5
.byte 1,6,0,5
.asc "6 6" ;6
.byte 1,5,0,6
.asc "7 7" ;7
.byte 1,4,0,7
.asc "8 8" ;8
.byte 1,3,0,8
.asc "9 9" ;9
.byte 1,2,0,9
.asc "10 10" ;10
.byte 1,1,0,0
.asc " " ;11 täysin ylimääräinen ihan varmuuden vuoksi
.byte 0,0,0,0
;-------------------------------
; Seartching Heroes
;-------------------------------
looking_for
ldy #7 Y=7 koska pitää hypätä nimen yli
että pääsemme tuloksia mittaamaan
not_jet sec asetamme C lipun
lda tophero+3,y aloitemme vertailun pohjalta 0-99
sbc score+3 verraten pelaajan tulokseen
lda tophero+2,y 100-99xx
sbc score+2 seuraava tavu
lda tophero+1,y 10000-99xxxx
sbc score+1 seuraava tavu
lda tophero,y 100000-99xxxxxx
sbc score ylin tavu
bmi hero2 jos tulos miinus ylittävä tulos löytyi
tya siirretään Y rekisteri A rekisteriin
clc nollataan C lippu ettei laskenta sekoa
adc #11 lisätään 11 eli hypätään nimen ylitse
ja seuraavan tuloksen alkuun
tay palautetaan tulos Y rekisteriin
cpy #11*10 tarkistamme Yyn arvon 11*10=110
bcc not_jet jos tulos alle tuon 110 palaamme etsimään
seuraavaa listan ehdokasta vasten
lda #0
sta 10
rts
;------------------------
Hero2 Y rekisteri kertoo melkein suoraan paikan mistä alamme siirtämään muiden tuloksia alas päin
sty 10 tallennamme Y rekisterin tuloksen myöhempää käyttöä varten
jsr make_room tehdään uudelle sankarille tilaa listassa
jsr set_new_name sijoitetaan uusi pelaajan nimi paikalleen
jsr new_score ja uusi tulos perään
rts
;-------------------------------
tem1 .byte 0
;-------------------------------
make_room
tya Y rekisteri A rekisteriin
sec asetamme C rekisterin päälle miinustaessa
( asiat tehdään päin vastoin kuin yhteen laskussa )
sbc #$07 vähennämme 7 koska se on nimen pituus näin pääsemme listalla
oikeaan kohtaan
sta tem1 tallennamme väliaikaisesti
ldy #99 siirto on tapaperoinen eli aloitamme alhaalta ylös päin
t1 lda tophero,y nykyisen sijainnin paikka
sta tophero+11,y uusi sijainti 7+4=11 nimi ja tulos enemmän eli listalla
pykälä alas päin kuten on tarkoitus
dey vähennämme Y rekisteri yhdellä
cpy tem1 vertailemme alkuperäisen tallenteen kanssa olemmeko jo siirtäneet tarpeeksi
bpl t1 ei vielä siirrämme lisää
rts valmista paluu takaisin
;------------------------
set_new_name Uuden sankarin minen lisäys oikeaan paikkan
ldy tem1 otamme valmiiksi lasketun (-7) lukeman
lda 10 palautamme 10 tä
sta tem1 miinustamattoman arvon väliaikaiseen talteen
ldx #0
t2 lda gamer,x siirrämme nimen
sta tophero,y oikealle paikalleen
inx X +1
iny Y +1
cpy tem1 tarkistamme joko on siiretty kaikki
bcc t2 ei vielä
rts kaikki tehty paluu takaisin
;-------------------------------
new_score tuloksen siirto samoin menetelmin
ldy 10 hmm.. jos listalla tulokset olisivat samoin päin
tya voitaisiin tämä siirto tehdä edellisellä rutiinilla
clc samalla kertaan ups....
adc #4
sta tem1
ldx #0
t3 lda score,x
sta tophero,y
inx
iny
cpy tem1
bcc t3
rts
;-------------------------------
10 rem joulukilpailu by nimimerkki
20 gosub 1000 :rem alustukset
30 gosub 2000 :rem tulostus
40 u=0 :rem uudet pisteet
50 input "pisteesi (0=lopetus)"; u
60 if u=0 then print "kiitos, hei..." : end
70 if u>99999999 then goto 40
80 gosub 3000 :rem tark. sijoitus
90 gosub 4000 :rem listan paivitys
100 gosub 2000 :rem tulostus
110 if s<=9 then print u; "pistetta antaa sijan"; s+1 : print "kirjoita nimesi!"
120 if s<=9 then gosub 5000 :rem nimen kirjoitus
130 if s>9 then print u; "pisteella ei paase listoille!"
140 goto 40
999 end
1000 rem taulukoiden luonti ja alustus
1010 dim n$(9) :rem nimet
1020 dim p(9) :rem pisteet
1030 for i = 0 to 9
1040 n$(i) = chr$(65+i)
1050 p(i) = int(1024 / (i+1))
1060 next i
1070 return
2000 rem tulostus
2005 print "{clr}" :rem clear screen
2010 print "sija", "pisteet", "nimi" : print
2020 for i=0 to 9
2030 print i+1, p(i), n$(i)
2040 next i
2045 print
2050 print
2060 return
3000 rem tarkistetaan sijoitus
3010 s=10 :rem sijoitus
3020 for i=0 to 9
3030 if u > p(i) then s=i
3040 if u > p(i) then return
3050 next i
3060 return
4000 rem listan paivitys
4005 if s > 9 then return
4010 if s > 9 then return
4020 for i=8 to s step -1
4030 p(i+1) = p(i)
4040 n$(i+1) = n$(i)
4050 next i
4060 p(s) = u
4070 n$(s) = ""
4080 return
5000 rem nimen kirjoitus
5010 print "{home}" :rem home
5020 for i=0 to (s+1)
5030 print "{down}"; :rem kursori alas
5040 next i
5050 print, : print,
5060 print ".......";
5070 print "{left}{left}{left}{left}{left}{left}{left}"; :rem kursori vas.
5080 for i=0 to 6
5090 get u$ : if u$="" goto 5090
5100 if u$ = chr$(13) goto 5140
5110 print u$;
5120 n$(s) = n$(s)+u$
5130 next i
5140 gosub 2000 :rem tulostus
5150 return