oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 1 | ; |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 2 | ; Startup code for Contiki (Apple2 version) |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 3 | ; |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 4 | ; This must be the *first* file on the linker command line |
| 5 | ; |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 6 | |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame] | 7 | .export _exit |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 8 | .import zerobss, initlib, callmain, donelib |
| 9 | .import __STARTUP_RUN__, __BOOT_SIZE__ ; Linker generated |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 10 | .import __BSS_RUN__, __BSS_SIZE__ ; Linker generated |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 11 | .import __INIT_RUN__, __INIT_SIZE__ ; Linker generated |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 12 | .import __CODE_RUN__, __CODE_SIZE__ ; Linker generated |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 13 | .importzp sp |
oliverschmidt | 97e3957 | 2005-03-29 23:10:40 +0000 | [diff] [blame] | 14 | .linecont + |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 15 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 16 | ; ------------------------------------------------------------------------ |
| 17 | ; The executable header |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 18 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 19 | .segment "EXEHDR" |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 20 | |
oliverschmidt | 97e3957 | 2005-03-29 23:10:40 +0000 | [diff] [blame] | 21 | .word __STARTUP_RUN__ ; Start address |
| 22 | .word __BSS_RUN__ + __BOOT_SIZE__ + \ |
| 23 | __INIT_SIZE__ + __CODE_SIZE__ - \ |
| 24 | __STARTUP_RUN__ ; Size |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 25 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 26 | ; ------------------------------------------------------------------------ |
| 27 | ; Place the startup code in a special segment. |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 28 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 29 | .segment "STARTUP" |
oliverschmidt | 19032c6 | 2004-06-14 22:30:32 +0000 | [diff] [blame] | 30 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 31 | ; Forward control to the code in the "BOOT" segment |
oliverschmidt | 19032c6 | 2004-06-14 22:30:32 +0000 | [diff] [blame] | 32 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 33 | jmp __BSS_RUN__ |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 34 | |
| 35 | ; Avoid re-entrance of donelib. This is also the _exit entry |
| 36 | |
| 37 | _exit: ldx #$02 |
| 38 | : lda rvsave,x |
| 39 | sta $03F2,x |
| 40 | dex |
| 41 | bpl :- |
| 42 | |
| 43 | ; Switch in LC bank 2 for R/O |
| 44 | |
| 45 | bit $C080 |
| 46 | |
| 47 | ; Call module destructors |
| 48 | |
| 49 | jsr donelib |
| 50 | |
oliverschmidt | 6b49252 | 2005-04-17 15:38:36 +0000 | [diff] [blame^] | 51 | ; Switch in ROM |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 52 | |
oliverschmidt | 6b49252 | 2005-04-17 15:38:36 +0000 | [diff] [blame^] | 53 | bit $C082 |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 54 | |
| 55 | ; Back to DOS |
| 56 | |
| 57 | jmp $03D0 |
| 58 | |
| 59 | ; ------------------------------------------------------------------------ |
| 60 | ; The linker doesn't calculate where this code runs so it has to be PIC |
| 61 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 62 | .segment "BOOT" |
| 63 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 64 | ; Switch to 80 column mode |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 65 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 66 | .ifdef __APPLE2ENH__ |
| 67 | lda #$0D |
oliverschmidt | 0fc22c5 | 2004-07-14 12:03:09 +0000 | [diff] [blame] | 68 | jsr $C300 |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 69 | .endif |
oliverschmidt | 0fc22c5 | 2004-07-14 12:03:09 +0000 | [diff] [blame] | 70 | |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 71 | ; Setup the stack at HIMEM |
| 72 | |
| 73 | lda $73 |
| 74 | ldx $73+1 |
| 75 | sta sp |
| 76 | stx sp+1 |
| 77 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 78 | ; Save the original RESET vector |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 79 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 80 | ldx #$02 |
| 81 | : lda $03F2,x |
| 82 | sta rvsave,x |
| 83 | dex |
| 84 | bpl :- |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 85 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 86 | ; ProDOS TechRefMan, chapter 5.3.5: |
| 87 | ; "Your system program should place in the RESET vector the address of a |
| 88 | ; routine that ... closes the files." |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 89 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 90 | lda #<_exit |
| 91 | sta $03F2 |
| 92 | lda #>_exit |
| 93 | sta $03F3 |
| 94 | eor #$A5 |
| 95 | sta $03F4 |
| 96 | |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 97 | ; Switch in LC bank 2 for W/O |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 98 | |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 99 | bit $C081 |
| 100 | bit $C081 |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 101 | |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 102 | ; Set source start |
| 103 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 104 | lda #<(__BSS_RUN__ + __BOOT_SIZE__ + __INIT_SIZE__) |
| 105 | ldx #>(__BSS_RUN__ + __BOOT_SIZE__ + __INIT_SIZE__) |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 106 | sta $3C |
| 107 | stx $3D |
| 108 | |
| 109 | ; Set source end |
| 110 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 111 | lda #<(__BSS_RUN__ + __BOOT_SIZE__ + __INIT_SIZE__ + __CODE_SIZE__) |
| 112 | ldx #>(__BSS_RUN__ + __BOOT_SIZE__ + __INIT_SIZE__ + __CODE_SIZE__) |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 113 | sta $3E |
| 114 | stx $3F |
| 115 | |
| 116 | ; Set destination |
| 117 | |
| 118 | lda #<__CODE_RUN__ |
| 119 | ldx #>__CODE_RUN__ |
| 120 | sta $42 |
| 121 | stx $43 |
| 122 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 123 | ; Reset index and call MOVE to relocate the "CODE" segment |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 124 | |
| 125 | ldy #$00 |
| 126 | jsr $FE2C |
| 127 | |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 128 | ; Set source start |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 129 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 130 | lda #<(__BSS_RUN__ + __BOOT_SIZE__) |
| 131 | ldx #>(__BSS_RUN__ + __BOOT_SIZE__) |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 132 | sta $3C |
| 133 | stx $3D |
oliverschmidt | a330e33 | 2005-01-22 03:00:27 +0000 | [diff] [blame] | 134 | |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 135 | ; Set source end |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 136 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 137 | lda #<(__BSS_RUN__ + __BOOT_SIZE__ + __INIT_SIZE__) |
| 138 | ldx #>(__BSS_RUN__ + __BOOT_SIZE__ + __INIT_SIZE__) |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 139 | sta $3E |
| 140 | stx $3F |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 141 | |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 142 | ; Set destination |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 143 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 144 | lda #<__INIT_RUN__ |
| 145 | ldx #>__INIT_RUN__ |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 146 | sta $42 |
| 147 | stx $43 |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 148 | |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 149 | ; Reset index and call MOVE to relocate the "INIT" segment |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 150 | |
oliverschmidt | 67fa2ac | 2005-02-08 00:32:10 +0000 | [diff] [blame] | 151 | ldy #$00 |
oliverschmidt | d86377a | 2005-03-09 00:51:51 +0000 | [diff] [blame] | 152 | jsr $FE2C |
| 153 | |
| 154 | ; Switch in LC bank 2 for R/O |
| 155 | |
| 156 | bit $C080 |
| 157 | |
| 158 | ; Forward control to code in the "INIT" segment |
| 159 | |
| 160 | jmp init |
| 161 | |
| 162 | ; ------------------------------------------------------------------------ |
| 163 | ; The "INIT" segment will be overwritten by the heap |
| 164 | |
| 165 | .segment "INIT" |
| 166 | |
| 167 | ; Clear the BSS data (and thus overwrite the "BOOT" segment) |
| 168 | |
| 169 | init: jsr zerobss |
| 170 | |
| 171 | ; Call module constructors |
| 172 | |
| 173 | jsr initlib |
| 174 | |
| 175 | ; Push arguments and call main() |
| 176 | |
| 177 | jmp callmain |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 178 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 179 | ; ------------------------------------------------------------------------ |
| 180 | ; Data |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 181 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 182 | .data |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 183 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 184 | rvsave: .res 3 |