1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-29 18:49:42 +00:00

Added working lazynes scroll.c

This commit is contained in:
jespergravgaard 2020-07-08 01:06:39 +02:00
parent a78ac24f81
commit 64db016dc2
12 changed files with 122 additions and 59 deletions

View File

@ -1,4 +1,4 @@
//KICKC FRAGMENT CACHE 160b017651 //KICKC FRAGMENT CACHE 160b015f22
//FRAGMENT vbuz1=vbuc1 //FRAGMENT vbuz1=vbuc1
lda #{c1} lda #{c1}
sta {z1} sta {z1}

View File

@ -1,9 +1,34 @@
//KICKC FRAGMENT CACHE 160b017651 //KICKC FRAGMENT CACHE 160b015f22
//FRAGMENT _deref_pbuc1=_inc__deref_pbuc1
inc {c1}
//FRAGMENT vbuz1=vbuc1 //FRAGMENT vbuz1=vbuc1
lda #{c1} lda #{c1}
sta {z1} sta {z1}
//FRAGMENT pbuc1_derefidx_vbuz1=_inc_pbuc1_derefidx_vbuz1
ldx {z1}
inc {c1},x
//FRAGMENT vbuz1=_inc_vbuz1
inc {z1}
//FRAGMENT pbuc1_derefidx_vbuaa=_inc_pbuc1_derefidx_vbuaa
tax
inc {c1},x
//FRAGMENT pbuc1_derefidx_vbuxx=_inc_pbuc1_derefidx_vbuxx
inc {c1},x
//FRAGMENT vbuaa=vbuc1
lda #{c1}
//FRAGMENT vbuaa=_inc_vbuaa
clc
adc #1
//FRAGMENT vbuxx=vbuc1
ldx #{c1}
//FRAGMENT vbuxx=_inc_vbuxx
inx
//FRAGMENT vbuyy=vbuc1
ldy #{c1}
//FRAGMENT pbuc1_derefidx_vbuyy=_inc_pbuc1_derefidx_vbuyy
tya
tax
inc {c1},x
//FRAGMENT vbuyy=_inc_vbuyy
iny
//FRAGMENT pbuz1=pbuc1 //FRAGMENT pbuz1=pbuc1
lda #<{c1} lda #<{c1}
sta {z1} sta {z1}
@ -45,8 +70,6 @@ lda {z2}
sta {z1} sta {z1}
lda {z2}+1 lda {z2}+1
sta {z1}+1 sta {z1}+1
//FRAGMENT vbuz1=_inc_vbuz1
inc {z1}
//FRAGMENT vbuz1_neq_vbuc1_then_la1 //FRAGMENT vbuz1_neq_vbuc1_then_la1
lda #{c1} lda #{c1}
cmp {z1} cmp {z1}
@ -255,12 +278,6 @@ tay
txa txa
and #{c1} and #{c1}
tay tay
//FRAGMENT vbuaa=vbuc1
lda #{c1}
//FRAGMENT vbuxx=vbuc1
ldx #{c1}
//FRAGMENT vbuyy=vbuc1
ldy #{c1}
//FRAGMENT vbuaa=pbuc1_derefidx_vbuxx //FRAGMENT vbuaa=pbuc1_derefidx_vbuxx
lda {c1},x lda {c1},x
//FRAGMENT vbuaa=pbuc1_derefidx_vbuyy //FRAGMENT vbuaa=pbuc1_derefidx_vbuyy
@ -1280,10 +1297,6 @@ ldy {z1}+1
//FRAGMENT vbuyy=vbuaa_band_vbuc1 //FRAGMENT vbuyy=vbuaa_band_vbuc1
and #{c1} and #{c1}
tay tay
//FRAGMENT vbuxx=_inc_vbuxx
inx
//FRAGMENT vbuyy=_inc_vbuyy
iny
//FRAGMENT vbuyy_neq_vbuc1_then_la1 //FRAGMENT vbuyy_neq_vbuc1_then_la1
cpy #{c1} cpy #{c1}
bne {la1} bne {la1}
@ -1601,9 +1614,6 @@ sta {c1},x
//FRAGMENT vbuaa_neq_vbuc1_then_la1 //FRAGMENT vbuaa_neq_vbuc1_then_la1
cmp #{c1} cmp #{c1}
bne {la1} bne {la1}
//FRAGMENT vbuaa=_inc_vbuaa
clc
adc #1
//FRAGMENT _deref_pbuc1=_deref_pbuc1_bor_vbuc2 //FRAGMENT _deref_pbuc1=_deref_pbuc1_bor_vbuc2
lda #{c2} lda #{c2}
ora {c1} ora {c1}
@ -1613,6 +1623,8 @@ lda #<{c2}
sta {c1} sta {c1}
lda #>{c2} lda #>{c2}
sta {c1}+1 sta {c1}+1
//FRAGMENT _deref_pbuc1=_inc__deref_pbuc1
inc {c1}
//FRAGMENT _deref_pbuc1_lt_vbuc2_then_la1 //FRAGMENT _deref_pbuc1_lt_vbuc2_then_la1
lda {c1} lda {c1}
cmp #{c2} cmp #{c2}
@ -8006,9 +8018,6 @@ ldy {z1}
lda {c1},y lda {c1},y
cmp #{c2} cmp #{c2}
beq {la1} beq {la1}
//FRAGMENT pbuc1_derefidx_vbuz1=_inc_pbuc1_derefidx_vbuz1
ldx {z1}
inc {c1},x
//FRAGMENT pbuc1_derefidx_vbuaa_eq_vbuc2_then_la1 //FRAGMENT pbuc1_derefidx_vbuaa_eq_vbuc2_then_la1
tay tay
lda {c1},y lda {c1},y
@ -8022,12 +8031,6 @@ beq {la1}
lda {c1},y lda {c1},y
cmp #{c2} cmp #{c2}
beq {la1} beq {la1}
//FRAGMENT pbuc1_derefidx_vbuxx=_inc_pbuc1_derefidx_vbuxx
inc {c1},x
//FRAGMENT pbuc1_derefidx_vbuyy=_inc_pbuc1_derefidx_vbuyy
tya
tax
inc {c1},x
//FRAGMENT vduz1=vduc1_plus_vbuz2 //FRAGMENT vduz1=vduc1_plus_vbuz2
lda {z2} lda {z2}
clc clc
@ -13791,9 +13794,6 @@ lda {z1}
sta {c1} sta {c1}
lda {z1}+1 lda {z1}+1
sta {c1}+1 sta {c1}+1
//FRAGMENT pbuc1_derefidx_vbuaa=_inc_pbuc1_derefidx_vbuaa
tax
inc {c1},x
//FRAGMENT vbuaa=vbuaa_bor_vbuc1 //FRAGMENT vbuaa=vbuaa_bor_vbuc1
ora #{c1} ora #{c1}
//FRAGMENT vbuz1=_deref_pbuz2_rol_1 //FRAGMENT vbuz1=_deref_pbuz2_rol_1

