]> git.sur5r.net Git - cc65/blobdiff - libsrc/apple2/targetutil/loader.s
Don't save and restore the zero page locations used.
[cc65] / libsrc / apple2 / targetutil / loader.s
index 71d79140ea5ed9f897b7bb6d07740275956cb0e7..0173f6105b75b6c4e08e9b190642e3a77dc4376d 100644 (file)
 ;                                                                               ;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-A1L            := $3C
-A1H            := $3D
-STACK          := $0100
-BUF            := $0200
-PATHNAME       := $0280
-MLI            := $BF00
-VERSION                := $FBB3
-RDKEY          := $FD0C
-PRBYTE         := $FDDA
-COUT           := $FDED
-
-QUIT_CALL         = $65
+A1L             := $3C
+A1H             := $3D
+STACK           := $0100
+BUF             := $0200
+PATHNAME        := $0280
+MLI             := $BF00
+VERSION         := $FBB3
+RDKEY           := $FD0C
+PRBYTE          := $FDDA
+COUT            := $FDED
+
+QUIT_CALL          = $65
 GET_FILE_INFO_CALL = $C4
-OPEN_CALL         = $C8
-READ_CALL         = $CA
-CLOSE_CALL        = $CC
+OPEN_CALL          = $C8
+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__
+        .import __CODE_0300_SIZE__, __DATA_0300_SIZE__
+        .import __CODE_0300_LOAD__, __CODE_0300_RUN__
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-.segment       "DATA_2000"
+.segment        "DATA_2000"
 
 GET_FILE_INFO_PARAM:
-               .byte   $0A             ;PARAM_COUNT
-               .addr   PATHNAME        ;PATHNAME
-               .byte   $00             ;ACCESS
-               .byte   $00             ;FILE_TYPE
-FILE_INFO_ADDR:        .word   $0000           ;AUX_TYPE
-               .byte   $00             ;STORAGE_TYPE
-               .word   $0000           ;BLOCKS_USED
-               .word   $0000           ;MOD_DATE
-               .word   $0000           ;MOD_TIME
-               .word   $0000           ;CREATE_DATE
-               .word   $0000           ;CREATE_TIME
+                .byte   $0A             ;PARAM_COUNT
+                .addr   PATHNAME        ;PATHNAME
+                .byte   $00             ;ACCESS
+                .byte   $00             ;FILE_TYPE
+FILE_INFO_ADDR: .word   $0000           ;AUX_TYPE
+                .byte   $00             ;STORAGE_TYPE
+                .word   $0000           ;BLOCKS_USED
+                .word   $0000           ;MOD_DATE
+                .word   $0000           ;MOD_TIME
+                .word   $0000           ;CREATE_DATE
+                .word   $0000           ;CREATE_TIME
 
 OPEN_PARAM:
-               .byte   $03             ;PARAM_COUNT
-               .addr   PATHNAME        ;PATHNAME
-               .addr   MLI - 1024      ;IO_BUFFER
-OPEN_REF:      .byte   $00             ;REF_NUM
+                .byte   $03             ;PARAM_COUNT
+                .addr   PATHNAME        ;PATHNAME
+                .addr   MLI - 1024      ;IO_BUFFER
+OPEN_REF:       .byte   $00             ;REF_NUM
 
 LOADING:
-               .byte   $0D
-               .asciiz "Loading "
+                .byte   $0D
+                .asciiz "Loading "
 
 ELLIPSES:
-               .byte   " ...", $0D, $0D, $00
+                .byte   " ...", $0D, $0D, $00
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-.segment       "DATA_0300"
+.segment        "DATA_0300"
 
 READ_PARAM:
-               .byte   $04             ;PARAM_COUNT
-READ_REF:      .byte   $00             ;REF_NUM
-READ_ADDR:     .addr   $0000           ;DATA_BUFFER
-               .word   $FFFF           ;REQUEST_COUNT
-               .word   $0000           ;TRANS_COUNT
+                .byte   $04             ;PARAM_COUNT
+READ_REF:       .byte   $00             ;REF_NUM
+READ_ADDR:      .addr   $0000           ;DATA_BUFFER
+                .word   $FFFF           ;REQUEST_COUNT
+                .word   $0000           ;TRANS_COUNT
 
 CLOSE_PARAM:
-               .byte   $01             ;PARAM_COUNT
-CLOSE_REF:     .byte   $00             ;REF_NUM
+                .byte   $01             ;PARAM_COUNT
+CLOSE_REF:      .byte   $00             ;REF_NUM
 
 QUIT_PARAM:
