Compare commits

..

No commits in common. "83ef67ad2840e700a3607bfaf2adafa634e374e0" and "f2ad30047af6ad0974e8d809f3158e17c864e49f" have entirely different histories.

16 changed files with 41 additions and 203 deletions

3
.gitignore vendored
View File

@ -1,4 +1,3 @@
build/
.cache/
compile_commands.json
src/UEFI_fireworks/rocket.c
compile_commands.json

View File

@ -30,8 +30,6 @@ LocalApicLib|edk2/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.inf
CpuLib|edk2/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
UefiRuntimeServicesTableLib|edk2/MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
TimerLib|edk2/MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
BmpSupportLib|edk2/MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
SafeIntLib|edk2/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
[Components]
src/UEFI_fireworks/UEFI_fireworks.inf

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,7 +1,5 @@
#!/bin/bash
export PACKAGES_PATH=$PWD:$PWD/edk2
magick assets/rocket_orig.bmp -type TrueColor -define bmp:format=bmp3 -compress None assets/rocket.bmp
xxd -i assets/rocket.bmp > src/UEFI_fireworks/rocket.c
if [ "$1" == "debug" ]; then
build -a X64 -t GCC5 -p UEFI_fireworks.dsc -b DEBUG
else

View File

@ -11,7 +11,6 @@
drawing.c
rng.c
time.c
rocket.c
[Packages]
edk2/MdePkg/MdePkg.dec
@ -31,7 +30,6 @@
RngLib
SerialPortLib
UefiRuntimeServicesTableLib
BmpSupportLib
[Protocols]
gEfiRngProtocolGuid

View File