View File

@ -0,0 +1,13 @@
sta $fe
ora #$7f
bmi !+
lda #0
!:
sta $ff
clc
lda {m1}
adc $fe
sta {m1}
lda {m1}+1
adc $ff
sta {m1}+1

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickCLexer.g4 by ANTLR 4.7.2 // Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickCLexer.g4 by ANTLR 4.8
package dk.camelot64.kickc.parser; package dk.camelot64.kickc.parser;
@ -13,7 +13,7 @@ import org.antlr.v4.runtime.misc.*;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class KickCLexer extends Lexer { public class KickCLexer extends Lexer {
static { RuntimeMetaData.checkVersion("4.7.2", RuntimeMetaData.VERSION); } static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA; protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache = protected static final PredictionContextCache _sharedContextCache =

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickCParser.g4 by ANTLR 4.7.2 // Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 by ANTLR 4.8
package dk.camelot64.kickc.parser; package dk.camelot64.kickc.parser;
@ -13,7 +13,7 @@ import java.util.ArrayList;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class KickCParser extends Parser { public class KickCParser extends Parser {
static { RuntimeMetaData.checkVersion("4.7.2", RuntimeMetaData.VERSION); } static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA; protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache = protected static final PredictionContextCache _sharedContextCache =

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickCParser.g4 by ANTLR 4.7.2 // Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 by ANTLR 4.8
package dk.camelot64.kickc.parser; package dk.camelot64.kickc.parser;

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickCParser.g4 by ANTLR 4.7.2 // Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 by ANTLR 4.8
package dk.camelot64.kickc.parser; package dk.camelot64.kickc.parser;

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickCParser.g4 by ANTLR 4.7.2 // Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 by ANTLR 4.8
package dk.camelot64.kickc.parser; package dk.camelot64.kickc.parser;

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickCParser.g4 by ANTLR 4.7.2 // Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 by ANTLR 4.8
package dk.camelot64.kickc.parser; package dk.camelot64.kickc.parser;

View File

@ -41,6 +41,8 @@ void main() {
PPU->PPUCTRL = 0b10001000; PPU->PPUCTRL = 0b10001000;
// Enable sprite and tile rendering // Enable sprite and tile rendering
PPU->PPUMASK = 0b00011110; PPU->PPUMASK = 0b00011110;
// Reset scroll
scroll_x = scroll_y = 0;
// Execute lazynes main code // Execute lazynes main code
lnMain(); lnMain();
// Infinite loop // Infinite loop
@ -69,13 +71,18 @@ volatile char sync_mode;
// Signal when vblank occurs. The NMI sets this to zero. To wait for a vblank set this no non-zero and wait for it to become zero. // Signal when vblank occurs. The NMI sets this to zero. To wait for a vblank set this no non-zero and wait for it to become zero.
volatile char vblank_signal; volatile char vblank_signal;
// Scroll x-position
volatile char scroll_x;
// Scroll y-position
volatile char scroll_y;
// NMI Called when the PPU refreshes the screen (also known as the V-Blank period) // NMI Called when the PPU refreshes the screen (also known as the V-Blank period)
interrupt(hardware_stack) void vblank() { interrupt(hardware_stack) void vblank() {
// DMA transfer the entire sprite buffer to the PPU // DMA transfer the entire sprite buffer to the PPU
ppuSpriteBufferDmaTransfer(SPRITE_BUFFER); ppuSpriteBufferDmaTransfer(SPRITE_BUFFER);
// Set scroll // Set scroll
PPU->PPUSCROLL = 0; PPU->PPUSCROLL = scroll_x;
PPU->PPUSCROLL = 0; PPU->PPUSCROLL = scroll_y;
// count vblanks // count vblanks
vblank_count++; vblank_count++;
// send vblank signal // send vblank signal
@ -163,13 +170,14 @@ void lnPush(uword o, ubyte a, void* s) {
// x: New horizotnal scrolling offset in pixels, allowed range: [0..511] // x: New horizotnal scrolling offset in pixels, allowed range: [0..511]
// y: New vertical scrolling offset in pixels, allowed range: [0..479] // y: New vertical scrolling offset in pixels, allowed range: [0..479]
// //
// TODO: void lnScroll(uword x, uword y);
//
// remarks: // remarks:
// - If a SPR0HIT based splitscreen is used, the 1st call of lnScroll() sets // - If a SPR0HIT based splitscreen is used, the 1st call of lnScroll() sets
// the scrolling offsets of the area above the split and the 2nd call of // the scrolling offsets of the area above the split and the 2nd call of
// lnScroll() sets the scrolling offsets of the area below the split. // lnScroll() sets the scrolling offsets of the area below the split.
void lnScroll(uword x, uword y) {
scroll_x = <x;
scroll_y = <y;
}
// Add meta-sprite to display list // Add meta-sprite to display list
// p: Pointer to metasprite data // p: Pointer to metasprite data

View File

@ -55,24 +55,20 @@ enum { lfHor=64, lfVer=128, lfEnd=255 };
// Common offsets for lnPush() and lnList() // Common offsets for lnPush() and lnList()
enum { const uword lnNameTab0=0x2000, lnNameTab1=0x2400, lnNameTab2=0x2800, lnNameTab3=0x2C00,
lnNameTab0=0x2000, lnNameTab1=0x2400, lnNameTab2=0x2800, lnNameTab3=0x2C00,
lnAttrTab0=0x23C0, lnAttrTab1=0x27C0, lnAttrTab2=0x2BC0, lnAttrTab3=0x2FC0, lnAttrTab0=0x23C0, lnAttrTab1=0x27C0, lnAttrTab2=0x2BC0, lnAttrTab3=0x2FC0,
lnBackCol=0x3F00, lnBackCol=0x3F00,
lnChrPal0=0x3F01, lnChrPal1=0x3F05, lnChrPal2=0x3F09, lnChrPal3=0x3F0D, lnChrPal0=0x3F01, lnChrPal1=0x3F05, lnChrPal2=0x3F09, lnChrPal3=0x3F0D,
lnSprPal0=0x3F11, lnSprPal1=0x3F15, lnSprPal2=0x3F19, lnSprPal3=0x3F1D lnSprPal0=0x3F11, lnSprPal1=0x3F15, lnSprPal2=0x3F19, lnSprPal3=0x3F1D;
};
// Scroll background // Scroll background
// x: New horizotnal scrolling offset in pixels, allowed range: [0..511] // x: New horizotnal scrolling offset in pixels, allowed range: [0..511]
// y: New vertical scrolling offset in pixels, allowed range: [0..479] // y: New vertical scrolling offset in pixels, allowed range: [0..479]
//
// TODO: void lnScroll(uword x, uword y);
//
// remarks: // remarks:
// - If a SPR0HIT based splitscreen is used, the 1st call of lnScroll() sets // - If a SPR0HIT based splitscreen is used, the 1st call of lnScroll() sets
// the scrolling offsets of the area above the split and the 2nd call of // the scrolling offsets of the area above the split and the 2nd call of
// lnScroll() sets the scrolling offsets of the area below the split. // lnScroll() sets the scrolling offsets of the area below the split.
void lnScroll(uword x, uword y);
// Add meta-sprite to display list // Add meta-sprite to display list
// p: Pointer to metasprite data // p: Pointer to metasprite data

View File

@ -0,0 +1,46 @@
// lazyNES scroll demo
// lazyNES - As lazy as possible NES hardware support library for vbcc6502
// (happily cooperates with Shiru's famitone2 replay code)
// V1.0, 'Lazycow 2020
// Ported to KickC 2020 by Jesper Gravgaard
// Original Source VBCC alpha 2 http://www.ibaug.de/vbcc/vbcc6502_2.zip
#pragma target(nes)
#include "lazynes.h"
int lnMain() {
static const ubyte bgColors[]={45,33,2};
static const ubyte bubblesPal[]={ 0, 37,22,5, 0, 42,26,10, 0, 33,18,3 };
ubyte i;
uword hScroll=0;
sbyte hVel=0, hDir=1;
lnSync(lfBlank); // blank screen to enable lnPush() usage
lnPush(lnBackCol,3,bgColors); // set background colors
// draw some backgrounds
{ //
static const ubyte g1[]={1}, g2[]={2,3,4,5}, g3[]={6,7,8,9};
ubyte x;
// draw a line: Sprite #0 will be placed ontop later to trigger the split
i=2; for (x=0;x<32;x+=1) lnPush(lnNameTab0+((uword)i<<5)+x,1,g1);
// draw some diamond shapes
for (i=8;i<=24;i+=4) for (x=0;x<4;x+=1) {
lnPush(lnNameTab0+((uword)i<<5)+12+x*4,4,g2);
lnPush(lnNameTab0+32+((uword)i<<5)+12+x*4,4,g3);
}
}
lnSync(0);
for(;;) {
lnScroll(hScroll>>6,0); // set scrolling offsets of area below split
hVel+=hDir; if (hVel>64 || hVel<-64) hDir=-hDir;
hScroll+=hVel;
lnSync(0);
}
return 0;
}