1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-28 19:29:53 +00:00

Updated LOADER.SYSTEM to the current version targeted at cc65 binaries only.

git-svn-id: svn://svn.cc65.org/cc65/trunk@5417 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
ol.sc 2012-01-21 13:05:26 +00:00
parent 0a7981840b
commit 3854283cfb
2 changed files with 51 additions and 140 deletions

View File

@ -1,22 +1,15 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ; ; ;
; Apple][ ProDOS 8 system program for loading binary programs (Oliver Schmidt) ; ; LOADER.SYSTEM - an Apple][ ProDOS 8 loader for cc65 programs (Oliver Schmidt) ;
; ; ; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A1L := $3C A1L := $3C
A1H := $3D A1H := $3D
HIMEM := $73
STACK := $0100 STACK := $0100
BUF := $0200 BUF := $0200
PATHNAME := $0280 PATHNAME := $0280
DOSWARM := $03D0
DOSCOLD := $03D3
SOFTEV := $03F2
PWREDUP := $03F4
MLI := $BF00 MLI := $BF00
MEMTABL := $BF58
RESET := $FA62
VERSION := $FBB3 VERSION := $FBB3
RDKEY := $FD0C RDKEY := $FD0C
PRBYTE := $FDDA PRBYTE := $FDDA
@ -29,12 +22,12 @@ READ_CALL = $CA
CLOSE_CALL = $CC CLOSE_CALL = $CC
FILE_NOT_FOUND_ERR = $46 FILE_NOT_FOUND_ERR = $46
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.import __CODE_0300_SIZE__, __DATA_0300_SIZE__ .import __CODE_0300_SIZE__, __DATA_0300_SIZE__
.import __CODE_0300_LOAD__, __CODE_0300_RUN__ .import __CODE_0300_LOAD__, __CODE_0300_RUN__
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "DATA_2000" .segment "DATA_2000"
@ -64,7 +57,7 @@ LOADING:
ELLIPSES: ELLIPSES:
.byte " ...", $0D, $0D, $00 .byte " ...", $0D, $0D, $00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "DATA_0300" .segment "DATA_0300"
@ -79,9 +72,6 @@ CLOSE_PARAM:
.byte $01 ;PARAM_COUNT .byte $01 ;PARAM_COUNT
CLOSE_REF: .byte $00 ;REF_NUM CLOSE_REF: .byte $00 ;REF_NUM
.ifndef REBOOT
QUIT_PARAM: QUIT_PARAM:
.byte $04 ;PARAM_COUNT .byte $04 ;PARAM_COUNT
.byte $00 ;QUIT_TYPE .byte $00 ;QUIT_TYPE
@ -89,8 +79,6 @@ QUIT_PARAM:
.byte $00 ;RESERVED .byte $00 ;RESERVED
.word $0000 ;RESERVED .word $0000 ;RESERVED
.endif
FILE_NOT_FOUND: FILE_NOT_FOUND:
.asciiz "... File Not Found" .asciiz "... File Not Found"
@ -100,7 +88,7 @@ ERROR_NUMBER:
PRESS_ANY_KEY: PRESS_ANY_KEY:
.asciiz " - Press Any Key " .asciiz " - Press Any Key "
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "CODE_2000" .segment "CODE_2000"
@ -121,68 +109,6 @@ STARTUP:.res 65
dex dex
bne :- bne :-
.ifndef REBOOT
; Jump to dispatcher on program exit
ldy #$4C ; jmp
lda #<EXIT
ldx #>EXIT
sty DOSWARM
sta DOSWARM + 1
stx DOSWARM + 2
sty DOSCOLD
sta DOSCOLD + 1
stx DOSCOLD + 2
; Jump to dispatcher on RESET
sta SOFTEV
stx SOFTEV + 1
txa
eor #$A5
sta PWREDUP
.else
; Jump to RESET on program exit
ldy #$4C ; jmp
lda #<RESET
ldx #>RESET
sty DOSWARM
sta DOSWARM + 1
stx DOSWARM + 2
sty DOSCOLD
sta DOSCOLD + 1
stx DOSCOLD + 2
; Reboot on RESET
inc PWREDUP
.endif
; That's what it's all about !
lda #<MLI
ldx #>MLI
sta HIMEM
stx HIMEM + 1
; Overwrite the whole system bit map
ldx #($C0 / 8) - 1
; Set protection for pages $B8 - $BF
lda #%00000001
sta MEMTABL,x
dex
; Set protection for pages $08 - $B7
lda #%00000000
: sta MEMTABL,x
dex
bne :-
; Set protection for pages $00 - $07
lda #%11011111 ; include page $03
sta MEMTABL,x
; Remove ".SYSTEM" from pathname ; Remove ".SYSTEM" from pathname
lda PATHNAME lda PATHNAME
sec sec
@ -240,7 +166,7 @@ STARTUP:.res 65
; It's high time to leave this place ; It's high time to leave this place
jmp __CODE_0300_RUN__ jmp __CODE_0300_RUN__
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "CODE_0300" .segment "CODE_0300"
@ -301,18 +227,8 @@ ERROR:
ldx #>PRESS_ANY_KEY ldx #>PRESS_ANY_KEY
jsr PRINT jsr PRINT
jsr RDKEY jsr RDKEY
.ifndef REBOOT
EXIT:
; Reset stack
ldx #$FF
txs
jsr MLI jsr MLI
.byte QUIT_CALL .byte QUIT_CALL
.word QUIT_PARAM .word QUIT_PARAM
.endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -1,55 +1,55 @@
Apple][ ProDOS 8 system program for loading binary programs (Oliver Schmidt) LOADER.SYSTEM - an Apple][ ProDOS 8 loader for cc65 programs (Oliver Schmidt)
============================================================================ =============================================================================
Background Background
---------- ----------
The ordinary way to run a binary program using ProDOS 8 is to load BASIC.SYSTEM Apple][ ProDOS 8 system programs (filetype SYS) are always loaded into memory
first and enter then from the BASIC prompt 'BRUN MYPROGRAM' or '- MYPROGRAM'. starting at location $2000. This poses the problem of how to make efficient
use of the memory in the range $0800-$2000. The usual approach of relocation
has two downsides:
- Relocating e.g. 30 kB from $2000-$9800 to $0800-$8000 takes a considerable
amount of time.
- Really large programs just don't fit into memory when loaded starting at
location $2000.
Using LOADER.SYSTEM instead to run a binary program has four advantages: The relocation can be eliminated by loading the major part(s) of the program
from disk right to the final location by a rather small system program.
1. The binary program can be selected directly from the ProDOS 8 dispatcher. LOADER.SYSTEM is such a small program. In fact it's so small that it fits into
a single block in the ProDOS 8 file system making it a so-called seedling file,
2. The size of BASIC.SYSTEM is 21 blocks while the size of LOADER.SYSTEM is which are loaded really fast. LOADER.SYSTEM can load cc65 programs into memory
only 1 block. The benefits are: anywhere in the range $0800-$BB00 (44,75 kB).
- Running a binary program with LOADER.SYSTEM is faster.
- If the only use of BASIC.SYSTEM is to run binary programs it can be removed
altogether thus freeing up precious floppy disk space.
3. BASIC.SYSTEM can load binary programs into the range $0800-$9600 (35,5 kB)
while LOADER.SYSTEM can load much larger binary programs into the range
$0800-$BB00 (44,75 kB).
4. If a binary program needs to reclaim the memory used by BASIC.SYSTEM it has
to update the system bit map after being loaded and on exit it must call the
ProDOS 8 dispatcher itself. But when run by LOADER.SYSTEM the binary program
automatically has access to the range $0800-$BF00 (45,75 kB) just by checking
HIMEM. On exit the binary program simply jumps to DOSWARM or DOSCOLD as usual
which are set up by LOADER.SYSTEM to call the ProDOS 8 dispatcher (or reboot
the computer - see below).
Usage Usage
----- -----
Obviously LOADER.SYSTEM has to be told which binary program to run. As the Link the cc65 program to the start address $0803 (or any other address) and
ProDOS 8 dispatcher has no notion of system program parameters the ordinary store it as binary program (filetype BIN). This is in fact no different from
approach would have been to make LOADER.SYSTEM bring up yet another menu to a binary program to be run by BASIC.SYSTEM's BRUN command in the usual way.
select the binary program to run.
But to allow to select the binary program directly from the ProDOS 8 dispatcher If however the cc65 program isn't run by BASIC.SYSTEM but is rather run by
anyway LOADER.SYSTEM detects the path to the binary program from its own path LOADER.SYSTEM then it behaves like a system program which means:
by just removing the '.SYSTEM' from its name. So if you want to run the binary - It uses memory up to the ProDOS 8 system global page located at $BF00.
- It supports the ProDOS 8 startup file mechanism (mapped to argv[1]).
- It quits to the ProDOS 8 dispatcher.
Obviously LOADER.SYSTEM has to be told which cc65 program to run. Unfortunately
the ProDOS 8 dispatcher has no notion of system program parameters so the usual
approach would have been to make LOADER.SYSTEM bring up yet another menu to
select the cc65 program to run.
But to allow to select the cc65 program directly from the ProDOS 8 dispatcher
anyway LOADER.SYSTEM detects the path to the cc65 program from its own path by
just removing the '.SYSTEM' from its name. So if you want to run the cc65
program MYPROGRAM you'll need a copy of LOADER.SYSTEM in the same directory program MYPROGRAM you'll need a copy of LOADER.SYSTEM in the same directory
being renamed to MYPROGRAM.SYSTEM. being renamed to MYPROGRAM.SYSTEM.
This means you'll end up with a copy of LOADER.SYSTEM for every binary program This means you will end up with a copy of LOADER.SYSTEM for every cc65 program
you intend to run it. But as LOADER.SYSTEM is a seedling file using up only a to be run by it. But as LOADER.SYSTEM is a ProDOS 8 seedling file using up only
single block in the ProDOS 8 file system this should be no issue. a single block in the ProDOS 8 file system this should be no issue.
Build Build
@ -61,19 +61,14 @@ do so using the following commands:
ca65 loader.s ca65 loader.s
ld65 -C loader.cfg -o loader.system loader.o ld65 -C loader.cfg -o loader.system loader.o
If you want LOADER.SYSTEM to reboot the computer on exit of the binary program
instead of calling the ProDOS 8 dispatcher then use the following commands:
ca65 -D REBOOT loader.s
ld65 -C loader.cfg -o loader.system loader.o
Installation Installation
------------ ------------
The file 'loader.system' as generated by the cc65 linker does NOT have a 4-byte The file 'loader.system' as generated by the cc65 linker with the command above
address/length header as it is generated for ordinary Apple][ binaries. This is does NOT include the 4-byte address/length header that is generated for Apple][
because the start address for ProDOS 8 system programs is fixed to $2000. programs by default. This is because ProDOS 8 system programs are always loaded
into memory starting at location $2000.
The recommended way to transfer 'loader.system' from your native file system to The recommended way to transfer 'loader.system' from your native file system to
a ProDOS 8 file system disk image is to use AppleCommander which is available at a ProDOS 8 file system disk image is to use AppleCommander which is available at