mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-07-10 03:56:09 +02:00
140 lines
3.5 KiB
ObjectPascal
140 lines
3.5 KiB
ObjectPascal
program touchTest;
|
|
{$L build/ballpalette.bin.o}
|
|
{$L build/balldata.bin.o}
|
|
|
|
uses
|
|
nds9, ctypes;
|
|
|
|
var
|
|
OAMCopy: array [0..127] of SpriteEntry;
|
|
|
|
{$include inc/ballpalette.bin.inc}
|
|
{$include inc/balldata.bin.inc}
|
|
|
|
procedure initOAM();
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i := 0 to 127 do
|
|
OAMCopy[i].attribute[0] := ATTR0_DISABLED;
|
|
end;
|
|
|
|
procedure updateOAM();
|
|
begin
|
|
Move(OAMCopy, OAM^, 128 * sizeof(SpriteEntry));
|
|
end;
|
|
|
|
|
|
type
|
|
TTouchType = (ttContinuous, ttSingle);
|
|
|
|
var
|
|
frame: integer;
|
|
TouchType: TTouchType = ttContinuous;
|
|
|
|
|
|
procedure Vblank();
|
|
begin
|
|
inc(frame);
|
|
end;
|
|
|
|
var
|
|
min_x, min_y, max_x, max_y: integer;
|
|
min_px, min_py, max_px, max_py: integer;
|
|
touch: touchPosition;
|
|
i: integer;
|
|
pressed, held: integer;
|
|
|
|
begin
|
|
min_x := 4096;
|
|
min_y := 4096;
|
|
max_x := 0;
|
|
max_y := 0;
|
|
min_px := 4096;
|
|
min_py := 4096;
|
|
max_px := 0;
|
|
max_py := 0;
|
|
|
|
// put the main screen on the bottom lcd
|
|
lcdMainOnBottom();
|
|
|
|
initOAM();
|
|
|
|
//set the video mode
|
|
videoSetMode( MODE_0_2D or
|
|
DISPLAY_SPR_ACTIVE or //turn on sprites
|
|
DISPLAY_BG0_ACTIVE or //turn on background 0
|
|
DISPLAY_SPR_1D //this is used when in tile mode
|
|
);
|
|
|
|
// Sprite initialisation
|
|
Move(ballpalette_bin, SPRITE_PALETTE^, ballpalette_bin_size);
|
|
Move(balldata_bin, SPRITE_GFX^, balldata_bin_size);
|
|
|
|
consoleInit(nil, 0, BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true);
|
|
|
|
iprintf(#27'[4;8H' + 'Touch Screen Test');
|
|
iprintf(#27'[15;4H' + 'Right Shoulder toggles');
|
|
|
|
while true do
|
|
begin
|
|
swiWaitForVBlank();
|
|
updateOAM();
|
|
|
|
// read the button states
|
|
scanKeys();
|
|
|
|
// read the touchscreen coordinates
|
|
touchRead(touch);
|
|
|
|
pressed := keysDown(); // buttons pressed this loop
|
|
held := keysHeld(); // buttons currently held
|
|
|
|
if (pressed and KEY_START) <> 0 then
|
|
exit;
|
|
// Right Shoulder button toggles the mode
|
|
if ( pressed and KEY_R) <> 0 then Inc(TouchType);
|
|
|
|
if TouchType = ttContinuous then
|
|
printf(#27 + '[14;4H' + 'Touch mode: CONTINUOUS ')
|
|
else
|
|
printf(#27 + '[14;4H' + 'Touch mode: SINGLE SHOT');
|
|
|
|
iprintf(#27'[6;5H' + 'Touch x = %04X, %04X'#10, touch.rawx, touch.px);
|
|
iprintf(#27'[7;5H' + 'Touch y = %04X, %04X'#10, touch.rawy, touch.py);
|
|
|
|
|
|
iprintf(#27'[0;18H' + 'keys: %08X'#10, keysHeld());
|
|
iprintf(#27'[9;10H' + 'Frame %d'#10, frame);
|
|
|
|
if (TouchType = ttSingle) and not ( (pressed and KEY_TOUCH) <> 0) then continue;
|
|
|
|
if ((held and KEY_TOUCH) = 0) or (touch.rawx = 0) or (touch.rawy = 0) then continue;
|
|
|
|
|
|
iprintf(#27'[12;12H' + '(%d,%d) ', touch.px, touch.py);
|
|
|
|
if ( touch.rawx > max_x) then max_x := touch.rawx;
|
|
if ( touch.rawy > max_y) then max_y := touch.rawy;
|
|
if ( touch.px > max_px) then max_px := touch.px;
|
|
if ( touch.py > max_py) then max_py := touch.py;
|
|
|
|
if ( touch.rawx < min_x) then min_x := touch.rawx;
|
|
if ( touch.rawy < min_y) then min_y := touch.rawy;
|
|
if ( touch.px < min_px) then min_px := touch.px;
|
|
if ( touch.py < min_py) then min_py := touch.py;
|
|
|
|
iprintf(#27'[0;0H' + '(%d,%d) ', min_px, min_py);
|
|
iprintf(#27'[1;0H' + '(%d,%d) ', min_x, min_y);
|
|
iprintf(#27'[22;21H' + '(%d,%d)', max_x, max_y);
|
|
iprintf(#27'[23;23H' + '(%d,%d)', max_px, max_py);
|
|
|
|
OAMCopy[0].attribute[2] := 0;
|
|
OAMCopy[0].attribute[1] := ATTR1_SIZE_32 or ((touch.px - 16) and $01FF);
|
|
OAMCopy[0].attribute[0] := ATTR0_COLOR_256 or ATTR0_SQUARE or ((touch.py - 16) and $00FF);
|
|
|
|
end;
|
|
|
|
end.
|
|
|