COMPLETE.T
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:2535k
源码类别:

操作系统开发

开发平台:

C/C++

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