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

操作系统开发

开发平台:

Visual C++

  1. TITLE GWINI - GW BASIC 2.0 Initialization/Utility Routines
  2. ;***
  3. ; GWINI - GW BASIC 2.0 Initialization/Utility Routines
  4. ;
  5. ; Copyright <C> 1986, Microsoft Corporation
  6. ;
  7. ;Purpose:
  8. ;
  9. ; The routines in this module are always called; regardless of
  10. ; whether the statements they are initializing are found in the
  11. ; program or not. This module should not cause any statement
  12. ; processing module to be linked in (i.e. only low-level routines
  13. ; should be called).
  14. ;
  15. ;******************************************************************************
  16. INCLUDE switch.inc
  17. INCLUDE rmacros.inc ; general runtime macros
  18. UseSeg _BSS
  19. UseSeg _DATA
  20. UseSeg ER_TEXT 
  21. UseSeg RT_TEXT 
  22. INCLUDE seg.inc  ; Segment definitions
  23. INCLUDE baslibma.inc
  24. INCLUDE files.inc
  25. INCLUDE nhutil.inc
  26. INCLUDE idmac.inc ; Internal debugging macros
  27. INCLUDE const.inc ; bit flag constants
  28. INCLUDE rtps.inc ; constants shared with QBI
  29. .radix 10
  30. sBegin _DATA
  31. globalW b$pCommSave,Near_Ret,1 ; conditional vector to B$CommSave
  32. globalW b$pCommRestore,Near_Ret,1 ; conditional vector to B$CommRestore
  33. ; b$TempSD is a general purpose string descriptor for temporary use
  34. globalW b$TempSD,?,2 ; handle (ppData) & SB
  35. externB b$CRTWIDTH ; Physical width
  36. externB b$SCRNWIDTH ; Logical width
  37. externB b$WDOBOT
  38. externB b$WDOTOP
  39. externW b$CURSOR ; (1,1)-relative screen cursor
  40. externB b$LINCNT
  41. externW b$VWINI_PTR ;Calls B$GRPINI once initialized
  42. externW __aenvseg
  43. ;   Added with revision [28]
  44. ;***
  45. ;b$IOFLAG - General Purpose IO Bits
  46. ;OEM-callback routine (variable)
  47. ;
  48. ;Purpose:
  49. ; This variable keeps track of the global state of the I/O module.
  50. ; Most of the bits in the flag variable are used to handle all the
  51. ; different cases for I/O redirection.
  52. ;
  53. ;Allocation:
  54. ; b$IOFLAG is a BYTE value declared in the _DATA segment by
  55. ; the OEM-Independent code.
  56. ;
  57. ;Values:
  58. ; Field definitions of b$IOFLAG are in CONST.INC.  Initially, all
  59. ; fields are set to 0.
  60. ;
  61. ; RED_INP is a bit that is set when input from stdin is being redirected
  62. ;     from a file.  This field is set during console initialization
  63. ;     by the runtime and is not changed. (01H)
  64. ;
  65. ; RED_OUT is a bit that is set when output stdout is being redirected
  66. ;     to a file. This field is set during console initialization
  67. ;     by the runtime and is not changed. (02H)
  68. ;
  69. ; LPR_ECHO is a bit that is set when output to the screen is being
  70. ;     echoed to the line printer.  Its value does not affect redirected
  71. ;     IO, but the printer will not echo redirected output.  (04H)
  72. ;     This field is set/cleared when the Print Scrn key is recognized.
  73. ;
  74. ; F_KDSP is a bit that is set when currently updating a function key
  75. ;     display, and output should not be sent to the printer or a
  76. ;     redirected file.  A special routine to map the function keys
  77. ;     is called when this is true.  (08H)
  78. ;
  79. ; IN_INPUT is a bit that is set when redirected output to stdout is
  80. ;     to be inhibited.  This is when an INPUT statement is being
  81. ;     processed, and the user is editing his input.  Not until the
  82. ;     user hits <return> is the data entered sent to the redirected
  83. ;     file, so that the editing corrections are not present.
  84. ;     However, while IN_INPUT is set , output will go to the screen,
  85. ;     using screen cursor values. (10H)
  86. ;
  87. ; F_EDIT is a bit that is set when in the INPUT statement, and B$PRTMAP
  88. ;     should be disabled as B$EDTMAP does the mapping.  (20H)
  89. ;
  90. ; SCN_INIT is a bit that is set to indicate that the screen has been
  91. ;     physically initialized. This field is set by the OEM at the
  92. ;     time the screen is actually initialized (B$SCINIT).  (40H)
  93. ;
  94. ; SCN_SCROLL is a bit indicating that we need to scroll the screen
  95. ;     upon the first screen operation because we entered on the last
  96. ;     line of the screen.  This flag is only used by the OEM before
  97. ;     the screen has been physically initialized.  (80H)
  98. ;
  99. ;Initially Set:
  100. ; RED_INP is set by the OEM-Independent code before B$GWINI or
  101. ; B$RTLLINIT are called.
  102. ; RED_OUT is set by the OEM-Independent code before B$GWINI or
  103. ; B$RTLLINIT are called.
  104. ; LPR_ECHO is statically initialized to be 0.
  105. ; F_KDSP is statically initialized to be 0.
  106. ; IN_INPUT is statically initialized to be 0.
  107. ; F_EDIT is statically initialized to be 0.
  108. ; SCN_INIT is statically initialized to be 0.
  109. ; SCN_SCROLL is statically initialized to be 0.
  110. ;
  111. ;Modified By:
  112. ; RED_INP and RED_OUT should not be modified once initialized.
  113. ; LPR_ECHO is modified by the OEM-Independent code upon detection
  114. ; of the Print Screen Key and upon a RUN command.
  115. ; F_KDSP is set at the beginning of the function key update routines
  116. ; and cleared at the end of them.
  117. ; IN_INPUT and F_EDIT are set and cleared by the Screen Editor
  118. ; SCN_INIT and SCN_SCROLL are only modified by the OEM-Dependent code.
  119. ;
  120. ;Used By:
  121. ; All the fields of b$IOFLAG except for SCN_INIT and SCN_SCROLL are
  122. ; only used by the OEM-Independent Code. SCN_INIT is used by both
  123. ; the OEM-Dependent code and the termination code.  If SCN_INIT
  124. ; is 1 at termination time, then B$RESETSCN will be called.  Otherwise
  125. ; B$RESETSCN will not be called by the termination code. SCN_SCROLL
  126. ; is not used by the OEM-Independent Code in any way.  This flag
  127. ; may be used for any purpose.
  128. ;****
  129. globalB b$IOFLAG,0 ; general-purpose IO bits defined above.
  130. ;*** 
  131. ;b$vKEYDSP - Vector for indirect call to B$KEYDSP, display/clear function keys
  132. ;OEM-callback routine (variable)
  133. ;
  134. ;Purpose:
  135. ; Update the function key display.  If b$KEY_SW is set to 0 then
  136. ; the function key display is disabled and is removed from the
  137. ; screen if it existed.  If b$KEY_SW is set to -1, then the
  138. ; function key display is enabled and is displayed on the screen
  139. ; if needed.
  140. ;
  141. ; This routine is called indirectly through the vector
  142. ; b$vKEYDSP
  143. ;
  144. ;Entry:
  145. ; B$KEY_SW set appropriately:  0 = turn off function key display
  146. ;     -1 = display function keys.
  147. ;
  148. ;Exit:
  149. ; None.
  150. ;
  151. ;Uses:
  152. ; Per Convention
  153. ;
  154. ;Preserves:
  155. ; AX, BX, CX, DX
  156. ;
  157. ;Exceptions:
  158. ; Just returns unless B$KEYDSP is linked in by B$INPP or B$KFUN.
  159. ;
  160. ;Vector Information:
  161. ; b$vKeyDSP is a WORD value defined in the _DATA segment by the
  162. ; OEM-Independent code.  It is set up by an initializer before
  163. ; the BASIC runtime is first called.  It should not be modified.
  164. ;******************************************************************************
  165. globalW b$vKEYDSP,Near_Ret,1
  166. sEnd _DATA
  167. sBegin _BSS
  168. externB   b$KEY_SW   ;GWDATA -
  169. externW   B$WNDWSW   ;GWDATA -
  170. ;***
  171. ; b$HugeShift, b$HugeDelta - OS selector shift count for HUGE access
  172. ;OEM-callback routine (variable)
  173. ;
  174. ;Purpose:
  175. ; This value is used to access successive pieces of a
  176. ; HUGE array.  To get to the next segment of memory in
  177. ; which the array exists, use the following formula:
  178. ; (assuming that the array is accessed through DS:)
  179. ;
  180. ; DS:  = DS: + (1 << b$HugeShift)
  181. ;
  182. ; The value (1 << b$HugeShift) is precomputed and stored
  183. ; in the variable b$HugeDelta.
  184. ;
  185. ; NOTE: For DOS, these variables are guarenteed to be identical
  186. ;       each time the program is run and could be replaced by
  187. ;       constants.
  188. ;
  189. ;Allocation:
  190. ; b$HugeShift is a BYTE value defined in the _BSS segment by
  191. ; the runtime code.
  192. ;
  193. ; b$HugeDelta is a WORD value defined in the _BSS segment by
  194. ; the runtime code.
  195. ;
  196. ;Values:
  197. ; The values for b$HugeShift and b$HugeDelta are dependent upon
  198. ; the operating system.  Both variables are initialized by the
  199. ; runtime during runtime initialization and should not be changed.
  200. ;
  201. ;Initially Set:
  202. ; The values of these variables are undefined until they are set
  203. ; at initialization time.  They are initialized after B$GWINI and
  204. ; and B$RTLLINIT are called but before any user code is executed
  205. ; or interpreted.
  206. ;
  207. ;Modified By:
  208. ; These variables should not be modified once they are initialized.
  209. ;
  210. ;Used By:
  211. ; These variables are used by anyone who wants to access a dynamic
  212. ; array bigger than 64K.
  213. ;****************************************************************************
  214. globalB b$HugeShift,? ;OS selector shift count for HUGE access
  215. ;NOTE: this uses an extra byte from
  216. ;b$HugeDelta when we pass b$HugeShift to
  217. ;DOSGETHUGESHIFT (which returns a WORD)
  218. globalW b$HugeDelta,? ;OS selector seg increment for HUGE access
  219. ;***
  220. ;b$Buf1, b$Buf2 - temporary buffer space
  221. ;OEM-callback routine (variable)
  222. ;
  223. ;Purpose:
  224. ; Both b$Buf1 and b$Buf2 are large buffers of temporary storage
  225. ; for general use.  These buffers are used in many places
  226. ; throughout the runtime.  While it is theoretically possible for
  227. ; the OEM code to use either or both of these buffers any time they
  228. ; are not in use, there is no way to determine whether they are being
  229. ; used.  The mechanism in the rest of the runtime for determining
  230. ; availability is visual inspection and use of the routines
  231. ; B$HoldBuf(n) and B$FreeBuf(n) which do not exist in a release
  232. ; version.
  233. ;
  234. ; These buffers are mainly described here for the understanding
  235. ; of the sample code supplied by MicroSoft.  However, there are a
  236. ; couple of specific times the buffers are guaranteed to be free,
  237. ; which are described below.
  238. ;
  239. ; Note that b$Buf2 immediately follows b$Buf1, so if both are
  240. ; available you have a block of 258 contiguous bytes of DGROUP.
  241. ;
  242. ;Allocated:
  243. ; b$Buf1 is a block of 129 BYTES allocated in _BSS by the runtime.
  244. ; b$Buf2 is a block of 129 BYTES allocated in _BSS by the runtime.
  245. ;
  246. ;Values:
  247. ; Undefined
  248. ;
  249. ;Initially Set:
  250. ; Undefined
  251. ;
  252. ;Modified By:
  253. ; Undefined
  254. ;
  255. ;Used By:
  256. ; b$BUF1 is guaranteed to be available during the calls to
  257. ; B$GWINI and B$RTLLINI. Furthermore, it is guaranteed
  258. ; that the value of b$BUF1 will not change between these
  259. ; two calls.
  260. ; b$BUF2 is guaranteed to be available with the same conditions as
  261. ; b$BUF1.  Also, b$BUF2 will be available for use during
  262. ; the execution of any of the routines in LLCOM5.ASM.
  263. ; However, the contents of the buffer may change between
  264. ; calls to these routines.
  265. ;******************************************************************************
  266. ;
  267. ; NOTE -- Any (or all) of these LARGE buffers can be used by anyone
  268. ; that wants to, provided they are not used in a calling routine.  
  269. ; IN DEBUG CODE, call B$HoldBuf(1,2,12,3) to allocate the the buffers to
  270. ; your routine, and B$FreeBuf(1,2,12,3) to release the buffers.
  271. ;
  272. ;#########
  273. labelB <PUBLIC,b$PATHNAM> ; pathname buffer
  274. globalB b$Buf1,,FILNAML ; 1st large (pathname-sized) scratch buffer
  275. globalB b$Buf2,,FILNAML ; 2nd large (pathname-sized) scratch buffer
  276. globalB b$Buf3,,16 ; 3rd scratch buffer
  277. ; these buffers MUST remain contiguous
  278. sEnd _BSS
  279. sBegin RT_TEXT
  280. assumes cs,RT_TEXT
  281. PAGE
  282. SUBTTL Screen initialization
  283. ;***
  284. ; B$WHOME - Home the text cursor
  285. ; Moved here from iotty.asm with revision [60].  See note below!
  286. ;
  287. ; Input:
  288. ; b$WDOTOP set
  289. ; Output:
  290. ; [DL] == home row of cursor
  291. ; [DH] == home column of cursor
  292. ; Modifies:
  293. ; NONE
  294. ; Note:  
  295. ;  IMPORTANT: Must be kept in sync with the local WHOME routine in iotty.asm
  296. ;****
  297. cProc B$WHOME,<PUBLIC,NEAR>
  298. cBegin
  299. MOV DL,b$WDOTOP
  300. MOV DH,1
  301. cEnd
  302. ;***
  303. ; B$CRLF - Adust cursor row/column while doing a CR/LF. [61]
  304. ; Added with [60].
  305. ;
  306. ; Purpose:
  307. ; This routine is called every time a CR/LF is to be output
  308. ; to the screen.  It checks whether the screen will need to be
  309. ; scrolled and if not, increments DL.  Flags are set indicating
  310. ; whether or not the screen must be scrolled. DH is set to 1.
  311. ;
  312. ; Entry:
  313. ; DL = current line
  314. ;
  315. ; Exit:
  316. ; DH = 1
  317. ; DL = new line
  318. ; ZF ==> didn't change DL, since on last line
  319. ; NZ ==> changed DL, since not on last line
  320. ;
  321. ; Modifies:
  322. ; None
  323. ;****
  324. cProc B$CRLF,<PUBLIC,NEAR>
  325. cBegin
  326. MOV DH,1 ; reset cursor column to 1  
  327. CMP DL,b$LINCNT  ; on status line?
  328. JNE NOT_STATUS ; brif not -- don't adjust line
  329. MOV DL,b$WDOBOT  ; move cursor to bottom
  330. ; line of text window
  331. NOT_STATUS:
  332. CMP b$WDOBOT,DL ; Are we at bottom of window?
  333. JE NO_INC ; brif so -- ZF ==> last line
  334. INC DX ; increment row (NZ)
  335. NO_INC: ; return with flags set
  336. cEnd
  337. ;***
  338. ;B$SCNCLR - Home Text & Graphics Cursor, Refresh Function Key Display
  339. ;OEM-callback routine
  340. ;
  341. ; Re-written with revision [54].
  342. ;
  343. ;Purpose:
  344. ; This routine is used to initialize the screen editor, reset
  345. ; the graphics viewport and window to the screen dimensions,
  346. ; center the graphics cursor, home the text cursor and display
  347. ; the function keys if needed.
  348. ;
  349. ; This routine must be called at initialization and whenever
  350. ; screen characters are no longer accessible to the user because
  351. ; the screen dimensions have changed.  This routine should only
  352. ; be called from B$SCRSTT, B$SWIDTH, B$RESETSCN, and during
  353. ; initialization.
  354. ;
  355. ;Entry:
  356. ; None.
  357. ;
  358. ;Exit:
  359. ; None.
  360. ;
  361. ;Uses:
  362. ; Per Convention
  363. ;
  364. ;Preserves:
  365. ; BX, CX, DX
  366. ;
  367. ;Exceptions:
  368. ; None.
  369. ;****
  370. cProc B$SCNCLR,<NEAR,PUBLIC>
  371. cBegin
  372. CALL B$WHOME ; DX=text cursor home
  373. MOV b$CURSOR,DX ; update b$CURSOR
  374. CALL [b$vKEYDSP]  ; Conditionally display softkeys
  375.   ; (displays user cursor at position
  376. ; b$CURSOR when done)
  377. cEnd <nogen> ; fall into B$VIEWINIT
  378. ; Added as part of revision [30]
  379. ;***
  380. ;B$VIEWINIT - Initialize viewport, center graphics cursor
  381. ;OEM-callback routine
  382. ;
  383. ;Purpose:
  384. ; Initialize the graphics viewport and centers the graphics cursor.
  385. ; Sets the logical coordinate system to be identical to the
  386. ; physical coordinate system (disable WINDOW command).
  387. ;
  388. ;Entry:
  389. ; None
  390. ;
  391. ;Exit:
  392. ; None
  393. ;
  394. ;Uses:
  395. ; Per Convention
  396. ;
  397. ;Preserves:
  398. ; AX, BX, CX, DX
  399. ;
  400. ;Exceptions:
  401. ; None.
  402. ;****
  403. cProc B$VIEWINIT,<NEAR,PUBLIC> 
  404. cBegin
  405. CALL [b$VWINI_PTR] ;Initialize viewport, center graphics cursor
  406. MOV B$WNDWSW,0 ;Turn B$WNDWSW and B$WNDWSC off
  407. Near_Ret: ;near ret for vectors
  408. cEnd
  409. ;***
  410. ;B$SCNSWI - Set screen width(logical/physical) and height
  411. ;OEM-callback routine
  412. ;
  413. ;Purpose:
  414. ; B$SCNSWI will set the screen width (both logical and physical)
  415. ; and screen height.  Since this routine is used to communicate
  416. ; the screen dimensions to the Screen Editor, it must be called at
  417. ; initialization and whenever the character dimensions of the
  418. ; screen are modified.
  419. ;
  420. ;Input:
  421. ; AL=width, CL=height
  422. ;
  423. ;Output:
  424. ; None.
  425. ;
  426. ;Uses:
  427. ; Per Convention
  428. ;
  429. ;Preserves:
  430. ; AX, BX, CX, DX
  431. ;
  432. ;Exceptions:
  433. ; None.
  434. ;****
  435. cProc B$SCNSWI,<PUBLIC,NEAR>
  436. cBegin
  437. MOV b$CRTWIDTH,AL ; Set physical width of screen
  438. MOV b$SCRNWIDTH,AL ; Set SCRN: logical width
  439. MOV B$LINCNT,CL ;Save physical height
  440. MOV b$WDOTOP,1 ;Init window top
  441. PUSH CX
  442. DEC CL ; Reserve status line
  443. MOV b$WDOBOT,CL ;Set window bottom
  444. POP CX
  445. cEnd ; End of B$SCNSWI
  446. ;***
  447. ;B$UPCASE - Convert Character to Upper Case
  448. ;DBCS-callback
  449. ;
  450. ;Purpose:
  451. ; Convert the character in AL to uppercase if possible.  If it is
  452. ; not a character or it is already uppercase, it is not modified.
  453. ; This is done by a comparison against the range 'a'-> 'z'.  It does
  454. ; not use the Operating System call to case convert characters
  455. ; outside of this range.
  456. ;
  457. ; NOTE:  It is the caller's responsibility to make sure that it is
  458. ;        not sending 1/2 of a KANJI character to this routine.
  459. ;
  460. ; WARNING: Because this routine is called by B$GETCH
  461. ;
  462. ;   DS != DGROUP
  463. ;
  464. ;  If you go to change the code, keep this in mind!!!
  465. ;Entry:
  466. ; AL = Character to convert
  467. ;
  468. ;Exit:
  469. ; AL = UpperCase version of character
  470. ;
  471. ;Uses:
  472. ; Per Convention
  473. ;
  474. ;Preserves:
  475. ; AH, BX, CX, DX
  476. ;
  477. ;Exceptions:
  478. ; None.
  479. ;****
  480. cProc B$UPCASE,<PUBLIC,NEAR>
  481. cBegin
  482. CMP AL,'a' ;Is AL < 'a'
  483. JB upret ;Skip it
  484. CMP AL,'z' ;Is AL > 'z'
  485. JA upret ;Skit it
  486. upit:
  487. AND AL,255-' ' ;Convert to Upper Case
  488. upret:
  489. cEnd
  490. ;*** 
  491. ;B$Mul32x16 -- 32 by 16 bit multiply
  492. ;
  493. ;Purpose:
  494. ; Added with revision [68].
  495. ;
  496. ;Entry:
  497. ; [DX|AX] = multiplicand
  498. ; [CX] = multiplier
  499. ;
  500. ;Exit:
  501. ; [DX|AX] = [DX|AX] * [CX]
  502. ; CF ==> overflow
  503. ;
  504. ;Uses:
  505. ; BX
  506. ;
  507. ;Preserves
  508. ; CX
  509. ;
  510. ;Exceptions:
  511. ; None
  512. ;
  513. ;******************************************************************************
  514. cProc B$Mul32x16,<PUBLIC,NEAR>
  515. cBegin
  516. xchg bx,dx ; [BX|AX] = multiplicand
  517. mul cx ; multiply low word by 1000 ([DX|AX] = result)
  518. push ax ; save low word result
  519. push dx ; save first overflow
  520. xchg ax,bx ; AX = high word
  521. mul cx ; [DX|AX] = result of high word multiply
  522. pop dx ; DX = original high word
  523. jc Overflow ; brif overflow (need to clean stack)
  524. add ax,dx ; AX = high word of result (PSW.C if overflow)
  525. xchg ax,dx ; DX = high word of result
  526. OverFlow:
  527. pop ax ; AX = low word of result
  528. cEnd
  529. page
  530. sEnd RT_TEXT
  531. END