modem.asm 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. .286
  2. .model small
  3. .code
  4. org 100h
  5. ; UART Registers
  6. SER_RBF EQU 0 ; �ãä¥à ç⥭¨ï
  7. SER_THR EQU 0 ; ¡ãä¥à § ¯¨á¨
  8. SER_IER EQU 1 ; ॣ¨áâà à §à¥è¥­¨ï ¯à¥à뢠­¨©
  9. SER_IIR EQU 2 ; ॣ. ¨¤¥­â¨ä¨ª æ¨¨ ¯à¥à뢠­¨©
  10. SER_LCR EQU 3 ; ॣ. ã¯à ¢«. ¤ ­­ëå ¨ à §à¥è¥­. § £à㧪¨ ¤¥«¨â¥«ï
  11. SER_MCR EQU 4 ; ॣ. ã¯à ¢«. ¬®¤¥¬®¬
  12. SER_LSR EQU 5 ; ॣ. á®áâ®ï­¨ï «¨­¨¨
  13. SER_MSR EQU 6 ; ॣ. á®áâ. ¬®¤¥¬ 
  14. SER_DLL EQU 0 ; ॣ. ¬« ¤è. ¡ ©â ¤¥«¨â¥«ï
  15. SER_DLH EQU 1 ; ॣ. áâ àè. ¡ ©â ¤¥«¨â¥«ï
  16. ; Registers Bit masks
  17. SER_BAUD_1200 EQU 96 ; ¤¥«¨â¥«¨ ¤«ï à §«¨ç­ëå ᪮à®á⥩
  18. SER_BAUD_2400 EQU 48
  19. SER_BAUD_9600 EQU 12
  20. SER_BAUD_19200 EQU 6
  21. SER_BAUD_38400 EQU 3
  22. SER_BAUD_57600 EQU 2
  23. SER_GP02 EQU 8 ; à §à¥è¥­¨¥ ¯à¥à뢠­¨©
  24. COM1 EQU 3f8h ; � ç «ì­ë¥ ¯®àâë ª®¬®¢
  25. COM2 EQU 2f8h ;
  26. SER_STOP_1 EQU 0 ; á⮯-¡¨â ­  ᨬ¢®«
  27. SER_STOP_2 EQU 4
  28. SER_BITS_5 EQU 0 ; å § ç é¨å ¡¨â ­  ᨬ¢®«
  29. SER_BITS_6 EQU 1
  30. SER_BITS_7 EQU 2
  31. SER_BITS_8 EQU 3
  32. SER_PARITY_NONE EQU 0 ; ª®­â஫ì ç¥â­®áâ¨
  33. SER_PARITY_ODD EQU 8
  34. SER_PARITY_EVEN EQU 24
  35. SER_DIV_LATCH_ON EQU 128 ; ¨á¯ ¯à¨ § £à㧪¥ ¤¥«¨â¥«ï
  36. PIC_IMR EQU 21h ; ¬ áª  ¤«ï ॣ¨áâà  ¯à¥à뢠­¨©
  37. PIC_ICR EQU 20h ; ¬ áª  ¤«ï ª®­â஫«¥à  ¯à¥à뢠­¨©
  38. INT_SER_PORT_0 EQU 0Ch ; ¤«ï ã¯à ¢«¥­¨ï ¯à¥à뢠­. COM1 & COM3
  39. INT_SER_PORT_1 EQU 0Bh ; ¤«ï ã¯à ¢«¥­¨ï ¯à¥à뢠­. COM2 & COM4
  40. ; Current setting(for COM1), change them
  41. ;-------------------------------
  42. PORT EQU 3f8h
  43. INT_SER_PORT EQU 0Ch
  44. INT_MASK EQU 0EFh ; (0F7h - for COM2-4)
  45. CONFIG EQU 3 ; (PARITY_NONE|SER_BITS_8|SER_STOP_1)
  46. SER_BAUD EQU 3 ; 38400
  47. BUF_LEN EQU 1024
  48. ;-------------------------------
  49. start:
  50. ; Open sereal port
  51. ;----------------------------
  52. ; Set port speed
  53. mov dx, PORT+SER_LCR ;-------
  54. mov al, SER_DIV_LATCH_ON ; à §à¥è ¥¬ § £à㧪㠤¥«¨â¥«ï
  55. out dx, al ;-------
  56. mov dx, PORT+SER_DLL ;-------
  57. mov al, SER_BAUD ; ¯®áë« ¥¬ ¬« ¤è ¡ ©â ¤¥«¨â¥«ï
  58. out dx, al ;-------
  59. mov dx, PORT+SER_DLH ;-------
  60. mov al, 0 ; ¯®áë« ¥¬ áâ àè ¡ ©â ¤¥«¨â¥«ï
  61. out dx, al ;-------
  62. mov dx, PORT+SER_LCR ;-------
  63. mov al, CONFIG ; ãáâ ª®­ä¨£ãà æ¨î ¯®àâ 
  64. out dx, al ;-------
  65. mov dx, PORT+SER_MCR ;-------
  66. mov al, SER_GP02 ;
  67. out dx, al ; � §à¥è ¥¬
  68. mov dx, PORT+SER_IER ; ¯à¥à뢠­¨ï
  69. mov al, 1 ;
  70. out dx, al ;-------
  71. mov ah, 35h ;-----------
  72. mov al, INT_SER_PORT ; Get Old
  73. int 21h ; Vector
  74. mov old_vec_seg, es ; PORT COM1
  75. mov old_vec_offs, bx ;-----------
  76. mov ah, 25h ;-----------
  77. mov al, INT_SER_PORT ; Set NEW
  78. mov dx, offset Serial_ISR ; Vector
  79. int 21h ;-----------
  80. in al, PIC_IMR ; ‘â àë¥ ¡¨âë ª®­â஫«¥à  ¯à¥à뢠­¨©
  81. mov old_int_mask, al ;
  82. and al, INT_MASK
  83. out PIC_IMR, al ; à §à¥è ¥¬ ¯à¥à뢠­¨¥ COM1
  84. ;-----------------------------------------------------------------
  85. mov ah, 08h
  86. int 21h
  87. ;------------------------------------
  88. ; Close port
  89. ;
  90. mov dx, PORT+SER_MCR ;-------
  91. mov al, 0 ;
  92. out dx, al ; ‡ ¯à¥é ¥¬
  93. mov dx, PORT+SER_IER ; ¯à¥à뢠­¨ï
  94. mov al, 0 ;
  95. out dx, al ;-------
  96. mov al, old_int_mask ;
  97. out PIC_IMR, al ; “áâ áâ àë¥ ­ áâனª¨ ª®­â஫«¥à  ¯à¥à뢠­
  98. mov ah, 25h ;-----------
  99. mov al, INT_SER_PORT ; Set OLD
  100. mov dx, old_vec_offs ; Vector
  101. mov ds, old_vec_seg ; Vector
  102. int 21h ;-----------
  103. int 20h
  104. ; Interrupt vector
  105. Serial_ISR:
  106. pusha
  107. mov ser_lock, 1
  108. mov dx, PORT+SER_RBF
  109. in al, dx
  110. inc pos_wrt
  111. cmp pos_wrt, BUF_LEN-1
  112. jna OK
  113. mov pos_wrt, 0
  114. OK: mov di, pos_wrt
  115. mov buffer[di], al
  116. inc char_ready
  117. mov al, 20h
  118. cli
  119. out PIC_ICR, al
  120. mov ser_lock, 0
  121. popa
  122. iret
  123. Ser_Write proc near ; Ser_Write(ch: char)
  124. push bp
  125. mov bp, sp
  126. CHAR EQU byte ptr [bp+4]
  127. pusha
  128. mov dx, PORT+SER_LSR
  129. WT: in al, dx
  130. and al, 20h
  131. jz WT
  132. mov dx, PORT+SER_THR
  133. mov al, CHAR
  134. cli
  135. out dx, al
  136. sti
  137. popa
  138. pop bp
  139. ret 2
  140. endp
  141. old_vec_offs dw 0
  142. old_vec_seg dw 0
  143. old_int_mask db 0
  144. ser_lock db 0
  145. pos_wrt dw -1
  146. pos_rd dw -1
  147. char_ready db 0
  148. buffer db BUF_LEN dup (?)
  149. end start