]> git.sur5r.net Git - cc65/blob - libsrc/apple2/targetutil/loader.s
Added support for building targetutils.
[cc65] / libsrc / apple2 / targetutil / loader.s
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;                                                                               ;
3 ; LOADER.SYSTEM - an Apple][ ProDOS 8 loader for cc65 programs (Oliver Schmidt) ;
4 ;                                                                               ;
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
7 A1L             := $3C
8 A1H             := $3D
9 STACK           := $0100
10 BUF             := $0200
11 PATHNAME        := $0280
12 MLI             := $BF00
13 VERSION         := $FBB3
14 RDKEY           := $FD0C
15 PRBYTE          := $FDDA
16 COUT            := $FDED
17
18 QUIT_CALL          = $65
19 GET_FILE_INFO_CALL = $C4
20 OPEN_CALL          = $C8
21 READ_CALL          = $CA
22 CLOSE_CALL         = $CC
23 FILE_NOT_FOUND_ERR = $46
24
25 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26
27         .import __CODE_0300_SIZE__, __DATA_0300_SIZE__
28         .import __CODE_0300_LOAD__, __CODE_0300_RUN__
29
30 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31
32 .segment        "DATA_2000"
33
34 GET_FILE_INFO_PARAM:
35                 .byte   $0A             ;PARAM_COUNT
36                 .addr   PATHNAME        ;PATHNAME
37                 .byte   $00             ;ACCESS
38                 .byte   $00             ;FILE_TYPE
39 FILE_INFO_ADDR: .word   $0000           ;AUX_TYPE
40                 .byte   $00             ;STORAGE_TYPE
41                 .word   $0000           ;BLOCKS_USED
42                 .word   $0000           ;MOD_DATE
43                 .word   $0000           ;MOD_TIME
44                 .word   $0000           ;CREATE_DATE
45                 .word   $0000           ;CREATE_TIME
46
47 OPEN_PARAM:
48                 .byte   $03             ;PARAM_COUNT
49                 .addr   PATHNAME        ;PATHNAME
50                 .addr   MLI - 1024      ;IO_BUFFER
51 OPEN_REF:       .byte   $00             ;REF_NUM
52
53 LOADING:
54                 .byte   $0D
55                 .asciiz "Loading "
56
57 ELLIPSES:
58                 .byte   " ...", $0D, $0D, $00
59
60 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61
62 .segment        "DATA_0300"
63
64 READ_PARAM:
65                 .byte   $04             ;PARAM_COUNT
66 READ_REF:       .byte   $00             ;REF_NUM
67 READ_ADDR:      .addr   $0000           ;DATA_BUFFER
68                 .word   $FFFF           ;REQUEST_COUNT
69                 .word   $0000           ;TRANS_COUNT
70
71 CLOSE_PARAM:
72                 .byte   $01             ;PARAM_COUNT
73 CLOSE_REF:      .byte   $00             ;REF_NUM
74
75 QUIT_PARAM:
76                 .byte   $04             ;PARAM_COUNT
77                 .byte   $00             ;QUIT_TYPE
78                 .word   $0000           ;RESERVED
79                 .byte   $00             ;RESERVED
80                 .word   $0000           ;RESERVED
81
82 FILE_NOT_FOUND:
83                 .asciiz "... File Not Found"
84                                 
85 ERROR_NUMBER:
86                 .asciiz "... Error $"
87
88 PRESS_ANY_KEY:
89                 .asciiz " - Press Any Key "
90
91 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
92
93 .segment        "CODE_2000"
94
95         jmp     :+
96         .byte   $EE
97         .byte   $EE
98         .byte   65
99 STARTUP:.res    65
100
101         ; Reset stack
102 :       ldx     #$FF
103         txs
104
105         ; Relocate CODE_0300 and DATA_0300
106         ldx     #<(__CODE_0300_SIZE__ + __DATA_0300_SIZE__)
107 :       lda     __CODE_0300_LOAD__ - 1,x
108         sta     __CODE_0300_RUN__ - 1,x
109         dex
110         bne     :-
111
112         ; Remove ".SYSTEM" from pathname
113         lda     PATHNAME
114         sec
115         sbc     #.strlen(".SYSTEM")
116         sta     PATHNAME
117
118         ; Add trailing '\0' to pathname
119         tax
120         lda     #$00
121         sta     PATHNAME + 1,x
122
123         ; Copy ProDOS startup filename and trailing '\0' to stack
124         ldx     STARTUP
125         lda     #$00
126         beq     :++             ; bra
127 :       lda     STARTUP + 1,x
128 :       sta     STACK,x
129         dex
130         bpl     :--     
131
132         ; Provide some user feedback
133         lda     #<LOADING
134         ldx     #>LOADING
135         jsr     PRINT
136         lda     #<(PATHNAME + 1)
137         ldx     #>(PATHNAME + 1)
138         jsr     PRINT
139         lda     #<ELLIPSES
140         ldx     #>ELLIPSES
141         jsr     PRINT
142
143         jsr     MLI
144         .byte   GET_FILE_INFO_CALL
145         .word   GET_FILE_INFO_PARAM
146         bcc     :+
147         jmp     ERROR
148
149 :       jsr     MLI
150         .byte   OPEN_CALL
151         .word   OPEN_PARAM
152         bcc     :+
153         jmp     ERROR
154
155         ; Copy file reference number
156 :       lda     OPEN_REF
157         sta     READ_REF
158         sta     CLOSE_REF
159
160         ; Get load address from aux-type
161         lda     FILE_INFO_ADDR
162         ldx     FILE_INFO_ADDR + 1
163         sta     READ_ADDR
164         stx     READ_ADDR + 1
165
166         ; It's high time to leave this place
167         jmp     __CODE_0300_RUN__
168
169 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
170
171 .segment        "CODE_0300"
172
173         jsr     MLI
174         .byte   READ_CALL
175         .word   READ_PARAM
176         bcs     ERROR
177
178         jsr     MLI
179         .byte   CLOSE_CALL
180         .word   CLOSE_PARAM
181         bcs     ERROR
182
183         ; Copy REM token and startup filename to BASIC input buffer
184         ldx     #$00
185         lda     #$B2
186         bne     :++             ; bra
187 :       inx
188         lda     a:STACK - 1,x
189 :       sta     BUF,x
190         bne     :--
191         
192         ; Go for it ...
193         jmp     (READ_ADDR)
194
195 PRINT:
196         sta     A1L
197         stx     A1H
198         ldx     VERSION
199         ldy     #$00
200 :       lda     (A1L),y
201         beq     :++
202         cpx     #$06            ; //e ?
203         beq     :+
204         cmp     #$60            ; lowercase ?
205         bcc     :+
206         and     #$5F            ; -> uppercase
207 :       ora     #$80
208         jsr     COUT
209         iny
210         bne     :--             ; bra
211 :       rts
212
213 ERROR:
214         cmp     #FILE_NOT_FOUND_ERR
215         bne     :+
216         lda     #<FILE_NOT_FOUND
217         ldx     #>FILE_NOT_FOUND
218         jsr     PRINT
219         beq     :++             ; bra
220 :       pha
221         lda     #<ERROR_NUMBER
222         ldx     #>ERROR_NUMBER
223         jsr     PRINT
224         pla
225         jsr     PRBYTE
226 :       lda     #<PRESS_ANY_KEY
227         ldx     #>PRESS_ANY_KEY
228         jsr     PRINT
229         jsr     RDKEY
230         jsr     MLI
231         .byte   QUIT_CALL
232         .word   QUIT_PARAM
233
234 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;