-               .byte   $04             ;PARAM_COUNT
-               .byte   $00             ;QUIT_TYPE
-               .word   $0000           ;RESERVED
-               .byte   $00             ;RESERVED
-               .word   $0000           ;RESERVED
+                .byte   $04             ;PARAM_COUNT
+                .byte   $00             ;QUIT_TYPE
+                .word   $0000           ;RESERVED
+                .byte   $00             ;RESERVED
+                .word   $0000           ;RESERVED
 
 FILE_NOT_FOUND:
-               .asciiz "... File Not Found"
-                               
+                .asciiz "... File Not Found"
+                                
 ERROR_NUMBER:
-               .asciiz "... Error $"
+                .asciiz "... Error $"
 
 PRESS_ANY_KEY:
-               .asciiz " - Press Any Key "
+                .asciiz " - Press Any Key "
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-.segment       "CODE_2000"
-
-       jmp     :+
-       .byte   $EE
-       .byte   $EE
-       .byte   65
-STARTUP:.res   65
-
-       ; Reset stack
-:      ldx     #$FF
-       txs
-
-       ; Relocate CODE_0300 and DATA_0300
-       ldx     #<(__CODE_0300_SIZE__ + __DATA_0300_SIZE__)
-:      lda     __CODE_0300_LOAD__ - 1,x
-       sta     __CODE_0300_RUN__ - 1,x
-       dex
-       bne     :-
-
-       ; Remove ".SYSTEM" from pathname
-       lda     PATHNAME
-       sec
-       sbc     #.strlen(".SYSTEM")
-       sta     PATHNAME
-
-       ; Add trailing '\0' to pathname
-       tax
-       lda     #$00
-       sta     PATHNAME + 1,x
-
-       ; Copy ProDOS startup filename and trailing '\0' to stack
-       ldx     STARTUP
-       lda     #$00
-       beq     :++             ; bra
-:      lda     STARTUP + 1,x
-:      sta     STACK,x
-       dex
-       bpl     :--     
-
-       ; Provide some user feedback
-       lda     #<LOADING
-       ldx     #>LOADING
-       jsr     PRINT
-       lda     #<(PATHNAME + 1)
-       ldx     #>(PATHNAME + 1)
-       jsr     PRINT
-       lda     #<ELLIPSES
-       ldx     #>ELLIPSES
-       jsr     PRINT
-
-       jsr     MLI
-       .byte   GET_FILE_INFO_CALL
-       .word   GET_FILE_INFO_PARAM
-       bcc     :+
-       jmp     ERROR
-
-:      jsr     MLI
-       .byte   OPEN_CALL
-       .word   OPEN_PARAM
-       bcc     :+
-       jmp     ERROR
-
-       ; Copy file reference number
-:      lda     OPEN_REF
-       sta     READ_REF
-       sta     CLOSE_REF
-
-       ; Get load address from aux-type
-       lda     FILE_INFO_ADDR
-       ldx     FILE_INFO_ADDR + 1
-       sta     READ_ADDR
-       stx     READ_ADDR + 1
-
-       ; It's high time to leave this place
-       jmp     __CODE_0300_RUN__
+.segment        "CODE_2000"
+
+        jmp     :+
+        .byte   $EE
+        .byte   $EE
+        .byte   65
+STARTUP:.res    65
+
+        ; Reset stack
+:       ldx     #$FF
+        txs
+
+        ; Relocate CODE_0300 and DATA_0300
+        ldx     #<(__CODE_0300_SIZE__ + __DATA_0300_SIZE__)
+:       lda     __CODE_0300_LOAD__ - 1,x
+        sta     __CODE_0300_RUN__ - 1,x
+        dex
+        bne     :-
+
+        ; Remove ".SYSTEM" from pathname
+        lda     PATHNAME
+        sec
+        sbc     #.strlen(".SYSTEM")
+        sta     PATHNAME
+
+        ; Add trailing '\0' to pathname
+        tax
+        lda     #$00
+        sta     PATHNAME + 1,x
+
+        ; Copy ProDOS startup filename and trailing '\0' to stack
+        ldx     STARTUP
+        lda     #$00
+        beq     :++             ; bra
+:       lda     STARTUP + 1,x
+:       sta     STACK,x
+        dex
+        bpl     :--     
+
+        ; Provide some user feedback
+        lda     #<LOADING
+        ldx     #>LOADING
+        jsr     PRINT
+        lda     #<(PATHNAME + 1)
+        ldx     #>(PATHNAME + 1)
+        jsr     PRINT
+        lda     #<ELLIPSES
+        ldx     #>ELLIPSES
+        jsr     PRINT
+
+        jsr     MLI
+        .byte   GET_FILE_INFO_CALL
+        .word   GET_FILE_INFO_PARAM
+        bcc     :+
+        jmp     ERROR
+
+:       jsr     MLI
+        .byte   OPEN_CALL
+        .word   OPEN_PARAM
+        bcc     :+
+        jmp     ERROR
+
+        ; Copy file reference number
+:       lda     OPEN_REF
+        sta     READ_REF
+        sta     CLOSE_REF
+
+        ; Get load address from aux-type
+        lda     FILE_INFO_ADDR
+        ldx     FILE_INFO_ADDR + 1
+        sta     READ_ADDR
+        stx     READ_ADDR + 1
+
+        ; It's high time to leave this place
+        jmp     __CODE_0300_RUN__
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-.segment       "CODE_0300"
-
-       jsr     MLI
-       .byte   READ_CALL
-       .word   READ_PARAM
-       bcs     ERROR
-
-       jsr     MLI
-       .byte   CLOSE_CALL
-       .word   CLOSE_PARAM
-       bcs     ERROR
-
-       ; Copy REM token and startup filename to BASIC input buffer
-       ldx     #$00
-       lda     #$B2
-       bne     :++             ; bra
-:      inx
-       lda     a:STACK - 1,x
-:      sta     BUF,x
-       bne     :--
-       
-       ; Go for it ...
-       jmp     (READ_ADDR)
+.segment        "CODE_0300"
+
+        jsr     MLI
+        .byte   READ_CALL
+        .word   READ_PARAM
+        bcs     ERROR
+
+        jsr     MLI
+        .byte   CLOSE_CALL
+        .word   CLOSE_PARAM
+        bcs     ERROR
+
+        ; Copy REM token and startup filename to BASIC input buffer
+        ldx     #$00
+        lda     #$B2
+        bne     :++             ; bra
+:       inx
+        lda     a:STACK - 1,x
+:       sta     BUF,x
+        bne     :--
+        
+        ; Go for it ...
+        jmp     (READ_ADDR)
 
 PRINT:
