joikkari koodausta

Aloittaja virgo, elokuu 19, 2016, 19:22

« edellinen - seuraava »

virgo

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
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

virgo

eikö kukaan huomaa koodissa olevia virheitä ?
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

Antti

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 :)

virgo

#3
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ä-
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

Antti

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 :)

virgo

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 :)

Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

Antti

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