WINASM.ASM 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  1. ;
  2. ; Copyright 2020 Electronic Arts Inc.
  3. ;
  4. ; TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
  5. ; software: you can redistribute it and/or modify it under the terms of
  6. ; the GNU General Public License as published by the Free Software Foundation,
  7. ; either version 3 of the License, or (at your option) any later version.
  8. ; TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
  9. ; in the hope that it will be useful, but with permitted additional restrictions
  10. ; under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
  11. ; distributed with this program. You should have received a copy of the
  12. ; GNU General Public License along with permitted additional restrictions
  13. ; with this program. If not, see [https://github.com/electronicarts/CnC_Remastered_Collection]>.
  14. ;***************************************************************************
  15. ;** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S I N C **
  16. ;***************************************************************************
  17. ;* *
  18. ;* Project Name : Command & Conquer *
  19. ;* *
  20. ;* File Name : WINSAM.ASM *
  21. ;* *
  22. ;* Programmer : Steve Tall *
  23. ;* *
  24. ;* Start Date : October 26th, 1995 *
  25. ;* *
  26. ;* Last Update : October 26th, 1995 [ST] *
  27. ;* *
  28. ;*-------------------------------------------------------------------------*
  29. ;* Functions: *
  30. ;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
  31. IDEAL
  32. P386
  33. MODEL USE32 FLAT
  34. global C _AbortModemFunctionPtr:dword
  35. global C Memory_Error_Exit :dword
  36. global C MouseQX :dword
  37. global C MouseQY :dword
  38. global FastGetPortHardware_ :near
  39. global FastSetPortHardware_ :near
  40. global PortOpenGreenleafFast_ :near
  41. global HMWaitForOK_ :near
  42. global HMSetDialingMethod_ :near
  43. global HMDial_ :near
  44. global HMInputLine_ :near
  45. global HMAnswer_ :near
  46. global PortKillTime_ :near
  47. global HMSendStringNoWait_ :near
  48. global HMSetUpEchoRoutine_ :near
  49. global HMSetUpAbortKey_ :near
  50. global SetAbortModemFunctionPtr_:near
  51. global Change8259Priority_ :near
  52. global HMSendString_ :near
  53. global C Stop_Execution :near
  54. global _IPX_Initialise:near
  55. global _ASM_IPX_Initialise:near
  56. codeseg
  57. proc _ASM_IPX_Initialise near
  58. int 3
  59. jmp _IPX_Initialise
  60. endp
  61. global _Int3:near
  62. proc _Int3 near
  63. ;int 3
  64. ret
  65. endp
  66. proc Stop_Execution C near
  67. nop
  68. ret
  69. endp
  70. ;
  71. ; Stuff needed from the shape library
  72. ;
  73. ;
  74. ;
  75. INCLUDE "shape.inc"
  76. ;***************************************************************************
  77. ;* ModeX_Blit -- Copy a 320x200 graphic view port to a modex screen *
  78. ;* *
  79. ;* *
  80. ;* INPUT: eax - graphic view port *
  81. ;* *
  82. ;* OUTPUT: none *
  83. ;* *
  84. ;* PROTO: extern "C" void ModeX_Blit (GraphicBufferClass *source); *
  85. ;* *
  86. ;* HISTORY: *
  87. ;* 10/26/1994 PWG : Created. *
  88. ;*=========================================================================*
  89. SEQUENCER =3c4h ; sequencer port
  90. MAP_MASK =2 ; map mask register
  91. INCLUDE "gbuffer.inc"
  92. global ModeX_Blit_:near
  93. proc ModeX_Blit_ NEAR
  94. pushad
  95. mov ebx,eax
  96. mov esi,[(GraphicViewPort ebx).GVPOffset]
  97. mov eax,[(GraphicViewPort ebx).GVPXAdd]
  98. add eax,[(GraphicViewPort ebx).GVPPitch]
  99. mov edi,0a0000h
  100. mov ebx,eax
  101. mov al,MAP_MASK
  102. mov ebp,200
  103. ??each_line_lp: mov ah,1 ;1st plane
  104. push ebx
  105. push esi
  106. ??each_plane_lp:mov edx,SEQUENCER
  107. out dx,ax
  108. push esi
  109. push edi
  110. push eax
  111. rept 10
  112. mov al,[esi]
  113. mov bl,[esi+8]
  114. mov cl,[esi+16]
  115. mov dl,[esi+24]
  116. mov ah,[esi+4]
  117. mov bh,[esi+12]
  118. mov ch,[esi+20]
  119. mov dh,[esi+28]
  120. shl ebx,16
  121. shl edx,16
  122. or ebx,eax
  123. or edx,ecx
  124. mov [edi],ebx
  125. mov [edi+4],edx
  126. add esi,32
  127. add edi,8
  128. endm
  129. pop eax
  130. pop edi
  131. pop esi
  132. inc esi
  133. shl ah,1
  134. cmp ah,16
  135. jl ??each_plane_lp
  136. pop esi
  137. pop ebx
  138. lea esi,[esi+ebx+320]
  139. add edi,80
  140. dec ebp
  141. jnz ??each_line_lp
  142. popad
  143. ret
  144. endp ModeX_Blit_
  145. ifdef cuts
  146. pushad
  147. mov ebx,eax
  148. mov esi,[(GraphicViewPort ebx).GVPOffset]
  149. mov eax,[(GraphicViewPort ebx).GVPXAdd]
  150. add eax,[(GraphicViewPort ebx).GVPPitch]
  151. mov edi,0a0000h
  152. mov ebx,eax
  153. mov al,MAP_MASK
  154. mov ah,1 ;1st plane
  155. ??each_plane_lp:mov edx,SEQUENCER
  156. out dx,ax
  157. mov ebp,200 ;do 200 lines
  158. push esi
  159. push edi
  160. ??each_line_lp: mov ecx,320/4
  161. ??each_pixel_lp:mov dl,[esi]
  162. mov [edi],dl
  163. add esi,4
  164. inc edi
  165. dec ecx
  166. jnz ??each_pixel_lp
  167. add esi,ebx
  168. dec ebp
  169. jnz ??each_line_lp
  170. pop edi
  171. pop esi
  172. inc esi
  173. shl ah,1
  174. cmp ah,16
  175. jl ??each_plane_lp
  176. endif
  177. proc FastGetPortHardware_ NEAR
  178. endp
  179. proc FastSetPortHardware_ NEAR
  180. endp
  181. proc PortOpenGreenleafFast_ NEAR
  182. endp
  183. proc HMWaitForOK_ NEAR
  184. endp
  185. proc HMSetDialingMethod_ NEAR
  186. endp
  187. proc HMDial_ NEAR
  188. endp
  189. proc HMInputLine_ NEAR
  190. endp
  191. proc HMAnswer_ NEAR
  192. endp
  193. proc PortKillTime_ NEAR
  194. endp
  195. proc HMSendStringNoWait_ NEAR
  196. endp
  197. proc HMSetUpEchoRoutine_ NEAR
  198. endp
  199. proc HMSetUpAbortKey_ NEAR
  200. endp
  201. proc SetAbortModemFunctionPtr_ NEAR
  202. endp
  203. proc Change8259Priority_ NEAR
  204. endp
  205. proc HMSendString_ NEAR
  206. endp
  207. ret
  208. masm
  209. ;
  210. ; Change a DAC colour register directly
  211. ;
  212. ; register number in al
  213. ;
  214. ; bh=red bl=green cl=blue
  215. ;
  216. set_dac_col proc near
  217. pushad
  218. cli
  219. push eax
  220. mov dx,03dah
  221. in al,dx
  222. jmp @@1
  223. @@1: mov dx,03c8h
  224. pop eax
  225. out dx,al
  226. jmp @@2
  227. @@2: inc dl
  228. mov al,bh
  229. out dx,al
  230. jmp @@3
  231. @@3: mov al,bl
  232. out dx,al
  233. jmp @@4
  234. @@4: mov al,cl
  235. out dx,al
  236. jmp @@5
  237. @@5: sti
  238. popad
  239. ret
  240. set_dac_col endp
  241. ideal
  242. global Set_Palette_Register_:near
  243. proc Set_Palette_Register_ near
  244. pushad
  245. and cl,63
  246. mov bh,dl
  247. and bh,63
  248. and bl,63
  249. call set_dac_col
  250. popad
  251. ret
  252. endp Set_Palette_Register_
  253. locals ??
  254. ends
  255. dataseg
  256. LineBuffer dd 640 dup (?)
  257. ends
  258. segment mycode page public use32 'code' ; Need stricter segment alignment
  259. global C Asm_Interpolate:near
  260. global C Asm_Interpolate_Line_Double:near
  261. global C Asm_Interpolate_Line_Interpolate:near
  262. global C PaletteInterpolationTable:byte
  263. ;*********************************************************************************************
  264. ;* Asm_Interpolate -- interpolate a 320x200 buffer to a 640x400 screen *
  265. ;* *
  266. ;* INPUT: ptr to source buffer (320x200 image) *
  267. ;* ptr to dest buffer (640x400) *
  268. ;* height of source buffer *
  269. ;* width of source buffer *
  270. ;* width of dest buffer *
  271. ;* *
  272. ;* *
  273. ;* OUTPUT: none *
  274. ;* *
  275. ;* Warnings: *
  276. ;* *
  277. ;* HISTORY: *
  278. ;* 12/15/95 ST : Created. *
  279. ;*===========================================================================================*
  280. PROC Asm_Interpolate C near
  281. ARG src_ptr:dword
  282. ARG dest_ptr:dword
  283. ARG source_height:dword
  284. ARG source_width:dword
  285. ARG dest_width:dword
  286. LOCAL old_dest:dword
  287. pushad
  288. mov eax,[dest_ptr]
  289. mov [old_dest],eax
  290. mov esi,[src_ptr]
  291. ??each_line_loop:
  292. mov ecx,[source_width]
  293. sub ecx,2
  294. shr ecx,1
  295. mov edi,[old_dest]
  296. jmp ??interpolate_loop
  297. align 32
  298. ;
  299. ; convert 2 pixels of source into 4 pixels of destination
  300. ; so we can write to video memory with dwords
  301. ;
  302. ??interpolate_loop:
  303. mov eax,[esi]
  304. lea esi,[esi+2]
  305. mov edx,eax
  306. mov ebx,eax
  307. and edx,65535
  308. ror ebx,8
  309. mov bl,[edx+PaletteInterpolationTable]
  310. mov bh,ah
  311. and eax,000ffff00h
  312. ror ebx,8
  313. ;1st 3 pixels now in ebx
  314. shr eax,8
  315. mov bh,[eax+PaletteInterpolationTable]
  316. ror ebx,16
  317. mov [edi],ebx
  318. add edi,4
  319. dec ecx
  320. jnz ??interpolate_loop
  321. ; do the last three pixels and a blank on the end of a row
  322. xor eax,eax
  323. mov ax,[esi]
  324. mov [edi],al
  325. inc edi
  326. lea esi,[esi+2]
  327. mov al,[eax+PaletteInterpolationTable]
  328. mov [edi],al
  329. inc edi
  330. mov [edi],ah
  331. inc edi
  332. mov [byte edi],0
  333. mov edi,[dest_width]
  334. add [old_dest],edi
  335. dec [source_height]
  336. jnz ??each_line_loop
  337. popad
  338. ret
  339. endp Asm_Interpolate
  340. PROC Asm_Interpolate_Line_Double C near
  341. ARG src_ptr:dword
  342. ARG dest_ptr:dword
  343. ARG source_height:dword
  344. ARG source_width:dword
  345. ARG dest_width:dword
  346. LOCAL old_dest:dword
  347. LOCAL width_counter:dword
  348. LOCAL pixel_count:dword
  349. pushad
  350. mov eax,[dest_ptr]
  351. mov [old_dest],eax
  352. mov esi,[src_ptr]
  353. mov edi,[dest_ptr]
  354. ??each_line_loop:
  355. mov [width_counter],0
  356. mov ecx,[source_width]
  357. sub ecx,2
  358. shr ecx,1
  359. mov [pixel_count],ecx
  360. mov ecx,offset LineBuffer
  361. mov edi,[old_dest]
  362. jmp ??interpolate_loop
  363. align 16
  364. ; convert 2 pixels of source into 4 pixels of destination
  365. ??interpolate_loop:
  366. mov eax,[esi]
  367. lea esi,[esi+2]
  368. mov edx,eax
  369. mov ebx,eax
  370. and edx,65535
  371. ror ebx,8
  372. mov bl,[edx+PaletteInterpolationTable]
  373. mov bh,ah
  374. and eax,000ffff00h
  375. ror ebx,8
  376. ;1st 3 pixels now in ebx
  377. shr eax,8
  378. mov bh,[eax+PaletteInterpolationTable]
  379. ror ebx,16
  380. mov [edi],ebx
  381. mov [ecx],ebx
  382. add edi,4
  383. add ecx,4
  384. dec [pixel_count]
  385. jnz ??interpolate_loop
  386. ; do the last three pixels and a blank
  387. xor eax,eax
  388. mov ax,[esi]
  389. mov [edi],al
  390. mov [ecx],al
  391. inc edi
  392. inc ecx
  393. lea esi,[esi+2]
  394. mov al,[eax+PaletteInterpolationTable]
  395. mov [edi],al
  396. mov [ecx],al
  397. inc edi
  398. inc ecx
  399. mov [edi],ah
  400. mov [ecx],ah
  401. inc edi
  402. inc ecx
  403. mov [byte edi],0
  404. mov [byte ecx],0
  405. mov edi,[dest_width]
  406. shr edi,1
  407. add [old_dest],edi
  408. push esi
  409. push edi
  410. mov esi,offset LineBuffer
  411. mov edi,[old_dest]
  412. mov ecx,[source_width]
  413. shr ecx,1
  414. rep movsd
  415. pop edi
  416. pop esi
  417. add [old_dest],edi
  418. mov edi,[old_dest]
  419. dec [source_height]
  420. jnz ??each_line_loop
  421. popad
  422. ret
  423. endp Asm_Interpolate_Line_Double
  424. ends
  425. dataseg
  426. TopLine dd 640 dup (?)
  427. BottomLine dd 640 dup (?)
  428. segment mycode page public use32 'code' ; Need stricter segment alignment
  429. proc Interpolate_Single_Line C near
  430. ARG source_ptr:dword
  431. ARG dest_ptr:dword
  432. ARG source_width:dword
  433. pushad
  434. mov ecx,[source_width]
  435. sub ecx,2
  436. shr ecx,1
  437. mov esi,[source_ptr]
  438. mov edi,[dest_ptr]
  439. ??interpolate_loop:
  440. mov eax,[esi]
  441. lea esi,[esi+2]
  442. mov edx,eax
  443. mov ebx,eax
  444. and edx,65535
  445. ror ebx,8
  446. mov bl,[edx+PaletteInterpolationTable]
  447. mov bh,ah
  448. and eax,000ffff00h
  449. ror ebx,8
  450. ;1st 3 pixels now in ebx
  451. shr eax,8
  452. mov bh,[eax+PaletteInterpolationTable]
  453. ror ebx,16
  454. mov [edi],ebx
  455. add edi,4
  456. dec ecx
  457. jnz ??interpolate_loop
  458. ; do the last three pixels and a blank
  459. xor eax,eax
  460. mov ax,[esi]
  461. mov [edi],al
  462. inc edi
  463. mov al,[eax+PaletteInterpolationTable]
  464. mov [edi],al
  465. inc edi
  466. mov [edi],ah
  467. inc edi
  468. mov [byte edi],0
  469. popad
  470. ret
  471. endp Interpolate_Single_Line
  472. proc Interpolate_Between_Lines C near
  473. ARG source1:dword
  474. ARG source2:dword
  475. ARG destination:dword
  476. ARG source_width:dword
  477. pushad
  478. mov esi,[source1]
  479. mov edi,[destination]
  480. mov ebx,[source2]
  481. xor eax,eax
  482. mov ecx,[source_width]
  483. add ecx,ecx
  484. ??interpolate_each_pixel_loop:
  485. mov al,[esi]
  486. mov ah,[ebx]
  487. inc esi
  488. inc ebx
  489. mov dl,[eax+PaletteInterpolationTable]
  490. mov [edi],dl
  491. inc edi
  492. dec ecx
  493. jnz ??interpolate_each_pixel_loop
  494. popad
  495. ret
  496. endp Interpolate_Between_Lines
  497. macro Lineswp
  498. push [next_line]
  499. push [last_line]
  500. pop [next_line]
  501. pop [last_line]
  502. endm
  503. PROC Asm_Interpolate_Line_Interpolate C near
  504. ARG src_ptr:dword
  505. ARG dest_ptr:dword
  506. ARG source_lines:dword
  507. ARG source_width:dword
  508. ARG dest_width:dword
  509. LOCAL old_dest:dword
  510. LOCAL pixel_count:dword
  511. LOCAL next_line:dword
  512. LOCAL last_line:dword
  513. pushad
  514. mov eax,[dest_ptr]
  515. mov [old_dest],eax
  516. mov [next_line],offset TopLine
  517. mov [last_line],offset BottomLine
  518. mov ecx,[source_width]
  519. shr ecx,1
  520. mov [pixel_count],ecx
  521. shr [dest_width],1
  522. call Interpolate_Single_Line C,[src_ptr],[next_line],[source_width]
  523. mov esi,[source_width]
  524. Lineswp
  525. add [src_ptr],esi
  526. dec [source_lines]
  527. ??each_line_pair_loop:
  528. call Interpolate_Single_Line C,[src_ptr],[next_line],[source_width]
  529. call Interpolate_Between_Lines C,[last_line],[next_line],offset LineBuffer,[source_width]
  530. mov esi,[last_line]
  531. mov edi,[old_dest]
  532. mov ecx,[pixel_count]
  533. rep movsd
  534. mov edi,[old_dest]
  535. mov esi,offset LineBuffer
  536. add edi,[dest_width]
  537. mov ecx,[pixel_count]
  538. mov [old_dest],edi
  539. rep movsd
  540. mov edi,[old_dest]
  541. mov esi,[source_width]
  542. add edi,[dest_width]
  543. add [src_ptr],esi
  544. mov [old_dest],edi
  545. Lineswp
  546. dec [source_lines]
  547. jnz ??each_line_pair_loop
  548. call Interpolate_Single_Line C,[src_ptr],[next_line],[source_width]
  549. mov esi,[next_line]
  550. mov edi,[old_dest]
  551. mov ecx,[pixel_count]
  552. rep movsd
  553. popad
  554. ret
  555. endp Asm_Interpolate_Line_Interpolate
  556. ends mycode
  557. global C Asm_Create_Palette_Interpolation_Table:near
  558. global C InterpolationPalette:dword
  559. codeseg
  560. proc Asm_Create_Palette_Interpolation_Table C near
  561. LOCAL palette_counter:dword
  562. LOCAL first_palette:dword
  563. LOCAL second_palette:dword
  564. LOCAL dest_ptr:dword
  565. LOCAL count:dword
  566. LOCAL closest_colour:dword
  567. LOCAL distance_of_closest:dword
  568. pushad
  569. mov [dest_ptr],0
  570. mov [palette_counter],256
  571. mov esi,[InterpolationPalette]
  572. ??palette_outer_loop:
  573. mov edi,[InterpolationPalette]
  574. mov ecx,256
  575. ??palette_inner_loop:
  576. mov bl,[esi]
  577. add bl,[edi]
  578. shr bl,1
  579. mov bh,[esi+1]
  580. add bh,[edi+1]
  581. shr bh,1
  582. mov dl,[esi+2]
  583. add dl,[edi+2]
  584. shr dl,1
  585. mov [closest_colour],0
  586. mov [distance_of_closest],-1
  587. push edi
  588. push ecx
  589. mov edi,[InterpolationPalette]
  590. mov [count],0
  591. ??cmp_pal_lp: xor eax,eax
  592. xor ecx,ecx
  593. mov al,[edi]
  594. sub al,bl
  595. imul al
  596. mov ecx,eax
  597. mov al,[edi+1]
  598. sub al,bh
  599. imul al
  600. add ecx,eax
  601. mov al,[edi+2]
  602. sub al,dl
  603. imul al
  604. add ecx,eax
  605. cmp ecx,[distance_of_closest]
  606. ja ??end_cmp_lp
  607. mov [distance_of_closest],ecx
  608. mov eax,[count]
  609. mov [closest_colour],eax
  610. test ecx,ecx
  611. jz ??got_perfect
  612. ??end_cmp_lp: lea edi,[edi+3]
  613. inc [count]
  614. cmp [count],256
  615. jb ??cmp_pal_lp
  616. ??got_perfect: mov edi,[dest_ptr]
  617. mov eax,[closest_colour]
  618. mov [edi+PaletteInterpolationTable],al
  619. inc [dest_ptr]
  620. pop ecx
  621. pop edi
  622. lea edi,[edi+3]
  623. dec ecx
  624. jnz ??palette_inner_loop
  625. lea esi,[esi+3]
  626. dec [palette_counter]
  627. jnz ??palette_outer_loop
  628. popad
  629. ret
  630. endp Asm_Create_Palette_Interpolation_Table
  631. DATASEG
  632. _AbortModemFunctionPtr dd 0
  633. Memory_Error_Exit dd 0
  634. MouseQX dd 0
  635. MouseQY dd 0
  636. end