Skip to content

Commit 2d9b24f

Browse files
committed
soso nano-x port
1 parent 2019640 commit 2d9b24f

File tree

2 files changed

+313
-0
lines changed

2 files changed

+313
-0
lines changed

doomgeneric/Makefile.sosox

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
################################################################
2+
#
3+
# $Id:$
4+
#
5+
# $Log:$
6+
#
7+
8+
ifeq ($(V),1)
9+
VB=''
10+
else
11+
VB=@
12+
endif
13+
14+
15+
CC=soso-clang # gcc or g++
16+
CFLAGS+=-O3
17+
LDFLAGS+=$(SOSO_ROOT)/lib/crt1.o $(SOSO_ROOT)/lib/crti.o $(SOSO_ROOT)/lib/crtn.o
18+
CFLAGS+=-I$(SOSO_ROOT)/include/nano-x -Wall -DNORMALUNIX -DLINUX -DSNDSERV -D_DEFAULT_SOURCE # -DUSEASM
19+
LIBS+=-lnano-X -lm -lc /usr/lib/llvm-10/lib/clang/10.0.0/lib/linux/libclang_rt.builtins-i386.a
20+
21+
# subdirectory for objects
22+
OBJDIR=build
23+
OUTPUT=doom
24+
25+
SRC_DOOM = i_main.o dummy.o am_map.o doomdef.o doomstat.o dstrings.o d_event.o d_items.o d_iwad.o d_loop.o d_main.o d_mode.o d_net.o f_finale.o f_wipe.o g_game.o hu_lib.o hu_stuff.o info.o i_cdmus.o i_endoom.o i_joystick.o i_scale.o i_sound.o i_system.o i_timer.o memio.o m_argv.o m_bbox.o m_cheat.o m_config.o m_controls.o m_fixed.o m_menu.o m_misc.o m_random.o p_ceilng.o p_doors.o p_enemy.o p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o sha1.o sounds.o statdump.o st_lib.o st_stuff.o s_sound.o tables.o v_video.o wi_stuff.o w_checksum.o w_file.o w_main.o w_wad.o z_zone.o w_file_stdc.o i_input.o i_video.o doomgeneric.o doomgeneric_sosox.o
26+
OBJS += $(addprefix $(OBJDIR)/, $(SRC_DOOM))
27+
28+
all: $(OUTPUT)
29+
30+
clean:
31+
rm -rf $(OBJDIR)
32+
rm -f $(OUTPUT)
33+
rm -f $(OUTPUT).gdb
34+
rm -f $(OUTPUT).map
35+
36+
$(OUTPUT): $(OBJS)
37+
@echo [Linking $@]
38+
i386-soso-ld -v $(LDFLAGS) $(OBJS) -o $(OUTPUT) $(LIBS)
39+
@echo [Size]
40+
-$(CROSS_COMPILE)size $(OUTPUT)
41+
cp $(OUTPUT) ~/git/soso/userspace/bin/
42+
43+
$(OBJS): | $(OBJDIR)
44+
45+
$(OBJDIR):
46+
mkdir -p $(OBJDIR)
47+
48+
$(OBJDIR)/%.o: %.c
49+
@echo [Compiling $<]
50+
$(VB)$(CC) $(CFLAGS) -c $< -o $@
51+
52+
print:
53+
@echo OBJS: $(OBJS)
54+

doomgeneric/doomgeneric_sosox.c

