00001
00019
00020
00021
00022 #define PAL_TARGET_CLOCK_RATE 25175000
00023
00024
00025 #include <stdlib.hch>
00026
00027 #include "pal_master.hch"
00028
00029
00030 #include "configuration.hch"
00031 #include "audio.hch"
00032 #include "eventhandler_shared.hch"
00033 #include "mouse_shared.hch"
00034 #include "smartmedia_shared.hch"
00035 #include "display_shared.hch"
00036 #include "display.hch"
00037
00038 #if HAVE_DEBUG
00039 #include "debug.hch"
00040 #endif
00041
00042
00043
00044
00045
00046
00047
00048 chan unsigned 1 maskupdate_notification;
00049
00050
00051
00065 void display_main(skindata_t *skindata, audiodata_t *audiodata, events_t *events, mousedata_t *mousedata) {
00066
00067
00068
00069 macro expr CLOCKRATE = PAL_ACTUAL_CLOCK_RATE;
00070 macro expr VIDEOOUT = PalVideoOutOptimalCT(CLOCKRATE);
00071 macro expr RAM_BANK0 = PalPL2RAMCT(0);
00072 macro expr DW = PalPL2RAMGetMaxDataWidthCT();
00073 macro expr AW = PalPL2RAMGetMaxAddressWidthCT();
00074 macro expr VISIBLEX = PalVideoOutGetVisibleX(VIDEOOUT, CLOCKRATE);
00075 macro expr TOTALX = PalVideoOutGetTotalX(VIDEOOUT, CLOCKRATE);
00076 macro expr TOTALY = PalVideoOutGetTotalY(VIDEOOUT);
00077 macro expr SCANX = PalVideoOutGetX(VIDEOOUT);
00078 macro expr SCANY = PalVideoOutGetY(VIDEOOUT);
00079
00080 unsigned DW pixeldata;
00081 unsigned 24 visual_graph_color;
00082 unsigned AW address, address_offset;
00083
00084
00085
00086
00087
00088
00089
00090
00091 macro proc draw_button(button_state) {
00092 if (button_state == pixeldata[31:24]) {
00093 PalVideoOutWrite(VIDEOOUT, ~PIXEL);
00094 } else {
00095 PalVideoOutWrite(VIDEOOUT, PIXEL);
00096 }
00097 }
00098
00099
00100
00101
00102 PalPL2RAMSetReadAddress(RAM_BANK0, ADDRESS_SKIN_START);
00103
00104
00105
00106
00107 while (TRUE) {
00108 par {
00109
00110
00111
00112
00113
00114
00115 PalPL2RAMRead(RAM_BANK0, &pixeldata);
00116 PalPL2RAMSetReadAddress(RAM_BANK0, address_offset +address);
00117
00118
00119
00120 switch (events->mode) {
00121 case MODE_HELP:
00122 address_offset = ADDRESS_HELP_START;
00123 break;
00124 case MODE_GRAPH:
00125 address_offset = ADDRESS_GRAPHMASK_START;
00126 break;
00127 default:
00128 address_offset = ADDRESS_SKIN_START;
00129 break;
00130 }
00131
00132 if (MODE_GRAPH == events->mode) {
00133 par {
00134 visual_graph_color = ((unsigned 8)(0 @ audiodata->fft_info.read[pixeldata[31:24]]) << 1) @ ((unsigned 8)(0 @ audiodata->fft_info.read[pixeldata[31:24]]) << -1) @ ((unsigned 8)(0 @ audiodata->fft_info.read[pixeldata[31:24]]) << 0);
00135 PalVideoOutWrite(VIDEOOUT, 0 @ visual_graph_color);
00136 }
00137 } else {
00138
00139
00140
00141
00142
00143
00144 switch (pixeldata[31:24]) {
00145
00146
00147 case AREA_WAVEFORM:
00148 if (SCANY == 0 @ skindata->area_waveform_bottom -(0 @ (audiodata->ifft_info.read[((SCANX -(0 @ skindata->area_waveform_left)) <-8)]))) {
00149 PalVideoOutWrite(VIDEOOUT, skindata->color_area_waveform);
00150 } else {
00151 PalVideoOutWrite(VIDEOOUT, PIXEL);
00152 }
00153 break;
00154
00155
00156
00157
00158 case AREA_VOLUME_YAXIS:
00159
00160
00161
00162
00163
00164 if (SCANY >= 0 @ events->volume_position) {
00165 PalVideoOutWrite(VIDEOOUT, skindata->color_area_volume);
00166 } else {
00167 PalVideoOutWrite(VIDEOOUT, PIXEL);
00168 }
00169 break;
00170
00171
00172
00173
00174 case AREA_SPECTRUM_ANALYZER:
00175
00176
00177
00178 if ((SCANY >= (0 @ skindata->area_spectrum_bottom) -(0 @ audiodata->fft_info.read[(SCANX -(0 @ skindata->area_spectrum_left))[9:2]])) && ((SCANX -(0 @ skindata->area_spectrum_left)) <- 2)) {
00179 PalVideoOutWrite(VIDEOOUT, PIXEL_SPECTRUM);
00180 } else {
00181 PalVideoOutWrite(VIDEOOUT, PIXEL);
00182 }
00183 break;
00184
00185
00186
00187
00188
00189
00190 case BUTTON_PRESET_1:
00191 case BUTTON_PRESET_2:
00192 case BUTTON_PRESET_3:
00193 case BUTTON_PRESET_4:
00194 case BUTTON_PRESET_5:
00195 case BUTTON_PRESET_6:
00196
00197
00198
00199
00200
00201
00202
00203 draw_button((events->active_preset +BUTTON_PRESET_1) <- 8);
00204 break;
00205
00206 case BUTTON_PRECISE:
00207 case BUTTON_CONCAVE_HALF:
00208 case BUTTON_CONVEX_HALF:
00209 case BUTTON_CONCAVE_FULL:
00210 case BUTTON_CONVEX_FULL:
00211
00212
00213
00214
00215
00216
00217
00218 draw_button((0 @ events->equalizer_mode) +BUTTON_PRECISE);
00219 break;
00220
00221 case BUTTON_LOG:
00222
00223
00224
00225 draw_button((0 @ audiodata->display_log) +BUTTON_LOG);
00226 break;
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238 default:
00239
00240 if ((AREA_EQUALIZER_MIN <= pixeldata[31:24]) && (!events->locked_display)) {
00241 if ((SCANY == 0 @ events->equalizer_display[(pixeldata[31:24] -AREA_EQUALIZER_MIN) <- 7]) || ((SCANY +1) == 0 @ events->equalizer_display[(pixeldata[31:24] -AREA_EQUALIZER_MIN) <- 7])) {
00242 PalVideoOutWrite(VIDEOOUT, skindata->color_equalizer);
00243 } else {
00244 PalVideoOutWrite(VIDEOOUT, PIXEL);
00245 }
00246 } else {
00247 PalVideoOutWrite(VIDEOOUT, PIXEL);
00248 }
00249 break;
00250 }
00251 }
00252
00253
00254
00255
00256
00257
00258
00259
00260 if (MOUSE_UPDATED == mousedata->status) {
00261 if ((SCANX == 0 @ mousedata->x) && (SCANY == 0 @ mousedata->y)) {
00262 par {
00263 events->mask = pixeldata[31:24];
00264 mousedata->status = MOUSE_NOT_UPDATED;
00265 maskupdate_notification ! MOUSE_UPDATED;
00266 }
00267 } else {
00268 delay;
00269 }
00270 } else {
00271 delay;
00272 }
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 if ((SCANX > (VISIBLEX - 5)) && (SCANX <= (TOTALX - 5))) {
00284
00285
00286
00287
00288
00289 if (SCANY == (TOTALY -1)) {
00290
00291
00292
00293 address = 0;
00294 } else {
00295
00296
00297
00298
00299
00300 delay;
00301 }
00302 } else {
00303
00304
00305
00306
00307
00308 address++;
00309 }
00310 }
00311 }
00312 }
00313
00314
00315
00328 void reload_equalizer(events_t *events, unsigned 4 *equalizer_levels) {
00329 unsigned 7 equalizer_band;
00330
00331 events->locked_display = TRUE;
00332 delay;
00333 do {
00334 events->equalizer_display[equalizer_band] = equalizer_table_inv[equalizer_levels[equalizer_band]];
00335 equalizer_band++;
00336 } while (equalizer_band);
00337 events->locked_display = FALSE;
00338 }