#include "crash82.inc" .org START_ADDR description: .db "YOSHI! v1.0",0 cx = APD_BUF cy = APD_BUF+1 char = APD_BUF+2 dinc = APD_BUF+3 rem = APD_BUF+4 remhl = APD_BUF+5 rem2 = APD_BUF+7 time = APD_BUF+8 delval = APD_BUF+9 y = APD_BUF+10 loc = APD_BUF+11 num = APD_BUF+13 char1 = APD_BUF+14 char1x = APD_BUF+15 char1y = APD_BUF+16 char2 = APD_BUF+17 char2x = APD_BUF+18 char2y = APD_BUF+19 board = APD_BUF+20 board2 = APD_BUF+28 board3 = APD_BUF+36 board4 = APD_BUF+44 swapper = APD_BUF+52 score = APD_BUF+60 yy = APD_BUF+62 level = APD_BUF+64 remchar = APD_BUF+65 remscore = APD_BUF+66 rowbuff = APD_BUF+67 data = TEXT_MEM string = TEXT_MEM+5 prog_start: set 1,(iy+$05) set 7,(iy+20) xor a ld (level),a ld (remchar),a ld hl,$0000 ld (score),hl ld a,7 ld (yy),a ld a,2 ld (y),a ld a,27 ld (delval),a ld (time),a ld a,255 ld (char1),a ld (char2),a call _grbufclr ld hl,title ld de,GRAPH_MEM ld bc,768 ldir ROM_CALL(DISP_GRAPH) ld hl,board ld b,32 clearbuff: ld a,255 ld (hl),a inc hl djnz clearbuff call wait call _grbufclr ld bc,21823 ;b=85 c=63 ld de,21780 ;d=85 e=20 ld h,2 call _iLine ld hl,bottombar ld de,GRAPH_MEM+528 ld bc,240 ldir ;place hiscore ld hl,(highscore) ld de,54*256+70 ld b,4 call DM_HL_DECI ld hl,(score) ld de,53*256+23 ld b,4 call DM_HL_DECI ; ld de,53*256+23 ld (CURSOR_X),de call drawarrow ld a,'0' ROM_CALL(M_CHARPUT) call inclevel call main res 1,(iy+$05) res 7,(iy+$14) ret wait: call GET_KEY cp G_ENTER ret z cp G_CLEAR jr nz,wait inc sp inc sp ret main: ld a,(char1) cp 255 call z,getchars.5 ROM_CALL(DISP_GRAPH) call dropchar ROM_CALL(DISP_GRAPH) ;set up checks ld a,0ffh ei halt out (1),a ld a,0feh ei halt out (1),a nop nop in a,(1) ;check if up was pressed cp 247 call z,up ;check if left was pressed cp 253 call z,left ;check if down was pressed cp 254 call z,down ;check for 2nd and mode ld a,0ffh out (1),a ld a,0bfh out (1),a in a,(1) cp 223 call z,swap cp 191 call z,wait ;check if clear was pressed ld a,0ffh out (1),a ld a,0fdh out (1),a in a,(1) cp 191 jp z,newhigh jr main delay: ld a,(time) dec a ld (time),a ei halt ret dropchar: call delay ld a,(time) cp 0 ret nz ld a,(delval) ld (time),a ld hl,char1 ld (loc),hl ld a,(char1) ld (rem2),a call dropchar2 ld a,(rem2) ld (char1),a ld hl,char2 ld (loc),hl ld a,(char2) ld (rem2),a call dropchar2 ld a,(rem2) ld (char2),a ret dropchar2: ld a,(hl) cp 255 ret z ld (char),a inc hl ld a,(hl) ld (cx),a inc hl ld a,(hl) ld (cy),a call checkdrop jp z,dropchar4 call interpret dropchar3: ld hl,(loc) ld a,(hl) ld (char),a inc hl ld a,(hl) add a,-11 ld (cx),a ld (hl),a inc hl ld a,(hl) ld (cy),a jp interpret dropchar4: ld a,255 ld (rem2),a ld (remhl),hl ld a,(cx) add a,-9 call getloc ld a,(char) ld (hl),a ld (remhl),hl ;check if top of yoshi egg came down cp 3 jp z,topyosegg ;check if at bottom ld b,a ld a,(cx) cp 9 ret z ;check for matches dec hl ld a,(hl) cp b jp nz,checkiftop ld (remhl),hl call interpret ld a,(cx) add a,-11 ld (cx),a call interpret ld a,(remchar) inc a ld (remchar),a ld bc,5 call incscore ;erasebuff ld hl,(remhl) ld a,255 ld (hl),a inc hl ld (hl),a ret incscore: ld hl,(score) add hl,bc ld (score),hl ld hl,(score) ld de,53*256+23 ld b,4 call DM_HL_DECI ld a,(remchar) cp 10 jp nc,inclevel jp z,inclevel ret inclevel: xor a ld (remchar),a ld a,(delval) add a,-1 cp -1 call z,lim ld (delval),a ld a,(level) add a,1 ld (level),a ld l,a ld h,0 ld de,47*256+73 ld b,2 DM_HL_DECI: ld (CURSOR_X),de ;Routine Starts here ld de,string+5 xor a ld (de),a RepUnp: dec de call UNPACK_HL add a,48 ld (de),a djnz RepUnp ex de,hl ROM_CALL(D_ZM_STR) ret lim: xor a ret getloc: ld l,a ld h,0 ld a,11 call $00A3 ld a,l ld (rem),a ld a,(cy) ld l,a ld h,0 ld a,11 call $00A3 ld a,l ld b,a xor a add a,b add a,b add a,b add a,b add a,b add a,b add a,b add a,b ld b,a ld a,(rem) add a,b ld c,a xor a ld b,a ld hl,board add hl,bc ret checkiftop: ld a,(cx) cp 86 ret nz call newhigh ld hl,loose ld de,23*256+27 call DMX ld de,29*256+27 call DMX ROM_CALL(DISP_GRAPH) call GET_KEY loop: call GET_KEY cp G_ENTER jr z,EXIT cp G_CLEAR jr nz,loop EXIT: inc sp inc sp inc sp inc sp ret newhigh: ld hl,(score) ld de,(highscore) call vector2 ret nz ld (highscore),hl ld hl,hiscore ld de,17*256+30 DMX: ld (CURSOR_X),de ROM_CALL(D_ZM_STR) ret topyosegg: ld a,(cx) cp 9 jp nz,topyosegg2 call interpret ld hl,(remhl) ld a,255 ld (hl),a ret topyosegg2: ld a,(rem) inc a ld b,a topyosegg21: ld a,(hl) cp 2 jp z,topyosegg22 dec hl djnz topyosegg21 call interpret ld hl,(remhl) ld a,255 ld (hl),a ret topyosegg22: ld a,(remchar) inc a ld (remchar),a ld a,(remscore) add a,10 ld (remscore),a ld hl,(remhl) ld a,(hl) ld (char),a call interpret ld hl,(remhl) ld a,255 ld (hl),a dec hl ld (remhl),hl ld a,(cx) add a,-11 ld (cx),a ld a,(hl) cp 2 jp nz,topyosegg22 ld (char),a call interpret ld hl,(remhl) ld a,255 ld (hl),a ld a,(remscore) add a,50 ld c,a xor a ld (remscore),a ld b,a jp incscore checkdrop: ld (remhl),hl ld a,(cx) cp 9 ret z ld a,(cx) add a,-20 call getloc ld a,(hl) cp 255 jp nz,ft ld a,1 cp 0 ld hl,(remhl) ret ft: ld a,0 cp 0 ret left: ld a,1 ld (time),a ret char1con: ld a,(char1x) ld (cx),a ld a,(char1y) ld (cy),a ld a,(char1) ld (char),a ret char2con: ld a,(char2x) ld (cx),a ld a,(char2y) ld (cy),a ld a,(char2) ld (char),a ret swap: call move call char1con call interpret call char2con call interpret call drawarrow ld a,(y) cp 2 jp z,swap1 cp 13 jp z,swap2 cp 24 jp z,swap3 ret swap1: ld hl,board ld de,swapper ld bc,8 ldir ld hl,board2 ld de,board ld bc,8 ldir ld hl,swapper ld de,board2 ld bc,8 ldir ld hl,GRAPH_MEM ld de,rowbuff ld bc,120 ldir ld hl,GRAPH_MEM+132 ld de,GRAPH_MEM ld bc,120 ldir ld hl,rowbuff ld de,GRAPH_MEM+132 ld bc,120 ldir jp finishswap swap2: ld hl,board2 ld de,swapper ld bc,8 ldir ld hl,board3 ld de,board2 ld bc,8 ldir ld hl,swapper ld de,board3 ld bc,8 ldir ld hl,GRAPH_MEM+132 ld de,rowbuff ld bc,120 ldir ld hl,GRAPH_MEM+264 ld de,GRAPH_MEM+132 ld bc,120 ldir ld hl,rowbuff ld de,GRAPH_MEM+264 ld bc,120 ldir jp finishswap swap3: ld hl,board3 ld de,swapper ld bc,8 ldir ld hl,board4 ld de,board3 ld bc,8 ldir ld hl,swapper ld de,board4 ld bc,8 ldir ld hl,GRAPH_MEM+396 ld de,rowbuff ld bc,120 ldir ld hl,GRAPH_MEM+264 ld de,GRAPH_MEM+396 ld bc,120 ldir ld hl,rowbuff ld de,GRAPH_MEM+264 ld bc,120 ldir jp finishswap finishswap: call char1con call swap11 ld (char1y),a call char2con call swap11 ld (char2y),a call drawarrow call char1con call interpret call char2con jp interpret swap11: ld a,(cx) add a,-9 call getloc ld b,c ld a,(yy) cp b jp nc,swap12 add a,8 cp b jp nc,swap13 ld a,(cy) ret swap12: ld a,(hl) cp 255 jp z,swap14 ld a,(cy) add a,11 ret swap13: ld a,(hl) cp 255 jp z,swap14 ld a,(cy) add a,-11 ret swap14: ld a,(cy) ret move: ld b,11 move2: halt djnz move2 ret up: ld a,(y) cp 2 ret z call move ld a,(yy) add a,-8 ld (yy),a call drawarrow ld a,(y) add a,-11 ld (y),a jp drawarrow down: ld a,(y) cp 24 ret z call move ld a,(yy) add a,8 ld (yy),a call drawarrow ld a,(y) add a,11 ld (y),a jp drawarrow getchars.5: ld a,(char2) cp 255 ret nz getchars: ld a,86 ld (cx),a ld hl,char1 ld (loc),hl ld a,0 ld (num),a ld a,0 ld (cy),a ld b,2 call vector0 cp 1 jp nz,getchars2 call randchar getchars12: ld a,11 ld (cy),a ld b,3 call vector0 cp 0 jp z,randchar2 ld (dinc),a ld a,22 ld (cy),a ld a,(dinc) dec a cp 0 jp z,randchar2 ld a,33 ld (cy),a jp randchar2 getchars2: ld a,11 ld (cy),a ld b,3 call vector0 cp 0 jp z,getchars22 call randchar getchars21: ld hl,char2 ld (loc),hl ld a,22 ld (cy),a ld b,2 call vector0 cp 0 jp z,randchar2 ld a,33 ld (cy),a jp randchar2 getchars22: ld hl,char2 ld (loc),hl ld a,22 ld (cy),a call randchar ld a,33 ld (cy),a jp randchar2 dec_egg_odds cp 2 jp z,again cp 3 jp z,again ret again: ld b,6 jp vector0 randchar: ld b,6 call vector0 call dec_egg_odds ld (char),a call interpret ld a,(char) ld (char1),a ld a,86 ld (char1x),a ld a,(cy) ld (char1y),a ret randchar2: ld b,6 call vector0 call dec_egg_odds ld (char),a call interpret ld a,(char) ld (char2),a ld a,86 ld (char2x),a ld a,(cy) ld (char2y),a ret interpret: ld a,(char) cp 0 call z,drawsquid ld a,(char) cp 1 call z,drawpiranha ld a,(char) cp 2 call z,drawbottomegg ld a,(char) cp 3 call z,drawtopegg ld a,(char) cp 4 call z,drawghost ld a,(char) cp 5 call z,drawshroom ret drawsquid: ld ix,squid ld bc,2562 ;b=10 (10 pixels high) c=2 (16 wide) ld a,(cy) ld l,a ld a,(cx) jp vector1 drawpiranha: ld ix,piranha ld bc,2562 ;b=10 (10 pixels high) c=2 (16 wide) ld a,(cy) ld l,a ld a,(cx) jp vector1 drawshroom: ld ix,shroom ld bc,2562 ;b=10 (10 pixels high) c=2 (16 wide) ld a,(cy) ld l,a ld a,(cx) jp vector1 drawtopegg: ld ix,topegg ld bc,2562 ;b=10 (10 pixels high) c=2 (16 wide) ld a,(cy) ld l,a ld a,(cx) jp vector1 drawbottomegg: ld ix,bottomegg ld bc,2562 ;b=10 (10 pixels high) c=2 (16 wide) ld a,(cy) ld l,a ld a,(cx) jp vector1 drawghost: ld ix,ghost ld bc,2562 ;b=10 (10 pixels high) c=2 (16 wide) ld a,(cy) ld l,a ld a,(cx) jp vector1 drawarrow: ld ix,arrow ld b,17 ld a,(y) ld l,a ld a,0 jp vector3 piranha: .db %11000000,%11000000 .db %10100001,%01000000 .db %01010010,%10000000 .db %11101101,%11000000 .db %10110011,%01000000 .db %11111111,%11000000 .db %01101101,%10000000 .db %00111111,%00000000 .db %00011110,%00000000 .db %00111111,%00000000 squid: .db %00011110,%00000000 .db %00100001,%00000000 .db %01000000,%10000000 .db %10111111,%01000000 .db %01010010,%10000000 .db %00111111,%00000000 .db %01010010,%10000000 .db %01010010,%10000000 .db %10101101,%01000000 .db %01110011,%10000000 topegg: .db %01110000,%00000000 .db %10011100,%00000000 .db %01011010,%00000000 .db %00110011,%00000000 .db %01000111,%00000000 .db %10000011,%00000000 .db %01011001,%00000000 .db %00111110,%00000000 .db %01001100,%00000000 .db %11110000,%00000000 bottomegg: .db %00001111,%00000000 .db %00110010,%00000000 .db %01111100,%00000000 .db %10011010,%00000000 .db %11000001,%00000000 .db %11100010,%00000000 .db %11001100,%00000000 .db %01011010,%00000000 .db %00111001,%00000000 .db %00001110,%00000000 shroom: .db %00001100,%00000000 .db %00010110,%00000000 .db %00010110,%00000000 .db %00100011,%00000000 .db %00110001,%00000000 .db %01111010,%10000000 .db %10000111,%01000000 .db %01111111,%10000000 .db %00001100,%00000000 .db %00001100,%00000000 ghost: .db %00111100,%00000000 .db %01000010,%00000000 .db %10101001,%00000000 .db %10101000,%10000000 .db %10000000,%01000000 .db %10000010,%11000000 .db %10101001,%11000000 .db %01010100,%01000000 .db %00100000,%10000000 .db %00011111,%00000000 arrow: .db %00001000 .db %00000100 .db %00001110 .db %00011111 .db %00111110 .db %01100100 .db %11101000 .db %11000000 .db %11000000 .db %11000000 .db %11101000 .db %01100100 .db %00111110 .db %00011111 .db %00001110 .db %00000100 .db %00001000 loose: .db " GAME OVER ",0 loose2: .db " PRESS ENTER ",0 highscore: .db 4,1 hiscore: .db " HIGH SCORE! ",0 title: .db 0,0,0,0,0,0,0,0,0,0,0,131,0,0,0,0,0,0,0,0,0,0,1,199,0,0,0,0,7,128,0 .db 0,0,0,1,199,0,0,0,63,31,240,0,0,0,0,3,199,0,0,0,96,183,248,0,0,0,0,3,199,0,0 .db 0,192,231,248,0,0,0,0,3,195,0,3,0,128,195,244,0,0,0,0,2,0,0,5,225,128,227,230,0,0,0 .db 0,2,0,0,4,17,1,225,194,0,0,0,0,1,0,0,8,11,3,224,1,248,0,0,0,1,0,0,12,12,3 .db 224,1,7,0,0,0,1,6,0,10,0,7,224,1,129,129,240,0,0,143,0,13,0,5,192,7,128,194,8,124,56 .db 143,0,6,160,4,15,15,128,99,8,82,68,207,0,1,80,4,31,143,128,50,136,98,100,111,0,0,232,12,31,143 .db 192,19,8,210,84,63,0,0,52,8,63,207,194,146,136,161,56,0,0,0,26,8,63,207,193,83,8,193,0,0,0 .db 0,12,8,63,207,195,214,140,161,0,0,0,0,10,9,63,207,192,117,4,193,56,0,7,224,13,10,191,199,64,30 .db 4,161,84,0,14,48,6,12,127,192,64,13,7,193,100,0,14,120,5,8,63,193,106,6,128,1,84,0,30,56,6 .db 8,31,162,213,67,0,1,100,0,28,4,5,8,31,148,127,194,128,1,84,0,32,4,2,136,15,8,64,1,2,129 .db 100,0,33,142,3,11,128,0,64,1,129,65,84,0,35,206,2,143,192,0,64,1,3,161,100,0,35,206,3,7,192 .db 0,128,1,130,193,84,0,35,206,2,175,192,124,128,3,2,161,100,0,35,198,1,87,192,254,128,86,134,81,84,0 .db 33,130,0,255,192,255,170,175,4,97,100,0,32,2,0,7,192,255,149,122,172,85,84,0,56,2,0,7,192,255,191 .db 131,84,42,100,0,56,4,0,115,128,254,192,1,248,62,84,0,56,116,253,241,128,254,56,0,0,0,108,0,56,248 .db 254,222,128,125,254,120,120,224,84,0,24,248,31,255,96,11,251,60,254,220,56,0,4,240,7,255,191,23,255,255,191 .db 63,0,0,3,224,3,255,223,247,255,255,255,207,128,0,0,0,0,255,227,143,255,239,207,247,192,0,0,0,0,3 .db 192,0,127,195,193,225,128,0,0,0,0,32,0,0,0,0,0,0,32,0,0,248,31,231,15,143,128,124,124,112,71 .db 240,1,48,34,24,152,83,0,132,152,144,77,16,1,80,66,16,164,85,1,4,169,24,209,0,0,80,66,32,196,197 .db 3,0,41,25,145,32,0,144,98,64,71,9,2,0,73,170,147,224,0,240,4,64,68,15,2,56,120,44,154,32,1 .db 32,4,64,40,18,2,16,144,44,130,0,2,32,4,64,8,34,3,49,16,73,4,16,4,56,30,64,62,67,129,210 .db 29,137,207,240,4,0,0,33,0,64,0,34,0,0,0,0,8,0,0,30,1,128,0,44,0,0,0,0,0,0,0 .db 0,0,0,1,32,0,0,0,0,68,1,0,0,8,224,65,224,2,0,1,4,68,1,0,0,24,128,160,80,2,0 .db 3,12,40,203,178,40,169,0,160,82,138,101,229,20,41,45,73,69,9,192,64,83,86,150,145,20,41,41,120,130,8 .db 33,208,82,82,244,65,36,41,41,64,130,8,33,48,114,82,132,33,62,41,41,73,69,9,33,48,138,86,148,145,4 .db 16,201,178,40,136,192,192,138,74,100,97,4,0,0,0,0,0,0,0,0,0,0,0,0 bottombar: .db 207,243,51,51,51,51,51,51,51,51,51,51,206,51,51,51,51,51,51,51,51,51,51,51,62,124,204,204,204,204 .db 204,204,204,204,204,204,62,60,192,0,0,12,0,0,0,0,0,12,220,7,6,110,206,51,35,171,162,0,0,51,224 .db 7,8,138,168,51,34,42,32,0,0,51,33,142,196,138,204,12,35,43,32,0,0,12,35,206,194,138,168,12,34,42 .db 32,0,0,12,227,207,12,110,174,51,59,147,186,0,0,51,227,207,0,0,0,51,0,0,0,0,0,51,35,198,192 .db 0,0,12,0,0,0,0,0,12,33,130,192,0,0,12,43,153,80,0,0,12,224,3,0,0,0,51,41,33,64,0 .db 0,51,248,3,0,0,0,51,57,45,192,0,0,51,56,4,192,0,0,12,41,37,64,0,0,12,56,116,192,0,0 .db 12,43,153,80,0,0,12,248,251,51,51,51,51,0,0,0,0,0,51,216,251,51,51,51,51,51,51,51,51,51,51 .db 52,252,204,204,204,204,204,204,204,204,204,204,51,236,204,204,204,204,204,204,204,204,204,204 _grbufclr: ld hl,GRAPH_MEM ld (hl),0 ld de,GRAPH_MEM+1 ld bc,767 ldir ret vector0: ;---------= Random number generator =--------- ; input b=upper bound ; ouput a=answer 0<=asprite ; a=x ; l=y ; b=height (in pixels) ; c=width (in bytes, e.g. 2 would be 16) ;Output: nothing ; All registers are destroyed except bc', de', hl' largeSprite: di ex af,af' ld a,c push af ex af,af' ld e,l ld h,$00 ld d,h add hl,de add hl,de add hl,hl add hl,hl ld e,a and $07 ld c,a srl e srl e srl e add hl,de ld de,GRAPH_MEM add hl,de sl02: push hl sl12: ld d,(ix) ld e,$00 ld a,c or a jr z,sl32 sl22: srl d rr e dec a jr nz,sl22 sl32: ld a,(hl) xor d ld (hl),a inc hl ld a,(hl) xor e ld (hl),a inc ix ex af,af' dec a push af ex af,af' pop af jr nz,sl12 pop hl pop af push af ex af,af' ld de,$0C add hl,de djnz sl02 pop af ret vector2: ;---------= High Score =--------- ; Input: de=previous high score ; hl=current score ; Output: hl=high score ; z=1 (a=0) if new high score, z=0 (a=1) if not ; Registers destroyed: af, de, hl hiscr: push hl xor a sbc hl,de pop hl jr z,nnhs jr nc,nhs nnhs: ex de,hl inc a ret nhs: or a ret vector3: ;---------= XOR a sprite =--------- ; b=size of sprite ; l=yc ; a=xc ; ix holds pointer sprite: ld e,l ld h,$00 ld d,h add hl,de add hl,de add hl,hl add hl,hl ld e,a and $07 ld c,a srl e srl e srl e add hl,de ld de,GRAPH_MEM add hl,de sl1: ld d,(ix) ld e,$00 ld a,c or a jr z,sl3 sl2: srl d rr e dec a jr nz,sl2 sl3: ld a,(hl) xor d ld (hl),a inc hl ld a,(hl) xor e ld (hl),a ld de,$0B add hl,de inc ix djnz sl1 ret _iLine: ROM_CALL($2E60-$1A) .dw $4025 .db $04 .end END