OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / io.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/io.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/io.c
new file mode 100644 (file)
index 0000000..8639e9c
--- /dev/null
@@ -0,0 +1,107 @@
+\r
+#include "core.h"\r
+\r
+#define COM1_RX                0x03f8\r
+#define COM1_TX                0x03f8\r
+#define COM1_BAUD_LSB  0x03f8\r
+#define COM1_BAUD_MSB  0x03f9\r
+#define COM1_INTR_ENBL 0x03f9\r
+#define COM1_INTR_ID   0x03fa\r
+#define COM1_CTRL_FIFO 0x03fa\r
+#define COM1_CTRL_LINE 0x03fb\r
+#define COM1_CTRL_MODEM        0x03fc\r
+#define COM1_STA_LINE  0x03fd\r
+#define COM1_STA_MODEM 0x03fe\r
+\r
+void init_serial(void)\r
+{\r
+       io_out8(COM1_CTRL_LINE, 0x80);  //\83{\81[\83\8c\81[\83g\90Ý\92è\8aJ\8en\r
+       io_out8(COM1_BAUD_LSB, 0x06);   //0x06 = 19.2bps\r
+       io_out8(COM1_CTRL_LINE, 0x03);  //\83{\81[\83\8c\81[\83g\90Ý\92è\8fI\97¹\81A\91\97\8eó\90M\83f\81[\83^8bit\r
+       io_out8(COM1_CTRL_MODEM, 0x0b); //\8a\84\82è\8d\9e\82Ý\97L\8cø\81ARTS\81ADTR\83s\83\93\82ð\83A\83N\83e\83B\83u\89»\r
+//     io_out8(COM1_INTR_ENBL, 0x04);  //\83\89\83C\83\93\83X\83e\81[\83^\83X\8a\84\82è\8d\9e\82Ý\r
+       io_out8(COM1_INTR_ENBL, 0x00);\r
+\r
+       return;\r
+}\r
+\r
+void send_serial(uchar *s)\r
+{\r
+       for (; *s != 0x00; s++) {\r
+               io_out8(COM1_TX, *s);\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+uint readcmos(uchar addr)\r
+{\r
+       io_out8(0x70, addr);\r
+       return io_in8(0x71);\r
+}\r
+\r
+void readrtc(uchar *t)\r
+{\r
+       char err;\r
+       static uchar adr[7] = { 0x00, 0x02, 0x04, 0x07, 0x08, 0x09, 0x32 };\r
+       static uchar max[7] = { 0x60, 0x59, 0x23, 0x31, 0x12, 0x99, 0x99 };\r
+       int i;\r
+\r
+       for (;;) {\r
+               err = 0;\r
+               for (i = 0; i < 7; i++) {\r
+                       t[i] = readcmos(adr[i]);\r
+               }\r
+               for (i = 0; i < 7; i++) {\r
+                       if (t[i] != readcmos(adr[i]) || (t[i] & 0x0f) > 9 || t[i] > max[i]) {\r
+                               err = 1;\r
+                       }\r
+               }\r
+               if (err == 0) {\r
+                       return;\r
+               }\r
+       }\r
+}\r
+\r
+void fdc_motor_on(uchar d)\r
+{\r
+       if(d == 0){\r
+               io_out8(0x3f2,io_in8(0x3f2) | 0x10);\r
+       } else if(d == 1){\r
+               io_out8(0x3f2,io_in8(0x3f2) | 0x20);\r
+       } else if(d == 2){\r
+               io_out8(0x3f2,io_in8(0x3f2) | 0x40);\r
+       } else if(d == 3){\r
+               io_out8(0x3f2,io_in8(0x3f2) | 0x80);\r
+       } \r
+       return;\r
+}\r
+\r
+void fdc_motor_off(uchar d)\r
+{\r
+       if(d == 0){\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0xef);\r
+       } else if(d == 1){\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0xdf);\r
+       } else if(d == 2){\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0xbf);\r
+       } else if(d == 3){\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0x7f);\r
+       } else if(d == 4){\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0xef);\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0xdf);\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0xbf);\r
+               io_out8(0x3f2,io_in8(0x3f2) & 0x7f);\r
+       }\r
+       return;\r
+}\r
+\r
+void reset_cpu(void)\r
+{\r
+    wait_KBC_sendready();\r
+    io_out8(PORT_KEYCMD, 0xfe);\r
+    for (;;) { io_hlt(); }\r
+}\r
+\r
+\r
+\r