2006-03-15 01:27:13 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Copyright (c) 2006 Fredrik Ohrn
|
|
|
|
*
|
2008-06-28 18:10:04 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2006-03-15 01:27:13 +00:00
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include "pacbox.h"
|
|
|
|
|
|
|
|
.section .text
|
|
|
|
.align 2
|
2006-03-18 09:14:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
#if defined(IRIVER_H300_SERIES) && !defined(SIMULATOR)
|
|
|
|
|
2006-03-15 01:27:13 +00:00
|
|
|
.global blit_display
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
0.75 scaling - display 3 out of 4 pixels = 216x168
|
|
|
|
Skipping pixel #2 out of 4 seems to give the most legible display
|
|
|
|
|
|
|
|
void blit_display(fb_data* lcd_framebuffer, unsigned char* vbuf)
|
|
|
|
{
|
|
|
|
next_dst=&lcd_framebuffer[YOFS*LCD_WIDTH+XOFS+((ScreenHeight*3)/4)-1];
|
|
|
|
for (y=ScreenHeight-1;y >= 0; y--) {
|
|
|
|
if ((y & 3) != 1) {
|
|
|
|
dst = (next_dst--);
|
|
|
|
for (x=0;x<ScreenWidth;x++) {
|
|
|
|
if ((x & 3) == 1) { vbuf++; }
|
|
|
|
else {
|
|
|
|
*dst = palette[*(vbuf++)];
|
|
|
|
dst+=LCD_WIDTH;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
vbuf+=ScreenWidth;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* FIXME: ScreenWidth & ScreenHeight are defined in arcade.h, but all
|
|
|
|
hell breaks loose if you include it... */
|
|
|
|
|
|
|
|
#define ScreenWidth 224
|
|
|
|
#define ScreenHeight 288
|
|
|
|
|
|
|
|
#define SHRUNK_WIDTH ((ScreenWidth/4)*3)
|
|
|
|
#define SHRUNK_HEIGHT ((ScreenHeight/4)*3)
|
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
#define BD_SAVE (9 * 4)
|
|
|
|
|
|
|
|
process_4_pixels:
|
|
|
|
move.b %d4, %d2
|
|
|
|
move.w (%a1, %d2.l * 2), %d3
|
|
|
|
move.w %d3, (2 * LCD_WIDTH * 2)(%a0)
|
|
|
|
|
|
|
|
lsr.l #8, %d4
|
|
|
|
move.b %d4, %d2
|
|
|
|
move.w (%a1, %d2.l * 2), %d3
|
|
|
|
move.w %d3, (1 * LCD_WIDTH * 2)(%a0)
|
|
|
|
|
|
|
|
swap.w %d4
|
|
|
|
move.b %d4, %d2
|
|
|
|
move.w (%a1, %d2.l * 2), (%a0)
|
|
|
|
|
|
|
|
lea.l 3 * LCD_WIDTH * 2(%a0), %a0
|
|
|
|
rts
|
|
|
|
|
|
|
|
process_line:
|
|
|
|
move.l %a3, %d1
|
|
|
|
bd_x_loop:
|
|
|
|
movem.l (%a2), %d4-%d7 // Read 16 pixels
|
|
|
|
|
|
|
|
bsr.s process_4_pixels
|
|
|
|
move.l %d5, %d4
|
|
|
|
bsr.s process_4_pixels
|
|
|
|
move.l %d6, %d4
|
|
|
|
bsr.s process_4_pixels
|
|
|
|
move.l %d7, %d4
|
|
|
|
bsr.s process_4_pixels
|
|
|
|
|
|
|
|
lea 16(%a2), %a2
|
|
|
|
subq.l #1, %d1;
|
|
|
|
bne.s bd_x_loop
|
|
|
|
|
|
|
|
rts
|
|
|
|
|
2006-03-15 01:27:13 +00:00
|
|
|
blit_display:
|
2006-03-18 09:14:10 +00:00
|
|
|
lea -BD_SAVE(%sp), %sp
|
|
|
|
movem.l %d2-%d7/%a2-%a4, (%sp)
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
move.l BD_SAVE + 4(%sp), %a0 // lcd_framebuffer
|
|
|
|
move.l BD_SAVE + 8(%sp), %a2 // vbuf
|
2006-03-15 01:27:13 +00:00
|
|
|
|
|
|
|
lea palette, %a1
|
|
|
|
|
|
|
|
lea.l ((YOFS * LCD_WIDTH + XOFS + SHRUNK_HEIGHT) * 2)(%a0), %a0
|
|
|
|
|
|
|
|
move.l #(ScreenHeight / 4), %d0
|
2006-03-18 09:14:10 +00:00
|
|
|
move.l #(ScreenWidth / 16), %a3
|
|
|
|
move.l #(LCD_WIDTH * SHRUNK_WIDTH + 1) * 2, %a4
|
2006-03-15 01:27:13 +00:00
|
|
|
moveq.l #0, %d2
|
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
bd_y_loop:
|
|
|
|
bsr.s process_line
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
suba.l %a4, %a0
|
|
|
|
lea.l ScreenWidth(%a2), %a2 // Skip 1 line
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
bsr.s process_line
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
suba.l %a4, %a0
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
bsr.s process_line
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
suba.l %a4, %a0
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
subq.l #1, %d0
|
|
|
|
bne bd_y_loop
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
movem.l (%sp), %d2-%d7/%a2-%a4
|
|
|
|
lea.l BD_SAVE(%sp), %sp
|
|
|
|
rts
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
#endif /* defined(IRIVER_H300_SERIES) && !defined(SIMULATOR) */
|
2006-03-15 01:27:13 +00:00
|
|
|
|
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
/* See arcade.c for the C implementation of drawChar */
|
|
|
|
/* Note! This version does not handle flipped screen mode. */
|
|
|
|
|
|
|
|
.global drawChar
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
#define DC_SAVE (4 * 4)
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
drawChar:
|
|
|
|
lea -DC_SAVE(%sp), %sp
|
|
|
|
movem.l %d2-%d5, (%sp)
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
movea.l DC_SAVE + 4(%sp), %a0 // buffer
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
move.l DC_SAVE + 16(%sp), %d0 // oy
|
|
|
|
move.l %d0, %d1
|
|
|
|
lsl.l #8, %d0
|
|
|
|
lsl.l #5, %d1
|
|
|
|
sub.l %d1, %d0
|
|
|
|
adda.l %d0, %a0
|
|
|
|
adda.l DC_SAVE + 12(%sp), %a0 // ox
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
move.l DC_SAVE + 20(%sp), %d0 // color
|
|
|
|
and.l #0x3F, %d0
|
|
|
|
bne.s have_color
|
|
|
|
|
|
|
|
moveq.l #8, %d1
|
|
|
|
moveq.l #0, %d2
|
|
|
|
moveq.l #0, %d3
|
|
|
|
|
|
|
|
clear_loop:
|
|
|
|
movem.l %d2-%d3, (%a0)
|
|
|
|
lea 224(%a0), %a0
|
|
|
|
|
|
|
|
subq.l #1, %d1
|
|
|
|
bne.s clear_loop
|
|
|
|
|
|
|
|
bra.s dc_exit
|
|
|
|
|
|
|
|
have_color:
|
|
|
|
lsl.l #2, %d0
|
|
|
|
|
|
|
|
lea.l charmap_, %a1
|
|
|
|
move.l DC_SAVE + 8(%sp), %d2 // index
|
|
|
|
lsl.l #6, %d2
|
|
|
|
adda.l %d2, %a1
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
moveq.l #8, %d1
|
|
|
|
moveq.l #0, %d3
|
|
|
|
moveq.l #24, %d5
|
|
|
|
|
|
|
|
dc_y_loop:
|
|
|
|
move.l (%a1)+, %d3
|
|
|
|
move.l %d3, %d4
|
|
|
|
|
|
|
|
move.l %d3, %d2 // Pixel 1
|
|
|
|
lsr.l %d5, %d2
|
|
|
|
add.l %d0, %d2
|
|
|
|
lsl.l #8, %d2
|
|
|
|
|
|
|
|
swap.w %d4 // Pixel 2
|
|
|
|
move.b %d4, %d2
|
|
|
|
add.l %d0, %d2
|
|
|
|
lsl.l #8, %d2
|
|
|
|
|
|
|
|
lsr.l #8, %d3 // Pixel 3
|
2006-03-15 01:27:13 +00:00
|
|
|
move.b %d3, %d2
|
2006-03-18 09:14:10 +00:00
|
|
|
add.l %d0, %d2
|
|
|
|
lsl.l #8, %d2
|
|
|
|
|
|
|
|
swap.w %d4 // Pixel 4
|
|
|
|
move.b %d4, %d2
|
|
|
|
add.l %d0, %d2
|
|
|
|
|
|
|
|
move.l %d2, (%a0)+
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
move.l (%a1)+, %d3
|
|
|
|
move.l %d3, %d4
|
|
|
|
|
|
|
|
move.l %d3, %d2 // Pixel 1
|
|
|
|
lsr.l %d5, %d2
|
|
|
|
add.l %d0, %d2
|
|
|
|
lsl.l #8, %d2
|
|
|
|
|
|
|
|
swap.w %d4 // Pixel 2
|
|
|
|
move.b %d4, %d2
|
|
|
|
add.l %d0, %d2
|
|
|
|
lsl.l #8, %d2
|
|
|
|
|
|
|
|
lsr.l #8, %d3 // Pixel 3
|
2006-03-15 01:27:13 +00:00
|
|
|
move.b %d3, %d2
|
2006-03-18 09:14:10 +00:00
|
|
|
add.l %d0, %d2
|
|
|
|
lsl.l #8, %d2
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
swap.w %d4 // Pixel 4
|
|
|
|
move.b %d4, %d2
|
|
|
|
add.l %d0, %d2
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
move.l %d2, (%a0)+
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
lea 216(%a0), %a0
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
subq.l #1, %d1
|
|
|
|
bne.s dc_y_loop
|
2006-03-15 01:27:13 +00:00
|
|
|
|
2006-03-18 09:14:10 +00:00
|
|
|
dc_exit:
|
|
|
|
movem.l (%sp), %d2-%d5
|
|
|
|
lea.l DC_SAVE(%sp), %sp
|
2006-03-15 01:27:13 +00:00
|
|
|
rts
|
|
|
|
|