Implement more of the shim, it can assemble the test file sort of
[asxv5pxx.git] / asez80 / tez80l.asm
1         .title  EZ80 Banked .adl and .z80 Modes\r
2 \r
3         .sbttl  Memory Organization\r
4 \r
5         ;                111111111122222222223333333333444444444455555555556\r
6         ;       123456789012345678901234567890123456789012345678901234567890\r
7         ;\r
8         ;       --------------------    ADL_BANK_0      0x000000\r
9         ;       |                  |\r
10         ;       |                  |\r
11         ;       |                  |\r
12         ;       |                  |\r
13         ;       |                  |\r
14         ;       |                  |\r
15         ;       --------------------                    0x01FFFF\r
16         ;\r
17         ;       --------------------    Z80_BANK_02     0x020000\r
18         ;       |                  |\r
19         ;       |                  |\r
20         ;       |                  |\r
21         ;       --------------------                    0x02FFFF\r
22         ;\r
23         ;       --------------------            0x030000\r
24         ;       |      Unused      |\r
25         ;       --------------------            0x03FFFF\r
26         ;\r
27         ;       --------------------    Z80_BANK_04     0x040000\r
28         ;       |                  |\r
29         ;       |                  |\r
30         ;       |                  |\r
31         ;       --------------------                    0x04FFFF\r
32         ;\r
33         ;       --------------------            0x050000\r
34         ;       |      Unused      |            \r
35         ;       --------------------            0x05FFFF\r
36         ;\r
37         ;       --------------------    Z80_BANK_06     0x060000\r
38         ;       |                  |\r
39         ;       |                  |\r
40         ;       |                  |\r
41         ;       --------------------                    0x06FFFF\r
42         ;\r
43         ;       --------------------    ADL_BANK_1      0x048000\r
44         ;       |                  |\r
45         ;       |                  |\r
46         ;       |                  |\r
47         ;       ~                  ~\r
48         ;       ~                  ~\r
49         ;       |                  |\r
50         ;       |                  |\r
51         ;       |                  |\r
52         ;       --------------------                    0xFFFFFF\r
53         ;\r
54 \r
55         \r
56         .sbttl  Code Banks\r
57 \r
58         .Bank   ADL_BANK_0      (Base=0x000000, Size=0x020000)\r
59         .Bank   ADL_BANK_1      (Base=0x048000)\r
60 \r
61         .Bank   Z80_BANK_02     (Base=0x020000, Size=0x010000, FSFX=_02)\r
62         .Bank   Z80_BANK_04     (Base=0x040000, Size=0x010000, FSFX=_04)\r
63         .Bank   Z80_BANK_06     (Base=0x060000, Size=0x010000, FSFX=_06)\r
64 \r
65 \r
66         .sbttl  Code Areas\r
67 \r
68         .area   ADL_Sys_1       (rel,con,CSEG,Bank=ADL_BANK_0)\r
69         .area   ADL_Sys_2       (rel,con,CSEG,Bank=ADL_BANK_1)\r
70 \r
71         .area   Z80_Vm_0        (rel,con,CSEG,Bank=Z80_BANK_02)\r
72         .area   Z80_Vm_1        (rel,con,CSEG,Bank=Z80_BANK_04)\r
73         .area   Z80_Vm_2        (rel,con,CSEG,Bank=Z80_BANK_06)\r
74 \r
75 \r
76         .msb    2               ; select MSB as 3rd byte of address (0,1,[2],3)\r
77 \r
78 \r
79         .sbttl  Code in Area ADL_Sys_1\r
80 \r
81         ;*****-----*****-----*****-----******-----******-----*****\r
82         ;\r
83         ; Area: ADL_Sys_1\r
84         ;\r
85         ;*****-----*****-----*****-----******-----******-----*****\r
86 \r
87         .area   ADL_Sys_1\r
88         .adl                    ; ADL Memory Mode\r
89 \r
90 Sys_1:  ; Beginning Address of Area\r
91         ; Prepare mb for 'call'\r
92         ld      a,#>z80_0_sub   ; 3ER00\r
93         ld      mb,a            ; ED 6D\r
94 \r
95         ; call the 1st Z80 VM\r
96         call.is z80_0_sub       ; 49 CDr13s00\r
97 \r
98         ; Prepare mb for 'call'\r
99         ld      a,#>z80_1_sub   ; 3ER00\r
100         ld      mb,a            ; ED 6D\r
101 \r
102         ; call the 2nd Z80 VM\r
103         call.is z80_1_sub       ; 49 CDr13s00\r
104 \r
105         ; Prepare mb for 'call'\r
106         ld      a,#>z80_2_sub   ; 3ER00\r
107         ld      mb,a            ; ED 6D\r
108 \r
109         ; call the 3rd Z80 VM\r
110         call.is z80_2_sub       ; 49 CDr13s00\r
111 \r
112         ; call a routine in current bank\r
113         call    sys_1_sub       ; CDr20s00R00\r
114 \r
115         ; call a routine in other ADL bank\r
116         call    sys_2_sub       ; CDr20s00R00\r
117 \r
118 sys_1_sub:\r
119         ret                     ; C9\r
120 \r
121 \r
122         .sbttl  Code in Area Z80_Vm_1\r
123 \r
124         ;*****-----*****-----*****-----******-----******-----*****\r
125         ;\r
126         ; Area: Z80_Vm_0\r
127         ;\r
128         ;*****-----*****-----*****-----******-----******-----*****\r
129 \r
130         .area   Z80_Vm_0\r
131         .z80                    ; Z80 Memory Mode\r
132 \r
133 VM_0:   ; Beginning Address of Area\r
134         ; call a routine in the 1st ADL bank\r
135         call.il sys_1_sub       ; 52 CDr20s00R00\r
136 \r
137         ; call a routine in the 2nd ADL bank\r
138         call.il sys_2_sub       ; 52 CDr20s00R00\r
139 \r
140         ; call a routine in the current bank\r
141         call    z80_0_sub       ; CD*13n00\r
142 \r
143         ; call a routine in the other Z80 bank\r
144         ; *** PageX Link Error during linking ***\r
145         call    z80_1_sub       ; CD*13n00\r
146 \r
147         ; call a routine in the other Z80 bank\r
148         ; *** PageX Link Error during linking ***\r
149         call    z80_2_sub       ; CD*13n00\r
150 \r
151 z80_0_sub:\r
152         ret                     ; C9\r
153 \r
154         ; Prepare for a Linker PAGE Boundary Check\r
155         bytes = 0x010000 - (.-VM_0) - 3\r
156         .blkb   bytes\r
157         ; Instruction completely within PAGE\r
158         call    z80_0_sub       ; CD*13n00\r
159 \r
160 \r
161 \r
162         .sbttl  Code in Area Z80_Vm_1\r
163 \r
164         ;*****-----*****-----*****-----******-----******-----*****\r
165         ;\r
166         ; Area: Z80_Vm_1\r
167         ;\r
168         ;*****-----*****-----*****-----******-----******-----*****\r
169 \r
170         .area   Z80_Vm_1\r
171         .z80                    ; Z80 Memory Mode\r
172 \r
173 VM_1:   ; Beginning Address of Area\r
174         ; call a routine in the 1st ADL bank\r
175         call.il sys_1_sub       ; 52 CDr20s00R00\r
176 \r
177         ; call a routine in the 2nd ADL bank\r
178         call.il sys_2_sub       ; 52 CDr20s00R00\r
179 \r
180         ; call a routine in the other Z80 bank\r
181         ; *** PageX Link Error during linking ***\r
182         call    z80_0_sub       ; CD*13n00\r
183 \r
184         ; call a routine in the current bank\r
185         call    z80_1_sub       ; CD*13n00\r
186 \r
187         ; call a routine in the other Z80 bank\r
188         ; *** PageX Link Error during linking ***\r
189         call    z80_2_sub       ; CD*13n00\r
190 \r
191 z80_1_sub:\r
192         ret                     ; C9\r
193 \r
194         ; Prepare for a Linker PAGE Boundary Check\r
195         bytes = 0x010000 - (.-VM_1) - 2\r
196         .blkb   bytes\r
197         ; Last Byte of Address is outside PAGE\r
198         ; *** PageX Link Error during linking ***\r
199         ; *** Bank Size  Error during linking ***\r
200         call    z80_1_sub       ; CD*13n00\r
201 \r
202 \r
203 \r
204         .sbttl  Code in Area Z80_Vm_2\r
205 \r
206         ;*****-----*****-----*****-----******-----******-----*****\r
207         ;\r
208         ; Area: Z80_Vm_2\r
209         ;\r
210         ;*****-----*****-----*****-----******-----******-----*****\r
211 \r
212         .area   Z80_Vm_2\r
213         .z80                    ; Z80 Memory Mode\r
214 \r
215 VM_2:   ; Beginning Address of Area\r
216         ; call a routine in the 1st ADL bank\r
217         call.il sys_1_sub       ; 52 CDr20s00R00\r
218 \r
219         ; call a routine in the 2nd ADL bank\r
220         call.il sys_2_sub       ; 52 CDr20s00R00\r
221 \r
222         ; call a routine in the other Z80 bank\r
223         ; *** PageX Link Error during linking ***\r
224         call    z80_0_sub       ; CD*13n00\r
225 \r
226         ; call a routine in the other Z80 bank\r
227         ; *** PageX Link Error during linking ***\r
228         call    z80_1_sub       ; CD*13n00\r
229 \r
230         ; call a routine in the current Z80 bank\r
231         call    z80_2_sub       ; CD*13n00\r
232 \r
233 z80_2_sub:\r
234         ret                     ; C9\r
235 \r
236         ; Prepare for a Linker PAGE Boundary Check\r
237         bytes = 0x010000 - (.-VM_2) - 1\r
238         .blkb   bytes\r
239         ; Both Bytes of Address are outside PAGE\r
240         ; *** PageX Link Error during linking ***\r
241         ; *** Bank Size  Error during linking ***\r
242         call    z80_2_sub       ; CD*13n00\r
243 \r
244 \r
245 \r
246         .sbttl  Code in Area ADL_Sys_2\r
247 \r
248         ;*****-----*****-----*****-----******-----******-----*****\r
249         ;\r
250         ; Area: ADL_Sys_2\r
251         ;\r
252         ;*****-----*****-----*****-----******-----******-----*****\r
253 \r
254         .area   ADL_Sys_2\r
255         .adl                    ; ADL Memoy Mode\r
256 \r
257 Sys_2:  ; Beginning Address of Area\r
258         ; Prepare mb for 'call'\r
259         ld      a,#>z80_0_sub   ; 3ER00\r
260         ld      mb,a            ; ED 6D\r
261 \r
262         ; call the 1st Z80 VM\r
263         call.is z80_0_sub       ; 49 CDr13s00\r
264 \r
265         ; Prepare mb for 'call'\r
266         ld      a,#>z80_1_sub   ; 3ER00\r
267         ld      mb,a            ; ED 6D\r
268 \r
269         ; call the 2nd Z80 VM\r
270         call.is z80_1_sub       ; 49 CDr13s00\r
271 \r
272         ; Prepare mb for 'call'\r
273         ld      a,#>z80_2_sub   ; 3ER00\r
274         ld      mb,a            ; ED 6D\r
275 \r
276         ; call the 3rd Z80 VM\r
277         call.is z80_2_sub       ; 49 CDr13s00\r
278 \r
279         ; call a routine in current bank\r
280         call    sys_2_sub       ; CDr20s00R00\r
281 \r
282         ; call a routine in other ADL bank\r
283         call    sys_1_sub       ; CDr20s00R00\r
284 \r
285 sys_2_sub:\r
286         ret                     ; C9\r
287 \r
288 \r