User Tools

Site Tools


base:quest_for_cash

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:quest_for_cash [2015-04-17 04:33] (current)
Line 1: Line 1:
 +Utilities are not included here.
 +<​code>​
 +; Quest for Cash
 +; --------------
 +; 2006, 2007 Hannu Nuotio
  
 +; Quest for Cash is a remake of the crap QBasic game of the same name (and author).
 +
 +; Start of project: 5.10.2006
 +; v.0.2 - 10.3.2007
 +; v.0.1 - 9.3.2007
 +; v.0.0.9 - 8.3.2007
 +; v.0.0.8 - 6.3.2007
 +; v.0.0.7 - 25.11.2006
 +; v.0.0.6 - 23.11.2006
 +; v.0.0.5 - 21.11.2006
 +; v.0.0.4 - 20.10.2006
 +; v.0.0.3 - 11.10.2006
 +; v.0.0.2 - 9.10.2006
 +; v.0.0.1 - 5.10.2006
 +
 +; Compiles with ACME 0.91
 +; # acme --cpu 6502 -f cbm -o qfc.prg qfc.a
 +
 +; Type SYS 3072 to start or use crunched version.
 +
 +; Known bugs:
 +
 +; TODO:
 +
 +; Memory map:
 +; $0000-$00ff : temp zero page variables
 +; $0100-$03ff : unused
 +; $0400-$07e7 : screen memory
 +; $0800-$0bff : font memory
 +; $0c00-$xxxx : code
 +; $xxxx-$yyyy : variables (reused characters)
 +; $yyyy-$kkkk : color lookup table
 +; $kkkk-$zzzz : strings
 +; $zzzz-$jjjj : compressed levels
 +; $d800-$dbe7 : color memory
 +; $zzzz-$ffff : unused
 +
 +; Notes:
 +
 +; colors:
 +; 0 = black
 +; 1 = white
 +; 2 = red
 +; 3 = cyan
 +; 4 = purple
 +; 5 = green
 +; 6 = blue
 +; 7 = yellow
 +; 8 = orange
 +; 9 = brown
 +; 10 = lred
 +; 11 = dgray
 +; 12 = gray
 +; 13 = lgreen
 +; 14 = lblue
 +; 15 = lgrey
 +
 +
 +; --- Constants
 +
 +!ct scr ; C64 screencode
 +
 +levels = 15 ; the amount of levels
 +
 +joystick = 0 ; joystick: 0 = port 2, 1 = userport
 +easymode = 0 ; easier game (grid and eleb visible)
 +
 +; - hw addresses
 +!if joystick = 0 {
 +joyport = $dc00 ; joystick port 2
 +joypddr = $dc02 ; joystick port 2 data direction register
 +} else {
 +joyport = $dd01 ; userport
 +joypddr = $dd03 ; userport data direction register
 +}
 +screen = $0400 ; screen address
 +color =  $d800 ; color ram address
 +scrtocol = $d4 ; screen->​color difference MSB
 +vicborder = $d020       ; border color register
 +vicbackgnd = $d021      ; background color register
 +vicraster = $d012       ; raster compare register
 +
 +; - input consts
 +joyrepeat = 20          ; joystick repeat delay
 +rastercmp = 200         ; raster line to wait for
 +
 +; - tiles
 +tground = $40
 +twall = $41
 +tswall = $42
 +tdoor1 = $43
 +tdoor2 = $44
 +tsdoor = $45
 +tkey1 = $46
 +tkey2 = $47
 +tskey = $48
 +tbomb = $49
 +tlbomb = $4a
 +tunused1 = $4b
 +tunused2 = $4c
 +trock = $4d
 +trockw = $4e
 +trockh = $4f
 +thole = $50
 +twater = $51
 +tplank = $52
 +tplankw = $53
 +telea = $54
 +teleb = $55
 +teles = $56
 +ttele = $57
 +tzapd = $58
 +tzapu = $59
 +tzapr = $5a
 +tzapl = $5b
 +tcash = $5c
 +tplayer = $5d
 +tdeath = $5e
 +tfire = $5f
 +
 +; - text locations
 +gamescreenloc = screen+40*2
 +gamescreenendloc = gamescreenloc+40*20
 +gamecolorloc = color+40*2
 +statustextloc = screen+40*24
 +statusbartext1loc = screen+40*23+1
 +statusbartext2loc = screen+40*23+29
 +bcdbomb = statusbartext1loc+2
 +bcdplank = statusbartext1loc+7
 +bcdkey1 = statusbartext1loc+12
 +bcdkey2 = statusbartext1loc+17
 +bcdskey = statusbartext1loc+22
 +bcdlevel = statusbartext2loc+6
 +helptextlen = 40*20+1
 +pickuptextloc = pickuptext+24
 +useitemtextloc = useitemtext+19
 +useitemtextloc2 = useitemtext+24
 +
 +; - text color
 +gametitletextcol = 3
 +helptextcol = 15
 +statusbartext1col = 1
 +statusbartext2col = 2
 +restarttextcol = 10
 +nextleveltextcol = 13
 +zaptextcol = 7
 +gamewontextcol = 14
 +pickuptextcol = 12
 +useitemtextcol = 12
 +dropbombtextcol = 5
 +detonatebombtextcol = 8
 +teleporttextcol = 3
 +electextcol = 6
 +
 +
 +; --- Variables
 +
 +; - zero page
 +
 +tmpptr = $39 ; temporary zp pointer
 +scrptr = $fb ; zp pointer to screen
 +colptr = $fd ; zp pointer to color
 +tmpvar = $ff ; temporary zp variable
 +
 +; - reused chars
 +
 +tmp = Chars
 +
 +; last joystick state
 +lastjoy = Chars+1
 +
 +; joystick repeat counter
 +joycount = Chars+2
 +
 +; interrupt state
 +intstate = Chars+3
 +
 +; pointer storage
 +storedptr = Chars+4
 +storedptrh = Chars+5
 +ccurlevel = Chars+6
 +ccurlevelh = Chars+7
 +cnextlevel = Chars+8
 +cnextlevelh = Chars+9
 +
 +; current/​selected level
 +level = Chars+10
 +
 +; items
 +ibomb = Chars+11
 +iplank = Chars+12
 +ikey1 = Chars+13
 +ikey2 = Chars+14
 +iskey = Chars+15
 +
 +; game state
 +playerptr = Chars+16
 +playerptrh = Chars+17
 +underplayer = Chars+18
 +lbomb = Chars+19
 +underlbomb = Chars+20
 +underlbombu = Chars+21
 +underlbombd = Chars+22
 +underlbombl = Chars+23
 +underlbombr = Chars+24
 +lbombptr = Chars+25
 +lbombptrh = Chars+26
 +movedir = Chars+27
 +newptr = Chars+28
 +newptrh = Chars+29
 +
 +
 +; --- Main 
 +
 +; start of program
 +*=$0c00
 +mlcodeentry:​
 +
 +; - interrupt setup
 +; from "An Introduction to Programming C-64 Demos" by Puterman aka Linus Åkerlund
 +; http://​user.tninet.se/​~uxm165t/​demo_programming/​demo_prog/​demo_prog.html
 +; ... + modifications
 +;
 +sei ; interrupts off
 +lda #$7f
 +ldx #$01
 +sta $dc0d ; Turn off CIA 1 interrupts
 +sta $dd0d ; Turn off CIA 2 interrupts
 +stx $d01a ; Turn on raster interrupts
 +lda #<int ; low part of address of interrupt handler code
 +ldx #>int ; high part of address of interrupt handler code
 +ldy #250 ; line to trigger interrupt
 +sta $0314 ; store in interrupt vector
 +stx $0315
 +sty $d012
 +lda #<nmi ; low part of address of NMI handler code
 +ldx #>nmi ; high part of address of NMI handler code
 +sta $0318 ; store in NMI vector
 +stx $0319
 +lda #0
 +sta intstate ; set interrupt state to 0
 +lda $dc0d ; ACK CIA 1 interrupts
 +lda $dd0d ; ACK CIA 2 interrupts
 +asl $d019 ; ACK VIC interrupts
 +cli ; interrupts on
 +
 +
 +; disable bcd-mode
 +cld
 +
 +; set joyport to input
 +lda #0
 +sta joypddr
 +
 +; copy character rom to $0800-$09ff
 +; copy custom chars to  $0a00-$0bff
 +ldx #0 ; 255 loops
 +sei ; interrups off
 +lda $1
 +and #$fb
 +sta $1 ; character rom on
 +- lda $d000,x ; load from char-rom
 + sta $0800,x ; store to ram
 + lda $d100,x ; load from char-rom
 + sta $0900,x ; store to ram
 + lda Chars,x ; load from custom chars
 + sta $0a00,x ; store to ram
 + lda Chars+$100,​x;​ load from custom chars
 + sta $0b00,x ; store to ram
 + inx
 + bne -
 +lda $1
 +ora #$04
 +sta $1 ; character rom off
 +asl $d019 ; ACK VIC interrupts
 +cli ; interrupts on
 +
 +; font = $0800
 +lda $d018
 +and #$f1
 +ora #$02
 +sta $d018
 +
 +; set colors
 +ldx #tswall
 +lda Colortable,​x
 +sta vicborder ; set border
 +lda #0
 +sta vicbackgnd ;​ set background black
 +
 +; print text
 +lda #>​gametitletext
 +sta tmpptr+1
 +lda #<​gametitletext
 +sta tmpptr
 +lda #>screen
 +sta scrptr+1
 +lda #<screen
 +sta scrptr
 +lda #​gametitletextcol
 +jsr printstring
 +
 +lda #>​topbottomborder
 +sta tmpptr+1
 +lda #<​topbottomborder
 +sta tmpptr
 +lda #>​screen+40
 +sta scrptr+1
 +lda #<​screen+40
 +sta scrptr
 +jsr printstring
 +
 +lda #>​screen+40*22
 +sta scrptr+1
 +lda #<​screen+40*22
 +sta scrptr
 +jsr printstring
 +
 +reloadstartmenu:​
 +lda #>​statusbartext1
 +sta tmpptr+1
 +lda #<​statusbartext1
 +sta tmpptr
 +lda #>​statusbartext1loc
 +sta scrptr+1
 +lda #<​statusbartext1loc
 +sta scrptr
 +lda #​statusbartext1col
 +jsr printstring
 +
 +lda #>​statusbartext2
 +sta tmpptr+1
 +lda #<​statusbartext2
 +sta tmpptr
 +lda #>​statusbartext2loc
 +sta scrptr+1
 +lda #<​statusbartext2loc
 +sta scrptr
 +lda #​statusbartext2col
 +jsr printstring
 +
 +; - Start menu
 +;
 +startmenu:
 +lda #1
 +sta level
 +jsr erasestatustext
 +
 +; set pointer to helptext page 1
 +startmenu_helppage1:​
 +lda #>​helptext
 +sta storedptr+1
 +lda #<​helptext
 +sta storedptr
 +
 +startmenu_drawhelp:​
 +; check if valid helptext page
 +lda storedptr+1
 +cmp #>​helptext
 +bcc startmenu_helppage1
 +cmp #>​helptextlast
 +beq +
 +bcs startmenu_helppage1
 +
 +; draw help screen
 ++ lda storedptr+1
 +sta tmpptr+1
 +lda storedptr
 +sta tmpptr
 +lda #>​gamescreenloc
 +sta scrptr+1
 +lda #<​gamescreenloc
 +sta scrptr
 +lda #​helptextcol
 +jsr printstring
 +
 +; start menu input loop
 +- jsr getinput
 +sta tmp
 +lda #​%00000001 ;​ up
 +bit tmp ; test if up
 +beq ++ ; skip if not
 +; up pressed
 +lda storedptr
 +sec
 +sbc #<​helptextlen
 +sta storedptr
 +lda storedptr+1
 +sbc #>​helptextlen
 +sta storedptr+1
 +jmp startmenu_drawhelp
 +++ lda #​%00000010 ;​ down
 +bit tmp ; test if down
 +beq ++ ; skip if not
 +; down pressed
 +lda storedptr
 +clc
 +adc #<​helptextlen
 +sta storedptr
 +lda storedptr+1
 +adc #>​helptextlen
 +sta storedptr+1
 +jmp startmenu_drawhelp
 +++ lda #​%00000100 ;​ left
 +bit tmp ; test if left
 +beq ++ ; skip if not
 +; left pressed
 +dec level
 +bne +
 +inc level
 +bne -
 ++ lda #>​bcdlevel
 +sta tmpptr+1
 +lda #<​bcdlevel
 +sta tmpptr
 +jsr bcddec
 +jmp -
 +++ lda #​%00001000 ;​ right
 +bit tmp ; test if right
 +beq ++ ; skip if not
 +; right pressed
 +inc level
 +lda #levels+1
 +cmp level
 +bne +
 +dec level
 +bne -
 ++ lda #>​bcdlevel
 +sta tmpptr+1
 +lda #<​bcdlevel
 +sta tmpptr
 +jsr bcdinc
 +jmp -
 +++ lda #​%00010000 ;​ fire
 +bit tmp ; test if fire
 +bne + ; jump if pressed
 +jmp - ; back to input loop
 +
 +
 +; init game
 ++ lda #>​clevels
 +sta tmpptr+1
 +lda #<​clevels
 +sta tmpptr
 +lda level
 +sta tmp
 +
 +; load level (selected, next or restarted)
 +loadlevel:
 +jsr initlevel
 +
 +; find starting position
 +lda #tplayer
 +jsr findchar
 +lda tmpptr
 +sta playerptr
 +lda tmpptr+1
 +sta playerptrh
 +lda #tground
 +sta underplayer
 +
 +; - Game loop
 +;
 +gameloop:
 +; get input
 +jsr getinput
 +sta movedir
 +jsr erasestatustext
 +lda #​%00000001 ;​ up
 +bit movedir ; test if up
 +beq + ; skip if not
 +; up pressed
 +sta movedir ; eliminate possible diagonals
 +lda #>-40
 +sta storedptrh
 +lda #<-40
 +sta storedptr
 +jmp movement
 ++ lda #​%00000010 ;​ down
 +bit movedir ; test if down
 +beq + ; skip if not
 +; down pressed
 +sta movedir ; eliminate possible diagonals
 +lda #>40
 +sta storedptrh
 +lda #<40
 +sta storedptr
 +jmp movement
 ++ lda #​%00000100 ;​ left
 +bit movedir ; test if left
 +beq + ; skip if not
 +; left pressed
 +sta movedir ; eliminate possible diagonals
 +lda #>-1
 +sta storedptrh
 +lda #<-1
 +sta storedptr
 +jmp movement
 ++ lda #​%00001000 ;​ right
 +bit movedir ; test if right
 +beq + ; skip if not
 +; right pressed
 +sta movedir ; eliminate possible diagonals
 +lda #>1
 +sta storedptrh
 +lda #<1
 +sta storedptr
 +jmp movement
 ++ lda #​%00010000 ;​ fire
 +bit movedir ; test if fire
 +beq gameloop ; jump back if not
 +; fire pressed
 +lda lbomb ; check if live bomb
 +beq +
 +; explode bomb
 +jmp explodebomb
 ++ lda ibomb ; check if any bombs
 +beq ++
 +; drop bomb
 +jmp dropbomb
 +; restart?
 +++ lda #>​restarttext
 +sta tmpptr+1
 +lda #<​restarttext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​restarttextcol
 +jsr printstring
 +jsr getinput
 +sta movedir
 +jsr erasestatustext
 +lda #​%00010000 ;​ fire
 +bit movedir ; test if fire
 +bne + ; skip if is
 +jmp gameloop
 ++ lda ccurlevel
 +sta tmpptr
 +lda ccurlevelh
 +sta tmpptr+1 ; tmpptr -> current level
 +lda #1
 +sta tmp ; load 1 level
 +jmp loadlevel ; restart level
 +
 +movement:
 +; calculate new location
 +clc
 +lda playerptr
 +adc storedptr
 +sta newptr
 +sta tmpptr
 +lda playerptrh
 +adc storedptrh
 +sta tmpptr+1
 +sta newptrh ; tmpptr, newptr -> new location
 +
 +; check left<​->​right wrap
 +lda #​%00001100 ;​ left or right
 +bit movedir ; test if left or right
 +beq movement_check ;​ skip if not
 +ldx newptrh
 +lda newptr
 +jsr mod40
 +sta tmp ; tmp = new location mod 40
 +lda #​%00000100 ;​ left
 +bit movedir ; test if left
 +beq + ; skip if right
 +lda #39
 +cmp tmp ; check if 39 (left->​right)
 +bne movement_check ;​ skip if not
 +jmp gameloop ; left->​right wrap, back to loop
 ++ lda tmp ; check if 0 (right->​left)
 +bne movement_check ;​ skip if not
 +jmp gameloop ; right->​left wrap, back to loop
 +
 +; check if movement ok
 +movement_check:​
 +ldy #0
 +lda (tmpptr),y
 +tax ; x = tile in new position
 +
 +; items
 +lda #tground
 +cpx #tkey1 ; check if key1
 +bne + ; if not, skip
 +sta (tmpptr),​y ;​ erase item
 +inc ikey1
 +lda #>​bcdkey1
 +sta tmpptr+1
 +lda #<​bcdkey1
 +sta tmpptr
 +jsr bcdinc ; increase count
 +jsr printpickup
 +jmp movement_draw
 ++ cpx #tkey2 ; check if key2
 +bne + ; if not, skip
 +sta (tmpptr),​y ;​ erase item
 +inc ikey2
 +lda #>​bcdkey2
 +sta tmpptr+1
 +lda #<​bcdkey2
 +sta tmpptr
 +jsr bcdinc ; increase count
 +jsr printpickup
 +jmp movement_draw
 ++ cpx #tskey ; check if skey
 +bne + ; if not, skip
 +sta (tmpptr),​y ;​ erase item
 +inc iskey
 +lda #>​bcdskey
 +sta tmpptr+1
 +lda #<​bcdskey
 +sta tmpptr
 +jsr bcdinc ; increase count
 +jsr printpickup
 +jmp movement_draw
 ++ cpx #tbomb ; check if bomb
 +bne + ; if not, skip
 +sta (tmpptr),​y ;​ erase item
 +inc ibomb
 +lda #>​bcdbomb
 +sta tmpptr+1
 +lda #<​bcdbomb
 +sta tmpptr
 +jsr bcdinc ; increase count
 +jsr printpickup
 +jmp movement_draw
 ++ cpx #tplank ; check if plank
 +bne + ; if not, skip
 +sta (tmpptr),​y ;​ erase item
 +inc iplank
 +lda #>​bcdplank
 +sta tmpptr+1
 +lda #<​bcdplank
 +sta tmpptr
 +jsr bcdinc ; increase count
 +jsr printpickup
 +jmp movement_draw
 +
 +; item usage
 ++ cpx #twater ; check if water
 +bne ++ ; if not, skip
 +lda iplank ; check if any planks
 +bne + ; skip if is
 +jmp gameloop ; back to gameloop
 ++ lda #tplankw
 +sta (tmpptr),​y ;​ water->​plank on water
 +dec iplank
 +lda #>​bcdplank
 +sta tmpptr+1
 +lda #<​bcdplank
 +sta tmpptr
 +jsr bcddec ; decrease count
 +lda #tplank
 +jsr printuseitem
 +jmp movement_draw
 +++ cpx #tdoor1 ; check if door1
 +bne ++ ; if not, skip
 +lda ikey1 ; check if any key1's
 +bne + ; skip if is
 +jmp gameloop ; back to gameloop
 ++ lda #tground
 +sta (tmpptr),​y ;​ door->​ground
 +dec ikey1
 +lda #>​bcdkey1
 +sta tmpptr+1
 +lda #<​bcdkey1
 +sta tmpptr
 +jsr bcddec ; decrease count
 +lda #tkey1
 +jsr printuseitem
 +jmp movement_draw
 +++ cpx #tdoor2 ; check if door2
 +bne ++ ; if not, skip
 +lda ikey2 ; check if any key2's
 +bne + ; skip if is
 +jmp gameloop ; back to gameloop
 ++ lda #tground
 +sta (tmpptr),​y ;​ door->​ground
 +dec ikey2
 +lda #>​bcdkey2
 +sta tmpptr+1
 +lda #<​bcdkey2
 +sta tmpptr
 +jsr bcddec ; decrease count
 +lda #tkey2
 +jsr printuseitem
 +jmp movement_draw
 +++ cpx #tsdoor ; check if sdoor
 +bne ++ ; if not, skip
 +lda iskey ; check if any skeys
 +bne + ; skip if is
 +jmp gameloop ; back to gameloop
 ++ lda #tground
 +sta (tmpptr),​y ;​ door->​ground
 +dec iskey
 +lda #>​bcdskey
 +sta tmpptr+1
 +lda #<​bcdskey
 +sta tmpptr
 +jsr bcddec ; decrease count
 +lda #tskey
 +jsr printuseitem
 +jmp movement_draw
 +
 +; special stuff
 +++ cpx #teles ; check if elec. switch
 +bne ++ ; if not, skip
 +jmp elecswitch ;​ switch elec.
 +++ cpx #tcash ; check if cash
 +bne ++ ; if not, skip
 +jmp nextlevel
 +++ cpx #ttele ; check if teleport
 +bne ++ ; if not, skip
 +jsr domovement ;​ move into teleport (erase curr. tele)
 +lda #ttele ; a = ttele
 +jsr findchar ; tmpptr -> other teleport
 +lda tmpptr
 +sta newptr
 +lda tmpptr+1
 +sta newptrh ; newptr -> other teleport
 +lda #>​teleporttext
 +sta tmpptr+1
 +lda #<​teleporttext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​teleporttextcol
 +jsr printstring
 +
 +jmp movement_draw ;​ teleport
 +
 +; rock
 +++ cpx #trock ; check if rock
 +bne ++ ; if not, skip
 +jmp rockmove
 +++ cpx #trockw ; check if rock on plank
 +bne ++ ; if not, skip
 +jmp rockmove
 +
 +; simple movement
 +++ cpx #tground ; check if ground
 +beq movement_draw ;​ if it is, move
 +cpx #tplankw ; check if plank on water
 +beq movement_draw ;​ if it is, move
 +cpx #thole ; check if hole
 +beq movement_draw ;​ if it is, move
 +cpx #teleb ; check if inactive elec.
 +beq movement_draw ;​ if it is, move
 +cpx #tlbomb ; check if inactive elec.
 +beq movement_draw ;​ if it is, move
 +jmp gameloop ; no movement, back to loop
 +
 +movement_draw:​
 +jsr domovement
 +
 +; check zappers
 +zapcheck:
 +; check up
 +lda #>-40
 +sta tmpptr+1
 +lda #<-40
 +sta tmpptr
 +lda #tzapd
 +jsr zapsearch
 +dex
 +bne death
 +; check down
 +lda #>40
 +sta tmpptr+1
 +lda #<40
 +sta tmpptr
 +lda #tzapu
 +jsr zapsearch
 +dex
 +bne death
 +; check left
 +lda #>-1
 +sta tmpptr+1
 +lda #<-1
 +sta tmpptr
 +lda #tzapr
 +jsr zapsearch
 +dex
 +bne death
 +; check right
 +lda #>1
 +sta tmpptr+1
 +lda #<1
 +sta tmpptr
 +lda #tzapl
 +jsr zapsearch
 +dex
 +bne death
 +jmp gameloop ; end of game loop
 +
 +; - death
 +;
 +death:
 +lda playerptr
 +sta scrptr
 +lda playerptrh
 +sta scrptr+1
 +lda #tdeath
 +jsr printtile
 +lda #>​zaptext
 +sta tmpptr+1
 +lda #<​zaptext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #zaptextcol
 +jsr printstring
 +- jsr getinput
 +sta movedir
 +lda #​%00010000 ;​ fire
 +bit movedir ; test if fire
 +beq -
 +lda ccurlevel
 +sta tmpptr
 +lda ccurlevelh
 +sta tmpptr+1 ; tmpptr -> current level
 +lda #1
 +sta tmp ; load 1 level
 +jmp loadlevel ; restart level
 +
 +; - dropbomb
 +;
 +dropbomb:
 +lda #>​dropbombtext
 +sta tmpptr+1
 +lda #<​dropbombtext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​dropbombtextcol
 +jsr printstring
 +sec
 +lda playerptr
 +sbc #40
 +sta lbombptr
 +lda playerptrh
 +sta lbombptrh
 +bcs +
 +dec lbombptrh ; lbombptr -> bomb_location - 40
 ++ dec ibomb
 +lda #>​bcdbomb
 +sta tmpptr+1
 +lda #<​bcdbomb
 +sta tmpptr
 +jsr bcddec
 +lda underplayer
 +cmp #teleb
 +bne +
 +lda #tground
 ++ sta underlbomb
 +lda #tlbomb
 +sta underplayer
 +inc lbomb
 +lda #0
 +sta underlbombl
 +sta underlbombr
 +jmp gameloop
 +
 +; - elecswitch
 +;
 +elecswitch:
 +lda #>​electext
 +sta tmpptr+1
 +lda #<​electext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​electextcol
 +jsr printstring
 +
 +; point to start of game screen
 +lda #>​gamescreenloc
 +sta scrptr+1
 +lda #<​gamescreenloc
 +sta scrptr
 +ldy #0
 +; replace telea<​->​teleb
 +- lda (scrptr),y
 +cmp #telea
 +bne +
 +lda #teleb
 +jsr printtile
 +jmp ++
 ++ cmp #teleb
 +bne ++
 +lda #telea
 +jsr printtile
 +++ inc scrptr
 +bne +
 +inc scrptr+1
 ++ lda #>​gamescreenendloc
 +cmp scrptr+1
 +bne -
 +lda #<​gamescreenendloc
 +cmp scrptr
 +bne -
 +lda underplayer
 +cmp #telea
 +bne +
 +lda #teleb
 +sta underplayer
 +bne ++
 ++ cmp #teleb
 +bne ++
 +lda #telea
 +sta underplayer
 +++ jmp zapcheck
 +
 +; - rockmove
 +;
 +rockmove:
 +; calculate new rock location
 +clc
 +lda newptr
 +sta tmpptr
 +adc storedptr
 +sta scrptr
 +lda newptrh
 +sta tmpptr+1 ; tmpptr -> old rock location
 +adc storedptrh
 +sta scrptr+1 ; scrptr -> new rock location
 +
 +; check for left & right edges
 +lda #​%00001100 ;​ left or right
 +bit movedir ; test if left or right
 +beq ++ ; skip if not
 +ldx newptrh
 +lda newptr
 +jsr mod40
 +sta tmp ; tmp = new location mod 40
 +lda #​%00000100 ;​ left
 +bit movedir ; test if left
 +beq + ; skip if right
 +lda #39
 +cmp tmp ; check if 39 (left->​right)
 +bne ++ ; skip if not
 +jmp gameloop ; left->​right wrap, back to loop
 ++ lda tmp ; check if 0 (right->​left)
 +bne ++ ; skip if not
 +jmp gameloop ; right->​left wrap, back to loop
 +
 +; check if rock can be moved
 +++ ldy #0
 +lda (scrptr),y
 +tax
 +lda Rocktable,x
 +bne + ; 0 -> cannot move
 +jmp gameloop
 +
 +; draw new rock
 ++ jsr printtile
 +; erase old rock
 +lda newptr
 +sta scrptr
 +lda newptrh
 +sta scrptr+1
 +ldx #tground
 +lda (scrptr),y
 +cmp #trockw
 +bne +
 +ldx #tplankw
 ++ txa
 +jsr printtile
 +jmp movement_draw
 +
 +; - explodebomb
 +;
 +explodebomb:​
 +lda #>​detonatebombtext
 +sta tmpptr+1
 +lda #<​detonatebombtext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​detonatebombtextcol
 +jsr printstring
 +
 +; erase player
 +lda playerptr
 +sta scrptr
 +lda playerptrh
 +sta scrptr+1
 +lda underplayer
 +jsr printtile
 +
 +; check for left & right edges
 +lda lbombptr
 +sta tmpptr
 +ldx lbombptrh
 +stx tmpptr+1
 +jsr mod40
 +tax
 +cpx #39
 +beq ++
 +ldy #41
 +lda (tmpptr),y
 +sta underlbombr
 +++ cpx #0
 +beq ++
 +ldy #39
 +lda (tmpptr),y
 +sta underlbombl
 +
 +; ignite flames, transform tiles
 +++ ldy #0 ; up
 +lda #tfire
 +jsr replacetile
 +tax
 +lda Bombtable,​x ;​ transform old tile
 +sta underlbombu
 +ldy #80 ; down
 +lda #tfire
 +jsr replacetile
 +tax
 +lda Bombtable,​x ;​ transform old tile
 +sta underlbombd
 +lda underlbombl ;​ left (if not on edge)
 +beq ++
 +ldy #39 ; left
 +lda #tfire
 +jsr replacetile
 +tax
 +lda Bombtable,​x ;​ transform old tile
 +sta underlbombl
 +++ lda underlbombr ;​ right (if not on edge)
 +beq ++
 +ldy #41 ; right
 +lda #tfire
 +jsr replacetile
 +tax
 +lda Bombtable,​x ;​ transform old tile
 +sta underlbombr
 +++ ldy #40 ; center
 +lda #tfire
 +jsr replacetile
 +ldx underlbomb
 +lda Bombtable,​x ;​ transform old tile
 +sta underlbomb
 +
 +; artistic delay
 +++ ldx #17
 +jsr delay
 +
 +; redraw tiles
 +ldy #0 ; up
 +lda underlbombu
 +jsr replacetile
 +ldy #80 ; down
 +lda underlbombd
 +jsr replacetile
 +lda underlbombl ;​ left (if not on edge)
 +beq ++
 +ldy #39 ; left
 +jsr replacetile
 +++ lda underlbombr ;​ right (if not on edge)
 +beq ++
 +ldy #41 ; right
 +jsr replacetile
 +++ ldy #40 ; center
 +lda underlbomb
 +jsr replacetile
 +
 +; redraw player
 +lda playerptr
 +sta scrptr
 +lda playerptrh
 +sta scrptr+1
 +ldy #0
 +lda (scrptr),y
 +sta underplayer
 +lda #tplayer
 +jsr printtile
 +dec lbomb
 +jmp zapcheck
 +
 +; - nextlevel
 +;
 +nextlevel:
 +jsr domovement
 +lda level ; check if last level
 +cmp #levels
 +bne +
 +jmp gamewon ; game won
 ++ inc level ; next level
 +lda #>​nextleveltext
 +sta tmpptr+1
 +lda #<​nextleveltext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​nextleveltextcol
 +jsr printstring
 +- jsr getinput
 +sta movedir
 +lda #​%00010000 ;​ fire
 +bit movedir ; test if fire
 +beq -
 +lda #>​bcdlevel
 +sta tmpptr+1
 +lda #<​bcdlevel
 +sta tmpptr
 +jsr bcdinc ; increase level
 +lda cnextlevel
 +sta tmpptr
 +lda cnextlevelh
 +sta tmpptr+1 ; tmpptr -> next level
 +lda #1
 +sta tmp ; load 1 level
 +jmp loadlevel ; load next level
 +
 +; - gamewon
 +;
 +gamewon:
 +lda #>​gamewontext
 +sta tmpptr+1
 +lda #<​gamewontext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​gamewontextcol
 +jsr printstring
 +- jsr getinput
 +sta movedir
 +lda #​%00010000 ;​ fire
 +bit movedir ; test if fire
 +beq -
 +jmp reloadstartmenu
 +
 +
 +; --- Interrupt routines
 +
 +; - IRQ
 +;
 +int:
 +asl $d019 ; ACK interrupt (to re-enable it)
 +pla
 +tay
 +pla
 +tax
 +pla ; pop y,x and a from stack
 +rti ; return
 +
 +; - NMI
 +;
 +nmi:
 +rti ; return
 +
 +
 +; --- Subroutines
 +
 +; - printpickup
 +; parameters:
 +;  x = item
 +;
 +printpickup:​
 +stx pickuptextloc
 +lda #>​pickuptext
 +sta tmpptr+1
 +lda #<​pickuptext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​pickuptextcol
 +jsr printstring
 +rts
 +
 +; - printuseitem
 +; parameters:
 +;  a = item
 +;  x = used on
 +;
 +printuseitem:​
 +sta useitemtextloc
 +stx useitemtextloc2
 +lda #>​useitemtext
 +sta tmpptr+1
 +lda #<​useitemtext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +lda #​useitemtextcol
 +jsr printstring
 +rts
 +
 +
 +; - zapsearch
 +; parameters:
 +;  playerptr -> player
 +;  tmpptr = direction (+-1, +-40)
 +;  a = fatal zapper tile
 +; returns:
 +;  x = 1 if ok, 0 if zapped
 +;  scrptr -> zapper
 +;
 +zapsearch:
 +ldy #0
 +sta tmpvar ; tmpvar = fatal zapper tile
 +cmp #tzapl ; check if left
 +bne +
 +ldy #2
 ++ cmp #tzapr ; check if right
 +bne +
 +ldy #1
 ++ sty movedir ; movedir = 1 if left, 2 if right
 +lda playerptr
 +sta scrptr
 +ldx playerptrh
 +stx scrptr+1 ; scrptr -> player
 +
 +
 +; move to next location
 +- clc
 +lda scrptr
 +adc tmpptr
 +sta scrptr
 +lda scrptr+1
 +adc tmpptr+1
 +sta scrptr+1
 +
 +; check for left&​right edges
 +ldy movedir
 +cpy #0
 +beq ++ ; skip if up or down
 +lda scrptr
 +ldx scrptr+1
 +jsr mod40
 +ldx #1
 +cmp #0
 +bne +
 +cpy #2
 +beq +++ ; moving right, left edge reached (x=1)
 ++ cmp #39
 +bne ++
 +cpy #1
 +beq +++ ; moving left, right edge reached (x=1)
 +
 +; check if fatal zapper
 +++ ldx #0
 +ldy #0
 +lda (scrptr),y
 +cmp tmpvar
 +beq +++ ; jump if fatal zapper (x=0)
 +ldx #1
 +cmp #tground ; check if ground
 +beq -
 +cmp #twater ; check if water
 +beq -
 +cmp #tplankw ; check if plank on water
 +beq -
 +cmp #thole ; check if hole
 +beq -
 +cmp #teleb ; check if inactive elec.
 +beq -
 ++++ rts
 +
 +; - replacetile
 +; parameters:
 +;  tmpptr+y -> location
 +;  a = new tile
 +; returns:
 +;  a = old tile
 +;
 +replacetile:​
 +sta replacetilenew
 +lda (tmpptr),​y ;​ a = old tile
 +pha ; to stack
 +lda tmpptr+1
 +sta scrptr+1
 +clc
 +tya ; a = offset
 +adc tmpptr
 +sta scrptr
 +bcc ++
 +inc scrptr+1 ; scrptr = tmpptr+y
 +replacetilenew=*+1
 +++ lda #123
 +jsr printtile
 +pla ; a = old tile
 +rts
 +
 +; - delay
 +; parameters:
 +;  x = count
 +;
 +delay:
 +lda #rastercmp
 +-- cmp vicraster
 +bne -- ; wait until raster = rastercmp
 +- cmp vicraster
 +beq - ; wait until raster != rastercmp
 +dex
 +bne --
 +rts
 +
 +; - domovement
 +; parametes:
 +;  playerptr -> current player position
 +;  newptr -> new player position
 +;
 +domovement:
 +; redraw old position
 +lda playerptr
 +sta scrptr
 +lda playerptrh
 +sta scrptr+1
 +lda underplayer
 +jsr printtile
 +; move & draw
 +lda newptr
 +sta playerptr
 +sta scrptr
 +lda newptrh
 +sta playerptrh
 +sta scrptr+1
 +ldy #0
 +lda (scrptr),y
 +sta underplayer
 +lda #tplayer
 +jsr printtile
 +rts
 +
 +; - erasestatustext
 +;
 +erasestatustext:​
 +lda #>​blanktext
 +sta tmpptr+1
 +lda #<​blanktext
 +sta tmpptr
 +lda #>​statustextloc
 +sta scrptr+1
 +lda #<​statustextloc
 +sta scrptr
 +jsr printstring
 +rts
 +
 +; - bcdinc
 +; parameters:
 +;  tmpptr -> BCD MSB
 +;
 +bcdinc:
 +ldy #1
 +- lda (tmpptr),y
 +clc
 +adc #1
 +cmp #'​9'​+1
 +bne +
 +lda #'​0'​
 +sta (tmpptr),y
 +dey
 +beq -
 ++ sta (tmpptr),y
 +rts
 +
 +; - bcddec
 +; parameters:
 +;  tmpptr -> BCD MSB
 +;
 +bcddec:
 +ldy #1
 +- lda (tmpptr),y
 +sec
 +sbc #1
 +cmp #'​0'​-1
 +bne +
 +lda #'​9'​
 +sta (tmpptr),y
 +dey
 +beq -
 ++ sta (tmpptr),y
 +rts
 +
 +; - initlevel
 +; parameters:
 +;  tmpptr -> level data
 +;  tmp = levels to advance
 +; returns:
 +;  ccurlevel -> current level data
 +;  cnextlevel -> next level data
 +;  ibomb, iplank ... = 0
 +;
 +initlevel:
 +; blank screen
 +lda $d011
 +and #$ef
 +sta $d011
 +
 +; advance tmp levels
 +- lda tmpptr
 +sta ccurlevel
 +lda tmpptr+1
 +sta ccurlevelh ;​ ccurlevel -> current level
 +jsr unclevel
 +dec tmp
 +bne -
 +
 +lda tmpptr
 +sta cnextlevel
 +lda tmpptr+1
 +sta cnextlevelh ;​ cnextlevel -> next level
 +
 +; reset items / status
 +jsr erasestatustext
 +lda #>​statusbartext1
 +sta tmpptr+1
 +lda #<​statusbartext1
 +sta tmpptr
 +lda #>​statusbartext1loc
 +sta scrptr+1
 +lda #<​statusbartext1loc
 +sta scrptr
 +lda #​statusbartext1col
 +jsr printstring
 +
 +lda #0
 +sta ibomb
 +sta iplank
 +sta ikey1
 +sta ikey2
 +sta iskey
 +sta lbomb
 +
 +; unblank screen
 +lda $d011
 +ora #$10
 +sta $d011
 +rts
 +
 +; - findchar
 +; parameters:
 +;  a = char to find
 +; returns:
 +;  tmpptr -> char at gamescreen
 +;
 +findchar:
 +sta tmp
 +lda #>​gamescreenloc
 +sta tmpptr+1
 +lda #<​gamescreenloc
 +sta tmpptr
 +ldy #0
 +- lda (tmpptr),y
 +cmp tmp ; test if char
 +beq + ; end if zero
 +inc tmpptr
 +bne - ; loop if not zero
 +inc tmpptr+1
 +bne -
 ++ rts
 +
 +; - mod40
 +; parameters:
 +;  a:x -> screen
 +; returns:
 +;  a = (a:​x-screen_offset) mod 40
 +;
 +mod40:
 +dex
 +dex
 +dex
 +dex ; a:x -= screen_offset
 +- cpx #0 ; test MSB
 +bne + ; jump if > 0
 +cmp #40 ; test LSB
 +bcc ++ ; jump if < 40
 ++ sec
 +sbc #40 ; a -= 40
 +bcs - ; jump if no borrow
 +dex ; borrow
 +jmp -
 +++ rts ; return
 +
 +; - printtile
 +; parameters:
 +;  scrptr -> screen location to print to
 +;  a = the tile to print
 +;
 +printtile:
 +tax ; put tile to x
 +
 +; set colptr according to scrptr
 +lda scrptr
 +sta colptr
 +lda scrptr+1
 +clc
 +adc #scrtocol
 +sta colptr+1
 +
 +; print tile
 +ldy #0
 +txa ; get tile from x
 +sta (scrptr),​y ;​ print tile
 +lda Colortable,​x ;​ get tile color
 +sta (colptr),​y ;​ set color
 +rts ; return
 +
 +; - printstring
 +; parameters:
 +;  scrptr -> screen location to print to
 +;  tmpptr -> string to print
 +;  a = the color of normal text
 +;
 +printstring:​
 +sta textcolor
 +
 +; set colptr according to scrptr
 +lda scrptr
 +sta colptr
 +lda scrptr+1
 +clc
 +adc #scrtocol
 +sta colptr+1
 +
 +; string loop
 +ldy #0
 +- lda (tmpptr),y
 +beq +++ ; end if zero
 +sta (scrptr),​y ;​ print char
 +tax
 +and #$40
 +bne ++ ; jump if tile
 +textcolor=*+1
 +lda #3 ; was just text
 +bne +
 +++ lda Colortable,​x
 ++ sta (colptr),​y ;​ set color
 +iny
 +bne - ; loop if not zero
 +inc tmpptr+1
 +inc scrptr+1
 +inc colptr+1
 +bne -
 ++++
 +rts ; return
 +
 +; - unclevel
 +; parameters:
 +;  tmpptr -> compressed level
 +; returns:
 +;  tmpptr -> next compressed level
 +;  scrptr -> screen line after level
 +;  colptr -> color line after level
 +;
 +unclevel:
 +; point to start of game screen
 +lda #>​gamescreenloc
 +sta scrptr+1
 +lda #<​gamescreenloc
 +sta scrptr
 +lda #>​gamecolorloc
 +sta colptr+1
 +lda #<​gamecolorloc
 +sta colptr
 +
 +; main uncompress routine
 +ldy #0
 +-- 
 +lda (tmpptr),y
 +cmp #$ff ; code for "end of level"
 +beq +++
 +and #$1f
 +clc
 +adc #$40
 +tax ; x = char
 +lda (tmpptr),y
 +lsr
 +lsr
 +lsr
 +lsr
 +lsr
 +sta tmpvar
 +inc tmpvar ; tmpvar = loops
 +- txa
 +sta (scrptr),y
 +lda Colortable,​x
 +sta (colptr),y
 +inc scrptr
 +bne +
 +inc scrptr+1
 ++ inc colptr
 +bne +
 +inc colptr+1
 ++ dec tmpvar
 +bne -
 +inc tmpptr
 +bne +
 +inc tmpptr+1
 ++ lda #>​gamescreenendloc
 +cmp scrptr+1
 +bne --
 +lda #<​gamescreenendloc
 +cmp scrptr
 +bne --
 +rts ; return
 +
 +; $ff found, rest of level is ground
 ++++
 +ldx #tground ; x = ground char
 +lda Colortable,​x
 +sta tmpvar ; tmpvar = color
 +- txa
 +sta (scrptr),y
 +lda tmpvar
 +sta (colptr),y
 +inc scrptr
 +bne +
 +inc scrptr+1
 ++ inc colptr
 +bne +
 +inc colptr+1
 ++ lda #>​gamescreenendloc
 +cmp scrptr+1
 +bne -
 +lda #<​gamescreenendloc
 +cmp scrptr
 +bne -
 +inc tmpptr
 +bne +
 +inc tmpptr+1
 ++ rts ; return
 +
 +; - getinput
 +; returns:
 +;  a = action (xxxfrldu, 1 = active)
 +;
 +getinput:
 +lda #0
 +sta joycount ; reset joyrepeat counter
 +-- lda #rastercmp
 +ldy joycount
 +- cmp vicraster
 +bne -           ; wait until raster = rastercmp
 +iny ; y++
 +cpy #​joyrepeat ​ ; check if y >= joyrepeat
 +bcc getinput_j ​ ; if not, skip
 +ldy #0          ; reset joyrepeat counter
 +lda #$ff        ; reset lastjoy for repeat
 +sta lastjoy
 +getinput_j:​ ;​ handle keyboard
 +sty joycount ; store joycount
 +lda joyport ; a = joy
 +tax ; save to x
 +eor lastjoy ; a = joy xor lastjoy
 +and lastjoy ; a = a and lastjoy
 +stx lastjoy ; update lastjoy
 +and #$1f        ; mask + test if anything is pressed
 +beq --          ; if not, wait
 +rts ; return (a = action)
 +
 +
 +; --- Characters ($40-$5F)
 +
 +; ...reused as variables
 +
 +Chars
 + ; ground
 + ;    76543210
 + !by %........ ;0
 + !by %........ ;1
 + !by %........ ;2
 + !by %...##... ;3
 + !by %...##... ;4
 + !by %........ ;5
 + !by %........ ;6
 + !by %........ ;7
 +
 + ; wall
 + ;    76543210
 + !by %###.###. ;0
 + !by %........ ;1
 + !by %.###.### ;2
 + !by %........ ;3
 + !by %###.###. ;4
 + !by %........ ;5
 + !by %.###.### ;6
 + !by %........ ;7
 +
 + ; super wall
 + ;    76543210
 + !by %######## ;0
 + !by %######## ;1
 + !by %######## ;2
 + !by %######## ;3
 + !by %######## ;4
 + !by %######## ;5
 + !by %######## ;6
 + !by %######## ;7
 +
 + ; door1
 + ;    76543210
 + !by %...##... ;0
 + !by %..####.. ;1
 + !by %.######. ;2
 + !by %.######. ;3
 + !by %.####.#. ;4
 + !by %.######. ;5
 + !by %.######. ;6
 + !by %.######. ;7
 +
 + ; door2
 + ;    76543210
 + !by %...##... ;0
 + !by %..####.. ;1
 + !by %.######. ;2
 + !by %.######. ;3
 + !by %.####.#. ;4
 + !by %.######. ;5
 + !by %.######. ;6
 + !by %.######. ;7
 +
 + ; super door
 + ;    76543210
 + !by %...##... ;0
 + !by %..####.. ;1
 + !by %.######. ;2
 + !by %.######. ;3
 + !by %.####.#. ;4
 + !by %.######. ;5
 + !by %.######. ;6
 + !by %.######. ;7
 +
 + ; key1
 + ;    76543210
 + !by %........ ;0
 + !by %...##... ;1
 + !by %..#..#.. ;2
 + !by %...##... ;3
 + !by %...#.... ;4
 + !by %...#.... ;5
 + !by %...###.. ;6
 + !by %........ ;7
 +
 + ; key2
 + ;    76543210
 + !by %........ ;0
 + !by %...##... ;1
 + !by %..#..#.. ;2
 + !by %...##... ;3
 + !by %...#.... ;4
 + !by %...#.... ;5
 + !by %...###.. ;6
 + !by %........ ;7
 +
 + ; super key
 + ;    76543210
 + !by %........ ;0
 + !by %...##... ;1
 + !by %..#..#.. ;2
 + !by %...##... ;3
 + !by %...#.... ;4
 + !by %...#.... ;5
 + !by %...###.. ;6
 + !by %........ ;7
 +
 + ; bomb
 + ;    76543210
 + !by %........ ;0
 + !by %....##.. ;1
 + !by %...#.... ;2
 + !by %..###... ;3
 + !by %.#####.. ;4
 + !by %.#####.. ;5
 + !by %..###... ;6
 + !by %........ ;7
 +
 + ; live bomb
 + ;    76543210
 + !by %........ ;0
 + !by %....##.. ;1
 + !by %...#.... ;2
 + !by %..###... ;3
 + !by %.#####.. ;4
 + !by %.#####.. ;5
 + !by %..###... ;6
 + !by %........ ;7
 +
 + ; unused1
 + ;    76543210
 + !by %#....... ;0
 + !by %........ ;1
 + !by %........ ;2
 + !by %........ ;3
 + !by %........ ;4
 + !by %........ ;5
 + !by %........ ;6
 + !by %........ ;7
 +
 + ; unused2
 + ;    76543210
 + !by %##...... ;0
 + !by %........ ;1
 + !by %........ ;2
 + !by %........ ;3
 + !by %........ ;4
 + !by %........ ;5
 + !by %........ ;6
 + !by %........ ;7
 +
 + ; rock
 + ;    76543210
 + !by %........ ;0
 + !by %...##... ;1
 + !by %..####.. ;2
 + !by %.######. ;3
 + !by %.######. ;4
 + !by %.######. ;5
 + !by %..####.. ;6
 + !by %........ ;7
 +
 + ; rock+plank+water
 + ;    76543210
 + !by %........ ;0
 + !by %...##... ;1
 + !by %..####.. ;2
 + !by %.######. ;3
 + !by %.######. ;4
 + !by %.######. ;5
 + !by %..####.. ;6
 + !by %........ ;7
 +
 + ; rock in a hole
 + ;    76543210
 + !by %........ ;0
 + !by %........ ;1
 + !by %........ ;2
 + !by %...##... ;3
 + !by %..####.. ;4
 + !by %.######. ;5
 + !by %.######. ;6
 + !by %........ ;7
 +
 + ; hole
 + ;    76543210
 + !by %........ ;0
 + !by %........ ;1
 + !by %........ ;2
 + !by %........ ;3
 + !by %........ ;4
 + !by %.######. ;5
 + !by %#......# ;6
 + !by %.######. ;7
 +
 + ; water
 + ;    76543210
 + !by %........ ;2
 + !by %...##..# ;0
 + !by %.##..##. ;1
 + !by %........ ;2
 + !by %........ ;2
 + !by %...##..# ;3
 + !by %.##..##. ;4
 + !by %........ ;5
 +
 + ; plank
 + ;    76543210
 + !by %........ ;0
 + !by %...##... ;1
 + !by %...##... ;2
 + !by %...##... ;3
 + !by %...##... ;4
 + !by %...##... ;5
 + !by %...##... ;6
 + !by %........ ;7
 +
 + ; plank on water
 + ;    76543210
 + !by %........ ;0
 + !by %.##..... ;1
 + !by %..##.... ;2
 + !by %...##... ;3
 + !by %....##.. ;4
 + !by %.....##. ;5
 + !by %......## ;6
 + !by %........ ;7
 +
 + ; electricity A
 + ;    76543210
 + !by %........ ;0
 + !by %......#. ;1
 + !by %....##.. ;2
 + !by %..##.... ;3
 + !by %.######. ;4
 + !by %....##.. ;5
 + !by %..##.... ;6
 + !by %.#...... ;7
 +
 + ; electricity B
 + ;    76543210
 + !by %........ ;0
 + !by %......#. ;1
 + !by %....##.. ;2
 + !by %..##.... ;3
 + !by %.######. ;4
 + !by %....##.. ;5
 + !by %..##.... ;6
 + !by %.#...... ;7
 +
 + ; electricity switch
 + ;    76543210
 + !by %.#.....# ;0
 + !by %#.#...#. ;1
 + !by %###..#.. ;2
 + !by %#.#.#... ;3
 + !by %...#.#.. ;4
 + !by %..#..##. ;5
 + !by %.#...#.# ;6
 + !by %.....##. ;7
 +
 + ; teleport
 + ;    76543210
 + !by %..####.. ;0
 + !by %.##..##. ;1
 + !by %#.#..#.# ;2
 + !by %#.#..#.# ;3
 + !by %#.#..#.# ;4
 + !by %#.####.# ;5
 + !by %##....## ;6
 + !by %.######. ;7
 +
 + ; zapper-down
 + ;    76543210
 + !by %........ ;0
 + !by %.######. ;1
 + !by %..####.. ;2
 + !by %...##... ;3
 + !by %...##... ;4
 + !by %...##... ;5
 + !by %...##... ;6
 + !by %........ ;7
 +
 + ; zapper-up
 + ;    76543210
 + !by %........ ;0
 + !by %...##... ;1
 + !by %...##... ;2
 + !by %...##... ;3
 + !by %...##... ;4
 + !by %..####.. ;5
 + !by %.######. ;6
 + !by %........ ;7
 +
 + ; zapper-right
 + ;    76543210
 + !by %........ ;0
 + !by %.#...... ;1
 + !by %.##..... ;2
 + !by %.######. ;3
 + !by %.######. ;4
 + !by %.##..... ;5
 + !by %.#...... ;6
 + !by %........ ;7
 +
 + ; zapper-left
 + ;    76543210
 + !by %........ ;0
 + !by %......#. ;1
 + !by %.....##. ;2
 + !by %.######. ;3
 + !by %.######. ;4
 + !by %.....##. ;5
 + !by %......#. ;6
 + !by %........ ;7
 +
 + ; cash
 + ;    76543210
 + !by %..#..#.. ;0
 + !by %.######. ;1
 + !by %#.#..#.# ;2
 + !by %#.#..#.. ;3
 + !by %.######. ;4
 + !by %..#..#.# ;5
 + !by %#.#..#.# ;6
 + !by %.######. ;7
 +
 + ; player
 + ;    76543210
 + !by %...##... ;0
 + !by %..####.. ;1
 + !by %...##... ;2
 + !by %.######. ;3
 + !by %...##... ;4
 + !by %...##... ;5
 + !by %..#..#.. ;6
 + !by %..#..#.. ;7
 +
 + ; death
 + ;    76543210
 + !by %...##... ;0
 + !by %...##... ;1
 + !by %.######. ;2
 + !by %.######. ;3
 + !by %...##... ;4
 + !by %...##... ;5
 + !by %...##... ;6
 + !by %...##... ;7
 +
 + ; fire
 + ;    76543210
 + !by %........ ;0
 + !by %.#...#.. ;1
 + !by %..#.#... ;2
 + !by %.#..#.#. ;3
 + !by %..##.#.. ;4
 + !by %.##.###. ;5
 + !by %.#.#..#. ;6
 + !by %..####.. ;7
 +
 +
 +; --- Color lookup table (with $40 offset)
 +
 +Colortable = *-$40
 +!if easymode = 0 {
 +!by 0 ; ground (black,0)
 +} else {
 +!by 5 ; ground
 +}
 +!by 2 ; wall (red,2)
 +!by 11 ; super wall (dgray,11)
 +!by 9 ; door1 (brown,9)
 +!by 7 ; door2 (yellow,7)
 +!by 15 ; super door (lgray,15)
 +!by 9 ; key1 (brown,9)
 +!by 7 ; key2 (yellow,7)
 +!by 15 ; super key (lgray,15)
 +!by 12 ; bomb (gray,12)
 +!by 1 ; live bomb (white,1)
 +!by 2 ; unused1
 +!by 3 ; unused2
 +!by 11 ; rock (dgray,11)
 +!by 11 ; rock+plank+water (dgray,11)
 +!by 11 ; rock in a hole (dgray,11)
 +!by 11 ; hole (dgray,11)
 +!by 6 ; water (blue,6)
 +!by 9 ; plank (brown,9)
 +!by 9 ; plank on water (brown,9)
 +!by 7 ; electricity A (yellow,7)
 +!if easymode = 0 {
 +!by 0 ; electricity B (black,0)
 +} else {
 +!by 6 ; electricity B
 +}
 +!by 5 ; electricity switch (green,5)
 +!by 4 ; teleport (purple,4)
 +!by 10 ; zapper-down (pink,10)
 +!by 10 ; zapper-up (pink,10)
 +!by 10 ; zapper-right (pink,10)
 +!by 10 ; zapper-left (pink,10)
 +!by 7 ; cash (yellow,7)
 +!by 12 ; player (gray,12)
 +!by 12 ; death (gray,12)
 +!by 2 ; fire (red,2)
 +
 +
 +; --- Bomb transform lookup table (with $40 offset)
 +
 +Bombtable = *-$40
 +!by tground ; ground
 +!by tground ; wall
 +!by tswall ; super wall
 +!by tground ; door1
 +!by tground ; door2
 +!by tsdoor ; super door
 +!by tkey1 ; key1
 +!by tkey2 ; key2
 +!by tskey ; super key
 +!by tbomb ; bomb
 +!by 0 ; live bomb
 +!by 0 ; unused1
 +!by 0 ; unused2
 +!by tground ; rock
 +!by tplankw ; rock+plank+water
 +!by thole ; rock in a hole
 +!by thole ; hole
 +!by twater ; water
 +!by tplank ; plank
 +!by tplankw ; plank on water
 +!by telea ; electricity A
 +!by tground ; electricity B
 +!by teles ; electricity switch
 +!by ttele ; teleport
 +!by tground ; zapper-down
 +!by tground ; zapper-up
 +!by tground ; zapper-right
 +!by tground ; zapper-left
 +!by tcash ; cash
 +!by tplayer ; player
 +!by 0 ; death
 +!by 0 ; fire
 +
 +
 +; --- Rock transform lookup table (with $40 offset)
 +
 +Rocktable = *-$40
 +!by trock ; ground
 +!by 0 ; wall
 +!by 0 ; super wall
 +!by 0 ; door1
 +!by 0 ; door2
 +!by 0 ; super door
 +!by 0 ; key1
 +!by 0 ; key2
 +!by 0 ; super key
 +!by 0 ; bomb
 +!by 0 ; live bomb
 +!by 0 ; unused1
 +!by 0 ; unused2
 +!by 0 ; rock
 +!by 0 ; rock+plank+water
 +!by 0 ; rock in a hole
 +!by trockh ; hole
 +!by twater ; water
 +!by 0 ; plank
 +!by trockw ; plank on water
 +!by 0 ; electricity A
 +!by trock ; electricity B
 +!by 0 ; electricity switch
 +!by 0 ; teleport
 +!by 0 ; zapper-down
 +!by 0 ; zapper-up
 +!by 0 ; zapper-right
 +!by 0 ; zapper-left
 +!by 0 ; cash
 +!by 0 ; player
 +!by 0 ; death
 +!by 0 ; fire
 +
 +
 +; --- Strings
 +
 +; - Common strings
 +
 +gametitletext
 +!tx thole,​trockh,​trock,"​ quest for cash ",​tcash,"​ by hannu nuotio ",​trock,​trockh,​thole,​0
 +topbottomborder
 +!fi 40,tswall
 +!by 0
 +statusbartext1
 +!tx tbomb,"​=00 "
 +!tx tplank,"​=00 "
 +!tx tkey1,"​=00 "
 +!tx tkey2,"​=00 "
 +!tx tskey,"​=00",​0
 +statusbartext2
 +!tx "level 01",0
 +
 +teleporttext
 +!tx " ​          ",​ttele," ​ teleported ​ ",​ttele," ​            "​
 +!by 0
 +
 +electext
 +!tx " ​       ",​telea,"​ electricity switched ",​telea," ​       "
 +!by 0
 +
 +pickuptext
 +!tx " ​             picked up x               "​
 +!by 0
 +
 +useitemtext
 +!tx " ​             used x on y               "​
 +!by 0
 +
 +dropbombtext
 +!tx " ​  ​dropped ",​tlbomb,"​. press fire to detonate ​   "
 +!by 0
 +
 +detonatebombtext
 +!tx " ​            ",​tfire,​tfire,​tfire,"​ boom! ",​tfire,​tfire,​tfire," ​             "
 +!by 0
 +
 +restarttext
 +!tx " ​     press fire again to restart ​      "​
 +!by 0
 +
 +nextleveltext
 +!tx "you got the ",​tcash,"​! press fire for next level"
 +!by 0
 +
 +gamewontext
 +!tx " ​      ",​tcash,​tcash,​tcash,"​ congratulations! ",​tcash,​tcash,​tcash," ​        "​
 +!by 0
 +
 +zaptext
 +!tx " ​ ",​tzapr,"​ zapped! ",​tzapl," ​ press fire to restart ​   "
 +!by 0
 +
 +; - Help screens
 +
 +;    |---------0---------0---------0--------|
 +helptext
 +!tx " help screen 1/3 : controls ​            "​
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!if joystick = 0 {
 +!tx " ​  use joystick in port 2               "​
 +} else {
 +!tx " ​  use joystick in userport ​            "​
 +}
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx "menu controls: ​    ​joystick ​            "​
 +!tx " ​                                       "
 +!tx " ​ start game   ​- ​    ​fire ​              "​
 +!tx " select level  -  left/​right ​           "
 +!tx " ​ browse help  -    up/​down ​            "​
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx "game controls: ​    ​joystick ​            "​
 +!tx " ​                                       "
 +!tx " ​    ​move ​     - up/​down/​left/​right ​    "​
 +!tx " restart level -  fire (if ",​tbomb,"​=00) ​       "
 +!tx " ​  drop bomb   ​- ​ fire (if ",​tbomb,">​00) ​       "
 +!tx " detonate bomb -  fire (if ",​tlbomb,"​) ​          "​
 +blanktext
 +!tx " ​                                       "
 +!by 0
 +
 +!tx " help screen 2/3 : instructions ​        "​
 +!tx " ​                                       "
 +!tx "move ",​tplayer,"​ to ",​tcash,"​. ​                           "
 +!tx " ​                                       "
 +!tx "​collect ",​tkey1,​tkey2,​tskey,"​ to open ", tdoor1,​tdoor2,​tsdoor,"​. ​               "
 +!tx " ​                                       "
 +!tx "​collect and use ",​tplank,"​ to transform ",​twater,"​ to ",​tplankw,"​. ​ "
 +!tx " ​                                       "
 +!tx "​collect ",​tbomb,",​ drop it (",​tlbomb,"​) and detonate (",​tfire,"​) to destroy "
 +!tx twall,​tdoor1,​tdoor2,​trock,​trockh,​tzapu,​tzapd,​tzapl,​tzapr,​tplankw,"​ and inactive ",​telea,"​. ​  "​
 +!tx " ​                                       "
 +!tx "use ",​teles,"​ to toggle ",​telea,"​. ​                     "
 +!tx "use ",​ttele,"​ to teleport to another ",​ttele,"​. ​        "​
 +!tx " ​                                       "
 +!tx "avoid ",​tzapu,​tzapd,​tzapl,​tzapr
 +!tx " or they will turn ",​tplayer,"​ to ",​tdeath,"​. ​   "
 +!tx "hide behind anything except "
 +!tx twater,​tplankw,​thole
 +!tx "​. ​       "
 +!tx " ​                                       "
 +!tx "push ",​trock,​ " into ",​twater,"​ to get rid of ",​trock,"​. "
 +!tx "​pushing ", trock, "into ",​thole,"​ makes ",​trockh,​ " (which cannot be pushed)."​
 +!tx "push ",​trock,"​ over inactive ",​telea,"​ to destroy the ",​telea,"​."​
 +!by 0
 +
 +helptextlast
 +!tx " help screen 3/3 : credits & info       "​
 +!tx " ​                                       "
 +!tx "quest for cash is a c64 port of an old  "
 +!tx "​qbasic game, both by hannu nuotio ​      "​
 +!tx " ​                                       "
 +!tx "​levelset info:                          "
 +!tx " levels 01-15 are from the original qfc "
 +!tx " ​ by hannu nuotio & friends ​            "​
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!tx " ​                                       "
 +!by 0
 +
 +
 +; --- Levels (compressed)
 +
 +clevels
 +; level 01
 +!by $e2, $e2, $e2, $62, $80, $62, $20, $17, $1d, $00, $06, $00, $02, $80, $11, $80
 +!by $02, $00, $16, $00, $0d, $00, $14, $20, $15, $60, $0d, $20, $05, $00, $17, $02
 +!by $c0, $03, $40, $12, $00, $02, $20, $09, $20, $01, $40, $0d, $00, $15, $00, $10
 +!by $14, $00, $02, $1a, $20, $08, $00, $02, $20, $02, $1c, $20, $e2, $e2, $e2, $e2
 +!by $e2, $ff
 +; level 02
 +!by $e1, $41, $e0, $e0, $e0, $80, $01, $00, $0d, $c0, $01, $e0, $e0, $e0, $80, $01
 +!by $00, $0d, $c0, $01, $e0, $e0, $e0, $80, $01, $12, $0d, $20, $2d, $40, $01, $e0
 +!by $e0, $e0, $80, $01, $00, $11, $c0, $01, $e0, $e0, $e0, $80, $01, $00, $01, $00
 +!by $0d, $20, $01, $20, $01, $e0, $e0, $e0, $80, $21, $1c, $11, $4d, $00, $01, $00
 +!by $01, $e0, $e0, $e0, $80, $01, $4d, $00, $0d, $00, $0d, $41, $e0, $e0, $e0, $80
 +!by $01, $2d, $40, $0d, $40, $01, $e0, $e0, $e0, $80, $01, $0d, $20, $1d, $80, $01
 +!by $e0, $e0, $e0, $80, $e1, $41, $ff
 +; level 03
 +!by $e0, $e0, $e0, $e0, $e0, $e0, $e0, $c0, $81, $e0, $e0, $e0, $e0, $40, $01, $00
 +!by $16, $00, $01, $e0, $a0, $12, $e0, $e0, $60, $01, $4d, $01, $e0, $e0, $e0, $e0
 +!by $80, $11, $e0, $e0, $00, $54, $e0, $40, $a1, $e0, $e0, $60, $14, $0d, $14, $e0
 +!by $40, $01, $60, $01, $e0, $e0, $60, $54, $e0, $40, $03, $75, $01, $e0, $e0, $e0
 +!by $e0, $20, $01, $55, $1c, $01, $e0, $e0, $e0, $80, $06, $00, $1b, $20, $01, $60
 +!by $01, $e0, $e0, $e0, $e0, $20, $a1, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0
 +!by $e0, $e0, $e0, $e0, $e0, $80, $01, $20, $01, $00, $01, $20, $61, $40, $81, $e0
 +!by $20, $1d, $e0, $00, $01, $00, $01, $20, $01, $20, $01, $40, $01, $20, $01, $e0
 +!by $e0, $e0, $21, $40, $01, $20, $61, $40, $81, $e0, $e0, $60, $01, $00, $01, $20
 +!by $01, $20, $01, $00, $01, $e0, $01, $e0, $e0, $60, $01, $00, $01, $20, $01, $20
 +!by $01, $20, $01, $40, $81, $e0, $e0, $60, $01, $20, $01, $00, $01, $20, $01, $20
 +!by $01, $ff
 +; level 04
 +!by $e0, $e0, $e0, $e0, $e0, $00, $1d, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0
 +!by $c0, $55, $40, $16, $e0, $e0, $e0, $e0, $00, $15, $0d, $15, $e0, $e0, $e0, $e0
 +!by $80, $55, $e0, $e0, $e0, $e0, $80, $54, $e0, $e0, $e0, $e0, $80, $14, $0d, $14
 +!by $e0, $e0, $e0, $e0, $80, $54, $e0, $e0, $e0, $e0, $e0, $e0, $c0, $19, $e0, $e0
 +!by $e0, $e0, $20, $06, $40, $1b, $00, $1a, $e0, $e0, $e0, $e0, $a0, $18, $e0, $e0
 +!by $e0, $e0, $e0, $e0, $a1, $e0, $e0, $e0, $e0, $20, $03, $00, $04, $00, $1c, $01
 +!by $e0, $e0, $e0, $e0, $20, $a1, $e0, $e0, $e0, $00, $07, $ff
 +; level 05
 +!by $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $80, $0d, $00, $2d, $00, $0d
 +!by $00, $2d, $20, $2d, $e0, $e0, $e0, $40, $8d, $09, $ed, $e0, $e0, $e0, $20, $8d
 +!by $11, $0d, $00, $0d, $20, $2d, $00, $0d, $20, $1b, $e0, $e0, $80, $2d, $00, $0d
 +!by $00, $2d, $00, $0d, $00, $2d, $00, $4d, $e0, $e0, $e0, $00, $2d, $00, $0d, $00
 +!by $0d, $00, $1d, $0d, $00, $0d, $18, $0d, $00, $2d, $e0, $e0, $c0, $4d, $00, $0d
 +!by $00, $0d, $00, $0d, $00, $0d, $20, $0d, $00, $2d, $e0, $e0, $e0, $4d, $00, $2d
 +!by $00, $0d, $00, $0d, $00, $0d, $00, $4d, $e0, $e0, $e0, $20, $2d, $00, $ad, $00
 +!by $4d, $e0, $e0, $c0, $1a, $60, $0d, $40, $4d, $00, $0d, $e0, $e0, $e0, $e0, $e0
 +!by $e0, $e0, $e0, $e0, $60, $01, $00, $01, $19, $e0, $e0, $e0, $e0, $60, $01, $00
 +!by $01, $e0, $e0, $e0, $e0, $80, $01, $00, $01, $e0, $e0, $e0, $e0, $80, $01, $20
 +!by $e1, $01, $00, $e1, $21, $e0, $e0, $00, $21, $e0, $1a, $00, $01, $06, $01, $00
 +!by $1b, $20, $03, $1c, $21, $e0, $e0, $40, $e1, $21, $00, $e1, $21, $ff
 +; level 06
 +!by $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $40, $1d, $a0, $0d, $e0, $e0
 +!by $e0, $e0, $a0, $0d, $20, $1b, $c0, $95, $e0, $e0, $a0, $0d, $e0, $60, $15, $40
 +!by $15, $e0, $e0, $0d, $40, $0d, $20, $0d, $00, $12, $00, $12, $c0, $95, $e0, $e0
 +!by $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $51, $c0, $01, $04, $01, $e0
 +!by $e0, $e0, $20, $1a, $11, $00, $11, $c0, $01, $06, $01, $e0, $e0, $e0, $40, $11
 +!by $16, $11, $c0, $41, $e0, $e0, $e0, $40, $51, $e0, $e0, $e0, $e0, $e0, $e0, $00
 +!by $19, $e0, $e0, $e0, $e0, $e0, $20, $1a, $00, $07, $e0, $61, $e0, $e0, $e0, $e0
 +!by $60, $03, $34, $01, $e0, $e0, $e0, $e0, $60, $01, $1c, $14, $01, $e0, $e0, $e0
 +!by $e0, $60, $61, $ff
 +; level 07
 +!by $a0, $21, $00, $0d, $40, $0d, $00, $0d, $c0, $0d, $40, $01, $60, $f1, $20, $1d
 +!by $40, $01, $06, $00, $0d, $00, $0d, $00, $0d, $40, $0d, $40, $2d, $00, $0d, $00
 +!by $0d, $21, $60, $d1, $81, $00, $21, $00, $0d, $00, $0d, $40, $0d, $00, $0d, $00
 +!by $0d, $00, $0d, $00, $0d, $00, $0d, $e0, $b1, $a0, $01, $00, $0d, $00, $0d, $00
 +!by $61, $00, $e1, $a1, $60, $91, $a0, $c1, $20, $41, $e0, $20, $51, $80, $71, $a0
 +!by $0d, $e0, $00, $0d, $40, $41, $a0, $31, $a0, $51, $21, $03, $e1, $41, $00, $a1
 +!by $e0, $00, $11, $c0, $31, $12, $11, $0d, $01, $0d, $00, $0d, $00, $16, $00, $0d
 +!by $00, $0d, $01, $00, $01, $e0, $a0, $11, $e0, $51, $00, $01, $ed, $21, $00, $21
 +!by $e0, $80, $11, $e0, $11, $40, $01, $e0, $01, $40, $01, $e0, $80, $11, $e0, $11
 +!by $40, $01, $e0, $01, $40, $01, $e0, $80, $11, $e0, $11, $20, $0d, $01, $e0, $01
 +!by $20, $0d, $01, $e0, $80, $11, $c0, $31, $e0, $60, $21, $12, $21, $e0, $80, $11
 +!by $a0, $51, $e0, $80, $41, $11, $e0, $60, $51, $60, $71, $c0, $b4, $41, $31, $e0
 +!by $20, $f1, $71, $c0, $14, $95, $41, $f1, $f1, $f1, $c0, $14, $15, $60, $41, $31
 +!by $a0, $31, $20, $d1, $81, $c0, $14, $15, $20, $07, $00, $41, $11, $a0, $71, $20
 +!by $51, $00, $12, $00, $04, $14, $20, $01, $c0, $14, $15, $60, $41, $c0, $11, $32
 +!by $11, $40, $11, $60, $01, $14, $1c, $00, $e1, $e1, $01, $a0, $b1, $c0, $81
 +; level 08
 +!by $1d, $e0, $c0, $11, $e0, $e0, $00, $8d, $16, $80, $41, $00, $0d, $a0, $11, $e0
 +!by $e0, $2d, $00, $4d, $a0, $01, $07, $01, $e0, $11, $e0, $e0, $4d, $e0, $00, $01
 +!by $07, $01, $e0, $11, $e0, $c0, $0d, $00, $0d, $00, $0d, $00, $2d, $80, $41, $e0
 +!by $11, $e0, $c0, $2d, $00, $0d, $00, $4d, $e0, $e0, $11, $e0, $e0, $6d, $00, $2d
 +!by $e0, $c0, $51, $e0, $e0, $40, $0d, $00, $0d, $e0, $a0, $11, $15, $19, $15, $11
 +!by $e0, $e0, $e0, $e0, $40, $11, $1b, $1c, $1a, $11, $e0, $e0, $e0, $e0, $40, $11
 +!by $15, $18, $15, $11, $e0, $e0, $e0, $e0, $60, $51, $e0, $e0, $e0, $e0, $e0, $e0
 +!by $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0
 +!by $c0, $61, $00, $0d, $e0, $20, $0d, $e0, $e0, $a0, $a1, $e0, $e0, $e0, $e0, $20
 +!by $01, $00, $12, $00, $24, $e0, $e0, $e0, $e0, $20, $a1, $e0, $e0, $e0, $c0, $54
 +!by $00, $61, $e0, $e0, $e0, $e0, $14, $29
 +; level 09
 +!by $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $e0, $c0, $1b, $a0, $e1, $e1, $e1, $c1
 +!by $e0, $0d, $01, $60, $01, $e0, $e0, $60, $03, $40, $01, $06, $40, $1d, $60, $03
 +!by $00, $06, $20, $03, $80, $e1, $e1, $4d, $01, $e0, $0d, $01, $60, $01, $60, $81
 +!by $e0, $20, $21, $00, $0d, $00, $01, $00, $15, $1b, $a0, $01, $60, $01, $40, $a1
 +!by $40, $95, $20, $21, $0d, $00, $0d, $01, $e0, $00, $21, $03, $41, $e0, $04, $40
 +!by $35, $14, $35, $20, $21, $40, $01, $e0, $00, $01, $80, $01, $20, $a1, $40, $15
 +!by $14, $1c, $14, $15, $20, $21, $0d, $20, $01, $e0, $00, $01, $a0, $01, $20, $81
 +!by $40, $35, $14, $35, $20, $21, $2d, $12, $01, $e0, $00, $01, $c0, $01, $20, $61
 +!by $40, $95, $20, $a1, $e0, $00, $01, $e0, $01, $20, $41, $e0, $20, $21, $49, $01
 +!by $e0, $00, $01, $40, $c1, $20, $e1, $a1, $49, $04, $e0, $00, $01, $40, $01, $a0
 +!by $01, $20, $e1, $81, $49, $01, $e0, $00, $01, $e0, $40, $01, $20, $e1, $e1, $20
 +!by $1b, $a0, $01, $40, $01, $80, $26, $00, $01, $e0, $60, $03, $11, $20, $01, $e0
 +!by $00, $01, $40, $01, $a0, $06, $20, $01, $e0, $40, $01, $20, $07, $01, $16, $e0
 +!by $e1, $e1, $e1, $c1, $e0, $e0, $e0, $e0, $e0, $20, $1b, $ff
 +; level 10
 +!by $62, $e0, $01, $40, $12, $01, $e0, $60, $e2, $42, $1c, $17, $02, $e0, $01, $40
 +!by $1b, $01, $e0, $60, $02, $e9, $82, $e0, $01, $20, $19, $11, $01, $e0, $60, $e2
 +!by $09, $02, $60, $16, $80, $15, $00, $1b, $01, $00, $41, $e0, $60, $0f, $14, $15
 +!by $14, $15, $14, $15, $14, $15, $02, $e0, $40, $04, $e0, $e0, $20, $e2, $09, $02
 +!by $a0, $10, $40, $10, $0d, $10, $e0, $e0, $00, $02, $e9, $02, $60, $15, $03, $0d
 +!by $10, $40, $10, $e0, $e0, $20, $e2, $22, $61, $19, $00, $10, $e0, $e0, $a0, $10
 +!by $0d, $00, $0d, $00, $0d, $20, $08, $a0, $01, $e0, $e0, $e0, $10, $2d, $20, $0d
 +!by $e0, $e0, $e0, $e0, $40, $10, $4d, $20, $2d, $00, $0d, $40, $1b, $01, $e0, $e0
 +!by $e0, $00, $10, $0d, $00, $4d, $00, $4d, $32, $19, $11, $01, $e0, $e0, $e0, $20
 +!by $10, $2d, $00, $6d, $00, $e2, $62, $e0, $e0, $60, $30, $4d, $00, $2d, $06, $a0
 +!by $10, $40, $02, $e0, $e0, $a0, $b0, $15, $00, $10, $00, $10, $00, $10, $0d, $10
 +!by $20, $02, $e0, $e0, $e0, $60, $14, $15, $10, $40, $10, $60, $02, $e0, $e0, $e0
 +!by $60, $11, $14, $15, $00, $10, $80, $10, $05, $e0, $e0, $e0, $60, $31, $14, $15
 +!by $20, $10, $60, $02, $e0, $e0, $e0, $60, $51, $14, $15, $20, $10, $40, $02, $e0
 +!by $e0, $e0, $60, $17, $51, $14, $15, $07, $00, $10, $20, $02, $e0, $e0, $e0, $40
 +!by $1d
 +; level 11
 +!by $e1, $e1, $e1, $e1, $e1, $01, $40, $04, $e0, $40, $0d, $e0, $03, $e0, $60, $06
 +!by $21, $00, $18, $21, $20, $31, $0d, $e0, $01, $d1, $80, $01, $60, $01, $20, $21
 +!by $20, $01, $00, $01, $71, $c0, $41, $e0, $40, $21, $40, $01, $20, $21, $20, $01
 +!by $20, $01, $18, $11, $0d, $11, $c0, $01, $e0, $60, $01, $18, $01, $20, $01, $20
 +!by $21, $20, $01, $20, $01, $00, $31, $a0, $01, $00, $01, $00, $01, $e0, $20, $01
 +!by $34, $01, $09, $01, $20, $21, $20, $01, $00, $01, $e0, $40, $41, $0d, $e0, $20
 +!by $01, $40, $21, $20, $21, $20, $21, $e0, $80, $01, $e0, $60, $01, $20, $0d, $00
 +!by $01, $20, $21, $e0, $e0, $00, $01, $e0, $e0, $60, $21, $e0, $e0, $41, $e0, $e0
 +!by $40, $21, $e0, $e0, $00, $01, $e0, $e0, $60, $21, $e0, $c0, $01, $00, $01, $00
 +!by $01, $60, $35, $e0, $60, $21, $e0, $40, $01, $60, $41, $60, $01, $1a, $15, $e0
 +!by $60, $21, $e0, $00, $e1, $e1, $01, $e0, $60, $21, $e0, $40, $01, $60, $41, $40
 +!by $18, $01, $e0, $a0, $21, $e0, $c0, $01, $00, $01, $00, $01, $e0, $e0, $20, $21
 +!by $a0, $2d, $a0, $14, $00, $1b, $01, $1a, $e0, $e0, $40, $21, $c0, $1c, $19, $a0
 +!by $14, $41, $e0, $e0, $1d, $20, $21, $12, $19, $e0, $c0, $01, $16, $60, $29, $0d
 +!by $e0, $20, $19, $07, $e1, $e1, $e1, $e1, $e1, $01
 +; level 12
 +!by $e1, $e1, $e1, $e1, $e1, $01, $b1, $e0, $e0, $e0, $c0, $18, $c1, $11, $40, $0d
 +!by $e0, $c0, $6d, $a1, $40, $21, $49, $00, $03, $13, $e0, $e0, $00, $0d, $e1, $61
 +!by $20, $c1, $91, $e0, $80, $0d, $a1, $18, $20, $41, $20, $21, $b1, $41, $31, $e0
 +!by $60, $0d, $21, $27, $80, $41, $20, $e1, $18, $20, $01, $11, $e0, $60, $0d, $21
 +!by $12, $20, $0d, $20, $2d, $21, $20, $21, $e0, $01, $31, $e0, $60, $0d, $a1, $14
 +!by $81, $20, $21, $18, $1a, $80, $01, $31, $e0, $c0, $81, $14, $61, $00, $0d, $00
 +!by $21, $a0, $0d, $01, $31, $e0, $80, $0d, $91, $01, $14, $01, $a0, $21, $16, $a0
 +!by $15, $33, $e0, $20, $01, $2d, $b1, $01, $00, $01, $a0, $21, $a0, $0d, $01, $31
 +!by $e0, $00, $21, $f1, $01, $00, $01, $a0, $21, $19, $1a, $80, $01, $31, $e0, $21
 +!by $f1, $11, $01, $00, $21, $80, $21, $e0, $01, $31, $c0, $01, $f1, $31, $01, $e0
 +!by $e1, $19, $20, $01, $11, $c0, $01, $f1, $31, $01, $00, $21, $80, $21, $b1, $41
 +!by $31, $c0, $04, $91, $1c, $71, $01, $00, $e1, $a1, $91, $c0, $21, $f1, $31, $01
 +!by $e0, $21, $72, $04, $11, $e0, $20, $21, $f1, $51, $01, $a0, $1d, $00, $c1, $11
 +!by $e0, $06, $2d, $f1, $71, $01, $00, $0d, $00, $21, $40, $e1, $e1, $e1, $e1, $e1
 +!by $01
 +; level 13
 +!by $1d, $4d, $00, $0d, $12, $2d, $51, $e0, $40, $11, $e0, $e0, $2d, $20, $0d, $40
 +!by $0d, $51, $40, $1b, $07, $1a, $80, $31, $e0, $e0, $4d, $20, $2d, $00, $51, $40
 +!by $1b, $07, $1a, $60, $71, $e0, $60, $31, $2d, $00, $4d, $00, $b1, $e0, $d1, $16
 +!by $c0, $b1, $01, $00, $01, $f1, $f1, $f1, $11, $01, $00, $01, $f1, $11, $01, $00
 +!by $01, $f1, $f1, $f1, $11, $01, $00, $01, $f1, $11, $01, $00, $01, $f1, $f1, $f1
 +!by $11, $01, $00, $01, $f1, $21, $00, $21, $20, $01, $f1, $f1, $91, $01, $00, $01
 +!by $d1, $00, $01, $20, $21, $20, $81, $18, $f1, $91, $74, $20, $15, $b1, $00, $01
 +!by $e0, $00, $06, $01, $40, $f1, $31, $54, $31, $f5, $11, $00, $a1, $00, $81, $09
 +!by $20, $f1, $31, $54, $f1, $11, $15, $11, $e0, $e0, $00, $f1, $74, $b1, $75, $11
 +!by $e0, $e0, $00, $f1, $74, $b1, $15, $71, $e0, $e0, $20, $f1, $54, $71, $55, $71
 +!by $e0, $e0, $40, $f1, $34, $71, $15, $b1, $e0, $e0, $40, $b1, $74, $71, $15, $b1
 +!by $a1, $e0, $80, $31, $40, $94, $71, $15, $b1, $a1, $e0, $60, $03, $11, $80, $11
 +!by $00, $b1, $b5, $11, $1c, $40, $21, $60, $4d, $80, $71, $40, $11, $00, $f1, $51
 +!by $15, $11, $60, $24, $60, $0d, $12, $0d, $40, $f1, $40, $f5, $75, $11
 +; level 14
 +!by $e1, $e1, $e1, $e1, $e1, $01, $08, $18, $20, $02, $20, $33, $18, $f3, $73, $2d
 +!by $d3, $c0, $21, $40, $17, $02, $00, $0d, $e0, $e0, $e0, $c0, $21, $82, $c0, $81
 +!by $c0, $54, $c0, $41, $09, $21, $e0, $60, $01, $09, $20, $01, $a0, $22, $03, $22
 +!by $80, $01, $51, $41, $c0, $19, $21, $e0, $00, $21, $20, $22, $17, $22, $60, $15
 +!by $18, $01, $11, $01, $11, $21, $e0, $41, $00, $e1, $01, $00, $19, $82, $60, $15
 +!by $00, $09, $31, $08, $21, $80, $10, $e0, $e0, $60, $18, $80, $15, $10, $11, $18
 +!by $31, $21, $40, $19, $01, $22, $21, $40, $01, $22, $21, $40, $01, $22, $21, $40
 +!by $01, $22, $21, $15, $00, $11, $0d, $00, $21, $e0, $01, $c0, $01, $a0, $06, $01
 +!by $40, $18, $09, $00, $18, $01, $15, $60, $21, $e0, $10, $e0, $e0, $e0, $15, $60
 +!by $21, $60, $01, $22, $21, $40, $01, $22, $21, $40, $01, $22, $21, $40, $01, $22
 +!by $21, $15, $60, $21, $e0, $01, $c0, $01, $80, $0d, $00, $01, $a0, $18, $01, $15
 +!by $60, $21, $e0, $10, $c0, $10, $40, $09, $19, $e0, $40, $15, $60, $21, $60, $01
 +!by $22, $21, $40, $01, $22, $21, $20, $19, $01, $22, $21, $40, $01, $22, $21, $15
 +!by $60, $21, $c0, $09, $01, $40, $1b, $00, $07, $18, $01, $c0, $01, $c0, $01, $15
 +!by $60, $21, $1a, $e0, $e0, $e0, $19, $c0, $15, $60, $61, $04, $81, $03, $81, $04
 +!by $81, $03, $81, $04, $a1, $00, $24, $61, $16, $40, $06, $01, $20, $07, $09, $00
 +!by $01, $06, $60, $01, $60, $09, $01, $60, $09, $01, $42, $60, $32, $e1, $e1, $e1
 +!by $c1, $02, $1c, $05, $0d, $1d, $20, $27
 +; level 15
 +!by $21, $31, $21, $16, $11, $21, $31, $21, $31, $21, $31, $21, $31, $21, $31, $14
 +!by $01, $31, $21, $31, $21, $51, $1d, $18, $14, $18, $01, $11, $01, $00, $01, $11
 +!by $01, $00, $01, $12, $01, $00, $01, $06, $01, $00, $01, $12, $01, $00, $01, $12
 +!by $01, $14, $01, $06, $01, $00, $01, $07, $01, $00, $01, $16, $21, $00, $11, $20
 +!by $41, $13, $01, $0d, $01, $13, $41, $13, $41, $13, $41, $13, $41, $14, $41, $13
 +!by $41, $13, $21, $31, $e0, $80, $04, $e0, $40, $13, $00, $14, $00, $09, $00, $15
 +!by $00, $07, $00, $15, $20, $21, $00, $11, $00, $09, $11, $00, $11, $00, $11, $00
 +!by $11, $20, $18, $f4, $54, $18, $11, $14, $f1, $11, $00, $31, $00, $12, $e0, $a0
 +!by $13, $11, $1a, $11, $09, $11, $1b, $11, $13, $15, $20, $11, $14, $11, $13, $11
 +!by $14, $11, $13, $11, $00, $21, $00, $11, $00, $41, $00, $41, $11, $e0, $11, $e0
 +!by $f1, $11, $15, $14, $11, $00, $14, $00, $01, $12, $01, $09, $01, $0d, $01, $40
 +!by $1a, $e0, $60, $0d, $e0, $00, $11, $00, $21, $00, $11, $01, $d4, $11, $00, $11
 +!by $01, $51, $20, $11, $00, $51, $20, $31, $e0, $1b, $13, $31, $00, $14, $00, $14
 +!by $80, $14, $51, $19, $51, $13, $31, $00, $11, $0d, $11, $20, $11, $00, $11, $00
 +!by $11, $40, $11, $00, $11, $00, $21, $09, $11, $00, $d4, $11, $01, $1b, $07, $51
 +!by $20, $13, $00, $51, $e0, $80, $51, $00, $f1, $71, $13, $51, $00, $11, $60, $11
 +!by $60, $71, $00, $11, $00, $11, $00, $31, $01, $09, $0d, $00, $0d, $e0, $00, $15
 +!by $00, $11, $1b, $11, $1a, $11, $0d, $80, $14, $00, $11, $29, $11, $09, $11, $00
 +!by $0d, $00, $21, $11, $20, $0d, $00, $f1, $11, $13, $51, $1a, $11, $40, $12, $0d
 +!by $60, $71, $00, $11, $20, $61, $09, $11, $e0, $80, $31, $1b, $71, $40, $f5, $15
 +!by $81, $11, $20, $11, $40, $d4, $00, $14, $11, $a0, $03, $11, $00, $15, $b4, $11
 +!by $14, $61, $12, $01, $0d, $60, $11, $14, $11, $13, $07, $13, $11, $14, $00, $11
 +!by $14, $20, $54, $11, $34, $00, $15, $14, $95, $20, $81, $11, $01, $09, $21, $20
 +!by $d4, $00, $51, $04, $14, $11, $14, $11, $14, $20, $15, $14, $1a, $80, $01, $00
 +!by $04, $61, $1a, $00, $06, $01, $11, $e0, $60, $15, $54, $11, $01, $00, $0d, $15
 +!by $14, $1a, $80, $04, $03, $91, $21, $31, $21, $31, $21, $31, $21, $31, $21, $31
 +!by $21, $31, $00, $15, $31, $15, $0d, $15, $00, $04, $03, $04, $03, $04, $03, $1c
 +
 +; check if I/O area is reached
 +!if * > $cfff {
 + !error "Level data goes over $cfff!"​
 +}
 +</​code>​
base/quest_for_cash.txt · Last modified: 2015-04-17 04:33 (external edit)