X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/ea5293bb6ce484bf1ec9ab70befe10c3a36a70c2..50f3b8f0cb6ccbdc5c1ea8f916f3d95b197d3d04:/cbios/mm.180?ds=inline diff --git a/cbios/mm.180 b/cbios/mm.180 index 8f63a2b..eb4135b 100644 --- a/cbios/mm.180 +++ b/cbios/mm.180 @@ -55,7 +55,21 @@ bnk2log: bnk2phy: - call bnk2log + push bc + ld c,a + ld a,h + and a,0f0h + cp CA*16 + ld a,c + pop bc + + jr c,b2p_banked + xor a ; address is in common + jr b2b_cont ; base is 0 +b2p_banked: + call bnk2log ; get address base +b2b_cont: + ; fall thru ;-------------------------------------------------------------- @@ -123,6 +137,85 @@ hl2p_x: ret ; +;-------------------------------------------------------------- +; Trampoline for routines in banked ram. +; Switch stack pointer to "system" stack in top ram +; Save cbar +; + extrn bs$stack + + cseg ; common! + + public _b0call +_b0call: + + ld (b0_save_hl),hl + ld (b0_save_de),de + push af + pop hl + ld (b0_save_af),hl + + pop de ;get ptr to 'function address' in de + ld hl,2 + add hl,de + push hl ;put return address on stack + + if 0 ; link80 + + ld hl,0 + add hl,sp ; + ld a,h + cp high (bs$stack-bs$stack$size) ;link80 can't process this + jr nc,$ + 5 ;skip if stack allready in common bios ram + + else + + ld hl,bs$stack-bs$stack$size + ld a,h + dec a + ld hl,0 + add hl,sp ; + cp h + jr c,$ + 5 ;skip if stack allready in common bios ram + endif + ld sp,bs$stack ; + + push hl ;save user stack pointer + in0 h,(cbar) ; + push hl ; + ld hl,b0c_ret + push hl + ld a,SYS$CBAR ; + out0 (cbar),a ; + ex de,hl ;ptr + ld e,(hl) ;get 'function address' + inc hl ; + ld d,(hl) ; + push de ;put on (switched) stack + + ld hl,(b0_save_af) ;get back users registers + push hl + pop af + ld de,(b0_save_de) + ld hl,(b0_save_hl) + ret ;go to function +b0c_ret: + ld (b0_save_hl),hl + + pop hl ; + out0 (cbar),h ; + pop hl ; + ld sp,hl ; + ld hl,(b0_save_hl) + ret ; + + +b0_save_hl: dw 0 +b0_save_de: dw 0 +b0_save_af: dw 0 + + + ;==================================================================== if 0