Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
V
virtual_game_machine
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
adrian.spycher
virtual_game_machine
Commits
e8606f28
Commit
e8606f28
authored
5 months ago
by
adrian.spycher
Browse files
Options
Downloads
Patches
Plain Diff
feat!: add sprite state machine
parent
aa5f387e
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
guest/sprite/sprite_phys.c
+36
-11
36 additions, 11 deletions
guest/sprite/sprite_phys.c
vmm/operation.c
+79
-18
79 additions, 18 deletions
vmm/operation.c
vmm/operation.h
+10
-0
10 additions, 0 deletions
vmm/operation.h
with
125 additions
and
29 deletions
guest/sprite/sprite_phys.c
+
36
−
11
View file @
e8606f28
...
@@ -9,17 +9,42 @@
...
@@ -9,17 +9,42 @@
// --- FUNCTION ---
// --- FUNCTION ---
// void gfx_phys_init(uint32_t width, uint32_t height) {
void
sprite_phys_init
(
uint8_t
id
,
uint8_t
*
data
,
uint32_t
width
,
uint32_t
height
)
{
//
// while (*(uint32_t *)REG_GFX_INIT_ST == 42);
//
// *(uint32_t *)REG_GFX_INIT_CMD = 5;
// *(uint32_t *)REG_GFX_INIT_DATA = width;
// *(uint32_t *)REG_GFX_INIT_DATA = height;
// }
void
sprite_phys_init
(
uint8_t
id
,
uint8_t
*
data
,
uint32_t
width
,
uint32_t
height
)
{
}
*
(
uint32_t
*
)
REG_SPRITE_CMD
=
9
;
void
sprite_phys_visibility
(
uint8_t
id
,
uint8_t
toggle
)
{
}
*
(
uint32_t
*
)
REG_SPRITE_CMD
=
27
;
*
(
uint32_t
*
)
REG_SPRITE_DATA
=
id
;
void
sprite_phys_position
(
uint8_t
id
,
uint32_t
x
,
uint32_t
y
)
{
}
*
(
uint32_t
*
)
REG_SPRITE_DATA
=
width
;
*
(
uint32_t
*
)
REG_SPRITE_DATA
=
height
;
for
(
uint32_t
i
=
0
;
i
<
width
*
height
;
i
++
)
{
*
(
uint8_t
*
)
REG_SPRITE_DATA
=
*
data
++
;
// r
*
(
uint8_t
*
)
REG_SPRITE_DATA
=
*
data
++
;
// g
*
(
uint8_t
*
)
REG_SPRITE_DATA
=
*
data
++
;
// b
*
(
uint8_t
*
)
REG_SPRITE_DATA
=
*
data
++
;
// a
}
}
void
sprite_phys_visibility
(
uint8_t
id
,
uint8_t
toggle
)
{
*
(
uint32_t
*
)
REG_SPRITE_CMD
=
14
;
*
(
uint32_t
*
)
REG_SPRITE_CMD
=
27
;
*
(
uint32_t
*
)
REG_SPRITE_DATA
=
id
;
*
(
uint8_t
*
)
REG_SPRITE_DATA
=
toggle
;
}
void
sprite_phys_position
(
uint8_t
id
,
uint32_t
x
,
uint32_t
y
)
{
*
(
uint32_t
*
)
REG_SPRITE_CMD
=
35
;
*
(
uint32_t
*
)
REG_SPRITE_CMD
=
27
;
*
(
uint32_t
*
)
REG_SPRITE_DATA
=
id
;
*
(
uint32_t
*
)
REG_SPRITE_DATA
=
x
;
*
(
uint32_t
*
)
REG_SPRITE_DATA
=
y
;
}
This diff is collapsed.
Click to expand it.
vmm/operation.c
+
79
−
18
View file @
e8606f28
...
@@ -6,6 +6,7 @@
...
@@ -6,6 +6,7 @@
#include
<stdlib.h>
#include
<stdlib.h>
#include
<stdint.h>
#include
<stdint.h>
#include
<stdbool.h>
#include
<stdbool.h>
#include
<string.h>
#include
<unistd.h>
#include
<unistd.h>
#include
<semaphore.h>
#include
<semaphore.h>
...
@@ -14,6 +15,10 @@
...
@@ -14,6 +15,10 @@
// --- DEFINE ---
// --- DEFINE ---
#define UNUSED(x) (void)(x)
#define BUF_SIZE (1920 * 1080 * 4)
state_t
STATE_TIMER
[]
=
{
state_t
STATE_TIMER
[]
=
{
{
OP_WRITE_EQUAL
,
REG_TIMER_CMD
,
20
,
2
,
NULL
},
{
OP_WRITE_EQUAL
,
REG_TIMER_CMD
,
20
,
2
,
NULL
},
...
@@ -59,8 +64,8 @@ state_t STATE_SPRITE_VIS[] = {
...
@@ -59,8 +64,8 @@ state_t STATE_SPRITE_VIS[] = {
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0xE
,
4
,
NULL
},
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0xE
,
4
,
NULL
},
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0x1B
,
4
,
NULL
},
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0x1B
,
4
,
NULL
},
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
NULL
},
// id
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
op_callback_sprite_visibility_store_id
},
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
NULL
},
//
toggle
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
op_callback_sprite_visibility_store_
toggle
},
{
OP_EMUL_END
,
0
,
0
,
0
,
NULL
},
{
OP_EMUL_END
,
0
,
0
,
0
,
NULL
},
};
};
...
@@ -68,9 +73,9 @@ state_t STATE_SPRITE_POS[] = {
...
@@ -68,9 +73,9 @@ state_t STATE_SPRITE_POS[] = {
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0x23
,
4
,
NULL
},
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0x23
,
4
,
NULL
},
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0x1B
,
4
,
NULL
},
{
OP_WRITE_EQUAL
,
REG_SPRITE_CMD
,
0x1B
,
4
,
NULL
},
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
NULL
},
// id
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
op_callback_sprite_position_store_id
},
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
NULL
},
// x
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
op_callback_sprite_position_store_x
},
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
NULL
},
// y
{
OP_WRITE_STORE
,
REG_SPRITE_DATA
,
0
,
4
,
op_callback_sprite_position_store_y
},
{
OP_EMUL_END
,
0
,
0
,
0
,
NULL
},
{
OP_EMUL_END
,
0
,
0
,
0
,
NULL
},
};
};
...
@@ -102,8 +107,10 @@ static hyper_sprite_visibility_params_t param_sprite_vis;
...
@@ -102,8 +107,10 @@ static hyper_sprite_visibility_params_t param_sprite_vis;
static
hyper_sprite_position_params_t
param_sprite_pos
;
static
hyper_sprite_position_params_t
param_sprite_pos
;
// store the index of the actual loop
// store the index of the actual loop
static
uint32_t
loop_ide_data
=
MAX_LOOP_IDE_DATA
;
static
uint64_t
loop_idx
=
BUF_SIZE
;
static
uint16_t
buf_ide_data
[
MAX_LOOP_IDE_DATA
];
static
uint8_t
loop_buf_8
[
BUF_SIZE
];
static
uint16_t
*
loop_buf_16
=
(
uint16_t
*
)
loop_buf_8
;
static
uint32_t
*
loop_buf_32
=
(
uint32_t
*
)
loop_buf_8
;
// --- STATIC FUNCTION ---
// --- STATIC FUNCTION ---
...
@@ -155,11 +162,13 @@ void op_callback_gfx_init_conclude(void *addr) {
...
@@ -155,11 +162,13 @@ void op_callback_gfx_init_conclude(void *addr) {
}
}
void
op_callback_ide_prepare
(
void
*
addr
)
{
void
op_callback_ide_prepare
(
void
*
addr
)
{
UNUSED
(
addr
);
flag_stop_loop
=
false
;
flag_stop_loop
=
false
;
loop_id
e_data
=
MAX_LOOP_IDE_DATA
;
loop_id
x
=
0
;
param_ide
.
data
=
(
uint64_t
)
buf_ide_data
;
memset
(
loop_buf_8
,
0
,
sizeof
(
loop_buf_8
));
param_ide
.
data
=
(
uint64_t
)
loop_buf_8
;
}
}
void
op_callback_ide_store_sector_1
(
void
*
addr
)
{
void
op_callback_ide_store_sector_1
(
void
*
addr
)
{
...
@@ -185,13 +194,13 @@ void op_callback_ide_store_sector_4(void *addr) {
...
@@ -185,13 +194,13 @@ void op_callback_ide_store_sector_4(void *addr) {
void
op_callback_ide_store_data
(
void
*
addr
)
{
void
op_callback_ide_store_data
(
void
*
addr
)
{
buf_ide_data
[
MAX_LOOP_IDE_DATA
-
loop_id
e_data
]
=
*
(
uint16_t
*
)
addr
;
loop_buf_16
[
loop_id
x
]
=
*
(
uint16_t
*
)
addr
;
loop_id
e_data
--
;
loop_id
x
++
;
if
(
loop_id
e_data
==
0
)
{
if
(
loop_id
x
==
MAX_LOOP_IDE_DATA
)
{
loop_idx
=
0
;
flag_stop_loop
=
true
;
flag_stop_loop
=
true
;
loop_ide_data
=
MAX_LOOP_IDE_DATA
;
}
}
}
}
...
@@ -225,15 +234,42 @@ void op_callback_ide_conclude(void *addr) {
...
@@ -225,15 +234,42 @@ void op_callback_ide_conclude(void *addr) {
fclose
(
disk
);
fclose
(
disk
);
}
}
void
op_callback_sprite_init_prepare
(
void
*
addr
)
{
}
void
op_callback_sprite_init_prepare
(
void
*
addr
)
{
UNUSED
(
addr
);
void
op_callback_sprite_init_store_id
(
void
*
addr
)
{
}
flag_stop_loop
=
false
;
loop_idx
=
0
;
memset
(
loop_buf_8
,
0
,
sizeof
(
loop_buf_8
));
param_sprite_init
.
data
=
(
uint64_t
)
loop_buf_8
;
}
void
op_callback_sprite_init_store_
w
id
th
(
void
*
addr
)
{
}
void
op_callback_sprite_init_store_id
(
void
*
addr
)
{
void
op_callback_sprite_init_store_height
(
void
*
addr
)
{
}
param_sprite_init
.
id
=
*
(
uint32_t
*
)
addr
;
}
void
op_callback_sprite_init_store_width
(
void
*
addr
)
{
param_sprite_init
.
width
=
*
(
uint32_t
*
)
addr
;
}
void
op_callback_sprite_init_store_pixels
(
void
*
addr
)
{
}
void
op_callback_sprite_init_store_height
(
void
*
addr
)
{
param_sprite_init
.
height
=
*
(
uint32_t
*
)
addr
;
}
void
op_callback_sprite_init_store_pixels
(
void
*
addr
)
{
loop_buf_8
[
loop_idx
]
=
*
(
uint8_t
*
)
addr
;
loop_idx
++
;
if
(
loop_idx
==
param_sprite_init
.
width
*
param_sprite_init
.
height
*
4
)
{
loop_idx
=
0
;
flag_stop_loop
=
true
;
}
}
void
op_callback_sprite_init_conclude
(
void
*
addr
)
{
void
op_callback_sprite_init_conclude
(
void
*
addr
)
{
...
@@ -245,6 +281,16 @@ void op_callback_sprite_init_conclude(void *addr) {
...
@@ -245,6 +281,16 @@ void op_callback_sprite_init_conclude(void *addr) {
sprites
[
p_sp_init
->
id
].
data
=
(
uint8_t
*
)
p_sp_init
->
data
;
sprites
[
p_sp_init
->
id
].
data
=
(
uint8_t
*
)
p_sp_init
->
data
;
}
}
void
op_callback_sprite_visibility_store_id
(
void
*
addr
)
{
param_sprite_vis
.
id
=
*
(
uint32_t
*
)
addr
;
}
void
op_callback_sprite_visibility_store_toggle
(
void
*
addr
)
{
param_sprite_vis
.
toggle
=
*
(
uint8_t
*
)
addr
;
}
void
op_callback_sprite_visibility_conclude
(
void
*
addr
)
{
void
op_callback_sprite_visibility_conclude
(
void
*
addr
)
{
hyper_sprite_visibility_params_t
*
p_sp_vis
=
(
addr
==
NULL
)
?
&
param_sprite_vis
:
(
hyper_sprite_visibility_params_t
*
)
addr
;
hyper_sprite_visibility_params_t
*
p_sp_vis
=
(
addr
==
NULL
)
?
&
param_sprite_vis
:
(
hyper_sprite_visibility_params_t
*
)
addr
;
...
@@ -253,6 +299,21 @@ void op_callback_sprite_visibility_conclude(void *addr) {
...
@@ -253,6 +299,21 @@ void op_callback_sprite_visibility_conclude(void *addr) {
sprites
[
p_sp_vis
->
id
].
toggle
=
p_sp_vis
->
toggle
;
sprites
[
p_sp_vis
->
id
].
toggle
=
p_sp_vis
->
toggle
;
}
}
void
op_callback_sprite_position_store_id
(
void
*
addr
)
{
param_sprite_pos
.
id
=
*
(
uint32_t
*
)
addr
;
}
void
op_callback_sprite_position_store_x
(
void
*
addr
)
{
param_sprite_pos
.
x
=
*
(
uint32_t
*
)
addr
;
}
void
op_callback_sprite_position_store_y
(
void
*
addr
)
{
param_sprite_pos
.
y
=
*
(
uint32_t
*
)
addr
;
}
void
op_callback_sprite_position_conclude
(
void
*
addr
)
{
void
op_callback_sprite_position_conclude
(
void
*
addr
)
{
hyper_sprite_position_params_t
*
p_sp_pos
=
(
addr
==
NULL
)
?
&
param_sprite_pos
:
(
hyper_sprite_position_params_t
*
)
addr
;
hyper_sprite_position_params_t
*
p_sp_pos
=
(
addr
==
NULL
)
?
&
param_sprite_pos
:
(
hyper_sprite_position_params_t
*
)
addr
;
...
...
This diff is collapsed.
Click to expand it.
vmm/operation.h
+
10
−
0
View file @
e8606f28
...
@@ -136,8 +136,18 @@ void op_callback_sprite_init_store_pixels(void *addr);
...
@@ -136,8 +136,18 @@ void op_callback_sprite_init_store_pixels(void *addr);
void
op_callback_sprite_init_conclude
(
void
*
addr
);
void
op_callback_sprite_init_conclude
(
void
*
addr
);
void
op_callback_sprite_visibility_store_id
(
void
*
addr
);
void
op_callback_sprite_visibility_store_toggle
(
void
*
addr
);
void
op_callback_sprite_visibility_conclude
(
void
*
addr
);
void
op_callback_sprite_visibility_conclude
(
void
*
addr
);
void
op_callback_sprite_position_store_id
(
void
*
addr
);
void
op_callback_sprite_position_store_x
(
void
*
addr
);
void
op_callback_sprite_position_store_y
(
void
*
addr
);
void
op_callback_sprite_position_conclude
(
void
*
addr
);
void
op_callback_sprite_position_conclude
(
void
*
addr
);
#endif // _OPERATION_H_
#endif // _OPERATION_H_
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment