From 5a064e20c253cdac65576821cf9ea7987cde0a57 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Thu, 19 May 2016 12:27:14 +0800 Subject: [PATCH] Add 29 day code --- 29_day/!cons_9x.bat | 1 + 29_day/!cons_nt.bat | 1 + 29_day/Makefile | 175 ++ 29_day/a/!cons_9x.bat | 1 + 29_day/a/!cons_nt.bat | 1 + 29_day/a/Makefile | 5 + 29_day/a/a.c | 7 + 29_day/a/make.bat | 1 + 29_day/apilib.h | 27 + 29_day/apilib/!cons_9x.bat | 1 + 29_day/apilib/!cons_nt.bat | 1 + 29_day/apilib/Makefile | 48 + 29_day/apilib/alloca.nas | 13 + 29_day/apilib/api001.nas | 14 + 29_day/apilib/api002.nas | 16 + 29_day/apilib/api003.nas | 17 + 29_day/apilib/api004.nas | 12 + 29_day/apilib/api005.nas | 24 + 29_day/apilib/api006.nas | 27 + 29_day/apilib/api007.nas | 27 + 29_day/apilib/api008.nas | 20 + 29_day/apilib/api009.nas | 17 + 29_day/apilib/api010.nas | 18 + 29_day/apilib/api011.nas | 23 + 29_day/apilib/api012.nas | 24 + 29_day/apilib/api013.nas | 27 + 29_day/apilib/api014.nas | 16 + 29_day/apilib/api015.nas | 14 + 29_day/apilib/api016.nas | 13 + 29_day/apilib/api017.nas | 17 + 29_day/apilib/api018.nas | 17 + 29_day/apilib/api019.nas | 16 + 29_day/apilib/api020.nas | 14 + 29_day/apilib/api021.nas | 16 + 29_day/apilib/api022.nas | 14 + 29_day/apilib/api023.nas | 18 + 29_day/apilib/api024.nas | 15 + 29_day/apilib/api025.nas | 18 + 29_day/apilib/api026.nas | 17 + 29_day/apilib/api027.nas | 13 + 29_day/apilib/apilib.lib | Bin 0 -> 8966 bytes 29_day/apilib/make.bat | 1 + 29_day/app_make.txt | 79 + 29_day/beepdown/!cons_9x.bat | 1 + 29_day/beepdown/!cons_nt.bat | 1 + 29_day/beepdown/Makefile | 5 + 29_day/beepdown/beepdown.c | 19 + 29_day/beepdown/make.bat | 1 + 29_day/chklang/!cons_9x.bat | 1 + 29_day/chklang/!cons_nt.bat | 1 + 29_day/chklang/Makefile | 5 + 29_day/chklang/chklang.c | 24 + 29_day/chklang/make.bat | 1 + 29_day/color/!cons_9x.bat | 1 + 29_day/color/!cons_nt.bat | 1 + 29_day/color/Makefile | 5 + 29_day/color/color.c | 21 + 29_day/color/make.bat | 1 + 29_day/color2/!cons_9x.bat | 1 + 29_day/color2/!cons_nt.bat | 1 + 29_day/color2/Makefile | 5 + 29_day/color2/color2.c | 36 + 29_day/color2/make.bat | 1 + 29_day/euc.txt | 1 + 29_day/haribote.rul | 10 + 29_day/haribote/!cons_9x.bat | 1 + 29_day/haribote/!cons_nt.bat | 1 + 29_day/haribote/Makefile | 83 + 29_day/haribote/asmhead.nas | 202 ++ 29_day/haribote/bootpack.c | 410 +++ 29_day/haribote/bootpack.h | 292 +++ 29_day/haribote/console.c | 698 +++++ 29_day/haribote/dsctbl.c | 59 + 29_day/haribote/fifo.c | 63 + 29_day/haribote/file.c | 74 + 29_day/haribote/graphic.c | 221 ++ 29_day/haribote/hankaku.txt | 4609 ++++++++++++++++++++++++++++++++++ 29_day/haribote/haribote.sys | Bin 0 -> 33331 bytes 29_day/haribote/int.c | 26 + 29_day/haribote/ipl10.nas | 109 + 29_day/haribote/ipl20.nas | 109 + 29_day/haribote/jp.nas | 107 + 29_day/haribote/keyboard.c | 44 + 29_day/haribote/make.bat | 1 + 29_day/haribote/memory.c | 162 ++ 29_day/haribote/mouse.c | 76 + 29_day/haribote/mtask.c | 203 ++ 29_day/haribote/naskfunc.nas | 291 +++ 29_day/haribote/sheet.c | 294 +++ 29_day/haribote/timer.c | 169 ++ 29_day/haribote/window.c | 118 + 29_day/hello3/!cons_9x.bat | 1 + 29_day/hello3/!cons_nt.bat | 1 + 29_day/hello3/Makefile | 5 + 29_day/hello3/hello3.c | 11 + 29_day/hello3/make.bat | 1 + 29_day/hello4/!cons_9x.bat | 1 + 29_day/hello4/!cons_nt.bat | 1 + 29_day/hello4/Makefile | 5 + 29_day/hello4/hello4.c | 7 + 29_day/hello4/make.bat | 1 + 29_day/hello5/!cons_9x.bat | 1 + 29_day/hello5/!cons_nt.bat | 1 + 29_day/hello5/Makefile | 5 + 29_day/hello5/hello5.nas | 20 + 29_day/hello5/make.bat | 1 + 29_day/iroha/!cons_9x.bat | 1 + 29_day/iroha/!cons_nt.bat | 1 + 29_day/iroha/Makefile | 5 + 29_day/iroha/iroha.c | 9 + 29_day/iroha/make.bat | 1 + 29_day/lines/!cons_9x.bat | 1 + 29_day/lines/!cons_nt.bat | 1 + 29_day/lines/Makefile | 5 + 29_day/lines/lines.c | 22 + 29_day/lines/make.bat | 1 + 29_day/make.bat | 1 + 29_day/nihongo/jpn16v00.bin | Bin 0 -> 311296 bytes 29_day/nihongo/jpn16v00.fnt | Bin 0 -> 58084 bytes 29_day/nihongo/nihongo.fnt | Bin 0 -> 145472 bytes 29_day/noodle/!cons_9x.bat | 1 + 29_day/noodle/!cons_nt.bat | 1 + 29_day/noodle/Makefile | 5 + 29_day/noodle/make.bat | 1 + 29_day/noodle/noodle.c | 32 + 29_day/sosu/!cons_9x.bat | 1 + 29_day/sosu/!cons_nt.bat | 1 + 29_day/sosu/Makefile | 5 + 29_day/sosu/make.bat | 1 + 29_day/sosu/sosu.c | 24 + 29_day/sosu2/!cons_9x.bat | 1 + 29_day/sosu2/!cons_nt.bat | 1 + 29_day/sosu2/Makefile | 5 + 29_day/sosu2/make.bat | 1 + 29_day/sosu2/sosu2.c | 24 + 29_day/sosu3/!cons_9x.bat | 1 + 29_day/sosu3/!cons_nt.bat | 1 + 29_day/sosu3/Makefile | 5 + 29_day/sosu3/make.bat | 1 + 29_day/sosu3/sosu3.c | 26 + 29_day/star1/!cons_9x.bat | 1 + 29_day/star1/!cons_nt.bat | 1 + 29_day/star1/Makefile | 5 + 29_day/star1/make.bat | 1 + 29_day/star1/star1.c | 18 + 29_day/stars/!cons_9x.bat | 1 + 29_day/stars/!cons_nt.bat | 1 + 29_day/stars/Makefile | 5 + 29_day/stars/make.bat | 1 + 29_day/stars/stars.c | 24 + 29_day/stars2/!cons_9x.bat | 1 + 29_day/stars2/!cons_nt.bat | 1 + 29_day/stars2/Makefile | 5 + 29_day/stars2/make.bat | 1 + 29_day/stars2/stars2.c | 25 + 29_day/type/!cons_9x.bat | 1 + 29_day/type/!cons_nt.bat | 1 + 29_day/type/Makefile | 5 + 29_day/type/make.bat | 1 + 29_day/type/type.c | 23 + 29_day/typeipl/!cons_9x.bat | 1 + 29_day/typeipl/!cons_nt.bat | 1 + 29_day/typeipl/Makefile | 5 + 29_day/typeipl/make.bat | 1 + 29_day/typeipl/typeipl.c | 17 + 29_day/walk/!cons_9x.bat | 1 + 29_day/walk/!cons_nt.bat | 1 + 29_day/walk/Makefile | 5 + 29_day/walk/make.bat | 1 + 29_day/walk/walk.c | 26 + 29_day/winhelo/!cons_9x.bat | 1 + 29_day/winhelo/!cons_nt.bat | 1 + 29_day/winhelo/Makefile | 5 + 29_day/winhelo/make.bat | 1 + 29_day/winhelo/winhelo.c | 15 + 29_day/winhelo2/!cons_9x.bat | 1 + 29_day/winhelo2/!cons_nt.bat | 1 + 29_day/winhelo2/Makefile | 5 + 29_day/winhelo2/make.bat | 1 + 29_day/winhelo2/winhelo2.c | 17 + 29_day/winhelo3/!cons_9x.bat | 1 + 29_day/winhelo3/!cons_nt.bat | 1 + 29_day/winhelo3/Makefile | 5 + 29_day/winhelo3/make.bat | 1 + 29_day/winhelo3/winhelo3.c | 19 + 185 files changed, 9915 insertions(+) create mode 100644 29_day/!cons_9x.bat create mode 100644 29_day/!cons_nt.bat create mode 100644 29_day/Makefile create mode 100644 29_day/a/!cons_9x.bat create mode 100644 29_day/a/!cons_nt.bat create mode 100644 29_day/a/Makefile create mode 100644 29_day/a/a.c create mode 100644 29_day/a/make.bat create mode 100644 29_day/apilib.h create mode 100644 29_day/apilib/!cons_9x.bat create mode 100644 29_day/apilib/!cons_nt.bat create mode 100644 29_day/apilib/Makefile create mode 100644 29_day/apilib/alloca.nas create mode 100644 29_day/apilib/api001.nas create mode 100644 29_day/apilib/api002.nas create mode 100644 29_day/apilib/api003.nas create mode 100644 29_day/apilib/api004.nas create mode 100644 29_day/apilib/api005.nas create mode 100644 29_day/apilib/api006.nas create mode 100644 29_day/apilib/api007.nas create mode 100644 29_day/apilib/api008.nas create mode 100644 29_day/apilib/api009.nas create mode 100644 29_day/apilib/api010.nas create mode 100644 29_day/apilib/api011.nas create mode 100644 29_day/apilib/api012.nas create mode 100644 29_day/apilib/api013.nas create mode 100644 29_day/apilib/api014.nas create mode 100644 29_day/apilib/api015.nas create mode 100644 29_day/apilib/api016.nas create mode 100644 29_day/apilib/api017.nas create mode 100644 29_day/apilib/api018.nas create mode 100644 29_day/apilib/api019.nas create mode 100644 29_day/apilib/api020.nas create mode 100644 29_day/apilib/api021.nas create mode 100644 29_day/apilib/api022.nas create mode 100644 29_day/apilib/api023.nas create mode 100644 29_day/apilib/api024.nas create mode 100644 29_day/apilib/api025.nas create mode 100644 29_day/apilib/api026.nas create mode 100644 29_day/apilib/api027.nas create mode 100644 29_day/apilib/apilib.lib create mode 100644 29_day/apilib/make.bat create mode 100644 29_day/app_make.txt create mode 100644 29_day/beepdown/!cons_9x.bat create mode 100644 29_day/beepdown/!cons_nt.bat create mode 100644 29_day/beepdown/Makefile create mode 100644 29_day/beepdown/beepdown.c create mode 100644 29_day/beepdown/make.bat create mode 100644 29_day/chklang/!cons_9x.bat create mode 100644 29_day/chklang/!cons_nt.bat create mode 100644 29_day/chklang/Makefile create mode 100644 29_day/chklang/chklang.c create mode 100644 29_day/chklang/make.bat create mode 100644 29_day/color/!cons_9x.bat create mode 100644 29_day/color/!cons_nt.bat create mode 100644 29_day/color/Makefile create mode 100644 29_day/color/color.c create mode 100644 29_day/color/make.bat create mode 100644 29_day/color2/!cons_9x.bat create mode 100644 29_day/color2/!cons_nt.bat create mode 100644 29_day/color2/Makefile create mode 100644 29_day/color2/color2.c create mode 100644 29_day/color2/make.bat create mode 100644 29_day/euc.txt create mode 100644 29_day/haribote.rul create mode 100644 29_day/haribote/!cons_9x.bat create mode 100644 29_day/haribote/!cons_nt.bat create mode 100644 29_day/haribote/Makefile create mode 100644 29_day/haribote/asmhead.nas create mode 100644 29_day/haribote/bootpack.c create mode 100644 29_day/haribote/bootpack.h create mode 100644 29_day/haribote/console.c create mode 100644 29_day/haribote/dsctbl.c create mode 100644 29_day/haribote/fifo.c create mode 100644 29_day/haribote/file.c create mode 100644 29_day/haribote/graphic.c create mode 100644 29_day/haribote/hankaku.txt create mode 100644 29_day/haribote/haribote.sys create mode 100644 29_day/haribote/int.c create mode 100644 29_day/haribote/ipl10.nas create mode 100644 29_day/haribote/ipl20.nas create mode 100644 29_day/haribote/jp.nas create mode 100644 29_day/haribote/keyboard.c create mode 100644 29_day/haribote/make.bat create mode 100644 29_day/haribote/memory.c create mode 100644 29_day/haribote/mouse.c create mode 100644 29_day/haribote/mtask.c create mode 100644 29_day/haribote/naskfunc.nas create mode 100644 29_day/haribote/sheet.c create mode 100644 29_day/haribote/timer.c create mode 100644 29_day/haribote/window.c create mode 100644 29_day/hello3/!cons_9x.bat create mode 100644 29_day/hello3/!cons_nt.bat create mode 100644 29_day/hello3/Makefile create mode 100644 29_day/hello3/hello3.c create mode 100644 29_day/hello3/make.bat create mode 100644 29_day/hello4/!cons_9x.bat create mode 100644 29_day/hello4/!cons_nt.bat create mode 100644 29_day/hello4/Makefile create mode 100644 29_day/hello4/hello4.c create mode 100644 29_day/hello4/make.bat create mode 100644 29_day/hello5/!cons_9x.bat create mode 100644 29_day/hello5/!cons_nt.bat create mode 100644 29_day/hello5/Makefile create mode 100644 29_day/hello5/hello5.nas create mode 100644 29_day/hello5/make.bat create mode 100644 29_day/iroha/!cons_9x.bat create mode 100644 29_day/iroha/!cons_nt.bat create mode 100644 29_day/iroha/Makefile create mode 100644 29_day/iroha/iroha.c create mode 100644 29_day/iroha/make.bat create mode 100644 29_day/lines/!cons_9x.bat create mode 100644 29_day/lines/!cons_nt.bat create mode 100644 29_day/lines/Makefile create mode 100644 29_day/lines/lines.c create mode 100644 29_day/lines/make.bat create mode 100644 29_day/make.bat create mode 100644 29_day/nihongo/jpn16v00.bin create mode 100644 29_day/nihongo/jpn16v00.fnt create mode 100644 29_day/nihongo/nihongo.fnt create mode 100644 29_day/noodle/!cons_9x.bat create mode 100644 29_day/noodle/!cons_nt.bat create mode 100644 29_day/noodle/Makefile create mode 100644 29_day/noodle/make.bat create mode 100644 29_day/noodle/noodle.c create mode 100644 29_day/sosu/!cons_9x.bat create mode 100644 29_day/sosu/!cons_nt.bat create mode 100644 29_day/sosu/Makefile create mode 100644 29_day/sosu/make.bat create mode 100644 29_day/sosu/sosu.c create mode 100644 29_day/sosu2/!cons_9x.bat create mode 100644 29_day/sosu2/!cons_nt.bat create mode 100644 29_day/sosu2/Makefile create mode 100644 29_day/sosu2/make.bat create mode 100644 29_day/sosu2/sosu2.c create mode 100644 29_day/sosu3/!cons_9x.bat create mode 100644 29_day/sosu3/!cons_nt.bat create mode 100644 29_day/sosu3/Makefile create mode 100644 29_day/sosu3/make.bat create mode 100644 29_day/sosu3/sosu3.c create mode 100644 29_day/star1/!cons_9x.bat create mode 100644 29_day/star1/!cons_nt.bat create mode 100644 29_day/star1/Makefile create mode 100644 29_day/star1/make.bat create mode 100644 29_day/star1/star1.c create mode 100644 29_day/stars/!cons_9x.bat create mode 100644 29_day/stars/!cons_nt.bat create mode 100644 29_day/stars/Makefile create mode 100644 29_day/stars/make.bat create mode 100644 29_day/stars/stars.c create mode 100644 29_day/stars2/!cons_9x.bat create mode 100644 29_day/stars2/!cons_nt.bat create mode 100644 29_day/stars2/Makefile create mode 100644 29_day/stars2/make.bat create mode 100644 29_day/stars2/stars2.c create mode 100644 29_day/type/!cons_9x.bat create mode 100644 29_day/type/!cons_nt.bat create mode 100644 29_day/type/Makefile create mode 100644 29_day/type/make.bat create mode 100644 29_day/type/type.c create mode 100644 29_day/typeipl/!cons_9x.bat create mode 100644 29_day/typeipl/!cons_nt.bat create mode 100644 29_day/typeipl/Makefile create mode 100644 29_day/typeipl/make.bat create mode 100644 29_day/typeipl/typeipl.c create mode 100644 29_day/walk/!cons_9x.bat create mode 100644 29_day/walk/!cons_nt.bat create mode 100644 29_day/walk/Makefile create mode 100644 29_day/walk/make.bat create mode 100644 29_day/walk/walk.c create mode 100644 29_day/winhelo/!cons_9x.bat create mode 100644 29_day/winhelo/!cons_nt.bat create mode 100644 29_day/winhelo/Makefile create mode 100644 29_day/winhelo/make.bat create mode 100644 29_day/winhelo/winhelo.c create mode 100644 29_day/winhelo2/!cons_9x.bat create mode 100644 29_day/winhelo2/!cons_nt.bat create mode 100644 29_day/winhelo2/Makefile create mode 100644 29_day/winhelo2/make.bat create mode 100644 29_day/winhelo2/winhelo2.c create mode 100644 29_day/winhelo3/!cons_9x.bat create mode 100644 29_day/winhelo3/!cons_nt.bat create mode 100644 29_day/winhelo3/Makefile create mode 100644 29_day/winhelo3/make.bat create mode 100644 29_day/winhelo3/winhelo3.c diff --git a/29_day/!cons_9x.bat b/29_day/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/!cons_nt.bat b/29_day/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/Makefile b/29_day/Makefile new file mode 100644 index 0000000..e6b82cf --- /dev/null +++ b/29_day/Makefile @@ -0,0 +1,175 @@ +TOOLPATH = ../z_tools/ +INCPATH = ../z_tools/haribote/ + +MAKE = $(TOOLPATH)make.exe -r +EDIMG = $(TOOLPATH)edimg.exe +IMGTOL = $(TOOLPATH)imgtol.com +COPY = copy +DEL = del + +#默认动作 + +default : + $(MAKE) haribote.img + +#文件生成规则 + +haribote.img : haribote/ipl20.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 \ + lines/lines.hrb walk/walk.hrb noodle/noodle.hrb \ + beepdown/beepdown.hrb color/color.hrb color2/color2.hrb \ + sosu/sosu.hrb sosu2/sosu2.hrb sosu3/sosu3.hrb \ + typeipl/typeipl.hrb type/type.hrb iroha/iroha.hrb \ + chklang/chklang.hrb + $(EDIMG) imgin:../z_tools/fdimg0at.tek \ + wbinimg src:haribote/ipl20.bin len:512 from:0 to:0 \ + copy from:haribote/haribote.sys to:@: \ + copy from:haribote/jp.nas to:@: \ + copy from:make.bat to:@: \ + copy from:a/a.hrb to:@: \ + copy from:hello3/hello3.hrb to:@: \ + copy from:hello4/hello4.hrb to:@: \ + copy from:hello5/hello5.hrb to:@: \ + copy from:winhelo/winhelo.hrb to:@: \ + copy from:winhelo2/winhelo2.hrb to:@: \ + copy from:winhelo3/winhelo3.hrb to:@: \ + copy from:star1/star1.hrb to:@: \ + copy from:stars/stars.hrb to:@: \ + copy from:stars2/stars2.hrb to:@: \ + copy from:lines/lines.hrb to:@: \ + copy from:walk/walk.hrb to:@: \ + copy from:noodle/noodle.hrb to:@: \ + copy from:beepdown/beepdown.hrb to:@: \ + copy from:color/color.hrb to:@: \ + copy from:color2/color2.hrb to:@: \ + copy from:sosu/sosu.hrb to:@: \ + copy from:sosu2/sosu2.hrb to:@: \ + copy from:sosu3/sosu3.hrb to:@: \ + copy from:typeipl/typeipl.hrb to:@: \ + copy from:type/type.hrb to:@: \ + copy from:iroha/iroha.hrb to:@: \ + copy from:chklang/chklang.hrb to:@: \ + copy from:euc.txt to:@: \ + copy from:nihongo/nihongo.fnt to:@: \ + imgout:haribote.img + +#命令 + +run : + $(MAKE) haribote.img + $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin + $(MAKE) -C ../z_tools/qemu + +install : + $(MAKE) haribote.img + $(IMGTOL) w a: haribote.img + +full : + $(MAKE) -C haribote + $(MAKE) -C apilib + $(MAKE) -C a + $(MAKE) -C hello3 + $(MAKE) -C hello4 + $(MAKE) -C hello5 + $(MAKE) -C winhelo + $(MAKE) -C winhelo2 + $(MAKE) -C winhelo3 + $(MAKE) -C star1 + $(MAKE) -C stars + $(MAKE) -C stars2 + $(MAKE) -C lines + $(MAKE) -C walk + $(MAKE) -C noodle + $(MAKE) -C beepdown + $(MAKE) -C color + $(MAKE) -C color2 + $(MAKE) -C sosu + $(MAKE) -C sosu2 + $(MAKE) -C sosu3 + $(MAKE) -C typeipl + $(MAKE) -C type + $(MAKE) -C iroha + $(MAKE) -C chklang + $(MAKE) haribote.img + +run_full : + $(MAKE) full + $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin + $(MAKE) -C ../z_tools/qemu + +install_full : + $(MAKE) full + $(IMGTOL) w a: haribote.img + +run_os : + $(MAKE) -C haribote + $(MAKE) run + +clean : +#不执行任何操作 + +src_only : + $(MAKE) clean + -$(DEL) haribote.img + +clean_full : + $(MAKE) -C haribote clean + $(MAKE) -C apilib clean + $(MAKE) -C a clean + $(MAKE) -C hello3 clean + $(MAKE) -C hello4 clean + $(MAKE) -C hello5 clean + $(MAKE) -C winhelo clean + $(MAKE) -C winhelo2 clean + $(MAKE) -C winhelo3 clean + $(MAKE) -C star1 clean + $(MAKE) -C stars clean + $(MAKE) -C stars2 clean + $(MAKE) -C lines clean + $(MAKE) -C walk clean + $(MAKE) -C noodle clean + $(MAKE) -C beepdown clean + $(MAKE) -C color clean + $(MAKE) -C color2 clean + $(MAKE) -C sosu clean + $(MAKE) -C sosu2 clean + $(MAKE) -C sosu3 clean + $(MAKE) -C typeipl clean + $(MAKE) -C type clean + $(MAKE) -C iroha clean + $(MAKE) -C chklang clean + +src_only_full : + $(MAKE) -C haribote src_only + $(MAKE) -C apilib src_only + $(MAKE) -C a src_only + $(MAKE) -C hello3 src_only + $(MAKE) -C hello4 src_only + $(MAKE) -C hello5 src_only + $(MAKE) -C winhelo src_only + $(MAKE) -C winhelo2 src_only + $(MAKE) -C winhelo3 src_only + $(MAKE) -C star1 src_only + $(MAKE) -C stars src_only + $(MAKE) -C stars2 src_only + $(MAKE) -C lines src_only + $(MAKE) -C walk src_only + $(MAKE) -C noodle src_only + $(MAKE) -C beepdown src_only + $(MAKE) -C color src_only + $(MAKE) -C color2 src_only + $(MAKE) -C sosu src_only + $(MAKE) -C sosu2 src_only + $(MAKE) -C sosu3 src_only + $(MAKE) -C typeipl src_only + $(MAKE) -C type src_only + $(MAKE) -C iroha src_only + $(MAKE) -C chklang src_only + -$(DEL) haribote.img + +refresh : + $(MAKE) full + $(MAKE) clean_full + -$(DEL) haribote.img diff --git a/29_day/a/!cons_9x.bat b/29_day/a/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/a/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/a/!cons_nt.bat b/29_day/a/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/a/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/a/Makefile b/29_day/a/Makefile new file mode 100644 index 0000000..674a683 --- /dev/null +++ b/29_day/a/Makefile @@ -0,0 +1,5 @@ +APP = a +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/a/a.c b/29_day/a/a.c new file mode 100644 index 0000000..3df81f5 --- /dev/null +++ b/29_day/a/a.c @@ -0,0 +1,7 @@ +#include "apilib.h" + +void HariMain(void) +{ + api_putchar('A'); + api_end(); +} diff --git a/29_day/a/make.bat b/29_day/a/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/a/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/apilib.h b/29_day/apilib.h new file mode 100644 index 0000000..ac282d8 --- /dev/null +++ b/29_day/apilib.h @@ -0,0 +1,27 @@ +void api_putchar(int c); +void api_putstr0(char *s); +void api_putstr1(char *s, int l); +void api_end(void); +int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title); +void api_putstrwin(int win, int x, int y, int col, int len, char *str); +void api_boxfilwin(int win, int x0, int y0, int x1, int y1, int col); +void api_initmalloc(void); +char *api_malloc(int size); +void api_free(char *addr, int size); +void api_point(int win, int x, int y, int col); +void api_refreshwin(int win, int x0, int y0, int x1, int y1); +void api_linewin(int win, int x0, int y0, int x1, int y1, int col); +void api_closewin(int win); +int api_getkey(int mode); +int api_alloctimer(void); +void api_inittimer(int timer, int data); +void api_settimer(int timer, int time); +void api_freetimer(int timer); +void api_beep(int tone); +int api_fopen(char *fname); +void api_fclose(int fhandle); +void api_fseek(int fhandle, int offset, int mode); +int api_fsize(int fhandle, int mode); +int api_fread(char *buf, int maxsize, int fhandle); +int api_cmdline(char *buf, int maxsize); +int api_getlang(void); diff --git a/29_day/apilib/!cons_9x.bat b/29_day/apilib/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/apilib/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/apilib/!cons_nt.bat b/29_day/apilib/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/apilib/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/apilib/Makefile b/29_day/apilib/Makefile new file mode 100644 index 0000000..8ce9ef5 --- /dev/null +++ b/29_day/apilib/Makefile @@ -0,0 +1,48 @@ +OBJS_API = api001.obj api002.obj api003.obj api004.obj api005.obj api006.obj \ + api007.obj api008.obj api009.obj api010.obj api011.obj api012.obj \ + api013.obj api014.obj api015.obj api016.obj api017.obj api018.obj \ + api019.obj api020.obj api021.obj api022.obj api023.obj api024.obj \ + api025.obj api026.obj api027.obj alloca.obj + +TOOLPATH = ../../z_tools/ +INCPATH = ../../z_tools/haribote/ + +MAKE = $(TOOLPATH)make.exe -r +NASK = $(TOOLPATH)nask.exe +CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet +GAS2NASK = $(TOOLPATH)gas2nask.exe -a +OBJ2BIM = $(TOOLPATH)obj2bim.exe +MAKEFONT = $(TOOLPATH)makefont.exe +BIN2OBJ = $(TOOLPATH)bin2obj.exe +BIM2HRB = $(TOOLPATH)bim2hrb.exe +RULEFILE = ../haribote.rul +EDIMG = $(TOOLPATH)edimg.exe +IMGTOL = $(TOOLPATH)imgtol.com +GOLIB = $(TOOLPATH)golib00.exe +COPY = copy +DEL = del + +#默认动作 + +default : + $(MAKE) apilib.lib + +#库生成规则 + +apilib.lib : Makefile $(OBJS_API) + $(GOLIB) $(OBJS_API) out:apilib.lib + +#文件生成规则 + +%.obj : %.nas Makefile + $(NASK) $*.nas $*.obj $*.lst + +#命令 + +clean : + -$(DEL) *.lst + -$(DEL) *.obj + +src_only : + $(MAKE) clean + -$(DEL) apilib.lib diff --git a/29_day/apilib/alloca.nas b/29_day/apilib/alloca.nas new file mode 100644 index 0000000..b94f8e2 --- /dev/null +++ b/29_day/apilib/alloca.nas @@ -0,0 +1,13 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "alloca.nas"] + + GLOBAL __alloca + +[SECTION .text] + +__alloca: + ADD EAX,-4 + SUB ESP,EAX + JMP DWORD [ESP+EAX] ; 代替RET diff --git a/29_day/apilib/api001.nas b/29_day/apilib/api001.nas new file mode 100644 index 0000000..2f893a9 --- /dev/null +++ b/29_day/apilib/api001.nas @@ -0,0 +1,14 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api001.nas"] + + GLOBAL _api_putchar + +[SECTION .text] + +_api_putchar: ; void api_putchar(int c); + MOV EDX,1 + MOV AL,[ESP+4] ; c + INT 0x40 + RET diff --git a/29_day/apilib/api002.nas b/29_day/apilib/api002.nas new file mode 100644 index 0000000..6ac9cc7 --- /dev/null +++ b/29_day/apilib/api002.nas @@ -0,0 +1,16 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api002.nas"] + + GLOBAL _api_putstr0 + +[SECTION .text] + +_api_putstr0: ; void api_putstr0(char *s); + PUSH EBX + MOV EDX,2 + MOV EBX,[ESP+8] ; s + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api003.nas b/29_day/apilib/api003.nas new file mode 100644 index 0000000..6c2d0fd --- /dev/null +++ b/29_day/apilib/api003.nas @@ -0,0 +1,17 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api003.nas"] + + GLOBAL _api_putstr1 + +[SECTION .text] + +_api_putstr1: ; void api_putstr1(char *s, int l); + PUSH EBX + MOV EDX,3 + MOV EBX,[ESP+ 8] ; s + MOV ECX,[ESP+12] ; l + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api004.nas b/29_day/apilib/api004.nas new file mode 100644 index 0000000..3c738a3 --- /dev/null +++ b/29_day/apilib/api004.nas @@ -0,0 +1,12 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api004.nas"] + + GLOBAL _api_end + +[SECTION .text] + +_api_end: ; void api_end(void); + MOV EDX,4 + INT 0x40 diff --git a/29_day/apilib/api005.nas b/29_day/apilib/api005.nas new file mode 100644 index 0000000..2157c61 --- /dev/null +++ b/29_day/apilib/api005.nas @@ -0,0 +1,24 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api005.nas"] + + GLOBAL _api_openwin + +[SECTION .text] + +_api_openwin: ; int api_openwin(char *buf, int xsiz, int ysiz, int col_inv, char *title); + PUSH EDI + PUSH ESI + PUSH EBX + MOV EDX,5 + MOV EBX,[ESP+16] ; buf + MOV ESI,[ESP+20] ; xsiz + MOV EDI,[ESP+24] ; ysiz + MOV EAX,[ESP+28] ; col_inv + MOV ECX,[ESP+32] ; title + INT 0x40 + POP EBX + POP ESI + POP EDI + RET diff --git a/29_day/apilib/api006.nas b/29_day/apilib/api006.nas new file mode 100644 index 0000000..94cbb2d --- /dev/null +++ b/29_day/apilib/api006.nas @@ -0,0 +1,27 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api006.nas"] + + GLOBAL _api_putstrwin + +[SECTION .text] + +_api_putstrwin: ; void api_putstrwin(int win, int x, int y, int col, int len, char *str); + PUSH EDI + PUSH ESI + PUSH EBP + PUSH EBX + MOV EDX,6 + MOV EBX,[ESP+20] ; win + MOV ESI,[ESP+24] ; x + MOV EDI,[ESP+28] ; y + MOV EAX,[ESP+32] ; col + MOV ECX,[ESP+36] ; len + MOV EBP,[ESP+40] ; str + INT 0x40 + POP EBX + POP EBP + POP ESI + POP EDI + RET diff --git a/29_day/apilib/api007.nas b/29_day/apilib/api007.nas new file mode 100644 index 0000000..57be736 --- /dev/null +++ b/29_day/apilib/api007.nas @@ -0,0 +1,27 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api007.nas"] + + GLOBAL _api_boxfilwin + +[SECTION .text] + +_api_boxfilwin: ; void api_boxfilwin(int win, int x0, int y0, int x1, int y1, int col); + PUSH EDI + PUSH ESI + PUSH EBP + PUSH EBX + MOV EDX,7 + MOV EBX,[ESP+20] ; win + MOV EAX,[ESP+24] ; x0 + MOV ECX,[ESP+28] ; y0 + MOV ESI,[ESP+32] ; x1 + MOV EDI,[ESP+36] ; y1 + MOV EBP,[ESP+40] ; col + INT 0x40 + POP EBX + POP EBP + POP ESI + POP EDI + RET diff --git a/29_day/apilib/api008.nas b/29_day/apilib/api008.nas new file mode 100644 index 0000000..d1ed6c7 --- /dev/null +++ b/29_day/apilib/api008.nas @@ -0,0 +1,20 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api008.nas"] + + GLOBAL _api_initmalloc + +[SECTION .text] + +_api_initmalloc: ; void api_initmalloc(void); + PUSH EBX + MOV EDX,8 + MOV EBX,[CS:0x0020] ; malloc内存空间的地址 + MOV EAX,EBX + ADD EAX,32*1024 ; 加上32KB + MOV ECX,[CS:0x0000] ; 数据段的大小 + SUB ECX,EAX + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api009.nas b/29_day/apilib/api009.nas new file mode 100644 index 0000000..bcd5307 --- /dev/null +++ b/29_day/apilib/api009.nas @@ -0,0 +1,17 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api009.nas"] + + GLOBAL _api_malloc + +[SECTION .text] + +_api_malloc: ; char *api_malloc(int size); + PUSH EBX + MOV EDX,9 + MOV EBX,[CS:0x0020] + MOV ECX,[ESP+8] ; size + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api010.nas b/29_day/apilib/api010.nas new file mode 100644 index 0000000..63a4ea5 --- /dev/null +++ b/29_day/apilib/api010.nas @@ -0,0 +1,18 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api010.nas"] + + GLOBAL _api_free + +[SECTION .text] + +_api_free: ; void api_free(char *addr, int size); + PUSH EBX + MOV EDX,10 + MOV EBX,[CS:0x0020] + MOV EAX,[ESP+ 8] ; addr + MOV ECX,[ESP+12] ; size + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api011.nas b/29_day/apilib/api011.nas new file mode 100644 index 0000000..f5994b9 --- /dev/null +++ b/29_day/apilib/api011.nas @@ -0,0 +1,23 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api011.nas"] + + GLOBAL _api_point + +[SECTION .text] + +_api_point: ; void api_point(int win, int x, int y, int col); + PUSH EDI + PUSH ESI + PUSH EBX + MOV EDX,11 + MOV EBX,[ESP+16] ; win + MOV ESI,[ESP+20] ; x + MOV EDI,[ESP+24] ; y + MOV EAX,[ESP+28] ; col + INT 0x40 + POP EBX + POP ESI + POP EDI + RET diff --git a/29_day/apilib/api012.nas b/29_day/apilib/api012.nas new file mode 100644 index 0000000..9e9386f --- /dev/null +++ b/29_day/apilib/api012.nas @@ -0,0 +1,24 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api012.nas"] + + GLOBAL _api_refreshwin + +[SECTION .text] + +_api_refreshwin: ; void api_refreshwin(int win, int x0, int y0, int x1, int y1); + PUSH EDI + PUSH ESI + PUSH EBX + MOV EDX,12 + MOV EBX,[ESP+16] ; win + MOV EAX,[ESP+20] ; x0 + MOV ECX,[ESP+24] ; y0 + MOV ESI,[ESP+28] ; x1 + MOV EDI,[ESP+32] ; y1 + INT 0x40 + POP EBX + POP ESI + POP EDI + RET diff --git a/29_day/apilib/api013.nas b/29_day/apilib/api013.nas new file mode 100644 index 0000000..017f1ea --- /dev/null +++ b/29_day/apilib/api013.nas @@ -0,0 +1,27 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api013.nas"] + + GLOBAL _api_linewin + +[SECTION .text] + +_api_linewin: ; void api_linewin(int win, int x0, int y0, int x1, int y1, int col); + PUSH EDI + PUSH ESI + PUSH EBP + PUSH EBX + MOV EDX,13 + MOV EBX,[ESP+20] ; win + MOV EAX,[ESP+24] ; x0 + MOV ECX,[ESP+28] ; y0 + MOV ESI,[ESP+32] ; x1 + MOV EDI,[ESP+36] ; y1 + MOV EBP,[ESP+40] ; col + INT 0x40 + POP EBX + POP EBP + POP ESI + POP EDI + RET diff --git a/29_day/apilib/api014.nas b/29_day/apilib/api014.nas new file mode 100644 index 0000000..363db51 --- /dev/null +++ b/29_day/apilib/api014.nas @@ -0,0 +1,16 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api014.nas"] + + GLOBAL _api_closewin + +[SECTION .text] + +_api_closewin: ; void api_closewin(int win); + PUSH EBX + MOV EDX,14 + MOV EBX,[ESP+8] ; win + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api015.nas b/29_day/apilib/api015.nas new file mode 100644 index 0000000..bd27ec7 --- /dev/null +++ b/29_day/apilib/api015.nas @@ -0,0 +1,14 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api015.nas"] + + GLOBAL _api_getkey + +[SECTION .text] + +_api_getkey: ; int api_getkey(int mode); + MOV EDX,15 + MOV EAX,[ESP+4] ; mode + INT 0x40 + RET diff --git a/29_day/apilib/api016.nas b/29_day/apilib/api016.nas new file mode 100644 index 0000000..e232412 --- /dev/null +++ b/29_day/apilib/api016.nas @@ -0,0 +1,13 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api016.nas"] + + GLOBAL _api_alloctimer + +[SECTION .text] + +_api_alloctimer: ; int api_alloctimer(void); + MOV EDX,16 + INT 0x40 + RET diff --git a/29_day/apilib/api017.nas b/29_day/apilib/api017.nas new file mode 100644 index 0000000..9e6a3cd --- /dev/null +++ b/29_day/apilib/api017.nas @@ -0,0 +1,17 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api017.nas"] + + GLOBAL _api_inittimer + +[SECTION .text] + +_api_inittimer: ; void api_inittimer(int timer, int data); + PUSH EBX + MOV EDX,17 + MOV EBX,[ESP+ 8] ; timer + MOV EAX,[ESP+12] ; data + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api018.nas b/29_day/apilib/api018.nas new file mode 100644 index 0000000..a91d6f1 --- /dev/null +++ b/29_day/apilib/api018.nas @@ -0,0 +1,17 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api018.nas"] + + GLOBAL _api_settimer + +[SECTION .text] + +_api_settimer: ; void api_settimer(int timer, int time); + PUSH EBX + MOV EDX,18 + MOV EBX,[ESP+ 8] ; timer + MOV EAX,[ESP+12] ; time + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api019.nas b/29_day/apilib/api019.nas new file mode 100644 index 0000000..d1c11e2 --- /dev/null +++ b/29_day/apilib/api019.nas @@ -0,0 +1,16 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api019.nas"] + + GLOBAL _api_freetimer + +[SECTION .text] + +_api_freetimer: ; void api_freetimer(int timer); + PUSH EBX + MOV EDX,19 + MOV EBX,[ESP+ 8] ; timer + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api020.nas b/29_day/apilib/api020.nas new file mode 100644 index 0000000..166bcda --- /dev/null +++ b/29_day/apilib/api020.nas @@ -0,0 +1,14 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api020.nas"] + + GLOBAL _api_beep + +[SECTION .text] + +_api_beep: ; void api_beep(int tone); + MOV EDX,20 + MOV EAX,[ESP+4] ; tone + INT 0x40 + RET diff --git a/29_day/apilib/api021.nas b/29_day/apilib/api021.nas new file mode 100644 index 0000000..565a037 --- /dev/null +++ b/29_day/apilib/api021.nas @@ -0,0 +1,16 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api021.nas"] + + GLOBAL _api_fopen + +[SECTION .text] + +_api_fopen: ; int api_fopen(char *fname); + PUSH EBX + MOV EDX,21 + MOV EBX,[ESP+8] ; fname + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api022.nas b/29_day/apilib/api022.nas new file mode 100644 index 0000000..a21f508 --- /dev/null +++ b/29_day/apilib/api022.nas @@ -0,0 +1,14 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api022.nas"] + + GLOBAL _api_fclose + +[SECTION .text] + +_api_fclose: ; void api_fclose(int fhandle); + MOV EDX,22 + MOV EAX,[ESP+4] ; fhandle + INT 0x40 + RET diff --git a/29_day/apilib/api023.nas b/29_day/apilib/api023.nas new file mode 100644 index 0000000..f34c33b --- /dev/null +++ b/29_day/apilib/api023.nas @@ -0,0 +1,18 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api023.nas"] + + GLOBAL _api_fseek + +[SECTION .text] + +_api_fseek: ; void api_fseek(int fhandle, int offset, int mode); + PUSH EBX + MOV EDX,23 + MOV EAX,[ESP+8] ; fhandle + MOV ECX,[ESP+16] ; mode + MOV EBX,[ESP+12] ; offset + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api024.nas b/29_day/apilib/api024.nas new file mode 100644 index 0000000..5352889 --- /dev/null +++ b/29_day/apilib/api024.nas @@ -0,0 +1,15 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api024.nas"] + + GLOBAL _api_fsize + +[SECTION .text] + +_api_fsize: ; int api_fsize(int fhandle, int mode); + MOV EDX,24 + MOV EAX,[ESP+4] ; fhandle + MOV ECX,[ESP+8] ; mode + INT 0x40 + RET diff --git a/29_day/apilib/api025.nas b/29_day/apilib/api025.nas new file mode 100644 index 0000000..9f394d3 --- /dev/null +++ b/29_day/apilib/api025.nas @@ -0,0 +1,18 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api025.nas"] + + GLOBAL _api_fread + +[SECTION .text] + +_api_fread: ; int api_fread(char *buf, int maxsize, int fhandle); + PUSH EBX + MOV EDX,25 + MOV EAX,[ESP+16] ; fhandle + MOV ECX,[ESP+12] ; maxsize + MOV EBX,[ESP+8] ; buf + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api026.nas b/29_day/apilib/api026.nas new file mode 100644 index 0000000..33bb2f5 --- /dev/null +++ b/29_day/apilib/api026.nas @@ -0,0 +1,17 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api026.nas"] + + GLOBAL _api_cmdline + +[SECTION .text] + +_api_cmdline: ; int api_cmdline(char *buf, int maxsize); + PUSH EBX + MOV EDX,26 + MOV ECX,[ESP+12] ; maxsize + MOV EBX,[ESP+8] ; buf + INT 0x40 + POP EBX + RET diff --git a/29_day/apilib/api027.nas b/29_day/apilib/api027.nas new file mode 100644 index 0000000..38bfbc1 --- /dev/null +++ b/29_day/apilib/api027.nas @@ -0,0 +1,13 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "api027.nas"] + + GLOBAL _api_getlang + +[SECTION .text] + +_api_getlang: ; int api_getlang(void); + MOV EDX,27 + INT 0x40 + RET diff --git a/29_day/apilib/apilib.lib b/29_day/apilib/apilib.lib new file mode 100644 index 0000000000000000000000000000000000000000..29a8eeebd154eb753bb6d0e59a2125dff5d57df1 GIT binary patch literal 8966 zcmeI2&uv5w%5XY3zgzHW)jywS}zIi{^ zs~^`oyY){J*V10ed5ca-)fYK*TCxI?b?20d;e=|w_fW&6}na@=PnqsV7Bha zllH#Z`liuxcX5h4?T34frc-RR8rFkav)SI2z1`<~9n-YOXg6AxJnfiN-K{$VG#f3` zDeN}e-9hQDY27!!m6wTISd9m!{SkCHS})$E;`RZ|rK z#|@ljv<` zk{TKXJq@0(S4Kv|fTU3jLBsIt#Z#JokY1dkHm1RSlte+J&l|wuM!?oo)Fa?YdgWaq z5Jr@J91^)TiH%C^Mx_v|Uh=Q{?=)o4s((anyz1OXNffL8`Da^wa!*(bQavlP)H}#5 z_bQnc(ug!^#8=xvJ5)&zgy-*-cLjt;4X_o;1C=^a4ne2vx7mNteS+v*rZ%R-eUwB) z=hLk|d5(-{iSR5Fo)yBACOny5Gjo{`-413{)-&R#@Je)y7U@RHA0;cozPqG!{eMD< zcOXHjLX}Af!2ca!tG6Ds^wv0udn73()F@y8O#*o;b z_d>5k$H8&G?9V=eLYT<^1PVXU?+X7jr?#AXi()kkTw9nBbg=@*)j4->8D{hBcrR-3nB Wt<|Qd)cUcbwAxHvcu(R_7XJe03V>?> literal 0 HcmV?d00001 diff --git a/29_day/apilib/make.bat b/29_day/apilib/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/apilib/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/app_make.txt b/29_day/app_make.txt new file mode 100644 index 0000000..2bca4bc --- /dev/null +++ b/29_day/app_make.txt @@ -0,0 +1,79 @@ +TOOLPATH = ../../z_tools/ +INCPATH = ../../z_tools/haribote/ +APILIBPATH = ../apilib/ +HARIBOTEPATH = ../haribote/ + +MAKE = $(TOOLPATH)make.exe -r +NASK = $(TOOLPATH)nask.exe +CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -I../ -Os -Wall -quiet +GAS2NASK = $(TOOLPATH)gas2nask.exe -a +OBJ2BIM = $(TOOLPATH)obj2bim.exe +MAKEFONT = $(TOOLPATH)makefont.exe +BIN2OBJ = $(TOOLPATH)bin2obj.exe +BIM2HRB = $(TOOLPATH)bim2hrb.exe +RULEFILE = ../haribote.rul +EDIMG = $(TOOLPATH)edimg.exe +IMGTOL = $(TOOLPATH)imgtol.com +GOLIB = $(TOOLPATH)golib00.exe +COPY = copy +DEL = del + +#默认动作 + +default : + $(MAKE) $(APP).hrb + +#文件生成规则 + +$(APP).bim : $(APP).obj $(APILIBPATH)apilib.lib Makefile ../app_make.txt + $(OBJ2BIM) @$(RULEFILE) out:$(APP).bim map:$(APP).map stack:$(STACK) \ + $(APP).obj $(APILIBPATH)apilib.lib + +$(APP).hrb : $(APP).bim Makefile ../app_make.txt + $(BIM2HRB) $(APP).bim $(APP).hrb $(MALLOC) + +haribote.img : ../haribote/ipl10.bin ../haribote/haribote.sys $(APP).hrb \ + Makefile ../app_make.txt + $(EDIMG) imgin:../../z_tools/fdimg0at.tek \ + wbinimg src:../haribote/ipl10.bin len:512 from:0 to:0 \ + copy from:../haribote/haribote.sys to:@: \ + copy from:$(APP).hrb to:@: \ + imgout:haribote.img + +#一般规则 + +%.gas : %.c ../apilib.h Makefile ../app_make.txt + $(CC1) -o $*.gas $*.c + +%.nas : %.gas Makefile ../app_make.txt + $(GAS2NASK) $*.gas $*.nas + +%.obj : %.nas Makefile ../app_make.txt + $(NASK) $*.nas $*.obj $*.lst + +#命令 + +run : + $(MAKE) haribote.img + $(COPY) haribote.img ..\..\z_tools\qemu\fdimage0.bin + $(MAKE) -C ../../z_tools/qemu + +full : + $(MAKE) -C $(APILIBPATH) + $(MAKE) $(APP).hrb + +run_full : + $(MAKE) -C $(APILIBPATH) + $(MAKE) -C ../haribote + $(MAKE) run + +clean : + -$(DEL) *.lst + -$(DEL) *.obj + -$(DEL) *.map + -$(DEL) *.bim + -$(DEL) haribote.img + +src_only : + $(MAKE) clean + -$(DEL) $(APP).hrb diff --git a/29_day/beepdown/!cons_9x.bat b/29_day/beepdown/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/beepdown/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/beepdown/!cons_nt.bat b/29_day/beepdown/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/beepdown/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/beepdown/Makefile b/29_day/beepdown/Makefile new file mode 100644 index 0000000..ffd14fa --- /dev/null +++ b/29_day/beepdown/Makefile @@ -0,0 +1,5 @@ +APP = beepdown +STACK = 1k +MALLOC = 40k + +include ../app_make.txt diff --git a/29_day/beepdown/beepdown.c b/29_day/beepdown/beepdown.c new file mode 100644 index 0000000..d08962c --- /dev/null +++ b/29_day/beepdown/beepdown.c @@ -0,0 +1,19 @@ +#include "apilib.h" + +void HariMain(void) +{ + int i, timer; + timer = api_alloctimer(); + api_inittimer(timer, 128); + for (i = 20000000; i >= 20000; i -= i / 100) { + /* 20KHz~20Hz,即人类可以听到的声音范围*/ + /* i以1%的速度递减*/ + api_beep(i); + api_settimer(timer, 1); /* 0.01秒*/ + if (api_getkey(1) != 128) { + break; + } + } + api_beep(0); + api_end(); +} diff --git a/29_day/beepdown/make.bat b/29_day/beepdown/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/beepdown/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/chklang/!cons_9x.bat b/29_day/chklang/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/chklang/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/chklang/!cons_nt.bat b/29_day/chklang/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/chklang/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/chklang/Makefile b/29_day/chklang/Makefile new file mode 100644 index 0000000..c00ebbc --- /dev/null +++ b/29_day/chklang/Makefile @@ -0,0 +1,5 @@ +APP = chklang +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/chklang/chklang.c b/29_day/chklang/chklang.c new file mode 100644 index 0000000..3c28491 --- /dev/null +++ b/29_day/chklang/chklang.c @@ -0,0 +1,24 @@ +#include "apilib.h" + +void HariMain(void) +{ + int langmode = api_getlang(); + static char s1[23] = { /* 日本語シフトJISモード(日文Shift-JIS模式)*/ + 0x93, 0xfa, 0x96, 0x7b, 0x8c, 0xea, 0x83, 0x56, 0x83, 0x74, 0x83, 0x67, + 0x4a, 0x49, 0x53, 0x83, 0x82, 0x81, 0x5b, 0x83, 0x68, 0x0a, 0x00 + }; + static char s2[17] = { /*日本語EUCモード(日文EUC模式)*/ + 0xc6, 0xfc, 0xcb, 0xdc, 0xb8, 0xec, 0x45, 0x55, 0x43, 0xa5, 0xe2, 0xa1, + 0xbc, 0xa5, 0xc9, 0x0a, 0x00 + }; + if (langmode == 0) { + api_putstr0("English ASCII mode\n"); + } + if (langmode == 1) { + api_putstr0(s1); + } + if (langmode == 2) { + api_putstr0(s2); + } + api_end(); +} diff --git a/29_day/chklang/make.bat b/29_day/chklang/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/chklang/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/color/!cons_9x.bat b/29_day/color/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/color/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/color/!cons_nt.bat b/29_day/color/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/color/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/color/Makefile b/29_day/color/Makefile new file mode 100644 index 0000000..614dac9 --- /dev/null +++ b/29_day/color/Makefile @@ -0,0 +1,5 @@ +APP = color +STACK = 1k +MALLOC = 56k + +include ../app_make.txt diff --git a/29_day/color/color.c b/29_day/color/color.c new file mode 100644 index 0000000..ce228e2 --- /dev/null +++ b/29_day/color/color.c @@ -0,0 +1,21 @@ +#include "apilib.h" + +void HariMain(void) +{ + char *buf; + int win, x, y, r, g, b; + api_initmalloc(); + buf = api_malloc(144 * 164); + win = api_openwin(buf, 144, 164, -1, "color"); + for (y = 0; y < 128; y++) { + for (x = 0; x < 128; x++) { + r = x * 2; + g = y * 2; + b = 0; + buf[(x + 8) + (y + 28) * 144] = 16 + (r / 43) + (g / 43) * 6 + (b / 43) * 36; + } + } + api_refreshwin(win, 8, 28, 136, 156); + api_getkey(1); /*等待按下任意键*/ + api_end(); +} diff --git a/29_day/color/make.bat b/29_day/color/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/color/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/color2/!cons_9x.bat b/29_day/color2/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/color2/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/color2/!cons_nt.bat b/29_day/color2/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/color2/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/color2/Makefile b/29_day/color2/Makefile new file mode 100644 index 0000000..93b5f23 --- /dev/null +++ b/29_day/color2/Makefile @@ -0,0 +1,5 @@ +APP = color2 +STACK = 1k +MALLOC = 56k + +include ../app_make.txt diff --git a/29_day/color2/color2.c b/29_day/color2/color2.c new file mode 100644 index 0000000..82e3f6a --- /dev/null +++ b/29_day/color2/color2.c @@ -0,0 +1,36 @@ +#include "apilib.h" + +unsigned char rgb2pal(int r, int g, int b, int x, int y); + +void HariMain(void) +{ + char *buf; + int win, x, y; + api_initmalloc(); + buf = api_malloc(144 * 164); + win = api_openwin(buf, 144, 164, -1, "color2"); + for (y = 0; y < 128; y++) { + for (x = 0; x < 128; x++) { + buf[(x + 8) + (y + 28) * 144] = rgb2pal(x * 2, y * 2, 0, x, y); + } + } + api_refreshwin(win, 8, 28, 136, 156); + api_getkey(1); /* �Ă��Ƃ��ȃL�[���͂�҂� */ + api_end(); +} + +unsigned char rgb2pal(int r, int g, int b, int x, int y) +{ + static int table[4] = { 3, 1, 0, 2 }; + int i; + x &= 1; /*判断是偶数还是奇数*/ + y &= 1; + i = table[x + y * 2]; /*用来生成中间色的常量*/ + r = (r * 21) / 256; /* r为0~20*/ + g = (g * 21) / 256; + b = (b * 21) / 256; + r = (r + i) / 4; /* r为0~5*/ + g = (g + i) / 4; + b = (b + i) / 4; + return 16 + r + g * 6 + b * 36; +} diff --git a/29_day/color2/make.bat b/29_day/color2/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/color2/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/euc.txt b/29_day/euc.txt new file mode 100644 index 0000000..ae6d81a --- /dev/null +++ b/29_day/euc.txt @@ -0,0 +1 @@ +ܸEUCǽ񤤤Ƥߤ衼 diff --git a/29_day/haribote.rul b/29_day/haribote.rul new file mode 100644 index 0000000..ee8f67b --- /dev/null +++ b/29_day/haribote.rul @@ -0,0 +1,10 @@ +format: + code(align:1, logic:0x24, file:0x24); + data(align:4, logic:stack_end, file:code_end); + +file: + ../../z_tools/haribote/harilibc.lib; + ../../z_tools/haribote/golibc.lib; + +label: + _HariStartup; diff --git a/29_day/haribote/!cons_9x.bat b/29_day/haribote/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/haribote/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/haribote/!cons_nt.bat b/29_day/haribote/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/haribote/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/haribote/Makefile b/29_day/haribote/Makefile new file mode 100644 index 0000000..374bba7 --- /dev/null +++ b/29_day/haribote/Makefile @@ -0,0 +1,83 @@ +OBJS_BOOTPACK = bootpack.obj naskfunc.obj hankaku.obj graphic.obj dsctbl.obj \ + int.obj fifo.obj keyboard.obj mouse.obj memory.obj sheet.obj timer.obj \ + mtask.obj window.obj console.obj file.obj + +TOOLPATH = ../../z_tools/ +INCPATH = ../../z_tools/haribote/ + +MAKE = $(TOOLPATH)make.exe -r +NASK = $(TOOLPATH)nask.exe +CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet +GAS2NASK = $(TOOLPATH)gas2nask.exe -a +OBJ2BIM = $(TOOLPATH)obj2bim.exe +MAKEFONT = $(TOOLPATH)makefont.exe +BIN2OBJ = $(TOOLPATH)bin2obj.exe +BIM2HRB = $(TOOLPATH)bim2hrb.exe +RULEFILE = ../haribote.rul +EDIMG = $(TOOLPATH)edimg.exe +IMGTOL = $(TOOLPATH)imgtol.com +GOLIB = $(TOOLPATH)golib00.exe +COPY = copy +DEL = del + +#默认动作 + +default : + $(MAKE) ipl20.bin + $(MAKE) haribote.sys + +# 镜像文件生成 + +ipl10.bin : ipl10.nas Makefile + $(NASK) ipl10.nas ipl10.bin ipl10.lst + +ipl20.bin : ipl20.nas Makefile + $(NASK) ipl20.nas ipl20.bin ipl20.lst + +asmhead.bin : asmhead.nas Makefile + $(NASK) asmhead.nas asmhead.bin asmhead.lst + +hankaku.bin : hankaku.txt Makefile + $(MAKEFONT) hankaku.txt hankaku.bin + +hankaku.obj : hankaku.bin Makefile + $(BIN2OBJ) hankaku.bin hankaku.obj _hankaku + +bootpack.bim : $(OBJS_BOOTPACK) Makefile + $(OBJ2BIM) @$(RULEFILE) out:bootpack.bim stack:3136k map:bootpack.map \ + $(OBJS_BOOTPACK) +# 3MB+64KB=3136KB + +bootpack.hrb : bootpack.bim Makefile + $(BIM2HRB) bootpack.bim bootpack.hrb 0 + +haribote.sys : asmhead.bin bootpack.hrb Makefile + copy /B asmhead.bin+bootpack.hrb haribote.sys + +# 其他指令 + +%.gas : %.c bootpack.h Makefile + $(CC1) -o $*.gas $*.c + +%.nas : %.gas Makefile + $(GAS2NASK) $*.gas $*.nas + +%.obj : %.nas Makefile + $(NASK) $*.nas $*.obj $*.lst + +# 运行程序 + +clean : + -$(DEL) asmhead.bin + -$(DEL) hankaku.bin + -$(DEL) *.lst + -$(DEL) *.obj + -$(DEL) *.map + -$(DEL) *.bim + -$(DEL) *.hrb + +src_only : + $(MAKE) clean + -$(DEL) ipl10.bin + -$(DEL) ipl20.bin + -$(DEL) haribote.sys diff --git a/29_day/haribote/asmhead.nas b/29_day/haribote/asmhead.nas new file mode 100644 index 0000000..ad35d76 --- /dev/null +++ b/29_day/haribote/asmhead.nas @@ -0,0 +1,202 @@ +; haribote-os boot asm +; TAB=4 + +[INSTRSET "i486p"] + +VBEMODE EQU 0x105 ; 1024 x 768 x 8bit 彩色 +; 显示模式 +; 0x100 : 640 x 400 x 8bit 彩色 +; 0x101 : 640 x 480 x 8bit 彩色 +; 0x103 : 800 x 600 x 8bit 彩色 +; 0x105 : 1024 x 768 x 8bit 彩色 +; 0x107 : 1280 x 1024 x 8bit 彩色 + +BOTPAK EQU 0x00280000 ; 加载bootpack +DSKCAC EQU 0x00100000 ; 磁盘缓存的位置 +DSKCAC0 EQU 0x00008000 ; 磁盘缓存的位置(实模式) + +; BOOT_INFO 相关 +CYLS EQU 0x0ff0 ; 引导扇区设置 +LEDS EQU 0x0ff1 +VMODE EQU 0x0ff2 ; 关于颜色的信息 +SCRNX EQU 0x0ff4 ; 分辨率X +SCRNY EQU 0x0ff6 ; 分辨率Y +VRAM EQU 0x0ff8 ; 图像缓冲区的起始地址 + + ORG 0xc200 ; 这个的程序要被装载的内存地址 + +; 确认VBE是否存在 + + MOV AX,0x9000 + MOV ES,AX + MOV DI,0 + MOV AX,0x4f00 + INT 0x10 + CMP AX,0x004f + JNE scrn320 + +; 检查VBE的版本 + + MOV AX,[ES:DI+4] + CMP AX,0x0200 + JB scrn320 ; if (AX < 0x0200) goto scrn320 + +; 取得画面模式信息 + + MOV CX,VBEMODE + MOV AX,0x4f01 + INT 0x10 + CMP AX,0x004f + JNE scrn320 + +; 画面模式信息的确认 + CMP BYTE [ES:DI+0x19],8 ;颜色数必须为8 + JNE scrn320 + CMP BYTE [ES:DI+0x1b],4 ;颜色的指定方法必须为4(4是调色板模式) + JNE scrn320 + MOV AX,[ES:DI+0x00] ;模式属性bit7不是1就不能加上0x4000 + AND AX,0x0080 + JZ scrn320 ; 模式属性的bit7是0,所以放弃 + +; 画面设置 + + MOV BX,VBEMODE+0x4000 + MOV AX,0x4f02 + INT 0x10 + MOV BYTE [VMODE],8 ; 屏幕的模式(参考C语言的引用) + MOV AX,[ES:DI+0x12] + MOV [SCRNX],AX + MOV AX,[ES:DI+0x14] + MOV [SCRNY],AX + MOV EAX,[ES:DI+0x28] ;VRAM的地址 + MOV [VRAM],EAX + JMP keystatus + +scrn320: + MOV AL,0x13 ; VGA图、320x200x8bit彩色 + MOV AH,0x00 + INT 0x10 + MOV BYTE [VMODE],8 ; 记下画面模式(参考C语言) + MOV WORD [SCRNX],320 + MOV WORD [SCRNY],200 + MOV DWORD [VRAM],0x000a0000 + +; 通过 BIOS 获取指示灯状态 + +keystatus: + MOV AH,0x02 + INT 0x16 ; keyboard BIOS + MOV [LEDS],AL + +; PIC关闭一切中断 +; 根据AT兼容机的规格,如果要初始化PIC, +; 必须在CLI之前进行,否则有时会挂起。 +; 随后进行PIC的初始化。 + + MOV AL,0xff + OUT 0x21,AL + NOP ; 如果连续执行OUT指令,有些机种会无法正常运行 + OUT 0xa1,AL + + CLI ; 禁止CPU级别的中断 + +; 为了让CPU能够访问1MB以上的内存空间,设定A20GATE + + CALL waitkbdout + MOV AL,0xd1 + OUT 0x64,AL + CALL waitkbdout + MOV AL,0xdf ; enable A20 + OUT 0x60,AL + CALL waitkbdout + +; 切换到保护模式 + +[INSTRSET "i486p"] ; 说明使用486指令 + + LGDT [GDTR0] ; 设置临时GDT + MOV EAX,CR0 + AND EAX,0x7fffffff ; 设bit31为0(禁用分页) + OR EAX,0x00000001 ; bit0到1转换(保护模式过渡) + MOV CR0,EAX + JMP pipelineflush +pipelineflush: + MOV AX,1*8 ; 可读写的段 32bit + MOV DS,AX + MOV ES,AX + MOV FS,AX + MOV GS,AX + MOV SS,AX + +; bootpack传递 + + MOV ESI,bootpack ; 转送源 + MOV EDI,BOTPAK ; 转送目标 + MOV ECX,512*1024/4 + CALL memcpy + +; 磁盘数据最终转送到它本来的位置去 +; 首先从启动扇区开始 + + MOV ESI,0x7c00 ; 转送源 + MOV EDI,DSKCAC ; 转送目标 + MOV ECX,512/4 + CALL memcpy + +; 剩余的全部 + + MOV ESI,DSKCAC0+512 ; 转送源 + MOV EDI,DSKCAC+512 ; 转送源目标 + MOV ECX,0 + MOV CL,BYTE [CYLS] + IMUL ECX,512*18*2/4 ; 从柱面数变换为字节数/4 + SUB ECX,512/4 ; 减去 IPL 偏移量 + CALL memcpy + +; 必须由asmhead来完成的工作,至此全部完毕 +; 以后就交由bootpack来完成 + +; bootpack启动 + + MOV EBX,BOTPAK + MOV ECX,[EBX+16] + ADD ECX,3 ; ECX += 3; + SHR ECX,2 ; ECX /= 4; + JZ skip ; 没有要转送的东西时 + MOV ESI,[EBX+20] ; 转送源 + ADD ESI,EBX + MOV EDI,[EBX+12] ; 转送目标 + CALL memcpy +skip: + MOV ESP,[EBX+12] ; 堆栈的初始化 + JMP DWORD 2*8:0x0000001b + +waitkbdout: + IN AL,0x64 + AND AL,0x02 + JNZ waitkbdout ; AND的结果如果不是0,就跳到waitkbdout + RET + +memcpy: + MOV EAX,[ESI] + ADD ESI,4 + MOV [EDI],EAX + ADD EDI,4 + SUB ECX,1 + JNZ memcpy ; 减法运算的结果如果不是0,就跳转到memcpy + RET +; memcpy地址前缀大小 + + ALIGNB 16 +GDT0: + RESB 8 ; 初始值 + DW 0xffff,0x0000,0x9200,0x00cf ; 可以读写的段(segment)32bit + DW 0xffff,0x0000,0x9a28,0x0047 ; 可执行的文件的32bit寄存器(bootpack用) + + DW 0 +GDTR0: + DW 8*3-1 + DD GDT0 + + ALIGNB 16 +bootpack: diff --git a/29_day/haribote/bootpack.c b/29_day/haribote/bootpack.c new file mode 100644 index 0000000..92754c6 --- /dev/null +++ b/29_day/haribote/bootpack.c @@ -0,0 +1,410 @@ +/* bootpack */ + +#include "bootpack.h" +#include + +#define KEYCMD_LED 0xed + +void keywin_off(struct SHEET *key_win); +void keywin_on(struct SHEET *key_win); +void close_console(struct SHEET *sht); +void close_constask(struct TASK *task); + +void HariMain(void) +{ + struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; + struct SHTCTL *shtctl; + char s[40]; + struct FIFO32 fifo, keycmd; + int fifobuf[128], keycmd_buf[32]; + int mx, my, i, new_mx = -1, new_my = 0, new_wx = 0x7fffffff, new_wy = 0; + unsigned int memtotal; + struct MOUSE_DEC mdec; + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + unsigned char *buf_back, buf_mouse[256]; + struct SHEET *sht_back, *sht_mouse; + struct TASK *task_a, *task; + static char keytable0[0x80] = { + 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0x08, 0, + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0x0a, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V', + 'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x5c, 0, 0 + }; + static char keytable1[0x80] = { + 0, 0, '!', 0x22, '#', '$', '%', '&', 0x27, '(', ')', '~', '=', '~', 0x08, 0, + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0x0a, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0, 0, '}', 'Z', 'X', 'C', 'V', + 'B', 'N', 'M', '<', '>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0 + }; + int key_shift = 0, key_leds = (binfo->leds >> 4) & 7, keycmd_wait = -1; + int j, x, y, mmx = -1, mmy = -1, mmx2 = 0; + struct SHEET *sht = 0, *key_win, *sht2; + int *fat; + unsigned char *nihongo; + struct FILEINFO *finfo; + extern char hankaku[4096]; + + init_gdtidt(); + init_pic(); + io_sti(); /* IDT/PIC的初始化已经完成,于是开放CPU的中断 */ + fifo32_init(&fifo, 128, fifobuf, 0); + *((int *) 0x0fec) = (int) &fifo; + init_pit(); + init_keyboard(&fifo, 256); + enable_mouse(&fifo, 512, &mdec); + io_out8(PIC0_IMR, 0xf8); /* 设定PIT和PIC1以及键盘为许可(11111000) */ + io_out8(PIC1_IMR, 0xef); /* 开放鼠标中断(11101111) */ + fifo32_init(&keycmd, 32, keycmd_buf, 0); + + memtotal = memtest(0x00400000, 0xbfffffff); + memman_init(memman); + memman_free(memman, 0x00001000, 0x0009e000); /* 0x00001000 - 0x0009efff */ + memman_free(memman, 0x00400000, memtotal - 0x00400000); + + init_palette(); + shtctl = shtctl_init(memman, binfo->vram, binfo->scrnx, binfo->scrny); + task_a = task_init(memman); + fifo.task = task_a; + task_run(task_a, 1, 2); + *((int *) 0x0fe4) = (int) shtctl; + task_a->langmode = 0; + + /* sht_back */ + sht_back = sheet_alloc(shtctl); + buf_back = (unsigned char *) memman_alloc_4k(memman, binfo->scrnx * binfo->scrny); + sheet_setbuf(sht_back, buf_back, binfo->scrnx, binfo->scrny, -1); /* 无透明色 */ + init_screen8(buf_back, binfo->scrnx, binfo->scrny); + + /* sht_cons */ + key_win = open_console(shtctl, memtotal); + + /* sht_mouse */ + sht_mouse = sheet_alloc(shtctl); + sheet_setbuf(sht_mouse, buf_mouse, 16, 16, 99); + init_mouse_cursor8(buf_mouse, 99); + mx = (binfo->scrnx - 16) / 2; /* 计算坐标使其位于画面中央 */ + my = (binfo->scrny - 28 - 16) / 2; + + sheet_slide(sht_back, 0, 0); + sheet_slide(key_win, 32, 4); + sheet_slide(sht_mouse, mx, my); + sheet_updown(sht_back, 0); + sheet_updown(key_win, 1); + sheet_updown(sht_mouse, 2); + keywin_on(key_win); + + /* 为了避免和键盘当前状态冲突,在一开始先进行设置 */ + fifo32_put(&keycmd, KEYCMD_LED); + fifo32_put(&keycmd, key_leds); + + /* 载入nihongo.fnt */ + nihongo = (unsigned char *) memman_alloc_4k(memman, 16 * 256 + 32 * 94 * 47); + fat = (int *) memman_alloc_4k(memman, 4 * 2880); + file_readfat(fat, (unsigned char *) (ADR_DISKIMG + 0x000200)); + finfo = file_search("nihongo.fnt", (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224); + if (finfo != 0) { + file_loadfile(finfo->clustno, finfo->size, nihongo, fat, (char *) (ADR_DISKIMG + 0x003e00)); + } else { + for (i = 0; i < 16 * 256; i++) { + nihongo[i] = hankaku[i]; /* 没有字库,半角部分直接复制英文字库 */ + } + for (i = 16 * 256; i < 16 * 256 + 32 * 94 * 47; i++) { + nihongo[i] = 0xff; /* 没有字库,全角部分以0xff填充 */ + } + } + *((int *) 0x0fe8) = (int) nihongo; + memman_free_4k(memman, (int) fat, 4 * 2880); + + for (;;) { + if (fifo32_status(&keycmd) > 0 && keycmd_wait < 0) { + /* 如果存在向键盘控制器发送的数据,则发送它 */ + keycmd_wait = fifo32_get(&keycmd); + wait_KBC_sendready(); + io_out8(PORT_KEYDAT, keycmd_wait); + } + io_cli(); + if (fifo32_status(&fifo) == 0) { + /* FIFO为空,当存在搁置的绘图操作时立即执行*/ + if (new_mx >= 0) { + io_sti(); + sheet_slide(sht_mouse, new_mx, new_my); + new_mx = -1; + } else if (new_wx != 0x7fffffff) { + io_sti(); + sheet_slide(sht, new_wx, new_wy); + new_wx = 0x7fffffff; + } else { + task_sleep(task_a); + io_sti(); + } + } else { + i = fifo32_get(&fifo); + io_sti(); + if (key_win != 0 && key_win->flags == 0) { /*窗口被关闭*/ + if (shtctl->top == 1) { /*当画面上只剩鼠标和背景时*/ + key_win = 0; + } else { + key_win = shtctl->sheets[shtctl->top - 1]; + keywin_on(key_win); + } + } + if (256 <= i && i <= 511) { /* 键盘数据*/ + if (i < 0x80 + 256) { /*将按键编码转换为字符编码*/ + if (key_shift == 0) { + s[0] = keytable0[i - 256]; + } else { + s[0] = keytable1[i - 256]; + } + } else { + s[0] = 0; + } + if ('A' <= s[0] && s[0] <= 'Z') { /*当输入字符为英文字母时*/ + if (((key_leds & 4) == 0 && key_shift == 0) || + ((key_leds & 4) != 0 && key_shift != 0)) { + s[0] += 0x20; /*将大写字母转换为小写字母*/ + } + } + if (s[0] != 0 && key_win != 0) { /*一般字符、退格键、回车键*/ + fifo32_put(&key_win->task->fifo, s[0] + 256); + } + if (i == 256 + 0x0f && key_win != 0) { /* Tab键 */ + keywin_off(key_win); + j = key_win->height - 1; + if (j == 0) { + j = shtctl->top - 1; + } + key_win = shtctl->sheets[j]; + keywin_on(key_win); + } + if (i == 256 + 0x2a) { /*左Shift ON */ + key_shift |= 1; + } + if (i == 256 + 0x36) { /*右Shift ON */ + key_shift |= 2; + } + if (i == 256 + 0xaa) { /*左Shift OFF */ + key_shift &= ~1; + } + if (i == 256 + 0xb6) { /*右Shift OFF */ + key_shift &= ~2; + } + if (i == 256 + 0x3a) { /* CapsLock */ + key_leds ^= 4; + fifo32_put(&keycmd, KEYCMD_LED); + fifo32_put(&keycmd, key_leds); + } + if (i == 256 + 0x45) { /* NumLock */ + key_leds ^= 2; + fifo32_put(&keycmd, KEYCMD_LED); + fifo32_put(&keycmd, key_leds); + } + if (i == 256 + 0x46) { /* ScrollLock */ + key_leds ^= 1; + fifo32_put(&keycmd, KEYCMD_LED); + fifo32_put(&keycmd, key_leds); + } + if (i == 256 + 0x3b && key_shift != 0 && key_win != 0) { /* Shift+F1 */ + task = key_win->task; + if (task != 0 && task->tss.ss0 != 0) { + cons_putstr0(task->cons, "\nBreak(key) :\n"); + io_cli(); /*强制结束处理时禁止任务切换*/ + task->tss.eax = (int) &(task->tss.esp0); + task->tss.eip = (int) asm_end_app; + io_sti(); + task_run(task, -1, 0); /*为了确实执行结束处理,如果处于休眠状态则唤醒*/ + } + } + if (i == 256 + 0x3c && key_shift != 0) { /* Shift+F2 */ + if (key_win != 0) { + keywin_off(key_win); + } + key_win = open_console(shtctl, memtotal); + sheet_slide(key_win, 32, 4); + sheet_updown(key_win, shtctl->top); + keywin_on(key_win); + } + if (i == 256 + 0x57) { /* F11 */ + sheet_updown(shtctl->sheets[1], shtctl->top - 1); + } + if (i == 256 + 0xfa) { /*键盘成功接收到数据*/ + keycmd_wait = -1; + } + if (i == 256 + 0xfe) { /*键盘没有成功接收到数据*/ + wait_KBC_sendready(); + io_out8(PORT_KEYDAT, keycmd_wait); + } + } else if (512 <= i && i <= 767) { /* 鼠标数据*/ + if (mouse_decode(&mdec, i - 512) != 0) { + /* 已经收集了3字节的数据,移动光标 */ + mx += mdec.x; + my += mdec.y; + if (mx < 0) { + mx = 0; + } + if (my < 0) { + my = 0; + } + if (mx > binfo->scrnx - 1) { + mx = binfo->scrnx - 1; + } + if (my > binfo->scrny - 1) { + my = binfo->scrny - 1; + } + new_mx = mx; + new_my = my; + if ((mdec.btn & 0x01) != 0) { /* 按下左键 */ + if (mmx < 0) { + /*如果处于通常模式*/ + /*按照从上到下的顺序寻找鼠标所指向的图层*/ + for (j = shtctl->top - 1; j > 0; j--) { + sht = shtctl->sheets[j]; + x = mx - sht->vx0; + y = my - sht->vy0; + if (0 <= x && x < sht->bxsize && 0 <= y && y < sht->bysize) { + if (sht->buf[y * sht->bxsize + x] != sht->col_inv) { + sheet_updown(sht, shtctl->top - 1); + if (sht != key_win) { + keywin_off(key_win); + key_win = sht; + keywin_on(key_win); + } + if (3 <= x && x < sht->bxsize - 3 && 3 <= y && y < 21) { + mmx = mx; /*进入窗口移动模式*/ + mmy = my; + mmx2 = sht->vx0; + new_wy = sht->vy0; + } + if (sht->bxsize - 21 <= x && x < sht->bxsize - 5 && 5 <= y && y < 19) { + /*点击“×”按钮*/ + if ((sht->flags & 0x10) != 0) { /*该窗口是否为应用程序窗口?*/ + task = sht->task; + cons_putstr0(task->cons, "\nBreak(mouse) :\n"); + io_cli(); /*强制结束处理时禁止任务切换*/ + task->tss.eax = (int) &(task->tss.esp0); + task->tss.eip = (int) asm_end_app; + io_sti(); + task_run(task, -1, 0); + } else { /*命令行窗口*/ + task = sht->task; + sheet_updown(sht, -1); /*暂且隐藏该图层*/ + keywin_off(key_win); + key_win = shtctl->sheets[shtctl->top - 1]; + keywin_on(key_win); + io_cli(); + fifo32_put(&task->fifo, 4); + io_sti(); + } + } + break; + } + } + } + } else { + /*如果处于窗口移动模式*/ + x = mx - mmx; /*计算鼠标指针移动量*/ + y = my - mmy; + new_wx = (mmx2 + x + 2) & ~3; + new_wy = new_wy + y; + mmy = my; + } + } else { + /*没有按下左键*/ + mmx = -1; /*切换到一般模式*/ + if (new_wx != 0x7fffffff) { + sheet_slide(sht, new_wx, new_wy); /*固定图层位置*/ + new_wx = 0x7fffffff; + } + } + } + } else if (768 <= i && i <= 1023) { /*命令行窗口关闭处理*/ + close_console(shtctl->sheets0 + (i - 768)); + } else if (1024 <= i && i <= 2023) { + close_constask(taskctl->tasks0 + (i - 1024)); + } else if (2024 <= i && i <= 2279) { /*只关闭命令行窗口*/ + sht2 = shtctl->sheets0 + (i - 2024); + memman_free_4k(memman, (int) sht2->buf, 256 * 165); + sheet_free(sht2); + } + } + } +} + +void keywin_off(struct SHEET *key_win) +{ + change_wtitle8(key_win, 0); + if ((key_win->flags & 0x20) != 0) { + fifo32_put(&key_win->task->fifo, 3); /*命令行窗口光标OFF */ + } + return; +} + +void keywin_on(struct SHEET *key_win) +{ + change_wtitle8(key_win, 1); + if ((key_win->flags & 0x20) != 0) { + fifo32_put(&key_win->task->fifo, 2); /*命令行窗口光标ON */ + } + return; +} + +struct TASK *open_constask(struct SHEET *sht, unsigned int memtotal) +{ + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + struct TASK *task = task_alloc(); + int *cons_fifo = (int *) memman_alloc_4k(memman, 128 * 4); + task->cons_stack = memman_alloc_4k(memman, 64 * 1024); + task->tss.esp = task->cons_stack + 64 * 1024 - 12; + task->tss.eip = (int) &console_task; + task->tss.es = 1 * 8; + task->tss.cs = 2 * 8; + task->tss.ss = 1 * 8; + task->tss.ds = 1 * 8; + task->tss.fs = 1 * 8; + task->tss.gs = 1 * 8; + *((int *) (task->tss.esp + 4)) = (int) sht; + *((int *) (task->tss.esp + 8)) = memtotal; + task_run(task, 2, 2); /* level=2, priority=2 */ + fifo32_init(&task->fifo, 128, cons_fifo, task); + return task; +} + +struct SHEET *open_console(struct SHTCTL *shtctl, unsigned int memtotal) +{ + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + struct SHEET *sht = sheet_alloc(shtctl); + unsigned char *buf = (unsigned char *) memman_alloc_4k(memman, 256 * 165); + sheet_setbuf(sht, buf, 256, 165, -1); /*无透明色*/ + make_window8(buf, 256, 165, "console", 0); + make_textbox8(sht, 8, 28, 240, 128, COL8_000000); + sht->task = open_constask(sht, memtotal); + sht->flags |= 0x20; /*有光标*/ + return sht; +} + +void close_constask(struct TASK *task) +{ + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + task_sleep(task); + memman_free_4k(memman, task->cons_stack, 64 * 1024); + memman_free_4k(memman, (int) task->fifo.buf, 128 * 4); + task->flags = 0; /*用来替代task_free(task); */ + return; +} + +void close_console(struct SHEET *sht) +{ + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + struct TASK *task = sht->task; + memman_free_4k(memman, (int) sht->buf, 256 * 165); + sheet_free(sht); + close_constask(task); + return; +} diff --git a/29_day/haribote/bootpack.h b/29_day/haribote/bootpack.h new file mode 100644 index 0000000..f2e8243 --- /dev/null +++ b/29_day/haribote/bootpack.h @@ -0,0 +1,292 @@ +/* asmhead.nas */ +struct BOOTINFO { /* 0x0ff0-0x0fff */ + char cyls; /* 启动区读磁盘读到此为止 */ + char leds; /* 启动时键盘的LED的状态 */ + char vmode; /* 显卡模式为多少位彩色 */ + char reserve; + short scrnx, scrny; /* 画面分辨率 */ + char *vram; +}; +#define ADR_BOOTINFO 0x00000ff0 +#define ADR_DISKIMG 0x00100000 + +/* naskfunc.nas */ +void io_hlt(void); +void io_cli(void); +void io_sti(void); +void io_stihlt(void); +int io_in8(int port); +void io_out8(int port, int data); +int io_load_eflags(void); +void io_store_eflags(int eflags); +void load_gdtr(int limit, int addr); +void load_idtr(int limit, int addr); +int load_cr0(void); +void store_cr0(int cr0); +void load_tr(int tr); +void asm_inthandler0c(void); +void asm_inthandler0d(void); +void asm_inthandler20(void); +void asm_inthandler21(void); +void asm_inthandler2c(void); +unsigned int memtest_sub(unsigned int start, unsigned int end); +void farjmp(int eip, int cs); +void farcall(int eip, int cs); +void asm_hrb_api(void); +void start_app(int eip, int cs, int esp, int ds, int *tss_esp0); +void asm_end_app(void); + +/* fifo.c */ +struct FIFO32 { + int *buf; + int p, q, size, free, flags; + struct TASK *task; +}; +void fifo32_init(struct FIFO32 *fifo, int size, int *buf, struct TASK *task); +int fifo32_put(struct FIFO32 *fifo, int data); +int fifo32_get(struct FIFO32 *fifo); +int fifo32_status(struct FIFO32 *fifo); + +/* graphic.c */ +void init_palette(void); +void set_palette(int start, int end, unsigned char *rgb); +void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1); +void init_screen8(char *vram, int x, int y); +void putfont8(char *vram, int xsize, int x, int y, char c, char *font); +void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s); +void init_mouse_cursor8(char *mouse, char bc); +void putblock8_8(char *vram, int vxsize, int pxsize, + int pysize, int px0, int py0, char *buf, int bxsize); +#define COL8_000000 0 +#define COL8_FF0000 1 +#define COL8_00FF00 2 +#define COL8_FFFF00 3 +#define COL8_0000FF 4 +#define COL8_FF00FF 5 +#define COL8_00FFFF 6 +#define COL8_FFFFFF 7 +#define COL8_C6C6C6 8 +#define COL8_840000 9 +#define COL8_008400 10 +#define COL8_848400 11 +#define COL8_000084 12 +#define COL8_840084 13 +#define COL8_008484 14 +#define COL8_848484 15 + +/* dsctbl.c */ +struct SEGMENT_DESCRIPTOR { + short limit_low, base_low; + char base_mid, access_right; + char limit_high, base_high; +}; +struct GATE_DESCRIPTOR { + short offset_low, selector; + char dw_count, access_right; + short offset_high; +}; +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_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_INTGATE32 0x008e + +/* int.c */ +void init_pic(void); +#define PIC0_ICW1 0x0020 +#define PIC0_OCW2 0x0020 +#define PIC0_IMR 0x0021 +#define PIC0_ICW2 0x0021 +#define PIC0_ICW3 0x0021 +#define PIC0_ICW4 0x0021 +#define PIC1_ICW1 0x00a0 +#define PIC1_OCW2 0x00a0 +#define PIC1_IMR 0x00a1 +#define PIC1_ICW2 0x00a1 +#define PIC1_ICW3 0x00a1 +#define PIC1_ICW4 0x00a1 + +/* keyboard.c */ +void inthandler21(int *esp); +void wait_KBC_sendready(void); +void init_keyboard(struct FIFO32 *fifo, int data0); +#define PORT_KEYDAT 0x0060 +#define PORT_KEYCMD 0x0064 + +/* mouse.c */ +struct MOUSE_DEC { + unsigned char buf[3], phase; + int x, y, btn; +}; +void inthandler2c(int *esp); +void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec); +int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat); + +/* memory.c */ +#define MEMMAN_FREES 4090 /* ����Ŗ�32KB */ +#define MEMMAN_ADDR 0x003c0000 +struct FREEINFO { /* ������� */ + unsigned int addr, size; +}; +struct MEMMAN { /* �������Ǘ� */ + int frees, maxfrees, lostsize, losts; + struct FREEINFO free[MEMMAN_FREES]; +}; +unsigned int memtest(unsigned int start, unsigned int end); +void memman_init(struct MEMMAN *man); +unsigned int memman_total(struct MEMMAN *man); +unsigned int memman_alloc(struct MEMMAN *man, unsigned int size); +int memman_free(struct MEMMAN *man, unsigned int addr, unsigned int size); +unsigned int memman_alloc_4k(struct MEMMAN *man, unsigned int size); +int memman_free_4k(struct MEMMAN *man, unsigned int addr, unsigned int size); + +/* sheet.c */ +#define MAX_SHEETS 256 +struct SHEET { + unsigned char *buf; + int bxsize, bysize, vx0, vy0, col_inv, height, flags; + struct SHTCTL *ctl; + struct TASK *task; +}; +struct SHTCTL { + unsigned char *vram, *map; + int xsize, ysize, top; + struct SHEET *sheets[MAX_SHEETS]; + struct SHEET sheets0[MAX_SHEETS]; +}; +struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize); +struct SHEET *sheet_alloc(struct SHTCTL *ctl); +void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv); +void sheet_updown(struct SHEET *sht, int height); +void sheet_refresh(struct SHEET *sht, int bx0, int by0, int bx1, int by1); +void sheet_slide(struct SHEET *sht, int vx0, int vy0); +void sheet_free(struct SHEET *sht); + +/* timer.c */ +#define MAX_TIMER 500 +struct TIMER { + struct TIMER *next; + unsigned int timeout; + char flags, flags2; + struct FIFO32 *fifo; + int data; +}; +struct TIMERCTL { + unsigned int count, next; + struct TIMER *t0; + struct TIMER timers0[MAX_TIMER]; +}; +extern struct TIMERCTL timerctl; +void init_pit(void); +struct TIMER *timer_alloc(void); +void timer_free(struct TIMER *timer); +void timer_init(struct TIMER *timer, struct FIFO32 *fifo, int data); +void timer_settime(struct TIMER *timer, unsigned int timeout); +void inthandler20(int *esp); +int timer_cancel(struct TIMER *timer); +void timer_cancelall(struct FIFO32 *fifo); + +/* mtask.c */ +#define MAX_TASKS 1000 /*最大任务数量*/ +#define TASK_GDT0 3 /*定义从GDT的几号开始分配给TSS */ +#define MAX_TASKS_LV 100 +#define MAX_TASKLEVELS 10 +struct TSS32 { + int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; + int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi; + int es, cs, ss, ds, fs, gs; + int ldtr, iomap; +}; +struct TASK { + int sel, flags; /* sel用来存放GDT的编号*/ + int level, priority; /* 优先级 */ + struct FIFO32 fifo; + struct TSS32 tss; + struct SEGMENT_DESCRIPTOR ldt[2]; + struct CONSOLE *cons; + int ds_base, cons_stack; + struct FILEHANDLE *fhandle; + int *fat; + char *cmdline; + unsigned char langmode, langbyte1; +}; +struct TASKLEVEL { + int running; /*正在运行的任务数量*/ + int now; /*这个变量用来记录当前正在运行的是哪个任务*/ + struct TASK *tasks[MAX_TASKS_LV]; +}; +struct TASKCTL { + int now_lv; /*现在活动中的LEVEL */ + char lv_change; /*在下次任务切换时是否需要改变LEVEL */ + struct TASKLEVEL level[MAX_TASKLEVELS]; + struct TASK tasks0[MAX_TASKS]; +}; +extern struct TASKCTL *taskctl; +extern struct TIMER *task_timer; +struct TASK *task_now(void); +struct TASK *task_init(struct MEMMAN *memman); +struct TASK *task_alloc(void); +void task_run(struct TASK *task, int level, int priority); +void task_switch(void); +void task_sleep(struct TASK *task); + +/* window.c */ +void make_window8(unsigned char *buf, int xsize, int ysize, char *title, char act); +void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b, char *s, int l); +void make_textbox8(struct SHEET *sht, int x0, int y0, int sx, int sy, int c); +void make_wtitle8(unsigned char *buf, int xsize, char *title, char act); +void change_wtitle8(struct SHEET *sht, char act); + +/* console.c */ +struct CONSOLE { + struct SHEET *sht; + int cur_x, cur_y, cur_c; + struct TIMER *timer; +}; +struct FILEHANDLE { + char *buf; + int size; + int pos; +}; +void console_task(struct SHEET *sheet, int memtotal); +void cons_putchar(struct CONSOLE *cons, int chr, char move); +void cons_newline(struct CONSOLE *cons); +void cons_putstr0(struct CONSOLE *cons, char *s); +void cons_putstr1(struct CONSOLE *cons, char *s, int l); +void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, int memtotal); +void cmd_mem(struct CONSOLE *cons, int memtotal); +void cmd_cls(struct CONSOLE *cons); +void cmd_dir(struct CONSOLE *cons); +void cmd_exit(struct CONSOLE *cons, int *fat); +void cmd_start(struct CONSOLE *cons, char *cmdline, int memtotal); +void cmd_ncst(struct CONSOLE *cons, char *cmdline, int memtotal); +void cmd_langmode(struct CONSOLE *cons, char *cmdline); +int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline); +int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax); +int *inthandler0d(int *esp); +int *inthandler0c(int *esp); +void hrb_api_linewin(struct SHEET *sht, int x0, int y0, int x1, int y1, int col); + +/* file.c */ +struct FILEINFO { + unsigned char name[8], ext[3], type; + char reserve[10]; + unsigned short time, date, clustno; + unsigned int size; +}; +void file_readfat(int *fat, unsigned char *img); +void file_loadfile(int clustno, int size, char *buf, int *fat, char *img); +struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max); + +/* bootpack.c */ +struct TASK *open_constask(struct SHEET *sht, unsigned int memtotal); +struct SHEET *open_console(struct SHTCTL *shtctl, unsigned int memtotal); diff --git a/29_day/haribote/console.c b/29_day/haribote/console.c new file mode 100644 index 0000000..b231d2b --- /dev/null +++ b/29_day/haribote/console.c @@ -0,0 +1,698 @@ +/* 命令行窗口相关 */ + +#include "bootpack.h" +#include +#include + +void console_task(struct SHEET *sheet, int memtotal) +{ + struct TASK *task = task_now(); + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + int i, *fat = (int *) memman_alloc_4k(memman, 4 * 2880); + struct FILEHANDLE fhandle[8]; + struct CONSOLE cons; + char cmdline[30]; + unsigned char *nihongo = (char *) *((int *) 0x0fe8); + + cons.sht = sheet; + cons.cur_x = 8; + cons.cur_y = 28; + cons.cur_c = -1; + task->cons = &cons; + task->cmdline = cmdline; + + if (cons.sht != 0) { + cons.timer = timer_alloc(); + timer_init(cons.timer, &task->fifo, 1); + timer_settime(cons.timer, 50); + } + file_readfat(fat, (unsigned char *) (ADR_DISKIMG + 0x000200)); + for (i = 0; i < 8; i++) { + fhandle[i].buf = 0; /*未使用标记*/ + } + task->fhandle = fhandle; + task->fat = fat; + if (nihongo[4096] != 0xff) { /* 是否载入了字库?*/ + task->langmode = 1; + } else { + task->langmode = 0; + } + task->langbyte1 = 0; + + /*显示提示符*/ + cons_putchar(&cons, '>', 1); + + for (;;) { + io_cli(); + if (fifo32_status(&task->fifo) == 0) { + task_sleep(task); + io_sti(); + } else { + i = fifo32_get(&task->fifo); + io_sti(); + if (i <= 1 && cons.sht != 0) { /*光标用定时器*/ + if (i != 0) { + timer_init(cons.timer, &task->fifo, 0); /*下次置0 */ + if (cons.cur_c >= 0) { + cons.cur_c = COL8_FFFFFF; + } + } else { + timer_init(cons.timer, &task->fifo, 1); /*下次置1 */ + if (cons.cur_c >= 0) { + cons.cur_c = COL8_000000; + } + } + timer_settime(cons.timer, 50); + } + if (i == 2) { /*光标ON */ + cons.cur_c = COL8_FFFFFF; + } + if (i == 3) { /*光标OFF */ + if (cons.sht != 0) { + boxfill8(cons.sht->buf, cons.sht->bxsize, COL8_000000, + cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15); + } + cons.cur_c = -1; + } + if (i == 4) { /*点击命令行窗口的“×”按钮*/ + cmd_exit(&cons, fat); + } + if (256 <= i && i <= 511) { /*键盘数据(通过任务A)*/ + if (i == 8 + 256) { + /*退格键*/ + if (cons.cur_x > 16) { + /*用空格擦除光标后将光标前移一位*/ + cons_putchar(&cons, ' ', 0); + cons.cur_x -= 8; + } + } else if (i == 10 + 256) { + /*回车键*/ + /*将光标用空格擦除后换行 */ + cons_putchar(&cons, ' ', 0); + cmdline[cons.cur_x / 8 - 2] = 0; + cons_newline(&cons); + cons_runcmd(cmdline, &cons, fat, memtotal); /*运行命令*/ + if (cons.sht == 0) { + cmd_exit(&cons, fat); + } + /*显示提示符*/ + cons_putchar(&cons, '>', 1); + } else { + /*一般字符*/ + if (cons.cur_x < 240) { + /*显示一个字符之后将光标后移一位*/ + cmdline[cons.cur_x / 8 - 2] = i - 256; + cons_putchar(&cons, i - 256, 1); + } + } + } + /*重新显示光标*/ + if (cons.sht != 0) { + if (cons.cur_c >= 0) { + boxfill8(cons.sht->buf, cons.sht->bxsize, cons.cur_c, + cons.cur_x, cons.cur_y, cons.cur_x + 7, cons.cur_y + 15); + } + sheet_refresh(cons.sht, cons.cur_x, cons.cur_y, cons.cur_x + 8, cons.cur_y + 16); + } + } + } +} + +void cons_putchar(struct CONSOLE *cons, int chr, char move) +{ + char s[2]; + s[0] = chr; + s[1] = 0; + if (s[0] == 0x09) { /*制表符*/ + for (;;) { + if (cons->sht != 0) { + putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, " ", 1); + } + cons->cur_x += 8; + if (cons->cur_x == 8 + 240) { + cons_newline(cons); + } + if (((cons->cur_x - 8) & 0x1f) == 0) { + break; /*被32整除则break*/ + } + } + } else if (s[0] == 0x0a) { /*换行*/ + cons_newline(cons); + } else if (s[0] == 0x0d) { /*回车*/ + /*先不做任何操作*/ + } else { /*一般字符*/ + if (cons->sht != 0) { + putfonts8_asc_sht(cons->sht, cons->cur_x, cons->cur_y, COL8_FFFFFF, COL8_000000, s, 1); + } + if (move != 0) { + /* move为0时光标不后移*/ + cons->cur_x += 8; + if (cons->cur_x == 8 + 240) { + cons_newline(cons); + } + } + } + return; +} + +void cons_newline(struct CONSOLE *cons) +{ + int x, y; + struct SHEET *sheet = cons->sht; + struct TASK *task = task_now(); + if (cons->cur_y < 28 + 112) { + cons->cur_y += 16; /*到下一行*/ + } else { + /*滚动*/ + if (sheet != 0) { + for (y = 28; y < 28 + 112; y++) { + for (x = 8; x < 8 + 240; x++) { + sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) * sheet->bxsize]; + } + } + for (y = 28 + 112; y < 28 + 128; y++) { + for (x = 8; x < 8 + 240; x++) { + sheet->buf[x + y * sheet->bxsize] = COL8_000000; + } + } + sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128); + } + } + cons->cur_x = 8; + if (task->langmode == 1 && task->langbyte1 != 0) { + cons->cur_x += 8; + } + return; +} + +void cons_putstr0(struct CONSOLE *cons, char *s) +{ + for (; *s != 0; s++) { + cons_putchar(cons, *s, 1); + } + return; +} + +void cons_putstr1(struct CONSOLE *cons, char *s, int l) +{ + int i; + for (i = 0; i < l; i++) { + cons_putchar(cons, s[i], 1); + } + return; +} + +void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, int memtotal) +{ + if (strcmp(cmdline, "mem") == 0 && cons->sht != 0) { + cmd_mem(cons, memtotal); + } else if (strcmp(cmdline, "cls") == 0 && cons->sht != 0) { + cmd_cls(cons); + } else if ((strcmp(cmdline, "dir") == 0 || strcmp(cmdline, "ls") == 0) && cons->sht != 0) { + cmd_dir(cons); + } else if (strcmp(cmdline, "exit") == 0) { + cmd_exit(cons, fat); + } else if (strncmp(cmdline, "start ", 6) == 0) { + cmd_start(cons, cmdline, memtotal); + } else if (strncmp(cmdline, "ncst ", 5) == 0) { + cmd_ncst(cons, cmdline, memtotal); + } else if (strncmp(cmdline, "langmode ", 9) == 0) { + cmd_langmode(cons, cmdline); + }else if (cmdline[0] != 0) { + if (cmd_app(cons, fat, cmdline) == 0) { + /*不是命令,不是应用程序,也不是空行*/ + cons_putstr0(cons, "Bad command.\n\n"); + } + } + return; +} + +void cmd_mem(struct CONSOLE *cons, int memtotal) +{ + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + char s[60]; + sprintf(s, "total %dMB\nfree %dKB\n\n", memtotal / (1024 * 1024), memman_total(memman) / 1024); + cons_putstr0(cons, s); + return; +} + +void cmd_cls(struct CONSOLE *cons) +{ + int x, y; + struct SHEET *sheet = cons->sht; + for (y = 28; y < 28 + 128; y++) { + for (x = 8; x < 8 + 240; x++) { + sheet->buf[x + y * sheet->bxsize] = COL8_000000; + } + } + sheet_refresh(sheet, 8, 28, 8 + 240, 28 + 128); + cons->cur_y = 28; + return; +} + +void cmd_dir(struct CONSOLE *cons) +{ + struct FILEINFO *finfo = (struct FILEINFO *) (ADR_DISKIMG + 0x002600); + int i, j; + char s[30]; + for (i = 0; i < 224; i++) { + if (finfo[i].name[0] == 0x00) { + break; + } + if (finfo[i].name[0] != 0xe5) { + if ((finfo[i].type & 0x18) == 0) { + sprintf(s, "filename.ext %7d\n", finfo[i].size); + for (j = 0; j < 8; j++) { + s[j] = finfo[i].name[j]; + } + s[ 9] = finfo[i].ext[0]; + s[10] = finfo[i].ext[1]; + s[11] = finfo[i].ext[2]; + cons_putstr0(cons, s); + } + } + } + cons_newline(cons); + return; +} + +void cmd_exit(struct CONSOLE *cons, int *fat) +{ + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + struct TASK *task = task_now(); + struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4); + struct FIFO32 *fifo = (struct FIFO32 *) *((int *) 0x0fec); + if (cons->sht != 0) { + timer_cancel(cons->timer); + } + memman_free_4k(memman, (int) fat, 4 * 2880); + io_cli(); + if (cons->sht != 0) { + fifo32_put(fifo, cons->sht - shtctl->sheets0 + 768); /* 768〜1023 */ + } else { + fifo32_put(fifo, task - taskctl->tasks0 + 1024); /*1024~2023*/ + } + io_sti(); + for (;;) { + task_sleep(task); + } +} + +void cmd_start(struct CONSOLE *cons, char *cmdline, int memtotal) +{ + struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4); + struct SHEET *sht = open_console(shtctl, memtotal); + struct FIFO32 *fifo = &sht->task->fifo; + int i; + sheet_slide(sht, 32, 4); + sheet_updown(sht, shtctl->top); + /*将命令行输入的字符串逐字复制到新的命令行窗口中*/ + for (i = 6; cmdline[i] != 0; i++) { + fifo32_put(fifo, cmdline[i] + 256); + } + fifo32_put(fifo, 10 + 256); /*回车键*/ + cons_newline(cons); + return; +} + +void cmd_ncst(struct CONSOLE *cons, char *cmdline, int memtotal) +{ + struct TASK *task = open_constask(0, memtotal); + struct FIFO32 *fifo = &task->fifo; + int i; + + /*将命令行输入的字符串逐字复制到新的命令行窗口中*/ + for (i = 5; cmdline[i] != 0; i++) { + fifo32_put(fifo, cmdline[i] + 256); + } + fifo32_put(fifo, 10 + 256); /*回车键*/ + cons_newline(cons); + return; +} + +void cmd_langmode(struct CONSOLE *cons, char *cmdline) +{ + struct TASK *task = task_now(); + unsigned char mode = cmdline[9] - '0'; + if (mode <= 2) { + task->langmode = mode; + } else { + cons_putstr0(cons, "mode number error.\n"); + } + cons_newline(cons); + return; +} + +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; + struct SHTCTL *shtctl; + struct SHEET *sht; + + /*根据命令行生成文件名*/ + for (i = 0; i < 13; i++) { + if (cmdline[i] <= ' ') { + break; + } + name[i] = cmdline[i]; + } + name[i] = 0; /*暂且将文件名的后面置为0*/ + + /*寻找文件 */ + finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224); + if (finfo == 0 && name[i - 1] != '.') { + /*由于找不到文件,故在文件名后面加上“.hrb”后重新寻找*/ + name[i ] = '.'; + name[i + 1] = 'H'; + name[i + 2] = 'R'; + name[i + 3] = 'B'; + name[i + 4] = 0; + finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224); + } + + if (finfo != 0) { + /*找到文件的情况*/ + p = (char *) memman_alloc_4k(memman, finfo->size); + file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00)); + if (finfo->size >= 36 && strncmp(p + 4, "Hari", 4) == 0 && *p == 0x00) { + segsiz = *((int *) (p + 0x0000)); + esp = *((int *) (p + 0x000c)); + datsiz = *((int *) (p + 0x0010)); + dathrb = *((int *) (p + 0x0014)); + q = (char *) memman_alloc_4k(memman, segsiz); + task->ds_base = (int) q; + set_segmdesc(task->ldt + 0, finfo->size - 1, (int) p, AR_CODE32_ER + 0x60); + set_segmdesc(task->ldt + 1, segsiz - 1, (int) q, AR_DATA32_RW + 0x60); + for (i = 0; i < datsiz; i++) { + q[esp + i] = p[dathrb + i]; + } + start_app(0x1b, 0 * 8 + 4, esp, 1 * 8 + 4, &(task->tss.esp0)); + shtctl = (struct SHTCTL *) *((int *) 0x0fe4); + for (i = 0; i < MAX_SHEETS; i++) { + sht = &(shtctl->sheets0[i]); + if ((sht->flags & 0x11) == 0x11 && sht->task == task) { + /*找到被应用程序遗留的窗口*/ + sheet_free(sht); /*关闭*/ + } + } + for (i = 0; i < 8; i++) { /*将未关闭的文件关闭*/ + if (task->fhandle[i].buf != 0) { + memman_free_4k(memman, (int) task->fhandle[i].buf, task->fhandle[i].size); + task->fhandle[i].buf = 0; + } + } + timer_cancelall(&task->fifo); + memman_free_4k(memman, (int) q, segsiz); + task->langbyte1 = 0; + } else { + cons_putstr0(cons, ".hrb file format error.\n"); + } + memman_free_4k(memman, (int) p, finfo->size); + cons_newline(cons); + return 1; + } + /*没有找到文件的情况*/ + return 0; +} + +int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax) +{ + struct TASK *task = task_now(); + int ds_base = task->ds_base; + struct CONSOLE *cons = task->cons; + struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4); + struct SHEET *sht; + struct FIFO32 *sys_fifo = (struct FIFO32 *) *((int *) 0x0fec); + int *reg = &eax + 1; /* eax后面的地址*/ + /*强行改写通过PUSHAD保存的值*/ + /* reg[0] : EDI, reg[1] : ESI, reg[2] : EBP, reg[3] : ESP */ + /* reg[4] : EBX, reg[5] : EDX, reg[6] : ECX, reg[7] : EAX */ + int i; + struct FILEINFO *finfo; + struct FILEHANDLE *fh; + struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR; + + if (edx == 1) { + cons_putchar(cons, eax & 0xff, 1); + } else if (edx == 2) { + cons_putstr0(cons, (char *) ebx + ds_base); + } else if (edx == 3) { + cons_putstr1(cons, (char *) ebx + ds_base, ecx); + } else if (edx == 4) { + return &(task->tss.esp0); + } else if (edx == 5) { + sht = sheet_alloc(shtctl); + sht->task = task; + sht->flags |= 0x10; + sheet_setbuf(sht, (char *) ebx + ds_base, esi, edi, eax); + make_window8((char *) ebx + ds_base, esi, edi, (char *) ecx + ds_base, 0); + sheet_slide(sht, ((shtctl->xsize - esi) / 2) & ~3, (shtctl->ysize - edi) / 2); + sheet_updown(sht, shtctl->top); /*将窗口图层高度指定为当前鼠标所在图层的高度,鼠标移到上层*/ + reg[7] = (int) sht; + } else if (edx == 6) { + sht = (struct SHEET *) (ebx & 0xfffffffe); + putfonts8_asc(sht->buf, sht->bxsize, esi, edi, eax, (char *) ebp + ds_base); + if ((ebx & 1) == 0) { + sheet_refresh(sht, esi, edi, esi + ecx * 8, edi + 16); + } + } else if (edx == 7) { + sht = (struct SHEET *) (ebx & 0xfffffffe); + boxfill8(sht->buf, sht->bxsize, ebp, eax, ecx, esi, edi); + if ((ebx & 1) == 0) { + sheet_refresh(sht, eax, ecx, esi + 1, edi + 1); + } + } else if (edx == 8) { + memman_init((struct MEMMAN *) (ebx + ds_base)); + ecx &= 0xfffffff0; /*以16字节为单位*/ + memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx); + } else if (edx == 9) { + ecx = (ecx + 0x0f) & 0xfffffff0; /*以16字节为单位进位取整*/ + reg[7] = memman_alloc((struct MEMMAN *) (ebx + ds_base), ecx); + } else if (edx == 10) { + ecx = (ecx + 0x0f) & 0xfffffff0; /*以16字节为单位进位取整*/ + memman_free((struct MEMMAN *) (ebx + ds_base), eax, ecx); + } else if (edx == 11) { + sht = (struct SHEET *) (ebx & 0xfffffffe); + sht->buf[sht->bxsize * edi + esi] = eax; + if ((ebx & 1) == 0) { + sheet_refresh(sht, esi, edi, esi + 1, edi + 1); + } + } else if (edx == 12) { + sht = (struct SHEET *) ebx; + sheet_refresh(sht, eax, ecx, esi, edi); + } else if (edx == 13) { + sht = (struct SHEET *) (ebx & 0xfffffffe); + hrb_api_linewin(sht, eax, ecx, esi, edi, ebp); + if ((ebx & 1) == 0) { + sheet_refresh(sht, eax, ecx, esi + 1, edi + 1); + } + } else if (edx == 14) { + sheet_free((struct SHEET *) ebx); + } else if (edx == 15) { + for (;;) { + io_cli(); + if (fifo32_status(&task->fifo) == 0) { + if (eax != 0) { + task_sleep(task); /* FIFO为空,休眠并等待*/ + } else { + io_sti(); + reg[7] = -1; + return 0; + } + } + i = fifo32_get(&task->fifo); + io_sti(); + if (i <= 1) { /*光标用定时器*/ + /*应用程序运行时不需要显示光标,因此总是将下次显示用的值置为1*/ + timer_init(cons->timer, &task->fifo, 1); /*下次置为1*/ + timer_settime(cons->timer, 50); + } + if (i == 2) { /*光标ON */ + cons->cur_c = COL8_FFFFFF; + } + if (i == 3) { /*光标OFF */ + cons->cur_c = -1; + } + if (i == 4) { /*只关闭命令行窗口*/ + timer_cancel(cons->timer); + io_cli(); + fifo32_put(sys_fifo, cons->sht - shtctl->sheets0 + 2024); /*2024~2279*/ + cons->sht = 0; + io_sti(); + } + if (i >= 256) { /*键盘数据(通过任务A)等*/ + reg[7] = i - 256; + return 0; + } + } + } else if (edx == 16) { + reg[7] = (int) timer_alloc(); + ((struct TIMER *) reg[7])->flags2 = 1; /*允许自动取消*/ + } else if (edx == 17) { + timer_init((struct TIMER *) ebx, &task->fifo, eax + 256); + } else if (edx == 18) { + timer_settime((struct TIMER *) ebx, eax); + } else if (edx == 19) { + timer_free((struct TIMER *) ebx); + } else if (edx == 20) { + if (eax == 0) { + i = io_in8(0x61); + io_out8(0x61, i & 0x0d); + } else { + i = 1193180000 / eax; + io_out8(0x43, 0xb6); + io_out8(0x42, i & 0xff); + io_out8(0x42, i >> 8); + i = io_in8(0x61); + io_out8(0x61, (i | 0x03) & 0x0f); + } + } else if (edx == 21) { + for (i = 0; i < 8; i++) { + if (task->fhandle[i].buf == 0) { + break; + } + } + fh = &task->fhandle[i]; + reg[7] = 0; + if (i < 8) { + 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_loadfile(finfo->clustno, finfo->size, fh->buf, task->fat, (char *) (ADR_DISKIMG + 0x003e00)); + } + } + } else if (edx == 22) { + fh = (struct FILEHANDLE *) eax; + memman_free_4k(memman, (int) fh->buf, fh->size); + fh->buf = 0; + } else if (edx == 23) { + fh = (struct FILEHANDLE *) eax; + if (ecx == 0) { + fh->pos = ebx; + } else if (ecx == 1) { + fh->pos += ebx; + } else if (ecx == 2) { + fh->pos = fh->size + ebx; + } + if (fh->pos < 0) { + fh->pos = 0; + } + if (fh->pos > fh->size) { + fh->pos = fh->size; + } + } else if (edx == 24) { + fh = (struct FILEHANDLE *) eax; + if (ecx == 0) { + reg[7] = fh->size; + } else if (ecx == 1) { + reg[7] = fh->pos; + } else if (ecx == 2) { + reg[7] = fh->pos - fh->size; + } + } else if (edx == 25) { + fh = (struct FILEHANDLE *) eax; + for (i = 0; i < ecx; i++) { + if (fh->pos == fh->size) { + break; + } + *((char *) ebx + ds_base + i) = fh->buf[fh->pos]; + fh->pos++; + } + reg[7] = i; + } else if (edx == 26) { + i = 0; + for (;;) { + *((char *) ebx + ds_base + i) = task->cmdline[i]; + if (task->cmdline[i] == 0) { + break; + } + if (i >= ecx) { + break; + } + i++; + } + reg[7] = i; + } else if (edx == 27) { + reg[7] = task->langmode; + } + return 0; +} + +int *inthandler0c(int *esp) +{ + struct TASK *task = task_now(); + struct CONSOLE *cons = task->cons; + char s[30]; + cons_putstr0(cons, "\nINT 0C :\n Stack Exception.\n"); + sprintf(s, "EIP = %08X\n", esp[11]); + cons_putstr0(cons, s); + return &(task->tss.esp0); /*强制结束程序*/ +} + +int *inthandler0d(int *esp) +{ + struct TASK *task = task_now(); + struct CONSOLE *cons = task->cons; + char s[30]; + cons_putstr0(cons, "\nINT 0D :\n General Protected Exception.\n"); + sprintf(s, "EIP = %08X\n", esp[11]); + cons_putstr0(cons, s); + return &(task->tss.esp0); /*强制结束程序*/ +} + +void hrb_api_linewin(struct SHEET *sht, int x0, int y0, int x1, int y1, int col) +{ + int i, x, y, len, dx, dy; + + dx = x1 - x0; + dy = y1 - y0; + x = x0 << 10; + y = y0 << 10; + if (dx < 0) { + dx = - dx; + } + if (dy < 0) { + dy = - dy; + } + if (dx >= dy) { + len = dx + 1; + if (x0 > x1) { + dx = -1024; + } else { + dx = 1024; + } + if (y0 <= y1) { + dy = ((y1 - y0 + 1) << 10) / len; + } else { + dy = ((y1 - y0 - 1) << 10) / len; + } + } else { + len = dy + 1; + if (y0 > y1) { + dy = -1024; + } else { + dy = 1024; + } + if (x0 <= x1) { + dx = ((x1 - x0 + 1) << 10) / len; + } else { + dx = ((x1 - x0 - 1) << 10) / len; + } + } + + for (i = 0; i < len; i++) { + sht->buf[(y >> 10) * sht->bxsize + (x >> 10)] = col; + x += dx; + y += dy; + } + + return; +} diff --git a/29_day/haribote/dsctbl.c b/29_day/haribote/dsctbl.c new file mode 100644 index 0000000..9ff2c67 --- /dev/null +++ b/29_day/haribote/dsctbl.c @@ -0,0 +1,59 @@ +/* GDT、IDT、descriptor table 关系处理 */ + +#include "bootpack.h" + +void init_gdtidt(void) +{ + struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT; + struct GATE_DESCRIPTOR *idt = (struct GATE_DESCRIPTOR *) ADR_IDT; + int i; + + /* GDT初始化 */ + for (i = 0; i <= LIMIT_GDT / 8; i++) { + set_segmdesc(gdt + i, 0, 0, 0); + } + set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, AR_DATA32_RW); + set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER); + load_gdtr(LIMIT_GDT, ADR_GDT); + + /* IDT初始化 */ + for (i = 0; i <= LIMIT_IDT / 8; i++) { + set_gatedesc(idt + i, 0, 0, 0); + } + load_idtr(LIMIT_IDT, ADR_IDT); + + /* IDT设置*/ + set_gatedesc(idt + 0x0c, (int) asm_inthandler0c, 2 * 8, AR_INTGATE32); + set_gatedesc(idt + 0x0d, (int) asm_inthandler0d, 2 * 8, AR_INTGATE32); + set_gatedesc(idt + 0x20, (int) asm_inthandler20, 2 * 8, AR_INTGATE32); + set_gatedesc(idt + 0x21, (int) asm_inthandler21, 2 * 8, AR_INTGATE32); + set_gatedesc(idt + 0x2c, (int) asm_inthandler2c, 2 * 8, AR_INTGATE32); + set_gatedesc(idt + 0x40, (int) asm_hrb_api, 2 * 8, AR_INTGATE32 + 0x60); + + return; +} + +void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar) +{ + if (limit > 0xfffff) { + ar |= 0x8000; /* G_bit = 1 */ + limit /= 0x1000; + } + sd->limit_low = limit & 0xffff; + sd->base_low = base & 0xffff; + sd->base_mid = (base >> 16) & 0xff; + sd->access_right = ar & 0xff; + sd->limit_high = ((limit >> 16) & 0x0f) | ((ar >> 8) & 0xf0); + sd->base_high = (base >> 24) & 0xff; + return; +} + +void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar) +{ + gd->offset_low = offset & 0xffff; + gd->selector = selector; + gd->dw_count = (ar >> 8) & 0xff; + gd->access_right = ar & 0xff; + gd->offset_high = (offset >> 16) & 0xffff; + return; +} diff --git a/29_day/haribote/fifo.c b/29_day/haribote/fifo.c new file mode 100644 index 0000000..8f28f4b --- /dev/null +++ b/29_day/haribote/fifo.c @@ -0,0 +1,63 @@ +/* FIFO */ + +#include "bootpack.h" + +#define FLAGS_OVERRUN 0x0001 + +void fifo32_init(struct FIFO32 *fifo, int size, int *buf, struct TASK *task) +/* FIFO缓冲区的初始化*/ +{ + fifo->size = size; + fifo->buf = buf; + fifo->free = size; /*空*/ + fifo->flags = 0; + fifo->p = 0; /*写入位置*/ + fifo->q = 0; /*读取位置*/ + fifo->task = task; /*有数据写入时需要唤醒的任务*/ + return; +} + +int fifo32_put(struct FIFO32 *fifo, int data) +/*向FIFO写入数据并累积起来*/ +{ + if (fifo->free == 0) { + /*没有空余空间,溢出*/ + fifo->flags |= FLAGS_OVERRUN; + return -1; + } + fifo->buf[fifo->p] = data; + fifo->p++; + if (fifo->p == fifo->size) { + fifo->p = 0; + } + fifo->free--; + if (fifo->task != 0) { + if (fifo->task->flags != 2) { /*如果任务处于休眠状态*/ + task_run(fifo->task, -1, 0); /*将任务唤醒*/ + } + } + return 0; +} + +int fifo32_get(struct FIFO32 *fifo) +/*从FIFO取得一个数据*/ +{ + int data; + if (fifo->free == fifo->size) { + /*当缓冲区为空的情况下返回-1*/ + return -1; + } + data = fifo->buf[fifo->q]; + fifo->q++; + if (fifo->q == fifo->size) { + fifo->q = 0; + } + fifo->free++; + return data; +} + +int fifo32_status(struct FIFO32 *fifo) +/*报告已经存储了多少数据*/ +{ + return fifo->size - fifo->free; +} diff --git a/29_day/haribote/file.c b/29_day/haribote/file.c new file mode 100644 index 0000000..bf9d063 --- /dev/null +++ b/29_day/haribote/file.c @@ -0,0 +1,74 @@ +/* 文件相关函数 */ + +#include "bootpack.h" + +void file_readfat(int *fat, unsigned char *img) +/*将磁盘映像中的FAT解压缩 */ +{ + int i, j = 0; + for (i = 0; i < 2880; i += 2) { + fat[i + 0] = (img[j + 0] | img[j + 1] << 8) & 0xfff; + fat[i + 1] = (img[j + 1] >> 4 | img[j + 2] << 4) & 0xfff; + j += 3; + } + return; +} + +void file_loadfile(int clustno, int size, char *buf, int *fat, char *img) +{ + int i; + for (;;) { + if (size <= 512) { + for (i = 0; i < size; i++) { + buf[i] = img[clustno * 512 + i]; + } + break; + } + for (i = 0; i < 512; i++) { + buf[i] = img[clustno * 512 + i]; + } + size -= 512; + buf += 512; + clustno = fat[clustno]; + } + return; +} + +struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max) +{ + int i, j; + char s[12]; + for (j = 0; j < 11; j++) { + s[j] = ' '; + } + j = 0; + for (i = 0; name[i] != 0; i++) { + if (j >= 11) { return 0; /*没有找到*/ } + if (name[i] == '.' && j <= 8) { + j = 8; + } else { + s[j] = name[i]; + if ('a' <= s[j] && s[j] <= 'z') { + /*将小写字母转换为大写字母*/ + s[j] -= 0x20; + } + j++; + } + } + for (i = 0; i < max; ) { + if (finfo->name[0] == 0x00) { + break; + } + if ((finfo[i].type & 0x18) == 0) { + for (j = 0; j < 11; j++) { + if (finfo[i].name[j] != s[j]) { + goto next; + } + } + return finfo + i; /*找到文件*/ + } +next: + i++; + } + return 0; /*没有找到*/ +} diff --git a/29_day/haribote/graphic.c b/29_day/haribote/graphic.c new file mode 100644 index 0000000..3ac5000 --- /dev/null +++ b/29_day/haribote/graphic.c @@ -0,0 +1,221 @@ +/* 关于绘图部分的处理 */ + +#include "bootpack.h" + +void init_palette(void) +{ + static unsigned char table_rgb[16 * 3] = { + 0x00, 0x00, 0x00, /* 0:黑 */ + 0xff, 0x00, 0x00, /* 1:梁红 */ + 0x00, 0xff, 0x00, /* 2:亮绿 */ + 0xff, 0xff, 0x00, /* 3:亮黄 */ + 0x00, 0x00, 0xff, /* 4:亮蓝 */ + 0xff, 0x00, 0xff, /* 5:亮紫 */ + 0x00, 0xff, 0xff, /* 6:浅亮蓝 */ + 0xff, 0xff, 0xff, /* 7:白 */ + 0xc6, 0xc6, 0xc6, /* 8:亮灰 */ + 0x84, 0x00, 0x00, /* 9:暗红 */ + 0x00, 0x84, 0x00, /* 10:暗绿 */ + 0x84, 0x84, 0x00, /* 11:暗黄 */ + 0x00, 0x00, 0x84, /* 12:暗青 */ + 0x84, 0x00, 0x84, /* 13:暗紫 */ + 0x00, 0x84, 0x84, /* 14:浅暗蓝 */ + 0x84, 0x84, 0x84 /* 15:暗灰 */ + }; + unsigned char table2[216 * 3]; + int r, g, b; + set_palette(0, 15, table_rgb); + for (b = 0; b < 6; b++) { + for (g = 0; g < 6; g++) { + for (r = 0; r < 6; r++) { + table2[(r + g * 6 + b * 36) * 3 + 0] = r * 51; + table2[(r + g * 6 + b * 36) * 3 + 1] = g * 51; + table2[(r + g * 6 + b * 36) * 3 + 2] = b * 51; + } + } + } + set_palette(16, 231, table2); + return; +} + +void set_palette(int start, int end, unsigned char *rgb) +{ + int i, eflags; + eflags = io_load_eflags(); /* 记录中断许可标志的值 */ + io_cli(); /* 将中断许可标志置为0,禁止中断 */ + io_out8(0x03c8, start); + for (i = start; i <= end; i++) { + io_out8(0x03c9, rgb[0] / 4); + io_out8(0x03c9, rgb[1] / 4); + io_out8(0x03c9, rgb[2] / 4); + rgb += 3; + } + io_store_eflags(eflags); /* 复原中断许可标志 */ + return; +} + +void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1) +{ + int x, y; + for (y = y0; y <= y1; y++) { + for (x = x0; x <= x1; x++) + vram[y * xsize + x] = c; + } + return; +} + +void init_screen8(char *vram, int x, int y) +{ + boxfill8(vram, x, COL8_008484, 0, 0, x - 1, y - 29); + boxfill8(vram, x, COL8_C6C6C6, 0, y - 28, x - 1, y - 28); + boxfill8(vram, x, COL8_FFFFFF, 0, y - 27, x - 1, y - 27); + boxfill8(vram, x, COL8_C6C6C6, 0, y - 26, x - 1, y - 1); + + boxfill8(vram, x, COL8_FFFFFF, 3, y - 24, 59, y - 24); + boxfill8(vram, x, COL8_FFFFFF, 2, y - 24, 2, y - 4); + boxfill8(vram, x, COL8_848484, 3, y - 4, 59, y - 4); + boxfill8(vram, x, COL8_848484, 59, y - 23, 59, y - 5); + boxfill8(vram, x, COL8_000000, 2, y - 3, 59, y - 3); + boxfill8(vram, x, COL8_000000, 60, y - 24, 60, y - 3); + + boxfill8(vram, x, COL8_848484, x - 47, y - 24, x - 4, y - 24); + boxfill8(vram, x, COL8_848484, x - 47, y - 23, x - 47, y - 4); + boxfill8(vram, x, COL8_FFFFFF, x - 47, y - 3, x - 4, y - 3); + boxfill8(vram, x, COL8_FFFFFF, x - 3, y - 24, x - 3, y - 3); + return; +} + +void putfont8(char *vram, int xsize, int x, int y, char c, char *font) +{ + int i; + char *p, d /* data */; + for (i = 0; i < 16; i++) { + p = vram + (y + i) * xsize + x; + d = font[i]; + if ((d & 0x80) != 0) { p[0] = c; } + if ((d & 0x40) != 0) { p[1] = c; } + if ((d & 0x20) != 0) { p[2] = c; } + if ((d & 0x10) != 0) { p[3] = c; } + if ((d & 0x08) != 0) { p[4] = c; } + if ((d & 0x04) != 0) { p[5] = c; } + if ((d & 0x02) != 0) { p[6] = c; } + if ((d & 0x01) != 0) { p[7] = c; } + } + return; +} + +void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s) +{ + extern char hankaku[4096]; + struct TASK *task = task_now(); + char *nihongo = (char *) *((int *) 0x0fe8), *font; + int k, t; + + if (task->langmode == 0) { + for (; *s != 0x00; s++) { + putfont8(vram, xsize, x, y, c, hankaku + *s * 16); + x += 8; + } + } + if (task->langmode == 1) { + for (; *s != 0x00; s++) { + if (task->langbyte1 == 0) { + if ((0x81 <= *s && *s <= 0x9f) || (0xe0 <= *s && *s <= 0xfc)) { + task->langbyte1 = *s; + } else { + putfont8(vram, xsize, x, y, c, nihongo + *s * 16); + } + } else { + if (0x81 <= task->langbyte1 && task->langbyte1 <= 0x9f) { + k = (task->langbyte1 - 0x81) * 2; + } else { + k = (task->langbyte1 - 0xe0) * 2 + 62; + } + if (0x40 <= *s && *s <= 0x7e) { + t = *s - 0x40; + } else if (0x80 <= *s && *s <= 0x9e) { + t = *s - 0x80 + 63; + } else { + t = *s - 0x9f; + k++; + } + task->langbyte1 = 0; + font = nihongo + 256 * 16 + (k * 94 + t) * 32; + putfont8(vram, xsize, x - 8, y, c, font ); /* 左半部分 */ + putfont8(vram, xsize, x , y, c, font + 16); /* 右半部分 */ + } + x += 8; + } + } + if (task->langmode == 2) { + for (; *s != 0x00; s++) { + if (task->langbyte1 == 0) { + if (0x81 <= *s && *s <= 0xfe) { + task->langbyte1 = *s; + } else { + putfont8(vram, xsize, x, y, c, nihongo + *s * 16); + } + } else { + k = task->langbyte1 - 0xa1; + t = *s - 0xa1; + task->langbyte1 = 0; + font = nihongo + 256 * 16 + (k * 94 + t) * 32; + putfont8(vram, xsize, x - 8, y, c, font ); /* 左半部分 */ + putfont8(vram, xsize, x , y, c, font + 16); /* 右半部分 */ + } + x += 8; + } + } + return; +} + +void init_mouse_cursor8(char *mouse, char bc) +/* 鼠标的数据准备(16x16) */ +{ + static char cursor[16][16] = { + "**************..", + "*OOOOOOOOOOO*...", + "*OOOOOOOOOO*....", + "*OOOOOOOOO*.....", + "*OOOOOOOO*......", + "*OOOOOOO*.......", + "*OOOOOOO*.......", + "*OOOOOOOO*......", + "*OOOO**OOO*.....", + "*OOO*..*OOO*....", + "*OO*....*OOO*...", + "*O*......*OOO*..", + "**........*OOO*.", + "*..........*OOO*", + "............*OO*", + ".............***" + }; + int x, y; + + for (y = 0; y < 16; y++) { + for (x = 0; x < 16; x++) { + if (cursor[y][x] == '*') { + mouse[y * 16 + x] = COL8_000000; + } + if (cursor[y][x] == 'O') { + mouse[y * 16 + x] = COL8_FFFFFF; + } + if (cursor[y][x] == '.') { + mouse[y * 16 + x] = bc; + } + } + } + return; +} + +void putblock8_8(char *vram, int vxsize, int pxsize, + int pysize, int px0, int py0, char *buf, int bxsize) +{ + int x, y; + for (y = 0; y < pysize; y++) { + for (x = 0; x < pxsize; x++) { + vram[(py0 + y) * vxsize + (px0 + x)] = buf[y * bxsize + x]; + } + } + return; +} diff --git a/29_day/haribote/hankaku.txt b/29_day/haribote/hankaku.txt new file mode 100644 index 0000000..62d56f9 --- /dev/null +++ b/29_day/haribote/hankaku.txt @@ -0,0 +1,4609 @@ +OSASK̔ptHg𗬗p + +char 0x00 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0x01 +........ +........ +..***... +.*...*.. +*.....*. +*.*.*.*. +*.*.*.*. +*.....*. +*.....*. +*.*.*.*. +*..*..*. +.*...*.. +..***... +........ +........ +........ + +char 0x02 +........ +........ +..***... +.*****.. +*******. +**.*.**. +**.*.**. +*******. +*******. +**.*.**. +***.***. +.*****.. +..***... +........ +........ +........ + +char 0x03 +........ +........ +........ +........ +.**.**.. +*******. +*******. +*******. +.*****.. +..***... +...*.... +........ +........ +........ +........ +........ + +char 0x04 +........ +........ +........ +........ +...*.... +..***... +.*****.. +*******. +.*****.. +..***... +...*.... +........ +........ +........ +........ +........ + +char 0x05 +........ +........ +........ +........ +...*.... +..***... +.*.*.*.. +*******. +.*.*.*.. +...*.... +..***... +........ +........ +........ +........ +........ + +char 0x06 +........ +........ +........ +........ +...*.... +..***... +.*****.. +*******. +**.*.**. +...*.... +..***... +........ +........ +........ +........ +........ + +char 0x07 +........ +........ +........ +........ +........ +........ +...**... +..****.. +..****.. +...**... +........ +........ +........ +........ +........ +........ + +char 0x08 +******** +******** +******** +******** +******** +******** +***..*** +**....** +**....** +***..*** +******** +******** +******** +******** +******** +******** + +char 0x09 +........ +........ +........ +........ +........ +..****.. +.**..**. +.*....*. +.*....*. +.**..**. +..****.. +........ +........ +........ +........ +........ + +char 0x0a +******** +******** +******** +******** +******** +**....** +*..**..* +*.****.* +*.****.* +*..**..* +**....** +******** +******** +******** +******** +******** + +char 0x0b +........ +...*.... +..***... +.*.*.*.. +*..*..*. +...*.... +...*.... +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x0c +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +...*.... +...*.... +*******. +...*.... +...*.... +...*.... +........ +........ + +char 0x0d +........ +........ +....**.. +....***. +....*.** +....*.** +....*.*. +....*... +....*... +...**... +.****... +*****... +.***.... +........ +........ +........ + +char 0x0e +........ +........ +...***** +...***** +...*...* +...*...* +...*...* +...*...* +...*...* +...*...* +.***.*** +******** +.**..**. +........ +........ +........ + +char 0x0f +........ +........ +........ +........ +...*.... +.*.*.*.. +..***... +..*.*... +..***... +.*.*.*.. +...*.... +........ +........ +........ +........ +........ + +char 0x10 +........ +*....... +**...... +***..... +****.... +*****... +******.. +*******. +******.. +*****... +****.... +***..... +**...... +*....... +........ +........ + +char 0x11 +........ +......*. +.....**. +....***. +...****. +..*****. +.******. +*******. +.******. +..*****. +...****. +....***. +.....**. +......*. +........ +........ + +char 0x12 +........ +........ +...*.... +..***... +.*.*.*.. +*..*..*. +...*.... +...*.... +...*.... +*..*..*. +.*.*.*.. +..***... +...*.... +........ +........ +........ + +char 0x13 +........ +........ +.*...*.. +.*...*.. +.*...*.. +.*...*.. +.*...*.. +.*...*.. +.*...*.. +.*...*.. +........ +........ +.*...*.. +.*...*.. +........ +........ + +char 0x14 +........ +..*****. +.*..*.*. +*...*.*. +*...*.*. +*...*.*. +*...*.*. +.*..*.*. +..***.*. +....*.*. +....*.*. +....*.*. +....*.*. +....*.*. +........ +........ + +char 0x15 +.*****.. +*.....*. +.*...... +..*..... +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +....*... +.....*.. +*.....*. +.*****.. +........ + +char 0x16 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +*******. +*******. +*******. +........ +........ + +char 0x17 +........ +........ +...*.... +..***... +.*.*.*.. +*..*..*. +...*.... +...*.... +...*.... +*..*..*. +.*.*.*.. +..***... +...*.... +.*****.. +........ +........ + +char 0x18 +........ +...*.... +..***... +.*.*.*.. +*..*..*. +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +........ +........ + +char 0x19 +........ +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +*..*..*. +.*.*.*.. +..***... +...*.... +........ +........ + +char 0x1a +........ +........ +........ +........ +...*.... +....*... +.....*.. +*******. +.....*.. +....*... +...*.... +........ +........ +........ +........ +........ + +char 0x1b +........ +........ +........ +........ +...*.... +..*..... +.*...... +*******. +.*...... +..*..... +...*.... +........ +........ +........ +........ +........ + +char 0x1c +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +*....... +*....... +*******. +........ +........ + +char 0x1d +........ +........ +........ +........ +........ +..*.*... +.*...*.. +*******. +.*...*.. +..*.*... +........ +........ +........ +........ +........ +........ + +char 0x1e +........ +........ +........ +........ +...*.... +...*.... +..***... +..***... +.*****.. +.*****.. +*******. +*******. +........ +........ +........ +........ + +char 0x1f +........ +........ +........ +........ +*******. +*******. +.*****.. +.*****.. +..***... +..***... +...*.... +...*.... +........ +........ +........ +........ + +char 0x20 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0x21 +........ +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +........ +........ +...*.... +...*.... +........ +........ + +char 0x22 +..*.*... +..*.*... +..*.*... +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0x23 +........ +.*...*.. +.*...*.. +.*...*.. +*******. +.*...*.. +.*...*.. +.*...*.. +.*...*.. +.*...*.. +*******. +.*...*.. +.*...*.. +.*...*.. +........ +........ + +char 0x24 +...*.... +..***.*. +.*.*.**. +*..*..*. +*..*..*. +*..*.... +.*.*.... +..***... +...*.*.. +...*..*. +*..*..*. +*..*..*. +**.*.*.. +*.***... +...*.... +...*.... + +char 0x25 +.**...*. +*..*..*. +*..*.*.. +*..*.*.. +.**.*... +....*... +...*.... +...*.... +..*..... +..*.**.. +.*.*..*. +.*.*..*. +*..*..*. +*...**.. +........ +........ + +char 0x26 +........ +.***.... +*...*... +*...*... +*...*... +*..*.... +.**..... +.*...*** +*.*...*. +*..*..*. +*...*.*. +*....*.. +.*...**. +..***..* +........ +........ + +char 0x27 +.....*.. +....*... +...*.... +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0x28 +......*. +.....*.. +....*... +....*... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +....*... +....*... +.....*.. +......*. +........ + +char 0x29 +*....... +.*...... +..*..... +..*..... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +..*..... +..*..... +.*...... +*....... +........ + +char 0x2a +........ +........ +........ +........ +........ +...*.... +*..*..*. +.*.*.*.. +..***... +.*.*.*.. +*..*..*. +...*.... +........ +........ +........ +........ + +char 0x2b +........ +........ +........ +........ +........ +...*.... +...*.... +...*.... +*******. +...*.... +...*.... +...*.... +........ +........ +........ +........ + +char 0x2c +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +...**... +...**... +....*... +....*... +...*.... + +char 0x2d +........ +........ +........ +........ +........ +........ +........ +........ +*******. +........ +........ +........ +........ +........ +........ +........ + +char 0x2e +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +...**... +...**... +........ +........ + +char 0x2f +......*. +......*. +.....*.. +.....*.. +....*... +....*... +....*... +...*.... +...*.... +..*..... +..*..... +.*...... +.*...... +.*...... +*....... +*....... + +char 0x30 +........ +...**... +..*..*.. +..*..*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +..*..*.. +..*..*.. +...**... +........ +........ + +char 0x31 +........ +....*... +...**... +..*.*... +....*... +....*... +....*... +....*... +....*... +....*... +....*... +....*... +....*... +..*****. +........ +........ + +char 0x32 +........ +...**... +..*..*.. +.*....*. +.*....*. +......*. +.....*.. +....*... +...*.... +..*..... +..*..... +.*...... +.*...... +.******. +........ +........ + +char 0x33 +........ +...**... +..*..*.. +.*....*. +......*. +......*. +.....*.. +...**... +.....*.. +......*. +......*. +.*....*. +..*..*.. +...**... +........ +........ + +char 0x34 +........ +....**.. +....**.. +....**.. +...*.*.. +...*.*.. +...*.*.. +..*..*.. +..*..*.. +.*...*.. +.******. +.....*.. +.....*.. +...****. +........ +........ + +char 0x35 +........ +.*****.. +.*...... +.*...... +.*...... +.*.**... +.**..*.. +......*. +......*. +......*. +......*. +.*....*. +..*..*.. +...**... +........ +........ + +char 0x36 +........ +...**... +..*..*.. +.*....*. +.*...... +.*.**... +.**..*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +..*..*.. +...**... +........ +........ + +char 0x37 +........ +.******. +.*....*. +.*....*. +.....*.. +.....*.. +....*... +....*... +....*... +...*.... +...*.... +...*.... +...*.... +..***... +........ +........ + +char 0x38 +........ +...**... +..*..*.. +.*....*. +.*....*. +.*....*. +..*..*.. +...**... +..*..*.. +.*....*. +.*....*. +.*....*. +..*..*.. +...**... +........ +........ + +char 0x39 +........ +...**... +..*..*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +..*..**. +...**.*. +......*. +.*....*. +..*..*.. +...**... +........ +........ + +char 0x3a +........ +........ +........ +........ +........ +...**... +...**... +........ +........ +........ +........ +........ +...**... +...**... +........ +........ + +char 0x3b +........ +........ +........ +........ +........ +...**... +...**... +........ +........ +........ +........ +...**... +...**... +....*... +....*... +...*.... + +char 0x3c +........ +......*. +.....*.. +....*... +...*.... +..*..... +.*...... +*....... +*....... +.*...... +..*..... +...*.... +....*... +.....*.. +......*. +........ + +char 0x3d +........ +........ +........ +........ +........ +........ +*******. +........ +........ +*******. +........ +........ +........ +........ +........ +........ + +char 0x3e +........ +*....... +.*...... +..*..... +...*.... +....*... +.....*.. +......*. +......*. +.....*.. +....*... +...*.... +..*..... +.*...... +*....... +........ + +char 0x3f +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +.....*.. +....*... +...*.... +...*.... +........ +........ +...**... +...**... +........ +........ + +char 0x40 +........ +..***... +.*...*.. +*.....*. +*..**.*. +*.*.*.*. +*.*.*.*. +*.*.*.*. +*.*.*.*. +*.*.*.*. +*..***.. +*....... +.*...**. +..***... +........ +........ + +char 0x41 +........ +...**... +...**... +...**... +...**... +..*..*.. +..*..*.. +..*..*.. +..*..*.. +.******. +.*....*. +.*....*. +.*....*. +***..*** +........ +........ + +char 0x42 +........ +****.... +.*..*... +.*...*.. +.*...*.. +.*...*.. +.*..*... +.****... +.*...*.. +.*....*. +.*....*. +.*....*. +.*...*.. +*****... +........ +........ + +char 0x43 +........ +..***.*. +.*...**. +.*....*. +*.....*. +*....... +*....... +*....... +*....... +*....... +*.....*. +.*....*. +.*...*.. +..***... +........ +........ + +char 0x44 +........ +*****... +.*...*.. +.*...*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*...*.. +.*...*.. +*****... +........ +........ + +char 0x45 +........ +*******. +.*....*. +.*....*. +.*...... +.*...... +.*...*.. +.*****.. +.*...*.. +.*...... +.*...... +.*....*. +.*....*. +*******. +........ +........ + +char 0x46 +........ +*******. +.*....*. +.*....*. +.*...... +.*...... +.*...*.. +.*****.. +.*...*.. +.*...*.. +.*...... +.*...... +.*...... +****.... +........ +........ + +char 0x47 +........ +..***.*. +.*...**. +.*....*. +*.....*. +*....... +*....... +*..****. +*.....*. +*.....*. +*.....*. +.*....*. +.*...**. +..***... +........ +........ + +char 0x48 +........ +***..*** +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.******. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +***..*** +........ +........ + +char 0x49 +........ +.*****.. +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +.*****.. +........ +........ + +char 0x4a +........ +...***** +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +*....*.. +.*..*... +..**.... +........ + +char 0x4b +........ +***..*** +.*....*. +.*...*.. +.*..*... +.*.*.... +.*.*.... +.**..... +.*.*.... +.*.*.... +.*..*... +.*...*.. +.*....*. +***..*** +........ +........ + +char 0x4c +........ +****.... +.*...... +.*...... +.*...... +.*...... +.*...... +.*...... +.*...... +.*...... +.*...... +.*....*. +.*....*. +*******. +........ +........ + +char 0x4d +........ +**....** +.*....*. +.**..**. +.**..**. +.**..**. +.*.**.*. +.*.**.*. +.*.**.*. +.*....*. +.*....*. +.*....*. +.*....*. +***..*** +........ +........ + +char 0x4e +........ +**...*** +.*....*. +.**...*. +.**...*. +.*.*..*. +.*.*..*. +.*.*..*. +.*..*.*. +.*..*.*. +.*..*.*. +.*...**. +.*...**. +***...*. +........ +........ + +char 0x4f +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x50 +........ +*****... +.*...*.. +.*....*. +.*....*. +.*....*. +.*...*.. +.****... +.*...... +.*...... +.*...... +.*...... +.*...... +****.... +........ +........ + +char 0x51 +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*..*..*. +*...*.*. +.*...*.. +..***.*. +........ +........ + +char 0x52 +........ +******.. +.*....*. +.*....*. +.*....*. +.*....*. +.*****.. +.*...*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +***..*** +........ +........ + +char 0x53 +........ +..***.*. +.*...**. +*.....*. +*.....*. +*....... +.*...... +..***... +.....*.. +......*. +*.....*. +*.....*. +**...*.. +*.***... +........ +........ + +char 0x54 +........ +*******. +*..*..*. +*..*..*. +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +.*****.. +........ +........ + +char 0x55 +........ +***..*** +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +..*..*.. +..****.. +........ +........ + +char 0x56 +........ +***..*** +.*....*. +.*....*. +.*....*. +.*....*. +..*..*.. +..*..*.. +..*..*.. +..*..*.. +...**... +...**... +...**... +...**... +........ +........ + +char 0x57 +........ +***..*** +.*....*. +.*....*. +.*....*. +.*.**.*. +.*.**.*. +.*.**.*. +.*.**.*. +..*..*.. +..*..*.. +..*..*.. +..*..*.. +..*..*.. +........ +........ + +char 0x58 +........ +***..*** +.*....*. +.*....*. +..*..*.. +..*..*.. +..*..*.. +...**... +..*..*.. +..*..*.. +..*..*.. +.*....*. +.*....*. +***..*** +........ +........ + +char 0x59 +........ +***.***. +.*...*.. +.*...*.. +.*...*.. +..*.*... +..*.*... +..*.*... +...*.... +...*.... +...*.... +...*.... +...*.... +.*****.. +........ +........ + +char 0x5a +........ +*******. +*....*.. +*....*.. +....*... +....*... +...*.... +...*.... +..*..... +..*..... +.*...... +.*....*. +*.....*. +*******. +........ +........ + +char 0x5b +........ +..*****. +..*..... +..*..... +..*..... +..*..... +..*..... +..*..... +..*..... +..*..... +..*..... +..*..... +..*..... +..*..... +..*****. +........ + +char 0x5c +*....... +*....... +.*...... +.*...... +..*..... +..*..... +..*..... +...*.... +...*.... +....*... +....*... +.....*.. +.....*.. +.....*.. +......*. +......*. + +char 0x5d +........ +.*****.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.*****.. +........ + +char 0x5e +........ +...*.... +..*.*... +.*...*.. +*.....*. +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0x5f +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +*******. +........ + +char 0x60 +...*.... +....*... +.....*.. +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0x61 +........ +........ +........ +........ +........ +.***.... +....*... +.....*.. +..****.. +.*...*.. +*....*.. +*....*.. +*...**.. +.***.**. +........ +........ + +char 0x62 +**...... +.*...... +.*...... +.*...... +.*...... +.*.**... +.**..*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.**..*.. +.*.**... +........ +........ + +char 0x63 +........ +........ +........ +........ +........ +..**.... +.*..**.. +*....*.. +*....*.. +*....... +*....... +*.....*. +.*...*.. +..***... +........ +........ + +char 0x64 +....**.. +.....*.. +.....*.. +.....*.. +.....*.. +..**.*.. +.*..**.. +*....*.. +*....*.. +*....*.. +*....*.. +*....*.. +.*..**.. +..**.**. +........ +........ + +char 0x65 +........ +........ +........ +........ +........ +..***... +.*...*.. +*.....*. +*.....*. +******.. +*....... +*.....*. +.*....*. +..****.. +........ +........ + +char 0x66 +....***. +...*.... +...*.... +...*.... +...*.... +.*****.. +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +.*****.. +........ +........ + +char 0x67 +........ +........ +........ +........ +........ +..**.**. +.*..**.. +*....*.. +*....*.. +*....*.. +*....*.. +.*..**.. +..**.*.. +.....*.. +.....*.. +.****... + +char 0x68 +**...... +.*...... +.*...... +.*...... +.*...... +.*.**... +.**..*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +***...** +........ +........ + +char 0x69 +........ +...*.... +...*.... +........ +........ +..**.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +..***... +........ +........ + +char 0x6a +........ +.....*.. +.....*.. +........ +........ +....**.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +.....*.. +....*... +....*... +..**.... + +char 0x6b +**...... +.*...... +.*...... +.*...... +.*...... +.*..***. +.*...*.. +.*..*... +.*.*.... +.**..... +.*.*.... +.*..*... +.*...*.. +***..**. +........ +........ + +char 0x6c +..**.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +..***... +........ +........ + +char 0x6d +........ +........ +........ +........ +........ +****.**. +.*..*..* +.*..*..* +.*..*..* +.*..*..* +.*..*..* +.*..*..* +.*..*..* +**.**.** +........ +........ + +char 0x6e +........ +........ +........ +........ +........ +**.**... +.**..*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +***...** +........ +........ + +char 0x6f +........ +........ +........ +........ +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x70 +........ +........ +........ +........ +........ +**.**... +.**..*.. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.**..*.. +.*.**... +.*...... +***..... + +char 0x71 +........ +........ +........ +........ +........ +..**.*.. +.*..**.. +*....*.. +*....*.. +*....*.. +*....*.. +*....*.. +.*..**.. +..**.*.. +.....*.. +....***. + +char 0x72 +........ +........ +........ +........ +........ +**.***.. +.**...*. +.*....*. +.*...... +.*...... +.*...... +.*...... +.*...... +***..... +........ +........ + +char 0x73 +........ +........ +........ +........ +........ +.****.*. +*....**. +*.....*. +**...... +..***... +.....**. +*.....*. +**....*. +*.****.. +........ +........ + +char 0x74 +........ +........ +...*.... +...*.... +...*.... +.*****.. +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +....***. +........ +........ + +char 0x75 +........ +........ +........ +........ +........ +**...**. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*....*. +.*...**. +..***.** +........ +........ + +char 0x76 +........ +........ +........ +........ +........ +***..*** +.*....*. +.*....*. +.*....*. +..*..*.. +..*..*.. +..*..*.. +...**... +...**... +........ +........ + +char 0x77 +........ +........ +........ +........ +........ +***..*** +.*....*. +.*....*. +.*.**.*. +.*.**.*. +.*.**.*. +..*..*.. +..*..*.. +..*..*.. +........ +........ + +char 0x78 +........ +........ +........ +........ +........ +**...**. +.*...*.. +..*.*... +..*.*... +...*.... +..*.*... +..*.*... +.*...*.. +**...**. +........ +........ + +char 0x79 +........ +........ +........ +........ +........ +***..*** +.*....*. +.*....*. +..*..*.. +..*..*.. +..*..*.. +...**... +...**... +...*.... +...*.... +.**..... + +char 0x7a +........ +........ +........ +........ +........ +*******. +*.....*. +*....*.. +....*... +...*.... +..*..... +.*....*. +*.....*. +*******. +........ +........ + +char 0x7b +........ +.....**. +....*... +...*.... +...*.... +...*.... +...*.... +.**..... +...*.... +...*.... +...*.... +...*.... +....*... +.....**. +........ +........ + +char 0x7c +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0x7d +........ +.**..... +...*.... +....*... +....*... +....*... +....*... +.....**. +....*... +....*... +....*... +....*... +...*.... +.**..... +........ +........ + +char 0x7e +........ +.***..*. +*...**.. +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0x7f +........ +........ +........ +........ +...*.... +..*.*... +.*...*.. +*.....*. +*******. +*.....*. +*******. +........ +........ +........ +........ +........ + +char 0x80 +........ +..***... +.*...*.. +*.....*. +*....... +*....... +*....... +*....... +*....... +*....... +*....... +*.....*. +.*...*.. +..***... +...*.... +..*..... + +char 0x81 +........ +........ +..*..*.. +..*..*.. +........ +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*....*. +..*****. +........ +........ + +char 0x82 +....**.. +....*... +...*.... +........ +........ +..***... +.*...*.. +*.....*. +*.....*. +*******. +*....... +*.....*. +.*...*.. +..***... +........ +........ + +char 0x83 +........ +...*.... +..*.*... +.*...*.. +........ +.****... +.....*.. +.....*.. +..****.. +.*...*.. +*....*.. +*....*.. +.*...*.. +..*****. +........ +........ + +char 0x84 +........ +........ +..*..*.. +..*..*.. +........ +.****... +.....*.. +.....*.. +..****.. +.*...*.. +*....*.. +*....*.. +.*...*.. +..*****. +........ +........ + +char 0x85 +...*.... +....*... +.....*.. +........ +........ +.****... +.....*.. +.....*.. +..****.. +.*...*.. +*....*.. +*....*.. +.*...*.. +..*****. +........ +........ + +char 0x86 +........ +...**... +..*..*.. +...**... +........ +.****... +.....*.. +.....*.. +..****.. +.*...*.. +*....*.. +*....*.. +.*...*.. +..*****. +........ +........ + +char 0x87 +........ +........ +........ +........ +........ +..****.. +.*....*. +*....... +*....... +*....... +*....... +*....... +.*....*. +..****.. +....*... +...*.... + +char 0x88 +........ +...*.... +..*.*... +.*...*.. +........ +..***... +.*...*.. +*.....*. +*.....*. +*******. +*....... +*.....*. +.*...*.. +..***... +........ +........ + +char 0x89 +........ +........ +..*..*.. +..*..*.. +........ +..***... +.*...*.. +*.....*. +*.....*. +*******. +*....... +*.....*. +.*...*.. +..***... +........ +........ + +char 0x8a +...*.... +....*... +.....*.. +........ +........ +..***... +.*...*.. +*.....*. +*.....*. +*******. +*....... +*.....*. +.*...*.. +..***... +........ +........ + +char 0x8b +........ +........ +..*..*.. +..*..*.. +........ +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +........ +........ + +char 0x8c +........ +...*.... +..*.*... +.*...*.. +........ +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +........ +........ + +char 0x8d +...*.... +....*... +.....*.. +........ +........ +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +........ +........ + +char 0x8e +..*..*.. +..*..*.. +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*******. +*.....*. +*.....*. +*.....*. +*.....*. +........ +........ + +char 0x8f +........ +..***... +.*...*.. +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*******. +*.....*. +*.....*. +*.....*. +*.....*. +........ +........ + +char 0x90 +....**.. +....*... +...*.... +*******. +*....... +*....... +*....... +*....... +*****... +*....... +*....... +*....... +*....... +*******. +........ +........ + +char 0x91 +........ +........ +........ +........ +........ +.**..... +...***.. +...*..*. +.***..*. +*..****. +*..*.... +*..*.... +*..*..*. +.**.**.. +........ +........ + +char 0x92 +....**.. +...*.... +..*..... +..*.*... +..*.*... +..*.*... +*******. +..*.*... +..*.*... +..*.*... +..*.*... +..*.*... +..*.*... +..*.*... +........ +........ + +char 0x93 +........ +...*.... +..*.*... +.*...*.. +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x94 +........ +........ +..*..*.. +..*..*.. +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x95 +...*.... +....*... +.....*.. +........ +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x96 +........ +...*.... +..*.*... +.*...*.. +........ +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*....*. +..*****. +........ +........ + +char 0x97 +...*.... +....*... +.....*.. +........ +........ +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*....*. +..*****. +........ +........ + +char 0x98 +........ +........ +..*..*.. +..*..*.. +........ +*.....*. +*.....*. +.*...*.. +.*...*.. +..*.*... +..*.*... +...*.... +...*.... +..*..... +..*..... +.*...... + +char 0x99 +..*..*.. +..*..*.. +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x9a +..*..*.. +..*..*.. +........ +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0x9b +........ +..*.*... +..*.*... +..*.*... +..****.. +.**.*.*. +*.*.*... +*.*.*... +*.*.*... +*.*.*... +*.*.*... +.**.*.*. +..****.. +..*.*... +..*.*... +..*.*... + +char 0x9c +........ +....**.. +...*..*. +..*..... +..*..... +..*..... +******.. +..*..... +..*..... +..*..... +.**..... +*.*..... +*.**..*. +.*..**.. +........ +........ + +char 0x9d +........ +*.....*. +*.....*. +.*...*.. +..*.*... +...*.... +*******. +...*.... +...*.... +*******. +...*.... +...*.... +...*.... +...*.... +........ +........ + +char 0x9e +........ +***..... +*..*.... +*...*... +*...*... +*...*... +*..*.*.. +***..*.. +*..***** +*....*.. +*....*.. +*....*.. +*....*.. +*....*.. +........ +........ + +char 0x9f +........ +....**.. +...*..*. +...*.... +...*.... +...*.... +*******. +...*.... +...*.... +...*.... +...*.... +...*.... +*..*.... +.**..... +........ +........ + +char 0xa0 +....**.. +....*... +...*.... +........ +........ +.****... +.....*.. +.....*.. +..****.. +.*...*.. +*....*.. +*....*.. +.*...*.. +..*****. +........ +........ + +char 0xa1 +....**.. +....*... +...*.... +........ +........ +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +........ +........ + +char 0xa2 +....**.. +....*... +...*.... +........ +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0xa3 +....**.. +....*... +...*.... +........ +........ +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*....*. +..*****. +........ +........ + +char 0xa4 +........ +...*..*. +..*.*.*. +..*..*.. +........ +*****... +*....*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +........ +........ + +char 0xa5 +...*..*. +..*.*.*. +..*..*.. +........ +*.....*. +**....*. +**....*. +*.*...*. +*..*..*. +*..*..*. +*...*.*. +*....**. +*....**. +*.....*. +........ +........ + +char 0xa6 +........ +........ +........ +.****... +.....*.. +.....*.. +..****.. +.*...*.. +*....*.. +*....*.. +.*...*.. +..*****. +........ +*******. +........ +........ + +char 0xa7 +........ +........ +........ +..***... +.*...*.. +*.....*. +*.....*. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +*******. +........ +........ + +char 0xa8 +........ +...*.... +...*.... +........ +........ +...*.... +...*.... +..*..... +.*...*.. +*.....*. +*.....*. +*.....*. +.*...*.. +..***... +........ +........ + +char 0xa9 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +*******. +*....... +*....... +*....... +........ +........ + +char 0xaa +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +*******. +......*. +......*. +......*. +........ +........ + +char 0xab +........ +...*.... +..**.... +...*.... +...*.... +...*.... +........ +*******. +........ +.****... +.....*.. +..***... +.*...... +.*****.. +........ +........ + +char 0xac +........ +...*.... +..**.... +...*.... +...*.... +...*.... +........ +*******. +........ +...**... +..*.*... +.*..*... +.*****.. +....*... +........ +........ + +char 0xad +........ +...*.... +...*.... +........ +........ +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +........ +........ + +char 0xae +........ +........ +........ +........ +...*..*. +..*..*.. +.*..*... +*..*.... +*..*.... +.*..*... +..*..*.. +...*..*. +........ +........ +........ +........ + +char 0xaf +........ +........ +........ +........ +*..*.... +.*..*... +..*..*.. +...*..*. +...*..*. +..*..*.. +.*..*... +*..*.... +........ +........ +........ +........ + +char 0xb0 +...*...* +.*...*.. +...*...* +.*...*.. +...*...* +.*...*.. +...*...* +.*...*.. +...*...* +.*...*.. +...*...* +.*...*.. +...*...* +.*...*.. +...*...* +.*...*.. + +char 0xb1 +.*.*.*.* +*.*.*.*. +.*.*.*.* +*.*.*.*. +.*.*.*.* +*.*.*.*. +.*.*.*.* +*.*.*.*. +.*.*.*.* +*.*.*.*. +.*.*.*.* +*.*.*.*. +.*.*.*.* +*.*.*.*. +.*.*.*.* +*.*.*.*. + +char 0xb2 +.***.*** +**.***.* +.***.*** +**.***.* +.***.*** +**.***.* +.***.*** +**.***.* +.***.*** +**.***.* +.***.*** +**.***.* +.***.*** +**.***.* +.***.*** +**.***.* + +char 0xb3 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xb4 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +****.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xb5 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +****.... +...*.... +****.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xb6 +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +****.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xb7 +........ +........ +........ +........ +........ +........ +........ +******.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xb8 +........ +........ +........ +........ +........ +........ +........ +****.... +...*.... +****.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xb9 +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +****.*.. +.....*.. +****.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xba +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xbb +........ +........ +........ +........ +........ +........ +........ +******.. +.....*.. +****.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xbc +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +****.*.. +.....*.. +******.. +........ +........ +........ +........ +........ +........ + +char 0xbd +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +******.. +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xbe +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +****.... +...*.... +****.... +........ +........ +........ +........ +........ +........ + +char 0xbf +........ +........ +........ +........ +........ +........ +........ +****.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xc0 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...***** +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xc1 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +******** +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xc2 +........ +........ +........ +........ +........ +........ +........ +******** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xc3 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...***** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xc4 +........ +........ +........ +........ +........ +........ +........ +******** +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xc5 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +******** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xc6 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...***** +...*.... +...***** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xc7 +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xc8 +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*** +...*.... +...***** +........ +........ +........ +........ +........ +........ + +char 0xc9 +........ +........ +........ +........ +........ +........ +........ +...***** +...*.... +...*.*** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xca +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +****.*** +........ +******** +........ +........ +........ +........ +........ +........ + +char 0xcb +........ +........ +........ +........ +........ +........ +........ +******** +........ +****.*** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xcc +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*** +...*.... +...*.*** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xcd +........ +........ +........ +........ +........ +........ +........ +******** +........ +******** +........ +........ +........ +........ +........ +........ + +char 0xce +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +****.*** +........ +****.*** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xcf +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +******** +........ +******** +........ +........ +........ +........ +........ +........ + +char 0xd0 +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +******** +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xd1 +........ +........ +........ +........ +........ +........ +........ +******** +........ +******** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xd2 +........ +........ +........ +........ +........ +........ +........ +******** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xd3 +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...***** +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xd4 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...***** +...*.... +...***** +........ +........ +........ +........ +........ +........ + +char 0xd5 +........ +........ +........ +........ +........ +........ +........ +...***** +...*.... +...***** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xd6 +........ +........ +........ +........ +........ +........ +........ +...***** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xd7 +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +****.*** +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. +...*.*.. + +char 0xd8 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +******** +...*.... +******** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xd9 +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +****.... +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xda +........ +........ +........ +........ +........ +........ +........ +...***** +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... +...*.... + +char 0xdb +******** +******** +******** +******** +******** +******** +******** +******** +******** +******** +******** +******** +******** +******** +******** +******** + +char 0xdc +........ +........ +........ +........ +........ +........ +........ +........ +******** +******** +******** +******** +******** +******** +******** +******** + +char 0xdd +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... +****.... + +char 0xde +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** +....**** + +char 0xdf +******** +******** +******** +******** +******** +******** +******** +******** +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe0 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe1 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe2 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe3 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe4 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe5 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe6 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe7 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe8 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xe9 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xea +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xeb +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xec +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xed +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xee +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xef +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf0 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf1 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf2 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf3 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf4 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf5 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf6 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf7 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf8 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xf9 +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xfa +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xfb +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xfc +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xfd +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xfe +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ + +char 0xff +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ diff --git a/29_day/haribote/haribote.sys b/29_day/haribote/haribote.sys new file mode 100644 index 0000000000000000000000000000000000000000..e098d2b2dc72ce95ff296ef38e8f320f59a0abbd GIT binary patch literal 33331 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 + +void init_pic(void) +/* PIC初始化 */ +{ + io_out8(PIC0_IMR, 0xff ); /* 禁止所有中断 */ + io_out8(PIC1_IMR, 0xff ); /* 禁止所有中断 */ + + io_out8(PIC0_ICW1, 0x11 ); /* 边缘触发模式(edge trigger mode) */ + io_out8(PIC0_ICW2, 0x20 ); /* IRQ0-7由INT20-27接收 */ + io_out8(PIC0_ICW3, 1 << 2); /* PIC1由IRQ2相连 */ + io_out8(PIC0_ICW4, 0x01 ); /* 无缓冲区模式 */ + + io_out8(PIC1_ICW1, 0x11 ); /* 边缘触发模式(edge trigger mode) */ + io_out8(PIC1_ICW2, 0x28 ); /* IRQ8-15由INT28-2f接收 */ + io_out8(PIC1_ICW3, 2 ); /* PIC1由IRQ2连接 */ + io_out8(PIC1_ICW4, 0x01 ); /* 无缓冲区模式 */ + + io_out8(PIC0_IMR, 0xfb ); /* 11111011 PIC1以外全部禁止 */ + io_out8(PIC1_IMR, 0xff ); /* 11111111 禁止所有中断 */ + + return; +} diff --git a/29_day/haribote/ipl10.nas b/29_day/haribote/ipl10.nas new file mode 100644 index 0000000..7108a21 --- /dev/null +++ b/29_day/haribote/ipl10.nas @@ -0,0 +1,109 @@ +; 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 + +readloop: + MOV SI,0 ; 记录失败次数寄存器 + +retry: + MOV AH,0x02 ; AH=0x02 : 读入磁盘 + MOV AL,1 ; 1个扇区 + MOV BX,0 + MOV DL,0x00 ; A驱动器 + INT 0x13 ; 调用磁盘BIOS + JNC next ; 没出错则跳转到fin + ADD SI,1 ; 往SI加1 + CMP SI,5 ; 比较SI与5 + JAE error ; SI >= 5 跳转到error + MOV AH,0x00 + MOV DL,0x00 ; A驱动器 + INT 0x13 ; 重置驱动器 + JMP retry +next: + MOV AX,ES ; 把内存地址后移0x200(512/16十六进制转换) + ADD AX,0x0020 + MOV ES,AX ; ADD ES,0x020因为没有ADD ES,只能通过AX进行 + ADD CL,1 ; 往CL里面加1 + CMP CL,18 ; 比较CL与18 + JBE readloop ; CL <= 18 跳转到readloop + MOV CL,1 + ADD DH,1 + CMP DH,2 + JB readloop ; DH < 2 跳转到readloop + MOV DH,0 + ADD CH,1 + CMP CH,CYLS + JB readloop ; CH < CYLS 跳转到readloop + +; 读取完毕,跳转到haribote.sys执行! + MOV [0x0ff0],CH ; IPLがどこまで読んだのかをメモ + JMP 0xc200 + +error: + 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 + + RESB 0x7dfe-$ ; 填写0x00直到0x001fe + + DB 0x55, 0xaa diff --git a/29_day/haribote/ipl20.nas b/29_day/haribote/ipl20.nas new file mode 100644 index 0000000..9b14835 --- /dev/null +++ b/29_day/haribote/ipl20.nas @@ -0,0 +1,109 @@ +; haribote-ipl +; TAB=4 + +CYLS EQU 20 ; 声明CYLS=20 + + 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 + +readloop: + MOV SI,0 ; 记录失败次数寄存器 + +retry: + MOV AH,0x02 ; AH=0x02 : 读入磁盘 + MOV AL,1 ; 1个扇区 + MOV BX,0 + MOV DL,0x00 ; A驱动器 + INT 0x13 ; 调用磁盘BIOS + JNC next ; 没出错则跳转到fin + ADD SI,1 ; 往SI加1 + CMP SI,5 ; 比较SI与5 + JAE error ; SI >= 5 跳转到error + MOV AH,0x00 + MOV DL,0x00 ; A驱动器 + INT 0x13 ; 重置驱动器 + JMP retry +next: + MOV AX,ES ; 把内存地址后移0x200(512/16十六进制转换) + ADD AX,0x0020 + MOV ES,AX ; ADD ES,0x020因为没有ADD ES,只能通过AX进行 + ADD CL,1 ; 往CL里面加1 + CMP CL,18 ; 比较CL与18 + JBE readloop ; CL <= 18 跳转到readloop + MOV CL,1 + ADD DH,1 + CMP DH,2 + JB readloop ; DH < 2 跳转到readloop + MOV DH,0 + ADD CH,1 + CMP CH,CYLS + JB readloop ; CH < CYLS 跳转到readloop + +; 读取完毕,跳转到haribote.sys执行! + MOV [0x0ff0],CH ; IPLがどこまで読んだのかをメモ + JMP 0xc200 + +error: + 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 + + RESB 0x7dfe-$ ; 填写0x00直到0x001fe + + DB 0x55, 0xaa diff --git a/29_day/haribote/jp.nas b/29_day/haribote/jp.nas new file mode 100644 index 0000000..3f7cb00 --- /dev/null +++ b/29_day/haribote/jp.nas @@ -0,0 +1,107 @@ +; haribote-ipl +; TAB=4 + +CYLS EQU 10 ; ǂ܂œǂݍނ + + ORG 0x7c00 ; ̃vOǂɓǂݍ܂̂ + +; ȉ͕WIFAT12tH[}bgtbs[fBXN̂߂̋Lq + + JMP entry + DB 0x90 + DB "HARIBOTE" ; u[gZN^̖ORɏĂ悢i8oCgj + DW 512 ; 1ZN^̑傫i512ɂȂ΂Ȃj + DB 1 ; NX^̑傫i1ZN^ɂȂ΂Ȃj + DW 1 ; FATǂn܂邩iʂ1ZN^ڂɂj + DB 2 ; FAŤi2ɂȂ΂Ȃj + DW 224 ; [gfBNg̈̑傫iʂ224Ggɂj + DW 2880 ; ̃hCȗ傫i2880ZN^ɂȂ΂Ȃj + DB 0xf0 ; fBÃ^Cvi0xf0ɂȂ΂Ȃj + DW 9 ; FAT̈̒i9ZN^ɂȂ΂Ȃj + DW 18 ; 1gbNɂ‚̃ZN^邩i18ɂȂ΂Ȃj + DW 2 ; wbh̐i2ɂȂ΂Ȃj + DD 0 ; p[eBVgĂȂ̂ł͕K0 + DD 2880 ; ̃hCu傫x + DB 0,0,0x29 ; 悭킩Ȃǂ̒lɂĂƂ炵 + DD 0xffffffff ; Ԃ{[VAԍ + DB "HARIBOTEOS " ; fBXN̖Oi11oCgj + DB "FAT12 " ; tH[}bg̖Oi8oCgj + RESB 18 ; Ƃ肠18oCgĂ + +; vO{ + +entry: + MOV AX,0 ; WX^ + MOV SS,AX + MOV SP,0x7c00 + MOV DS,AX + +; fBXNǂ + + MOV AX,0x0820 + MOV ES,AX + MOV CH,0 ; V_0 + MOV DH,0 ; wbh0 + MOV CL,2 ; ZN^2 +readloop: + MOV SI,0 ; s񐔂𐔂郌WX^ +retry: + MOV AH,0x02 ; AH=0x02 : fBXNǂݍ + MOV AL,1 ; 1ZN^ + MOV BX,0 + MOV DL,0x00 ; AhCu + INT 0x13 ; fBXNBIOSĂяo + JNC next ; G[Ȃnext + ADD SI,1 ; SI1𑫂 + CMP SI,5 ; SI5r + JAE error ; SI >= 5 error + MOV AH,0x00 + MOV DL,0x00 ; AhCu + INT 0x13 ; hCũZbg + JMP retry +next: + MOV AX,ES ; AhX0x200i߂ + ADD AX,0x0020 + MOV ES,AX ; ADD ES,0x020 Ƃ߂Ȃ̂łĂ + ADD CL,1 ; CL1𑫂 + CMP CL,18 ; CL18r + JBE readloop ; CL <= 18 readloop + MOV CL,1 + ADD DH,1 + CMP DH,2 + JB readloop ; DH < 2 readloop + MOV DH,0 + ADD CH,1 + CMP CH,CYLS + JB readloop ; CH < CYLS readloop + +; ǂݏÎharibote.syssI + + MOV [0x0ff0],CH ; IPLǂ܂œǂ񂾂̂ + JMP 0xc200 + +error: + MOV AX,0 + MOV ES,AX + MOV SI,msg +putloop: + MOV AL,[SI] + ADD SI,1 ; SI1𑫂 + CMP AL,0 + JE fin + MOV AH,0x0e ; ꕶ\t@NV + MOV BX,15 ; J[R[h + INT 0x10 ; rfIBIOSĂяo + JMP putloop +fin: + HLT ; ܂CPU~ + JMP fin ; [v +msg: + DB 0x0a, 0x0a ; s2 + DB "load error" + DB 0x0a ; s + DB 0 + + RESB 0x7dfe-$ ; 0x7dfe܂ł0x00Ŗ߂閽 + + DB 0x55, 0xaa diff --git a/29_day/haribote/keyboard.c b/29_day/haribote/keyboard.c new file mode 100644 index 0000000..eb5140a --- /dev/null +++ b/29_day/haribote/keyboard.c @@ -0,0 +1,44 @@ +/* 键盘控制代码 */ + +#include "bootpack.h" + +struct FIFO32 *keyfifo; +int keydata0; + +void inthandler21(int *esp) +{ + int data; + io_out8(PIC0_OCW2, 0x61); /* 把IRQ-01接收信号结束的信息通知给PIC */ + data = io_in8(PORT_KEYDAT); + fifo32_put(keyfifo, data + keydata0); + return; +} + +#define PORT_KEYSTA 0x0064 +#define KEYSTA_SEND_NOTREADY 0x02 +#define KEYCMD_WRITE_MODE 0x60 +#define KBC_MODE 0x47 + +void wait_KBC_sendready(void) +{ + /* 等待键盘控制电路准备完毕 */ + for (;;) { + if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) { + break; + } + } + return; +} + +void init_keyboard(struct FIFO32 *fifo, int data0) +{ + /* 将FIFO缓冲区的信息保存到全局变量里 */ + keyfifo = fifo; + keydata0 = data0; + /* 键盘控制器的初始化 */ + wait_KBC_sendready(); + io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE); + wait_KBC_sendready(); + io_out8(PORT_KEYDAT, KBC_MODE); + return; +} diff --git a/29_day/haribote/make.bat b/29_day/haribote/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/haribote/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/haribote/memory.c b/29_day/haribote/memory.c new file mode 100644 index 0000000..54a447a --- /dev/null +++ b/29_day/haribote/memory.c @@ -0,0 +1,162 @@ +/* �������֌W */ + +#include "bootpack.h" + +#define EFLAGS_AC_BIT 0x00040000 +#define CR0_CACHE_DISABLE 0x60000000 + +unsigned int memtest(unsigned int start, unsigned int end) +{ + char flg486 = 0; + unsigned int eflg, cr0, i; + + /* 确认CPU是386还是486以上的 */ + eflg = io_load_eflags(); + eflg |= EFLAGS_AC_BIT; /* AC-bit = 1 */ + io_store_eflags(eflg); + eflg = io_load_eflags(); + if ((eflg & EFLAGS_AC_BIT) != 0) { + /* 如果是386,即使设定AC=1,AC的值还会自动回到0 */ + flg486 = 1; + } + + eflg &= ~EFLAGS_AC_BIT; /* AC-bit = 0 */ + io_store_eflags(eflg); + + if (flg486 != 0) { + cr0 = load_cr0(); + cr0 |= CR0_CACHE_DISABLE; /* 禁止缓存 */ + store_cr0(cr0); + } + + i = memtest_sub(start, end); + + if (flg486 != 0) { + cr0 = load_cr0(); + cr0 &= ~CR0_CACHE_DISABLE; /* 允许缓存 */ + store_cr0(cr0); + } + + return i; +} + +void memman_init(struct MEMMAN *man) +{ + man->frees = 0; /* 可用信息数目 */ + man->maxfrees = 0; /* 用于观察可用状况:frees的最大值 */ + man->lostsize = 0; /* 释放失败的内存的大小总和 */ + man->losts = 0; /* 释放失败次数 */ + return; +} + +unsigned int memman_total(struct MEMMAN *man) +/* 报告空余内存大小的合计 */ +{ + unsigned int i, t = 0; + for (i = 0; i < man->frees; i++) { + t += man->free[i].size; + } + return t; +} + +unsigned int memman_alloc(struct MEMMAN *man, unsigned int size) +/* 分配 */ +{ + unsigned int i, a; + for (i = 0; i < man->frees; i++) { + if (man->free[i].size >= size) { + /* 找到了足够大的内存 */ + a = man->free[i].addr; + man->free[i].addr += size; + man->free[i].size -= size; + if (man->free[i].size == 0) { + /* 如果free[i]变成了0,就减掉一条可用信息 */ + man->frees--; + for (; i < man->frees; i++) { + man->free[i] = man->free[i + 1]; /* 代入结构体 */ + } + } + return a; + } + } + return 0; /* 没有可用空间 */ +} + +int memman_free(struct MEMMAN *man, unsigned int addr, unsigned int size) +/* 释放 */ +{ + int i, j; + /* 为便于归纳内存,将free[]按照addr的顺序排列 */ + /* 所以,先决定应该放在哪里 */ + for (i = 0; i < man->frees; i++) { + if (man->free[i].addr > addr) { + break; + } + } + /* free[i - 1].addr < addr < free[i].addr */ + if (i > 0) { + /* 前面有可用内存 */ + if (man->free[i - 1].addr + man->free[i - 1].size == addr) { + /* 可以与前面的可用内存归纳到一起 */ + man->free[i - 1].size += size; + if (i < man->frees) { + /* 后面也有 */ + if (addr + size == man->free[i].addr) { + /* 也可以与后面的可用内存归纳到一起 */ + man->free[i - 1].size += man->free[i].size; + /* man->free[i]删除 */ + /* free[i]变成0后归纳到前面去 */ + man->frees--; + for (; i < man->frees; i++) { + man->free[i] = man->free[i + 1]; /* 结构体赋值 */ + } + } + } + return 0; /* 成功完成 */ + } + } + /* 不能与前面的可用空间归纳到一起 */ + if (i < man->frees) { + /* 后面还有 */ + if (addr + size == man->free[i].addr) { + /* 可以与后面的内容归纳到一起 */ + man->free[i].addr = addr; + man->free[i].size += size; + return 0; /* 成功完成 */ + } + } + /* 既不能与前面归纳到一起,也不能与后面归纳到一起 */ + if (man->frees < MEMMAN_FREES) { + /* free[i]之后的,向后移动,腾出一点可用空间 */ + for (j = man->frees; j > i; j--) { + man->free[j] = man->free[j - 1]; + } + man->frees++; + if (man->maxfrees < man->frees) { + man->maxfrees = man->frees; /* 更新最大值 */ + } + man->free[i].addr = addr; + man->free[i].size = size; + return 0; /* 成功完成 */ + } + /* 不能往后移动 */ + man->losts++; + man->lostsize += size; + return -1; /* 失败 */ +} + +unsigned int memman_alloc_4k(struct MEMMAN *man, unsigned int size) +{ + unsigned int a; + size = (size + 0xfff) & 0xfffff000; + a = memman_alloc(man, size); + return a; +} + +int memman_free_4k(struct MEMMAN *man, unsigned int addr, unsigned int size) +{ + int i; + size = (size + 0xfff) & 0xfffff000; + i = memman_free(man, addr, size); + return i; +} diff --git a/29_day/haribote/mouse.c b/29_day/haribote/mouse.c new file mode 100644 index 0000000..0c6403e --- /dev/null +++ b/29_day/haribote/mouse.c @@ -0,0 +1,76 @@ +/* 鼠标控制代码 */ + +#include "bootpack.h" + +struct FIFO32 *mousefifo; +int mousedata0; + +void inthandler2c(int *esp) +/* 来自PS/2鼠标的中断 */ +{ + int data; + io_out8(PIC1_OCW2, 0x64); /* 把IRQ-12接收信号结束的信息通知给PIC1 */ + io_out8(PIC0_OCW2, 0x62); /* 把IRQ-02接收信号结束的信息通知给PIC0 */ + data = io_in8(PORT_KEYDAT); + fifo32_put(mousefifo, data + mousedata0); + return; +} + +#define KEYCMD_SENDTO_MOUSE 0xd4 +#define MOUSECMD_ENABLE 0xf4 + +void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec) +{ + /* 将FIFO缓冲区的信息保存到全局变量里 */ + mousefifo = fifo; + mousedata0 = data0; + /* 鼠标有效 */ + wait_KBC_sendready(); + io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE); + wait_KBC_sendready(); + io_out8(PORT_KEYDAT, MOUSECMD_ENABLE); + /* 顺利的话,ACK(0xfa)会被发送*/ + mdec->phase = 0; /* 等待鼠标的0xfa的阶段*/ +return; +} + +int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat) +{ + if (mdec->phase == 0) { + /* 等待鼠标的0xfa的阶段 */ + if (dat == 0xfa) { + mdec->phase = 1; + } + return 0; + } + if (mdec->phase == 1) { + /* 等待鼠标第一字节的阶段 */ + mdec->buf[0] = dat; + mdec->phase = 2; + return 0; + } + if (mdec->phase == 2) { + /* 等待鼠标第二字节的阶段 */ + mdec->buf[1] = dat; + mdec->phase = 3; + return 0; + } + if (mdec->phase == 3) { + /* 等待鼠标第二字节的阶段 */ + mdec->buf[2] = dat; + mdec->phase = 1; + mdec->btn = mdec->buf[0] & 0x07; + mdec->x = mdec->buf[1]; + mdec->y = mdec->buf[2]; + if ((mdec->buf[0] & 0x10) != 0) { + mdec->x |= 0xffffff00; + } + if ((mdec->buf[0] & 0x20) != 0) { + mdec->y |= 0xffffff00; + } + mdec->y = - mdec->y; /* 鼠标的y方向与画面符号相反 */ + return 1; + } + /* 应该不可能到这里来 */ + return -1; +} diff --git a/29_day/haribote/mtask.c b/29_day/haribote/mtask.c new file mode 100644 index 0000000..f67b935 --- /dev/null +++ b/29_day/haribote/mtask.c @@ -0,0 +1,203 @@ +/* 多任务管理 */ + +#include "bootpack.h" + +struct TASKCTL *taskctl; +struct TIMER *task_timer; + +struct TASK *task_now(void) +{ + struct TASKLEVEL *tl = &taskctl->level[taskctl->now_lv]; + return tl->tasks[tl->now]; +} + +void task_add(struct TASK *task) +{ + struct TASKLEVEL *tl = &taskctl->level[task->level]; + tl->tasks[tl->running] = task; + tl->running++; + task->flags = 2; /*活动中*/ + return; +} + +void task_remove(struct TASK *task) +{ + int i; + struct TASKLEVEL *tl = &taskctl->level[task->level]; + + /*寻找task所在的位置*/ + for (i = 0; i < tl->running; i++) { + if (tl->tasks[i] == task) { + /*在这里 */ + break; + } + } + + tl->running--; + if (i < tl->now) { + tl->now--; /*需要移动成员,要相应地处理 */ + } + if (tl->now >= tl->running) { + /*如果now的值出现异常,则进行修正*/ + tl->now = 0; + } + task->flags = 1; /* 休眠中 */ + + /* 移动 */ + for (; i < tl->running; i++) { + tl->tasks[i] = tl->tasks[i + 1]; + } + return; +} + +void task_switchsub(void) +{ + int i; + /*寻找最上层的LEVEL */ + for (i = 0; i < MAX_TASKLEVELS; i++) { + if (taskctl->level[i].running > 0) { + break; /*找到了*/ + } + } + taskctl->now_lv = i; + taskctl->lv_change = 0; + return; +} + +void task_idle(void) +{ + for (;;) { + io_hlt(); + } +} + +struct TASK *task_init(struct MEMMAN *memman) +{ + int i; + struct TASK *task, *idle; + struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT; + + + taskctl = (struct TASKCTL *) memman_alloc_4k(memman, sizeof (struct TASKCTL)); + for (i = 0; i < MAX_TASKS; i++) { + taskctl->tasks0[i].flags = 0; + taskctl->tasks0[i].sel = (TASK_GDT0 + i) * 8; + taskctl->tasks0[i].tss.ldtr = (TASK_GDT0 + MAX_TASKS + i) * 8; + set_segmdesc(gdt + TASK_GDT0 + i, 103, (int) &taskctl->tasks0[i].tss, AR_TSS32); + set_segmdesc(gdt + TASK_GDT0 + MAX_TASKS + i, 15, (int) taskctl->tasks0[i].ldt, AR_LDT); + } + for (i = 0; i < MAX_TASKLEVELS; i++) { + taskctl->level[i].running = 0; + taskctl->level[i].now = 0; + } + + task = task_alloc(); + task->flags = 2; /*活动中标志*/ + task->priority = 2; /* 0.02秒*/ + task->level = 0; /*最高LEVEL */ + task_add(task); + task_switchsub(); /* LEVEL 设置*/ + load_tr(task->sel); + task_timer = timer_alloc(); + timer_settime(task_timer, task->priority); + + idle = task_alloc(); + idle->tss.esp = memman_alloc_4k(memman, 64 * 1024) + 64 * 1024; + idle->tss.eip = (int) &task_idle; + idle->tss.es = 1 * 8; + idle->tss.cs = 2 * 8; + idle->tss.ss = 1 * 8; + idle->tss.ds = 1 * 8; + idle->tss.fs = 1 * 8; + idle->tss.gs = 1 * 8; + task_run(idle, MAX_TASKLEVELS - 1, 1); + + return task; +} + +struct TASK *task_alloc(void) +{ + int i; + struct TASK *task; + for (i = 0; i < MAX_TASKS; i++) { + if (taskctl->tasks0[i].flags == 0) { + task = &taskctl->tasks0[i]; + task->flags = 1; /*正在使用的标志*/ + task->tss.eflags = 0x00000202; /* IF = 1; */ + task->tss.eax = 0; /*这里先置为0*/ + task->tss.ecx = 0; + task->tss.edx = 0; + task->tss.ebx = 0; + task->tss.ebp = 0; + task->tss.esi = 0; + task->tss.edi = 0; + task->tss.es = 0; + task->tss.ds = 0; + task->tss.fs = 0; + task->tss.gs = 0; + task->tss.iomap = 0x40000000; + task->tss.ss0 = 0; + return task; + } + } + return 0; /*全部正在使用*/ +} + +void task_run(struct TASK *task, int level, int priority) +{ + if (level < 0) { + level = task->level; /*不改变LEVEL */ + } + if (priority > 0) { + task->priority = priority; + } + if (task->flags == 2 && task->level != level) { + /*改变活动中的LEVEL */ + task_remove(task); /*这里执行之后flag的值会变为1,于是下面的if语句块也会被执行*/ + } + if (task->flags != 2) { + /*从休眠状态唤醒的情形*/ + task->level = level; + task_add(task); + } + taskctl->lv_change = 1; /*下次任务切换时检查LEVEL */ + return; +} + +void task_sleep(struct TASK *task) +{ + struct TASK *now_task; + if (task->flags == 2) { + /*如果处于活动状态*/ + now_task = task_now(); + task_remove(task); /*执行此语句的话flags将变为1 */ + if (task == now_task) { + /*如果是让自己休眠,则需要进行任务切换*/ + task_switchsub(); + now_task = task_now(); /*在设定后获取当前任务的值*/ + farjmp(0, now_task->sel); + } + } + return; +} + + +void task_switch(void) +{ + struct TASKLEVEL *tl = &taskctl->level[taskctl->now_lv]; + struct TASK *new_task, *now_task = tl->tasks[tl->now]; + tl->now++; + if (tl->now == tl->running) { + tl->now = 0; + } + if (taskctl->lv_change != 0) { + task_switchsub(); + tl = &taskctl->level[taskctl->now_lv]; + } + new_task = tl->tasks[tl->now]; + timer_settime(task_timer, new_task->priority); + if (new_task != now_task) { + farjmp(0, new_task->sel); + } + return; +} diff --git a/29_day/haribote/naskfunc.nas b/29_day/haribote/naskfunc.nas new file mode 100644 index 0000000..a45775d --- /dev/null +++ b/29_day/haribote/naskfunc.nas @@ -0,0 +1,291 @@ +; naskfunc +; TAB=4 + +[FORMAT "WCOFF"] ; 制作目标文件的模式 +[INSTRSET "i486p"] ; 使用到486为止的指令 +[BITS 32] ; 3制作32位模式用的机器语言 +[FILE "naskfunc.nas"] ; 文件名 + + GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt + GLOBAL _io_in8, _io_in16, _io_in32 + GLOBAL _io_out8, _io_out16, _io_out32 + GLOBAL _io_load_eflags, _io_store_eflags + GLOBAL _load_gdtr, _load_idtr + GLOBAL _load_cr0, _store_cr0 + GLOBAL _load_tr + GLOBAL _asm_inthandler20, _asm_inthandler21 + GLOBAL _asm_inthandler2c, _asm_inthandler0c + GLOBAL _asm_inthandler0d, _asm_end_app + GLOBAL _memtest_sub + GLOBAL _farjmp, _farcall + GLOBAL _asm_hrb_api, _start_app + EXTERN _inthandler20, _inthandler21 + EXTERN _inthandler2c, _inthandler0d + EXTERN _inthandler0c + EXTERN _hrb_api + +[SECTION .text] + +_io_hlt: ; void io_hlt(void); + HLT + RET + +_io_cli: ; void io_cli(void); + CLI + RET + +_io_sti: ; void io_sti(void); + STI + RET + +_io_stihlt: ; void io_stihlt(void); + STI + HLT + RET + +_io_in8: ; int io_in8(int port); + MOV EDX,[ESP+4] ; port + MOV EAX,0 + IN AL,DX + RET + +_io_in16: ; int io_in16(int port); + MOV EDX,[ESP+4] ; port + MOV EAX,0 + IN AX,DX + RET + +_io_in32: ; int io_in32(int port); + MOV EDX,[ESP+4] ; port + IN EAX,DX + RET + +_io_out8: ; void io_out8(int port, int data); + MOV EDX,[ESP+4] ; port + MOV AL,[ESP+8] ; data + OUT DX,AL + RET + +_io_out16: ; void io_out16(int port, int data); + MOV EDX,[ESP+4] ; port + MOV EAX,[ESP+8] ; data + OUT DX,AX + RET + +_io_out32: ; void io_out32(int port, int data); + MOV EDX,[ESP+4] ; port + MOV EAX,[ESP+8] ; data + OUT DX,EAX + RET + +_io_load_eflags: ; int io_load_eflags(void); + PUSHFD ; PUSH EFLAGS + POP EAX + RET + +_io_store_eflags: ; void io_store_eflags(int eflags); + MOV EAX,[ESP+4] + PUSH EAX + POPFD ; POP EFLAGS + RET + +_load_gdtr: ; void load_gdtr(int limit, int addr); + MOV AX,[ESP+4] ; limit + MOV [ESP+6],AX + LGDT [ESP+6] + RET + +_load_idtr: ; void load_idtr(int limit, int addr); + MOV AX,[ESP+4] ; limit + MOV [ESP+6],AX + LIDT [ESP+6] + RET + +_load_cr0: ; int load_cr0(void); + MOV EAX,CR0 + RET + +_store_cr0: ; void store_cr0(int cr0); + MOV EAX,[ESP+4] + MOV CR0,EAX + RET + +_load_tr: ; void load_tr(int tr); + LTR [ESP+4] ; tr + RET + +_asm_inthandler20: + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler20 + POP EAX + POPAD + POP DS + POP ES + IRETD + +_asm_inthandler21: + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler21 + POP EAX + POPAD + POP DS + POP ES + IRETD + +_asm_inthandler2c: + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler2c + POP EAX + POPAD + POP DS + POP ES + IRETD + +_asm_inthandler0c: + STI + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler0c + CMP EAX,0 + JNE _asm_end_app + POP EAX + POPAD + POP DS + POP ES + ADD ESP,4 ; 在INT 0x0c中也需要这句 + IRETD + +_asm_inthandler0d: + STI + PUSH ES + PUSH DS + PUSHAD + MOV EAX,ESP + PUSH EAX + MOV AX,SS + MOV DS,AX + MOV ES,AX + CALL _inthandler0d + CMP EAX,0 + JNE _asm_end_app + POP EAX + POPAD + POP DS + POP ES + ADD ESP,4 ; INT 0x0d需要这句 + IRETD + +_memtest_sub: ; unsigned int memtest_sub(unsigned int start, unsigned int end) + PUSH EDI ; (由于还要使用EBX, ESI, EDI) + PUSH ESI + PUSH EBX + MOV ESI,0xaa55aa55 ; pat0 = 0xaa55aa55; + MOV EDI,0x55aa55aa ; pat1 = 0x55aa55aa; + MOV EAX,[ESP+12+4] ; i = start; +mts_loop: + MOV EBX,EAX + ADD EBX,0xffc ; p = i + 0xffc; + MOV EDX,[EBX] ; old = *p; + MOV [EBX],ESI ; *p = pat0; + XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff; + CMP EDI,[EBX] ; if (*p != pat1) goto fin; + JNE mts_fin + XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff; + CMP ESI,[EBX] ; if (*p != pat0) goto fin; + JNE mts_fin + MOV [EBX],EDX ; *p = old; + ADD EAX,0x1000 ; i += 0x1000; + CMP EAX,[ESP+12+8] ; if (i <= end) goto mts_loop; + JBE mts_loop + POP EBX + POP ESI + POP EDI + RET +mts_fin: + MOV [EBX],EDX ; *p = old; + POP EBX + POP ESI + POP EDI + RET + +_farjmp: ; void farjmp(int eip, int cs); + JMP FAR [ESP+4] ; eip, cs + RET + +_farcall: ; void farcall(int eip, int cs); + CALL FAR [ESP+4] ; eip, cs + RET + +_asm_hrb_api: + STI + PUSH DS + PUSH ES + PUSHAD ; 用于保存的PUSH + PUSHAD ; 用于向hrb_api传值的PUSH + MOV AX,SS + MOV DS,AX ; 将操作系统用段地址存入DS和ES + MOV ES,AX + CALL _hrb_api + CMP EAX,0 ; 当EAX不为0时程序结束 + JNE _asm_end_app + ADD ESP,32 + POPAD + POP ES + POP DS + IRETD +_asm_end_app: +; EAX为tss.esp0的地址 + MOV ESP,[EAX] + MOV DWORD [EAX+4],0 + POPAD + RET ; 返回cmd_app + +_start_app: ; void start_app(int eip, int cs, int esp, int ds, int *tss_esp0); + PUSHAD ; 将32位寄存器的值全部保存起来 + MOV EAX,[ESP+36] ; 应用程序用EIP + MOV ECX,[ESP+40] ; 应用程序用CS + MOV EDX,[ESP+44] ; 应用程序用ESP + MOV EBX,[ESP+48] ; 应用程序用DS/SS + MOV EBP,[ESP+52] ; tss.esp0的地址 + MOV [EBP ],ESP ; 保存操作系统用ESP + MOV [EBP+4],SS ; 保存操作系统用SS + MOV ES,BX + MOV DS,BX + MOV FS,BX + MOV GS,BX +; 下面调整栈,以免用RETF跳转到应用程序 + OR ECX,3 ; 将应用程序用段号和3进行OR运算 + OR EBX,3 ; 将应用程序用段号和3进行OR运算 + PUSH EBX ; 应用程序的SS + PUSH EDX ; 应用程序的ESP + PUSH ECX ; 应用程序的CS + PUSH EAX ; 应用程序的EIP + RETF +; 应用程序结束后不会回到这里 diff --git a/29_day/haribote/sheet.c b/29_day/haribote/sheet.c new file mode 100644 index 0000000..14aa0ea --- /dev/null +++ b/29_day/haribote/sheet.c @@ -0,0 +1,294 @@ +/* sheet */ + +#include "bootpack.h" + +#define SHEET_USE 1 + +struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize) +{ + struct SHTCTL *ctl; + int i; + ctl = (struct SHTCTL *) memman_alloc_4k(memman, sizeof (struct SHTCTL)); + if (ctl == 0) { + goto err; + } + ctl->map = (unsigned char *) memman_alloc_4k(memman, xsize * ysize); + if (ctl->map == 0) { + memman_free_4k(memman, (int) ctl, sizeof (struct SHTCTL)); + goto err; + } + ctl->vram = vram; + ctl->xsize = xsize; + ctl->ysize = ysize; + ctl->top = -1; /* 没有一张SHEET */ + for (i = 0; i < MAX_SHEETS; i++) { + ctl->sheets0[i].flags = 0; /* 标记为未使用 */ + ctl->sheets0[i].ctl = ctl; /* 记录所属*/ + } +err: + return ctl; +} + +struct SHEET *sheet_alloc(struct SHTCTL *ctl) +{ + struct SHEET *sht; + int i; + for (i = 0; i < MAX_SHEETS; i++) { + if (ctl->sheets0[i].flags == 0) { + sht = &ctl->sheets0[i]; + sht->flags = SHEET_USE; /* 标记为正在使用*/ + sht->height = -1; /* 隐藏 */ + sht->task = 0; /*不使用自动关闭功能*/ + return sht; + } + } + return 0; /* 所有的SHEET都处于正在使用状态*/ +} + +void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv) +{ + sht->buf = buf; + sht->bxsize = xsize; + sht->bysize = ysize; + sht->col_inv = col_inv; + return; +} + +void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0) +{ + int h, bx, by, vx, vy, bx0, by0, bx1, by1, sid4, *p;; + unsigned char *buf, sid, *map = ctl->map; + struct SHEET *sht; + if (vx0 < 0) { vx0 = 0; } + if (vy0 < 0) { vy0 = 0; } + if (vx1 > ctl->xsize) { vx1 = ctl->xsize; } + if (vy1 > ctl->ysize) { vy1 = ctl->ysize; } + for (h = h0; h <= ctl->top; h++) { + sht = ctl->sheets[h]; + sid = sht - ctl->sheets0; /* 将进行了减法计算的地址作为图层号码使用 */ + buf = sht->buf; + bx0 = vx0 - sht->vx0; + by0 = vy0 - sht->vy0; + bx1 = vx1 - sht->vx0; + by1 = vy1 - sht->vy0; + if (bx0 < 0) { bx0 = 0; } + if (by0 < 0) { by0 = 0; } + if (bx1 > sht->bxsize) { bx1 = sht->bxsize; } + if (by1 > sht->bysize) { by1 = sht->bysize; } + if (sht->col_inv == -1) { + if ((sht->vx0 & 3) == 0 && (bx0 & 3) == 0 && (bx1 & 3) == 0) { + /*无透明色图层专用的高速版(4字节型)*/ + bx1 = (bx1 - bx0) / 4; /* MOV次数*/ + sid4 = sid | sid << 8 | sid << 16 | sid << 24; + for (by = by0; by < by1; by++) { + vy = sht->vy0 + by; + vx = sht->vx0 + bx0; + p = (int *) &map[vy * ctl->xsize + vx]; + for (bx = 0; bx < bx1; bx++) { + p[bx] = sid4; + } + } + } else { + /*无透明色图层专用的高速版(1字节型)*/ + for (by = by0; by < by1; by++) { + vy = sht->vy0 + by; + for (bx = bx0; bx < bx1; bx++) { + vx = sht->vx0 + bx; + map[vy * ctl->xsize + vx] = sid; + } + } + } + } else { + /*有透明色图层用的普通版*/ + for (by = by0; by < by1; by++) { + vy = sht->vy0 + by; + for (bx = bx0; bx < bx1; bx++) { + vx = sht->vx0 + bx; + if (buf[by * sht->bxsize + bx] != sht->col_inv) { + map[vy * ctl->xsize + vx] = sid; + } + } + } + } + } + return; +} + +void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0, int h1) +{ + int h, bx, by, vx, vy, bx0, by0, bx1, by1, bx2, sid4, i, i1, *p, *q, *r; + unsigned char *buf, *vram = ctl->vram, *map = ctl->map, sid; + struct SHEET *sht; + + /* 如果refresh的范围超出了画面则修正 */ + if (vx0 < 0) { vx0 = 0; } + if (vy0 < 0) { vy0 = 0; } + if (vx1 > ctl->xsize) { vx1 = ctl->xsize; } + if (vy1 > ctl->ysize) { vy1 = ctl->ysize; } + for (h = h0; h <= h1; h++) { + sht = ctl->sheets[h]; + buf = sht->buf; + sid = sht - ctl->sheets0; + + /* 使用vx0~vy1,对bx0~by1进行倒推 */ + bx0 = vx0 - sht->vx0; + by0 = vy0 - sht->vy0; + bx1 = vx1 - sht->vx0; + by1 = vy1 - sht->vy0; + if (bx0 < 0) { bx0 = 0; } /* 处理刷新范围在图层外侧 */ + if (by0 < 0) { by0 = 0; } + if (bx1 > sht->bxsize) { bx1 = sht->bxsize; } /* 应对不同的重叠方式 */ + if (by1 > sht->bysize) { by1 = sht->bysize; } + if ((sht->vx0 & 3) == 0) { + /* 4字节型*/ + i = (bx0 + 3) / 4; /* bx0除以4(小数进位)*/ + i1 = bx1 / 4; /* bx1除以4(小数舍去)*/ + i1 = i1 - i; + sid4 = sid | sid << 8 | sid << 16 | sid << 24; + for (by = by0; by < by1; by++) { + vy = sht->vy0 + by; + for (bx = bx0; bx < bx1 && (bx & 3) != 0; bx++) { + /*前面被4除多余的部分逐个字节写入*/ + vx = sht->vx0 + bx; + if (map[vy * ctl->xsize + vx] == sid) { + vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx]; + } + } + vx = sht->vx0 + bx; + p = (int *) &map[vy * ctl->xsize + vx]; + q = (int *) &vram[vy * ctl->xsize + vx]; + r = (int *) &buf[by * sht->bxsize + bx]; + for (i = 0; i < i1; i++) { + /* 4的倍数部分*/ + if (p[i] == sid4) { + q[i] = r[i]; /*估计大多数会是这种情况,因此速度会变快*/ + } else { + bx2 = bx + i * 4; + vx = sht->vx0 + bx2; + if (map[vy * ctl->xsize + vx + 0] == sid) { + vram[vy * ctl->xsize + vx + 0] = buf[by * sht->bxsize + bx2 + 0]; + } + if (map[vy * ctl->xsize + vx + 1] == sid) { + vram[vy * ctl->xsize + vx + 1] = buf[by * sht->bxsize + bx2 + 1]; + } + if (map[vy * ctl->xsize + vx + 2] == sid) { + vram[vy * ctl->xsize + vx + 2] = buf[by * sht->bxsize + bx2 + 2]; + } + if (map[vy * ctl->xsize + vx + 3] == sid) { + vram[vy * ctl->xsize + vx + 3] = buf[by * sht->bxsize + bx2 + 3]; + } + } + } + for (bx += i1 * 4; bx < bx1; bx++) { + /*后面被4除多余的部分逐个字节写入*/ + vx = sht->vx0 + bx; + if (map[vy * ctl->xsize + vx] == sid) { + vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx]; + } + } + } + } else { + /* 1字节型*/ + for (by = by0; by < by1; by++) { + vy = sht->vy0 + by; + for (bx = bx0; bx < bx1; bx++) { + vx = sht->vx0 + bx; + if (map[vy * ctl->xsize + vx] == sid) { + vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx]; + } + } + } + } + } + return; +} + +void sheet_updown(struct SHEET *sht, int height) +{ + struct SHTCTL *ctl = sht->ctl; + int h, old = sht->height; /* 存储设置前的高度信息 */ + if (height > ctl->top + 1) { + height = ctl->top + 1; + } + if (height < -1) { + height = -1; + } + sht->height = height;/* 设定高度 */ + + /* 下面主要是进行sheets[]的重新排列 */ + if (old > height) { /* 比以前低 */ + if (height >= 0) { + /* 把中间的往上提 */ + for (h = old; h > height; h--) { + ctl->sheets[h] = ctl->sheets[h - 1]; + ctl->sheets[h]->height = h; + } + ctl->sheets[height] = sht; + sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1); + sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1, old); + } else { /* 隐藏 */ + if (ctl->top > old) { + /* 把上面的降下来 */ + for (h = old; h < ctl->top; h++) { + ctl->sheets[h] = ctl->sheets[h + 1]; + ctl->sheets[h]->height = h; + } + } + ctl->top--; /* 由于显示中的图层减少了一个,所以最上面的图层高度下降 */ + sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0); + sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0, old - 1); + } + } else if (old < height) { /* 比以前高 */ + if (old >= 0) { + /* 把中间的拉下去 */ + for (h = old; h < height; h++) { + ctl->sheets[h] = ctl->sheets[h + 1]; + ctl->sheets[h]->height = h; + } + ctl->sheets[height] = sht; + } else { /* 由隐藏状态转为显示状态 */ + /* 将已在上面的提上来 */ + for (h = ctl->top; h >= height; h--) { + ctl->sheets[h + 1] = ctl->sheets[h]; + ctl->sheets[h + 1]->height = h + 1; + } + ctl->sheets[height] = sht; + ctl->top++; /* 由于已显示的图层增加了1个,所以最上面的图层高度增加 */ + } + sheet_refreshmap(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height); + sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height, height); /* 按新图层信息重新绘制画面 */ + } + return; +} + +void sheet_refresh(struct SHEET *sht, int bx0, int by0, int bx1, int by1) +{ + if (sht->height >= 0) { /* 如果正在显示,则按新图层的信息刷新画面*/ + sheet_refreshsub(sht->ctl, sht->vx0 + bx0, sht->vy0 + by0, sht->vx0 + bx1, sht->vy0 + by1, sht->height, sht->height); + } + return; +} + +void sheet_slide(struct SHEET *sht, int vx0, int vy0) +{ + struct SHTCTL *ctl = sht->ctl; + int old_vx0 = sht->vx0, old_vy0 = sht->vy0; + sht->vx0 = vx0; + sht->vy0 = vy0; + if (sht->height >= 0) { /* 如果正在显示,则按新图层的信息刷新画面 */ + sheet_refreshmap(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize, 0); + sheet_refreshmap(ctl, vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize, sht->height); + sheet_refreshsub(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize, 0, sht->height - 1); + sheet_refreshsub(ctl, vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize, sht->height, sht->height); + } + return; +} + +void sheet_free(struct SHEET *sht) +{ + if (sht->height >= 0) { + sheet_updown(sht, -1); /* 如果处于显示状态,则先设定为隐藏 */ + } + sht->flags = 0; /* "未使用"标志 */ + return; +} diff --git a/29_day/haribote/timer.c b/29_day/haribote/timer.c new file mode 100644 index 0000000..9018ac8 --- /dev/null +++ b/29_day/haribote/timer.c @@ -0,0 +1,169 @@ +/* 定时器 */ + +#include "bootpack.h" + +#define PIT_CTRL 0x0043 +#define PIT_CNT0 0x0040 + +struct TIMERCTL timerctl; + +#define TIMER_FLAGS_ALLOC 1 /* 已配置状态 */ +#define TIMER_FLAGS_USING 2 /* 定时器运行中 */ + +void init_pit(void) +{ + int i; + struct TIMER *t; + io_out8(PIT_CTRL, 0x34); + io_out8(PIT_CNT0, 0x9c); + io_out8(PIT_CNT0, 0x2e); + timerctl.count = 0; + for (i = 0; i < MAX_TIMER; i++) { + timerctl.timers0[i].flags = 0; /* 没有使用 */ + } + t = timer_alloc(); /* 取得一个 */ + t->timeout = 0xffffffff; + t->flags = TIMER_FLAGS_USING; + t->next = 0; /* 末尾 */ + timerctl.t0 = t; /* 因为现在只有哨兵,所以他就在最前面*/ + timerctl.next = 0xffffffff; /* 因为只有哨兵,所以下一个超时时刻就是哨兵的时刻 */ + return; +} + +struct TIMER *timer_alloc(void) +{ + int i; + for (i = 0; i < MAX_TIMER; i++) { + if (timerctl.timers0[i].flags == 0) { + timerctl.timers0[i].flags = TIMER_FLAGS_ALLOC; + timerctl.timers0[i].flags2 = 0; + return &timerctl.timers0[i]; + } + } + return 0; /* 没找到 */ +} + +void timer_free(struct TIMER *timer) +{ + timer->flags = 0; /* 未使用 */ + return; +} + +void timer_init(struct TIMER *timer, struct FIFO32 *fifo, int data) +{ + timer->fifo = fifo; + timer->data = data; + return; +} + +void timer_settime(struct TIMER *timer, unsigned int timeout) +{ + int e; + struct TIMER *t, *s; + timer->timeout = timeout + timerctl.count; + timer->flags = TIMER_FLAGS_USING; + e = io_load_eflags(); + io_cli(); + t = timerctl.t0; + if (timer->timeout <= t->timeout) { + /* 插入最前面的情况 */ + timerctl.t0 = timer; + timer->next = t; /* 下面是设定t */ + timerctl.next = timer->timeout; + io_store_eflags(e); + return; + } + for (;;) { + s = t; + t = t->next; + if (timer->timeout <= t->timeout) { + /* 插入s和t之间的情况 */ + s->next = timer; /* s下一个是timer */ + timer->next = t; /* timer的下一个是t */ + io_store_eflags(e); + return; + } + } +} + +void inthandler20(int *esp) +{ + struct TIMER *timer; + char ts = 0; + io_out8(PIC0_OCW2, 0x60); /* 把IRQ-00接收信号结束的信息通知给PIC */ + timerctl.count++; + if (timerctl.next > timerctl.count) { + return; + } + timer = timerctl.t0; /* 首先把最前面的地址赋给timer */ + for (;;) { + /* 因为timers的定时器都处于运行状态,所以不确认flags */ + if (timer->timeout > timerctl.count) { + break; + } + /* 超时 */ + timer->flags = TIMER_FLAGS_ALLOC; + if (timer != task_timer) { + fifo32_put(timer->fifo, timer->data); + } else { + ts = 1; /* mt_timer超时*/ + } + timer = timer->next; /* 将下一个定时器的地址赋给timer*/ + } + timerctl.t0 = timer; + timerctl.next = timer->timeout; + if (ts != 0) { + task_switch(); + } + return; +} + +int timer_cancel(struct TIMER *timer) +{ + int e; + struct TIMER *t; + e = io_load_eflags(); + io_cli(); /*在设置过程中禁止改变定时器状态*/ + if (timer->flags == TIMER_FLAGS_USING) { /*是否需要取消?*/ + if (timer == timerctl.t0) { + /*第一个定时器的取消处理*/ + t = timer->next; + timerctl.t0 = t; + timerctl.next = t->timeout; + } else { + /*非第一个定时器的取消处理*/ + /*找到timer前一个定时器*/ + t = timerctl.t0; + for (;;) { + if (t->next == timer) { + break; + } + t = t->next; + } + t->next = timer->next; + /*将之前“timer的下一个”指向“timer的下一个”*/ + } + timer->flags = TIMER_FLAGS_ALLOC; + io_store_eflags(e); + return 1; /*取消处理成功*/ + } + io_store_eflags(e); + return 0; /*不需要取消处理*/ +} + +void timer_cancelall(struct FIFO32 *fifo) +{ + int e, i; + struct TIMER *t; + e = io_load_eflags(); + io_cli(); /*在设置过程中禁止改变定时器状态*/ + for (i = 0; i < MAX_TIMER; i++) { + t = &timerctl.timers0[i]; + if (t->flags != 0 && t->flags2 != 0 && t->fifo == fifo) { + timer_cancel(t); + timer_free(t); + } + } + io_store_eflags(e); + return; +} diff --git a/29_day/haribote/window.c b/29_day/haribote/window.c new file mode 100644 index 0000000..4d70578 --- /dev/null +++ b/29_day/haribote/window.c @@ -0,0 +1,118 @@ +/* 窗口相关函数 */ + +#include "bootpack.h" + +void make_window8(unsigned char *buf, int xsize, int ysize, char *title, char act) +{ + boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, xsize - 1, 0 ); + boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, xsize - 2, 1 ); + boxfill8(buf, xsize, COL8_C6C6C6, 0, 0, 0, ysize - 1); + boxfill8(buf, xsize, COL8_FFFFFF, 1, 1, 1, ysize - 2); + boxfill8(buf, xsize, COL8_848484, xsize - 2, 1, xsize - 2, ysize - 2); + boxfill8(buf, xsize, COL8_000000, xsize - 1, 0, xsize - 1, ysize - 1); + boxfill8(buf, xsize, COL8_C6C6C6, 2, 2, xsize - 3, ysize - 3); + boxfill8(buf, xsize, COL8_848484, 1, ysize - 2, xsize - 2, ysize - 2); + boxfill8(buf, xsize, COL8_000000, 0, ysize - 1, xsize - 1, ysize - 1); + make_wtitle8(buf, xsize, title, act); + return; +} + +void make_wtitle8(unsigned char *buf, int xsize, char *title, char act) +{ + static char closebtn[14][16] = { + "OOOOOOOOOOOOOOO@", + "OQQQQQQQQQQQQQ$@", + "OQQQQQQQQQQQQQ$@", + "OQQQ@@QQQQ@@QQ$@", + "OQQQQ@@QQ@@QQQ$@", + "OQQQQQ@@@@QQQQ$@", + "OQQQQQQ@@QQQQQ$@", + "OQQQQQ@@@@QQQQ$@", + "OQQQQ@@QQ@@QQQ$@", + "OQQQ@@QQQQ@@QQ$@", + "OQQQQQQQQQQQQQ$@", + "OQQQQQQQQQQQQQ$@", + "O$$$$$$$$$$$$$$@", + "@@@@@@@@@@@@@@@@" + }; + int x, y; + char c, tc, tbc; + if (act != 0) { + tc = COL8_FFFFFF; + tbc = COL8_000084; + } else { + tc = COL8_C6C6C6; + tbc = COL8_848484; + } + boxfill8(buf, xsize, tbc, 3, 3, xsize - 4, 20); + putfonts8_asc(buf, xsize, 24, 4, tc, title); + for (y = 0; y < 14; y++) { + for (x = 0; x < 16; x++) { + c = closebtn[y][x]; + if (c == '@') { + c = COL8_000000; + } else if (c == '$') { + c = COL8_848484; + } else if (c == 'Q') { + c = COL8_C6C6C6; + } else { + c = COL8_FFFFFF; + } + buf[(5 + y) * xsize + (xsize - 21 + x)] = c; + } + } + return; +} + +void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b, char *s, int l) +{ + boxfill8(sht->buf, sht->bxsize, b, x, y, x + l * 8 - 1, y + 15); + putfonts8_asc(sht->buf, sht->bxsize, x, y, c, s); + sheet_refresh(sht, x, y, x + l * 8, y + 16); + return; +} + +void make_textbox8(struct SHEET *sht, int x0, int y0, int sx, int sy, int c) +{ + int x1 = x0 + sx, y1 = y0 + sy; + boxfill8(sht->buf, sht->bxsize, COL8_848484, x0 - 2, y0 - 3, x1 + 1, y0 - 3); + boxfill8(sht->buf, sht->bxsize, COL8_848484, x0 - 3, y0 - 3, x0 - 3, y1 + 1); + boxfill8(sht->buf, sht->bxsize, COL8_FFFFFF, x0 - 3, y1 + 2, x1 + 1, y1 + 2); + boxfill8(sht->buf, sht->bxsize, COL8_FFFFFF, x1 + 2, y0 - 3, x1 + 2, y1 + 2); + boxfill8(sht->buf, sht->bxsize, COL8_000000, x0 - 1, y0 - 2, x1 + 0, y0 - 2); + boxfill8(sht->buf, sht->bxsize, COL8_000000, x0 - 2, y0 - 2, x0 - 2, y1 + 0); + boxfill8(sht->buf, sht->bxsize, COL8_C6C6C6, x0 - 2, y1 + 1, x1 + 0, y1 + 1); + boxfill8(sht->buf, sht->bxsize, COL8_C6C6C6, x1 + 1, y0 - 2, x1 + 1, y1 + 1); + boxfill8(sht->buf, sht->bxsize, c, x0 - 1, y0 - 1, x1 + 0, y1 + 0); + return; +} + +void change_wtitle8(struct SHEET *sht, char act) +{ + int x, y, xsize = sht->bxsize; + char c, tc_new, tbc_new, tc_old, tbc_old, *buf = sht->buf; + if (act != 0) { + tc_new = COL8_FFFFFF; + tbc_new = COL8_000084; + tc_old = COL8_C6C6C6; + tbc_old = COL8_848484; + } else { + tc_new = COL8_C6C6C6; + tbc_new = COL8_848484; + tc_old = COL8_FFFFFF; + tbc_old = COL8_000084; + } + for (y = 3; y <= 20; y++) { + for (x = 3; x <= xsize - 4; x++) { + c = buf[y * xsize + x]; + if (c == tc_old && x <= xsize - 22) { + c = tc_new; + } else if (c == tbc_old) { + c = tbc_new; + } + buf[y * xsize + x] = c; + } + } + sheet_refresh(sht, 3, 3, xsize, 21); + return; +} diff --git a/29_day/hello3/!cons_9x.bat b/29_day/hello3/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/hello3/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/hello3/!cons_nt.bat b/29_day/hello3/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/hello3/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/hello3/Makefile b/29_day/hello3/Makefile new file mode 100644 index 0000000..436f686 --- /dev/null +++ b/29_day/hello3/Makefile @@ -0,0 +1,5 @@ +APP = hello3 +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/hello3/hello3.c b/29_day/hello3/hello3.c new file mode 100644 index 0000000..f71cedf --- /dev/null +++ b/29_day/hello3/hello3.c @@ -0,0 +1,11 @@ +#include "apilib.h" + +void HariMain(void) +{ + api_putchar('h'); + api_putchar('e'); + api_putchar('l'); + api_putchar('l'); + api_putchar('o'); + api_end(); +} diff --git a/29_day/hello3/make.bat b/29_day/hello3/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/hello3/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/hello4/!cons_9x.bat b/29_day/hello4/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/hello4/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/hello4/!cons_nt.bat b/29_day/hello4/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/hello4/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/hello4/Makefile b/29_day/hello4/Makefile new file mode 100644 index 0000000..f4cb8d2 --- /dev/null +++ b/29_day/hello4/Makefile @@ -0,0 +1,5 @@ +APP = hello4 +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/hello4/hello4.c b/29_day/hello4/hello4.c new file mode 100644 index 0000000..ec04384 --- /dev/null +++ b/29_day/hello4/hello4.c @@ -0,0 +1,7 @@ +#include "apilib.h" + +void HariMain(void) +{ + api_putstr0("hello, world\n"); + api_end(); +} diff --git a/29_day/hello4/make.bat b/29_day/hello4/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/hello4/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/hello5/!cons_9x.bat b/29_day/hello5/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/hello5/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/hello5/!cons_nt.bat b/29_day/hello5/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/hello5/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/hello5/Makefile b/29_day/hello5/Makefile new file mode 100644 index 0000000..366ff9d --- /dev/null +++ b/29_day/hello5/Makefile @@ -0,0 +1,5 @@ +APP = hello5 +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/hello5/hello5.nas b/29_day/hello5/hello5.nas new file mode 100644 index 0000000..ee62330 --- /dev/null +++ b/29_day/hello5/hello5.nas @@ -0,0 +1,20 @@ +[FORMAT "WCOFF"] +[INSTRSET "i486p"] +[BITS 32] +[FILE "hello5.nas"] + + GLOBAL _HariMain + +[SECTION .text] + +_HariMain: + MOV EDX,2 + MOV EBX,msg + INT 0x40 + MOV EDX,4 + INT 0x40 + +[SECTION .data] + +msg: + DB "hello, world", 0x0a, 0 diff --git a/29_day/hello5/make.bat b/29_day/hello5/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/hello5/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/iroha/!cons_9x.bat b/29_day/iroha/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/iroha/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/iroha/!cons_nt.bat b/29_day/iroha/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/iroha/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/iroha/Makefile b/29_day/iroha/Makefile new file mode 100644 index 0000000..df134ad --- /dev/null +++ b/29_day/iroha/Makefile @@ -0,0 +1,5 @@ +APP = iroha +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/iroha/iroha.c b/29_day/iroha/iroha.c new file mode 100644 index 0000000..3ed1dd8 --- /dev/null +++ b/29_day/iroha/iroha.c @@ -0,0 +1,9 @@ +#include "apilib.h" + +void HariMain(void) +{ + static char s[9] = { 0xb2, 0xdb, 0xca, 0xc6, 0xce, 0xcd, 0xc4, 0x0a, 0x00 }; + /*半角片假名イロハニホヘト的字符编码+换行+0 */ + api_putstr0(s); + api_end(); +} diff --git a/29_day/iroha/make.bat b/29_day/iroha/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/iroha/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/lines/!cons_9x.bat b/29_day/lines/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/lines/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/lines/!cons_nt.bat b/29_day/lines/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/lines/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/lines/Makefile b/29_day/lines/Makefile new file mode 100644 index 0000000..45a6aad --- /dev/null +++ b/29_day/lines/Makefile @@ -0,0 +1,5 @@ +APP = lines +STACK = 1k +MALLOC = 48k + +include ../app_make.txt diff --git a/29_day/lines/lines.c b/29_day/lines/lines.c new file mode 100644 index 0000000..5217faa --- /dev/null +++ b/29_day/lines/lines.c @@ -0,0 +1,22 @@ +#include "apilib.h" + +void HariMain(void) +{ + char *buf; + int win, i; + api_initmalloc(); + buf = api_malloc(160 * 100); + win = api_openwin(buf, 160, 100, -1, "lines"); + for (i = 0; i < 8; i++) { + api_linewin(win + 1, 8, 26, 77, i * 9 + 26, i); + api_linewin(win + 1, 88, 26, i * 9 + 88, 89, i); + } + api_refreshwin(win, 6, 26, 154, 90); + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } + api_closewin(win); + api_end(); +} diff --git a/29_day/lines/make.bat b/29_day/lines/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/lines/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/make.bat b/29_day/make.bat new file mode 100644 index 0000000..e489766 --- /dev/null +++ b/29_day/make.bat @@ -0,0 +1 @@ +..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/nihongo/jpn16v00.bin b/29_day/nihongo/jpn16v00.bin new file mode 100644 index 0000000000000000000000000000000000000000..135f07ce88e6ddefe60f5b6768ac36b52ac3fe76 GIT binary patch literal 311296 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 Uf>;Y0Qnog1f# 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 literal 0 HcmV?d00001 diff --git a/29_day/nihongo/jpn16v00.fnt b/29_day/nihongo/jpn16v00.fnt new file mode 100644 index 0000000000000000000000000000000000000000..cd7387ab0020c48601dfdd25c1d59d769fea5b44 GIT binary patch literal 58084 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 literal 0 HcmV?d00001 diff --git a/29_day/nihongo/nihongo.fnt b/29_day/nihongo/nihongo.fnt new file mode 100644 index 0000000000000000000000000000000000000000..e312bf5b7e4044adcff849980606951ba48bdd9a GIT binary patch literal 145472 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

