home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / FASTGEM0.I < prev    next >
Encoding:
Text File  |  1990-10-09  |  8.7 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE FastGEM0;(*Y+*)
  2. ⓪ 
  3. ⓪ 
  4. ⓪ (*  --------------------------------------------------------------------------
  5. ⓪!*  System-Version: MOS 1.1
  6. ⓪!*  --------------------------------------------------------------------------
  7. ⓪!*  Version       : 0.01
  8. ⓪!*  --------------------------------------------------------------------------
  9. ⓪!*  Text-Version  : V#0008
  10. ⓪!*  --------------------------------------------------------------------------
  11. ⓪!*  Modul-Holder  : Manuel Chakravarty
  12. ⓪!*  --------------------------------------------------------------------------
  13. ⓪!*  Copyright July 1988 by Manuel Chakravarty
  14. ⓪!*  Vertriebsrechte für ATARI ST unter MEGAMAX Modula-2
  15. ⓪!*                  liegen bei Application Systems Heidelberg
  16. ⓪!*  --------------------------------------------------------------------------
  17. ⓪!*  MCH : Manuel Chakravarty
  18. ⓪!*  --------------------------------------------------------------------------
  19. ⓪!*  Datum    Autor  Version  Bemerkung (Arbeitsbericht)
  20. ⓪!*
  21. ⓪!*  14.08.89 MCH    V0.01    Urversion; 'CopyOpaque' impl. + def.
  22. ⓪!*  --------------------------------------------------------------------------
  23. ⓪!*  Modul-Beschreibung:
  24. ⓪!*
  25. ⓪!*  Dies Modul stellt eine schnelle Kopierfunktion für beliebige Bildschirm-
  26. ⓪!*  bereiche zur Verfügung.
  27. ⓪!*
  28. ⓪!*  --------------------------------------------------------------------------
  29. ⓪!*)
  30. ⓪ 
  31. ⓪ (*  =========== ZU TUN: ==============
  32. ⓪!*
  33. ⓪!*  -- Überprüfen, ob die Routinen immer VDI aufrufen, wenn die ASM-Routine
  34. ⓪!*     versagt.
  35. ⓪!*
  36. ⓪!*  =========== DOCU: ================
  37. ⓪!*
  38. ⓪!*)
  39. ⓪ 
  40. ⓪ 
  41. ⓪ FROM SYSTEM     IMPORT ASSEMBLER, BYTE, ADDRESS;
  42. ⓪ 
  43. ⓪ FROM GrafBase   IMPORT Rectangle, BitOperation, PtrMemFormDef, MemFormDef,
  44. ⓪7GetBlitterMode, GetScreen;
  45. ⓪ 
  46. ⓪ FROM GEMEnv     IMPORT DeviceHandle;
  47. ⓪ 
  48. ⓪ IMPORT VDIRasters;
  49. ⓪ 
  50. ⓪ 
  51. ⓪ TABLE.W masks:  $FFFF, $7FFF, $3FFF, $1FFF,     (*  Tabelle für 'copyOpaque'  *)
  52. ⓪0$0FFF, $07FF, $03FF, $01FF,
  53. ⓪0$00FF, $007F, $003F, $001F,
  54. ⓪0$000F, $0007, $0003, $0001;
  55. ⓪0
  56. ⓪((*    wortbreite, planes  *)            (*  Bildschirmauflösungen  *)
  57. ⓪(
  58. ⓪(rez:     80,      4,        (*  Low-Res  *)
  59. ⓪180,      2,        (*  Mid-Res  *)
  60. ⓪140,      1;        (*  High-Res  *)
  61. ⓪(
  62. ⓪ PROCEDURE CopyOpaque (dev        : DeviceHandle;
  63. ⓪6sourceMem,
  64. ⓪6destMem    : PtrMemFormDef;
  65. ⓪6sourceFrame,
  66. ⓪6destFrame  : Rectangle;
  67. ⓪6mode       : BitOperation);
  68. ⓪6
  69. ⓪"VAR   screenAddr      : ADDRESS;
  70. ⓪(words, planes   : CARDINAL;
  71. ⓪(wordAlign       : BYTE;
  72. ⓪ 
  73. ⓪"PROCEDURE longCopy;
  74. ⓪"
  75. ⓪$(*$L-*)
  76. ⓪$BEGIN
  77. ⓪&ASSEMBLER
  78. ⓪(TST.W   sourceFrame.w(A6)
  79. ⓪(BPL     ok1
  80. ⓪(CLR.W   sourceFrame.w(A6)
  81. ⓪ ok1
  82. ⓪(TST.W   sourceFrame.h(A6)
  83. ⓪(BPL     ok2
  84. ⓪(CLR.W   sourceFrame.h(A6)
  85. ⓪ ok2
  86. ⓪ 
  87. ⓪(MOVEM.L D3-D7/A3-A5,-(A7)
  88. ⓪(
  89. ⓪(MOVE.W  planes(A6),A3   ; Anzahl Randwörter links -> A3
  90. ⓪(MOVE.W  A3,A4           ; Anzahl Randwörter rechts -> A4
  91. ⓪(
  92. ⓪(MOVE.W  sourceFrame.x(A6),D0
  93. ⓪(MOVE.W  D0,D2
  94. ⓪(ANDI.W  #$F,D0
  95. ⓪(MOVE.W  #16,D7
  96. ⓪(SUB.W   D0,D7
  97. ⓪(MOVE.W  D7,-(A7)        ; Anzahl linke Randbits merken (Stack)
  98. ⓪(ADD.W   D0,D0
  99. ⓪(LEA     masks,A0
  100. ⓪(MOVE.L  A0,A1
  101. ⓪(ADDA.W  D0,A0
  102. ⓪(MOVE.W  (A0),D1         ; Linke Kopiermaske -> D1
  103. ⓪(MOVE.W  D1,D3
  104. ⓪(NOT.W   D3              ; Linke negierte Kopiermaske -> D3
  105. ⓪(
  106. ⓪(ADD.W   sourceFrame.w(A6),D2
  107. ⓪(ANDI.W  #$F,D2
  108. ⓪(MOVE.W  D2,-(A7)        ; Anzahl rechte Randbits merken (Stack)
  109. ⓪(ADD.W   D2,D2
  110. ⓪(ADDA.W  D2,A1
  111. ⓪(MOVE.W  (A1),D4         ; Rechte negierte Kopiermaske -> D4
  112. ⓪(MOVE.W  D4,D2
  113. ⓪(NOT.W   D2              ; Rechte Kopiermaske -> D2
  114. ⓪(BNE     c
  115. ⓪(CLR.W   (A7)            ; Keine rechten Randbits merken
  116. ⓪(MOVE.W  #0,A4           ; Rechts ist Wortgrenze => Keine Maske nötig
  117. ⓪ c
  118. ⓪(
  119. ⓪(MOVE.W  sourceFrame.w(A6),D0
  120. ⓪(SUB.W   (A7)+,D0        ; Randbits abziehen
  121. ⓪(SUB.W   (A7)+,D0
  122. ⓪(BPL     c2
  123. ⓪(AND.W   D2,D1
  124. ⓪(OR.W    D4,D3
  125. ⓪(MOVE.W  #0,A4
  126. ⓪(CLR.W   D0
  127. ⓪ c2
  128. ⓪(LSR.W   #4,D0
  129. ⓪(MULU.W  planes(A6),D0
  130. ⓪(MOVE.W  D0,D7
  131. ⓪(ADD.W   A3,D7
  132. ⓪(ADD.W   A4,D7
  133. ⓪(MOVE.W  words(A6),A5
  134. ⓪(SUBA.W  D7,A5
  135. ⓪(ADDA.W  A5,A5           ; Zeilenoffset in Byte -> A5
  136. ⓪(MOVE.W  D7,-(A7)        ; Anzahl pro Zeile zu kopierende Words -> Stack
  137. ⓪(LSR.W   #1,D0
  138. ⓪(SCS     wordAlign(A6)   ; wordAlign-Flag -> 'wordAlign'
  139. ⓪(MOVE.W  D0,A2           ; Anzahl Longs pro Zeile -> A2
  140. ⓪(
  141. ⓪(MOVE.W  sourceFrame.h(A6),D5    ; Anzahl Zeilen -> D5
  142. ⓪(
  143. ⓪(;       Startaddressenberechnung
  144. ⓪(
  145. ⓪(MOVE.W  sourceFrame.y(A6),D0
  146. ⓪(MULU.W  words(A6),D0
  147. ⓪(ADD.W   D0,D0
  148. ⓪(MOVEQ   #0,D7
  149. ⓪(MOVE.L  D7,A0
  150. ⓪(MOVE.W  D0,A0
  151. ⓪(MOVE.W  sourceFrame.x(A6),D0
  152. ⓪(LSR.W   #3,D0
  153. ⓪(AND.W   #$FE,D0
  154. ⓪(ADDA.W  D0,A0
  155. ⓪(ADDA.L  screenAddr(A6),A0       ; sourceAddr -> A0
  156. ⓪(
  157. ⓪(MOVE.W  destFrame.y(A6),D0
  158. ⓪(MULU.W  words(A6),D0
  159. ⓪(ADD.W   D0,D0
  160. ⓪(MOVEQ   #0,D7
  161. ⓪(MOVE.L  D7,A1
  162. ⓪(MOVE.W  D0,A1
  163. ⓪(MOVE.W  destFrame.x(A6),D0
  164. ⓪(LSR.W   #3,D0
  165. ⓪(AND.W   #$FE,D0
  166. ⓪(ADDA.W  D0,A1
  167. ⓪(ADDA.L  screenAddr(A6),A1       ; destAddr -> A1
  168. ⓪(
  169. ⓪(CMPA.L  A0,A1
  170. ⓪(BCS.W   forward
  171. ⓪(
  172. ⓪(;       --- Kopie RÜCKWÄRTS ---
  173. ⓪(
  174. ⓪(MOVE.W  sourceFrame.h(A6),D0
  175. ⓪(SUBQ.W  #1,D0
  176. ⓪(MULU.W  words(A6),D0
  177. ⓪(ADD.W   (A7)+,D0        ; Anzahl zu kopierende Wörter pro Zeile add.
  178. ⓪(ADD.W   D0,D0
  179. ⓪(ADDA.W  D0,A0
  180. ⓪(ADDA.W  D0,A1
  181. ⓪(
  182. ⓪(BRA     startBack       ; Start Kopierschleife (rückwärts)
  183. ⓪ lBack
  184. ⓪(MOVE.W  A4,D0           ; Start rechte Maske
  185. ⓪(BRA     sBRight
  186. ⓪ lBRight
  187. ⓪(MOVE.W  -(A1),D6
  188. ⓪(AND.W   D4,D6
  189. ⓪(MOVE.W  -(A0),D7
  190. ⓪(AND.W   D2,D7
  191. ⓪(OR.W    D6,D7
  192. ⓪(MOVE.W  D7,(A1)
  193. ⓪ sBRight
  194. ⓪(DBF     D0,lBRight
  195. ⓪(
  196. ⓪(TST.B   wordAlign(A6)   ; Start Align
  197. ⓪(BEQ     noAlignB
  198. ⓪(MOVE.W  -(A0),-(A1)
  199. ⓪ noAlignB
  200. ⓪ 
  201. ⓪(MOVE.W  A2,D0           ; Start kopiere Longs
  202. ⓪(BRA     sBLongs
  203. ⓪ lBLongs
  204. ⓪(MOVE.L  -(A0),-(A1)
  205. ⓪ sBLongs
  206. ⓪(DBF     D0,lBLongs
  207. ⓪(
  208. ⓪(MOVE.W  A3,D0           ; Start linke Maske
  209. ⓪(BRA     sBLeft
  210. ⓪ lBLeft
  211. ⓪(MOVE.W  -(A1),D6
  212. ⓪(AND.W   D3,D6
  213. ⓪(MOVE.W  -(A0),D7
  214. ⓪(AND.W   D1,D7
  215. ⓪(OR.W    D6,D7
  216. ⓪(MOVE.W  D7,(A1)
  217. ⓪ sBLeft
  218. ⓪(DBF     D0,lBLeft
  219. ⓪ 
  220. ⓪(SUBA.W  A5,A0           ; Addr. der nächsten Zeile ermittlen
  221. ⓪(SUBA.W  A5,A1
  222. ⓪ startBack
  223. ⓪(DBF     D5,lBack
  224. ⓪(
  225. ⓪(BRA     ende
  226. ⓪(
  227. ⓪(;       --- Kopie VORWÄRTS ---
  228. ⓪(
  229. ⓪ forward
  230. ⓪(ADDQ.L  #2,A7           ; A7 bereinigen
  231. ⓪(BRA     startFore       ; Start Kopierschleife (vorwärts)
  232. ⓪ lFore
  233. ⓪(MOVE.W  A3,D0           ; Start linke Maske
  234. ⓪(BRA     sFLeft
  235. ⓪ lFLeft
  236. ⓪(MOVE.W  (A1),D6
  237. ⓪(AND.W   D3,D6
  238. ⓪(MOVE.W  (A0)+,D7
  239. ⓪(AND.W   D1,D7
  240. ⓪(OR.W    D6,D7
  241. ⓪(MOVE.W  D7,(A1)+
  242. ⓪ sFLeft
  243. ⓪(DBF     D0,lFLeft
  244. ⓪(
  245. ⓪(TST.B   wordAlign(A6)   ; Start Align
  246. ⓪(BEQ     noAlignF
  247. ⓪(MOVE.W  (A0)+,(A1)+
  248. ⓪ noAlignF
  249. ⓪ 
  250. ⓪(MOVE.W  A2,D0           ; Start kopiere Longs
  251. ⓪(BRA     sFLongs
  252. ⓪ lFLongs
  253. ⓪(MOVE.L  (A0)+,(A1)+
  254. ⓪ sFLongs
  255. ⓪(DBF     D0,lFLongs
  256. ⓪(
  257. ⓪(MOVE.W  A4,D0           ; Start linke Maske
  258. ⓪(BRA     sFRight
  259. ⓪ lFRight
  260. ⓪(MOVE.W  (A1),D6
  261. ⓪(AND.W   D4,D6
  262. ⓪(MOVE.W  (A0)+,D7
  263. ⓪(AND.W   D2,D7
  264. ⓪(OR.W    D6,D7
  265. ⓪(MOVE.W  D7,(A1)+
  266. ⓪ sFRight
  267. ⓪(DBF     D0,lFRight
  268. ⓪ 
  269. ⓪(ADDA.W  A5,A0           ; Addr. der nächsten Zeile ermittlen
  270. ⓪(ADDA.W  A5,A1
  271. ⓪ startFore
  272. ⓪(DBF     D5,lFore
  273. ⓪(
  274. ⓪ ende
  275. ⓪(MOVEM.L (A7)+,D3-D7/A3-A5
  276. ⓪&END;
  277. ⓪$END longCopy;
  278. ⓪$(*$L=*)
  279. ⓪ 
  280. ⓪"BEGIN
  281. ⓪$ASSEMBLER
  282. ⓪(SUBQ.L  #2,A7
  283. ⓪(MOVE.L  A7,(A3)+
  284. ⓪(SUBQ.L  #2,A7
  285. ⓪(MOVE.L  A7,(A3)+
  286. ⓪(JSR     GetBlitterMode
  287. ⓪(MOVE.W  (A7)+,D0
  288. ⓪(AND.W   (A7)+,D0
  289. ⓪(BNE     vdiCopy         ; Springe, falls Blitter vorhanden + aktiv
  290. ⓪(
  291. ⓪(MOVE.W  mode(A6),D0
  292. ⓪(CMP.W   #onlyS,D0
  293. ⓪(BNE     vdiCopy         ; Springe, falls kein replace-mode
  294. ⓪(
  295. ⓪(MOVE.L  sourceMem(A6),A0
  296. ⓪(MOVE.L  MemFormDef.start(A0),D0
  297. ⓪(MOVE.L  destMem(A6),A0
  298. ⓪(CMP.L   MemFormDef.start(A0),D0
  299. ⓪(BEQ     cont
  300. ⓪#
  301. ⓪ vdiCopy
  302. ⓪$END;
  303. ⓪$VDIRasters.CopyOpaque (dev, sourceMem,destMem, sourceFrame, destFrame,
  304. ⓪;mode);
  305. ⓪$ASSEMBLER
  306. ⓪(BRA     ende
  307. ⓪"
  308. ⓪ cont
  309. ⓪(TST.L   D0
  310. ⓪(BNE     mfdbValid
  311. ⓪(
  312. ⓪(;       Bildschirmaddresse und die Breite einer Scanzeile ermitteln
  313. ⓪(
  314. ⓪(SUBQ.L  #4,A7
  315. ⓪(MOVE.L  A7,(A3)+
  316. ⓪(SUBQ.L  #4,A7
  317. ⓪(MOVE.L  A7,(A3)+
  318. ⓪(SUBQ.L  #2,A7
  319. ⓪(MOVE.L  A7,(A3)+
  320. ⓪(JSR     GetScreen
  321. ⓪(
  322. ⓪(MOVE.W  (A7)+,D0
  323. ⓪(LSL.W   #2,D0
  324. ⓪(LEA     rez,A0
  325. ⓪(ADDA.W  D0,A0
  326. ⓪(MOVE.W  (A0)+,words(A6)
  327. ⓪(MOVE.W  (A0),planes(A6)
  328. ⓪(ADDQ.L  #4,A7
  329. ⓪(MOVE.L  (A7)+,screenAddr(A6)
  330. ⓪(BRA     cont3
  331. ⓪(
  332. ⓪(;       Werte aus MFDB übernehmen
  333. ⓪(
  334. ⓪ mfdbValid
  335. ⓪(MOVE.L  D0,screenAddr(A6)
  336. ⓪(MOVE.W  MemFormDef.words(A0),words(A6)
  337. ⓪(MOVE.W  MemFormDef.planes(A0),planes(A6)
  338. ⓪(
  339. ⓪ cont3
  340. ⓪(MOVE.W  sourceFrame.x(A6),D0
  341. ⓪(ANDI.W  #$F,D0
  342. ⓪(MOVE.W  destFrame.x(A6),D1
  343. ⓪(ANDI.W  #$F,D1
  344. ⓪(CMP.W   D0,D1
  345. ⓪(BNE     vdiCopy
  346. ⓪(CMPI.W  #1,planes(A6)
  347. ⓪(BNE     vdiCopy
  348. ⓪(BSR     longCopy
  349. ⓪(
  350. ⓪ ende
  351. ⓪$END;
  352. ⓪"END CopyOpaque;
  353. ⓪ 
  354. ⓪ 
  355. ⓪ END FastGEM0.
  356. ⓪ ə
  357. (* $FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$00001CBF$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95ü$00000027T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000006B7$00001CAF$000006FA$00000020$FFEC88E0$00002066$0000063D$000005E1$00000027$00002056$00002043$00000703$00000885$00000896$000006FA$0000064BñÇâ*)
  358.