Assemblyn alkeet? Auttakaa minua

Aloittaja Jarskimo, tammikuu 12, 2012, 16:08

« edellinen - seuraava »

Jarskimo

Olen päättänyt, että astun assemblyn maailmaan (konekieli, assy, mitä niitä nimiä nyt onkaan..). Tässä vain on yksi suuri este, en tajua tuosta yhtään mitään :D BASIC menee minulta hyvin ja täältä foorumilta löytyy hyviä ohjeita BASICillä koodamiseen/leikkimiseen, mutta assysta ei ole tietääkseni mitään. Olisi kivaa jos joku tekesi tähän jonkun tutoriaalin millä pääsee alkuun.

Assy ohjelma jota ehkä meinaan käyttää on sen niminen kuin Assembler. Löytyy NT Rautasen sivuilta. Siitä ihan ensimmäiseksi yksi kysymys, eli kun käynnistän sen ohjelman niin se kysyy tällaista: UUSI OSOITE ?. Tietääkseni tähän kuuluu laittaa jokin numero sarja, mutta valaiskaa minua hieman.

Toivoisin, että joku myös kirjoittaa tähän vaikka sellaisen koodin millä saa tuollaisen latausruudukon aikaiseksi, eli se missä vilkkuu sateenkaaren värit. Tietysti saa myös muita yksinkertaisia koodin pätkiä laittaa.

Kiitän jo etukäteen kaikkia vastanneita

virgo

#1
okei kaivoin sivun esiin ja sanon heti että ei !!!
Assy ohjelma joka käyttää desimaali lukuja on ehdottomasti kuvasta pihalla!!!
hex koodin on ainoa oikea tapa lähestyä Assyä
muuten menee metsää niin että pää kolisee...

ensimmäisenä kannattaa ottaa selvää binääri luvuista
mitä ne on ja miten niillä muodostetaan numeroita
toiseksi tärkein on Hex numeriinen järjestelmä
nämä toimivat konekielessä parhaiten yhteen kuten tulet varmasti huomaamaan

kunnon softa käyttöön heti alusta alkaen
http://turbo.style64.org/tmp.php
ja noista TMP v1.2 (for plain c64)

väripalkki rutiini on tuolla jo jossain valmiina ja on todella yksin kertainen
http://www.com64.net/foorumi/index.php?topic=496.0

yritän nyt selittää Binäärilukuja ja HExsoja...

decimaali ja Hexa lukujen erot
siinä missä decimaali luvut ovat 10 osaisia
0,1,2,3,4,5,6,7,8,9,"10"...
Hexsaluvut ovat 16 osaisia 0-F
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,"10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F"...

miksi HExat ovat parempia kuin decimaalit
konekielessä joutuu paljon käsitteleen binääreitä
C64 tapauksessa Binäärit ovat 8bittisiä lukuja
4bit luku         Hex     Dec
xxxx0000  =   00       00
xxxx0001  =   01       01
xxxx0010  =   02       02
xxxx0011  =   03       03
xxxx0100  =   04       04
xxxx0101  =   05       05
xxxx0110  =   06       06
xxxx0111  =   07       07
xxxx1000  =   08       08
xxxx1001  =   09       09
xxxx1010  =   0A      10
xxxx1011  =   0B      11
xxxx1100  =   0C      12
xxxx1101  =   0D      13
xxxx1110  =   0E      14
xxxx1111  =   0F      15
Edit: korjattu taulukko puuttui nolla ja yksi binääri luku:

ja niin edelleen aina bin %11111111 ,hex $FF   ,dec 255 lukuihin asti

00000001 =    01       01
00000010 =    02       02
00000100 =    04       04
00001000 =    08       08
00010000 =    10       16
00100000 =    20       32
01000000 =    40       64
10000000 =    80       128
kuten yllä huomaat binäärinä Hex luku on paljon helpompi ymmärtää
Hexsa luku on kuin kaksi eri osaa ylimmät 4 bitti ja alimmat 4 bittiä
yhteen lasku tosin tekee hommasta ööö hieman vaikeampaa siksi
meillä on Hex taulukot tai laskukoneet Ubuntussa esim. laskin asetuksista "view"
ohjelmointi moodiin niin vaihtamalla bin,hex,dec moodia käännös ilmaantuu

Hex taulukko löytyy melkein jokaisesta ohjelmointia käsittelevästä kirjasta
eikä ole vaikea tehdä itsekkään suosittelen lämpimästi taulukon pitämistä esillä

