/programs/games/console15/asm_code.asm |
---|
0,0 → 1,33 |
format MS COFF |
public Start |
extrn Memory |
extrn hEnd |
extrn _kol_main |
section ".text" code |
db "MENUET01" |
dd 1, Start, hEnd, Memory, hStack, 0, 0 |
Start: |
; èíèöèàëèçàöèÿ êó÷è |
mov eax, 68 |
mov ebx, 11 |
int 0x40 |
; âûçîâ ãëàâíîé ïðîöåäóðû |
mov eax, _kol_main |
call eax |
; çàâåðøåíèå ðàáîòû ïðîãðàììû |
mov eax, -1 |
int 0x40 |
section ".bss" |
rb 4096 |
hStack: |
/programs/games/console15/c_code.c |
---|
0,0 → 1,192 |
#include "system/kolibri.h" |
#include "system/stdlib.h" |
#include "system/string.h" |
char CONSOLE[] = "/sys/lib/console.obj"; |
#define MENTION _printf("Arrows to move left, up, right or down, or 'Esc' to exit: \n\n"); |
int** field; |
int emptyCell_x, emptyCell_y; |
char NOT_VALID_MOVE[] = {"Not valid move.\n\n"}; |
void (* _stdcall con_init)(unsigned w_w, unsigned w_h, unsigned s_w, unsigned s_h, const char* t); |
void (* _cdecl _printf)(const char* format,...); |
void (* _stdcall __exit)(char bCloseWindow); |
int (* _stdcall _getch)(void); |
//------------------ |
void init() |
{ |
int x,y, i,j; |
srand( kol_system_time_get() ); |
for(i=1; i<=15;) |
{ |
x=rand()%4; y=rand()%4; |
if(field[x][y] == 0) field[x][y] = i++; |
} |
for(i=0; i<4; i++) //to find the empty cell |
for(j=0; j<4; j++) |
if(field[j][i] == 0) |
{ |
emptyCell_x=j; emptyCell_y = i; return; |
} |
} |
//--------------------- |
void printField() |
{ |
int i,j; |
for(i=0; i<4; i++) |
{ |
for(j=0; j<4; j++) |
if(field[j][i]) _printf("%3d", field[j][i]); |
else _printf(" _"); |
_printf("\n\n"); |
} |
_printf("\n\n"); |
} |
//----------------------- |
int notEndYet() |
{ |
int i,j; |
for(i=0; i<3; i++) |
for(j=0; j<4; j++) |
if(field[j][i] != 4*i+j+1) return 0; //go on play |
if(field[0][3] != 13) return 0; |
return 1; //victory! |
} |
//--------------- allows move the emply cell |
int move() |
{ |
unsigned short c; |
while(1) |
{ |
c = _getch(); |
switch(c) |
{ |
case 0x4d00: |
if(emptyCell_x==0) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x-1][emptyCell_y]; |
field[emptyCell_x-1][emptyCell_y] = 0; |
emptyCell_x--; |
return 1; |
} |
case 0x5000: |
if(emptyCell_y==0) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x][emptyCell_y-1]; |
field[emptyCell_x][emptyCell_y-1] = 0; |
emptyCell_y--; |
return 2; |
} |
case 0x4b00: |
if(emptyCell_x==3) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x+1][emptyCell_y]; |
field[emptyCell_x+1][emptyCell_y] = 0; |
emptyCell_x++; |
return 3; |
} |
case 0x4800: |
if(emptyCell_y==3) |
{ |
_printf(NOT_VALID_MOVE); |
break; |
} |
else |
{ |
field[emptyCell_x][emptyCell_y] = field[emptyCell_x][emptyCell_y+1]; |
field[emptyCell_x][emptyCell_y+1] = 0; |
emptyCell_y++; |
return 4; |
} |
case 0x011b: __exit(1); |
default: MENTION |
} |
} |
} |
//----------------- main function |
void kol_main() |
{ |
int i; |
kol_struct_import *imp; |
imp = kol_cofflib_load(CONSOLE); |
if (imp == NULL) |
kol_exit(); |
con_init = ( _stdcall void (*)(unsigned, unsigned, unsigned, unsigned, const char*)) |
kol_cofflib_procload (imp, "con_init"); |
if (con_init == NULL) |
kol_exit(); |
_printf = ( _cdecl void (*)(const char*,...)) |
kol_cofflib_procload (imp, "con_printf"); |
if (_printf == NULL) |
kol_exit(); |
__exit = ( _stdcall void (*)(char)) |
kol_cofflib_procload (imp, "con_exit"); |
if (__exit == NULL) |
kol_exit(); |
_getch = ( _stdcall int (*)(void)) |
kol_cofflib_procload (imp, "con_getch2"); |
if (_getch == NULL) |
kol_exit(); |
con_init(-1, -1, -1, -1, "Console15 by O.Bogomaz"); |
field = (int**)malloc(4 * sizeof(int*)); |
for( i=0; i<4; i++) |
field[i] = (int*)malloc(4 * sizeof(int)); |
do |
init(); |
while(notEndYet()); |
MENTION |
printField(); |
while(!notEndYet()) |
{ |
move(); |
printField(); |
} |
_printf("\nYou win!\n"); |
__exit(0); |
} |
/programs/games/console15/compile.bat |
---|
0,0 → 1,11 |
del *.o |
fasm asm_code.asm asm_code.o |
gcc -c c_code.c |
gcc -c system/kolibri.c |
gcc -c system/stdlib.c |
gcc -c system/string.c |
ld -nostdlib -T kolibri.ld -o console15 asm_code.o kolibri.o stdlib.o string.o c_code.o |
objcopy console15 -O binary |
kpack console15 |
del *.o |
pause |
/programs/games/console15/kolibri.ld |
---|
0,0 → 1,20 |
/*OUTPUT_FORMAT("binary")*/ |
ENTRY(Start) |
SECTIONS |
{ |
.text 0x000000: |
{ |
*(.text) |
} |
.data : { |
*(.data) |
hEnd = . ; |
} |
.bss : |
{ |
*(.bss) |
} |
Memory = . ; |
} |
/programs/games/console15/system/kolibri.c |
---|
0,0 → 1,422 |
#include "kolibri.h" |
#include "string.h" |
extern char KOL_PATH[256]; |
extern char KOL_PARAM[256]; |
extern char KOL_DIR[256]; |
void kol_exit() |
{ |
asm ("int $0x40"::"a"(-1)); |
} |
void kol_sleep(unsigned d) |
{ |
asm ("int $0x40"::"a"(5), "b"(d)); |
} |
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c) |
{ |
asm ("nop"::"a"(0), "b"(x*65536+w), "c"(y*65536+h), "d"(c)); |
asm ("movl $0xffffff, %esi \n int $0x40"); |
} |
void kol_wnd_move(unsigned x, unsigned y) |
{ |
asm ("nop"::"a"(67), "b"(x), "c"(y)); |
asm ("movl $-1, %edx \n movl $-1, %esi \n int $0x40"); |
} |
void kol_event_mask(unsigned e) |
{ |
asm ("int $0x40"::"a"(40), "b"(e)); |
} |
unsigned kol_event_wait() |
{ |
asm ("int $0x40"::"a"(10)); |
} |
unsigned kol_event_wait_time(unsigned time) |
{ |
asm ("int $0x40"::"a"(23), "b"(time)); |
} |
unsigned kol_event_check() |
{ |
asm ("int $0x40"::"a"(11)); |
} |
void kol_paint_start() |
{ |
asm ("int $0x40"::"a"(12), "b"(1)); |
} |
void kol_paint_end() |
{ |
asm ("int $0x40"::"a"(12), "b"(2)); |
} |
void kol_paint_pixel(unsigned x, unsigned y, unsigned c) |
{ |
asm ("int $0x40"::"a"(1), "b"(x), "c"(y), "d"(c)); |
} |
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c) |
{ |
asm ("int $0x40"::"a"(13), "b"(x*65536+w), "c"(y*65536+h), "d"(c)); |
} |
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c) |
{ |
asm ("int $0x40"::"a"(38), "b"(x1*65536+x2), "c"(y1*65536+y2), "d"(c)); |
} |
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c) |
{ |
asm ("int $0x40"::"a"(4), "b"(x*65536+y), "c"(c), "d"(s)); |
} |
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d) |
{ |
asm ("int $0x40"::"a"(7), "c"(w*65536+h), "d"(x*65536+y), "b"(d)); |
} |
void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette) |
{ |
asm ("nop"::"c"(w*65536+h), "d"(x*65536+y), "b"(d)); |
asm ("nop"::"a"(palette)); |
asm ("movl %eax, %edi"); |
asm ("xor %eax, %eax"); |
asm ("movl %eax, %ebp"); |
asm ("pushl $8"); |
asm ("popl %esi"); |
asm ("int $0x40"::"a"(65)); |
} |
unsigned kol_key_get() |
{ |
asm ("int $0x40"::"a"(2)); |
} |
unsigned kol_key_control() |
{ |
asm ("int $0x40"::"a"(66), "b"(3)); |
} |
void kol_key_lang_set(unsigned lang) |
{ |
asm ("int $0x40"::"a"(21), "b"(2), "c"(9), "d"(lang)); |
} |
unsigned kol_key_lang_get() |
{ |
asm ("int $0x40"::"a"(26), "b"(2), "c"(9)); |
} |
void kol_key_mode_set(unsigned mode) |
{ |
asm ("int $0x40"::"a"(66), "b"(1), "c"(mode)); |
} |
unsigned kol_key_mode_get() |
{ |
asm ("int $0x40"::"a"(66), "b"(2)); |
} |
unsigned kol_btn_get() |
{ |
asm ("int $0x40"::"a"(17)); |
} |
void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c) |
{ |
asm ("nop"::"b"(x*65536+w), "c"(y*65536+h), "d"(d)); |
asm ("nop"::"a"(c)); |
asm ("movl %eax, %esi"); |
asm ("int $0x40"::"a"(8)); |
} |
void kol_btn_type(unsigned t) |
{ |
asm ("int $0x40"::"a"(48), "b"(1), "c"(t)); |
} |
void kol_wnd_caption(char *s) |
{ |
asm ("int $0x40"::"a"(71), "b"(1), "c"(s)); |
} |
unsigned kol_mouse_pos() |
{ |
asm ("int $0x40"::"a"(37), "b"(0)); |
} |
unsigned kol_mouse_posw() |
{ |
asm ("int $0x40"::"a"(37), "b"(1)); |
} |
unsigned kol_mouse_btn() |
{ |
asm ("int $0x40"::"a"(37), "b"(2)); |
} |
void kol_board_putc(char c) |
{ |
asm ("int $0x40"::"a"(63), "b"(1), "c"(c)); |
} |
void kol_board_puts(char *s) |
{ |
unsigned i; |
i = 0; |
while (*(s+i)) |
{ |
asm ("int $0x40"::"a"(63), "b"(1), "c"(*(s+i))); |
i++; |
} |
} |
void kol_board_puti(int n) |
{ |
char c; |
int i = 0; |
do |
{ |
c = n % 10 + '0'; |
asm ("int $0x40"::"a"(63), "b"(1), "c"(c)); |
i++; |
} |
while ((n /= 10) > 0); |
} |
int kol_file_70(kol_struct70 *k) |
{ |
asm ("int $0x40"::"a"(70), "b"(k)); |
} |
kol_struct_import* kol_cofflib_load(char *name) |
{ |
asm ("int $0x40"::"a"(68), "b"(19), "c"(name)); |
} |
void* kol_cofflib_procload (kol_struct_import *imp, char *name) |
{ |
int i; |
for (i=0;;i++) |
if ( NULL == ((imp+i) -> name)) |
break; |
else |
if ( 0 == strcmp(name, (imp+i)->name) ) |
return (imp+i)->data; |
return NULL; |
} |
unsigned kol_cofflib_procnum (kol_struct_import *imp) |
{ |
unsigned i, n; |
for (i=n=0;;i++) |
if ( NULL == ((imp+i) -> name)) |
break; |
else |
n++; |
return n; |
} |
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n) |
{ |
unsigned i; |
*name = 0; |
for (i=0;;i++) |
if ( NULL == ((imp+i) -> name)) |
break; |
else |
if ( i == n ) |
{ |
strcpy(name, ((imp+i)->name)); |
break; |
} |
} |
unsigned kol_system_cpufreq() |
{ |
asm ("int $0x40"::"a"(18), "b"(5)); |
} |
unsigned kol_system_mem() |
{ |
asm ("int $0x40"::"a"(18), "b"(17)); |
} |
unsigned kol_system_memfree() |
{ |
asm ("int $0x40"::"a"(18), "b"(16)); |
} |
unsigned kol_system_time_get() |
{ |
asm ("int $0x40"::"a"(3)); |
} |
unsigned kol_system_date_get() |
{ |
asm ("int $0x40"::"a"(29)); |
} |
unsigned kol_system_end(unsigned param) |
{ |
asm ("int $0x40"::"a"(18), "b"(9), "c"(param)); |
} |
void kol_path_file2dir(char *dir, char *fname) |
{ |
unsigned i; |
strcpy (dir, fname); |
for ( i = strlen(dir);; --i) |
if ( '/' == dir[i]) |
{ |
dir[i] = '\0'; |
return; |
} |
} |
void kol_path_full(char *full, char *fname) |
{ |
char temp[256]; |
switch (*fname) |
{ |
case '/': |
strncpy(temp, fname+1, 2); |
temp[2]=0; |
if ( (!strcmp("rd", temp)) || (!strcmp("hd", temp)) || (!strcmp("cd", temp)) ) |
strcpy (full, fname); |
break; |
case '.': |
break; |
default: |
break; |
}; |
} |
void kol_screen_wait_rr() |
{ |
asm ("int $0x40"::"a"(18), "b"(14)); |
} |
void kol_screen_get_size(unsigned *w, unsigned *h) |
{ |
unsigned size; |
asm ("int $0x40":"=a"(size):"a"(14)); |
*w = size / 65536; |
*h = size % 65536; |
} |
unsigned kol_skin_height() |
{ |
asm ("int $0x40"::"a"(48), "b"(4)); |
} |
unsigned kol_thread_start(unsigned start, unsigned stack) |
{ |
asm ("int $0x40"::"a"(51), "b"(1), "c"(start), "d"(stack)); |
} |
unsigned kol_time_tick() |
{ |
asm ("int $0x40"::"a"(26), "b"(9)); |
} |
unsigned kol_sound_speaker(char data[]) |
{ |
asm ("movl %0, %%esi"::"a"(data)); |
asm ("int $0x40"::"a"(55), "b"(55)); |
} |
unsigned kol_process_info(unsigned slot, char buf1k[]) |
{ |
asm ("int $0x40"::"a"(9), "b"(buf1k), "c"(slot)); |
} |
int kol_process_kill_pid(unsigned process) |
{ |
asm ("int $0x40"::"a"(18), "b"(18), "c"(process)); |
} |
int kol_kill_process(unsigned process) |
{ |
asm ("int $0x40"::"a"(18), "b"(2), "c"(process)); |
} |
void kol_get_kernel_ver(char buff16b[]) |
{ |
asm ("int $0x40"::"a"(18), "b"(13), "c"(buff16b)); |
} |
/programs/games/console15/system/kolibri.h |
---|
0,0 → 1,92 |
#define NULL ((void*)0) |
typedef struct |
{ |
unsigned p00 __attribute__((packed)); |
unsigned p04 __attribute__((packed)); |
unsigned p08 __attribute__((packed)); |
unsigned p12 __attribute__((packed)); |
unsigned p16 __attribute__((packed)); |
char p20 __attribute__((packed)); |
char *p21 __attribute__((packed)); |
} kol_struct70 __attribute__((packed)); |
typedef struct |
{ |
unsigned p00 __attribute__((packed)); |
char p04 __attribute__((packed)); |
char p05[3] __attribute__((packed)); |
unsigned p08 __attribute__((packed)); |
unsigned p12 __attribute__((packed)); |
unsigned p16 __attribute__((packed)); |
unsigned p20 __attribute__((packed)); |
unsigned p24 __attribute__((packed)); |
unsigned p28 __attribute__((packed)); |
unsigned p32[2] __attribute__((packed)); |
unsigned p40 __attribute__((packed)); |
} kol_struct_BDVK __attribute__((packed)); |
typedef struct |
{ |
char *name __attribute__((packed)); |
void *data __attribute__((packed)); |
} kol_struct_import __attribute__((packed)); |
void kol_exit(); |
void kol_sleep(unsigned d); |
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c); |
void kol_wnd_move(unsigned x, unsigned y); |
void kol_wnd_caption(char *s); |
void kol_event_mask(unsigned e); |
unsigned kol_event_wait(); |
unsigned kol_event_wait_time(unsigned time); |
unsigned kol_event_check(); |
void kol_paint_start(); |
void kol_paint_end(); |
void kol_paint_pixel(unsigned x, unsigned y, unsigned c); |
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c); |
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c); |
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c); |
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d); |
void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette); |
unsigned kol_key_get(); |
unsigned kol_key_control(); |
void kol_key_lang_set(unsigned lang); |
unsigned kol_key_lang_get(); |
void kol_key_mode_set(unsigned mode); |
unsigned kol_key_mode_get(); |
void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c); |
unsigned kol_btn_get(); |
void kol_btn_type(unsigned t); |
unsigned kol_mouse_pos(); |
unsigned kol_mouse_posw(); |
unsigned kol_mouse_btn(); |
void kol_board_putc(char c); |
void kol_board_puts(char *s); |
void kol_board_puti(int n); |
int kol_file_70(kol_struct70 *k); |
kol_struct_import* kol_cofflib_load(char *name); |
void* kol_cofflib_procload (kol_struct_import *imp, char *name); |
unsigned kol_cofflib_procnum (kol_struct_import *imp); |
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n); |
unsigned kol_system_end(unsigned param); |
unsigned kol_system_cpufreq(); |
unsigned kol_system_mem(); |
unsigned kol_system_memfree(); |
unsigned kol_system_time_get(); |
unsigned kol_system_date_get(); |
void kol_path_file2dir(char *dir, char *fname); |
void kol_path_full(char *full, char *fname); |
void kol_screen_wait_rr(); |
void kol_screen_get_size(unsigned *w, unsigned *h); |
unsigned kol_skin_height(); |
unsigned kol_thread_start(unsigned start, unsigned stack); |
unsigned kol_time_tick(); |
unsigned kol_sound_speaker(char data[]); |
unsigned kol_process_info(unsigned slot, char buf1k[]); |
int kol_process_kill_pid(unsigned process); |
void kol_get_kernel_ver(char buff16b[]); |
int kol_kill_process(unsigned process); |
/programs/games/console15/system/stdlib.c |
---|
0,0 → 1,33 |
unsigned int seed_o = 0x45168297; |
void srand (unsigned seed) |
{ |
seed_o = seed; |
} |
int rand (void) |
{ |
seed_o = seed_o * 0x15a4e35 + 1; |
return(seed_o >> 16); |
} |
void* malloc(unsigned s) |
{ |
asm ("int $0x40"::"a"(68), "b"(12), "c"(s) ); |
} |
void free(void *p) |
{ |
asm ("int $0x40"::"a"(68), "b"(13), "c"(p) ); |
} |
void* realloc(void *p, unsigned s) |
{ |
asm ("int $0x40"::"a"(68), "b"(12), "c"(p), "d"(s) ); |
} |
/programs/games/console15/system/stdlib.h |
---|
0,0 → 1,14 |
#define RAND_MAX 0x7FFFU |
#define isspace(c) ((c)==' ') |
#define abs(i) (((i)<0)?(-(i)):(i)) |
#define random(num) ((rand()*(num))/((RAND_MAX+1))) |
void* malloc(unsigned size); |
void free(void *pointer); |
void* realloc(void* pointer, unsigned size); |
void srand (unsigned seed); |
int rand (void); |
/programs/games/console15/system/string.c |
---|
0,0 → 1,124 |
#include "string.h" |
void* memset(void *mem, int c, unsigned size) |
{ |
unsigned i; |
for ( i = 0; i < size; i++ ) |
*((char *)mem+i) = (char) c; |
return NULL; |
} |
void* memcpy(void *dst, const void *src, unsigned size) |
{ |
unsigned i; |
for ( i = 0; i < size; i++) |
*(char *)(dst+i) = *(char *)(src+i); |
return NULL; |
} |
int memcmp(const void* buf1, const void* buf2, int count) |
{ |
int i; |
for (i=0;i<count;i++) |
{ |
if (*(unsigned char*)buf1<*(unsigned char*)buf2) |
return -1; |
if (*(unsigned char*)buf1>*(unsigned char*)buf2) |
return 1; |
} |
return 0; |
} |
void strcat(char strDest[], char strSource[]) |
{ |
int i, j; |
i = j = 0; |
while (strDest[i] != '\0') |
i++; |
while ((strDest[i++] = strSource[j++]) != '\0') |
; |
} |
int strcmp(const char* string1, const char* string2) |
{ |
while (1) |
{ |
if (*string1<*string2) |
return -1; |
if (*string1>*string2) |
return 1; |
if (*string1=='\0') |
return 0; |
string1++; |
string2++; |
} |
} |
void strcpy(char strDest[], const char strSource[]) |
{ |
unsigned i; |
i = 0; |
while ((strDest[i] = strSource[i]) != '\0') |
i++; |
} |
char* strncpy(char *strDest, const char *strSource, unsigned n) |
{ |
unsigned i; |
if (! n ) |
return strDest; |
i = 0; |
while ((strDest[i] = strSource[i]) != '\0') |
if ( (n-1) == i ) |
break; |
else |
i++; |
return strDest; |
} |
int strlen(const char* string) |
{ |
int i; |
i=0; |
while (*string++) i++; |
return i; |
} |
char* strchr(const char* string, int c) |
{ |
while (*string) |
{ |
if (*string==c) |
return (char*)string; |
string++; |
} |
return (char*)0; |
} |
/programs/games/console15/system/string.h |
---|
0,0 → 1,15 |
#ifndef NULL |
#define NULL ((void*)0) |
#endif |
void* memset(void *mem, int c, unsigned size); |
void* memcpy(void *dst, const void *src, unsigned size); |
int memcmp(const void* buf1, const void* buf2, int count); |
void strcat(char strDest[], char strSource[]); |
int strcmp(const char* string1, const char* string2); |
void strcpy(char strDest[], const char strSource[]); |
char* strncpy(char *strDest, const char *strSource, unsigned n); |
int strlen(const char* string); |
char *strchr(const char* string, int c); |
/programs/games/console15/system |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/programs/games/console15/. |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |