sys1.a 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. module sys1;
  2. segment C_sys1(F_CODE,28H); group G_sys1(C_sys1); select C_sys1;
  3. (* ce fichier contient un certain nombre de routines asembleur utilis‚es par
  4. le kernel. Elles sont les suivantes:
  5. phys_copy : copie des donn‚es d'un endroit quelconque … un autre
  6. endroit quelconque en m‚moire.
  7. cp_mess : copie un message de SOURCE … DESTINATION.
  8. port_out : sort une donn‚e sur PORT.
  9. port_in : entre une donn‚e sur PORT.
  10. lock : bloque les interruptions.
  11. unlock : d‚bloque les interruptions.
  12. restore : restaure les interruptions comme elles ‚taient avant
  13. lock().
  14. build_sig : construit une structure compos‚e de 4 mots m‚moire
  15. pour les signaux.
  16. csv : d‚but de proc‚dure de sauvegarde des registres.
  17. cret : fin de proc‚dure pour restaurer les registres.
  18. get_chrome : retourne 0 si carte couleur, 1 si monochrome.
  19. vid_copy : copie des donn‚es sur l'‚cran (m‚moire vid‚o);
  20. reboot : reboot pour CTRL-ALT-DEL.
  21. wreboot : attente de la frappe d'un caractŠre avant le reboot.
  22. Toutes ces proc‚dures sont appel‚es par d'autres modules.
  23. Une proc‚dure externe est appel‚e : panic
  24. Celui-ci utilise les structures suivantes:
  25. color
  26. cur_proc
  27. proc_ptr
  28. splimit
  29. vec_table
  30. *)
  31. (*==============================================================================
  32. phys_copy
  33. ==============================================================================
  34. Cette routine a la syntaxe suivante :
  35. phys_copy ( source , destination : ADRESS ;bytecount : CARDINAL);
  36. *)
  37. public sys1$phys_copy:
  38. pushf (* sauve les flags *)
  39. cli (* interdit les interruptions *)
  40. push bp (* sauve les registres *)
  41. push ax (* sauve ax *)
  42. push bx (* sauve bx *)
  43. push cx (* sauve cx *)
  44. push dx (* sauve dx *)
  45. push si (* sauve si *)
  46. push di (* sauve di *)
  47. push ds (* sauve ds *)
  48. push es (* sauve es *)
  49. mov bp,sp (* initialise bp … l'adresse de es sauv‚ *)
  50. l0: mov ax,[bp][30] (* ax est l'adresse haute de destination(32 bits) *)
  51. mov di,[bp][28] (* di en est l'adresse basse *)
  52. mov cx,4 (* d‚bute l'extraction du nombre de clicks de destination *)
  53. l1: rcr ax,1 (* le nombre de clicks est
  54. l'adesse de destination/16*)
  55. rcr di,1 (* est utilis‚ dans le registre de segment
  56. pour la copie *)
  57. loop l1 (* 4 bits de l'adresse haute sont
  58. utilis‚s *)
  59. mov es,di (* es = click de destination *)
  60. mov ax,[bp][34] (* ax est l'adresse haute de source *)
  61. mov si,[bp][32] (* si est l'adresse basse de source *)
  62. mov cx,4 (* d‚bute l'extraction du nombre de clicks de source *)
  63. l2: rcr ax,1 (* le nombre de click = adresse de source/16*)
  64. rcr si,1 (* est utilis‚ dans les registres de segment pour la copie *)
  65. loop l2 (* 4 bits de l'adresse haute sont utilis‚s *)
  66. mov ds,si (* ds = click de la source *)
  67. mov di,[bp][28] (* di = adresse basse de destination *)
  68. and di,0FH (* di = offset du paragraphe # dans es *)
  69. mov si,[bp][32] (* si = partie basse de l'adresse source *)
  70. and si,0FH (* si = offset du paragraphe # dans ds *)
  71. mov dx,[bp][26] (* dx = partie haute du nombre d'octets *)
  72. mov cx,[bp][24] (* cx = partie basse du nombre d'octets *)
  73. test cx,08000H (* on compare cx avec 32768 : s > alors on ne
  74. fait que 32768 *)
  75. jnz l3 (* par it‚ration *)
  76. test dx,0FFFFH (* teste les 17 bits hauts pour voir si *)
  77. jnz l3 (* Si bytes > 32768 alors go l3 *)
  78. jmp l4 (* sinon go l4)*)
  79. l3: mov cx,08000H (* 32768 *)
  80. l4: mov ax,cx (* sauve le nombre actuel de count *)
  81. test cx,00001H (* on copie un mot ou un octet ?? *)
  82. jz l5 (* saut … l5 si copie par mot *)
  83. rep (* copie un octet … la fois *)
  84. movsb (* la copie en fait *)
  85. jmp l6 (* test si plus d'octets *)
  86. l5: shr cx,1 (* copie par mot *)
  87. rep (* copie un mot … la fois *)
  88. movsw (* la copie en fait *)
  89. l6: mov dx,[bp][26] (* decr count,incr src & dst ,r‚pŠte si n‚c‚ssaire *)
  90. mov cx,[bp][24] (* dx || cx = compteur 32 bits *)
  91. xor bx,bx (* bx || ax = nombre d‚j… utilis‚ *)
  92. sub cx,ax (* calcule bytes - nombre d‚j… fait *)
  93. sbb dx,bx (* dx || ax = nombre non faits *)
  94. or cx,cx (* test si = 0 *)
  95. jnz l7 (* si encore go l7 *)
  96. or dx,dx (* retest *)
  97. jnz l7 (* si la boucle est finie alors passage outre *)
  98. pop es (* on restaure tout dans l'ordre *)
  99. pop ds
  100. pop di
  101. pop si
  102. pop dx
  103. pop cx
  104. pop bx
  105. pop ax
  106. pop bp
  107. popf
  108. sti
  109. ret far 12
  110. l7: mov [bp][26],dx (* stocke le nombre d‚crement‚ en m‚moire *)
  111. mov [bp][24],cx (* stocke la partie basse du compteur *)
  112. add [bp][28],ax (* incremente la destination *)
  113. adc [bp][30],bx (* partie basse avec retenue*)
  114. add [bp][32],ax (* incremente la source *)
  115. adc [bp][34],bx (* partie basse avec retenue*)
  116. jmp l0
  117. end
  118.