+259
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
//doomgeneric for soso os (nano-x version)
2+
//TODO: get keys from X, not using direct keyboard access!
3+
4+
#include "doomkeys.h"
5+
#include "m_argv.h"
6+
#include "doomgeneric.h"
7+
8+
#include <stdio.h>
9+
#include <fcntl.h>
10+
#include <unistd.h>
11+
#include <string.h>
12+
13+
#include <sys/ioctl.h>
14+
15+
#include <termios.h>
16+
17+
#include <soso.h>
18+
19+
#include <nano-X.h>
20+
21+
22+
static int g_keyboard_fd = -1;
23+
24+
#define KEYQUEUE_SIZE 16
25+
26+
static unsigned short g_key_queue[KEYQUEUE_SIZE];
27+
static unsigned int g_key_queue_write_index = 0;
28+
static unsigned int g_key_queue_read_index = 0;
29+
30+
31+
static GR_WINDOW_ID wid;
32+
static GR_GC_ID gc;
33+
static unsigned char* windowBuffer = 0;
34+
static const int winSizeX = DOOMGENERIC_RESX;
35+
static const int winSizeY = DOOMGENERIC_RESY;
36+
static int button_down = 0;
37+
38+
39+
static unsigned char convert_to_doom_key(unsigned char scancode)
40+
{
41+
unsigned char key = 0;
42+
43+
switch (scancode)
44+
{
45+
case 0x9C:
46+
case 0x1C:
47+
key = KEY_ENTER;
48+
break;
49+
case 0x01:
50+
key = KEY_ESCAPE;
51+
break;
52+
case 0xCB:
53+
case 0x4B:
54+
key = KEY_LEFTARROW;
55+
break;
56+
case 0xCD:
57+
case 0x4D:
58+
key = KEY_RIGHTARROW;
59+
break;
60+
case 0xC8:
61+
case 0x48:
62+
key = KEY_UPARROW;
63+
break;
64+
case 0xD0:
65+
case 0x50:
66+
key = KEY_DOWNARROW;
67+
break;
68+
case 0x1D:
69+
key = KEY_FIRE;
70+
break;
71+
case 0x39:
72+
key = KEY_USE;
73+
break;
74+
case 0x2A:
75+
case 0x36:
76+
key = KEY_RSHIFT;
77+
break;
78+
case 0x15:
79+
key = 'y';
80+
break;
81+
default:
82+
break;
83+
}
84+
85+
return key;
86+
}
87+
88+
static void add_key_to_queue(int pressed, unsigned char key_code)
89+
{
90+
unsigned char key = convert_to_doom_key(key_code);
91+
92+
unsigned short key_data = (pressed << 8) | key;
93+
94+
g_key_queue[g_key_queue_write_index] = key_data;
95+
g_key_queue_write_index++;
96+
g_key_queue_write_index %= KEYQUEUE_SIZE;
97+
}
98+
99+
100+
struct termios orig_termios;
101+
102+
void disable_raw_mode()
103+
{
104+
tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
105+
}
106+
107+
void enable_raw_mode()
108+
{
109+
tcgetattr(STDIN_FILENO, &orig_termios);
110+
atexit(disable_raw_mode);
111+
struct termios raw = orig_termios;
112+
raw.c_lflag &= ~(ECHO);
113+
raw.c_cc[VMIN] = 0;
114+
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
115+
}
116+
117+
void DG_Init()
118+
{
119+
if (GrOpen() < 0)
120+
{
121+
GrError("GrOpen failed");
122+
return;
123+
}
124+
125+
gc = GrNewGC();
126+
GrSetGCUseBackground(gc, GR_FALSE);
127+
GrSetGCForeground(gc, MWRGB( 255, 0, 0 ));
128+
129+
wid = GrNewBufferedWindow(GR_WM_PROPS_APPFRAME |
130+
GR_WM_PROPS_CAPTION |
131+
GR_WM_PROPS_CLOSEBOX |
132+
GR_WM_PROPS_BUFFER_MMAP |
133+
GR_WM_PROPS_BUFFER_BGRA,
134+
"Doom",
135+
GR_ROOT_WINDOW_ID,
136+
50, 50, winSizeX, winSizeY, MWRGB( 255, 255, 255 ));
137+
138+
GrSelectEvents(wid, GR_EVENT_MASK_EXPOSURE |
139+
GR_EVENT_MASK_TIMER |
140+
GR_EVENT_MASK_CLOSE_REQ |
141+
GR_EVENT_MASK_BUTTON_DOWN |
142+
GR_EVENT_MASK_BUTTON_UP);
143+
144+
GrMapWindow (wid);
145+
146+
windowBuffer = GrOpenClientFramebuffer(wid);
147+
148+
enable_raw_mode();
149+
150+
g_keyboard_fd = open("/dev/keyboard", 0);
151+
152+
if (g_keyboard_fd >= 0)
153+
{
154+
//enter non-blocking mode
155+
ioctl(g_keyboard_fd, 1, (void*)1);
156+
}
157+
}
158+
159+
static void handle_key_input()
160+
{
161+
if (g_keyboard_fd < 0)
162+
{
163+
return;
164+
}
165+
166+
unsigned char scancode = 0;
167+
168+
if (read(g_keyboard_fd, &scancode, 1) > 0)
169+
{
170+
unsigned char keyRelease = (0x80 & scancode);
171+
172+
scancode = (0x7F & scancode);
173+
174+
//printf("scancode:%x pressed:%d\n", scancode, 0 == keyRelease);
175+
176+
if (0 == keyRelease)
177+
{
178+
add_key_to_queue(1, scancode);
179+
}
180+
else
181+
{
182+
add_key_to_queue(0, scancode);
183+
}
184+
}
185+
}
186+
187+
void DG_DrawFrame()
188+
{
189+
GR_EVENT event;
190+
while (GrPeekEvent(&event))
191+
{
192+
GrGetNextEvent(&event);
193+
194+
switch (event.type)
195+
{
196+
case GR_EVENT_TYPE_BUTTON_DOWN:
197+
button_down = 1;
198+
break;
199+
case GR_EVENT_TYPE_BUTTON_UP:
200+
button_down = 0;
201+
break;
202+
203+
case GR_EVENT_TYPE_CLOSE_REQ:
204+
GrClose();
205+
exit (0);
206+
break;
207+
case GR_EVENT_TYPE_EXPOSURE:
208+
break;
209+
case GR_EVENT_TYPE_TIMER:
210+
211+
break;
212+
}
213+
}
214+
215+
//if (button_down == 0)
216+
{
217+
memcpy(windowBuffer, DG_ScreenBuffer, DOOMGENERIC_RESX * DOOMGENERIC_RESY * 4);
218+
219+
GrFlushWindow(wid);
220+
}
221+
222+
handle_key_input();
223+
}
224+
225+
void DG_SleepMs(uint32_t ms)
226+
{
227+
sleep_ms(ms);
228+
}
229+
230+
uint32_t DG_GetTicksMs()
231+
{
232+
return get_uptime_ms();
233+
}
234+
235+
int DG_GetKey(int* pressed, unsigned char* doomKey)
236+
{
237+
if (g_key_queue_read_index == g_key_queue_write_index)
238+
{
239+
//key queue is empty
240+
241+
return 0;
242+
}
243+
else
244+
{
245+
unsigned short keyData = g_key_queue[g_key_queue_read_index];
246+
g_key_queue_read_index++;
247+
g_key_queue_read_index %= KEYQUEUE_SIZE;
248+
249+
*pressed = keyData >> 8;
250+
*doomKey = keyData & 0xFF;
251+
252+
return 1;
253+
}
254+
}
255+
256+
void DG_SetWindowTitle(const char * title)
257+
{
258+
GrSetWindowTitle(wid, title);
259+
}

0 commit comments

Comments
 (0)