X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/1d26b86661bff5609cb3ae4404a0208c1b651360..c5868b68107012ee3bd827de8229ecc1037b5b69:/cbios/mm.180 diff --git a/cbios/mm.180 b/cbios/mm.180 index 90d8144..9d1e256 100644 --- a/cbios/mm.180 +++ b/cbios/mm.180 @@ -137,6 +137,102 @@ 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: + push af + in0 a,(bbr) + jr nz,b0c_doit + pop af + + ex (sp),hl ;16 + push de + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld (b0c_fast_go),de + pop de + ex (sp),hl ;16 +b0c_fast_go equ $+1 + jp 0 + +b0c_doit: + ld (b0_save_hl),hl + ld (b0_save_de),de + 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,(bbr) ; + push hl ; + ld hl,b0c_ret + push hl + xor a + out0 (bbr),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 (bbr),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