| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
how do i load and run a program from another?
...have made a reader programm for my upcoming 1k game, now i want this reader to load the game and start it ! |
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
Fixup #$00
you can find here some fastloader sources, to be used in c64 turbo assembler.
Notice that the 1541 has an own cpu and memory, and all fastloader works with uploading code into the drive.
This means, that you have to call a install routine before you can use the loader.
check the sources, and the note on the disk, it should be self explanatory. |
| |
hannenz Account closed
Registered: Nov 2002 Posts: 24 |
if speed is not crucial you might want to just use the kernal-load routine:
lda #1
ldx #8
ldy #0 ;load
jsr $ffba ;setlfs
lda #fend-filename
ldx #<filename
ldy #>filename
jsr $ffbd ;setnam
lda #0 ;flag for 'load'
jsr $ffd5 ;kernal load routine
jmp startadress
filename .text "program"
fend
this will load just like ",8,1" at the BASIC prompt (to file adress)
then jump to that adress. (Well, won't work if loading overwrites your code, of course, you might put the small loader into some safe memory area...)
btw, trifox: i am very curious about your 1k-game developping!! go ahead!!! (we have a little 1k-game-competition at german forum-64.de btw...)
|
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
hi hannenz,
hmm i am using vice, what is the correct statement for filenames ?
!text ?
or
!scr
and the load adress is determined by the rom function through the *= statement at the beginning of each asm program ?!
somehow this routine does simply nothing .... i used it like this:
LOADER:
lda #1
ldx #8
ldy #0 ;load
jsr $ffba ;setlfs
lda #5
ldx #<filename
ldy #>filename
jsr $ffbd ;setnam
lda #0 ;flag for 'load'
jsr $ffd5 ;kernal load routine
jmp $0810
filename !text "spiel"
fend |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
if you're using turbo assembler in vice you should write .text
notice that .scr is most likely used for screen codes, and screen codes and petscii is two different codeset. .text gives you petscii codes, which you need in this case.
maybe the filename should be 4 "long"?
try to add the line as suggested: "lda #fend-filename"
check the track and drive led indicator in emulator. if the track is not on 18.0 when you start the code, and it goes to 18.0 afterwards and the led is flashing, you have a "?file not found error" :) |
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
aha, i have an file not found error ... ;)
how do i declare the filename ?
a)"spiel.prg"
b) "spiel"
or
c) "SPIEL"
or
d) "SPIEL.PRG"
the acme compiler knows the !pet statement, this should work i think |
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
help, it simply does not work, the lamp is blinking and 18 is standing there ... ;(((
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
the extension doesnt belongs to the filename string on c64, the type of the file (prg/seq/etc) is stored in the directory structure seperately.
try print asc("s") and the rest of the characters in c64 basic to find out the petscii codes, compare that to what acme compiled.
btw maybe I led you to a wrong path, blinking led singals any error, but if the track changes to 18.0 that means the drive understood the command, and is scanning the directory for the file, so it can find out the starting track/sector.
try to google for load with c64 kernal, maybe the example by hannenz has some bugs. |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: help, it simply does not work, the lamp is blinking and 18 is standing there ... ;(((
It sounds like you are running in vice with a d64-image, but the file is not actually on that image. Maybe you are auto starting from a .prg but have true drive emulation forced on?
Anyway, if you want it to work on a real c64 you'd better stick the files onto a d64 and run everything through the drive emulation. |
| |
Trifox Account closed
Registered: Mar 2006 Posts: 108 |
@all thx for helping
but i actually put it all on to a d64 image...:( |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
test your code with having ONLY the instructions needed to call the kernal load, and put an rts to the end. This makes sure you dont destroy the OS, and the rts will return you to the basic prompt.
(try to avoid using the common cross assembling method: prepacked code, the depacker might kill the OS, you may start your code with a SYS [decimalnumber] from the basic prompt)
then when u're back to the prompt enter this:
OPEN 15,8,15:INPUT #15,EN,EM$,ET,ES:PRINT EN,EM$,ET,ES:CLOSE
it will read and print the 1541 error channel for you, so you will get an exact description on what went wrong.
(en:error number, em$: error message, et: track, es: sector)
(edit: if you do some cruel thing under the memory area $400, you might destroy OS variables thats needed by kernal load to work correctly) |
... 4 posts hidden. Click here to view all posts.... |
Previous - 1 | 2 - Next |