tänään askartelin tälläisen koodin pätkän
vaikka normaalisti kirjoittelen mahdollisimman yksinkertaisia
ja simpeleitä koodia niin ajattelin nyt laittaa sitten tälläisen hieman kieromman
version nähtäville :laugh:
ja kuten aina kysyä saa ihan mitä vain !
;-------------------------------------------
; Joystic Read and move ship
;-------------------------------------------
read_joy
lda #$ff
sta $dc01
sta $d015
ldx #5
joy_loop lda $dc00
and binar,x
bne back
jsr do_some
back dex
bpl joy_loop
rts
;----------------------------------
do_some lda jump_tab,x
sta hop+1
hop bne hop
jmp left
jmp right
jmp down
jmp up
jmp fire
;-------------------------------------------
jump_tab .byte 0,3,6,9,12,15,18,21,24
binar .byte 1,2,4,8,16,32,64,128
;-------------------------------------------
up lda you_ship_x
clc
adc you_ship_speed
sta you_ship_x
sta $d000
rts
down lda you_ship_x
sec
sbc you_ship_speed
sta you_ship_x
sta $d000
rts
left lda you_ship_y
sec
sbc you_ship_speed
sta you_ship_y
sta $d001
rts
right lda you_ship_speed
clc
adc you_ship_y
sta you_ship_y
sta $d001
rts
fire inc $d020
rts
eikö kukaan huomaa koodissa olevia virheitä ?
Lainaa
eikö kukaan huomaa koodissa olevia virheitä ?
Ainakin tuo, kun read_joy alustaa joystick 1:n ($dc01), mutta joy_loop lukee joystick 2:n tilan ($dc00).
Pitää vielä debuggailla tuota do_somea. Ei vielä näillä assytaidoilla logiikka auennut :)
joo se kohta voi olla Vähän gryptinen jos ei ole
aikaisemmin tavannut itseään muuttavaa koodia katselemaan :)
lähinnä tämä osa on itse tutkiskelua miten saisin osia ohjelmistani piilotettua
crakereiden näkymättömiin ettei peleihini huijauksia saisi ihan niin helposti kuin
tavanomaiseen koodiin tämä tapa on yksi niistä enkä ole nähnyt kenenkään käyttävän moista
mielestäni olen tämän jipon jossain aukaissutkin jo mutta tehdäänpä se vielä kerran
;----------------------------------
do_some lda jump_tab,x ;X rekisterin avulla haetaan jump_tab listasta
sta hop+1 ;saatu luku tallenetaan BNE käskyyn +1 koska ensimmäinen tavu on itse haaratumis käsky
;koska jokainen Jmp käsky vie 3 tavua on seuraava aina 3 kertainen edelliseen
hop bne hop ;X=0 1 2 3 4
; | | | | |
jmp left ;--- | | | |
jmp right ;----- | | |
jmp down ;------- | |
jmp up ;--------- |
jmp fire ;-----------
;-------------------------------------------
jump_tab .byte 0,3,6,9,12,15,18,21,24 ;lista montako tavua hypätään eteenpäin
;------------------------------------------- ;listassa on enemmän hyppyjä kuin tarvitaan
;------------------------------------------------------------------------------------------
haarautumis käskyjen rakenne: sama Hexa koodina:
1000 BNE $1002 ;HEX D0 00 ensimmäinen luku on itse käskyn hex koodi.
;seuraava on hypättävien tavujen määrä eteenpäin (jos hyppy ehdot täyttyvät)
;tässä tapauksessa se on 00 koska ohjelma laskuria ei tarvitse muuttaa
;lainkaan vaan hyppy tehdään käskyn jälkeiseen osoitteeseen
1002 INC $D020 ; <- eli tähän
;------------------------
1000 BNE $1004 ;Hex D0 02 <- kaksi tavua eteen päin
1002 nop ;yli
1003 nop ;yli
1004 INC $D020 ;Hypättiin tähän
;------------------------
Koska yhden tavun haarautumis käskyillä on vain 8 Bit (255 tavun)
muistiavaruus jonne se voi hypätä monesti tulee tilanne eteen että kääntäjä
ilmoittaa haarautumisen olevan liian kaukana ja koska harautumista voidaan tehdä myös
takaisin päin on käytettävä alue 127 tavua eteen päin ja 126 tavua takaisin päin
miksi takaisin päin on 2 tavua vähemmän ?
koska itse haarautumis käsky on itse 2 tavua pitkä kuten edellä muistamme $00 hyppy oli heti
käskystä seuraava osoite
miten siis taakse päin haarautuminen toteutetaan ?
tämä selviää siitä miten CPU6502 tarvitaessa käsittelee miinus ja plus puoleisia lukuja
0-127 Hex $00-7F olevat luvut ovat Plus puoleisia
128-255 Hex $80-FF ovat miinus puoleisia
lukujen ylin %10000000 bitti määrää onko luku miinus vai plus
tämä erottamiseen 6502;lla on omat haarautumis käskynsä jota tunnistavat vain ylimmän bitin tilan
ja haarautuminen toteutetaan sen mukaisesti
BMI .... branch on minus (negative set)
BPL .... branch on plus (negative clear)
;------------------------
1000 BNE $1081 ;Hex D0 7F Max määrä eteen päin
;------------------------
1000 BNE $1000 ;Hex D0 FE ikuinen loop koska hypätään samaan haarautumis käskyyn
;------------------------
1000 BNE $0F82 ;Hex D0 80 Max määrä takaisin päin
;------------------------
1000 BNE $0FFE ;Hex D0 FC kaksi tavua takaisin päin
;------------------------
haarautumisen logiikka on sama kaikissa haarautumis käskyissä-
Lainaa;X rekisterin avulla haetaan jump_tab listasta
;saatu luku tallenetaan BNE käskyyn +1 koska ensimmäinen tavu on itse haaratumis käsky
;koska jokainen Jmp käsky vie 3 tavua on seuraava aina 3 kertainen edelliseen
Juuri noin sen päättelinkin toimivan, mutta tarkoitus oli debuggailla ja vahvistaa teoria :)
virhe minkä huomasin vasta postituksen jälkeen oli
vaikka ohjelma tekee kuten sen pitää niin
kotrollit ovat oikeasti päin honkia
jos niiden pitäisi toimia
alkaessani määrittelemään suuntien MAX ja MIN arvoja huomasin etteivät ne olleet oikein päin xD
muistaakseni X ja Y suunnat olivat ristissä xD tms.
miksi ohjelma looppaa 5 kertaa vaikka joikkarin suunta olisikin jo löytynyt ?
koska muuten emme tunnistaisi kuin sen liikkeen joka ensimmäisenä huomattaisin
ja pysty sivuttais suunnat jäisivät huomaamatta plus fire nappulaa ei tunnistettaisi lainkaan
ellei se olisi ainoa :)
Lainaus käyttäjältä: virgo - syyskuu 02, 2016, 01:02
kotrollit ovat oikeasti päin honkia
bne hop ;X=0 1 2 3 4
jmp left ;--- | | | |
jmp right ;----- | | |
jmp down ;------- | |
jmp up ;--------- |
jmp fire ;-----------
Joo, sekaisin ovat. Oikeesti nuo menee näin:
0: jmp up
1: jmp down
2: jmp left
3: jmp right
4: jmp fire