WINASM.ASM 16 KB

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