From 3854283cfbd8eaaf20bbe536f64bbdb723ce4203 Mon Sep 17 00:00:00 2001
From: "ol.sc"
Date: Sat, 21 Jan 2012 13:05:26 +0000
Subject: [PATCH] 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
---
targetutil/apple2/loader.s | 106 ++++-------------------------------
targetutil/apple2/loader.txt | 83 +++++++++++++--------------
2 files changed, 50 insertions(+), 139 deletions(-)
diff --git a/targetutil/apple2/loader.s b/targetutil/apple2/loader.s
index ab4ae44e3..71d79140e 100644
--- a/targetutil/apple2/loader.s
+++ b/targetutil/apple2/loader.s
@@ -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
A1H := $3D
-HIMEM := $73
STACK := $0100
BUF := $0200
PATHNAME := $0280
-DOSWARM := $03D0
-DOSCOLD := $03D3
-SOFTEV := $03F2
-PWREDUP := $03F4
MLI := $BF00
-MEMTABL := $BF58
-RESET := $FA62
VERSION := $FBB3
RDKEY := $FD0C
PRBYTE := $FDDA
@@ -29,12 +22,12 @@ READ_CALL = $CA
CLOSE_CALL = $CC
FILE_NOT_FOUND_ERR = $46
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.import __CODE_0300_SIZE__, __DATA_0300_SIZE__
.import __CODE_0300_LOAD__, __CODE_0300_RUN__
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "DATA_2000"
@@ -64,7 +57,7 @@ LOADING:
ELLIPSES:
.byte " ...", $0D, $0D, $00
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "DATA_0300"
@@ -79,9 +72,6 @@ CLOSE_PARAM:
.byte $01 ;PARAM_COUNT
CLOSE_REF: .byte $00 ;REF_NUM
-
-.ifndef REBOOT
-
QUIT_PARAM:
.byte $04 ;PARAM_COUNT
.byte $00 ;QUIT_TYPE
@@ -89,8 +79,6 @@ QUIT_PARAM:
.byte $00 ;RESERVED
.word $0000 ;RESERVED
-.endif
-
FILE_NOT_FOUND:
.asciiz "... File Not Found"
@@ -100,7 +88,7 @@ ERROR_NUMBER:
PRESS_ANY_KEY:
.asciiz " - Press Any Key "
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "CODE_2000"
@@ -121,68 +109,6 @@ STARTUP:.res 65
dex
bne :-
-.ifndef REBOOT
-
- ; Jump to dispatcher on program exit
- ldy #$4C ; jmp
- lda #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
- 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
- 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
lda PATHNAME
sec
@@ -240,7 +166,7 @@ STARTUP:.res 65
; It's high time to leave this place
jmp __CODE_0300_RUN__
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "CODE_0300"
@@ -301,18 +227,8 @@ ERROR:
ldx #>PRESS_ANY_KEY
jsr PRINT
jsr RDKEY
-
-.ifndef REBOOT
-
-EXIT:
- ; Reset stack
- ldx #$FF
- txs
-
jsr MLI
.byte QUIT_CALL
.word QUIT_PARAM
-
-.endif
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
\ No newline at end of file
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/targetutil/apple2/loader.txt b/targetutil/apple2/loader.txt
index 62c75a46e..d3ec87266 100644
--- a/targetutil/apple2/loader.txt
+++ b/targetutil/apple2/loader.txt
@@ -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
----------
-The ordinary way to run a binary program using ProDOS 8 is to load BASIC.SYSTEM
-first and enter then from the BASIC prompt 'BRUN MYPROGRAM' or '- MYPROGRAM'.
+Apple][ ProDOS 8 system programs (filetype SYS) are always loaded into memory
+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.
-
-2. The size of BASIC.SYSTEM is 21 blocks while the size of LOADER.SYSTEM is
- only 1 block. The benefits are:
-
- - 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).
+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,
+which are loaded really fast. LOADER.SYSTEM can load cc65 programs into memory
+anywhere in the range $0800-$BB00 (44,75 kB).
Usage
-----
-Obviously LOADER.SYSTEM has to be told which binary program to run. As the
-ProDOS 8 dispatcher has no notion of system program parameters the ordinary
+Link the cc65 program to the start address $0803 (or any other address) and
+store it as binary program (filetype BIN). This is in fact no different from
+a binary program to be run by BASIC.SYSTEM's BRUN command in the usual way.
+
+If however the cc65 program isn't run by BASIC.SYSTEM but is rather run by
+LOADER.SYSTEM then it behaves like a system program which means:
+- 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 binary program to run.
+select the cc65 program to run.
-But to allow to select the binary program directly from the ProDOS 8 dispatcher
-anyway LOADER.SYSTEM detects the path to the binary program from its own path
-by just removing the '.SYSTEM' from its name. So if you want to run the binary
+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
being renamed to MYPROGRAM.SYSTEM.
-This means you'll end up with a copy of LOADER.SYSTEM for every binary program
-you intend to run it. But as LOADER.SYSTEM is a seedling file using up only a
-single block in the ProDOS 8 file system this should be no issue.
+This means you will end up with a copy of LOADER.SYSTEM for every cc65 program
+to be run by it. But as LOADER.SYSTEM is a ProDOS 8 seedling file using up only
+a single block in the ProDOS 8 file system this should be no issue.
Build
@@ -61,19 +61,14 @@ do so using the following commands:
ca65 loader.s
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
------------
-The file 'loader.system' as generated by the cc65 linker does NOT have a 4-byte
-address/length header as it is generated for ordinary Apple][ binaries. This is
-because the start address for ProDOS 8 system programs is fixed to $2000.
+The file 'loader.system' as generated by the cc65 linker with the command above
+does NOT include the 4-byte address/length header that is generated for Apple][
+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
a ProDOS 8 file system disk image is to use AppleCommander which is available at
--
2.39.5