Created
October 24, 2014 11:47
-
-
Save zapposh/4ef581a06b3c0aa74f0b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Operator Calc | |
#region Konstanten | |
#region Faben | |
;******************************************************************************* | |
;*** Farben - ANFANG *** | |
;******************************************************************************* | |
COLOR_BLACK = $00 ;schwarz | |
COLOR_WHITE = $01 ;weiß | |
COLOR_RED = $02 ;rot | |
COLOR_CYAN = $03 ;türkis | |
COLOR_PURPLE = $04 ;lila | |
COLOR_GREEN = $05 ;grün | |
COLOR_BLUE = $06 ;blau | |
COLOR_YELLOW = $07 ;gelb | |
COLOR_ORANGE = $08 ;orange | |
COLOR_BROWN = $09 ;braun | |
COLOR_LIGHTRED = $0A ;hellrot | |
COLOR_DARKGREY = $0B ;dunkelgrau | |
COLOR_GREY = $0C ;grau | |
COLOR_LIGHTGREEN = $0D ;hellgrün | |
COLOR_LIGHTBLUE = $0E ;hellblau | |
COLOR_LIGHTGREY = $0F ;hellgrau | |
;******************************************************************************* | |
;*** Farben - ENDE *** | |
;******************************************************************************* | |
#endregion | |
#region VIC II | |
;******************************************************************************* | |
;*** Die VIC II Sprite Register - ANFANG *** | |
;******************************************************************************* | |
SPRITE0X = $D000 ;(00) X-Position von Sprite 0 | |
SPRITE0Y = $D001 ;(01) Y-Position von Sprite 0 | |
SPRITE1X = $D002 ;(02) X-Position von Sprite 1 | |
SPRITE1Y = $D003 ;(03) Y-Position von Sprite 1 | |
SPRITE2X = $D004 ;(04) X-Position von Sprite 2 | |
SPRITE2Y = $D005 ;(05) Y-Position von Sprite 2 | |
SPRITE3X = $D006 ;(06) X-Position von Sprite 3 | |
SPRITE3Y = $D007 ;(07) Y-Position von Sprite 3 | |
SPRITE4X = $D008 ;(08) X-Position von Sprite 4 | |
SPRITE4Y = $D009 ;(09) Y-Position von Sprite 4 | |
SPRITE5X = $D00A ;(10) X-Position von Sprite 5 | |
SPRITE5Y = $D00B ;(11) Y-Position von Sprite 5 | |
SPRITE6X = $D00C ;(12) X-Position von Sprite 6 | |
SPRITE6Y = $D00D ;(13) Y-Position von Sprite 6 | |
SPRITE7X = $D00E ;(14) X-Position von Sprite 7 | |
SPRITE7Y = $D00F ;(15) Y-Position von Sprite 7 | |
SPRITESMAXX = $D010 ;(16) Höhstes BIT der jeweiligen X-Position | |
; da der BS 320 Punkte breit ist reicht | |
; ein BYTE für die X-Position nicht aus! | |
; Daher wird hier das 9. Bit der X-Pos | |
; gespeichert. BIT-Nr. (0-7) = Sprite-Nr. | |
VICRASTERROWPOS = $D012 ;(18) lesen : Aktuelle Rasterzeile | |
; schreiben: Rasterzeile für IRQ setzen | |
; ACHTUNG: Auch BIT-8 in $D011 beachten! | |
VICSPRITEACTIVE = $D015 ;(21) Bestimmt welche Sprites sichtbar sind | |
; Bit-Nr. = Sprite-Nr. | |
SPRITEDOUBLEHEIGHT = $D017 ;(23) Doppelte Höhe der Sprites | |
; Bit-Nr. = Sprite-Nr. | |
VICSPRITEDEEP = $D01B ;(27) Legt fest ob ein Sprite vor oder hinter | |
; dem Hintergrund erscheinen soll. | |
; Bit = 1: Hintergrund vor dem Sprite | |
; Bit-Nr. = Sprite-Nr. | |
VICSPRITEMULTICOLOR = $D01C ;(28) Bit = 1: MultiColor Sprite | |
; Bit-Nr. = Sprite-Nr. | |
SPRITEDOUBLEWIDTH = $D01D ;(29) Bit = 1: Doppelte Breite des Sprites | |
; Bit-Nr. = Sprite-Nr. | |
SPRITESPRITECOLL = $D01E ;(30) Bit = 1: Kollision zweier Sprites | |
; Bit-Nr. = Sprite-Nr. | |
; Der Inhalt wird beim Lesen gelöscht!! | |
SPRITEBACKGROUNDCOLL= $D01F ;(31) Bit = 1: Sprite / Hintergrund Kollision | |
; Bit-Nr. = Sprite-Nr. | |
; Der Inhalt wird beim Lesen gelöscht! | |
VICBORDERCOLOR = $D020 ;(32) Bildschirmrandfarbe | |
VICBACKGROUNDCOLOR = $D021 ;(33) Hintergrundfarbe | |
SPRITEMULTICOLOR0 = $D025 ;(37) Spritefarbe 0 im Multicolormodus | |
SPRITEMULTICOLOR1 = $D026 ;(38) Spritefarbe 1 im Multicolormodus | |
SPRITE0COLOR = $D027 ;(39) Farbe von Sprite 0 | |
SPRITE1COLOR = $D028 ;(40) Farbe von Sprite 1 | |
SPRITE2COLOR = $D029 ;(41) Farbe von Sprite 2 | |
SPRITE3COLOR = $D02A ;(42) Farbe von Sprite 3 | |
SPRITE4COLOR = $D02B ;(43) Farbe von Sprite 4 | |
SPRITE5COLOR = $D02C ;(44) Farbe von Sprite 5 | |
SPRITE6COLOR = $D02D ;(45) Farbe von Sprite 6 | |
SPRITE7COLOR = $D02E ;(46) Farbe von Sprite 7 | |
;******************************************************************************* | |
;*** Die VIC II Sprite Register - ENDE *** | |
;******************************************************************************* | |
#endregion | |
CIA2_DATAPORT_A = $DD00 | |
VICMEMORYCONTROL = $D018 | |
VIC16KBSTART = $C000 | |
VICSCREENRAM = $CC00 | |
VICCHARSET = $F800 | |
VICCOLORRAMADR = $D800 | |
VICSPRITEPOINTERBASE = $CC00+1016 | |
;******************************************************************************* | |
;*** Programmspezifische Konstanten *** | |
;******************************************************************************* | |
TILE_WIDTH = 5 | |
TILE_HEIGHT = 4 | |
ZP_LOOPHELP = $02 ;zero page schleiferzähler | |
ZP_FIRSTTILE = $03 | |
ZP_NEXTTILE = $04 | |
#endregion | |
;*** Die Startzeile verwenden wir, um den 2. Level | |
;*** erstmal eigenständig zu entwickeln. | |
;*** Startadresse BASIC-Zeile: 2013 SYS 2062 | |
*=$0801 | |
BYTE $0B,$08,$DD,$07,$9E,$20,$32,$30,$36,$32,$00,$00,$00 | |
main: | |
sei | |
;*** choose 16kb VIC bank | |
lda #%00000011 ;data directions for port A read and write | |
sta CIA2_DATAPORT_A+2 ; $dd02 | |
lda CIA2_DATAPORT_A | |
and #%11111100 | |
ora #%00000000 ;choose 16kb bank 3 from $c000 | |
sta CIA2_DATAPORT_A | |
;*** choose start of 1kb screen memory and character memory | |
lda $d018 | |
and #%00001111 | |
ora #%00110000 ;screen block 4 | |
sta $d018 | |
lda $d018 | |
and #%11110000 | |
ora #%00001110 ;char block 7 | |
sta $d018 | |
lda $01 | |
and #%11111110 | |
sta $01 ;turn off basic-ROM | |
lda $d016 | |
ora #%00010000 ;turn multi-color on | |
sta $d016 | |
lda #COLOR_ORANGE | |
sta VICBACKGROUNDCOLOR | |
lda #COLOR_BLACK | |
sta VICBORDERCOLOR | |
lda #COLOR_DARKGREY | |
sta $d022 | |
lda #COLOR_BROWN | |
sta $d023 | |
jsr copycharset: | |
jsr clearscreen: | |
jsr initroad: | |
cli | |
scrolling: | |
dec $d020 | |
lda ZP_FIRSTTILE | |
sta VICSCREENRAM | |
lda #%00000001 | |
sta $d800 | |
lda ZP_NEXTTILE | |
sta VICSCREENRAM+40 | |
lda #%00000001 | |
sta $d800+40 | |
ldx ZP_FIRSTTILE | |
jsr drawroad: | |
ldx ZP_NEXTTILE | |
lda roadtobase:,x | |
bmi inifiteloop: | |
inc ZP_FIRSTTILE | |
ldx #10 ;scroll speed | |
scrollspeed: | |
lda #250 | |
cmp $d012 ;raster beam wait for line 250 | |
beq *-3 | |
cmp $d012 ;raster beam wait for line 250 | |
bne *-3 | |
dex ;dec speed | |
bne scrollspeed: | |
beq scrolling: | |
inifiteloop: | |
jmp * | |
rndTIMER: | |
lda $dc04 | |
eor $dc05 | |
eor $dd04 | |
adc $dd05 | |
eor $dd06 | |
eor $dd07 | |
rts | |
;*** copy charset to block 7 in vic bank 3 | |
copycharset: | |
lda #$00 | |
sta $fd | |
lda #$F8 | |
sta $fe | |
lda #<charset: | |
sta $fb | |
lda #>charset: | |
sta $fc | |
ldx #$03 | |
ldy #$00 | |
charloop: | |
lda ($fb),y | |
sta ($fd),y | |
lda charset:,y | |
sta $F800,y | |
dey | |
bne charloop: | |
inc $fc | |
inc $fe | |
dex | |
bpl charloop: | |
rts | |
;*** clear the screen | |
clearscreen: | |
ldx #$00 | |
lda #' ' | |
@loop: | |
sta VICSCREENRAM,x | |
sta VICSCREENRAM+256,x | |
sta VICSCREENRAM+512,x | |
sta VICSCREENRAM+744,x | |
dex | |
bne @loop: | |
rts | |
;*** draw road tiles to screen | |
initroad: | |
ldx #$00 | |
lda #%00000011 ;erlaubte tiles | |
sta ZP_LOOPHELP ;auf ZP merken | |
timerloop: | |
jsr rndtimer: | |
and ZP_LOOPHELP ;we only need numbers 0-3 for our tiles | |
sta roadtobase_rnd:,x ;save number to table | |
eor #%00000010 ;falls eben ein abgrund, für nächstes mal sperren | |
ora #%00000001 ;gerade strecke und schutthaufen (0-1) immer ok | |
sta ZP_LOOPHELP ;auf ZP merken | |
inx | |
cpx #80 ;10 screens wide (8 tiles each) | |
bne timerloop: | |
ldx #40*TILE_HEIGHT ;schleifenzähler 4 zeilen | |
lda #COLOR_LIGHTGREEN | |
@loop: | |
sta VICCOLORRAMADR+839,x ;(40*(25-tile_height))-1 = (40*21)-1 = 839 | |
dex | |
bne @loop: | |
stx ZP_FIRSTTILE ;when x=0, store in ZP_FIRSTTILE | |
rts | |
;*** draw road routine | |
drawroad: | |
stx ZP_NEXTTILE | |
ldy #$00 | |
@loop: | |
lda roadtobase:,y | |
tax | |
tya | |
pha | |
jsr drawtile: | |
pla | |
tay | |
iny | |
inc ZP_NEXTTILE | |
ldx ZP_NEXTTILE | |
cpy #$08 | |
bne @loop: | |
rts | |
;*** draw tile routine | |
drawtile: | |
lda screenposoffset:,y | |
tay | |
lda tileoffsettable:,x | |
tax | |
lda #TILE_WIDTH-1 | |
sta ZP_LOOPHELP | |
@loop: | |
lda tiles:,x | |
sta VICSCREENRAM+840,y ;40*21= 840 | |
lda tiles:+TILE_WIDTH,x | |
sta VICSCREENRAM+880,y | |
lda tiles:+10,x ;10=TILEWIDTH*2 | |
sta VICSCREENRAM+920,y | |
lda tiles:+15,x ;15=TILEWIDTH*3 | |
sta VICSCREENRAM+960,y | |
inx | |
iny | |
dec ZP_LOOPHELP | |
bpl @loop: | |
rts | |
roadtobase: | |
byte 0,0,0,0,0,0,2,0 | |
roadtobase_rnd: | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff | |
tileoffsettable: | |
byte tile1:-tiles: | |
byte tile2:-tiles: | |
byte tile3:-tiles: | |
byte tile4:-tiles: | |
screenposoffset: | |
byte 0*TILE_WIDTH | |
byte 1*TILE_WIDTH | |
byte 2*TILE_WIDTH | |
byte 3*TILE_WIDTH | |
byte 4*TILE_WIDTH | |
byte 5*TILE_WIDTH | |
byte 6*TILE_WIDTH | |
byte 7*TILE_WIDTH | |
;*** tiles: | |
tiles: ;5*4 | |
tile1: ;gerade strecke | |
byte 32,32,32,32,32 | |
byte 64,65,66,65,64 | |
byte 71,71,71,71,71 | |
byte 71,71,71,71,71 | |
tile2: ;hindernis schutthaufen | |
byte 32,79,80,81,32 | |
byte 65,76,77,78,66 | |
byte 71,71,71,71,71 | |
byte 71,71,71,71,71 | |
tile3: ;sanfter abgrund | |
byte 32,32,32,32,32 | |
byte 67,32,32,32,70 | |
byte 71,68,84,69,71 | |
byte 71,71,71,71,71 | |
tile4: ;steiler abgrund | |
byte 32,32,32,32,32 | |
byte 72,32,32,32,73 | |
byte 74,32,32,32,75 | |
byte 82,32,32,32,83 | |
align 256 | |
charset: | |
incbin "ressources/chars.raw" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment