out.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:8k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. TITLE OUT - Output utilities
  2. ;***
  3. ; OUT - Text Output utilities
  4. ;
  5. ; Copyright <C> 1986, Microsoft Corporation
  6. ;
  7. ;Purpose:
  8. ;
  9. ;******************************************************************************
  10. INCLUDE switch.inc ;Runtime switch file
  11. INCLUDE rmacros.inc ;General runtime macros
  12. useSeg _DATA ;Uses the Data segment
  13. useSeg _BSS ;and the BSS segment
  14. useSeg RT_TEXT  ;and the core code segment
  15. useSeg NH_TEXT 
  16. INCLUDE seg.inc  ;Segment definitions
  17. INCLUDE baslibma.inc
  18. INCLUDE devdef.inc
  19. INCLUDE files.inc
  20. INCLUDE ascii.inc
  21. INCLUDE idmac.inc
  22. INCLUDE const.inc
  23. sBegin _DATA
  24. externB b$IOFLAG ; Misc. IO flags.  Defined in GWINI.ASM
  25. externW b$CURSOR ; (1,1)-relative screen cursor
  26. externB b$CSRX ; 1-relative x-coordinate cursor
  27. sEnd _DATA
  28. sBegin _BSS
  29. externW b$PTRFIL ;defined in GOSTOP.ASM
  30. sEnd _BSS
  31. externFP __FMSG_TEXT ;Get message text from number
  32. sBegin RT_TEXT 
  33. PUBLIC B$TYPSTR
  34. PUBLIC B$TYPSTR1
  35. PUBLIC B$TYPCNT
  36. PUBLIC B$OUTCNT
  37. externNP B$TTY_SOUT
  38. externNP B$STRSOUT
  39. externNP B$CHKLASTCOL ; check for last column on screen
  40. externNP B$UPDATE_CSR ; update cursor position after write
  41. assumes CS,RT_TEXT
  42. PAGE
  43. ;*** 
  44. ; B$ITCR -- type CR/LF on console.  Added with [15].
  45. ;
  46. ;Purpose:
  47. ;
  48. ;Entry:
  49. ; None
  50. ;Exit:
  51. ; b$PTRFIL is reset
  52. ;Uses:
  53. ; None
  54. ;Exceptions:
  55. ; None
  56. ;******************************************************************************
  57. cProc B$ITCR,<PUBLIC,FAR>
  58. cBegin
  59. CALL B$$TCR
  60. cEnd
  61. ;*** 
  62. ; B$$TCR -- type CR/LF on console.
  63. ;
  64. ;Purpose:
  65. ;
  66. ;Entry:
  67. ; None
  68. ;Exit:
  69. ; b$PTRFIL is reset
  70. ;Uses:
  71. ; None
  72. ;Exceptions:
  73. ; None
  74. ;******************************************************************************
  75. cProc B$$TCR,<PUBLIC,NEAR>,<AX> 
  76. cBegin
  77. MOV AL,ASCCR ;  Output CR only
  78. CALL B$$WCHT
  79. cEnd
  80. ;*** 
  81. ; B$$WCHT -- type char on console.
  82. ;
  83. ;Purpose:
  84. ;
  85. ;Entry:
  86. ; None
  87. ;Exit:
  88. ; b$PTRFIL is reset
  89. ;Uses:
  90. ; None
  91. ;Execptions:
  92. ; None
  93. ;******************************************************************************
  94. cProc B$$WCHT,<PUBLIC,NEAR>
  95. cBegin
  96. MOV [b$PTRFIL],0   ;must be zero for TTY output
  97. JMP B$TTY_SOUT
  98. cEnd <nogen> ; return via B$TTY_SOUT
  99. ;***
  100. ; B$PRINTNUM - Print numbered message to the screen [17]
  101. ;
  102. ;Purpose:
  103. ; Prints a string to the console device (B$PTRFIL = 0), as referenced by the
  104. ; passed message number.  Must not be used for fatal errors or if you don't
  105. ; want PRINT code pulled in.  Use B$PUTNUM in ERPROC.ASM instead. 
  106. ;
  107. ;Entry:
  108. ; [AX] = Message number
  109. ;
  110. ;Exit:
  111. ; None.
  112. ;
  113. ;Uses:
  114. ; Per convention.
  115. ;
  116. ;NOTE: The interpreter provides a version of this routine (B$PUTNUM)
  117. ; to print strings their way.
  118. ;
  119. ;******************************************************************************
  120. ;***
  121. ; B$PUTS - Print a null terminated string to console
  122. ;
  123. ;Purpose:
  124. ; Prints a string to the console device (B$PTRFIL = 0).
  125. ;
  126. ;Entry:
  127. ; [DX:AX] = Address of string
  128. ;
  129. ;Uses:
  130. ; Per convention
  131. ;
  132. ;NOTE: The interpreter uses this routine, so if we change the interface
  133. ; to use a far ptr, we need to notify them.
  134. ;
  135. ;******************************************************************************
  136. cProc B$PUTS,<NEAR,PUBLIC>,ES 
  137. cBegin
  138. MOV [b$PTRFIL],0 ; must be zero for TTY output
  139. MOV ES,DX ; set up seg reg
  140. XCHG AX,BX ; [ES:BX] points to string
  141. OR DX,DX ; See if null pointer
  142. JNZ PUTS_10  ; Enter the loop if not
  143. JMP SHORT PUTS_15
  144. PUTS_5: 
  145. CALL B$TTY_SOUT ; output char
  146. PUTS_10:
  147. MOV AL,ES:[BX] ; Get byte from string
  148. INC BX
  149. OR AL,AL ; see if end
  150. JNZ PUTS_5 ; jump if it isn't
  151. PUTS_15:
  152. cEnd
  153. ;***
  154. ;B$TYPSTR - Output string defined by string decsriptor
  155. ;
  156. ;Purpose:
  157. ; Output string defined by string decsriptor to the screen.
  158. ;
  159. ;Entry:
  160. ; [BX]  = Address of string descriptor
  161. ;
  162. ;Exit:
  163. ; String output
  164. ;
  165. ;Uses:
  166. ; Per convention, plus SI.
  167. ;
  168. ;******************************************************************************
  169. B$TYPSTR:
  170. MOV CX,[BX]
  171. ;***
  172. ;B$TYPCNT, B$TYPSTR1 - Output n bytes of a string defined by string decsriptor
  173. ;
  174. ;Purpose:
  175. ; Output n bytes of a string defined by string decsriptor to the
  176. ; console.  The alternate entry point B$TYPSTR1 is used by B$PTRSTR
  177. ; and does not check for a 0 length string nor does it update
  178. ; b$PTRFIL.
  179. ;
  180. ;Entry:
  181. ; [BX]  = Address of string descriptor
  182. ; [CX]  = Count of bytes to output
  183. ;
  184. ;Exit:
  185. ; String output
  186. ;
  187. ;Uses:
  188. ; Per convention, plus SI.
  189. ;
  190. ;******************************************************************************
  191. B$TYPCNT:
  192. JCXZ RETL
  193. MOV [b$PTRFIL],0 ;must be zero for TTY output
  194. B$TYPSTR1: ;entry point used by B$PRTSTR
  195. MOV SI,[BX+2] ; SI = string address
  196. ; See if we can pump the whole string out at once, or if we must do it a
  197. ; character at a time ---
  198. ; CMP CX,4
  199. ; JBE B$OUTCNT  ;brif 4 or less chars in string: not worth it
  200. TEST b$IOFLAG,RED_OUT OR LPR_ECHO OR F_EDIT
  201. JNZ B$OUTCNT  ;BRIF user wants output to echo to printer
  202. ;or in INPUT mode or redirected output
  203. MOV AL,b$CSRX ; horizontal cursor position (1-relative)
  204. CBW ; clear high byte
  205. DEC AX ; make 0-relative
  206. ADD AX,CX ;add in number of chars in string
  207. OR AH,AH ; string size + cursor loc > 255?
  208. JNZ B$OUTCNT  ;brif so
  209. XCHG DH,AL ; DH = column to test (one less than what
  210. ; we'll get when done)
  211. CALL B$CHKLASTCOL ; more than one past last column on screen?
  212. JA B$OUTCNT ; brif so -- we'll have to wrap to print it
  213. ; If we get b$CSRX = 81 when done, that's
  214. ; OK.
  215. PUSH CX ; save string length and address
  216. PUSH SI
  217. CTL_CHK:
  218. LODSB ; AL = next char
  219. CMP AL,31 ; is this character a control character?
  220. JBE CTL_CH_FOUND ;BRIF so
  221. LOOP CTL_CHK  ;loop until all chars in string are checked
  222. CTL_CH_FOUND:
  223. ;here if we found a ctl char in our string; print it the slower way
  224. POP SI ; restore string address and length
  225. POP CX
  226. ;Fall through into B$OUTCNT
  227. ;***
  228. ;B$OUTCNT - Output a string of characters one at a time
  229. ;
  230. ;Purpose:
  231. ; Print a string of characters to the screen one at a time.
  232. ; A count is given of the number of characters to be printed,
  233. ; the string does not have to be nul terminated.
  234. ;
  235. ; If FK_KANJI, then we also have to flush the one byte buffer
  236. ; that B$TTY_SOUT uses to hold the first part of a double
  237. ; byte character.  This is done in case this string contains
  238. ; pieces of a KANJI character.
  239. ;
  240. ;Entry:
  241. ; CX - Count of characters to be printed
  242. ; DS:SI - Pointer to first character
  243. ;
  244. ;Exit:
  245. ; DS:SI - Points to position after the CXth character.
  246. ;
  247. ;Uses:
  248. ; SI as a pointer to the string, it is updated upon exit.
  249. ;
  250. ;Exceptions:
  251. ; None.
  252. ;****
  253. B$OUTCNT:
  254. LODSB
  255. CALL B$TTY_SOUT
  256. LOOP B$OUTCNT
  257. RETL: RET
  258. SUBTTL TTY input supporting routine -- B$INPCRLF
  259. page
  260. ;***
  261. ;B$INPCRLF -- print the terminating CR/LF(s).
  262. ; Moved here from inptty.asm with revision [18] for /O granularity.
  263. ;
  264. ;Purpose:
  265. ; This routine prints a terminating CR/LF after an INPUT or
  266. ; LINE INPUT statement that did not have a ';' to suppress the
  267. ; CR.  It also writes a CR/LF to the screen when output is
  268. ; redirected and input is not redirected, in order to keep
  269. ; successive INPUT statements from writing over each other.
  270. ;
  271. ;Entry:
  272. ; b$IOFLAG set correctly
  273. ;Exit:
  274. ;Uses:
  275. ; none
  276. ;Exceptions:
  277. ; none
  278. ;***********************************************************************
  279. cProc B$INPCRLF,<PUBLIC,NEAR>,<AX>
  280. cBegin
  281. CALL B$$TCR ; write terminating CR/LF to either
  282. ; screen/printer or redir. file
  283. MOV AL,b$IOFLAG
  284. AND AL,RED_OUT OR RED_INP ; is output redirected and input
  285. CMP AL,RED_OUT ;  not redirected?
  286. JNZ NO_EXTRA ; brif not -- no extra CR required
  287. ; output a CR/LF to the screen and possibly the printer when output
  288. ; redirected and input not redirected.
  289. ; notice AL = RED_OUT !!!
  290. XOR b$IOFLAG,AL ; Fake B$TTY_SOUT into thinking it
  291. ; should to print to the screen
  292. ; (and printer) instead of to the
  293. ; redirected file.
  294. CALL B$$TCR ; write CR/LF to screen
  295. OR b$IOFLAG,AL ; Reset RED_OUT flag.
  296. NO_EXTRA:
  297. cEnd ; return to caller
  298. sEnd RT_TEXT 
  299. END