; Zilog eZ80 ANSI C Compiler Release 3.4 ; -optsize -noreduceopt -nomodsect -peephole -globalopt ; -localcse -const=ROM FILE "SRC\MAIN.C" .assume ADL=1 SEGMENT CODE ; 1 #include ; 2 #include ; 3 #include ; 4 #include ; 5 ; 6 #include ; 7 #include ; 8 #include ; 9 #include ; 10 ; 11 #include ; 12 #include ; 13 ; 14 /* Include the sprite data */ ; 15 #include "gfx/logo_gfx.h" ; 16 ; 17 /* Function for drawing the main sprite */ ; 18 void draw_sprite(int x, int y) ; 19 { _draw_sprite: CALL __frameset0 ; 20 /* Fill the screen with color index 0 ; 21 /* Note that this is a super inefficient way to ; 22 /* redraw, but it demonstrates a simple way of clearing past data */ ; 23 // gfx_FillScreen(0xFF); ; 24 ; 25 /* Draw a bunch of different styled sprites on the screen */ ; 26 ; 27 gfx_Sprite(dvd, x, y); LD BC,(IX+9) PUSH BC LD BC,(IX+6) PUSH BC LD BC,_dvd_data PUSH BC CALL _gfx_Sprite POP BC POP BC POP BC ; 28 ; 29 /* Copy the buffer to the screen */ ; 30 gfx_BlitBuffer(); // This is the same as gfx_Blit(gfx_buffer) LD BC,1 PUSH BC CALL _gfx_Blit POP BC ; 31 } LD SP,IX POP IX RET ;**************************** _draw_sprite *************************** ;Name Addr/Register Size Type ;_gfx_Blit IMPORT ----- function ;_dvd_data IMPORT 3922 variable ;_gfx_Sprite IMPORT ----- function ;y IX+9 3 parameter ;x IX+6 3 parameter ; Stack Frame Size: 12 (bytes) ; Spill Code: 0 (instruction) ; 32 ; 33 void random_palette() { _random_palette: ; 34 gfx_SetPalette(logo_gfx_pal[randInt(0, 7)], sizeof_logo_gfx_pal, 0); LD BC,0 PUSH BC LD BC,86 PUSH BC CALL _random LD A,L AND A,7 UEXT HL LD L,A ADD HL,HL ADD HL,HL LD BC,_logo_gfx_pal ADD HL,BC PUSH HL CALL _gfx_SetPalette POP BC POP BC POP BC ; 35 } RET ;**************************** _random_palette *************************** ;Name Addr/Register Size Type ;_random IMPORT ----- function ;_logo_gfx_pal IMPORT 32 variable ;_gfx_SetPalette IMPORT ----- function ; Stack Frame Size: 6 (bytes) ; Spill Code: 0 (instruction) ; 36 ; 37 void main(void) ; 38 { _main: LD HL,-15 CALL __frameset ; 39 /* Coordinates used for the sprite */ ; 40 int x, y; ; 41 int gravity[2]; ; 42 float angle; ; 43 ; 44 srand(rtc_Time()); LD BC,(15925316) PUSH BC CALL _srand POP BC ; 45 ; 46 /* Initialize the 8bpp graphics */ ; 47 gfx_Begin(); CALL _gfx_Begin ; 48 ; 49 /* Set up the palette for our sprites */ ; 50 random_palette(); CALL _random_palette ; 51 ; 52 /* Start at 0, 0 */ ; 53 x = randInt(0, LCD_WIDTH - dvd_width); CALL _random LD BC,241 CALL __iremu LD (IX+-3),HL ; 54 y = randInt(0, LCD_HEIGHT - dvd_height); CALL _random LD BC,192 CALL __iremu LD (IX+-6),HL ; 55 gravity[0] = randInt(0, 1); CALL _random LD A,L AND A,1 UEXT HL LD L,A LD (IX+-12),HL ; 56 gravity[1] = randInt(0, 1); CALL _random LD A,L AND A,1 UEXT HL LEA IY,IX+-12 LD L,A ; 57 ; 58 gfx_SetDrawBuffer(); LD BC,1 PUSH BC LD (IY+3),HL CALL _gfx_SetDraw POP BC ; 59 ; 60 gfx_FillScreen(1); LD BC,1 PUSH BC CALL _gfx_FillScreen POP BC ; 61 ; 62 draw_sprite(x, y); LD BC,(IX+-6) PUSH BC LD BC,(IX+-3) PUSH BC CALL _draw_sprite POP BC POP BC ; 63 ; 64 do L_26: ; 65 { ; 66 /* Scan the keypad to update kb_Data */ ; 67 kb_Scan(); CALL _kb_Scan ; 68 ; 69 if ((x + dvd_width) <= LCD_WIDTH && x >= 0) LD IY,(IX+-3) LEA BC,IY+80 LD HL,320 OR A,A SBC HL,BC CALL __setflag JP M,L_12 LD HL,(IX+-3) CALL __icmpzero CALL __setflag JP M,L_12 ; 70 { ; 71 if (gravity[0]) LD HL,(IX+-12) CALL __icmpzero JR Z,L_6 ; 72 { ; 73 x++; LD BC,(IX+-3) INC BC LD (IX+-3),BC ; 74 } ; 75 else JR L_24 L_6: ; 76 { ; 77 x--; LD BC,(IX+-3) DEC BC LD (IX+-3),BC ; 78 } ; 79 } ; 80 else JR L_24 L_12: ; 81 { ; 82 random_palette(); CALL _random_palette ; 83 if (gravity[0]) LD HL,(IX+-12) CALL __icmpzero JR Z,L_10 ; 84 { ; 85 gravity[0] = false; LD BC,0 LD (IX+-12),BC ; 86 x--; LD BC,(IX+-3) DEC BC LD (IX+-3),BC ; 87 } ; 88 else JR L_24 L_10: ; 89 { ; 90 gravity[0] = true; LD BC,1 LD (IX+-12),BC ; 91 x++; LD BC,(IX+-3) INC BC LD (IX+-3),BC ; 92 } ; 93 } L_24: ; 94 ; 95 if ((y + dvd_height) <= LCD_HEIGHT && y >= 0) LD IY,(IX+-6) LEA BC,IY+49 LD HL,240 OR A,A SBC HL,BC CALL __setflag JP M,L_23 LD HL,(IX+-6) CALL __icmpzero CALL __setflag JP M,L_23 ; 96 { ; 97 if (gravity[1]) LEA HL,IX+-9 LD HL,(HL) CALL __icmpzero JR Z,L_17 ; 98 { ; 99 y++; LD BC,(IX+-6) INC BC LD (IX+-6),BC ; 100 } ; 101 else JR L_25 L_17: ; 102 { ; 103 y--; LD BC,(IX+-6) DEC BC LD (IX+-6),BC ; 104 } ; 105 } ; 106 else JR L_25 L_23: ; 107 { ; 108 random_palette(); CALL _random_palette ; 109 if (gravity[1]) LEA IY,IX+-9 LD (IX+-15),IY LD HL,(IX+-15) LD HL,(HL) CALL __icmpzero JR Z,L_21 ; 110 { ; 111 gravity[1] = false; LD HL,(IX+-15) LD BC,0 LD (HL),BC ; 112 y--; LD BC,(IX+-6) DEC BC LD (IX+-6),BC ; 113 } ; 114 else JR L_25 L_21: ; 115 { ; 116 gravity[1] = true; LD HL,(IX+-15) LD BC,1 LD (HL),BC ; 117 y++; LD BC,(IX+-6) INC BC LD (IX+-6),BC ; 118 } ; 119 } L_25: ; 120 ; 121 draw_sprite(x, y); LD BC,(IX+-6) PUSH BC LD BC,(IX+-3) PUSH BC CALL _draw_sprite POP BC POP BC ; 122 } while (kb_Data[6] != kb_Clear); LD A,(16056348) CP A,64 JR NZ,L_26 ; 123 ; 124 /* Close the graphics */ ; 125 gfx_End(); CALL _gfx_End ; 126 } LD SP,IX POP IX RET ;**************************** _main *************************** ;Name Addr/Register Size Type ;_gfx_End IMPORT ----- function ;_kb_Scan IMPORT ----- function ;_gfx_FillScreen IMPORT ----- function ;_gfx_SetDraw IMPORT ----- function ;_random IMPORT ----- function ;_gfx_Begin IMPORT ----- function ;_srand IMPORT ----- function ;G_0 IX-15 3 variable ;gravity IX-12 6 variable ;y IX-6 3 variable ;x IX-3 3 variable ; Stack Frame Size: 21 (bytes) ; Spill Code: 0 (instruction) XREF _logo_gfx_pal:ROM XREF _dvd_data:ROM XREF _kb_Scan:ROM XREF _gfx_Sprite:ROM XREF _gfx_Blit:ROM XREF _gfx_SetDraw:ROM XREF _gfx_FillScreen:ROM XREF _gfx_SetPalette:ROM XREF _gfx_End:ROM XREF _gfx_Begin:ROM XREF _srand:ROM XREF _random:ROM XREF __iremu:ROM XREF __frameset0:ROM XREF __frameset:ROM XREF __setflag:ROM XREF __icmpzero:ROM XDEF _main XDEF _random_palette XDEF _draw_sprite END