diff --git a/6502.lua b/6502.lua index 0fe3a47..cf96fa2 100644 --- a/6502.lua +++ b/6502.lua @@ -572,7 +572,7 @@ local op_resolve = function(v) if type(v) == 'string' then v = symbols[v] end if type(v) ~= 'number' then error("unresolved symbol: " .. tostring(v)) end return v -end +end M.op_resolve = op_resolve local size_ref = function(v) if type(v) == 'string' then v=symbols[v] end diff --git a/samples/vcs2.l65 b/samples/vcs2.l65 index a2b059d..9f1fad8 100644 --- a/samples/vcs2.l65 +++ b/samples/vcs2.l65 @@ -1,6 +1,9 @@ require'vcs' #pragma encapsulate far farcall +#pragma encapsulate xsr xcall +#pragma add_opcode rtx imp +mappers.jmpfar=true mappers.F4() local bank_core,bank_fx = rom0,rom1 @@ -8,11 +11,19 @@ location(bank_core) @@main init() @_frame - overscan() vblank() screen_begin() far kernel screen_end() jmp _frame + overscan() vblank() screen_begin() + far kernel + sta WSYNC lda#0xaa sta COLUBK for i=1,10 do sta WSYNC end + xsr kernel2 + --lda#kernel2&0xff sta 0x8a lda#kernel2>>8 sta 0x8b jsr jmpfar + screen_end() + jmp _frame location(bank_fx) @@kernel - ldx#0xd0 @_loop sta WSYNC stx COLUBK dex bne _loop rts + ldx#0x50 @_loop sta WSYNC stx COLUBK dex bne _loop rts +@@kernel2 + ldx#0x50 @_loop sta WSYNC stx COLUBK dex bne _loop rtx --jmp rtsfar ; writebin(filename..'.bin') diff --git a/vcs.l65 b/vcs.l65 index fb8dd8f..fa0a7c3 100644 --- a/vcs.l65 +++ b/vcs.l65 @@ -182,6 +182,10 @@ screen_begin = function() lda#TV.TIM_KERNEL sta T1024T end screen_end = wait screen = function(f) screen_begin() if f then f() end screen_end() end +setptr = function(f) lda#op_resolve(f)&0xff sta mappers.tmp lda#op_resolve(f)>>8 sta mappers.tmp+1 end +xcall = function(f) setptr(f) jsr jmpfar end +rtximp = function() jmp rtsfar end + -- for mappers that swap banks in place -- call an asm function into another bank and generate the stubs if needed local far_stubs = {} _ENV.far_stubs=far_stubs @@ -205,7 +209,7 @@ farcall = function(dst) jsr far_stubs[dst][loc_src] end -mappers = {} +mappers = { tmp=0x8a } mappers['2K'] = function() rom0 = location(0xf800, 0xffff) @@ -221,12 +225,25 @@ end local bank_stubs = function(count, hotspot, entry) function switchrom(i) assert(i>=0 and i0 and bi or '')) + lda mappers.tmp+1 lsr lsr lsr lsr lsr tax + if mappers.noillegal then and 0x1000+hotspot,x else nop 0x1000+hotspot,x end + jmp (mappers.tmp) + local rtsfar = section("rtsfar"..(bi>0 and bi or '')) + tsx lda 2,x lsr lsr lsr lsr lsr tax + if mappers.noillegal then and 0x1000+hotspot,x else nop 0x1000+hotspot,x end + rts + if bi==0 then jmpfar0=jmpfar rtsfar0=rtsfar + else relate(jmpfar0, jmpfar) relate(rtsfar0, rtsfar) end + end end end mappers.FA = function() bank_stubs(3, 0xff8) end