mirror of
https://github.com/yourtion/30dayMakeOS.git
synced 2026-02-05 11:03:22 +08:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9aa36a0f96 | ||
|
|
9bb71ea5ce | ||
|
|
f8b2930281 | ||
|
|
c462063e0b | ||
|
|
dade193e1f | ||
|
|
670d454b4e | ||
|
|
6ee187a190 | ||
|
|
7d59920a37 | ||
|
|
b308a9e295 | ||
|
|
a28136d3de | ||
|
|
438eeb5135 | ||
|
|
d9d034cf43 | ||
|
|
c8be7ff36f | ||
|
|
140774a293 | ||
|
|
7c2fc66927 | ||
|
|
636c1a8c3d | ||
|
|
c177821913 | ||
|
|
febac10ebf | ||
|
|
0e31ff06ca |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1 +1,5 @@
|
||||
*.hrb
|
||||
*.lst
|
||||
*.map
|
||||
*.bim
|
||||
*.hrb
|
||||
@@ -12,15 +12,15 @@
|
||||
DW 224 ; 根目录大小(一般为224项)
|
||||
DW 2880 ; 该磁盘大小(必须为2880扇区1440*1024/512)
|
||||
DB 0xf0 ; 磁盘类型(必须为0xf0)
|
||||
DW 9 ; FAT的长度(必??9扇区)
|
||||
DW 9 ; FAT的长度(必须是9扇区)
|
||||
DW 18 ; 一个磁道(track)有几个扇区(必须为18)
|
||||
DW 2 ; 磁头数(必??2)
|
||||
DW 2 ; 磁头数(必须是2)
|
||||
DD 0 ; 不使用分区,必须是0
|
||||
DD 2880 ; 重写一次磁盘大小
|
||||
DB 0,0,0x29 ; 意义不明(固定)
|
||||
DD 0xffffffff ; (可能是)卷标号码
|
||||
DB "HELLO-OS " ; 磁盘的名称(必须为11字?,不足填空格)
|
||||
DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格)
|
||||
DB "HELLO-OS " ; 磁盘的名称(必须为11字节,不足填空格)
|
||||
DB "FAT12 " ; 磁盘格式名称(必须是8字节,不足填空格)
|
||||
RESB 18 ; 先空出18字节
|
||||
|
||||
; 程序主体
|
||||
@@ -47,4 +47,4 @@
|
||||
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
RESB 4600
|
||||
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
RESB 1469432
|
||||
RESB 1469432
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code
|
||||
|
||||
JMP entry
|
||||
DB 0xeb, 0x4e, 0x90
|
||||
DB 0x90
|
||||
DB "HELLOIPL" ; 启动扇区名称(8字节)
|
||||
DW 512 ; 每个扇区(sector)大小(必须512字节)
|
||||
DB 1 ; 簇(cluster)大小(必须为1个扇区)
|
||||
|
||||
@@ -53,7 +53,7 @@ retry:
|
||||
MOV BX,0
|
||||
MOV DL,0x00 ; A驱动器
|
||||
INT 0x13 ; 调用磁盘BIOS
|
||||
JNC next ; 没出错则跳转到fin
|
||||
JNC next ; 没出错则跳转到next
|
||||
ADD SI,1 ; 往SI加1
|
||||
CMP SI,5 ; 比较SI与5
|
||||
JAE error ; SI >= 5 跳转到error
|
||||
|
||||
@@ -15,7 +15,7 @@ VRAM EQU 0x0ff8 ; 图像缓冲区的起始地址
|
||||
|
||||
ORG 0xc200 ; 这个的程序要被装载的内存地址
|
||||
|
||||
; 画面モードを設定
|
||||
; 设置画面模式
|
||||
|
||||
MOV AL,0x13 ; VGA显卡,320x200x8bit
|
||||
MOV AH,0x00
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -14,7 +14,7 @@ default :
|
||||
|
||||
#文件生成规则
|
||||
|
||||
haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \
|
||||
haribote.img : haribote/ipl10.bin haribote/haribote.sys Makefile \
|
||||
a/a.hrb hello3/hello3.hrb hello4/hello4.hrb hello5/hello5.hrb \
|
||||
winhelo/winhelo.hrb winhelo2/winhelo2.hrb winhelo3/winhelo3.hrb \
|
||||
star1/star1.hrb stars/stars.hrb stars2/stars2.hrb \
|
||||
@@ -25,7 +25,7 @@ haribote.img : haribote/ipl20.bin haribote/haribote.sys Makefile \
|
||||
notrec/notrec.hrb bball/bball.hrb invader/invader.hrb \
|
||||
calc/calc.hrb tview/tview.hrb mmlplay/mmlplay.hrb gview/gview.hrb
|
||||
$(EDIMG) imgin:../z_tools/fdimg0at.tek \
|
||||
wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \
|
||||
wbinimg src:haribote/ipl10.bin len:512 from:0 to:0 \
|
||||
copy from:haribote/haribote.sys to:@: \
|
||||
copy from:haribote/jp.nas to:@: \
|
||||
copy from:make.bat to:@: \
|
||||
|
||||
@@ -3,3 +3,6 @@ STACK = 1k
|
||||
MALLOC = 0k
|
||||
|
||||
include ../app_make.txt
|
||||
|
||||
$(APP).hrb : $(APP).org Makefile
|
||||
$(COPY) $(APP).org $(APP).hrb
|
||||
|
||||
Binary file not shown.
@@ -35,10 +35,10 @@ $(STDAPP).bim : $(APP).obj $(STDLIBPATH)stdlib.lib Makefile ../app_make.txt
|
||||
$(OBJ2BIM) @$(RULEFILE) out:$(APP).bim map:$(APP).map stack:$(STACK) \
|
||||
$(APP).obj $(STDLIBPATH)stdlib.lib
|
||||
|
||||
haribote.img : ../haribote/ipl20.bin ../haribote/haribote.sys $(APP).hrb \
|
||||
haribote.img : ../haribote/ipl10.bin ../haribote/haribote.sys $(APP).hrb \
|
||||
Makefile ../app_make.txt
|
||||
$(EDIMG) imgin:../../z_tools/fdimg0at.tek \
|
||||
wbinimg src:../haribote/ipl20.bin len:512 from:0 to:0 \
|
||||
wbinimg src:../haribote/ipl10.bin len:512 from:0 to:0 \
|
||||
copy from:../haribote/haribote.sys to:@: \
|
||||
copy from:$(APP).hrb to:@: \
|
||||
copy from:../nihongo/nihongo.fnt to:@: \
|
||||
|
||||
@@ -23,13 +23,13 @@ DEL = del
|
||||
#默认动作
|
||||
|
||||
default :
|
||||
$(MAKE) ipl20.bin
|
||||
$(MAKE) ipl10.bin
|
||||
$(MAKE) haribote.sys
|
||||
|
||||
# 镜像文件生成
|
||||
|
||||
ipl20.bin : ipl20.nas Makefile
|
||||
$(NASK) ipl20.nas ipl20.bin ipl20.lst
|
||||
ipl10.bin : ipl10.nas Makefile
|
||||
$(NASK) ipl10.nas ipl10.bin ipl10.lst
|
||||
|
||||
asmhead.bin : asmhead.nas Makefile
|
||||
$(NASK) asmhead.nas asmhead.bin asmhead.lst
|
||||
@@ -75,5 +75,5 @@ clean :
|
||||
|
||||
src_only :
|
||||
$(MAKE) clean
|
||||
-$(DEL) ipl20.bin
|
||||
-$(DEL) ipl10.bin
|
||||
-$(DEL) haribote.sys
|
||||
|
||||
@@ -88,16 +88,16 @@ struct GATE_DESCRIPTOR {
|
||||
void init_gdtidt(void);
|
||||
void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar);
|
||||
void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar);
|
||||
#define ADR_IDT 0x0026f800
|
||||
#define LIMIT_IDT 0x000007ff
|
||||
#define ADR_GDT 0x00270000
|
||||
#define LIMIT_GDT 0x0000ffff
|
||||
#define ADR_IDT 0x0026f800
|
||||
#define LIMIT_IDT 0x000007ff
|
||||
#define ADR_GDT 0x00270000
|
||||
#define LIMIT_GDT 0x0000ffff
|
||||
#define ADR_BOTPAK 0x00280000
|
||||
#define LIMIT_BOTPAK 0x0007ffff
|
||||
#define AR_DATA32_RW 0x4092
|
||||
#define AR_CODE32_ER 0x409a
|
||||
#define AR_LDT 0x0082
|
||||
#define AR_TSS32 0x0089
|
||||
#define AR_LDT 0x0082
|
||||
#define AR_TSS32 0x0089
|
||||
#define AR_INTGATE32 0x008e
|
||||
|
||||
/* int.c */
|
||||
@@ -288,10 +288,10 @@ void file_loadfile(int clustno, int size, char *buf, int *fat, char *img);
|
||||
struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max);
|
||||
char *file_loadfile2(int clustno, int *psize, int *fat);
|
||||
|
||||
/* bootpack.c */
|
||||
struct TASK *open_constask(struct SHEET *sht, unsigned int memtotal);
|
||||
struct SHEET *open_console(struct SHTCTL *shtctl, unsigned int memtotal);
|
||||
|
||||
/* tek.c */
|
||||
int tek_getsize(unsigned char *p);
|
||||
int tek_decomp(unsigned char *p, char *q, int size);
|
||||
|
||||
/* bootpack.c */
|
||||
struct TASK *open_constask(struct SHEET *sht, unsigned int memtotal);
|
||||
struct SHEET *open_console(struct SHTCTL *shtctl, unsigned int memtotal);
|
||||
|
||||
@@ -347,7 +347,6 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
|
||||
{
|
||||
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
|
||||
struct FILEINFO *finfo;
|
||||
struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
|
||||
char name[18], *p, *q;
|
||||
struct TASK *task = task_now();
|
||||
int i, segsiz, datsiz, esp, dathrb, appsiz;
|
||||
@@ -570,13 +569,13 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int
|
||||
fh = &task->fhandle[i];
|
||||
reg[7] = 0;
|
||||
if (i < 8) {
|
||||
finfo = file_search((char *) ebx + ds_base, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
|
||||
finfo = file_search((char *) ebx + ds_base,
|
||||
(struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
|
||||
if (finfo != 0) {
|
||||
reg[7] = (int) fh;
|
||||
fh->buf = (char *) memman_alloc_4k(memman, finfo->size);
|
||||
fh->size = finfo->size;
|
||||
fh->pos = 0;
|
||||
file_loadfile2(finfo->clustno, &fh->size, task->fat);
|
||||
fh->buf = file_loadfile2(finfo->clustno, &fh->size, task->fat);
|
||||
}
|
||||
}
|
||||
} else if (edx == 22) {
|
||||
|
||||
Binary file not shown.
152
30_day/haribote/ipl10.nas
Normal file
152
30_day/haribote/ipl10.nas
Normal file
@@ -0,0 +1,152 @@
|
||||
; haribote-ipl
|
||||
; TAB=4
|
||||
|
||||
CYLS EQU 10 ; 声明CYLS=10
|
||||
|
||||
ORG 0x7c00 ; 指明程序装载地址
|
||||
|
||||
; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code
|
||||
|
||||
JMP entry
|
||||
DB 0x90
|
||||
DB "HARIBOTE" ; 启动扇区名称(8字节)
|
||||
DW 512 ; 每个扇区(sector)大小(必须512字节)
|
||||
DB 1 ; 簇(cluster)大小(必须为1个扇区)
|
||||
DW 1 ; FAT起始位置(一般为第一个扇区)
|
||||
DB 2 ; FAT个数(必须为2)
|
||||
DW 224 ; 根目录大小(一般为224项)
|
||||
DW 2880 ; 该磁盘大小(必须为2880扇区1440*1024/512)
|
||||
DB 0xf0 ; 磁盘类型(必须为0xf0)
|
||||
DW 9 ; FAT的长度(必9扇区)
|
||||
DW 18 ; 一个磁道(track)有几个扇区(必须为18)
|
||||
DW 2 ; 磁头数(必2)
|
||||
DD 0 ; 不使用分区,必须是0
|
||||
DD 2880 ; 重写一次磁盘大小
|
||||
DB 0,0,0x29 ; 意义不明(固定)
|
||||
DD 0xffffffff ; (可能是)卷标号码
|
||||
DB "HARIBOTEOS " ; 磁盘的名称(必须为11字?,不足填空格)
|
||||
DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格)
|
||||
RESB 18 ; 先空出18字节
|
||||
|
||||
; 程序主体
|
||||
|
||||
entry:
|
||||
MOV AX,0 ; 初始化寄存器
|
||||
MOV SS,AX
|
||||
MOV SP,0x7c00
|
||||
MOV DS,AX
|
||||
|
||||
; 读取磁盘
|
||||
|
||||
MOV AX,0x0820
|
||||
MOV ES,AX
|
||||
MOV CH,0 ; 柱面0
|
||||
MOV DH,0 ; 磁头0
|
||||
MOV CL,2 ; 扇区2
|
||||
MOV BX,18*2*CYLS-1 ; 要读取的合计扇区数
|
||||
CALL readfast ; 告诉读取
|
||||
|
||||
; 读取完毕,跳转到haribote.sys执行!
|
||||
MOV [0x0ff0],CH ; 记录IPL实际读取了多少内容
|
||||
JMP 0xc200
|
||||
|
||||
error:
|
||||
MOV AX,0
|
||||
MOV ES,AX
|
||||
MOV SI,msg
|
||||
putloop:
|
||||
MOV AL,[SI]
|
||||
ADD SI,1 ; 给SI加1
|
||||
CMP AL,0
|
||||
JE fin
|
||||
MOV AH,0x0e ; 显示一个文字
|
||||
MOV BX,15 ; 指定字符颜色
|
||||
INT 0x10 ; 调用显卡BIOS
|
||||
JMP putloop
|
||||
fin:
|
||||
HLT ; 让CPU停止,等待指令
|
||||
JMP fin ; 无限循环
|
||||
msg:
|
||||
DB 0x0a, 0x0a ; 换行两次
|
||||
DB "load error"
|
||||
DB 0x0a ; 换行
|
||||
DB 0
|
||||
|
||||
readfast: ; 使用AL尽量一次性读取数据 从此开始
|
||||
; ES:读取地址, CH:柱面, DH:磁头, CL:扇区, BX:读取扇区数
|
||||
|
||||
MOV AX,ES ; < 通过ES计算AL的最大值 >
|
||||
SHL AX,3 ; 将AX除以32,将结果存入AH(SHL是左移位指令)
|
||||
AND AH,0x7f ; AH是AH除以128所得的余数(512*128=64K)
|
||||
MOV AL,128 ; AL = 128 - AH; AH是AH除以128所得的余数(512*128=64K)
|
||||
SUB AL,AH
|
||||
|
||||
MOV AH,BL ; < 通过BX计算AL的最大值并存入AH >
|
||||
CMP BH,0 ; if (BH != 0) { AH = 18; }
|
||||
JE .skip1
|
||||
MOV AH,18
|
||||
.skip1:
|
||||
CMP AL,AH ; if (AL > AH) { AL = AH; }
|
||||
JBE .skip2
|
||||
MOV AL,AH
|
||||
.skip2:
|
||||
|
||||
MOV AH,19 ; < 通过CL计算AL的最大值并存入AH >
|
||||
SUB AH,CL ; AH = 19 - CL;
|
||||
CMP AL,AH ; if (AL > AH) { AL = AH; }
|
||||
JBE .skip3
|
||||
MOV AL,AH
|
||||
.skip3:
|
||||
|
||||
PUSH BX
|
||||
MOV SI,0 ; 计算失败次数的寄存器
|
||||
retry:
|
||||
MOV AH,0x02 ; AH=0x02 : 读取磁盘
|
||||
MOV BX,0
|
||||
MOV DL,0x00 ; A盘
|
||||
PUSH ES
|
||||
PUSH DX
|
||||
PUSH CX
|
||||
PUSH AX
|
||||
INT 0x13 ; 调用磁盘BIOS
|
||||
JNC next ; 没有出错的话则跳转至next
|
||||
ADD SI,1 ; 将SI加1
|
||||
CMP SI,5 ; 将SI与5比较
|
||||
JAE error ; SI >= 5则跳转至error
|
||||
MOV AH,0x00
|
||||
MOV DL,0x00 ; A盘
|
||||
INT 0x13 ; 驱动器重置
|
||||
POP AX
|
||||
POP CX
|
||||
POP DX
|
||||
POP ES
|
||||
JMP retry
|
||||
next:
|
||||
POP AX
|
||||
POP CX
|
||||
POP DX
|
||||
POP BX ; 将ES的内容存入BX
|
||||
SHR BX,5 ; 将BX由16字节为单位转换为512字节为单位
|
||||
MOV AH,0
|
||||
ADD BX,AX ; BX += AL;
|
||||
SHL BX,5 ; 将BX由512字节为单位转换为16字节为单位
|
||||
MOV ES,BX ; 相当于EX += AL * 0x20;
|
||||
POP BX
|
||||
SUB BX,AX
|
||||
JZ .ret
|
||||
ADD CL,AL ; 将CL加上AL
|
||||
CMP CL,18 ; 将CL与18比较
|
||||
JBE readfast ; CL <= 18则跳转至readfast
|
||||
MOV CL,1
|
||||
ADD DH,1
|
||||
CMP DH,2
|
||||
JB readfast ; DH < 2则跳转至readfast
|
||||
MOV DH,0
|
||||
ADD CH,1
|
||||
JMP readfast
|
||||
.ret:
|
||||
RET
|
||||
|
||||
RESB 0x7dfe-$ ; 到0x7dfe为止用0x00填充的指令
|
||||
|
||||
DB 0x55, 0xaa
|
||||
@@ -43,10 +43,8 @@ entry:
|
||||
MOV CH,0 ; 柱面0
|
||||
MOV DH,0 ; 磁头0
|
||||
MOV CL,2 ; 扇区2
|
||||
|
||||
readloop:
|
||||
MOV SI,0 ; 记录失败次数寄存器
|
||||
|
||||
retry:
|
||||
MOV AH,0x02 ; AH=0x02 : 读入磁盘
|
||||
MOV AL,1 ; 1个扇区
|
||||
@@ -82,8 +80,9 @@ next:
|
||||
JMP 0xc200
|
||||
|
||||
error:
|
||||
MOV AX,0
|
||||
MOV ES,AX
|
||||
MOV SI,msg
|
||||
|
||||
putloop:
|
||||
MOV AL,[SI]
|
||||
ADD SI,1 ; 给SI加1
|
||||
@@ -93,7 +92,6 @@ putloop:
|
||||
MOV BX,15 ; 指定字符颜色
|
||||
INT 0x10 ; 调用显卡BIOS
|
||||
JMP putloop
|
||||
|
||||
fin:
|
||||
HLT ; 让CPU停止,等待指令
|
||||
JMP fin ; 无限循环
|
||||
|
||||
@@ -16,8 +16,8 @@ void inthandler2c(int *esp)
|
||||
return;
|
||||
}
|
||||
|
||||
#define KEYCMD_SENDTO_MOUSE 0xd4
|
||||
#define MOUSECMD_ENABLE 0xf4
|
||||
#define KEYCMD_SENDTO_MOUSE 0xd4
|
||||
#define MOUSECMD_ENABLE 0xf4
|
||||
|
||||
void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec)
|
||||
{
|
||||
@@ -31,7 +31,7 @@ void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec)
|
||||
io_out8(PORT_KEYDAT, MOUSECMD_ENABLE);
|
||||
/* 顺利的话,ACK(0xfa)会被发送*/
|
||||
mdec->phase = 0; /* 等待鼠标的0xfa的阶段*/
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
|
||||
@@ -40,13 +40,15 @@ int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
|
||||
/* 等待鼠标的0xfa的阶段 */
|
||||
if (dat == 0xfa) {
|
||||
mdec->phase = 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (mdec->phase == 1) {
|
||||
/* 等待鼠标第一字节的阶段 */
|
||||
mdec->buf[0] = dat;
|
||||
mdec->phase = 2;
|
||||
if ((dat & 0xc8) == 0x08) {
|
||||
mdec->buf[0] = dat;
|
||||
mdec->phase = 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (mdec->phase == 2) {
|
||||
@@ -67,7 +69,7 @@ int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat)
|
||||
}
|
||||
if ((mdec->buf[0] & 0x20) != 0) {
|
||||
mdec->y |= 0xffffff00;
|
||||
}
|
||||
}
|
||||
mdec->y = - mdec->y; /* 鼠标的y方向与画面符号相反 */
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -231,7 +231,7 @@ static int tek_decode2(int siz, UCHAR *p, UCHAR *q)
|
||||
if (dsiz > bsiz || (hed & 0x21) != 0x01)
|
||||
return 1;
|
||||
if (hed & 0x40)
|
||||
tek_getnum_s7s(&p);
|
||||
tek_getnum_s7s(&p); /* <20>I<EFBFBD>v<EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ւ̃|<7C>C<EFBFBD><43><EFBFBD>^<5E><>ǂݔ<C782><EFBFBD> */
|
||||
st = tek_lzrestore_stk2(p1 - p, p, dsiz, q);
|
||||
}
|
||||
return st;
|
||||
@@ -278,7 +278,7 @@ static int tek_lzrestore_tek5(int srcsiz, UCHAR *src, int outsiz, UCHAR *outbuf)
|
||||
lp = pb;
|
||||
pb = wrksiz;
|
||||
}
|
||||
wrksiz = 0x180 * sizeof (UINT32) + (0x840 + (0x300 << (lc + lp))) * sizeof (tek_TPRB); /* Å’á15KB, lc+lp=3‚È‚çA36KB */
|
||||
wrksiz = 0x180 * sizeof (UINT32) + (0x840 + (0x300 << (lc + lp))) * sizeof (tek_TPRB); /* <EFBFBD>Œ<EFBFBD>15KB, lc+lp=3<EFBFBD>Ȃ<EFBFBD>A36KB */
|
||||
work = (int *) memman_alloc_4k((struct MEMMAN *) MEMMAN_ADDR, wrksiz);
|
||||
if (work == NULL)
|
||||
return -1;
|
||||
@@ -457,7 +457,7 @@ static int tek_decmain5(int *work, UCHAR *src, int osiz, UCHAR *q, int lc, int p
|
||||
for (i = sizeof (struct tek_STR_PRB) / sizeof (tek_TPRB) + (0x300 << (lc + lp)) - 2; i >= 0; i--)
|
||||
((tek_TPRB *) prb)[i] = 1 << 15;
|
||||
for (i = 0; i < 32; i++) {
|
||||
rd->bm[i].lt = (i >= 4);
|
||||
rd->bm[i].lt = (i >= 4); /* 0..3<EFBFBD>͎<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD> */
|
||||
rd->bm[i].lt0 = (i < 24) ? 16 * 1024 : 8 * 1024;
|
||||
rd->bm[i].s &= 0;
|
||||
rd->bm[i].t = rd->bm[i].m = 5;
|
||||
@@ -466,7 +466,7 @@ static int tek_decmain5(int *work, UCHAR *src, int osiz, UCHAR *q, int lc, int p
|
||||
if (stk) {
|
||||
rd->rmsk = -1 << 11;
|
||||
for (i = 0; i < 32; i++)
|
||||
rd->bm[i].lt = 0;
|
||||
rd->bm[i].lt = 0; /* <20>S<EFBFBD>Ď<EFBFBD><C48E><EFBFBD><EFBFBD>Ȃ<EFBFBD> */
|
||||
for (i = 0; i < 14; i++)
|
||||
rd->ptbm[i] = &rd->bm[0];
|
||||
} else {
|
||||
@@ -493,7 +493,7 @@ static int tek_decmain5(int *work, UCHAR *src, int osiz, UCHAR *q, int lc, int p
|
||||
rd->bm[22].t = 0; rd->bm[22].m = 1;
|
||||
prb->repg3 = 0xffff;
|
||||
if (flags == -2) { /* z1 */
|
||||
rd->bm[22].lt = 0;
|
||||
rd->bm[22].lt = 0; /* repg3<67><33>lt<6C><74>0<EFBFBD><30> */
|
||||
for (i = 0; i < 14; i++)
|
||||
pt[i] = pt1[i];
|
||||
} else {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include <stdio.h> /* sprintf */
|
||||
#include <string.h> /* strlen */
|
||||
#include "apilib.h"
|
||||
|
||||
void putstr(int win, char *winbuf, int x, int y, int col, unsigned char *s);
|
||||
void wait(int i, int timer, char *keyflag);
|
||||
void setdec8(char *s, int i);
|
||||
|
||||
static unsigned char charset[16 * 8] = {
|
||||
|
||||
@@ -171,7 +171,7 @@ next_group:
|
||||
/* hit ! */
|
||||
score += point;
|
||||
point++;
|
||||
sprintf(s, "%08d", score);
|
||||
setdec8(s, score);
|
||||
putstr(win, winbuf, 10, 0, 7, s);
|
||||
if (high < score) {
|
||||
high = score;
|
||||
@@ -279,3 +279,15 @@ void wait(int i, int timer, char *keyflag)
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void setdec8(char *s, int i)
|
||||
/*将i用十进制表示并存入s*/
|
||||
{
|
||||
int j;
|
||||
for (j = 7; j >= 0; j--) {
|
||||
s[j] = '0' + i % 10;
|
||||
i /= 10;
|
||||
}
|
||||
s[8] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
98
LICENSE.txt
Normal file
98
LICENSE.txt
Normal file
@@ -0,0 +1,98 @@
|
||||
川合堂许可协议-01 ver.1.0
|
||||
2000.12.30 H.Kawai (川合秀实)
|
||||
|
||||
0.概要
|
||||
|
||||
通俗地说:“这是自由软件,使用前使用后都无须支付任何费用,可以自由使用,也可以
|
||||
复制、修改,以及用于商业目的,但是作者对软件的bug以及因此所造成的损失不负任何责
|
||||
任。”
|
||||
|
||||
为了保护软件使用者以及软件修改者、参考者的利益,即便作者将来为该软件中所使用的
|
||||
算法申请专利,也保证不会向使用者收取授权费用。
|
||||
|
||||
1.目的
|
||||
|
||||
适用于本协议的软件,旨在为公众带来利益,以及为软件技术的进步做出贡献。
|
||||
|
||||
2.宗旨
|
||||
|
||||
本协议并不代表作者放弃著作权(仅放弃独家复制发布的权利),使用者可以自由复制并
|
||||
再次发布本软件的一部分甚至全部内容。使用时无须支付任何费用,对本软件的解析、修改
|
||||
也无须支付任何费用。
|
||||
|
||||
适用于本协议的软件,可以无条件地用作商业目的,甚至可以将软件直接有偿出售。
|
||||
|
||||
对于以适用于本协议的软件的一部分或全部内容为基础,在此之上所开发的软件(下称“
|
||||
派生物”),可以赋予任何种类的许可协议。即,派生物的作者可以禁止对派生物进行复制,
|
||||
也可以只允许派生物以有偿形式发布。派生物的著作权属于该派生物的生成者,适用于本协
|
||||
议的软件作者不会对其派生物主张著作权。
|
||||
|
||||
在派生物的文档中,没有义务对原始软件的作者进行介绍,但这句话,理所当然地,不意
|
||||
味着禁止这一行为。
|
||||
|
||||
在发布派生物时,没有义务取得原始软件作者的同意,但这句话,理所当然地,不意味着
|
||||
禁止这一行为。
|
||||
|
||||
作者不对软件的质量作出任何保证,因此,由于使用本软件所造成的损害,或者没有达到
|
||||
所期望的结果,作者不负任何责任。
|
||||
|
||||
对于适用于本协议的软件中所使用的技术,除了事先取得作者授权的人以外,禁止其他人
|
||||
对其申请专利。但如果附加了新的技术并生成了派生物,允许对于追加的部分申请专利。作
|
||||
者在将来有可能对软件中的技术申请专利,但保证不会向派生物以及软件的使用收取授权费
|
||||
用。本保证不仅适用于申请专利之前所生成的派生物,也适用于专利取得后所生成的派生物。
|
||||
|
||||
将解析结果汇总并申请专利,需要事先取得作者的同意,但对于申请专利以外的行为,没
|
||||
有任何限制。
|
||||
|
||||
3.补充
|
||||
|
||||
基本上,作者十分欢迎复制本软件。如果要表示对作者的感谢,请将本软件推荐给更多的
|
||||
人,并复制给他们使用。作者希望有更多的人使用本软件,因此对于复制的行为非常支持。
|
||||
除此之外,如果可以将使用后的感想发给作者,作者一定会感到更加高兴。
|
||||
|
||||
对于本协议所授权的软件,仅修改著作权信息并再次发布的行为,本协议并没有禁止,而
|
||||
是作为派生物来处理。这并不是一个漏洞。因此,如果你认为有必要仅修改著作权信息并再
|
||||
次发布本软件,是完全可以这样做的。
|
||||
|
||||
除了修复bug、增加新功能等修改行为以外,对于为代码添加注释增加易读性、对文档进行
|
||||
补充等,不会反映在编译产物及运行结果上的修改也同样欢迎。如果生成了这样的派生物,
|
||||
欢迎和作者联系(但这并不是义务)。
|
||||
|
||||
如果你有任何疑问,或者对于制作派生物方面感到缺少某些信息,可以向作者提问。但是,
|
||||
受作者精力所限可能无法一一进行回复,请大家谅解。对于协议本身漏洞的指摘,请联系作
|
||||
者或川合堂。
|
||||
|
||||
也许,对于本协议所授权的软件中所使用的技术,禁止未经作者允许申请专利这一点,和
|
||||
日本的专利法是向抵触的(希望大家提出自己的见解)。对此,最初提出本协议的川合秀实
|
||||
的见解如下。
|
||||
|
||||
指定专利法的背景,是因为如果发明者为了保护自己发明所带来的利益,而拒绝将发明的
|
||||
详情公开,会阻碍科学技术的进步,因此在法律上对于其所公开的内容,在一定时间内给予
|
||||
独家使用的保护,这是专利法的精神所在。在本协议中,作者并没有故意隐藏发明的详细内
|
||||
容,因此即便禁止对其申请专利我认为也不违背专利法的精神。相反,不理解本协议精神的
|
||||
人,如果申请了专利并对原创的软件及派生物收取授权费用,这种担心反倒阻碍了科学技术
|
||||
的进步。因此,本协议的目的是事先消除这种担心,我认为和专利法是不抵触的。
|
||||
|
||||
当然,最稳妥的做法是,作者对原创软件中可以被认作发明的全部内容申请并取得专利,
|
||||
事前防止其他人来取得相关的专利,但是这对于作者来说负担很大。申请专利的负担和是否
|
||||
公开软件内容之间必须要有所取舍的话,可能有些人会放弃公开软件内容。这并不是专利法
|
||||
精神所期待的,也不符合我们的目的(参见“1.目的”)。
|
||||
|
||||
此外,当发明的详细内容由于专利法的形式限制没有记述并明确的,由作者以外的人在未
|
||||
经许可的情况下将其解析并明确的行为,在本协议中是允许的。对于这部分内容,可以无偿
|
||||
公开,也可以有偿出售。
|
||||
|
||||
不过,对于协议所授权的软件中的所有技术,并不能保证在使用时完全避免支付授权费用
|
||||
的可能性。如果在发布的时间点仍然有效的专利技术,在软件中被使用的话,该专利的所有
|
||||
者可以要求支付授权费用。本协议所保证的不收取专利授权费用,是针对软件内被认为是新
|
||||
发明的那一部分技术。
|
||||
|
||||
如果需要将本协议适用于自己开发的软件,在事前事后均无须经过作者同意,可任意使用。
|
||||
如果有任何不方便之处,可以对协议文本进行修改。如需修改协议文本,为了避免歧义,请
|
||||
同时修改协议的名称。
|
||||
|
||||
4.链接
|
||||
|
||||
川合堂URL http://www.imasy.org/~mone/kawaido/
|
||||
川合秀实URL http://www.imasy.org/~kawai/
|
||||
e-mail kawai@imasy.org
|
||||
113
README.md
113
README.md
@@ -1,13 +1,15 @@
|
||||
30dayMakeOS —— OSASK
|
||||
===========
|
||||
# 《30天自制操作系统》中文源码 —— OSASK
|
||||
|
||||
《30天自制操作系统》源码中文版。自己制作一个操作系统的过程
|
||||
|
||||
阅读过程会一边汉化源码,一边执行还有根据一些相关的内容进行代码的书写,欢迎大家交流。
|
||||
自己制作一个操作系统的过程,阅读过程会一边汉化源码,一边执行还有根据一些相关的内容进行代码的书写,欢迎大家交流。
|
||||
|
||||
运行方法,在 `tolset` 中新建一个 `run` 文件夹,把代码拷贝进去,然后根据系统版本运行 `!cons_**.bat`。
|
||||
|
||||
一般都是使用 `make run` 运行代码。可以直接看书。
|
||||
一般都是使用 `make run` 运行代码,27天开始使用 `make run_full`。可以直接看书。
|
||||
又或者,把tolset里的`z_tools目录` 复制到 本项目目录`30dayMakeOS`下。
|
||||
|
||||
## 完成效果
|
||||
|
||||

|
||||
|
||||
## 内容简介
|
||||
|
||||
@@ -23,6 +25,14 @@
|
||||
|
||||
渡过这个痛苦的时期,第一周就该结束了。
|
||||
|
||||
- [第1天:从计算机结构到汇编程序入门](https://github.com/yourtion/30dayMakeOS/releases/tag/Day01)
|
||||
- [第2天:汇编语言学习与Makefile入门](https://github.com/yourtion/30dayMakeOS/releases/tag/Day02)
|
||||
- [第3天:进入32位模式并导入C语言](https://github.com/yourtion/30dayMakeOS/releases/tag/Day03)
|
||||
- [第4天:C语言与画面显示的练习](https://github.com/yourtion/30dayMakeOS/releases/tag/Day04)
|
||||
- [第5天:结构体、文字显示与GDT/IDT初始化](https://github.com/yourtion/30dayMakeOS/releases/tag/Day05)
|
||||
- [第6天:分割编译与中断处理](https://github.com/yourtion/30dayMakeOS/releases/tag/Day06)
|
||||
- [第7天:FIFO与鼠标控制](https://github.com/yourtion/30dayMakeOS/releases/tag/Day07)
|
||||
|
||||
### 第二周(第8天~第14天)
|
||||
|
||||
一周的苦战还是很有意义的,回头一看,我们就会发现自己还是斩获颇丰的。这时我们已经基本掌握了C语言的语法,连汇编语言的水平也能达到本书的要求了。
|
||||
@@ -31,12 +41,28 @@
|
||||
|
||||
所以这一周我们就边学习算法边慢慢地开发操作系统。不过到了这一阶段,我们就能感觉到基本上不会再受技术问题限制了。
|
||||
|
||||
- [第8天:鼠标控制与32位模式切换](https://github.com/yourtion/30dayMakeOS/releases/tag/Day08)
|
||||
- [第9天:内存管理](https://github.com/yourtion/30dayMakeOS/releases/tag/Day09)
|
||||
- [第10天:叠加处理](https://github.com/yourtion/30dayMakeOS/releases/tag/Day10)
|
||||
- [第11天:制作窗口](https://github.com/yourtion/30dayMakeOS/releases/tag/Day11)
|
||||
- [第12天:定时器(1)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day12)
|
||||
- [第13天:定时器(2)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day13)
|
||||
- [第14天:高分辨率及键盘输入](https://github.com/yourtion/30dayMakeOS/releases/tag/Day14)
|
||||
|
||||
### 第三周(第15天~第21天)
|
||||
|
||||
现在我们的技术已经相当厉害了,可以随心所欲地开发自己的操作系统了。首先是要支持多任务,然后是开发命令行窗口,之后就可以着手开发应用程序了。
|
||||
|
||||
到本周结束时,就算还不够完备,我们也能拿出一个可以称之为操作系统的软件了。
|
||||
|
||||
- [第15天:多任务(1)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day15)
|
||||
- [第16天:多任务(2)](https://github.com/yourtion/30dayMakeOS/releases/tag/Day16)
|
||||
- [第17天:命令行窗口](https://github.com/yourtion/30dayMakeOS/releases/tag/Day17)
|
||||
- [第18天:dir命令](https://github.com/yourtion/30dayMakeOS/releases/tag/Day18)
|
||||
- [第19天:应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day19)
|
||||
- [第20天:API](https://github.com/yourtion/30dayMakeOS/releases/tag/Day20)
|
||||
- [第21天:保护操作系统](https://github.com/yourtion/30dayMakeOS/releases/tag/Day21)
|
||||
|
||||
### 第四周(第22天~第28天)
|
||||
|
||||
在这个阶段,我们可以尽情地给操作系统增加各种各样的功能,同时还可以开发出大量像模像样的应用程序来。
|
||||
@@ -45,71 +71,18 @@
|
||||
|
||||
对了,说起文字才想起来,正好在这个时期可以让我们的操作系统显示文字了。
|
||||
|
||||
- [第22天:用C语言编写应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day22)
|
||||
- [第23天:图形处理相关](https://github.com/yourtion/30dayMakeOS/releases/tag/Day23)
|
||||
- [第24天:窗口操作](https://github.com/yourtion/30dayMakeOS/releases/tag/Day24)
|
||||
- [第25天:增加命令行窗口](https://github.com/yourtion/30dayMakeOS/releases/tag/Day25)
|
||||
- [第26天:为窗口移动提速](https://github.com/yourtion/30dayMakeOS/releases/tag/Day26)
|
||||
- [第27天:LDT与库](https://github.com/yourtion/30dayMakeOS/releases/tag/Day27)
|
||||
- [第28天:文件操作与文字显示](https://github.com/yourtion/30dayMakeOS/releases/tag/Day28)
|
||||
|
||||
|
||||
### 免费赠送两天(第29天~第30天)
|
||||
|
||||
剩下的两天用来润色加工。这两天我们来做一些之前没来得及做,但做起来既简单又有趣的内容。
|
||||
|
||||
## 川合堂许可协议
|
||||
|
||||
### 概要
|
||||
|
||||
通俗地说:“这是自由软件,使用前使用后都无须支付任何费用,可以自由使用,也可以
|
||||
复制、修改,以及用于商业目的,但是作者对软件的bug以及因此所造成的损失不负任何责
|
||||
任。”
|
||||
|
||||
为了保护软件使用者以及软件修改者、参考者的利益,即便作者将来为该软件中所使用的
|
||||
算法申请专利,也保证不会向使用者收取授权费用。
|
||||
|
||||
### 目的
|
||||
|
||||
适用于本协议的软件,旨在为公众带来利益,以及为软件技术的进步做出贡献。
|
||||
|
||||
#### 宗旨
|
||||
|
||||
本协议并不代表作者放弃著作权(仅放弃独家复制发布的权利),使用者可以自由复制并
|
||||
再次发布本软件的一部分甚至全部内容。使用时无须支付任何费用,对本软件的解析、修改
|
||||
也无须支付任何费用。
|
||||
|
||||
适用于本协议的软件,可以无条件地用作商业目的,甚至可以将软件直接有偿出售。
|
||||
|
||||
对于以适用于本协议的软件的一部分或全部内容为基础,在此之上所开发的软件(下称“
|
||||
派生物”),可以赋予任何种类的许可协议。即,派生物的作者可以禁止对派生物进行复制,
|
||||
也可以只允许派生物以有偿形式发布。派生物的著作权属于该派生物的生成者,适用于本协
|
||||
议的软件作者不会对其派生物主张著作权。
|
||||
|
||||
在派生物的文档中,没有义务对原始软件的作者进行介绍,但这句话,理所当然地,不意
|
||||
味着禁止这一行为。
|
||||
|
||||
在发布派生物时,没有义务取得原始软件作者的同意,但这句话,理所当然地,不意味着
|
||||
禁止这一行为。
|
||||
|
||||
作者不对软件的质量作出任何保证,因此,由于使用本软件所造成的损害,或者没有达到
|
||||
所期望的结果,作者不负任何责任。
|
||||
|
||||
对于适用于本协议的软件中所使用的技术,除了事先取得作者授权的人以外,禁止其他人
|
||||
对其申请专利。但如果附加了新的技术并生成了派生物,允许对于追加的部分申请专利。作
|
||||
者在将来有可能对软件中的技术申请专利,但保证不会向派生物以及软件的使用收取授权费
|
||||
用。本保证不仅适用于申请专利之前所生成的派生物,也适用于专利取得后所生成的派生物。
|
||||
|
||||
将解析结果汇总并申请专利,需要事先取得作者的同意,但对于申请专利以外的行为,没
|
||||
有任何限制。
|
||||
|
||||
### Links
|
||||
|
||||
[川合堂](http://www.imasy.org/~mone/kawaido/)
|
||||
|
||||
[kawai](http://www.imasy.org/~kawai/)
|
||||
|
||||
[豆瓣图书链接](http://book.douban.com/subject/11530329/)
|
||||
|
||||
[OSASK计划](http://http://osask.net/)
|
||||
|
||||
[OSASK wiki](http://ja.wikipedia.org/wiki/OSASK)
|
||||
|
||||
[source code at sourceforge](http://zh.sourceforge.jp/projects/osask/releases/?package_id=10517)
|
||||
|
||||
### 工具软件使用
|
||||
|
||||
[GNU GPL协议](http://www.gnu.org/licenses/gpl-3.0.html)
|
||||
|
||||
[GNU LGPL协议](http://www.gnu.org/licenses/lgpl-3.0.html)
|
||||
- [第29天:压缩与简单的应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day29)
|
||||
- [第30天:高级的应用程序](https://github.com/yourtion/30dayMakeOS/releases/tag/Day30)
|
||||
|
||||
BIN
Screen.png
Normal file
BIN
Screen.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 270 KiB |
Reference in New Issue
Block a user