kleine asm-routine zur übung


kleine asm-routine zur übung

von robbifan » So 17. Jun 2007, 12:05
hallo, habe den atasm in betrieb.
finde den einstieg nicht.

wer kann mal den kopf so für den atasm schreiben, das ich diese routine einmal als bin einlesen kann in basic und einmal das es selbstartend ist über dos, bekomme ich nicht hin. die anderen befehle vom 6502 kenne ich.

die routine sollte mal einfach ein byte im screen schreiben.

danke.

mfg

von Heaven_tqa » So 17. Jun 2007, 21:07
also ATASM kenne ich nicht, aber probieren wir es mal so...

wenn eine routine über basic aufgerufen wird mit USR, dann musst du immer ein PLA am anfang setzten, welches die anzahl der parameter, welche im USR verwendet werden, vom stack holt...)

d.h. ich würde es so machen

org $0600 ; ist frei in basic

start pla
ldy #0
lda #1 ; entspricht "!"
sta (88),y ; screen vector in basic --> zeigt auf das vram
rts

in turbo basic würde ich das assemblierte file einfach per bload "d:filename.obj" laden und dann im gr.0 screen aufrufen per a=usr(1536). dann sollte das ! ganz links oben erscheinen...

falls ATASM kein dos ladbares file erzeugen kann, dann würde ich es so machen (auch turbo basic)

open #1,4,0,"d:filename.obj"
bget #1,$0600,256
...
fehlermeldung erscheint, weil datei kleiner ist als angegeben, egal
close #1
gr.0
a=usr($0600)

von HiassofT » So 17. Jun 2007, 23:36
Hi!

Ein einfaches Programm mit ATasm sieht in etwa so aus:
Code: Alles auswählen
START   = $0600

        .BANK
        * = START
        LDY #TEXTLEN-1
LOOP    LDA TEXT,Y
        STA (88),Y
        DEY
        BPL LOOP
X       JMP X
        ; JMP (10) ; back to dos
        ; PLA ; back to BASIC
        ; RTS

TEXT    .SBYTE "Hallo!"
TEXTLEN = * - TEXT

 ; startadresse für DOS .COM Files
        .BANK
        * = $02E0
        .WORD START


Das .BANK dient dazu, daß der ATasm die Blöcke in der Reihenfolge ins .COM File schreibt, wie sie im Source Code vorkommen (siehe Doku). Der 2. Block (an Adresse $02E0) ist die Start-Adresse. Dort hin springt DOS, wenn es das File fertig geladen hat. $02E2 wäre init, dorthin macht DOS sofort ein JSR wenn es das findet (damit kann man zB ein Titelbild wärend dem Laden anzeigen). Genau dafür ist nun das .BANK notwendig: ohne dem Befehlt schreibt ATasm zuerst den $02E2 Block (mit einem JSR nach $0600) und danach erst den $0600 Block mit dem Programm. Das würde dann schön crashen...

Wenn das Programm am Ende wieder zurück zu DOS soll, machst Du am besten ein JMP (10). Damit landest Du im DOS Menü. Ein RTS funktioniert meist nicht, da die meisten DOSse das Programm per JMP ($02E0) starten.

Unter Basic musst Du hingegen ein "PLA" "RTS" ans Ende setzen, dann kannst Du das Programm mit "USR(1536)" starten. PLA deshalb, weil Basic die Anzahl der übergebenen Parameter (16-bit Words) mit auf den Stack schreibt.

Ich hoffe, Du kommst einigermassen klar. Wenn Du ziemlich komplexen ATasm Code ansehen willst schau Dir zB den Source Code zum TurboFreezer oder zu MyPicoDos an (auf meiner Homepage).

Im Zweifelsfall frag' einfach hier im Forum nach :-)

so long,

Hias

von robbifan » So 17. Jun 2007, 23:53
he, danke.

wie werden die werte von einer usr-routine in asm aufgenommen zum weiterverarbeiten?

a=usr(adresse,wert1,wert2) > wie werden die in asm entgegengenommen?

mfg

von Heaven_tqa » Mo 18. Jun 2007, 21:34
a=usr(adresse,wert1,wert2,wert3)

org adresse

pla ; Anzahl der Parameter --> hier 3
pla ;hi byte von wert3
sta wert3+1
pla ;lo byte von wert3
sta wert3
pla ;hi von wert2
sta wert2+1
pla ;lo von wert2
sta wert2
pla ;hi von wert1
sta wert1+1
pla ;lo von wert1
sta wert1
...
rts

basic pusht die einzelnen variablenwerte auf den stack, d.h. erst lo wert1,hi wert1, lo wert 2 etc... zuletzt die anzahl der parameter.
daher musst du diese in umgekehrter reihenfolge vom stack holen...

von robbifan » Mo 18. Jun 2007, 22:02
hallo, danke, funktioniert gut.

mfg

von robbifan » Mi 8. Aug 2007, 23:13
hallo, bei turbobasic ist die reihenfolge andersherum habe ich jetzt festgestellt. der wert hinter der adresse wird als erster wert geholt usw.

a=usr($600,Horizontale Stelle,Buchstabe)

a=usr($600,0,33) ; Buchstabe "A"=33 an Stelle 0

Code: Alles auswählen
START   = $0600

   .BANK
        * = START

pla
pla ; hi
sta wert1hi ; Horizontale
pla ; lo
sta wert1lo

pla ; hi
sta wert2hi ; Buchstabe
pla ; lo
sta wert2lo

ldy wert1lo
lda wert2lo
sta (88),y

rts

wert1hi .BYTE 0
wert1lo .BYTE 0

wert2hi .BYTE 0
wert2lo .BYTE 0