COMPLETE.TXT
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:2624k
源码类别:

操作系统开发

开发平台:

WINDOWS

  1. 34582         shl     bx,cl           ! source segment
  2. 34583 #endif
  3. 34584         mov     ds,bx
  4. 34585
  5. 34586         stos                    ! copy process number of sender to dest message
  6. 34587         add si,*2               ! do not copy first word
  7. 34588         mov cx,*Msize-1         ! remember, first word does not count
  8. 34589         rep                     ! iterate cx times to copy 11 words
  9. 34590         movs                    ! copy the message
  10. 34591         pop di                  ! restore di
  11. 34592         pop si                  ! restore si
  12. 34593         pop ds                  ! restore ds
  13. 34594         pop es                  ! restore es
  14. 34595         ret                     ! that is all folks!
  15. 34596
  16. 34597
  17. 34598 !*===========================================================================*
  18. 34599 !*                              exit                                         *
  19. 34600 !*===========================================================================*
  20. 34601 ! PUBLIC void exit();
  21. 34602 ! Some library routines use exit, so provide a dummy version.
  22. 34603 ! Actual calls to exit cannot occur in the kernel.
  23. 34604 ! Same for .fat & .trp.
  24. 34605
  25. 34606 _exit:
  26. 34607 __exit:
  27. 34608 ___exit:
  28. 34609 .fat:
  29. 34610 .trp:
  30. 34611         sti
  31. 34612         jmp __exit
  32. 34613
  33. 34614
  34. 34615 !*===========================================================================*
  35. 34616 !*                              in_byte                                      *
  36. 34617 !*===========================================================================*
  37. 34618 ! PUBLIC unsigned in_byte(port_t port);
  38. 34619 ! Read an (unsigned) byte from the i/o port  port  and return it.
  39. 34620
  40. 34621 _in_byte:
  41. 34622         pop     bx
  42. 34623         pop     dx              ! port
  43. 34624         dec     sp
  44. 34625         dec     sp
  45. 34626         inb                     ! input 1 byte
  46. 34627         subb    ah,ah           ! unsign extend
  47. 34628         jmp     (bx)
  48. 34629
  49. 34630
  50. 34631 !*===========================================================================*
  51. 34632 !*                              in_word                                      *
  52. 34633 !*===========================================================================*
  53. 34634 ! PUBLIC unsigned short in_word(port_t port);
  54. 34635 ! Read an (unsigned) word from the i/o port and return it.
  55. 34636
  56. 34637 _in_word:
  57. 34638         pop     bx
  58. 34639         pop     dx              ! port
  59. 34640         dec     sp
  60. 34641         dec     sp              ! added to new klib.s 3/21/91 d.e.c.
  61. 34642         inw                     ! input 1 word no sign extend needed
  62. 34643         jmp     (bx)
  63. 34644
  64. 34645
  65. 34646 !*===========================================================================*
  66. 34647 !*                              out_byte                                     *
  67. 34648 !*===========================================================================*
  68. 34649 ! PUBLIC void out_byte(port_t port, int value);
  69. 34650 ! Write  value  (cast to a byte)  to the I/O port  port.
  70. 34651
  71. 34652 _out_byte:
  72. 34653         pop     bx
  73. 34654         pop     dx              ! port
  74. 34655         pop     ax              ! value
  75. 34656         sub     sp,#2+2
  76. 34657         outb                    ! output 1 byte
  77. 34658         jmp     (bx)
  78. 34659
  79. 34660
  80. 34661 !*===========================================================================*
  81. 34662 !*                              out_word                                     *
  82. 34663 !*===========================================================================*
  83. 34664 ! PUBLIC void out_word(port_t port, int value);
  84. 34665 ! Write  value  (cast to a word)  to the I/O port  port.
  85. 34666
  86. 34667 _out_word:
  87. 34668         pop     bx
  88. 34669         pop     dx              ! port
  89. 34670         pop     ax              ! value
  90. 34671         sub     sp,#2+2
  91. 34672         outw                    ! output 1 word
  92. 34673         jmp     (bx)
  93. 34674
  94. 34675
  95. 34676 !*===========================================================================*
  96. 34677 !*                              port_read                                    *
  97. 34678 !*===========================================================================*
  98. 34679 ! PUBLIC void port_read(port_t port, phys_bytes destination,unsigned bytcount);
  99. 34680 ! Transfer data from (hard disk controller) port to memory.
  100. 34681
  101. 34682 _port_read:
  102. 34683         push    bp
  103. 34684         mov     bp,sp
  104. 34685         push    di
  105. 34686         push    es
  106. 34687
  107. 34688         call    portio_setup
  108. 34689         shr     cx,#1           ! count in words
  109. 34690         mov     di,bx           ! di = destination offset
  110. 34691         mov     es,ax           ! es = destination segment
  111. 34692         rep
  112. 34693         ins
  113. 34694
  114. 34695         pop     es
  115. 34696         pop     di
  116. 34697         pop     bp
  117. 34698         ret
  118. 34699
  119. 34700 portio_setup:
  120. 34701         mov     ax,4+2(bp)      ! source/destination address in dx:ax
  121. 34702         mov     dx,4+2+2(bp)
  122. 34703         mov     bx,ax
  123. 34704         and     bx,#OFF_MASK    ! bx = offset = address % 16
  124. 34705         andb    dl,#HCHIGH_MASK ! ax = segment = address / 16 % 0x10000
  125. 34706         andb    al,#HCLOW_MASK
  126. 34707         orb     al,dl
  127. 34708         movb    cl,#HCLICK_SHIFT
  128. 34709         ror     ax,cl
  129. 34710         mov     cx,4+2+4(bp)    ! count in bytes
  130. 34711         mov     dx,4(bp)        ! port to read from
  131. 34712         cld                     ! direction is UP
  132. 34713         ret
  133. 34714
  134. 34715
  135. 34716 !*===========================================================================*
  136. 34717 !*                              port_read_byte                               *
  137. 34718 !*===========================================================================*
  138. 34719 ! PUBLIC void port_read_byte(port_t port, phys_bytes destination,
  139. 34720 !                                                       unsigned bytcount);
  140. 34721 ! Transfer data port to memory.
  141. 34722
  142. 34723 _port_read_byte:
  143. 34724         push    bp
  144. 34725         mov     bp,sp
  145. 34726         push    di
  146. 34727         push    es
  147. 34728
  148. 34729         call    portio_setup
  149. 34730         mov     di,bx           ! di = destination offset
  150. 34731         mov     es,ax           ! es = destination segment
  151. 34732         rep
  152. 34733         insb
  153. 34734
  154. 34735         pop     es
  155. 34736         pop     di
  156. 34737         pop     bp
  157. 34738         ret
  158. 34739
  159. 34740
  160. 34741 !*===========================================================================*
  161. 34742 !*                              port_write                                   *
  162. 34743 !*===========================================================================*
  163. 34744 ! PUBLIC void port_write(port_t port, phys_bytes source, unsigned bytcount);
  164. 34745 ! Transfer data from memory to (hard disk controller) port.
  165. 34746
  166. 34747 _port_write:
  167. 34748         push    bp
  168. 34749         mov     bp,sp
  169. 34750         push    si
  170. 34751         push    ds
  171. 34752
  172. 34753         call    portio_setup
  173. 34754         shr     cx,#1           ! count in words
  174. 34755         mov     si,bx           ! si = source offset
  175. 34756         mov     ds,ax           ! ds = source segment
  176. 34757         rep
  177. 34758         outs
  178. 34759
  179. 34760         pop     ds
  180. 34761         pop     si
  181. 34762         pop     bp
  182. 34763         ret
  183. 34764
  184. 34765
  185. 34766 !*===========================================================================*
  186. 34767 !*                              port_write_byte                              *
  187. 34768 !*===========================================================================*
  188. 34769 ! PUBLIC void port_write_byte(port_t port, phys_bytes source,
  189. 34770 !                                                       unsigned bytcount);
  190. 34771 ! Transfer data from memory to port.
  191. 34772
  192. 34773 _port_write_byte:
  193. 34774         push    bp
  194. 34775         mov     bp,sp
  195. 34776         push    si
  196. 34777         push    ds
  197. 34778
  198. 34779         call    portio_setup
  199. 34780         mov     si,bx           ! si = source offset
  200. 34781         mov     ds,ax           ! ds = source segment
  201. 34782         rep
  202. 34783         outsb
  203. 34784
  204. 34785         pop     ds
  205. 34786         pop     si
  206. 34787         pop     bp
  207. 34788         ret
  208. 34789
  209. 34790
  210. 34791 !*===========================================================================*
  211. 34792 !*                              lock                                         *
  212. 34793 !*===========================================================================*
  213. 34794 ! PUBLIC void lock();
  214. 34795 ! Disable CPU interrupts.
  215. 34796
  216. 34797 _lock:
  217. 34798         cli                             ! disable interrupts
  218. 34799         ret
  219. 34800
  220. 34801
  221. 34802 !*===========================================================================*
  222. 34803 !*                              unlock                                       *
  223. 34804 !*===========================================================================*
  224. 34805 ! PUBLIC void unlock();
  225. 34806 ! Enable CPU interrupts.
  226. 34807
  227. 34808 _unlock:
  228. 34809         sti
  229. 34810         ret
  230. 34811
  231. 34812
  232. 34813 !*==========================================================================*
  233. 34814 !*                              enable_irq                                  *
  234. 34815 !*==========================================================================*/
  235. 34816 ! PUBLIC void enable_irq(unsigned irq)
  236. 34817 ! Enable an interrupt request line by clearing an 8259 bit.
  237. 34818 ! Equivalent code for irq < 8:
  238. 34819 !       out_byte(INT_CTLMASK, in_byte(INT_CTLMASK) & ~(1 << irq));
  239. 34820
  240. 34821 _enable_irq:
  241. 34822         mov     bx, sp
  242. 34823         mov     cx, 2(bx)               ! irq
  243. 34824         pushf
  244. 34825         cli
  245. 34826         movb    ah, #~1
  246. 34827         rolb    ah, cl                  ! ah = ~(1 << (irq % 8))
  247. 34828         cmpb    cl, #8
  248. 34829         jae     enable_8                ! enable irq >= 8 at the slave 8259
  249. 34830 enable_0:
  250. 34831         inb     INT_CTLMASK
  251. 34832         andb    al, ah
  252. 34833         outb    INT_CTLMASK             ! clear bit at master 8259
  253. 34834         popf
  254. 34835         ret
  255. 34836 enable_8:
  256. 34837         inb     INT2_CTLMASK
  257. 34838         andb    al, ah
  258. 34839         outb    INT2_CTLMASK            ! clear bit at slave 8259
  259. 34840         popf
  260. 34841         ret
  261. 34842
  262. 34843
  263. 34844 !*==========================================================================*
  264. 34845 !*                              disable_irq                                 *
  265. 34846 !*==========================================================================*/
  266. 34847 ! PUBLIC int disable_irq(unsigned irq)
  267. 34848 ! Disable an interrupt request line by setting an 8259 bit.
  268. 34849 ! Equivalent code for irq < 8:
  269. 34850 !       out_byte(INT_CTLMASK, in_byte(INT_CTLMASK) | (1 << irq));
  270. 34851 ! Returns true iff the interrupt was not already disabled.
  271. 34852
  272. 34853 _disable_irq:
  273. 34854         mov     bx, sp
  274. 34855         mov     cx, 2(bx)               ! irq
  275. 34856         pushf
  276. 34857         cli
  277. 34858         movb    ah, #1
  278. 34859         rolb    ah, cl                  ! ah = (1 << (irq % 8))
  279. 34860         cmpb    cl, #8
  280. 34861         jae     disable_8               ! disable irq >= 8 at the slave 8259
  281. 34862 disable_0:
  282. 34863         inb     INT_CTLMASK
  283. 34864         testb   al, ah
  284. 34865         jnz     dis_already             ! already disabled?
  285. 34866         orb     al, ah
  286. 34867         outb    INT_CTLMASK             ! set bit at master 8259
  287. 34868         popf
  288. 34869         mov     ax, #1                  ! disabled by this function
  289. 34870         ret
  290. 34871 disable_8:
  291. 34872         inb     INT2_CTLMASK
  292. 34873         testb   al, ah
  293. 34874         jnz     dis_already             ! already disabled?
  294. 34875         orb     al, ah
  295. 34876         outb    INT2_CTLMASK            ! set bit at slave 8259
  296. 34877         popf
  297. 34878         mov     ax, #1                  ! disabled by this function
  298. 34879         ret
  299. 34880 dis_already:
  300. 34881         popf
  301. 34882         xor     ax, ax                  ! already disabled
  302. 34883         ret
  303. 34884
  304. 34885
  305. 34886 !*===========================================================================*
  306. 34887 !*                              phys_copy                                    *
  307. 34888 !*===========================================================================*
  308. 34889 ! PUBLIC void phys_copy(phys_bytes source, phys_bytes destination,
  309. 34890 !                       phys_bytes bytecount);
  310. 34891 ! Copy a block of physical memory.
  311. 34892
  312. 34893 SRCLO   =       4
  313. 34894 SRCHI   =       6
  314. 34895 DESTLO  =       8
  315. 34896 DESTHI  =       10
  316. 34897 COUNTLO =       12
  317. 34898 COUNTHI =       14
  318. 34899
  319. 34900 _phys_copy:
  320. 34901         push    bp              ! save only registers required by C
  321. 34902         mov     bp,sp           ! set bp to point to source arg less 4
  322. 34903
  323. 34904         push    si              ! save si
  324. 34905         push    di              ! save di
  325. 34906         push    ds              ! save ds
  326. 34907         push    es              ! save es
  327. 34908
  328. 34909         mov     ax,SRCLO(bp)    ! dx:ax = source address (dx is NOT segment)
  329. 34910         mov     dx,SRCHI(bp)
  330. 34911         mov     si,ax           ! si = source offset = address % 16
  331. 34912         and     si,#OFF_MASK
  332. 34913         andb    dl,#HCHIGH_MASK ! ds = source segment = address / 16 % 0x10000
  333. 34914         andb    al,#HCLOW_MASK
  334. 34915         orb     al,dl           ! now bottom 4 bits of dx are in ax
  335. 34916         movb    cl,#HCLICK_SHIFT ! rotate them to the top 4
  336. 34917         ror     ax,cl
  337. 34918         mov     ds,ax
  338. 34919
  339. 34920         mov     ax,DESTLO(bp)   ! dx:ax = destination addr (dx is NOT segment)
  340. 34921         mov     dx,DESTHI(bp)
  341. 34922         mov     di,ax           ! di = dest offset = address % 16
  342. 34923         and     di,#OFF_MASK
  343. 34924         andb    dl,#HCHIGH_MASK ! es = dest segment = address / 16 % 0x10000
  344. 34925         andb    al,#HCLOW_MASK
  345. 34926         orb     al,dl
  346. 34927         ror     ax,cl
  347. 34928         mov     es,ax
  348. 34929
  349. 34930         mov     ax,COUNTLO(bp)  ! dx:ax = remaining count
  350. 34931         mov     dx,COUNTHI(bp)
  351. 34932
  352. 34933 ! copy upwards (cannot handle overlapped copy)
  353. 34934
  354. 34935 pc_loop:
  355. 34936         mov     cx,ax           ! provisional count for this iteration
  356. 34937         test    ax,ax           ! if count >= 0x8000, only do 0x8000 per iter
  357. 34938         js      pc_bigcount     ! low byte already >= 0x8000
  358. 34939         test    dx,dx
  359. 34940         jz      pc_upcount      ! less than 0x8000
  360. 34941 pc_bigcount:
  361. 34942         mov     cx,#0x8000      ! use maximum count per iteration
  362. 34943 pc_upcount:
  363. 34944         sub     ax,cx           ! update count
  364. 34945         sbb     dx,#0           ! cannot underflow, so carry clear now for rcr
  365. 34946         rcr     cx,#1           ! count in words, carry remembers if byte
  366. 34947         jnb     pc_even         ! no odd byte
  367. 34948         movb                    ! copy odd byte
  368. 34949 pc_even:
  369. 34950         rep                     ! copy 1 word at a time
  370. 34951         movs                    ! word copy
  371. 34952
  372. 34953         mov     cx,ax           ! test if remaining count is 0
  373. 34954         or      cx,dx
  374. 34955         jnz     pc_more         ! more to do
  375. 34956
  376. 34957         pop     es              ! restore es
  377. 34958         pop     ds              ! restore ds
  378. 34959         pop     di              ! restore di
  379. 34960         pop     si              ! restore si
  380. 34961         pop     bp              ! restore bp
  381. 34962         ret                     ! return to caller
  382. 34963
  383. 34964 pc_more:
  384. 34965         sub     si,#0x8000      ! adjust pointers so the offset does not
  385. 34966         mov     cx,ds           ! overflow in the next 0x8000 bytes
  386. 34967         add     cx,#0x800       ! pointers end up same physical location
  387. 34968         mov     ds,cx           ! the current offsets are known >= 0x8000
  388. 34969         sub     di,#0x8000      ! since we just copied that many
  389. 34970         mov     cx,es
  390. 34971         add     cx,#0x800
  391. 34972         mov     es,cx
  392. 34973         jmp     pc_loop         ! start next iteration
  393. 34974
  394. 34975
  395. 34976 !*===========================================================================*
  396. 34977 !*                              mem_rdw                                      *
  397. 34978 !*===========================================================================*
  398. 34979 ! PUBLIC u16_t mem_rdw(u16_t segment, u16_t *offset);
  399. 34980 ! Load and return the word at the far pointer  segment:offset.
  400. 34981
  401. 34982 _mem_rdw:
  402. 34983         mov     cx,ds           ! save ds
  403. 34984         pop     dx              ! return adr
  404. 34985         pop     ds              ! segment
  405. 34986         pop     bx              ! offset
  406. 34987         sub     sp,#2+2         ! adjust for parameters popped
  407. 34988         mov     ax,(bx)         ! load the word to return
  408. 34989         mov     ds,cx           ! restore ds
  409. 34990         jmp     (dx)            ! return
  410. 34991
  411. 34992
  412. 34993 !*===========================================================================*
  413. 34994 !*                              reset                                        *
  414. 34995 !*===========================================================================*
  415. 34996 ! PUBLIC void reset();
  416. 34997 ! Reset the system.
  417. 34998 ! In real mode we simply jump to the reset address.
  418. 34999
  419. 35000 _reset:
  420. 35001         jmpf    0,0xFFFF
  421. 35002
  422. 35003
  423. 35004 !*===========================================================================*
  424. 35005 !*                              mem_vid_copy                                 *
  425. 35006 !*===========================================================================*
  426. 35007 ! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count);
  427. 35008 !
  428. 35009 ! Copy count characters from kernel memory to video memory.  Src, dst and
  429. 35010 ! count are character (word) based video offsets and counts.  If src is null
  430. 35011 ! then screen memory is blanked by filling it with blank_color.
  431. 35012
  432. 35013 MVC_ARGS        =       2 + 2 + 2 + 2   ! 2 + 2 + 2
  433. 35014 !                       es  di  si  ip   src dst ct
  434. 35015
  435. 35016 _mem_vid_copy:
  436. 35017         push    si
  437. 35018         push    di
  438. 35019         push    es
  439. 35020         mov     bx, sp
  440. 35021         mov     si, MVC_ARGS(bx)        ! source
  441. 35022         mov     di, MVC_ARGS+2(bx)      ! destination
  442. 35023         mov     dx, MVC_ARGS+2+2(bx)    ! count
  443. 35024         mov     es, _vid_seg            ! destination is video segment
  444. 35025         cld                             ! make sure direction is up
  445. 35026 mvc_loop:
  446. 35027         and     di, _vid_mask           ! wrap address
  447. 35028         mov     cx, dx                  ! one chunk to copy
  448. 35029         mov     ax, _vid_size
  449. 35030         sub     ax, di
  450. 35031         cmp     cx, ax
  451. 35032         jbe     0f
  452. 35033         mov     cx, ax                  ! cx = min(cx, vid_size - di)
  453. 35034 0:      sub     dx, cx                  ! count -= cx
  454. 35035         shl     di, #1                  ! byte address
  455. 35036         test    si, si                  ! source == 0 means blank the screen
  456. 35037         jz      mvc_blank
  457. 35038 mvc_copy:
  458. 35039         rep                             ! copy words to video memory
  459. 35040         movs
  460. 35041         jmp     mvc_test
  461. 35042 mvc_blank:
  462. 35043         mov     ax, _blank_color        ! ax = blanking character
  463. 35044         rep
  464. 35045         stos                            ! copy blanks to video memory
  465. 35046         !jmp    mvc_test
  466. 35047 mvc_test:
  467. 35048         shr     di, #1                  ! word addresses
  468. 35049         test    dx, dx
  469. 35050         jnz     mvc_loop
  470. 35051 mvc_done:
  471. 35052         pop     es
  472. 35053         pop     di
  473. 35054         pop     si
  474. 35055         ret
  475. 35056
  476. 35057
  477. 35058 !*===========================================================================*
  478. 35059 !*                              vid_vid_copy                                 *
  479. 35060 !*===========================================================================*
  480. 35061 ! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count);
  481. 35062 !
  482. 35063 ! Copy count characters from video memory to video memory.  Handle overlap.
  483. 35064 ! Used for scrolling, line or character insertion and deletion.  Src, dst
  484. 35065 ! and count are character (word) based video offsets and counts.
  485. 35066
  486. 35067 VVC_ARGS        =       2 + 2 + 2 + 2   ! 2 + 2 + 2
  487. 35068 !                       es  di  si  ip   src dst ct
  488. 35069
  489. 35070 _vid_vid_copy:
  490. 35071         push    si
  491. 35072         push    di
  492. 35073         push    es
  493. 35074         mov     bx, sp
  494. 35075         mov     si, VVC_ARGS(bx)        ! source
  495. 35076         mov     di, VVC_ARGS+2(bx)      ! destination
  496. 35077         mov     dx, VVC_ARGS+2+2(bx)    ! count
  497. 35078         mov     es, _vid_seg            ! use video segment
  498. 35079         cmp     si, di                  ! copy up or down?
  499. 35080         jb      vvc_down
  500. 35081 vvc_up:
  501. 35082         cld                             ! direction is up
  502. 35083 vvc_uploop:
  503. 35084         and     si, _vid_mask           ! wrap addresses
  504. 35085         and     di, _vid_mask
  505. 35086         mov     cx, dx                  ! one chunk to copy
  506. 35087         mov     ax, _vid_size
  507. 35088         sub     ax, si
  508. 35089         cmp     cx, ax
  509. 35090         jbe     0f
  510. 35091         mov     cx, ax                  ! cx = min(cx, vid_size - si)
  511. 35092 0:      mov     ax, _vid_size
  512. 35093         sub     ax, di
  513. 35094         cmp     cx, ax
  514. 35095         jbe     0f
  515. 35096         mov     cx, ax                  ! cx = min(cx, vid_size - di)
  516. 35097 0:      sub     dx, cx                  ! count -= cx
  517. 35098         shl     si, #1
  518. 35099         shl     di, #1                  ! byte addresses
  519. 35100         rep
  520. 35101    eseg movs                            ! copy video words
  521. 35102         shr     si, #1
  522. 35103         shr     di, #1                  ! word addresses
  523. 35104         test    dx, dx
  524. 35105         jnz     vvc_uploop              ! again?
  525. 35106         jmp     vvc_done
  526. 35107 vvc_down:
  527. 35108         std                             ! direction is down
  528. 35109         add     si, dx                  ! start copying at the top
  529. 35110         dec     si
  530. 35111         add     di, dx
  531. 35112         dec     di
  532. 35113 vvc_downloop:
  533. 35114         and     si, _vid_mask           ! wrap addresses
  534. 35115         and     di, _vid_mask
  535. 35116         mov     cx, dx                  ! one chunk to copy
  536. 35117         lea     ax, 1(si)
  537. 35118         cmp     cx, ax
  538. 35119         jbe     0f
  539. 35120         mov     cx, ax                  ! cx = min(cx, si + 1)
  540. 35121 0:      lea     ax, 1(di)
  541. 35122         cmp     cx, ax
  542. 35123         jbe     0f
  543. 35124         mov     cx, ax                  ! cx = min(cx, di + 1)
  544. 35125 0:      sub     dx, cx                  ! count -= cx
  545. 35126         shl     si, #1
  546. 35127         shl     di, #1                  ! byte addresses
  547. 35128         rep
  548. 35129    eseg movs                            ! copy video words
  549. 35130         shr     si, #1
  550. 35131         shr     di, #1                  ! word addresses
  551. 35132         test    dx, dx
  552. 35133         jnz     vvc_downloop            ! again?
  553. 35134         cld                             ! C compiler expect up
  554. 35135         !jmp    vvc_done
  555. 35136 vvc_done:
  556. 35137         pop     es
  557. 35138         pop     di
  558. 35139         pop     si
  559. 35140         ret
  560. 35141
  561. 35142
  562. 35143 !*===========================================================================*
  563. 35144 !*                            level0                                         *
  564. 35145 !*===========================================================================*
  565. 35146 ! PUBLIC void level0(void (*func)(void))
  566. 35147 ! Not very interesting in real mode, see p_level0.
  567. 35148 !
  568. 35149 _level0:
  569. 35150         mov     bx, sp
  570. 35151         jmp     @2(bx)
  571. 35152
  572. 35153
  573. 35154 !*===========================================================================*
  574. 35155 !*                              klib_init_prot                               *
  575. 35156 !*===========================================================================*
  576. 35157 ! PUBLIC void klib_init_prot();
  577. 35158 ! Initialize klib for protected mode by patching some real mode functions
  578. 35159 ! at their starts to jump to their protected mode equivalents, according to
  579. 35160 ! the patch table.  Saves a lot of tests on the "protected_mode" variable.
  580. 35161 ! Note that this function must be run in real mode, for it writes the code
  581. 35162 ! segment.  (One otherwise has to set up a descriptor, etc, etc.)
  582. 35163
  583. 35164 klib_init_prot:
  584. 35165         mov     si,#patch_table
  585. 35166 kip_next:
  586. 35167         lods                    ! original function
  587. 35168         mov     bx,ax
  588. 35169   cseg  movb    (bx),#JMP_OPCODE ! overwrite start of function by a long jump
  589. 35170         lods                    ! new function - target of jump
  590. 35171         sub     ax,bx           ! relative jump
  591. 35172         sub     ax,#3           ! adjust by length of jump instruction
  592. 35173   cseg  mov     1(bx),ax        ! set address
  593. 35174         cmp     si,#end_patch_table ! end of table?
  594. 35175         jb      kip_next
  595. 35176 kip_done:
  596. 35177         ret
  597. 35178
  598. 35179
  599. 35180 !*===========================================================================*
  600. 35181 !*                      variants for protected mode                          *
  601. 35182 !*===========================================================================*
  602. 35183 ! Some routines are different in protected mode.
  603. 35184 ! The only essential difference is the handling of segment registers.
  604. 35185 ! One complication is that the method of building segment descriptors is not
  605. 35186 ! reentrant, so the protected mode versions must not be called by interrupt
  606. 35187 ! handlers.
  607. 35188
  608. 35189
  609. 35190 !*===========================================================================*
  610. 35191 !*                              p_cp_mess                                    *
  611. 35192 !*===========================================================================*
  612. 35193 ! The real mode version attempts to be efficient by passing raw segments but
  613. 35194 ! that just gets in the way here.
  614. 35195
  615. 35196 p_cp_mess:
  616. 35197         cld
  617. 35198         pop     dx
  618. 35199         pop     bx              ! proc
  619. 35200         pop     cx              ! source clicks
  620. 35201         pop     ax              ! source offset
  621. 35202 #if CLICK_SHIFT != HCLICK_SHIFT + 4
  622. 35203 #error /* the only click size supported is 256, to avoid slow shifts here */
  623. 35204 #endif
  624. 35205         addb    ah,cl           ! calculate source offset
  625. 35206         adcb    ch,#0           ! and put in base of source descriptor
  626. 35207         mov     _gdt+DS_286_OFFSET+DESC_BASE,ax
  627. 35208         movb    _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE,ch
  628. 35209         pop     cx              ! destination clicks
  629. 35210         pop     ax              ! destination offset
  630. 35211         addb    ah,cl           ! calculate destination offset
  631. 35212         adcb    ch,#0           ! and put in base of destination descriptor
  632. 35213         mov     _gdt+ES_286_OFFSET+DESC_BASE,ax
  633. 35214         movb    _gdt+ES_286_OFFSET+DESC_BASE_MIDDLE,ch
  634. 35215         sub     sp,#2+2+2+2+2
  635. 35216
  636. 35217         push    ds
  637. 35218         push    es
  638. 35219         mov     ax,#DS_286_SELECTOR
  639. 35220         mov     ds,ax
  640. 35221         mov     ax,#ES_286_SELECTOR
  641. 35222         mov     es,ax
  642. 35223
  643. 35224   eseg  mov     0,bx            ! proc no. of sender from arg, not msg
  644. 35225         mov     ax,si
  645. 35226         mov     bx,di
  646. 35227         mov     si,#2           ! src offset is now 2 relative to start of seg
  647. 35228         mov     di,si           ! and destination offset
  648. 35229         mov     cx,#Msize-1     ! word count
  649. 35230         rep
  650. 35231         movs
  651. 35232         mov     di,bx
  652. 35233         mov     si,ax
  653. 35234         pop     es
  654. 35235         pop     ds
  655. 35236         jmp     (dx)
  656. 35237
  657. 35238
  658. 35239 !*===========================================================================*
  659. 35240 !*                              p_portio_setup                               *
  660. 35241 !*===========================================================================*
  661. 35242 ! The port_read, port_write, etc. functions need a setup routine that uses
  662. 35243 ! a segment descriptor.
  663. 35244 p_portio_setup:
  664. 35245         mov     ax,4+2(bp)      ! source/destination address in dx:ax
  665. 35246         mov     dx,4+2+2(bp)
  666. 35247         mov     _gdt+DS_286_OFFSET+DESC_BASE,ax
  667. 35248         movb    _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE,dl
  668. 35249         xor     bx,bx           ! bx = 0 = start of segment
  669. 35250         mov     ax,#DS_286_SELECTOR ! ax = segment selector
  670. 35251         mov     cx,4+2+4(bp)    ! count in bytes
  671. 35252         mov     dx,4(bp)        ! port to read from
  672. 35253         cld                     ! direction is UP
  673. 35254         ret
  674. 35255
  675. 35256
  676. 35257 !*===========================================================================*
  677. 35258 !*                              p_phys_copy                                  *
  678. 35259 !*===========================================================================*
  679. 35260 p_phys_copy:
  680. 35261         cld
  681. 35262         pop     dx
  682. 35263         pop     _gdt+DS_286_OFFSET+DESC_BASE
  683. 35264         pop     ax              ! pop source into base of source descriptor
  684. 35265         movb    _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE,al
  685. 35266         pop     _gdt+ES_286_OFFSET+DESC_BASE
  686. 35267         pop     ax              ! pop destination into base of dst descriptor
  687. 35268         movb    _gdt+ES_286_OFFSET+DESC_BASE_MIDDLE,al
  688. 35269         pop     cx              ! byte count in bx:cx
  689. 35270         pop     bx
  690. 35271         sub     sp,#4+4+4
  691. 35272
  692. 35273         push    di
  693. 35274         push    si
  694. 35275         push    es
  695. 35276         push    ds
  696. 35277         sub     si,si           ! src offset is now 0 relative to start of seg
  697. 35278         mov     di,si           ! and destination offset
  698. 35279         jmp     ppc_next
  699. 35280
  700. 35281 ! It is too much trouble to align the segment bases, so word alignment is hard.
  701. 35282 ! Avoiding the book-keeping for alignment may be good anyway.
  702. 35283
  703. 35284 ppc_large:
  704. 35285         push    cx
  705. 35286         mov     cx,#0x8000      ! copy a large chunk of this many words
  706. 35287         rep
  707. 35288         movs
  708. 35289         pop     cx
  709. 35290         dec     bx
  710. 35291         pop     ds              ! update the descriptors
  711. 35292         incb    _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE
  712. 35293         incb    _gdt+ES_286_OFFSET+DESC_BASE_MIDDLE
  713. 35294         push    ds
  714. 35295 ppc_next:
  715. 35296         mov     ax,#DS_286_SELECTOR     ! (re)load the selectors
  716. 35297         mov     ds,ax
  717. 35298         mov     ax,#ES_286_SELECTOR
  718. 35299         mov     es,ax
  719. 35300         test    bx,bx
  720. 35301         jnz     ppc_large
  721. 35302
  722. 35303         shr     cx,#1           ! word count
  723. 35304         rep
  724. 35305         movs                    ! move any leftover words
  725. 35306         rcl     cx,#1           ! restore old bit 0
  726. 35307         rep
  727. 35308         movb                    ! move any leftover byte
  728. 35309         pop     ds
  729. 35310         pop     es
  730. 35311         pop     si
  731. 35312         pop     di
  732. 35313         jmp     (dx)
  733. 35314
  734. 35315 !*===========================================================================*
  735. 35316 !*                              p_reset                                      *
  736. 35317 !*===========================================================================*
  737. 35318 ! Reset the system by loading IDT with offset 0 and interrupting.
  738. 35319
  739. 35320 p_reset:
  740. 35321         lidt    idt_zero
  741. 35322         int     3               ! anything goes, the 286 will not like it
  742. 35323
  743. 35324
  744. 35325 !*===========================================================================*
  745. 35326 !*                              p_level0                                     *
  746. 35327 !*===========================================================================*
  747. 35328 ! PUBLIC void level0(void (*func)(void))
  748. 35329 ! Call a function at permission level 0.  This allows kernel tasks to do
  749. 35330 ! things that are only possible at the most privileged CPU level.
  750. 35331 !
  751. 35332 p_level0:
  752. 35333         mov     bx, sp
  753. 35334         mov     ax, 2(bx)
  754. 35335         mov     _level0_func, ax
  755. 35336         int     LEVEL0_VECTOR
  756. 35337         ret
  757. 35338
  758. 35339
  759. 35340 !*===========================================================================*
  760. 35341 !*                              data                                         *
  761. 35342 !*===========================================================================*
  762. 35343         .data
  763. 35344 patch_table:                    ! pairs (old function, new function)
  764. 35345 #if ENABLE_BIOS_WINI
  765. 35346         .data2  _bios13, p_bios13
  766. 35347 #endif
  767. 35348         .data2  _cp_mess, p_cp_mess
  768. 35349         .data2  _phys_copy, p_phys_copy
  769. 35350         .data2  portio_setup, p_portio_setup
  770. 35351         .data2  _reset, p_reset
  771. 35352         .data2  _level0, p_level0
  772. 35353         .data2  _restart, p_restart     ! in mpx file
  773. 35354         .data2  save, p_save    ! in mpx file
  774. 35355 end_patch_table:                ! end of table
  775. 35356
  776. 35357 idt_vectors:                    ! limit and base of real mode interrupt vectors
  777. 35358         .data2  0x3FF
  778. 35359 idt_zero:                       ! zero limit IDT to cause a processor shutdown
  779. 35360         .data2  0, 0, 0
  780. 35361
  781. 35362         .bss
  782. 35363 save_sp:                        ! place to put sp when switching to real mode
  783. 35364         .space  2
  784. 35365 msw:                            ! saved real mode machine status word
  785. 35366         .space  2
  786. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  787. src/kernel/mpx.s    
  788. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  789. 35400 #
  790. 35401 ! Chooses between the 8086 and 386 versions of the Minix startup code.
  791. 35402
  792. 35403 #include <minix/config.h>
  793. 35404 #if _WORD_SIZE == 2
  794. 35405 #include "mpx88.s"
  795. 35406 #else
  796. 35407 #include "mpx386.s"
  797. 35408 #endif
  798. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  799. src/kernel/mpx386.s    
  800. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  801. 35500 #
  802. 35501 ! This file contains the assembler startup code for Minix and the 32-bit
  803. 35502 ! interrupt handlers.  It cooperates with start.c to set up a good
  804. 35503 ! environment for main().
  805. 35504
  806. 35505 ! This file is part of the lowest layer of the MINIX kernel.  The other part
  807. 35506 ! is "proc.c".  The lowest layer does process switching and message handling.
  808. 35507
  809. 35508 ! Every transition to the kernel goes through this file.  Transitions are
  810. 35509 ! caused by sending/receiving messages and by most interrupts.  (RS232
  811. 35510 ! interrupts may be handled in the file "rs2.s" and then they rarely enter
  812. 35511 ! the kernel.)
  813. 35512
  814. 35513 ! Transitions to the kernel may be nested.  The initial entry may be with a
  815. 35514 ! system call, exception or hardware interrupt; reentries may only be made
  816. 35515 ! by hardware interrupts.  The count of reentries is kept in "k_reenter".
  817. 35516 ! It is important for deciding whether to switch to the kernel stack and
  818. 35517 ! for protecting the message passing code in "proc.c".
  819. 35518
  820. 35519 ! For the message passing trap, most of the machine state is saved in the
  821. 35520 ! proc table.  (Some of the registers need not be saved.)  Then the stack is
  822. 35521 ! switched to "k_stack", and interrupts are reenabled.  Finally, the system
  823. 35522 ! call handler (in C) is called.  When it returns, interrupts are disabled
  824. 35523 ! again and the code falls into the restart routine, to finish off held-up
  825. 35524 ! interrupts and run the process or task whose pointer is in "proc_ptr".
  826. 35525
  827. 35526 ! Hardware interrupt handlers do the same, except  (1) The entire state must
  828. 35527 ! be saved.  (2) There are too many handlers to do this inline, so the save
  829. 35528 ! routine is called.  A few cycles are saved by pushing the address of the
  830. 35529 ! appropiate restart routine for a return later.  (3) A stack switch is
  831. 35530 ! avoided when the stack is already switched.  (4) The (master) 8259 interrupt
  832. 35531 ! controller is reenabled centrally in save().  (5) Each interrupt handler
  833. 35532 ! masks its interrupt line using the 8259 before enabling (other unmasked)
  834. 35533 ! interrupts, and unmasks it after servicing the interrupt.  This limits the
  835. 35534 ! nest level to the number of lines and protects the handler from itself.
  836. 35535
  837. 35536 ! For communication with the boot monitor at startup time some constant
  838. 35537 ! data are compiled into the beginning of the text segment. This facilitates 
  839. 35538 ! reading the data at the start of the boot process, since only the first
  840. 35539 ! sector of the file needs to be read.
  841. 35540
  842. 35541 ! Some data storage is also allocated at the end of this file. This data 
  843. 35542 ! will be at the start of the data segment of the kernel and will be read
  844. 35543 ! and modified by the boot monitor before the kernel starts.
  845. 35544
  846. 35545 ! sections
  847. 35546
  848. 35547 .sect .text
  849. 35548 begtext:
  850. 35549 .sect .rom
  851. 35550 begrom:
  852. 35551 .sect .data
  853. 35552 begdata:
  854. 35553 .sect .bss
  855. 35554 begbss:
  856. 35555
  857. 35556 #include <minix/config.h>
  858. 35557 #include <minix/const.h>
  859. 35558 #include <minix/com.h>
  860. 35559 #include "const.h"
  861. 35560 #include "protect.h"
  862. 35561 #include "sconst.h"
  863. 35562
  864. 35563 /* Selected 386 tss offsets. */
  865. 35564 #define TSS3_S_SP0      4
  866. 35565
  867. 35566 ! Exported functions
  868. 35567 ! Note: in assembly language the .define statement applied to a function name 
  869. 35568 ! is loosely equivalent to a prototype in C code -- it makes it possible to
  870. 35569 ! link to an entity declared in the assembly code but does not create
  871. 35570 ! the entity.
  872. 35571
  873. 35572 .define _idle_task
  874. 35573 .define _restart
  875. 35574 .define save
  876. 35575
  877. 35576 .define _divide_error
  878. 35577 .define _single_step_exception
  879. 35578 .define _nmi
  880. 35579 .define _breakpoint_exception
  881. 35580 .define _overflow
  882. 35581 .define _bounds_check
  883. 35582 .define _inval_opcode
  884. 35583 .define _copr_not_available
  885. 35584 .define _double_fault
  886. 35585 .define _copr_seg_overrun
  887. 35586 .define _inval_tss
  888. 35587 .define _segment_not_present
  889. 35588 .define _stack_exception
  890. 35589 .define _general_protection
  891. 35590 .define _page_fault
  892. 35591 .define _copr_error
  893. 35592
  894. 35593 .define _hwint00        ! handlers for hardware interrupts
  895. 35594 .define _hwint01
  896. 35595 .define _hwint02
  897. 35596 .define _hwint03
  898. 35597 .define _hwint04
  899. 35598 .define _hwint05
  900. 35599 .define _hwint06
  901. 35600 .define _hwint07
  902. 35601 .define _hwint08
  903. 35602 .define _hwint09
  904. 35603 .define _hwint10
  905. 35604 .define _hwint11
  906. 35605 .define _hwint12
  907. 35606 .define _hwint13
  908. 35607 .define _hwint14
  909. 35608 .define _hwint15
  910. 35609
  911. 35610 .define _s_call
  912. 35611 .define _p_s_call
  913. 35612 .define _level0_call
  914. 35613
  915. 35614 ! Imported functions.
  916. 35615
  917. 35616 .extern _cstart
  918. 35617 .extern _main
  919. 35618 .extern _exception
  920. 35619 .extern _interrupt
  921. 35620 .extern _sys_call
  922. 35621 .extern _unhold
  923. 35622
  924. 35623 ! Exported variables.
  925. 35624 ! Note: when used with a variable the .define does not reserve storage,
  926. 35625 ! it makes the name externally visible so it may be linked to. 
  927. 35626
  928. 35627 .define begbss
  929. 35628 .define begdata
  930. 35629 .define _sizes
  931. 35630
  932. 35631 ! Imported variables.
  933. 35632
  934. 35633 .extern _gdt
  935. 35634 .extern _code_base
  936. 35635 .extern _data_base
  937. 35636 .extern _held_head
  938. 35637 .extern _k_reenter
  939. 35638 .extern _pc_at
  940. 35639 .extern _proc_ptr
  941. 35640 .extern _ps_mca
  942. 35641 .extern _tss
  943. 35642 .extern _level0_func
  944. 35643 .extern _mon_sp
  945. 35644 .extern _mon_return
  946. 35645 .extern _reboot_code
  947. 35646
  948. 35647 .sect .text
  949. 35648 !*===========================================================================*
  950. 35649 !*                              MINIX                                        *
  951. 35650 !*===========================================================================*
  952. 35651 MINIX:                          ! this is the entry point for the MINIX kernel
  953. 35652         jmp     over_flags      ! skip over the next few bytes
  954. 35653         .data2  CLICK_SHIFT     ! for the monitor: memory granularity
  955. 35654 flags:
  956. 35655         .data2  0x002D          ! boot monitor flags:
  957. 35656                                 !       call in 386 mode, make stack,
  958. 35657                                 !       load high, will return
  959. 35658         nop                     ! extra byte to sync up disassembler
  960. 35659 over_flags:
  961. 35660
  962. 35661 ! Set up a C stack frame on the monitor stack.  (The monitor sets cs and ds
  963. 35662 ! right.  The ss descriptor still references the monitor data segment.)
  964. 35663         movzx   esp, sp         ! monitor stack is a 16 bit stack
  965. 35664         push    ebp
  966. 35665         mov     ebp, esp
  967. 35666         push    esi
  968. 35667         push    edi
  969. 35668         cmp     4(ebp), 0       ! nonzero if return possible
  970. 35669         jz      noret
  971. 35670         inc     (_mon_return)
  972. 35671 noret:  mov     (_mon_sp), esp  ! save stack pointer for later return
  973. 35672
  974. 35673 ! Copy the monitor global descriptor table to the address space of kernel and
  975. 35674 ! switch over to it.  Prot_init() can then update it with immediate effect.
  976. 35675
  977. 35676         sgdt    (_gdt+GDT_SELECTOR)             ! get the monitor gdtr
  978. 35677         mov     esi, (_gdt+GDT_SELECTOR+2)      ! absolute address of GDT
  979. 35678         mov     ebx, _gdt                       ! address of kernel GDT
  980. 35679         mov     ecx, 8*8                        ! copying eight descriptors
  981. 35680 copygdt:
  982. 35681  eseg   movb    al, (esi)
  983. 35682         movb    (ebx), al
  984. 35683         inc     esi
  985. 35684         inc     ebx
  986. 35685         loop    copygdt
  987. 35686         mov     eax, (_gdt+DS_SELECTOR+2)       ! base of kernel data
  988. 35687         and     eax, 0x00FFFFFF                 ! only 24 bits
  989. 35688         add     eax, _gdt                       ! eax = vir2phys(gdt)
  990. 35689         mov     (_gdt+GDT_SELECTOR+2), eax      ! set base of GDT
  991. 35690         lgdt    (_gdt+GDT_SELECTOR)             ! switch over to kernel GDT
  992. 35691
  993. 35692 ! Locate boot parameters, set up kernel segment registers and stack.
  994. 35693         mov     ebx, 8(ebp)     ! boot parameters offset
  995. 35694         mov     edx, 12(ebp)    ! boot parameters length
  996. 35695         mov     ax, ds          ! kernel data
  997. 35696         mov     es, ax
  998. 35697         mov     fs, ax
  999. 35698         mov     gs, ax
  1000. 35699         mov     ss, ax
  1001. 35700         mov     esp, k_stktop   ! set sp to point to the top of kernel stack
  1002. 35701
  1003. 35702 ! Call C startup code to set up a proper environment to run main().
  1004. 35703         push    edx
  1005. 35704         push    ebx
  1006. 35705         push    SS_SELECTOR
  1007. 35706         push    MON_CS_SELECTOR
  1008. 35707         push    DS_SELECTOR
  1009. 35708         push    CS_SELECTOR
  1010. 35709         call    _cstart         ! cstart(cs, ds, mcs, mds, parmoff, parmlen)
  1011. 35710         add     esp, 6*4
  1012. 35711
  1013. 35712 ! Reload gdtr, idtr and the segment registers to global descriptor table set
  1014. 35713 ! up by prot_init().
  1015. 35714
  1016. 35715         lgdt    (_gdt+GDT_SELECTOR)
  1017. 35716         lidt    (_gdt+IDT_SELECTOR)
  1018. 35717
  1019. 35718         jmpf    CS_SELECTOR:csinit
  1020. 35719 csinit:
  1021. 35720     o16 mov     ax, DS_SELECTOR
  1022. 35721         mov     ds, ax
  1023. 35722         mov     es, ax
  1024. 35723         mov     fs, ax
  1025. 35724         mov     gs, ax
  1026. 35725         mov     ss, ax
  1027. 35726     o16 mov     ax, TSS_SELECTOR        ! no other TSS is used
  1028. 35727         ltr     ax
  1029. 35728         push    0                       ! set flags to known good state
  1030. 35729         popf                            ! esp, clear nested task and int enable
  1031. 35730
  1032. 35731         jmp     _main                   ! main()
  1033. 35732
  1034. 35733
  1035. 35734 !*===========================================================================*
  1036. 35735 !*                              interrupt handlers                           *
  1037. 35736 !*              interrupt handlers for 386 32-bit protected mode             *
  1038. 35737 !*===========================================================================*
  1039. 35738
  1040. 35739 !*===========================================================================*
  1041. 35740 !*                              hwint00 - 07                                 *
  1042. 35741 !*===========================================================================*
  1043. 35742 ! Note this is a macro, it looks like a subroutine.
  1044. 35743 #define hwint_master(irq)       
  1045. 35744         call    save                    /* save interrupted process state */;
  1046. 35745         inb     INT_CTLMASK                                                 ;
  1047. 35746         orb     al, [1<<irq]                                                ;
  1048. 35747         outb    INT_CTLMASK             /* disable the irq                */;
  1049. 35748         movb    al, ENABLE                                                  ;
  1050. 35749         outb    INT_CTL                 /* reenable master 8259           */;
  1051. 35750         sti                             /* enable interrupts              */;
  1052. 35751         push    irq                     /* irq                            */;
  1053. 35752         call    (_irq_table + 4*irq)    /* eax = (*irq_table[irq])(irq)   */;
  1054. 35753         pop     ecx                                                         ;
  1055. 35754         cli                             /* disable interrupts             */;
  1056. 35755         test    eax, eax                /* need to reenable irq?          */;
  1057. 35756         jz      0f                                                          ;
  1058. 35757         inb     INT_CTLMASK                                                 ;
  1059. 35758         andb    al, ~[1<<irq]                                               ;
  1060. 35759         outb    INT_CTLMASK             /* enable the irq                 */;
  1061. 35760 0:      ret                             /* restart (another) process      */
  1062. 35761
  1063. 35762 ! Each of these entry points is an expansion of the hwint_master macro
  1064. 35763         .align  16
  1065. 35764 _hwint00:               ! Interrupt routine for irq 0 (the clock).
  1066. 35765         hwint_master(0)
  1067. 35766
  1068. 35767         .align  16
  1069. 35768 _hwint01:               ! Interrupt routine for irq 1 (keyboard)
  1070. 35769         hwint_master(1)
  1071. 35770
  1072. 35771         .align  16
  1073. 35772 _hwint02:               ! Interrupt routine for irq 2 (cascade!)
  1074. 35773         hwint_master(2)
  1075. 35774
  1076. 35775         .align  16
  1077. 35776 _hwint03:               ! Interrupt routine for irq 3 (second serial)
  1078. 35777         hwint_master(3)
  1079. 35778
  1080. 35779         .align  16
  1081. 35780 _hwint04:               ! Interrupt routine for irq 4 (first serial)
  1082. 35781         hwint_master(4)
  1083. 35782
  1084. 35783         .align  16
  1085. 35784 _hwint05:               ! Interrupt routine for irq 5 (XT winchester)
  1086. 35785         hwint_master(5)
  1087. 35786
  1088. 35787         .align  16
  1089. 35788 _hwint06:               ! Interrupt routine for irq 6 (floppy)
  1090. 35789         hwint_master(6)
  1091. 35790
  1092. 35791         .align  16
  1093. 35792 _hwint07:               ! Interrupt routine for irq 7 (printer)
  1094. 35793         hwint_master(7)
  1095. 35794
  1096. 35795 !*===========================================================================*
  1097. 35796 !*                              hwint08 - 15                                 *
  1098. 35797 !*===========================================================================*
  1099. 35798 ! Note this is a macro, it looks like a subroutine.
  1100. 35799 #define hwint_slave(irq)        
  1101. 35800         call    save                    /* save interrupted process state */;
  1102. 35801         inb     INT2_CTLMASK                                                ;
  1103. 35802         orb     al, [1<<[irq-8]]                                            ;
  1104. 35803         outb    INT2_CTLMASK            /* disable the irq                */;
  1105. 35804         movb    al, ENABLE                                                  ;
  1106. 35805         outb    INT_CTL                 /* reenable master 8259           */;
  1107. 35806         jmp     .+2                     /* delay                          */;
  1108. 35807         outb    INT2_CTL                /* reenable slave 8259            */;
  1109. 35808         sti                             /* enable interrupts              */;
  1110. 35809         push    irq                     /* irq                            */;
  1111. 35810         call    (_irq_table + 4*irq)    /* eax = (*irq_table[irq])(irq)   */;
  1112. 35811         pop     ecx                                                         ;
  1113. 35812         cli                             /* disable interrupts             */;
  1114. 35813         test    eax, eax                /* need to reenable irq?          */;
  1115. 35814         jz      0f                                                          ;
  1116. 35815         inb     INT2_CTLMASK                                                ;
  1117. 35816         andb    al, ~[1<<[irq-8]]                                           ;
  1118. 35817         outb    INT2_CTLMASK            /* enable the irq                 */;
  1119. 35818 0:      ret                             /* restart (another) process      */
  1120. 35819
  1121. 35820 ! Each of these entry points is an expansion of the hwint_slave macro
  1122. 35821         .align  16
  1123. 35822 _hwint08:               ! Interrupt routine for irq 8 (realtime clock)
  1124. 35823         hwint_slave(8)
  1125. 35824
  1126. 35825         .align  16
  1127. 35826 _hwint09:               ! Interrupt routine for irq 9 (irq 2 redirected)
  1128. 35827         hwint_slave(9)
  1129. 35828
  1130. 35829         .align  16
  1131. 35830 _hwint10:               ! Interrupt routine for irq 10
  1132. 35831         hwint_slave(10)
  1133. 35832
  1134. 35833         .align  16
  1135. 35834 _hwint11:               ! Interrupt routine for irq 11
  1136. 35835         hwint_slave(11)
  1137. 35836
  1138. 35837         .align  16
  1139. 35838 _hwint12:               ! Interrupt routine for irq 12
  1140. 35839         hwint_slave(12)
  1141. 35840
  1142. 35841         .align  16
  1143. 35842 _hwint13:               ! Interrupt routine for irq 13 (FPU exception)
  1144. 35843         hwint_slave(13)
  1145. 35844
  1146. 35845         .align  16
  1147. 35846 _hwint14:               ! Interrupt routine for irq 14 (AT winchester)
  1148. 35847         hwint_slave(14)
  1149. 35848
  1150. 35849         .align  16
  1151. 35850 _hwint15:               ! Interrupt routine for irq 15
  1152. 35851         hwint_slave(15)
  1153. 35852
  1154. 35853 !*===========================================================================*
  1155. 35854 !*                              save                                         *
  1156. 35855 !*===========================================================================*
  1157. 35856 ! Save for protected mode.
  1158. 35857 ! This is much simpler than for 8086 mode, because the stack already points
  1159. 35858 ! into the process table, or has already been switched to the kernel stack.
  1160. 35859
  1161. 35860         .align  16
  1162. 35861 save:
  1163. 35862         cld                     ! set direction flag to a known value
  1164. 35863         pushad                  ! save "general" registers
  1165. 35864     o16 push    ds              ! save ds
  1166. 35865     o16 push    es              ! save es
  1167. 35866     o16 push    fs              ! save fs
  1168. 35867     o16 push    gs              ! save gs
  1169. 35868         mov     dx, ss          ! ss is kernel data segment
  1170. 35869         mov     ds, dx          ! load rest of kernel segments
  1171. 35870         mov     es, dx          ! kernel does not use fs, gs
  1172. 35871         mov     eax, esp        ! prepare to return
  1173. 35872         incb    (_k_reenter)    ! from -1 if not reentering
  1174. 35873         jnz     set_restart1    ! stack is already kernel stack
  1175. 35874         mov     esp, k_stktop
  1176. 35875         push    _restart        ! build return address for int handler
  1177. 35876         xor     ebp, ebp        ! for stacktrace
  1178. 35877         jmp     RETADR-P_STACKBASE(eax)
  1179. 35878
  1180. 35879         .align  4
  1181. 35880 set_restart1:
  1182. 35881         push    restart1
  1183. 35882         jmp     RETADR-P_STACKBASE(eax)
  1184. 35883
  1185. 35884 !*===========================================================================*
  1186. 35885 !*                              _s_call                                      *
  1187. 35886 !*===========================================================================*
  1188. 35887         .align  16
  1189. 35888 _s_call:
  1190. 35889 _p_s_call:
  1191. 35890         cld                     ! set direction flag to a known value
  1192. 35891         sub     esp, 6*4        ! skip RETADR, eax, ecx, edx, ebx, est
  1193. 35892         push    ebp             ! stack already points into proc table
  1194. 35893         push    esi
  1195. 35894         push    edi
  1196. 35895     o16 push    ds
  1197. 35896     o16 push    es
  1198. 35897     o16 push    fs
  1199. 35898     o16 push    gs
  1200. 35899         mov     dx, ss
  1201. 35900         mov     ds, dx
  1202. 35901         mov     es, dx
  1203. 35902         incb    (_k_reenter)
  1204. 35903         mov     esi, esp        ! assumes P_STACKBASE == 0
  1205. 35904         mov     esp, k_stktop
  1206. 35905         xor     ebp, ebp        ! for stacktrace
  1207. 35906                                 ! end of inline save
  1208. 35907         sti                     ! allow SWITCHER to be interrupted
  1209. 35908                                 ! now set up parameters for sys_call()
  1210. 35909         push    ebx             ! pointer to user message
  1211. 35910         push    eax             ! src/dest
  1212. 35911         push    ecx             ! SEND/RECEIVE/BOTH
  1213. 35912         call    _sys_call       ! sys_call(function, src_dest, m_ptr)
  1214. 35913                                 ! caller is now explicitly in proc_ptr
  1215. 35914         mov     AXREG(esi), eax ! sys_call MUST PRESERVE si
  1216. 35915         cli                     ! disable interrupts 
  1217. 35916
  1218. 35917 ! Fall into code to restart proc/task running.
  1219. 35918
  1220. 35919 !*===========================================================================*
  1221. 35920 !*                              restart                                      *
  1222. 35921 !*===========================================================================*
  1223. 35922 _restart:
  1224. 35923
  1225. 35924 ! Flush any held-up interrupts.
  1226. 35925 ! This reenables interrupts, so the current interrupt handler may reenter.
  1227. 35926 ! This does not matter, because the current handler is about to exit and no
  1228. 35927 ! other handlers can reenter since flushing is only done when k_reenter == 0.
  1229. 35928
  1230. 35929         cmp     (_held_head), 0 ! do fast test to usually avoid function call
  1231. 35930         jz      over_call_unhold
  1232. 35931         call    _unhold         ! this is rare so overhead acceptable
  1233. 35932 over_call_unhold:
  1234. 35933         mov     esp, (_proc_ptr)        ! will assume P_STACKBASE == 0
  1235. 35934         lldt    P_LDT_SEL(esp)          ! enable segment descriptors for task
  1236. 35935         lea     eax, P_STACKTOP(esp)    ! arrange for next interrupt
  1237. 35936         mov     (_tss+TSS3_S_SP0), eax  ! to save state in process table
  1238. 35937 restart1:
  1239. 35938         decb    (_k_reenter)
  1240. 35939     o16 pop     gs
  1241. 35940     o16 pop     fs
  1242. 35941     o16 pop     es
  1243. 35942     o16 pop     ds
  1244. 35943         popad
  1245. 35944         add     esp, 4          ! skip return adr
  1246. 35945         iretd                   ! continue process
  1247. 35946
  1248. 35947 !*===========================================================================*
  1249. 35948 !*                              exception handlers                           *
  1250. 35949 !*===========================================================================*
  1251. 35950 _divide_error:
  1252. 35951         push    DIVIDE_VECTOR
  1253. 35952         jmp     exception
  1254. 35953
  1255. 35954 _single_step_exception:
  1256. 35955         push    DEBUG_VECTOR
  1257. 35956         jmp     exception
  1258. 35957
  1259. 35958 _nmi:
  1260. 35959         push    NMI_VECTOR
  1261. 35960         jmp     exception
  1262. 35961
  1263. 35962 _breakpoint_exception:
  1264. 35963         push    BREAKPOINT_VECTOR
  1265. 35964         jmp     exception
  1266. 35965
  1267. 35966 _overflow:
  1268. 35967         push    OVERFLOW_VECTOR
  1269. 35968         jmp     exception
  1270. 35969
  1271. 35970 _bounds_check:
  1272. 35971         push    BOUNDS_VECTOR
  1273. 35972         jmp     exception
  1274. 35973
  1275. 35974 _inval_opcode:
  1276. 35975         push    INVAL_OP_VECTOR
  1277. 35976         jmp     exception
  1278. 35977
  1279. 35978 _copr_not_available:
  1280. 35979         push    COPROC_NOT_VECTOR
  1281. 35980         jmp     exception
  1282. 35981
  1283. 35982 _double_fault:
  1284. 35983         push    DOUBLE_FAULT_VECTOR
  1285. 35984         jmp     errexception
  1286. 35985
  1287. 35986 _copr_seg_overrun:
  1288. 35987         push    COPROC_SEG_VECTOR
  1289. 35988         jmp     exception
  1290. 35989
  1291. 35990 _inval_tss:
  1292. 35991         push    INVAL_TSS_VECTOR
  1293. 35992         jmp     errexception
  1294. 35993
  1295. 35994 _segment_not_present:
  1296. 35995         push    SEG_NOT_VECTOR
  1297. 35996         jmp     errexception
  1298. 35997
  1299. 35998 _stack_exception:
  1300. 35999         push    STACK_FAULT_VECTOR
  1301. 36000         jmp     errexception
  1302. 36001
  1303. 36002 _general_protection:
  1304. 36003         push    PROTECTION_VECTOR
  1305. 36004         jmp     errexception
  1306. 36005
  1307. 36006 _page_fault:
  1308. 36007         push    PAGE_FAULT_VECTOR
  1309. 36008         jmp     errexception
  1310. 36009
  1311. 36010 _copr_error:
  1312. 36011         push    COPROC_ERR_VECTOR
  1313. 36012         jmp     exception
  1314. 36013
  1315. 36014 !*===========================================================================*
  1316. 36015 !*                              exception                                    *
  1317. 36016 !*===========================================================================*
  1318. 36017 ! This is called for all exceptions which do not push an error code.
  1319. 36018
  1320. 36019         .align  16
  1321. 36020 exception:
  1322. 36021  sseg   mov     (trap_errno), 0         ! clear trap_errno
  1323. 36022  sseg   pop     (ex_number)
  1324. 36023         jmp     exception1
  1325. 36024
  1326. 36025 !*===========================================================================*
  1327. 36026 !*                              errexception                                 *
  1328. 36027 !*===========================================================================*
  1329. 36028 ! This is called for all exceptions which push an error code.
  1330. 36029
  1331. 36030         .align  16
  1332. 36031 errexception:
  1333. 36032  sseg   pop     (ex_number)
  1334. 36033  sseg   pop     (trap_errno)
  1335. 36034 exception1:                             ! Common for all exceptions.
  1336. 36035         push    eax                     ! eax is scratch register
  1337. 36036         mov     eax, 0+4(esp)           ! old eip
  1338. 36037  sseg   mov     (old_eip), eax
  1339. 36038         movzx   eax, 4+4(esp)           ! old cs
  1340. 36039  sseg   mov     (old_cs), eax
  1341. 36040         mov     eax, 8+4(esp)           ! old eflags
  1342. 36041  sseg   mov     (old_eflags), eax
  1343. 36042         pop     eax
  1344. 36043         call    save
  1345. 36044         push    (old_eflags)
  1346. 36045         push    (old_cs)
  1347. 36046         push    (old_eip)
  1348. 36047         push    (trap_errno)
  1349. 36048         push    (ex_number)
  1350. 36049         call    _exception              ! (ex_number, trap_errno, old_eip,
  1351. 36050                                         !       old_cs, old_eflags)
  1352. 36051         add     esp, 5*4
  1353. 36052         cli
  1354. 36053         ret
  1355. 36054
  1356. 36055 !*===========================================================================*
  1357. 36056 !*                              level0_call                                  *
  1358. 36057 !*===========================================================================*
  1359. 36058 _level0_call:
  1360. 36059         call    save
  1361. 36060         jmp     (_level0_func)
  1362. 36061
  1363. 36062 !*===========================================================================*
  1364. 36063 !*                              idle_task                                    *
  1365. 36064 !*===========================================================================*
  1366. 36065 _idle_task:                     ! executed when there is no work
  1367. 36066         jmp     _idle_task      ! a "hlt" before this fails in protected mode
  1368. 36067
  1369. 36068 !*===========================================================================*
  1370. 36069 !*                              data                                         *
  1371. 36070 !*===========================================================================*
  1372. 36071 ! These declarations assure that storage will be allocated at the very 
  1373. 36072 ! beginning of the kernel data section, so the boot monitor can be easily 
  1374. 36073 ! told how to patch these locations. Note that the magic number is put
  1375. 36074 ! here by the compiler, but will be read by, and then overwritten by,
  1376. 36075 ! the boot monitor. When the kernel starts the sizes array will be
  1377. 36076 ! found here, as if it had been initialized by the compiler.
  1378. 36077
  1379. 36078 .sect .rom      ! Before the string table please
  1380. 36079 _sizes:                         ! sizes of kernel, mm, fs filled in by boot
  1381. 36080         .data2  0x526F          ! this must be the first data entry (magic #)
  1382. 36081         .space  16*2*2-2        ! monitor uses previous word and this space
  1383. 36082                                 ! extra space allows for additional servers
  1384. 36083 .sect .bss
  1385. 36084 k_stack:
  1386. 36085         .space  K_STACK_BYTES   ! kernel stack
  1387. 36086 k_stktop:                       ! top of kernel stack
  1388. 36087         .comm   ex_number, 4
  1389. 36088         .comm   trap_errno, 4
  1390. 36089         .comm   old_eip, 4
  1391. 36090         .comm   old_cs, 4
  1392. 36091         .comm   old_eflags, 4
  1393. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1394. src/kernel/mpx88.s    
  1395. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1396. 36100 #
  1397. 36101 ! This file contains the assembler startup code for Minix and the 16-bit
  1398. 36102 ! interrupt handlers.  It cooperates with cstart.c to set up a good
  1399. 36103 ! environment for main().
  1400. 36104
  1401. 36105 ! This file is part of the lowest layer of the MINIX kernel.  The other part
  1402. 36106 ! is "proc.c".  The lowest layer does process switching and message handling.
  1403. 36107
  1404. 36108 ! Every transition to the kernel goes through this file.  Transitions are
  1405. 36109 ! caused by sending/receiving messages and by most interrupts.  (RS232
  1406. 36110 ! interrupts may be handled in the file "rs2.s" and then they rarely enter
  1407. 36111 ! the kernel.)
  1408. 36112
  1409. 36113 ! Transitions to the kernel may be nested.  The initial entry may be with a
  1410. 36114 ! system call, exception or hardware interrupt; reentries may only be made
  1411. 36115 ! by hardware interrupts.  The count of reentries is kept in "k_reenter".
  1412. 36116 ! It is important for deciding whether to switch to the kernel stack and
  1413. 36117 ! for protecting the message passing code in "proc.c".
  1414. 36118
  1415. 36119 ! For the message passing trap, most of the machine state is saved in the
  1416. 36120 ! proc table.  (Some of the registers need not be saved.)  Then the stack is
  1417. 36121 ! switched to "k_stack", and interrupts are reenabled.  Finally, the system
  1418. 36122 ! call handler (in C) is called.  When it returns, interrupts are disabled
  1419. 36123 ! again and the code falls into the restart routine, to finish off held-up
  1420. 36124 ! interrupts and run the process or task whose pointer is in "proc_ptr".
  1421. 36125
  1422. 36126 ! Hardware interrupt handlers do the same, except  (1) The entire state must
  1423. 36127 ! be saved.  (2) There are too many handlers to do this inline, so the save
  1424. 36128 ! routine is called.  A few cycles are saved by pushing the address of the
  1425. 36129 ! appropiate restart routine for a return later.  (3) A stack switch is
  1426. 36130 ! avoided when the stack is already switched.  (4) The (master) 8259 interrupt
  1427. 36131 ! controller is reenabled centrally in save().  (5) Each interrupt handler
  1428. 36132 ! masks its interrupt line using the 8259 before enabling (other unmasked)
  1429. 36133 ! interrupts, and unmasks it after servicing the interrupt.  This limits the
  1430. 36134 ! nest level to the number of lines and protects the handler from itself.
  1431. 36135
  1432. 36136 ! For communication with the boot monitor at startup time some constant
  1433. 36137 ! data are compiled into the beginning of the text segment. This facilitates 
  1434. 36138 ! reading the data at the start of the boot process, since only the first
  1435. 36139 ! sector of the file needs to be read.
  1436. 36140
  1437. 36141 ! Some data storage is also allocated at the end of this file. This data 
  1438. 36142 ! will be at the start of the data segment of the kernel and will be read
  1439. 36143 ! and modified by the boot monitor before the kernel starts.
  1440. 36144
  1441. 36145 #include <minix/config.h>
  1442. 36146 #include <minix/const.h>
  1443. 36147 #include <minix/com.h>
  1444. 36148 #include "const.h"
  1445. 36149 #include "sconst.h"
  1446. 36150 #include "protect.h"
  1447. 36151
  1448. 36152 ! The external entry points into this file are:
  1449. 36153 ! Note: in assembly language the .define statement applied to a function name 
  1450. 36154 ! is loosely equivalent to a prototype in C code -- it makes it possible to
  1451. 36155 ! link to an entity declared in the assembly code but does not create
  1452. 36156 ! the entity.
  1453. 36157
  1454. 36158 .define _idle_task      ! executed when there is no work
  1455. 36159 .define _int00          ! handlers for traps and exceptions
  1456. 36160 .define _int01
  1457. 36161 .define _int02
  1458. 36162 .define _int03
  1459. 36163 .define _int04
  1460. 36164 .define _int05
  1461. 36165 .define _int06
  1462. 36166 .define _int07
  1463. 36167 .define _hwint00        ! handlers for hardware interrupts
  1464. 36168 .define _hwint01
  1465. 36169 .define _hwint02
  1466. 36170 .define _hwint03
  1467. 36171 .define _hwint04
  1468. 36172 .define _hwint05
  1469. 36173 .define _hwint06
  1470. 36174 .define _hwint07
  1471. 36175 .define _hwint08
  1472. 36176 .define _hwint09
  1473. 36177 .define _hwint10
  1474. 36178 .define _hwint11
  1475. 36179 .define _hwint12
  1476. 36180 .define _hwint13
  1477. 36181 .define _hwint14
  1478. 36182 .define _hwint15
  1479. 36183 .define _restart        ! start running a task or process
  1480. 36184 .define save            ! save the machine state in the proc table
  1481. 36185 .define _s_call         ! process or task wants to send or receive a message
  1482. 36186
  1483. 36187 ! Imported functions.
  1484. 36188
  1485. 36189 .extern _cstart
  1486. 36190 .extern _main
  1487. 36191 .extern _exception
  1488. 36192 .extern _interrupt
  1489. 36193 .extern _sys_call
  1490. 36194 .extern _unhold
  1491. 36195 .extern klib_init_prot
  1492. 36196 .extern real2prot
  1493. 36197
  1494. 36198 ! Exported variables.
  1495. 36199 ! Note: when used with a variable the .define does not reserve storage,
  1496. 36200 ! it makes the name externally visible so it may be linked to. 
  1497. 36201
  1498. 36202 .define kernel_ds
  1499. 36203 .define begbss
  1500. 36204 .define begdata
  1501. 36205 .define _sizes
  1502. 36206
  1503. 36207 ! Imported variables.
  1504. 36208
  1505. 36209 .extern kernel_cs
  1506. 36210 .extern _gdt
  1507. 36211 .extern _code_base
  1508. 36212 .extern _data_base
  1509. 36213 .extern _held_head
  1510. 36214 .extern _k_reenter
  1511. 36215 .extern _pc_at
  1512. 36216 .extern _proc_ptr
  1513. 36217 .extern _protected_mode
  1514. 36218 .extern _ps_mca
  1515. 36219 .extern _irq_table
  1516. 36220
  1517. 36221         .text
  1518. 36222 !*===========================================================================*
  1519. 36223 !*                              MINIX                                        *
  1520. 36224 !*===========================================================================*
  1521. 36225 MINIX:                          ! this is the entry point for the MINIX kernel
  1522. 36226         jmp     over_kernel_ds  ! skip over the next few bytes
  1523. 36227         .data2  CLICK_SHIFT     ! for the monitor: memory granularity
  1524. 36228 kernel_ds:
  1525. 36229         .data2  0x0024          ! boot monitor flags:  (later kernel DS)
  1526. 36230                                 !       make stack, will return
  1527. 36231 over_kernel_ds:
  1528. 36232
  1529. 36233 ! Set up a C stack frame on the monitor stack.  (The monitor sets cs and ds
  1530. 36234 ! right.  The ss register still references the monitor data segment.)
  1531. 36235         push    bp
  1532. 36236         mov     bp, sp
  1533. 36237         push    si
  1534. 36238         push    di
  1535. 36239         mov     cx, 4(bp)       ! monitor code segment
  1536. 36240         test    cx, cx          ! nonzero if return possible
  1537. 36241         jz      noret
  1538. 36242         inc     _mon_return
  1539. 36243 noret:  mov     _mon_ss, ss     ! save stack location for later return
  1540. 36244         mov     _mon_sp, sp
  1541. 36245
  1542. 36246 ! Locate boot parameters, set up kernel segment registers and stack.
  1543. 36247         mov     bx, 6(bp)       ! boot parameters offset
  1544. 36248         mov     dx, 8(bp)       ! boot parameters length
  1545. 36249         mov     ax, ds          ! kernel data
  1546. 36250         mov     es, ax
  1547. 36251         mov     ss, ax
  1548. 36252         mov     sp, #k_stktop   ! set sp to point to the top of kernel stack
  1549. 36253
  1550. 36254 ! Real mode needs to get kernel DS from the code segment.  Protected mode
  1551. 36255 ! needs CS in the jump back to real mode.
  1552. 36256
  1553. 36257   cseg  mov     kernel_cs, cs
  1554. 36258   cseg  mov     kernel_ds, ds
  1555. 36259
  1556. 36260 ! Call C startup code to set up a proper environment to run main().
  1557. 36261         push    dx
  1558. 36262         push    bx
  1559. 36263         push    _mon_ss
  1560. 36264         push    cx
  1561. 36265         push    ds
  1562. 36266         push    cs
  1563. 36267         call    _cstart         ! cstart(cs, ds, mcs, mds, parmoff, parmlen)
  1564. 36268         add     sp, #6*2
  1565. 36269
  1566. 36270         cmp     _protected_mode, #0
  1567. 36271         jz      nosw            ! ok to switch to protected mode?
  1568. 36272
  1569. 36273         call    klib_init_prot  ! initialize klib functions for protected mode
  1570. 36274         call    real2prot       ! switch to protected mode
  1571. 36275
  1572. 36276         push    #0              ! set flags to known good state
  1573. 36277         popf                    ! especially, clear nested task and int enable
  1574. 36278 nosw:
  1575. 36279         jmp     _main           ! main()
  1576. 36280
  1577. 36281
  1578. 36282 !*===========================================================================*
  1579. 36283 !*                              interrupt handlers                           *
  1580. 36284 !*===========================================================================*
  1581. 36285
  1582. 36286
  1583. 36287 !*===========================================================================*
  1584. 36288 !*                              hwint00 - 07                                 *
  1585. 36289 !*===========================================================================*
  1586. 36290 ! Note this is a macro, it looks like a subroutine.
  1587. 36291 #define hwint_master(irq)       
  1588. 36292         call    save                    /* save interrupted process state */;
  1589. 36293         inb     INT_CTLMASK                                                 ;
  1590. 36294         orb     al, *[1<<irq]                                               ;
  1591. 36295         outb    INT_CTLMASK             /* disable the irq                */;
  1592. 36296         movb    al, *ENABLE                                                 ;
  1593. 36297         outb    INT_CTL                 /* reenable master 8259           */;
  1594. 36298         sti                             /* enable interrupts              */;
  1595. 36299         mov     ax, *irq                                                    ;
  1596. 36300         push    ax                      /* irq                            */;
  1597. 36301         call    @_irq_table + 2*irq     /* ax = (*irq_table[irq])(irq)    */;
  1598. 36302         pop     cx                                                          ;
  1599. 36303         cli                             /* disable interrupts             */;
  1600. 36304         test    ax, ax                  /* need to reenable irq?          */;
  1601. 36305         jz      0f                                                          ;
  1602. 36306         inb     INT_CTLMASK                                                 ;
  1603. 36307         andb    al, *~[1<<irq]                                              ;
  1604. 36308         outb    INT_CTLMASK             /* enable the irq                 */;
  1605. 36309 0:      ret                             /* restart (another) process      */
  1606. 36310
  1607. 36311 ! Each of these entry points is an expansion of the hwint_master macro
  1608. 36312
  1609. 36313 _hwint00:               ! Interrupt routine for irq 0 (the clock).
  1610. 36314         hwint_master(0)
  1611. 36315
  1612. 36316
  1613. 36317 _hwint01:               ! Interrupt routine for irq 1 (keyboard)
  1614. 36318         hwint_master(1)
  1615. 36319
  1616. 36320
  1617. 36321 _hwint02:               ! Interrupt routine for irq 2 (cascade!)
  1618. 36322         hwint_master(2)
  1619. 36323
  1620. 36324
  1621. 36325 _hwint03:               ! Interrupt routine for irq 3 (second serial)
  1622. 36326         hwint_master(3)
  1623. 36327
  1624. 36328
  1625. 36329 _hwint04:               ! Interrupt routine for irq 4 (first serial)
  1626. 36330         hwint_master(4)
  1627. 36331
  1628. 36332
  1629. 36333 _hwint05:               ! Interrupt routine for irq 5 (XT winchester)
  1630. 36334         hwint_master(5)
  1631. 36335
  1632. 36336
  1633. 36337 _hwint06:               ! Interrupt routine for irq 6 (floppy)
  1634. 36338         hwint_master(6)
  1635. 36339
  1636. 36340
  1637. 36341 _hwint07:               ! Interrupt routine for irq 7 (printer)
  1638. 36342         hwint_master(7)
  1639. 36343
  1640. 36344
  1641. 36345 !*===========================================================================*
  1642. 36346 !*                              hwint08 - 15                                 *
  1643. 36347 !*===========================================================================*
  1644. 36348 ! Note this is a macro, it looks like a subroutine.
  1645. 36349 #define hwint_slave(irq)        
  1646. 36350         call    save                    /* save interrupted process state */;
  1647. 36351         inb     INT2_CTLMASK                                                ;
  1648. 36352         orb     al, *[1<<[irq-8]]                                           ;
  1649. 36353         outb    INT2_CTLMASK            /* disable the irq                */;
  1650. 36354         movb    al, *ENABLE                                                 ;
  1651. 36355         outb    INT_CTL                 /* reenable master 8259           */;
  1652. 36356         jmp     .+2                     /* delay                          */;
  1653. 36357         outb    INT2_CTL                /* reenable slave 8259            */;
  1654. 36358         sti                             /* enable interrupts              */;
  1655. 36359         mov     ax, *irq                                                    ;
  1656. 36360         push    ax                      /* irq                            */;
  1657. 36361         call    @_irq_table + 2*irq     /* eax = (*irq_table[irq])(irq)   */;
  1658. 36362         pop     cx                                                          ;
  1659. 36363         cli                             /* disable interrupts             */;
  1660. 36364         test    ax, ax                  /* need to reenable irq?          */;
  1661. 36365         jz      0f                                                          ;
  1662. 36366         inb     INT2_CTLMASK                                                ;
  1663. 36367         andb    al, *~[1<<[irq-8]]                                          ;
  1664. 36368         outb    INT2_CTLMASK            /* enable the irq                 */;
  1665. 36369 0:      ret                             /* restart (another) process      */
  1666. 36370
  1667. 36371 ! Each of these entry points is an expansion of the hwint_slave macro
  1668. 36372
  1669. 36373 _hwint08:               ! Interrupt routine for irq 8 (realtime clock)
  1670. 36374         hwint_slave(8)
  1671. 36375
  1672. 36376
  1673. 36377 _hwint09:               ! Interrupt routine for irq 9 (irq 2 redirected)
  1674. 36378         hwint_slave(9)
  1675. 36379
  1676. 36380
  1677. 36381 _hwint10:               ! Interrupt routine for irq 10
  1678. 36382         hwint_slave(10)
  1679. 36383
  1680. 36384
  1681. 36385 _hwint11:               ! Interrupt routine for irq 11
  1682. 36386         hwint_slave(11)
  1683. 36387
  1684. 36388
  1685. 36389 _hwint12:               ! Interrupt routine for irq 12
  1686. 36390         hwint_slave(12)
  1687. 36391
  1688. 36392
  1689. 36393 _hwint13:               ! Interrupt routine for irq 13 (FPU exception)
  1690. 36394         hwint_slave(13)
  1691. 36395
  1692. 36396
  1693. 36397 _hwint14:               ! Interrupt routine for irq 14 (AT winchester)
  1694. 36398         hwint_slave(14)
  1695. 36399
  1696. 36400
  1697. 36401 _hwint15:               ! Interrupt routine for irq 15
  1698. 36402         hwint_slave(15)
  1699. 36403
  1700. 36404
  1701. 36405 !*===========================================================================*
  1702. 36406 !*                              save                                         *
  1703. 36407 !*===========================================================================*
  1704. 36408 save:                           ! save the machine state in the proc table.
  1705. 36409
  1706. 36410 ! In protected mode a jump to p_save is patched over the following
  1707. 36411 ! code during initialization.
  1708. 36412
  1709. 36413         cld                     ! set direction flag to a known value
  1710. 36414         push    ds
  1711. 36415         push    si
  1712. 36416   cseg  mov     ds,kernel_ds
  1713. 36417         incb    _k_reenter      ! from -1 if not reentering
  1714. 36418         jnz     push_current_stack      ! stack is already kernel stack
  1715. 36419
  1716. 36420         mov     si,_proc_ptr
  1717. 36421         mov     AXREG(si),ax
  1718. 36422         mov     BXREG(si),bx
  1719. 36423         mov     CXREG(si),cx
  1720. 36424         mov     DXREG(si),dx
  1721. 36425         pop     SIREG(si)
  1722. 36426         mov     DIREG(si),di
  1723. 36427         mov     BPREG(si),bp
  1724. 36428         mov     ESREG(si),es
  1725. 36429         pop     DSREG(si)
  1726. 36430         pop     bx              ! return adr
  1727. 36431         pop     PCREG(si)
  1728. 36432         pop     CSREG(si)
  1729. 36433         pop     PSWREG(si)
  1730. 36434         mov     SPREG(si),sp
  1731. 36435         mov     SSREG(si),ss
  1732. 36436
  1733. 36437         mov     dx,ds
  1734. 36438         mov     ss,dx
  1735. 36439         mov     sp,#k_stktop
  1736. 36440         mov     ax,#_restart    ! build return address for interrupt handler
  1737. 36441         push    ax
  1738. 36442
  1739. 36443 stack_switched:
  1740. 36444         mov     es,dx
  1741. 36445         jmp     (bx)
  1742. 36446
  1743. 36447 push_current_stack:
  1744. 36448         push    es
  1745. 36449         push    bp
  1746. 36450         push    di
  1747. 36451         push    dx
  1748. 36452         push    cx
  1749. 36453         push    bx
  1750. 36454         push    ax
  1751. 36455         mov     bp,sp
  1752. 36456         mov     bx,18(bp)       ! get the return adr; it becomes junk on stack
  1753. 36457         mov     ax,#restart1
  1754. 36458         push    ax
  1755. 36459         mov     dx,ss
  1756. 36460         mov     ds,dx
  1757. 36461         jmp     stack_switched
  1758. 36462
  1759. 36463
  1760. 36464 !*===========================================================================*
  1761. 36465 !*                              s_call                                       *
  1762. 36466 !*===========================================================================*
  1763. 36467 ! This is real mode version. Alternate (_p_s_call) will be used in
  1764. 36468 ! protected mode
  1765. 36469
  1766. 36470 _s_call:                        ! System calls are vectored here.
  1767. 36471                                 ! Do save routine inline for speed,
  1768. 36472                                 ! but do not save ax, bx, cx, dx,
  1769. 36473                                 ! since C does not require preservation,
  1770. 36474                                 ! and ax returns the result code anyway.
  1771. 36475                                 ! Regs bp, si, di get saved by sys_call as
  1772. 36476                                 ! well, but it is impractical not to preserve
  1773. 36477                                 ! them here, in case context gets switched.
  1774. 36478                                 ! Some special-case code in pick_proc()
  1775. 36479                                 ! could avoid this.
  1776. 36480         cld                     ! set direction flag to a known value
  1777. 36481         push    ds
  1778. 36482         push    si
  1779. 36483   cseg  mov     ds,kernel_ds
  1780. 36484         incb    _k_reenter
  1781. 36485         mov     si,_proc_ptr
  1782. 36486         pop     SIREG(si)
  1783. 36487         mov     DIREG(si),di
  1784. 36488         mov     BPREG(si),bp
  1785. 36489         mov     ESREG(si),es
  1786. 36490         pop     DSREG(si)
  1787. 36491         pop     PCREG(si)
  1788. 36492         pop     CSREG(si)
  1789. 36493         pop     PSWREG(si)
  1790. 36494         mov     SPREG(si),sp
  1791. 36495         mov     SSREG(si),ss
  1792. 36496         mov     dx,ds
  1793. 36497         mov     es,dx
  1794. 36498         mov     ss,dx           ! interrupt handlers may not make system calls
  1795. 36499         mov     sp,#k_stktop    ! so stack is not already switched
  1796. 36500                                 ! end of inline save
  1797. 36501                                 ! now set up parameters for C routine sys_call
  1798. 36502         push    bx              ! pointer to user message
  1799. 36503         push    ax              ! src/dest
  1800. 36504         push    cx              ! SEND/RECEIVE/BOTH
  1801. 36505         sti                     ! allow SWITCHER to be interrupted
  1802. 36506         call    _sys_call       ! sys_call(function, src_dest, m_ptr)
  1803. 36507                                 ! caller is now explicitly in proc_ptr
  1804. 36508         mov     AXREG(si),ax    ! sys_call MUST PRESERVE si
  1805. 36509         cli
  1806. 36510
  1807. 36511 ! Fall into code to restart proc/task running.
  1808. 36512
  1809. 36513
  1810. 36514 !*===========================================================================*
  1811. 36515 !*                              restart                                      *
  1812. 36516 !*===========================================================================*
  1813. 36517 _restart:
  1814. 36518
  1815. 36519 ! Flush any held-up interrupts.
  1816. 36520 ! This reenables interrupts, so the current interrupt handler may reenter.
  1817. 36521 ! This does not matter, because the current handler is about to exit and no
  1818. 36522 ! other handlers can reenter since flushing is only done when k_reenter == 0.
  1819. 36523
  1820. 36524 ! In protected mode a jump to p_restart is patched over the following
  1821. 36525 ! code during initialization.
  1822. 36526
  1823. 36527         cmp     _held_head,#0   ! do fast test to usually avoid function call
  1824. 36528         jz      over_call_unhold
  1825. 36529         call    _unhold         ! this is rare so overhead is acceptable
  1826. 36530 over_call_unhold:
  1827. 36531
  1828. 36532         mov     si,_proc_ptr
  1829. 36533         decb    _k_reenter
  1830. 36534         mov     ax,AXREG(si)    ! start restoring registers from proc table
  1831. 36535                                 ! could make AXREG == 0 to use lodw here
  1832. 36536         mov     bx,BXREG(si)
  1833. 36537         mov     cx,CXREG(si)
  1834. 36538         mov     dx,DXREG(si)
  1835. 36539         mov     di,DIREG(si)
  1836. 36540         mov     bp,BPREG(si)
  1837. 36541         mov     es,ESREG(si)
  1838. 36542         mov     ss,SSREG(si)
  1839. 36543         mov     sp,SPREG(si)
  1840. 36544         push    PSWREG(si)      ! fake interrupt stack frame
  1841. 36545         push    CSREG(si)
  1842. 36546         push    PCREG(si)
  1843. 36547                                 ! could put si:ds together to use
  1844. 36548                                 ! lds si,SIREG(si)
  1845. 36549         push    DSREG(si)
  1846. 36550         mov     si,SIREG(si)
  1847. 36551         pop     ds
  1848. 36552         iret
  1849. 36553
  1850. 36554 restart1:
  1851. 36555         decb    _k_reenter
  1852. 36556         pop     ax
  1853. 36557         pop     bx
  1854. 36558         pop     cx
  1855. 36559         pop     dx
  1856. 36560         pop     di
  1857. 36561         pop     bp
  1858. 36562         pop     es
  1859. 36563         pop     si
  1860. 36564         pop     ds
  1861. 36565         add     sp,#2           ! skip return adr
  1862. 36566         iret
  1863. 36567
  1864. 36568
  1865. 36569 !*===========================================================================*
  1866. 36570 !*                              int00-07                                     *
  1867. 36571 !*===========================================================================*
  1868. 36572 ! These are entry points for exceptions (processor generated interrupts, 
  1869. 36573 ! usually caused by error conditions such as an attempt to divide by zero)
  1870. 36574
  1871. 36575 _int00:                         ! interrupt through vector 0
  1872. 36576         push    ax
  1873. 36577         movb    al,#0
  1874. 36578         jmp     exception
  1875. 36579
  1876. 36580 _int01:                         ! interrupt through vector 1, etc
  1877. 36581         push    ax
  1878. 36582         movb    al,#1
  1879. 36583         jmp     exception
  1880. 36584
  1881. 36585 _int02:
  1882. 36586         push    ax
  1883. 36587         movb    al,#2
  1884. 36588         jmp     exception
  1885. 36589
  1886. 36590 _int03:
  1887. 36591         push    ax
  1888. 36592         movb    al,#3
  1889. 36593         jmp     exception
  1890. 36594
  1891. 36595 _int04:
  1892. 36596         push    ax
  1893. 36597         movb    al,#4
  1894. 36598         jmp     exception
  1895. 36599
  1896. 36600 _int05:
  1897. 36601         push    ax
  1898. 36602         movb    al,#5
  1899. 36603         jmp     exception
  1900. 36604
  1901. 36605 _int06:
  1902. 36606         push    ax
  1903. 36607         movb    al,#6
  1904. 36608         jmp     exception
  1905. 36609
  1906. 36610 _int07:
  1907. 36611         push    ax
  1908. 36612         movb    al,#7
  1909. 36613         !jmp    exception
  1910. 36614
  1911. 36615 exception:
  1912. 36616   cseg  movb    ex_number,al    ! it is cumbersome to get this into dseg
  1913. 36617         pop     ax
  1914. 36618         call    save
  1915. 36619   cseg  push    ex_number       ! high byte is constant 0
  1916. 36620         call    _exception      ! do whatever is necessary (sti only if safe)
  1917. 36621         add     sp,#2
  1918. 36622         cli
  1919. 36623         ret
  1920. 36624
  1921. 36625
  1922. 36626 !*===========================================================================*
  1923. 36627 !*                              level0_call                                  *
  1924. 36628 !*===========================================================================*
  1925. 36629 _level0_call:
  1926. 36630         call    save
  1927. 36631         jmp     @_level0_func
  1928. 36632
  1929. 36633
  1930. 36634 !*===========================================================================*
  1931. 36635 !*                              idle_task                                    *
  1932. 36636 !*===========================================================================*
  1933. 36637 _idle_task:                     ! executed when there is no work
  1934. 36638         jmp     _idle_task      ! a "hlt" before this fails in protected mode
  1935. 36639
  1936. 36640
  1937. 36641 !*===========================================================================*
  1938. 36642 !*                              data                                         *
  1939. 36643 !*===========================================================================*
  1940. 36644 ! NB some variables are stored in code segment.
  1941. 36645
  1942. 36646 ex_number:                      ! exception number
  1943. 36647         .space  2
  1944. 36648
  1945. 36649
  1946. 36650 !*===========================================================================*
  1947. 36651 !*                      variants for 286 protected mode                      *
  1948. 36652 !*===========================================================================*
  1949. 36653
  1950. 36654 ! Most routines are different in 286 protected mode.
  1951. 36655 ! The only essential difference is that an interrupt in protected mode
  1952. 36656 ! (usually) switches the stack, so there is less to do in software.
  1953. 36657
  1954. 36658 ! These functions are reached along jumps patched in by klib_init_prot():
  1955. 36659
  1956. 36660         .define         p_restart       ! replaces _restart
  1957. 36661         .define         p_save          ! replaces save
  1958. 36662
  1959. 36663 ! These exception and software-interrupt handlers are enabled by the new
  1960. 36664 ! interrupt vector table set up in protect.c:
  1961. 36665
  1962. 36666         .define         _divide_error           ! _int00
  1963. 36667         .define         _single_step_exception  ! _int01
  1964. 36668         .define         _nmi                    ! _int02
  1965. 36669         .define         _breakpoint_exception   ! _int03
  1966. 36670         .define         _overflow               ! _int04
  1967. 36671         .define         _bounds_check           ! _int05
  1968. 36672         .define         _inval_opcode           ! _int06
  1969. 36673         .define         _copr_not_available     ! _int07
  1970. 36674         .define         _double_fault           ! (286 trap)
  1971. 36675         .define         _copr_seg_overrun       ! (etc)
  1972. 36676         .define         _inval_tss
  1973. 36677         .define         _segment_not_present
  1974. 36678         .define         _stack_exception
  1975. 36679         .define         _general_protection
  1976. 36680         .define         _p_s_call               ! _s_call
  1977. 36681         .define         _level0_call
  1978. 36682
  1979. 36683 ! The hardware interrupt handlers need not be altered apart from putting
  1980. 36684 ! them in the new table (save() handles the differences).
  1981. 36685 ! Some of the intxx handlers (those for exceptions which do not push an
  1982. 36686 ! error code) need not have been replaced, but the names here are better.
  1983. 36687
  1984. 36688 #include "protect.h"
  1985. 36689
  1986. 36690 /* Selected 286 tss offsets. */
  1987. 36691 #define TSS2_S_SP0      2
  1988. 36692
  1989. 36693 ! imported variables
  1990. 36694
  1991. 36695         .extern         _tss
  1992. 36696         .extern         _level0_func
  1993. 36697
  1994. 36698 !*===========================================================================*
  1995. 36699 !*                              p_save                                       *
  1996. 36700 !*===========================================================================*
  1997. 36701 ! Save for 286 protected mode.
  1998. 36702 ! This is much simpler than for 8086 mode, because the stack already points
  1999. 36703 ! into process table, or has already been switched to the kernel stack.
  2000. 36704
  2001. 36705 p_save:
  2002. 36706         cld                     ! set direction flag to a known value
  2003. 36707         pusha                   ! save "general" registers
  2004. 36708         push    ds              ! save ds
  2005. 36709         push    es              ! save es
  2006. 36710         mov     dx,ss           ! ss is kernel data segment
  2007. 36711         mov     ds,dx           ! load rest of kernel segments
  2008. 36712         mov     es,dx
  2009. 36713         mov     bp,sp           ! prepare to return
  2010. 36714         incb    _k_reenter      ! from -1 if not reentering
  2011. 36715         jnz     set_p1_restart  ! stack is already kernel stack
  2012. 36716         mov     sp,#k_stktop
  2013. 36717         push    #p_restart      ! build return address for interrupt handler
  2014. 36718         jmp     @RETADR-P_STACKBASE(bp)
  2015. 36719
  2016. 36720 set_p1_restart:
  2017. 36721         push    #p1_restart
  2018. 36722         jmp     @RETADR-P_STACKBASE(bp)
  2019. 36723
  2020. 36724
  2021. 36725 !*===========================================================================*
  2022. 36726 !*                              p_s_call                                     *
  2023. 36727 !*===========================================================================*
  2024. 36728 _p_s_call:
  2025. 36729         cld                     ! set direction flag to a known value
  2026. 36730         sub     sp,#6*2         ! skip RETADR, ax, cx, dx, bx, st
  2027. 36731         push    bp              ! stack already points into process table
  2028. 36732         push    si
  2029. 36733         push    di
  2030. 36734         push    ds
  2031. 36735         push    es
  2032. 36736         mov     dx,ss
  2033. 36737         mov     ds,dx
  2034. 36738         mov     es,dx
  2035. 36739         incb    _k_reenter
  2036. 36740         mov     si,sp           ! assumes P_STACKBASE == 0
  2037. 36741         mov     sp,#k_stktop
  2038. 36742                                 ! end of inline save
  2039. 36743         sti                     ! allow SWITCHER to be interrupted
  2040. 36744                                 ! now set up parameters for C routine sys_call
  2041. 36745         push    bx              ! pointer to user message
  2042. 36746         push    ax              ! src/dest
  2043. 36747         push    cx              ! SEND/RECEIVE/BOTH
  2044. 36748         call    _sys_call       ! sys_call(function, src_dest, m_ptr)
  2045. 36749                                 ! caller is now explicitly in proc_ptr
  2046. 36750         mov     AXREG(si),ax    ! sys_call MUST PRESERVE si
  2047. 36751         cli
  2048. 36752
  2049. 36753 ! Fall into code to restart proc/task running.
  2050. 36754
  2051. 36755 p_restart:
  2052. 36756
  2053. 36757 ! Flush any held-up interrupts.
  2054. 36758 ! This reenables interrupts, so the current interrupt handler may reenter.
  2055. 36759 ! This does not matter, because the current handler is about to exit and no
  2056. 36760 ! other handlers can reenter since flushing is only done when k_reenter == 0.
  2057. 36761
  2058. 36762         cmp     _held_head,#0   ! do fast test to usually avoid function call
  2059. 36763         jz      p_over_call_unhold
  2060. 36764         call    _unhold         ! this is rare so overhead is acceptable
  2061. 36765 p_over_call_unhold:
  2062. 36766         mov     si,_proc_ptr
  2063. 36767         lldt    P_LDT_SEL(si)           ! enable segment descriptors for task
  2064. 36768         lea     ax,P_STACKTOP(si)       ! arrange for next interrupt
  2065. 36769         mov     _tss+TSS2_S_SP0,ax      ! to save state in process table
  2066. 36770         mov     sp,si           ! assumes P_STACKBASE == 0
  2067. 36771 p1_restart:
  2068. 36772         decb    _k_reenter
  2069. 36773         pop     es
  2070. 36774         pop     ds
  2071. 36775         popa
  2072. 36776         add     sp,#2           ! skip return adr
  2073. 36777         iret                    ! continue process
  2074. 36778
  2075. 36779
  2076. 36780 !*===========================================================================*
  2077. 36781 !*                              exception handlers                           *
  2078. 36782 !*===========================================================================*
  2079. 36783 _divide_error:
  2080. 36784         push    #DIVIDE_VECTOR
  2081. 36785         jmp     p_exception
  2082. 36786
  2083. 36787 _single_step_exception:
  2084. 36788         push    #DEBUG_VECTOR
  2085. 36789         jmp     p_exception
  2086. 36790
  2087. 36791 _nmi:
  2088. 36792         push    #NMI_VECTOR
  2089. 36793         jmp     p_exception
  2090. 36794
  2091. 36795 _breakpoint_exception:
  2092. 36796         push    #BREAKPOINT_VECTOR
  2093. 36797         jmp     p_exception
  2094. 36798
  2095. 36799 _overflow:
  2096. 36800         push    #OVERFLOW_VECTOR
  2097. 36801         jmp     p_exception
  2098. 36802
  2099. 36803 _bounds_check:
  2100. 36804         push    #BOUNDS_VECTOR
  2101. 36805         jmp     p_exception
  2102. 36806
  2103. 36807 _inval_opcode:
  2104. 36808         push    #INVAL_OP_VECTOR
  2105. 36809         jmp     p_exception
  2106. 36810
  2107. 36811 _copr_not_available:
  2108. 36812         push    #COPROC_NOT_VECTOR
  2109. 36813         jmp     p_exception
  2110. 36814
  2111. 36815 _double_fault:
  2112. 36816         push    #DOUBLE_FAULT_VECTOR
  2113. 36817         jmp     errexception
  2114. 36818
  2115. 36819 _copr_seg_overrun:
  2116. 36820         push    #COPROC_SEG_VECTOR
  2117. 36821         jmp     p_exception
  2118. 36822
  2119. 36823 _inval_tss:
  2120. 36824         push    #INVAL_TSS_VECTOR
  2121. 36825         jmp     errexception
  2122. 36826
  2123. 36827 _segment_not_present:
  2124. 36828         push    #SEG_NOT_VECTOR
  2125. 36829         jmp     errexception
  2126. 36830
  2127. 36831 _stack_exception:
  2128. 36832         push    #STACK_FAULT_VECTOR
  2129. 36833         jmp     errexception
  2130. 36834
  2131. 36835 _general_protection:
  2132. 36836         push    #PROTECTION_VECTOR
  2133. 36837         jmp     errexception
  2134. 36838
  2135. 36839
  2136. 36840 !*===========================================================================*
  2137. 36841 !*                              p_exception                                  *
  2138. 36842 !*===========================================================================*
  2139. 36843 ! This is called for all exceptions which do not push an error code.
  2140. 36844
  2141. 36845 p_exception:
  2142. 36846   sseg  pop     ds_ex_number
  2143. 36847         call    p_save
  2144. 36848         jmp     p1_exception
  2145. 36849
  2146. 36850
  2147. 36851 !*===========================================================================*
  2148. 36852 !*                              errexception                                 *
  2149. 36853 !*===========================================================================*
  2150. 36854 ! This is called for all exceptions which push an error code.
  2151. 36855
  2152. 36856 errexception:
  2153. 36857   sseg  pop     ds_ex_number
  2154. 36858   sseg  pop     trap_errno
  2155. 36859         call    p_save
  2156. 36860 p1_exception:                   ! Common for all exceptions.
  2157. 36861         push    ds_ex_number
  2158. 36862         call    _exception
  2159. 36863         add     sp,#2
  2160. 36864         cli
  2161. 36865         ret
  2162. 36866
  2163. 36867
  2164. 36868 !*===========================================================================*
  2165. 36869 !*                              data                                         *
  2166. 36870 !*===========================================================================*
  2167. 36871 ! These declarations assure that storage will be allocated at the very 
  2168. 36872 ! beginning of the kernel data section, so the boot monitor can be easily 
  2169. 36873 ! told how to patch these locations. Note that the magic number is put
  2170. 36874 ! here by the compiler, but will be read by, and then overwritten by,
  2171. 36875 ! the boot monitor. When the kernel starts the sizes array will be
  2172. 36876 ! found here, as if it had been initialized by the compiler.
  2173. 36877
  2174. 36878         .data
  2175. 36879 begdata:
  2176. 36880 _sizes:                         ! sizes of kernel, mm, fs filled in by boot
  2177. 36881         .data2  0x526F          ! this must be the first data entry (magic #)
  2178. 36882         .space  16*2*2-2        ! monitor uses previous 2 words and this space
  2179. 36883                                 ! extra space allows for additional servers
  2180. 36884         .bss
  2181. 36885 begbss:
  2182. 36886 k_stack:
  2183. 36887         .space  K_STACK_BYTES   ! kernel stack
  2184. 36888 k_stktop:                       ! top of kernel stack
  2185. 36889 ds_ex_number:
  2186. 36890         .space  2
  2187. 36891 trap_errno:
  2188. 36892         .space  2
  2189. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2190. src/kernel/keymaps/genmap.c    
  2191. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2192. 36900 /*      genmap - output binary keymap                   Author: Marcus Hampel
  2193. 36901  */
  2194. 36902 #include <sys/types.h>
  2195. 36903 #include <minix/keymap.h>
  2196. 36904 #include <fcntl.h>
  2197. 36905 #include <unistd.h>
  2198. 36906 #include <stdlib.h>
  2199. 36907 #include <string.h>
  2200. 36908 #include <errno.h>
  2201. 36909
  2202. 36910 #include KEYSRC
  2203. 36911
  2204. 36912 u8_t comprmap[4 + NR_SCAN_CODES * MAP_COLS * 9/8 * 2 + 1];
  2205. 36913
  2206. 36914 void tell(const char *s)
  2207. 36915 {
  2208. 36916   write(2, s, strlen(s));
  2209. 36917 }
  2210. 36919 int main(void)
  2211. 36920 {
  2212. 36921   u8_t *cm, *fb;
  2213. 36922   u16_t *km;
  2214. 36923   int n;
  2215. 36924
  2216. 36925   /* Compress the keymap. */
  2217. 36926   memcpy(comprmap, KEY_MAGIC, 4);
  2218. 36927   cm = comprmap + 4;
  2219. 36928   n = 8;
  2220. 36929   for (km = keymap; km < keymap + NR_SCAN_CODES * MAP_COLS; km++) {
  2221. 36930         if (n == 8) {
  2222. 36931                 /* Allocate a new flag byte. */
  2223. 36932                 fb = cm;
  2224. 36933                 *cm++ = 0;
  2225. 36934                 n= 0;
  2226. 36935         }
  2227. 36936         *cm++ = (*km & 0x00FF);         /* Low byte. */
  2228. 36937         if (*km & 0xFF00) {
  2229. 36938                 *cm++ = (*km >> 8);     /* High byte only when set. */
  2230. 36939                 *fb |= (1 << n);        /* Set a flag if so. */
  2231. 36940         }
  2232. 36941         n++;
  2233. 36942   }
  2234. 36943
  2235. 36944   /* Don't store trailing zeros. */
  2236. 36945   while (cm > comprmap && cm[-1] == 0) cm--;
  2237. 36946
  2238. 36947   /* Emit the compressed keymap. */
  2239. 36948   if (write(1, comprmap, cm - comprmap) < 0) {
  2240. 36949         int err = errno;
  2241. 36950
  2242. 36951         tell("genmap: ");
  2243. 36952         tell(strerror(err));
  2244. 36953         tell("n");
  2245. 36954         exit(1);
  2246. 36955   }
  2247. 36956   exit(0);
  2248. 36957 }
  2249. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2250. src/kernel/keymaps/french.src    
  2251. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2252. 37000 /* Keymap for the French keyboard. */
  2253. 37001
  2254. 37002 u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
  2255. 37003
  2256. 37004 /* scan-code            !Shift  Shift   Alt     AltGr   Alt+Sh  Ctrl    */
  2257. 37005 /* ==================================================================== */
  2258. 37006 /* 00 - none    */      0,      0,      0,      0,      0,      0,      
  2259. 37007 /* 01 - ESC     */      C('['), C('['), CA('['),C('['), C('['), C('['),
  2260. 37008 /* 02 - '1'     */      '&',    '1',    A('1'), '&',    '1',    C('A'),
  2261. 37009 /* 03 - '2'     */      0202,   '2',    A('2'), '~',    '2',    C('B'),
  2262. 37010 /* 04 - '3'     */      '"',    '3',    A('3'), '#',    '3',    C('C'),
  2263. 37011 /* 05 - '4'     */      ''',   '4',    A('4'), '{',    '4',    C('D'),
  2264. 37012 /* 06 - '5'     */      '(',    '5',    A('5'), '[',    '5',    C('E'),
  2265. 37013 /* 07 - '6'     */      '-',    '6',    A('6'), '|',    '6',    C('F'),
  2266. 37014 /* 08 - '7'     */      0212,   '7',    A('7'), '`',    '7',    C('G'),
  2267. 37015 /* 09 - '8'     */      '_',    '8',    A('8'), '\',   '8',    C('H'),
  2268. 37016 /* 10 - '9'     */      0207,   '9',    A('9'), '^',    '9',    C('I'),
  2269. 37017 /* 11 - '0'     */      0205,   '0',    A('0'), '@',    '0',    C('J'),
  2270. 37018 /* 12 - '-'     */      ')',    0370,   A(')'), ']',    '-',    C('K'),
  2271. 37019 /* 13 - '='     */      '=',    '+',    A('='), '}',    '=',    C('L'),
  2272. 37020 /* 14 - BS      */      C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,   
  2273. 37021 /* 15 - TAB     */      C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
  2274. 37022 /* 16 - 'q'     */      L('a'), 'A',    A('a'), 'a',    'Q',    C('A'),
  2275. 37023 /* 17 - 'w'     */      L('z'), 'Z',    A('z'), 'z',    'W',    C('Z'),
  2276. 37024 /* 18 - 'e'     */      L('e'), 'E',    A('e'), 'e',    'E',    C('E'),
  2277. 37025 /* 19 - 'r'     */      L('r'), 'R',    A('r'), 'r',    'R',    C('R'),
  2278. 37026 /* 20 - 't'     */      L('t'), 'T',    A('t'), 't',    'T',    C('T'),
  2279. 37027 /* 21 - 'y'     */      L('y'), 'Y',    A('y'), 'y',    'Y',    C('Y'),
  2280. 37028 /* 22 - 'u'     */      L('u'), 'U',    A('u'), 'u',    'U',    C('U'),
  2281. 37029 /* 23 - 'i'     */      L('i'), 'I',    A('i'), 'i',    'I',    C('I'),
  2282. 37030 /* 24 - 'o'     */      L('o'), 'O',    A('o'), 'o',    'O',    C('O'),
  2283. 37031 /* 25 - 'p'     */      L('p'), 'P',    A('p'), 'p',    'P',    C('P'),
  2284. 37032 /* 26 - '['     */      '^',    '"',    A('^'), '^',    '[',    C('^'),
  2285. 37033 /* 27 - ']'     */      '$',    0234,   A('$'), '$',    ']',    C('$'),
  2286. 37034 /* 28 - CR/LF   */      C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
  2287. 37035 /* 29 - Ctrl    */      CTRL,   CTRL,   CTRL,   CTRL,   CTRL,   CTRL,
  2288. 37036 /* 30 - 'a'     */      L('q'), 'Q',    A('q'), 'q',    'A',    C('Q'),
  2289. 37037 /* 31 - 's'     */      L('s'), 'S',    A('s'), 's',    'S',    C('S'),
  2290. 37038 /* 32 - 'd'     */      L('d'), 'D',    A('d'), 'd',    'D',    C('D'),
  2291. 37039 /* 33 - 'f'     */      L('f'), 'F',    A('f'), 'f',    'F',    C('F'),
  2292. 37040 /* 34 - 'g'     */      L('g'), 'G',    A('g'), 'g',    'G',    C('G'),
  2293. 37041 /* 35 - 'h'     */      L('h'), 'H',    A('h'), 'h',    'H',    C('H'),
  2294. 37042 /* 36 - 'j'     */      L('j'), 'J',    A('j'), 'j',    'J',    C('J'),
  2295. 37043 /* 37 - 'k'     */      L('k'), 'K',    A('k'), 'k',    'K',    C('K'),
  2296. 37044 /* 38 - 'l'     */      L('l'), 'L',    A('l'), 'l',    'L',    C('L'),
  2297. 37045 /* 39 - ';'     */      L('m'), 'M',    A('m'), 'm',    'M',    C('M'),
  2298. 37046 /* 40 - '''    */      0227,   '%',    A('%'), 0227,   '\',   C('G'),
  2299. 37047 /* 41 - '`'     */      0375,   0375,   0375,   0375,   '`',    C('['),
  2300. 37048 /* 42 - l. SHIFT*/      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2301. 37049 /* 43 - '`'     */      '*',    0346,   A('*'), '*',    '`',    C('*'),
  2302. 37050 /* 44 - 'z'     */      L('w'), 'W',    A('w'), 'w',    'Z',    C('W'),
  2303. 37051 /* 45 - 'x'     */      L('x'), 'X',    A('x'), 'x',    'X',    C('X'),
  2304. 37052 /* 46 - 'c'     */      L('c'), 'C',    A('c'), 'c',    'C',    C('C'),
  2305. 37053 /* 47 - 'v'     */      L('v'), 'V',    A('v'), 'v',    'V',    C('V'),
  2306. 37054 /* 48 - 'b'     */      L('b'), 'B',    A('b'), 'b',    'B',    C('B'),
  2307. 37055 /* 49 - 'n'     */      L('n'), 'N',    A('n'), 'n',    'N',    C('N'),
  2308. 37056 /* 50 - 'm'     */      ',',    '?',    A(','), ',',    'm',    C('@'),
  2309. 37057 /* 51 - ','     */      ';',    '.',    A(';'), ';',    ',',    C('@'),
  2310. 37058 /* 52 - '.'     */      ':',    '/',    A(':'), ':',    '.',    C('@'),
  2311. 37059 /* 53 - '/'     */      '!', '$'/*025*/,A('!'), '!',    '/',    C('@'),
  2312. 37060 /* 54 - r. SHIFT*/      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2313. 37061 /* 55 - '*'     */      '*',    '*',    A('*'), '*',    '*',    C('@'),
  2314. 37062 /* 56 - ALT     */      ALT,    ALT,    ALT,    ALT,    ALT,    ALT,
  2315. 37063 /* 57 - ' '     */      ' ',    ' ',    A(' '), ' ',    ' ',    C('@'),
  2316. 37064 /* 58 - CapsLck */      CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
  2317. 37065 /* 59 - F1      */      F1,     SF1,    AF1,    AF1,    ASF1,   CF1,
  2318. 37066 /* 60 - F2      */      F2,     SF2,    AF2,    AF2,    ASF2,   CF2,
  2319. 37067 /* 61 - F3      */      F3,     SF3,    AF3,    AF3,    ASF3,   CF3,
  2320. 37068 /* 62 - F4      */      F4,     SF4,    AF4,    AF4,    ASF4,   CF4,
  2321. 37069 /* 63 - F5      */      F5,     SF5,    AF5,    AF5,    ASF5,   CF5,
  2322. 37070 /* 64 - F6      */      F6,     SF6,    AF6,    AF6,    ASF6,   CF6,
  2323. 37071 /* 65 - F7      */      F7,     SF7,    AF7,    AF7,    ASF7,   CF7,
  2324. 37072 /* 66 - F8      */      F8,     SF8,    AF8,    AF8,    ASF8,   CF8,
  2325. 37073 /* 67 - F9      */      F9,     SF9,    AF9,    AF9,    ASF9,   CF9,
  2326. 37074 /* 68 - F10     */      F10,    SF10,   AF10,   AF10,   ASF10,  CF10,
  2327. 37075 /* 69 - NumLock */      NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,
  2328. 37076 /* 70 - ScrLock */      SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,
  2329. 37077 /* 71 - Home    */      HOME,   '7',    AHOME,  AHOME,  '7',    CHOME,  
  2330. 37078 /* 72 - CurUp   */      UP,     '8',    AUP,    AUP,    '8',    CUP,
  2331. 37079 /* 73 - PgUp    */      PGUP,   '9',    APGUP,  APGUP,  '9',    CPGUP,
  2332. 37080 /* 74 - '-'     */      NMIN,   '-',    ANMIN,  ANMIN,  '-',    CNMIN,
  2333. 37081 /* 75 - Left    */      LEFT,   '4',    ALEFT,  ALEFT,  '4',    CLEFT,
  2334. 37082 /* 76 - MID     */      MID,    '5',    AMID,   AMID,   '5',    CMID,
  2335. 37083 /* 77 - Right   */      RIGHT,  '6',    ARIGHT, ARIGHT, '6',    CRIGHT,
  2336. 37084 /* 78 - '+'     */      PLUS,   '+',    APLUS,  APLUS,  '+',    CPLUS,
  2337. 37085 /* 79 - End     */      END,    '1',    AEND,   AEND,   '1',    CEND,
  2338. 37086 /* 80 - Down    */      DOWN,   '2',    ADOWN,  ADOWN,  '2',    CDOWN,
  2339. 37087 /* 81 - PgDown  */      PGDN,   '3',    APGDN,  APGDN,  '3',    CPGDN,
  2340. 37088 /* 82 - Insert  */      INSRT,  '0',    AINSRT, AINSRT, '0',    CINSRT,
  2341. 37089 /* 83 - Delete  */      0177,   '.',    A(0177),0177,   '.',    0177,
  2342. 37090 /* 84 - Enter   */      C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
  2343. 37091 /* 85 - ???     */      0,      0,      0,      0,      0,      0,
  2344. 37092 /* 86 - ???     */      '<',    '>',    A('<'), '<',    '>',    C('@'),
  2345. 37093 /* 87 - F11     */      F11,    SF11,   AF11,   AF11,   ASF11,  CF11,
  2346. 37094 /* 88 - F12     */      F12,    SF12,   AF12,   AF12,   ASF12,  CF12,
  2347. 37095 /* 89 - ???     */      0,      0,      0,      0,      0,      0,
  2348. 37096 /* 90 - ???     */      0,      0,      0,      0,      0,      0,
  2349. 37097 /* 91 - ???     */      0,      0,      0,      0,      0,      0,
  2350. 37098 /* 92 - ???     */      0,      0,      0,      0,      0,      0,
  2351. 37099 /* 93 - ???     */      0,      0,      0,      0,      0,      0,
  2352. 37100 /* 94 - ???     */      0,      0,      0,      0,      0,      0,
  2353. 37101 /* 95 - ???     */      0,      0,      0,      0,      0,      0,
  2354. 37102 /* 96 - EXT_KEY */      EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
  2355. 37103 /* 97 - ???     */      0,      0,      0,      0,      0,      0,
  2356. 37104 /* 98 - ???     */      0,      0,      0,      0,      0,      0,
  2357. 37105 /* 99 - ???     */      0,      0,      0,      0,      0,      0,
  2358. 37106 /*100 - ???     */      0,      0,      0,      0,      0,      0,
  2359. 37107 /*101 - ???     */      0,      0,      0,      0,      0,      0,
  2360. 37108 /*102 - ???     */      0,      0,      0,      0,      0,      0,
  2361. 37109 /*103 - ???     */      0,      0,      0,      0,      0,      0,
  2362. 37110 /*104 - ???     */      0,      0,      0,      0,      0,      0,
  2363. 37111 /*105 - ???     */      0,      0,      0,      0,      0,      0,
  2364. 37112 /*106 - ???     */      0,      0,      0,      0,      0,      0,
  2365. 37113 /*107 - ???     */      0,      0,      0,      0,      0,      0,
  2366. 37114 /*108 - ???     */      0,      0,      0,      0,      0,      0,
  2367. 37115 /*109 - ???     */      0,      0,      0,      0,      0,      0,
  2368. 37116 /*110 - ???     */      0,      0,      0,      0,      0,      0,
  2369. 37117 /*111 - ???     */      0,      0,      0,      0,      0,      0,
  2370. 37118 /*112 - ???     */      0,      0,      0,      0,      0,      0,
  2371. 37119 /*113 - ???     */      0,      0,      0,      0,      0,      0,
  2372. 37120 /*114 - ???     */      0,      0,      0,      0,      0,      0,
  2373. 37121 /*115 - ???     */      0,      0,      0,      0,      0,      0,
  2374. 37122 /*116 - ???     */      0,      0,      0,      0,      0,      0,
  2375. 37123 /*117 - ???     */      0,      0,      0,      0,      0,      0,
  2376. 37124 /*118 - ???     */      0,      0,      0,      0,      0,      0,
  2377. 37125 /*119 - ???     */      0,      0,      0,      0,      0,      0,
  2378. 37126 /*120 - ???     */      0,      0,      0,      0,      0,      0,
  2379. 37127 /*121 - ???     */      0,      0,      0,      0,      0,      0,
  2380. 37128 /*122 - ???     */      0,      0,      0,      0,      0,      0,
  2381. 37129 /*123 - ???     */      0,      0,      0,      0,      0,      0,
  2382. 37130 /*124 - ???     */      0,      0,      0,      0,      0,      0,
  2383. 37131 /*125 - ???     */      0,      0,      0,      0,      0,      0,
  2384. 37132 /*126 - ???     */      0,      0,      0,      0,      0,      0,
  2385. 37133 /*127 - ???     */      0,      0,      0,      0,      0,      0
  2386. 37134 };
  2387. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2388. src/kernel/keymaps/german.src    
  2389. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2390. 37200 /* Keymap for German MF-2 keyboard. */
  2391. 37201
  2392. 37202 u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
  2393. 37203
  2394. 37204 /* scan-code            unsh    Shift   Alt     AltGr   Alt+Sh  Strg    */
  2395. 37205 /* ==================================================================== */
  2396. 37206 /* 00 - none    */      0,      0,      0,      0,      0,      0,      
  2397. 37207 /* 01 - ESC     */      C('['), C('['), CA('['),C('['), C('['), C('['),
  2398. 37208 /* 02 - '1'     */      '1',    '!',    A('1'), '1',    '!',    C('A'),
  2399. 37209 /* 03 - '2'     */      '2',    '"',    A('2'), 0375,   '@',    C('@'),
  2400. 37210 /* 04 - '3'     */      '3',    025,    A('3'), 0374,   '#',    C('C'),
  2401. 37211 /* 05 - '4'     */      '4',    '$',    A('4'), '4',    '$',    C('D'),
  2402. 37212 /* 06 - '5'     */      '5',    '%',    A('5'), '5',    '%',    C('E'),
  2403. 37213 /* 07 - '6'     */      '6',    '&',    A('6'), '6',    '^',    C('^'),
  2404. 37214 /* 08 - '7'     */      '7',    '/',    A('7'), '{',    '&',    C('G'),
  2405. 37215 /* 09 - '8'     */      '8',    '(',    A('8'), '[',    '*',    C('H'),
  2406. 37216 /* 10 - '9'     */      '9',    ')',    A('9'), ']',    '(',    C('I'),
  2407. 37217 /* 11 - '0'     */      '0',    '=',    A('0'), '}',    ')',    C('@'),
  2408. 37218 /* 12 - '-'     */      0341,   '?',    0341,   '\',   '_',    C('_'),
  2409. 37219 /* 13 - '='     */      ''',   '`',    A('''),'=',    '+',    C('@'),
  2410. 37220 /* 14 - BS      */      C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,   
  2411. 37221 /* 15 - TAB     */      C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
  2412. 37222 /* 16 - 'q'     */      L('q'), 'Q',    A('q'), '@',    'Q',    C('Q'),
  2413. 37223 /* 17 - 'w'     */      L('w'), 'W',    A('w'), 'w',    'W',    C('W'),
  2414. 37224 /* 18 - 'e'     */      L('e'), 'E',    A('e'), 'e',    'E',    C('E'),
  2415. 37225 /* 19 - 'r'     */      L('r'), 'R',    A('r'), 'r',    'R',    C('R'),
  2416. 37226 /* 20 - 't'     */      L('t'), 'T',    A('t'), 't',    'T',    C('T'),
  2417. 37227 /* 21 - 'y'     */      L('z'), 'Z',    A('z'), 'z',    'Z',    C('Z'),
  2418. 37228 /* 22 - 'u'     */      L('u'), 'U',    A('u'), 'u',    'U',    C('U'),
  2419. 37229 /* 23 - 'i'     */      L('i'), 'I',    A('i'), 'i',    'I',    C('I'),
  2420. 37230 /* 24 - 'o'     */      L('o'), 'O',    A('o'), 'o',    'O',    C('O'),
  2421. 37231 /* 25 - 'p'     */      L('p'), 'P',    A('p'), 'p',    'P',    C('P'),
  2422. 37232 /* 26 - '['     */      L(0201),0232,   0201,   '[',    '{',    C('['),
  2423. 37233 /* 27 - ']'     */      '+',    '*',    A('+'), '~',    ']',    C(']'),
  2424. 37234 /* 28 - CR/LF   */      C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
  2425. 37235 /* 29 - Strg;-) */      CTRL,   CTRL,   CTRL,   CTRL,   CTRL,   CTRL,
  2426. 37236 /* 30 - 'a'     */      L('a'), 'A',    A('a'), 'a',    'A',    C('A'),
  2427. 37237 /* 31 - 's'     */      L('s'), 'S',    A('s'), 's',    'S',    C('S'),
  2428. 37238 /* 32 - 'd'     */      L('d'), 'D',    A('d'), 'd',    'D',    C('D'),
  2429. 37239 /* 33 - 'f'     */      L('f'), 'F',    A('f'), 'f',    'F',    C('F'),
  2430. 37240 /* 34 - 'g'     */      L('g'), 'G',    A('g'), 'g',    'G',    C('G'),
  2431. 37241 /* 35 - 'h'     */      L('h'), 'H',    A('h'), 'h',    'H',    C('H'),
  2432. 37242 /* 36 - 'j'     */      L('j'), 'J',    A('j'), 'j',    'J',    C('J'),
  2433. 37243 /* 37 - 'k'     */      L('k'), 'K',    A('k'), 'k',    'K',    C('K'),
  2434. 37244 /* 38 - 'l'     */      L('l'), 'L',    A('l'), 'l',    'L',    C('L'),
  2435. 37245 /* 39 - ';'     */      L(0224),0231,   0224,   ';',    ':',    C('@'),
  2436. 37246 /* 40 - '''    */      L(0204),0216,   0204,   ''',   '"',    C('@'),
  2437. 37247 /* 41 - '`'     */      '^',    0370,   A('^'), '`',    '~',    C('^'),
  2438. 37248 /* 42 - SHIFT   */      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2439. 37249 /* 43 - '\'    */      '#',    ''',   A('#'), '\',   '|',    C('\'),
  2440. 37250 /* 44 - 'z'     */      L('y'), 'Y',    A('y'), 'y',    'Y',    C('Y'),
  2441. 37251 /* 45 - 'x'     */      L('x'), 'X',    A('x'), 'x',    'X',    C('X'),
  2442. 37252 /* 46 - 'c'     */      L('c'), 'C',    A('c'), 'c',    'C',    C('C'),
  2443. 37253 /* 47 - 'v'     */      L('v'), 'V',    A('v'), 'v',    'V',    C('V'),
  2444. 37254 /* 48 - 'b'     */      L('b'), 'B',    A('b'), 'b',    'B',    C('B'),
  2445. 37255 /* 49 - 'n'     */      L('n'), 'N',    A('n'), 'n',    'N',    C('N'),
  2446. 37256 /* 50 - 'm'     */      L('m'), 'M',    A('m'), 0346,   'M',    C('M'),
  2447. 37257 /* 51 - ','     */      ',',    ';',    A(','), ',',    '<',    C('@'),
  2448. 37258 /* 52 - '.'     */      '.',    ':',    A('.'), '.',    '>',    C('@'),
  2449. 37259 /* 53 - '/'     */      '-',    '_',    A('-'), '/',    '?',    C('_'),
  2450. 37260 /* 54 - SHIFT   */      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2451. 37261 /* 55 - '*'     */      '*',    '*',    A('*'), '*',    '*',    C('@'),
  2452. 37262 /* 56 - ALT     */      ALT,    ALT,    ALT,    ALT,    ALT,    ALT,
  2453. 37263 /* 57 - ' '     */      ' ',    ' ',    A(' '), ' ',    ' ',    C('@'),
  2454. 37264 /* 58 - CapsLck */      CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
  2455. 37265 /* 59 - F1      */      F1,     SF1,    AF1,    AF1,    ASF1,   CF1,
  2456. 37266 /* 60 - F2      */      F2,     SF2,    AF2,    AF2,    ASF2,   CF2,
  2457. 37267 /* 61 - F3      */      F3,     SF3,    AF3,    AF3,    ASF3,   CF3,
  2458. 37268 /* 62 - F4      */      F4,     SF4,    AF4,    AF4,    ASF4,   CF4,
  2459. 37269 /* 63 - F5      */      F5,     SF5,    AF5,    AF5,    ASF5,   CF5,
  2460. 37270 /* 64 - F6      */      F6,     SF6,    AF6,    AF6,    ASF6,   CF6,
  2461. 37271 /* 65 - F7      */      F7,     SF7,    AF7,    AF7,    ASF7,   CF7,
  2462. 37272 /* 66 - F8      */      F8,     SF8,    AF8,    AF8,    ASF8,   CF8,
  2463. 37273 /* 67 - F9      */      F9,     SF9,    AF9,    AF9,    ASF9,   CF9,
  2464. 37274 /* 68 - F10     */      F10,    SF10,   AF10,   AF10,   ASF10,  CF10,
  2465. 37275 /* 69 - NumLock */      NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,
  2466. 37276 /* 70 - ScrLock */      SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,
  2467. 37277 /* 71 - Home    */      HOME,   '7',    AHOME,  AHOME,  '7',    CHOME,  
  2468. 37278 /* 72 - CurUp   */      UP,     '8',    AUP,    AUP,    '8',    CUP,
  2469. 37279 /* 73 - PgUp    */      PGUP,   '9',    APGUP,  APGUP,  '9',    CPGUP,
  2470. 37280 /* 74 - '-'     */      NMIN,   '-',    ANMIN,  ANMIN,  '-',    CNMIN,
  2471. 37281 /* 75 - Left    */      LEFT,   '4',    ALEFT,  ALEFT,  '4',    CLEFT,
  2472. 37282 /* 76 - MID     */      MID,    '5',    AMID,   AMID,   '5',    CMID,
  2473. 37283 /* 77 - Right   */      RIGHT,  '6',    ARIGHT, ARIGHT, '6',    CRIGHT,
  2474. 37284 /* 78 - '+'     */      PLUS,   '+',    APLUS,  APLUS,  '+',    CPLUS,
  2475. 37285 /* 79 - End     */      END,    '1',    AEND,   AEND,   '1',    CEND,
  2476. 37286 /* 80 - Down    */      DOWN,   '2',    ADOWN,  ADOWN,  '2',    CDOWN,
  2477. 37287 /* 81 - PgDown  */      PGDN,   '3',    APGDN,  APGDN,  '3',    CPGDN,
  2478. 37288 /* 82 - Insert  */      INSRT,  '0',    AINSRT, AINSRT, '0',    CINSRT,
  2479. 37289 /* 83 - Delete  */      0177,   '.',    A(0177),0177,   '.',    0177,
  2480. 37290 /* 84 - Enter   */      C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
  2481. 37291 /* 85 - ???     */      0,      0,      0,      0,      0,      0,
  2482. 37292 /* 86 - ???     */      '<',    '>',    A('<'), '|',    '>',    C('@'),
  2483. 37293 /* 87 - F11     */      F11,    SF11,   AF11,   AF11,   ASF11,  CF11,
  2484. 37294 /* 88 - F12     */      F12,    SF12,   AF12,   AF12,   ASF12,  CF12,
  2485. 37295 /* 89 - ???     */      0,      0,      0,      0,      0,      0,
  2486. 37296 /* 90 - ???     */      0,      0,      0,      0,      0,      0,
  2487. 37297 /* 91 - ???     */      0,      0,      0,      0,      0,      0,
  2488. 37298 /* 92 - ???     */      0,      0,      0,      0,      0,      0,
  2489. 37299 /* 93 - ???     */      0,      0,      0,      0,      0,      0,
  2490. 37300 /* 94 - ???     */      0,      0,      0,      0,      0,      0,
  2491. 37301 /* 95 - ???     */      0,      0,      0,      0,      0,      0,
  2492. 37302 /* 96 - EXT_KEY */      EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
  2493. 37303 /* 97 - ???     */      0,      0,      0,      0,      0,      0,
  2494. 37304 /* 98 - ???     */      0,      0,      0,      0,      0,      0,
  2495. 37305 /* 99 - ???     */      0,      0,      0,      0,      0,      0,
  2496. 37306 /*100 - ???     */      0,      0,      0,      0,      0,      0,
  2497. 37307 /*101 - ???     */      0,      0,      0,      0,      0,      0,
  2498. 37308 /*102 - ???     */      0,      0,      0,      0,      0,      0,
  2499. 37309 /*103 - ???     */      0,      0,      0,      0,      0,      0,
  2500. 37310 /*104 - ???     */      0,      0,      0,      0,      0,      0,
  2501. 37311 /*105 - ???     */      0,      0,      0,      0,      0,      0,
  2502. 37312 /*106 - ???     */      0,      0,      0,      0,      0,      0,
  2503. 37313 /*107 - ???     */      0,      0,      0,      0,      0,      0,
  2504. 37314 /*108 - ???     */      0,      0,      0,      0,      0,      0,
  2505. 37315 /*109 - ???     */      0,      0,      0,      0,      0,      0,
  2506. 37316 /*110 - ???     */      0,      0,      0,      0,      0,      0,
  2507. 37317 /*111 - ???     */      0,      0,      0,      0,      0,      0,
  2508. 37318 /*112 - ???     */      0,      0,      0,      0,      0,      0,
  2509. 37319 /*113 - ???     */      0,      0,      0,      0,      0,      0,
  2510. 37320 /*114 - ???     */      0,      0,      0,      0,      0,      0,
  2511. 37321 /*115 - ???     */      0,      0,      0,      0,      0,      0,
  2512. 37322 /*116 - ???     */      0,      0,      0,      0,      0,      0,
  2513. 37323 /*117 - ???     */      0,      0,      0,      0,      0,      0,
  2514. 37324 /*118 - ???     */      0,      0,      0,      0,      0,      0,
  2515. 37325 /*119 - ???     */      0,      0,      0,      0,      0,      0,
  2516. 37326 /*120 - ???     */      0,      0,      0,      0,      0,      0,
  2517. 37327 /*121 - ???     */      0,      0,      0,      0,      0,      0,
  2518. 37328 /*122 - ???     */      0,      0,      0,      0,      0,      0,
  2519. 37329 /*123 - ???     */      0,      0,      0,      0,      0,      0,
  2520. 37330 /*124 - ???     */      0,      0,      0,      0,      0,      0,
  2521. 37331 /*125 - ???     */      0,      0,      0,      0,      0,      0,
  2522. 37332 /*126 - ???     */      0,      0,      0,      0,      0,      0,
  2523. 37333 /*127 - ???     */      0,      0,      0,      0,      0,      0
  2524. 37334 };
  2525. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2526. src/kernel/keymaps/italian.src    
  2527. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2528. 37400 /*unchecked!*/
  2529. 37401 /* Keymap for Italian MF-2 keyboard. */
  2530. 37402
  2531. 37403 u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
  2532. 37404
  2533. 37405 /* scan-code            !Shift  Shift   Alt     AltGr   Alt+Sh  Ctrl    */
  2534. 37406 /* ==================================================================== */
  2535. 37407 /* 00 - none    */      0,      0,      0,      0,      0,      0,      
  2536. 37408 /* 01 - ESC     */      C('['), C('['), CA('['),C('['), C('['), C('['),
  2537. 37409 /* 02 - '1'     */      '1',    '!',    A('1'), '1',    '!',    C('A'),
  2538. 37410 /* 03 - '2'     */      '2',    '"',    A('2'), '2',    '@',    C('@'),
  2539. 37411 /* 04 - '3'     */      '3',    0234,   A('3'), '3',    0234,   C('C'),
  2540. 37412 /* 05 - '4'     */      '4',    '$',    A('4'), '4',    '$',    C('D'),
  2541. 37413 /* 06 - '5'     */      '5',    '%',    A('5'), '5',    '%',    C('E'),
  2542. 37414 /* 07 - '6'     */      '6',    '&',    A('6'), '6',    '&',    C('F'),
  2543. 37415 /* 08 - '7'     */      '7',    '/',    A('7'), '7',    '/',    C('G'),
  2544. 37416 /* 09 - '8'     */      '8',    '(',    A('8'), '8',    '(',    C('H'),
  2545. 37417 /* 10 - '9'     */      '9',    ')',    A('9'), '8',    ')',    C('I'),
  2546. 37418 /* 11 - '0'     */      '0',    '=',    A('0'), '0',    '=',    C('@'),
  2547. 37419 /* 12 - '-'     */      ''',   '?',    A('''),''',   '?',    C('@'),
  2548. 37420 /* 13 - '='     */      '|',    '^',    A('|'), '|',    '^',    C('^'),
  2549. 37421 /* 14 - BS      */      C('H'), C('H'), CA('H'),C('H'), C('H'), 0177,   
  2550. 37422 /* 15 - TAB     */      C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'),
  2551. 37423 /* 16 - 'q'     */      L('q'), 'Q',    A('q'), 'q',    'Q',    C('Q'),
  2552. 37424 /* 17 - 'w'     */      L('w'), 'W',    A('w'), 'w',    'W',    C('W'),
  2553. 37425 /* 18 - 'e'     */      L('e'), 'E',    A('e'), 'e',    'E',    C('E'),
  2554. 37426 /* 19 - 'r'     */      L('r'), 'R',    A('r'), 'r',    'R',    C('R'),
  2555. 37427 /* 20 - 't'     */      L('t'), 'T',    A('t'), 't',    'T',    C('T'),
  2556. 37428 /* 21 - 'y'     */      L('y'), 'Y',    A('y'), 'y',    'Y',    C('Y'),
  2557. 37429 /* 22 - 'u'     */      L('u'), 'U',    A('u'), 'u',    'U',    C('U'),
  2558. 37430 /* 23 - 'i'     */      L('i'), 'I',    A('i'), 'i',    'I',    C('I'),
  2559. 37431 /* 24 - 'o'     */      L('o'), 'O',    A('o'), 'o',    'O',    C('O'),
  2560. 37432 /* 25 - 'p'     */      L('p'), 'P',    A('p'), 'p',    'P',    C('P'),
  2561. 37433 /* 26 - '['     */      0212,   0202,   0212,   '[',    '{',    C('['),
  2562. 37434 /* 27 - ']'     */      '+',    '*',    A('+'), ']',    '}',    C(']'),
  2563. 37435 /* 28 - CR/LF   */      C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
  2564. 37436 /* 29 - Ctrl    */      CTRL,   CTRL,   CTRL,   CTRL,   CTRL,   CTRL,
  2565. 37437 /* 30 - 'a'     */      L('a'), 'A',    A('a'), 'a',    'A',    C('A'),
  2566. 37438 /* 31 - 's'     */      L('s'), 'S',    A('s'), 's',    'S',    C('S'),
  2567. 37439 /* 32 - 'd'     */      L('d'), 'D',    A('d'), 'd',    'D',    C('D'),
  2568. 37440 /* 33 - 'f'     */      L('f'), 'F',    A('f'), 'f',    'F',    C('F'),
  2569. 37441 /* 34 - 'g'     */      L('g'), 'G',    A('g'), 'g',    'G',    C('G'),
  2570. 37442 /* 35 - 'h'     */      L('h'), 'H',    A('h'), 'h',    'H',    C('H'),
  2571. 37443 /* 36 - 'j'     */      L('j'), 'J',    A('j'), 'j',    'J',    C('J'),
  2572. 37444 /* 37 - 'k'     */      L('k'), 'K',    A('k'), 'k',    'K',    C('K'),
  2573. 37445 /* 38 - 'l'     */      L('l'), 'L',    A('l'), 'l',    'L',    C('L'),
  2574. 37446 /* 39 - ';'     */      0225,   '@',    0225,   0225,   '@',    C('@'),
  2575. 37447 /* 40 - '''    */      0205,   '#',    0205,   0205,   '#',    C('@'),
  2576. 37448 /* 41 - '`'     */      '<',    '>',    A('<'), '\',   '|',    C('\'),
  2577. 37449 /* 42 - l. SHIFT*/      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2578. 37450 /* 43 - '\'    */      0227,   025,    0227,   0227,   025,    C('@'),
  2579. 37451 /* 44 - 'z'     */      L('z'), 'Z',    A('z'), 'z',    'Z',    C('Z'),
  2580. 37452 /* 45 - 'x'     */      L('x'), 'X',    A('x'), 'x',    'X',    C('X'),
  2581. 37453 /* 46 - 'c'     */      L('c'), 'C',    A('c'), 'c',    'C',    C('C'),
  2582. 37454 /* 47 - 'v'     */      L('v'), 'V',    A('v'), 'v',    'V',    C('V'),
  2583. 37455 /* 48 - 'b'     */      L('b'), 'B',    A('b'), 'b',    'B',    C('B'),
  2584. 37456 /* 49 - 'n'     */      L('n'), 'N',    A('n'), 'n',    'N',    C('N'),
  2585. 37457 /* 50 - 'm'     */      L('m'), 'M',    A('m'), 'm',    'M',    C('M'),
  2586. 37458 /* 51 - ','     */      ',',    ';',    A(','), ',',    ';',    C('@'),
  2587. 37459 /* 52 - '.'     */      '.',    ':',    A('.'), '.',    ':',    C('@'),
  2588. 37460 /* 53 - '/'     */      '-',    '_',    A('-'), '-',    '_',    C('_'),
  2589. 37461 /* 54 - r. SHIFT*/      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2590. 37462 /* 55 - '*'     */      '*',    '*',    A('*'), '*',    '*',    C('M'),
  2591. 37463 /* 56 - ALT     */      ALT,    ALT,    ALT,    ALT,    ALT,    ALT,
  2592. 37464 /* 57 - ' '     */      ' ',    ' ',    A(' '), ' ',    ' ',    C('@'),
  2593. 37465 /* 58 - CapsLck */      CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
  2594. 37466 /* 59 - F1      */      F1,     SF1,    AF1,    AF1,    ASF1,   CF1,
  2595. 37467 /* 60 - F2      */      F2,     SF2,    AF2,    AF2,    ASF2,   CF2,
  2596. 37468 /* 61 - F3      */      F3,     SF3,    AF3,    AF3,    ASF3,   CF3,
  2597. 37469 /* 62 - F4      */      F4,     SF4,    AF4,    AF4,    ASF4,   CF4,
  2598. 37470 /* 63 - F5      */      F5,     SF5,    AF5,    AF5,    ASF5,   CF5,
  2599. 37471 /* 64 - F6      */      F6,     SF6,    AF6,    AF6,    ASF6,   CF6,
  2600. 37472 /* 65 - F7      */      F7,     SF7,    AF7,    AF7,    ASF7,   CF7,
  2601. 37473 /* 66 - F8      */      F8,     SF8,    AF8,    AF8,    ASF8,   CF8,
  2602. 37474 /* 67 - F9      */      F9,     SF9,    AF9,    AF9,    ASF9,   CF9,
  2603. 37475 /* 68 - F10     */      F10,    SF10,   AF10,   AF10,   ASF10,  CF10,
  2604. 37476 /* 69 - NumLock */      NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,
  2605. 37477 /* 70 - ScrLock */      SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,
  2606. 37478 /* 71 - Home    */      HOME,   '7',    AHOME,  AHOME,  '7',    CHOME,  
  2607. 37479 /* 72 - CurUp   */      UP,     '8',    AUP,    AUP,    '8',    CUP,
  2608. 37480 /* 73 - PgUp    */      PGUP,   '9',    APGUP,  APGUP,  '9',    CPGUP,
  2609. 37481 /* 74 - '-'     */      NMIN,   '-',    ANMIN,  ANMIN,  '-',    CNMIN,
  2610. 37482 /* 75 - Left    */      LEFT,   '4',    ALEFT,  ALEFT,  '4',    CLEFT,
  2611. 37483 /* 76 - MID     */      MID,    '5',    AMID,   AMID,   '5',    CMID,
  2612. 37484 /* 77 - Right   */      RIGHT,  '6',    ARIGHT, ARIGHT, '6',    CRIGHT,
  2613. 37485 /* 78 - '+'     */      PLUS,   '+',    APLUS,  APLUS,  '+',    CPLUS,
  2614. 37486 /* 79 - End     */      END,    '1',    AEND,   AEND,   '1',    CEND,
  2615. 37487 /* 80 - Down    */      DOWN,   '2',    ADOWN,  ADOWN,  '2',    CDOWN,
  2616. 37488 /* 81 - PgDown  */      PGDN,   '3',    APGDN,  APGDN,  '3',    CPGDN,
  2617. 37489 /* 82 - Insert  */      INSRT,  '0',    AINSRT, AINSRT, '0',    CINSRT,
  2618. 37490 /* 83 - Delete  */      0177,   '.',    A(0177),0177,   '.',    0177,
  2619. 37491 /* 84 - Enter   */      C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'),
  2620. 37492 /* 85 - ???     */      0,      0,      0,      0,      0,      0,
  2621. 37493 /* 86 - ???     */      '<',    '>',    A('<'), '|',    '>',    C('@'),
  2622. 37494 /* 87 - F11     */      F11,    SF11,   AF11,   AF11,   ASF11,  CF11,
  2623. 37495 /* 88 - F12     */      F12,    SF12,   AF12,   AF12,   ASF12,  CF12,
  2624. 37496 /* 89 - ???     */      0,      0,      0,      0,      0,      0,
  2625. 37497 /* 90 - ???     */      0,      0,      0,      0,      0,      0,
  2626. 37498 /* 91 - ???     */      0,      0,      0,      0,      0,      0,
  2627. 37499 /* 92 - ???     */      0,      0,      0,      0,      0,      0,
  2628. 37500 /* 93 - ???     */      0,      0,      0,      0,      0,      0,
  2629. 37501 /* 94 - ???     */      0,      0,      0,      0,      0,      0,
  2630. 37502 /* 95 - ???     */      0,      0,      0,      0,      0,      0,
  2631. 37503 /* 96 - EXT_KEY */      EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
  2632. 37504 /* 97 - ???     */      0,      0,      0,      0,      0,      0,
  2633. 37505 /* 98 - ???     */      0,      0,      0,      0,      0,      0,
  2634. 37506 /* 99 - ???     */      0,      0,      0,      0,      0,      0,
  2635. 37507 /*100 - ???     */      0,      0,      0,      0,      0,      0,
  2636. 37508 /*101 - ???     */      0,      0,      0,      0,      0,      0,
  2637. 37509 /*102 - ???     */      0,      0,      0,      0,      0,      0,
  2638. 37510 /*103 - ???     */      0,      0,      0,      0,      0,      0,
  2639. 37511 /*104 - ???     */      0,      0,      0,      0,      0,      0,
  2640. 37512 /*105 - ???     */      0,      0,      0,      0,      0,      0,
  2641. 37513 /*106 - ???     */      0,      0,      0,      0,      0,      0,
  2642. 37514 /*107 - ???     */      0,      0,      0,      0,      0,      0,
  2643. 37515 /*108 - ???     */      0,      0,      0,      0,      0,      0,
  2644. 37516 /*109 - ???     */      0,      0,      0,      0,      0,      0,
  2645. 37517 /*110 - ???     */      0,      0,      0,      0,      0,      0,
  2646. 37518 /*111 - ???     */      0,      0,      0,      0,      0,      0,
  2647. 37519 /*112 - ???     */      0,      0,      0,      0,      0,      0,
  2648. 37520 /*113 - ???     */      0,      0,      0,      0,      0,      0,
  2649. 37521 /*114 - ???     */      0,      0,      0,      0,      0,      0,
  2650. 37522 /*115 - ???     */      0,      0,      0,      0,      0,      0,
  2651. 37523 /*116 - ???     */      0,      0,      0,      0,      0,      0,
  2652. 37524 /*117 - ???     */      0,      0,      0,      0,      0,      0,
  2653. 37525 /*118 - ???     */      0,      0,      0,      0,      0,      0,
  2654. 37526 /*119 - ???     */      0,      0,      0,      0,      0,      0,
  2655. 37527 /*120 - ???     */      0,      0,      0,      0,      0,      0,
  2656. 37528 /*121 - ???     */      0,      0,      0,      0,      0,      0,
  2657. 37529 /*122 - ???     */      0,      0,      0,      0,      0,      0,
  2658. 37530 /*123 - ???     */      0,      0,      0,      0,      0,      0,
  2659. 37531 /*124 - ???     */      0,      0,      0,      0,      0,      0,
  2660. 37532 /*125 - ???     */      0,      0,      0,      0,      0,      0,
  2661. 37533 /*126 - ???     */      0,      0,      0,      0,      0,      0,
  2662. 37534 /*127 - ???     */      0,      0,      0,      0,      0,      0
  2663. 37535 };
  2664. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2665. src/kernel/keymaps/japanese.src    
  2666. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2667. 37600 /*
  2668. 37601  *      Keymap for Japanese 106 keyboard.
  2669. 37602  *              Dec. 31 1995
  2670. 37603  *      Toshiya Ogawa   <ogw@shizuokanet.or.jp>
  2671. 37604  *                      <GCD02425@niftyserve.or.jp>
  2672. 37605  */
  2673. 37606
  2674. 37607 /*
  2675. 37608  * Japanese 106 keyboard has following additional 5 scan codes
  2676. 37609  * compared to US standard 101 keyboard.
  2677. 37610  *
  2678. 37611  *      scan-code       keytop       effect in this keymap
  2679. 37612  *      -------------------------------------------------------
  2680. 37613  *      112(0x70)       KANA            (ignored)
  2681. 37614  *      115(0x73)       BackSlash       mapped to '\' and '_'
  2682. 37615  *      121(0x79)       HENKAN          (ignored)
  2683. 37616  *      123(0x7B)       MU-HENKAN       (ignored)
  2684. 37617  *      125(0x7D)       YEN             mapped to '\' and '|'
  2685. 37618  */
  2686. 37619
  2687. 37620 #if (NR_SCAN_CODES != 0x80) 
  2688. 37621 #error NR_SCAN_CODES mis-match
  2689. 37622 #endif
  2690. 37623
  2691. 37624 u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
  2692. 37625
  2693. 37626 /* scan-code            !Shift  Shift   Alt1    Alt2    Alt+Sh  Ctrl    */
  2694. 37627 /* ==================================================================== */
  2695. 37628 /* 00 - none    */      0,      0,      0,      0,      0,      0,      
  2696. 37629 /* 01 - ESC     */      C('['), C('['), CA('['),CA('['),CA('['),C('['),
  2697. 37630 /* 02 - '1'     */      '1',    '!',    A('1'), A('1'), A('!'), C('A'),
  2698. 37631 /* 03 - '2'     */      '2',    '"',    A('2'), A('2'), A('"'), C('B'),
  2699. 37632 /* 04 - '3'     */      '3',    '#',    A('3'), A('3'), A('#'), C('C'),
  2700. 37633 /* 05 - '4'     */      '4',    '$',    A('4'), A('4'), A('$'), C('D'),
  2701. 37634 /* 06 - '5'     */      '5',    '%',    A('5'), A('5'), A('%'), C('E'),
  2702. 37635 /* 07 - '6'     */      '6',    '&',    A('6'), A('6'), A('&'), C('F'),
  2703. 37636 /* 08 - '7'     */      '7',    ''',   A('7'), A('7'), A('''),C('G'),
  2704. 37637 /* 09 - '8'     */      '8',    '(',    A('8'), A('8'), A('('), C('H'),
  2705. 37638 /* 10 - '9'     */      '9',    ')',    A('9'), A('9'), A(')'), C('I'),
  2706. 37639 /* 11 - '0'     */      '0',    '~',    A('0'), A('0'), A('~'), C('@'),
  2707. 37640 /* 12 - '-'     */      '-',    '=',    A('-'), A('-'), A('='), C('@'),
  2708. 37641 /* 13 - '^'     */      '^',    '~',    A('^'), A('^'), A('~'), C('^'),
  2709. 37642 /* 14 - BS      */      C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177,   
  2710. 37643 /* 15 - TAB     */      C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'),
  2711. 37644 /* 16 - 'q'     */      L('q'), 'Q',    A('q'), A('q'), A('Q'), C('Q'),
  2712. 37645 /* 17 - 'w'     */      L('w'), 'W',    A('w'), A('w'), A('W'), C('W'),
  2713. 37646 /* 18 - 'e'     */      L('e'), 'E',    A('e'), A('e'), A('E'), C('E'),
  2714. 37647 /* 19 - 'r'     */      L('r'), 'R',    A('r'), A('r'), A('R'), C('R'),
  2715. 37648 /* 20 - 't'     */      L('t'), 'T',    A('t'), A('t'), A('T'), C('T'),
  2716. 37649 /* 21 - 'y'     */      L('y'), 'Y',    A('y'), A('y'), A('Y'), C('Y'),
  2717. 37650 /* 22 - 'u'     */      L('u'), 'U',    A('u'), A('u'), A('U'), C('U'),
  2718. 37651 /* 23 - 'i'     */      L('i'), 'I',    A('i'), A('i'), A('I'), C('I'),
  2719. 37652 /* 24 - 'o'     */      L('o'), 'O',    A('o'), A('o'), A('O'), C('O'),
  2720. 37653 /* 25 - 'p'     */      L('p'), 'P',    A('p'), A('p'), A('P'), C('P'),
  2721. 37654 /* 26 - '@'     */      '@',    '`',    A('@'), A('@'), A('`'), C('@'),
  2722. 37655 /* 27 - '['     */      '[',    '{',    A('['), A('['), A('{'), C('['),
  2723. 37656 /* 28 - Enter   */      C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
  2724. 37657 /* 29 - Ctrl    */      CTRL,   CTRL,   CTRL,   CTRL,   CTRL,   CTRL,
  2725. 37658 /* 30 - 'a'     */      L('a'), 'A',    A('a'), A('a'), A('A'), C('A'),
  2726. 37659 /* 31 - 's'     */      L('s'), 'S',    A('s'), A('s'), A('S'), C('S'),
  2727. 37660 /* 32 - 'd'     */      L('d'), 'D',    A('d'), A('d'), A('D'), C('D'),
  2728. 37661 /* 33 - 'f'     */      L('f'), 'F',    A('f'), A('f'), A('F'), C('F'),
  2729. 37662 /* 34 - 'g'     */      L('g'), 'G',    A('g'), A('g'), A('G'), C('G'),
  2730. 37663 /* 35 - 'h'     */      L('h'), 'H',    A('h'), A('h'), A('H'), C('H'),
  2731. 37664 /* 36 - 'j'     */      L('j'), 'J',    A('j'), A('j'), A('J'), C('J'),
  2732. 37665 /* 37 - 'k'     */      L('k'), 'K',    A('k'), A('k'), A('K'), C('K'),
  2733. 37666 /* 38 - 'l'     */      L('l'), 'L',    A('l'), A('l'), A('L'), C('L'),
  2734. 37667 /* 39 - ';'     */      ';',    '+',    A(';'), A(';'), A('+'), C('@'),
  2735. 37668 /* 40 - ':'     */      ':',    '*',    A(':'), A(':'), A('*'), C('@'),
  2736. 37669 /* 41 - KANJI   */      0,      0,      0,      0,      0,      0,      
  2737. 37670 /* 42 - l. SHIFT*/      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2738. 37671 /* 43 - ']'     */      ']',    '}',    A(']'), A(']'), A('}'), C(']'),
  2739. 37672 /* 44 - 'z'     */      L('z'), 'Z',    A('z'), A('z'), A('Z'), C('Z'),
  2740. 37673 /* 45 - 'x'     */      L('x'), 'X',    A('x'), A('x'), A('X'), C('X'),
  2741. 37674 /* 46 - 'c'     */      L('c'), 'C',    A('c'), A('c'), A('C'), C('C'),
  2742. 37675 /* 47 - 'v'     */      L('v'), 'V',    A('v'), A('v'), A('V'), C('V'),
  2743. 37676 /* 48 - 'b'     */      L('b'), 'B',    A('b'), A('b'), A('B'), C('B'),
  2744. 37677 /* 49 - 'n'     */      L('n'), 'N',    A('n'), A('n'), A('N'), C('N'),
  2745. 37678 /* 50 - 'm'     */      L('m'), 'M',    A('m'), A('m'), A('M'), C('M'),
  2746. 37679 /* 51 - ','     */      ',',    '<',    A(','), A(','), A('<'), C('@'),
  2747. 37680 /* 52 - '.'     */      '.',    '>',    A('.'), A('.'), A('>'), C('@'),
  2748. 37681 /* 53 - '/'     */      '/',    '?',    A('/'), A('/'), A('?'), C('@'),
  2749. 37682 /* 54 - r. SHIFT*/      SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,  SHIFT,
  2750. 37683 /* 55 - '*'     */      '*',    '*',    A('*'), A('*'), A('*'), C('@'),
  2751. 37684 /* 56 - ALT     */      ALT,    ALT,    ALT,    ALT,    ALT,    ALT,
  2752. 37685 /* 57 - ' '     */      ' ',    ' ',    A(' '), A(' '), A(' '), C('@'),
  2753. 37686 /* 58 - CapsLck */      CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK,
  2754. 37687 /* 59 - F1      */      F1,     SF1,    AF1,    AF1,    ASF1,   CF1,
  2755. 37688 /* 60 - F2      */      F2,     SF2,    AF2,    AF2,    ASF2,   CF2,
  2756. 37689 /* 61 - F3      */      F3,     SF3,    AF3,    AF3,    ASF3,   CF3,
  2757. 37690 /* 62 - F4      */      F4,     SF4,    AF4,    AF4,    ASF4,   CF4,
  2758. 37691 /* 63 - F5      */      F5,     SF5,    AF5,    AF5,    ASF5,   CF5,
  2759. 37692 /* 64 - F6      */      F6,     SF6,    AF6,    AF6,    ASF6,   CF6,
  2760. 37693 /* 65 - F7      */      F7,     SF7,    AF7,    AF7,    ASF7,   CF7,
  2761. 37694 /* 66 - F8      */      F8,     SF8,    AF8,    AF8,    ASF8,   CF8,
  2762. 37695 /* 67 - F9      */      F9,     SF9,    AF9,    AF9,    ASF9,   CF9,
  2763. 37696 /* 68 - F10     */      F10,    SF10,   AF10,   AF10,   ASF10,  CF10,
  2764. 37697 /* 69 - NumLock */      NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,  NLOCK,
  2765. 37698 /* 70 - ScrLock */      SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,  SLOCK,
  2766. 37699 /* 71 - Home    */      HOME,   '7',    AHOME,  AHOME,  A('7'), CHOME,  
  2767. 37700 /* 72 - CurUp   */      UP,     '8',    AUP,    AUP,    A('8'), CUP,
  2768. 37701 /* 73 - PgUp    */      PGUP,   '9',    APGUP,  APGUP,  A('9'), CPGUP,
  2769. 37702 /* 74 - '-'     */      NMIN,   '-',    ANMIN,  ANMIN,  A('-'), CNMIN,
  2770. 37703 /* 75 - Left    */      LEFT,   '4',    ALEFT,  ALEFT,  A('4'), CLEFT,
  2771. 37704 /* 76 - MID     */      MID,    '5',    AMID,   AMID,   A('5'), CMID,
  2772. 37705 /* 77 - Right   */      RIGHT,  '6',    ARIGHT, ARIGHT, A('6'), CRIGHT,
  2773. 37706 /* 78 - '+'     */      PLUS,   '+',    APLUS,  APLUS,  A('+'), CPLUS,
  2774. 37707 /* 79 - End     */      END,    '1',    AEND,   AEND,   A('1'), CEND,
  2775. 37708 /* 80 - Down    */      DOWN,   '2',    ADOWN,  ADOWN,  A('2'), CDOWN,
  2776. 37709 /* 81 - PgDown  */      PGDN,   '3',    APGDN,  APGDN,  A('3'), CPGDN,
  2777. 37710 /* 82 - Insert  */      INSRT,  '0',    AINSRT, AINSRT, A('0'), CINSRT,
  2778. 37711 /* 83 - Delete  */      0177,   '.',    A(0177),A(0177),A('.'), 0177,
  2779. 37712 /* 84 - Enter   */      C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'),
  2780. 37713 /* 85 - ???     */      0,      0,      0,      0,      0,      0,
  2781. 37714 /* 86 - ???     */      0,      0,      0,      0,      0,      0,
  2782. 37715 /* 87 - F11     */      F11,    SF11,   AF11,   AF11,   ASF11,  CF11,
  2783. 37716 /* 88 - F12     */      F12,    SF12,   AF12,   AF12,   ASF12,  CF12,
  2784. 37717 /* 89 - ???     */      0,      0,      0,      0,      0,      0,
  2785. 37718 /* 90 - ???     */      0,      0,      0,      0,      0,      0,
  2786. 37719 /* 91 - ???     */      0,      0,      0,      0,      0,      0,
  2787. 37720 /* 92 - ???     */      0,      0,      0,      0,      0,      0,
  2788. 37721 /* 93 - ???     */      0,      0,      0,      0,      0,      0,
  2789. 37722 /* 94 - ???     */      0,      0,      0,      0,      0,      0,
  2790. 37723 /* 95 - ???     */      0,      0,      0,      0,      0,      0,
  2791. 37724 /* 96 - EXT_KEY */      EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY,
  2792. 37725 /* 97 - ???     */      0,      0,      0,      0,      0,      0,
  2793. 37726 /* 98 - ???     */      0,      0,      0,      0,      0,      0,
  2794. 37727 /* 99 - ???     */      0,      0,      0,      0,      0,      0,
  2795. 37728 /*100 - ???     */      0,      0,      0,      0,      0,      0,
  2796. 37729 /*101 - ???     */      0,      0,      0,      0,      0,      0,
  2797. 37730 /*102 - ???     */      0,      0,      0,      0,      0,      0,
  2798. 37731 /*103 - ???     */      0,      0,      0,      0,      0,      0,
  2799. 37732 /*104 - ???     */      0,      0,      0,      0,      0,      0,
  2800. 37733 /*105 - ???     */      0,      0,      0,      0,      0,      0,
  2801. 37734 /*106 - ???     */      0,      0,      0,      0,      0,      0,
  2802. 37735 /*107 - ???     */      0,      0,      0,      0,      0,      0,
  2803. 37736 /*108 - ???     */      0,      0,      0,      0,      0,      0,
  2804. 37737 /*109 - ???     */      0,      0,      0,      0,      0,      0,
  2805. 37738 /*110 - ???     */      0,      0,      0,      0,      0,      0,
  2806. 37739 /*111 - ???     */      0,      0,      0,      0,      0,      0,
  2807. 37740 /*112 - KANA    */      0,      0,      0,      0,      0,      0,
  2808. 37741 /*113 - ???     */      0,      0,      0,      0,      0,      0,
  2809. 37742 /*114 - ???     */      0,      0,      0,      0,      0,      0,
  2810. 37743 /*115 - '\'    */      '\',   '_',    A('\'),A('\'),A('_'), C('_'),
  2811. 37744 /*116 - ???     */      0,      0,      0,      0,      0,      0,
  2812. 37745 /*117 - ???     */      0,      0,      0,      0,      0,      0,
  2813. 37746 /*118 - ???     */      0,      0,      0,      0,      0,      0,
  2814. 37747 /*119 - ???     */      0,      0,      0,      0,      0,      0,
  2815. 37748 /*120 - ???     */      0,      0,      0,      0,      0,      0,
  2816. 37749 /*121 - HENKAN  */      0,      0,      0,      0,      0,      0,
  2817. 37750 /*122 - ???     */      0,      0,      0,      0,      0,      0,
  2818. 37751 /*123 - MU-HENKAN*/     0,      0,      0,      0,      0,      0,
  2819. 37752 /*124 - ???     */      0,      0,      0,      0,      0,      0,
  2820. 37753 /*125 - YEN     */      '\',   '|',    A('\'),A('\'),A('|'), C('\'),
  2821. 37754 /*126 - ???     */      0,      0,      0,      0,      0,      0,
  2822. 37755 /*127 - ???     */      0,      0,      0,      0,      0,      0
  2823. 37756 };
  2824. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2825. src/kernel/keymaps/latin-am.src    
  2826. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2827. 37800 /***
  2828. 37801    Keymap for Latin American keyboard. v1.02
  2829. 37802    Victor A. Rodriguez - El bit Fantasma - Bit-Man@Tasa.Com.AR
  2830. 37803
  2831. 37804    The Latin American keyboard makes differences between the left and
  2832. 37805    right ALT keys (the right one is so called ALT GR), and uses accent.
  2833. 37806
  2834. 37807    Release History 
  2835. 37808    ===============
  2836. 37809    v1.00     Initial version 
  2837. 37810    v1.01     Extended ASCII characters replaced by hex. equivalents
  2838. 37811    v1.02     NR_SCAN_CODES has grown to 0x80, required by Toshiya Ogawa
  2839. 37812              (ogw@shizuokanet.or.jp) and added by Kees J.Bot (kjb@cs.vu.nl)
  2840. 37813              in MINIX 1.7.2
  2841. 37814 ***/
  2842. 37815
  2843. 37816 #if (NR_SCAN_CODES != 0x80) 
  2844. 37817 #error NR_SCAN_CODES mis-match
  2845. 37818 #endif
  2846. 37819
  2847. 37820 u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
  2848. 37821
  2849. 37822 /* scan-code            !Shift  Shift   Alt1    Alt2    Alt+Sh  Ctrl    */
  2850. 37823 /* ==================================================================== */
  2851. 37824 /* 00 - none    */      0,      0,      0,      0,      0,      0,      
  2852. 37825 /* 01 - ESC     */      C('['), C('['), CA('['),CA('['),CA('['),C('['),
  2853. 37826 /* 02 - '1'     */      '1',    '!',    A('1'), A('1'), A('!'), C('A'),
  2854. 37827 /* 03 - '2'     */      '2',    '"',    A('2'), A('2'), A('"'), C('@'),
  2855. 37828 /* 04 - '3'     */      '3',    '#',    A('3'), A('3'), A('#'), C('C'),
  2856. 37829 /* 05 - '4'     */      '4',    '$',    A('4'), A('4'), A('$'), C('D'),
  2857. 37830 /* 06 - '5'     */      '5',    '%',    A('5'), A('5'), A('%'), C('E'),
  2858. 37831 /* 07 - '6'     */      '6',    '&',    A('6'), A('6'), A('$'), C('^'),
  2859. 37832 /* 08 - '7'     */      '7',    '/',    A('7'), A('7'), A('/'), C('G'),
  2860. 37833 /* 09 - '8'     */      '8',    '(',    A('8'), A('8'), A('('), C('H'),
  2861. 37834 /* 10 - '9'     */      '9',    ')',    A('9'), A('9'), A(')'), C('I'),
  2862. 37835 /* 11 - '0'     */      '0',    '=',    A('0'), A('0'), A('='), C('@'),
  2863. 37836 /* 12 - '-'     */      ''',   '?',    A('''), 0x5c,   A('?'), C('?'),
  2864. 37837 /* 13 - '