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

操作系统开发

开发平台:

Visual C++

  1. TITLE LLHGC - HGC screen mode support
  2. ;***
  3. ;LLHGC - HGC screen mode support
  4. ;
  5. ; Copyright <C> 1986, Microsoft Corporation
  6. ;
  7. ;Purpose:
  8. ; Support for Hercules Graphics Card (HGC) graphics
  9. ; screen mode (BIOS 8).
  10. ;
  11. ; This module sets hooks in the mode-independent
  12. ; modules to routines here for mode-dependent
  13. ; graphics support.  See the mode-independent
  14. ; modules for more precise descriptions of the
  15. ; purposes and interfaces of these routines.
  16. ;
  17. ; The following table summarizes the information for
  18. ; the modes and configurations covered:
  19. ;
  20. ;    C   | A      B
  21. ;    O   |  B T      I
  22. ;    L   |  I T  P      T
  23. ;    O      A M |  O R  A    C      S
  24. ;  S R      D O |  S I    C  G    H      / P
  25. ;  C B      A N | B    O  E    A   P  P L
  26. ;  R U C  R P I |  M U    L  X   Y  S    R   A  I A
  27. ;  E R O  O T T |  O T    O  R   R  I    B   G  X N
  28. ;  E S L  W E O |  D E    R  E   E  Z    O   E  E E
  29. ;  N T S  S R R |  E S    S  S   S  E    X   S  L S
  30. ; -- - -- -- - -- | -- --- ---- --- --- --- ---- --- - -
  31. ;  3 x 80 25 H M |  8  2  N/A 720 348  32 9x14  2*  1 1
  32. ;
  33. ;  * only 1 page allowed if color card installed
  34. ;
  35. ; Discussion of HGC memory interleave line archtecture:
  36. ; HGC video memory is organized into four interleaved banks of 8K
  37. ; each.
  38. ;
  39. ; Scan Offset
  40. ; Line from B800
  41. ; ---- ---------
  42. ; 0 0
  43. ; 1 8K
  44. ; 2 16K
  45. ; 3 24K
  46. ; 4 90
  47. ; 5 8K+90
  48. ; 6 16K+90
  49. ; 7 24K+90
  50. ; . .
  51. ; . .
  52. ; . .
  53. ;
  54. ; To move  from scan line  to scan line  add to current address
  55. ; -------  --------------  ------------  ----------------------
  56. ;  UP      MOD 0      MOD 3      24K-90
  57. ;  UP      MOD 1      MOD 0      -8K
  58. ;  UP      MOD 2      MOD 1      -8K
  59. ;  UP      MOD 3      MOD 2      -8K
  60. ;  DOWN      MOD 0      MOD 1       8K
  61. ;  DOWN      MOD 1      MOD 2       8K
  62. ;  DOWN      MOD 2      MOD 3       8K
  63. ;  DOWN      MOD 3      MOD 0     -24K+90
  64. ;
  65. ;******************************************************************************
  66. INCLUDE switch.inc ;feature switches
  67. INCLUDE rmacros.inc
  68. USESEG _DATA
  69. USESEG _BSS
  70. USESEG GR_TEXT
  71. USESEG CN_TEXT
  72. USESEG XIB
  73. USESEG XI
  74. USESEG XIE
  75. INCLUDE seg.inc
  76. INCLUDE ibmunv.inc
  77. INCLUDE llgrp.inc ;Constant definitions
  78. INCLUDE idmac.inc
  79. INCLUDE grmac.inc ;ModeData macros
  80. INITIALIZER B$xINITHERC ;Put B$xINITHERC in initializer list
  81. sBegin _BSS
  82. ;
  83. ; ***************************************************************************
  84. ; External variables
  85. ; ***************************************************************************
  86. ;
  87. externB b$BiosMode
  88. externB b$Adapter
  89. externW b$VideoBase
  90. externB b$MaskC
  91. externW b$OffC
  92. externW b$SegC
  93. externW b$CurrPSize
  94. externW b$CurPages
  95. externW b$UpSub
  96. externW b$DnSub
  97. externW b$UpDnAdd
  98. externB b$MaxPage ; maximum number of pages allowed - 1
  99. externW b$VideoMem ; used to calculate b$MaxPage
  100. externW b$ScreenTab
  101. sEnd _BSS
  102. assumes CS,GR_TEXT
  103. sBegin GR_TEXT
  104. externNP B$SCNIO ;used in SCNIO macro
  105. externNP B$InitModeData
  106. externNP B$ErrorReturn
  107. externNP B$CgaSetAttr
  108. externNP B$CgaLeftC1
  109. externNP B$CgaChkUpC
  110. externNP B$CgaUpC
  111. externNP B$CgaChkDownC
  112. externNP B$CgaDownC
  113. externNP B$CgaReadC
  114. externNP B$CgaSetC
  115. externNP B$CgaSetPixC
  116. externNP B$CgaSetPixFirstC
  117. externNP B$CgaSetPixLastC
  118. externNP B$CgaPutAction
  119. externNP B$CgaNReadL
  120. externNP B$CgaNWriteL
  121. externNP B$CgaNSetC
  122. externNP B$CgaSetTile
  123. externNP B$CgaPaintBound
  124. externNP B$CgaScanL
  125. externNP B$CgaScanR
  126. externNP B$CgaLineX
  127. externNP B$CgaLineY
  128. externNP B$CgaLineV
  129. ;===========================================================================
  130. mModeData Mode3Data
  131. ;
  132. ; SCREEN 3, BIOS mode 8
  133. ;
  134. ; Mode-dependent data follows to initialize the the "b$ModeData" table
  135. ; in LLCGRP.
  136. ;
  137. ;===========================================================================
  138. mScreenMode 3
  139. mBiosMode 8
  140. mBurst 0
  141. mScrWidth 80
  142. mScrHeight 25
  143. mHorzRes 720
  144. mVertRes 348
  145. mVideoBase 0B000H
  146. mMaxAttr 1
  147. mMaxColor -1     ;no palette
  148. mPageSize 32     ;page size in K
  149. mCurrPSize <(32*1024) shr 4>   ;page size in paragraphs (1 plane)
  150. mMaxPage 1
  151. mNullColor 0
  152. mForeColor 1
  153. mBackColor 0
  154. mEgaWrMd 0
  155. mInitPalette 0
  156. mInitVgaPal 0
  157. mAlphaDim AlphaDim3
  158. mSetMode SetMode3
  159. mSetPages SetPages
  160. mPalReset B$ErrorReturn
  161. mPalPut  B$ErrorReturn
  162. mPalTrans B$ErrorReturn
  163. mPalSet  B$ErrorReturn
  164. mSetColor B$ErrorReturn
  165. mForeMapped 1
  166. mBitsPerPixel 1
  167. mPlanes  1
  168. mMapXYC  MapXYC3
  169. mLeftC B$CgaLeftC1
  170. mChkUpC  B$CgaChkUpC
  171. mUpC B$CgaUpC
  172. mChkDownC B$CgaChkDownC
  173. mDownC B$CgaDownC
  174. mSetAttr B$CgaSetAttr
  175. mReadC B$CgaReadC
  176. mSetC B$CgaSetC
  177. mSetPixC B$CgaSetPixC
  178. mSetPixFirstC B$CgaSetPixFirstC
  179. mSetPixLastC B$CgaSetPixLastC
  180. mLineX B$CgaLineX
  181. mLineY B$CgaLineY
  182. mLineV B$CgaLineV
  183. mPutAction B$CgaPutAction
  184. mNReadL  B$CgaNReadL
  185. mNWriteL B$CgaNWriteL
  186. mNSetC B$CgaNSetC
  187. mPaintBound B$CgaPaintBound
  188. mSetTile B$CgaSetTile
  189. mScanL B$CgaScanL
  190. mScanR B$CgaScanR
  191. mEnd GraphDataLen
  192. ;===========================================================================
  193. labelNP <PUBLIC, B$HRCUSED>
  194. ;*** 
  195. ; B$Screen3
  196. ;
  197. ;Purpose:
  198. ; Establish all relevent mode dependent data values and function
  199. ; vectors for BASIC screen mode 3.
  200. ;Entry:
  201. ; AL = screen mode (3)
  202. ; AH = burst (N/A)
  203. ; CL = alpha columns
  204. ;Exit:
  205. ; PSW.C = set indicates error
  206. ;Uses:
  207. ; per conv.
  208. ;Exceptions:
  209. ;******************************************************************************
  210. cProc B$Screen3,<PUBLIC,NEAR>
  211. cBegin
  212. test b$Adapter,HGC ;check for adapter support
  213. stc
  214. jz ScrExit  ;exit w/error if not supported
  215. mov bx,GR_TEXTOFFSET Mode3Data  ;mode-specific data
  216. mov cx,GraphDataLen
  217. call B$InitModeData ;initialize table data
  218. mov b$UpSub,8192
  219. mov b$DnSub,24576-90
  220. mov b$UpDnAdd,8192+24576-90
  221. mov ax,[b$VideoMem]
  222. rol al,1 ; divide by 32K
  223. rol al,1
  224. and [b$MaxPage],al ; Max pages = b$Videomem / 32K
  225. ; NOTE:  Clear carry here -- currently done by the AND instruction
  226. ; clc ;indicate no error
  227. ScrExit:
  228. cEnd
  229. ;***
  230. ; AlphaDim3
  231. ;
  232. ;Purpose:
  233. ; Validate the proposed text dimensions for Screen 3.
  234. ;   If 80x25 is requested, this mode satisfies the request
  235. ;   else suggest screen mode 0.
  236. ;Entry:
  237. ; BH = number of lines
  238. ; BL = number of columns
  239. ;Exit:
  240. ; AL = -1 if this mode satisfies the request, otherwise
  241. ; AL is suggested screen mode to invoke for desired dimensions
  242. ;Uses:
  243. ; per conv.
  244. ;Exceptions:
  245. ;******************************************************************************
  246. DbPub AlphaDim3
  247. cProc AlphaDim3,<NEAR>
  248. cBegin
  249. mov al,-1 ;flag request satisfied (maybe)
  250. cmp bx,80+25*256 ;80x25?
  251. je ADim3Exit ;exit if so, standard stuff
  252. xor al,al ;flag request for screen 0, let text mode try
  253. ADim3Exit:
  254. clc ;no error
  255. cEnd
  256. ;***
  257. ; SetMode3
  258. ;
  259. ;Purpose:
  260. ; Set the screen mode according to the characteristics established
  261. ; by previous call to B$Screenx and b$AlphaDim.
  262. ;Entry:
  263. ;
  264. ;Exit:
  265. ;
  266. ;Uses:
  267. ; per conv.
  268. ;Exceptions:
  269. ;******************************************************************************
  270. DbPub SetMode3
  271. cProc SetMode3,<NEAR>
  272. cBegin
  273. mov al,b$BiosMode ;set BIOS mode 8
  274. SCNIOS vSetMode
  275. cEnd
  276. ;***
  277. ; SetPages
  278. ;
  279. ;Purpose:
  280. ; Set the current active and visual pages and calculate page size
  281. ; and video segment offset for EGA modes.
  282. ;Entry:
  283. ; AL = active page
  284. ; AH = visual page
  285. ;Exit:
  286. ; b$CurPages set to new active and visual pages.
  287. ; b$SegC set to start of new active page.
  288. ;Uses:
  289. ; per conv.
  290. ;Exceptions:
  291. ;******************************************************************************
  292. cProc SetPages,<NEAR>
  293. cBegin
  294. mov b$CurPages,ax ;save page numbers
  295. push ax
  296. mov al,ah
  297. SCNIO vSelActivePage ;set visual page
  298. pop ax
  299. cbw ;extend active page to word
  300. mul b$CurrPSize ;times page size in paras
  301. add ax,b$VideoBase ;set video segment
  302. mov b$SegC,ax
  303. cEnd
  304. ;***
  305. ; MapXYC3
  306. ;
  307. ;Purpose:
  308. ; May given X and Y coordinates to the graphics cursor for Screen 3.
  309. ;Entry:
  310. ; CX = X coordinate
  311. ; DX = Y coordinate
  312. ;Exit:
  313. ; b$OffC, b$MaskC updated
  314. ;Uses:
  315. ; per conv.
  316. ;Exceptions:
  317. ;******************************************************************************
  318. DbPub MapXYC3
  319. cProc MapXYC3,<NEAR>
  320. cBegin
  321. xor ax,ax
  322. shr dx,1 ;dx=row within quadrant
  323. rcr ax,1 ;ax=8K multiple for quadrant displacement
  324. shr dx,1
  325. rcr ax,1
  326. shr ax,1
  327. mov bx,dx ;multiply y by 90 to compute row displacement
  328. shl dx,1 ;dx=2*Y
  329. shl dx,1 ;dx=4*Y
  330. add dx,bx ;dx=5*Y
  331. shl dx,1 ;dx=10*Y
  332. mov bx,dx
  333. shl dx,1 ;dx=20*Y
  334. shl dx,1 ;dx=40*Y
  335. shl dx,1 ;dx=80*Y
  336. add dx,bx ;dx=90*Y
  337. add dx,ax ;add in quadrant displacement
  338. mov ax,cx ;save x
  339. shr ax,1 ;div by PixelsPerByte (8)
  340. shr ax,1 ;  to get byte index
  341. shr ax,1
  342. add dx,ax ;add x byte offset to y row address
  343. mov b$OffC,dx ;save byte offset
  344. and cl,7 ;mask in x bit addr
  345. mov ch,10000000B ;leftmost pixel on in shift mask
  346. shr ch,cl ;move over to get mask
  347. mov b$MaskC,ch ;store cursor mask
  348. cEnd
  349. ;***
  350. ; B$xINITHERC - initialize HERC modes
  351. ;
  352. ;Purpose:
  353. ; Added with revision [2].
  354. ; Put the address of Hercules screen mode support routine into the
  355. ; dispatch table used by the screen statement.
  356. ;
  357. ;Entry:
  358. ; None
  359. ;Exit:
  360. ; ScreenTab updated
  361. ;Uses:
  362. ; None
  363. ;Exceptions:
  364. ;******************************************************************************
  365. cProc B$xINITHERC,<FAR,PUBLIC> 
  366. cBegin
  367. MOV WORD PTR [b$ScreenTab + (3*2) + 1],OFFSET B$Screen3
  368. cEnd
  369. sEnd GR_TEXT
  370. END