123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887 |
- ;
- ; Copyright 2020 Electronic Arts Inc.
- ;
- ; TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
- ; software: you can redistribute it and/or modify it under the terms of
- ; the GNU General Public License as published by the Free Software Foundation,
- ; either version 3 of the License, or (at your option) any later version.
- ; TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
- ; in the hope that it will be useful, but with permitted additional restrictions
- ; under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
- ; distributed with this program. You should have received a copy of the
- ; GNU General Public License along with permitted additional restrictions
- ; with this program. If not, see [https://github.com/electronicarts/CnC_Remastered_Collection]>.
- ;***************************************************************************
- ;** 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 **
- ;***************************************************************************
- ;* *
- ;* Project Name : Command & Conquer *
- ;* *
- ;* File Name : WINSAM.ASM *
- ;* *
- ;* Programmer : Steve Tall *
- ;* *
- ;* Start Date : October 26th, 1995 *
- ;* *
- ;* Last Update : October 26th, 1995 [ST] *
- ;* *
- ;*-------------------------------------------------------------------------*
- ;* Functions: *
- ;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
- IDEAL
- P386
- MODEL USE32 FLAT
- global C _AbortModemFunctionPtr:dword
- global C Memory_Error_Exit :dword
- global C MouseQX :dword
- global C MouseQY :dword
- global FastGetPortHardware_ :near
- global FastSetPortHardware_ :near
- global PortOpenGreenleafFast_ :near
- global HMWaitForOK_ :near
- global HMSetDialingMethod_ :near
- global HMDial_ :near
- global HMInputLine_ :near
- global HMAnswer_ :near
- global PortKillTime_ :near
- global HMSendStringNoWait_ :near
- global HMSetUpEchoRoutine_ :near
- global HMSetUpAbortKey_ :near
- global SetAbortModemFunctionPtr_:near
- global Change8259Priority_ :near
- global HMSendString_ :near
- global C Stop_Execution :near
- global _IPX_Initialise:near
- global _ASM_IPX_Initialise:near
- codeseg
- proc _ASM_IPX_Initialise near
- int 3
- jmp _IPX_Initialise
- endp
- global _Int3:near
- proc _Int3 near
- ;int 3
- ret
- endp
- proc Stop_Execution C near
- nop
- ret
- endp
- ;
- ; Stuff needed from the shape library
- ;
- ;
- ;
- INCLUDE "shape.inc"
- ;***************************************************************************
- ;* ModeX_Blit -- Copy a 320x200 graphic view port to a modex screen *
- ;* *
- ;* *
- ;* INPUT: eax - graphic view port *
- ;* *
- ;* OUTPUT: none *
- ;* *
- ;* PROTO: extern "C" void ModeX_Blit (GraphicBufferClass *source); *
- ;* *
- ;* HISTORY: *
- ;* 10/26/1994 PWG : Created. *
- ;*=========================================================================*
- SEQUENCER =3c4h ; sequencer port
- MAP_MASK =2 ; map mask register
- INCLUDE "gbuffer.inc"
- global ModeX_Blit_:near
- proc ModeX_Blit_ NEAR
- pushad
- mov ebx,eax
- mov esi,[(GraphicViewPort ebx).GVPOffset]
- mov eax,[(GraphicViewPort ebx).GVPXAdd]
- add eax,[(GraphicViewPort ebx).GVPPitch]
- mov edi,0a0000h
- mov ebx,eax
- mov al,MAP_MASK
- mov ebp,200
- ??each_line_lp: mov ah,1 ;1st plane
- push ebx
- push esi
- ??each_plane_lp:mov edx,SEQUENCER
- out dx,ax
- push esi
- push edi
- push eax
- rept 10
- mov al,[esi]
- mov bl,[esi+8]
- mov cl,[esi+16]
- mov dl,[esi+24]
- mov ah,[esi+4]
- mov bh,[esi+12]
- mov ch,[esi+20]
- mov dh,[esi+28]
- shl ebx,16
- shl edx,16
- or ebx,eax
- or edx,ecx
- mov [edi],ebx
- mov [edi+4],edx
- add esi,32
- add edi,8
- endm
- pop eax
- pop edi
- pop esi
- inc esi
- shl ah,1
- cmp ah,16
- jl ??each_plane_lp
- pop esi
- pop ebx
- lea esi,[esi+ebx+320]
- add edi,80
- dec ebp
- jnz ??each_line_lp
- popad
- ret
- endp ModeX_Blit_
- ifdef cuts
- pushad
- mov ebx,eax
- mov esi,[(GraphicViewPort ebx).GVPOffset]
- mov eax,[(GraphicViewPort ebx).GVPXAdd]
- add eax,[(GraphicViewPort ebx).GVPPitch]
- mov edi,0a0000h
- mov ebx,eax
- mov al,MAP_MASK
- mov ah,1 ;1st plane
- ??each_plane_lp:mov edx,SEQUENCER
- out dx,ax
- mov ebp,200 ;do 200 lines
- push esi
- push edi
- ??each_line_lp: mov ecx,320/4
- ??each_pixel_lp:mov dl,[esi]
- mov [edi],dl
- add esi,4
- inc edi
- dec ecx
- jnz ??each_pixel_lp
- add esi,ebx
- dec ebp
- jnz ??each_line_lp
- pop edi
- pop esi
- inc esi
- shl ah,1
- cmp ah,16
- jl ??each_plane_lp
- endif
- proc FastGetPortHardware_ NEAR
- endp
- proc FastSetPortHardware_ NEAR
- endp
- proc PortOpenGreenleafFast_ NEAR
- endp
- proc HMWaitForOK_ NEAR
- endp
- proc HMSetDialingMethod_ NEAR
- endp
- proc HMDial_ NEAR
- endp
- proc HMInputLine_ NEAR
- endp
- proc HMAnswer_ NEAR
- endp
- proc PortKillTime_ NEAR
- endp
- proc HMSendStringNoWait_ NEAR
- endp
- proc HMSetUpEchoRoutine_ NEAR
- endp
- proc HMSetUpAbortKey_ NEAR
- endp
- proc SetAbortModemFunctionPtr_ NEAR
- endp
- proc Change8259Priority_ NEAR
- endp
- proc HMSendString_ NEAR
- endp
- ret
- masm
- ;
- ; Change a DAC colour register directly
- ;
- ; register number in al
- ;
- ; bh=red bl=green cl=blue
- ;
- set_dac_col proc near
- pushad
- cli
- push eax
- mov dx,03dah
- in al,dx
- jmp @@1
- @@1: mov dx,03c8h
- pop eax
- out dx,al
- jmp @@2
- @@2: inc dl
- mov al,bh
- out dx,al
- jmp @@3
- @@3: mov al,bl
- out dx,al
- jmp @@4
- @@4: mov al,cl
- out dx,al
- jmp @@5
- @@5: sti
- popad
- ret
- set_dac_col endp
- ideal
- global Set_Palette_Register_:near
- proc Set_Palette_Register_ near
- pushad
- and cl,63
- mov bh,dl
- and bh,63
- and bl,63
- call set_dac_col
- popad
- ret
- endp Set_Palette_Register_
- locals ??
- ends
- dataseg
- LineBuffer dd 640 dup (?)
- ends
- segment mycode page public use32 'code' ; Need stricter segment alignment
- global C Asm_Interpolate:near
- global C Asm_Interpolate_Line_Double:near
- global C Asm_Interpolate_Line_Interpolate:near
- global C PaletteInterpolationTable:byte
- ;*********************************************************************************************
- ;* Asm_Interpolate -- interpolate a 320x200 buffer to a 640x400 screen *
- ;* *
- ;* INPUT: ptr to source buffer (320x200 image) *
- ;* ptr to dest buffer (640x400) *
- ;* height of source buffer *
- ;* width of source buffer *
- ;* width of dest buffer *
- ;* *
- ;* *
- ;* OUTPUT: none *
- ;* *
- ;* Warnings: *
- ;* *
- ;* HISTORY: *
- ;* 12/15/95 ST : Created. *
- ;*===========================================================================================*
- PROC Asm_Interpolate C near
- ARG src_ptr:dword
- ARG dest_ptr:dword
- ARG source_height:dword
- ARG source_width:dword
- ARG dest_width:dword
- LOCAL old_dest:dword
- pushad
- mov eax,[dest_ptr]
- mov [old_dest],eax
- mov esi,[src_ptr]
- ??each_line_loop:
- mov ecx,[source_width]
- sub ecx,2
- shr ecx,1
- mov edi,[old_dest]
- jmp ??interpolate_loop
- align 32
- ;
- ; convert 2 pixels of source into 4 pixels of destination
- ; so we can write to video memory with dwords
- ;
- ??interpolate_loop:
- mov eax,[esi]
- lea esi,[esi+2]
- mov edx,eax
- mov ebx,eax
- and edx,65535
- ror ebx,8
- mov bl,[edx+PaletteInterpolationTable]
- mov bh,ah
- and eax,000ffff00h
- ror ebx,8
- ;1st 3 pixels now in ebx
- shr eax,8
- mov bh,[eax+PaletteInterpolationTable]
- ror ebx,16
- mov [edi],ebx
- add edi,4
- dec ecx
- jnz ??interpolate_loop
- ; do the last three pixels and a blank on the end of a row
- xor eax,eax
- mov ax,[esi]
- mov [edi],al
- inc edi
- lea esi,[esi+2]
- mov al,[eax+PaletteInterpolationTable]
- mov [edi],al
- inc edi
- mov [edi],ah
- inc edi
- mov [byte edi],0
- mov edi,[dest_width]
- add [old_dest],edi
- dec [source_height]
- jnz ??each_line_loop
- popad
- ret
- endp Asm_Interpolate
- PROC Asm_Interpolate_Line_Double C near
- ARG src_ptr:dword
- ARG dest_ptr:dword
- ARG source_height:dword
- ARG source_width:dword
- ARG dest_width:dword
- LOCAL old_dest:dword
- LOCAL width_counter:dword
- LOCAL pixel_count:dword
- pushad
- mov eax,[dest_ptr]
- mov [old_dest],eax
- mov esi,[src_ptr]
- mov edi,[dest_ptr]
- ??each_line_loop:
- mov [width_counter],0
- mov ecx,[source_width]
- sub ecx,2
- shr ecx,1
- mov [pixel_count],ecx
- mov ecx,offset LineBuffer
- mov edi,[old_dest]
- jmp ??interpolate_loop
- align 16
- ; convert 2 pixels of source into 4 pixels of destination
- ??interpolate_loop:
- mov eax,[esi]
- lea esi,[esi+2]
- mov edx,eax
- mov ebx,eax
- and edx,65535
- ror ebx,8
- mov bl,[edx+PaletteInterpolationTable]
- mov bh,ah
- and eax,000ffff00h
- ror ebx,8
- ;1st 3 pixels now in ebx
- shr eax,8
- mov bh,[eax+PaletteInterpolationTable]
- ror ebx,16
- mov [edi],ebx
- mov [ecx],ebx
- add edi,4
- add ecx,4
- dec [pixel_count]
- jnz ??interpolate_loop
- ; do the last three pixels and a blank
- xor eax,eax
- mov ax,[esi]
- mov [edi],al
- mov [ecx],al
- inc edi
- inc ecx
- lea esi,[esi+2]
- mov al,[eax+PaletteInterpolationTable]
- mov [edi],al
- mov [ecx],al
- inc edi
- inc ecx
- mov [edi],ah
- mov [ecx],ah
- inc edi
- inc ecx
- mov [byte edi],0
- mov [byte ecx],0
- mov edi,[dest_width]
- shr edi,1
- add [old_dest],edi
- push esi
- push edi
- mov esi,offset LineBuffer
- mov edi,[old_dest]
- mov ecx,[source_width]
- shr ecx,1
- rep movsd
- pop edi
- pop esi
- add [old_dest],edi
- mov edi,[old_dest]
- dec [source_height]
- jnz ??each_line_loop
- popad
- ret
- endp Asm_Interpolate_Line_Double
- ends
- dataseg
- TopLine dd 640 dup (?)
- BottomLine dd 640 dup (?)
- segment mycode page public use32 'code' ; Need stricter segment alignment
- proc Interpolate_Single_Line C near
- ARG source_ptr:dword
- ARG dest_ptr:dword
- ARG source_width:dword
- pushad
- mov ecx,[source_width]
- sub ecx,2
- shr ecx,1
- mov esi,[source_ptr]
- mov edi,[dest_ptr]
- ??interpolate_loop:
- mov eax,[esi]
- lea esi,[esi+2]
- mov edx,eax
- mov ebx,eax
- and edx,65535
- ror ebx,8
- mov bl,[edx+PaletteInterpolationTable]
- mov bh,ah
- and eax,000ffff00h
- ror ebx,8
- ;1st 3 pixels now in ebx
- shr eax,8
- mov bh,[eax+PaletteInterpolationTable]
- ror ebx,16
- mov [edi],ebx
- add edi,4
- dec ecx
- jnz ??interpolate_loop
- ; do the last three pixels and a blank
- xor eax,eax
- mov ax,[esi]
- mov [edi],al
- inc edi
- mov al,[eax+PaletteInterpolationTable]
- mov [edi],al
- inc edi
- mov [edi],ah
- inc edi
- mov [byte edi],0
- popad
- ret
- endp Interpolate_Single_Line
- proc Interpolate_Between_Lines C near
- ARG source1:dword
- ARG source2:dword
- ARG destination:dword
- ARG source_width:dword
- pushad
- mov esi,[source1]
- mov edi,[destination]
- mov ebx,[source2]
- xor eax,eax
- mov ecx,[source_width]
- add ecx,ecx
- ??interpolate_each_pixel_loop:
- mov al,[esi]
- mov ah,[ebx]
- inc esi
- inc ebx
- mov dl,[eax+PaletteInterpolationTable]
- mov [edi],dl
- inc edi
- dec ecx
- jnz ??interpolate_each_pixel_loop
- popad
- ret
- endp Interpolate_Between_Lines
- macro Lineswp
- push [next_line]
- push [last_line]
- pop [next_line]
- pop [last_line]
- endm
- PROC Asm_Interpolate_Line_Interpolate C near
- ARG src_ptr:dword
- ARG dest_ptr:dword
- ARG source_lines:dword
- ARG source_width:dword
- ARG dest_width:dword
- LOCAL old_dest:dword
- LOCAL pixel_count:dword
- LOCAL next_line:dword
- LOCAL last_line:dword
- pushad
- mov eax,[dest_ptr]
- mov [old_dest],eax
- mov [next_line],offset TopLine
- mov [last_line],offset BottomLine
- mov ecx,[source_width]
- shr ecx,1
- mov [pixel_count],ecx
- shr [dest_width],1
- call Interpolate_Single_Line C,[src_ptr],[next_line],[source_width]
- mov esi,[source_width]
- Lineswp
- add [src_ptr],esi
- dec [source_lines]
- ??each_line_pair_loop:
- call Interpolate_Single_Line C,[src_ptr],[next_line],[source_width]
- call Interpolate_Between_Lines C,[last_line],[next_line],offset LineBuffer,[source_width]
- mov esi,[last_line]
- mov edi,[old_dest]
- mov ecx,[pixel_count]
- rep movsd
- mov edi,[old_dest]
- mov esi,offset LineBuffer
- add edi,[dest_width]
- mov ecx,[pixel_count]
- mov [old_dest],edi
- rep movsd
- mov edi,[old_dest]
- mov esi,[source_width]
- add edi,[dest_width]
- add [src_ptr],esi
- mov [old_dest],edi
- Lineswp
- dec [source_lines]
- jnz ??each_line_pair_loop
- call Interpolate_Single_Line C,[src_ptr],[next_line],[source_width]
- mov esi,[next_line]
- mov edi,[old_dest]
- mov ecx,[pixel_count]
- rep movsd
- popad
- ret
- endp Asm_Interpolate_Line_Interpolate
- ends mycode
- global C Asm_Create_Palette_Interpolation_Table:near
- global C InterpolationPalette:dword
- codeseg
- proc Asm_Create_Palette_Interpolation_Table C near
- LOCAL palette_counter:dword
- LOCAL first_palette:dword
- LOCAL second_palette:dword
- LOCAL dest_ptr:dword
- LOCAL count:dword
- LOCAL closest_colour:dword
- LOCAL distance_of_closest:dword
- pushad
- mov [dest_ptr],0
- mov [palette_counter],256
- mov esi,[InterpolationPalette]
- ??palette_outer_loop:
- mov edi,[InterpolationPalette]
- mov ecx,256
- ??palette_inner_loop:
- mov bl,[esi]
- add bl,[edi]
- shr bl,1
- mov bh,[esi+1]
- add bh,[edi+1]
- shr bh,1
- mov dl,[esi+2]
- add dl,[edi+2]
- shr dl,1
- mov [closest_colour],0
- mov [distance_of_closest],-1
- push edi
- push ecx
- mov edi,[InterpolationPalette]
- mov [count],0
- ??cmp_pal_lp: xor eax,eax
- xor ecx,ecx
- mov al,[edi]
- sub al,bl
- imul al
- mov ecx,eax
- mov al,[edi+1]
- sub al,bh
- imul al
- add ecx,eax
- mov al,[edi+2]
- sub al,dl
- imul al
- add ecx,eax
- cmp ecx,[distance_of_closest]
- ja ??end_cmp_lp
- mov [distance_of_closest],ecx
- mov eax,[count]
- mov [closest_colour],eax
- test ecx,ecx
- jz ??got_perfect
- ??end_cmp_lp: lea edi,[edi+3]
- inc [count]
- cmp [count],256
- jb ??cmp_pal_lp
- ??got_perfect: mov edi,[dest_ptr]
- mov eax,[closest_colour]
- mov [edi+PaletteInterpolationTable],al
- inc [dest_ptr]
- pop ecx
- pop edi
- lea edi,[edi+3]
- dec ecx
- jnz ??palette_inner_loop
- lea esi,[esi+3]
- dec [palette_counter]
- jnz ??palette_outer_loop
- popad
- ret
- endp Asm_Create_Palette_Interpolation_Table
- DATASEG
- _AbortModemFunctionPtr dd 0
- Memory_Error_Exit dd 0
- MouseQX dd 0
- MouseQY dd 0
- end
|