base:8x8-plasma-optimized-codegen
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | base:8x8-plasma-optimized-codegen [2015-04-17 04:30] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== 8x8 Plasma w/ Optimized Speedcode Generator ====== | ||
+ | |||
+ | < | ||
+ | // | ||
+ | // 8x8 Plasma Crap w/ Optimized Speedcode Generator | ||
+ | // For Codebase64 | ||
+ | // By Cruzer/CML 2009 | ||
+ | // Asm: KickAss 3.1 | ||
+ | // | ||
+ | // memory... | ||
+ | .var plasmaCnt = $02 | ||
+ | .var add = $04 | ||
+ | .var codePnt = $05 | ||
+ | .var xPos = $07 | ||
+ | .var yPos = $08 | ||
+ | .var pSine = $09 | ||
+ | .var pSineY = $0a | ||
+ | .var lineSinePnt = $0b | ||
+ | .var colorSetoffs = $10 | ||
+ | .var sineSetoffs = $38 | ||
+ | .var screen = $0400 | ||
+ | .var basic = $0801 | ||
+ | .var sine64 = $1000 | ||
+ | .var sine128 = $1200 | ||
+ | .var colorTable = $1400 | ||
+ | .var bitmap = $2000 | ||
+ | .var code = $4000 | ||
+ | .var plasmer = $5000 | ||
+ | // | ||
+ | .pc = sine64 " | ||
+ | .for (var i=0; i<$200; i++) | ||
+ | .by 32 + 32 * sin(i/ | ||
+ | .pc = sine128 " | ||
+ | .for (var i=0; i<$200; i++) | ||
+ | .by 64 + 64 * sin(i/ | ||
+ | // | ||
+ | .pc = $0801 " | ||
+ | : | ||
+ | // | ||
+ | .pc = code " | ||
+ | jmp start | ||
+ | // | ||
+ | .var width = 40 | ||
+ | .var height = 25 | ||
+ | .var effectDuration = $a0 | ||
+ | // | ||
+ | plasmaParams: | ||
+ | sineSpreadX: | ||
+ | sineSpreadY: | ||
+ | colorSpreadX: | ||
+ | colorSpreadY: | ||
+ | realtimeSpread0: | ||
+ | realtimeSpread1: | ||
+ | sineSpeeds: | ||
+ | addSpeed: | ||
+ | colors: | ||
+ | .by $00, | ||
+ | |||
+ | .var paramLen = * - plasmaParams | ||
+ | |||
+ | //List of effects to switch between... | ||
+ | paramList: | ||
+ | |||
+ | !sineSpreadX: | ||
+ | !sineSpreadY: | ||
+ | !colorSpreadX: | ||
+ | !colorSpreadY: | ||
+ | !realtimeSpread0: | ||
+ | !realtimeSpread1: | ||
+ | !sineSpeeds: | ||
+ | !addSpeed: | ||
+ | !colors: | ||
+ | .by $11, | ||
+ | |||
+ | !sineSpreadX: | ||
+ | !sineSpreadY: | ||
+ | !colorSpreadX: | ||
+ | !colorSpreadY: | ||
+ | !realtimeSpread0: | ||
+ | !realtimeSpread1: | ||
+ | !sineSpeeds: | ||
+ | !addSpeed: | ||
+ | !colors: | ||
+ | .by $11, | ||
+ | |||
+ | !sineSpreadX: | ||
+ | !sineSpreadY: | ||
+ | !colorSpreadX: | ||
+ | !colorSpreadY: | ||
+ | !realtimeSpread0: | ||
+ | !realtimeSpread1: | ||
+ | !sineSpeeds: | ||
+ | !addSpeed: | ||
+ | !colors: | ||
+ | .by $11, | ||
+ | |||
+ | .var numFx = [* - paramList] | ||
+ | // | ||
+ | start: | ||
+ | jsr init | ||
+ | // | ||
+ | mainLoop: | ||
+ | lda #$00 | ||
+ | sta $d020 | ||
+ | lda #$44 | ||
+ | !: cmp $d012 | ||
+ | bne !- | ||
+ | |||
+ | lda plasmaCnt+0 | ||
+ | clc | ||
+ | adc sineSpeeds+0 | ||
+ | sta plasmaCnt+0 | ||
+ | lda plasmaCnt+1 | ||
+ | clc | ||
+ | adc sineSpeeds+1 | ||
+ | sta plasmaCnt+1 | ||
+ | lda add | ||
+ | clc | ||
+ | adc addSpeed | ||
+ | anc #$3f | ||
+ | sta add | ||
+ | |||
+ | jsr plasmer | ||
+ | jsr fxControl | ||
+ | |||
+ | jmp mainLoop | ||
+ | // | ||
+ | fxControl: | ||
+ | //count down to next effect | ||
+ | inc fxTimer | ||
+ | lda fxTimer | ||
+ | cmp # | ||
+ | beq !next+ | ||
+ | rts | ||
+ | !next: | ||
+ | lda #$2b //turn off screen while initing effect | ||
+ | sta $d011 | ||
+ | lda #$00 | ||
+ | sta fxTimer | ||
+ | lda paramPnt | ||
+ | clc | ||
+ | adc #paramLen | ||
+ | ldx effect | ||
+ | inx | ||
+ | cpx #numFx | ||
+ | bne !+ | ||
+ | ldx #0 | ||
+ | txa | ||
+ | !: stx effect | ||
+ | sta paramPnt | ||
+ | |||
+ | jsr fetchParams | ||
+ | jsr generateSpeedcode | ||
+ | jsr generateColorTable | ||
+ | |||
+ | //wait for raster, turn screen on again | ||
+ | lda #$42 | ||
+ | !: cmp $d012 | ||
+ | bne !- | ||
+ | lda #$3b | ||
+ | sta $d011 | ||
+ | |||
+ | rts | ||
+ | fxTimer: | ||
+ | .by 0 | ||
+ | effect: | ||
+ | .by 0 | ||
+ | paramPnt: | ||
+ | .by 0 | ||
+ | |||
+ | // | ||
+ | fetchParams: | ||
+ | ldx #paramLen-1 | ||
+ | txa | ||
+ | clc | ||
+ | adc paramPnt | ||
+ | tay | ||
+ | !: lda paramList,y | ||
+ | sta plasmaParams, | ||
+ | dey | ||
+ | dex | ||
+ | bpl !- | ||
+ | rts | ||
+ | // | ||
+ | init: | ||
+ | sei | ||
+ | jsr fetchParams | ||
+ | jsr generateSpeedcode | ||
+ | jsr generateColorTable | ||
+ | jsr fillBitmap | ||
+ | jsr initVic | ||
+ | rts | ||
+ | // | ||
+ | fillBitmap: | ||
+ | ldx #0 | ||
+ | ldy #$1f | ||
+ | lda #%01010101 | ||
+ | !: sta bitmap,x | ||
+ | eor #%11111111 | ||
+ | inx | ||
+ | bne !- | ||
+ | inc !- +2 | ||
+ | dey | ||
+ | bpl !- | ||
+ | rts | ||
+ | // | ||
+ | initVic: | ||
+ | lda #$3b | ||
+ | sta $d011 | ||
+ | lda #$18 | ||
+ | sta $d018 | ||
+ | rts | ||
+ | // | ||
+ | generateColorTable: | ||
+ | |||
+ | ldx #$1f | ||
+ | ldy #0 | ||
+ | !loop: | ||
+ | lda colors,x | ||
+ | .for (var i=0; i<$200; i=i+$40) { | ||
+ | sta colorTable + i,y | ||
+ | sta colorTable + i+1,y | ||
+ | } | ||
+ | iny iny | ||
+ | dex | ||
+ | bpl !loop- | ||
+ | |||
+ | rts | ||
+ | // | ||
+ | // Generates the plasmer speedcode, which consists of an init chunk for every line, and a | ||
+ | // plasmer chunk for every char. | ||
+ | generateSpeedcode: | ||
+ | { | ||
+ | //set destination pointer... | ||
+ | lda #< | ||
+ | sta codePnt+0 | ||
+ | lda #> | ||
+ | sta codePnt+1 | ||
+ | |||
+ | //init adrs etc... | ||
+ | lda #<screen | ||
+ | sta scrLo+1 | ||
+ | lda #>screen | ||
+ | sta scrHi+1 | ||
+ | lda #0 | ||
+ | sta lineSinePnt+0 | ||
+ | sta lineSinePnt+1 | ||
+ | sta pSine+1 | ||
+ | sta pColor+1 | ||
+ | |||
+ | //generate lookup-tables... | ||
+ | ldx #width-1 | ||
+ | lda #0 | ||
+ | !: sta colorSetoffs, | ||
+ | clc | ||
+ | adc colorSpreadX | ||
+ | dex | ||
+ | bpl !- | ||
+ | ldx #width-1 | ||
+ | lda #0 | ||
+ | !: sta sineSetoffs, | ||
+ | clc | ||
+ | adc sineSpreadX | ||
+ | dex | ||
+ | bpl !- | ||
+ | |||
+ | //start looping through all char lines... | ||
+ | lda #height-1 | ||
+ | sta yPos | ||
+ | yLoop: | ||
+ | //generate the line-init chunk... | ||
+ | /* | ||
+ | ldx plasmaCnt+0 | ||
+ | ldy plasmaCnt+1 | ||
+ | clc | ||
+ | lda sine128,x | ||
+ | adc sine64,y | ||
+ | tax | ||
+ | */ | ||
+ | .var lineInitLen = 12 | ||
+ | |||
+ | ldy #0 | ||
+ | |||
+ | //" | ||
+ | lda #LDX_ZP | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | lda # | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | |||
+ | //" | ||
+ | lda #LDY_ZP | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | lda # | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | |||
+ | //" | ||
+ | lda #CLC | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | |||
+ | //" | ||
+ | lda #LDA_ABSX | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | lda lineSinePnt+0 | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | lda #> | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | |||
+ | //" | ||
+ | lda #ADC_ABSY | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | lda lineSinePnt+1 | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | lda #>sine64 | ||
+ | sta (codePnt),y | ||
+ | iny | ||
+ | |||
+ | //" | ||
+ | lda #TAX | ||
+ | sta (codePnt),y | ||
+ | |||
+ | lda # | ||
+ | clc | ||
+ | adc codePnt+0 | ||
+ | sta codePnt+0 | ||
+ | bcc !+ | ||
+ | inc codePnt+1 | ||
+ | !: | ||
+ | lda #RTS | ||
+ | sta uppRet | ||
+ | lda codePnt+1 | ||
+ | jsr updatePps | ||
+ | lda #JMP_ABS | ||
+ | sta uppRet | ||
+ | |||
+ | //start looping through all chars at the current y-position... | ||
+ | ldx #width-1 | ||
+ | ldy codePnt+0 | ||
+ | clc | ||
+ | xLoop: | ||
+ | //generate plasmer chunk for the current char... | ||
+ | /* | ||
+ | lda sine64,x | ||
+ | adc add | ||
+ | tay | ||
+ | lda colorTable, | ||
+ | sta screen | ||
+ | */ | ||
+ | .var plasmerLength = 12 | ||
+ | |||
+ | //" | ||
+ | lda #LDA_ABSX | ||
+ | pp00: sta plasmer+0,y | ||
+ | pSine: lda #0 | ||
+ | adc sineSetoffs, | ||
+ | pp01: sta plasmer+1,y | ||
+ | lda #>sine64 | ||
+ | pp02: sta plasmer+2,y | ||
+ | |||
+ | //" | ||
+ | lda #ADC_ZP | ||
+ | pp03: sta plasmer+3,y | ||
+ | lda #add | ||
+ | pp04: sta plasmer+4,y | ||
+ | |||
+ | //" | ||
+ | lda #TAY | ||
+ | pp05: sta plasmer+5,y | ||
+ | |||
+ | //" | ||
+ | lda #LDA_ABSY | ||
+ | pp06: sta plasmer+6,y | ||
+ | pColor: lda #0 | ||
+ | clc | ||
+ | adc colorSetoffs, | ||
+ | pp07: sta plasmer+7,y | ||
+ | lda #> | ||
+ | pp08: sta plasmer+8,y | ||
+ | |||
+ | //" | ||
+ | lda #STA_ABS | ||
+ | pp09: sta plasmer+9,y | ||
+ | txa | ||
+ | clc | ||
+ | scrLo: adc #<screen | ||
+ | pp10: sta plasmer+10, | ||
+ | scrHi: lda #>screen | ||
+ | adc #0 | ||
+ | pp11: sta plasmer+11, | ||
+ | |||
+ | tya | ||
+ | adc # | ||
+ | tay | ||
+ | bcs incPps | ||
+ | !back: | ||
+ | //next char... | ||
+ | dex | ||
+ | bpl xLoop | ||
+ | |||
+ | clc | ||
+ | lda #< | ||
+ | adc codePnt+0 | ||
+ | sta codePnt+0 | ||
+ | lda #> | ||
+ | adc codePnt+1 | ||
+ | sta codePnt+1 | ||
+ | |||
+ | //update line init routine for the next line... | ||
+ | lda lineSinePnt+0 | ||
+ | clc | ||
+ | adc realtimeSpread0 | ||
+ | sta lineSinePnt+0 | ||
+ | lda lineSinePnt+1 | ||
+ | clc | ||
+ | adc realtimeSpread1 | ||
+ | sta lineSinePnt+1 | ||
+ | |||
+ | //update plasmer params for the next line... | ||
+ | lda pSine+1 | ||
+ | clc | ||
+ | adc sineSpreadY | ||
+ | sta pSine+1 | ||
+ | lda pColor+1 | ||
+ | clc | ||
+ | adc colorSpreadY | ||
+ | sta pColor+1 | ||
+ | |||
+ | //update screen store adr.. | ||
+ | clc | ||
+ | lda #40 | ||
+ | adc scrLo+1 | ||
+ | sta scrLo+1 | ||
+ | lda #0 | ||
+ | adc scrHi+1 | ||
+ | sta scrHi+1 | ||
+ | |||
+ | //next y-pos... | ||
+ | dec yPos | ||
+ | bmi !+ | ||
+ | jmp yLoop | ||
+ | !: | ||
+ | //add the final " | ||
+ | ldy #0 | ||
+ | lda #RTS | ||
+ | sta (codePnt),y | ||
+ | |||
+ | rts | ||
+ | |||
+ | incPps: | ||
+ | lda pp00+2 | ||
+ | adc #0 | ||
+ | updatePps: | ||
+ | .var pps = List().add(pp00, | ||
+ | .for (var i=0; i< | ||
+ | sta pps.get(i)+2 | ||
+ | uppRet: jmp !back- | ||
+ | } | ||
+ | </ | ||
base/8x8-plasma-optimized-codegen.txt · Last modified: 2015-04-17 04:30 by 127.0.0.1