From 536ac6b0bc69df0e43e5e1fde208e9866d36b926 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 2 Jul 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-07-02 --- pc/dat.h | 70 ++++++++++++++-------------- pc/fns.h | 9 +++- pc/kbd.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ pc/l.s | 109 +++++++++++++++++++------------------------ pc/main.c | 65 ++++++++++---------------- 5 files changed, 250 insertions(+), 138 deletions(-) create mode 100644 pc/kbd.c diff --git a/pc/dat.h b/pc/dat.h index 7c9cb4c919a5e8afbd8b5204962c0f87fa7b108e..b5bbb2165003dbdc9d1f3733bf54dff56549210d 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -1,4 +1,5 @@ typedef struct Conf Conf; +typedef struct FPsave FPsave; typedef struct Label Label; typedef struct Lock Lock; typedef struct MMU MMU; @@ -29,11 +30,16 @@ struct Label ulong pc; }; +struct FPsave +{ + int type; +}; + struct Conf { - int nmach; /* processors */ - int nproc; /* processes */ - int npgrp; /* process groups */ + ulong nmach; /* processors */ + ulong nproc; /* processes */ + ulong npgrp; /* process groups */ ulong npage0; /* total physical pages of memory, bank 0 */ ulong npage1; /* total physical pages of memory, bank 1 */ ulong base0; /* base of bank 0 */ @@ -42,38 +48,34 @@ struct Conf ulong norig; /* origins */ ulong npte; /* contiguous page table entries */ ulong nmod; /* single (modifying) page table entries */ - int nalarm; /* alarms */ - int nchan; /* channels */ - int nenv; /* distinct environment values */ - int nenvchar; /* environment text storage */ - int npgenv; /* environment files per process group */ - int nmtab; /* mounted-upon channels per process group */ - int nmount; /* mounts */ - int nmntdev; /* mounted devices (devmnt.c) */ - int nmntbuf; /* buffers for devmnt.c messages */ - int nmnthdr; /* headers for devmnt.c messages */ - int nstream; /* streams */ - int nqueue; /* stream queues */ - int nblock; /* stream blocks */ - int nsrv; /* public servers (devsrv.c) */ - int nbitmap; /* bitmap structs (devbit.c) */ - int nbitbyte; /* bytes of bitmap data (devbit.c) */ - int nfont; /* font structs (devbit.c) */ - int nurp; /* max urp conversations */ - int nasync; /* number of async protocol modules */ - int npipe; /* number of pipes */ - int nservice; /* number of services */ - int nfsyschan; /* number of filsys open channels */ + ulong nalarm; /* alarms */ + ulong nchan; /* channels */ + ulong nenv; /* distinct environment values */ + ulong nenvchar; /* environment text storage */ + ulong npgenv; /* environment files per process group */ + ulong nmtab; /* mounted-upon channels per process group */ + ulong nmount; /* mounts */ + ulong nmntdev; /* mounted devices (devmnt.c) */ + ulong nmntbuf; /* buffers for devmnt.c messages */ + ulong nmnthdr; /* headers for devmnt.c messages */ + ulong nstream; /* streams */ + ulong nqueue; /* stream queues */ + ulong nblock; /* stream blocks */ + ulong nsrv; /* public servers (devsrv.c) */ + ulong nbitmap; /* bitmap structs (devbit.c) */ + ulong nbitbyte; /* bytes of bitmap data (devbit.c) */ + ulong nfont; /* font structs (devbit.c) */ + ulong nurp; /* max urp conversations */ + ulong nasync; /* number of async protocol modules */ + ulong npipe; /* number of pipes */ + ulong nservice; /* number of services */ + ulong nfsyschan; /* number of filsys open channels */ ulong maxialloc; /* maximum bytes used by ialloc */ - int copymode; /* 0 is copy on write, 1 is copy on reference */ - int portispaged; /* ??? */ - int nnoifc; - int nnoconv; - ulong ipif; /* Ip protocol interfaces */ - ulong ip; /* Ip conversations per interface */ - ulong arp; /* Arp table size */ - ulong frag; /* Ip fragment assemble queue size */ - int cntrlp; /* panic on ^P */ + ulong copymode; /* 0 is copy on write, 1 is copy on reference */ + ulong portispaged; /* ??? */ + ulong nnoifc; + ulong nnoconv; + ulong cntrlp; /* panic on ^P */ }; /* diff --git a/pc/fns.h b/pc/fns.h index 68dc97b891aa757a7ce68ae6cf864a32fcfeda4a..a13bfb1aa8d51159dbe1dbaa938175d2edf30050 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -1,2 +1,7 @@ -void restregs(void); -void saveregs(void); +void delay(int); +int inb(int); +int kbdc(void); +void outb(int, int); +void prhex(ulong); +void screenputc(int); +void screenputs(char*, int); diff --git a/pc/kbd.c b/pc/kbd.c new file mode 100644 index 0000000000000000000000000000000000000000..db500d81a001bf85e049fc47362b489a3a6337c3 --- /dev/null +++ b/pc/kbd.c @@ -0,0 +1,135 @@ +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" + +enum { + Data= 0x60, /* data port */ + + Status= 0x64, /* status port */ + Inready= 0x01, /* input character ready */ + Outbusy= 0x02, /* output busy */ + Sysflag= 0x04, /* ??? */ + Cmddata= 0x08, /* cmd==0, data==1 */ + kbdinh= 0x10, /* keyboard inhibited */ + Xtimeout= 0x20, /* transmit timeout */ + Rtimeout= 0x40, /* receive timeout */ + Parity= 0x80, /* 0==odd, 1==even */ + + +}; + +char noshift[256] = +{ +[0x00] Nokey, 0x1b, '1', '2', '3', '4', '5', '6', +[0x08] '7', '8', '9', '0', '-', '=', '\b', '\t', +[0x10] +[0x28] +[0x30] +}; + +/* + * get a byte from the keyboard + */ +int +kbdc(void) +{ + while((inb(Status)&Inready)==0) + ; + return inb(Data); +} + +1 0x1b, +3b F1, +3c F2, +3d F3, +3e F4, +3f F5, +40 f6, +41 F7, +42 F8, +43 F9, +44 F10, +57 F11, +58 F12, +e0 52 INS, +e0 53 DEL, +2 '1', +3 '2', +4 '3', +5 '4', +6 '5', +7 '6', +8 '7', +9 '8', +A '9', +B '0', +C '-', +D '=', +E '\b', +E0 47 Home, +F '\t', +10 'q', +11 'w', +12 'e', +13 'r', +14 't', +15 'y', +16 'u', +17 'i', +18 'o', +19 'p', +1a '[', +1b ']', +2b '\\', +e0 49 Pageup, +3a Capslock, +1e 'a' +1f 's' +20 'd' +21 'f' +22 'g' +23 'h' +24 'j' +25 'k' +26 'l' +27 ';' +28 '\'' +1c '\r' +2a Lshift, +2c 'z' +2d 'x' +2e 'c' +2f 'v' +30 'b' +31 'n' +32 'm' +33 ',' +34 '.' +35 '/' +36 Rshift, +e0 51 Pagedown, +e0 4f End, +e0 48 Uparrow, +e0 50 Downarrow, +e0 4b Leftarrow, +e0 4d Rightarrow, +e0 1d Rctl, +e0 38 Ralt, +39 Space, +38 Lalt, +1d Lctl, +29 '`', +1d 38 1 81 b8 9d F1 +1d 38 21 a1 b8 9d F2 + 2e ae F3 + 19 99 F4 + 26 F5 + 2F F6 + +e1 1d 45 e1 9d cf F7 +e0 46 e0 c6 f8 +e0 2a e0 37 e0 b7 e0 aa f9 +54 f10 +45 f11 +46 f12 diff --git a/pc/l.s b/pc/l.s index 0b101bd2070e48d72c37a63343f520aad04225da..15e86e5bf6382c713a6eda35619f83ea8a4b428e 100644 --- a/pc/l.s +++ b/pc/l.s @@ -1,35 +1,10 @@ #include "mem.h" -/* - * gdt to get us to 32-bit/segmented/unpaged mode - */ -GLOBL tgdt(SB),$(6*4) - - /* null descriptor */ - DATA tgdt+0(SB)/4, $0 - DATA tgdt+4(SB)/4, $0 - - /* data segment descriptor for 4 gigabytes (PL 0) */ - DATA tgdt+8(SB)/4, $(0xFFFF) - DATA tgdt+12(SB)/4, $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) - - /* exec segment descriptor for 4 gigabytes (PL 0) */ - DATA tgdt+16(SB)/4, $(0xFFFF) - DATA tgdt+20(SB)/4, $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) - -/* - * pointer to initial gdt - */ -GLOBL tgdtptr(SB),$6 - - DATA tgdtptr+0(SB)/2, $(3*8) - DATA tgdtptr+2(SB)/4, $tgdt(SB) - -TEXT start(SB),$0 - /* * about to walk all over ms/dos - turn off interrupts */ +TEXT origin(SB),$0 + CLI /* @@ -47,7 +22,7 @@ TEXT start(SB),$0 CLD REP MOVSL -/* JMPFAR* 00:$lowcore(SB) /**/ +/* JMPFAR 00:$lowcore(SB) /**/ BYTE $0xEA WORD $lowcore(SB) WORD $0 @@ -112,16 +87,6 @@ flush: TEXT mode32bit(SB),$0 -/* - * print a blue 3 on a red background - */ - MOVL $0xb8100,BX - MOVB $0x33,AL - MOVB AL,(BX) - INCW BX - MOVB $0x43,AL - MOVB AL,(BX) - /* * Clear BSS */ @@ -135,20 +100,6 @@ TEXT mode32bit(SB),$0 REP MOVSL - -/* - * print a blue 4 on a red background - */ - MOVL $0xb8100,BX - MOVB $0x34,AL - MOVB AL,(BX) - INCW BX - MOVB $0x43,AL - MOVB AL,(BX) -here: - JMP here - - /* * stack and mach */ @@ -159,15 +110,6 @@ here: MOVL $0, u(SB) CALL main(SB) -/* - * print a blue 4 on a red background - */ - MOVL $0xb8100,BX - MOVB $0x34,AL - MOVB AL,(BX) - INCW BX - MOVB $0x43,AL - MOVB AL,(BX) loop: JMP loop @@ -175,3 +117,48 @@ loop: GLOBL mach0+0(SB), $MACHSIZE GLOBL u(SB), $4 GLOBL m(SB), $4 + +/* + * gdt to get us to 32-bit/segmented/unpaged mode + */ +TEXT tgdt(SB),$0 + + /* null descriptor */ + LONG $0 + LONG $0 + + /* data segment descriptor for 4 gigabytes (PL 0) */ + LONG $(0xFFFF) + LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) + + /* exec segment descriptor for 4 gigabytes (PL 0) */ + LONG $(0xFFFF) + LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) + +/* + * pointer to initial gdt + */ +TEXT tgdtptr(SB),$0 + + WORD $(3*8) + LONG $tgdt(SB) + +/* + * input a byte + */ +TEXT inb(SB),$0 + + MOVL p+0(FP),DX + XORL AX,AX + INB + RET + +/* + * output a byte + */ +TEXT outb(SB),$0 + + MOVL p+0(FP),DX + MOVL b+4(FP),AX + OUTB + RET diff --git a/pc/main.c b/pc/main.c index 85674fad9746c3ca5b2acd5372f8b4610821e328..d5d62370740a7d116f1e4e8b1963deee6c4f9b23 100644 --- a/pc/main.c +++ b/pc/main.c @@ -1,56 +1,39 @@ -#include +#include "u.h" +#include "lib.h" +#include "dat.h" +#include "fns.h" -#define WIDTH 80 -#define HEIGHT 22 -#define SCREEN ((char *)0xB8000) -int pos; - -void -prchar(int x) +main(void) { - if(x == '\n'){ - pos = pos/WIDTH; - pos = (pos+1)*WIDTH; - } else { - SCREEN[pos++] = x; - SCREEN[pos++] = 0x43; + for(;;){ + print("%x ", kbdc()); } - if(pos >= WIDTH*HEIGHT) - pos = 0; } void -prstr(char *s) +delay(int l) { - while(*s) - prchar(*s++); -} + int i; -void -prdig(ulong x) -{ - if(x < 0xA) - prchar('0' + x); - else - prchar('A' + x); + while(--l){ + for(i=0; i < 10000; i++) + ; + } } -void -prhex(ulong x) +int +sprint(char *s, char *fmt, ...) { - ulong y; - - if(x <= 0xF){ - prdig(x); - } else { - y = x&0xF; - prhex(x>>4); - prdig(y); - } + return doprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s; } -main(void) +int +print(char *fmt, ...) { - prstr("hello world\n"); -} + char buf[PRINTSIZE]; + int n; + n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; + screenputs(buf, n); + return n; +}