Habe eine kleine ASM Routine geschrieben und möchte die nun gerne alls Data Zeilen in mein Basich Programm einbinden.
Nur ich steh auf den Schlauch , ich komm nicht darauf.Wie könnte ich das am besten lösen?
Geschrieben habe ich es mit C64Studio.
Es gibt 6 Antworten in diesem Thema, welches 1.121 mal aufgerufen wurde. Der letzte Beitrag (
Habe eine kleine ASM Routine geschrieben und möchte die nun gerne alls Data Zeilen in mein Basich Programm einbinden.
Nur ich steh auf den Schlauch , ich komm nicht darauf.Wie könnte ich das am besten lösen?
Geschrieben habe ich es mit C64Studio.
Bytebreaker hatte dazu vor ein paar Monaten ein tolles Script gebaut, wenn man Cross-Developing machen will und nicht auf Original Hardware programmiert.
Bitte melde dich an, um diesen Link zu sehen.
habe es nun mit c64 Studio probiert.
folgender Code funktioniert soweit wenn ich ihn compiliere und starte
!to "asm-routine.prg",cbm
* = $033c
sei
lda #<irq
sta $0314
lda #>irq
sta $0315
cli
rts
irq
lda #127
sta 37154
lda 37152
and #%10000000
bne weiter
lda #255
sta 37154
inc 36879
weiter
lda #%00010000
bit 37151
bne loop
dec 36879
loop
jmp $eabf
Alles anzeigen
Wenn ich nun mit c64 Studio die Data Zeilen generiere habe ich dann folgendes:
1 FORI=0TO47:READA:POKE828+I,A:NEXTI
10 DATA 60,3,120,169,73,141,20,3,169,3,141,21,3,88,96,169,127,141,34,145,173,32,145,41
20 DATA 128,208,8,169,255,141,34,145,238,15,144,169,16,44,31,145,208,3,206,15,144,76
30 DATA 191,234
Wenn ich aber mit sys 828 starte dann geht es nicht.
Wo mache ich was falsch ?
Die ersten beiden Bytes müssen weg.
![]()
Danke!! jetzt läufts!!
Aber warum die ersten 2 Bytes?
Edit: Startadresse????
Startadresse????
![]()
Habe speziell für den Zweck mal ein kleines C-Tool geschrieben (das Maschinenprogramm muss als .PRG vorliegen):
#include <stdio.h>
#include <inttypes.h>
#ifdef _WIN32
# include <io.h>
# include <fcntl.h>
# define SET_BINARY_MODE(stream) setmode(fileno(stream), O_BINARY)
#else
# define SET_BINARY_MODE(stream) ((void)0)
#endif
#define BUFSIZE 64*1024
unsigned char buf[BUFSIZE];
int main()
{
SET_BINARY_MODE(stdin);
SET_BINARY_MODE(stdout);
unsigned char addrbytes[2];
uint16_t startaddress;
if (fread(addrbytes, 1, 2, stdin)!=2)
{
fputs("Error reading start address\n", stderr);
return 1;
}
startaddress = addrbytes[1] << 8 | addrbytes[0];
size_t nread = fread(buf, 1, BUFSIZE, stdin);
if (!nread)
{
fputs("Error: couldn't read any data\n", stderr);
return 1;
}
size_t rembuf = BUFSIZE;
unsigned char *bufptr = buf;
size_t nchunk = nread;
while (nchunk && nchunk < rembuf)
{
bufptr += nchunk;
rembuf -= nchunk;
nchunk = fread(bufptr, 1, rembuf, stdin);
nread += nchunk;
}
uint16_t endaddress = startaddress + (uint16_t)nread - 1;
unsigned char *r = buf;
int remaining = 79 - printf("0 fora=%" PRIu16 "to%" PRIu16
":readb:pokea,b:next:sys%" PRIu16 ":data%u", startaddress,
endaddress, startaddress, (unsigned)*r++);
--nread;
int lineno = 0;
while (nread--)
{
int needed=2;
if (*r>9)++needed;
if (*r>99)++needed;
if (remaining - needed < 0)
{
++lineno;
remaining = 74-needed;
if (lineno>9) --remaining;
if (lineno>99) --remaining;
if (lineno>999) --remaining;
if (lineno>9999) --remaining;
printf("\n%d data%u", lineno, (unsigned)*r++);
}
else
{
remaining -= needed;
printf(",%u", (unsigned)*r++);
}
}
putchar('\n');
return 0;
}
Alles anzeigen
Das Ergebnis noch durch "petcat" schicken und gut ![]()