feat: add given files
Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
73
Makefile
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
include config.mk
|
||||||
|
|
||||||
|
ROMS = \
|
||||||
|
roms/chichehunter \
|
||||||
|
roms/chichepong \
|
||||||
|
roms/chichevaders \
|
||||||
|
roms/perrodlauncher \
|
||||||
|
roms/skate \
|
||||||
|
roms/yakanoid \
|
||||||
|
|
||||||
|
|
||||||
|
SUBDIRS = \
|
||||||
|
$(ROMS) \
|
||||||
|
k \
|
||||||
|
libs/libc \
|
||||||
|
libs/libk \
|
||||||
|
tools/mkkfs \
|
||||||
|
|
||||||
|
ABS_INSTALL = $(abspath $(INSTALL_ROOT))
|
||||||
|
|
||||||
|
all: k.iso
|
||||||
|
|
||||||
|
k: libs/libc
|
||||||
|
|
||||||
|
$(ROMS): tools/mkkfs libs/libc libs/libk
|
||||||
|
|
||||||
|
k.iso: install
|
||||||
|
./tools/create-iso.sh $@ $(INSTALL_ROOT) $(ROMS)
|
||||||
|
|
||||||
|
$(SUBDIRS):
|
||||||
|
$(MAKE) -C $@
|
||||||
|
|
||||||
|
install: libs/libc libs/libk k
|
||||||
|
mkdir -p $(ABS_INSTALL)
|
||||||
|
for I in $(ROMS); \
|
||||||
|
do \
|
||||||
|
$(MAKE) INSTALL_ROOT=$(ABS_INSTALL) -C $$I $@ || exit 1; \
|
||||||
|
done
|
||||||
|
$(MAKE) INSTALL_ROOT=$(ABS_INSTALL) -C k $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
for I in $(SUBDIRS); \
|
||||||
|
do \
|
||||||
|
$(MAKE) -C $$I $@ || exit 1; \
|
||||||
|
done
|
||||||
|
$(RM) k.iso
|
||||||
|
$(RM) -r root
|
||||||
|
$(RM) -r iso
|
||||||
|
|
||||||
|
.PHONY: $(SUBDIRS) $(INSTALL_ROOT) install
|
119
README.md
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
# Introduction
|
||||||
|
|
||||||
|
This is the student code for the [kernel course at EPITA](https://k.lse.epita.fr/).
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
1. [Checkout out](#checking-out)
|
||||||
|
1. [The tarball](#the-tarball)
|
||||||
|
1. [Dependancies](#dependancies-for-building)
|
||||||
|
3. [Source tree](#source-tree)
|
||||||
|
4. [Intel Manuals](#intel-manuals)
|
||||||
|
2. [Build System](#build-system)
|
||||||
|
3. [Booting your kernel](#booting-your-kernel-in-qemu)
|
||||||
|
4. [Debugging your kernel](#debugging-your-kernel)
|
||||||
|
|
||||||
|
## Checking out
|
||||||
|
|
||||||
|
### The tarball
|
||||||
|
|
||||||
|
A readonly git repository given by the LSE can be cloned:
|
||||||
|
|
||||||
|
git clone git@github.com:lse/k.git
|
||||||
|
|
||||||
|
### Dependancies for building
|
||||||
|
|
||||||
|
* gcc-multilib
|
||||||
|
* grub2
|
||||||
|
* libisoburn
|
||||||
|
* find
|
||||||
|
|
||||||
|
### Source tree
|
||||||
|
|
||||||
|
Here is the description of some important files:
|
||||||
|
|
||||||
|
Makefile # top-level Makefile
|
||||||
|
config.mk # build-system configuration
|
||||||
|
k # kernel source folder
|
||||||
|
k/elf.h # ELF header
|
||||||
|
k/crt0.S # crt0 for the kernel
|
||||||
|
k/k.c # kernel entry point
|
||||||
|
k/multiboot.h # Multiboot Specification header
|
||||||
|
k/k.lds # LD script for the kernel binary
|
||||||
|
k/memory.c # kernel memory allocator
|
||||||
|
k/include/k/atapi.h # ATAPI related definitions
|
||||||
|
k/include/k/kstd.h # k standard definitions
|
||||||
|
k/include/k/kfs.h # KFS structures definitions
|
||||||
|
k/include/k/types.h # kernel types definitions
|
||||||
|
roms # rom folder
|
||||||
|
roms/chichepong # chichepong folder
|
||||||
|
roms/roms.lds # LD script for rom binaries
|
||||||
|
libs # SDK folder
|
||||||
|
libs/libc # a basic libc available everywhere
|
||||||
|
libs/libk # userland functions
|
||||||
|
tools # Tools folder
|
||||||
|
tools/mkksf # small program to generate your own sounds
|
||||||
|
tools/mkkfs # small program to create kfs roms
|
||||||
|
tools/create-iso.sh # small tool to generate the iso image
|
||||||
|
|
||||||
|
### Intel Manuals
|
||||||
|
|
||||||
|
You will find the essential Intel Manuals describing the processor, all
|
||||||
|
the instructions as well as the programming guide on the [intel
|
||||||
|
website][1].
|
||||||
|
|
||||||
|
The most interesting one is probably the "Volume 3A: System Programming
|
||||||
|
Guide" which describe everything that is needed to develop an operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
[1]: http://www.intel.com/products/processor/manuals/
|
||||||
|
|
||||||
|
## Build System
|
||||||
|
|
||||||
|
The build system uses information stored in config.mk. Feel free to modify this
|
||||||
|
file, but your project must work with the original one.
|
||||||
|
|
||||||
|
Here are make rules you need to know:
|
||||||
|
|
||||||
|
make | make k.iso # create an ISO with all the roms
|
||||||
|
make k # compile your kernel
|
||||||
|
make rom/GAME # compile the rom in the folder rom/$(GAME)
|
||||||
|
make clean # clean the tree
|
||||||
|
|
||||||
|
## Booting your kernel in qemu
|
||||||
|
|
||||||
|
qemu-system-x86_64 -cdrom k.iso [ -enable-kvm ]
|
||||||
|
|
||||||
|
## Debugging your kernel
|
||||||
|
|
||||||
|
Build your kernel with debug flags.
|
||||||
|
|
||||||
|
* Run QEMU with a gdb server and stop the CPU at the first instruction:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
qemu-system-x86_64 -cdrom k.iso -s -S
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run gdb with your kernel binary:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gdb k/k
|
||||||
|
```
|
||||||
|
|
||||||
|
* Once in gdb, connect to QEMU:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
target remote localhost:1234
|
||||||
|
```
|
||||||
|
|
||||||
|
* Add some breakpoints:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
b my_symbol
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run the simulation in gdb:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
continue
|
||||||
|
```
|
19
config.mk
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
CFLAGS = -std=gnu99 -Os -Wall -Wextra -nostdinc -fno-builtin -ffreestanding \
|
||||||
|
-m32 -fno-asynchronous-unwind-tables -fno-common -fno-pie -march=i486
|
||||||
|
# SSP causes compilation problems on Ubuntu
|
||||||
|
CFLAGS += -fno-stack-protector
|
||||||
|
#K_EXTRA_CFLAGS = -g3
|
||||||
|
# Place each function or data item into a separate section
|
||||||
|
CFLAGS += -ffunction-sections -fdata-sections
|
||||||
|
CPPFLAGS += -I$(shell $(CC) -m32 --print-file-name=include)
|
||||||
|
# enable dlmalloc self-corruption tests.
|
||||||
|
#CPPFLAGS += -DDEBUG=1 -DFOOTERS=1
|
||||||
|
|
||||||
|
ASFLAGS = -m32
|
||||||
|
LDFLAGS = -nostdlib -m32 -Wl,--build-id=none -nostartfiles -static
|
||||||
|
# Detect and remove unused sections while linking the objects
|
||||||
|
LDFLAGS += -Wl,--gc-sections
|
||||||
|
#LDFLAGS += -Wl,--print-gc-sections
|
||||||
|
ARFLAGS = src
|
||||||
|
INSTALL = install -C -D
|
||||||
|
INSTALL_ROOT ?= iso
|
51
k/Makefile
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
include ../config.mk
|
||||||
|
|
||||||
|
TARGET = k
|
||||||
|
OBJS = \
|
||||||
|
crt0.o \
|
||||||
|
k.o \
|
||||||
|
libvga.o \
|
||||||
|
list.o \
|
||||||
|
memory.o \
|
||||||
|
|
||||||
|
|
||||||
|
DEPS = $(OBJS:.o=.d)
|
||||||
|
|
||||||
|
all: $(TARGET)
|
||||||
|
|
||||||
|
$(TARGET): CPPFLAGS += -MMD -Iinclude -I ../libs/libc/include/
|
||||||
|
$(TARGET): CFLAGS += $(K_EXTRA_CFLAGS)
|
||||||
|
$(TARGET): LDFLAGS += -Wl,-Tk.lds
|
||||||
|
$(TARGET): LDLIBS = -L../libs/libc -lc
|
||||||
|
$(TARGET): $(OBJS)
|
||||||
|
|
||||||
|
install: $(TARGET)
|
||||||
|
$(INSTALL) $(TARGET) $(INSTALL_ROOT)/$(TARGET)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(OBJS) $(DEPS) $(TARGET)
|
||||||
|
|
||||||
|
-include $(DEPS)
|
55
k/crt0.S
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include "multiboot.h"
|
||||||
|
|
||||||
|
#define HEADER_FLAGS (MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO)
|
||||||
|
#define STACK_SIZE 8192
|
||||||
|
|
||||||
|
.section .multiboot
|
||||||
|
.type multiboot_header, @object
|
||||||
|
multiboot_header:
|
||||||
|
.align MULTIBOOT_HEADER_ALIGN
|
||||||
|
.long MULTIBOOT_HEADER_MAGIC
|
||||||
|
.long HEADER_FLAGS
|
||||||
|
.long -(MULTIBOOT_HEADER_MAGIC + HEADER_FLAGS)
|
||||||
|
.size multiboot_header, . - multiboot_header
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
.global k_entry
|
||||||
|
.type k_entry, @function
|
||||||
|
k_entry:
|
||||||
|
lea end_stack, %esp
|
||||||
|
push %ebx /* multiboot info */
|
||||||
|
push %eax /* magic */
|
||||||
|
call k_main /* kernel entry point */
|
||||||
|
.Lend:
|
||||||
|
jmp .Lend
|
||||||
|
.size k_entry, . - k_entry
|
||||||
|
|
||||||
|
.section .bss
|
||||||
|
stack:
|
||||||
|
.space STACK_SIZE
|
||||||
|
.align 16
|
||||||
|
end_stack:
|
||||||
|
.global end_stack
|
672
k/elf.h
Normal file
@ -0,0 +1,672 @@
|
|||||||
|
/* $NetBSD: exec_elf.h,v 1.60 2002/01/28 22:15:54 thorpej Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1994 The NetBSD Foundation, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
|
* by Christos Zoulas.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the NetBSD
|
||||||
|
* Foundation, Inc. and its contributors.
|
||||||
|
* 4. Neither the name of The NetBSD Foundation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||||
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef _SYS_EXEC_ELF_H_
|
||||||
|
#define _SYS_EXEC_ELF_H_
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The current ELF ABI specification is available at:
|
||||||
|
* http://www.sco.com/developer/gabi/
|
||||||
|
*
|
||||||
|
* Current header definitions are in:
|
||||||
|
* http://www.sco.com/developer/gabi/latest/ch4.eheader.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ELF32_MACHDEP_ENDIANNESS ELFDATA2LSB
|
||||||
|
#define ELF32_MACHDEP_ID_CASES \
|
||||||
|
case EM_386: \
|
||||||
|
case EM_486: \
|
||||||
|
break;
|
||||||
|
|
||||||
|
#define ELF32_MACHDEP_ID EM_386
|
||||||
|
|
||||||
|
#define ARCH_ELFSIZE 32 /* MD native binary size */
|
||||||
|
|
||||||
|
/* i386 relocations */
|
||||||
|
#define R_386_NONE 0
|
||||||
|
#define R_386_32 1
|
||||||
|
#define R_386_PC32 2
|
||||||
|
#define R_386_GOT32 3
|
||||||
|
#define R_386_PLT32 4
|
||||||
|
#define R_386_COPY 5
|
||||||
|
#define R_386_GLOB_DAT 6
|
||||||
|
#define R_386_JMP_SLOT 7
|
||||||
|
#define R_386_RELATIVE 8
|
||||||
|
#define R_386_GOTOFF 9
|
||||||
|
#define R_386_GOTPC 10
|
||||||
|
/* The following relocations are GNU extensions. */
|
||||||
|
#define R_386_16 20
|
||||||
|
#define R_386_PC16 21
|
||||||
|
#define R_386_8 22
|
||||||
|
#define R_386_PC8 23
|
||||||
|
|
||||||
|
#define R_TYPE(name) __CONCAT(R_386_,name)
|
||||||
|
|
||||||
|
typedef u8 Elf_Byte;
|
||||||
|
|
||||||
|
typedef u32 Elf32_Addr;
|
||||||
|
#define ELF32_FSZ_ADDR 4
|
||||||
|
typedef u32 Elf32_Off;
|
||||||
|
#define ELF32_FSZ_OFF 4
|
||||||
|
typedef s32 Elf32_Sword;
|
||||||
|
#define ELF32_FSZ_SWORD 4
|
||||||
|
typedef u32 Elf32_Word;
|
||||||
|
#define ELF32_FSZ_WORD 4
|
||||||
|
typedef u16 Elf32_Half;
|
||||||
|
#define ELF32_FSZ_HALF 2
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ELF Header
|
||||||
|
*/
|
||||||
|
#define ELF_NIDENT 16
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned char e_ident[ELF_NIDENT]; /* Id bytes */
|
||||||
|
Elf32_Half e_type; /* file type */
|
||||||
|
Elf32_Half e_machine; /* machine type */
|
||||||
|
Elf32_Word e_version; /* version number */
|
||||||
|
Elf32_Addr e_entry; /* entry point */
|
||||||
|
Elf32_Off e_phoff; /* Program hdr offset */
|
||||||
|
Elf32_Off e_shoff; /* Section hdr offset */
|
||||||
|
Elf32_Word e_flags; /* Processor flags */
|
||||||
|
Elf32_Half e_ehsize; /* sizeof ehdr */
|
||||||
|
Elf32_Half e_phentsize; /* Program header entry size */
|
||||||
|
Elf32_Half e_phnum; /* Number of program headers */
|
||||||
|
Elf32_Half e_shentsize; /* Section header entry size */
|
||||||
|
Elf32_Half e_shnum; /* Number of section headers */
|
||||||
|
Elf32_Half e_shstrndx; /* String table index */
|
||||||
|
} Elf32_Ehdr;
|
||||||
|
|
||||||
|
/* e_ident offsets */
|
||||||
|
#define EI_MAG0 0 /* '\177' */
|
||||||
|
#define EI_MAG1 1 /* 'E' */
|
||||||
|
#define EI_MAG2 2 /* 'L' */
|
||||||
|
#define EI_MAG3 3 /* 'F' */
|
||||||
|
#define EI_CLASS 4 /* File class */
|
||||||
|
#define EI_DATA 5 /* Data encoding */
|
||||||
|
#define EI_VERSION 6 /* File version */
|
||||||
|
#define EI_OSABI 7 /* Operating system/ABI identification */
|
||||||
|
#define EI_ABIVERSION 8 /* ABI version */
|
||||||
|
#define EI_PAD 9 /* Start of padding bytes up to EI_NIDENT */
|
||||||
|
|
||||||
|
/* e_ident[ELFMAG0,ELFMAG3] */
|
||||||
|
#define ELFMAG0 0x7f
|
||||||
|
#define ELFMAG1 'E'
|
||||||
|
#define ELFMAG2 'L'
|
||||||
|
#define ELFMAG3 'F'
|
||||||
|
#define ELFMAG "\177ELF"
|
||||||
|
#define SELFMAG 4
|
||||||
|
|
||||||
|
/* e_ident[EI_CLASS] */
|
||||||
|
#define ELFCLASSNONE 0 /* Invalid class */
|
||||||
|
#define ELFCLASS32 1 /* 32-bit objects */
|
||||||
|
#define ELFCLASS64 2 /* 64-bit objects */
|
||||||
|
#define ELFCLASSNUM 3
|
||||||
|
|
||||||
|
/* e_ident[EI_DATA] */
|
||||||
|
#define ELFDATANONE 0 /* Invalid data encoding */
|
||||||
|
#define ELFDATA2LSB 1 /* 2's complement values, LSB first */
|
||||||
|
#define ELFDATA2MSB 2 /* 2's complement values, MSB first */
|
||||||
|
|
||||||
|
/* e_ident[EI_VERSION] */
|
||||||
|
#define EV_NONE 0 /* Invalid version */
|
||||||
|
#define EV_CURRENT 1 /* Current version */
|
||||||
|
#define EV_NUM 2
|
||||||
|
|
||||||
|
/* e_ident[EI_OSABI] */
|
||||||
|
#define ELFOSABI_SYSV 0 /* UNIX System V ABI */
|
||||||
|
#define ELFOSABI_HPUX 1 /* HP-UX operating system */
|
||||||
|
#define ELFOSABI_NETBSD 2 /* NetBSD */
|
||||||
|
#define ELFOSABI_LINUX 3 /* GNU/Linux */
|
||||||
|
#define ELFOSABI_HURD 4 /* GNU/Hurd */
|
||||||
|
#define ELFOSABI_86OPEN 5 /* 86Open */
|
||||||
|
#define ELFOSABI_SOLARIS 6 /* Solaris */
|
||||||
|
#define ELFOSABI_MONTEREY 7 /* Monterey */
|
||||||
|
#define ELFOSABI_IRIX 8 /* IRIX */
|
||||||
|
#define ELFOSABI_FREEBSD 9 /* FreeBSD */
|
||||||
|
#define ELFOSABI_TRU64 10 /* TRU64 UNIX */
|
||||||
|
#define ELFOSABI_MODESTO 11 /* Novell Modesto */
|
||||||
|
#define ELFOSABI_OPENBSD 12 /* OpenBSD */
|
||||||
|
/* Unofficial OSABIs follow */
|
||||||
|
#define ELFOSABI_ARM 97 /* ARM */
|
||||||
|
#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
|
||||||
|
|
||||||
|
/* e_type */
|
||||||
|
#define ET_NONE 0 /* No file type */
|
||||||
|
#define ET_REL 1 /* Relocatable file */
|
||||||
|
#define ET_EXEC 2 /* Executable file */
|
||||||
|
#define ET_DYN 3 /* Shared object file */
|
||||||
|
#define ET_CORE 4 /* Core file */
|
||||||
|
#define ET_NUM 5
|
||||||
|
|
||||||
|
#define ET_LOOS 0xfe00 /* Operating system specific range */
|
||||||
|
#define ET_HIOS 0xfeff
|
||||||
|
#define ET_LOPROC 0xff00 /* Processor-specific range */
|
||||||
|
#define ET_HIPROC 0xffff
|
||||||
|
|
||||||
|
/* e_machine */
|
||||||
|
#define EM_NONE 0 /* No machine */
|
||||||
|
#define EM_M32 1 /* AT&T WE 32100 */
|
||||||
|
#define EM_SPARC 2 /* SPARC */
|
||||||
|
#define EM_386 3 /* Intel 80386 */
|
||||||
|
#define EM_68K 4 /* Motorola 68000 */
|
||||||
|
#define EM_88K 5 /* Motorola 88000 */
|
||||||
|
#define EM_486 6 /* Intel 80486 */
|
||||||
|
#define EM_860 7 /* Intel 80860 */
|
||||||
|
#define EM_MIPS 8 /* MIPS I Architecture */
|
||||||
|
#define EM_S370 9 /* Amdahl UTS on System/370 */
|
||||||
|
#define EM_MIPS_RS3_LE 10 /* MIPS RS3000 Little-endian */
|
||||||
|
/* 11-14 - Reserved */
|
||||||
|
#define EM_RS6000 11 /* IBM RS/6000 XXX reserved */
|
||||||
|
#define EM_PARISC 15 /* Hewlett-Packard PA-RISC */
|
||||||
|
#define EM_NCUBE 16 /* NCube XXX reserved */
|
||||||
|
#define EM_VPP500 17 /* Fujitsu VPP500 */
|
||||||
|
#define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */
|
||||||
|
#define EM_960 19 /* Intel 80960 */
|
||||||
|
#define EM_PPC 20 /* PowerPC */
|
||||||
|
#define EM_PPC64 21 /* 64-bit PowerPC */
|
||||||
|
/* 22-35 - Reserved */
|
||||||
|
#define EM_V800 36 /* NEC V800 */
|
||||||
|
#define EM_FR20 37 /* Fujitsu FR20 */
|
||||||
|
#define EM_RH32 38 /* TRW RH-32 */
|
||||||
|
#define EM_RCE 39 /* Motorola RCE */
|
||||||
|
#define EM_ARM 40 /* Advanced RISC Machines ARM */
|
||||||
|
#define EM_ALPHA 41 /* DIGITAL Alpha */
|
||||||
|
#define EM_SH 42 /* Hitachi Super-H */
|
||||||
|
#define EM_SPARCV9 43 /* SPARC Version 9 */
|
||||||
|
#define EM_TRICORE 44 /* Siemens Tricore */
|
||||||
|
#define EM_ARC 45 /* Argonaut RISC Core */
|
||||||
|
#define EM_H8_300 46 /* Hitachi H8/300 */
|
||||||
|
#define EM_H8_300H 47 /* Hitachi H8/300H */
|
||||||
|
#define EM_H8S 48 /* Hitachi H8S */
|
||||||
|
#define EM_H8_500 49 /* Hitachi H8/500 */
|
||||||
|
#define EM_IA_64 50 /* Intel Merced Processor */
|
||||||
|
#define EM_MIPS_X 51 /* Stanford MIPS-X */
|
||||||
|
#define EM_COLDFIRE 52 /* Motorola Coldfire */
|
||||||
|
#define EM_68HC12 53 /* Motorola MC68HC12 */
|
||||||
|
#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator */
|
||||||
|
#define EM_PCP 55 /* Siemens PCP */
|
||||||
|
#define EM_NCPU 56 /* Sony nCPU embedded RISC processor */
|
||||||
|
#define EM_NDR1 57 /* Denso NDR1 microprocessor */
|
||||||
|
#define EM_STARCORE 58 /* Motorola Star*Core processor */
|
||||||
|
#define EM_ME16 59 /* Toyota ME16 processor */
|
||||||
|
#define EM_ST100 60 /* STMicroelectronics ST100 processor */
|
||||||
|
#define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded family processor */
|
||||||
|
#define EM_X86_64 62 /* AMD x86-64 architecture */
|
||||||
|
#define EM_PDSP 63 /* Sony DSP Processor */
|
||||||
|
/* 64-65 - Reserved */
|
||||||
|
#define EM_FX66 66 /* Siemens FX66 microcontroller */
|
||||||
|
#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */
|
||||||
|
#define EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */
|
||||||
|
#define EM_68HC16 69 /* Motorola MC68HC16 Microcontroller */
|
||||||
|
#define EM_68HC11 70 /* Motorola MC68HC11 Microcontroller */
|
||||||
|
#define EM_68HC08 71 /* Motorola MC68HC08 Microcontroller */
|
||||||
|
#define EM_68HC05 72 /* Motorola MC68HC05 Microcontroller */
|
||||||
|
#define EM_SVX 73 /* Silicon Graphics SVx */
|
||||||
|
#define EM_ST19 74 /* STMicroelectronics ST19 8-bit cpu */
|
||||||
|
#define EM_VAX 75 /* Digital VAX */
|
||||||
|
#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
|
||||||
|
#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded cpu */
|
||||||
|
#define EM_FIREPATH 78 /* Element 14 64-bit DSP processor */
|
||||||
|
#define EM_ZSP 79 /* LSI Logic's 16-bit DSP processor */
|
||||||
|
#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */
|
||||||
|
#define EM_HUANY 81 /* Harvard's machine-independent format */
|
||||||
|
#define EM_PRISM 82 /* SiTera Prism */
|
||||||
|
#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */
|
||||||
|
#define EM_FR30 84 /* Fujitsu FR30 */
|
||||||
|
#define EM_D10V 85 /* Mitsubishi D10V */
|
||||||
|
#define EM_D30V 86 /* Mitsubishi D30V */
|
||||||
|
#define EM_V850 87 /* NEC v850 */
|
||||||
|
#define EM_M32R 88 /* Mitsubishi M32R */
|
||||||
|
#define EM_MN10300 89 /* Matsushita MN10300 */
|
||||||
|
#define EM_MN10200 90 /* Matsushita MN10200 */
|
||||||
|
#define EM_PJ 91 /* picoJava */
|
||||||
|
#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
|
||||||
|
#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */
|
||||||
|
#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */
|
||||||
|
#define EM_NS32K 97 /* National Semiconductor 32000 series */
|
||||||
|
|
||||||
|
/* Unofficial machine types follow */
|
||||||
|
#define EM_ALPHA_EXP 36902 /* used by NetBSD/alpha; obsolete */
|
||||||
|
#define EM_NUM 36903
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Program Header
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word p_type; /* entry type */
|
||||||
|
Elf32_Off p_offset; /* offset */
|
||||||
|
Elf32_Addr p_vaddr; /* virtual address */
|
||||||
|
Elf32_Addr p_paddr; /* physical address */
|
||||||
|
Elf32_Word p_filesz; /* file size */
|
||||||
|
Elf32_Word p_memsz; /* memory size */
|
||||||
|
Elf32_Word p_flags; /* flags */
|
||||||
|
Elf32_Word p_align; /* memory & file alignment */
|
||||||
|
} Elf32_Phdr;
|
||||||
|
|
||||||
|
/* p_type */
|
||||||
|
#define PT_NULL 0 /* Program header table entry unused */
|
||||||
|
#define PT_LOAD 1 /* Loadable program segment */
|
||||||
|
#define PT_DYNAMIC 2 /* Dynamic linking information */
|
||||||
|
#define PT_INTERP 3 /* Program interpreter */
|
||||||
|
#define PT_NOTE 4 /* Auxiliary information */
|
||||||
|
#define PT_SHLIB 5 /* Reserved, unspecified semantics */
|
||||||
|
#define PT_PHDR 6 /* Entry for header table itself */
|
||||||
|
#define PT_NUM 7
|
||||||
|
|
||||||
|
/* p_flags */
|
||||||
|
#define PF_R 0x4 /* Segment is readable */
|
||||||
|
#define PF_W 0x2 /* Segment is writable */
|
||||||
|
#define PF_X 0x1 /* Segment is executable */
|
||||||
|
|
||||||
|
#define PF_MASKOS 0x0ff00000 /* Opersting system specific values */
|
||||||
|
#define PF_MASKPROC 0xf0000000 /* Processor-specific values */
|
||||||
|
|
||||||
|
#define PT_LOPROC 0x70000000 /* Processor-specific range */
|
||||||
|
#define PT_HIPROC 0x7fffffff
|
||||||
|
|
||||||
|
#define PT_MIPS_REGINFO 0x70000000
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Section Headers
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word sh_name; /* section name (.shstrtab index) */
|
||||||
|
Elf32_Word sh_type; /* section type */
|
||||||
|
Elf32_Word sh_flags; /* section flags */
|
||||||
|
Elf32_Addr sh_addr; /* virtual address */
|
||||||
|
Elf32_Off sh_offset; /* file offset */
|
||||||
|
Elf32_Word sh_size; /* section size */
|
||||||
|
Elf32_Word sh_link; /* link to another */
|
||||||
|
Elf32_Word sh_info; /* misc info */
|
||||||
|
Elf32_Word sh_addralign; /* memory alignment */
|
||||||
|
Elf32_Word sh_entsize; /* table entry size */
|
||||||
|
} Elf32_Shdr;
|
||||||
|
|
||||||
|
/* sh_type */
|
||||||
|
#define SHT_NULL 0 /* Section header table entry unused */
|
||||||
|
#define SHT_PROGBITS 1 /* Program information */
|
||||||
|
#define SHT_SYMTAB 2 /* Symbol table */
|
||||||
|
#define SHT_STRTAB 3 /* String table */
|
||||||
|
#define SHT_RELA 4 /* Relocation information w/ addend */
|
||||||
|
#define SHT_HASH 5 /* Symbol hash table */
|
||||||
|
#define SHT_DYNAMIC 6 /* Dynamic linking information */
|
||||||
|
#define SHT_NOTE 7 /* Auxiliary information */
|
||||||
|
#define SHT_NOBITS 8 /* No space allocated in file image */
|
||||||
|
#define SHT_REL 9 /* Relocation information w/o addend */
|
||||||
|
#define SHT_SHLIB 10 /* Reserved, unspecified semantics */
|
||||||
|
#define SHT_DYNSYM 11 /* Symbol table for dynamic linker */
|
||||||
|
#define SHT_NUM 12
|
||||||
|
|
||||||
|
#define SHT_LOOS 0x60000000 /* Operating system specific range */
|
||||||
|
#define SHT_HIOS 0x6fffffff
|
||||||
|
#define SHT_LOPROC 0x70000000 /* Processor-specific range */
|
||||||
|
#define SHT_HIPROC 0x7fffffff
|
||||||
|
#define SHT_LOUSER 0x80000000 /* Application-specific range */
|
||||||
|
#define SHT_HIUSER 0xffffffff
|
||||||
|
|
||||||
|
/* sh_flags */
|
||||||
|
#define SHF_WRITE 0x1 /* Section contains writable data */
|
||||||
|
#define SHF_ALLOC 0x2 /* Section occupies memory */
|
||||||
|
#define SHF_EXECINSTR 0x4 /* Section contains executable insns */
|
||||||
|
|
||||||
|
#define SHF_MASKOS 0x0f000000 /* Operating system specific values */
|
||||||
|
#define SHF_MASKPROC 0xf0000000 /* Processor-specific values */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Symbol Table
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word st_name; /* Symbol name (.symtab index) */
|
||||||
|
Elf32_Word st_value; /* value of symbol */
|
||||||
|
Elf32_Word st_size; /* size of symbol */
|
||||||
|
Elf_Byte st_info; /* type / binding attrs */
|
||||||
|
Elf_Byte st_other; /* unused */
|
||||||
|
Elf32_Half st_shndx; /* section index of symbol */
|
||||||
|
} Elf32_Sym;
|
||||||
|
|
||||||
|
/* Symbol Table index of the undefined symbol */
|
||||||
|
#define ELF_SYM_UNDEFINED 0
|
||||||
|
|
||||||
|
/* st_info: Symbol Bindings */
|
||||||
|
#define STB_LOCAL 0 /* local symbol */
|
||||||
|
#define STB_GLOBAL 1 /* global symbol */
|
||||||
|
#define STB_WEAK 2 /* weakly defined global symbol */
|
||||||
|
#define STB_NUM 3
|
||||||
|
|
||||||
|
#define STB_LOOS 10 /* Operating system specific range */
|
||||||
|
#define STB_HIOS 12
|
||||||
|
#define STB_LOPROC 13 /* Processor-specific range */
|
||||||
|
#define STB_HIPROC 15
|
||||||
|
|
||||||
|
/* st_info: Symbol Types */
|
||||||
|
#define STT_NOTYPE 0 /* Type not specified */
|
||||||
|
#define STT_OBJECT 1 /* Associated with a data object */
|
||||||
|
#define STT_FUNC 2 /* Associated with a function */
|
||||||
|
#define STT_SECTION 3 /* Associated with a section */
|
||||||
|
#define STT_FILE 4 /* Associated with a file name */
|
||||||
|
#define STT_NUM 5
|
||||||
|
|
||||||
|
#define STT_LOOS 10 /* Operating system specific range */
|
||||||
|
#define STT_HIOS 12
|
||||||
|
#define STT_LOPROC 13 /* Processor-specific range */
|
||||||
|
#define STT_HIPROC 15
|
||||||
|
|
||||||
|
/* st_info utility macros */
|
||||||
|
#define ELF32_ST_BIND(info) ((Elf32_Word)(info) >> 4)
|
||||||
|
#define ELF32_ST_TYPE(info) ((Elf32_Word)(info) & 0xf)
|
||||||
|
#define ELF32_ST_INFO(bind,type) ((Elf_Byte)(((bind) << 4) | ((type) & 0xf)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Special section indexes
|
||||||
|
*/
|
||||||
|
#define SHN_UNDEF 0 /* Undefined section */
|
||||||
|
|
||||||
|
#define SHN_LORESERVE 0xff00 /* Reserved range */
|
||||||
|
#define SHN_ABS 0xfff1 /* Absolute symbols */
|
||||||
|
#define SHN_COMMON 0xfff2 /* Common symbols */
|
||||||
|
#define SHN_HIRESERVE 0xffff
|
||||||
|
|
||||||
|
#define SHN_LOPROC 0xff00 /* Processor-specific range */
|
||||||
|
#define SHN_HIPROC 0xff1f
|
||||||
|
#define SHN_LOOS 0xff20 /* Operating system specific range */
|
||||||
|
#define SHN_HIOS 0xff3f
|
||||||
|
|
||||||
|
#define SHN_MIPS_ACOMMON 0xff00
|
||||||
|
#define SHN_MIPS_TEXT 0xff01
|
||||||
|
#define SHN_MIPS_DATA 0xff02
|
||||||
|
#define SHN_MIPS_SCOMMON 0xff03
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Relocation Entries
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word r_offset; /* where to do it */
|
||||||
|
Elf32_Word r_info; /* index & type of relocation */
|
||||||
|
} Elf32_Rel;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word r_offset; /* where to do it */
|
||||||
|
Elf32_Word r_info; /* index & type of relocation */
|
||||||
|
Elf32_Sword r_addend; /* adjustment value */
|
||||||
|
} Elf32_Rela;
|
||||||
|
|
||||||
|
/* r_info utility macros */
|
||||||
|
#define ELF32_R_SYM(info) ((info) >> 8)
|
||||||
|
#define ELF32_R_TYPE(info) ((info) & 0xff)
|
||||||
|
#define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dynamic Section structure array
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word d_tag; /* entry tag value */
|
||||||
|
union {
|
||||||
|
Elf32_Addr d_ptr;
|
||||||
|
Elf32_Word d_val;
|
||||||
|
} d_un;
|
||||||
|
} Elf32_Dyn;
|
||||||
|
|
||||||
|
/* d_tag */
|
||||||
|
#define DT_NULL 0 /* Marks end of dynamic array */
|
||||||
|
#define DT_NEEDED 1 /* Name of needed library (DT_STRTAB offset) */
|
||||||
|
#define DT_PLTRELSZ 2 /* Size, in bytes, of relocations in PLT */
|
||||||
|
#define DT_PLTGOT 3 /* Address of PLT and/or GOT */
|
||||||
|
#define DT_HASH 4 /* Address of symbol hash table */
|
||||||
|
#define DT_STRTAB 5 /* Address of string table */
|
||||||
|
#define DT_SYMTAB 6 /* Address of symbol table */
|
||||||
|
#define DT_RELA 7 /* Address of Rela relocation table */
|
||||||
|
#define DT_RELASZ 8 /* Size, in bytes, of DT_RELA table */
|
||||||
|
#define DT_RELAENT 9 /* Size, in bytes, of one DT_RELA entry */
|
||||||
|
#define DT_STRSZ 10 /* Size, in bytes, of DT_STRTAB table */
|
||||||
|
#define DT_SYMENT 11 /* Size, in bytes, of one DT_SYMTAB entry */
|
||||||
|
#define DT_INIT 12 /* Address of initialization function */
|
||||||
|
#define DT_FINI 13 /* Address of termination function */
|
||||||
|
#define DT_SONAME 14 /* Shared object name (DT_STRTAB offset) */
|
||||||
|
#define DT_RPATH 15 /* Library search path (DT_STRTAB offset) */
|
||||||
|
#define DT_SYMBOLIC 16 /* Start symbol search within local object */
|
||||||
|
#define DT_REL 17 /* Address of Rel relocation table */
|
||||||
|
#define DT_RELSZ 18 /* Size, in bytes, of DT_REL table */
|
||||||
|
#define DT_RELENT 19 /* Size, in bytes, of one DT_REL entry */
|
||||||
|
#define DT_PLTREL 20 /* Type of PLT relocation entries */
|
||||||
|
#define DT_DEBUG 21 /* Used for debugging; unspecified */
|
||||||
|
#define DT_TEXTREL 22 /* Relocations might modify non-writable seg */
|
||||||
|
#define DT_JMPREL 23 /* Address of relocations associated with PLT */
|
||||||
|
#define DT_BIND_NOW 24 /* Process all relocations at load-time */
|
||||||
|
#define DT_INIT_ARRAY 25 /* Address of initialization function array */
|
||||||
|
#define DT_FINI_ARRAY 26 /* Size, in bytes, of DT_INIT_ARRAY array */
|
||||||
|
#define DT_INIT_ARRAYSZ 27 /* Address of termination function array */
|
||||||
|
#define DT_FINI_ARRAYSZ 28 /* Size, in bytes, of DT_FINI_ARRAY array */
|
||||||
|
#define DT_NUM 29
|
||||||
|
|
||||||
|
#define DT_LOOS 0x60000000 /* Operating system specific range */
|
||||||
|
#define DT_HIOS 0x6fffffff
|
||||||
|
#define DT_LOPROC 0x70000000 /* Processor-specific range */
|
||||||
|
#define DT_HIPROC 0x7fffffff
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Auxiliary Vectors
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word a_type; /* 32-bit id */
|
||||||
|
Elf32_Word a_v; /* 32-bit id */
|
||||||
|
} Aux32Info;
|
||||||
|
|
||||||
|
/* a_type */
|
||||||
|
#define AT_NULL 0 /* Marks end of array */
|
||||||
|
#define AT_IGNORE 1 /* No meaning, a_un is undefined */
|
||||||
|
#define AT_EXECFD 2 /* Open file descriptor of object file */
|
||||||
|
#define AT_PHDR 3 /* &phdr[0] */
|
||||||
|
#define AT_PHENT 4 /* sizeof(phdr[0]) */
|
||||||
|
#define AT_PHNUM 5 /* # phdr entries */
|
||||||
|
#define AT_PAGESZ 6 /* PAGESIZE */
|
||||||
|
#define AT_BASE 7 /* Interpreter base addr */
|
||||||
|
#define AT_FLAGS 8 /* Processor flags */
|
||||||
|
#define AT_ENTRY 9 /* Entry address of executable */
|
||||||
|
#define AT_DCACHEBSIZE 10 /* Data cache block size */
|
||||||
|
#define AT_ICACHEBSIZE 11 /* Instruction cache block size */
|
||||||
|
#define AT_UCACHEBSIZE 12 /* Unified cache block size */
|
||||||
|
|
||||||
|
/* Vendor specific */
|
||||||
|
#define AT_MIPS_NOTELF 10 /* XXX a_val != 0 -> MIPS XCOFF executable */
|
||||||
|
|
||||||
|
#define AT_SUN_UID 2000 /* euid */
|
||||||
|
#define AT_SUN_RUID 2001 /* ruid */
|
||||||
|
#define AT_SUN_GID 2002 /* egid */
|
||||||
|
#define AT_SUN_RGID 2003 /* rgid */
|
||||||
|
|
||||||
|
/* Solaris kernel specific */
|
||||||
|
#define AT_SUN_LDELF 2004 /* dynamic linker's ELF header */
|
||||||
|
#define AT_SUN_LDSHDR 2005 /* dynamic linker's section header */
|
||||||
|
#define AT_SUN_LDNAME 2006 /* dynamic linker's name */
|
||||||
|
#define AT_SUN_LPGSIZE 2007 /* large pagesize */
|
||||||
|
|
||||||
|
/* Other information */
|
||||||
|
#define AT_SUN_PLATFORM 2008 /* sysinfo(SI_PLATFORM) */
|
||||||
|
#define AT_SUN_HWCAP 2009 /* process hardware capabilities */
|
||||||
|
#define AT_SUN_IFLUSH 2010 /* do we need to flush the instruction cache? */
|
||||||
|
#define AT_SUN_CPU 2011 /* cpu name */
|
||||||
|
/* ibcs2 emulation band aid */
|
||||||
|
#define AT_SUN_EMUL_ENTRY 2012 /* coff entry point */
|
||||||
|
#define AT_SUN_EMUL_EXECFD 2013 /* coff file descriptor */
|
||||||
|
/* Executable's fully resolved name */
|
||||||
|
#define AT_SUN_EXECNAME 2014
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note Headers
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
Elf32_Word n_namesz;
|
||||||
|
Elf32_Word n_descsz;
|
||||||
|
Elf32_Word n_type;
|
||||||
|
} Elf32_Nhdr;
|
||||||
|
|
||||||
|
#define ELF_NOTE_TYPE_ABI_TAG 1
|
||||||
|
|
||||||
|
/* GNU-specific note name and description sizes */
|
||||||
|
#define ELF_NOTE_ABI_NAMESZ 4
|
||||||
|
#define ELF_NOTE_ABI_DESCSZ 16
|
||||||
|
/* GNU-specific note name */
|
||||||
|
#define ELF_NOTE_ABI_NAME "GNU\0"
|
||||||
|
|
||||||
|
/* GNU-specific OS/version value stuff */
|
||||||
|
#define ELF_NOTE_ABI_OS_LINUX 0
|
||||||
|
#define ELF_NOTE_ABI_OS_HURD 1
|
||||||
|
#define ELF_NOTE_ABI_OS_SOLARIS 2
|
||||||
|
|
||||||
|
/* NetBSD-specific note type: Emulation name. desc is emul name string. */
|
||||||
|
#define ELF_NOTE_TYPE_NETBSD_TAG 1
|
||||||
|
|
||||||
|
/* NetBSD-specific note name and description sizes */
|
||||||
|
#define ELF_NOTE_NETBSD_NAMESZ 7
|
||||||
|
#define ELF_NOTE_NETBSD_DESCSZ 4
|
||||||
|
/* NetBSD-specific note name */
|
||||||
|
#define ELF_NOTE_NETBSD_NAME "NetBSD\0\0"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NetBSD-specific core file information.
|
||||||
|
*
|
||||||
|
* NetBSD ELF core files use notes to provide information about
|
||||||
|
* the process's state. The note name is "NetBSD-CORE" for
|
||||||
|
* information that is global to the process, and "NetBSD-CORE@nn",
|
||||||
|
* where "nn" is the lwpid of the LWP that the information belongs
|
||||||
|
* to (such as register state).
|
||||||
|
*
|
||||||
|
* We use the following note identifiers:
|
||||||
|
*
|
||||||
|
* ELF_NOTE_NETBSD_CORE_PROCINFO
|
||||||
|
* Note is a "netbsd_elfcore_procinfo" structure.
|
||||||
|
*
|
||||||
|
* We also use ptrace(2) request numbers (the ones that exist in
|
||||||
|
* machine-dependent space) to identify register info notes. The
|
||||||
|
* info in such notes is in the same format that ptrace(2) would
|
||||||
|
* export that information.
|
||||||
|
*
|
||||||
|
* Please try to keep the members of this structure nicely aligned,
|
||||||
|
* and if you add elements, add them to the end and bump the version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ELF_NOTE_NETBSD_CORE_NAME "NetBSD-CORE"
|
||||||
|
|
||||||
|
#define ELF_NOTE_NETBSD_CORE_PROCINFO 1
|
||||||
|
|
||||||
|
#define NETBSD_ELFCORE_PROCINFO_VERSION 1
|
||||||
|
|
||||||
|
struct netbsd_elfcore_procinfo {
|
||||||
|
/* Version 1 fields start here. */
|
||||||
|
/* Add version 2 fields below here. */
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(ELFSIZE)
|
||||||
|
#define CONCAT(x,y) __CONCAT(x,y)
|
||||||
|
#define ELFNAME(x) CONCAT(elf,CONCAT(ELFSIZE,CONCAT(_,x)))
|
||||||
|
#define ELFNAME2(x,y) CONCAT(x,CONCAT(_elf,CONCAT(ELFSIZE,CONCAT(_,y))))
|
||||||
|
#define ELFNAMEEND(x) CONCAT(x,CONCAT(_elf,ELFSIZE))
|
||||||
|
#define ELFDEFNNAME(x) CONCAT(ELF,CONCAT(ELFSIZE,CONCAT(_,x)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define Elf_Ehdr Elf32_Ehdr
|
||||||
|
#define Elf_Phdr Elf32_Phdr
|
||||||
|
#define Elf_Shdr Elf32_Shdr
|
||||||
|
#define Elf_Sym Elf32_Sym
|
||||||
|
#define Elf_Rel Elf32_Rel
|
||||||
|
#define Elf_Rela Elf32_Rela
|
||||||
|
#define Elf_Dyn Elf32_Dyn
|
||||||
|
#define Elf_Word Elf32_Word
|
||||||
|
#define Elf_Sword Elf32_Sword
|
||||||
|
#define Elf_Addr Elf32_Addr
|
||||||
|
#define Elf_Off Elf32_Off
|
||||||
|
#define Elf_Nhdr Elf32_Nhdr
|
||||||
|
|
||||||
|
#define ELF_R_SYM ELF32_R_SYM
|
||||||
|
#define ELF_R_TYPE ELF32_R_TYPE
|
||||||
|
#define ELFCLASS ELFCLASS32
|
||||||
|
|
||||||
|
#define ELF_ST_BIND ELF32_ST_BIND
|
||||||
|
#define ELF_ST_TYPE ELF32_ST_TYPE
|
||||||
|
#define ELF_ST_INFO ELF32_ST_INFO
|
||||||
|
|
||||||
|
#define AuxInfo Aux32Info
|
||||||
|
|
||||||
|
#ifdef _KERNEL
|
||||||
|
|
||||||
|
#define ELF_AUX_ENTRIES 8 /* Size of aux array passed to loader */
|
||||||
|
#define ELF32_NO_ADDR (~(Elf32_Addr)0) /* Indicates addr. not yet filled in */
|
||||||
|
|
||||||
|
#if defined(ELFSIZE) && (ELFSIZE == 64)
|
||||||
|
#define ELF_NO_ADDR ELF64_NO_ADDR
|
||||||
|
#elif defined(ELFSIZE) && (ELFSIZE == 32)
|
||||||
|
#define ELF_NO_ADDR ELF32_NO_ADDR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ELF32_EHDR_FLAGS_OK
|
||||||
|
#define ELF32_EHDR_FLAGS_OK(eh) 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ELF_EHDR_FLAGS_OK(eh) ELF32_EHDR_FLAGS_OK(eh)
|
||||||
|
|
||||||
|
#if defined(ELFSIZE)
|
||||||
|
struct elf_args {
|
||||||
|
Elf_Addr arg_entry; /* program entry point */
|
||||||
|
Elf_Addr arg_interp; /* Interpreter load address */
|
||||||
|
Elf_Addr arg_phaddr; /* program header address */
|
||||||
|
Elf_Addr arg_phentsize; /* Size of program header */
|
||||||
|
Elf_Addr arg_phnum; /* Number of program headers */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LKM
|
||||||
|
#include "opt_execfmt.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef EXEC_ELF32
|
||||||
|
int exec_elf32_makecmds __P((struct proc *, struct exec_package *));
|
||||||
|
int elf32_copyargs __P((struct exec_package *, struct ps_strings *,
|
||||||
|
char **, void *));
|
||||||
|
|
||||||
|
int coredump_elf32 __P((struct proc *, struct vnode *, struct ucred *));
|
||||||
|
int coredump_writenote_elf32 __P((struct proc *, struct vnode *,
|
||||||
|
struct ucred *, off_t, Elf32_Nhdr *,
|
||||||
|
const char *, void *));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* common */
|
||||||
|
int exec_elf_setup_stack __P((struct proc *, struct exec_package *));
|
||||||
|
|
||||||
|
#endif /* _KERNEL */
|
||||||
|
|
||||||
|
#endif /* !_SYS_EXEC_ELF_H_ */
|
87
k/include/k/atapi.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#ifndef ATAPI_H_
|
||||||
|
#define ATAPI_H_
|
||||||
|
|
||||||
|
# include <k/compiler.h>
|
||||||
|
# include <k/types.h>
|
||||||
|
|
||||||
|
/* Device Control Registers */
|
||||||
|
# define PRIMARY_DCR 0x3F6
|
||||||
|
# define SECONDARY_DCR 0x376
|
||||||
|
|
||||||
|
/* DCR bits */
|
||||||
|
# define INTERRUPT_DISABLE (1 << 1)
|
||||||
|
# define SRST (1 << 2)
|
||||||
|
|
||||||
|
/* Drive selection bytes */
|
||||||
|
# define ATA_PORT_MASTER 0x00
|
||||||
|
# define ATA_PORT_SLAVE 0x10
|
||||||
|
|
||||||
|
/* ATA bus IO ports */
|
||||||
|
# define PRIMARY_REG 0x1F0
|
||||||
|
# define SECONDARY_REG 0x170
|
||||||
|
|
||||||
|
/* ATA I/O registers */
|
||||||
|
# define ATA_REG_DATA(PORT) (PORT)
|
||||||
|
# define ATA_REG_FEATURES(PORT) ((PORT) + 1)
|
||||||
|
# define ATA_REG_ERROR_INFO(PORT) ((PORT) + 1)
|
||||||
|
# define ATA_REG_SECTOR_COUNT(PORT) ((PORT) + 2)
|
||||||
|
# define ATA_REG_SECTOR_NB(PORT) ((PORT) + 3)
|
||||||
|
# define ATA_REG_LBA_LO(PORT) ((PORT) + 3)
|
||||||
|
# define ATA_REG_CYLINDER_LOW(PORT) ((PORT) + 4)
|
||||||
|
# define ATA_REG_LBA_MI(PORT) ((PORT) + 4)
|
||||||
|
# define ATA_REG_CYLINDER_HIGH(PORT) ((PORT) + 5)
|
||||||
|
# define ATA_REG_LBA_HI(PORT) ((PORT) + 5)
|
||||||
|
# define ATA_REG_DRIVE(PORT) ((PORT) + 6)
|
||||||
|
# define ATA_REG_HEAD(PORT) ((PORT) + 6)
|
||||||
|
# define ATA_REG_COMMAND(PORT) ((PORT) + 7)
|
||||||
|
# define ATA_REG_STATUS(PORT) ((PORT) + 7)
|
||||||
|
|
||||||
|
/* Status bits */
|
||||||
|
# define ERR (1 << 0)
|
||||||
|
# define DRQ (1 << 3)
|
||||||
|
# define SRV (1 << 4)
|
||||||
|
# define DF (1 << 5)
|
||||||
|
# define RDY (1 << 6)
|
||||||
|
# define BSY (1 << 7)
|
||||||
|
|
||||||
|
# define ABRT (1 << 2)
|
||||||
|
|
||||||
|
/* ATAPI signature */
|
||||||
|
# define ATAPI_SIG_SC 0x01
|
||||||
|
# define ATAPI_SIG_LBA_LO 0x01
|
||||||
|
# define ATAPI_SIG_LBA_MI 0x14
|
||||||
|
# define ATAPI_SIG_LBA_HI 0xEB
|
||||||
|
|
||||||
|
/* ATA commands */
|
||||||
|
# define IDENTIFY_PACKET_DEVICE 0xA1
|
||||||
|
# define PACKET 0xA0
|
||||||
|
|
||||||
|
/* SCSI commands */
|
||||||
|
# define READ_12 0xA8
|
||||||
|
|
||||||
|
# define DPO (1 << 4)
|
||||||
|
|
||||||
|
# define ATAPI_BLK_CACHE_SZ 256
|
||||||
|
# define CD_BLOCK_SZ 2048
|
||||||
|
# define PACKET_SZ 12
|
||||||
|
|
||||||
|
# define PACKET_AWAIT_COMMAND 1
|
||||||
|
# define PACKET_DATA_TRANSMIT 2
|
||||||
|
# define PACKET_COMMAND_COMPLETE 3
|
||||||
|
|
||||||
|
struct SCSI_packet {
|
||||||
|
u8 op_code;
|
||||||
|
u8 flags_lo;
|
||||||
|
u8 lba_hi;
|
||||||
|
u8 lba_mihi;
|
||||||
|
u8 lba_milo;
|
||||||
|
u8 lba_lo;
|
||||||
|
u8 transfer_length_hi;
|
||||||
|
u8 transfer_length_mihi;
|
||||||
|
u8 transfer_length_milo;
|
||||||
|
u8 transfer_length_lo;
|
||||||
|
u8 flags_hi;
|
||||||
|
u8 control;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
#endif /* !ATAPI_H_ */
|
39
k/include/k/blockdev.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef BLOCKDEV_H_
|
||||||
|
#define BLOCKDEV_H_
|
||||||
|
|
||||||
|
# include <assert.h>
|
||||||
|
# include <k/types.h>
|
||||||
|
|
||||||
|
struct blockdev;
|
||||||
|
|
||||||
|
struct blk_ops {
|
||||||
|
void *(*read)(struct blockdev *, size_t);
|
||||||
|
void (*free_blk)(struct blockdev *, void *);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct blockdev {
|
||||||
|
size_t blk_size;
|
||||||
|
|
||||||
|
struct blk_ops *ops;
|
||||||
|
void *blocks;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void *block_read(struct blockdev *bd, size_t lba)
|
||||||
|
{
|
||||||
|
assert(bd);
|
||||||
|
assert(bd->ops);
|
||||||
|
assert(bd->ops->read);
|
||||||
|
|
||||||
|
return bd->ops->read(bd, lba);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void block_free(struct blockdev *bd, void *ptr)
|
||||||
|
{
|
||||||
|
assert(bd);
|
||||||
|
assert(bd->ops);
|
||||||
|
assert(bd->ops->free_blk);
|
||||||
|
|
||||||
|
bd->ops->free_blk(bd, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* BLOCKDEV_H_ */
|
8
k/include/k/compiler.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef COMPILER_H
|
||||||
|
#define COMPILER_H
|
||||||
|
|
||||||
|
#define array_size(arr) (sizeof(arr) / sizeof(*arr))
|
||||||
|
#define __packed __attribute__((__packed__))
|
||||||
|
#define align_up(addr, bytes) (((addr) + (bytes) - 1) & ~((bytes) - 1))
|
||||||
|
|
||||||
|
#endif
|
138
k/include/k/iso9660.h
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of my_read_iso.
|
||||||
|
*
|
||||||
|
* my_read_iso is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* my_read_iso is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with my_read_iso; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
* Copyright Alexandre Becoulet, 2003
|
||||||
|
* contact : alexandre.becoulet@epita.fr
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ISO9660_H
|
||||||
|
# define ISO9660_H
|
||||||
|
|
||||||
|
# define __packed __attribute__((__packed__))
|
||||||
|
|
||||||
|
/* Structures used for twin values */
|
||||||
|
|
||||||
|
struct endian32 {
|
||||||
|
u32 le; /* little endian value */
|
||||||
|
u32 be; /* big endian value */
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct endian16 {
|
||||||
|
u16 le; /* little endian value */
|
||||||
|
u16 be; /* big endian value */
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
# define ISO_BLOCK_SIZE 2048
|
||||||
|
|
||||||
|
/* ISO9660 Path table structure */
|
||||||
|
|
||||||
|
struct iso_path_table_le {
|
||||||
|
u8 idf_len; /* Identifier name length */
|
||||||
|
u8 ext_size; /* Extended attribute record length */
|
||||||
|
u32 data_blk; /* File data block index */
|
||||||
|
u16 parent_dir; /* Number of the parent dir */
|
||||||
|
char idf[0]; /* directory name */
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
/* ISO9660 directory structure */
|
||||||
|
|
||||||
|
# define MAX_DIR_DEPTH 8
|
||||||
|
# define ISO_DATE_LEN 7
|
||||||
|
|
||||||
|
enum iso_file_type {
|
||||||
|
ISO_FILE_HIDDEN = 1, /* File is Hidden */
|
||||||
|
ISO_FILE_ISDIR = 2, /* Entry is a Directory */
|
||||||
|
ISO_FILE_ASSOCIAT = 4, /* Entry is an Associated */
|
||||||
|
ISO_FILE_USEEXT = 8,
|
||||||
|
/* Information is structured according to the extended attribute record */
|
||||||
|
ISO_FILE_USEPERM = 16,
|
||||||
|
/* Permissions are specified in the extended attribute record */
|
||||||
|
ISO_FILE_MULTIDIR = 128 /* File has more than one directory record */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct iso_dir {
|
||||||
|
u8 dir_size; /* Length of directory record */
|
||||||
|
u8 ext_size; /* Extended attribute record length */
|
||||||
|
struct endian32 data_blk; /* File data block index */
|
||||||
|
struct endian32 file_size; /* File size */
|
||||||
|
char date[ISO_DATE_LEN];
|
||||||
|
u8 type; /* File type (enum iso_file_type) */
|
||||||
|
|
||||||
|
/* only valid if the file is recorded in interleave mode */
|
||||||
|
u8 unit_size; /* File Unit Size */
|
||||||
|
u8 gap_size; /* Interleave Gap Size */
|
||||||
|
|
||||||
|
struct endian16 vol_seq;
|
||||||
|
u8 idf_len;
|
||||||
|
char idf[0]; /* file name */
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
/* ISO9660 Primary volume descriptor structure */
|
||||||
|
|
||||||
|
# define ISO_PRIM_VOLDESC_BLOCK 16
|
||||||
|
|
||||||
|
# define ISO_SYSIDF_LEN 32
|
||||||
|
# define ISO_VOLIDF_LEN 32
|
||||||
|
# define ISO_VOLSET_LEN 128
|
||||||
|
# define ISO_PUBIDF_LEN 128
|
||||||
|
# define ISO_DPREP_LEN 128
|
||||||
|
# define ISO_APP_LEN 128
|
||||||
|
# define ISO_CPRFIL_LEN 37
|
||||||
|
# define ISO_ABSFIL_LEN 37
|
||||||
|
# define ISO_BIBFIL_LEN 37
|
||||||
|
# define ISO_LDATE_LEN 17
|
||||||
|
|
||||||
|
struct iso_prim_voldesc {
|
||||||
|
u8 vol_desc_type; /* Volume Descriptor Type (1) */
|
||||||
|
char std_identifier[5]; /* Standard Identifier (CD001) */
|
||||||
|
u8 vol_desc_version; /* Volume Descriptor Version (1) */
|
||||||
|
u8 unused1; /* Unused Field */
|
||||||
|
char syidf[ISO_SYSIDF_LEN]; /* System Identifier */
|
||||||
|
char vol_idf[ISO_VOLIDF_LEN]; /* Volume Identifier */
|
||||||
|
u8 unused2[8]; /* Unused Field */
|
||||||
|
struct endian32 vol_blk_count;
|
||||||
|
/* Number of logical blocks in the Volume (LE)*/
|
||||||
|
u8 unused4[32]; /* Unused Field */
|
||||||
|
struct endian16 vol_set_size; /* The Volume Set size of the Volume */
|
||||||
|
struct endian16 vol_seq_num; /* The number of the volume in the Set */
|
||||||
|
struct endian16 vol_blk_size; /* The size in bytes of a Logical Block */
|
||||||
|
struct endian32 path_table_size; /* Length in bytes of the path table */
|
||||||
|
u32 le_path_table_blk; /* LittleEndian path table block index */
|
||||||
|
u32 le_opath_table_blk;
|
||||||
|
/* LittleEndian optional path table block index */
|
||||||
|
u32 be_path_table_blk; /* BigEndian path table block index */
|
||||||
|
u32 be_opath_table_blk; /* BigEndian optional path table block index */
|
||||||
|
|
||||||
|
struct iso_dir root_dir; /* Root directory entry */
|
||||||
|
u8 unused5[34 - sizeof (struct iso_dir)];/* padding */
|
||||||
|
|
||||||
|
char volset_idf[ISO_VOLSET_LEN]; /* Name of the multiple volume set */
|
||||||
|
char pub_idf[ISO_PUBIDF_LEN]; /* Publisher name */
|
||||||
|
char dprep_idf[ISO_DPREP_LEN]; /* Data preparer name */
|
||||||
|
char app_idf[ISO_APP_LEN]; /* Application name */
|
||||||
|
|
||||||
|
char copyright_file[ISO_CPRFIL_LEN]; /* Copyright file name in root dir */
|
||||||
|
char abstract_file[ISO_ABSFIL_LEN]; /* Abstract file name in root dir */
|
||||||
|
char bibli_file[ISO_BIBFIL_LEN]; /* Bibliographic file name in root dir */
|
||||||
|
char date_creat[ISO_LDATE_LEN]; /* Creation date */
|
||||||
|
char date_modif[ISO_LDATE_LEN]; /* Modification date */
|
||||||
|
char date_expir[ISO_LDATE_LEN]; /* Expiration date */
|
||||||
|
char date_effect[ISO_LDATE_LEN]; /* Effective date */
|
||||||
|
u8 filestrutc_version; /* File Structure Version (1) */
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
#endif /* !ISO9660_H */
|
92
k/include/k/kfs.h
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
#ifndef K_KFS_H
|
||||||
|
#define K_KFS_H
|
||||||
|
|
||||||
|
#include <k/types.h>
|
||||||
|
|
||||||
|
#define KFS_MAGIC 0xd35f9caa
|
||||||
|
|
||||||
|
#define KFS_MIN_BLK_SZ 512
|
||||||
|
|
||||||
|
#define KFS_BLK_SZ 4096
|
||||||
|
|
||||||
|
#define KFS_BLK_DATA_SZ (KFS_BLK_SZ - 3 * 4)
|
||||||
|
|
||||||
|
#define KFS_DIRECT_BLK 10
|
||||||
|
|
||||||
|
#define KFS_INDIRECT_BLK 16
|
||||||
|
|
||||||
|
#define KFS_INDIRECT_BLK_CNT 16
|
||||||
|
|
||||||
|
#define KFS_FNAME_SZ 32
|
||||||
|
|
||||||
|
#define KFS_NAME_SZ 32
|
||||||
|
|
||||||
|
#define __packed __attribute__((__packed__))
|
||||||
|
|
||||||
|
struct kfs_block {
|
||||||
|
u32 idx;
|
||||||
|
u32 usage;
|
||||||
|
u32 cksum;
|
||||||
|
u8 data[KFS_BLK_DATA_SZ];
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct kfs_iblock {
|
||||||
|
u32 idx;
|
||||||
|
u32 blk_cnt;
|
||||||
|
u32 blks[KFS_INDIRECT_BLK_CNT];
|
||||||
|
u32 cksum;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct kfs_inode {
|
||||||
|
u32 inumber;
|
||||||
|
char filename[KFS_FNAME_SZ];
|
||||||
|
u32 file_sz;
|
||||||
|
u32 idx;
|
||||||
|
u32 blk_cnt;
|
||||||
|
u32 next_inode;
|
||||||
|
u32 d_blk_cnt;
|
||||||
|
u32 i_blk_cnt;
|
||||||
|
u32 d_blks[KFS_DIRECT_BLK];
|
||||||
|
u32 i_blks[KFS_INDIRECT_BLK];
|
||||||
|
u32 cksum;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct kfs_blk {
|
||||||
|
union {
|
||||||
|
struct kfs_block blk;
|
||||||
|
struct kfs_iblock iblk;
|
||||||
|
struct kfs_inode ino;
|
||||||
|
u8 whole_blk[KFS_BLK_SZ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct kfs_superblock {
|
||||||
|
u32 magic;
|
||||||
|
char name[KFS_NAME_SZ];
|
||||||
|
s32 ctime;
|
||||||
|
u32 blk_cnt;
|
||||||
|
u32 inode_cnt;
|
||||||
|
u32 inode_idx;
|
||||||
|
u32 cksum;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
#define ADLER32_MOD 65521
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adler32 checksum.
|
||||||
|
*/
|
||||||
|
static inline unsigned int kfs_checksum(const void *data, size_t size)
|
||||||
|
{
|
||||||
|
unsigned int a = 1;
|
||||||
|
unsigned int b = 0;
|
||||||
|
size_t i = 0;
|
||||||
|
const u8 *buf = data;
|
||||||
|
|
||||||
|
while (i < size) {
|
||||||
|
a += buf[i++];
|
||||||
|
b += a;
|
||||||
|
}
|
||||||
|
return ((b % ADLER32_MOD) << 16) | (a % ADLER32_MOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
154
k/include/k/kstd.h
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef K_KSTD_H_
|
||||||
|
#define K_KSTD_H_
|
||||||
|
|
||||||
|
#include <k/types.h>
|
||||||
|
|
||||||
|
typedef s32 ssize_t;
|
||||||
|
typedef s32 off_t;
|
||||||
|
|
||||||
|
struct melody {
|
||||||
|
unsigned long freq;
|
||||||
|
unsigned long duration;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** constants
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* console */
|
||||||
|
enum e_cons_codes {
|
||||||
|
CONS_ESCAPE = 255,
|
||||||
|
CONS_CLEAR = 1,
|
||||||
|
CONS_COLOR = 2,
|
||||||
|
CONS_SETX = 3,
|
||||||
|
CONS_SETY = 4,
|
||||||
|
CONS_BLACK = 0,
|
||||||
|
CONS_BLUE = 1,
|
||||||
|
CONS_GREEN = 2,
|
||||||
|
CONS_CYAN = 3,
|
||||||
|
CONS_RED = 4,
|
||||||
|
CONS_MAGENTA = 5,
|
||||||
|
CONS_YELLOW = 6,
|
||||||
|
CONS_WHITE = 7,
|
||||||
|
CONS_BLINK = (1 << 7),
|
||||||
|
CONS_LIGHT = (1 << 3)
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CONS_FRONT(Color) (Color)
|
||||||
|
#define CONS_BACK(Color) (Color << 4)
|
||||||
|
|
||||||
|
/* keyboard */
|
||||||
|
enum e_kbd_codes {
|
||||||
|
KEY_ESC = 1,
|
||||||
|
KEY_F1 = 59,
|
||||||
|
KEY_F2 = 60,
|
||||||
|
KEY_F3 = 61,
|
||||||
|
KEY_F4 = 62,
|
||||||
|
KEY_F5 = 63,
|
||||||
|
KEY_F6 = 64,
|
||||||
|
KEY_F7 = 65,
|
||||||
|
KEY_F8 = 66,
|
||||||
|
KEY_f9 = 67,
|
||||||
|
KEY_F10 = 68,
|
||||||
|
KEY_F11 = 87,
|
||||||
|
KEY_F12 = 88,
|
||||||
|
KEY_1 = 2,
|
||||||
|
KEY_2 = 3,
|
||||||
|
KEY_3 = 4,
|
||||||
|
KEY_4 = 5,
|
||||||
|
KEY_5 = 6,
|
||||||
|
KEY_6 = 7,
|
||||||
|
KEY_7 = 8,
|
||||||
|
KEY_8 = 9,
|
||||||
|
KEY_9 = 10,
|
||||||
|
KEY_0 = 11,
|
||||||
|
KEY_TAB = 15,
|
||||||
|
KEY_MAJLOCK = 58,
|
||||||
|
KEY_LSHIFT = 42,
|
||||||
|
KEY_RSHIFT = 54,
|
||||||
|
KEY_ALT = 56,
|
||||||
|
KEY_SPACE = 57,
|
||||||
|
KEY_CTRL = 29,
|
||||||
|
KEY_ENTER = 28,
|
||||||
|
KEY_BACKSPACE = 14,
|
||||||
|
KEY_LEFT = 75,
|
||||||
|
KEY_RIGHT = 77,
|
||||||
|
KEY_UP = 72,
|
||||||
|
KEY_DOWN = 80,
|
||||||
|
KEY_PAUSE = 69,
|
||||||
|
KEY_SYST = 55,
|
||||||
|
KEY_INSER = 82,
|
||||||
|
KEY_SUPPR = 83,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum e_k_mode {
|
||||||
|
KEY_PRESSED,
|
||||||
|
KEY_RELEASED,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* mouse */
|
||||||
|
enum e_mouse_codes {
|
||||||
|
BUTTON_LEFT = 1,
|
||||||
|
BUTTON_RIGHT = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/* misc */
|
||||||
|
#define O_RDONLY 0
|
||||||
|
#define SEEK_SET 0
|
||||||
|
#define SEEK_CUR 1
|
||||||
|
#define SEEK_END 2
|
||||||
|
#define VIDEO_GRAPHIC 0
|
||||||
|
#define VIDEO_TEXT 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
** syscalls
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SYSCALL_WRITE 1
|
||||||
|
#define SYSCALL_SBRK 2
|
||||||
|
#define SYSCALL_GETKEY 3
|
||||||
|
#define SYSCALL_GETTICK 4
|
||||||
|
#define SYSCALL_OPEN 5
|
||||||
|
#define SYSCALL_READ 6
|
||||||
|
#define SYSCALL_SEEK 7
|
||||||
|
#define SYSCALL_CLOSE 8
|
||||||
|
#define SYSCALL_SETVIDEO 9
|
||||||
|
#define SYSCALL_SWAP_FRONTBUFFER 10
|
||||||
|
#define SYSCALL_PLAYSOUND 11
|
||||||
|
#define SYSCALL_SETPALETTE 12
|
||||||
|
|
||||||
|
#define SYSCALL_GETMOUSE 13
|
||||||
|
#define NR_SYSCALL (SYSCALL_GETMOUSE + 1)
|
||||||
|
|
||||||
|
#define ENOMEM 1 /* Not enough space */
|
||||||
|
#define ENOENT 2 /* No such file or directory */
|
||||||
|
#define EIO 3 /* I/O error */
|
||||||
|
#define EINVAL 4 /* Invalid argument */
|
||||||
|
#define ENOSYS 5 /* Invalid system call number */
|
||||||
|
#define EBADF 6 /* fd is not an open file descriptor */
|
||||||
|
#define EAGAIN 7 /* Temporary unavailable */
|
||||||
|
|
||||||
|
#endif /* !KSTD_H_ */
|
15
k/include/k/types.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef K_TYPES_H
|
||||||
|
#define K_TYPES_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
typedef unsigned char u8;
|
||||||
|
typedef signed char s8;
|
||||||
|
typedef unsigned short u16;
|
||||||
|
typedef signed short s16;
|
||||||
|
typedef unsigned int u32;
|
||||||
|
typedef signed int s32;
|
||||||
|
typedef unsigned long long u64;
|
||||||
|
typedef signed long long s64;
|
||||||
|
|
||||||
|
#endif
|
34
k/io.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef IO_H_
|
||||||
|
#define IO_H_
|
||||||
|
|
||||||
|
#include <k/types.h>
|
||||||
|
|
||||||
|
static inline void outb(u16 port, u8 val)
|
||||||
|
{
|
||||||
|
asm volatile ("outb %0, %1" : /* No output */ : "a"(val), "d"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u8 inb(u16 port)
|
||||||
|
{
|
||||||
|
u8 res;
|
||||||
|
|
||||||
|
asm volatile ("inb %1, %0" : "=&a"(res) : "d"(port));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void outw(u16 port, u16 val)
|
||||||
|
{
|
||||||
|
asm volatile ("outw %0, %1" : /* No output */ : "a"(val), "d"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u16 inw(u16 port)
|
||||||
|
{
|
||||||
|
u16 res;
|
||||||
|
|
||||||
|
asm volatile ("inw %1, %0" : "=&a"(res) : "d"(port));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !IO_H_ */
|
43
k/k.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <k/kstd.h>
|
||||||
|
|
||||||
|
#include "multiboot.h"
|
||||||
|
|
||||||
|
|
||||||
|
void k_main(unsigned long magic, multiboot_info_t *info)
|
||||||
|
{
|
||||||
|
(void)magic;
|
||||||
|
(void)info;
|
||||||
|
|
||||||
|
char star[4] = "|/-\\";
|
||||||
|
char *fb = (void *)0xb8000;
|
||||||
|
|
||||||
|
for (unsigned i = 0; ; ) {
|
||||||
|
*fb = star[i++ % 4];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
asm volatile ("hlt");
|
||||||
|
}
|
53
k/k.lds
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
OUTPUT_FORMAT("elf32-i386")
|
||||||
|
OUTPUT_ARCH("i386")
|
||||||
|
ENTRY(k_entry)
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0x100000 + SIZEOF_HEADERS;
|
||||||
|
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.multiboot) *(.text) *(.text.*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata) *(.rodata.*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data) *(.data.*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(.bss) *(.bss.*) *(COMMON)
|
||||||
|
}
|
||||||
|
|
||||||
|
PROVIDE(_end = .);
|
||||||
|
}
|
251
k/libvga.c
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <k/compiler.h>
|
||||||
|
|
||||||
|
#include "libvga.h"
|
||||||
|
#include "io.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Use to save the VGA plane 2, which contains the text font,
|
||||||
|
** when we switch into graphic mode.
|
||||||
|
*/
|
||||||
|
static unsigned char libvga_txt_mode_font[320 * 200];
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Registers value for graphic mode.
|
||||||
|
*/
|
||||||
|
static unsigned char libvga_regs_320x200x256[] = {
|
||||||
|
/* MISC */
|
||||||
|
0x63,
|
||||||
|
/* SEQ */
|
||||||
|
0x03, 0x01, 0x0F, 0x00, 0x0E,
|
||||||
|
/* CRTC */
|
||||||
|
0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F,
|
||||||
|
0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
|
||||||
|
0xFF,
|
||||||
|
/* GC */
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
|
||||||
|
0xFF,
|
||||||
|
/* AC */
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
|
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
||||||
|
0x41, 0x00, 0x0F, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Registers value for basic text mode.
|
||||||
|
*/
|
||||||
|
static unsigned char libvga_regs_80x25xtext[] = {
|
||||||
|
/* MISC */
|
||||||
|
0x67,
|
||||||
|
/* SEQ */
|
||||||
|
0x03, 0x00, 0x03, 0x00, 0x02,
|
||||||
|
/* CRTC */
|
||||||
|
0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F,
|
||||||
|
0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x50,
|
||||||
|
0x9C, 0x0E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
|
||||||
|
0xFF,
|
||||||
|
/* GC */
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00,
|
||||||
|
0xFF,
|
||||||
|
/* AC */
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
|
||||||
|
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
|
||||||
|
0x0C, 0x00, 0x0F, 0x08, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Basic Windows BITMAP pallet.
|
||||||
|
** This palette is automatically loaded when switching to mode 13h
|
||||||
|
*/
|
||||||
|
static unsigned int libvga_default_palette[256] = {
|
||||||
|
0x0, 0x800000, 0x8000, 0x808000,
|
||||||
|
0x80, 0x800080, 0x8080, 0xc0c0c0,
|
||||||
|
0xc0dcc0, 0xa6caf0, 0x402000, 0x602000,
|
||||||
|
0x802000, 0xa02000, 0xc02000, 0xe02000,
|
||||||
|
0x4000, 0x204000, 0x404000, 0x604000,
|
||||||
|
0x804000, 0xa04000, 0xc04000, 0xe04000,
|
||||||
|
0x6000, 0x206000, 0x406000, 0x606000,
|
||||||
|
0x806000, 0xa06000, 0xc06000, 0xe06000,
|
||||||
|
0x8000, 0x208000, 0x408000, 0x608000,
|
||||||
|
0x808000, 0xa08000, 0xc08000, 0xe08000,
|
||||||
|
0xa000, 0x20a000, 0x40a000, 0x60a000,
|
||||||
|
0x80a000, 0xa0a000, 0xc0a000, 0xe0a000,
|
||||||
|
0xc000, 0x20c000, 0x40c000, 0x60c000,
|
||||||
|
0x80c000, 0xa0c000, 0xc0c000, 0xe0c000,
|
||||||
|
0xe000, 0x20e000, 0x40e000, 0x60e000,
|
||||||
|
0x80e000, 0xa0e000, 0xc0e000, 0xe0e000,
|
||||||
|
0x40, 0x200040, 0x400040, 0x600040,
|
||||||
|
0x800040, 0xa00040, 0xc00040, 0xe00040,
|
||||||
|
0x2040, 0x202040, 0x402040, 0x602040,
|
||||||
|
0x802040, 0xa02040, 0xc02040, 0xe02040,
|
||||||
|
0x4040, 0x204040, 0x404040, 0x604040,
|
||||||
|
0x804040, 0xa04040, 0xc04040, 0xe04040,
|
||||||
|
0x6040, 0x206040, 0x406040, 0x606040,
|
||||||
|
0x806040, 0xa06040, 0xc06040, 0xe06040,
|
||||||
|
0x8040, 0x208040, 0x408040, 0x608040,
|
||||||
|
0x808040, 0xa08040, 0xc08040, 0xe08040,
|
||||||
|
0xa040, 0x20a040, 0x40a040, 0x60a040,
|
||||||
|
0x80a040, 0xa0a040, 0xc0a040, 0xe0a040,
|
||||||
|
0xc040, 0x20c040, 0x40c040, 0x60c040,
|
||||||
|
0x80c040, 0xa0c040, 0xc0c040, 0xe0c040,
|
||||||
|
0xe040, 0x20e040, 0x40e040, 0x60e040,
|
||||||
|
0x80e040, 0xa0e040, 0xc0e040, 0xe0e040,
|
||||||
|
0x80, 0x200080, 0x400080, 0x600080,
|
||||||
|
0x800080, 0xa00080, 0xc00080, 0xe00080,
|
||||||
|
0x2080, 0x202080, 0x402080, 0x602080,
|
||||||
|
0x802080, 0xa02080, 0xc02080, 0xe02080,
|
||||||
|
0x4080, 0x204080, 0x404080, 0x604080,
|
||||||
|
0x804080, 0xa04080, 0xc04080, 0xe04080,
|
||||||
|
0x6080, 0x206080, 0x406080, 0x606080,
|
||||||
|
0x806080, 0xa06080, 0xc06080, 0xe06080,
|
||||||
|
0x8080, 0x208080, 0x408080, 0x608080,
|
||||||
|
0x808080, 0xa08080, 0xc08080, 0xe08080,
|
||||||
|
0xa080, 0x20a080, 0x40a080, 0x60a080,
|
||||||
|
0x80a080, 0xa0a080, 0xc0a080, 0xe0a080,
|
||||||
|
0xc080, 0x20c080, 0x40c080, 0x60c080,
|
||||||
|
0x80c080, 0xa0c080, 0xc0c080, 0xe0c080,
|
||||||
|
0xe080, 0x20e080, 0x40e080, 0x60e080,
|
||||||
|
0x80e080, 0xa0e080, 0xc0e080, 0xe0e080,
|
||||||
|
0xc0, 0x2000c0, 0x4000c0, 0x6000c0,
|
||||||
|
0x8000c0, 0xa000c0, 0xc000c0, 0xe000c0,
|
||||||
|
0x20c0, 0x2020c0, 0x4020c0, 0x6020c0,
|
||||||
|
0x8020c0, 0xa020c0, 0xc020c0, 0xe020c0,
|
||||||
|
0x40c0, 0x2040c0, 0x4040c0, 0x6040c0,
|
||||||
|
0x8040c0, 0xa040c0, 0xc040c0, 0xe040c0,
|
||||||
|
0x60c0, 0x2060c0, 0x4060c0, 0x6060c0,
|
||||||
|
0x8060c0, 0xa060c0, 0xc060c0, 0xe060c0,
|
||||||
|
0x80c0, 0x2080c0, 0x4080c0, 0x6080c0,
|
||||||
|
0x8080c0, 0xa080c0, 0xc080c0, 0xe080c0,
|
||||||
|
0xa0c0, 0x20a0c0, 0x40a0c0, 0x60a0c0,
|
||||||
|
0x80a0c0, 0xa0a0c0, 0xc0a0c0, 0xe0a0c0,
|
||||||
|
0xc0c0, 0x20c0c0, 0x40c0c0, 0x60c0c0,
|
||||||
|
0x80c0c0, 0xa0c0c0, 0xfffbf0, 0xa0a0a4,
|
||||||
|
0x808080, 0xff0000, 0xff00, 0xffff00,
|
||||||
|
0xff, 0xff00ff, 0xffff, 0xffffff
|
||||||
|
};
|
||||||
|
|
||||||
|
static void libvga_write_regs(unsigned char *regs)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
unsigned int a;
|
||||||
|
|
||||||
|
/* write the MISC register */
|
||||||
|
outb(VGA_MISC_WRITE, *regs);
|
||||||
|
regs++;
|
||||||
|
|
||||||
|
/* write SEQ registers */
|
||||||
|
for (i = 0; i < VGA_NUM_SEQ_REGS; i++) {
|
||||||
|
outb(VGA_SEQ_INDEX, i);
|
||||||
|
outb(VGA_SEQ_DATA, *regs);
|
||||||
|
regs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write CRTC registers */
|
||||||
|
outb(VGA_CRTC_INDEX, 0x03);
|
||||||
|
a = inb(VGA_CRTC_DATA);
|
||||||
|
outb(VGA_CRTC_DATA, a | 0x80);
|
||||||
|
outb(VGA_CRTC_INDEX, 0x11);
|
||||||
|
a = inb(VGA_CRTC_DATA);
|
||||||
|
outb(VGA_CRTC_DATA, a & ~0x80);
|
||||||
|
regs[0x03] |= 0x80;
|
||||||
|
regs[0x11] &= ~0x80;
|
||||||
|
for (i = 0; i < VGA_NUM_CRTC_REGS; i++) {
|
||||||
|
outb(VGA_CRTC_INDEX, i);
|
||||||
|
outb(VGA_CRTC_DATA, *regs);
|
||||||
|
regs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write GC registers */
|
||||||
|
for (i = 0; i < VGA_NUM_GC_REGS; i++) {
|
||||||
|
outb(VGA_GC_INDEX, i);
|
||||||
|
outb(VGA_GC_DATA, *regs);
|
||||||
|
regs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write AC registers */
|
||||||
|
inb(VGA_INSTAT_READ);
|
||||||
|
for (i = 0; i < VGA_NUM_AC_REGS; i++) {
|
||||||
|
outb(VGA_AC_INDEX, i);
|
||||||
|
outb(VGA_AC_WRITE, *regs);
|
||||||
|
regs++;
|
||||||
|
}
|
||||||
|
inb(VGA_INSTAT_READ);
|
||||||
|
outb(VGA_AC_INDEX, 0x20);
|
||||||
|
|
||||||
|
/* write the default palette to the DAC */
|
||||||
|
outb(VGA_DAC_MASK, 0xFF);
|
||||||
|
libvga_set_palette(libvga_default_palette, array_size(libvga_default_palette));
|
||||||
|
}
|
||||||
|
|
||||||
|
void libvga_set_palette(unsigned int *new_palette, size_t size)
|
||||||
|
{
|
||||||
|
outb(VGA_DAC_WRITE_INDEX, 0);
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
outb(VGA_DAC_DATA, ((new_palette[i] >> 16) >> 2) & 0xFF);
|
||||||
|
outb(VGA_DAC_DATA, ((new_palette[i] >> 8) >> 2) & 0xFF);
|
||||||
|
outb(VGA_DAC_DATA, ((new_palette[i]) >> 2) & 0xFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *libvga_get_framebuffer(void)
|
||||||
|
{
|
||||||
|
unsigned int mmap_select;
|
||||||
|
|
||||||
|
outb(VGA_GC_INDEX, 6);
|
||||||
|
mmap_select = inb(VGA_GC_DATA);
|
||||||
|
mmap_select >>= 2;
|
||||||
|
mmap_select &= 3;
|
||||||
|
switch (mmap_select) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
return (char *)0xA0000;
|
||||||
|
case 2:
|
||||||
|
return (char *)0xB0000;
|
||||||
|
case 3:
|
||||||
|
return (char *)0xB8000;
|
||||||
|
}
|
||||||
|
return (char *)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void libvga_switch_mode13h(void)
|
||||||
|
{
|
||||||
|
libvga_write_regs(libvga_regs_320x200x256);
|
||||||
|
|
||||||
|
// plane 2 is now map in the memory, save it
|
||||||
|
char *vram = libvga_get_framebuffer();
|
||||||
|
for (size_t i = 0; i < array_size(libvga_txt_mode_font); i++)
|
||||||
|
libvga_txt_mode_font[i] = vram[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
void libvga_switch_mode3h(void)
|
||||||
|
{
|
||||||
|
// restore the VGA plane 2 to the text font
|
||||||
|
char *vram = libvga_get_framebuffer();
|
||||||
|
for (size_t i = 0; i < array_size(libvga_txt_mode_font); i++)
|
||||||
|
vram[i] = libvga_txt_mode_font[i];
|
||||||
|
|
||||||
|
libvga_write_regs(libvga_regs_80x25xtext);
|
||||||
|
}
|
60
k/libvga.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef LIBVGA_H
|
||||||
|
#define LIBVGA_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define VGA_AC_INDEX 0x3C0
|
||||||
|
#define VGA_AC_WRITE 0x3C0
|
||||||
|
#define VGA_AC_READ 0x3C1
|
||||||
|
#define VGA_MISC_WRITE 0x3C2
|
||||||
|
#define VGA_SEQ_INDEX 0x3C4
|
||||||
|
#define VGA_SEQ_DATA 0x3C5
|
||||||
|
#define VGA_DAC_MASK 0x3C6
|
||||||
|
#define VGA_DAC_READ_INDEX 0x3C7
|
||||||
|
#define VGA_DAC_WRITE_INDEX 0x3C8
|
||||||
|
#define VGA_DAC_DATA 0x3C9
|
||||||
|
#define VGA_MISC_READ 0x3CC
|
||||||
|
#define VGA_GC_INDEX 0x3CE
|
||||||
|
#define VGA_GC_DATA 0x3CF
|
||||||
|
|
||||||
|
#define VGA_CRTC_INDEX 0x3D4
|
||||||
|
#define VGA_CRTC_DATA 0x3D5
|
||||||
|
#define VGA_INSTAT_READ 0x3DA
|
||||||
|
|
||||||
|
#define VGA_NUM_SEQ_REGS 5
|
||||||
|
#define VGA_NUM_CRTC_REGS 25
|
||||||
|
#define VGA_NUM_GC_REGS 9
|
||||||
|
#define VGA_NUM_AC_REGS 21
|
||||||
|
|
||||||
|
void libvga_set_palette(unsigned int *new_palette, size_t size);
|
||||||
|
|
||||||
|
char *libvga_get_framebuffer(void);
|
||||||
|
|
||||||
|
void libvga_switch_mode13h(void);
|
||||||
|
|
||||||
|
void libvga_switch_mode3h(void);
|
||||||
|
|
||||||
|
#endif /* !LIBVGA_H */
|
33
k/list.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* This list data structure is verbatim copy from wayland-util.h from the
|
||||||
|
* Wayland project; except that wl_ prefix has been removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "list.h"
|
||||||
|
|
||||||
|
void list_init(struct list *list)
|
||||||
|
{
|
||||||
|
list->prev = list;
|
||||||
|
list->next = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_insert(struct list *list, struct list *elm)
|
||||||
|
{
|
||||||
|
elm->prev = list;
|
||||||
|
elm->next = list->next;
|
||||||
|
list->next = elm;
|
||||||
|
elm->next->prev = elm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_remove(struct list *elm)
|
||||||
|
{
|
||||||
|
elm->prev->next = elm->next;
|
||||||
|
elm->next->prev = elm->prev;
|
||||||
|
elm->next = NULL;
|
||||||
|
elm->prev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int list_empty(const struct list *list)
|
||||||
|
{
|
||||||
|
return list->next == list;
|
||||||
|
}
|
41
k/list.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#ifndef LIST_H
|
||||||
|
#define LIST_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This list data structure is a verbatim copy from wayland-util.h from the
|
||||||
|
* Wayland project; except that wl_ prefix has been removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct list {
|
||||||
|
struct list *prev;
|
||||||
|
struct list *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
void list_init(struct list *list);
|
||||||
|
void list_insert(struct list *list, struct list *elm);
|
||||||
|
void list_remove(struct list *elm);
|
||||||
|
int list_empty(const struct list *list);
|
||||||
|
|
||||||
|
#define container_of(ptr, type, member) \
|
||||||
|
(__typeof__(type) *)((char *)(ptr) - \
|
||||||
|
offsetof(__typeof__(type), member))
|
||||||
|
|
||||||
|
#define list_first_entry(head, pos, member) \
|
||||||
|
container_of((head)->next, __typeof__(*pos), member)
|
||||||
|
|
||||||
|
#define list_for_each(pos, head, member) \
|
||||||
|
for (pos = 0, pos = list_first_entry(head, pos, member); \
|
||||||
|
&pos->member != (head); \
|
||||||
|
pos = list_first_entry(&pos->member, pos, member))
|
||||||
|
|
||||||
|
#define list_for_each_safe(pos, tmp, head, member) \
|
||||||
|
for (pos = 0, tmp = 0, \
|
||||||
|
pos = list_first_entry(head, pos, member), \
|
||||||
|
tmp = list_first_entry(&pos->member, tmp, member); \
|
||||||
|
&pos->member != (head); \
|
||||||
|
pos = tmp, \
|
||||||
|
tmp = list_first_entry(&pos->member, tmp, member))
|
||||||
|
|
||||||
|
#endif /* LIST_H */
|
267
k/memory.c
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
#include "memory.h"
|
||||||
|
|
||||||
|
#include <k/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static struct list memory_map = {&memory_map, &memory_map};
|
||||||
|
static struct cache *memory_map_cache;
|
||||||
|
static struct cache *metadata_cache;
|
||||||
|
|
||||||
|
static void *__memory_reserve_ex(unsigned int base_addr, size_t size, int in_extend);
|
||||||
|
static void *__cache_alloc(struct cache *cache, int in_extend);
|
||||||
|
|
||||||
|
static void cache_initialize(struct cache *c, void *p, size_t sz, size_t bsize)
|
||||||
|
{
|
||||||
|
list_init(&c->freelist);
|
||||||
|
list_init(&c->caches);
|
||||||
|
c->base = p;
|
||||||
|
c->size = sz;
|
||||||
|
c->bsize = bsize;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sz / bsize; ++i) {
|
||||||
|
struct list *l = (struct list *)((char *) p + i * bsize);
|
||||||
|
list_init(l);
|
||||||
|
list_insert(c->freelist.prev, l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cache_extend(struct cache *old, void *p, size_t sz, size_t bsize, int in_extend)
|
||||||
|
{
|
||||||
|
struct cache *c = __cache_alloc(metadata_cache, in_extend);
|
||||||
|
cache_initialize(c, p, sz, bsize);
|
||||||
|
list_insert(old->caches.prev, &c->caches);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cache *cache_new(void *base, size_t nmemb, size_t bsize)
|
||||||
|
{
|
||||||
|
struct cache *c = cache_alloc(metadata_cache);
|
||||||
|
|
||||||
|
cache_initialize(c, base, nmemb * bsize, bsize);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t freelist_size(struct cache *cache)
|
||||||
|
{
|
||||||
|
if (list_empty(&cache->freelist))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
size_t len = 1;
|
||||||
|
|
||||||
|
struct list *l = cache->freelist.next;
|
||||||
|
|
||||||
|
for (; l != &cache->freelist; l = l->next) {
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t cache_remaining(struct cache *cache)
|
||||||
|
{
|
||||||
|
size_t len = freelist_size(cache);
|
||||||
|
|
||||||
|
struct cache *c;
|
||||||
|
list_for_each(c, &cache->caches, caches) {
|
||||||
|
len += freelist_size(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *__cache_alloc(struct cache *cache, int in_extend)
|
||||||
|
{
|
||||||
|
try_alloc:
|
||||||
|
if (!list_empty(&cache->freelist)) {
|
||||||
|
struct list *l = cache->freelist.next;
|
||||||
|
list_remove(l);
|
||||||
|
return (void *)l;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cache *c;
|
||||||
|
list_for_each(c, &cache->caches, caches) {
|
||||||
|
if (!list_empty(&c->freelist)) {
|
||||||
|
return cache_alloc(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cache_remaining(metadata_cache) <= 2 && !in_extend) {
|
||||||
|
void *p = __memory_reserve_ex(0, metadata_cache->size, 1);
|
||||||
|
cache_extend(metadata_cache, p,
|
||||||
|
metadata_cache->size,
|
||||||
|
metadata_cache->bsize, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *p = memory_reserve(c->size);
|
||||||
|
cache_extend(c, p, c->size, c->bsize, 0);
|
||||||
|
|
||||||
|
goto try_alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *cache_alloc(struct cache *cache)
|
||||||
|
{
|
||||||
|
return __cache_alloc(cache, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cache_try_free(struct cache *cache, void *ptr)
|
||||||
|
{
|
||||||
|
if ((size_t)cache->base <= (size_t)ptr
|
||||||
|
&& (size_t)cache->base + cache->size > (size_t)ptr) {
|
||||||
|
list_init(ptr);
|
||||||
|
list_insert(&cache->freelist, ptr);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cache_free(struct cache *cache, void *ptr)
|
||||||
|
{
|
||||||
|
if (cache_try_free(cache, ptr)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
struct cache *c;
|
||||||
|
list_for_each(c, &cache->caches, caches) {
|
||||||
|
if (cache_try_free(c, ptr)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* FIXME: handle the case when the pointer does not belong to the cache */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void memory_initialize(struct memory_map *m,
|
||||||
|
unsigned addr, unsigned size, int type)
|
||||||
|
{
|
||||||
|
list_init(&m->list);
|
||||||
|
m->base_addr = addr;
|
||||||
|
m->size = size;
|
||||||
|
m->type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void memory_dump()
|
||||||
|
{
|
||||||
|
struct memory_map *m;
|
||||||
|
list_for_each(m, &memory_map, list) {
|
||||||
|
printf("{.base_addr=%p, .length=0x%x, .type=%u}\n",
|
||||||
|
m->base_addr, m->size, m->type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void *_end[]; /* kernel data end address */
|
||||||
|
|
||||||
|
#define BASE_METADATA_CACHE_NMEMB 10
|
||||||
|
|
||||||
|
void memory_init(multiboot_info_t *info)
|
||||||
|
{
|
||||||
|
unsigned int last_loaded_addr = info->mods_count
|
||||||
|
? ((multiboot_module_t *)info->mods_addr)[info->mods_count - 1].mod_end
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
if (last_loaded_addr < (u32)_end) {
|
||||||
|
last_loaded_addr = (u32)_end; /* XXX: needs to align up */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* take the first good memory region */
|
||||||
|
unsigned int reservation_addr = last_loaded_addr;
|
||||||
|
unsigned int reservation_len = (BASE_METADATA_CACHE_NMEMB + 1) * sizeof(struct cache);
|
||||||
|
|
||||||
|
unsigned int num_mem_zone = info->mmap_length / sizeof(multiboot_memory_map_t);
|
||||||
|
|
||||||
|
metadata_cache = (void *)reservation_addr;
|
||||||
|
cache_initialize(metadata_cache, metadata_cache + 1, BASE_METADATA_CACHE_NMEMB * sizeof(struct cache),
|
||||||
|
sizeof(struct cache));
|
||||||
|
|
||||||
|
memory_map_cache = cache_new((void *)(reservation_addr + reservation_len),
|
||||||
|
num_mem_zone * 2, sizeof(struct memory_map));
|
||||||
|
|
||||||
|
reservation_len += num_mem_zone * 2 * sizeof(struct memory_map);
|
||||||
|
|
||||||
|
multiboot_memory_map_t *map = (void *)info->mmap_addr;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < num_mem_zone; ++i) {
|
||||||
|
struct memory_map *m = cache_alloc(memory_map_cache);
|
||||||
|
|
||||||
|
memory_initialize(m, (u32)map[i].addr, (u32)map[i].len,
|
||||||
|
map[i].type - 1);
|
||||||
|
|
||||||
|
list_insert(memory_map.prev, &m->list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reserve all low memory to avoid overwriting grub data */
|
||||||
|
memory_reserve_ex(0, info->mem_lower * 1024);
|
||||||
|
/* reserve kernel and fs data */
|
||||||
|
memory_reserve_ex(0x100000, last_loaded_addr - 0x100000);
|
||||||
|
/* reserve initial cache datas */
|
||||||
|
memory_reserve_ex(reservation_addr, reservation_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *memory_split(struct memory_map *m, size_t size)
|
||||||
|
{
|
||||||
|
struct memory_map *t = cache_alloc(memory_map_cache);
|
||||||
|
memory_initialize(t, m->base_addr, size, 2);
|
||||||
|
|
||||||
|
list_insert(m->list.prev, &t->list);
|
||||||
|
|
||||||
|
m->size -= size;
|
||||||
|
m->base_addr += size;
|
||||||
|
|
||||||
|
return (void *)t->base_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *__memory_reserve_ex(unsigned int base_addr, size_t size, int in_extend)
|
||||||
|
{
|
||||||
|
if (cache_remaining(memory_map_cache) <= 2 && !in_extend) {
|
||||||
|
void *p = __memory_reserve_ex(0, 10 * sizeof(struct cache), 1);
|
||||||
|
cache_extend(memory_map_cache, p, 10 * sizeof(struct cache),
|
||||||
|
sizeof(struct cache), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct memory_map *m;
|
||||||
|
list_for_each(m, &memory_map, list) {
|
||||||
|
if (m->type)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!base_addr && m->size >= size) {
|
||||||
|
if (m->size == size) {
|
||||||
|
m->type = 2;
|
||||||
|
return (void *)m->base_addr;
|
||||||
|
}
|
||||||
|
return memory_split(m, size);
|
||||||
|
} else if (base_addr >= m->base_addr && base_addr < m->base_addr + m->size) {
|
||||||
|
if (base_addr + size >= m->base_addr + m->size) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
unsigned first_size = base_addr - m->base_addr;
|
||||||
|
if (first_size) {
|
||||||
|
memory_split(m, first_size);
|
||||||
|
return memory_reserve_ex(base_addr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return memory_split(m, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memory_reserve_ex(unsigned int base_addr, size_t size)
|
||||||
|
{
|
||||||
|
return __memory_reserve_ex(base_addr, size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memory_reserve(size_t size)
|
||||||
|
{
|
||||||
|
return memory_reserve_ex(0, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void memory_release(void *ptr)
|
||||||
|
{
|
||||||
|
struct memory_map *m;
|
||||||
|
list_for_each(m, &memory_map, list) {
|
||||||
|
if (m->base_addr == (unsigned int)ptr) {
|
||||||
|
m->type = 0;
|
||||||
|
/* FIXME: need to merge free blocks */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
32
k/memory.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef MEMORY_H
|
||||||
|
#define MEMORY_H
|
||||||
|
|
||||||
|
#include "list.h"
|
||||||
|
#include "multiboot.h"
|
||||||
|
|
||||||
|
struct memory_map {
|
||||||
|
struct list list;
|
||||||
|
unsigned int base_addr;
|
||||||
|
unsigned int size;
|
||||||
|
int type;
|
||||||
|
};
|
||||||
|
|
||||||
|
void memory_dump();
|
||||||
|
void memory_init(multiboot_info_t *info);
|
||||||
|
void *memory_reserve(size_t size);
|
||||||
|
void *memory_reserve_ex(unsigned int base_addr, size_t size);
|
||||||
|
void memory_release(void *ptr);
|
||||||
|
|
||||||
|
struct cache {
|
||||||
|
struct list freelist;
|
||||||
|
struct list caches;
|
||||||
|
void *base;
|
||||||
|
size_t size;
|
||||||
|
size_t bsize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cache *cache_new(void *base, size_t nmemb, size_t bsize);
|
||||||
|
void *cache_alloc(struct cache *cache);
|
||||||
|
void cache_free(struct cache *cache, void *ptr);
|
||||||
|
|
||||||
|
#endif /* MEMORY_H */
|
262
k/multiboot.h
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
/* multiboot.h - Multiboot header file. */
|
||||||
|
/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to
|
||||||
|
* deal in the Software without restriction, including without limitation the
|
||||||
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
* sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY
|
||||||
|
* DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||||
|
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MULTIBOOT_HEADER
|
||||||
|
#define MULTIBOOT_HEADER 1
|
||||||
|
|
||||||
|
/* How many bytes from the start of the file we search for the header. */
|
||||||
|
#define MULTIBOOT_SEARCH 8192
|
||||||
|
#define MULTIBOOT_HEADER_ALIGN 4
|
||||||
|
|
||||||
|
/* The magic field should contain this. */
|
||||||
|
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
|
||||||
|
|
||||||
|
/* This should be in %eax. */
|
||||||
|
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
|
||||||
|
|
||||||
|
/* Alignment of multiboot modules. */
|
||||||
|
#define MULTIBOOT_MOD_ALIGN 0x00001000
|
||||||
|
|
||||||
|
/* Alignment of the multiboot info structure. */
|
||||||
|
#define MULTIBOOT_INFO_ALIGN 0x00000004
|
||||||
|
|
||||||
|
/* Flags set in the 'flags' member of the multiboot header. */
|
||||||
|
|
||||||
|
/* Align all boot modules on i386 page (4KB) boundaries. */
|
||||||
|
#define MULTIBOOT_PAGE_ALIGN 0x00000001
|
||||||
|
|
||||||
|
/* Must pass memory information to OS. */
|
||||||
|
#define MULTIBOOT_MEMORY_INFO 0x00000002
|
||||||
|
|
||||||
|
/* Must pass video information to OS. */
|
||||||
|
#define MULTIBOOT_VIDEO_MODE 0x00000004
|
||||||
|
|
||||||
|
/* This flag indicates the use of the address fields in the header. */
|
||||||
|
#define MULTIBOOT_AOUT_KLUDGE 0x00010000
|
||||||
|
|
||||||
|
/* Flags to be set in the 'flags' member of the multiboot info structure. */
|
||||||
|
|
||||||
|
/* is there basic lower/upper memory information? */
|
||||||
|
#define MULTIBOOT_INFO_MEMORY 0x00000001
|
||||||
|
/* is there a boot device set? */
|
||||||
|
#define MULTIBOOT_INFO_BOOTDEV 0x00000002
|
||||||
|
/* is the command-line defined? */
|
||||||
|
#define MULTIBOOT_INFO_CMDLINE 0x00000004
|
||||||
|
/* are there modules to do something with? */
|
||||||
|
#define MULTIBOOT_INFO_MODS 0x00000008
|
||||||
|
|
||||||
|
/* These next two are mutually exclusive */
|
||||||
|
|
||||||
|
/* is there a symbol table loaded? */
|
||||||
|
#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010
|
||||||
|
/* is there an ELF section header table? */
|
||||||
|
#define MULTIBOOT_INFO_ELF_SHDR 0X00000020
|
||||||
|
|
||||||
|
/* is there a full memory map? */
|
||||||
|
#define MULTIBOOT_INFO_MEM_MAP 0x00000040
|
||||||
|
|
||||||
|
/* Is there drive info? */
|
||||||
|
#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080
|
||||||
|
|
||||||
|
/* Is there a config table? */
|
||||||
|
#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100
|
||||||
|
|
||||||
|
/* Is there a boot loader name? */
|
||||||
|
#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200
|
||||||
|
|
||||||
|
/* Is there a APM table? */
|
||||||
|
#define MULTIBOOT_INFO_APM_TABLE 0x00000400
|
||||||
|
|
||||||
|
/* Is there video information? */
|
||||||
|
#define MULTIBOOT_INFO_VBE_INFO 0x00000800
|
||||||
|
#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
|
typedef unsigned char multiboot_uint8_t;
|
||||||
|
typedef unsigned short multiboot_uint16_t;
|
||||||
|
typedef unsigned int multiboot_uint32_t;
|
||||||
|
typedef unsigned long long multiboot_uint64_t;
|
||||||
|
|
||||||
|
struct multiboot_header {
|
||||||
|
/* Must be MULTIBOOT_MAGIC - see above. */
|
||||||
|
multiboot_uint32_t magic;
|
||||||
|
|
||||||
|
/* Feature flags. */
|
||||||
|
multiboot_uint32_t flags;
|
||||||
|
|
||||||
|
/* The above fields plus this one must equal 0 mod 2^32. */
|
||||||
|
multiboot_uint32_t checksum;
|
||||||
|
|
||||||
|
/* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */
|
||||||
|
multiboot_uint32_t header_addr;
|
||||||
|
multiboot_uint32_t load_addr;
|
||||||
|
multiboot_uint32_t load_end_addr;
|
||||||
|
multiboot_uint32_t bss_end_addr;
|
||||||
|
multiboot_uint32_t entry_addr;
|
||||||
|
|
||||||
|
/* These are only valid if MULTIBOOT_VIDEO_MODE is set. */
|
||||||
|
multiboot_uint32_t mode_type;
|
||||||
|
multiboot_uint32_t width;
|
||||||
|
multiboot_uint32_t height;
|
||||||
|
multiboot_uint32_t depth;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The symbol table for a.out. */
|
||||||
|
struct multiboot_aout_symbol_table {
|
||||||
|
multiboot_uint32_t tabsize;
|
||||||
|
multiboot_uint32_t strsize;
|
||||||
|
multiboot_uint32_t addr;
|
||||||
|
multiboot_uint32_t reserved;
|
||||||
|
};
|
||||||
|
typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
|
||||||
|
|
||||||
|
/* The section header table for ELF. */
|
||||||
|
struct multiboot_elf_section_header_table {
|
||||||
|
multiboot_uint32_t num;
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint32_t addr;
|
||||||
|
multiboot_uint32_t shndx;
|
||||||
|
};
|
||||||
|
typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
|
||||||
|
|
||||||
|
struct multiboot_info {
|
||||||
|
/* Multiboot info version number */
|
||||||
|
multiboot_uint32_t flags;
|
||||||
|
|
||||||
|
/* Available memory from BIOS */
|
||||||
|
multiboot_uint32_t mem_lower;
|
||||||
|
multiboot_uint32_t mem_upper;
|
||||||
|
|
||||||
|
/* "root" partition */
|
||||||
|
multiboot_uint32_t boot_device;
|
||||||
|
|
||||||
|
/* Kernel command line */
|
||||||
|
multiboot_uint32_t cmdline;
|
||||||
|
|
||||||
|
/* Boot-Module list */
|
||||||
|
multiboot_uint32_t mods_count;
|
||||||
|
multiboot_uint32_t mods_addr;
|
||||||
|
|
||||||
|
union {
|
||||||
|
multiboot_aout_symbol_table_t aout_sym;
|
||||||
|
multiboot_elf_section_header_table_t elf_sec;
|
||||||
|
} u;
|
||||||
|
|
||||||
|
/* Memory Mapping buffer */
|
||||||
|
multiboot_uint32_t mmap_length;
|
||||||
|
multiboot_uint32_t mmap_addr;
|
||||||
|
|
||||||
|
/* Drive Info buffer */
|
||||||
|
multiboot_uint32_t drives_length;
|
||||||
|
multiboot_uint32_t drives_addr;
|
||||||
|
|
||||||
|
/* ROM configuration table */
|
||||||
|
multiboot_uint32_t config_table;
|
||||||
|
|
||||||
|
/* Boot Loader Name */
|
||||||
|
multiboot_uint32_t boot_loader_name;
|
||||||
|
|
||||||
|
/* APM table */
|
||||||
|
multiboot_uint32_t apm_table;
|
||||||
|
|
||||||
|
/* Video */
|
||||||
|
multiboot_uint32_t vbe_control_info;
|
||||||
|
multiboot_uint32_t vbe_mode_info;
|
||||||
|
multiboot_uint16_t vbe_mode;
|
||||||
|
multiboot_uint16_t vbe_interface_seg;
|
||||||
|
multiboot_uint16_t vbe_interface_off;
|
||||||
|
multiboot_uint16_t vbe_interface_len;
|
||||||
|
|
||||||
|
multiboot_uint64_t framebuffer_addr;
|
||||||
|
multiboot_uint32_t framebuffer_pitch;
|
||||||
|
multiboot_uint32_t framebuffer_width;
|
||||||
|
multiboot_uint32_t framebuffer_height;
|
||||||
|
multiboot_uint8_t framebuffer_bpp;
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
|
||||||
|
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
|
||||||
|
multiboot_uint8_t framebuffer_type;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
multiboot_uint32_t framebuffer_palette_addr;
|
||||||
|
multiboot_uint16_t framebuffer_palette_num_colors;
|
||||||
|
};
|
||||||
|
struct {
|
||||||
|
multiboot_uint8_t framebuffer_red_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_red_mask_size;
|
||||||
|
multiboot_uint8_t framebuffer_green_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_green_mask_size;
|
||||||
|
multiboot_uint8_t framebuffer_blue_field_position;
|
||||||
|
multiboot_uint8_t framebuffer_blue_mask_size;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
typedef struct multiboot_info multiboot_info_t;
|
||||||
|
|
||||||
|
struct multiboot_color {
|
||||||
|
multiboot_uint8_t red;
|
||||||
|
multiboot_uint8_t green;
|
||||||
|
multiboot_uint8_t blue;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct multiboot_mmap_entry {
|
||||||
|
multiboot_uint32_t size;
|
||||||
|
multiboot_uint64_t addr;
|
||||||
|
multiboot_uint64_t len;
|
||||||
|
#define MULTIBOOT_MEMORY_AVAILABLE 1
|
||||||
|
#define MULTIBOOT_MEMORY_RESERVED 2
|
||||||
|
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
|
||||||
|
#define MULTIBOOT_MEMORY_NVS 4
|
||||||
|
#define MULTIBOOT_MEMORY_BADRAM 5
|
||||||
|
multiboot_uint32_t type;
|
||||||
|
} __attribute__((packed));
|
||||||
|
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
|
||||||
|
|
||||||
|
struct multiboot_mod_list {
|
||||||
|
/* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */
|
||||||
|
multiboot_uint32_t mod_start;
|
||||||
|
multiboot_uint32_t mod_end;
|
||||||
|
|
||||||
|
/* Module command line */
|
||||||
|
multiboot_uint32_t cmdline;
|
||||||
|
|
||||||
|
/* padding to take it to 16 bytes (must be zero) */
|
||||||
|
multiboot_uint32_t pad;
|
||||||
|
};
|
||||||
|
typedef struct multiboot_mod_list multiboot_module_t;
|
||||||
|
|
||||||
|
/* APM BIOS info. */
|
||||||
|
struct multiboot_apm_info {
|
||||||
|
multiboot_uint16_t version;
|
||||||
|
multiboot_uint16_t cseg;
|
||||||
|
multiboot_uint32_t offset;
|
||||||
|
multiboot_uint16_t cseg_16;
|
||||||
|
multiboot_uint16_t dseg;
|
||||||
|
multiboot_uint16_t flags;
|
||||||
|
multiboot_uint16_t cseg_len;
|
||||||
|
multiboot_uint16_t cseg_16_len;
|
||||||
|
multiboot_uint16_t dseg_len;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* ! ASM_FILE */
|
||||||
|
|
||||||
|
#endif /* ! MULTIBOOT_HEADER */
|
57
libs/libc/Makefile
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
|
LIB = libc.a
|
||||||
|
OBJS = \
|
||||||
|
memchr.o \
|
||||||
|
memcmp.o \
|
||||||
|
memcpy.o \
|
||||||
|
memmove.o \
|
||||||
|
memset.o \
|
||||||
|
printf.o \
|
||||||
|
puts.o \
|
||||||
|
strcasecmp.o \
|
||||||
|
strcat.o \
|
||||||
|
strcmp.o \
|
||||||
|
strcpy.o \
|
||||||
|
strlen.o \
|
||||||
|
strncasecmp.o \
|
||||||
|
strncmp.o \
|
||||||
|
strncpy.o \
|
||||||
|
strnlen.o \
|
||||||
|
|
||||||
|
DEPS = $(OBJS:.o=.d)
|
||||||
|
|
||||||
|
$(OBJS): CPPFLAGS += -MMD -Iinclude -I../../k/include/
|
||||||
|
|
||||||
|
all: $(LIB)
|
||||||
|
|
||||||
|
$(LIB): $(OBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $^
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(OBJS) $(DEPS) $(LIB)
|
||||||
|
|
||||||
|
-include $(DEPS)
|
47
libs/libc/include/assert.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef ASSERT_H
|
||||||
|
#define ASSERT_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define assert(exp) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
if (!(exp)) \
|
||||||
|
{ \
|
||||||
|
printf("%s, %d: assertion '%s' failed\n", \
|
||||||
|
__BASE_FILE__, __LINE__, exp); \
|
||||||
|
printf("System halted.\n"); \
|
||||||
|
while (1) \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
#else
|
||||||
|
#define assert(exp) ((void) 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !ASSERT_H */
|
41
libs/libc/include/ctype.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef CTYPE_H_
|
||||||
|
#define CTYPE_H_
|
||||||
|
|
||||||
|
static inline int tolower(int c)
|
||||||
|
{
|
||||||
|
if (c >= 'A' && c <= 'Z')
|
||||||
|
return c + ('a' - 'A');
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int toupper(int c)
|
||||||
|
{
|
||||||
|
if (c >= 'a' && c <= 'z')
|
||||||
|
return c - ('a' - 'A');
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !CTYPE_H_ */
|
27
libs/libc/include/limits.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef LIMITS_H_
|
||||||
|
#define LIMITS_H_
|
||||||
|
|
||||||
|
#if '\0'-1 > 0
|
||||||
|
#define CHAR_MIN 0
|
||||||
|
#define CHAR_MAX 255
|
||||||
|
#else
|
||||||
|
#define CHAR_MIN (-128)
|
||||||
|
#define CHAR_MAX 127
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CHAR_BIT 8
|
||||||
|
#define SCHAR_MIN (-128)
|
||||||
|
#define SCHAR_MAX 127
|
||||||
|
#define UCHAR_MAX 255
|
||||||
|
#define SHRT_MIN (-1-0x7fff)
|
||||||
|
#define SHRT_MAX 0x7fff
|
||||||
|
#define USHRT_MAX 0xffff
|
||||||
|
#define INT_MIN (-1-0x7fffffff)
|
||||||
|
#define INT_MAX 0x7fffffff
|
||||||
|
#define UINT_MAX 0xffffffffU
|
||||||
|
#define LONG_MIN (-LONG_MAX-1)
|
||||||
|
#define ULONG_MAX (2UL*LONG_MAX+1)
|
||||||
|
#define LLONG_MIN (-LLONG_MAX-1)
|
||||||
|
#define ULLONG_MAX (2ULL*LLONG_MAX+1)
|
||||||
|
|
||||||
|
#endif /* !LIMITS_H_ */
|
34
libs/libc/include/stdio.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef STDIO_H_
|
||||||
|
#define STDIO_H_
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int puts(const char *s);
|
||||||
|
int printf(const char *format, ...);
|
||||||
|
int sprintf(char *buf, const char *format, ...);
|
||||||
|
int vsprintf(char *buf, const char *format, va_list args);
|
||||||
|
|
||||||
|
#endif /* !STDLIB_H_ */
|
45
libs/libc/include/string.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef STRING_H_
|
||||||
|
#define STRING_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *memchr(const void *s, int c, size_t n);
|
||||||
|
int memcmp(const void *s1, const void *s2, size_t n);
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n);
|
||||||
|
void *memmove(void *dest, const void *src, size_t n);
|
||||||
|
void *memset(void *s, int c, size_t n);
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strcat(char *dest, const char *src);
|
||||||
|
int strcmp(const char *s1, const char *s2);
|
||||||
|
char *strcpy(char *dest, const char *src);
|
||||||
|
char *strdup(const char *s);
|
||||||
|
size_t strlen(const char *s);
|
||||||
|
size_t strnlen(const char *s, size_t maxlen);
|
||||||
|
int strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strncpy(char *dest, const char *src, size_t n);
|
||||||
|
|
||||||
|
#endif /* !STRING_H_ */
|
12
libs/libc/memchr.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *memchr(const void *s, int c, size_t n)
|
||||||
|
{
|
||||||
|
const char *data = s;
|
||||||
|
|
||||||
|
while (n--)
|
||||||
|
if (*data++ == (char)c)
|
||||||
|
return (void *)(data - 1);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
13
libs/libc/memcmp.c
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int memcmp(const void *s1, const void *s2, size_t n)
|
||||||
|
{
|
||||||
|
const char *d1 = s1;
|
||||||
|
const char *d2 = s2;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; ++i)
|
||||||
|
if (d1[i] != d2[i])
|
||||||
|
return d1[i] - d2[i];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
12
libs/libc/memcpy.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n)
|
||||||
|
{
|
||||||
|
const char *s = src;
|
||||||
|
char *d = dest;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; i++)
|
||||||
|
*d++ = *s++;
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
16
libs/libc/memmove.c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void *memmove(void *dest, const void *src, size_t n)
|
||||||
|
{
|
||||||
|
char *d = dest;
|
||||||
|
const char *s = src;
|
||||||
|
|
||||||
|
if (s < d && s + n > d) {
|
||||||
|
while (n-- > 0)
|
||||||
|
d[n - 1] = s[n - 1];
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
return memcpy(dest, src, n);
|
||||||
|
}
|
11
libs/libc/memset.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void *memset(void *s, int c, size_t n)
|
||||||
|
{
|
||||||
|
char *p = s;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; ++i)
|
||||||
|
p[i] = c;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
318
libs/libc/printf.c
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
/* -*- linux-c -*- ------------------------------------------------------- *
|
||||||
|
*
|
||||||
|
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||||
|
* Copyright 2007 rPath, Inc. - All Rights Reserved
|
||||||
|
*
|
||||||
|
* This file is part of the Linux kernel, and is made available under
|
||||||
|
* the terms of the GNU General Public License version 2.
|
||||||
|
*
|
||||||
|
* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Oh, it's a waste of space, but oh-so-yummy for debugging. This
|
||||||
|
* version of printf() does not include 64-bit support. "Live with
|
||||||
|
* it."
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static inline int isdigit(int c)
|
||||||
|
{
|
||||||
|
return c >= '0' && c <= '9';
|
||||||
|
}
|
||||||
|
|
||||||
|
static int skip_atoi(const char **s)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (isdigit(**s))
|
||||||
|
i = i * 10 + *((*s)++) - '0';
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ZEROPAD 1 /* pad with zero */
|
||||||
|
#define SIGN 2 /* unsigned/signed long */
|
||||||
|
#define PLUS 4 /* show plus */
|
||||||
|
#define SPACE 8 /* space if plus */
|
||||||
|
#define LEFT 16 /* left justified */
|
||||||
|
#define SMALL 32 /* Must be 32 == 0x20 */
|
||||||
|
#define SPECIAL 64 /* 0x */
|
||||||
|
|
||||||
|
#define __do_div(n, base) ({ \
|
||||||
|
int __res; \
|
||||||
|
__res = ((unsigned long) n) % (unsigned) base; \
|
||||||
|
n = ((unsigned long) n) / (unsigned) base; \
|
||||||
|
__res; })
|
||||||
|
|
||||||
|
static char *number(char *str, long num, int base, int size, int precision,
|
||||||
|
int type)
|
||||||
|
{
|
||||||
|
/* we are called with base 8, 10 or 16, only, thus don't need "G..." */
|
||||||
|
static const char digits[16] = "0123456789ABCDEF"; /* "GHIJKLMNOPQRSTUVWXYZ"; */
|
||||||
|
|
||||||
|
char tmp[66];
|
||||||
|
char c, sign, locase;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* locase = 0 or 0x20. ORing digits or letters with 'locase'
|
||||||
|
* produces same digits or (maybe lowercased) letters */
|
||||||
|
locase = (type & SMALL);
|
||||||
|
if (type & LEFT)
|
||||||
|
type &= ~ZEROPAD;
|
||||||
|
if (base < 2 || base > 16)
|
||||||
|
return NULL;
|
||||||
|
c = (type & ZEROPAD) ? '0' : ' ';
|
||||||
|
sign = 0;
|
||||||
|
if (type & SIGN) {
|
||||||
|
if (num < 0) {
|
||||||
|
sign = '-';
|
||||||
|
num = -num;
|
||||||
|
size--;
|
||||||
|
} else if (type & PLUS) {
|
||||||
|
sign = '+';
|
||||||
|
size--;
|
||||||
|
} else if (type & SPACE) {
|
||||||
|
sign = ' ';
|
||||||
|
size--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (type & SPECIAL) {
|
||||||
|
if (base == 16)
|
||||||
|
size -= 2;
|
||||||
|
else if (base == 8)
|
||||||
|
size--;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
if (num == 0)
|
||||||
|
tmp[i++] = '0';
|
||||||
|
else
|
||||||
|
while (num != 0)
|
||||||
|
tmp[i++] = (digits[__do_div(num, base)] | locase);
|
||||||
|
if (i > precision)
|
||||||
|
precision = i;
|
||||||
|
size -= precision;
|
||||||
|
if (!(type & (ZEROPAD + LEFT)))
|
||||||
|
while (size-- > 0)
|
||||||
|
*str++ = ' ';
|
||||||
|
if (sign)
|
||||||
|
*str++ = sign;
|
||||||
|
if (type & SPECIAL) {
|
||||||
|
if (base == 8)
|
||||||
|
*str++ = '0';
|
||||||
|
else if (base == 16) {
|
||||||
|
*str++ = '0';
|
||||||
|
*str++ = ('X' | locase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(type & LEFT))
|
||||||
|
while (size-- > 0)
|
||||||
|
*str++ = c;
|
||||||
|
while (i < precision--)
|
||||||
|
*str++ = '0';
|
||||||
|
while (i-- > 0)
|
||||||
|
*str++ = tmp[i];
|
||||||
|
while (size-- > 0)
|
||||||
|
*str++ = ' ';
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
int vsprintf(char *buf, const char *fmt, va_list args)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
unsigned long num;
|
||||||
|
int i, base;
|
||||||
|
char *str;
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
int flags; /* flags to number() */
|
||||||
|
|
||||||
|
int field_width; /* width of output field */
|
||||||
|
int precision; /* min. # of digits for integers; max
|
||||||
|
number of chars for from string */
|
||||||
|
int qualifier; /* 'h', 'l', or 'L' for integer fields */
|
||||||
|
|
||||||
|
for (str = buf; *fmt; ++fmt) {
|
||||||
|
if (*fmt != '%') {
|
||||||
|
*str++ = *fmt;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* process flags */
|
||||||
|
flags = 0;
|
||||||
|
repeat:
|
||||||
|
++fmt; /* this also skips first '%' */
|
||||||
|
switch (*fmt) {
|
||||||
|
case '-':
|
||||||
|
flags |= LEFT;
|
||||||
|
goto repeat;
|
||||||
|
case '+':
|
||||||
|
flags |= PLUS;
|
||||||
|
goto repeat;
|
||||||
|
case ' ':
|
||||||
|
flags |= SPACE;
|
||||||
|
goto repeat;
|
||||||
|
case '#':
|
||||||
|
flags |= SPECIAL;
|
||||||
|
goto repeat;
|
||||||
|
case '0':
|
||||||
|
flags |= ZEROPAD;
|
||||||
|
goto repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get field width */
|
||||||
|
field_width = -1;
|
||||||
|
if (isdigit(*fmt))
|
||||||
|
field_width = skip_atoi(&fmt);
|
||||||
|
else if (*fmt == '*') {
|
||||||
|
++fmt;
|
||||||
|
/* it's the next argument */
|
||||||
|
field_width = va_arg(args, int);
|
||||||
|
if (field_width < 0) {
|
||||||
|
field_width = -field_width;
|
||||||
|
flags |= LEFT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the precision */
|
||||||
|
precision = -1;
|
||||||
|
if (*fmt == '.') {
|
||||||
|
++fmt;
|
||||||
|
if (isdigit(*fmt))
|
||||||
|
precision = skip_atoi(&fmt);
|
||||||
|
else if (*fmt == '*') {
|
||||||
|
++fmt;
|
||||||
|
/* it's the next argument */
|
||||||
|
precision = va_arg(args, int);
|
||||||
|
}
|
||||||
|
if (precision < 0)
|
||||||
|
precision = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the conversion qualifier */
|
||||||
|
qualifier = -1;
|
||||||
|
if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
|
||||||
|
qualifier = *fmt;
|
||||||
|
++fmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* default base */
|
||||||
|
base = 10;
|
||||||
|
|
||||||
|
switch (*fmt) {
|
||||||
|
case 'c':
|
||||||
|
if (!(flags & LEFT))
|
||||||
|
while (--field_width > 0)
|
||||||
|
*str++ = ' ';
|
||||||
|
*str++ = (unsigned char)va_arg(args, int);
|
||||||
|
while (--field_width > 0)
|
||||||
|
*str++ = ' ';
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
s = va_arg(args, char *);
|
||||||
|
len = strnlen(s, precision);
|
||||||
|
|
||||||
|
if (!(flags & LEFT))
|
||||||
|
while (len < field_width--)
|
||||||
|
*str++ = ' ';
|
||||||
|
for (i = 0; i < len; ++i)
|
||||||
|
*str++ = *s++;
|
||||||
|
while (len < field_width--)
|
||||||
|
*str++ = ' ';
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'p':
|
||||||
|
if (field_width == -1) {
|
||||||
|
field_width = 2 * sizeof(void *);
|
||||||
|
flags |= ZEROPAD;
|
||||||
|
}
|
||||||
|
str = number(str,
|
||||||
|
(unsigned long)va_arg(args, void *), 16,
|
||||||
|
field_width, precision, flags);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
if (qualifier == 'l') {
|
||||||
|
long *ip = va_arg(args, long *);
|
||||||
|
*ip = (str - buf);
|
||||||
|
} else {
|
||||||
|
int *ip = va_arg(args, int *);
|
||||||
|
*ip = (str - buf);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case '%':
|
||||||
|
*str++ = '%';
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* integer number formats - set up the flags and "break" */
|
||||||
|
case 'o':
|
||||||
|
base = 8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'x':
|
||||||
|
flags |= SMALL;
|
||||||
|
/* Falls through. */
|
||||||
|
case 'X':
|
||||||
|
base = 16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
case 'i':
|
||||||
|
flags |= SIGN;
|
||||||
|
case 'u':
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
*str++ = '%';
|
||||||
|
if (*fmt)
|
||||||
|
*str++ = *fmt;
|
||||||
|
else
|
||||||
|
--fmt;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (qualifier == 'l')
|
||||||
|
num = va_arg(args, unsigned long);
|
||||||
|
else if (qualifier == 'h') {
|
||||||
|
num = (unsigned short)va_arg(args, int);
|
||||||
|
if (flags & SIGN)
|
||||||
|
num = (short)num;
|
||||||
|
} else if (flags & SIGN)
|
||||||
|
num = va_arg(args, int);
|
||||||
|
else
|
||||||
|
num = va_arg(args, unsigned int);
|
||||||
|
str = number(str, num, base, field_width, precision, flags);
|
||||||
|
}
|
||||||
|
*str = '\0';
|
||||||
|
return str - buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sprintf(char *buf, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
i = vsprintf(buf, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int printf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
char printf_buf[1024];
|
||||||
|
va_list args;
|
||||||
|
int printed;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
printed = vsprintf(printf_buf, fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
puts(printf_buf);
|
||||||
|
|
||||||
|
return printed;
|
||||||
|
}
|
8
libs/libc/puts.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int write(const char *s, size_t nb);
|
||||||
|
|
||||||
|
int puts(const char *s)
|
||||||
|
{
|
||||||
|
return write(s, strlen(s));
|
||||||
|
}
|
10
libs/libc/strcasecmp.c
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int strcasecmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
for (; *s1; s1++, s2++)
|
||||||
|
if (tolower(*s1) != tolower(*s2))
|
||||||
|
break;
|
||||||
|
|
||||||
|
return tolower(*s1) - tolower(*s2);
|
||||||
|
}
|
6
libs/libc/strcat.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
char *strcat(char *dest, const char *src)
|
||||||
|
{
|
||||||
|
return strcpy(dest + strlen(dest), src);
|
||||||
|
}
|
10
libs/libc/strcmp.c
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int strcmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
for (; *s1 == *s2 && *s1 != '\0'; s1++, s2++)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return *s1 - *s2;
|
||||||
|
}
|
||||||
|
|
13
libs/libc/strcpy.c
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
char *strcpy(char *dest, const char *src)
|
||||||
|
{
|
||||||
|
char *p = dest;
|
||||||
|
|
||||||
|
while (*src)
|
||||||
|
*p++ = *src++;
|
||||||
|
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
12
libs/libc/strlen.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
size_t strlen(const char *s)
|
||||||
|
{
|
||||||
|
const char *p = s;
|
||||||
|
|
||||||
|
while (*p)
|
||||||
|
p++;
|
||||||
|
|
||||||
|
return (p - s);
|
||||||
|
}
|
11
libs/libc/strncasecmp.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include <stddef.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n)
|
||||||
|
{
|
||||||
|
for (; *s1 && n > 0; s1++, s2++, n--)
|
||||||
|
if (tolower(*s1) != tolower(*s2))
|
||||||
|
break;
|
||||||
|
|
||||||
|
return n ? tolower(*s1) - tolower(*s2) : 0;
|
||||||
|
}
|
9
libs/libc/strncmp.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int strncmp(const char *s1, const char *s2, size_t n)
|
||||||
|
{
|
||||||
|
for (; *s1 == *s2 && *s1 != '\0' && n > 0; s1++, s2++, n--)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return n ? *s1 - *s2 : 0;
|
||||||
|
}
|
13
libs/libc/strncpy.c
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
char *strncpy(char *dest, const char *src, size_t n)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < n && src[i] != '\0'; ++i)
|
||||||
|
dest[i] = src[i];
|
||||||
|
memset(dest + i, '\0', n - i);
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
10
libs/libc/strnlen.c
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
size_t strnlen(const char *s, size_t maxlen)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
for (; i < maxlen; ++i)
|
||||||
|
if (!s[i])
|
||||||
|
return i;
|
||||||
|
return i;
|
||||||
|
}
|
47
libs/libk/Makefile
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
|
LIB = libk.a
|
||||||
|
OBJS = \
|
||||||
|
graphic.o \
|
||||||
|
malloc.o \
|
||||||
|
sound.o \
|
||||||
|
strdup.o \
|
||||||
|
syscalls.o \
|
||||||
|
|
||||||
|
DEPS = $(OBJS:.o=.d)
|
||||||
|
|
||||||
|
$(OBJS): CPPFLAGS += -MMD -Iinclude -I../../k/include/ -I../libc/include/
|
||||||
|
malloc.o: CPPFLAGS += -include malloc-k.h
|
||||||
|
|
||||||
|
all: $(LIB)
|
||||||
|
|
||||||
|
$(LIB): $(OBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $^
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(OBJS) $(DEPS) $(LIB)
|
||||||
|
|
||||||
|
-include $(DEPS)
|
706
libs/libk/graphic.c
Normal file
@ -0,0 +1,706 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <graphic.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* offscreen buffer (for double buffering).
|
||||||
|
*/
|
||||||
|
|
||||||
|
static unsigned char offbuffer[FB_SIZE];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the font is composed of 8*8 characters.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static unsigned char font[2048] = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
|
||||||
|
0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
|
||||||
|
0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
|
||||||
|
0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
|
||||||
|
0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
|
||||||
|
0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
|
||||||
|
0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
|
||||||
|
0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
|
||||||
|
0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
|
||||||
|
0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
|
||||||
|
0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
|
||||||
|
0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
|
||||||
|
0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
|
||||||
|
0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
|
||||||
|
0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
|
||||||
|
0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
|
||||||
|
0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
|
||||||
|
0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
|
||||||
|
0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
|
||||||
|
0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
|
||||||
|
0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
|
||||||
|
0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
|
||||||
|
0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
|
||||||
|
0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
|
||||||
|
0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
|
||||||
|
0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
|
||||||
|
0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
|
||||||
|
0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
|
||||||
|
0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
|
||||||
|
0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
|
||||||
|
0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
|
||||||
|
0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
|
||||||
|
0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
|
||||||
|
0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
|
||||||
|
0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
|
||||||
|
0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
|
||||||
|
0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
|
||||||
|
0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
|
||||||
|
0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
|
||||||
|
0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
|
||||||
|
0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
|
||||||
|
0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
|
||||||
|
0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
|
||||||
|
0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
|
||||||
|
0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
|
||||||
|
0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
|
||||||
|
0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
|
||||||
|
0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
|
||||||
|
0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
|
||||||
|
0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
|
||||||
|
0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
|
||||||
|
0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
|
||||||
|
0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
|
||||||
|
0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
|
||||||
|
0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
|
||||||
|
0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
|
||||||
|
0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
|
||||||
|
0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
|
||||||
|
0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
|
||||||
|
0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
|
||||||
|
0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
|
||||||
|
0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
|
||||||
|
0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
|
||||||
|
0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
|
||||||
|
0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
|
||||||
|
0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
|
||||||
|
0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
|
||||||
|
0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
|
||||||
|
0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
|
||||||
|
0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
|
||||||
|
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
|
||||||
|
0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
|
||||||
|
0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
|
||||||
|
0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
|
||||||
|
0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
|
||||||
|
0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
|
||||||
|
0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
|
||||||
|
0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
|
||||||
|
0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||||
|
0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
|
||||||
|
0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
|
||||||
|
0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
|
||||||
|
0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
|
||||||
|
0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
|
||||||
|
0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
|
||||||
|
0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
|
||||||
|
0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
|
||||||
|
0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
|
||||||
|
0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
|
||||||
|
0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
|
||||||
|
0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
|
||||||
|
0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
|
||||||
|
0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
|
||||||
|
0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
|
||||||
|
0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
|
||||||
|
0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||||
|
0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
|
||||||
|
0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
|
||||||
|
0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
|
||||||
|
0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
|
||||||
|
0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
|
||||||
|
0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
|
||||||
|
0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
|
||||||
|
0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
|
||||||
|
0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
|
||||||
|
0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
|
||||||
|
0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||||
|
0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
|
||||||
|
0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
|
||||||
|
0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||||
|
0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||||
|
0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||||
|
0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
|
||||||
|
0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
|
||||||
|
0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
|
||||||
|
0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
|
||||||
|
0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
|
||||||
|
0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
|
||||||
|
0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
|
||||||
|
0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
|
||||||
|
0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
|
||||||
|
0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
|
||||||
|
0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||||
|
0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||||
|
0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
|
||||||
|
0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
|
||||||
|
0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
|
||||||
|
0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
|
||||||
|
0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
|
||||||
|
0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
|
||||||
|
0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
|
||||||
|
0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
|
||||||
|
0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
|
||||||
|
0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
|
||||||
|
0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
|
||||||
|
0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
|
||||||
|
0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
|
||||||
|
0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
|
||||||
|
0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
|
||||||
|
0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
|
||||||
|
0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
|
||||||
|
0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
|
||||||
|
0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
|
||||||
|
0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
|
||||||
|
0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
|
||||||
|
0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
|
||||||
|
0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
|
||||||
|
0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
|
||||||
|
0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
|
||||||
|
0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
|
||||||
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
||||||
|
0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
|
||||||
|
0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
|
||||||
|
0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
|
||||||
|
0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
|
||||||
|
0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
|
||||||
|
0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
|
||||||
|
0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
|
||||||
|
0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
|
||||||
|
0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
|
||||||
|
0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
|
||||||
|
0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
|
||||||
|
0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||||
|
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
|
||||||
|
0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
|
||||||
|
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
|
||||||
|
0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
|
||||||
|
0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
|
||||||
|
0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
|
||||||
|
0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
|
||||||
|
0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
|
||||||
|
0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
|
||||||
|
0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
|
||||||
|
0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
|
||||||
|
0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
|
||||||
|
0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
|
||||||
|
0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
|
||||||
|
0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
|
||||||
|
0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
|
||||||
|
0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
|
||||||
|
0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
|
||||||
|
0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
|
||||||
|
0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
|
||||||
|
0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
|
||||||
|
0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
|
||||||
|
0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
|
||||||
|
0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
|
||||||
|
0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
|
||||||
|
0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
|
||||||
|
0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
|
||||||
|
0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
void draw_begin(void)
|
||||||
|
{
|
||||||
|
draw_clear(CONS_BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_end(void)
|
||||||
|
{
|
||||||
|
swap_frontbuffer(offbuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_clear(color_t color)
|
||||||
|
{
|
||||||
|
memset(offbuffer, color, FB_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_pixel(unsigned int x, unsigned int y, color_t color)
|
||||||
|
{
|
||||||
|
if (x >= GRAPHIC_WIDTH)
|
||||||
|
return;
|
||||||
|
if (y >= GRAPHIC_HEIGHT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
offbuffer[y * GRAPHIC_WIDTH + x] = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_line(unsigned int x1, unsigned int y1,
|
||||||
|
unsigned int x2, unsigned int y2, color_t color)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (x1 >= GRAPHIC_WIDTH)
|
||||||
|
return;
|
||||||
|
if (y1 >= GRAPHIC_HEIGHT)
|
||||||
|
return;
|
||||||
|
if (x2 >= GRAPHIC_WIDTH)
|
||||||
|
return;
|
||||||
|
if (y2 >= GRAPHIC_HEIGHT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (x1 == x2) {
|
||||||
|
for (i = y1; i < y2; i++)
|
||||||
|
draw_pixel(x1, i, color);
|
||||||
|
} else if (y1 == y2) {
|
||||||
|
for (i = x1; i < x2; i++)
|
||||||
|
draw_pixel(i, y1, color);
|
||||||
|
} else {
|
||||||
|
int s;
|
||||||
|
int steep = abs(y2 - y1) > abs(x2 - x1);
|
||||||
|
if (steep) {
|
||||||
|
s = x1;
|
||||||
|
x1 = y1;
|
||||||
|
y1 = s;
|
||||||
|
s = x2;
|
||||||
|
x2 = y2;
|
||||||
|
y2 = s;
|
||||||
|
}
|
||||||
|
if (x1 > x2) {
|
||||||
|
s = x1;
|
||||||
|
x1 = x2;
|
||||||
|
x2 = s;
|
||||||
|
s = y2;
|
||||||
|
y2 = y1;
|
||||||
|
y1 = s;
|
||||||
|
}
|
||||||
|
int deltax = x2 - x1;
|
||||||
|
int deltay = abs(y2 - y1);
|
||||||
|
int error = -deltax / 2;
|
||||||
|
int ystep;
|
||||||
|
int y = y1;
|
||||||
|
|
||||||
|
if (y1 < y2)
|
||||||
|
ystep = 1;
|
||||||
|
else
|
||||||
|
ystep = -1;
|
||||||
|
unsigned int x;
|
||||||
|
for (x = x1; x < x2; x++) {
|
||||||
|
if (steep)
|
||||||
|
draw_pixel(y, x, color);
|
||||||
|
else
|
||||||
|
draw_pixel(x, y, color);
|
||||||
|
|
||||||
|
error = error + deltay;
|
||||||
|
|
||||||
|
if (error > 0) {
|
||||||
|
y = y + ystep;
|
||||||
|
error = error - deltax;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_rect(unsigned int x1, unsigned int y1,
|
||||||
|
unsigned int x2, unsigned int y2, color_t color)
|
||||||
|
{
|
||||||
|
unsigned int x;
|
||||||
|
unsigned int y;
|
||||||
|
|
||||||
|
for (x = x1; x < x2 && x < GRAPHIC_WIDTH; x++) {
|
||||||
|
draw_pixel(x, y1, color);
|
||||||
|
draw_pixel(x, y2, color);
|
||||||
|
}
|
||||||
|
for (y = y1; y < y2 && y < GRAPHIC_HEIGHT; y++) {
|
||||||
|
draw_pixel(x1, y, color);
|
||||||
|
draw_pixel(x2, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_fillrect(unsigned int x1, unsigned int y1,
|
||||||
|
unsigned int x2, unsigned int y2,
|
||||||
|
color_t color, color_t interior)
|
||||||
|
{
|
||||||
|
unsigned int x;
|
||||||
|
unsigned int y;
|
||||||
|
|
||||||
|
for (x = x1; x < x2 && x < GRAPHIC_WIDTH; x++) {
|
||||||
|
draw_pixel(x, y1, color);
|
||||||
|
draw_pixel(x, y2, color);
|
||||||
|
}
|
||||||
|
for (y = y1; y <= y2 && y < GRAPHIC_HEIGHT; y++) {
|
||||||
|
draw_pixel(x1, y, color);
|
||||||
|
draw_pixel(x2, y, color);
|
||||||
|
}
|
||||||
|
for (x = x1 + 1; x < x2 && x < GRAPHIC_WIDTH; x++)
|
||||||
|
for (y = y1 + 1; y < y2 && y < GRAPHIC_HEIGHT; y++)
|
||||||
|
draw_pixel(x, y, interior);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Windows BMP file header.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct bitmap_header {
|
||||||
|
char signature[2];
|
||||||
|
unsigned long filesize;
|
||||||
|
unsigned long reserved1;
|
||||||
|
unsigned long offset;
|
||||||
|
unsigned long reserved2;
|
||||||
|
unsigned long width;
|
||||||
|
unsigned long height;
|
||||||
|
unsigned short planes;
|
||||||
|
unsigned short bpp;
|
||||||
|
unsigned long reserved3;
|
||||||
|
unsigned long size;
|
||||||
|
char reserved[16];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct image *load_image(const char *path)
|
||||||
|
{
|
||||||
|
struct bitmap_header bmp;
|
||||||
|
|
||||||
|
int fd = open(path, 0);
|
||||||
|
if (fd < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
int rc = read(fd, &bmp, sizeof(bmp));
|
||||||
|
if (rc < (int)sizeof(bmp)) {
|
||||||
|
goto err_img;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(bmp.signature[0] == 'B' && bmp.signature[1] == 'M')) {
|
||||||
|
goto err_img;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct image *img = malloc(sizeof(struct image));
|
||||||
|
if (!img) {
|
||||||
|
goto err_img;
|
||||||
|
}
|
||||||
|
|
||||||
|
img->width = bmp.width;
|
||||||
|
img->height = bmp.height;
|
||||||
|
|
||||||
|
img->data = calloc(img->height, sizeof(*img->data));
|
||||||
|
if (!img->data)
|
||||||
|
goto err_buf;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < img->height; i++) {
|
||||||
|
img->data[i] = calloc(img->width, sizeof(*img->data[i]));
|
||||||
|
if (!img->data[i])
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ppl = (bmp.size - (img->width * img->height)) / img->height;
|
||||||
|
|
||||||
|
if (lseek(fd, bmp.offset, SEEK_SET) == (off_t) - 1) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < img->height; i++) {
|
||||||
|
rc = read(fd, img->data[i], img->width);
|
||||||
|
if (rc < (int)img->width)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
rc = lseek(fd, ppl, SEEK_CUR);
|
||||||
|
|
||||||
|
if (rc == (off_t)-1)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return img;
|
||||||
|
|
||||||
|
err:
|
||||||
|
for (unsigned int i = 0; i < img->height; i++)
|
||||||
|
free(img->data[i]);
|
||||||
|
free(img->data);
|
||||||
|
err_buf:
|
||||||
|
free(img);
|
||||||
|
err_img:
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_image( struct image * image)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < image->height; i++)
|
||||||
|
free(image->data[i]);
|
||||||
|
free(image->data);
|
||||||
|
free(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_image_alpha(struct image *image, unsigned int x, unsigned int y, unsigned int alpha)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < image->height; i++)
|
||||||
|
for (unsigned int j = 0; j < image->width; j++) {
|
||||||
|
if ((alpha == (unsigned int)-1) || (alpha != image->data[i][j]))
|
||||||
|
draw_pixel(x + j, y + image->height - i, image->data[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_image(struct image *image, unsigned int x, unsigned int y)
|
||||||
|
{
|
||||||
|
draw_image_alpha(image, x, y, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* used to decompose a byte
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int bit_on(char c, int n)
|
||||||
|
{
|
||||||
|
int mask;
|
||||||
|
|
||||||
|
mask = 1 << (7 - n);
|
||||||
|
return c & mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_text(const char *s, unsigned int x, unsigned int y, color_t fg, color_t bg)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
char ch;
|
||||||
|
char p;
|
||||||
|
unsigned int pos;
|
||||||
|
unsigned int strp = 0;
|
||||||
|
|
||||||
|
for (; *s; s++, strp++) {
|
||||||
|
c = *s;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < 8; ++i) {
|
||||||
|
for (unsigned int j = 0; j < 8; ++j) {
|
||||||
|
ch = font[c * 8 + i];
|
||||||
|
p = bit_on(ch, j) ? fg : bg;
|
||||||
|
|
||||||
|
pos = ((y + i) * GRAPHIC_WIDTH) + (strp * 8 + x) + j;
|
||||||
|
if (!((bg == (unsigned int)-1) && (p == -1)))
|
||||||
|
offbuffer[pos] = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct anim *load_anim(char *paths, int delay)
|
||||||
|
{
|
||||||
|
char *p, *bck;
|
||||||
|
char *filename;
|
||||||
|
struct anim *anim = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!paths || !*paths)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!(anim = malloc(sizeof(struct anim))))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
anim->nr_img = 1;
|
||||||
|
anim->current_img = 0;
|
||||||
|
anim->delay = delay;
|
||||||
|
anim->jiffies = 0;
|
||||||
|
|
||||||
|
for (p = paths; *p; p++)
|
||||||
|
if (*p == ' ')
|
||||||
|
anim->nr_img++;
|
||||||
|
|
||||||
|
if (!(anim->imgs = calloc(anim->nr_img, sizeof(struct image *)))) {
|
||||||
|
free(anim);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(p = strdup(paths))) {
|
||||||
|
free(anim);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
bck = p;
|
||||||
|
|
||||||
|
for (i = 0; i < anim->nr_img; i++) {
|
||||||
|
filename = p;
|
||||||
|
|
||||||
|
while (*p && *p != ' ')
|
||||||
|
p++;
|
||||||
|
|
||||||
|
*p = '\0';
|
||||||
|
p++;
|
||||||
|
|
||||||
|
if (!(anim->imgs[i] = load_image(filename)))
|
||||||
|
blue_screen("failed to load animation");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(bck);
|
||||||
|
return anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_anim(struct anim * anim, int x, int y, unsigned long jiffies)
|
||||||
|
{
|
||||||
|
if (anim->jiffies + anim->delay <= jiffies || anim->jiffies > jiffies) {
|
||||||
|
anim->jiffies = jiffies;
|
||||||
|
anim->current_img = (anim->current_img + 1) % anim->nr_img;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_image_alpha(anim->imgs[anim->current_img], x, y, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void blue_screen_cons(const char *message)
|
||||||
|
{
|
||||||
|
char seq[] = {
|
||||||
|
CONS_ESCAPE, CONS_COLOR,
|
||||||
|
CONS_BACK(CONS_BLUE) | CONS_FRONT(CONS_WHITE) | CONS_LIGHT,
|
||||||
|
CONS_ESCAPE, CONS_CLEAR
|
||||||
|
};
|
||||||
|
char fatal[] = {
|
||||||
|
CONS_ESCAPE, CONS_SETX, 32,
|
||||||
|
CONS_ESCAPE, CONS_SETY, 10,
|
||||||
|
CONS_ESCAPE, CONS_COLOR,
|
||||||
|
CONS_BACK(CONS_WHITE) | CONS_FRONT(CONS_BLUE)
|
||||||
|
};
|
||||||
|
char msg[] = {
|
||||||
|
CONS_ESCAPE, CONS_SETX, 0,
|
||||||
|
CONS_ESCAPE, CONS_SETY, 13,
|
||||||
|
CONS_ESCAPE, CONS_COLOR,
|
||||||
|
CONS_BACK(CONS_BLUE) | CONS_FRONT(CONS_WHITE) | CONS_LIGHT
|
||||||
|
};
|
||||||
|
char *chiche1 = "If this is not the first time you encounter";
|
||||||
|
char *chiche2 = "this problem, please contact chiche@epita.fr";
|
||||||
|
|
||||||
|
write(seq, sizeof(seq) / sizeof(char));
|
||||||
|
|
||||||
|
write(fatal, sizeof(fatal) / sizeof(char));
|
||||||
|
printf("K -- FATAL ERROR", fatal);
|
||||||
|
|
||||||
|
msg[2] = 40 - strlen(message) / 2;
|
||||||
|
write(msg, sizeof(msg) / sizeof(char));
|
||||||
|
printf("%s", message);
|
||||||
|
msg[2] = 40 - strlen(chiche1) / 2;
|
||||||
|
msg[5] += 2;
|
||||||
|
write(msg, sizeof(msg) / sizeof(char));
|
||||||
|
printf("%s", chiche1);
|
||||||
|
msg[2] = 40 - strlen(chiche2) / 2;
|
||||||
|
msg[5]++;
|
||||||
|
write(msg, sizeof(msg) / sizeof(char));
|
||||||
|
printf("%s", chiche2);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void blue_screen_fb(const char *message)
|
||||||
|
{
|
||||||
|
draw_begin();
|
||||||
|
draw_clear(CONS_BLUE);
|
||||||
|
|
||||||
|
draw_text("K -- FATAL ERROR", GRAPHIC_WIDTH / 2 - 8 * 8, 60, CONS_BLUE,
|
||||||
|
CONS_WHITE);
|
||||||
|
|
||||||
|
draw_text(message, GRAPHIC_WIDTH / 2 - (strlen(message) / 2) * 8, 90,
|
||||||
|
CONS_WHITE, CONS_BLUE);
|
||||||
|
|
||||||
|
draw_text("If this problem repeats,", GRAPHIC_WIDTH / 2 - 12 * 8, 120,
|
||||||
|
CONS_WHITE, CONS_BLUE);
|
||||||
|
draw_text("Please contact chiche@epita.fr", GRAPHIC_WIDTH / 2 - 15 * 8,
|
||||||
|
130, CONS_WHITE, CONS_BLUE);
|
||||||
|
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void (*blue_screen)(const char *message) = blue_screen_cons;
|
||||||
|
|
||||||
|
void switch_graphic(void)
|
||||||
|
{
|
||||||
|
if (setvideo(VIDEO_GRAPHIC))
|
||||||
|
blue_screen("Unable to switch to graphic mode");
|
||||||
|
blue_screen = blue_screen_fb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void switch_text(void)
|
||||||
|
{
|
||||||
|
if (setvideo(VIDEO_TEXT))
|
||||||
|
blue_screen("Unable to switch to text mode");
|
||||||
|
blue_screen = blue_screen_cons;
|
||||||
|
}
|
194
libs/libk/include/graphic.h
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef GRAPHIC_H_
|
||||||
|
#define GRAPHIC_H_
|
||||||
|
|
||||||
|
#include <kstd.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* this file should really be cleaned :) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* some characteristics about the display.
|
||||||
|
*/
|
||||||
|
#define GRAPHIC_WIDTH 320
|
||||||
|
#define GRAPHIC_HEIGHT 200
|
||||||
|
#define FB_SIZE (GRAPHIC_WIDTH * GRAPHIC_HEIGHT)
|
||||||
|
#define PALETTE_SIZE 256
|
||||||
|
|
||||||
|
/*
|
||||||
|
* image structure. used load_image, clear_image and draw_image to
|
||||||
|
* manipulate images.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct image {
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
unsigned char **data;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* animation structure.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct anim {
|
||||||
|
int nr_img;
|
||||||
|
int current_img;
|
||||||
|
unsigned long delay;
|
||||||
|
unsigned long jiffies;
|
||||||
|
struct image **imgs;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* a color is an index in the palette.
|
||||||
|
*/
|
||||||
|
typedef unsigned int color_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* some colors.
|
||||||
|
*/
|
||||||
|
enum colors {
|
||||||
|
BLACK = 0,
|
||||||
|
WHITE = 255,
|
||||||
|
RED = 249,
|
||||||
|
GREEN = 250,
|
||||||
|
YELLOW = 251,
|
||||||
|
BLUE = 252,
|
||||||
|
PURPLE = 253,
|
||||||
|
AQUA = 254,
|
||||||
|
ORANGE = 23
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this function switches to graphic mode.
|
||||||
|
*/
|
||||||
|
void switch_graphic(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this function get back to text mode.
|
||||||
|
*/
|
||||||
|
void switch_text(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this fumction changes the color palette of the VGA.
|
||||||
|
*/
|
||||||
|
void set_palette(unsigned int *new_palette, size_t size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call this function at the beginning of drawing a frame.
|
||||||
|
*/
|
||||||
|
void draw_begin(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call this function when finished drawing. this is the function that
|
||||||
|
* copy your buffered draw from off-screen buffer to framebuffer.
|
||||||
|
*/
|
||||||
|
void draw_end(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* clears the screen with given color.
|
||||||
|
*/
|
||||||
|
void draw_clear(color_t color);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this function plot a pixel of given color at given position.
|
||||||
|
*/
|
||||||
|
void draw_pixel(unsigned int x, unsigned int y, color_t color);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw a line.
|
||||||
|
*/
|
||||||
|
void draw_line(unsigned int x1, unsigned int y1,
|
||||||
|
unsigned int x2, unsigned int y2, color_t color);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw an empty rectangle.
|
||||||
|
*/
|
||||||
|
void draw_rect(unsigned int x1, unsigned int y1,
|
||||||
|
unsigned int x2, unsigned int y2, color_t color);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw a solid rectangle.
|
||||||
|
*/
|
||||||
|
void draw_fillrect(unsigned int x1, unsigned int y1,
|
||||||
|
unsigned int x2, unsigned int y2,
|
||||||
|
color_t color, color_t interior);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* load a Windows BITMAP (BMP) from file.
|
||||||
|
* the only supported files are 8 bits per pixels paletted.
|
||||||
|
* the only supported palette is the default one (obtained with Paint).
|
||||||
|
*/
|
||||||
|
struct image *load_image(const char *path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* destroy a loaded image.
|
||||||
|
*/
|
||||||
|
void clear_image(struct image *image);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* display a loaded image with transparency.
|
||||||
|
*/
|
||||||
|
void draw_image_alpha(struct image *image,
|
||||||
|
unsigned int x, unsigned int y, unsigned int alpha);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* display a loaded image.
|
||||||
|
*/
|
||||||
|
void draw_image(struct image *image, unsigned int x, unsigned int y);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw some text.
|
||||||
|
*/
|
||||||
|
void draw_text(const char *s,
|
||||||
|
unsigned int x, unsigned int y, color_t fg, color_t bg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* load an animation.
|
||||||
|
* paths is string containing the images name separated by a space.
|
||||||
|
* load_anim supports the same image formats as load_image.
|
||||||
|
* delay is the displaying time of each image (in ticks).
|
||||||
|
*
|
||||||
|
* invocation example: load_anim("pic1 pic2 pic3 pic4 pic5", PIC_ANIM_DELAY);
|
||||||
|
*/
|
||||||
|
struct anim *load_anim(char *paths, int delay);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw an animation at coordinates (x, y)
|
||||||
|
*
|
||||||
|
* jiffies is the reference ticks counter which should
|
||||||
|
* be incremented at every timer tick.
|
||||||
|
*/
|
||||||
|
void draw_anim(struct anim * anim, int x, int y, unsigned long jiffies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* video blue screen.
|
||||||
|
*/
|
||||||
|
extern void (*blue_screen)(const char *message);
|
||||||
|
|
||||||
|
#endif /* !GRAPHIC_H_ */
|
20
libs/libk/include/kstd.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef KSTD_H
|
||||||
|
#define KSTD_H
|
||||||
|
|
||||||
|
#include <k/kstd.h>
|
||||||
|
|
||||||
|
int write(const void *s, size_t length);
|
||||||
|
void *sbrk(ssize_t increment);
|
||||||
|
int getkey(void);
|
||||||
|
unsigned long gettick(void);
|
||||||
|
int open(const char *pathname, int flags);
|
||||||
|
ssize_t read(int fd, void *buf, size_t count);
|
||||||
|
off_t lseek(int filedes, off_t offset, int whence);
|
||||||
|
int close(int fd);
|
||||||
|
int setvideo(int mode);
|
||||||
|
void swap_frontbuffer(const void *buffer);
|
||||||
|
int playsound(struct melody *melody, int repeat);
|
||||||
|
int getmouse(int *x, int *y, int *buttons);
|
||||||
|
int getkeymode(int mode);
|
||||||
|
|
||||||
|
#endif
|
35
libs/libk/include/sound.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef SOUND_H
|
||||||
|
#define SOUND_H
|
||||||
|
|
||||||
|
#include <kstd.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
struct melody *load_sound(const char *path);
|
||||||
|
|
||||||
|
void clear_sound(struct melody *melody);
|
||||||
|
|
||||||
|
#endif /* !SOUND_H_ */
|
42
libs/libk/include/stdlib.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef STDLIB_H_
|
||||||
|
#define STDLIB_H_
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *malloc(size_t size);
|
||||||
|
|
||||||
|
void *realloc(void *ptr, size_t size);
|
||||||
|
|
||||||
|
void free(void *ptr);
|
||||||
|
|
||||||
|
void *calloc(size_t nmemb, size_t size);
|
||||||
|
|
||||||
|
static inline int abs(int j)
|
||||||
|
{
|
||||||
|
return j > 0 ? j : -j;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !STDLIB_H_ */
|
33
libs/libk/malloc-k.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include <k/kstd.h>
|
||||||
|
#include <k/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define HAVE_MMAP 0
|
||||||
|
#define USE_LOCKS 0
|
||||||
|
#define NO_MALLOC_STATS 1
|
||||||
|
|
||||||
|
#define LACKS_TIME_H
|
||||||
|
#define LACKS_UNISTD_H
|
||||||
|
#define LACKS_STDLIB_H
|
||||||
|
#define LACKS_ERRNO_H
|
||||||
|
#define LACKS_SYS_TYPES_H
|
||||||
|
|
||||||
|
#define malloc_getpagesize 4096
|
||||||
|
|
||||||
|
#define MALLOC_FAILURE_ACTION \
|
||||||
|
do { \
|
||||||
|
printf("[!] malloc internal error \n"); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#define USAGE_ERROR_ACTION(m, p) \
|
||||||
|
do { \
|
||||||
|
printf("[!] malloc: corrupted chunk: 0x%x\n", p); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define abort() \
|
||||||
|
do { \
|
||||||
|
printf("[!!!] malloc: abort\n"); \
|
||||||
|
for (;;) \
|
||||||
|
continue; \
|
||||||
|
} while(0)
|
6280
libs/libk/malloc.c
Normal file
80
libs/libk/sound.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <sound.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
struct melody *load_sound(const char *path)
|
||||||
|
{
|
||||||
|
struct melody *melody = NULL;
|
||||||
|
int fd = -1;
|
||||||
|
int nb = -1;
|
||||||
|
int i = -1;
|
||||||
|
char *magic = ".KSF";
|
||||||
|
char buf[5];
|
||||||
|
|
||||||
|
if ((fd = open(path, O_RDONLY)) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
buf[4] = 0;
|
||||||
|
/* check the magic number */
|
||||||
|
if ((read(fd, buf, 4) != 4) || (strcmp(magic, buf) != 0)) {
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read the numbers of tones */
|
||||||
|
if (read(fd, &nb, sizeof(int)) != sizeof(int)) {
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allocate space to store the new melody */
|
||||||
|
if (!(melody = malloc((nb + 1) * sizeof(struct melody)))) {
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load the melody */
|
||||||
|
for (i = 0; i < nb; i++) {
|
||||||
|
if (read(fd, &melody[i].freq, sizeof(int)) != sizeof(int) ||
|
||||||
|
read(fd, &melody[i].duration, sizeof(int)) != sizeof(int)) {
|
||||||
|
close(fd);
|
||||||
|
free(melody);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* put a null tones to indicate end of melody */
|
||||||
|
melody[nb].freq = 0;
|
||||||
|
melody[nb].duration = (unsigned long)-1;
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return (melody);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_sound(struct melody *melody)
|
||||||
|
{
|
||||||
|
free(melody);
|
||||||
|
}
|
20
libs/libk/strdup.c
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
char *strdup(const char *s)
|
||||||
|
{
|
||||||
|
char *r = NULL;
|
||||||
|
char *p = NULL;
|
||||||
|
|
||||||
|
r = malloc(strlen(s) + 1);
|
||||||
|
if (!r)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (p = r; *s != '\0'; s++, p++)
|
||||||
|
*p = *s;
|
||||||
|
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
return (r);
|
||||||
|
}
|
||||||
|
|
127
libs/libk/syscalls.c
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <kstd.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
static inline u32 syscall0(int syscall_nb)
|
||||||
|
{
|
||||||
|
u32 res;
|
||||||
|
|
||||||
|
asm volatile ("int $0x80" : "=a"(res) : "a"(syscall_nb));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 syscall1(int syscall_nb, u32 ebx)
|
||||||
|
{
|
||||||
|
u32 res;
|
||||||
|
|
||||||
|
asm volatile ("int $0x80" : "=a"(res) : "a"(syscall_nb), "b"(ebx));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 syscall2(int syscall_nb, u32 ebx, u32 ecx)
|
||||||
|
{
|
||||||
|
u32 res;
|
||||||
|
|
||||||
|
asm volatile ("int $0x80" : "=a"(res) : "a"(syscall_nb), "b"(ebx), "c"(ecx));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 syscall3(int syscall_nb, u32 ebx, u32 ecx, u32 edx)
|
||||||
|
{
|
||||||
|
u32 res;
|
||||||
|
|
||||||
|
asm volatile ("int $0x80" : "=a"(res) : "a"(syscall_nb), "b"(ebx), "c"(ecx), "d"(edx));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int write(const void *s, size_t length)
|
||||||
|
{
|
||||||
|
return ((int)syscall2(SYSCALL_WRITE, (u32)s, length));
|
||||||
|
}
|
||||||
|
|
||||||
|
void *sbrk(ssize_t increment)
|
||||||
|
{
|
||||||
|
return ((void *)syscall1(SYSCALL_SBRK, increment));
|
||||||
|
}
|
||||||
|
|
||||||
|
int getkey(void)
|
||||||
|
{
|
||||||
|
return ((int)syscall0(SYSCALL_GETKEY));
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long gettick(void)
|
||||||
|
{
|
||||||
|
return ((unsigned long)syscall0(SYSCALL_GETTICK));
|
||||||
|
}
|
||||||
|
|
||||||
|
int open(const char *pathname, int flags)
|
||||||
|
{
|
||||||
|
return ((int)syscall2(SYSCALL_OPEN, (u32)pathname, flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t read(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
return ((ssize_t)syscall3(SYSCALL_READ, fd, (u32)buf, count));
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t lseek(int filedes, off_t offset, int whence)
|
||||||
|
{
|
||||||
|
return ((off_t)syscall3(SYSCALL_SEEK, filedes, offset, whence));
|
||||||
|
}
|
||||||
|
|
||||||
|
int close(int fd)
|
||||||
|
{
|
||||||
|
return ((int)syscall1(SYSCALL_CLOSE, fd));
|
||||||
|
}
|
||||||
|
|
||||||
|
int playsound(struct melody *melody, int repeat)
|
||||||
|
{
|
||||||
|
return ((int)syscall2(SYSCALL_PLAYSOUND, (u32)melody, repeat));
|
||||||
|
}
|
||||||
|
|
||||||
|
int setvideo(int mode)
|
||||||
|
{
|
||||||
|
return ((int)syscall1(SYSCALL_SETVIDEO, mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
void swap_frontbuffer(const void *buffer)
|
||||||
|
{
|
||||||
|
syscall1(SYSCALL_SWAP_FRONTBUFFER, (u32)buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getmouse(int *x, int *y, int *buttons)
|
||||||
|
{
|
||||||
|
return ((int)syscall3(SYSCALL_GETMOUSE, (u32)x, (u32)y, (u32)buttons));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void set_palette(unsigned int *new_palette, size_t size)
|
||||||
|
{
|
||||||
|
syscall2(SYSCALL_SETPALETTE, (u32)new_palette, size);
|
||||||
|
}
|
1
roms/chichehunter/AUTHORS
Normal file
@ -0,0 +1 @@
|
|||||||
|
* choute_f (Fabien Chouteau)
|
39
roms/chichehunter/Makefile
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
TARGET = hunter
|
||||||
|
OBJS = hunter.o
|
||||||
|
ROM_TITLE = "chichehunter"
|
||||||
|
ROM_FILES = \
|
||||||
|
res/ball.bmp \
|
||||||
|
res/ball.csf \
|
||||||
|
res/bush.bmp \
|
||||||
|
res/chef_big.bmp \
|
||||||
|
res/chef.bmp \
|
||||||
|
res/chiche_b.bmp \
|
||||||
|
res/chiche.bmp \
|
||||||
|
res/intro.csf \
|
||||||
|
res/seine_w.bmp
|
||||||
|
|
||||||
|
include ../roms.mk
|
312
roms/chichehunter/hunter.c
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <graphic.h>
|
||||||
|
#include <sound.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the splash screen with sexy chiche's face.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int splash_screen(void)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
struct image *imgchiche = load_image(RES_PATH "/res/chiche_b.bmp");
|
||||||
|
struct image *imgchef = load_image(RES_PATH "/res/chef_big.bmp");
|
||||||
|
int blink = 0;
|
||||||
|
struct melody *intro = load_sound(RES_PATH "/res/intro.csf");
|
||||||
|
int sel = 1;
|
||||||
|
int k = 0;
|
||||||
|
int mouse_x, mouse_y, buttons;
|
||||||
|
|
||||||
|
playsound(intro, -1);
|
||||||
|
|
||||||
|
if (!imgchef || !imgchiche)
|
||||||
|
blue_screen("Unable to load chiche.bmp");
|
||||||
|
|
||||||
|
getmouse(&mouse_x, &mouse_y, &buttons);
|
||||||
|
while (k != KEY_ENTER && !(buttons & 1)) {
|
||||||
|
t = gettick();
|
||||||
|
|
||||||
|
getmouse(&mouse_x, &mouse_y, &buttons);
|
||||||
|
k = getkey();
|
||||||
|
if (k == KEY_UP || mouse_y > 0)
|
||||||
|
sel = 1;
|
||||||
|
|
||||||
|
if (k == KEY_DOWN || mouse_y < 0)
|
||||||
|
sel = 0;
|
||||||
|
|
||||||
|
draw_begin();
|
||||||
|
draw_image(imgchiche, 5, 10);
|
||||||
|
draw_image(imgchef, 5, 100);
|
||||||
|
draw_text(" ChicheHunter ", 160, 50, RED, 0);
|
||||||
|
if (blink >= 5)
|
||||||
|
draw_text("Any key to start", 160, 90, WHITE, 0);
|
||||||
|
draw_text("Monde de Merde 2008", 5, 190, BLUE, 0);
|
||||||
|
|
||||||
|
if (sel)
|
||||||
|
draw_text("<==", 80, 40, BLUE, 0);
|
||||||
|
else
|
||||||
|
draw_text("<==", 80, 130, BLUE, 0);
|
||||||
|
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 66 ms frame sync
|
||||||
|
*/
|
||||||
|
|
||||||
|
blink = (blink + 1) % 10;
|
||||||
|
while (gettick() - t < 33)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
playsound(NULL, -1);
|
||||||
|
|
||||||
|
clear_sound(intro);
|
||||||
|
clear_image(imgchef);
|
||||||
|
clear_image(imgchiche);
|
||||||
|
return sel;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define WIDTH 320
|
||||||
|
|
||||||
|
#define MONSTERS_COLS 6
|
||||||
|
#define NB_MONSTERS 20
|
||||||
|
#define MONSTER_X_BBOX 20
|
||||||
|
#define MONSTER_Y_BBOX 24
|
||||||
|
|
||||||
|
#define P_SIZE 15
|
||||||
|
#define NUM_MOVE 20
|
||||||
|
#define GAP_HIT 7
|
||||||
|
|
||||||
|
#define FACTOR_X 1.7
|
||||||
|
#define FACTOR_Y 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* game loop.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void game_loop(struct image * img)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
int px, py;
|
||||||
|
int k;
|
||||||
|
float mx = 0, my = 0, mdx, mdy, max, may, alive;
|
||||||
|
float les_mx[] = {
|
||||||
|
320, 0, 0, 0, 320, 0, 320, 320, 320, 0, 0, 320, 0, 320, 320, 0, 0, 320, 320, 320, 0
|
||||||
|
};
|
||||||
|
float les_dx[] = {
|
||||||
|
-5, 5, 5, 5, -5, 5, -5, -5, -5, 5, 5, -5, 5, -5, -5, 5, 5, -5, -5, -5, 5
|
||||||
|
};
|
||||||
|
float les_my[] = {
|
||||||
|
50, 30, 20, 35, 50, 25, 25, 20, 50, 40, 46, 41, 36, 30, 28, 47, 33, 42, 51, 46
|
||||||
|
};
|
||||||
|
float les_dy[] = {
|
||||||
|
-2, -2, -1, -3, -2, -1, -2, -2, -2.5, -1, -3, -2, -1, -1, -3, -1, -2, -1, -2, -2
|
||||||
|
};
|
||||||
|
int les_index = 0;
|
||||||
|
int i = 0;
|
||||||
|
int standby = 0;
|
||||||
|
int fin = 0;
|
||||||
|
int monsters = -1;
|
||||||
|
int hit[NB_MONSTERS];
|
||||||
|
int dead_monsters = 0;
|
||||||
|
struct melody *sound = load_sound(RES_PATH "/res/ball.csf");
|
||||||
|
int mouse_x, mouse_y, buttons;
|
||||||
|
struct image *bush = load_image(RES_PATH "/res/bush.bmp");
|
||||||
|
char score[] = "score: xx/xx";
|
||||||
|
int choot, can_choot;
|
||||||
|
|
||||||
|
if (!img)
|
||||||
|
blue_screen("Unable to load chiche.bmp");
|
||||||
|
|
||||||
|
px = 160;
|
||||||
|
py = 100;
|
||||||
|
mdx = 0;
|
||||||
|
mdy = 0;
|
||||||
|
max = 0;
|
||||||
|
may = 0.1;
|
||||||
|
alive = 0;
|
||||||
|
can_choot = 1;
|
||||||
|
|
||||||
|
for (i = 0; i < NB_MONSTERS; i++)
|
||||||
|
hit[i] = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
t = gettick();
|
||||||
|
|
||||||
|
choot = 0;
|
||||||
|
|
||||||
|
draw_begin();
|
||||||
|
draw_clear(240);
|
||||||
|
|
||||||
|
getmouse(&mouse_x, &mouse_y, &buttons);
|
||||||
|
k = getkey();
|
||||||
|
if (k > 0) {
|
||||||
|
if (k == KEY_ESC)
|
||||||
|
standby = !standby;
|
||||||
|
|
||||||
|
if ((standby || fin) && k == KEY_ENTER)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!standby && !fin) {
|
||||||
|
px += mouse_x;
|
||||||
|
py -= mouse_y;
|
||||||
|
|
||||||
|
if (can_choot && (buttons & 1)) {
|
||||||
|
choot = 1;
|
||||||
|
can_choot = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(buttons & 1))
|
||||||
|
can_choot = 1;
|
||||||
|
|
||||||
|
if (px <= 10)
|
||||||
|
px = 11;
|
||||||
|
if (px >= 320 - 10)
|
||||||
|
px = 320 - 11;
|
||||||
|
if (py <= 10)
|
||||||
|
py = 11;
|
||||||
|
if (py >= 200 - 10)
|
||||||
|
py = 200 - 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* move and draw monsters.
|
||||||
|
*/
|
||||||
|
if (alive) {
|
||||||
|
if (!standby && !fin) {
|
||||||
|
mdx += max;
|
||||||
|
mdy += may;
|
||||||
|
my += mdy;
|
||||||
|
mx += mdx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (my > 150 || mx < 0 || mx > 320) {
|
||||||
|
alive = 0;
|
||||||
|
hit[monsters] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fin)
|
||||||
|
draw_image_alpha(img, mx, my, 0);
|
||||||
|
} else {
|
||||||
|
alive = 1;
|
||||||
|
monsters++;
|
||||||
|
mx = les_mx[les_index];
|
||||||
|
my = les_my[les_index];
|
||||||
|
mdy = les_dy[les_index] * FACTOR_Y;
|
||||||
|
mdx = les_dx[les_index] * FACTOR_X;
|
||||||
|
les_index = (les_index + 1) % NUM_MOVE;
|
||||||
|
if (monsters == NB_MONSTERS)
|
||||||
|
fin = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw BUSH.
|
||||||
|
*/
|
||||||
|
draw_fillrect(0, 150, 320, 200, 0, 0);
|
||||||
|
draw_image_alpha(bush, 0, 0, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw player.
|
||||||
|
*/
|
||||||
|
//draw_image (img, px, py);
|
||||||
|
draw_line(px, py - 10, px, py + 10, RED);
|
||||||
|
draw_line(px - 10, py, px + 10, py, RED);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw, move and inpact bullet.
|
||||||
|
*/
|
||||||
|
if (!standby && !fin && (buttons & 1)) {
|
||||||
|
for (i = 0; i < NB_MONSTERS; i++) {
|
||||||
|
if (alive && choot
|
||||||
|
&& (px >= mx && px <= (mx + MONSTER_X_BBOX))
|
||||||
|
&& (py >= my
|
||||||
|
&& py <= (my + MONSTER_Y_BBOX))) {
|
||||||
|
playsound(sound, 1);
|
||||||
|
dead_monsters++;
|
||||||
|
alive = 0;
|
||||||
|
hit[monsters] = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw HIT.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < NB_MONSTERS; i++)
|
||||||
|
draw_text("|", 79 + i * GAP_HIT, 182,
|
||||||
|
hit[i] ? WHITE : RED, BLACK);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw PAUSE.
|
||||||
|
*/
|
||||||
|
if (standby && !fin) {
|
||||||
|
draw_text("PAUSE", 135, 50, WHITE, BLACK);
|
||||||
|
draw_text("ESC key to continue", 90, 70, WHITE, BLACK);
|
||||||
|
draw_text("ENTER key to quit", 93, 90, WHITE, BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw FIN.
|
||||||
|
*/
|
||||||
|
if (fin) {
|
||||||
|
score[7] = dead_monsters / 10 + '0';
|
||||||
|
score[8] = dead_monsters % 10 + '0';
|
||||||
|
score[10] = NB_MONSTERS / 10 + '0';
|
||||||
|
score[11] = NB_MONSTERS % 10 + '0';
|
||||||
|
draw_text(score, 110, 70, WHITE, BLACK);
|
||||||
|
draw_text("ENTER key to quit", 90, 100, WHITE, BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 33 ms sync between each frame.
|
||||||
|
*/
|
||||||
|
while (gettick() - t <= 10)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_image(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* game entry point.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void entry(void)
|
||||||
|
{
|
||||||
|
switch_graphic();
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
game_loop(splash_screen()? load_image(RES_PATH "/res/chiche.bmp") :
|
||||||
|
load_image(RES_PATH "/res/chef.bmp"));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* we should never arrive here...
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch_text();
|
||||||
|
}
|
BIN
roms/chichehunter/res/ball.bmp
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
roms/chichehunter/res/ball.csf
Normal file
BIN
roms/chichehunter/res/bush.bmp
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
roms/chichehunter/res/chef.bmp
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
roms/chichehunter/res/chef_big.bmp
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
roms/chichehunter/res/chiche.bmp
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
roms/chichehunter/res/chiche_b.bmp
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
roms/chichehunter/res/intro.csf
Normal file
BIN
roms/chichehunter/res/seine_w.bmp
Normal file
After Width: | Height: | Size: 1.5 KiB |
2
roms/chichepong/AUTHORS
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
* bucchi_m (Matthieu Bucchianeri)
|
||||||
|
* voltz_r (Renaud Voltz)
|
34
roms/chichepong/Makefile
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
TARGET = pong
|
||||||
|
OBJS = pong.o
|
||||||
|
ROM_TITLE = "pong"
|
||||||
|
ROM_FILES = \
|
||||||
|
res/ball.bmp \
|
||||||
|
res/ball.ksf \
|
||||||
|
res/chiche.bmp \
|
||||||
|
res/intro.ksf \
|
||||||
|
|
||||||
|
include ../roms.mk
|
244
roms/chichepong/pong.c
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <graphic.h>
|
||||||
|
#include <sound.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the splash screen with sexy chiche's face.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void splash_screen(void)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
struct image *img = load_image(RES_PATH "/res/chiche.bmp");
|
||||||
|
int blink = 0;
|
||||||
|
struct melody *intro = load_sound(RES_PATH "/res/intro.ksf");
|
||||||
|
|
||||||
|
playsound(intro, -1);
|
||||||
|
|
||||||
|
if (!img)
|
||||||
|
blue_screen("Unable to load chiche.bmp");
|
||||||
|
|
||||||
|
while (getkey() < 0) {
|
||||||
|
t = gettick();
|
||||||
|
|
||||||
|
draw_begin();
|
||||||
|
draw_image(img, 5, 10);
|
||||||
|
draw_text(" Chiche Pong ", 160, 50, RED, 0);
|
||||||
|
draw_text("powered by Chiche", 160, 60, ORANGE, 0);
|
||||||
|
if (blink >= 5)
|
||||||
|
draw_text("Any key to start", 160, 90, WHITE, 0);
|
||||||
|
draw_text("Kernel option - LSE - 2006-2007", 5, 190, BLUE, 0);
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 66 ms frame sync
|
||||||
|
*/
|
||||||
|
|
||||||
|
blink = (blink + 1) % 10;
|
||||||
|
while (gettick() - t <= 66) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
playsound(NULL, -1);
|
||||||
|
|
||||||
|
clear_sound(intro);
|
||||||
|
clear_image(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* game loop.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void game_loop(void)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
struct image *ball = load_image(RES_PATH "/res/ball.bmp");
|
||||||
|
int player1;
|
||||||
|
int player2;
|
||||||
|
int x, y;
|
||||||
|
int dx, dy;
|
||||||
|
int k;
|
||||||
|
int standby = 80;
|
||||||
|
struct melody *sound = load_sound(RES_PATH "/res/ball.ksf");
|
||||||
|
|
||||||
|
if (!ball)
|
||||||
|
blue_screen("Unable to load ball.bmp");
|
||||||
|
|
||||||
|
player1 = 100;
|
||||||
|
x = 160;
|
||||||
|
y = 100;
|
||||||
|
dx = 2;
|
||||||
|
dy = 2;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
t = gettick();
|
||||||
|
|
||||||
|
draw_begin();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw screen borders
|
||||||
|
*/
|
||||||
|
|
||||||
|
draw_line(0, 0, 319, 0, 64);
|
||||||
|
draw_line(0, 199, 319, 199, 64);
|
||||||
|
draw_line(0, 1, 319, 1, 192);
|
||||||
|
draw_line(0, 198, 319, 198, 192);
|
||||||
|
|
||||||
|
if (!standby) {
|
||||||
|
/*
|
||||||
|
* player actions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
k = getkey();
|
||||||
|
if (k > 0) {
|
||||||
|
if (k == KEY_DOWN)
|
||||||
|
player1 += 5;
|
||||||
|
if (k == KEY_UP)
|
||||||
|
player1 -= 5;
|
||||||
|
if (k == KEY_ESC)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (player1 + 20 >= 200)
|
||||||
|
player1 = 179;
|
||||||
|
if (player1 - 20 < 0)
|
||||||
|
player1 = 20;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ball movement.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!standby) {
|
||||||
|
x += dx;
|
||||||
|
y += dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* edges.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (y + 8 >= 200) {
|
||||||
|
y = 191;
|
||||||
|
dy = -dy;
|
||||||
|
playsound(sound, 1);
|
||||||
|
}
|
||||||
|
if (y - 8 < 0) {
|
||||||
|
y = 8;
|
||||||
|
dy = -dy;
|
||||||
|
playsound(sound, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* computer player bar.
|
||||||
|
*/
|
||||||
|
|
||||||
|
player2 = y;
|
||||||
|
if (player2 + 20 >= 200)
|
||||||
|
player2 = 179;
|
||||||
|
if (player2 - 20 < 0)
|
||||||
|
player2 = 20;
|
||||||
|
|
||||||
|
if (standby) {
|
||||||
|
draw_text("Ready ?", 130, 96, RED, 0);
|
||||||
|
standby--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw players.
|
||||||
|
*/
|
||||||
|
|
||||||
|
draw_fillrect(0, player1 - 20, 10, player1 + 20, 71, 71);
|
||||||
|
draw_fillrect(309, player2 - 20, 319, player2 + 20, 23, 23);
|
||||||
|
|
||||||
|
if (!standby)
|
||||||
|
draw_image(ball, x - 8, y - 8);
|
||||||
|
|
||||||
|
if (x + 5 >= 309) {
|
||||||
|
dx = -dx;
|
||||||
|
playsound(sound, 1);
|
||||||
|
}
|
||||||
|
if (x - 5 < 10) {
|
||||||
|
/*
|
||||||
|
* player bar collision test.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (player1 - 20 < y + 3 && player1 + 20 > y - 3) {
|
||||||
|
dx = -dx;
|
||||||
|
playsound(sound, 1);
|
||||||
|
} else {
|
||||||
|
draw_text("You loose...", 112, 96, RED, 0);
|
||||||
|
draw_end();
|
||||||
|
while (gettick() - t < 1000) ;
|
||||||
|
player1 = 100;
|
||||||
|
x = 160;
|
||||||
|
y = 100;
|
||||||
|
dx = 3;
|
||||||
|
dy = 3;
|
||||||
|
standby = 80;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 33 ms sync between each frame.
|
||||||
|
*/
|
||||||
|
|
||||||
|
while (gettick() - t <= 33) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_sound(sound);
|
||||||
|
clear_image(ball);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* game entry point.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void entry(void)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
unsigned long t;
|
||||||
|
|
||||||
|
printf
|
||||||
|
("\n\n\n\t== La demonstration qui suit a ete realisee sans trucages ==\n\n\n\n\n");
|
||||||
|
|
||||||
|
t = gettick();
|
||||||
|
while (gettick() - t < 7000) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch_graphic();
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
splash_screen();
|
||||||
|
game_loop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* we should never arrive here...
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch_text();
|
||||||
|
}
|
BIN
roms/chichepong/res/ball.bmp
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
roms/chichepong/res/ball.ksf
Normal file
BIN
roms/chichepong/res/chiche.bmp
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
roms/chichepong/res/intro.ksf
Normal file
1
roms/chichevaders/AUTHORS
Normal file
@ -0,0 +1 @@
|
|||||||
|
* choute_f (Fabien Chouteau)
|
38
roms/chichevaders/Makefile
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
TARGET = vaders
|
||||||
|
OBJS = vaders.o
|
||||||
|
ROM_TITLE = "vaders"
|
||||||
|
ROM_FILES = \
|
||||||
|
res/ball.bmp \
|
||||||
|
res/ball.csf \
|
||||||
|
res/chef_big.bmp \
|
||||||
|
res/chef.bmp \
|
||||||
|
res/chiche_b.bmp \
|
||||||
|
res/chiche.bmp \
|
||||||
|
res/intro.csf \
|
||||||
|
res/seine_w.bmp \
|
||||||
|
|
||||||
|
include ../roms.mk
|
BIN
roms/chichevaders/res/ball.bmp
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
roms/chichevaders/res/ball.csf
Normal file
BIN
roms/chichevaders/res/chef.bmp
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
roms/chichevaders/res/chef_big.bmp
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
roms/chichevaders/res/chiche.bmp
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
roms/chichevaders/res/chiche_b.bmp
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
roms/chichevaders/res/intro.csf
Normal file
BIN
roms/chichevaders/res/seine_w.bmp
Normal file
After Width: | Height: | Size: 1.5 KiB |
370
roms/chichevaders/vaders.c
Normal file
@ -0,0 +1,370 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <graphic.h>
|
||||||
|
#include <sound.h>
|
||||||
|
|
||||||
|
struct monster {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int alive;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the splash screen with sexy chiche's face.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int splash_screen(void)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
struct image *imgchiche = load_image(RES_PATH "/res/chiche_b.bmp");
|
||||||
|
struct image *imgchef = load_image(RES_PATH "/res/chef_big.bmp");
|
||||||
|
int blink = 0;
|
||||||
|
struct melody *intro = load_sound(RES_PATH "/res/intro.csf");
|
||||||
|
int sel = 1;
|
||||||
|
int k = 0;
|
||||||
|
|
||||||
|
playsound(intro, -1);
|
||||||
|
|
||||||
|
if (!imgchef || !imgchiche)
|
||||||
|
blue_screen("Unable to load chiche.bmp");
|
||||||
|
|
||||||
|
while (k != KEY_ENTER) {
|
||||||
|
|
||||||
|
k = getkey();
|
||||||
|
if (k == KEY_UP)
|
||||||
|
sel = 1;
|
||||||
|
|
||||||
|
if (k == KEY_DOWN)
|
||||||
|
sel = 0;
|
||||||
|
|
||||||
|
draw_begin();
|
||||||
|
draw_image(imgchiche, 5, 10);
|
||||||
|
draw_image(imgchef, 5, 100);
|
||||||
|
draw_text(" ChicheVaders ", 160, 50, RED, 0);
|
||||||
|
if (blink >= 5)
|
||||||
|
draw_text("Any key to start", 160, 90, WHITE, 0);
|
||||||
|
draw_text("Monde de Merde 2008", 5, 190, BLUE, 0);
|
||||||
|
|
||||||
|
if (sel)
|
||||||
|
draw_text("<==", 80, 40, BLUE, 0);
|
||||||
|
else
|
||||||
|
draw_text("<==", 80, 130, BLUE, 0);
|
||||||
|
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 66 ms frame sync
|
||||||
|
*/
|
||||||
|
|
||||||
|
blink = (blink + 1) % 10;
|
||||||
|
t = gettick();
|
||||||
|
while (gettick() - t < 66) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
playsound(NULL, -1);
|
||||||
|
|
||||||
|
clear_sound(intro);
|
||||||
|
clear_image(imgchef);
|
||||||
|
clear_image(imgchiche);
|
||||||
|
return sel;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define WIDTH 320
|
||||||
|
|
||||||
|
#define MONSTERS_COLS 6
|
||||||
|
#define NB_MONSTERS 1 //24
|
||||||
|
#define X_INIT_MONSTERS 10
|
||||||
|
#define X_GAP_MONSTERS 25
|
||||||
|
#define MONSTER_X_BBOX 20
|
||||||
|
#define MONSTER_Y_BBOX 24
|
||||||
|
|
||||||
|
#define SEINE_W_X_BBOX 20
|
||||||
|
#define SEINE_W_Y_BBOX 24
|
||||||
|
|
||||||
|
#define P_SIZE 15
|
||||||
|
#define NUM_MOVE 10
|
||||||
|
/*
|
||||||
|
* game loop.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void game_loop(struct image * img)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
int p;
|
||||||
|
int w, dw;
|
||||||
|
int wx, wy;
|
||||||
|
int k;
|
||||||
|
int x, y;
|
||||||
|
int dx, dy;
|
||||||
|
int mdx, mdy, mcnt;
|
||||||
|
struct monster monsters[NB_MONSTERS];
|
||||||
|
int ym = X_INIT_MONSTERS;
|
||||||
|
int i = 0;
|
||||||
|
int good = 0;
|
||||||
|
int standby = 0;
|
||||||
|
int fin = 0;
|
||||||
|
int win = 0;
|
||||||
|
int dead_monsters = 0;
|
||||||
|
int kill_seine_w = 0;
|
||||||
|
struct image *imgw = load_image(RES_PATH "/res/seine_w.bmp");
|
||||||
|
struct melody *sound = load_sound(RES_PATH "/res/ball.csf");
|
||||||
|
|
||||||
|
if (!img)
|
||||||
|
blue_screen("Unable to load chiche.bmp");
|
||||||
|
|
||||||
|
p = 160;
|
||||||
|
w = 2;
|
||||||
|
dw = 2;
|
||||||
|
wx = -1;
|
||||||
|
wy = -1;
|
||||||
|
x = -1;
|
||||||
|
y = -1;
|
||||||
|
dx = 0;
|
||||||
|
dy = -5;
|
||||||
|
mdx = 1;
|
||||||
|
mdy = 2;
|
||||||
|
mcnt = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* init monsters.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < NB_MONSTERS; i++) {
|
||||||
|
if (i % MONSTERS_COLS == 0)
|
||||||
|
ym += X_GAP_MONSTERS;
|
||||||
|
monsters[i].y = ym;
|
||||||
|
monsters[i].x =
|
||||||
|
15 + (i % MONSTERS_COLS) * (WIDTH / MONSTERS_COLS);
|
||||||
|
monsters[i].alive = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
t = gettick();
|
||||||
|
|
||||||
|
draw_begin();
|
||||||
|
|
||||||
|
k = getkey();
|
||||||
|
if (k > 0) {
|
||||||
|
if (k == KEY_ESC)
|
||||||
|
standby = !standby;
|
||||||
|
|
||||||
|
if ((standby || fin) && k == KEY_ENTER)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!standby && !fin) {
|
||||||
|
if (k == KEY_LEFT && p > (P_SIZE / 2 + 5))
|
||||||
|
p -= 5;
|
||||||
|
if (k == KEY_RIGHT
|
||||||
|
&& p < (WIDTH - (P_SIZE / 2 + 5)))
|
||||||
|
p += 5;
|
||||||
|
|
||||||
|
if ((k == KEY_SPACE) && x == -1 && y == -1) {
|
||||||
|
x = p;
|
||||||
|
y = 200 - (P_SIZE / 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* move and draw seine_w.
|
||||||
|
*/
|
||||||
|
if (!standby && !fin) {
|
||||||
|
if (w >= 319 - MONSTER_X_BBOX || w <= 1)
|
||||||
|
dw = -dw;
|
||||||
|
w += dw;
|
||||||
|
draw_image(imgw, w, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw, move and inpact seine_w bullet.
|
||||||
|
*/
|
||||||
|
if (wx != -1 || wy != -1) {
|
||||||
|
if (!standby && !fin) {
|
||||||
|
wx += dx;
|
||||||
|
wy -= dy;
|
||||||
|
|
||||||
|
if (wx >= (p - (P_SIZE / 2))
|
||||||
|
&& wx <= (p + (P_SIZE / 2))
|
||||||
|
&& wy >= (198 - (P_SIZE / 2))) {
|
||||||
|
playsound(sound, 1);
|
||||||
|
fin = 1;
|
||||||
|
win = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wy >= 200) {
|
||||||
|
wx = -1;
|
||||||
|
wy = -1;
|
||||||
|
} else
|
||||||
|
draw_line(wx, wy, wx, wy + 2, RED);
|
||||||
|
} else if (w >= (p - (P_SIZE / 2)) && w <= (p + (P_SIZE / 2))) {
|
||||||
|
wx = w;
|
||||||
|
wy = SEINE_W_Y_BBOX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* move and draw monsters.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < NB_MONSTERS; i++) {
|
||||||
|
if (i % MONSTERS_COLS == 0)
|
||||||
|
mdx = -mdx;
|
||||||
|
|
||||||
|
if (monsters[i].alive) {
|
||||||
|
if (!standby && !fin) {
|
||||||
|
if (mcnt == NUM_MOVE)
|
||||||
|
monsters[i].y += mdy;
|
||||||
|
monsters[i].x += mdx;
|
||||||
|
|
||||||
|
if (monsters[i].y + MONSTER_Y_BBOX >=
|
||||||
|
200) {
|
||||||
|
fin = 1;
|
||||||
|
win = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
draw_image(img, monsters[i].x, monsters[i].y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (++mcnt > NUM_MOVE) {
|
||||||
|
mdx = -mdx;
|
||||||
|
mcnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw screen borders
|
||||||
|
*/
|
||||||
|
draw_line(0, 0, 319, 0, 64); /* H 1 */
|
||||||
|
draw_line(0, 199, 319, 199, 64); /* H 2 */
|
||||||
|
draw_line(0, 0, 0, 199, 64); /* V 1 */
|
||||||
|
draw_line(319, 0, 319, 199, 64); /* V 2 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw player.
|
||||||
|
*/
|
||||||
|
draw_fillrect(p - (P_SIZE / 2), 198 - (P_SIZE / 2),
|
||||||
|
p + (P_SIZE / 2), 198, WHITE, WHITE);
|
||||||
|
draw_line(p, 198 - P_SIZE, p, 198, WHITE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw, move and inpact bullet.
|
||||||
|
*/
|
||||||
|
if (x != -1 || y != -1) {
|
||||||
|
|
||||||
|
if (!kill_seine_w && x >= w && x <= (w + SEINE_W_X_BBOX)
|
||||||
|
&& y < SEINE_W_Y_BBOX + 20) {
|
||||||
|
draw_line(w, SEINE_W_Y_BBOX + 5,
|
||||||
|
w + SEINE_W_X_BBOX,
|
||||||
|
SEINE_W_Y_BBOX + 5, BLUE);
|
||||||
|
draw_line(w, 0, w, SEINE_W_Y_BBOX + 5, BLUE);
|
||||||
|
draw_line(w + SEINE_W_X_BBOX, 0,
|
||||||
|
w + SEINE_W_X_BBOX,
|
||||||
|
SEINE_W_Y_BBOX + 5, BLUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
good = 0;
|
||||||
|
if (!standby && !fin) {
|
||||||
|
x += dx;
|
||||||
|
y += dy;
|
||||||
|
for (i = 0; i < NB_MONSTERS; i++) {
|
||||||
|
if (monsters[i].alive
|
||||||
|
&& (x >= monsters[i].x
|
||||||
|
&& x <=
|
||||||
|
(monsters[i].x +
|
||||||
|
MONSTER_X_BBOX))
|
||||||
|
&& (y >= monsters[i].y
|
||||||
|
&& y <=
|
||||||
|
(monsters[i].y +
|
||||||
|
MONSTER_Y_BBOX))) {
|
||||||
|
playsound(sound, 1);
|
||||||
|
dead_monsters++;
|
||||||
|
monsters[i].alive = 0;
|
||||||
|
good = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dead_monsters == NB_MONSTERS)
|
||||||
|
kill_seine_w = 1;
|
||||||
|
|
||||||
|
if (kill_seine_w
|
||||||
|
&& (x >= w && x <= (w + SEINE_W_X_BBOX)
|
||||||
|
&& y <= SEINE_W_Y_BBOX)) {
|
||||||
|
playsound(sound, 1);
|
||||||
|
fin = 1;
|
||||||
|
win = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (good || y <= 0) {
|
||||||
|
x = -1;
|
||||||
|
y = -1;
|
||||||
|
} else
|
||||||
|
draw_line(x, y, x, y + 2, WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw PAUSE.
|
||||||
|
*/
|
||||||
|
if (standby && !fin) {
|
||||||
|
draw_text("PAUSE", 135, 50, WHITE, RED);
|
||||||
|
draw_text("ESC key to continue", 90, 90, WHITE, RED);
|
||||||
|
draw_text("ENTER key to quit", 90, 130, WHITE, RED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw FIN.
|
||||||
|
*/
|
||||||
|
if (fin) {
|
||||||
|
draw_text(win ? "YOU WIN!" : "YOU LOOSE!", 110, 70,
|
||||||
|
WHITE, RED);
|
||||||
|
draw_text("ENTER key to quit", 90, 130, WHITE, RED);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_end();
|
||||||
|
/*
|
||||||
|
* 33 ms sync between each frame.
|
||||||
|
*/
|
||||||
|
|
||||||
|
while (gettick() - t <= 33) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_image(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* game entry point.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void entry(void)
|
||||||
|
{
|
||||||
|
switch_graphic();
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
game_loop(splash_screen()? load_image(RES_PATH "/res/chiche.bmp") :
|
||||||
|
load_image(RES_PATH "/res/chef.bmp"));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* we should never arrive here...
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch_text();
|
||||||
|
}
|
1
roms/perrodlauncher/AUTHORS
Normal file
@ -0,0 +1 @@
|
|||||||
|
* grande_n (Nicolas Grandemange)
|
43
roms/perrodlauncher/Makefile
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) LSE
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
TARGET = perrod
|
||||||
|
OBJS = perrod.o
|
||||||
|
ROM_TITLE = "perrodlauncher"
|
||||||
|
ROM_FILES = \
|
||||||
|
res/1.bmp \
|
||||||
|
res/2.bmp \
|
||||||
|
res/3.bmp \
|
||||||
|
res/4.bmp \
|
||||||
|
res/5.bmp \
|
||||||
|
res/6.bmp \
|
||||||
|
res/7.bmp \
|
||||||
|
res/8.bmp \
|
||||||
|
res/ball.csf \
|
||||||
|
res/intro.csf \
|
||||||
|
res/nuage.bmp \
|
||||||
|
res/sol.bmp \
|
||||||
|
res/yaka.bmp \
|
||||||
|
|
||||||
|
include ../roms.mk
|
300
roms/perrodlauncher/perrod.c
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) LSE
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#include <graphic.h>
|
||||||
|
#include <sound.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the splash screen with yaka face.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void splash_screen(void)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
struct image *img = load_image(RES_PATH "/res/yaka.bmp");
|
||||||
|
int blink = 0;
|
||||||
|
struct melody *intro = load_sound(RES_PATH "/res/intro.csf");
|
||||||
|
|
||||||
|
playsound(intro, -1);
|
||||||
|
|
||||||
|
if (!img)
|
||||||
|
blue_screen("Unable to load yaka.bmp");
|
||||||
|
|
||||||
|
while (getkey() < 0) {
|
||||||
|
draw_begin();
|
||||||
|
|
||||||
|
draw_image(img, 5, 10);
|
||||||
|
draw_text(" Yaka Launcher ", 160, 50, RED, 0);
|
||||||
|
draw_text("powered by Chiche", 160, 60, ORANGE, 0);
|
||||||
|
if (blink >= 4)
|
||||||
|
draw_text("Any key to start", 160, 90, WHITE, 0);
|
||||||
|
draw_text("Kernel option - LSE - 2007-2008", 5, 190, BLUE, 0);
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 66 ms frame sync
|
||||||
|
*/
|
||||||
|
|
||||||
|
blink = (blink + 1) % 8;
|
||||||
|
t = gettick();
|
||||||
|
while (gettick() - t < 250) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
playsound(NULL, -1);
|
||||||
|
|
||||||
|
clear_sound(intro);
|
||||||
|
clear_image(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* game loop.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void game_loop(void)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
struct image *nuage = load_image(RES_PATH "/res/nuage.bmp");
|
||||||
|
struct image *sol = load_image(RES_PATH "/res/sol.bmp");
|
||||||
|
int angle = 45;
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
int dx = 0;
|
||||||
|
int dy = 0;
|
||||||
|
int k;
|
||||||
|
struct melody *sound = load_sound(RES_PATH "/res/ball.csf");
|
||||||
|
struct image *pic[8];
|
||||||
|
int fire = 0;
|
||||||
|
int power = 0;
|
||||||
|
int fx = 0;
|
||||||
|
int fy = 0;
|
||||||
|
unsigned int gravity = 45;
|
||||||
|
int score = 0;
|
||||||
|
char buf[12] = { 0 };
|
||||||
|
|
||||||
|
pic[0] = load_image(RES_PATH "/res/1.bmp");
|
||||||
|
pic[1] = load_image(RES_PATH "/res/2.bmp");
|
||||||
|
pic[2] = load_image(RES_PATH "/res/3.bmp");
|
||||||
|
pic[3] = load_image(RES_PATH "/res/4.bmp");
|
||||||
|
pic[4] = load_image(RES_PATH "/res/5.bmp");
|
||||||
|
pic[5] = load_image(RES_PATH "/res/6.bmp");
|
||||||
|
pic[6] = load_image(RES_PATH "/res/7.bmp");
|
||||||
|
pic[7] = load_image(RES_PATH "/res/8.bmp");
|
||||||
|
int p;
|
||||||
|
for (p = 0; p < 8; p++)
|
||||||
|
if (pic[p] == NULL)
|
||||||
|
blue_screen("Unable to load gif");
|
||||||
|
|
||||||
|
if (!nuage)
|
||||||
|
blue_screen("Unable to load nuage.bmp");
|
||||||
|
if (!sol)
|
||||||
|
blue_screen("Unable to load sol.bmp");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
p = p % 16;
|
||||||
|
t = gettick();
|
||||||
|
|
||||||
|
draw_begin();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* player actions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
k = getkey();
|
||||||
|
if (k > 0) {
|
||||||
|
if (k == KEY_RIGHT)
|
||||||
|
angle += 2;
|
||||||
|
if (k == KEY_LEFT)
|
||||||
|
angle -= 2;
|
||||||
|
if (k == KEY_UP)
|
||||||
|
gravity += 1;
|
||||||
|
if (k == KEY_DOWN)
|
||||||
|
gravity -= 1;
|
||||||
|
if (k == KEY_ESC)
|
||||||
|
break;
|
||||||
|
if ((k == KEY_SPACE) && (fire < 3))
|
||||||
|
fire = (fire + 1) % 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (angle >= 90)
|
||||||
|
angle = 90;
|
||||||
|
if (angle < 0)
|
||||||
|
angle = 0;
|
||||||
|
if (power >= 90)
|
||||||
|
power = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ball movement.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (fire == 0) {
|
||||||
|
power = 0;
|
||||||
|
fx = 0;
|
||||||
|
fy = 0;
|
||||||
|
x = 20 + angle / 2 - fx - 10;
|
||||||
|
y = -angle / 2 + fy + 50;
|
||||||
|
}
|
||||||
|
if (fire == 1)
|
||||||
|
power += 2;
|
||||||
|
if (fire == 2) {
|
||||||
|
fire++;
|
||||||
|
dx = power * (angle);
|
||||||
|
dy = power * (90 - angle);
|
||||||
|
}
|
||||||
|
if (fire == 3) {
|
||||||
|
dy -= gravity * 10;
|
||||||
|
dx -= gravity;
|
||||||
|
if (dx < 0)
|
||||||
|
dx = 0;
|
||||||
|
|
||||||
|
y += dy / 150;
|
||||||
|
if (y < 0)
|
||||||
|
y = 0;
|
||||||
|
x += dx / 200;
|
||||||
|
|
||||||
|
if (y <= 10) {
|
||||||
|
dx -= gravity * 4;
|
||||||
|
if (dx < 0) {
|
||||||
|
fire = 0;
|
||||||
|
score = x;
|
||||||
|
}
|
||||||
|
playsound(sound, 1);
|
||||||
|
dy = -dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* computer player bar.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* draw players.
|
||||||
|
*/
|
||||||
|
if ((x - 8 - fx) > 200)
|
||||||
|
fx += (x - 8 - fx) - 200;
|
||||||
|
|
||||||
|
while ((190 - y + fy) < 8)
|
||||||
|
fy += 1;
|
||||||
|
while (((190 - y + fy) > 100) && (fy > -10))
|
||||||
|
fy--;
|
||||||
|
|
||||||
|
draw_image(nuage, -(fx % nuage->width),
|
||||||
|
(fy % nuage->height) - nuage->height - 40);
|
||||||
|
draw_image(nuage, -(fx % nuage->width) + nuage->width,
|
||||||
|
(fy % nuage->height) - nuage->height - 40);
|
||||||
|
draw_image(nuage, -(fx % nuage->width) + nuage->width * 2,
|
||||||
|
(fy % nuage->height) - nuage->height - 40);
|
||||||
|
|
||||||
|
draw_image(nuage, -(fx % nuage->width),
|
||||||
|
(fy % nuage->height) - 40);
|
||||||
|
draw_image(nuage, -(fx % nuage->width) + nuage->width,
|
||||||
|
(fy % nuage->height) - 40);
|
||||||
|
draw_image(nuage, -(fx % nuage->width) + nuage->width * 2,
|
||||||
|
(fy % nuage->height) - 40);
|
||||||
|
|
||||||
|
if (fy < 100) {
|
||||||
|
draw_image(sol, -(fx % nuage->width), fy - 40);
|
||||||
|
draw_image(sol, -(fx % nuage->width) + sol->width,
|
||||||
|
fy - 40);
|
||||||
|
draw_image(sol, -(fx % nuage->width) + sol->width * 2,
|
||||||
|
fy - 40);
|
||||||
|
} else {
|
||||||
|
draw_image(nuage, -(fx % nuage->width),
|
||||||
|
(fy % nuage->height) - 40);
|
||||||
|
draw_image(nuage, -(fx % nuage->width) + nuage->width,
|
||||||
|
(fy % nuage->height) - 40);
|
||||||
|
draw_image(nuage,
|
||||||
|
-(fx % nuage->width) + nuage->width * 2,
|
||||||
|
(fy % nuage->height) - 40);
|
||||||
|
}
|
||||||
|
|
||||||
|
//draw_line (0, 199 + fy, 319, 199 + fy, 64);
|
||||||
|
//draw_line (0, 198 + fy, 319, 198 + fy, 192);
|
||||||
|
|
||||||
|
draw_rect(0 - fx, 50 + fy, 10 - fx, 145 + fy, 70);
|
||||||
|
draw_fillrect(0 - fx, 140 - power + fy, 10 - fx, 145 + fy, 60,
|
||||||
|
70);
|
||||||
|
|
||||||
|
draw_rect(15 + angle / 2 - fx, 145 + angle / 2 + fy,
|
||||||
|
20 + angle / 2 - fx, 150 + angle / 2 + fy, 60);
|
||||||
|
draw_line(0 - fx, 200 + fy, 20 + angle / 2 - fx - 2,
|
||||||
|
150 + angle / 2 + fy - 2, 60);
|
||||||
|
|
||||||
|
draw_image_alpha(pic[p / 2], x - 8 - fx, 170 - y + fy, 250);
|
||||||
|
|
||||||
|
draw_text("Gravity: ", 0, 0, 162, -1);
|
||||||
|
sprintf(buf, "%d", gravity);
|
||||||
|
draw_text(buf, 70, 0, 162, -1);
|
||||||
|
|
||||||
|
if ((fire == 0) && (score != 0)) {
|
||||||
|
draw_text("Score: ", 100, 60, 12, -1);
|
||||||
|
sprintf(buf, "%d", score);
|
||||||
|
draw_text(buf, 170, 60, 12, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_end();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 33 ms sync between each frame.
|
||||||
|
*/
|
||||||
|
|
||||||
|
while (gettick() - t <= 66) ;
|
||||||
|
p += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_sound(sound);
|
||||||
|
clear_image(nuage);
|
||||||
|
clear_image(sol);
|
||||||
|
int l = 0;
|
||||||
|
for (l = 0; l < 8; l++)
|
||||||
|
clear_image(pic[l]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* game entry point.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void entry(void)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
unsigned long t;
|
||||||
|
|
||||||
|
printf
|
||||||
|
("\n\n\n\t== La demonstration qui suit a ete realisee sans trucages ==\n\n\n\n\n");
|
||||||
|
|
||||||
|
t = gettick();
|
||||||
|
while (gettick() - t < 7000) ;
|
||||||
|
#endif
|
||||||
|
switch_graphic();
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
splash_screen();
|
||||||
|
game_loop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* we should never arrive here...
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch_text();
|
||||||
|
}
|
BIN
roms/perrodlauncher/res/1.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/2.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/3.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/4.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/5.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/6.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/7.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/8.bmp
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
roms/perrodlauncher/res/ball.csf
Normal file
BIN
roms/perrodlauncher/res/intro.csf
Normal file
BIN
roms/perrodlauncher/res/nuage.bmp
Normal file
After Width: | Height: | Size: 63 KiB |