]> git.sur5r.net Git - cc65/commitdiff
Updated LOADER.SYSTEM to the current version targeted at cc65 binaries only.
authorol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 21 Jan 2012 13:05:26 +0000 (13:05 +0000)
committerol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 21 Jan 2012 13:05:26 +0000 (13:05 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@5417 b7a2c559-68d2-44c3-8de9-860c34a00d81

targetutil/apple2/loader.s
targetutil/apple2/loader.txt

index ab4ae44e3aa74065a00a08e7a9b8af8a3a17f8a0..71d79140ea5ed9f897b7bb6d07740275956cb0e7 100644 (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
 A1H            := $3D
 
 A1L            := $3C
 A1H            := $3D
-HIMEM          := $73
 STACK          := $0100
 BUF            := $0200
 PATHNAME       := $0280
 STACK          := $0100
 BUF            := $0200
 PATHNAME       := $0280
-DOSWARM                := $03D0
-DOSCOLD                := $03D3
-SOFTEV         := $03F2
-PWREDUP                := $03F4
 MLI            := $BF00
 MLI            := $BF00
-MEMTABL                := $BF58
-RESET          := $FA62
 VERSION                := $FBB3
 RDKEY          := $FD0C
 PRBYTE         := $FDDA
 VERSION                := $FBB3
 RDKEY          := $FD0C
 PRBYTE         := $FDDA
@@ -29,12 +22,12 @@ READ_CALL      = $CA
 CLOSE_CALL        = $CC
 FILE_NOT_FOUND_ERR = $46
 
 CLOSE_CALL        = $CC
 FILE_NOT_FOUND_ERR = $46
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
        .import __CODE_0300_SIZE__, __DATA_0300_SIZE__
        .import __CODE_0300_LOAD__, __CODE_0300_RUN__
 
 
        .import __CODE_0300_SIZE__, __DATA_0300_SIZE__
        .import __CODE_0300_LOAD__, __CODE_0300_RUN__
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 .segment       "DATA_2000"
 
 
 .segment       "DATA_2000"
 
@@ -64,7 +57,7 @@ LOADING:
 ELLIPSES:
                .byte   " ...", $0D, $0D, $00
 
 ELLIPSES:
                .byte   " ...", $0D, $0D, $00
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 .segment       "DATA_0300"
 
 
 .segment       "DATA_0300"
 
@@ -79,9 +72,6 @@ CLOSE_PARAM:
                .byte   $01             ;PARAM_COUNT
 CLOSE_REF:     .byte   $00             ;REF_NUM
 
                .byte   $01             ;PARAM_COUNT
 CLOSE_REF:     .byte   $00             ;REF_NUM
 
-
-.ifndef                REBOOT
-
 QUIT_PARAM:
                .byte   $04             ;PARAM_COUNT
                .byte   $00             ;QUIT_TYPE
 QUIT_PARAM:
                .byte   $04             ;PARAM_COUNT
                .byte   $00             ;QUIT_TYPE
@@ -89,8 +79,6 @@ QUIT_PARAM:
                .byte   $00             ;RESERVED
                .word   $0000           ;RESERVED
 
                .byte   $00             ;RESERVED
                .word   $0000           ;RESERVED
 
-.endif
-
 FILE_NOT_FOUND:
                .asciiz "... File Not Found"
                                
 FILE_NOT_FOUND:
                .asciiz "... File Not Found"
                                
@@ -100,7 +88,7 @@ ERROR_NUMBER:
 PRESS_ANY_KEY:
                .asciiz " - Press Any Key "
 
 PRESS_ANY_KEY:
                .asciiz " - Press Any Key "
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 .segment       "CODE_2000"
 
 
 .segment       "CODE_2000"
 
@@ -121,68 +109,6 @@ STARTUP:.res       65
        dex
        bne     :-
 
        dex
        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
        lda     PATHNAME
        sec
        ; 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__
 
        ; It's high time to leave this place
        jmp     __CODE_0300_RUN__
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 .segment       "CODE_0300"
 
 
 .segment       "CODE_0300"
 
@@ -301,18 +227,8 @@ ERROR:
        ldx     #>PRESS_ANY_KEY
        jsr     PRINT
        jsr     RDKEY
        ldx     #>PRESS_ANY_KEY
        jsr     PRINT
        jsr     RDKEY
-
-.ifndef                REBOOT
-
-EXIT:
-       ; Reset stack
-       ldx     #$FF
-       txs
-
        jsr     MLI
        .byte   QUIT_CALL
        .word   QUIT_PARAM
        jsr     MLI
        .byte   QUIT_CALL
        .word   QUIT_PARAM
-       
-.endif
 
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
\ No newline at end of file
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
index 62c75a46e17f7cc49d5fc88cbccd5341e633dce3..d3ec87266fe3987882291a56fb68628b596c22d1 100644 (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
-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
 -----
 
 
 
 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
 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.
 
 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
+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
 ld65 -C loader.cfg -o loader.system loader.o
 
 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
 ------------
 
 
 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
 
 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