| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854 |
- ;
- ; Command & Conquer(tm)
- ; Copyright 2025 Electronic Arts Inc.
- ;
- ; This program 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.
- ;
- ; This program is distributed in the hope that it will be useful,
- ; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ; GNU General Public License for more details.
- ;
- ; You should have received a copy of the GNU General Public License
- ; along with this program. If not, see <http://www.gnu.org/licenses/>.
- ;
- ;***************************************************************************
- ;** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S **
- ;***************************************************************************
- ;* *
- ;* Project Name : Command & Conquer *
- ;* *
- ;* File Name : KEYFBUFF.ASM *
- ;* *
- ;* Programmer : David R. Dettmer *
- ;* *
- ;* Start Date : March 3, 1995 *
- ;* *
- ;* Last Update : *
- ;* *
- ;*-------------------------------------------------------------------------*
- ;* Functions: *
- ;* Buffer_Frame_To_Page -- Copies a linear buffer to a virtual viewport *
- ;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
- ;********************** Model & Processor Directives ***********************
- IDEAL
- P386
- MODEL USE32 FLAT
- jumps
- ;******************************** Includes *********************************
- INCLUDE "gbuffer.inc"
- include "profile.inc"
- ;******************************** Equates **********************************
- TRUE equ 1 ; Boolean 'true' value
- FALSE equ 0 ; Boolean 'false' value
- ;*=========================================================================*/
- ;* The following are defines used to control what functions are linked *
- ;* in for Buffer_Frame_To_Page. *
- ;*=========================================================================*/
- ;USE_NORMAL EQU TRUE
- ;USE_HORZ_REV EQU TRUE
- ;USE_VERT_REV EQU TRUE
- ;USE_SCALING EQU TRUE
- FLAG_NORMAL EQU 0
- FLAG_TRANS EQU 1
- FLAG_GHOST EQU 2
- FLAG_FADING EQU 4
- FLAG_PREDATOR EQU 8
- FLAG_MASK EQU 0Fh
- SHAPE_NORMAL EQU 0000h ; Standard shape
- ;SHAPE_HORZ_REV EQU 0001h ; Flipped horizontally
- ;SHAPE_VERT_REV EQU 0002h ; Flipped vertically
- ;SHAPE_SCALING EQU 0004h ; Scaled (WORD scale_x, WORD scale_y)
- ;SHAPE_VIEWPORT_REL EQU 0010h ; Coords are window-relative
- ;SHAPE_WIN_REL EQU 0010h ; Coordinates are window relative instead of absolute.
- SHAPE_CENTER EQU 0020h ; Coords are based on shape's center pt
- SHAPE_TRANS EQU 0040h ; has transparency
- SHAPE_FADING EQU 0100h ; Fading effect (VOID * fading_table,
- ; WORD fading_num)
- SHAPE_PREDATOR EQU 0200h ; Transparent warping effect
- ;SHAPE_COMPACT EQU 0400h ; Never use this bit
- ;SHAPE_PRIORITY EQU 0800h ; Use priority system when drawing
- SHAPE_GHOST EQU 1000h ; Shape is drawn ghosted
- ;SHAPE_SHADOW EQU 2000h
- SHAPE_PARTIAL EQU 4000h
- ;SHAPE_COLOR EQU 8000h ; Remap the shape's colors
- ; (VOID * color_table)
- ;
- ;.......................... Shadow Effect ..................................
- ;
- SHADOW_COL EQU 00FFh ; magic number for shadows
- ;......................... Priority System .................................
- ;
- CLEAR_UNUSED_BITS EQU 0007h ; and with 0000-0111 to clear
- ; non-walkable high bit and
- ; scaling id bits
- NON_WALKABLE_BIT EQU 0080h ; and with 1000-0000 to clear all
- ; but non-walkable bit
- ;
- ;......................... Predator Effect .................................
- ;
- ;PRED_MASK EQU 0007h ; mask used for predator pixel puts
- PRED_MASK EQU 000Eh ; mask used for predator pixel puts
- ;---------------------------------------------------------------------------
- ;
- ; Use a macro to make code a little cleaner.
- ; The parameter varname is optional.
- ; Syntax to use macro is :
- ; WANT equ expression
- ; USE func [,varname]
- ; If the 'varname' is defined, a table declaration is created like:
- ; GLOBAL TableName:DWORD
- ; Then, the table entry is created:
- ; If WANT is true, the table entry is created for the given function:
- ; varname DD func
- ; If WANT is not TRUE, a Not_Supported entry is put in the table:
- ; varname DD Not_Supported
- ; The resulting tables look like:
- ;
- ; GLOBAL ExampTable:DWORD
- ; ExampTable DD routine1
- ; DD routine2
- ; DD routine3
- ; ...
- ; Thus, each table is an array of function pointers.
- ;
- ;---------------------------------------------------------------------------
- MACRO USE func, varname
- IF WANT
- varname DD func
- ELSE
- varname DD Not_Supported
- ENDIF
- ENDM
- ; IFNB <varname>
- ; GLOBAL varname:DWORD
- ; ENDIF
- ;---------------------------------------------------------------------------
- DATASEG
- ;---------------------------------------------------------------------------
- ; Predator effect variables
- ;---------------------------------------------------------------------------
- ; make table for negative offset and use the used space for other variables
- BFPredNegTable DW -1, -3, -2, -5, -2, -4, -3, -1
- ; 8 words below calculated
- DW 0, 0, 0, 0, 0, 0, 0, 0 ; index ffffff00
- DD 0, 0, 0, 0 ; index ffffff10
- BFPredOffset DD 0, 0, 0, 0 ; index ffffff20
- DD 0, 0, 0, 0 ; index ffffff30
- ; partially faded predator effect value
- BFPartialPred DD 0, 0, 0, 0 ; index ffffff40
- BFPartialCount DD 0, 0, 0, 0 ; index ffffff50
- DD 0, 0, 0, 0 ; index ffffff60
- DD 0, 0, 0, 0 ; index ffffff70
- DD 0, 0, 0, 0 ; index ffffff80
- DD 0, 0, 0, 0 ; index ffffff90
- DD 0, 0, 0, 0 ; index ffffffa0
- DD 0, 0, 0, 0 ; index ffffffb0
- DD 0, 0, 0, 0 ; index ffffffc0
- DD 0, 0, 0, 0 ; index ffffffd0
- DD 0, 0, 0, 0 ; index ffffffe0
- DD 0, 0, 0, 0 ; index fffffff0
- BFPredTable DW 1, 3, 2, 5, 2, 3, 4, 1
- ;BFPredTable DB 1, 3, 2, 5, 4, 3, 2, 1
- global C BigShapeBufferStart:dword
- global C UseBigShapeBuffer:dword
- global C TheaterShapeBufferStart:dword
- global C IsTheaterShape:dword
- global C Single_Line_Trans_Entry:near
- global C Next_Line:near
- global C MMX_Done:near
- global C MMXAvailable:dword
- global EndNewShapeJumpTable:byte
- global NewShapeJumpTable:dword
- ;**********************************************************************************
- ;
- ; Jump tables for new line header system
- ;
- ; Each line of shape data now has a header byte which describes the data on the line.
- ;
- ;
- ; Header byte control bits
- ;
- BLIT_TRANSPARENT =1
- BLIT_GHOST =2
- BLIT_FADING =4
- BLIT_PREDATOR =8
- BLIT_SKIP =16
- BLIT_ALL =BLIT_TRANSPARENT or BLIT_GHOST or BLIT_FADING or BLIT_PREDATOR or BLIT_SKIP
- struc ShapeHeaderType
- draw_flags dd ?
- shape_data dd ?
- shape_buffer dd ?
- ends
- ;
- ; Global definitions for routines that draw a single line of a shape
- ;
- global Short_Single_Line_Copy:near
- global Single_Line_Trans:near
- global Single_Line_Ghost:near
- global Single_Line_Ghost_Trans:near
- global Single_Line_Fading:near
- global Single_Line_Fading_Trans:near
- global Single_Line_Ghost_Fading:near
- global Single_Line_Ghost_Fading_Trans:near
- global Single_Line_Predator:near
- global Single_Line_Predator_Trans:near
- global Single_Line_Predator_Ghost:near
- global Single_Line_Predator_Ghost_Trans:near
- global Single_Line_Predator_Fading:near
- global Single_Line_Predator_Fading_Trans:near
- global Single_Line_Predator_Ghost_Fading:near
- global Single_Line_Predator_Ghost_Fading_Trans:near
- global Single_Line_Skip:near
- global Single_Line_Single_Fade:near
- global Single_Line_Single_Fade_Trans:near
- label NewShapeJumpTable dword
- ;
- ; Jumptable for shape line drawing with no flags set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- label CriticalFadeRedirections dword
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with transparent flags set
- ;
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with ghost flags set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with ghost and transparent flags set
- ;
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with fading flag set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade
- dd Single_Line_Fading
- dd Single_Line_Fading
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Fading
- dd Single_Line_Fading
- dd Single_Line_Fading
- dd Single_Line_Fading
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with fading and transparent flags set
- ;
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade_Trans
- dd Single_Line_Fading
- dd Single_Line_Fading_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Fading
- dd Single_Line_Fading_Trans
- dd Single_Line_Fading
- dd Single_Line_Fading_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with fading and ghost flags set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade
- dd Single_Line_Ghost_Fading
- dd Single_Line_Ghost_Fading
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Single_Line_Fading
- dd Single_Line_Fading
- dd Single_Line_Ghost_Fading
- dd Single_Line_Ghost_Fading
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with fading, transparent and ghost flags set
- ;
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade_Trans
- dd Single_Line_Ghost_Fading
- dd Single_Line_Ghost_Fading_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Single_Line_Fading
- dd Single_Line_Fading_Trans
- dd Single_Line_Ghost_Fading
- dd Single_Line_Ghost_Fading_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing with predator flag set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with transparent and predator flags set
- ;
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with ghost and predator flags set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator_Ghost
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with ghost and transparent and predator flags set
- ;
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator_Ghost_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator_Ghost_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with fading and predator flags set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade
- dd Single_Line_Fading
- dd Single_Line_Fading
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Fading
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with fading and transparent and predator flags set
- ;
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade_Trans
- dd Single_Line_Fading
- dd Single_Line_Fading_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Fading_Trans
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Fading_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with fading and ghost and predator flags set
- ;
- dd Short_Single_Line_Copy
- dd Short_Single_Line_Copy
- dd Single_Line_Ghost
- dd Single_Line_Ghost
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade
- dd Single_Line_Ghost_Fading
- dd Single_Line_Ghost_Fading
- dd Single_Line_Predator
- dd Single_Line_Predator
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Ghost_Fading
- dd Single_Line_Predator_Ghost_Fading
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- ;
- ; Jumptable for shape line drawing routines with all flags set
- ;
- label AllFlagsJumpTable dword
- dd Short_Single_Line_Copy
- dd Single_Line_Trans
- dd Single_Line_Ghost
- dd Single_Line_Ghost_Trans
- dd Single_Line_Single_Fade
- dd Single_Line_Single_Fade_Trans
- dd Single_Line_Ghost_Fading
- dd Single_Line_Ghost_Fading_Trans
- dd Single_Line_Predator
- dd Single_Line_Predator_Trans
- dd Single_Line_Predator_Ghost
- dd Single_Line_Predator_Ghost_Trans
- dd Single_Line_Predator_Fading
- dd Single_Line_Predator_Fading_Trans
- dd Single_Line_Predator_Ghost_Fading
- dd Single_Line_Predator_Ghost_Fading_Trans
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- dd Single_Line_Skip
- label EndNewShapeJumpTable byte
- CODESEG
- ;---------------------------------------------------------------------------
- ; Code Segment Tables:
- ; This code uses the USE macro to set up tables of function addresses.
- ; The tables have the following format:
- ; Tables defined are:
- ; BufferFrameTable
- ;---------------------------------------------------------------------------
- WANT equ <TRUE>
- USE BF_Copy, BufferFrameTable
- WANT equ <TRUE>
- USE BF_Trans
- WANT equ <TRUE>
- USE BF_Ghost
- WANT equ <TRUE>
- USE BF_Ghost_Trans
- WANT equ <TRUE>
- USE BF_Fading
- WANT equ <TRUE>
- USE BF_Fading_Trans
- WANT equ <TRUE>
- USE BF_Ghost_Fading
- WANT equ <TRUE>
- USE BF_Ghost_Fading_Trans
- WANT equ <TRUE>
- USE BF_Predator
- WANT equ <TRUE>
- USE BF_Predator_Trans
- WANT equ <TRUE>
- USE BF_Predator_Ghost
- WANT equ <TRUE>
- USE BF_Predator_Ghost_Trans
- WANT equ <TRUE>
- USE BF_Predator_Fading
- WANT equ <TRUE>
- USE BF_Predator_Fading_Trans
- WANT equ <TRUE>
- USE BF_Predator_Ghost_Fading
- WANT equ <TRUE>
- USE BF_Predator_Ghost_Fading_Trans
- ;---------------------------------------------------------------------------
- ;*********************************************************************************************
- ;* Set_Shape_Header -- create the line header bytes for a shape *
- ;* *
- ;* INPUT: Shape width *
- ;* Shape height *
- ;* ptr to raw shape data *
- ;* ptr to shape headers *
- ;* shape flags *
- ;* ptr to translucency table *
- ;* IsTranslucent *
- ;* *
- ;* OUTPUT: none *
- ;* *
- ;* Warnings: *
- ;* *
- ;* HISTORY: *
- ;* 11/29/95 10:09AM ST : Created. *
- ;*===========================================================================================*
- proc Setup_Shape_Header C near
- ARG pixel_width :DWORD ; width of rectangle to blit
- ARG pixel_height :DWORD ; height of rectangle to blit
- ARG src :DWORD ; this is a member function
- ARG headers :DWORD
- ARG flags :DWORD
- ARG Translucent :DWORD
- ARG IsTranslucent :DWORD
- LOCAL trans_count :DWORD
- pushad
- mov esi,[src] ;ptr to raw shape data
- mov edi,[headers] ;ptr to headers we are going to set up
- mov eax,[flags]
- and eax,SHAPE_TRANS or SHAPE_FADING or SHAPE_PREDATOR or SHAPE_GHOST
- mov [(ShapeHeaderType edi).draw_flags],eax ;save old flags in header
- add edi,size ShapeHeaderType
- mov edx,[pixel_height] ;number of shape lines to scan
- ??outer_loop: mov ecx,[pixel_width] ;number of pixels in shape line
- xor bl,bl ;flag the we dont know anything about this line yet
- mov [trans_count],0 ;we havnt scanned any transparent pixels yet
- ;
- ; Scan one shape line to see what kind of data it contains
- ;
- ??inner_loop: xor eax,eax
- mov al,[esi]
- inc esi
- ;
- ; Check for transparent pixel
- ;
- test al,al
- jnz ??not_transp
- test [flags],SHAPE_TRANS
- jz ??not_transp
- or bl,BLIT_TRANSPARENT ;flag that pixel is transparent
- inc [trans_count] ;keep count of the number of transparent pixels on the line
- jmp ??end_lp
- ;
- ; Check for predator effect on this line
- ;
- ??not_transp: test [flags],SHAPE_PREDATOR
- jz ??not_pred
- or bl,BLIT_PREDATOR
- ;
- ; Check for ghost effects
- ;
- ??not_pred: test [flags],SHAPE_GHOST
- jz ??not_ghost
- push edi
- mov edi,[IsTranslucent]
- cmp [byte edi+eax],-1
- pop edi
- jz ??not_ghost
- or bl,BLIT_GHOST
- ;
- ; Check if fading is required
- ;
- ??not_ghost: test [flags],SHAPE_FADING
- jz ??end_lp
- or bl,BLIT_FADING
- ??end_lp: dec ecx
- jnz ??inner_loop
- ;
- ; Interpret the info we have collected and decide which routine will be
- ; used to draw this line
- ;
- xor bh,bh
- test bl,BLIT_TRANSPARENT
- jz ??no_transparencies
- or bh,BLIT_TRANSPARENT
- mov ecx,[pixel_width]
- cmp ecx,[trans_count]
- jnz ??not_all_trans
- ; all pixels in the line were transparent so we dont need to draw it at all
- mov bh,BLIT_SKIP
- jmp ??got_line_type
- ??not_all_trans:
- ??no_transparencies:
- mov al,bl
- and al,BLIT_PREDATOR
- or bh,al
- mov al,bl
- and al,BLIT_GHOST
- or bh,al
- mov al,bl
- and al,BLIT_FADING
- or bh,al
- ;
- ; Save the line header and do the next line
- ;
- ??got_line_type:mov [edi],bh
- inc edi
- dec edx
- jnz ??outer_loop
- popad
- ret
- endp Setup_Shape_Header
- ;**************************************************************
- ;
- ; Macro to fetch the header of the next line and jump to the appropriate routine
- ;
- macro next_line
- add edi , [ dest_adjust_width ] ;add in dest modulo
- dec edx ;line counter
- jz ??real_out ;return
- mov ecx,[save_ecx] ;ecx is pixel count
- mov eax,[header_pointer] ;ptr to next header byte
- mov al,[eax]
- inc [header_pointer]
- and eax,BLIT_ALL ;Make sure we dont jump to some spurious address
- ; if the header is wrong then its better to draw with the wrong
- ; shape routine than to die
- shl eax,2
- add eax,[ShapeJumpTableAddress] ;get the address to jump to
- jmp [dword eax] ;do the jump
- endm
- ;***************************************************************************
- ;* VVC::TOPAGE -- Copies a linear buffer to a virtual viewport *
- ;* *
- ;* INPUT: WORD x_pixel - x pixel on viewport to copy from *
- ;* WORD y_pixel - y pixel on viewport to copy from *
- ;* WORD pixel_width - the width of copy region *
- ;* WORD pixel_height - the height of copy region *
- ;* BYTE * src - buffer to copy from *
- ;* VVPC * dest - virtual viewport to copy to *
- ;* *
- ;* OUTPUT: none *
- ;* *
- ;* WARNINGS: Coordinates and dimensions will be adjusted if they exceed *
- ;* the boundaries. In the event that no adjustment is *
- ;* possible this routine will abort. If the size of the *
- ;* region to copy exceeds the size passed in for the buffer *
- ;* the routine will automatically abort. *
- ;* *
- ;* HISTORY: *
- ;* 06/15/1994 PWG : Created. *
- ;*=========================================================================*
- GLOBAL C Buffer_Frame_To_Page:NEAR
- PROC Buffer_Frame_To_Page C near
- USES eax,ebx,ecx,edx,esi,edi
- ;*===================================================================
- ;* define the arguements that our function takes.
- ;*===================================================================
- ARG x_pixel :DWORD ; x pixel position in source
- ARG y_pixel :DWORD ; y pixel position in source
- ARG pixel_width :DWORD ; width of rectangle to blit
- ARG pixel_height:DWORD ; height of rectangle to blit
- ARG src :DWORD ; this is a member function
- ARG dest :DWORD ; what are we blitting to
- ARG flags :DWORD ; flags passed
- ;*===================================================================
- ; Define some locals so that we can handle things quickly
- ;*===================================================================
- LOCAL IsTranslucent :DWORD ; ptr to the is_translucent table
- LOCAL Translucent :DWORD ; ptr to the actual translucent table
- LOCAL FadingTable :DWORD ; extracted fading table pointer
- LOCAL FadingNum :DWORD ; get the number of times to fade
- LOCAL StashECX :DWORD ; temp variable for ECX register
- LOCAL jflags :DWORD ; flags used to goto correct buff frame routine
- LOCAL BufferFrameRout :DWORD ; ptr to the buffer frame routine
- LOCAL jmp_loc :DWORD ; calculated jump location
- LOCAL loop_cnt :DWORD
- LOCAL x1_pixel :DWORD
- LOCAL y1_pixel :DWORD
- LOCAL scr_x :DWORD
- LOCAL scr_y :DWORD
- LOCAL dest_adjust_width :DWORD
- LOCAL scr_adjust_width :DWORD
- LOCAL header_pointer :DWORD
- LOCAL use_old_draw :DWORD
- LOCAL save_ecx :DWORD
- LOCAL ShapeJumpTableAddress :DWORD
- LOCAL shape_buffer_start :DWORD
- prologue
- cmp [ src ] , 0
- jz ??real_out
- ;
- ; Save the line attributes pointers and
- ; Modify the src pointer to point to the actual image
- ;
- cmp [UseBigShapeBuffer],0
- jz ??do_args ;just use the old shape drawing system
- mov edi,[src]
- mov [header_pointer],edi
- mov eax,[BigShapeBufferStart]
- cmp [(ShapeHeaderType edi).shape_buffer],0
- jz ??is_ordinary_shape
- mov eax,[TheaterShapeBufferStart]
- ??is_ordinary_shape:
- mov [shape_buffer_start],eax
- mov edi,[(ShapeHeaderType edi).shape_data]
- add edi,[shape_buffer_start]
- mov [src],edi
- mov [use_old_draw],0
- ;====================================================================
- ; Pull off optional arguments:
- ; EDI is used as an offset from the 'flags' parameter, to point
- ; to the optional argument currently being processed.
- ;====================================================================
- ??do_args:
- mov edi , 4 ; optional params start past flags
- mov [ jflags ] , 0 ; clear jump flags
- ??check_centering:
- ;-------------------------------------------------------------------
- ; See if we need to center the frame
- ;-------------------------------------------------------------------
- test [ flags ] , SHAPE_CENTER ; does this need to be centered?
- je ??check_trans ; if not the skip over this stuff
- mov eax , [ pixel_width ]
- mov ebx , [ pixel_height ]
- sar eax , 1
- sar ebx , 1
- sub [ x_pixel ] , eax
- sub [ y_pixel ] , ebx
- ??check_trans:
- test [ flags ] , SHAPE_TRANS
- jz ??check_ghost
- or [ jflags ] , FLAG_TRANS
- ;--------------------------------------------------------------------
- ; SHAPE_GHOST: DWORD is_translucent tbl
- ;--------------------------------------------------------------------
- ??check_ghost:
- test [ flags ] , SHAPE_GHOST ; are we ghosting this shape
- jz ??check_fading
- mov eax , [ flags + edi ]
- or [ jflags ] , FLAG_GHOST
- mov [ IsTranslucent ] , eax ; save ptr to is_trans. tbl
- add eax , 0100h ; add 256 for first table
- add edi , 4 ; next argument
- mov [ Translucent ] , eax ; save ptr to translucent tbl
- ??check_fading:
- ;______________________________________________________________________
- ; If this is the first time through for this shape then
- ; set up the shape header
- ;______________________________________________________________________
- pushad
- cmp [UseBigShapeBuffer],0
- jz ??new_shape
- mov edi,[header_pointer]
- cmp [(ShapeHeaderType edi).draw_flags],-1
- jz ??setup_headers
- mov eax,[flags] ;Redo the shape headers if this shape was
- and eax,SHAPE_TRANS or SHAPE_FADING or SHAPE_PREDATOR or SHAPE_GHOST ;initially set up with different flags
- cmp eax,[(ShapeHeaderType edi).draw_flags]
- jz ??no_header_setup
- ??new_shape:
- mov [use_old_draw],1
- jmp ??no_header_setup
- ??setup_headers:
- push [IsTranslucent]
- push [Translucent]
- push [flags]
- push [header_pointer]
- push [src]
- push [pixel_height]
- push [pixel_width]
- call Setup_Shape_Header
- add esp,7*4
- mov [ShapeJumpTableAddress],offset AllFlagsJumpTable
- jmp ??headers_set
- ??no_header_setup:
- xor eax,eax
- test [flags],SHAPE_PREDATOR
- jz ??not_shape_predator
- or al,BLIT_PREDATOR
- ??not_shape_predator:
- test [flags],SHAPE_FADING
- jz ??not_shape_fading
- or al,BLIT_FADING
- ??not_shape_fading:
- test [flags],SHAPE_TRANS
- jz ??not_shape_transparent
- or al,BLIT_TRANSPARENT
- ??not_shape_transparent:
- test [flags],SHAPE_GHOST
- jz ??not_shape_ghost
- or al,BLIT_GHOST
- ??not_shape_ghost:
- shl eax,7
- add eax,offset NewShapeJumpTable
- mov [ShapeJumpTableAddress],eax
- ??headers_set:
- popad
- ;--------------------------------------------------------------------
- ; SHAPE_FADING: DWORD fade_table[256], DWORD fade_count
- ;--------------------------------------------------------------------
- test [ flags ] , SHAPE_FADING ; are we fading this shape
- jz ??check_predator
- mov eax , [ flags + edi ]
- mov [ FadingTable ] , eax ; save address of fading tbl
- mov eax , [ flags + edi + 4 ] ; get fade num
- or [ jflags ] , FLAG_FADING
- and eax , 03fh ; no need for more than 63
- add edi , 8 ; next argument
- cmp eax , 0 ; check if it's 0
- jnz ??set_fading ; if not, store fade num
- and [ flags ] , NOT SHAPE_FADING ; otherwise, don't fade
- ??set_fading:
- mov [ FadingNum ] , eax
- mov ebx,[ShapeJumpTableAddress]
- mov [dword ebx+CriticalFadeRedirections-NewShapeJumpTable],offset Single_Line_Single_Fade
- mov [dword ebx+CriticalFadeRedirections-NewShapeJumpTable+4],offset Single_Line_Single_Fade_Trans
- cmp eax,1
- jz ??single_fade
- mov [dword ebx+CriticalFadeRedirections-NewShapeJumpTable],offset Single_Line_Fading
- mov [dword ebx+CriticalFadeRedirections-NewShapeJumpTable+4],offset Single_Line_Fading_Trans
- ??single_fade:
- ;--------------------------------------------------------------------
- ; SHAPE_PREDATOR: DWORD init_pred_lookup_offset (0-7)
- ;--------------------------------------------------------------------
- ??check_predator:
- test [ flags ] , SHAPE_PREDATOR ; is predator effect on
- jz ??check_partial
- mov eax , [ flags + edi ] ; pull the partial value
- or [ jflags ] , FLAG_PREDATOR
- shl eax , 1
- cmp eax , 0
- jge ??check_range
- neg eax
- mov ebx , -1
- and eax , PRED_MASK ; keep entries within bounds
- mov bl , al
- mov eax , ebx ; will be ffffff00-ffffff07
- jmp ??pred_cont
- ??check_range:
- and eax , PRED_MASK ; keep entries within bounds
- ??pred_cont:
- add edi , 4 ; next argument
- mov [ BFPredOffset ] , eax
- mov [ BFPartialCount ] , 0 ; clear the partial count
- mov [ BFPartialPred ] , 100h ; init partial to off
- ??pred_neg_init:
- mov esi , [ dest ] ; get ptr to dest
- mov ebx, 7 * 2
- ??pred_loop:
- movzx eax , [ WORD PTR BFPredNegTable + ebx ]
- add eax , [ (GraphicViewPort esi) . GVPWidth ] ; add width
- add eax , [ (GraphicViewPort esi) . GVPXAdd ] ; add x add
- add eax , [ (GraphicViewPort esi) . GVPPitch ] ; extra pitch of DD surface ST - 9/29/95 1:08PM
- mov [ WORD PTR BFPredNegTable + 16 + ebx ] , ax
- dec ebx
- dec ebx
- jge ??pred_loop
- ;--------------------------------------------------------------------
- ; SHAPE_PARTIAL: DWORD partial_pred_value (0-255)
- ;--------------------------------------------------------------------
- ??check_partial:
- test [ flags ] , SHAPE_PARTIAL ; is this a partial pred?
- jz ??setupfunc
- mov eax , [ flags + edi ] ; pull the partial value
- add edi , 4 ; next argument
- and eax , 0ffh ; make sure 0-255
- mov [ BFPartialPred ] , eax ; store it off
- ??setupfunc:
- mov ebx , [ jflags ] ; load flags value
- and ebx , FLAG_MASK ; clip high bits
- add ebx , ebx ; mult by 4 to get DWORD offset
- add ebx , ebx
- mov ebx , [ BufferFrameTable + ebx ] ; get table value
- mov [ BufferFrameRout ] , ebx ; store it in the function pointer
- ; Clip dest Rectangle against source Window boundaries.
- mov [ scr_x ] , 0
- mov [ scr_y ] , 0
- mov esi , [ dest ] ; get ptr to dest
- xor ecx , ecx
- xor edx , edx
- mov edi , [ (GraphicViewPort esi) . GVPWidth ] ; get width into register
- mov ebx , [ x_pixel ]
- mov eax , [ x_pixel ]
- add ebx , [ pixel_width ]
- shld ecx , eax , 1
- mov [ x1_pixel ] , ebx
- inc edi
- shld edx , ebx , 1
- sub eax , edi
- sub ebx , edi
- shld ecx , eax , 1
- shld edx , ebx , 1
- mov edi,[ ( GraphicViewPort esi) . GVPHeight ] ; get height into register
- mov ebx , [ y_pixel ]
- mov eax , [ y_pixel ]
- add ebx , [ pixel_height ]
- shld ecx , eax , 1
- mov [ y1_pixel ] , ebx
- inc edi
- shld edx , ebx , 1
- sub eax , edi
- sub ebx , edi
- shld ecx , eax , 1
- shld edx , ebx , 1
- xor cl , 5
- xor dl , 5
- mov al , cl
- test dl , cl
- jnz ??real_out
- or al , dl
- jz ??do_blit
- mov [use_old_draw],1
- test cl , 1000b
- jz ??dest_left_ok
- mov eax , [ x_pixel ]
- neg eax
- mov [ x_pixel ] , 0
- mov [ scr_x ] , eax
- ??dest_left_ok:
- test cl , 0010b
- jz ??dest_bottom_ok
- mov eax , [ y_pixel ]
- neg eax
- mov [ y_pixel ] , 0
- mov [ scr_y ] , eax
- ??dest_bottom_ok:
- test dl , 0100b
- jz ??dest_right_ok
- mov eax , [ (GraphicViewPort esi) . GVPWidth ] ; get width into register
- mov [ x1_pixel ] , eax
- ??dest_right_ok:
- test dl , 0001b
- jz ??do_blit
- mov eax , [ (GraphicViewPort esi) . GVPHeight ] ; get width into register
- mov [ y1_pixel ] , eax
- ??do_blit:
- cld
- mov eax , [ (GraphicViewPort esi) . GVPXAdd ]
- add eax , [ (GraphicViewPort esi) . GVPPitch ]
- add eax , [ (GraphicViewPort esi) . GVPWidth ]
- mov edi , [ (GraphicViewPort esi) . GVPOffset ]
- mov ecx , eax
- mul [ y_pixel ]
- add edi , [ x_pixel ]
- add edi , eax
- add ecx , [ x_pixel ]
- sub ecx , [ x1_pixel ]
- mov [ dest_adjust_width ] , ecx
- mov esi , [ src ]
- mov eax , [ pixel_width ]
- sub eax , [ x1_pixel ]
- add eax , [ x_pixel ]
- mov [ scr_adjust_width ] , eax
- mov eax , [ scr_y ]
- mul [ pixel_width ]
- add eax , [ scr_x ]
- add esi , eax
- ;
- ; If the shape needs to be clipped then we cant handle it with the new header systen
- ; so draw it with the old shape drawer
- ;
- cmp [use_old_draw],0
- jnz ??use_old_stuff
- add [header_pointer],size ShapeHeaderType
- mov edx,[pixel_height]
- mov ecx,[pixel_width]
- mov eax,[header_pointer]
- mov al,[eax]
- mov [save_ecx],ecx
- inc [header_pointer]
- and eax,BLIT_ALL
- shl eax,2
- add eax,[ShapeJumpTableAddress]
- jmp [dword eax]
- ??use_old_stuff:
- mov edx , [ y1_pixel ]
- mov eax , [ x1_pixel ]
- sub edx , [ y_pixel ]
- jle ??real_out
- sub eax , [ x_pixel ]
- jle ??real_out
- jmp [ BufferFrameRout ] ; buffer frame to viewport routine
- ??real_out:
- cmp [MMXAvailable],0
- jz ??no_mmx_cleanup
- call MMX_Done
- ??no_mmx_cleanup:
- epilogue
- ret
- ; ********************************************************************
- ; Forward bitblit only
- ; the inner loop is so efficient that
- ; the optimal consept no longer apply because
- ; the optimal byte have to by a number greather than 9 bytes
- ; ********************************************************************
- global BF_Copy:near
- BF_Copy:
- prologue
- cmp eax , 10
- jl ??forward_loop_bytes
- ??forward_loop_dword:
- mov ecx , edi
- mov ebx , eax
- neg ecx
- and ecx , 3
- sub ebx , ecx
- rep movsb
- mov ecx , ebx
- shr ecx , 2
- rep movsd
- mov ecx , ebx
- and ecx , 3
- rep movsb
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??forward_loop_dword
- ret
- ??forward_loop_bytes:
- mov ecx , eax
- rep movsb
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx ; decrement the height
- jnz ??forward_loop_bytes
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- segment code page public use32 'code' ; Need stricter segment alignment
- ; for pentium optimisations
- ;
- ; Expand the 'next_line' macro so we can jump to it
- ;
- ;
- Next_Line: next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Trans:
- prologue
- Single_Line_Trans_Entry:
- ??slt_mask_map_lp: ; Pentium pipeline usage
- ;Pipe Cycles
- mov al,[esi] ;U 1
- inc esi ;Vee 1
- test al,al ;U 1
- jz ??slt_skip ;Vee 1/5
- ??slt_not_trans:mov [edi],al ;u 1
- inc edi ;vee 1
- dec ecx ;u 1
- jnz ??slt_mask_map_lp ;vee (maybe) 1
- ??slt_end_line: epilogue
- next_line
- align 32
- ??slt_skip: inc edi
- dec ecx
- jz ??slt_skip_end_line
- mov al,[esi]
- inc esi
- test al,al
- jz ??slt_skip2
- mov [edi],al
- inc edi
- dec ecx
- jnz ??slt_mask_map_lp
- epilogue
- next_line
- align 32
- ??slt_skip2: inc edi
- dec ecx
- jz ??slt_end_line
- ;
- ; If we have hit two transparent pixels in a row then we go into
- ; the transparent optimised bit
- ;
- ??slt_round_again:
- rept 64
- mov al,[esi] ; ;pipe 1
- inc esi ;1 ;pipe 2
- test al,al ; ;pipe 1
- jnz ??slt_not_trans;pipe 2 (not pairable in 1)
- ;2
- inc edi ; ;pipe 1
- dec ecx ;3 ;pipe 2
- jz ??slt_end_line ;4 ;pipe 1 (not pairable)
- endm ; best case is 4 cycles per iteration
- jmp ??slt_round_again
- ??slt_skip_end_line:
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with no transparent pixels
- ;
- ; 11/29/95 10:21AM - ST
- ;
- ; We have to align the destination for cards that dont bankswitch correctly
- ; when you write non-aligned data.
- ;
- align 32
- Long_Single_Line_Copy:
- prologue
- rept 3
- test edi,3
- jz ??LSLC_aligned
- movsb
- dec ecx
- endm
- ??LSLC_aligned:
- mov ebx,ecx
- shr ecx,2
- rep movsd
- and ebx,3
- jz ??out
- movsb
- dec bl
- jz ??out
- movsb
- dec bl
- jz ??out
- movsb
- ??out: epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single short line with no transparent pixels
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Short_Single_Line_Copy:
- prologue
- cmp ecx,16
- jge Long_Single_Line_Copy
- mov ebx,ecx
- rep movsb
- mov ecx,ebx
- epilogue
- next_line
- ;*****************************************************************************
- ; Skip a line of source that is all transparent
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Skip:
- prologue
- add esi,ecx
- add edi,ecx
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with ghosting
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Ghost:
- prologue
- xor eax,eax
- ??slg_loop: mov al,[esi]
- mov ebx,[IsTranslucent]
- inc esi
- mov bh,[eax+ebx]
- cmp bh,-1
- jz ??slg_store_pixel
- and ebx,0ff00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[eax+ebx]
- ??slg_store_pixel:
- mov [edi],al
- inc edi
- dec ecx
- jnz ??slg_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels and ghosting
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Ghost_Trans:
- prologue
- xor eax,eax
- ; cmp ecx,3
- ; ja ??slgt4
- ??slgt_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slgt_transparent
- ??slgt_not_transparent:
- mov ebx,[IsTranslucent]
- mov bh,[eax+ebx]
- cmp bh,-1
- jz ??slgt_store_pixel
- and ebx,0ff00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[eax+ebx]
- ??slgt_store_pixel:
- mov [edi],al
- inc edi
- dec ecx
- jnz ??slgt_loop
- epilogue
- next_line
- align 32
- ??slgt_transparent:
- inc edi ;1
- dec ecx ;2
- jz ??slgt_out ;1 (not pairable)
- ??slgt_round_again:
- rept 64
- mov al,[esi] ; ;pipe 1
- inc esi ;1 ;pipe 2
- test al,al ; ;pipe 1
- jnz ??slgt_not_transparent ;pipe 2 (not pairable in 1)
- ;2
- inc edi ; ;pipe 1
- dec ecx ;3 ;pipe 2
- jz ??slgt_out ;4 ;pipe 1 (not pairable)
- endm ; best case is 4 cycles per iteration
- jmp ??slgt_round_again
- ??slgt_out: epilogue
- next_line
- ;
- ; Optimised video memory access version
- ;
- align 32
- ??slgt4: push edx
- mov edx,[edi]
- rept 4
- local slgt4_store1
- local slgt4_trans1
- mov al,[esi]
- inc esi
- test al,al
- jz slgt4_trans1
- mov ebx,[IsTranslucent]
- mov bh,[eax+ebx]
- cmp bh,-1
- jz slgt4_store1
- and ebx,0ff00h
- mov al,dl
- add ebx,[Translucent]
- mov al,[eax+ebx]
- slgt4_store1: mov dl,al
- slgt4_trans1: ror edx,8
- endm
- mov [edi],edx
- pop edx
- lea edi,[edi+4]
- lea ecx,[ecx+0fffffffch]
- cmp ecx,3
- ja ??slgt4
- test ecx,ecx
- jnz ??slgt_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with fading (colour remapping)
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Fading:
- prologue
- xor eax,eax
- mov ebx,[FadingTable]
- push ebp
- mov ebp,[FadingNum]
- push ebp
- ??slf_loop: mov al,[esi]
- inc esi
- mov ebp,[esp]
- ??slf_fade_loop:mov al,[ebx+eax]
- dec ebp
- jnz ??slf_fade_loop
- mov [edi],al
- inc edi
- dec ecx
- jnz ??slf_loop
- add esp,4
- pop ebp
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels and fading (colour remapping)
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Fading_Trans:
- prologue
- xor eax,eax
- mov ebx,[FadingTable]
- push ebp
- mov ebp,[FadingNum]
- push ebp
- ??slft_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slft_transparent
- mov ebp,[esp]
- ??slft_fade_loop:
- mov al,[ebx+eax]
- dec ebp
- jnz ??slft_fade_loop
- mov [edi],al
- ??slft_transparent:
- inc edi
- dec ecx
- jnz ??slft_loop
- add esp,4
- pop ebp
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with a single fade level (colour remap)
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Single_Fade:
- prologue
- xor eax,eax
- mov ebx,[FadingTable]
- ??slsf_loop: mov al,[esi]
- mov al,[ebx+eax]
- mov [edi],al
- inc esi
- inc edi
- dec ecx
- jnz ??slsf_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels and a single fade level (colour remap)
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Single_Fade_Trans:
- prologue
- xor eax,eax
- mov ebx,[FadingTable]
- ??slsft_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slsft_transparent
- mov al,[ebx+eax]
- mov [edi],al
- inc edi
- dec ecx
- jnz ??slsft_loop
- epilogue
- next_line
- align 32
- ??slsft_transparent:
- inc edi
- dec ecx
- jz ??slsft_next_line
- mov al,[esi]
- inc esi
- test al,al
- jz ??slsft_transparent
- mov al,[ebx+eax]
- mov [edi],al
- inc edi
- dec ecx
- jnz ??slsft_loop
- ??slsft_next_line:
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with ghosting and fading (colour remapping)
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Ghost_Fading:
- prologue
- mov [StashECX],ecx
- ??SLGF_loop: xor eax,eax
- mov al,[esi]
- mov ebx,[IsTranslucent]
- mov bh,[eax+ebx]
- cmp bh,-1
- jz ??slgf_do_fading
- and ebx,0ff00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[ebx+eax]
- ??slgf_do_fading:
- mov ebx,[FadingTable]
- mov ecx,[FadingNum]
- ??slgf_fade_loop:
- mov al,[eax+ebx]
- dec ecx
- jnz ??slgf_fade_loop
- mov [edi],al
- inc esi
- inc edi
- dec [StashECX]
- jnz ??SLGF_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels, ghosting and fading
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Ghost_Fading_Trans:
- prologue
- mov [StashECX],ecx
- xor eax,eax
- ; cmp ecx,3
- ; ja ??slgft4
- ??SLGFT_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slgft_trans_pixel
- mov ebx,[IsTranslucent]
- mov bh,[eax+ebx]
- cmp bh,-1
- jz ??slgft_do_fading
- and ebx,0ff00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[ebx+eax]
- ??slgft_do_fading:
- mov ebx,[FadingTable]
- mov ecx,[FadingNum]
- ??slgft_fade_loop:
- mov al,[eax+ebx]
- dec ecx
- jnz ??slgft_fade_loop
- mov [edi],al
- ??slgft_trans_pixel:
- inc edi
- dec [StashECX]
- jnz ??SLGFT_loop
- epilogue
- next_line
- align 32
- ??slgft4: push edx
- mov edx,[edi]
- rept 4
- local slgft4_fade
- local slgft4_fade_lp
- local slgft4_trans
- mov al,[esi]
- inc esi
- test al,al
- jz slgft4_trans
- mov ebx,[IsTranslucent]
- mov bh,[eax+ebx]
- cmp bh,-1
- jz slgft4_fade
- and ebx,0ff00h
- mov al,dl
- add ebx,[Translucent]
- mov al,[ebx+eax]
- slgft4_fade: mov ebx,[FadingTable]
- mov ecx,[FadingNum]
- slgft4_fade_lp: mov al,[eax+ebx]
- dec ecx
- jnz slgft4_fade_lp
- mov dl,al
- slgft4_trans: ror edx,8
- endm
- mov [edi],edx
- pop edx
- lea edi,[edi+4]
- sub [StashECX],4
- jz ??slgft4_out
- cmp [StashECX],3
- ja ??slgft4
- jmp ??SLGFT_loop
- ??slgft4_out: epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with predator effect
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator:
- prologue
- ??slp_loop: mov al,[esi]
- mov ebx,[BFPartialCount]
- add ebx,[BFPartialPred]
- or bh,bh
- jnz ??slp_get_pred
- mov [BFPartialCount] , ebx
- jmp ??slp_skip_pixel
- ??slp_get_pred: xor bh , bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount] , ebx
- add [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax]
- and [BYTE BFPredOffset],PRED_MASK
- and eax,0ffffh
- mov al,[edi+eax]
- mov [edi],al
- ??slp_skip_pixel:
- inc esi
- inc edi
- dec ecx
- jnz ??slp_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels and predator effect
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator_Trans:
- prologue
- ??slpt_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slpt_skip_pixel
- mov ebx,[BFPartialCount]
- add ebx,[BFPartialPred]
- or bh,bh
- jnz ??slpt_get_pred
- mov [BFPartialCount] , ebx
- jmp ??slpt_skip_pixel
- ??slpt_get_pred:xor bh , bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount] , ebx
- add [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax]
- and [BYTE PTR BFPredOffset ] , PRED_MASK
- and eax,0ffffh
- mov al,[edi+eax]
- mov [edi],al
- ??slpt_skip_pixel:
- inc edi
- dec ecx
- jnz ??slpt_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with predator and ghosting
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator_Ghost:
- prologue
- ??slpg_loop: mov al,[esi]
- mov ebx,[BFPartialCount]
- add ebx,[BFPartialPred]
- test bh,bh
- jnz ??slpg_get_pred ; is this a predator pixel?
- mov [BFPartialCount],ebx
- jmp ??slpg_check_ghost
- ??slpg_get_pred:
- xor bh,bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount],ebx
- add [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax ]
- and [BYTE BFPredOffset],PRED_MASK
- and eax,0ffffh
- mov al,[edi+eax]
- ??slpg_check_ghost:
- mov ebx,[IsTranslucent]
- mov bh,[ebx+eax]
- cmp bh,0ffh
- je ??slpg_store_pixel
- xor eax,eax
- and ebx,0FF00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[ebx+eax]
- ??slpg_store_pixel:
- mov [edi],al
- inc esi
- inc edi
- dec ecx
- jnz ??slpg_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels, predator and ghosting
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator_Ghost_Trans:
- prologue
- ??slpgt_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slpgt_transparent
- mov ebx,[BFPartialCount]
- add ebx,[BFPartialPred]
- test bh,bh
- jnz ??slpgt_get_pred ; is this a predator pixel?
- mov [BFPartialCount],ebx
- jmp ??slpgt_check_ghost
- ??slpgt_get_pred:
- xor bh,bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount],ebx
- add [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax ]
- and [BYTE BFPredOffset],PRED_MASK
- and eax,0ffffh
- mov al,[edi+eax]
- ??slpgt_check_ghost:
- mov ebx,[IsTranslucent]
- mov bh,[ebx+eax]
- cmp bh,0ffh
- je ??slpgt_store_pixel
- xor eax,eax
- and ebx,0FF00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[ebx+eax]
- ??slpgt_store_pixel:
- mov [edi],al
- ??slpgt_transparent:
- inc edi
- dec ecx
- jnz ??slpgt_loop
- pop ecx
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with predator and fading
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator_Fading:
- prologue
- mov [StashECX],ecx
- ??slpf_loop: mov al,[esi]
- mov ebx,[BFPartialCount]
- inc esi
- add ebx,[BFPartialPred]
- test bh,bh
- jnz ??slpf_get_pred
- mov [BFPartialCount],ebx
- jmp ??slpf_do_fading
- ??slpf_get_pred:xor bh,bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount],ebx
- and [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax]
- and [BYTE BFPredOffset],PRED_MASK
- and eax,0ffffh
- mov al,[eax+edi]
- ??slpf_do_fading:
- and eax,255
- mov ebx,[FadingTable]
- mov ecx,[FadingNum]
- ??slpf_fade_loop:
- mov al,[eax+ebx]
- dec ecx
- jnz ??slpf_fade_loop
- mov [edi],al
- inc edi
- dec [StashECX]
- jnz ??slpf_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels, fading and predator
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator_Fading_Trans:
- prologue
- mov [StashECX],ecx
- ??slpft_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slpft_transparent
- mov ebx,[BFPartialCount]
- add ebx,[BFPartialPred]
- test bh,bh
- jnz ??slpft_get_pred
- mov [BFPartialCount],ebx
- jmp ??slpft_do_fading
- ??slpft_get_pred:
- xor bh,bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount],ebx
- and [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax]
- and [BYTE BFPredOffset],PRED_MASK
- and eax,0ffffh
- mov al,[eax+edi]
- ??slpft_do_fading:
- and eax,255
- mov ebx,[FadingTable]
- mov ecx,[FadingNum]
- ??slpft_fade_loop:
- mov al,[eax+ebx]
- dec ecx
- jnz ??slpft_fade_loop
- mov [edi],al
- ??slpft_transparent:
- inc edi
- dec [StashECX]
- jnz ??slpft_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with predator, ghosting and fading
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator_Ghost_Fading:
- prologue
- mov [StashECX],ecx
- ??slpgf_loop: mov al,[esi]
- mov ebx,[BFPartialCount]
- inc esi
- add ebx,[BFPartialPred]
- test bh , bh
- jnz ??slpgf_get_pred ; is this a predator pixel?
- mov [BFPartialCount],ebx
- jmp ??slpgf_check_ghost
- ??slpgf_get_pred:
- xor bh,bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount],ebx
- add [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax]
- and [BYTE BFPredOffset],PRED_MASK
- and eax,0ffffh
- mov al,[edi+eax]
- ??slpgf_check_ghost:
- and eax,255
- mov ebx,[IsTranslucent]
- mov bh,[ebx+eax]
- cmp bh,0ffh
- je ??slpgf_do_fading
- and ebx , 0FF00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[ebx+eax]
- ??slpgf_do_fading:
- xor eax,eax
- mov ebx,[FadingTable]
- mov ecx,[FadingNum]
- ??slpgf_fade_loop:
- mov al,[ebx+eax]
- dec ecx
- jnz ??slpgf_fade_loop
- ??slpgf_store_pixel:
- mov [edi],al
- inc edi
- dec [StashECX]
- jnz ??slpgf_loop
- epilogue
- next_line
- ;*****************************************************************************
- ; Draw a single line with transparent pixels, predator, ghosting and fading
- ;
- ; 11/29/95 10:21AM - ST
- ;
- align 32
- Single_Line_Predator_Ghost_Fading_Trans:
- prologue
- mov [StashECX],ecx
- ??slpgft_loop: mov al,[esi]
- inc esi
- test al,al
- jz ??slpgft_transparent
- mov ebx,[BFPartialCount]
- add ebx,[BFPartialPred]
- test bh , bh
- jnz ??slpgft_get_pred ; is this a predator pixel?
- mov [BFPartialCount],ebx
- jmp ??slpgft_check_ghost
- ??slpgft_get_pred:
- xor bh,bh
- mov eax,[BFPredOffset]
- mov [BFPartialCount],ebx
- add [BYTE BFPredOffset],2
- mov eax,[DWORD BFPredTable+eax]
- and [BYTE BFPredOffset],PRED_MASK
- and eax,0ffffh
- mov al,[edi+eax]
- ??slpgft_check_ghost:
- and eax,255
- mov ebx,[IsTranslucent]
- mov bh,[ebx+eax]
- cmp bh,0ffh
- je ??slpgft_do_fading
- and ebx , 0FF00h
- mov al,[edi]
- add ebx,[Translucent]
- mov al,[ebx+eax]
- ??slpgft_do_fading:
- xor eax,eax
- mov ebx,[FadingTable]
- mov ecx,[FadingNum]
- ??slpgft_fade_loop:
- mov al,[ebx+eax]
- dec ecx
- jnz ??slpgft_fade_loop
- ??slpgft_store_pixel:
- mov [edi],al
- ??slpgft_transparent:
- inc edi
- dec [StashECX]
- jnz ??slpgft_loop
- epilogue
- next_line
- ends ;end of strict alignment segment
- codeseg
- global BF_Trans:near
- BF_Trans:
- prologue
- ; calc the code location to skip to 10 bytes per REPT below!!!!
- mov ecx , eax
- and ecx , 01fh
- lea ecx , [ ecx + ecx * 4 ] ; quick multiply by 5
- neg ecx
- shr eax , 5
- lea ecx , [ ??trans_reference + ecx * 2 ] ; next multiply by 2
- mov [ loop_cnt ] , eax
- mov [ jmp_loc ] , ecx
- ??trans_loop:
- mov ecx , [ loop_cnt ]
- jmp [ jmp_loc ]
- ; the following code should NOT be changed without changing the calculation
- ; above!!!!!!
- ??trans_line:
- REPT 32
- local trans_pixel
- mov bl , [ esi ]
- inc esi
- test bl , bl
- jz trans_pixel
- mov [ edi ] , bl
- trans_pixel:
- inc edi
- ENDM
- ??trans_reference:
- dec ecx
- jge ??trans_line
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??trans_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Ghost:near
- BF_Ghost:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??ghost_reference - ??ghost_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??ghost_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??ghost_loop:
- mov ecx , [ loop_cnt ]
- jmp [ jmp_loc ]
- ??ghost_line:
- REPT 32
- local store_pixel
- mov al , [ esi ]
- inc esi
- mov ebx , [ IsTranslucent ] ; is it a translucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je store_pixel
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (trans_color * 256) of the translation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- store_pixel:
- mov [ edi ] , al
- inc edi
- ENDM
- ??ghost_reference:
- dec ecx
- jge ??ghost_line
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??ghost_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Ghost_Trans:near
- BF_Ghost_Trans:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??ghost_t_reference - ??ghost_t_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??ghost_t_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??ghost_t_loop:
- mov ecx , [ loop_cnt ]
- jmp [ jmp_loc ]
- ??ghost_t_line:
- REPT 32
- local transp_pixel
- local store_pixel
- mov al , [ esi ]
- inc esi
- test al , al
- jz transp_pixel
- mov ebx , [ IsTranslucent ] ; is it a translucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je store_pixel
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (trans_color * 256) of the translation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- store_pixel:
- mov [ edi ] , al
- transp_pixel:
- inc edi
- ENDM
- ??ghost_t_reference:
- dec ecx
- jge ??ghost_t_line
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??ghost_t_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Fading:near
- BF_Fading:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??fading_reference - ??fading_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??fading_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??fading_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- mov ebx , [ FadingTable ] ; run color through fading table
- jmp [ jmp_loc ]
- ??fading_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??fading_line:
- REPT 32
- local fade_loop
- mov al , [ esi ]
- inc esi
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- mov [ edi ] , al
- inc edi
- ENDM
- ??fading_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??fading_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??fading_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Fading_Trans:near
- BF_Fading_Trans:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??fading_t_reference - ??fading_t_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??fading_t_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??fading_t_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- mov ebx , [ FadingTable ] ; run color through fading table
- jmp [ jmp_loc ]
- ??fading_t_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??fading_t_line:
- REPT 32
- local transp_pixel
- local fade_loop
- mov al , [ esi ]
- inc esi
- test al , al
- jz transp_pixel
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- mov [ edi ] , al
- transp_pixel:
- inc edi
- ENDM
- ??fading_t_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??fading_t_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??fading_t_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Ghost_Fading:near
- BF_Ghost_Fading:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??ghost_f_reference - ??ghost_f_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??ghost_f_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??ghost_f_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- jmp [ jmp_loc ]
- ??ghost_f_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??ghost_f_line:
- REPT 32
- local store_pixel
- local do_fading
- local fade_loop
- mov al , [ esi ]
- inc esi
- mov ebx , [ IsTranslucent ] ; is it a lucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je do_fading
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the lation table
- ; ((_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (_color * 256) of the lation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- ; DRD jmp store_pixel
- do_fading:
- mov ebx , [ FadingTable ] ; run color through fading table
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- store_pixel:
- mov [ edi ] , al
- inc edi
- ENDM
- ??ghost_f_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??ghost_f_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??ghost_f_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Ghost_Fading_Trans:near
- BF_Ghost_Fading_Trans:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??ghost_f_t_reference - ??ghost_f_t_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??ghost_f_t_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??ghost_f_t_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- jmp [ jmp_loc ]
- ??ghost_f_t_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??ghost_f_t_line:
- REPT 32
- local transp_pixel
- local store_pixel
- local do_fading
- local fade_loop
- mov al , [ esi ]
- inc esi
- test al , al
- jz transp_pixel
- mov ebx , [ IsTranslucent ] ; is it a translucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je do_fading
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (trans_color * 256) of the translation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- ; DRD jmp store_pixel
- do_fading:
- mov ebx , [ FadingTable ] ; run color through fading table
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- store_pixel:
- mov [ edi ] , al
- transp_pixel:
- inc edi
- ENDM
- ??ghost_f_t_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??ghost_f_t_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??ghost_f_t_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator:near
- BF_Predator:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_reference - ??predator_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_loop:
- mov ecx , [ loop_cnt ]
- jmp [ jmp_loc ]
- ??predator_line:
- REPT 32
- local get_pred
- local skip_pixel
- mov al , [ esi ]
- inc esi
- mov ebx , [ BFPartialCount ]
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp skip_pixel
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- ; xor bh , bh
- ; mov eax , [ BFPredValue ] ; pick up a color offset a pseudo-
- ; ; random amount from the current
- ; mov [ BFPartialCount ] , ebx
- ; mov al , [ edi + eax ] ; viewport address
- mov [ edi ] , al
- skip_pixel:
- inc edi
- ENDM
- ??predator_reference:
- dec ecx
- jge ??predator_line
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator_Trans:near
- BF_Predator_Trans:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_t_reference - ??predator_t_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_t_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_t_loop:
- mov ecx , [ loop_cnt ]
- jmp [ jmp_loc ]
- ??predator_t_line:
- REPT 32
- local trans_pixel
- local get_pred
- local store_pixel
- mov al , [ esi ]
- inc esi
- test al , al
- jz trans_pixel
- mov ebx , [ BFPartialCount ]
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp store_pixel
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- store_pixel:
- mov [ edi ] , al
- trans_pixel:
- inc edi
- ENDM
- ??predator_t_reference:
- dec ecx
- jge ??predator_t_line
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_t_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator_Ghost:near
- BF_Predator_Ghost:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_g_reference - ??predator_g_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_g_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_g_loop:
- mov ecx , [ loop_cnt ]
- jmp [ jmp_loc ]
- ??predator_g_line:
- REPT 32
- local get_pred
- local check_ghost
- local store_pixel
- mov al , [ esi ]
- mov ebx , [ BFPartialCount ]
- inc esi
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp check_ghost
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- check_ghost:
- mov ebx , [ IsTranslucent ] ; is it a translucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je store_pixel
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (trans_color * 256) of the translation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- store_pixel:
- mov [ edi ] , al
- inc edi
- ENDM
- ??predator_g_reference:
- dec ecx
- jge ??predator_g_line
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_g_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator_Ghost_Trans:near
- BF_Predator_Ghost_Trans:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_g_t_reference - ??predator_g_t_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_g_t_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_g_t_loop:
- mov ecx , [ loop_cnt ]
- jmp [ jmp_loc ]
- ??predator_g_t_line:
- REPT 32
- local trans_pixel
- local get_pred
- local check_ghost
- local store_pixel
- mov al , [ esi ]
- inc esi
- test al , al
- jz trans_pixel
- mov ebx , [ BFPartialCount ]
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp check_ghost
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- check_ghost:
- mov ebx , [ IsTranslucent ] ; is it a translucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je store_pixel
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (trans_color * 256) of the translation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- store_pixel:
- mov [ edi ] , al
- trans_pixel:
- inc edi
- ENDM
- ??predator_g_t_reference:
- dec ecx
- jge ??predator_g_t_line
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_g_t_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator_Fading:near
- BF_Predator_Fading:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_f_reference - ??predator_f_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_f_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_f_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- jmp [ jmp_loc ]
- ??predator_f_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??predator_f_line:
- REPT 32
- local get_pred
- local do_fading
- local fade_loop
- mov al , [ esi ]
- mov ebx , [ BFPartialCount ]
- inc esi
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp do_fading
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- do_fading:
- mov ebx , [ FadingTable ] ; run color through fading table
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- mov [ edi ] , al
- inc edi
- ENDM
- ??predator_f_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??predator_f_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_f_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator_Fading_Trans:near
- BF_Predator_Fading_Trans:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_f_t_reference - ??predator_f_t_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_f_t_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_f_t_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- jmp [ jmp_loc ]
- ??predator_f_t_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??predator_f_t_line:
- REPT 32
- local trans_pixel
- local get_pred
- local do_fading
- local fade_loop
- mov al , [ esi ]
- inc esi
- test al , al
- jz trans_pixel
- mov ebx , [ BFPartialCount ]
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp do_fading
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- do_fading:
- mov ebx , [ FadingTable ] ; run color through fading table
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- mov [ edi ] , al
- trans_pixel:
- inc edi
- ENDM
- ??predator_f_t_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??predator_f_t_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_f_t_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator_Ghost_Fading:near
- BF_Predator_Ghost_Fading:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_g_f_reference - ??predator_g_f_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_g_f_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_g_f_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- jmp [ jmp_loc ]
- ??predator_g_f_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??predator_g_f_line:
- REPT 32
- local get_pred
- local check_ghost
- local store_pixel
- local do_fading
- local fade_loop
- mov al , [ esi ]
- mov ebx , [ BFPartialCount ]
- inc esi
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp check_ghost
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- check_ghost:
- mov ebx , [ IsTranslucent ] ; is it a translucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je do_fading
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (trans_color * 256) of the translation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- ; DRD jmp store_pixel
- do_fading:
- mov ebx , [ FadingTable ] ; run color through fading table
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- store_pixel:
- mov [ edi ] , al
- inc edi
- ENDM
- ??predator_g_f_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??predator_g_f_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_g_f_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- global BF_Predator_Ghost_Fading_Trans:near
- BF_Predator_Ghost_Fading_Trans:
- prologue
- mov ebx , eax ; width
- ; NOTE: the below calculation assumes a group of instructions is
- ; less than 256 bytes
- ; get length of the 32 groups of instructions
- lea ecx , [ ??predator_g_f_t_reference - ??predator_g_f_t_line ]
- shr ebx , 5 ; width / 32
- shr ecx , 5 ; length of instructions / 32
- and eax , 01fh ; mod of width / 32
- mul cl ; calc offset to start of group
- neg eax ; inverse of width
- mov [ loop_cnt ] , ebx ; save width / 32
- lea ecx , [ ??predator_g_f_t_reference + eax ]
- mov eax , 0
- mov [ jmp_loc ] , ecx
- ??predator_g_f_t_loop:
- mov ecx , [ loop_cnt ]
- mov [ StashECX ] , ecx ; preserve ecx for later
- jmp [ jmp_loc ]
- ??predator_g_f_t_line_begin:
- mov [ StashECX ] , ecx ; preserve ecx for later
- ??predator_g_f_t_line:
- REPT 32
- local trans_pixel
- local get_pred
- local check_ghost
- local store_pixel
- local do_fading
- local fade_loop
- mov al , [ esi ]
- inc esi
- test al , al
- jz trans_pixel
- mov ebx , [ BFPartialCount ]
- add ebx , [ BFPartialPred ]
- or bh , bh
- jnz get_pred ; is this a predator pixel?
- mov [ BFPartialCount ] , ebx
- jmp check_ghost
- get_pred:
- xor bh , bh
- mov eax, [ BFPredOffset ]
- mov [ BFPartialCount ] , ebx
- add [ BYTE PTR BFPredOffset ] , 2
- movzx eax , [ WORD PTR BFPredTable + eax ]
- and [ BYTE PTR BFPredOffset ] , PRED_MASK
- ; pick up a color offset a pseudo-
- ; random amount from the current
- movzx eax , [ BYTE PTR edi + eax ] ; viewport address
- check_ghost:
- mov ebx , [ IsTranslucent ] ; is it a translucent color?
- mov bh , [ BYTE PTR ebx + eax ]
- cmp bh , 0ffh
- je do_fading
- and ebx , 0FF00h ; clear all of ebx except bh
- ; we have the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- mov al , [ edi ] ; mov pixel at destination to al
- add ebx , [ Translucent ] ; get the ptr to it!
- ; Add the (trans_color * 256) of the translation equ.
- mov al , [ BYTE PTR ebx + eax ] ; get new pixel in al
- ; DRD jmp store_pixel
- do_fading:
- mov ebx , [ FadingTable ] ; run color through fading table
- mov ecx , [ FadingNum ]
- fade_loop:
- mov al, [BYTE PTR ebx + eax]
- dec ecx
- jnz fade_loop
- store_pixel:
- mov [ edi ] , al
- trans_pixel:
- inc edi
- ENDM
- ??predator_g_f_t_reference:
- mov ecx , [ StashECX ] ; restore ecx for main draw loop
- dec ecx
- jge ??predator_g_f_t_line_begin
- add esi , [ scr_adjust_width ]
- add edi , [ dest_adjust_width ]
- dec edx
- jnz ??predator_g_f_t_loop
- epilogue
- ret
- ;********************************************************************
- ;********************************************************************
- Not_Supported:
- ret
- ENDP Buffer_Frame_To_Page
- END
- ;***************************************************************************
- ;** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S **
- ;***************************************************************************
- ;* *
- ;* Project Name : Westwood Library *
- ;* *
- ;* File Name : KEYFBUFF.ASM *
- ;* *
- ;* Programmer : Phil W. Gorrow *
- ;* *
- ;* Start Date : July 16, 1992 *
- ;* *
- ;* Last Update : October 2, 1994 [JLB] *
- ;* *
- ;*-------------------------------------------------------------------------*
- ;* Functions: *
- ;* BUFFER_FRAME_TO_LOGICPAGE -- *
- ;* Normal_Draw -- Function that writes a normal pixel line *
- ;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
- IDEAL
- P386
- IDEAL_MODE EQU 1
- INCLUDE "wwlib.i"
- ;-------------------------------------------------------------------
- ; Extern all the library variables that this module requires
- ;-------------------------------------------------------------------
- EXTRN C MaskPage:WORD
- EXTRN C BackGroundPage:WORD
- ;-------------------------------------------------------------------
- ; Define all the equates that this module requires
- ;-------------------------------------------------------------------
- WIN_X EQU 0 ; offset for the x coordinate
- WIN_Y EQU 2 ; offset for the y coordinate
- WIN_WIDTH EQU 4 ; offset for the window width
- WIN_HEIGHT EQU 6 ; offset for the window height
- BYTESPERROW EQU 320 ; number of bytes per row
- FLAG_NORMAL EQU 0 ; flag for normal draw
- FLAG_GHOST EQU 1 ; This flag enables the ghost
- FLAG_PRIORITY_TRANS EQU 2 ; flag for priority and transparent
- FLAG_TRANS EQU 4 ; flag for transparent draw
- FLAG_PRIORITY EQU 8 ; flag for priority draw
- ; fx on the above flags
- FLAG_MASK EQU 15 ; used to and of uneeded bits
- SHAPE_NORMAL EQU 0000h ; Standard shape.
- ;SHAPE_HORZ_REV EQU 0001h ; Flipped horizontally.
- ;SHAPE_VERT_REV EQU 0002h ; Flipped vertically.
- ;SHAPE_SCALING EQU 0004h ; Scaled (WORD scale_x, WORD scale_y)
- SHAPE_WIN_REL EQU 0010h ; Coordinates are window relative instead of absolute.
- SHAPE_CENTER EQU 0020h ; Coordinates are based on shape's center point.
- SHAPE_TRANS EQU 0040h ; has transparency
- ;SHAPE_FADING EQU 0100h ; Fading effect active (VOID * fading_table, WORD fading_num).
- ;SHAPE_PREDATOR EQU 0200h ; Transparent warping effect.
- ;SHAPE_COMPACT EQU 0400h ; Never use this bit.
- SHAPE_PRIORITY EQU 0800h ; Use priority system when drawing.
- SHAPE_GHOST EQU 1000h ; Transluscent table process.
- ;SHAPE_SHADOW EQU 2000h ; ????
- ;SHAPE_PARTIAL EQU 4000h ; ????
- ;SHAPE_COLOR EQU 8000h ; Remap the shape's colors (VOID * color_table).
- ; MBL MOD 12.1.92
- CLEAR_NON_WALK_BIT_AND_SCALE_BITS EQU 7 ; Makes it one AND per pixel in Priority_Trans display
- CLEAR_NON_WALK_BIT EQU 7fh ; and with 0111-1111 to clear non-walkable high bit
- CLEAR_SCALE_BITS EQU 87h ; and with 1000-0111 to clear scaling id bits
- NON_WALKABLE_BIT EQU 80h ; and with 1000-0000 to clear all but non-walkable bit
- ; END MBL MOD
- CODESEG
- ; 1 = GHOST (all odd entrys are prefixed with Ghost_)
- ; 2 = BLAAAH
- ; 4 = Trans (prfx)
- ; 8 = Prior (prfx)
- ;---------------------------------------------------------------------------
- ; Define the table of different line draw types
- ;---------------------------------------------------------------------------
- LineTable DW WSA_Normal_Draw ;0
- DW Ghost_Normal_Draw ;1
- DW 0 ;2
- DW 0 ;3
- DW Transparent_Draw ;4
- DW Ghost_Transparent_Draw ;5
- DW 0 ;6
- DW 0 ;7
- DW Priority_Draw ;8
- DW Ghost_Priority_Draw ;9
- DW 0 ;10
- DW 0 ;11
- DW Priority_Transparent_Draw ;12
- DW Ghost_Priority_Transparent_Draw ;13
- DW 0 ;14
- DW 0 ;15
- ;***************************************************************************
- ;* BUFFER_FRAME_TO_LOGICPAGE -- *
- ;* *
- ;* *
- ;* *
- ;* INPUT: *
- ;* *
- ;* OUTPUT: *
- ;* *
- ;* WARNINGS: *
- ;* *
- ;* HISTORY: *
- ;* 07/16/1992 PWG : Created. *
- ;*=========================================================================*
- PUBLIC C Buffer_Frame_To_LogicPage
- PROC C Buffer_Frame_To_LogicPage FAR USES ax bx ecx dx ds esi es edi
- ;-------------------------------------------------------------------
- ; Define the arguements that our program takes.
- ;-------------------------------------------------------------------
- ARG x_pixel:WORD ; x pixel position to draw at
- ARG y_pixel:WORD ; y pixel position to draw at
- ARG pixel_w:WORD ; pixel width of draw region
- ARG pixel_h:WORD ; pixel height of draw region
- ARG win:WORD ; window to clip around
- ARG flags:WORD ; flags that this routine will take
- ARG buffer:DWORD ; pointer to the buffer with data
- ARG args:WORD
- ;-------------------------------------------------------------------
- ; Define the local variables that our program uses
- ;-------------------------------------------------------------------
- LOCAL IsTranslucent:DWORD ; ptr to the is_translucent table
- LOCAL Translucent:DWORD ; ptr to the actual translucent table
- LOCAL win_x1:WORD ; clip window left x pixel position
- LOCAL win_x2:WORD ; clip window right x pixel position
- LOCAL win_y1:WORD ; clip window top y pixel position
- LOCAL win_y2:WORD ; clip window bottom y pixel position
- LOCAL clipleft:WORD ; number of pixels to clip on left
- LOCAL clipright:WORD ; number of pixels to clip on right
- LOCAL nextline:WORD ; offset to the next line
- LOCAL putmiddle:WORD ; routine to call to put the middle
- LOCAL maskpage:WORD ; location of the depth masks
- LOCAL background:WORD ; location of the background data
- LOCAL jflags:WORD ; location of the background data
- LOCAL priority:BYTE ; the priority level of the back
- push fs
- xor ecx,ecx
- ;--------------------------------------------------------------------
- ; Check to see if we have supplied any GHOST tables.
- ;--------------------------------------------------------------------
- push di
- mov di,6
- mov [jflags],0
- ??ghost:
- test [flags],SHAPE_GHOST ; are we ghosting this shape
- jz short ??no_ghost ; if not then skip and do more
- or [jflags],FLAG_GHOST
- les ax,[DWORD PTR buffer + di]
- ; get the "are we really translucent?" table
- mov [WORD PTR IsTranslucent],ax
- mov [WORD PTR IsTranslucent + 2],es
- add ax,0100h ; add to offset for tables
- ; get the "ok we are translucent!!" table
- mov [WORD PTR Translucent],ax
- mov [WORD PTR Translucent + 2],es
- add di,4
- ??no_ghost:
- pop di
- ;-------------------------------------------------------------------
- ; See if we need to center the frame
- ;-------------------------------------------------------------------
- test [flags],SHAPE_CENTER ; does this need to be centered?
- je short ??no_centering ; if not the skip over this stuff
- mov ax,[pixel_w]
- mov bx,[pixel_h]
- sar ax,1
- sar bx,1
- sub [x_pixel],ax
- sub [y_pixel],bx
- ??no_centering:
- mov ax,[flags]
- and ax,SHAPE_PRIORITY+SHAPE_TRANS
- cmp ax,SHAPE_PRIORITY+SHAPE_TRANS
- jne short ??test_trans
- or [jflags],FLAG_PRIORITY_TRANS
- jmp short ??priority
- ;-------------------------------------------------------------------
- ; Get the trans information if we need to get it
- ;-------------------------------------------------------------------
- ??test_trans:
- test [flags],SHAPE_TRANS ; does this draw use transparencies?
- je short ??test_priority ; if not the skip over this junk
- or [jflags],FLAG_TRANS
- ??test_priority:
- ;-------------------------------------------------------------------
- ; Get the priority information if we need to get it
- ;-------------------------------------------------------------------
- test [flags],SHAPE_PRIORITY ; does this draw use priorities?
- je short ??no_priority ; if not the skip over this junk
- or [jflags],FLAG_PRIORITY
- ??priority:
- mov ax,[BackGroundPage] ; get the background page from ds
- mov [background],ax ; and store it on the stack
- mov ax,[MaskPage] ; get the mask page from ds
- mov [maskpage],ax ; and store it on the stack
- mov ax,[WORD PTR buffer + 4]; get the priority level from args
- mov [priority],al ; and store it in a local
- ;-------------------------------------------------------------------
- ; Get the draw routine that we are going to draw with
- ;-------------------------------------------------------------------
- ??no_priority:
- ; mov bx,[flags] ; load in the current flags byte
- ; and bx,FLAG_MASK ; prevent lockup on bad value
- mov bx,[jflags] ; load in the jump table flags
- shl bx,1
- mov ax,[WORD PTR LineTable + bx] ; get the offset of the skip table
- mov [putmiddle],ax ; store off the new offset
- ;-------------------------------------------------------------------
- ; Get a pointer to the logic page to where we will draw our buffer
- ;-------------------------------------------------------------------
- push [LogicPage] ; push the current logic page
- call FAR PTR Get_Page ; get the physical page address
- add sp,2 ; pull the parameter from the stack
- mov es,dx ; store the address in the dest
- ;--------------------------------------------------------------------
- ; Point DI to the beginning of the window that we need to look at.
- ; that way we can access all of the info through di.
- ;--------------------------------------------------------------------
- mov si,OFFSET WindowList ; get the offset of the window list
- mov cl,4 ; shift 3 times = multiply by 16
- mov ax,[win] ; get the window number we are using
- shl ax,cl ; each window is 8 words long
- add si,ax ; add that into the offset of window
- ;--------------------------------------------------------------------
- ; Place all the clipping values on the stack so our function will
- ; be truly re-entrant and will not need to shadow these values.
- ;--------------------------------------------------------------------
- mov cl,3 ; to convert x to pixel mult by 8
- mov ax,[si + WIN_X] ; get the left clip position
- shl ax,cl ; convert to a pixel x position
- mov [win_x1],ax ; store the left edge of window
- mov [win_x2],ax
- mov ax,[si + WIN_WIDTH] ; get the width of the window
- shl ax,cl ; convert to a pixel width
- add [win_x2],ax ; add to get the right window edge
- mov ax,[si + WIN_Y] ; get the win y coordinate to clip
- mov [win_y1],ax ; and save it onto the stack
- add ax,[si + WIN_HEIGHT] ; calculate the bottom win y coord
- mov [win_y2],ax ; and save it onto the stack
- test [flags],SHAPE_WIN_REL ; is this window relative?
- je short ??get_buffer ; if not the skip over
- mov ax,[win_x1] ; get left edge of window
- add [x_pixel],ax ; add to x pixel position
- mov ax,[win_y1] ; get top edge of window
- add [y_pixel],ax ; add to y pixel position
- ;--------------------------------------------------------------------
- ; Get a pointer to the source buffer so we can handle the clipping
- ;--------------------------------------------------------------------
- ??get_buffer:
- lds si,[buffer] ; get a pointer to the buffer
- ;--------------------------------------------------------------------
- ; Check the top of our shape and clip any lines that are necessary
- ;--------------------------------------------------------------------
- mov ax,[y_pixel] ; get the y_pixel draw position
- sub ax,[win_y1] ; subtract out the window y top
- jns short ??check_bottom ; skip if y below window top
- add ax,[pixel_h] ; add in the height of the region
- jg short ??clip_top ; if positive then clip top lines
- ??jump_exit:
- jmp ??exit ; otherwise completely clipped
- ??clip_top:
- xchg [pixel_h],ax
- sub ax,[pixel_h]
- add [y_pixel],ax
- mul [pixel_w] ; convert to number of bytes to skip
- add si,ax ; skip past the necessary bytes
- ;--------------------------------------------------------------------
- ; Check the bottom of our shape and clip it if necessary
- ;--------------------------------------------------------------------
- ??check_bottom:
- mov ax,[win_y2] ; get the bottom y of the window
- sub ax,[y_pixel] ; subtract of the y to draw at
- js ??jump_exit ; if its signed then nothing to draw
- jz ??jump_exit ; if its zero then nothing to draw
- cmp ax,[pixel_h] ; if more room to draw then height
- jae short ??clip_x_left ; then go check the left clip
- mov [pixel_h],ax ; clip all but amount that will fit
- ??clip_x_left:
- mov [clipleft],0 ; clear clip on left of region
- mov ax,[x_pixel] ; get the pixel x of draw region
- sub ax,[win_x1] ; pull out the window coordinate
- jns short ??clip_x_right
- neg ax ; negate to get amnt to skip in buf
- mov [clipleft],ax ; store it in the left clip info
- add [x_pixel],ax ; move to the edge of the window
- sub [pixel_w],ax ; pull it out of the pixel width
- ??clip_x_right:
- mov [clipright],0 ; clear clip on right of region
- mov ax,[win_x2] ; get the window x of clip region
- sub ax,[x_pixel] ; subtract the draw edge of region
- js ??jump_exit ; if its negative then get out
- jz ??jump_exit ; if its zero then get out
- cmp ax,[pixel_w] ; is space available larger than w
- jae short ??draw_prep ; if so then go get drawing
- xchg [pixel_w],ax ; amt to draw in pixel_w (wid in ax)
- sub ax,[pixel_w] ; pull out the amount to draw
- mov [clipright],ax ; this is the amount to clip on right
- ??draw_prep:
- push si ; save off source pos in buffer
- push ds ; both offset and segment
- mov ax,@data
- mov ds,ax
- mov bx,[y_pixel]
- shl bx,1 ; shift left by 1 for word table look
- lds si,[YTable] ; get the address of the ytable
- mov di,[ds:si+bx] ; look up the multiplied value
- pop ds ; restore source pos in buffer
- pop si ; both offset and segment
- add di,[x_pixel] ; add in the x pixel position
- mov [nextline],di ; save it off in the next line
- ;--------------------------------------------------------------------
- ; Now determine the type of the shape and process it in the proper
- ; way.
- ;--------------------------------------------------------------------
- mov dx,[pixel_h]
- ; Check to see if the WSA is the screen width and there is no
- ; clipping. In this case, then a special single call to the
- ; line processing routine is possible.
- mov ax,[clipleft]
- add ax,[clipright]
- jne short ??top_of_loop
- cmp [pixel_w],BYTESPERROW
- jne short ??top_of_loop
- ;------------------------------------
- ; The width of the WSA is the screen width, so just process as
- ; one large WSA line.
- mov ax,BYTESPERROW
- imul dx
- mov cx,ax
- call [putmiddle]
- jmp short ??exit
- ;------------------------------------
- ; Process line by line.
- ??top_of_loop:
- add si,[clipleft] ; skip whats necessary on left edge
- mov cx,[pixel_w] ; get the width we need to draw
- ; Copy the source to the destination as appropriate. This routine can
- ; trash AX, BX, CX, and DI. It must properly modify SI to point one byte past
- ; the end of the data.
- call [putmiddle]
- add si,[clipright] ; skip past the left clip
- add [nextline],BYTESPERROW
- mov di,[nextline]
- dec dx
- jnz ??top_of_loop
- ??exit:
- pop fs
- ret
- ENDP
- ;***************************************************************************
- ;* NORMAL_DRAW -- Function that writes a normal pixel line *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 07/17/1992 PWG : Created. *
- ;*=========================================================================*
- PROC NOLANGUAGE WSA_Normal_Draw NEAR
- IF 1
- ; This version is marginally faster than the later version.
- mov ax,cx
- shr cx,2
- rep movsd
- and ax,011b
- mov cx,ax
- shr cx,1
- rep movsw
- adc cx,cx
- rep movsb
- ret
- ELSE
- shr cx,1 ; convert to words (odd pix in carry)
- rep movsw ; write out the needed words
- adc cx,0 ; add the carry into cx
- rep movsb ; write out the odd byte if any
- ret
- ENDIF
- ENDP
- ;***************************************************************************
- ;* TRANSPARENT_DRAW -- Function that writes a transparent pixel line *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 07/17/1992 PWG : Created. *
- ;* 10/02/1994 JLB : Optimized for 250% speed improvement. *
- ;*=========================================================================*
- PROC NOLANGUAGE Transparent_Draw NEAR
- IF 1
- ; Preserve DX since it is used as a scratch register.
- push dx
- ??loop:
- ; Swap DS:SI and ES:DI back in preparation for the REP SCASB
- ; instruction.
- xchg di,si
- mov dx,es
- mov ax,ds
- mov ds,dx
- mov es,ax
- ; Remember the bytes remaining in order to calculate the position
- ; of the scan when it stops.
- mov bx,cx
- ; Scan looking for a non-zero value in the source buffer.
- xor al,al
- repe scasb
- ; When the loop ends, if the EQ flag is set then the scanning is
- ; complete. Jump to the end of the routine in order to fixup the
- ; pointers.
- je short ??fini
- ; Advance the destination pointer by the amount necessary to match
- ; the source movement. DS:SI points to where data should be written.
- add si,bx
- inc cx ; SCASB leaves CX one too low, fix it.
- dec di ; SCASB leaves DI one byte too far, fix it.
- sub si,cx
- ; Scan for the duration of non-zero pixels. This yields a count which
- ; is used to copy the source data to the destination. Preserve DI.
- mov dx,di
- mov bx,cx
- repne scasb
- mov di,dx
- ; Set BX to equal the number of bytes to copy from source to dest.
- inc cx ; SCASB leaves CX one too low, fix it.
- sub bx,cx
- ; Move the data from ES:DI to DS:SI for BX bytes.
- xchg cx,bx ; Make CX=bytes to move, BX=bytes remaining.
- ; Swap DS:SI and ES:DI in preparation for the REP MOV instruction.
- xchg di,si
- mov dx,es
- mov ax,ds
- mov ds,dx
- mov es,ax
- ; Move the data from source to dest. First try to move double
- ; words. Then copy the remainder bytes (if any). Putting jumps in
- ; this section doesn't result in any savings -- oh well.
- mov ax,cx
- shr cx,2
- rep movsd
- and ax,0011b
- mov cx,ax
- shr cx,1
- rep movsw
- adc cx,cx
- rep movsb
- ; Restore CX with the remaining bytes to process.
- mov cx,bx
- ; If there are more bytes to process, then loop back.
- or cx,cx
- jne short ??loop
- ??fini:
- ; Swap ES:DI and DS:SI back to original orientation.
- mov ax,ds
- mov bx,es
- mov es,ax
- mov ds,bx
- xchg di,si
- ; Restore DX and return.
- pop dx
- ret
- ELSE
- ??loop_top:
- lodsb
- or al,al
- jz short ??skip
- mov [es:di],al ; store the pixel to the screen
- ??skip:
- inc di
- loop ??loop_top
- ret
- ENDIF
- ENDP
- ;***************************************************************************
- ;* PRIORITY_DRAW -- Function that writes a pixels if they are in front of *
- ;* the given plate. *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 07/17/1992 PWG : Created. *
- ;* 12/01/1992 MBL : Updated to work with latest mask data encoding. *
- ;* 17/01/1993 MCC : Updated for 386, and optimized *
- ;*=========================================================================*
- PROC NOLANGUAGE Priority_Draw NEAR
- mov fs,[background] ; get the SEG of the background page
- mov gs,[maskpage] ; get the SEG of the mask info
- mov ah,[priority] ; keep a copy of priority varible for faster cmp
- ??loop_top:
- lodsb ; get the pixel to draw on the screen
- ; get the mask byte for our pixel
- mov bl,[ds:di]
- ; get rid of non-walkable bit and
- ; get rid of scaling id bits
- and bl,CLEAR_NON_WALK_BIT_AND_SCALE_BITS
- cmp ah,bl ; are we more toward the front?
- jge short ??out_pixel ; if so then write the pixel
- mov al,[fs:di] ; get the pixel to write
- ??out_pixel:
- stosb ; write the pixel and inc the DI
- loop ??loop_top
- ret
- ENDP
- ;***************************************************************************
- ;* PRIORITY_TRANSPARENT_DRAW -- Function that writes a pixels if they are *
- ;* in front of the given plate. It also deals with *
- ;* transparent pixels. *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 07/17/1992 PWG : Created. *
- ;* 12/01/1992 MBL : Updated to work with latest mask data encoding. *
- ;* 17/01/1993 MCC : Updated for 386, and optimized *
- ;*=========================================================================*
- PROC NOLANGUAGE Priority_Transparent_Draw NEAR
- mov fs,[background] ; get the SEG of the background page
- mov gs,[maskpage] ; get the SEG of the mask info
- mov ah,[priority] ; keep a copy of priority varible for faster cmp
- ??loop_top:
- lodsb ; get the pixel on the screen
- or al,al ; check to see if al is transparent
- je short ??write_back ; if it is go write background
- mov bl,[gs:di] ; get the mask byte for our pixel
- ; get rid of non-walkable bit and
- ; get rid of scaling id bits
- and bl,CLEAR_NON_WALK_BIT_AND_SCALE_BITS
- cmp ah,bl ; are we more toward the front?
- jge short ??out_pixel ; if so then write the pixel
- ??write_back:
- mov al,[fs:di] ; get the pixel to write
- ??out_pixel:
- stosb ; write the pixel
- loop ??loop_top
- ret
- ENDP
- ;***************************************************************************
- ;* GHOST_NORMAL_DRAW -- Function that writes a normal pixel line *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 05/27/1993 MCC : Created. *
- ;*=========================================================================*
- PROC NOLANGUAGE Ghost_Normal_Draw NEAR
- ??loop_top:
- lodsb
- ;---
- ; Ok, find out if the colour is a Translucent colour
- push ax
- push ds
- lds bx,[IsTranslucent]
- mov ah,al ; preserve real pixel
- xlat ; get new al (transluecent pixel
- xchg ah,al ; get real pixel back into AL just in case
- cmp ah,255
- je short ??normal_pixel ; is it a translucent ?
- ; if we get passed here value in
- ; AH should be 0-15
- ; yes, it is a translucent colour so goto our translucent translation
- ; table and set up a ptr to the correct table
- mov al,[es:di]
- ; mov pixel at destination to al and we have
- ; the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- lds bx,[Translucent] ; get the ptr to it!
- add bh,ah ; Add the (trans_color * 256) of the translation equ.
- ; XLAT only uses AL so no need to clear AH
- xlat ; get new pixel in AL
- ??normal_pixel:
- pop ds
- pop bx
- mov ah,bh
- ;---
- mov [es:di],al ; store the pixel to the screen
- ??skip:
- inc di
- loop ??loop_top
- ret
- ENDP
- ;***************************************************************************
- ;* GHOST_TRANSPARENT_DRAW -- Function that writes a transparent pixel line *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 05/27/1993 MCC : Created. *
- ;*=========================================================================*
- PROC NOLANGUAGE Ghost_Transparent_Draw NEAR
- ??loop_top:
- lodsb
- or al,al
- jz short ??skip
- ;---
- ; Ok, find out if the colour is a Translucent colour
- push ax
- push ds
- lds bx,[IsTranslucent]
- mov ah,al ; preserve real pixel
- xlat ; get new al (transluecent pixel
- xchg ah,al ; get real pixel back into AL just in case
- cmp ah,255
- je short ??normal_pixel ; is it a translucent ?
- ; if we get passed here value in
- ; AH should be 0-15
- ; yes, it is a translucent colour so goto our translucent translation
- ; table and set up a ptr to the correct table
- mov al,[es:di]
- ; mov pixel at destination to al and we have
- ; the index to the translation table
- ; ((trans_colour * 256) + dest colour)
- lds bx,[Translucent] ; get the ptr to it!
- add bh,ah ; Add the (trans_color * 256) of the translation equ.
- ; XLAT only uses AL so no need to clear AH
- xlat ; get new pixel in AL
- ??normal_pixel:
- pop ds
- pop bx
- mov ah,bh
- ;---
- mov [es:di],al ; store the pixel to the screen
- ??skip:
- inc di
- loop ??loop_top
- ret
- ENDP
- ;***************************************************************************
- ;* GHOST_PRIORITY_DRAW -- Function that writes a pixels if they are in fron*
- ;* the given plate. *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 07/17/1992 PWG : Created. *
- ;* 12/01/1992 MBL : Updated to work with latest mask data encoding. *
- ;* 05/27/1993 MCC : Updated to use the new Ghosting fx *
- ;* 17/01/1993 MCC : Updated for 386, and optimized *
- ;*=========================================================================*
- PROC NOLANGUAGE Ghost_Priority_Draw NEAR
- mov fs,[background] ; get the SEG of the background page
- mov gs,[maskpage] ; get the SEG of the mask info
- mov ah,[priority] ; keep a copy of priority varible for faster cmp
- ??loop_top:
- lodsb ; get the pixel to draw on the screen
- ; get the mask byte for our pixel
- mov bl,[ds:di]
- ; get rid of non-walkable bit and
- ; get rid of scaling id bits
- and bl,CLEAR_NON_WALK_BIT_AND_SCALE_BITS
- cmp ah,bl ; are we more toward the front?
- jge short ??out_pixel ; if so then write the pixel
- mov al,[fs:di] ; get the pixel to write
- ??out_pixel:
- stosb ; write the pixel and inc the DI
- loop ??loop_top
- ret
- ENDP
- ;***************************************************************************
- ;* GHOST_PRIORITY_TRANSPARENT_DRAW -- Function that writes a pixels if they*
- ;* in front of the given plate. It also deals with *
- ;* transparent pixels. *
- ;* *
- ;* INPUT: cx - number of pixels to write *
- ;* ds:si - buffer which holds the pixels to write *
- ;* es:di - place to put the pixels we are writing *
- ;* *
- ;* OUTPUT: ds:si - points to next pixel past last pixel read *
- ;* es:di - points to next pixel past last pixel written *
- ;* *
- ;* WARNINGS: none *
- ;* *
- ;* HISTORY: *
- ;* 07/17/1992 PWG : Created. *
- ;* 12/01/1992 MBL : Updated to work with latest mask data encoding. *
- ;* 05/27/1993 MCC : Updated to use the new Ghosting fx *
- ;* 17/01/1993 MCC : Updated for 386, and optimized *
- ;*=========================================================================*
- PROC NOLANGUAGE Ghost_Priority_Transparent_Draw NEAR
- mov fs,[background] ; get the SEG of the background page
- mov gs,[maskpage] ; get the SEG of the mask info
- mov ah,[priority] ; keep a copy of priority varible for faster cmp
- ??loop_top:
- lodsb ; get the pixel on the screen
- or al,al ; check to see if al is transparent
- je short ??write_back ; if it is go write background
- mov bl,[gs:di] ; get the mask byte for our pixel
- ; get rid of non-walkable bit and
- ; get rid of scaling id bits
- and bl,CLEAR_NON_WALK_BIT_AND_SCALE_BITS
- cmp ah,bl ; are we more toward the front?
- jge short ??out_pixel ; if so then write the pixel
- ??write_back:
- mov al,[fs:di] ; get the pixel to write
- ??out_pixel:
- stosb ; write the pixel
- loop ??loop_top
- ret
- ENDP
- END
|