OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / intrpt.c
1 \r
2 #include "core.h"\r
3 \r
4 void Initialize_ProgrammableInterruptController(void)\r
5 {\r
6         /*\r
7         IRR\81F\83C\83\93\83^\83\89\83v\83g\83\8a\83N\83G\83X\83g\83\8c\83W\83X\83\r
8                 .IRQ\83s\83\93\82Ì\8fó\91Ô\82ð\95\\82·\81B\83|\81[\83g\82ð\93Ç\82ñ\82¾\82Æ\82«\82É\81AIRR\82É\82È\82é\82©ISR\82É\82È\82é\82©\82Í\81AOCW3\82Å\91I\91ð\82·\82é\81B\r
9                 .1\82É\82È\82Á\82Ä\82¢\82é\83r\83b\83g\82Í\81A\8c»\8dÝ\97v\8b\81\82ª\97\88\82Ä\82¢\82é\81i\82à\82µ\82­\82Í\8f\88\97\9d\92\86\82Ì\81j\8a\84\82è\8d\9e\82Ý\81B\r
10         ISR\81F\83C\83\93\83T\81[\83r\83X\83\8c\83W\83X\83\r
11                 .\8c»\8dÝ\8f\88\97\9d\92\86\82Ì\8a\84\82è\8d\9e\82Ý\82ª\82Ç\82ê\82Å\82 \82é\82©\82ð\8e¦\82·\81B\83|\81[\83g\82ð\93Ç\82ñ\82¾\82Æ\82«\82É\81AIRR\82É\82È\82é\82©ISR\82É\82È\82é\82©\82Í\81AOCW3\82Å\91I\91ð\82·\82é\81B\r
12                 .1\82É\82È\82Á\82Ä\82¢\82é\83r\83b\83g\82Í\81A\8c»\8dÝ\8f\88\97\9d\92\86\82Ì\8a\84\82è\8d\9e\82Ý\81B\8f\88\97\9d\92\86\82Æ\82¢\82¤\82Ì\82Í\81ACPU\82É\91Î\82µ\82ÄINT\96½\97ß\82ð\94­\8ds\82µ\82½\82ª\81AEOI\81i\8a\84\82è\8d\9e\82Ý\8fI\97¹\96½\97ß\81j\82ð\8eó\82¯\8eæ\82Á\82Ä\82¢\82È\82¢\8a\84\82è\8d\9e\82Ý\81B\r
13         IMR\81F\83C\83\93\83^\83\89\83v\83g\83}\83X\83N\83\8c\83W\83X\83\r
14                 .\82±\82ê\82ª1\82É\82È\82Á\82Ä\82¢\82é\8a\84\82è\8d\9e\82Ý\82Í\81AIRR\82ª1\82É\82È\82Á\82Ä\82¢\82Ä\82à\81A\94½\89\9e\82µ\82È\82¢\81\r
15         */\r
16 \r
17         IO_Out8(PIC0_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83}\83X\83^\81j*/\r
18         IO_Out8(PIC1_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83X\83\8c\81[\83u\81j*/\r
19 \r
20         IO_Out8(PIC0_ICW1, 0x11);       /*\83G\83b\83W\83g\83\8a\83K\83\82\81[\83h\82É\90Ý\92è\81i\83}\83X\83^\81j*/\r
21         IO_Out8(PIC0_ICW2, 0x20);       /*\8a\84\82è\8d\9e\82Ý\94Ô\8d\86\82ð\81A20~27\82É\90Ý\92è\81B\81i\83}\83X\83^\81j*/\r
22         IO_Out8(PIC0_ICW3, 1 << 2);     /*00000100 \82Â\82Ü\82è\81A\83X\83\8c\81[\83u\82ÍIRQ2\82É\82Â\82È\82ª\82Á\82Ä\82Ü\82·\82æ\82Æ\82¢\82¤\82±\82Æ\81B*/\r
23         IO_Out8(PIC0_ICW4, 0x01);       /*\83m\83\93\83o\83b\83t\83@\83\82\81[\83h\81i\83}\83X\83^\81j*/\r
24 \r
25         IO_Out8(PIC1_ICW1, 0x11);       /*\83G\83b\83W\83g\83\8a\83K\83\82\81[\83h\82É\90Ý\92è\81i\83X\83\8c\81[\83u\81j*/\r
26         IO_Out8(PIC1_ICW2, 0x28);       /*\8a\84\82è\8d\9e\82Ý\94Ô\8d\86\82ð\81A28~2f\82É\90Ý\92è\81B\81i\83X\83\8c\81[\83u\81j*/\r
27         IO_Out8(PIC1_ICW3, 2);          /*\8e©\95ª\82Í\83}\83X\83^\82ÌIRQ2\94Ô\82É\82Â\82È\82ª\82Á\82Ä\82Ü\82·\82Æ\82¢\82¤\82±\82Æ\81B*/\r
28         IO_Out8(PIC1_ICW4, 0x01);       /*\83m\83\93\83o\83b\83t\83@\83\82\81[\83h\81i\83X\83\8c\81[\83u\81j*/\r
29 \r
30         IO_Out8(PIC0_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83}\83X\83^\81j*/\r
31         IO_Out8(PIC1_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83X\83\8c\81[\83u\81j*/\r
32 \r
33         System_GateDescriptor_Set(0x27, (uint)asm_InterruptHandler27, 0x02, AR_INTGATE32);      /*IRQ-07\91Î\8dô*/\r
34         ProgrammableInterruptController_InterruptMask_Clear(0x07);\r
35 \r
36         return;\r
37 }\r
38 \r
39 void ProgrammableInterruptController_InterruptMask_Clear(uint irq)\r
40 {\r
41         uint mask;\r
42 \r
43         mask = 1;\r
44 \r
45         if(irq >= 16){\r
46                 return;\r
47         }\r
48 \r
49         if(irq < 8){    /*For Master*/\r
50                 IO_Out8(PIC0_IMR, IO_In8(PIC0_IMR) & ~(mask << irq));\r
51         } else{ /*For Slave*/\r
52                 irq -= 8;\r
53                 IO_Out8(PIC1_IMR, IO_In8(PIC1_IMR) & ~(mask << irq));\r
54                 IO_Out8(PIC0_IMR, IO_In8(PIC0_IMR) & ~(mask << 2));\r
55         }\r
56 \r
57         return;\r
58 }\r
59 \r
60 void ProgrammableInterruptController_InterruptRequest_Complete(uint irq)\r
61 {\r
62         if(irq >= 16){\r
63                 return;\r
64         }\r
65 \r
66         if(irq < 8){    /*For Master*/\r
67                 IO_Out8(PIC0_OCW2, 0x60 + irq);\r
68         } else{ /*For Slave (and Master IRQ2)*/\r
69                 irq -= 8;\r
70                 IO_Out8(PIC1_OCW2, 0x60 + irq);\r
71                 IO_Out8(PIC0_OCW2, 0x60 + 0x02);\r
72         }\r
73         return;\r
74 }\r
75 \r
76 void InterruptHandler27(uint *esp)\r
77 {\r
78         ProgrammableInterruptController_InterruptRequest_Complete(0x07);\r
79         return;\r
80 }\r