OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / intrpt.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/intrpt.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/intrpt.c
new file mode 100644 (file)
index 0000000..693d76d
--- /dev/null
@@ -0,0 +1,80 @@
+\r
+#include "core.h"\r
+\r
+void Initialize_ProgrammableInterruptController(void)\r
+{\r
+       /*\r
+       IRR\81F\83C\83\93\83^\83\89\83v\83g\83\8a\83N\83G\83X\83g\83\8c\83W\83X\83\r
+               .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
+               .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
+       ISR\81F\83C\83\93\83T\81[\83r\83X\83\8c\83W\83X\83\r
+               .\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
+               .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
+       IMR\81F\83C\83\93\83^\83\89\83v\83g\83}\83X\83N\83\8c\83W\83X\83\r
+               .\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
+       */\r
+\r
+       IO_Out8(PIC0_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83}\83X\83^\81j*/\r
+       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
+\r
+       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
+       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
+       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
+       IO_Out8(PIC0_ICW4, 0x01);       /*\83m\83\93\83o\83b\83t\83@\83\82\81[\83h\81i\83}\83X\83^\81j*/\r
+\r
+       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
+       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
+       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
+       IO_Out8(PIC1_ICW4, 0x01);       /*\83m\83\93\83o\83b\83t\83@\83\82\81[\83h\81i\83X\83\8c\81[\83u\81j*/\r
+\r
+       IO_Out8(PIC0_IMR, 0xff);        /*\8a\84\82è\8d\9e\82Ý\91S\95\94\96³\8e\8b\81i\83}\83X\83^\81j*/\r
+       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
+\r
+       System_GateDescriptor_Set(0x27, (uint)asm_InterruptHandler27, 0x02, AR_INTGATE32);      /*IRQ-07\91Î\8dô*/\r
+       ProgrammableInterruptController_InterruptMask_Clear(0x07);\r
+\r
+       return;\r
+}\r
+\r
+void ProgrammableInterruptController_InterruptMask_Clear(uint irq)\r
+{\r
+       uint mask;\r
+\r
+       mask = 1;\r
+\r
+       if(irq >= 16){\r
+               return;\r
+       }\r
+\r
+       if(irq < 8){    /*For Master*/\r
+               IO_Out8(PIC0_IMR, IO_In8(PIC0_IMR) & ~(mask << irq));\r
+       } else{ /*For Slave*/\r
+               irq -= 8;\r
+               IO_Out8(PIC1_IMR, IO_In8(PIC1_IMR) & ~(mask << irq));\r
+               IO_Out8(PIC0_IMR, IO_In8(PIC0_IMR) & ~(mask << 2));\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void ProgrammableInterruptController_InterruptRequest_Complete(uint irq)\r
+{\r
+       if(irq >= 16){\r
+               return;\r
+       }\r
+\r
+       if(irq < 8){    /*For Master*/\r
+               IO_Out8(PIC0_OCW2, 0x60 + irq);\r
+       } else{ /*For Slave (and Master IRQ2)*/\r
+               irq -= 8;\r
+               IO_Out8(PIC1_OCW2, 0x60 + irq);\r
+               IO_Out8(PIC0_OCW2, 0x60 + 0x02);\r
+       }\r
+       return;\r
+}\r
+\r
+void InterruptHandler27(uint *esp)\r
+{\r
+       ProgrammableInterruptController_InterruptRequest_Complete(0x07);\r
+       return;\r
+}\r