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 | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 8 | .export __heaporg, __heapptr, __heapend |
| 9 | .export __heapfirst, __heaplast |
| 10 | .import initlib, donelib |
| 11 | .import zerobss |
| 12 | .import __RAM_START__, __RAM_LAST__ ; Linker generated |
| 13 | .import callmain |
| 14 | .importzp sp |
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 | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 21 | .word __RAM_START__ ; Start address |
| 22 | .word __RAM_LAST__ - __RAM_START__ ; Size |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 23 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 24 | ; ------------------------------------------------------------------------ |
| 25 | ; Place the startup code in a special segment. |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 26 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 27 | .segment "STARTUP" |
oliverschmidt | 19032c6 | 2004-06-14 22:30:32 +0000 | [diff] [blame] | 28 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 29 | ; ProDOS TechRefMan, chapter 5.2.1: |
| 30 | ; "For maximum interrupt efficiency, a system program should not use more |
| 31 | ; than the upper 3/4 of the stack." |
oliverschmidt | 19032c6 | 2004-06-14 22:30:32 +0000 | [diff] [blame] | 32 | |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 33 | ldx #$FF |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 34 | txs ; Init stack pointer |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 35 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 36 | ; Switch to 80 column mode |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 37 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 38 | .ifdef __APPLE2ENH__ |
| 39 | lda #$0D |
oliverschmidt | 0fc22c5 | 2004-07-14 12:03:09 +0000 | [diff] [blame] | 40 | jsr $C300 |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 41 | .endif |
oliverschmidt | 0fc22c5 | 2004-07-14 12:03:09 +0000 | [diff] [blame] | 42 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 43 | ; Save the original RESET vector |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 44 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 45 | ldx #$02 |
| 46 | : lda $03F2,x |
| 47 | sta rvsave,x |
| 48 | dex |
| 49 | bpl :- |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 50 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 51 | ; ProDOS TechRefMan, chapter 5.3.5: |
| 52 | ; "Your system program should place in the RESET vector the address of a |
| 53 | ; routine that ... closes the files." |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 54 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 55 | lda #<_exit |
| 56 | sta $03F2 |
| 57 | lda #>_exit |
| 58 | sta $03F3 |
| 59 | eor #$A5 |
| 60 | sta $03F4 |
| 61 | |
| 62 | ; Switch in LC bank 2 for R/W |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 63 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 64 | bit $C083 |
| 65 | bit $C083 |
| 66 | |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 67 | ; Clear the BSS data (in LC bank 2) |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 68 | |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 69 | jsr zerobss |
| 70 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 71 | ; Setup the stack in LC bank 2 |
| 72 | |
| 73 | lda #$00 |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 74 | ldx #$E0 |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 75 | sta sp |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 76 | stx sp+1 |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 77 | |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 78 | ; Setup the heap end at HIMEM |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 79 | |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 80 | lda $73 |
| 81 | ldx $73+1 |
| 82 | sta __heapend |
| 83 | stx __heapend+1 |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 84 | |
| 85 | ; Call module constructors |
| 86 | |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 87 | jsr initlib |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 88 | |
| 89 | ; Push arguments and call main() |
| 90 | |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 91 | jsr callmain |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 92 | |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 93 | ; Avoid re-entrance of donelib. This is also the _exit entry |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 94 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 95 | _exit: ldx #$02 |
| 96 | : lda rvsave,x |
| 97 | sta $03F2,x |
| 98 | dex |
| 99 | bpl :- |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 100 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 101 | ; Call module destructors |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 102 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 103 | jsr donelib |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 104 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 105 | ; ProDOS TechRefMan, chapter 5.2.1: |
| 106 | ; "System programs should set the stack pointer to $FF at the warm-start |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 107 | ; entry point." |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 108 | |
oliverschmidt | 46ea673 | 2005-01-07 09:50:52 +0000 | [diff] [blame^] | 109 | ldx #$FF |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 110 | txs ; Re-init stack pointer |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 111 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 112 | ; Back to DOS |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 113 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 114 | jmp $03D0 |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 115 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 116 | ; ------------------------------------------------------------------------ |
| 117 | ; Data |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 118 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 119 | .data |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 120 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 121 | rvsave: .res 3 |
oliverschmidt | 3cf3d30 | 2004-06-08 20:28:33 +0000 | [diff] [blame] | 122 | |
oliverschmidt | 76872e8 | 2004-12-26 14:13:34 +0000 | [diff] [blame] | 123 | __heaporg: |
| 124 | .word __RAM_LAST__ ; Linker calculates this symbol |
| 125 | __heapptr: |
| 126 | .word __RAM_LAST__ ; Dito |
| 127 | __heapend: |
| 128 | .word 0 |
| 129 | __heapfirst: |
| 130 | .word 0 |
| 131 | __heaplast: |
| 132 | .word 0 |