kaikkea en tähän saa nyt mahdutettua mutta muutama sana vielä käskyistä

Basic
a=1
a=a+1
poke 53280,a

assy
LDA käskyllä annetaan arvo rekisterille A
"load a"

LDA #$01 ;lataamme A rekisteriin arvon 1
CLC           ;C lippu on binääri rekisteri jolla voi olla arvo 0 tai 1
                    ; arvo on 0 jos laskennassa ei ole syntynyt ylivuotoa A>256
ADC #01   ; lisäämme A rekisterin arvoa 1
STA $D020 ;tulostamme yhteenlaskun tuloksen A rekisteristä taustavärin arvoksi (53280)

X Y rekistereillä ei tälläisiä laskuihin kykeneviä käskyjä ole

INX lisää X arvoa yhdellä ja DEX vähentää yhdellä sama toimii Y rekisterillä
näille rekistereillä on omat "lataus ja tulostus käskyt" jotka ovat identtisiä A rekisterin käytöstä

LDX
LDY
STX
STY

Y ja X rekistereitä voidaan käyttää A rekisterin jatkona
LDA $1000,X ; A=4096+X

Rekistereitä voidaan myös siirtää keskenään

TAX  ; X=A
TXA  ; A=X
TAY  ; Y=A

jos tarvitsee selittää pidemmälle niin kysy...
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

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

virgo

ahh..
nyt kun aamu koitti ja pääkin hieman enemmän toimii niin hokasin tuon raidoitus jutunkin xD

yksinkertaisin tapa tehdä lataus raidat... nyt olen ihan muistini varassa enkä tätä ehdi tarkistamaan
mutta joskun tuollaiset tein niin että lisäsin Brake rutiinin osoitetta
Nolla sivulla osoittamaan omaa rutiiniani ja sieltä oikeaan rutiiniin


BRAKE rutiinin hyppy osoite nollasivulla
0316-0317

jos oma rutiini on esim $C000 paikassa mikä on hyvä paikka assyohjelmille
olla Basic muuttujilta turvassa... niin

0316 =$00
0317 =$C0 "dec 192"

itse rutiini sijaitsee $FE66

itse raita ohjelma tässä pari eri versiota

VER.1
INC$ D020     ; sateenkaari raidat
JMP $FE66

VER.2
INC $D020     ; kaksivärinen raidoitus
DEC $D020
JMP $FE66

VER.3
LDA#6             ; sininen ja musta raidoitus
STA $D020
LDA#0
STA $D020
JMP $FE66
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

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

Jarskimo

#3
Kiitti, tulipa sinulte paljon tekstiä  ;D Latasin tuon ohjelman tuolta, täytyy perehtyä siihen ja tähän ohjeeseen paremmin kun on aikaa. Enköhän mä tällä pääse alkuun  8)

Edit. Totanoin, mites mä saan ton ohjelman toimimaan kuusnepalla? LOAD"*",8 komennolla ilmoittaa vaa että FILE NOT FOUND. Listauksella tuohon tulee monta riviä tiedostoja, millä sen saa sitten käynnistettyä  :-\

virgo

#4
ohjelmasta sen verran että

<- näppäin on avain kaikkeen
ihan muutama esim.

<- L =Load Assy
<- S =Save Assy
<- * =dir
<- 3 =käännä Assy ohjelma muistiin
<- 5 =käännetään objekti file levylle
<- D = mikä tahansa disk komento esim. s:ohjelma

itse assy ohjelmassa seuraava ohjelman pätkä tekee elämästä helpompaa
CTRL nappulan painaminen palauttaa takaisin Assy ohjelmaan

loop     lda#$ fb
             cmp$dc01
             bne loop
             jmp $8000 ; Vanhassa v1.0 versiossa $9000

ohjelma käyttää Basic ohjelman muuttuja rutiinia
eli mitä pidempi koodi sinulla on sen alemmaksi se ylettää ohjelmana $8000 osoitteesta alaspäin
sen hetkinen kohde näkyy editorin alalaidassa
$c000 aluetta ei voi käyttää koska ohjelma itse käyttää sitä
turvallinen alue on $0300-$6000
tämän voi kiertää siten että kääntää ohjelman muistin sijasta suoraan levylle
<- 5 ja annamme objektille nimen ja ohjelma tallentaa käännetyn ohjelman suoraan levylle
ja koodin paikkahan muistissa määritellään
*=$1000 komennolla editorissa

