ISO初步建立

This commit is contained in:
xiaoyi1212 2024-05-27 00:03:20 +08:00
parent 9144d9f3bf
commit 79cef43d29
19 changed files with 1170 additions and 136 deletions

View File

@ -0,0 +1 @@

View File

@ -4,13 +4,10 @@
#include "../include/vdisk.h"
#include "../include/timer.h"
#include "../include/pci.h"
#include "../include/printf.h"
static inline nul(char *f, ...) {}
#define logk nul
#define inb io_in8
#define outb io_out8
struct IDEChannelRegisters {
unsigned short base; // I/O Base.
unsigned short ctrl; // Control Base
@ -55,6 +52,8 @@ static void Write(char drive, unsigned char *buffer, unsigned int number,
void ide_initialize(unsigned int BAR0, unsigned int BAR1, unsigned int BAR2,
unsigned int BAR3, unsigned int BAR4) {
register_interrupt_handler(0x2f,ide_irq);
register_interrupt_handler(0x2e,ide_irq);
int j, k, count = 0;
for (int i = 0; i < 4; i++) {
ide_devices[i].Reserved = 0;
@ -162,16 +161,21 @@ void ide_initialize(unsigned int BAR0, unsigned int BAR1, unsigned int BAR2,
vdisk vd;
for (int i = 0; i < 4; i++)
if (ide_devices[i].Reserved == 1) {
logk(" %d Found %s Drive %dMB - %s\n", i,
logkf(" %d Found %s Drive %dMB - %s\n", i,
(const char *[]) {"ATA", "ATAPI"}[ide_devices[i].Type], /* Type */
ide_devices[i].Size / 1024 / 2, /* Size */
ide_devices[i].Model);
strcpy(vd.DriveName, ide_devices[i].Model);
vd.flag = 1;
if(ide_devices[i].Type == IDE_ATAPI) {
vd.flag = 2;
} else {
vd.flag = 1;
}
vd.Read = Read;
vd.Write = Write;
vd.size = ide_devices[i].Size;
printf("[Disk-(%c)]: Size: %dMB | Name: %s\n", register_vdisk(vd), vd.size, vd.DriveName);
printf("[Disk-(%c)]: Size: %dMB | %s | Name: %s\n", register_vdisk(vd), vd.size,(const char *[]) {"ATA", "ATAPI"}[ide_devices[i].Type], vd.DriveName);
}
}
@ -241,7 +245,7 @@ unsigned char ide_polling(unsigned char channel, unsigned int advanced_check) {
logk("II\n");
int a = ide_read(channel, ATA_REG_STATUS);
while (a & ATA_SR_BSY) {
logk("a=%d\n", a & ATA_SR_BSY); // Wait for BSY to be zero.
logkf("a=%d\n", a & ATA_SR_BSY); // Wait for BSY to be zero.
a = ide_read(channel, ATA_REG_STATUS);
sleep(1);
}
@ -352,7 +356,7 @@ unsigned char ide_ata_access(unsigned char direction, unsigned char drive,
ide_write(channel, ATA_REG_CONTROL,
channels[channel].nIEN = (ide_irq_invoked = 0x0) + 0x02);
// (I) Select one from LBA28, LBA48 or CHS;
logk("I %02x\n", channels[channel].nIEN);
logkf("I %02x\n", channels[channel].nIEN);
if (lba >= 0x10000000) { // Sure Drive should support LBA in this case, or
// you are giving a wrong LBA.
// LBA48:
@ -453,7 +457,7 @@ unsigned char ide_ata_access(unsigned char direction, unsigned char drive,
if (err = ide_polling(channel, 1))
return err; // Polling, set error and exit if there is.
logk("words=%d bus=%d\n", words, bus);
logkf("words=%d bus=%d\n", words, bus);
for (int h = 0; h < words; h++) {
unsigned short a = io_in16(bus);
word_[i * words + h] = a;
@ -465,7 +469,7 @@ unsigned char ide_ata_access(unsigned char direction, unsigned char drive,
// PIO Write.
uint16_t *word_ = edi;
for (i = 0; i < numsects; i++) {
logk("write %d\n", i);
logkf("write %d\n", i);
ide_polling(channel, 0); // Polling.
// asm("pushw %ds");
// asm("mov %%ax, %%ds" ::"a"(selector));
@ -485,8 +489,10 @@ unsigned char ide_ata_access(unsigned char direction, unsigned char drive,
}
void ide_wait_irq() {
logk("WAITING\n");
while (!ide_irq_invoked);
ide_irq_invoked = 0;
logk("IDE_WAIT_IRQ!\n");
}
void ide_irq() {
@ -510,7 +516,7 @@ unsigned char ide_atapi_read(unsigned char drive, unsigned int lba,
channels[channel].nIEN = ide_irq_invoked = 0x0);
// (I): Setup SCSI Packet:
// ------------------------------------------------------------------
logk("I\n");
logk("CDROM I\n");
atapi_packet[0] = ATAPI_CMD_READ;
atapi_packet[1] = 0x0;
atapi_packet[2] = (lba >> 24) & 0xFF;
@ -525,12 +531,12 @@ unsigned char ide_atapi_read(unsigned char drive, unsigned int lba,
atapi_packet[11] = 0x0; // (II): Select the drive:
// ------------------------------------------------------------------
ide_write(channel, ATA_REG_HDDEVSEL, slavebit << 4);
logk("II\n");
logk("CDROM II\n");
// (III): Delay 400 nanoseconds for select to complete:
for (int i = 0; i < 4000; i++);
logk("III\n");
logk("CDROM III\n");
// ------------------------------------------------------------------
logk("IV\n");
logk("CDROM IV\n");
for (int i = 0; i < 4; i++)
ide_read(channel,
ATA_REG_ALTSTATUS); // Reading the Alternate Status port wastes
@ -541,7 +547,7 @@ unsigned char ide_atapi_read(unsigned char drive, unsigned int lba,
0); // PIO mode.
// (V): Tell the Controller the size of buffer:
// ------------------------------------------------------------------
logk("V\n");
logk("CDROM V\n");
ide_write(channel, ATA_REG_LBA1,
(words * 2) & 0xFF); // Lower Byte of Sector Size.
ide_write(channel, ATA_REG_LBA2,
@ -557,24 +563,22 @@ unsigned char ide_atapi_read(unsigned char drive, unsigned int lba,
// (VIII): Sending the packet data:
// ------------------------------------------------------------------
logk("VIII\n");
logk("CDROM VIII\n");
uint16_t *_atapi_packet = atapi_packet;
for (int i = 0; i < 6; i++) {
io_out16(bus, _atapi_packet[i]);
}
// (IX): Receiving Data:
// ------------------------------------------------------------------
logk("IX\n");
logk("CDROM IX\n");
uint16_t *_word = edi;
for (i = 0; i < numsects; i++) {
ide_wait_irq(); // Wait for an IRQ.
if (err = ide_polling(channel, 1))
return err; // Polling and return if error.
logk("words = %d\n", words);
for (int h = 0; h < words; h++) {
uint16_t a = io_in16(bus);
_word[i * words + h] = a;
}
logkf("CDROM words = %d\n", words);
insl(bus, _word + i * words, words / 2);
}
// (X): Waiting for an IRQ:
// ------------------------------------------------------------------

146
src/driver/sb16.c Normal file
View File

@ -0,0 +1,146 @@
#include "../include/sb16.h"
#include "../include/io.h"
#include "../include/printf.h"
#include "../include/timer.h"
#include "../include/dma.h"
#include "../include/file.h"
struct sb16 sb;
void sb16_handler(registers_t *reg) {
io_in8(SB_INTR16);
uint8_t state = io_in8(SB_STATE);
logkf("sb16 handler state 0x%X...\n", state);
sb.flag = !sb.flag;
}
void disable_sb16() {
sb.addr = (char*)DMA_BUF_ADDR;
sb.mode = MODE_STEREO16;
sb.channel = 5;
sb.use_task = NULL;
register_interrupt_handler(SB16_IRQ + 0x20, sb16_handler);
}
static void sb_reset() {
io_out8(SB_RESET, 1);
sleep(1);
io_out8(SB_RESET, 0);
uint8_t state = io_in8(SB_READ);
logkf("sb16 reset state 0x%x\n", state);
}
static void sb_intr_irq() {
io_out8(SB_MIXER, 0x80);
uint8_t data = io_in8(SB_MIXER_DATA);
if (data != 2) {
io_out8(SB_MIXER, 0x80);
io_out8(SB_MIXER_DATA, 0x2);
}
}
static void sb_out(uint8_t cmd) {
while (io_in8(SB_WRITE) & 128)
;
io_out8(SB_WRITE, cmd);
}
static void sb_turn(bool on) {
if (on)
sb_out(CMD_ON);
else
sb_out(CMD_OFF);
}
static uint32_t sb_time_constant(uint8_t channels, uint16_t sample) {
return 65536 - (256000000 / (channels * sample));
}
static void sb_set_volume(uint8_t level) {
logkf("set sb16 volume to 0x%02X\n", level);
io_out8(SB_MIXER, 0x22);
io_out8(SB_MIXER_DATA, level);
}
int sb16_set(int cmd, void* args) {
switch (cmd) {
// 设置 tty 参数
case 0:
while (sb.use_task)
;
io_cli();
sb.use_task = get_current();
io_sti();
sb_reset(); // 重置 DSP
sb_intr_irq(); // 设置中断
sb_out(CMD_ON); // 打开声霸卡
return 0;
case 1:
sb_out(CMD_OFF); // 关闭声霸卡
sb.use_task = NULL;
return 0;
case 2:
sb.mode = MODE_MONO8;
sb.channel = 1;
return 0;
case 3:
sb.mode = MODE_STEREO16;
sb.channel = 5;
return 0;
case 4:
sb_set_volume((uint32_t)args & 0xff);
return 0;
default:
break;
}
return -1;
}
int sb16_write(char* data, size_t size) {
memcpy(sb.addr, data, size);
// 设置采样率
sb_out(CMD_SOSR); // 44100 = 0xAC44
sb_out((SAMPLE_RATE >> 8) & 0xFF); // 0xAC
sb_out(SAMPLE_RATE & 0xFF); // 0x44
dma_xfer(sb.channel, sb.addr, size, 0);
if (sb.mode == MODE_MONO8) {
sb_out(CMD_SINGLE_OUT8);
sb_out(MODE_MONO8);
} else {
sb_out(CMD_SINGLE_OUT16);
sb_out(MODE_STEREO16);
size >>= 2; // size /= 4
}
sb_out((size - 1) & 0xFF);
sb_out(((size - 1) >> 8) & 0xFF);
sb.flag = 0;
//while (!sb.flag);
return size;
}
void wav_player(char* filename) {
FILE* fp = fopen(filename, "rb");
if(fp == NULL) {
logk("Open wav file was throw error.\n");
return;
}
char* buf = kmalloc(DMA_BUF_SIZE);
fread(buf, 1, 44, fp);
logk("SB3 I\n");
sb16_set(0, 0);
logk("SB3 II\n");
sb16_set(2, 0);
logk("SB3 III\n");
sb16_set(4, 0xff);
logk("SB3 IV\n");
int sz;
while (sz = fread(buf, 1, DMA_BUF_SIZE, fp)) {
logkf("%02x ",sz);
sb16_write(buf, sz);
}
logk("\nSB3 IIV\n");
sb16_set(1, 0);
logk("SB3 IIIV\n");
fclose(fp);
}

39
src/driver/serial.c Normal file
View File

@ -0,0 +1,39 @@
#include "../include/serial.h"
#include "../include/io.h"
int init_serial() {
io_out8(SERIAL_PORT + 1, 0x00); // 禁止COM的中断发生
io_out8(SERIAL_PORT + 3, 0x80); // 启用DLAB设置波特率除数
io_out8(SERIAL_PORT + 0, 0x03); // 设置除数为3(低位) 38400波特
io_out8(SERIAL_PORT + 1, 0x00); // (高位)
io_out8(SERIAL_PORT + 3, 0x03); // 8位无奇偶性一个停止位
io_out8(SERIAL_PORT + 2, 0xC7); // 启用FIFO有14字节的阈值
io_out8(SERIAL_PORT + 4, 0x0B); // 启用IRQ设置RTS/DSR
io_out8(SERIAL_PORT + 4, 0x1E); // 设置为环回模式,测试串口
io_out8(SERIAL_PORT + 0, 0xAE); // 测试串口发送字节0xAE并检查串口是否返回相同的字节
// 检查串口是否有问题(即:与发送的字节不一样)
if (io_in8(SERIAL_PORT + 0) != 0xAE) {
return 1;
}
// 如果串口没有故障,将其设置为正常运行模式。
// (非环回启用IRQ启用OUT#1和OUT#2位)
io_out8(SERIAL_PORT + 4, 0x0F);
return 0;
}
int serial_received() { return io_in8(SERIAL_PORT + 5) & 1; }
char read_serial() {
while (serial_received() == 0)
;
return io_in8(SERIAL_PORT);
}
int is_transmit_empty() { return io_in8(SERIAL_PORT + 5) & 0x20; }
void write_serial(char a) {
while (is_transmit_empty() == 0)
;
io_out8(SERIAL_PORT, a);
}

View File

@ -14,8 +14,9 @@ uint32_t *screen;
uint32_t *char_buffer;
extern uint8_t ascfont[];
extern uint8_t plfont[];
extern uint8_t bafont[];
bool vbe_status;
bool vbe_status = false;
static void copy_char(uint32_t *vram, int off_x, int off_y, int x, int y, int x1,
int y1, int xsize) {
@ -81,9 +82,10 @@ void vbe_draw_char(char c, int32_t x, int32_t y) {
}
uint8_t *font = ascfont;
uint8_t *font = bafont;
font += c * 16;
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 9; j++) {
if (font[i] & (0x80 >> j)) {
@ -91,14 +93,17 @@ void vbe_draw_char(char c, int32_t x, int32_t y) {
} else screen[(y + i) * width + x + j] = back_color;
}
}
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 9; j++) {
if (font[i] & (0x80 >> j)) {
screen[(y + i) * width + x + j] = color;
} else screen[(y + i) * width + x + j + 1] = back_color;
}
}
}
int cur_task() {
return 0;
while (1) {
vbe_draw_char('_', x, y);
clock_sleep(5);
vbe_draw_char(' ', x, y);
clock_sleep(5);
}
}
@ -131,14 +136,13 @@ void vbe_putchar(char ch) {
if (cy != 0) cy -= 1;
if (cy == 0) cx = 0, cy = 0;
}
draw_rect(x, y, x + 9, y + 16, 0);
//draw_rect(x, y, x + 9, y + 16, back_color);
return;
}
vbe_scroll();
vbe_draw_char(ch, cx * 9 - 7, cy * 16);
}
void vbe_write(const char *data, size_t size) {
@ -169,7 +173,7 @@ void initVBE(multiboot_t *info) {
width = info->framebuffer_width;
height = info->framebuffer_height;
color = 0xc6c6c6;
back_color = 0x191f42;
back_color = 0x343541;
c_width = width / 9;
c_height = height / 16;

View File

@ -102,9 +102,27 @@ void DriveSemaphoreGive(unsigned int drive_code) {
return;
}
void Disk_Read2048(unsigned int lba, unsigned int number, void *buffer,
char drive){
if(have_vdisk(drive)){
if (DriveSemaphoreTake(GetDriveCode((unsigned char *)"DISK_DRIVE"))) {
for (int i = 0; i < number; i+=SECTORS_ONCE) {
int sectors = ((number - i) >= SECTORS_ONCE) ? SECTORS_ONCE : (number - i);
rw_vdisk(drive, lba + i, buffer + i * 2048, sectors, 1);
}
DriveSemaphoreGive(GetDriveCode((unsigned char *)"DISK_DRIVE"));
}
}
}
void Disk_Read(unsigned int lba, unsigned int number, void *buffer,
char drive) {
if (have_vdisk(drive)) {
int indx = drive - ('A');
if(vdisk_ctl[indx].flag != 1) {
memset(buffer,0,number*512);
return;
}
if (DriveSemaphoreTake(GetDriveCode((unsigned char *)"DISK_DRIVE"))) {
for (int i = 0; i < number; i += SECTORS_ONCE) {
int sectors = ((number - i) >= SECTORS_ONCE) ? SECTORS_ONCE : (number - i);
@ -114,6 +132,24 @@ void Disk_Read(unsigned int lba, unsigned int number, void *buffer,
}
}
}
bool CDROM_Read(unsigned int lba, unsigned int number, void *buffer,
char drive) {
if (have_vdisk(drive)) {
int indx = drive - ('A');
if(vdisk_ctl[indx].flag != 2) {
return false;
}
if (DriveSemaphoreTake(GetDriveCode((unsigned char *)"DISK_DRIVE"))) {
for (int i = 0; i < number; i += SECTORS_ONCE) {
int sectors = ((number - i) >= SECTORS_ONCE) ? SECTORS_ONCE : (number - i);
rw_vdisk(drive, lba + i, buffer + i * 2048, sectors, 1);
}
DriveSemaphoreGive(GetDriveCode((unsigned char *)"DISK_DRIVE"));
}
return true;
}
return false;
}
unsigned int disk_Size(char drive) {
unsigned char drive1 = drive;
if (have_vdisk(drive1)) {

194
src/fs/file.c Normal file
View File

@ -0,0 +1,194 @@
#include "../include/file.h"
#include "../include/vfs.h"
#include "../include/memory.h"
#include "../include/printf.h"
#include <stdarg.h>
int fputc(int ch, FILE *stream) {
if (CANWRITE(stream->mode)) {
// printk("Current Buffer=%s\n",stream->buffer);
if (stream->p >= stream->bufferSize) {
// printk("Realloc....(%d,%d)\n",stream->p,stream->bufferSize);
stream->buffer = realloc(stream->buffer, stream->bufferSize + 100);
stream->bufferSize += 100;
}
if (stream->p >= stream->fileSize) {
stream->fileSize++;
}
// printk("Current Buffer=%s(A)\n",stream->buffer);
stream->buffer[stream->p++] = ch;
// printk("Current Buffer=%s(B)\n",stream->buffer);
return ch;
}
return EOF;
}
unsigned int fwrite(const void *ptr, unsigned int size, unsigned int nmemb,
FILE *stream) {
if (CANWRITE(stream->mode)) {
unsigned char *c_ptr = (unsigned char *)ptr;
for (int i = 0; i < size * nmemb; i++) {
fputc(c_ptr[i], stream);
}
return nmemb;
} else {
return 0;
}
}
FILE *fopen(char *filename, char *mode) {
unsigned int flag = 0;
FILE *fp = (FILE *)kmalloc(sizeof(FILE));
while (*mode != '\0') {
switch (*mode) {
case 'a':
flag |= APPEND;
break;
case 'b':
break;
case 'r':
flag |= READ;
break;
case 'w':
flag |= WRITE;
break;
case '+':
flag |= PLUS;
break;
default:
break;
}
mode++;
}
if (vfs_filesize(filename) == -1) {
kfree(fp);
logk("NULL FILE\n");
return NULL; // 找不到
} else if (flag & WRITE) {
char buffe2[100];
}
if (flag & WRITE) {
fp->fileSize = 0;
} else {
fp->fileSize = vfs_filesize(filename);
}
fp->bufferSize = 0;
if (flag & READ || flag & PLUS || flag & APPEND) {
fp->bufferSize = vfs_filesize(filename);
}
if (flag & WRITE || flag & PLUS || flag & APPEND) {
fp->bufferSize += 100;
}
if (fp->bufferSize == 0) {
fp->bufferSize = 1;
}
fp->buffer = kmalloc(fp->bufferSize);
if (flag & PLUS || flag & APPEND || flag & READ) {
// printk("ReadFile........\n");
vfs_readfile(filename, fp->buffer);
}
fp->p = 0;
if (flag & APPEND) {
fp->p = fp->fileSize;
}
fp->name = kmalloc(strlen(filename) + 1);
strcpy(fp->name, filename);
fp->mode = flag;
return fp;
}
int fgetc(FILE *stream) {
if (CANREAD(stream->mode)) {
if (stream->p >= stream->fileSize) {
return EOF;
} else {
return stream->buffer[stream->p++];
}
} else {
return EOF;
}
}
unsigned int fread(void *buffer, unsigned int size, unsigned int count,
FILE *stream) {
if (CANREAD(stream->mode)) {
unsigned char *c_ptr = (unsigned char *)buffer;
for (int i = 0; i < size * count; i++) {
unsigned int ch = fgetc(stream);
if (ch == EOF) {
return i;
} else {
c_ptr[i] = ch;
}
}
return count;
} else {
return 0;
}
}
int fclose(FILE *fp) {
if (fp == NULL) {
return EOF;
}
if (CANWRITE(fp->mode)) {
// printk("Save file.....(%s) Size =
//%d\n",fp->buffer,fp->fileSize);
// Edit_File(fp->name, fp->buffer, fp->fileSize, 0);
vfs_writefile(fp->name, fp->buffer, fp->fileSize);
}
kfree(fp->buffer);
kfree(fp->name);
kfree(fp);
return 0;
}
char *fgets(char *str, int n, FILE *stream) {
if (CANREAD(stream->mode)) {
for (int i = 0; i < n; i++) {
unsigned int ch = fgetc(stream);
if (ch == EOF) {
if (i == 0) {
return NULL;
} else {
break;
}
}
if (ch == '\n') {
break;
}
str[i] = ch;
}
return str;
}
return NULL;
}
int fputs(const char *str, FILE *stream) {
if (CANWRITE(stream->mode)) {
for (int i = 0; i < strlen(str); i++) {
fputc(str[i], stream);
}
return 0;
}
return EOF;
}
int fprintf(FILE *stream, const char *format, ...) {
if (CANWRITE(stream->mode)) {
int len;
va_list ap;
va_start(ap, format);
char *buf = kmalloc(1024);
len = vsprintf(buf, format, ap);
fputs(buf, stream);
kfree(buf);
va_end(ap);
return len;
} else {
// printk("CAN NOT WRITE\n");
return EOF;
}
}

View File

@ -2,22 +2,23 @@
#include "../include/memory.h"
#include "../include/vfs.h"
#include "../include/vdisk.h"
#include "../include/printf.h"
bool read_sector(l9660_fs *fs, void *buf, uint32_t sector);
#define l9660_seekdir(dir, pos) (l9660_seek(&(dir)->file, L9660_SEEK_SET, (pos)))
#define l9660_telldir(dir) (l9660_tell(&(dir)->file))
#define l9660_telldir(dir) (l9660_tell(&(dir)->file))
#define SEEK_END L9660_SEEK_END
#define SEEK_SET L9660_SEEK_SET
#define SEEK_CUR L9660_SEEK_CUR
#define DENT_EXISTS (1 << 0)
#define DENT_ISDIR (1 << 1)
#define DENT_ASSOCIATED (1 << 2)
#define DENT_RECORD (1 << 3)
#define DENT_PROTECTION (1 << 4)
#define DENT_MULTIEXTENT (1 << 5)
#define DENT_EXISTS (1 << 0)
#define DENT_ISDIR (1 << 1)
#define DENT_ASSOCIATED (1 << 2)
#define DENT_RECORD (1 << 3)
#define DENT_PROTECTION (1 << 4)
#define DENT_MULTIEXTENT (1 << 5)
#define PVD(vdesc) ((l9660_vdesc_primary*)(vdesc))
#define PVD(vdesc) ((l9660_vdesc_primary *)(vdesc))
#ifdef L9660_BIG_ENDIAN
#define READ16(v) (((v).be[1]) | ((v).be[0] << 8))
@ -34,83 +35,84 @@
#define HAVEBUFFER(f) ((f) == last_file)
#define BUF(f) (gbuf)
static l9660_file *last_file;
static char gbuf[2048];
static char gbuf[2048];
#endif
l9660_fs *fs;
l9660_dir *root_dir;
static char *strchrnul(const char *s, int c) {
while (*s) {
static char *strchrnul(const char *s, int c)
{
while (*s)
{
if ((*s++) == c)
break;
}
return (char *) s;
return (char *)s;
}
static inline uint16_t
fsectoff(l9660_file
*f)
*f)
{
return f->position % 2048;
return f->position % 2048;
}
static inline uint32_t
fsector(l9660_file
*f)
*f)
{
return f->position / 2048;
return f->position / 2048;
}
static inline uint32_t
fnextsectpos(l9660_file
*f)
*f)
{
return (f->position + 2047) & ~2047;
return (f->position + 2047) & ~2047;
}
l9660_status l9660_openfs(l9660_fs *fs, bool (*read_sector)(l9660_fs *fs, void *buf, uint32_t sector,uint8_t disk_number),uint8_t disk_number){
fs->
read_sector = read_sector;
l9660_status l9660_openfs(l9660_fs *fs, bool (*read_sector)(l9660_fs *fs, void *buf, uint32_t sector), uint8_t disk_number)
{
fs->read_sector = read_sector;
fs->disk_number = disk_number;
logkf("fs--- %08x\n",fs->read_sector);
#ifndef L9660_SINGLEBUFFER
l9660_vdesc_primary *pvd = PVD(&fs->pvd);
l9660_vdesc_primary *pvd = PVD(&fs->pvd);
#else
last_file = NULL;
last_file = NULL;
l9660_vdesc_primary *pvd = PVD(gbuf);
#endif
uint32_t idx = 0x10;
for (;;) {
// Read next sector
if (!
read_sector(fs, pvd, idx, disk_number
))
return
L9660_EIO;
uint32_t idx = 0x10;
for (;;)
{
// Read next sector
if (!read_sector(fs, pvd, idx))
return L9660_EIO;
// Validate magic
if (
memcmp(pvd
->hdr.magic, "CD001", 5) != 0)
return
L9660_EBADFS;
// Validate magic
if (
memcmp(pvd
->hdr.magic,
"CD001", 5) != 0)
return L9660_EBADFS;
if (pvd->hdr.type == 1)
break; // Found PVD
else if(pvd->hdr.type == 255)
return
L9660_EBADFS;
}
if (pvd->hdr.type == 1)
break; // Found PVD
else if (pvd->hdr.type == 255)
return L9660_EBADFS;
}
#ifdef L9660_SINGLEBUFFER
memcpy(&fs->root_dir_ent, &pvd->root_dir_ent, pvd->root_dir_ent.length);
memcpy(&fs->root_dir_ent, &pvd->root_dir_ent, pvd->root_dir_ent.length);
#endif
return
L9660_OK;
return L9660_OK;
}
l9660_status l9660_fs_open_root(l9660_dir *dir, l9660_fs *fs) {
l9660_file * f = &dir->file;
l9660_status l9660_fs_open_root(l9660_dir *dir, l9660_fs *fs)
{
l9660_file *f = &dir->file;
#ifndef L9660_SINGLEBUFFER
l9660_dirent *dirent = &PVD(&fs->pvd)->root_dir_ent;
#else
@ -125,28 +127,35 @@ l9660_status l9660_fs_open_root(l9660_dir *dir, l9660_fs *fs) {
return L9660_OK;
}
static l9660_status buffer(l9660_file *f) {
static l9660_status buffer(l9660_file *f)
{
#ifdef L9660_SINGLEBUFFER
last_file = f;
#endif
logkf("%08x %08x\n",read_sector,f->fs->read_sector);
if (!f->fs->read_sector(f->fs, BUF(f), f->first_sector + f->position / 2048))
return L9660_EIO;
else
return L9660_OK;
}
static l9660_status prebuffer(l9660_file *f) {
static l9660_status prebuffer(l9660_file *f)
{
if (!HAVEBUFFER(f) || (f->position % 2048) == 0)
return buffer(f);
else return L9660_OK;
else
return L9660_OK;
}
static l9660_status openat_raw(l9660_file *child, l9660_dir *parent, const char *name, bool isdir) {
static l9660_status openat_raw(l9660_file *child, l9660_dir *parent, const char *name, bool isdir)
{
l9660_status rv;
l9660_dirent *dent = NULL;
if ((rv = l9660_seekdir(parent, 0))) return rv;
if ((rv = l9660_seekdir(parent, 0)))
return rv;
do {
do
{
const char *seg = name;
name = strchrnul(name, '/');
size_t seglen = name - seg;
@ -156,12 +165,14 @@ static l9660_status openat_raw(l9660_file *child, l9660_dir *parent, const char
seg = "\0";
/* ISO9660 stores ".." as '\1' */
if (seglen == 2 && seg[0] == '.' && seg[1] == '.') {
if (seglen == 2 && seg[0] == '.' && seg[1] == '.')
{
seg = "\1";
seglen = 1;
}
for (;;) {
for (;;)
{
if ((rv = l9660_readdir(parent, &dent)))
return rv;
@ -197,13 +208,16 @@ static l9660_status openat_raw(l9660_file *child, l9660_dir *parent, const char
if (*name && (dent->flags & DENT_ISDIR) != 0)
return L9660_ENOTDIR;
parent = (l9660_dir *) child;
parent = (l9660_dir *)child;
} while (*name);
if (isdir) {
if (isdir)
{
if ((dent->flags & DENT_ISDIR) == 0)
return L9660_ENOTDIR;
} else {
}
else
{
if ((dent->flags & DENT_ISDIR) != 0)
return L9660_ENOTFILE;
}
@ -211,65 +225,73 @@ static l9660_status openat_raw(l9660_file *child, l9660_dir *parent, const char
return L9660_OK;
}
l9660_status l9660_opendirat(l9660_dir *dir, l9660_dir *parent, const char *path) {
l9660_status l9660_opendirat(l9660_dir *dir, l9660_dir *parent, const char *path)
{
return openat_raw(&dir->file, parent, path, true);
}
static inline unsigned aligneven(unsigned v) {
static inline unsigned aligneven(unsigned v)
{
return v + (v & 1);
}
l9660_status l9660_readdir(l9660_dir *dir, l9660_dirent **pdirent) {
l9660_status l9660_readdir(l9660_dir *dir, l9660_dirent **pdirent)
{
l9660_status rv;
l9660_file * f = &dir->file;
l9660_file *f = &dir->file;
rebuffer:
if (f->position >= f->length) {
rebuffer:
if (f->position >= f->length)
{
*pdirent = NULL;
return L9660_OK;
}
if ((rv = prebuffer(f)))
return rv;
char *off = BUF(f) + fsectoff(f);
if (*off == 0) {
if (*off == 0)
{
// Padded end of sector
f->position = fnextsectpos(f);
goto rebuffer;
}
l9660_dirent *dirent = (l9660_dirent *) off;
l9660_dirent *dirent = (l9660_dirent *)off;
f->position += aligneven(dirent->length);
*pdirent = dirent;
return L9660_OK;
}
l9660_status l9660_openat(l9660_file *child, l9660_dir *parent, const char *name) {
l9660_status l9660_openat(l9660_file *child, l9660_dir *parent, const char *name)
{
return openat_raw(child, parent, name, false);
}
/*! Seek the file to \p offset from \p whence */
l9660_status l9660_seek(l9660_file *f, int whence, int32_t offset) {
l9660_status l9660_seek(l9660_file *f, int whence, int32_t offset)
{
l9660_status rv;
uint32_t cursect = fsector(f);
switch (whence) {
case SEEK_SET:
f->position = offset;
break;
switch (whence)
{
case SEEK_SET:
f->position = offset;
break;
case SEEK_CUR:
f->position = f->position + offset;
break;
case SEEK_CUR:
f->position = f->position + offset;
break;
case SEEK_END:
f->position = f->length - offset;
break;
case SEEK_END:
f->position = f->length - offset;
break;
}
if (fsector(f) != cursect && fsectoff(f) != 0) {
if (fsector(f) != cursect && fsectoff(f) != 0)
{
if ((rv = buffer(f)))
return rv;
}
@ -277,11 +299,13 @@ l9660_status l9660_seek(l9660_file *f, int whence, int32_t offset) {
return L9660_OK;
}
uint32_t l9660_tell(l9660_file *f) {
uint32_t l9660_tell(l9660_file *f)
{
return f->position;
}
l9660_status l9660_read(l9660_file *f, void *buf, size_t size, size_t *read) {
l9660_status l9660_read(l9660_file *f, void *buf, size_t size, size_t *read)
{
l9660_status rv;
if ((rv = prebuffer(f)))
@ -301,28 +325,172 @@ l9660_status l9660_read(l9660_file *f, void *buf, size_t size, size_t *read) {
return L9660_OK;
}
bool read_sector(l9660_fs *fs, void *buf, uint32_t sector,uint8_t disk_number){
return false;
bool read_sector(l9660_fs *fs, void *buf, uint32_t sector)
{
return CDROM_Read(sector,1,buf,fs->disk_number);
}
bool ISO_Check(uint8_t disk_number){
l9660_openfs(fs,read_sector,disk_number);
return false;
bool ISO_Check(uint8_t disk_number)
{
unsigned char *buffer = kmalloc(2049); // 假设扇区大小为 2048 字节
bool ok = CDROM_Read(16, 1, buffer, disk_number);
if (buffer[0] == 0x01 && buffer[1] == 'C' && buffer[2] == 'D' && buffer[3] == '0' &&
buffer[4] == '0' && buffer[5] == '1')
{
kfree(buffer);
return true; // 是 ISO9660 文件系统
}
else
{
kfree(buffer);
return false; // 不是 ISO9660 文件系统
}
}
void ISO_InitFs(struct vfs_t *vfs, uint8_t disk_number){
void ISO_InitFs(struct vfs_t *vfs, uint8_t disk_number)
{
fs = (l9660_fs *)kmalloc(sizeof(l9660_fs));
vfs->cache = (void *)fs;
printf("ISO Load init...");
l9660_status a = l9660_openfs(fs,read_sector,disk_number);
a = l9660_fs_open_root(root_dir, fs);
printf("%d\n",a);
/*
l9660_file file;
for (;;) {
l9660_dirent *dent;
l9660_readdir(root_dir, &dent);
if (dent == 0)
break;
printf("%.*s\n", dent->name_len, dent->name);
}
a = l9660_openat(&file, dir, "fuck.txt");
if(a) {
printf("failed\n");
for(;;);
}
for(;;) {
char buf[128];
size_t read;
l9660_read(&file, buf, 128, &read);
if (read == 0)
break;
for(int i = 0;i<read;i++) {
printf("%c",buf[i]);
}
}
while (1)
asm("hlt");
*/
}
void ISO_CDFile(){}
vfs_file *ISO_GetFile(char* path1){
l9660_dir bmpDict;
char *path = (char *)kmalloc(strlen(path1) + 1);
char *bmp = path;
strcpy(path, path1);
strtoupper(path);
if (strncmp("/", path, 1) == 0) {
path += 1;
bmpDict = root_dir;
}
if (path[0] == '\\' || path[0] == '/') {
// 跳过反斜杠和正斜杠
for (int i = 0; i < strlen(path); i++) {
if (path[i] != '\\' && path[i] != '/') {
path += i;
break;
}
}
}
char *temp_name = (char *)kmalloc(128);
int i = 0;
l9660_file *finfo;
while (1) {
int j;
for (j = 0; i < strlen(path); i++, j++) {
if (path[i] == '\\' || path[i] == '/') {
temp_name[j] = '\0';
i++;
break;
}
temp_name[j] = path[i];
}
finfo = dict_search(temp_name, bmpDict, get_directory_max(bmpDict, vfs));
if (finfo == 0) {
if (path[i] != 0) {
bmpDict = NULL;
}
goto END;
} else {
if (get_clustno(finfo->clustno_high, finfo->clustno_low) != 0) {
for (int count = 1;
FindForCount(count, get_dm(vfs).directory_clustno_list) != NULL;
count++) {
struct List *list =
FindForCount(count, get_dm(vfs).directory_clustno_list);
if (get_clustno(finfo->clustno_high, finfo->clustno_low) ==
list->val) {
list = FindForCount(count, get_dm(vfs).directory_list);
bmpDict = (struct FAT_FILEINFO *)list->val;
break;
}
}
} else {
bmpDict = root_dir;
}
memclean(temp_name, 128);
if (path[i] == '\0') {
goto END;
}
}
}
END:
kfree((void *)temp_name);
kfree(((void *)bmp));
return bmpDict;
}
void ISO_CopyCache(struct vfs_t *dest, struct vfs_t *src){
dest->cache = kmalloc(sizeof(l9660_fs));
memcpy(dest->cache, src->cache, sizeof(l9660_fs));
}
void ISO_cd(struct vfs_t *vfs, char *dictName){
}
void init_iso9660(){
void ISO_ReadFile(struct vfs_t *vfs, char *path, char *buffer){
}
void ISO_ListFile(struct vfs_t *vfs, char *dictpath){
}
void init_iso9660()
{
vfs_t fs;
fs.flag = 1;
fs.cache = NULL;
strcpy(fs.FSName, "ISO9660");
fs.CopyCache = ISO_CopyCache;
fs.Check = ISO_Check;
fs.InitFs = ISO_InitFs;
fs.CreateFile = ISO_CDFile;
fs.CreateDict = ISO_CDFile;
fs.DelDict = ISO_CDFile;
fs.DelFile = ISO_CDFile;
fs.cd = ISO_cd;
fs.ReadFile = ISO_ReadFile;
fs.ListFile = ISO_ListFile;
//vfs_register_fs(fs);
vfs_register_fs(fs);
}

View File

@ -60,6 +60,7 @@ static vfs_t *check_disk_fs(uint8_t disk_number) {
}
}
}
return NULL;
}
@ -78,12 +79,12 @@ bool vfs_mount_disk(uint8_t disk_number, uint8_t drive) {
return false;
}
}
vfs_t *seat = findSeat(vfsMount_Stl);
if (!seat) {
printf("can not find a seat of vfsMount_Stl(it's full)\n");
return false;
}
vfs_t *fs = check_disk_fs(disk_number);
if (!fs) {
printf("[FileSystem]: Unknown file system.\n");

28
src/include/file.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef CRASHPOWEROS_FILE_H
#define CRASHPOWEROS_FILE_H
#define EOF -1
#define CANREAD(flag) ((flag)&READ || (flag)&PLUS)
#define CANWRITE(flag) ((flag)&WRITE || (flag)&PLUS || (flag)&APPEND)
#define READ 0x2
#define WRITE 0x4
#define APPEND 0x8
#define BIN 0x0
#define PLUS 0x10
#include <stddef.h>
#include "vfs.h"
int fgetc(FILE *stream);
FILE *fopen(char *filename, char *mode);
unsigned int fread(void *buffer, unsigned int size, unsigned int count,
FILE *stream);
int fclose(FILE *fp);
char *fgets(char *str, int n, FILE *stream);
int fputs(const char *str, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
int fputc(int ch, FILE *stream);
unsigned int fwrite(const void *ptr, unsigned int size, unsigned int nmemb,
FILE *stream);
#endif

View File

@ -138,6 +138,7 @@ typedef struct l9660_fs {
/* read_sector func */
bool (*read_sector)(struct l9660_fs *fs, void *buf, uint32_t sector);
int disk_number;
} l9660_fs;
typedef struct {
@ -163,7 +164,7 @@ l9660_status l9660_openat(l9660_file *child, l9660_dir *parent, const char *name
l9660_status l9660_readdir(l9660_dir *dir, l9660_dirent **pdirent);
l9660_status l9660_opendirat(l9660_dir *dir, l9660_dir *parent, const char *path);
l9660_status l9660_fs_open_root(l9660_dir *dir, l9660_fs *fs);
l9660_status l9660_openfs(l9660_fs *fs, bool (*read_sector)(l9660_fs *fs, void *buf, uint32_t sector,uint8_t disk_number),uint8_t disk_number);
l9660_status l9660_openfs(l9660_fs *fs, bool (*read_sector)(l9660_fs *fs, void *buf, uint32_t sector),uint8_t disk_number);
void init_iso9660();
#endif

View File

@ -11,6 +11,8 @@ void printf(const char *formet, ...);
void print(char *message);
void printk(const char *formet, ...);
void putchar(char c);
void logk(char *message);
void logkf(char *formet,...);
void screen_clear();
#endif //CRASHPOWEROS_PRINTF_H

80
src/include/sb16.h Normal file
View File

@ -0,0 +1,80 @@
#ifndef CRASHPOWEROS_SB16_H
#define CRASHPOWEROS_SB16_H
#define SB_MIXER 0x224 // DSP 混合器端口
#define SB_MIXER_DATA 0x225 // DSP 混合器数据端口
#define SB_RESET 0x226 // DSP 重置
#define SB_READ 0x22A // DSP 读
#define SB_WRITE 0x22C // DSP 写
#define SB_STATE 0x22E // DSP 读状态
#define SB_INTR16 0x22F // DSP 16 位中断响应
#define CMD_STC 0x40 // Set Time Constant
#define CMD_SOSR 0x41 // Set Output Sample Rate
#define CMD_SISR 0x42 // Set Input Sample Rate
#define CMD_SINGLE_IN8 0xC8 // Transfer mode 8bit input
#define CMD_SINGLE_OUT8 0xC0 // Transfer mode 8bit output
#define CMD_SINGLE_IN16 0xB8 // Transfer mode 16bit input
#define CMD_SINGLE_OUT16 0xB0 // Transfer mode 16bit output
#define CMD_AUTO_IN8 0xCE // Transfer mode 8bit input auto
#define CMD_AUTO_OUT8 0xC6 // Transfer mode 8bit output auto
#define CMD_AUTO_IN16 0xBE // Transfer mode 16bit input auto
#define CMD_AUTO_OUT16 0xB6 // Transfer mode 16bit output auto
#define CMD_ON 0xD1 // Turn speaker on
#define CMD_OFF 0xD3 // Turn speaker off
#define CMD_SP8 0xD0 // Stop playing 8 bit channel
#define CMD_RP8 0xD4 // Resume playback of 8 bit channel
#define CMD_SP16 0xD5 // Stop playing 16 bit channel
#define CMD_RP16 0xD6 // Resume playback of 16 bit channel
#define CMD_VERSION 0xE1 // Turn speaker off
#define MODE_MONO8 0x00
// #define MODE_STEREO8 0x20
// #define MODE_MONO16 0x10
#define MODE_STEREO16 0x30
#define STATUS_READ 0x80 // read buffer status
#define STATUS_WRITE 0x80 // write buffer status
#define DMA_BUF_ADDR 0x90000 // 不能跨越 64K 边界
#define DMA_BUF_SIZE 0x8000 // 缓冲区长度
#define SAMPLE_RATE 44100 // 采样率
#define SB16_IRQ 5
#include "task.h"
#include "common.h"
#include "isr.h"
struct WAV16_HEADER {
char riff[4];
int size;
char wave[4];
char fmt[4];
int fmt_size;
short format;
short channel;
int sample_rate;
int byte_per_sec;
} __attribute__((packed));
struct sb16 {
struct task_struct *use_task;
int status;
char* addr; // DMA 地址
uint8_t mode; // 模式
uint8_t channel; // DMA 通道
uint8_t flag;
};
void disable_sb16();
void sb16_handler(registers_t *reg);
int sb16_set(int cmd, void* args);
int sb16_write(char* data, size_t size);
void wav_player(char* filename);
#endif

12
src/include/serial.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef CRASHPOWEROS_SERIAL_H
#define CRASHPOWEROS_SERIAL_H
#define SERIAL_PORT 0x3f8
int init_serial();
int serial_received();
char read_serial();
int is_transmit_empty();
void write_serial(char a);
#endif

View File

@ -40,12 +40,16 @@ int rw_vdisk(char drive, unsigned int lba, unsigned char *buffer,
int have_vdisk(char drive);
void Disk_Read(unsigned int lba, unsigned int number, void *buffer,
char drive);
bool CDROM_Read(unsigned int lba, unsigned int number, void *buffer,
char drive);
unsigned int disk_Size(char drive);
int DiskReady(char drive);
void Disk_Write(unsigned int lba, unsigned int number, void *buffer,
char drive);
unsigned int GetDriveCode(unsigned char *name);
bool SetDrive(unsigned char *name);
void Disk_Read2048(unsigned int lba, unsigned int number, void *buffer,
char drive);
void DriveSemaphoreGive(unsigned int drive_code);
bool DriveSemaphoreTake(unsigned int drive_code);

View File

@ -19,8 +19,11 @@
#include "../include/fat.h"
#include "../include/iso9660.h"
#define CHECK_FLAG(flags,bit) ((flags) & (1 << (bit)))
extern uint32_t end;
extern int status;
extern vdisk vdisk_ctl[10];
uint32_t placement_address = (uint32_t) & end;
void reset_kernel(){
@ -68,7 +71,7 @@ void kernel_main(multiboot_t *multiboot) {
initVBE(multiboot);
printf("[kernel]: VGA driver load success!\n");
printf("[kernel]: VBE driver load success!\n");
gdt_install();
idt_install();
printf("[kernel]: description table config success!\n");
@ -76,26 +79,37 @@ void kernel_main(multiboot_t *multiboot) {
acpi_install();
printf("[kernel]: ACPI enable success!\n");
init_page(multiboot);
printf("[kernel]: page set success!\n");
init_sched();
printf("[kernel]: task load success!\n");
init_keyboard();
printf("[kernel]: Keyboard driver load success!\n");
io_sti();
//kernel_thread(cur_task,NULL,"CPOS-VBE-SERVICE");
init_pit();
io_sti();
init_pci();
printf("[kernel]: PCI driver load success!\n");
init_vdisk();
ide_initialize(0x1F0, 0x3F6, 0x170, 0x376, 0x000);
printf("[kernel]: Disk driver load success!\n");
init_vfs();
Register_fat_fileSys();
printf("iso\n");
init_iso9660();
printf("[kernel]: FileSystem load success!\n");
syscall_install();
vfs_mount_disk('A','A');
for (int i = 0; i < 10; i++) {
if (vdisk_ctl[i].flag) {
vdisk vd = vdisk_ctl[i];
char id = i + ('A');
vfs_mount_disk(id,id);
}
}
//vfs_mount_disk('A','A');
if(vfs_change_disk('A'))
printf("[FileSystem]: Change disk win!\n");

View File

@ -6,6 +6,7 @@
#include "../include/cmos.h"
#include "../include/vdisk.h"
#include "../include/vfs.h"
#include "../include/sb16.h"
extern Queue *key_char_queue;
extern vdisk vdisk_ctl[10];
@ -213,6 +214,14 @@ void cmd_cd(int argc, char **argv) {
if (vfs_change_path(argv[1]) == 0) printf("Invalid path.\n");
}
void cmd_sb3(int argc, char **argv) {
if (argc == 1) {
print("[Shell-SB3]: If there are too few parameters, please specify the path.\n");
return;
}
wav_player(argv[1]);
}
void cmd_type(int argc,char ** argv){
if (argc == 1) {
print("[Shell-TYPE]: If there are too few parameters, please specify the path.\n");
@ -247,6 +256,19 @@ void cmd_disk(int argc, char **argv) {
}
printf("\n");
return;
} else if(!strcmp("cg", argv[1])){
if(argc < 2){
printf("Please type disk ID\n");
return;
}
if (strlen(argv[2]) > 1) {
printf("[DISK]: Cannot found disk.\n");
return;
}
if(have_vdisk(argv[2][0])){
vfs_change_disk(argv[2][0]);
} else printf("[DISK]: Cannot found disk.\n");
return;
}
if (strlen(argv[1]) > 1) {
@ -370,6 +392,8 @@ void setup_shell() {
cmd_disk(argc, argv);
else if (!strcmp("cd", argv[0]))
cmd_cd(argc, argv);
else if (!strcmp("sb3", argv[0]))
cmd_sb3(argc, argv);
else if (!strcmp("help", argv[0]) || !strcmp("?", argv[0]) || !strcmp("h", argv[0])) {
print("-=[CoolPotShell Helper]=-\n");
print("help ? h Print shell help info.\n");
@ -383,8 +407,9 @@ void setup_shell() {
print("reset Reset OS.\n");
print("shutdown exit Shutdown OS.\n");
print("debug Print os debug info.\n");
print("disk [list|<ID>] List or view disks.\n");
print("disk[list|<ID>|cg<ID>]List or view disks.\n");
print("cd <path> Change shell top directory.\n");
print("sb3 <name> Player a wav sound file.\n");
} else printf("\033[Shell]: Unknown command '%s'.\n", argv[0]);
}
}

View File

@ -507,3 +507,262 @@ const uint8_t plfont[] =
0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3c,0x44,0x42,0x42,0xe7,0x00,0x00,
};
uint8_t bafont[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x44,0x82,0xaa,0xaa,0x82,0x82,0xaa,0x92,0x44,0x38,0x00,0x00,0x00,
0x00,0x00,0x38,0x7c,0xfe,0xd6,0xd6,0xfe,0xfe,0xd6,0xee,0x7c,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x6c,0xfe,0xfe,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x54,0xfe,0x54,0x10,0x38,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0xd6,0x10,0x38,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00,0x00,0x00,0x00,0x00,
0xff,0xff,0xff,0xff,0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff,0xff,0xff,0xff,0xff,
0x00,0x10,0x38,0x54,0x92,0x10,0x10,0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x00,0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x10,0x10,0xfe,0x10,0x10,0x10,0x00,0x00,
0x00,0x00,0x0c,0x0e,0x0b,0x0b,0x0a,0x08,0x08,0x18,0x78,0xf8,0x70,0x00,0x00,0x00,
0x00,0x00,0x1f,0x1f,0x11,0x11,0x11,0x11,0x11,0x11,0x77,0xff,0x66,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x54,0x38,0x28,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,
0x00,0x02,0x06,0x0e,0x1e,0x3e,0x7e,0xfe,0x7e,0x3e,0x1e,0x0e,0x06,0x02,0x00,0x00,
0x00,0x00,0x10,0x38,0x54,0x92,0x10,0x10,0x10,0x92,0x54,0x38,0x10,0x00,0x00,0x00,
0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x44,0x44,0x00,0x00,
0x00,0x3e,0x4a,0x8a,0x8a,0x8a,0x8a,0x4a,0x3a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x00,
0x7c,0x82,0x40,0x20,0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x08,0x04,0x82,0x7c,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0x00,0x00,
0x00,0x00,0x10,0x38,0x54,0x92,0x10,0x10,0x10,0x92,0x54,0x38,0x10,0x7c,0x00,0x00,
0x00,0x10,0x38,0x54,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x92,0x54,0x38,0x10,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x08,0x04,0xfe,0x04,0x08,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x20,0x40,0xfe,0x40,0x20,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xfe,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x28,0x44,0xfe,0x44,0x28,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x10,0x38,0x38,0x7c,0x7c,0xfe,0xfe,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xfe,0xfe,0x7c,0x7c,0x38,0x38,0x10,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x66,0x66,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x44,0x44,0x44,0xfe,0x44,0x44,0xfe,0x44,0x44,0x44,0x00,0x00,0x00,
0x10,0x10,0x7c,0x92,0x92,0x50,0x38,0x14,0x92,0x92,0x7c,0x10,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x60,0x92,0x96,0x6c,0x18,0x30,0x6c,0xd2,0x92,0x0c,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x20,0x76,0x88,0x88,0x88,0x76,0x00,0x00,0x00,
0x04,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x0c,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x0c,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x18,0xff,0x18,0x66,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x08,0x10,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x8e,0x9a,0xb2,0xa2,0xc2,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x08,0x08,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x7e,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0xc2,0x82,0x02,0x04,0x08,0x10,0x20,0x40,0xff,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x02,0x02,0x3c,0x02,0x02,0x02,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x0c,0x14,0x24,0x44,0x84,0x84,0xfe,0x04,0x04,0x1e,0x00,0x00,0x00,
0x00,0x00,0x00,0xfe,0x80,0x80,0x80,0xfc,0x02,0x02,0x02,0xc2,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x80,0x80,0xfc,0x82,0x82,0x82,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0xfe,0x82,0x82,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x82,0x7c,0x82,0x82,0x82,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x82,0x82,0x7e,0x02,0x02,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x08,0x08,0x10,0x00,
0x00,0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x02,0x04,0x08,0x08,0x00,0x08,0x08,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3c,0x42,0x9d,0xa5,0xa5,0xad,0xb6,0x40,0x3c,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0x82,0x00,0x00,0x00,
0x00,0x00,0x00,0xfc,0x42,0x42,0x42,0x7c,0x42,0x42,0x42,0x42,0xfc,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x80,0x80,0x80,0x80,0x82,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0xfc,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xfc,0x00,0x00,0x00,
0x00,0x00,0x00,0xfe,0x42,0x40,0x40,0x78,0x78,0x40,0x40,0x42,0xfe,0x00,0x00,0x00,
0x00,0x00,0x00,0xfe,0x42,0x40,0x48,0x78,0x48,0x40,0x40,0x40,0xf0,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x80,0x80,0x8e,0x82,0x82,0x82,0x7e,0x00,0x00,0x00,
0x00,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0x82,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x0e,0x04,0x04,0x04,0x04,0x04,0x84,0x84,0x84,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0xc2,0x42,0x42,0x42,0x44,0x78,0x44,0x42,0x42,0xc2,0x00,0x00,0x00,
0x00,0x00,0x00,0xf0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0xfe,0x00,0x00,0x00,
0x00,0x00,0x00,0x81,0xc3,0xa5,0x99,0x81,0x81,0x81,0x81,0x81,0x81,0x00,0x00,0x00,
0x00,0x00,0x00,0x82,0x82,0xc2,0xa2,0x92,0x8a,0x86,0x82,0x82,0x82,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0xfc,0x42,0x42,0x42,0x42,0x7c,0x40,0x40,0x40,0xf0,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x92,0x8a,0x7c,0x02,0x00,0x00,
0x00,0x00,0x00,0xfc,0x42,0x42,0x42,0x42,0x7c,0x44,0x44,0x42,0xe2,0x00,0x00,0x00,
0x00,0x00,0x00,0x7c,0x82,0x82,0x40,0x38,0x04,0x02,0x82,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0xfe,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x24,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x99,0xa5,0x42,0x00,0x00,0x00,
0x00,0x00,0x00,0x81,0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,0x81,0x00,0x00,0x00,
0x00,0x00,0x00,0x82,0x82,0x82,0x44,0x38,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0xff,0x81,0x01,0x02,0x04,0x08,0x10,0x20,0x41,0xff,0x00,0x00,0x00,
0x00,0x00,0x00,0x3c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x3c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x3c,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,
0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x78,0x04,0x7c,0x84,0x84,0x84,0x8c,0x72,0x00,0x00,0x00,
0x00,0x00,0x00,0xc0,0x40,0x40,0x7c,0x42,0x42,0x42,0x42,0x42,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x82,0x80,0x80,0x80,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x1c,0x04,0x04,0x7c,0x84,0x84,0x84,0x84,0x8c,0x76,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x82,0x82,0xfe,0x80,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x1c,0x22,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x84,0x84,0x84,0x84,0x84,0x7c,0x04,0x84,0x78,
0x00,0x00,0x00,0xc0,0x40,0x40,0x5c,0x66,0x42,0x42,0x42,0x42,0xc2,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x18,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,
0x00,0x00,0x00,0x06,0x06,0x00,0x0e,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x42,0x3c,
0x00,0x00,0x00,0xc0,0x40,0x40,0x42,0x44,0x48,0x78,0x44,0x42,0xc2,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3c,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0xa5,0x99,0x81,0x81,0x81,0x81,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x42,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x42,0x42,0x42,0x42,0x42,0x7c,0x40,0x40,0xe0,
0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x84,0x84,0x84,0x84,0x84,0x7c,0x04,0x04,0x0e,
0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x62,0x40,0x40,0x40,0x40,0xe0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x82,0x60,0x18,0x04,0x82,0x7c,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x10,0x7e,0x10,0x10,0x10,0x10,0x12,0x0c,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x7a,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x81,0x81,0x42,0x24,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x81,0x81,0x99,0xa5,0xc3,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x42,0x24,0x18,0x24,0x42,0x81,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x6c,0x10,0x20,0x40,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x84,0x08,0x10,0x20,0x42,0xfe,0x00,0x00,0x00,
0x00,0x00,0x00,0x0e,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0e,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x70,0x00,0x00,0x00,
0x00,0x00,0x72,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x28,0x44,0x82,0xfe,0x82,0xfe,0x00,0x00,0x00,0x00,0x00,
0x00,0x38,0x44,0x82,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x82,0x44,0x38,0x10,0x20,
0x00,0x00,0x24,0x24,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x42,0x3e,0x00,0x00,
0x0c,0x08,0x10,0x00,0x00,0x38,0x44,0x82,0x82,0xfe,0x80,0x82,0x44,0x38,0x00,0x00,
0x00,0x10,0x28,0x44,0x00,0x78,0x04,0x04,0x3c,0x44,0x84,0x84,0x44,0x3e,0x00,0x00,
0x00,0x00,0x24,0x24,0x00,0x78,0x04,0x04,0x3c,0x44,0x84,0x84,0x44,0x3e,0x00,0x00,
0x10,0x08,0x04,0x00,0x00,0x78,0x04,0x04,0x3c,0x44,0x84,0x84,0x44,0x3e,0x00,0x00,
0x00,0x18,0x24,0x18,0x00,0x78,0x04,0x04,0x3c,0x44,0x84,0x84,0x44,0x3e,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x3c,0x08,0x10,
0x00,0x10,0x28,0x44,0x00,0x38,0x44,0x82,0x82,0xfe,0x80,0x82,0x44,0x38,0x00,0x00,
0x00,0x00,0x24,0x24,0x00,0x38,0x44,0x82,0x82,0xfe,0x80,0x82,0x44,0x38,0x00,0x00,
0x10,0x08,0x04,0x00,0x00,0x38,0x44,0x82,0x82,0xfe,0x80,0x82,0x44,0x38,0x00,0x00,
0x00,0x00,0x24,0x24,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x00,0x10,0x28,0x44,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x10,0x08,0x04,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x24,0x24,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0x82,0x00,0x00,
0x00,0x38,0x44,0x38,0x44,0x82,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0x82,0x00,0x00,
0x0c,0x08,0x10,0xfe,0x80,0x80,0x80,0x80,0xf8,0x80,0x80,0x80,0x80,0xfe,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x60,0x1c,0x12,0x72,0x9e,0x90,0x90,0x92,0x6c,0x00,0x00,
0x0c,0x10,0x20,0x28,0x28,0x28,0xfe,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x00,0x00,
0x00,0x10,0x28,0x44,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x00,0x00,0x24,0x24,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x10,0x08,0x04,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x00,0x10,0x28,0x44,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x42,0x3e,0x00,0x00,
0x10,0x08,0x04,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x42,0x3e,0x00,0x00,
0x00,0x00,0x24,0x24,0x00,0x82,0x82,0x44,0x44,0x28,0x28,0x10,0x10,0x20,0x20,0x40,
0x24,0x24,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x24,0x24,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x00,0x28,0x28,0x28,0x3c,0x6a,0xa8,0xa8,0xa8,0xa8,0xa8,0x6a,0x3c,0x28,0x28,0x28,
0x00,0x0c,0x12,0x20,0x20,0x20,0xfc,0x20,0x20,0x20,0x60,0xa0,0xb2,0x4c,0x00,0x00,
0x00,0x82,0x82,0x44,0x28,0x10,0xfe,0x10,0x10,0xfe,0x10,0x10,0x10,0x10,0x00,0x00,
0x00,0xe0,0x90,0x88,0x88,0x88,0x94,0xe4,0x9f,0x84,0x84,0x84,0x84,0x84,0x00,0x00,
0x00,0x0c,0x12,0x10,0x10,0x10,0xfe,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00,
0x0c,0x08,0x10,0x00,0x00,0x78,0x04,0x04,0x3c,0x44,0x84,0x84,0x44,0x3e,0x00,0x00,
0x0c,0x08,0x10,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x0c,0x08,0x10,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x0c,0x08,0x10,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x42,0x3e,0x00,0x00,
0x00,0x12,0x2a,0x24,0x00,0xf8,0x84,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x00,
0x12,0x2a,0x24,0x00,0x82,0xc2,0xc2,0xa2,0x92,0x92,0x8a,0x86,0x86,0x82,0x00,0x00,
0x00,0x00,0x00,0x78,0x04,0x04,0x3c,0x44,0x84,0x84,0x44,0x3e,0x00,0xfe,0x00,0x00,
0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0xfe,0x00,0x00,
0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x20,0x44,0x82,0x82,0x82,0x44,0x38,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x80,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x02,0x02,0x02,0x00,0x00,
0x00,0x10,0x30,0x10,0x10,0x10,0x00,0xfe,0x00,0x78,0x04,0x38,0x40,0x7c,0x00,0x00,
0x00,0x10,0x30,0x10,0x10,0x10,0x00,0xfe,0x00,0x18,0x28,0x48,0x7c,0x08,0x00,0x00,
0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x00,0x00,0x00,0x00,0x12,0x24,0x48,0x90,0x90,0x48,0x24,0x12,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x90,0x48,0x24,0x12,0x12,0x24,0x48,0x90,0x00,0x00,0x00,0x00,
0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,
0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,
0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xf0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xf0,0x10,0xf0,0x10,0x10,0x10,0x10,0x10,0x10,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xf4,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x10,0xf0,0x10,0x10,0x10,0x10,0x10,0x10,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xf4,0x04,0xf4,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x04,0xf4,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xf4,0x04,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xf0,0x10,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1f,0x10,0x1f,0x10,0x10,0x10,0x10,0x10,0x10,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x17,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x17,0x10,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x10,0x17,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xf7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xf7,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x17,0x10,0x17,0x14,0x14,0x14,0x14,0x14,0x14,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xf7,0x00,0xf7,0x14,0x14,0x14,0x14,0x14,0x14,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x10,0x10,0x10,0x10,0x10,0x10,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1f,0x10,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x10,0x1f,0x10,0x10,0x10,0x10,0x10,0x10,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x14,0x14,0x14,0x14,0x14,0x14,0x14,0xf7,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xff,0x10,0xff,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,
0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

View File

@ -1,6 +1,7 @@
#include "../include/printf.h"
#include "../include/common.h"
#include "../include/graphics.h"
#include "../include/serial.h"
static int skip_atoi(const char **s) {
int i = 0;
@ -319,4 +320,19 @@ void print(char *message) {
if(vbe_status){
vbe_writestring(message);
} else vga_writestring(message);
}
void logkf(char *formet,...){
int len;
va_list ap;
va_start(ap, formet);
char *buf[1024] = {0};
len = vsprintf(buf, formet, ap);
logk(buf);
va_end(ap);
}
void logk(char *message){
for (size_t i = 0; i < strlen(message); i++)
write_serial(message[i]);
}