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

操作系统开发

开发平台:

Visual C++

  1. ;*
  2. ;* COW : Character Oriented Windows
  3. ;*
  4. ;* screen.asm : installable screen drivers
  5. title screen - Screen control code for CW
  6. .xlist
  7. include user.inc
  8. include uisa.inc ;* for isa's
  9. include screen.inc ;* screen stuff
  10. include inscr.inc
  11. include indrv.inc
  12. ifdef KANJI
  13. include kanji.inc
  14. endif ;KANJI
  15. .list
  16. ;----------------------------------------------------------------------------
  17. ;
  18. ; * Video Support Macros *
  19. ;********** PrepareDraw **********
  20. ;* entry : axPos = ax position
  21. ;* ayPos = ay position
  22. ;* * Calculate the screen position of the character specified
  23. ;* * set ayDrawing to the row being drawn, clear fMouseLockedOut first
  24. ;* * set axDrawFirst
  25. ;* exit : ES:DI = address of character (lpch)
  26. ;* * TRASHES AX,BX
  27. PrepareDraw MACRO axPos,ayPos
  28. mov al,ayPos
  29. mov ayDrawing,al ;* set drawing location
  30. mul axMac
  31. mov bl,axPos
  32. mov axDrawFirst,bl
  33. xor bh,bh
  34. add ax,bx
  35. shl ax,1 ; ax = (ayPos * axMac + ayPos) * 2
  36. ifdef DEBUG
  37. cmp instCur.psPrimInst,0 ;* no buffer! (FAllocInstBuffers)
  38. jne @F
  39. cCall CowAssertFailed
  40. DB "no primary buffer for current mode$"
  41. @@:
  42. endif ;DEBUG
  43. mov es,instCur.psPrimInst
  44. mov di,ax ;* ES:DI => primary buffer
  45. ENDM
  46. ;*****************************************************************************
  47. ifdef DEBPUB ;* Debugging Publics
  48. PUBLIC DoDraw
  49. endif
  50. ;*****************************************************************************
  51. sBegin DATA
  52. assumes DS,DGROUP
  53. ;* PUBLIC
  54. externW <rgsa> ;* array of SA's
  55. externB <inch, insj>
  56. IFNDEF CBOX
  57. externB <boxSingle, boxDouble, chShadow>
  58. endif ; !CBOX
  59. ifdef WINDOW_OVERLAP
  60. externW <psOverlap> ;* windows for overlap check
  61. externW <pwndCur> ;* current drawing window
  62. externB <boxActiveWindowOut>
  63. externB <boxInactiveWindowOut>
  64. externB <boxActiveWindowIn>
  65. externB <boxInactiveWindowIn>
  66. endif ;WINDOW_OVERLAP
  67. ;* PRIVATE
  68. externB <ayMouse> ;* current mouse position
  69. globalB ayDrawing,ayNil ;* current drawing ay
  70. globalB axDrawFirst,ayNil ;* start drawing ax
  71. ifdef SCREEN_FFONT
  72. externW <mpisaffont> ;* ffont values
  73. endif ;SCREEN_FFONT
  74. ifdef BUILTIN_SNOW
  75. globalB fWaitRetrace,0 ;* snow protect for twin compatibility,QC only
  76. endif ;BUILTIN_SNOW
  77. sEnd DATA
  78. ;----------------------------------------------------------------------------
  79. sBegin BSS
  80. assumes DS,DGROUP
  81. globalB instCur,<cbInstMin DUP (?)> ; data for installable drivers.
  82. globalW fRestoreDbcs,0 ;* => restore DBCS characters
  83. ;* stays 0 for non-KANJI
  84. ifdef SCREEN_FFONT
  85. globalW fFontAvailable,0 ;* => ffont support allowed
  86. endif ;SCREEN_FFONT
  87. globalB axMac,0 ; Maximum column number
  88. globalB ayMac,0 ; Maximum row number (start at 0)
  89. globalW axMacTimes2,0 ; for row modulus - WORD !!!
  90. globalB fMonochrome,0 ;* Is b/w display
  91. ;* * Variable for implementing mouse lockout (see kernel/mouse.asm)
  92. globalB fMouseLockedOut,0 ;* set by mouse handler
  93. globalB cHoldUpdate,0 ;* used by BeginDraw EndDraw
  94. ;* PRIVATE *
  95. globalW fColorModeOld,0 ;* last color mode
  96. globalW offDrawFirst,0 ;* offset where drawing started
  97. staticW ffontCur,0 ;* current ffont value
  98. ;* * KLUDGE for clear screen !!
  99. globalB caOld,0 ;* old screen attribute
  100. DB 0
  101. sEnd BSS
  102. ;*****************************************************************************
  103. sBegin SCREEN
  104. assumes CS,SCREEN
  105. assumes DS,DGROUP
  106. assumes SS,DGROUP
  107. ;* * High level routines
  108. ;********** FillArc **********
  109. ;* entry : axLeft, ayTop, axRight, ayBottom : rectangle to fill
  110. ;* chFill : fill character (CHAR -- may be DBCS character)
  111. ;* diCur : draw info (HIBYTE = dm, LOBYTE = isa).
  112. ;* * apply draw mode & data to specified rectangle
  113. ;* D flag MUST BE CLEARED !!!
  114. ;* exit : n/a
  115. cPrivate FillArc,<ATOMIC>,<SI,DI> ;* PRIVATE
  116. parmB  axLeft
  117. parmB  ayTop 
  118. parmB  axRight 
  119. parmB  ayBottom ;* also day
  120. ifdef KANJI
  121. parmW  chFill ;* CHAR type
  122. ELSE
  123. parmB  chFill
  124. endif ;!KANJI
  125. parmW  diCur ;* draw info
  126. LocalW daxMax ;* line wrap value
  127. cBegin FillArc
  128. StartPublic
  129. AssertUp
  130. ;* * Find row count
  131. mov al,ayTop
  132. sub ayBottom,al ;* day
  133. ifdef KANJI
  134. jz J_fill_end
  135. else ; KANJI
  136. jz fill_end ;* no rows to fill
  137. endif ; KANJI
  138. ;* * Find character count
  139. mov cl,axRight
  140. sub cl,axLeft
  141. ifdef KANJI
  142. jnz @F
  143. J_fill_end:
  144. jmp fill_end
  145. @@:
  146. else ; KANJI
  147. jz fill_end ;* no width to fill
  148. endif ; KANJI
  149. xor ch,ch
  150. ;* * Prepare for the fill
  151. PrepareDraw axLeft,ayTop ;* sets ES:DI
  152. mov dx,screenOffset mpdmnpfnDrawFR ;* normal fill row
  153. ifdef KANJI
  154. mov ax,chFill ;* fill character
  155. JmpNotDbc fill_normal
  156. ;* * fill as double byte character
  157. and cx,not 1 ;* force even
  158. mov dx,screenOffset mpdmnpfnDrawFR_DBCS ;* DBCS fill row
  159. fill_normal:
  160. ELSE
  161. mov al,chFill ;* fill character
  162. endif
  163. mov si,ax ;* SI = char save value
  164. ;* * SI = character (AL for non KANJI), DX = dispatch table, CX = count
  165. fill_row_loop:
  166. ;* * Perform Draw
  167. mov bx,diCur
  168. Save <dx,cx,di> ;* cx = dax, di + start
  169. cCall DoDraw ;* fill it in
  170. inc ayDrawing ;* next row
  171. add di,axMacTimes2 ;* to next row
  172. dec ayBottom ;* day
  173. jnz fill_row_loop
  174. cCall FinishDraw
  175. fill_end:
  176. AssertUp
  177. StopPublic
  178. cEnd FillArc
  179. ;********** TextOutAbs **********
  180. ;* entry : axLeft, ayTop : start position
  181. ;* pch : pointer to string data
  182. ;* cch : # of characters
  183. ;* diCur : draw info (HIBYTE = dm, LOBYTE = isa).
  184. ;* * apply draw mode & string data to 1 row of text
  185. ;* D flag MUST BE CLEARED !!!
  186. ;* exit : n/a
  187. cPrivate TextOutAbs,<ATOMIC>,<SI,DI>
  188. parmB  axLeft
  189. parmB  ayTop
  190. parmDP pch  
  191. parmW  cch
  192. parmW  diCur ;* draw mode + isa
  193.   
  194. cBegin TextOutAbs
  195. StartPublic
  196. AssertUp
  197. ;* * Prepare for the fill
  198. PrepareDraw axLeft,ayTop ;* sets ES:DI
  199. mov si,pch ;* array
  200. mov cx,cch
  201. mov dx,screenOffset mpdmnpfnDrawTO
  202. mov bx,diCur
  203. cCall DoDraw ;* perform Text Out
  204. cCall FinishDraw
  205. textout_end:
  206. AssertUp
  207. StopPublic
  208. cEnd TextOutAbs
  209. ;********** CharOutAbs **********
  210. ;* entry : axCur, ayCur : start position
  211. ;* chPut : character to put (CHAR)
  212. ;* diCur : draw info (HIBYTE = dm, LOBYTE = isa).
  213. ;* * TextOutAbs for a single character
  214. ;* D flag MUST BE CLEARED !!!
  215. ;* exit : n/a
  216. cPrivate CharOutAbs,<ATOMIC>,<SI,DI>
  217. parmB axCur
  218. parmB ayCur
  219. parmW chPut ;* could be double byte
  220. parmW diCur
  221. cBegin CharOutAbs
  222. StartPublic
  223. AssertUp
  224. PrepareDraw axCur,ayCur ;* sets ES:DI
  225. lea si,chPut
  226. mov cx,1 ;* 1 character TextOut
  227. ifdef KANJI
  228. mov al,ds:[si] ;* get first byte
  229. JmpNotDbc single_char_out
  230. inc cx
  231. single_char_out:
  232. endif ;KANJI
  233. mov dx,screenOffset mpdmnpfnDrawTO
  234. mov bx,diCur
  235. cCall DoDraw ;* perform Text Out
  236. cCall FinishDraw
  237. put_ch_end:
  238. AssertUp
  239. StopPublic
  240. cEnd CharOutAbs
  241. ifdef DRAW_MODE_MINIMIZE
  242. ;*****************************************************************************
  243. ;* * * * Drawing info tables * * *
  244. ;* * Drawing routine table for TextOut
  245. mpdmnpfnDrawTO:
  246. DW TO_dmTFB ;* Normal
  247. DW TO_dmT ;* Text only
  248. DW InvalidMode ;* attribute only for TextOut => bogus
  249. DW InvalidMode ;* foreground only
  250. DW InvalidMode ;* background only
  251. DW InvalidMode ;* text & foreground
  252. DW InvalidMode ;* text & background
  253. DW InvalidMode ;* Text Map background
  254. DW InvalidMode ;* Text Map foreground
  255. DW InvalidMode ;* Map background
  256. DW InvalidMode ;* Map foreground
  257. DW InvalidMode ;* Map attr: back 2 back, fore 2 fore
  258. DW InvalidMode ;* Map attribute to attribute
  259. ;* * Drawing routine table for FillRectangle
  260. mpdmnpfnDrawFR:
  261. DW FR_dmTFB ;* Normal
  262. DW InvalidMode ;* Text only
  263. DW FR_dmFB ;* ca only
  264. DW InvalidMode ;* foreground only
  265. DW InvalidMode ;* background only
  266. DW InvalidMode ;* text & foreground
  267. DW InvalidMode ;* text & background
  268. DW InvalidMode ;* Text Map background
  269. DW InvalidMode ;* Text Map foreground
  270. DW InvalidMode ;* Map background
  271. DW InvalidMode ;* Map foreground
  272. DW InvalidMode ;* Map attr: back 2 back, fore 2 fore
  273. DW InvalidMode ;* Map attribute to attribute
  274. ifdef KANJI
  275. ;* * Drawing routine table for FillRectangle for DBCS fill
  276. ;* * (attribute only functions stay the same)
  277. mpdmnpfnDrawFR_DBCS:
  278. DW FR_dmTFB_DBCS ;* Normal
  279. DW InvalidMOde ;* Text only
  280. DW FR_dmFB ;* ca only (same as normal)
  281. DW InvalidMode ;* foreground only
  282. DW InvalidMode ;* background only
  283. DW InvalidMode ;* text & foreground
  284. DW InvalidMode ;* text & background
  285. DW InvalidMode ;* Text Map background
  286. DW InvalidMode ;* Text Map foreground
  287. DW InvalidMode ;* Map background
  288. DW InvalidMode ;* Map foreground
  289. DW InvalidMode ;* Map attr: back 2 back, fore 2 fore
  290. DW InvalidMode ;* Map attribute to attribute
  291. endif ;KANJI
  292. else ; !DRAW_MODE_MINIMIZE
  293. ;*****************************************************************************
  294. ;* * * * Drawing info tables * * *
  295. ;* * Drawing routine table for TextOut
  296. mpdmnpfnDrawTO:
  297. DW TO_dmTFB ;* Normal
  298. DW TO_dmT ;* Text only
  299. DW InvalidMode ;* attribute only for TextOut => bogus
  300. DW TO_dmF ;* foreground only
  301. DW TO_dmB ;* background only
  302. DW TO_dmTF ;* text & foreground
  303. DW TO_dmTB ;* text & background
  304. DW TO_dmTMb ;* Text Map background
  305. DW TO_dmTMf ;* Text Map foreground
  306. DW TO_dmMb ;* Map background
  307. DW TO_dmMf ;* Map foreground
  308. DW TO_dmMfb ;* Map attr: back 2 back, fore 2 fore
  309. DW TO_dmMAttr ;* Map attribute to attribute
  310. ;* * Drawing routine table for FillRectangle
  311. mpdmnpfnDrawFR:
  312. DW FR_dmTFB ;* Normal
  313. DW FR_dmT ;* Text only
  314. DW FR_dmFB ;* ca only
  315. DW FR_dmF ;* foreground only
  316. DW FR_dmB ;* background only
  317. DW FR_dmTF ;* text & foreground
  318. DW FR_dmTB ;* text & background
  319. DW FR_dmTMb ;* Text Map background
  320. DW FR_dmTMf ;* Text Map foreground
  321. DW FR_dmMb ;* Map background
  322. DW FR_dmMf ;* Map foreground
  323. DW FR_dmMfb ;* Map attr: back 2 back, fore 2 fore
  324. DW FR_dmMAttr ;* Map attribute to attribute
  325. ifdef KANJI
  326. ;* * Drawing routine table for FillRectangle for DBCS fill
  327. ;* * (attribute only functions stay the same)
  328. mpdmnpfnDrawFR_DBCS:
  329. DW FR_dmTFB_DBCS ;* Normal
  330. DW FR_dmT_DBCS ;* Text only
  331. DW FR_dmFB ;* ca only (same as normal)
  332. DW FR_dmF ;* foreground only
  333. DW FR_dmB ;* background only
  334. DW FR_dmTF_DBCS ;* text & foreground
  335. DW FR_dmTB_DBCS ;* text & background
  336. DW FR_dmTMb_DBCS ;* Text Map background
  337. DW FR_dmTMf_DBCS ;* Text Map foreground
  338. DW FR_dmMb ;* Map background
  339. DW FR_dmMf ;* Map foreground
  340. DW FR_dmMfb ;* Map attr: back 2 back, fore 2 fore
  341. DW FR_dmMAttr ;* Map attribute to attribute.
  342. endif ;KANJI
  343. endif ; !DRAW_MODE_MINIMIZE
  344. ;*****************************************************************************
  345. ;********** DoDraw **********
  346. ;* entry : ES:DI => screen location
  347. ;* DX = pointer to table (mpdmnpfnDrawXX)
  348. ;* CX = # of screen locations
  349. ;* BX = di (drawing info) : BH = dm, BL = isa
  350. ;* DS:SI => string (Text Out variant)
  351. ;*  (DS => default DS (==SS))
  352. ;* non-kanji LOBYTE(SI) = fill character (Fill Rectangle variant)
  353. ;* kanji SI = fill double byte character (double byte Fill variant)
  354. ;* D flag cleared !!
  355. ;* ayDrawing and axDrawFirst set up !
  356. ;* for overlap pwndCur is the current window (0=>draw always)
  357. ;* * Prepare & call draw routine
  358. ;* exit : ES:DI => after last character/attrib munged over
  359. ;* TRASHES SI !!!!
  360. do_draw_end1:
  361. jmp do_draw_end
  362. cProc DoDraw,<NEAR,ATOMIC>,<BP>
  363. cBegin DoDraw
  364. AssertUp
  365. Assert <caSa EQ rgcaFill+1> ;* caSa MUST be in high byte
  366. Save <es, bx, cx, dx>
  367. cCall insj.lpfnPrepUpdateCsdInsj, <ayDrawing, axDrawFirst, cx, di, fRestoreDbcs>
  368. jcxz do_draw_end1 ;* trivial case
  369. ifdef MOUSE_TEXT
  370. ;* * If ayDrawing == ayMouse{new} then kill mouse
  371. mov al,ayMouse
  372. cmp al,ayDrawing
  373. jne not_drawing_over_mouse
  374. else ; MOUSE_TEXT
  375. ;* * If ABS(ayDrawing - ayMouse{new}) = FE,FF,0,1,2 then kill mouse
  376. mov al,ayMouse
  377. sub al,ayDrawing
  378. add al,2 ;* 0, 1, 2, 3, 4 => kill it
  379. cmp al,5
  380. jae not_drawing_over_mouse
  381. endif ; MOUSE_TEXT
  382. ;* * We may be drawing over mouse
  383. mov al,0ffh ;* set value
  384. xchg fMouseLockedOut,al ;* set flag, get old contents
  385. or al,al
  386. jnz already_locked_out
  387. ;* * Turn mouse off
  388. xor ax,ax ;* turn off
  389. Save <bx,cx,dx>
  390. cCall FEnableMouse,<ax>
  391. mov fMouseLockedOut,al ;* save old state
  392. already_locked_out:
  393. not_drawing_over_mouse:
  394. Assert <SIZE SA EQ 2>
  395. mov ah,bh ;* ah = dm
  396. xor bh,bh
  397. shl bx,1 ;* bx = isa * sizeof(SA)
  398. ifdef SCREEN_FFONT
  399. Assert <SIZE SA EQ 2> ;* sizeof(SA) == sizeof(FFONT)
  400. mov bp,[bx]+dataOffset mpisaffont
  401. mov ffontCur,bp
  402. endif ;SCREEN_FFONT
  403. mov bp,[bx].rgcaFill+dataOffset rgsa;* bp = rgcaFill, bp(high) = caSa
  404. mov bl,ah ;* ah = bl = dm
  405. shl bx,1 ;* bl = dm * sizeof(PROC NEAR)
  406. ;*  lose the fdmKeepFfont bit
  407. xor bh,bh
  408. add bx,dx ;* bx = &mpdmnpfnDrawXX[dm]
  409. mov bx,cs:[bx] ;* table look up procedure
  410. ifdef SCREEN_FFONT
  411. ;* * ah = dm
  412. or ah,ah ;* fdmKeepFfont bit set ?
  413. js no_draw_ffont ;* keep the old FFONT
  414. cmp fFontAvailable,0
  415. jz no_draw_ffont
  416. ;* * DI => start offset, CX = # of chars
  417. push es
  418. push di
  419. push cx
  420. AssertNE instCur.psSecInst,0
  421. mov es,instCur.psSecInst
  422. mov ax,ffontCur
  423. rep stosw ;* fill in FFONT values
  424. pop cx
  425. pop di
  426. pop es
  427. no_draw_ffont:
  428. endif ;SCREEN_FFONT
  429. push di ;* start buffer offset
  430. push cx ;* dax
  431. call bx ;* call routine
  432. pop cx
  433. pop bx
  434. ;* * inform driver that the line is done
  435. Save <es>
  436. cCall insj.lpfnDoUpdateCsdInsj, <ayDrawing, axDrawFirst, cx, bx, fRestoreDbcs>
  437. ;* (ay, axFirst, dax, offFirst)
  438. ;* note -- offset in primary!
  439. do_draw_end:
  440. cEnd DoDraw
  441. ifdef KANJI
  442. ;*********** FlushDraw **********
  443. ;* entry: n/a
  444. ;* * update must be drawn NOW
  445. ;* *  calls FinishDraw, sets hold update counter to zero
  446. ;* exit: n/a
  447. cPrivate FlushDraw, <ATOMIC>
  448. cBegin nogen
  449. mov cHoldUpdate,0
  450. jmp short finished_drawing
  451. cEnd nogen
  452. endif ; KANJI
  453. ;*********** EndDraw **********
  454. ;* entry: n/a
  455. ;* * decrements the hold update counter which defers the call
  456. ;* *  to DoUpdate.  If necessary, calls FinishDraw.
  457. ;* exit: n/a
  458. cPrivate EndDraw, <ATOMIC>
  459. cBegin EndDraw
  460. ifdef KANJI
  461. cmp cHoldUpdate,0 ;* FlushDraw may occur at any level of
  462. je finished_drawing ;*  nesting, stop cHoldUpdate < 0
  463. endif ; KANJI
  464. dec cHoldUpdate
  465. jnz not_finished_drawing
  466. finished_drawing: ;* from FlushDraw aswell!!
  467. cCall FinishDraw
  468. not_finished_drawing:
  469. cEnd EndDraw
  470. ;*********** FinishDraw **********
  471. ;* entry: n/a
  472. ;* * drawing is done for now
  473. ;* * inform the screen driver
  474. ;* *  then turn mouse back on (if it was turned off)
  475. ;* exit: n/a
  476. cProc FinishDraw, <NEAR, ATOMIC>
  477. cBegin FinishDraw
  478. test cHoldUpdate,0ffh
  479. jnz mouse_ok
  480. cCall insj.lpfnDoneUpdateCsdInsj ;* ()
  481. mov ayDrawing,ayNil ;* clear ayDrawing first
  482. test fMouseLockedOut,0ffh
  483. jz mouse_ok ;* it was not turned off
  484. cCall FEnableMouse,<sp>
  485. ifdef DEBUG
  486. or ax,ax ;* MUST have been turned off
  487. jz clear_locked_out_flag
  488. cCall CowAssertFailed
  489. DB "mouse$"
  490. endif ;DEBUG
  491. clear_locked_out_flag:
  492. mov fMouseLockedOut,al
  493. mouse_ok:
  494. cEnd FinishDraw
  495. ;*****************************************************************************
  496. ;********** Draw Routines **********
  497. ;* entry : ES:DI => screen (character, attribute at +1)
  498. ;* CX = # of operations
  499. ;* AL = new character (Fill Only)
  500. ;* DS:SI => string (TextOut Only)
  501. ;* DX = CGA video status port (3DAh)
  502. ;* BP = rgcaFill (for map modes only) or high byte = caSa
  503. ;* D flag cleared
  504. ;* available registers :
  505. ;* BX = work register
  506. ;* AL, AH = work
  507. ;* exit : n/a
  508. ;* * NOTE: for overlapping windows, check that psOverlap:DI is pointing to
  509. ;* *  our window (pwndDraw).
  510. DRAW_ROUTINES PROC NEAR
  511. ;* * TextOut Variants
  512. TO_dmTFB: ;* Text + attributes
  513. lodsb
  514. CheckWnd TO_dmTFB_next
  515. mov bx,bp ;* set bh = attribute
  516. mov bl,al ;* set bl = character
  517. ifdef BUILTIN_SNOW
  518. mov dx,3DAh ;* CGA video status port
  519. StartDrawCrit
  520. endif ;BUILTIN_SNOW
  521. mov ax,bx
  522. stosw ;* only time for 1 store
  523. ifdef BUILTIN_SNOW
  524. EndDrawCrit
  525. endif ;BUILTIN_SNOW
  526. TO_dmTFB_next:
  527. loop TO_dmTFB
  528. ret
  529. TO_dmT: ;* Text only
  530. lodsb ;* get byte
  531. CheckWnd TO_dmT_next
  532. mov bl,al
  533. ifdef BUILTIN_SNOW
  534. mov dx,3DAh
  535. StartDrawCrit
  536. endif ;BUILTIN_SNOW
  537. mov al,bl
  538. stosb
  539. ifdef BUILTIN_SNOW
  540. EndDrawCrit
  541. endif ;BUILTIN_SNOW
  542. inc di
  543. TO_dmT_next:
  544. loop TO_dmT
  545. ret
  546. ifndef DRAW_MODE_MINIMIZE
  547. TO_dmTF: ;* leave background alone
  548. mov bh,ah
  549. l1_tf: lodsb
  550. CheckWnd TO_dmTF_next
  551. mov bx,bp ;* bh = attribute
  552. mov bl,al
  553. ifdef BUILTIN_SNOW
  554. mov dx,3DAh
  555. StartDrawCrit
  556. endif ;BUILTIN_SNOW
  557. mov ah,es:[di+1]
  558. ifdef BUILTIN_SNOW
  559. EndDrawCrit
  560. endif ;BUILTIN_SNOW
  561. and ah,0F0H
  562. or bh,ah
  563. ifdef BUILTIN_SNOW
  564. StartDrawCrit
  565. endif ;BUILTIN_SNOW
  566. mov ax,bx
  567. stosw
  568. ifdef BUILTIN_SNOW
  569. EndDrawCrit
  570. endif ;BUILTIN_SNOW
  571. TO_dmTF_next:
  572. loop l1_tf
  573. ret
  574. TO_dmB: ;* background only
  575. CheckWnd TO_dmB_next
  576. mov bx,bp ; bh has new bg in hi nybble
  577. and bh,0F0H ; change background only
  578. inc di
  579. ifdef BUILTIN_SNOW
  580. mov dx,3DAh
  581. StartDrawCrit
  582. endif ;BUILTIN_SNOW
  583. mov al,es:[di] ; al = old attribute
  584. and al,0Fh ; al = old foreground only
  585. or al,bh ; al = old fore & new back
  586. stosb ;* only time for 1 store
  587. ifdef BUILTIN_SNOW
  588. EndDrawCrit
  589. endif ;BUILTIN_SNOW
  590. TO_dmB_next:
  591. loop TO_dmB
  592. ret
  593. TO_dmTMb: ;* character + map background
  594. CheckWnd TO_dmTMb_next
  595. ifdef BUILTIN_SNOW
  596. mov dx,3DAh
  597. StartDrawCrit
  598. endif ;BUILTIN_SNOW
  599. mov bl,es:[di+1]
  600. ifdef BUILTIN_SNOW
  601. EndDrawCrit
  602. endif ;BUILTIN_SNOW
  603. lodsb ;* get character in AL
  604. and bx,00F0H
  605. shr bx,1
  606. shr bx,1
  607. shr bx,1
  608. shr bx,1
  609. add bx,bp
  610. mov ah,ds:[bx] ;* look up new attribute
  611. mov bx,ax
  612. ifdef BUILTIN_SNOW
  613. StartDrawCrit
  614. endif ;BUILTIN_SNOW
  615. mov ax,bx
  616. stosw
  617. ifdef BUILTIN_SNOW
  618. EndDrawCrit
  619. endif ;BUILTIN_SNOW
  620. TO_dmTMb_next:
  621. loop TO_dmTMb
  622. ret
  623. FR_dmMf:
  624. TO_dmMf: ;* map foreground
  625. CheckWnd FR_dmMf_next
  626. inc di
  627. ifdef BUILTIN_SNOW
  628. mov dx,3DAh
  629. StartDrawCrit
  630. endif ;BUILTIN_SNOW
  631. mov bl,es:[di]
  632. ifdef BUILTIN_SNOW
  633. EndDrawCrit
  634. endif ;BUILTIN_SNOW
  635. and bx,000FH
  636. add bx,bp
  637. mov bl,ds:[bx] ;* look up new attribute
  638. ifdef BUILTIN_SNOW
  639. StartDrawCrit
  640. endif ;BUILTIN_SNOW
  641. mov al,bl
  642. stosb
  643. ifdef BUILTIN_SNOW
  644. EndDrawCrit
  645. endif ;BUILTIN_SNOW
  646. FR_dmMf_next:
  647. loop TO_dmMf
  648. ret
  649. TO_dmMfb: ;* Map attribute: old background maps to new background, 
  650. ;                 old foreground maps to new foreground.
  651. ;  Note: the tables for these guys are 16 + 16 bytes each.
  652. inc di
  653. ifdef BUILTIN_SNOW
  654. mov dx,3DAh
  655. StartDrawCrit
  656. endif ;BUILTIN_SNOW
  657. mov bl,es:[di] ;* get old attribute
  658. ifdef BUILTIN_SNOW
  659. EndDrawCrit
  660. endif ;BUILTIN_SNOW
  661. and bx,000FH ;* mask to foreground
  662. add bx,bp
  663. mov bl,ds:[bx] ;* look up new foreground
  664. push bx ;* save BL = new foreground
  665. ifdef BUILTIN_SNOW
  666. StartDrawCrit
  667. endif ;BUILTIN_SNOW
  668. mov bl,es:[di] ;* get old attribute
  669. ifdef BUILTIN_SNOW
  670. EndDrawCrit
  671. endif ;BUILTIN_SNOW
  672. and bx,00F0H ;* mask to background
  673. shr bx,1
  674. shr bx,1
  675. shr bx,1
  676. shr bx,1
  677. add bx,bp ;* bx = &rgca[background]
  678. add bx,16 ;* bg's follow fg's in array.
  679. ifdef BUILTIN_SNOW
  680. StartDrawCrit
  681. endif ;BUILTIN_SNOW
  682. pop ax ;* restore AL = new fground
  683. or al,ds:[bx] ;* Merge in new background
  684. stosb
  685. ifdef BUILTIN_SNOW
  686. EndDrawCrit
  687. dec cx
  688. or cx,cx
  689. jz @F
  690. jmp TO_dmMfb
  691. @@:
  692. ELSE ;NOT DEFINED BUILTIN_SNOW
  693. loop TO_dmMfb
  694. endif ;BUILTIN_SNOW
  695. ret
  696. TO_dmMAttr: ;* Map entire attribute: old attr maps to new attr.
  697. ;  Note that the tables for these guys are 256 bytes each.
  698. inc di
  699. ifdef BUILTIN_SNOW
  700. mov dx,3DAh
  701. StartDrawCrit
  702. endif ;BUILTIN_SNOW
  703. xor bx,bx ; BH = 0 for indexing.
  704. mov bl,es:[di] ;* get old attribute
  705. add bx,bp
  706. mov al,ds:[bx] ;* look up new attribute
  707. stosb
  708. ifdef BUILTIN_SNOW
  709. EndDrawCrit
  710. endif ;BUILTIN_SNOW
  711. loop TO_dmMAttr
  712. ret
  713. endif ; !DRAW_MODE_MINIMIZE
  714. ;*****************************************************************************
  715. ;* * Fill Rectangle Variants
  716. FR_dmTFB: ;* normal
  717. mov ax,si ;* al = character
  718. mov bx,bp ;* bh = attribute
  719. mov bl,al ;* bx = ca:ch
  720. FR_dmTFB_1:
  721. CheckWnd FR_dmTFB_next
  722. ifdef BUILTIN_SNOW
  723. mov dx,3DAh
  724. StartDrawCrit
  725. endif ;BUILTIN_SNOW
  726. mov ax,bx
  727. stosw ;* store one
  728. ifdef BUILTIN_SNOW
  729. EndDrawCrit
  730. endif ;BUILTIN_SNOW
  731. FR_dmTFB_next:
  732. loop FR_dmTFB_1
  733. ret
  734. ifndef DRAW_MODE_MINIMIZE
  735. FR_dmT: ;* text only
  736. mov bx,si ;* bl = character
  737. jmp short FR_dmFB_1
  738. endif ; !DRAW_MODE_MINIMIZE
  739. FR_dmFB: ;* ca only
  740. mov bx,bp ;* bh = attribute
  741. mov bl,bh ;* bl = value to store
  742. inc di ;* point to ca
  743. ;* * this breaks the window test!!!!
  744. FR_dmFB_1:
  745. CheckWnd FR_dmFB_next
  746. ifdef BUILTIN_SNOW
  747. mov dx,3DAh
  748. StartDrawCrit
  749. endif ;BUILTIN_SNOW
  750. mov al,bl
  751. stosb ;* store one
  752. ifdef BUILTIN_SNOW
  753. EndDrawCrit
  754. endif ;BUILTIN_SNOW
  755. inc di ;* to next ca
  756. FR_dmFB_next:
  757. loop FR_dmFB_1
  758. ret
  759. ifndef DRAW_MODE_MINIMIZE
  760. FR_dmB: ;* fill background only
  761. mov bx,bp ;* bh = attribute
  762. and bh,0F0H ;* change background only
  763. mov bl,00FH ;* keep mask
  764. jmp short FR_dmF_1
  765. FR_dmF: ;* fill foreground only
  766. mov bx,bp ;* bh = attribute
  767. and bh,00FH ;* change foreground only
  768. mov bl,0F0H ;* keep mask
  769. FR_dmF_1:
  770. inc di ;* point to ca
  771. ;* * this breaks the window test!!!!
  772. push bp ;* bp used for temp
  773. FR_dmF_2:
  774. CheckWnd FR_dmF_next
  775. ifdef BUILTIN_SNOW
  776. mov dx,3DAh
  777. StartDrawCrit
  778. endif ;BUILTIN_SNOW
  779. mov al,es:[di] ;* get old background
  780. ifdef BUILTIN_SNOW
  781. EndDrawCrit
  782. endif ;BUILTIN_SNOW
  783. and al,bl ;* keep half
  784. or al,bh ;* replace half
  785. mov bp,ax
  786. ifdef BUILTIN_SNOW
  787. StartDrawCrit
  788. endif ;BUILTIN_SNOW
  789. mov ax,bp
  790. stosb
  791. ifdef BUILTIN_SNOW
  792. EndDrawCrit
  793. endif ;BUILTIN_SNOW
  794. inc di
  795. FR_dmF_next:
  796. loop FR_dmF_2
  797. pop bp ;* restored trashed bp
  798. ret
  799. FR_dmTMb: ;* character + map background
  800. CheckWnd FR_dmTMb_next
  801. ifdef BUILTIN_SNOW
  802. mov dx,3DAh
  803. StartDrawCrit
  804. endif ;BUILTIN_SNOW
  805. mov bl,es:[di+1] ;* get old attribute
  806. ifdef BUILTIN_SNOW
  807. EndDrawCrit
  808. endif ;BUILTIN_SNOW
  809. and bx,00F0H ;* mask background
  810. shr bx,1
  811. shr bx,1
  812. shr bx,1
  813. shr bx,1
  814. add bx,bp ;* bx = &rgca[background]
  815. mov ax,si ;* load character (into al)
  816. mov ah,ds:[bx] ;* look up new attribute
  817. mov bx,ax
  818. ifdef BUILTIN_SNOW
  819. StartDrawCrit
  820. endif ;BUILTIN_SNOW
  821. mov ax,bx
  822. stosw
  823. ifdef BUILTIN_SNOW
  824. EndDrawCrit
  825. endif ;BUILTIN_SNOW
  826. FR_dmTMb_next:
  827. loop FR_dmTMb
  828. ret
  829. FR_dmMb: ;* map background only
  830. CheckWnd FR_dmMb_next
  831. inc di ;* point to attribute
  832. ifdef BUILTIN_SNOW
  833. mov dx,3DAh
  834. StartDrawCrit
  835. endif ;BUILTIN_SNOW
  836. mov bl,es:[di] ;* get old attribute
  837. ifdef BUILTIN_SNOW
  838. EndDrawCrit
  839. endif ;BUILTIN_SNOW
  840. and bx,00F0H ;* mask background
  841. shr bx,1
  842. shr bx,1
  843. shr bx,1
  844. shr bx,1
  845. add bx,bp ;* bx = &rgca[background]
  846. mov bl,ds:[bx] ;* look up new attribute
  847. ifdef BUILTIN_SNOW
  848. StartDrawCrit
  849. endif ;BUILTIN_SNOW
  850. mov al,bl
  851. stosb
  852. ifdef BUILTIN_SNOW
  853. EndDrawCrit
  854. endif ;BUILTIN_SNOW
  855. FR_dmMb_next:
  856. loop FR_dmMb
  857. ret
  858. endif ; !DRAW_MODE_MINIMIZE
  859. ;*****************************************************************************
  860. ;* * DBCS Fill Rectangle Variants (text modify only)
  861. ;* * all entry points should start with "shr cx,1"
  862. ifdef KANJI
  863. FR_dmTFB_DBCS: ;* normal
  864. shr cx,1
  865. mov dx,si ;* dx = DB character (dl first)
  866. mov bx,bp ;* bh = attribute
  867. mov bl,dl ;* BX = first ca:ch
  868. mov dl,dh
  869. mov dh,bh ;* DX = second ca:ch
  870. FR_dmTFB_1_DBCS:
  871. CheckWnd FR_dmTFB_next_DBCS
  872. ifdef BUILTIN_SNOW
  873. push cx
  874. mov cx,dx
  875. mov dx,3DAh
  876. StartDrawCrit
  877. mov ax,bx
  878. stosw ;* store first character
  879. mov ax,cx
  880. stosw ;* store second character
  881. EndDrawCrit
  882. pop cx
  883. ELSE ; !BUILTIN_SNOW
  884. mov ax,bx
  885. stosw ;* store first character
  886. mov ax,dx
  887. stosw ;* store second character
  888. endif ;BUILTIN_SNOW
  889. FR_dmTFB_next_DBCS:
  890. loop FR_dmTFB_1_DBCS
  891. ret
  892. ifndef DRAW_MODE_MINIMIZE
  893. FR_dmT_DBCS: ;* text only
  894. shr cx,1
  895. mov bx,si ;* bl = 1st, bh = 2nd
  896. FR_dmFB_1_DBCS:
  897. CheckWnd FR_dmFB_next_DBCS
  898. ifdef BUILTIN_SNOW
  899. mov dx,3DAh
  900. StartDrawCrit
  901. endif ;BUILTIN_SNOW
  902. mov al,bl
  903. stosb ;* store one
  904. inc di ;* to next ca
  905. mov al,bh
  906. stosb ;* store one
  907. ifdef BUILTIN_SNOW
  908. EndDrawCrit
  909. endif ;BUILTIN_SNOW
  910. inc di ;* to next ca
  911. FR_dmFB_next_DBCS:
  912. loop FR_dmFB_1_DBCS
  913. ret
  914. endif ; !DRAW_MODE_MINIMIZE
  915. endif ;KANJI
  916. ;*****************************************************************************
  917. ifndef DRAW_MODE_MINIMIZE
  918. ;* ???? UNIMPLEMENTED !!!!!!
  919. TO_dmF:
  920. TO_dmTB:
  921. TO_dmTMf:
  922. TO_dmMb:
  923. FR_dmTF:
  924. FR_dmTB:
  925. FR_dmTMf:
  926. FR_dmMfb:
  927. FR_dmMAttr:
  928. ifdef KANJI
  929. FR_dmTF_DBCS:
  930. FR_dmTB_DBCS:
  931. FR_dmTMf_DBCS:
  932. FR_dmTMb_DBCS:
  933. endif ;KANJI
  934. ;??????
  935. endif ; !DRAW_MODE_MINIMIZE
  936. InvalidMode:
  937. ifdef DEBUG
  938. cCall CowAssertFailed
  939. DB "Invalid draw mode $"
  940. endif ;DEBUG
  941. ret
  942. DRAW_ROUTINES ENDP ;* all near
  943. ;*****************************************************************************
  944. ;********** EndScreen **********
  945. ;* entry: fClear => clear screen
  946. ;* * Exit procedure - clear the screen
  947. ;* exit: n/a
  948. cPublic EndScreen,<PUBLIC, ATOMIC>
  949. parmW fClear
  950. cBegin EndScreen
  951. StartPublic
  952. mov cx,fClear
  953. jcxz dont_clear
  954. ifdef REVIEW
  955. mov al,caOld
  956. ELSE
  957. mov al,7
  958. endif ;!REVIEW
  959. mov ah,al ;* duplicate for MONO
  960. xchg ax,[rgsa] ;* change isa == 0
  961. push ax ;* save old
  962. xor ax,ax
  963. mov bx,' '
  964. xor cx,cx
  965. xor dx,dx
  966. mov cl,axMac
  967. mov dl,ayMac
  968. ifdef WINDOW_OVERLAP
  969. xor ax,ax
  970. mov pwndCur,ax
  971. endif ;WINDOW_OVERLAP
  972. cCall FillArc,<ax,ax,cx,dx,bx,ax> ;* fill all with ' ' isaDefault
  973. pop word ptr [rgsa] ;* restore old isaDefault
  974. xor ax,ax
  975. cCall insj.lpfnMoveHwCursCsdInsj,<ax,ax,sp> ;* top of screen & on
  976. dont_clear:
  977. ;* * kill the screen driver
  978. cCall insj.lpfnTermCsdInsj ;* ()
  979. StopPublic
  980. cEnd EndScreen
  981. ;*****************************************************************************
  982. ;********** ImodeGuessCurrent **********
  983. ;* entry: n/a
  984. ;* * call driver to guess current mode
  985. ;* exit: AX = imode (or -1 (imodeUnkown) if not known)
  986. labelFP <PUBLIC, ImodeGuessCurrent>
  987. jmp insj.lpfnImodeGuessCurrentCsdInsj
  988. ;********** FQueryInst **********
  989. ;* entry:
  990. ;* pinst : pointer to INST structure to fill
  991. ;* imode : index of mode to test
  992. ;* * Get information about modes available
  993. ;* * just call the INSJ procedure
  994. ;* exit: AX != 0 => ok (*pinst filled in)
  995. ;* == 0 => error (imode too high or can't query)
  996. IFDEF DEBUG
  997. cPublic FQueryInst,<PUBLIC>
  998. parmW pinst
  999. parmW imode
  1000. cBegin FQueryInst
  1001. cCall insj.lpfnFQueryInstCsdInsj,<pinst,imode>
  1002. or ax,ax ; If bogus mode, 
  1003. jz fqi_done ;   can't check inst.
  1004. mov bx,pinst
  1005. test [bx].finstInst,finstExtendedMono ; If ExtendedMono,
  1006. jz @F ;   then must have
  1007. test [bx].finstInst,finstAttrFont ;   AttrFont.
  1008. jz bust
  1009. @@:
  1010. test [bx].finstInst,finstAttrFont
  1011. jz fqi_done
  1012. test [bx].finstInst,finstMonochrome ; If AttrFont, then
  1013. jz bust ;   must have Mono
  1014. test [bx].finstInst,finstText ;   and Text.
  1015. jnz fqi_done
  1016. bust:
  1017. cCall CowAssertFailed
  1018. DB "FQueryInst fInst bits not in sync.$"
  1019. fqi_done:
  1020. cEnd FQueryInst
  1021. ELSE ;!DEBUG
  1022. labelFP <PUBLIC, FQueryInst>
  1023. jmp insj.lpfnFQueryInstCsdInsj
  1024. ENDIF ;!DEBUG
  1025. ;********** FGetColorPalette **********
  1026. ;* entry: co color
  1027. ;* pcoi color combination index (returned)
  1028. ;* rgcov RGB palette info (returned)
  1029. ;* * get current palette setting for co
  1030. ;* exit: AX = 0 => no color palette available, pcoi, rgcov
  1031. labelFP <PUBLIC, FGetColorPalette>
  1032. jmp insj.lpfnFGetColorPaletteCsdInsj
  1033. ;********** SetColorPalette **********
  1034. ;* entry: co color
  1035. ;* coi color combination index
  1036. ;* rgcov RGB palette info
  1037. ;* * set current palette setting for co, does nothing if no color palette
  1038. ;* exit: n/a
  1039. labelFP <PUBLIC, SetColorPalette>
  1040. jmp insj.lpfnSetColorPaletteCsdInsj
  1041. ;********** MoveHardwareCursor **********
  1042. ;* entry: axCurs, ayCurs = new absolute cursor position
  1043. ;* fOn => whether on or off
  1044. ;* exit: n/a
  1045. labelFP <PUBLIC, MoveHardwareCursor>
  1046. jmp insj.lpfnMoveHwCursCsdInsj
  1047. ;********** FQueryInft **********
  1048. ;* entry: pinft, ifont
  1049. ;* * get font info
  1050. ;* exit: AX = 0 => no more fonts
  1051. labelFP <PUBLIC, FQueryInft>
  1052. jmp insj.lpfnFQueryInftCsdInsj
  1053. ;********** GetCharMap **********
  1054. ;* entry: pinft, ifont
  1055. ;* * get font info
  1056. ;* exit: AX = 0 => no more fonts
  1057. labelFP <PUBLIC, GetCharMap>
  1058. jmp insj.lpfnGetCharMapCsdInsj
  1059. ifdef WINDOW_OVERLAP
  1060. ;********** FAllocOverlapTable **********
  1061. ;* entry: pfnAlloc => allocation function (supplied by App)
  1062. ;* pinst    => current INST infor
  1063. ;* * Allocate memory for the overlapping windows table
  1064. ;* * Note!! pinst must have been set up already (FQueryInst)
  1065. ;* exit: AX != 0 if successful
  1066. cPublic FAllocOverlapTable, <>, <SI>
  1067. parmDP pinst ;* INST info
  1068. parmD  pfnAlloc2 ;* FAR PASCAL routine
  1069. cBegin FAllocOverlapTable
  1070. mov si,pinst
  1071. mov al,[si].axMacInst
  1072. mov ah,[si].ayMacInst
  1073. mul ah
  1074. mov bx,ax
  1075. mov ax,fmemFixed
  1076. Save <bx>
  1077. cCall pfnAlloc2, <bx, ax>
  1078. AssertEQ ax,0
  1079. or dx,dx
  1080. jz end_alloc_overlap ;* return AX == 0
  1081. mov psOverlap,dx
  1082. mov ax,sp ;* success
  1083. end_alloc_overlap:
  1084. cEnd FAllocOverlapTable
  1085. ;********** FreeOverlapTable **********
  1086. ;* entry: pfnFree => free function (supplied by App)
  1087. ;* * free video driver buffers
  1088. ;* exit: n/a
  1089. cPublic FreeOverlapTable, <>, <SI>
  1090. parmD  pfnFree2 ;* FAR PASCAL routine
  1091. cBegin FreeOverlapTable
  1092. xor cx,cx
  1093. xchg cx,psOverlap
  1094. jcxz done_overlap_free
  1095. xor ax,ax
  1096. cCall pfnFree2, <cx, ax>
  1097. done_overlap_free:
  1098. cEnd FreeOverlapTable
  1099. endif ;*WINDOW_OVERLAP
  1100. ;********** FAllocInstBuffers **********
  1101. ;* entry: pinstAlloc => INST info to fill
  1102. ;* pfnAlloc => allocation function (supplied by App)
  1103. ;* fFonts => if secondary buffer wanted
  1104. ;* * Allocate memory for video driver buffers
  1105. ;* exit: AX != 0 if successful
  1106. cPublic FAllocInstBuffers, <>, <SI>
  1107. parmDP pinstAlloc
  1108. parmD  pfnAlloc ;* FAR PASCAL routine
  1109. parmW  fFonts
  1110. cBegin FAllocInstBuffers
  1111. StartPublic
  1112. mov si,pinstAlloc
  1113. IFNDEF SCREEN_FFONT
  1114. AssertEQ fFonts,0 ;* not allowed
  1115. endif ;!SCREEN_FFONT
  1116. ;* * determine size of buffer (axMac * ayMac WORDS)
  1117. mov al,[si].axMacInst
  1118. mov ah,[si].ayMacInst
  1119. mul ah
  1120. mov bx,ax
  1121. xor ax,ax
  1122. mov [si].bits0Inst,ax ;* clear bits
  1123. ;* * first check to see if primary buffer needs allocation
  1124. cmp [si].psPrimInst,ax ;* == 0 ?
  1125. jne done_prim_alloc
  1126. mov ax,fmemFixed
  1127. Save <bx>
  1128. cCall pfnAlloc, <bx, ax>
  1129. AssertEQ ax,0
  1130. or dx,dx
  1131. jz end_alloc ;* return AX == 0
  1132. mov [si].psPrimInst,dx
  1133. or [si].bits0Inst,MASK fAllocPrimInst
  1134. done_prim_alloc:
  1135. ifdef SCREEN_FFONT
  1136. ;* * allocate secondary buffer if needed (bx = size of buffer)
  1137. mov cx,fFonts
  1138. jcxz no_sec_buffer
  1139. test [si].finstInst,finstFont
  1140. jz no_sec_buffer
  1141. mov ax,fmemFixed
  1142. cCall pfnAlloc, <bx, ax>
  1143. AssertEQ ax,0
  1144. or dx,dx
  1145. jz end_alloc ;* return AX == 0
  1146. mov [si].psSecInst,dx
  1147. no_sec_buffer:
  1148. endif ;SCREEN_FFONT
  1149. ;* * allocate any needed driver specific memory
  1150. mov cx,[si].cwExtraInst
  1151. jcxz done_extra_alloc
  1152. mov ax,fmemFixed
  1153. cCall pfnAlloc, <cx, ax>
  1154. AssertEQ ax,0
  1155. or dx,dx
  1156. jz end_alloc ;* return AX == 0
  1157. mov [si].psExtraInst,dx
  1158. done_extra_alloc:
  1159. mov ax,sp ;* success
  1160. end_alloc:
  1161. StopPublic
  1162. cEnd FAllocInstBuffers
  1163. ;********** FreeInstBuffers **********
  1164. ;* entry: pinstFree => INST info to free
  1165. ;* pfnFree => free function (supplied by App)
  1166. ;* * free video driver buffers
  1167. ;* exit: n/a
  1168. cPublic FreeInstBuffers, <>, <SI>
  1169. parmDP pinstFree
  1170. parmD  pfnFree ;* FAR PASCAL routine
  1171. cBegin FreeInstBuffers
  1172. StartPublic
  1173. mov si,pinstFree
  1174. test [si].bits0Inst,MASK fAllocPrimInst
  1175. jz done_prim_free
  1176. xor ax,ax
  1177. cCall pfnFree, <[si].psPrimInst, ax>
  1178. and [si].bits0Inst,NOT (MASK fAllocPrimInst)
  1179. done_prim_free:
  1180. ifdef SCREEN_FFONT
  1181. xor cx,cx
  1182. xchg cx,[si].psSecInst
  1183. jcxz done_sec_free
  1184. xor ax,ax
  1185. cCall pfnFree, <cx, ax>
  1186. done_sec_free:
  1187. ELSE
  1188. AssertEQ [si].psSecInst,0
  1189. endif ;!SCREEN_FFONT
  1190. ;* * free driver buffer
  1191. xor cx,cx
  1192. xchg cx,[si].psExtraInst
  1193. jcxz done_extra_free
  1194. xor ax,ax
  1195. cCall pfnFree, <cx, ax>
  1196. done_extra_free:
  1197. StopPublic
  1198. cEnd FreeInstBuffers
  1199. ;*****************************************************************************
  1200. ;********** FInitScreenInternal **********
  1201. ;* entry: pinst => INST structure (NULL => re-init previous mode)
  1202. ;* * Initialize the screen as needed
  1203. ;* * NOTE : this routine can be called ONLY ONCE.
  1204. ;* exit: AX != 0 => ok
  1205. ;* * NOTE: failure may destroy old instCur
  1206. cPublic FInitScreenInternal,<ATOMIC>, <SI, DI>
  1207. parmW pinst
  1208. cBegin FInitScreenInternal
  1209. StartPublic
  1210. mov bx,dataOffset instCur
  1211. mov si,pinst
  1212. or si,si
  1213. jz use_current
  1214. ;* * set new INST (copy into instCur)
  1215. push ds
  1216. pop es
  1217. mov di,bx
  1218. mov cx,cbInstMin / 2
  1219. rep movsw
  1220. use_current: ;* bx => instCur (instCur filled with *pinst)
  1221. mov ax,ds:[bx].finstInst
  1222. and ax,finstAvailable
  1223. jnz dont_end
  1224. end_init_jump:
  1225. jmp end_init ;* variant not available
  1226. dont_end:
  1227. mov ax,dataOffset inch
  1228. Save <bx>
  1229. cCall insj.lpfnFInitCsdInsj, <bx, ax> ;* (pinst, pinch)
  1230. or ax,ax
  1231. jz end_init_jump
  1232. ;* * move info from INCH to other globals, bx => instCur
  1233. mov al,[bx].axMacInst
  1234. mov axMac,al
  1235. xor ah,ah
  1236. shl ax,1
  1237. mov axMacTimes2,ax
  1238. mov al,[bx].ayMacInst
  1239. mov ayMac,al
  1240. mov ax,[bx].finstInst
  1241. and al,finstMonochrome ;* finstMonochrome in lower byte
  1242. mov fMonochrome,al
  1243. IFNDEF CBOX
  1244. ;* * copy information from INCH into boxes
  1245. lea bx,inch
  1246. push ds
  1247. pop es ;* all in default data segment
  1248. ;* * copy single box
  1249. lea si,[bx]._chTopLeftCorner1Inch
  1250. lea di,boxSingle
  1251. mov cx,SIZE BOX / 2
  1252. rep movsw
  1253. ;* * copy double box
  1254. lea si,[bx]._chTopLeftCorner2Inch
  1255. lea di,boxDouble
  1256. mov cx,SIZE BOX / 2
  1257. rep movsw
  1258. mov al,[bx]._chShadowInitInch
  1259. mov chShadow,al
  1260. ifdef WINDOW_OVERLAP
  1261. ;* * base window is single box
  1262. lea si,[bx]._chTopLeftCorner1Inch
  1263. lea di,boxActiveWindowOut
  1264. mov cx,SIZE BOX / 2
  1265. rep movsw
  1266. mov al,[bx]._chCloseInch
  1267. mov boxActiveWindowOut.chTopLeftBox,al
  1268. mov al,[bx]._chZoomOutInch
  1269. mov boxActiveWindowOut.chTopRightBox,al
  1270. mov al,[bx]._chTopSide2Inch
  1271. mov boxActiveWindowOut.chTopBox,al
  1272. lea si,[bx]._chTopLeftCorner1Inch
  1273. lea di,boxInactiveWindowOut
  1274. mov cx,SIZE BOX / 2
  1275. rep movsw
  1276. mov al,[bx]._chCloseInch
  1277. mov boxInactiveWindowOut.chTopLeftBox,al
  1278. mov al,[bx]._chZoomOutInch
  1279. mov boxInactiveWindowOut.chTopRightBox,al
  1280. lea si,[bx]._chTopLeftCorner1Inch
  1281. lea di,boxActiveWindowIn
  1282. mov cx,SIZE BOX / 2
  1283. rep movsw
  1284. mov al,[bx]._chCloseInch
  1285. mov boxActiveWindowIn.chTopLeftBox,al
  1286. mov al,[bx]._chZoomInInch
  1287. mov boxActiveWindowIn.chTopRightBox,al
  1288. mov al,[bx]._chTopSide2Inch
  1289. mov boxActiveWindowIn.chTopBox,al
  1290. lea si,[bx]._chTopLeftCorner1Inch
  1291. lea di,boxInactiveWindowIn
  1292. mov cx,SIZE BOX / 2
  1293. rep movsw
  1294. mov al,[bx]._chCloseInch
  1295. mov boxInactiveWindowIn.chTopLeftBox,al
  1296. mov al,[bx]._chZoomInInch
  1297. mov boxInactiveWindowIn.chTopRightBox,al
  1298. endif ;WINDOW_OVERLAP
  1299. endif ; !CBOX
  1300. ifdef SCREEN_FFONT
  1301. ;* * set the fFontAvailable flag
  1302. xor ax,ax ;* assume off
  1303. mov cx,instCur.finstInst
  1304. test cx,finstFont
  1305. jz set_ffont_available ;* not available in this mode
  1306. mov cx,instCur.psSecInst
  1307. jcxz set_ffont_available ;* no secondary buffer => forget it
  1308. inc ax ;* yes, we can use ffonts
  1309. set_ffont_available:
  1310. mov fFontAvailable,ax
  1311. endif ;SCREEN_FFONT
  1312. mov ax,sp ;* success
  1313. end_init: ;* ax = return code
  1314. StopPublic
  1315. cEnd FInitScreenInternal
  1316. ;********** BltArc **********
  1317. ;* entry : axSrc, aySrc : upper left of source
  1318. ;* axDest, ayDest : upper left of destination
  1319. ;* dax, day : shift amount
  1320. ;* * Move a rectangle from one portion of the screen to another.
  1321. ;* exit : n/a
  1322. cPrivate BltArc,<ATOMIC>,<SI,DI>
  1323. parmB axDest
  1324. parmB ayDest
  1325. parmB dax 
  1326. parmB day
  1327. parmB axSrc
  1328. parmB aySrc
  1329. localW fMouseOn ;* FEnableMouse old state
  1330. localW offDestLim ;* last offset written
  1331. cBegin BltArc
  1332. StartPublic
  1333. xor ax,ax
  1334. cCall FEnableMouse,<ax> ;* turn mouse off
  1335. mov fMouseOn,ax
  1336. AssertUp
  1337. mov al,day
  1338. or al,al
  1339. jz blt_end1 ;* trivial case (day == 0)
  1340. CalcCoord axDest,ayDest
  1341. mov di,ax
  1342. mov offDrawFirst,ax ;* save for driver inform
  1343. ;* * Do either a Prep, Do, Done sequence or a fast BltArcCsd call
  1344. test instCur.finstInst,finstFastScroll
  1345. jnz skip_prep
  1346. ;* * Prepare screen driver for update
  1347. mov si,word ptr (dax) ;* low byte is all that's interesting
  1348. ;* * si = dax, di = offset in Prim buffer
  1349. ;* * ax = ayDest, cx = day
  1350. xor ax,ax
  1351. mov al,ayDest
  1352. xor cx,cx
  1353. mov cl,day
  1354. push di
  1355. loop_prep:
  1356. Save <ax,cx>
  1357. cCall insj.lpfnPrepUpdateCsdInsj, <ax, axDest, si, di, fRestoreDbcs>
  1358. add di,axMacTimes2 ;* point to next row
  1359. inc ax
  1360. loop loop_prep
  1361. pop di
  1362. skip_prep:
  1363. CalcCoord axSrc,aySrc
  1364. mov si,ax ; save pointer to source
  1365. mov dx,axMacTimes2 ;* row modulus
  1366. cmp ax,di
  1367. jge blt_hilo ; going from high memory to low
  1368. ; go from low memory to high.  Do backwards Blt  Blt Row by row either 
  1369. ; fast or slow depending on the retrace parameter; ax has source, di
  1370. ; destination of top left hand point
  1371. mov al,day
  1372. dec al
  1373. mul axMac
  1374. mov bl,dax
  1375. xor bh,bh
  1376. add ax,bx
  1377. shl ax,1
  1378. dec ax ;* back 1 byte (for movsb)
  1379. add di,ax ; move source to bottom right
  1380. add si,ax ; move dest to bottom, right 
  1381. neg dx ;* negate row modulus
  1382. std ; bltting backwards
  1383. jmp short blt_go
  1384. blt_end1: ;* jump extender
  1385. jmp blt_end
  1386. blt_hilo:
  1387. ; cld ;* D flag already cleared
  1388. blt_go:
  1389. ;* * dx = row modulus (+ or - axMac * 2)
  1390. mov cl,dax ; setup number of columns
  1391. xor ch,ch
  1392. jcxz blt_end1 ;* trivial case (dax == 0)
  1393. shl cx,1 ;* ccol -> cb
  1394. mov bx,cx ;* CX = BX = cb
  1395. push ds
  1396. ifdef DEBUG
  1397. cmp instCur.psPrimInst,0 ;* no buffer! (FAllocInstBuffers)
  1398. jne @F
  1399. cCall CowAssertFailed
  1400. DB "no primary buffer for current mode$"
  1401. @@:
  1402. endif ;DEBUG
  1403. mov es,instCur.psPrimInst
  1404. push es
  1405. pop ds ;* DS & ES set to video segment
  1406. xor ax,ax
  1407. mov al,day
  1408. ifdef SCREEN_FFONT
  1409. Save <ax,bx,cx,dx,si,di> ;* needed for second call
  1410. cCall DoBltArc
  1411. pop ds
  1412. cmp fFontAvailable,0
  1413. jz no_blt_ffont
  1414. push ds
  1415. mov es,instCur.psSecInst
  1416. push es
  1417. pop ds ;* DS & ES set to video segment
  1418. endif ;SCREEN_FFONT
  1419. cCall DoBltArc
  1420. pop ds
  1421. no_blt_ffont:
  1422. cld ;* Clear D flag (convention)
  1423. ;* Check for fast scrolling in graphics text modes
  1424. test instCur.finstInst,finstFastScroll
  1425. jz no_fast
  1426. cCall insj.lpfnBltArcCsdInsj, <axDest, ayDest, dax, day, axSrc, aySrc>
  1427. jmp skip_updatedone
  1428. no_fast:
  1429. ;* * Inform screen driver of the destination area
  1430. mov si,word ptr (dax) ;* low byte is all that's interesting
  1431. mov di,offDrawFirst
  1432. ;* * si = dax, di = offset in Prim buffer
  1433. loop_inform_blt:
  1434. cCall insj.lpfnDoUpdateCsdInsj, <ayDest, axDest, si, di, fRestoreDbcs>
  1435. add di,axMacTimes2 ;* point to next row
  1436. inc ayDest
  1437. dec day
  1438. jnz loop_inform_blt
  1439. ;* * all done, refresh
  1440. cCall insj.lpfnDoneUpdateCsdInsj ;* ()
  1441. blt_end:
  1442. cld ;* Clear D flag (convention)
  1443. skip_updatedone:
  1444. cCall FEnableMouse,<fMouseOn> ;* restore mouse state
  1445. StopPublic
  1446. cEnd BltArc
  1447. ;********** DoBltArc **********
  1448. ;* entry : ax = day, bx = cx = cb, dx = row modulus, si = source,
  1449. ;* di = dest, es and ds => video segment
  1450. ;* * blt screen memory
  1451. ;* * NOTE: direction flag either set or clear on entry.
  1452. ;* exit : n/a
  1453. cProc DoBltArc,<NEAR,PUBLIC,ATOMIC>
  1454. cBegin DoBltArc
  1455. assumes ds,nothing
  1456. ifdef WINDOW_OVERLAP
  1457. push bp ;* current window do blt
  1458. mov bp,pwndCur
  1459. endif ;WINDOW_OVERLAP
  1460. blt_row:
  1461. push si
  1462. push di
  1463. blt_fast:
  1464. ;* * We can BLT fast
  1465. ifdef WINDOW_OVERLAP
  1466. or bp,bp
  1467. jz blt_fast_allowed
  1468. blt_overlap:
  1469. push di
  1470. and di,not 1
  1471. push ds
  1472. mov ds,ss:psOverlap
  1473. cmp bp,[di]
  1474. pop ds
  1475. je move_two
  1476. ;* * skip this movement
  1477. push ax
  1478. mov di,si ;* old position
  1479. lodsw ;* bump by 2 in right direction
  1480. mov ax,si
  1481. sub ax,di ;* ax = delta (+2 or -2)
  1482. pop di ;* old DI
  1483. add di,ax ;* DI points to new position
  1484. pop ax
  1485. jmp short move_overlap_next
  1486. move_two:
  1487. pop di
  1488. ifdef BUILTIN_SNOW
  1489. push ax
  1490. push dx
  1491. mov dx,3DAh ;* CGA video status port
  1492. StartDrawCrit
  1493. endif ;BUILTIN_SNOW
  1494. movsb
  1495. movsb
  1496. ifdef BUILTIN_SNOW
  1497. EndDrawCrit
  1498. pop dx
  1499. pop ax
  1500. endif ;BUILTIN_SNOW
  1501. move_overlap_next:
  1502. dec cx
  1503. loop blt_overlap
  1504. jmp short blt_next_row
  1505. blt_fast_allowed: ;* fall through to rep move
  1506. endif ;WINDOW_OVERLAP
  1507. ifdef BUILTIN_SNOW
  1508. push ax
  1509. push dx
  1510. mov dx,3DAh ;* CGA video status port
  1511. SnowL1:
  1512. StartDrawCrit
  1513. movsb
  1514. EndDrawCrit
  1515. loop SnowL1
  1516. pop dx
  1517. pop ax
  1518. ELSE ;NOT DEFINED BUILTIN_SNOW
  1519. rep movsb ;* move byte to keep backward case
  1520. endif ;BUILTIN_SNOW
  1521. ;* simple.
  1522. blt_next_row:
  1523. pop di
  1524. pop si
  1525. mov cx,bx ;* restore cx as cb
  1526. add di,dx
  1527. add si,dx ; move to next/previous row
  1528. dec ax
  1529. jnz blt_row
  1530. ifdef WINDOW_OVERLAP
  1531. pop bp
  1532. endif ;WINDOW_OVERLAP
  1533. cEnd DoBltArc
  1534. sEnd SCREEN
  1535. ;----------------------------------------------------------------------------
  1536. END