GyQ$xxyMzR=Bd_b{buLbR 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 +#include "apilib.h" + +void HariMain(void) +{ + char *buf, s[12]; + int win, timer, sec = 0, min = 0, hou = 0; + api_initmalloc(); + buf = api_malloc(150 * 50); + win = api_openwin(buf, 150, 50, -1, "noodle"); + timer = api_alloctimer(); + api_inittimer(timer, 128); + for (;;) { + sprintf(s, "%5d:%02d:%02d", hou, min, sec); + api_boxfilwin(win, 28, 27, 115, 41, 7);/*白色*/ + api_putstrwin(win, 28, 27, 0, 11, s); /*黑色*/ + api_settimer(timer, 100); /* 1秒 */ + if (api_getkey(1) != 128) { + break; + } + sec++; + if (sec == 60) { + sec = 0; + min++; + if (min == 60) { + min = 0; + hou++; + } + } + } + api_end(); +} diff --git a/29_day/sosu/!cons_9x.bat b/29_day/sosu/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/sosu/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/sosu/!cons_nt.bat b/29_day/sosu/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/sosu/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/sosu/Makefile b/29_day/sosu/Makefile new file mode 100644 index 0000000..de7b705 --- /dev/null +++ b/29_day/sosu/Makefile @@ -0,0 +1,5 @@ +APP = sosu +STACK = 2k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/sosu/make.bat b/29_day/sosu/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/sosu/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/sosu/sosu.c b/29_day/sosu/sosu.c new file mode 100644 index 0000000..6b9a997 --- /dev/null +++ b/29_day/sosu/sosu.c @@ -0,0 +1,24 @@ +#include +#include "apilib.h" + +#define MAX 1000 + +void HariMain(void) +{ + char flag[MAX], s[8]; + int i, j; + for (i = 0; i < MAX; i++) { + flag[i] = 0; + } + for (i = 2; i < MAX; i++) { + if (flag[i] == 0) { + /*没有标记的为质数*/ + sprintf(s, "%d ", i); + api_putstr0(s); + for (j = i * 2; j < MAX; j += i) { + flag[j] = 1; /*给它的倍数做上标记*/ + } + } + } + api_end(); +} diff --git a/29_day/sosu2/!cons_9x.bat b/29_day/sosu2/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/sosu2/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/sosu2/!cons_nt.bat b/29_day/sosu2/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/sosu2/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/sosu2/Makefile b/29_day/sosu2/Makefile new file mode 100644 index 0000000..d97a733 --- /dev/null +++ b/29_day/sosu2/Makefile @@ -0,0 +1,5 @@ +APP = sosu2 +STACK = 11k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/sosu2/make.bat b/29_day/sosu2/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/sosu2/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/sosu2/sosu2.c b/29_day/sosu2/sosu2.c new file mode 100644 index 0000000..381e436 --- /dev/null +++ b/29_day/sosu2/sosu2.c @@ -0,0 +1,24 @@ +#include +#include "apilib.h" + +#define MAX 10000 + +void HariMain(void) +{ + char flag[MAX], s[8]; + int i, j; + for (i = 0; i < MAX; i++) { + flag[i] = 0; + } + for (i = 2; i < MAX; i++) { + if (flag[i] == 0) { + /*没有标记的为质数*/ + sprintf(s, "%d ", i); + api_putstr0(s); + for (j = i * 2; j < MAX; j += i) { + flag[j] = 1; /*给它的倍数做上标记*/ + } + } + } + api_end(); +} diff --git a/29_day/sosu3/!cons_9x.bat b/29_day/sosu3/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/sosu3/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/sosu3/!cons_nt.bat b/29_day/sosu3/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/sosu3/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/sosu3/Makefile b/29_day/sosu3/Makefile new file mode 100644 index 0000000..a7e9900 --- /dev/null +++ b/29_day/sosu3/Makefile @@ -0,0 +1,5 @@ +APP = sosu3 +STACK = 1k +MALLOC = 42k + +include ../app_make.txt diff --git a/29_day/sosu3/make.bat b/29_day/sosu3/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/sosu3/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/sosu3/sosu3.c b/29_day/sosu3/sosu3.c new file mode 100644 index 0000000..db4527b --- /dev/null +++ b/29_day/sosu3/sosu3.c @@ -0,0 +1,26 @@ +#include +#include "apilib.h" + +#define MAX 10000 + +void HariMain(void) +{ + char *flag, s[8]; + int i, j; + api_initmalloc(); + flag = api_malloc(MAX); + for (i = 0; i < MAX; i++) { + flag[i] = 0; + } + for (i = 2; i < MAX; i++) { + if (flag[i] == 0) { + /*没有标记的为质数*/ + sprintf(s, "%d ", i); + api_putstr0(s); + for (j = i * 2; j < MAX; j += i) { + flag[j] = 1; /*给它的倍数做上标记*/ + } + } + } + api_end(); +} diff --git a/29_day/star1/!cons_9x.bat b/29_day/star1/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/star1/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/star1/!cons_nt.bat b/29_day/star1/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/star1/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/star1/Makefile b/29_day/star1/Makefile new file mode 100644 index 0000000..ae4cd72 --- /dev/null +++ b/29_day/star1/Makefile @@ -0,0 +1,5 @@ +APP = star1 +STACK = 1k +MALLOC = 47k + +include ../app_make.txt diff --git a/29_day/star1/make.bat b/29_day/star1/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/star1/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/star1/star1.c b/29_day/star1/star1.c new file mode 100644 index 0000000..93241a8 --- /dev/null +++ b/29_day/star1/star1.c @@ -0,0 +1,18 @@ +#include "apilib.h" + +void HariMain(void) +{ + char *buf; + int win; + api_initmalloc(); + buf = api_malloc(150 * 100); + win = api_openwin(buf, 150, 100, -1, "star1"); + api_boxfilwin(win, 6, 26, 143, 93, 0);/*黑色*/ + api_point(win, 75, 59, 3);/*黄色*/ + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } + api_end(); +} diff --git a/29_day/stars/!cons_9x.bat b/29_day/stars/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/stars/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/stars/!cons_nt.bat b/29_day/stars/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/stars/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/stars/Makefile b/29_day/stars/Makefile new file mode 100644 index 0000000..899cc8f --- /dev/null +++ b/29_day/stars/Makefile @@ -0,0 +1,5 @@ +APP = stars +STACK = 1k +MALLOC = 47k + +include ../app_make.txt diff --git a/29_day/stars/make.bat b/29_day/stars/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/stars/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/stars/stars.c b/29_day/stars/stars.c new file mode 100644 index 0000000..19c54e5 --- /dev/null +++ b/29_day/stars/stars.c @@ -0,0 +1,24 @@ +#include "apilib.h" + +int rand(void); /*产生0~32767之间的随机数*/ + +void HariMain(void) +{ + char *buf; + int win, i, x, y; + api_initmalloc(); + buf = api_malloc(150 * 100); + win = api_openwin(buf, 150, 100, -1, "stars"); + api_boxfilwin(win, 6, 26, 143, 93, 0);/*黑色*/ + for (i = 0; i < 50; i++) { + x = (rand() % 137) + 6; + y = (rand() % 67) + 26; + api_point(win, x, y, 3);/*黄色*/ + } + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } + api_end(); +} diff --git a/29_day/stars2/!cons_9x.bat b/29_day/stars2/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/stars2/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/stars2/!cons_nt.bat b/29_day/stars2/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/stars2/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/stars2/Makefile b/29_day/stars2/Makefile new file mode 100644 index 0000000..77c18cd --- /dev/null +++ b/29_day/stars2/Makefile @@ -0,0 +1,5 @@ +APP = stars2 +STACK = 1k +MALLOC = 47k + +include ../app_make.txt diff --git a/29_day/stars2/make.bat b/29_day/stars2/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/stars2/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/stars2/stars2.c b/29_day/stars2/stars2.c new file mode 100644 index 0000000..6c63c19 --- /dev/null +++ b/29_day/stars2/stars2.c @@ -0,0 +1,25 @@ +#include "apilib.h" + +int rand(void); /*产生0~32767的随机数*/ + +void HariMain(void) +{ + char *buf; + int win, i, x, y; + api_initmalloc(); + buf = api_malloc(150 * 100); + win = api_openwin(buf, 150, 100, -1, "stars2"); + api_boxfilwin(win + 1, 6, 26, 143, 93, 0);/*黑色*/ + for (i = 0; i < 50; i++) { + x = (rand() % 137) + 6; + y = (rand() % 67) + 26; + api_point(win + 1, x, y, 3);/*黄色*/ + } + api_refreshwin(win, 6, 26, 144, 94); + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } + api_end(); +} diff --git a/29_day/type/!cons_9x.bat b/29_day/type/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/type/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/type/!cons_nt.bat b/29_day/type/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/type/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/type/Makefile b/29_day/type/Makefile new file mode 100644 index 0000000..7314b7b --- /dev/null +++ b/29_day/type/Makefile @@ -0,0 +1,5 @@ +APP = type +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/type/make.bat b/29_day/type/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/type/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/type/type.c b/29_day/type/type.c new file mode 100644 index 0000000..c6fc99f --- /dev/null +++ b/29_day/type/type.c @@ -0,0 +1,23 @@ +#include "apilib.h" + +void HariMain(void) +{ + int fh; + char c, cmdline[30], *p; + + api_cmdline(cmdline, 30); + for (p = cmdline; *p > ' '; p++) { } /*跳过之前的内容,直到遇到空格*/ + for (; *p == ' '; p++) { } /*跳过空格*/ + fh = api_fopen(p); + if (fh != 0) { + for (;;) { + if (api_fread(&c, 1, fh) == 0) { + break; + } + api_putchar(c); + } + } else { + api_putstr0("File not found.\n"); + } + api_end(); +} diff --git a/29_day/typeipl/!cons_9x.bat b/29_day/typeipl/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/typeipl/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/typeipl/!cons_nt.bat b/29_day/typeipl/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/typeipl/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/typeipl/Makefile b/29_day/typeipl/Makefile new file mode 100644 index 0000000..f5b423e --- /dev/null +++ b/29_day/typeipl/Makefile @@ -0,0 +1,5 @@ +APP = typeipl +STACK = 1k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/typeipl/make.bat b/29_day/typeipl/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/typeipl/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/typeipl/typeipl.c b/29_day/typeipl/typeipl.c new file mode 100644 index 0000000..90a0273 --- /dev/null +++ b/29_day/typeipl/typeipl.c @@ -0,0 +1,17 @@ +#include "apilib.h" + +void HariMain(void) +{ + int fh; + char c; + fh = api_fopen("ipl10.nas"); + if (fh != 0) { + for (;;) { + if (api_fread(&c, 1, fh) == 0) { + break; + } + api_putchar(c); + } + } + api_end(); +} diff --git a/29_day/walk/!cons_9x.bat b/29_day/walk/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/walk/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/walk/!cons_nt.bat b/29_day/walk/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/walk/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/walk/Makefile b/29_day/walk/Makefile new file mode 100644 index 0000000..641c368 --- /dev/null +++ b/29_day/walk/Makefile @@ -0,0 +1,5 @@ +APP = walk +STACK = 1k +MALLOC = 48k + +include ../app_make.txt diff --git a/29_day/walk/make.bat b/29_day/walk/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/walk/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/walk/walk.c b/29_day/walk/walk.c new file mode 100644 index 0000000..4772f8a --- /dev/null +++ b/29_day/walk/walk.c @@ -0,0 +1,26 @@ +#include "apilib.h" + +void HariMain(void) +{ + char *buf; + int win, i, x, y; + api_initmalloc(); + buf = api_malloc(160 * 100); + win = api_openwin(buf, 160, 100, -1, "walk"); + api_boxfilwin(win, 4, 24, 155, 95, 0);/*黑色*/ + x = 76; + y = 56; + api_putstrwin(win, x, y, 3, 1, "*");/*黄色*/ + for (;;) { + i = api_getkey(1); + api_putstrwin(win, x, y, 0 , 1, "*"); /*用黑色擦除*/ + if (i == '4' && x > 4) { x -= 8; } + if (i == '6' && x < 148) { x += 8; } + if (i == '8' && y > 24) { y -= 8; } + if (i == '2' && y < 80) { y += 8; } + if (i == 0x0a) { break; } /*按回车键结束*/ + api_putstrwin(win, x, y, 3 , 1, "*");/*黄色*/ + } + api_closewin(win); + api_end(); +} diff --git a/29_day/winhelo/!cons_9x.bat b/29_day/winhelo/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/winhelo/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/winhelo/!cons_nt.bat b/29_day/winhelo/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/winhelo/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/winhelo/Makefile b/29_day/winhelo/Makefile new file mode 100644 index 0000000..44ac359 --- /dev/null +++ b/29_day/winhelo/Makefile @@ -0,0 +1,5 @@ +APP = winhelo +STACK = 8k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/winhelo/make.bat b/29_day/winhelo/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/winhelo/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/winhelo/winhelo.c b/29_day/winhelo/winhelo.c new file mode 100644 index 0000000..c36e988 --- /dev/null +++ b/29_day/winhelo/winhelo.c @@ -0,0 +1,15 @@ +#include "apilib.h" + +void HariMain(void) +{ + int win; + char buf[150 * 50]; + + win = api_openwin(buf, 150, 50, -1, "hello"); + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } + api_end(); +} diff --git a/29_day/winhelo2/!cons_9x.bat b/29_day/winhelo2/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/winhelo2/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/winhelo2/!cons_nt.bat b/29_day/winhelo2/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/winhelo2/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/winhelo2/Makefile b/29_day/winhelo2/Makefile new file mode 100644 index 0000000..a1544f5 --- /dev/null +++ b/29_day/winhelo2/Makefile @@ -0,0 +1,5 @@ +APP = winhelo2 +STACK = 8k +MALLOC = 0k + +include ../app_make.txt diff --git a/29_day/winhelo2/make.bat b/29_day/winhelo2/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/winhelo2/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/winhelo2/winhelo2.c b/29_day/winhelo2/winhelo2.c new file mode 100644 index 0000000..dfc4ce7 --- /dev/null +++ b/29_day/winhelo2/winhelo2.c @@ -0,0 +1,17 @@ +#include "apilib.h" + +void HariMain(void) +{ + int win; + char buf[150 * 50]; + + win = api_openwin(buf, 150, 50, -1, "hello"); + api_boxfilwin(win, 8, 36, 141, 43, 3); /*黄色*/ + api_putstrwin(win, 28, 28, 0 /*黑色*/, 12, "hello, world"); + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } + api_end(); +} diff --git a/29_day/winhelo3/!cons_9x.bat b/29_day/winhelo3/!cons_9x.bat new file mode 100644 index 0000000..e42252a --- /dev/null +++ b/29_day/winhelo3/!cons_9x.bat @@ -0,0 +1 @@ +command \ No newline at end of file diff --git a/29_day/winhelo3/!cons_nt.bat b/29_day/winhelo3/!cons_nt.bat new file mode 100644 index 0000000..6e07473 --- /dev/null +++ b/29_day/winhelo3/!cons_nt.bat @@ -0,0 +1 @@ +cmd.exe \ No newline at end of file diff --git a/29_day/winhelo3/Makefile b/29_day/winhelo3/Makefile new file mode 100644 index 0000000..719b23a --- /dev/null +++ b/29_day/winhelo3/Makefile @@ -0,0 +1,5 @@ +APP = winhelo3 +STACK = 1k +MALLOC = 40k + +include ../app_make.txt diff --git a/29_day/winhelo3/make.bat b/29_day/winhelo3/make.bat new file mode 100644 index 0000000..6b0dbfc --- /dev/null +++ b/29_day/winhelo3/make.bat @@ -0,0 +1 @@ +..\..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file diff --git a/29_day/winhelo3/winhelo3.c b/29_day/winhelo3/winhelo3.c new file mode 100644 index 0000000..a1529e5 --- /dev/null +++ b/29_day/winhelo3/winhelo3.c @@ -0,0 +1,19 @@ +#include "apilib.h" + +void HariMain(void) +{ + char *buf; + int win; + + api_initmalloc(); + buf = api_malloc(150 * 50); + win = api_openwin(buf, 150, 50, -1, "hello"); + api_boxfilwin(win, 8, 36, 141, 43, 6); /*浅蓝色*/ + api_putstrwin(win, 28, 28, 0 , 12, "hello, world");/*黑色*/ + for (;;) { + if (api_getkey(1) == 0x0a) { + break; /*按下回车键则break; */ + } + } + api_end(); +}