comparison level2/modules/boot_rom.asm @ 0:6641a883d6b0

Initial revision
author boisy
date Thu, 04 Apr 2002 16:34:12 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:6641a883d6b0
1 ********************************************************************
2 * Boot - OS-9 Level Two ROM Boot module
3 *
4 * $Id$
5 *
6 * Ed. Comments Who YY/MM/DD
7 * ------------------------------------------------------------------
8 * 1 Created BGP 98/??/??
9
10 nam Boot
11 ttl OS-9 Level Two ROM Boot module
12
13 ifp1
14 use defsfile
15 endc
16
17 tylg set Systm+Objct
18 atrv set ReEnt+rev
19 rev set $01
20 edition set 1
21
22 mod eom,name,tylg,atrv,start,size
23
24 size equ .
25
26 name fcs /Boot/
27 fcb edition
28
29 start equ *
30 * obtain bootfile size at known offset
31 pshs u,y,x,a,b,cc
32 orcc #IntMasks mask interrupts
33
34 * allocate memory from system
35 * memory will start at $8000, blocks 1, 2, 3 and 3F
36 * we allocate $100 bytes more so that the memory will start
37 * exactly at $8000
38 ldd #$8000-$1300
39 os9 F$BtMem
40 bcs Uhoh
41
42 stu 3,s save pointer in X on stack
43 std 1,s save size in D on stack
44
45 * TRICK! Map block 4 into $4000, copy our special ROM copy code
46 * there, then jmp to it!
47 lda $FFA2
48 pshs a
49 lda #$04
50 sta $FFA2
51 ldd #RelCodeL code less than 256 bytes
52 leax RelCode,pcr
53 ldy #$4800
54 Copy lda ,x+
55 sta ,y+
56 decb
57 bne Copy
58
59 Jump jsr $4800 * jump to rel code
60 puls a restore original block at $4000
61 sta $FFA2
62
63 * Upon exit, we return to the kernel with:
64 * X = address of bootfile
65 * D = size of bootfile
66 * CC = carry cleared
67 ExitOK andcc #^Carry clear carry
68 Uhoh puls u,y,x,a,b,cc,pc
69
70
71 * this code executes at $4800
72 RelCode equ *
73 lda #$4E CC3 mode, MMU, 32K ROM
74 sta $FF90
75 sta $FFDE ROM/RAM mode
76
77 * Map ROM Blocks in
78 ldd #$3C3D
79 std $FFA4
80 lda #$3E
81 sta $FFA6
82
83 * Map block 1 at $6000
84 lda $FFA3
85 pshs a
86 lda #$01
87 sta $FFA3
88 * Copy first 8K of ROM
89 ldx #$8000
90 ldy #$6000
91 Loop1 ldd ,x++
92 std ,y++
93 cmpx #$A000
94 blt Loop1
95
96 * Map block 2 at $6000
97 lda #$02
98 sta $FFA3
99 * Copy second 8K of ROM
100 ldx #$A000
101 ldy #$6000
102 Loop2 ldd ,x++
103 std ,y++
104 cmpx #$C000
105 blt Loop2
106
107 * Map block 3 at $6000
108 lda #$03
109 sta $FFA3
110 * Copy third 8K of ROM
111 ldx #$C000
112 ldy #$6000
113 Loop3 ldd ,x++
114 std ,y++
115 cmpx #$E000
116 blt Loop3
117
118 * Copy remaining ROM area ($8000-$1400)
119 lda #$3F
120 sta $FFA3
121 ldx #$E000
122 ldy #$6000
123 Loop4 clr $FFDE put in ROM/RAM mode to get byte
124 ldd ,x++
125 clr $FFDF put back in RAM mode to store byte
126 std ,y++
127 cmpx #$EC00
128 blt Loop4
129 * ldx #$6000
130 * ldy #$E000
131 *Loop5 ldd ,x++
132 * std ,y++
133 * cmpx #$6C00
134 * blt Loop5
135
136 lda D.HINIT restore GIME HINIT value
137 sta $FF90
138 puls a restore org block at $6000
139 sta $FFA3
140 lda #$03
141 sta $FFA6
142 ldd #$0102
143 std $FFA4
144 rts
145
146 RelCodeL equ *-RelCode
147
148 * Fillers to get to $1D0
149 fcc /99999999999999999999999999999999999999999999999999/
150 * fcc /99999999999999999999999999999999999999999999999999/
151 * fcc /99999999999999999999999999999999999999999999999999/
152 fcc /99999999999999999999999999999999999999999999999999/
153 fcc /99999999999999999999999999999999999999999999999999/
154 fcc /99999999999999999999999999999999999999999999999999/
155 fcc /999999999999999999999999999999999999999999999999999/
156
157 emod
158 eom equ *
159 end