Skip to content

Instantly share code, notes, and snippets.

@zapposh
Created October 24, 2014 11:47
Show Gist options
  • Save zapposh/4ef581a06b3c0aa74f0b to your computer and use it in GitHub Desktop.
Save zapposh/4ef581a06b3c0aa74f0b to your computer and use it in GitHub Desktop.
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