6 global bnk2log,bnk2phy,hwl2phy,phy2log
12 ;----------------------------------------------------------------------
15 ; Common CAStart .. 0FFFF
16 ; Bank 0 00000 .. CAStart-1
22 ; Common 18000 .. 1BFFF BANK1
24 ; Bank 0 00000 .. 0BFFF 0
25 ; Bank 1 0C000 .. 17FFF 1*BNK_SIZE
26 ; Bank 2 1C000 .. 27FFF 2*BNK_SIZE + CMN_SIZE
27 ; Bank 3 28000 .. 33FFF 3*BNK_SIZE + CMN_SIZE
28 ; Bank n n*BNK_SIZE + (n < 2) ? 0 : CMN_SIZE
30 ;----------------------------------------------------------------------
39 ;--------------------------------------------------------------------
40 ; Return the BBR value for the given bank number
49 ret z ; Bank 0 is at physical address 0
55 mlt bc ; bank size * bank number
57 add a,10h ; add bank0 + common
65 ret z ; Bank 0 is at physical address 0
70 mlt bc ; bank size * bank number
94 ;--------------------------------------------------------------
99 ;out ahl: Phys. (linear) Address
111 ; address is in common
115 ld a,1 ; same as bank1
119 call bnk2log ; get address base
123 ;--------------------------------------------------------------
130 ; hl hhhhhhhhllllllll
133 ; OP: ahl = (a<<12) + (h<<8) + l
135 ;out ahl: Phys. (linear) Address
151 ;--------------------------------------------------------------
156 ; OP: ahl = (bankbase<<12) + (h<<8) + l
158 ;out ahl: Phys. (linear) Address
165 or 00fh ; log. addr in common1?
169 in0 a,(cbr) ; yes, cbr is address base
172 ld b,16 ; log. address in baked area?
177 in0 a,(bbr) ; yes, bbr is address base
184 pop bc ; bank part is 0, no translation
188 ;--------------------------------------------------------------
189 ; return logical bank 0 address for given physical address.
191 ; in: ahl: pyhsical addres (20 bit)
192 ; out hl: logical address.
193 ; logical address is in bank 0 or common, no bank number returned
212 ;--------------------------------------------------------------
213 ; Trampoline for routines in banked ram.
214 ; Switch stack pointer to "system" stack in top ram
246 pop de ;get ptr to 'function address' in de
249 push hl ;put return address on stack
256 cp high (bs$stack-bs$stack$size) ;link80 can't process this
257 jr nc,$ + 5 ;skip if stack allready in common bios ram
261 ld hl,bs$stack-bs$stack$size
267 jr c,$ + 5 ;skip if stack allready in common bios ram
271 push hl ;save user stack pointer
280 ld e,(hl) ;get 'function address'
283 push de ;put on (switched) stack
285 ld hl,(b0_save_af) ;get back users registers
308 ;====================================================================
312 ;--------------------------------------------------------------------
313 ; Return the BBR value for the given bank number
329 ld ix,bnktbl ;4 / 12 | 14
330 ld ($+3+2),a ;3 / 15 | 19
331 ld a,(ix+0) ;3 / 14 | 19
333 ret ;1 / 9 | 10 15 / 76|91
336 ld hl,bnktbl ;3 / 9 | 10
344 ret ;1 / 9 | 10 12 / 66|71
347 add a,low bnktbl ;2 / 6 | 7
350 adc a,high bnktbl ;2 / 6 | 7
354 ret ;1 / 9 | 10 11 / 61|67