@ -1,5 +1,5 @@
#include "Library/UefiApplicationEntryPoint.h"
#include "ProcessorBind.h"
#include "const.h"
#include "drawing.h"
#include "global.h"
#include "macros.h"
@ -18,8 +18,6 @@
#include <Protocol/GraphicsOutput.h>
#include <Uefi.h>
#include <stdint.h>
EFI_GRAPHICS_OUTPUT_BLT_PIXEL night_sky =
COLOR_FROM_HEX(0x090531); // this cannot be const becose EDK2 said so
firework_instance create_firework();
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL;
@ -54,7 +52,6 @@ EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE imgHandle,
(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)GraphicsOutput->Mode->FrameBufferBase;
init_rng();
init_rocket_blt();
if (SerialPortInitialize() == RETURN_SUCCESS) {
SERIAL_PRINT("Serial initialized\n");
@ -70,21 +67,14 @@ EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE imgHandle,
0); // make all pointers null
SERIAL_PRINT("DOES it work?\n");
Print(L"If you see this message for long time, timer does not work\n");
milisleep(1);
Print(L"If you see this message timer does not work\n");
milisleep(100);
clear_screen();
/*rocket_instance rocket = {
.x = GraphicsOutput->Mode->Info->HorizontalResolution / 2,
.y = GraphicsOutput->Mode->Info->VerticalResolution - 50};
while (step_rocket(&rocket, 100)) {
milisleep(10);
}*/
while (TRUE) {
UINT8 random;
fill_random_bytes(&random, sizeof(random));
if (random % 30 == 0) {
if (random % 6 == 0) {
// spawn new firework
firework_instance *new_firework_instence =
AllocateZeroPool(sizeof(firework_instance));
@ -95,8 +85,7 @@ EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE imgHandle,
*new_firework_instence = create_firework();
for (UINT8 i = 0; i < ARRAY_SIZE(firework_array); i++) {
if (firework_array[i] == NULL ||
firework_array[i]->status == INACTIVE) {
if (firework_array[i] == NULL || firework_array[i]->active != TRUE) {
if (firework_array[i] != NULL) {
FreePool(firework_array[i]); // free firework
firework_array[i] = NULL;
@ -110,13 +99,9 @@ EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE imgHandle,
assgned:
for (UINT8 i = 0; i < ARRAY_SIZE(firework_array); i++) {
if (firework_array[i] != NULL) {
if (firework_array[i]->status == ACTIVE) {
if (firework_array[i]->active == TRUE) {
if (!step_firework(firework_array[i])) {
firework_array[i]->status = INACTIVE;
}
} else if (firework_array[i]->status == LAUNCHING) {
if (!step_rocket(&firework_array[i]->rocket, firework_array[i]->y)) {
firework_array[i]->status = ACTIVE;
firework_array[i]->active = FALSE;
}
} else {
FreePool(firework_array[i]); // free firework
@ -135,7 +120,7 @@ firework_instance create_firework() {
firework_instance firework;
UINT32 random;
fill_random_bytes(&random, sizeof(random));
firework.max_r = (random % 190) + 10; // 10 to 200,
firework.max_r = (random % 200) + 1; // 1 to 200, avoiding 0
for (UINT8 i = 0; i < ARRAY_SIZE(firework.color); i++) {
fill_random_bytes(&firework.color[i],
@ -147,11 +132,8 @@ firework_instance create_firework() {
fill_random_bytes(&random, sizeof(random));
firework.x = random % GraphicsOutput->Mode->Info->HorizontalResolution;
fill_random_bytes(&random, sizeof(random));
firework.y = random % GraphicsOutput->Mode->Info->VerticalResolution /
2; // spawn only on upper half of the screen
firework.y = random % GraphicsOutput->Mode->Info->VerticalResolution;
firework.rocket.x = firework.x + rocket_asset.width / 2;
firework.rocket.y = GraphicsOutput->Mode->Info->VerticalResolution;
firework.status = LAUNCHING;
firework.active = TRUE;
return firework;
}

View File

@ -1,3 +0,0 @@
#pragma once
extern unsigned char assets_rocket_bmp[];
extern unsigned int assets_rocket_bmp_len;

View File

@ -2,6 +2,5 @@
#include "macros.h"
#include <Protocol/GraphicsOutput.h>
extern EFI_GRAPHICS_OUTPUT_BLT_PIXEL night_sky;
enum firework_status { INACTIVE, ACTIVE, LAUNCHING };
EFI_GRAPHICS_OUTPUT_BLT_PIXEL night_sky =
COLOR_FROM_HEX(0x11095e); // this cannot be const becose EDK2 said so

View File

@ -1,23 +1,17 @@
#include "Base.h"
#include "Library/BaseMemoryLib.h"
#include "Library/MemoryAllocationLib.h"
#include "Library/UefiLib.h"
#include "ProcessorBind.h"
#include "bmp.h"
#include "const.h"
#include "global.h"
#include "time.h"
#include "types.h"
#include <../MdeModulePkg/Include/Library/BmpSupportLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Protocol/GraphicsOutput.h>
#include <alloca.h>
void draw_pixel(const UINT32 x, const UINT32 y,
const EFI_GRAPHICS_OUTPUT_BLT_PIXEL pixel) {
if (x >= GraphicsOutput->Mode->Info->HorizontalResolution ||
y >= GraphicsOutput->Mode->Info
->VerticalResolution) { // ignore when out of bounds
if (x > GraphicsOutput->Mode->Info->HorizontalResolution ||
y > GraphicsOutput->Mode->Info
->VerticalResolution) { // ignore when out of bounds
return;
}
UINTN framebuffer_offset =
@ -111,64 +105,3 @@ BOOLEAN step_firework(firework_instance *firework) {
}
return TRUE;
}
rocket_blt rocket_asset;
BOOLEAN **rocket_alfa_mask;
UINT32 *rocket_clean_up_mask;
void init_rocket_blt() {
EFI_STATUS Status = TranslateBmpToGopBlt(
assets_rocket_bmp, assets_rocket_bmp_len, &rocket_asset.blt,
&rocket_asset.blt_size, &rocket_asset.height, &rocket_asset.width);
if (EFI_ERROR(Status)) {
Print(L"Failed to load rocket asset: %r\n", Status);
Exit(Status);
}
rocket_clean_up_mask = AllocatePool(rocket_asset.width * sizeof(location));
rocket_alfa_mask = AllocateZeroPool(rocket_asset.height * sizeof(BOOLEAN *));
for (UINT32 i = 0; i < rocket_asset.height; i++) {
rocket_alfa_mask[i] = AllocatePool(rocket_asset.width * sizeof(BOOLEAN));
for (UINT32 j = 0; j < rocket_asset.width; j++) {
if (rocket_asset.blt[i * rocket_asset.width + j].Blue == 0 &&
rocket_asset.blt[i * rocket_asset.width + j].Green == 0 &&
rocket_asset.blt[i * rocket_asset.width + j].Red == 0) {
rocket_alfa_mask[i][j] = FALSE;
} else {
rocket_alfa_mask[i][j] = TRUE;
rocket_clean_up_mask[j] = i + 1; // build the cleanup mask
}
}
}
}
void draw_rocket(location *rocket) {
for (UINT32 i = 0; i < rocket_asset.width; i++) {
for (UINT32 j = 0; j < rocket_asset.height; j++) {
if (rocket_alfa_mask[j][i]) {
draw_pixel(i + rocket->x, j + rocket->y,
rocket_asset.blt[j * rocket_asset.width + i]);
}
}
}
}
BOOLEAN step_rocket(location *rocket, UINT32 max_y) {
draw_rocket(rocket);
for (UINT8 i = 0; i < rocket_asset.width; i++) {
draw_pixel(rocket->x + i, rocket->y + rocket_clean_up_mask[i], night_sky);
}
if (rocket->y <= max_y) {
// remove rocket
for (UINT32 i = 0; i < rocket_asset.width; i++) {
for (UINT32 j = 0; j < rocket_asset.height; j++) {
if (rocket_alfa_mask[j][i]) {
draw_pixel(i + rocket->x, j + rocket->y, night_sky);
}
}
}
return FALSE;
} else {
rocket->y--;
return TRUE;
}
}

View File

@ -4,6 +4,4 @@
void draw_circle(int xc, int yc, int r,
const EFI_GRAPHICS_OUTPUT_BLT_PIXEL color);
void clear_screen();
BOOLEAN step_firework(firework_instance *firework);
void init_rocket_blt();
BOOLEAN step_rocket(location *rocket, UINT32 max_y);
BOOLEAN step_firework(firework_instance *firework);

View File

@ -1,6 +1,4 @@
#pragma once
#include "types.h"
#include <Protocol/GraphicsOutput.h>
extern EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
extern EFI_GRAPHICS_OUTPUT_BLT_PIXEL *framebuffer;
extern rocket_blt rocket_asset;
extern EFI_GRAPHICS_OUTPUT_BLT_PIXEL *framebuffer;

View File

@ -2,14 +2,12 @@
#include "Library/UefiBootServicesTableLib.h"
#include "Library/UefiLib.h"
#include "ProcessorBind.h"
#include "Uefi/UefiBaseType.h"
#include "time.h"
#include <Library/BaseLib.h>
#include <Library/RngLib.h>
#include <Library/TimerLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Uefi.h>
#include <stdint.h>
void (*fill_random_bytes)(void *dst, UINTN n);
UINT16 shift_LFSR(UINT16 LFSR) {
@ -21,6 +19,22 @@ UINT16 shift_LFSR(UINT16 LFSR) {
return LFSR;
}
void fill_random_bytes_LFSR(void *dst, UINTN n) {
static UINT16 LFSR = 0xf5d7;
if (n % 2 != 0) {
LFSR = shift_LFSR(LFSR);
*(UINT8 *)dst = (UINT8)LFSR;
dst++;
n--;
}
while (n != 0) {
LFSR = shift_LFSR(LFSR);
*(UINT16 *)dst = LFSR;
dst += 2;
n -= 2;
}
}
void fill_random_bytes_TRUE(void *dst, UINTN n) {
UINT16 rand;
if (n % 2 != 0) {
@ -36,21 +50,6 @@ void fill_random_bytes_TRUE(void *dst, UINTN n) {
n -= 2;
}
}
UINT16 LFSR;
void fill_random_bytes_LFSR(void *dst, UINTN n) {
if (n % 2 != 0) {
LFSR = shift_LFSR(LFSR);
*(UINT8 *)dst = (UINT8)LFSR;
dst++;
n--;
}
while (n != 0) {
LFSR = shift_LFSR(LFSR);
*(UINT16 *)dst = LFSR;
dst += 2;
n -= 2;
}
}
void init_rng() {
UINT16 test_var;
@ -60,58 +59,12 @@ void init_rng() {
gST->ConOut->SetAttribute(gST->ConOut, EFI_YELLOW);
Print(L"[WARNING]");
gST->ConOut->SetAttribute(gST->ConOut, EFI_WHITE);
Print(L" RNG device not available falling back to LFSR!\r\n");
Print(L" RNG device not available falling back to LFSR\r\n");
EFI_TIME Time;
EFI_STATUS Status;
UINT32 starting;
Status = gRT->GetTime(&Time, NULL);
if (EFI_ERROR(Status)) {
Print(L"failed to get time\r\n");
milisleep(2000);
starting = 1;
} else {
starting = Time.Second;
}
Print(L"Press any key to seed the LFSR\r\n");
EFI_INPUT_KEY Key;
UINTN Index;
Status = gBS->WaitForEvent(1, &(gST->ConIn->WaitForKey), &Index);
if (EFI_ERROR(Status)) {
Print(L"failed to wait key\r\n");
Key.ScanCode = 1;
Key.UnicodeChar = 1;
} else {
Status = gST->ConIn->ReadKeyStroke(gST->ConIn, &Key);
if (EFI_ERROR(Status)) {
Print(L"failed to read key\r\n");
Key.ScanCode = 1;
Key.UnicodeChar = 1;
}
}
if (Key.ScanCode == 0) {
Key.ScanCode = 1;
}
Status = gRT->GetTime(&Time, NULL);
if (EFI_ERROR(Status)) {
Print(L"failed to get time\r\n");
Time.Second = 1;
}
UINT8 time_diff = (Time.Second - starting);
if (time_diff == 0) {
time_diff = 1;
}
LFSR = (typeof(LFSR))(((UINTN)Key.ScanCode * (UINTN)Key.UnicodeChar *
(UINTN)(time_diff)) %
UINT16_MAX);
if (LFSR <= 1) {
LFSR = 0xf5d7;
Print(L"Continuing in ");
for (UINT8 i = 5; i > 0; i--) {
Print(L"\b%d", i);
milisleep(1000);
}
fill_random_bytes = fill_random_bytes_LFSR;

View File

@ -1,2 +1,2 @@
#pragma once
void milisleep(UINTN n);
void milisleep(UINTN Milliseconds);

View File

@ -1,28 +1,13 @@
#pragma once
#include "ProcessorBind.h"
#include "Protocol/GraphicsOutput.h"
#include "const.h"
#include <Library/BaseLib.h>
typedef struct {
UINT32 x;
UINT32 y;
} location;
typedef struct {
enum firework_status status; // IF INACTIVE can be overwriten
BOOLEAN active; // IF FALSE can be overwriten
UINT32 x;
UINT32 y;
UINT16 max_r;
UINT16 r[3];
EFI_GRAPHICS_OUTPUT_BLT_PIXEL color[3];
UINT16 cleanup_r;
location rocket;
} firework_instance;
typedef struct {
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *blt;
UINTN blt_size;
UINTN height;
UINTN width;
} rocket_blt;