There is less debugger-friendly way, but it is better by code size and poor by speed: _caller:: call banked_call .db __sdcc_bank_callee .dw _callee ... banked_call: in a,(BANK_PORT) ld -4(ix),a ex (sp),hl ld a,(hl) out (BANK_PORT),a inc hl ld c,(hl) inc hl ld b,(hl) inc hl ld -2(ix),l ld -1(ix),h ld hl,100$ ex (sp),hl push bc ret 100$: ld a,-4(ix) out (BANK_PORT),a ld c,-2(ix) ld b,-1(ix) push bc ret
Best regards, Sergey Belyashov сб, 7 марта 2020 г., 22:15 Sergey Belyashov <sergey.belyas...@gmail.com>: > Hi, > My project is used about 200 ROM pages and 33 RAM. So FUZIX solution is > not applicable for me. > > My suggestion: > 1. Any function which calls (caller) banked function (callee) must > initialize frame pointer and allocate 4 bytes at (ix-4)...(ix-1). > 2. To call generic callee caller must load bank address to BC register > pair and callee address to DE or IY, if _z88dk_fastcall support is required. > 3. Callee is generic function. Compiler may assign bank number to extra > global symbol (like: __sdcc_bank_<function_name>) while compiling (the > symbol villbe loaded to BC before calls). > 4. Callee is called as generic (near) function always within same code > section/area. > 5. Add optimization to compiler to replace calls to ABS address (n*8, n= > 0...7) by corresponding RST instruction (someone may want put banked_call > on one of RSTs). > > Example: > _caller:: > push ix > ld ix,0 > add ix,sp > ld hl,4 > add hl,sp > ld sp,hl > ... > ld bc,__sdcc_bank_callee > ld de,_callee > call banked_call > ... > > __sdcc_bank_callee equ 5 > _callee:: > ... > > banked_call:: > in a,(BANK_PORT) > ld -3(ix),a > ex de,hl > ex (sp),hl > ld -2(ix),l > ld -1(ix),h > ld hl,100$ > ex (sp),hl > ex de,hl > push de > ret > 100$: > ld a,-3(ix) > out (BANK_PORT),a > ld c,-2(ix) > ld b,-1(ix) > push bc > ret > > > Best regards, > Sergey Belyashov >
_______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user