vga.pp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401
  1. {$MODE objfpc}
  2. {$ASMMODE intel}
  3. Unit vga;
  4. Interface
  5. Const
  6. {mode types}
  7. FAKEMODE = 0;
  8. RGB332 = 1;
  9. INDEX8 = 2;
  10. {fakemode types}
  11. FAKEMODE1A = 0;
  12. FAKEMODE1B = 1;
  13. FAKEMODE1C = 2;
  14. FAKEMODE2A = 3;
  15. FAKEMODE2B = 4;
  16. FAKEMODE2C = 5;
  17. FAKEMODE3A = 6;
  18. FAKEMODE3B = 7;
  19. FAKEMODE3C = 8;
  20. Var
  21. m_mode_type : Integer;
  22. m_fake_type : Integer;
  23. m_dispoffset : Integer;
  24. Procedure VGASetMode(xres, yres, modetype, faketype : Integer);
  25. Procedure fakemode_load(src : PByte; wvr : Boolean);
  26. Implementation
  27. Uses
  28. go32;
  29. Var
  30. RealRegs : TRealRegs;
  31. Procedure vgamode;
  32. Begin
  33. RealRegs.ax := $13;
  34. realintr($10, RealRegs);
  35. End;
  36. Procedure biostextmode;
  37. Begin
  38. RealRegs.ax := 3;
  39. realintr($10, RealRegs);
  40. End;
  41. Procedure wait_retrace;
  42. Begin
  43. While (inportb($3DA) And 8) <> 0 Do;
  44. While (inportb($3DA) And 8) = 0 Do;
  45. End;
  46. Procedure clearmem(d : DWord); Assembler;
  47. Asm
  48. cld
  49. push es
  50. mov ax, fs
  51. mov es, ax
  52. mov edi, [d]
  53. mov ecx, 2048/4
  54. mov eax, 0
  55. rep stosd
  56. pop es
  57. End;
  58. Procedure clear_memory;
  59. Var
  60. dest : DWord;
  61. strip : Integer;
  62. Begin
  63. wait_retrace;
  64. dest := $A0000;
  65. For strip := 0 To 31 Do
  66. Begin
  67. outportw($3C4, $102);
  68. clearmem(dest);
  69. outportw($3C4, $202);
  70. clearmem(dest);
  71. outportw($3C4, $402);
  72. clearmem(dest);
  73. outportw($3C4, $802);
  74. clearmem(dest);
  75. Inc(dest, 2048);
  76. End;
  77. End;
  78. Procedure palette(data : PDWord);
  79. Var
  80. I : Integer;
  81. C : DWord;
  82. Begin
  83. outportb($3C8, 0);
  84. For I := 0 To 255 Do
  85. Begin
  86. C := (data[I] Shr 2) And $3F3F3F;
  87. outportb($3C9, C Shr 16);
  88. outportb($3C9, C Shr 8);
  89. outportb($3C9, C);
  90. End;
  91. End;
  92. Procedure VGASetMode(xres, yres, modetype, faketype : Integer);
  93. Var
  94. pal : Array[0..255] Of DWord;
  95. I : Integer;
  96. r, g, b : Integer;
  97. z : Integer;
  98. Begin
  99. m_mode_type := modetype;
  100. { set up display offset to centre image on display }
  101. m_dispoffset := ((100 - (yres Shr 1)) * 320) + (160 - (xres Shr 1));
  102. If (faketype < FAKEMODE1A) Or (faketype > FAKEMODE2C) Then
  103. faketype := FAKEMODE2A;
  104. m_fake_type := faketype;
  105. vgamode;
  106. If modetype = FAKEMODE Then
  107. Begin
  108. FillChar(pal, SizeOf(pal), 0);
  109. palette(@pal);
  110. m_dispoffset := 0;
  111. wait_retrace;
  112. If (faketype >= FAKEMODE1A) And (faketype <= FAKEMODE1C) Then
  113. Begin
  114. {FAKEMODE1x - 320x600}
  115. outportb($3D4, $11);
  116. outportb($3D5, inportb($3D5) And $7F);
  117. outportb($3C2, $E7);
  118. outportb($3D4, $00); outportb($3D5, $5F);
  119. outportb($3D4, $01); outportb($3D5, $4F);
  120. outportb($3D4, $02); outportb($3D5, $50);
  121. outportb($3D4, $03); outportb($3D5, $82);
  122. outportb($3D4, $04); outportb($3D5, $54);
  123. outportb($3D4, $05); outportb($3D5, $80);
  124. outportb($3D4, $06); outportb($3D5, $70);
  125. outportb($3D4, $07); outportb($3D5, $F0);
  126. outportb($3D4, $08); outportb($3D5, $00);
  127. outportb($3D4, $09); outportb($3D5, $60);
  128. outportb($3D4, $10); outportb($3D5, $5B);
  129. outportb($3D4, $11); outportb($3D5, $8C);
  130. outportb($3D4, $12); outportb($3D5, $57);
  131. outportb($3D4, $13); outportb($3D5, $28);
  132. outportb($3D4, $14); outportb($3D5, $00);
  133. outportb($3D4, $15); outportb($3D5, $58);
  134. outportb($3D4, $16); outportb($3D5, $70);
  135. outportb($3D4, $17); outportb($3D5, $E3);
  136. outportb($3C4, $01); outportb($3C5, $01);
  137. outportb($3C4, $04); outportb($3C5, $06);
  138. outportb($3CE, $05); outportb($3CF, $40);
  139. outportb($3CE, $06); outportb($3CF, $05);
  140. outportb($3CE, $06); outportb($3CF, $05);
  141. End
  142. Else
  143. Begin
  144. outportb($3D4, $11); outportb($3D5, inportb($3D5) And $7F);
  145. outportb($3C2, $63);
  146. outportb($3D4, $00); outportb($3D5, $5F);
  147. outportb($3D4, $01); outportb($3D5, $4F);
  148. outportb($3D4, $02); outportb($3D5, $50);
  149. outportb($3D4, $03); outportb($3D5, $82);
  150. outportb($3D4, $04); outportb($3D5, $54);
  151. outportb($3D4, $05); outportb($3D5, $80);
  152. outportb($3D4, $06); outportb($3D5, $BF);
  153. outportb($3D4, $07); outportb($3D5, $1F);
  154. outportb($3D4, $08); outportb($3D5, $00);
  155. outportb($3D4, $09); outportb($3D5, $40);
  156. outportb($3D4, $10); outportb($3D5, $9C);
  157. outportb($3D4, $11); outportb($3D5, $8E);
  158. outportb($3D4, $12); outportb($3D5, $8F);
  159. outportb($3D4, $13); outportb($3D5, $28);
  160. outportb($3D4, $14); outportb($3D5, $00);
  161. outportb($3D4, $15); outportb($3D5, $96);
  162. outportb($3D4, $16); outportb($3D5, $B9);
  163. outportb($3D4, $17); outportb($3D5, $E3);
  164. outportb($3C4, $01); outportb($3C5, $01);
  165. outportb($3C4, $04); outportb($3C5, $06);
  166. outportb($3CE, $05); outportb($3CF, $40);
  167. outportb($3CE, $06); outportb($3CF, $05);
  168. outportb($3CE, $06); outportb($3CF, $05);
  169. End;
  170. clear_memory;
  171. If (faketype >= FAKEMODE2A) And (faketype <= FAKEMODE2C) Then
  172. Begin
  173. {FAKEMODE2 palette}
  174. {taken from PTC 0.73}
  175. For I := 0 To $7F Do
  176. Begin
  177. {bit 7 = 0 (top section)}
  178. {red (4 bits)}
  179. r := Round(((I Shr 3) * 255) / 15);
  180. {blue (3 bits)}
  181. b := Round(((I And 7) * 255) / 7);
  182. pal[I] := (r Shl 16) Or b;
  183. End;
  184. For I := $80 To $FF Do
  185. Begin
  186. {bit 7 = 1 (bottom section)}
  187. {green}
  188. g := Round(((I And $1F) * 255) / 31);
  189. pal[I] := g Shl 8;
  190. End;
  191. End
  192. Else
  193. Begin
  194. For I := 0 To 63 Do
  195. Begin
  196. {FAKEMODE(1,3) palette}
  197. z := Round((I * 255) / 63);
  198. pal[I] := z Shl 16;
  199. pal[I + 64] := z Shl 8;
  200. pal[I + 128] := z;
  201. pal[I + 192] := (z Shl 16) Or (z Shl 8) Or z;
  202. End;
  203. End;
  204. palette(@pal);
  205. End
  206. Else
  207. If modetype = RGB332 Then
  208. Begin
  209. For I := 0 To 255 Do
  210. Begin
  211. r := Round(((I Shr 5) * 255) / 7);
  212. g := Round((((I And $1C) Shr 2) * 255) / 7);
  213. b := Round(((I And $03) * 255) / 3);
  214. pal[I] := (r Shl 16) Or (g Shl 8) Or b;
  215. End;
  216. palette(@pal);
  217. End;
  218. End;
  219. Function PlaneBlt1_RGB(src : PByte; dest : DWord; rows : Integer) : DWord;
  220. Var
  221. row, col : Integer;
  222. r, gl, gh, b : DWord;
  223. Begin
  224. For row := 1 To rows Do
  225. Begin
  226. For col := 0 To 19 Do
  227. Begin
  228. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  229. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  230. b := gl;
  231. gl := gl And $E0E0E0E0;
  232. gl := gl Shr 5;
  233. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  234. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  235. r := gh;
  236. gh := gh And $07070707;
  237. gh := gh Shl 3;
  238. b := b And $1F1F1F1F;
  239. b := b Shl 1;
  240. b := b Or $80808080;
  241. r := r And $F8F8F8F8;
  242. r := r Shr 2;
  243. Inc(gl, gh);
  244. gl := gl Or $40404040;
  245. MemL[dest] := r;
  246. MemL[dest + 20*4] := gl;
  247. MemL[dest + 40*4] := b;
  248. Inc(dest, 4);
  249. Inc(src, 4 * 4 * 2);
  250. End;
  251. Inc(dest, 40 * 4);
  252. End;
  253. PlaneBlt1_RGB := dest;
  254. End;
  255. Function PlaneBlt1_RBG(src : PByte; dest : DWord; rows : Integer) : DWord;
  256. Var
  257. row, col : Integer;
  258. r, gl, gh, b : DWord;
  259. Begin
  260. For row := 1 To rows Do
  261. Begin
  262. For col := 0 To 19 Do
  263. Begin
  264. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  265. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  266. b := gl;
  267. gl := gl And $E0E0E0E0;
  268. gl := gl Shr 5;
  269. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  270. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  271. r := gh;
  272. gh := gh And $07070707;
  273. gh := gh Shl 3;
  274. b := b And $1F1F1F1F;
  275. b := b Shl 1;
  276. b := b Or $80808080;
  277. r := r And $F8F8F8F8;
  278. r := r Shr 2;
  279. Inc(gl, gh);
  280. gl := gl Or $40404040;
  281. MemL[dest] := r;
  282. MemL[dest + 20*4] := b;
  283. MemL[dest + 40*4] := gl;
  284. Inc(dest, 4);
  285. Inc(src, 4 * 4 * 2);
  286. End;
  287. Inc(dest, 40 * 4);
  288. End;
  289. PlaneBlt1_RBG := dest;
  290. End;
  291. Function PlaneBlt1_GRB(src : PByte; dest : DWord; rows : Integer) : DWord;
  292. Var
  293. row, col : Integer;
  294. r, gl, gh, b : DWord;
  295. Begin
  296. For row := 1 To rows Do
  297. Begin
  298. For col := 0 To 19 Do
  299. Begin
  300. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  301. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  302. b := gl;
  303. gl := gl And $E0E0E0E0;
  304. gl := gl Shr 5;
  305. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  306. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  307. r := gh;
  308. gh := gh And $07070707;
  309. gh := gh Shl 3;
  310. b := b And $1F1F1F1F;
  311. b := b Shl 1;
  312. b := b Or $80808080;
  313. r := r And $F8F8F8F8;
  314. r := r Shr 2;
  315. Inc(gl, gh);
  316. gl := gl Or $40404040;
  317. MemL[dest] := gl;
  318. MemL[dest + 20*4] := r;
  319. MemL[dest + 40*4] := b;
  320. Inc(dest, 4);
  321. Inc(src, 4 * 4 * 2);
  322. End;
  323. Inc(dest, 40 * 4);
  324. End;
  325. PlaneBlt1_GRB := dest;
  326. End;
  327. Function PlaneBlt2_RBG(src : PByte; dest : DWord; rows : Integer) : DWord;
  328. Var
  329. row, col : Integer;
  330. r, gl, gh, b : DWord;
  331. Begin
  332. For row := 1 To rows Do
  333. Begin
  334. For col := 0 To 19 Do
  335. Begin
  336. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  337. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  338. b := gl;
  339. gl := gl And $C0C0C0C0;
  340. gl := gl Shr 6;
  341. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  342. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  343. r := gh;
  344. gh := gh And $07070707;
  345. gh := gh Shl 2;
  346. b := b And $1C1C1C1C;
  347. b := b Shr 2;
  348. r := r And $F0F0F0F0;
  349. r := r Shr 1;
  350. Inc(r, b);
  351. Inc(gl, gh);
  352. gl := gl Or $80808080;
  353. MemL[dest] := r;
  354. MemL[dest + 20*4] := gl;
  355. Inc(dest, 4);
  356. Inc(src, 4 * 4 * 2);
  357. End;
  358. Inc(dest, 20 * 4);
  359. End;
  360. PlaneBlt2_RBG := dest;
  361. End;
  362. Function PlaneBlt2_GBR(src : PByte; dest : DWord; rows : Integer) : DWord;
  363. Var
  364. row, col : Integer;
  365. r, gl, gh, b : DWord;
  366. Begin
  367. For row := 1 To rows Do
  368. Begin
  369. For col := 0 To 19 Do
  370. Begin
  371. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  372. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  373. b := gl;
  374. gl := gl And $C0C0C0C0;
  375. gl := gl Shr 6;
  376. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  377. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  378. r := gh;
  379. gh := gh And $07070707;
  380. gh := gh Shl 2;
  381. b := b And $1C1C1C1C;
  382. b := b Shr 2;
  383. r := r And $F0F0F0F0;
  384. r := r Shr 1;
  385. Inc(r, b);
  386. Inc(gl, gh);
  387. gl := gl Or $80808080;
  388. MemL[dest] := gl;
  389. MemL[dest + 20*4] := r;
  390. Inc(dest, 4);
  391. Inc(src, 4 * 4 * 2);
  392. End;
  393. Inc(dest, 20 * 4);
  394. End;
  395. PlaneBlt2_GBR := dest;
  396. End;
  397. Function PlaneBlt3_RGBRGB(src : PByte; dest : DWord; rows : Integer) : DWord;
  398. Var
  399. row, col : Integer;
  400. r, gl, gh, b : DWord;
  401. Begin
  402. For row := 1 To rows Do
  403. Begin
  404. For col := 0 To 19 Do
  405. Begin
  406. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  407. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  408. gl := gl And $E0E0E0E0;
  409. gl := gl Shr 5;
  410. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  411. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  412. r := gh;
  413. gh := gh And $07070707;
  414. gh := gh Shl 3;
  415. b := ((src[ 0+(320*2)]) ) Or ((src[ 8+(320*2)]) Shl 8) Or
  416. ((src[16+(320*2)]) Shl 16) Or ((src[24+(320*2)]) Shl 24);
  417. b := b And $1F1F1F1F;
  418. b := b Shl 1;
  419. b := b Or $80808080;
  420. r := r And $F8F8F8F8;
  421. r := r Shr 2;
  422. Inc(gl, gh);
  423. gl := gl Or $40404040;
  424. MemL[dest] := r;
  425. MemL[dest + 20*4] := gl;
  426. MemL[dest + 40*4] := b;
  427. r := ((src[ 1+(320*2)]) ) Or ((src[ 9+(320*2)]) Shl 8) Or
  428. ((src[17+(320*2)]) Shl 16) Or ((src[25+(320*2)]) Shl 24);
  429. r := r And $F8F8F8F8;
  430. r := r Shr 2;
  431. gl := ((src[ 0+(640*2)]) ) Or ((src[ 8+(640*2)]) Shl 8) Or
  432. ((src[16+(640*2)]) Shl 16) Or ((src[24+(640*2)]) Shl 24);
  433. b := gl;
  434. gl := gl And $E0E0E0E0;
  435. gl := gl Shr 5;
  436. gh := ((src[ 1+(640*2)]) ) Or ((src[ 9+(640*2)]) Shl 8) Or
  437. ((src[17+(640*2)]) Shl 16) Or ((src[25+(640*2)]) Shl 24);
  438. gh := gh And $07070707;
  439. gh := gh Shl 3;
  440. b := b And $1F1F1F1F;
  441. b := b Shl 1;
  442. b := b Or $80808080;
  443. Inc(gl, gh);
  444. gl := gl Or $40404040;
  445. MemL[dest + 60*4] := r;
  446. MemL[dest + 80*4] := gl;
  447. MemL[dest + 100*4] := b;
  448. Inc(dest, 4);
  449. Inc(src, 4 * 4 * 2);
  450. End;
  451. Inc(dest, 100 * 4);
  452. Inc(src, 320 * 2 * 2);
  453. End;
  454. PlaneBlt3_RGBRGB := dest;
  455. End;
  456. Function PlaneBlt3_GRBGRB(src : PByte; dest : DWord; rows : Integer) : DWord;
  457. Var
  458. row, col : Integer;
  459. r, gl, gh, b : DWord;
  460. Begin
  461. For row := 1 To rows Do
  462. Begin
  463. For col := 0 To 19 Do
  464. Begin
  465. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  466. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  467. gl := gl And $E0E0E0E0;
  468. gl := gl Shr 5;
  469. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  470. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  471. r := gh;
  472. gh := gh And $07070707;
  473. gh := gh Shl 3;
  474. b := ((src[ 0+(320*2)]) ) Or ((src[ 8+(320*2)]) Shl 8) Or
  475. ((src[16+(320*2)]) Shl 16) Or ((src[24+(320*2)]) Shl 24);
  476. b := b And $1F1F1F1F;
  477. b := b Shl 1;
  478. b := b Or $80808080;
  479. r := r And $F8F8F8F8;
  480. r := r Shr 2;
  481. Inc(gl, gh);
  482. gl := gl Or $40404040;
  483. MemL[dest] := gl;
  484. MemL[dest + 20*4] := r;
  485. MemL[dest + 40*4] := b;
  486. r := ((src[ 1+(320*2)]) ) Or ((src[ 9+(320*2)]) Shl 8) Or
  487. ((src[17+(320*2)]) Shl 16) Or ((src[25+(320*2)]) Shl 24);
  488. r := r And $F8F8F8F8;
  489. r := r Shr 2;
  490. gl := ((src[ 0+(640*2)]) ) Or ((src[ 8+(640*2)]) Shl 8) Or
  491. ((src[16+(640*2)]) Shl 16) Or ((src[24+(640*2)]) Shl 24);
  492. b := gl;
  493. gl := gl And $E0E0E0E0;
  494. gl := gl Shr 5;
  495. gh := ((src[ 1+(640*2)]) ) Or ((src[ 9+(640*2)]) Shl 8) Or
  496. ((src[17+(640*2)]) Shl 16) Or ((src[25+(640*2)]) Shl 24);
  497. gh := gh And $07070707;
  498. gh := gh Shl 3;
  499. b := b And $1F1F1F1F;
  500. b := b Shl 1;
  501. b := b Or $80808080;
  502. Inc(gl, gh);
  503. gl := gl Or $40404040;
  504. MemL[dest + 60*4] := gl;
  505. MemL[dest + 80*4] := r;
  506. MemL[dest + 100*4] := b;
  507. Inc(dest, 4);
  508. Inc(src, 4 * 4 * 2);
  509. End;
  510. Inc(dest, 100 * 4);
  511. Inc(src, 320 * 2 * 2);
  512. End;
  513. PlaneBlt3_GRBGRB := dest;
  514. End;
  515. Function PlaneBlt3_RBGRBG(src : PByte; dest : DWord; rows : Integer) : DWord;
  516. Var
  517. row, col : Integer;
  518. r, gl, gh, b : DWord;
  519. Begin
  520. For row := 1 To rows Do
  521. Begin
  522. For col := 0 To 19 Do
  523. Begin
  524. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  525. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  526. gl := gl And $E0E0E0E0;
  527. gl := gl Shr 5;
  528. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  529. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  530. r := gh;
  531. gh := gh And $07070707;
  532. gh := gh Shl 3;
  533. b := ((src[ 0+(320*2)]) ) Or ((src[ 8+(320*2)]) Shl 8) Or
  534. ((src[16+(320*2)]) Shl 16) Or ((src[24+(320*2)]) Shl 24);
  535. b := b And $1F1F1F1F;
  536. b := b Shl 1;
  537. b := b Or $80808080;
  538. r := r And $F8F8F8F8;
  539. r := r Shr 2;
  540. Inc(gl, gh);
  541. gl := gl Or $40404040;
  542. MemL[dest] := r;
  543. MemL[dest + 20*4] := b;
  544. MemL[dest + 40*4] := gl;
  545. r := ((src[ 1+(320*2)]) ) Or ((src[ 9+(320*2)]) Shl 8) Or
  546. ((src[17+(320*2)]) Shl 16) Or ((src[25+(320*2)]) Shl 24);
  547. r := r And $F8F8F8F8;
  548. r := r Shr 2;
  549. gl := ((src[ 0+(640*2)]) ) Or ((src[ 8+(640*2)]) Shl 8) Or
  550. ((src[16+(640*2)]) Shl 16) Or ((src[24+(640*2)]) Shl 24);
  551. b := gl;
  552. gl := gl And $E0E0E0E0;
  553. gl := gl Shr 5;
  554. gh := ((src[ 1+(640*2)]) ) Or ((src[ 9+(640*2)]) Shl 8) Or
  555. ((src[17+(640*2)]) Shl 16) Or ((src[25+(640*2)]) Shl 24);
  556. gh := gh And $07070707;
  557. gh := gh Shl 3;
  558. b := b And $1F1F1F1F;
  559. b := b Shl 1;
  560. b := b Or $80808080;
  561. Inc(gl, gh);
  562. gl := gl Or $40404040;
  563. MemL[dest + 60*4] := r;
  564. MemL[dest + 80*4] := b;
  565. MemL[dest + 100*4] := gl;
  566. Inc(dest, 4);
  567. Inc(src, 4 * 4 * 2);
  568. End;
  569. Inc(dest, 100 * 4);
  570. Inc(src, 320 * 2 * 2);
  571. End;
  572. PlaneBlt3_RBGRBG := dest;
  573. End;
  574. Function PlaneBlt3_GRBRBG(src : PByte; dest : DWord; rows : Integer) : DWord;
  575. Var
  576. row, col : Integer;
  577. r, gl, gh, b : DWord;
  578. Begin
  579. For row := 1 To rows Do
  580. Begin
  581. For col := 0 To 19 Do
  582. Begin
  583. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  584. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  585. gl := gl And $E0E0E0E0;
  586. gl := gl Shr 5;
  587. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  588. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  589. r := gh;
  590. gh := gh And $07070707;
  591. gh := gh Shl 3;
  592. b := ((src[ 0+(320*2)]) ) Or ((src[ 8+(320*2)]) Shl 8) Or
  593. ((src[16+(320*2)]) Shl 16) Or ((src[24+(320*2)]) Shl 24);
  594. b := b And $1F1F1F1F;
  595. b := b Shl 1;
  596. b := b Or $80808080;
  597. r := r And $F8F8F8F8;
  598. r := r Shr 2;
  599. Inc(gl, gh);
  600. gl := gl Or $40404040;
  601. MemL[dest] := gl;
  602. MemL[dest + 20*4] := r;
  603. MemL[dest + 40*4] := b;
  604. r := ((src[ 1+(320*2)]) ) Or ((src[ 9+(320*2)]) Shl 8) Or
  605. ((src[17+(320*2)]) Shl 16) Or ((src[25+(320*2)]) Shl 24);
  606. r := r And $F8F8F8F8;
  607. r := r Shr 2;
  608. gl := ((src[ 0+(640*2)]) ) Or ((src[ 8+(640*2)]) Shl 8) Or
  609. ((src[16+(640*2)]) Shl 16) Or ((src[24+(640*2)]) Shl 24);
  610. b := gl;
  611. gl := gl And $E0E0E0E0;
  612. gl := gl Shr 5;
  613. gh := ((src[ 1+(640*2)]) ) Or ((src[ 9+(640*2)]) Shl 8) Or
  614. ((src[17+(640*2)]) Shl 16) Or ((src[25+(640*2)]) Shl 24);
  615. gh := gh And $07070707;
  616. gh := gh Shl 3;
  617. b := b And $1F1F1F1F;
  618. b := b Shl 1;
  619. b := b Or $80808080;
  620. Inc(gl, gh);
  621. gl := gl Or $40404040;
  622. MemL[dest + 60*4] := r;
  623. MemL[dest + 80*4] := b;
  624. MemL[dest + 100*4] := gl;
  625. Inc(dest, 4);
  626. Inc(src, 4 * 4 * 2);
  627. End;
  628. Inc(dest, 100 * 4);
  629. Inc(src, 320 * 2 * 2);
  630. End;
  631. PlaneBlt3_GRBRBG := dest;
  632. End;
  633. Function PlaneBlt3_RBGGRB(src : PByte; dest : DWord; rows : Integer) : DWord;
  634. Var
  635. row, col : Integer;
  636. r, gl, gh, b : DWord;
  637. Begin
  638. For row := 1 To rows Do
  639. Begin
  640. For col := 0 To 19 Do
  641. Begin
  642. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  643. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  644. gl := gl And $E0E0E0E0;
  645. gl := gl Shr 5;
  646. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  647. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  648. r := gh;
  649. gh := gh And $07070707;
  650. gh := gh Shl 3;
  651. b := ((src[ 0+(320*2)]) ) Or ((src[ 8+(320*2)]) Shl 8) Or
  652. ((src[16+(320*2)]) Shl 16) Or ((src[24+(320*2)]) Shl 24);
  653. b := b And $1F1F1F1F;
  654. b := b Shl 1;
  655. b := b Or $80808080;
  656. r := r And $F8F8F8F8;
  657. r := r Shr 2;
  658. Inc(gl, gh);
  659. gl := gl Or $40404040;
  660. MemL[dest] := r;
  661. MemL[dest + 20*4] := b;
  662. MemL[dest + 40*4] := gl;
  663. r := ((src[ 1+(320*2)]) ) Or ((src[ 9+(320*2)]) Shl 8) Or
  664. ((src[17+(320*2)]) Shl 16) Or ((src[25+(320*2)]) Shl 24);
  665. r := r And $F8F8F8F8;
  666. r := r Shr 2;
  667. gl := ((src[ 0+(640*2)]) ) Or ((src[ 8+(640*2)]) Shl 8) Or
  668. ((src[16+(640*2)]) Shl 16) Or ((src[24+(640*2)]) Shl 24);
  669. b := gl;
  670. gl := gl And $E0E0E0E0;
  671. gl := gl Shr 5;
  672. gh := ((src[ 1+(640*2)]) ) Or ((src[ 9+(640*2)]) Shl 8) Or
  673. ((src[17+(640*2)]) Shl 16) Or ((src[25+(640*2)]) Shl 24);
  674. gh := gh And $07070707;
  675. gh := gh Shl 3;
  676. b := b And $1F1F1F1F;
  677. b := b Shl 1;
  678. b := b Or $80808080;
  679. Inc(gl, gh);
  680. gl := gl Or $40404040;
  681. MemL[dest + 60*4] := gl;
  682. MemL[dest + 80*4] := r;
  683. MemL[dest + 100*4] := b;
  684. Inc(dest, 4);
  685. Inc(src, 4 * 4 * 2);
  686. End;
  687. Inc(dest, 100 * 4);
  688. Inc(src, 320 * 2 * 2);
  689. End;
  690. PlaneBlt3_RBGGRB := dest;
  691. End;
  692. Function PlaneBlt3_RGBR(src : PByte; dest : DWord; rows : Integer) : DWord;
  693. Var
  694. {row,} col : Integer;
  695. r, gl, gh, b : DWord;
  696. Begin
  697. For col := 0 To 19 Do
  698. Begin
  699. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  700. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  701. gl := gl And $E0E0E0E0;
  702. gl := gl Shr 5;
  703. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  704. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  705. r := gh;
  706. gh := gh And $07070707;
  707. gh := gh Shl 3;
  708. b := ((src[ 0+320*2]) ) Or ((src[ 8+320*2]) Shl 8) Or
  709. ((src[16+320*2]) Shl 16) Or ((src[24+320*2]) Shl 24);
  710. b := b And $1F1F1F1F;
  711. b := b Shl 1;
  712. b := b Or $80808080;
  713. r := r And $F8F8F8F8;
  714. r := r Shr 2;
  715. Inc(gl, gh);
  716. gl := gl Or $40404040;
  717. MemL[dest] := r;
  718. MemL[dest + 20*4] := gl;
  719. MemL[dest + 40*4] := b;
  720. r := ((src[ 1+320*2]) ) Or ((src[ 9+320*2]) Shl 8) Or
  721. ((src[17+320*2]) Shl 16) Or ((src[25+320*2]) Shl 24);
  722. r := r Or $F8F8F8F8;
  723. r := r Shr 2;
  724. MemL[dest + 60*4] := r;
  725. Inc(dest, 4);
  726. Inc(src, 4 * 4 * 2);
  727. End;
  728. PlaneBlt3_RGBR := dest;
  729. End;
  730. Function PlaneBlt3_GRBG(src : PByte; dest : DWord; rows : Integer) : DWord;
  731. Var
  732. {row,} col : Integer;
  733. r, gl, gh, b : DWord;
  734. Begin
  735. For col := 0 To 19 Do
  736. Begin
  737. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  738. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  739. gl := gl And $E0E0E0E0;
  740. gl := gl Shr 5;
  741. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  742. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  743. r := gh;
  744. gh := gh And $07070707;
  745. gh := gh Shl 3;
  746. b := ((src[ 0+320*2]) ) Or ((src[ 8+320*2]) Shl 8) Or
  747. ((src[16+320*2]) Shl 16) Or ((src[24+320*2]) Shl 24);
  748. b := b And $1F1F1F1F;
  749. b := b Shl 1;
  750. b := b Or $80808080;
  751. r := r And $F8F8F8F8;
  752. r := r Shr 2;
  753. Inc(gl, gh);
  754. gl := gl Or $40404040;
  755. MemL[dest] := gl;
  756. MemL[dest + 20*4] := r;
  757. MemL[dest + 40*4] := b;
  758. gl := ((src[ 0+640*2]) ) Or ((src[ 8+640*2]) Shl 8) Or
  759. ((src[16+640*2]) Shl 16) Or ((src[24+640*2]) Shl 24);
  760. gl := gl And $E0E0E0E0;
  761. gl := gl Shr 5;
  762. gh := ((src[ 1+640*2]) ) Or ((src[ 9+640*2]) Shl 8) Or
  763. ((src[17+640*2]) Shl 16) Or ((src[25+640*2]) Shl 24);
  764. gh := gh And $07070707;
  765. gh := gh Shl 3;
  766. Inc(gl, gh);
  767. gl := gl Or $40404040;
  768. MemL[dest + 60*4] := gl;
  769. Inc(dest, 4);
  770. Inc(src, 4 * 4 * 2);
  771. End;
  772. PlaneBlt3_GRBG := dest;
  773. End;
  774. Function PlaneBlt3_RBGR(src : PByte; dest : DWord; rows : Integer) : DWord;
  775. Var
  776. {row,} col : Integer;
  777. r, gl, gh, b : DWord;
  778. Begin
  779. For col := 0 To 19 Do
  780. Begin
  781. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  782. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  783. gl := gl And $E0E0E0E0;
  784. gl := gl Shr 5;
  785. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  786. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  787. r := gh;
  788. gh := gh And $07070707;
  789. gh := gh Shl 3;
  790. b := ((src[ 0+320*2]) ) Or ((src[ 8+320*2]) Shl 8) Or
  791. ((src[16+320*2]) Shl 16) Or ((src[24+320*2]) Shl 24);
  792. b := b And $1F1F1F1F;
  793. b := b Shl 1;
  794. b := b Or $80808080;
  795. r := r And $F8F8F8F8;
  796. r := r Shr 2;
  797. Inc(gl, gh);
  798. gl := gl Or $40404040;
  799. MemL[dest] := r;
  800. MemL[dest + 20*4] := b;
  801. MemL[dest + 40*4] := gl;
  802. r := ((src[ 1+320*2]) ) Or ((src[ 9+320*2]) Shl 8) Or
  803. ((src[17+320*2]) Shl 16) Or ((src[25+320*2]) Shl 24);
  804. r := r Or $F8F8F8F8;
  805. r := r Shr 2;
  806. MemL[dest + 60*4] := r;
  807. Inc(dest, 4);
  808. Inc(src, 4 * 4 * 2);
  809. End;
  810. PlaneBlt3_RBGR := dest;
  811. End;
  812. Function PlaneBlt3_GRBR(src : PByte; dest : DWord; rows : Integer) : DWord;
  813. Var
  814. {row,} col : Integer;
  815. r, gl, gh, b : DWord;
  816. Begin
  817. For col := 0 To 19 Do
  818. Begin
  819. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  820. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  821. gl := gl And $E0E0E0E0;
  822. gl := gl Shr 5;
  823. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  824. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  825. r := gh;
  826. gh := gh And $07070707;
  827. gh := gh Shl 3;
  828. b := ((src[ 0+320*2]) ) Or ((src[ 8+320*2]) Shl 8) Or
  829. ((src[16+320*2]) Shl 16) Or ((src[24+320*2]) Shl 24);
  830. b := b And $1F1F1F1F;
  831. b := b Shl 1;
  832. b := b Or $80808080;
  833. r := r And $F8F8F8F8;
  834. r := r Shr 2;
  835. Inc(gl, gh);
  836. gl := gl Or $40404040;
  837. MemL[dest] := gl;
  838. MemL[dest + 20*4] := r;
  839. MemL[dest + 40*4] := b;
  840. r := ((src[ 1+320*2]) ) Or ((src[ 9+320*2]) Shl 8) Or
  841. ((src[17+320*2]) Shl 16) Or ((src[25+320*2]) Shl 24);
  842. r := r Or $F8F8F8F8;
  843. r := r Shr 2;
  844. MemL[dest + 60*4] := r;
  845. Inc(dest, 4);
  846. Inc(src, 4 * 4 * 2);
  847. End;
  848. PlaneBlt3_GRBR := dest;
  849. End;
  850. Function PlaneBlt3_RBGG(src : PByte; dest : DWord; rows : Integer) : DWord;
  851. Var
  852. {row,} col : Integer;
  853. r, gl, gh, b : DWord;
  854. Begin
  855. For col := 0 To 19 Do
  856. Begin
  857. gl := ((src[ 0]) ) Or ((src[ 8]) Shl 8) Or
  858. ((src[16]) Shl 16) Or ((src[24]) Shl 24);
  859. gl := gl And $E0E0E0E0;
  860. gl := gl Shr 5;
  861. gh := ((src[ 1]) ) Or ((src[ 9]) Shl 8) Or
  862. ((src[17]) Shl 16) Or ((src[25]) Shl 24);
  863. r := gh;
  864. gh := gh And $07070707;
  865. gh := gh Shl 3;
  866. b := ((src[ 0+320*2]) ) Or ((src[ 8+320*2]) Shl 8) Or
  867. ((src[16+320*2]) Shl 16) Or ((src[24+320*2]) Shl 24);
  868. b := b And $1F1F1F1F;
  869. b := b Shl 1;
  870. b := b Or $80808080;
  871. r := r And $F8F8F8F8;
  872. r := r Shr 2;
  873. Inc(gl, gh);
  874. gl := gl Or $40404040;
  875. MemL[dest] := r;
  876. MemL[dest + 20*4] := b;
  877. MemL[dest + 40*4] := gl;
  878. gl := ((src[ 0+640*2]) ) Or ((src[ 8+640*2]) Shl 8) Or
  879. ((src[16+640*2]) Shl 16) Or ((src[24+640*2]) Shl 24);
  880. gl := gl And $E0E0E0E0;
  881. gl := gl Shr 5;
  882. gh := ((src[ 1+640*2]) ) Or ((src[ 9+640*2]) Shl 8) Or
  883. ((src[17+640*2]) Shl 16) Or ((src[25+640*2]) Shl 24);
  884. gh := gh And $07070707;
  885. gh := gh Shl 3;
  886. Inc(gl, gh);
  887. gl := gl Or $40404040;
  888. MemL[dest + 60*4] := gl;
  889. Inc(dest, 4);
  890. Inc(src, 4 * 4 * 2);
  891. End;
  892. PlaneBlt3_RBGG := dest;
  893. End;
  894. Procedure fakemode_load(src : PByte; wvr : Boolean);
  895. Var
  896. dest, d : DWord;
  897. w, s : Integer;
  898. Begin
  899. dest := $A0000;
  900. Case m_fake_type Of
  901. FAKEMODE1A :
  902. For w := 0 To 24 Do
  903. Begin
  904. {plane 0}
  905. outportw($3C4, $102);
  906. PlaneBlt1_RGB(src + 0, dest, 8);
  907. {plane 1}
  908. outportw($3C4, $202);
  909. PlaneBlt1_RGB(src + 2, dest, 8);
  910. {plane 2}
  911. outportw($3C4, $402);
  912. PlaneBlt1_RGB(src + 4, dest, 8);
  913. {plane 3}
  914. outportw($3C4, $802);
  915. dest := PlaneBlt1_RGB(src + 6, dest, 8);
  916. Inc(src, 320 * 4 * 4);
  917. End;
  918. FAKEMODE1B :
  919. For w := 0 To 24 Do
  920. Begin
  921. {plane 0}
  922. outportw($3C4, $102);
  923. d := PlaneBlt1_RBG(src + (4*4*2*20*0), dest, 1);
  924. d := PlaneBlt1_GRB(src + (4*4*2*20*1), d, 1);
  925. d := PlaneBlt1_RBG(src + (4*4*2*20*2), d, 1);
  926. d := PlaneBlt1_GRB(src + (4*4*2*20*3), d, 1);
  927. d := PlaneBlt1_RBG(src + (4*4*2*20*4), d, 1);
  928. d := PlaneBlt1_GRB(src + (4*4*2*20*5), d, 1);
  929. d := PlaneBlt1_RBG(src + (4*4*2*20*6), d, 1);
  930. d := PlaneBlt1_GRB(src + (4*4*2*20*7), d, 1);
  931. {plane 1}
  932. outportw($3C4, $202);
  933. d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*0), dest, 1);
  934. d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*1), d, 1);
  935. d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*2), d, 1);
  936. d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*3), d, 1);
  937. d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*4), d, 1);
  938. d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*5), d, 1);
  939. d := PlaneBlt1_GRB(src + 2 + (4*4*2*20*6), d, 1);
  940. d := PlaneBlt1_RBG(src + 2 + (4*4*2*20*7), d, 1);
  941. {plane 2}
  942. outportw($3C4, $402);
  943. d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*0), dest, 1);
  944. d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*1), d, 1);
  945. d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*2), d, 1);
  946. d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*3), d, 1);
  947. d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*4), d, 1);
  948. d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*5), d, 1);
  949. d := PlaneBlt1_RBG(src + 4 + (4*4*2*20*6), d, 1);
  950. d := PlaneBlt1_GRB(src + 4 + (4*4*2*20*7), d, 1);
  951. {plane 3}
  952. outportw($3C4, $802);
  953. d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*0), dest, 1);
  954. d := PlaneBlt1_RBG(src + 6 + (4*4*2*20*1), d, 1);
  955. d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*2), d, 1);
  956. d := PlaneBlt1_RBG(src + 6 + (4*4*2*20*3), d, 1);
  957. d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*4), d, 1);
  958. d := PlaneBlt1_RBG(src + 6 + (4*4*2*20*5), d, 1);
  959. d := PlaneBlt1_GRB(src + 6 + (4*4*2*20*6), d, 1);
  960. dest := PlaneBlt1_RBG(src + 6 + (4*4*2*20*7), d, 1);
  961. Inc(src, 320*4*4);
  962. End;
  963. FAKEMODE1C :
  964. For w := 0 To 24 Do
  965. Begin
  966. {plane 0}
  967. outportw($3C4, $102);
  968. PlaneBlt1_RBG(src + 0, dest, 8);
  969. {plane 1}
  970. outportw($3C4, $202);
  971. PlaneBlt1_GRB(src + 2, dest, 8);
  972. {plane 2}
  973. outportw($3C4, $402);
  974. PlaneBlt1_RBG(src + 4, dest, 8);
  975. {plane 3}
  976. outportw($3C4, $802);
  977. dest := PlaneBlt1_GRB(src + 6, dest, 8);
  978. Inc(src, 320 * 4 * 4);
  979. End;
  980. FAKEMODE2A :
  981. For w := 0 To 24 Do
  982. Begin
  983. {plane 0}
  984. outportw($3C4, $102);
  985. PlaneBlt2_RBG(src + 0, dest, 8);
  986. {plane 1}
  987. outportw($3C4, $202);
  988. PlaneBlt2_RBG(src + 2, dest, 8);
  989. {plane 2}
  990. outportw($3C4, $402);
  991. PlaneBlt2_RBG(src + 4, dest, 8);
  992. {plane 3}
  993. outportw($3C4, $802);
  994. dest := PlaneBlt2_RBG(src + 6, dest, 8);
  995. Inc(src, 320 * 4 * 4);
  996. End;
  997. FAKEMODE2B :
  998. For w := 0 To 24 Do
  999. Begin
  1000. {plane 0}
  1001. outportw($3C4, $102);
  1002. d := PlaneBlt2_RBG(src + (4*4*2*20*0), dest, 1);
  1003. d := PlaneBlt2_GBR(src + (4*4*2*20*1), d, 1);
  1004. d := PlaneBlt2_RBG(src + (4*4*2*20*2), d, 1);
  1005. d := PlaneBlt2_GBR(src + (4*4*2*20*3), d, 1);
  1006. d := PlaneBlt2_RBG(src + (4*4*2*20*4), d, 1);
  1007. d := PlaneBlt2_GBR(src + (4*4*2*20*5), d, 1);
  1008. d := PlaneBlt2_RBG(src + (4*4*2*20*6), d, 1);
  1009. d := PlaneBlt2_GBR(src + (4*4*2*20*7), d, 1);
  1010. {plane 1}
  1011. outportw($3C4, $202);
  1012. d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*0), dest, 1);
  1013. d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*1), d, 1);
  1014. d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*2), d, 1);
  1015. d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*3), d, 1);
  1016. d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*4), d, 1);
  1017. d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*5), d, 1);
  1018. d := PlaneBlt2_GBR(src + 2 + (4*4*2*20*6), d, 1);
  1019. d := PlaneBlt2_RBG(src + 2 + (4*4*2*20*7), d, 1);
  1020. {plane 2}
  1021. outportw($3C4, $402);
  1022. d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*0), dest, 1);
  1023. d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*1), d, 1);
  1024. d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*2), d, 1);
  1025. d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*3), d, 1);
  1026. d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*4), d, 1);
  1027. d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*5), d, 1);
  1028. d := PlaneBlt2_RBG(src + 4 + (4*4*2*20*6), d, 1);
  1029. d := PlaneBlt2_GBR(src + 4 + (4*4*2*20*7), d, 1);
  1030. {plane 3}
  1031. outportw($3C4, $802);
  1032. d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*0), dest, 1);
  1033. d := PlaneBlt2_RBG(src + 6 + (4*4*2*20*1), d, 1);
  1034. d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*2), d, 1);
  1035. d := PlaneBlt2_RBG(src + 6 + (4*4*2*20*3), d, 1);
  1036. d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*4), d, 1);
  1037. d := PlaneBlt2_RBG(src + 6 + (4*4*2*20*5), d, 1);
  1038. d := PlaneBlt2_GBR(src + 6 + (4*4*2*20*6), d, 1);
  1039. dest := PlaneBlt2_RBG(src + 6 + (4*4*2*20*7), d, 1);
  1040. Inc(src, 320*4*4);
  1041. End;
  1042. FAKEMODE2C :
  1043. For w := 0 To 24 Do
  1044. Begin
  1045. {plane 0}
  1046. outportw($3C4, $102);
  1047. PlaneBlt2_RBG(src + 0, dest, 8);
  1048. {plane 1}
  1049. outportw($3C4, $202);
  1050. PlaneBlt2_GBR(src + 2, dest, 8);
  1051. {plane 2}
  1052. outportw($3C4, $402);
  1053. PlaneBlt2_RBG(src + 4, dest, 8);
  1054. {plane 3}
  1055. outportw($3C4, $802);
  1056. dest := PlaneBlt2_GBR(src + 6, dest, 8);
  1057. Inc(src, 320 * 4 * 4);
  1058. End;
  1059. FAKEMODE3A : Begin
  1060. For w := 0 To 15 Do
  1061. Begin
  1062. {plane 0}
  1063. outportw($3C4, $102);
  1064. PlaneBlt3_RGBRGB(src + 0, dest, 4);
  1065. {plane 1}
  1066. outportw($3C4, $202);
  1067. PlaneBlt3_RGBRGB(src + 2, dest, 4);
  1068. {plane 2}
  1069. outportw($3C4, $402);
  1070. PlaneBlt3_RGBRGB(src + 4, dest, 4);
  1071. {plane 3}
  1072. outportw($3C4, $802);
  1073. dest := PlaneBlt3_RGBRGB(src + 6, dest, 4);
  1074. Inc(src, 320 * 4 * 2 * 3);
  1075. End;
  1076. s := (4*4*2*20) + (320*2*2*2);
  1077. outportw($3C4, $102);
  1078. d := PlaneBlt3_RGBRGB(src, dest, 2);
  1079. PlaneBlt3_RGBR(src + s, d, 1);
  1080. outportw($3C4, $202);
  1081. d := PlaneBlt3_RGBRGB(src + 2, dest, 2);
  1082. PlaneBlt3_RGBR(src + s + 2, d, 1);
  1083. outportw($3C4, $402);
  1084. d := PlaneBlt3_RGBRGB(src + 4, dest, 2);
  1085. PlaneBlt3_RGBR(src + s + 4, d, 1);
  1086. outportw($3C4, $802);
  1087. d := PlaneBlt3_RGBRGB(src + 6, dest, 2);
  1088. PlaneBlt3_RGBR(src + s + 6, d, 1);
  1089. End;
  1090. FAKEMODE3B : Begin
  1091. For w := 0 To 15 Do
  1092. Begin
  1093. {plane 0}
  1094. outportw($3C4, $102);
  1095. PlaneBlt3_GRBRBG(src + 0, dest, 4);
  1096. {plane 1}
  1097. outportw($3C4, $202);
  1098. PlaneBlt3_RBGGRB(src + 2, dest, 4);
  1099. {plane 2}
  1100. outportw($3C4, $402);
  1101. PlaneBlt3_GRBRBG(src + 4, dest, 4);
  1102. {plane 3}
  1103. outportw($3C4, $802);
  1104. dest := PlaneBlt3_RBGGRB(src + 6, dest, 4);
  1105. Inc(src, 320 * 4 * 2 * 3);
  1106. End;
  1107. s := (4*4*2*20) + (320*2*2*2);
  1108. outportw($3C4, $102);
  1109. d := PlaneBlt3_GRBRBG(src, dest, 2);
  1110. PlaneBlt3_GRBR(src + s, d, 1);
  1111. outportw($3C4, $202);
  1112. d := PlaneBlt3_RBGGRB(src + 2, dest, 2);
  1113. PlaneBlt3_RBGG(src + s + 2, d, 1);
  1114. outportw($3C4, $402);
  1115. d := PlaneBlt3_GRBRBG(src + 4, dest, 2);
  1116. PlaneBlt3_GRBR(src + s + 4, d, 1);
  1117. outportw($3C4, $802);
  1118. d := PlaneBlt3_RBGGRB(src + 6, dest, 2);
  1119. PlaneBlt3_RBGG(src + s + 6, d, 1);
  1120. End;
  1121. FAKEMODE3C : Begin
  1122. For w := 0 To 15 Do
  1123. Begin
  1124. {plane 0}
  1125. outportw($3C4, $102);
  1126. PlaneBlt3_GRBGRB(src + 0, dest, 4);
  1127. {plane 1}
  1128. outportw($3C4, $202);
  1129. PlaneBlt3_RBGRBG(src + 2, dest, 4);
  1130. {plane 2}
  1131. outportw($3C4, $402);
  1132. PlaneBlt3_GRBGRB(src + 4, dest, 4);
  1133. {plane 3}
  1134. outportw($3C4, $802);
  1135. dest := PlaneBlt3_RBGRBG(src + 6, dest, 4);
  1136. Inc(src, 320 * 4 * 2 * 3);
  1137. End;
  1138. s := (4*4*2*20) + (320*2*2*2);
  1139. outportw($3C4, $102);
  1140. d := PlaneBlt3_GRBGRB(src, dest, 2);
  1141. PlaneBlt3_GRBG(src + s, d, 1);
  1142. outportw($3C4, $202);
  1143. d := PlaneBlt3_RBGRBG(src + 2, dest, 2);
  1144. PlaneBlt3_RBGR(src + s + 2, d, 1);
  1145. outportw($3C4, $402);
  1146. d := PlaneBlt3_GRBGRB(src + 4, dest, 2);
  1147. PlaneBlt3_GRBG(src + s + 4, d, 1);
  1148. outportw($3C4, $802);
  1149. d := PlaneBlt3_RBGRBG(src + 6, dest, 2);
  1150. PlaneBlt3_RBGR(src + s + 6, d, 1);
  1151. End;
  1152. End;
  1153. If wvr Then
  1154. wait_retrace;
  1155. End;
  1156. End.