-       sta     A1L
-       stx     A1H
-       ldx     VERSION
-       ldy     #$00
-:      lda     (A1L),y
-       beq     :++
-       cpx     #$06            ; //e ?
-       beq     :+
-       cmp     #$60            ; lowercase ?
-        bcc    :+
-        and    #$5F            ; -> uppercase
-:      ora     #$80
-       jsr     COUT
-       iny
-       bne     :--             ; bra
-:      rts
+        sta     A1L
+        stx     A1H
+        ldx     VERSION
+        ldy     #$00
+:       lda     (A1L),y
+        beq     :++
+        cpx     #$06            ; //e ?
+        beq     :+
+        cmp     #$60            ; lowercase ?
+        bcc     :+
+        and     #$5F            ; -> uppercase
+:       ora     #$80
+        jsr     COUT
+        iny
+        bne     :--             ; bra
+:       rts
 
 ERROR:
-       cmp     #FILE_NOT_FOUND_ERR
-       bne     :+
-       lda     #<FILE_NOT_FOUND
-       ldx     #>FILE_NOT_FOUND
-       jsr     PRINT
-       beq     :++             ; bra
-:      pha
-       lda     #<ERROR_NUMBER
-       ldx     #>ERROR_NUMBER
-       jsr     PRINT
-       pla
-       jsr     PRBYTE
-:      lda     #<PRESS_ANY_KEY
-       ldx     #>PRESS_ANY_KEY
-       jsr     PRINT
-       jsr     RDKEY
-       jsr     MLI
-       .byte   QUIT_CALL
-       .word   QUIT_PARAM
+        cmp     #FILE_NOT_FOUND_ERR
+        bne     :+
+        lda     #<FILE_NOT_FOUND
+        ldx     #>FILE_NOT_FOUND
+        jsr     PRINT
+        beq     :++             ; bra
+:       pha
+        lda     #<ERROR_NUMBER
+        ldx     #>ERROR_NUMBER
+        jsr     PRINT
+        pla
+        jsr     PRBYTE
+:       lda     #<PRESS_ANY_KEY
+        ldx     #>PRESS_ANY_KEY
+        jsr     PRINT
+        jsr     RDKEY
+        jsr     MLI
+        .byte   QUIT_CALL
+        .word   QUIT_PARAM
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;