PageRenderTime 93ms CodeModel.GetById 47ms RepoModel.GetById 9ms app.codeStats 0ms

/BasicBoy/Grfx.bas

https://github.com/skmp/BasicBoy
Basic | 736 lines | 701 code | 16 blank | 19 comment | 0 complexity | 399d21369839886406067b36a7bbc9a6 MD5 | raw file
Possible License(s): Apache-2.0
  1. Attribute VB_Name = "modGrfx"
  2. 'This is a part of the BasicBoy emulator
  3. 'You are not allowed to release modified(or unmodified) versions
  4. 'without asking me (Raziel).
  5. 'For Suggestions ect please e-mail at :stef_mp@yahoo.gr
  6. 'To download the latest version/source goto basicboy.emuhost.com
  7. '(I know the emulator is NOT OPTIMIZED AT ALL)
  8. 'v1.2.0
  9. 'Graphics Engine
  10. 'Currenlty a bit optimized
  11. 'Color Gameboy Part is 95% finished
  12. 'Coments will be added with the next release
  13. 'New modes : DDraw DMA ,DDraw DMA Unsafe
  14. 'Fidex DrawLine and DrawLin4 for spirte/window priority
  15. 'Sory for my bad english ...
  16. #Const bltDD_DMA = 0 'set to 1 is a bit faster but may be unstable
  17. #Const Unsafe = 1 And bltDD_DMA 'set to 1 with bltdd_dma is faster but even more unstable
  18. Global framedelay As Double
  19. Dim bmh As String
  20. Option Base 0
  21. Option Explicit
  22. Dim tmpdesc As DDSURFACEDESC2
  23. Public bmbH(53) As Byte
  24. Public FPS As Long, fpsT As Long
  25. Dim colid(128, 128) As Long
  26. Dim colidx(128, 128) As Byte
  27. Dim colid2(2, 128, 128) As Long
  28. Dim re2 As dxvblib.RECT
  29. Public FULLSCREEN As Boolean
  30. Public TCol As Long, mode1 As Long
  31. Dim i As Long, i2 As Long, X As Long, Y As Long, tilemap As Long, tileloc As Long, tileptr As Long
  32. Dim xoffset As Long, yoffset As Long, TileData As Long, tileend As Long
  33. Dim LByte As Long, HByte As Long, SpriteY As Long
  34. Dim dy As Long, DX As Long, spat As Long
  35. Dim tmp1 As Long, tmp2 As Long, memptr As Long, tmp3 As Long, rx As Long, ry As Long, lolm As Long, tms As Long
  36. Global BB As BITMAPINFO, desthdc As Long, destW As Long, destH As Long, desthimg As Long
  37. Global Vram(0 To 159, 0 To 143) As Integer, mir(255) As Byte, mv1 As Byte, mv2 As Byte, vf As Boolean, cid2 As Long, tiletmp As Long, xs As Long, ys As Long, xt As Long
  38. Global tobj As Long, thdc As Long, DH As Long, Dw As Long, xr As Long, yr As Long
  39. Global fskip As Long, fmode As Long, objp(7, 3) As Long, bgp(7, 3) As Long
  40. Global vrm As Long, ccp As Long, ccid(128, 128) As Long, tm2 As Long, tm1 As Long, bgat As Byte ', gbcP(32767) As Integer
  41. Global wv As Boolean, bgv As Boolean, objv As Boolean, xflip As Long, yflip As Long, lastline As Long
  42. Global curline As Long, tcls(19) As Integer, curFreq As Currency, curStart As Long, dblResult As Double
  43. Global Skipf As Boolean
  44. Global bgpCC(7, 3) As Long, objpCC(7, 3) As Long
  45. #If Unsafe Then
  46. Dim sptr As Long
  47. #End If
  48. Public Sub DrawScreen() 'Using SetBits/StrechBits and directdraw
  49. FPS = FPS + 1
  50. If fmode = 0 Then 'frame skip mode 1(act skip(x1(1),x2(2),x3(3),x4(4),x5(5),x6(6))
  51. If FPS Mod fskip > 0 Then
  52. Skipf = True
  53. If lfp Then
  54. Do
  55. dblResult = GetTickCount2 - curStart
  56. 'DoEvents
  57. If PeekMessage(message, 0&, 0&, 0&, PM_REMOVE) Then
  58. Call TranslateMessage(message)
  59. Call DispatchMessage(message)
  60. End If
  61. Loop While dblResult < framedelay
  62. End If
  63. Exit Sub
  64. End If
  65. Else 'frame skip mode 2(act skip(x1.20(6),x1.25(5),x1,3(4),x1.5(3))
  66. If FPS Mod fskip = 0 Then
  67. Skipf = True
  68. If lfp Then
  69. Do
  70. dblResult = GetTickCount2 - curStart
  71. 'DoEvents
  72. If PeekMessage(message, 0&, 0&, 0&, PM_REMOVE) Then
  73. Call TranslateMessage(message)
  74. Call DispatchMessage(message)
  75. End If
  76. Loop While dblResult < framedelay
  77. End If
  78. Exit Sub
  79. End If
  80. End If
  81. If mode1 Then 'WinApi + DX
  82. #If bltDD_DMA = 0 Then
  83. desthdc = backbuffer.GetDC
  84. StretchDIBits desthdc, 0, 0, 160, 144, 0, 0, 160, 144, Vram(0, 0), BB, 0, vbSrcCopy
  85. backbuffer.ReleaseDC desthdc
  86. #Else
  87. #If Unsafe Then
  88. CopyMemory ByVal sptr, Vram(0, 0), 46080
  89. #Else
  90. backbuffer.Lock re2, tmpdesc, DDLOCK_DONOTWAIT, dHandle
  91. CopyMemory ByVal tmpdesc.lpSurface, Vram(0, 0), 46080
  92. backbuffer.Unlock re2
  93. #End If
  94. #End If
  95. dx7.GetWindowRect dHandle, surfaceRect
  96. If zm = 5 Then
  97. primary.Blt surfaceRect, backbuffer, re2, DDBLT_ASYNC
  98. Else
  99. primary.Blt surfaceRect, backbuffer, re2, DDBLT_ASYNC Or DDBLT_DONOTWAIT
  100. End If
  101. Else 'WinApi
  102. StretchDIBits desthdc, 0, 0, Dw, DH, 0, 0, 160, 144, Vram(0, 0), BB, 0, vbSrcCopy
  103. frmMain.Picture1.Refresh
  104. End If
  105. Skipf = False
  106. If lfp Then
  107. Do
  108. dblResult = GetTickCount2 - curStart
  109. 'DoEvents
  110. If PeekMessage(message, 0&, 0&, 0&, PM_REMOVE) Then
  111. Call TranslateMessage(message)
  112. Call DispatchMessage(message)
  113. End If
  114. Loop While dblResult < framedelay
  115. End If
  116. End Sub
  117. Public Sub initGxMode1(Siz As Long, Optional FULLSCREEN As Boolean = False)
  118. Dim lWindowHandle As Long
  119. Dim tm1 As Long, tm2 As Long, i As Long, i2 As Long
  120. If Siz = 5 And FULLSCREEN = True Then Siz = 2
  121. initGxMode2 frmMain.Picture1, Siz
  122. mode1 = True
  123. re2.Top = 0
  124. re2.Left = 0
  125. re2.Right = 159
  126. re2.Bottom = 143
  127. 'setup the form
  128. frmMain.Picture1.AutoRedraw = False
  129. 'init the gfx colors
  130. backbuffer.BltColorFill re2, colid(0, 0)
  131. frmMain.Picture1.Visible = (modVars.ro <> "")
  132. primary.BltColorFill re2, RGB(255, 255, 255)
  133. If FULLSCREEN And (modVars.ro <> "") Then
  134. modDXEngine.fullSc
  135. End If
  136. #If Unsafe Then
  137. backbuffer.Lock re2, tmpdesc, DDLOCK_DONOTWAIT, dHandle
  138. sptr = tmpdesc.lpSurface
  139. backbuffer.Unlock re2
  140. #End If
  141. dx7.GetWindowRect dHandle, surfaceRect
  142. primary.BltColorFill surfaceRect, 0
  143. Exit Sub
  144. sxe:
  145. MsgBox "Error in drect draw init"
  146. mode1 = 0 'fallback to WinApi
  147. End Sub
  148. Sub ccolid2(ByVal col As Byte, target As Long)
  149. Dim tm1 As Long, tm2 As Long
  150. colid2(target, 0, 0) = colid(col And 2, col And 1)
  151. For tm2 = 1 To 128 Step 0
  152. colid2(target, 0, tm2) = colid(col And 8, col And 4)
  153. tm2 = tm2 * 2
  154. Next tm2
  155. For tm1 = 1 To 128 Step 0
  156. colid2(target, tm1, 0) = colid(col And 32, col And 16)
  157. tm1 = tm1 * 2
  158. Next tm1
  159. For tm1 = 1 To 128 Step 0
  160. For tm2 = 1 To 128 Step 0
  161. colid2(target, tm1, tm2) = colid(col And 128, col And 64)
  162. tm2 = tm2 * 2
  163. Next tm2
  164. tm1 = tm1 * 2
  165. Next tm1
  166. End Sub
  167. Sub initGxMode2(dest As PictureBox, Siz As Long)
  168. mode1 = 0
  169. frmMain.Picture1.AutoRedraw = True
  170. frmMain.Picture1.BorderStyle = 0
  171. frmMain.Picture1.ClipControls = False
  172. frmMain.Picture1.ScaleMode = 3
  173. frmMain.Picture1.BackColor = RGB(255, 255, 255)
  174. frmMain.Picture1.Width = 15 * 160 * Siz
  175. frmMain.Picture1.Height = 15 * 144 * Siz
  176. frmMain.Picture1.Visible = True
  177. With BB.Header
  178. .biSize = 40
  179. .biWidth = 160
  180. .biHeight = -144
  181. .biPlanes = 1
  182. .biBitCount = 16
  183. .biSizeImage = 46080
  184. End With
  185. destW = dest.ScaleWidth
  186. destH = dest.ScaleHeight
  187. desthdc = dest.hdc
  188. desthimg = dest.Image.Handle
  189. DH = 144 * Siz
  190. Dw = 160 * Siz
  191. frmMain.resize
  192. StretchDIBits desthdc, 0, 0, 160, 144, 0, 0, 160, 144, Vram(0, 0), BB, 0, vbSrcCopy
  193. End Sub
  194. Sub initCol()
  195. For i = 0 To 7
  196. objpCC(i, 0) = rgb15(31, 31, 31)
  197. bgpCC(i, 0) = rgb15(31, 31, 31)
  198. objpCC(i, 1) = rgb15(21, 21, 21)
  199. bgpCC(i, 1) = rgb15(21, 21, 21)
  200. objpCC(i, 2) = rgb15(10, 10, 10)
  201. bgpCC(i, 2) = rgb15(10, 10, 10)
  202. objpCC(i, 3) = rgb15(0, 0, 0)
  203. bgpCC(i, 3) = rgb15(0, 0, 0)
  204. Next i
  205. initMir
  206. Dim tm2 As Long, tm1 As Long
  207. If TGBC Then
  208. colid(0, 0) = rgb15(31, 31, 31)
  209. For tm2 = 1 To 128
  210. colid(0, tm2) = rgb15(21, 21, 21)
  211. Next tm2
  212. For tm1 = 1 To 128
  213. colid(tm1, 0) = rgb15(10, 10, 10)
  214. Next tm1
  215. For tm1 = 1 To 128
  216. For tm2 = 1 To 128
  217. colid(tm1, tm2) = rgb15(0, 0, 0)
  218. Next tm2
  219. Next tm1
  220. Else
  221. colid(0, 0) = rgb15(31, 31, 31)
  222. For tm2 = 1 To 128
  223. colid(0, tm2) = rgb15(21, 21, 21)
  224. Next tm2
  225. For tm1 = 1 To 128
  226. colid(tm1, 0) = rgb15(10, 10, 10)
  227. Next tm1
  228. For tm1 = 1 To 128
  229. For tm2 = 1 To 128
  230. colid(tm1, tm2) = rgb15(0, 0, 0)
  231. Next tm2
  232. Next tm1
  233. End If
  234. colidx(0, 0) = 0
  235. For tm2 = 1 To 128
  236. colidx(0, tm2) = 2
  237. Next tm2
  238. For tm1 = 1 To 128
  239. colidx(tm1, 0) = 1
  240. Next tm1
  241. For tm1 = 1 To 128
  242. For tm2 = 1 To 128
  243. colidx(tm1, tm2) = 3
  244. Next tm2
  245. Next tm1
  246. colid2(0, 0, 0) = colid(0, 0)
  247. For tm2 = 1 To 128
  248. colid2(0, 0, tm2) = colid(0, 1)
  249. Next tm2
  250. For tm1 = 1 To 128
  251. colid2(0, tm1, 0) = colid(1, 0)
  252. Next tm1
  253. For tm1 = 1 To 128
  254. For tm2 = 1 To 128
  255. colid2(0, tm1, tm2) = colid(1, 1)
  256. Next tm2
  257. Next tm1
  258. colid2(1, 0, 0) = colid(0, 0)
  259. For tm2 = 1 To 128
  260. colid2(1, 0, tm2) = colid(0, 1)
  261. Next tm2: For tm1 = 1 To 128
  262. colid2(1, tm1, 0) = colid(1, 0)
  263. Next tm1: For tm1 = 1 To 128
  264. For tm2 = 1 To 128
  265. colid2(1, tm1, tm2) = colid(1, 1)
  266. Next tm2
  267. Next tm1
  268. colid2(2, 0, 0) = colid(0, 0)
  269. For tm2 = 1 To 128
  270. colid2(2, 0, tm2) = colid(0, 1)
  271. Next tm2
  272. For tm1 = 1 To 128
  273. colid2(2, tm1, 0) = colid(1, 0)
  274. Next tm1: For tm1 = 1 To 128
  275. For tm2 = 1 To 128
  276. colid2(2, tm1, tm2) = colid(1, 1)
  277. Next tm2: Next tm1
  278. End Sub
  279. Public Function initMir()
  280. For i = 0 To 255
  281. mir(i) = (i And 128) \ 128 + (i And 64) \ 32 + (i And 32) \ 8 + (i And 16) \ 2 + _
  282. (i And 8) * 2 + (i And 4) * 8 + (i And 2) * 32 + (i And 1) * 128
  283. Next i
  284. End Function
  285. Function rgb15(Red As Byte, Green As Byte, Blue As Byte) As Integer
  286. rgb15 = Red * 1024 + Green * 32 + Blue
  287. End Function
  288. Sub SrceenShot()
  289. Dim flname As String, ni As Long
  290. bmh = Chr(&H42) & Chr(&H4D) & Chr(&H36) & Chr(&HE) & Chr(&H1) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H36) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H28) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&HA0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H70) & Chr(&HFF) & Chr(&HFF) & Chr(&HFF) & Chr(&H1) & Chr(&H0) & Chr(&H10) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&HB4) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H0)
  291. ret:
  292. flname = App.Path & "\" & Replace(rominfo.Title, "/", "") & " - " & ni & ".bmp"
  293. If Not FileExist(flname) Then
  294. If mode1 Then
  295. Dim lng As Long
  296. Open flname For Binary As #1
  297. Put #1, , bmh
  298. Put #1, , Vram
  299. Close #1
  300. Else
  301. SavePicture frmMain.Picture1.Image, flname
  302. End If
  303. Else
  304. ni = ni + 1
  305. GoTo ret
  306. End If
  307. End Sub
  308. Function FileExist(file As String) As Boolean
  309. On Error Resume Next
  310. If FileLen(file) = 0 Then FileExist = False Else FileExist = True
  311. End Function
  312. Sub Drawline4() 'Using Api and SetBits/StrechBits (Old Gameboy)
  313. curline = RAM(65348, 0)
  314. If curline = lastline Then Exit Sub
  315. lastline = curline
  316. ' Draw Background
  317. ' Get BG & window Tile Pattern Data Address
  318. If RAM(65344, 0) And 16 Then
  319. TileData = 32768
  320. Else
  321. TileData = 34816
  322. End If
  323. If bgv Then
  324. ' Get BG Tile Table Address
  325. If RAM(65344, 0) And 8 Then
  326. tilemap = 39936
  327. tms = 39936
  328. Else
  329. tilemap = 38912
  330. tms = 38912
  331. End If
  332. tileend = tilemap + 1023
  333. xoffset = RAM(65347, 0)
  334. yoffset = RAM(65346, 0) + curline
  335. xs = xoffset \ 8
  336. ys = yoffset \ 8
  337. yoffset = yoffset And 7
  338. xoffset = -(xoffset And 7)
  339. For X = xoffset To 159 Step 8
  340. tiletmp = tilemap + ys * 32 + xs
  341. If tiletmp > tileend Then tiletmp = tiletmp - 1024
  342. If TileData = 32768 Then ' Tile Data @ &H8800-&h97FF is 128ed
  343. tileptr = RAM(tiletmp, 0) * 16 'Get pointer to tile
  344. Else
  345. tileptr = (RAM(tiletmp, 0) Xor 128) * 16
  346. End If
  347. xs = (xs + 1) Mod 32
  348. memptr = TileData + tileptr + (yoffset And 7) * 2
  349. mv1 = RAM(memptr + 1, 0): mv2 = RAM(memptr, 0)
  350. If X > -1 And X < 153 Then
  351. Vram(X + 7, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  352. Vram(X + 6, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  353. Vram(X + 5, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  354. Vram(X + 4, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  355. Vram(X + 3, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  356. Vram(X + 2, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  357. Vram(X + 1, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  358. Vram(X, curline) = colid2(0, mv1 And 1, mv2 And 1)
  359. Else
  360. If X < 153 Then Vram(X + 7, curline) = colid2(0, mv1 And 1, mv2 And 1)
  361. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  362. If X > -7 And X < 154 Then Vram(X + 6, curline) = colid2(0, mv1 And 1, mv2 And 1)
  363. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  364. If X > -6 And X < 155 Then Vram(X + 5, curline) = colid2(0, mv1 And 1, mv2 And 1)
  365. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  366. If X > -5 And X < 156 Then Vram(X + 4, curline) = colid2(0, mv1 And 1, mv2 And 1)
  367. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  368. If X > -4 And X < 157 Then Vram(X + 3, curline) = colid2(0, mv1 And 1, mv2 And 1)
  369. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  370. If X > -3 And X < 158 Then Vram(X + 2, curline) = colid2(0, mv1 And 1, mv2 And 1)
  371. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  372. If X > -2 And X < 159 Then Vram(X + 1, curline) = colid2(0, mv1 And 1, mv2 And 1)
  373. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  374. If X > -1 And X < 160 Then Vram(X, curline) = colid2(0, mv1 And 1, mv2 And 1)
  375. End If
  376. Next X
  377. End If
  378. 'Draw Sprites
  379. If (RAM(65344, 0) And 2) And objv Then
  380. If (RAM(65344, 0) And 4) = 0 Then
  381. SpriteY = 7
  382. Else
  383. SpriteY = 15
  384. End If
  385. For tilemap = 65180 To 65024 Step -4
  386. Y = RAM(tilemap, 0) - 16
  387. X = RAM(tilemap + 1, 0) - 8
  388. If Y <= curline And Y + SpriteY >= curline And X > -8 And X < 160 Then
  389. If SpriteY = 7 Then tileptr = readM(tilemap + 2) * 16 Else tileptr = (RAM(tilemap + 2, 0) And 254) * 16 'Get pointer to tile
  390. TCol = -((RAM(tilemap + 3, 0) And 128) > 0)
  391. spat = -((readM(tilemap + 3) And 16) > 0) + 1
  392. vf = RAM(tilemap + 3, 0) And 32
  393. 'init palete
  394. memptr = 32768 + tileptr
  395. If (RAM(tilemap + 3, 0) And 64) Then memptr = memptr + SpriteY * 2 - (curline - Y) * 2 Else memptr = memptr + (curline - Y) * 2
  396. If vf Then mv1 = mir(RAM(memptr + 1, vrm)): mv2 = mir(RAM(memptr, vrm)) Else mv1 = RAM(memptr + 1, vrm): mv2 = RAM(memptr, vrm)
  397. If TCol = 0 Then
  398. If X < 153 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 7, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  399. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  400. If X > -7 And X < 154 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 6, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  401. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  402. If X > -6 And X < 155 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 5, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  403. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  404. If X > -5 And X < 156 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 4, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  405. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  406. If X > -4 And X < 157 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 3, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  407. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  408. If X > -3 And X < 158 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 2, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  409. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  410. If X > -2 And X < 159 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 1, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  411. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  412. If X > -1 And X < 160 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  413. Else
  414. cid2 = colid2(0, 0, 0)
  415. If X < 153 Then If Vram(X + 7, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 7, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  416. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  417. If X > -7 And X < 154 Then If Vram(X + 6, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 6, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  418. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  419. If X > -6 And X < 155 Then If Vram(X + 5, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 5, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  420. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  421. If X > -5 And X < 156 Then If Vram(X + 4, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 4, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  422. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  423. If X > -4 And X < 157 Then If Vram(X + 3, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 3, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  424. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  425. If X > -3 And X < 158 Then If Vram(X + 2, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 2, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  426. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  427. If X > -2 And X < 159 Then If Vram(X + 1, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 1, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  428. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  429. If X > -1 And X < 160 Then If Vram(X, curline) = cid2 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X, curline) = colid2(spat, mv1 And 1, mv2 And 1)
  430. End If
  431. End If
  432. Next tilemap
  433. End If
  434. 'Draw Window
  435. If ((RAM(65344, 0) And 32) = 32) And wv And (curline >= RAM(65354, 0)) And (RAM(65355, 0) < 167) Then
  436. ' Get window Tile Table Address
  437. If RAM(65344, 0) And 64 Then
  438. tilemap = 39936
  439. Else
  440. tilemap = 38912
  441. End If
  442. yoffset = curline - RAM(65354, 0)
  443. tilemap = tilemap + (yoffset \ 8) * 32
  444. yoffset = yoffset And 7
  445. For X = RAM(65355, 0) - 7 To 159 Step 8
  446. If TileData = 32768 Then ' Tile Data @ &H8800-&h97FF is 128ed
  447. tileptr = RAM(tilemap, 0) * 16 'Get pointer to tile
  448. Else
  449. tileptr = (RAM(tilemap, 0) Xor 128) * 16
  450. End If
  451. memptr = TileData + tileptr + (yoffset And 7) * 2
  452. mv1 = RAM(memptr + 1, 0): mv2 = RAM(memptr, 0)
  453. If X > -1 And X < 153 Then
  454. Vram(X + 7, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  455. Vram(X + 6, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  456. Vram(X + 5, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  457. Vram(X + 4, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  458. Vram(X + 3, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  459. Vram(X + 2, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  460. Vram(X + 1, curline) = colid2(0, mv1 And 1, mv2 And 1): mv1 = mv1 \ 2: mv2 = mv2 \ 2
  461. Vram(X, curline) = colid2(0, mv1 And 1, mv2 And 1)
  462. tilemap = tilemap + 1
  463. Else
  464. If X < 153 Then Vram(X + 7, curline) = colid2(0, mv1 And 1, mv2 And 1)
  465. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  466. If X > -7 And X < 154 Then Vram(X + 6, curline) = colid2(0, mv1 And 1, mv2 And 1)
  467. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  468. If X > -6 And X < 155 Then Vram(X + 5, curline) = colid2(0, mv1 And 1, mv2 And 1)
  469. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  470. If X > -5 And X < 156 Then Vram(X + 4, curline) = colid2(0, mv1 And 1, mv2 And 1)
  471. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  472. If X > -4 And X < 157 Then Vram(X + 3, curline) = colid2(0, mv1 And 1, mv2 And 1)
  473. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  474. If X > -3 And X < 158 Then Vram(X + 2, curline) = colid2(0, mv1 And 1, mv2 And 1)
  475. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  476. If X > -2 And X < 159 Then Vram(X + 1, curline) = colid2(0, mv1 And 1, mv2 And 1)
  477. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  478. If X > -1 And X < 160 Then Vram(X, curline) = colid2(0, mv1 And 1, mv2 And 1)
  479. tilemap = tilemap + 1
  480. End If
  481. Next X
  482. End If
  483. End Sub
  484. Sub Drawline() 'Using Api and SetBits/StrechBits
  485. curline = RAM(65348, 0)
  486. If curline = lastline Then Exit Sub
  487. lastline = curline
  488. ' Draw Background
  489. ' Get BG & window Tile Pattern Data Address
  490. If RAM(65344, 0) And 16 Then
  491. TileData = 32768
  492. Else
  493. TileData = 34816
  494. End If
  495. If bgv Then
  496. ' Get BG Tile Table Address
  497. If RAM(65344, 0) And 8 Then
  498. tilemap = 39936
  499. tms = 39936
  500. Else
  501. tilemap = 38912
  502. tms = 38912
  503. End If
  504. tileend = tilemap + 1023
  505. xoffset = RAM(65347, 0)
  506. yoffset = RAM(65346, 0) + curline
  507. xs = xoffset \ 8
  508. ys = yoffset \ 8
  509. yoffset = yoffset And 7
  510. xoffset = -(xoffset And 7)
  511. For X = xoffset To 159 Step 8
  512. tiletmp = tilemap + ys * 32 + xs
  513. If tiletmp > tileend Then tiletmp = tiletmp - 1024
  514. If TileData = 32768 Then ' Tile Data @ &H8800-&h97FF is 128ed
  515. tileptr = RAM(tiletmp, 0) * 16 'Get pointer to tile
  516. Else
  517. tileptr = (RAM(tiletmp, 0) Xor 128) * 16
  518. End If
  519. bgat = RAM(tiletmp, 1)
  520. ccp = bgat And 7
  521. tcls(X \ 8) = bgpCC(ccp, 0)
  522. vrm = (bgat And 8) \ 8
  523. xflip = (bgat And 32) \ 32: yflip = (bgat And 64) \ 64
  524. ccid(0, 0) = bgpCC(ccp, 0)
  525. ccid(0, 1) = bgpCC(ccp, 1)
  526. ccid(1, 0) = bgpCC(ccp, 2)
  527. ccid(1, 1) = bgpCC(ccp, 3)
  528. If yflip Then memptr = TileData + tileptr + 14 - (yoffset And 7) * 2 Else memptr = TileData + tileptr + (yoffset And 7) * 2
  529. If xflip Then mv1 = mir(RAM(memptr + 1, vrm)): mv2 = mir(RAM(memptr, vrm)) Else mv1 = RAM(memptr + 1, vrm): mv2 = RAM(memptr, vrm)
  530. xs = (xs + 1) Mod 32
  531. If X > -1 And X < 153 Then
  532. Vram(X + 7, curline) = ccid(mv1 And 1, mv2 And 1)
  533. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  534. Vram(X + 6, curline) = ccid(mv1 And 1, mv2 And 1)
  535. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  536. Vram(X + 5, curline) = ccid(mv1 And 1, mv2 And 1)
  537. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  538. Vram(X + 4, curline) = ccid(mv1 And 1, mv2 And 1)
  539. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  540. Vram(X + 3, curline) = ccid(mv1 And 1, mv2 And 1)
  541. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  542. Vram(X + 2, curline) = ccid(mv1 And 1, mv2 And 1)
  543. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  544. Vram(X + 1, curline) = ccid(mv1 And 1, mv2 And 1)
  545. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  546. Vram(X, curline) = ccid(mv1 And 1, mv2 And 1)
  547. Else
  548. If X < 153 Then Vram(X + 7, curline) = ccid(mv1 And 1, mv2 And 1)
  549. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  550. If X > -7 And X < 154 Then Vram(X + 6, curline) = ccid(mv1 And 1, mv2 And 1)
  551. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  552. If X > -6 And X < 155 Then Vram(X + 5, curline) = ccid(mv1 And 1, mv2 And 1)
  553. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  554. If X > -5 And X < 156 Then Vram(X + 4, curline) = ccid(mv1 And 1, mv2 And 1)
  555. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  556. If X > -4 And X < 157 Then Vram(X + 3, curline) = ccid(mv1 And 1, mv2 And 1)
  557. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  558. If X > -3 And X < 158 Then Vram(X + 2, curline) = ccid(mv1 And 1, mv2 And 1)
  559. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  560. If X > -2 And X < 159 Then Vram(X + 1, curline) = ccid(mv1 And 1, mv2 And 1)
  561. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  562. If X > -1 And X < 160 Then Vram(X, curline) = ccid(mv1 And 1, mv2 And 1)
  563. End If
  564. Next X
  565. End If
  566. 'Draw Sprites
  567. If (RAM(65344, 0) And 2) And objv Then
  568. If (RAM(65344, 0) And 4) = 0 Then
  569. SpriteY = 7
  570. Else
  571. SpriteY = 15
  572. End If
  573. For tilemap = 65180 To 65024 Step -4
  574. Y = RAM(tilemap, 0) - 16
  575. X = RAM(tilemap + 1, 0) - 8
  576. If Y <= curline And Y + SpriteY >= curline And X > -8 And X < 160 Then
  577. If SpriteY = 7 Then tileptr = readM(tilemap + 2) * 16 Else tileptr = (RAM(tilemap + 2, 0) And 254) * 16 'Get pointer to tile
  578. TCol = -((RAM(tilemap + 3, 0) And 128) > 0)
  579. vf = RAM(tilemap + 3, 0) And 32
  580. vrm = (RAM(tilemap + 3, 0) And 8) \ 8
  581. ccp = RAM(tilemap + 3, 0) And 7
  582. 'init palete
  583. ccid(0, 0) = objpCC(ccp, 0)
  584. ccid(0, 1) = objpCC(ccp, 1)
  585. ccid(1, 0) = objpCC(ccp, 2)
  586. ccid(1, 1) = objpCC(ccp, 3)
  587. memptr = 32768 + tileptr
  588. If (RAM(tilemap + 3, 0) And 64) Then memptr = memptr + SpriteY * 2 - (curline - Y) * 2 Else memptr = memptr + (curline - Y) * 2
  589. If vf Then mv1 = mir(RAM(memptr + 1, vrm)): mv2 = mir(RAM(memptr, vrm)) Else mv1 = RAM(memptr + 1, vrm): mv2 = RAM(memptr, vrm)
  590. If TCol = 0 Then
  591. If X < 153 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 7, curline) = ccid(mv1 And 1, mv2 And 1)
  592. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  593. If X > -7 And X < 154 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 6, curline) = ccid(mv1 And 1, mv2 And 1)
  594. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  595. If X > -6 And X < 155 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 5, curline) = ccid(mv1 And 1, mv2 And 1)
  596. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  597. If X > -5 And X < 156 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 4, curline) = ccid(mv1 And 1, mv2 And 1)
  598. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  599. If X > -4 And X < 157 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 3, curline) = ccid(mv1 And 1, mv2 And 1)
  600. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  601. If X > -3 And X < 158 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 2, curline) = ccid(mv1 And 1, mv2 And 1)
  602. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  603. If X > -2 And X < 159 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X + 1, curline) = ccid(mv1 And 1, mv2 And 1)
  604. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  605. If X > -1 Then If colidx(mv1 And 1, mv2 And 1) Then Vram(X, curline) = ccid(mv1 And 1, mv2 And 1)
  606. Else
  607. If X < 153 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X + 7, curline) = tcls((X + 7) \ 8) Then Vram(X + 7, curline) = ccid(mv1 And 1, mv2 And 1)
  608. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  609. If X > -7 And X < 154 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X + 6, curline) = tcls((X + 6) \ 8) Then Vram(X + 6, curline) = ccid(mv1 And 1, mv2 And 1)
  610. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  611. If X > -6 And X < 155 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X + 5, curline) = tcls((X + 5) \ 8) Then Vram(X + 5, curline) = ccid(mv1 And 1, mv2 And 1)
  612. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  613. If X > -5 And X < 156 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X + 4, curline) = tcls((X + 4) \ 8) Then Vram(X + 4, curline) = ccid(mv1 And 1, mv2 And 1)
  614. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  615. If X > -4 And X < 157 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X + 3, curline) = tcls((X + 3) \ 8) Then Vram(X + 3, curline) = ccid(mv1 And 1, mv2 And 1)
  616. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  617. If X > -3 And X < 158 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X + 2, curline) = tcls((X + 2) \ 8) Then Vram(X + 2, curline) = ccid(mv1 And 1, mv2 And 1)
  618. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  619. If X > -2 And X < 159 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X + 1, curline) = tcls((X + 1) \ 8) Then Vram(X + 1, curline) = ccid(mv1 And 1, mv2 And 1)
  620. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  621. If X > -1 Then If colidx(mv1 And 1, mv2 And 1) Then If Vram(X, curline) = tcls(X \ 8) Then Vram(X, curline) = ccid(mv1 And 1, mv2 And 1)
  622. End If
  623. End If
  624. Next tilemap
  625. End If
  626. 'Draw Window
  627. If ((RAM(65344, 0) And 32) = 32) And wv And (curline >= RAM(65354, 0)) And (RAM(65355, 0) < 167) Then
  628. ' Get window Tile Table Address
  629. If RAM(65344, 0) And 64 Then
  630. tilemap = 39936
  631. Else
  632. tilemap = 38912
  633. End If
  634. yoffset = curline - RAM(65354, 0)
  635. tilemap = tilemap + (yoffset \ 8) * 32
  636. yoffset = yoffset And 7
  637. For X = RAM(65355, 0) - 7 To 159 Step 8
  638. If TileData = 32768 Then ' Tile Data @ &H8800-&h97FF is 128ed
  639. tileptr = RAM(tilemap, 0) * 16 'Get pointer to tile
  640. Else
  641. tileptr = (RAM(tilemap, 0) Xor 128) * 16
  642. End If
  643. bgat = RAM(tilemap, 1)
  644. ccp = bgat And 7
  645. vrm = (bgat And 8) \ 8
  646. xflip = (bgat And 32) \ 32: yflip = (bgat And 64) \ 64
  647. ccid(0, 0) = bgpCC(ccp, 0)
  648. ccid(0, 1) = bgpCC(ccp, 1)
  649. ccid(1, 0) = bgpCC(ccp, 2)
  650. ccid(1, 1) = bgpCC(ccp, 3)
  651. If yflip Then memptr = TileData + tileptr + 14 - yoffset * 2 Else memptr = TileData + tileptr + yoffset * 2
  652. If xflip Then mv1 = mir(RAM(memptr + 1, vrm)): mv2 = mir(RAM(memptr, vrm)) Else mv1 = RAM(memptr + 1, vrm): mv2 = RAM(memptr, vrm)
  653. If X > -1 And X < 153 Then
  654. Vram(X + 7, curline) = ccid(mv1 And 1, mv2 And 1)
  655. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  656. Vram(X + 6, curline) = ccid(mv1 And 1, mv2 And 1)
  657. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  658. Vram(X + 5, curline) = ccid(mv1 And 1, mv2 And 1)
  659. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  660. Vram(X + 4, curline) = ccid(mv1 And 1, mv2 And 1)
  661. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  662. Vram(X + 3, curline) = ccid(mv1 And 1, mv2 And 1)
  663. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  664. Vram(X + 2, curline) = ccid(mv1 And 1, mv2 And 1)
  665. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  666. Vram(X + 1, curline) = ccid(mv1 And 1, mv2 And 1)
  667. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  668. Vram(X, curline) = ccid(mv1 And 1, mv2 And 1)
  669. Else
  670. If X < 153 Then Vram(X + 7, curline) = ccid(mv1 And 1, mv2 And 1)
  671. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  672. If X > -7 And X < 154 Then Vram(X + 6, curline) = ccid(mv1 And 1, mv2 And 1)
  673. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  674. If X > -6 And X < 155 Then Vram(X + 5, curline) = ccid(mv1 And 1, mv2 And 1)
  675. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  676. If X > -5 And X < 156 Then Vram(X + 4, curline) = ccid(mv1 And 1, mv2 And 1)
  677. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  678. If X > -4 And X < 157 Then Vram(X + 3, curline) = ccid(mv1 And 1, mv2 And 1)
  679. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  680. If X > -3 And X < 158 Then Vram(X + 2, curline) = ccid(mv1 And 1, mv2 And 1)
  681. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  682. If X > -2 And X < 159 Then Vram(X + 1, curline) = ccid(mv1 And 1, mv2 And 1)
  683. mv1 = mv1 \ 2: mv2 = mv2 \ 2
  684. If X > -1 And X < 160 Then Vram(X, curline) = ccid(mv1 And 1, mv2 And 1)
  685. End If
  686. tilemap = tilemap + 1
  687. Next X
  688. End If
  689. End Sub