From e07c87b45d13dd628cb4fa4710411acb70f2b5a9 Mon Sep 17 00:00:00 2001 From: g012 Date: Fri, 6 Oct 2017 00:26:16 +0200 Subject: [PATCH] Added vcs_flush.l65 logo sample. Fixed samepage bug when it ended on last instruction of section. --- .travis.yml | 6 +- 6502.lua | 2 +- samples/flush.png | Bin 0 -> 3725 bytes samples/flushbg.png | Bin 0 -> 3617 bytes samples/vcs1k.l65 | 35 --------- samples/vcs2.l65 | 31 -------- samples/vcs_banks.l65 | 43 +++++++++++ samples/{vcs0.l65 => vcs_basic.l65} | 0 samples/vcs_flush.l65 | 113 ++++++++++++++++++++++++++++ samples/{vcs1.l65 => vcs_hooks.l65} | 0 samples/vcspal.act | Bin 0 -> 768 bytes vcs.l65 | 8 +- vim/syntax/l65.vim | 4 + 13 files changed, 169 insertions(+), 73 deletions(-) create mode 100644 samples/flush.png create mode 100644 samples/flushbg.png delete mode 100644 samples/vcs1k.l65 delete mode 100644 samples/vcs2.l65 create mode 100644 samples/vcs_banks.l65 rename samples/{vcs0.l65 => vcs_basic.l65} (100%) create mode 100644 samples/vcs_flush.l65 rename samples/{vcs1.l65 => vcs_hooks.l65} (100%) create mode 100644 samples/vcspal.act diff --git a/.travis.yml b/.travis.yml index 2eed917..99efc26 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,9 +9,11 @@ script: - cmake . -DCMAKE_BUILD_TYPE=Release - make - cd samples - - ../l65 vcs0.l65 - - ../l65 vcs1.l65 + - ../l65 vcs_banks.l65 + - ../l65 vcs_basic.l65 + - ../l65 vcs_flush.l65 - ../l65 vcs_hello.l65 + - ../l65 vcs_hooks.l65 - cd .. deploy: provider: releases diff --git a/6502.lua b/6502.lua index a7a7a75..c0923c5 100644 --- a/6502.lua +++ b/6502.lua @@ -480,7 +480,7 @@ M.section = function(t) end for _,constraint in ipairs(self.constraints) do constraint.start = instructions[constraint.from].offset - constraint.finish = instructions[constraint.to].offset + constraint.finish = constraint.to==#instructions and self.size or instructions[constraint.to+1].offset end end return section diff --git a/samples/flush.png b/samples/flush.png new file mode 100644 index 0000000000000000000000000000000000000000..27f3a7b95092f9df61e78abbd468cbfcf717667f GIT binary patch literal 3725 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 UzqijI;LlktO>Ir8j6HAvA9SY$fdBvi literal 0 HcmV?d00001 diff --git a/samples/flushbg.png b/samples/flushbg.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4e332a47fb20d51bc5bd4f2c308a93be70b4ef GIT binary patch literal 3617 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 sta 0x8b jsr jmpfar - screen_end() - jmp _frame - -location(bank_fx) -@@kernel - 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') -writesym(filename..'.sym') -print(stats) diff --git a/samples/vcs_banks.l65 b/samples/vcs_banks.l65 new file mode 100644 index 0000000..d758dae --- /dev/null +++ b/samples/vcs_banks.l65 @@ -0,0 +1,43 @@ +require'vcs' -- import vcs.l65 +-- translate 'far x' to 'farcall(function() return x end)', farcall is defined in vcs.l65 +#pragma encapsulate far farcall +-- translate 'xsr x' to 'xcall(function() return x end)', xcall is defined in vcs.l65 +#pragma encapsulate xsr xcall +-- translate 'rtx' to 'rtximp()', rtximp is defined in vcs.l65 +#pragma add_opcode rtx imp + +-- enable generation of cross banks code sections using xsr/rtx method (3 MSB of address = bank index) +mappers.jmpfar=true +mappers.F8() -- use F8 (2 * 4Kb) bank mapper +local bank_core,bank_fx = rom0,rom1 -- bank name aliases + +-- main bank content +location(bank_core) +@@main + init() +@_frame + overscan() vblank() screen_begin() + -- call section 'kernel' in bank_fx using per-function generated stubs + far kernel + -- make a separation + sta WSYNC lda#0xaa sta COLUBK for i=1,10 do sta WSYNC end + -- call section 'kernel2' in bank_fx using shared stub with bank index in 3 MSB of address + xsr kernel2 + screen_end() + jmp _frame + +-- secondary bank content +location(bank_fx) +-- regular function, can be called inside the same bank with a jsr or from +-- another bank using automatic stubs generation for caller/callee pair +@@kernel + ldx#0x50 @_loop sta WSYNC stx COLUBK dex bne _loop rts +-- function only callable using xsr method, from any bank without additional +-- stub generation, but higher cycle count overhead +@@kernel2 + ldx#0x50 @_loop sta WSYNC stx COLUBK dex bne _loop rtx -- note the 'rtx' instead of 'rts'! + +; +writebin(filename..'.bin') +writesym(filename..'.sym') +print(stats) diff --git a/samples/vcs0.l65 b/samples/vcs_basic.l65 similarity index 100% rename from samples/vcs0.l65 rename to samples/vcs_basic.l65 diff --git a/samples/vcs_flush.l65 b/samples/vcs_flush.l65 new file mode 100644 index 0000000..a985b2e --- /dev/null +++ b/samples/vcs_flush.l65 @@ -0,0 +1,113 @@ +require'vcs' +mappers['4K']() + +local HEADER_LEN = 92 +local PICTURE_LEN = 64 +local STEP_COUNT = 32 + +-- FLUSH text as playfield +local logo_img = assert(l65.image("flush.png")) -- analyse the image twice, so load it separately +@@logo_col samepage byte(0x00, 0xd4, 0x72, linecol(logo_img)) end +local pfs = playfield(logo_img) +for i=1,#pfs do + local pf = pfs[i] + section("logo_pf"..(i-1)) samepage byte(0, pf[1], pf[#pf], pf) end +end +local LOGO_HEIGHT = #pfs[1] + +-- background +local bg = linecol("flushbg.png") +@@logo_bg_all +samepage + @logo_bg_pre for i=1,8 do dc.b bg[1] end + @logo_bg + for i=1,13 do dc.b bg[1] end + byte(bg) + for i=1,13 do dc.b bg[#bg] end + @logo_bg_post for i=1,8 do dc.b bg[#bg] end +end + +-- generate offset tables into logo_pf* +do + local DISP_HEIGHT = PICTURE_LEN + local transfo,bgshift = {},{} + for x=0,STEP_COUNT-1 do + local theta = x/(STEP_COUNT-1) * math.pi/2 - math.pi/4 + local s,c = math.sin(theta),math.cos(theta) + local ra,rb,rc,rd = -c, s-c, s+c, c + for y=0,DISP_HEIGHT-1 do + local r = DISP_HEIGHT / LOGO_HEIGHT + local yn = r * (2 * y/(DISP_HEIGHT-1) - 1) + local function f() + local y = (s-yn) / c + return math.min(math.floor((y+1)/2*LOGO_HEIGHT), LOGO_HEIGHT-1) + 3 + end + local v + if rd < rc then v = yn>rc and 0 or yn>rb and f(yn) or yn>ra and 2 or 0 + else v = yn>rd and 0 or yn>rc and 1 or yn>rb and f(yn) or 0 end + transfo[x*DISP_HEIGHT+DISP_HEIGHT-y] = v + end + bgshift[#bgshift+1] = math.floor(math.sin(math.pi+theta)*LOGO_HEIGHT/4) + end + @@logo_transfo byte(transfo) + @@logo_bgshift byte(bgshift) +end + +-- rotation anim +do + local PERIOD = 128 + local f = \x((math.sin(x*2*math.pi/PERIOD)+1)/2 * (STEP_COUNT-1)) + local rotation = {} + for x=1,128 do + rotation[#rotation+1] = math.floor(math.min(f(x-1), (STEP_COUNT-1))) + end + @@logo_rotation byte(rotation) +end + +local bg_ptr = 0x80 +local trans_ptr = 0x82 +local time = 0x84 +local tmp = 0x85 + +local on_vblank = function() + inc time asl time lsr time + ldy time lda logo_rotation,y sta tmp + + ldy tmp lda logo_bgshift,y sta bg_ptr + lda#logo_bg&0xff clc adc bg_ptr sta bg_ptr lda#logo_bg>>8 sta bg_ptr+1 + + setptr(logo_transfo, trans_ptr) + lda tmp asl asl asl asl asl asl clc adc trans_ptr sta trans_ptr + lda trans_ptr+1 adc#0 sta trans_ptr+1 + lda tmp lsr lsr clc adc trans_ptr+1 sta trans_ptr+1 + + ldy#PICTURE_LEN-1 lda (bg_ptr),y sta COLUBK +end + +local kernel = function() + ldy#HEADER_LEN @_header sta WSYNC dey bne _header + samepage @_line + lda (trans_ptr),y tax + lda (bg_ptr),y + sta WSYNC sta COLUBK + lda logo_col,x sta COLUPF + lda logo_pf0,x sta PF0 + lda logo_pf1,x sta PF1 + lda logo_pf2,x sta PF2 + lda logo_pf3,x sta PF0 + lda logo_pf4,x sta PF1 + lda logo_pf5,x sta PF2 + iny cpy#PICTURE_LEN bne _line + end + lda#0 sta WSYNC sta PF0 sta PF1 sta PF2 +end + +@@main + init() +@_frame + overscan() vblank(on_vblank) screen(kernel) jmp _frame + +; +writebin(filename..'.bin') +writesym(filename..'.sym') +print(stats) diff --git a/samples/vcs1.l65 b/samples/vcs_hooks.l65 similarity index 100% rename from samples/vcs1.l65 rename to samples/vcs_hooks.l65 diff --git a/samples/vcspal.act b/samples/vcspal.act new file mode 100644 index 0000000000000000000000000000000000000000..2acbddc085e84e4c432f6d06bfef0d13b762c07a GIT binary patch literal 768 zcmb8tk(w(p9ER~+#NtBmTtHzVcrIYzKw$7dp%55YSQrQl6bb_ifq{WSArL4m3={%| zfx>~n;6g4TaNf-w^nHH#hdkdCA%6N*YieC>tcBWI%e8v`#C@*?Mk8^y3SUm+elbXk zMP41s=JC4~Xx}Belfv<$F)arEVR8F*coYw_6BrtaX|E8hM*K8L7mK_&l!u4-`vTeT zpgtRDe}K7J*nbZ0JHVF+BVI7b9VXQv=mVm$NY){{fZ`)W%j;X&bx_A6^gP2{udp$~ zr39ZdjA&tHhfxhUYlmPwZg#=yR&0KQPzJAhz*{$=IR@vT+>7Frf1zH#!=y0 and x1>=x0 and x1 w and w-1 or o+7 local i,color = 7,0 for x=o,e do - if b[y*w+x] ~= 0 then color = color | 1</ syn match l65Opcode /\/ syn match l65Opcode /\/ +" These are only if defined by user for VCS cross bank calls. +" Remove these lines if desired. syn match l65Opcode /\/ +syn match l65Opcode /\/ +syn match l65Opcode /\/ " Define the default highlighting. " For version 5.7 and earlier: only when not done already