.Byte 0,0,0,0... <= 8bit dec lukuja hexat vaativat $ etumerkin % binääreihin
.Byte $0A,$0F
.Byte %00001111,%10101010
.Byte "A","B"

Word 16bit lukujen lisäys
.Word $1000,$2000,$0801

textin lisäys tai grafiikkamerkkien lisäys ohjelmaan
.Text "diibadaapa.. kivaa on"

ohjelmassa lukujen ym anto käskyille

LDA #01 <=Dec
LDA #$ 0F <=Hex
LDA $02    <=nollasivu osoitus
LDA #"A"   <= ASCI
                               
LDA $1000+40            ;=$1000+16=$1010
LDA $1000+$40          ;=$1000+$40=$1040
LDA $1000*2                ;=$1000x2= $2000
ja niin edelleen kuten Basic kielessäkin
Muuttujien nimeäminenkin on melkein kuin Basicissa

ruutu = $0400     
taustavari =$d020

lda #2                ;muutetaan taustaväri punaiseksi
sta taustavari
rts

simppeli sample ininä rutiini (ei ehkä toimi uusissa 6580 piireissä ?!?)

*=$1000

    sei                  ;kielletään IRQ keskeytykset
cm lda $d418  ;volume rekisteri Sid       A=Peek($d418)
    eor #$0F      ; kytketään volumi 15 tai nollaan yksinkertaisesti sanottuna käsky tekee invertin akun alimille 4 bitille
                           ; jotka sattumalta ovat Sidin volume rekisterin bitit 15 eri asentoa jos Lda antaa arvoksi 0
                           ; invertoidaan se 15 ja päin vastoin seuraavalla kerralla luvun ollessa 15 muutetaan se 0
    sta $d418     ;asetetaan uusi arvo     Poke $d418,A
    jsr tauko        ;hypätän pienelle loopille ja hidastetaan äänen taajuutta JSR = Gosub basikissa
    lda #$fb         ;A=$fb
    cmp$dc01    ;tarkastetaan onko CTRL painettuna    if peek($dc01)=A
    bne cm          ;ei ole jatketaan looppia                          Then cm
    cli                    ;palautetaan IRQ keskeytykset
    jmp$8000     ;hypätään takaisin assyyn   =goto

tauko
      ldx#0            ;x=0
de dex               ;pyöritään ympyrää kunnes X=0 ;x=x-1 tulos $ff,$fe,$fd....
      bne de         ;a<>0 then de
      rts                 ;palataan takaisin pää looppiin RTS=Return basicissa


jos jostain syystä lipsahdat takaisin basiciin
kirjoita SYS4096*8 ja palaat takaisin assyyn

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

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

Jarskimo

#5
Olisi kyllä ihan kiva jos vain saisi tuon ohleman toimimaan ensin. Kirjoitin tuon äsken tuohon edelliseen viestiin


Lainaus käyttäjältä: Jarskimo - tammikuu 13, 2012, 16:22
Edit. Totanoin, mites mä saan ton ohjelman toimimaan kuusnepalla? LOAD"*",8 komennolla ilmoittaa vaa että FILE NOT FOUND. Listauksella tuohon tulee monta riviä tiedostoja, millä sen saa sitten käynnistettyä  :-\

virgo

pakko myöntää että itse operoin edelleen versiolla 1.0
ja nyt oli pakko hieman katsoa miten tuo uusi versio toimii ja heti havaitsin
tiedoissani aukon

ensimmäisessä levy imagessa on läjä ohjelmia
mutta vain yksi niistä on tarkoitettu plankolle C64 koneelle
ja se on se TMP 1.2 kuvassa punasin viivoin merkattu
muut versiot ovat joko kahdelle koneelle tai muille erikoisuuksille esim. REU
kahden koneen versio esim tarkoittaa että voit ohjelmoida toisella
ja tuupata sen jälkeen ohjelma testikoneeseen ja ajaa sen saman tien
ohjeet löytyvät web sivulta

tämän pitäisi myös tukea .include komentoa jolla saa esim. Grafiikka fileet kohilleen ennen käynnistystä
nämä Objekt fileet ladataan muistiin ennen ohjelman käynnistystä ( en ole vielä itse testannut )
toinen erikoisuus on ohjelman käynnistys osoite on siirtynyt kilon verran alemmaksi
eli
Sys 4096*8 käynnistää ohjelman Load"tmp *",8,1 jälkeen (muista väli TMP_)
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

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

Jarskimo

Joo nyt sain pelittämään  :) Nyt alkaa ankara opettelu ja ihmetteleminen

virgo

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

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