SAVEPAL=0 keyhandler=65h MONGI_RESIPLAY=0 MUSIKKAOS=0 DEBUG=0 DEMOVER=0 ARROWS=1 STAND_ALONE=0 CREATE_FLIP_DATA=0 GLAPP_SIZE=0 CENTSCREEN=3 TT EQU 5 ;CP! NN EQU 6 PUBLIC TT,NN COMMENT\*********************************************************************** ALLA: skydd - SLUMPEN! testa p† flera datorer cheats GABRIEL: LJUD F™R OFTA VID STONEBONE CHECKSUMMA SKYDDET *Kolla minneskrav j„ttenoga med st”rsta SDRen *spela en massa p† magnus dator † din farsas notebook (m extern sk„rm) JOHAN: FELHANTERINGEN CP! (¸TMINSTONE OUT OF MEM) NYA FLD-LOGGAN! (FRONT.LBM P¸ DIN DATOR) TONINGEN SKA INTE SLUTA P¸ BAJSBRUNT UTAN P¸ SVART! *Kolla minneskrav j„ttenoga med st”rsta SDRen spela en massa p† TFT notebook + gotlandsdatorn DANIEL: SB16 JOHANS SYNDROM PAS 16 (l†na Steins) ?HˇNGDE VID UPPSTART AV BILLION (STEWART) ?BALL STUCK AFTER PAUSE ?386SX16 FICK MEDIUM (INTERNAL) ??SCANDICS SYNDROM (MUSIC ON/OFF BORDE ST™DJA SUPERLˇGEN (DVS ANDRA MAINSLINGOR ˇN S_MAIN) (anv„nd nya clears!!) SPELTESTA BILLION adlib och thing kn„pper till vid play sdr-laddning endast i introN? ******************************************************************************\ .286 JUMPS LOCALS __ TRUE EQU 255 FALSE EQU 0 xst=165 yst=450 NOOFWAITSYNCS=0 NO_OF_PLAYERS=8 ;NOTE: F1-F8 inactivetime=12 ;(secs) TA_TID=15 ;SYNCS EN KEY ˇR GILTIG EFTER DEN BLIVIT TRYCKT SLIME_FACTOR_DEFAULT=11 ;5=OUT OF SCREEN 55=HARD AWAYFROMMIDDLE=20 MOUSETOTAL=2 MOUSEMIDDLE=MOUSETOTAL/2 STACKEN SEGMENT PARA STACK 'STACK' DB 256 DUP (0) STACKEN ENDS includelib fantasie ;includelib cleaR INCLUDE C:\source\MACROS1.ASM INCLUDE C:\source\MACROS3.ASM INCLUDE FANTASIE.MAC SKALA56 MACRO SKALVAR MOV AX,5 IMUL SKALVAR MOV CX,6 IDIV CX MOV SKALVAR,AX ENDM if (bana EQ 1) INCLUDE pland.ASM endif if (bana EQ 2) INCLUDE sdev.ASM endif if (bana EQ 3) INCLUDE show.ASM endif if (bana EQ 4) INCLUDE stones.ASM endif flipstruc struc typ DB 1 ;Left/Right LastFrame DB 1 ;Blit again? LeftX DW 1 ;Leftmost block position TopY DW 1 ;Uppermost block position FlipX DW 1 ;Words wide FlipY DW 1 ;Lines high FlipX1 DW 1 ;Left Border FlipX2 DW 1 ;Right Border FlipY1 DW 1 ;Upper Border FlipY2 DW 1 ;Lower Border RotCentX DW 1 RotCentY DW 1 PowerZonE DW 1 ;Quadrants for power calculations FlipSize DW 1 ;Offset to next flipper FlipVinkelHast DW 1 ;Speed °/200:th second FlipVinkel DW 1 ;Angel from zero FlipFrame DW 1 ;Frame to use FlipFrames DW 1 ;Last frame FlipFramesMax DW 1 FlipAxUp DW 1 FlipAxDown DW 1 FlipMaxHastUp DW 1 FlipMaxHastDown DW 1 LASTGFXFRAME DW 0 FLIPGFXSTART DW ? FLIPMAXPEK DW ? FLIPTOPPEK DW ? FLIPPEK DW ? FLIPTAB DW ? FLIPDIFS DW ? FlipData Dw 1 ;Data for flippers ENDS ;**************************************************************** FLIPPERL EQU 2 ;OBS! M¸STA VARA 2 F™R ATT DET SKA BLI RˇTT SHIFTKEYS FLIPPERR EQU 1 springh=17 NOT_PLAYING=60*INACTIVETIME rotslowdown=2 PILHAST=1024 ;256+128 ;1024/4=256 SLOW=0 MARGIT=0 FLASHIT=0 SW=336 BPL=SW/4 HIRES=false RES600=false HZ50=FALSE IF HIRES IF RES600 SH=600 ELSE SH=480 ENDIF ELSE IF HZ50 SH=256 ELSE SH_HI=350 SH_LO=240 ENDIF ENDIF SPLH=33 MAXGAPU_LO=(SH_LO-SPLH)/2-AWAYFROMMIDDLE-GLAPP_SIZE-BALLH/2 MAXGAPD_LO=(SH_LO-SPLH)/2+AWAYFROMMIDDLE-GLAPP_SIZE-BALLH/2 MAXGAPU_HI=(SH_HI-SPLH)/2-AWAYFROMMIDDLE-GLAPP_SIZE-BALLH/2 MAXGAPD_HI=(SH_HI-SPLH)/2+AWAYFROMMIDDLE-GLAPP_SIZE-BALLH/2 IF HIRES IF RES600 LATE_INTERRUPT_RASTER = (SH/2-SPLH)/2+BALLH+SPLH ;600 ELSE LATE_INTERRUPT_RASTER = (SH/2-SPLH)/2+BALLH ;480 ENDIF ELSE LATE_INTERRUPT_RASTER_HI = (SH_HI/2-SPLH)/2+BALLH ;480 LATE_INTERRUPT_RASTER_LO = (SH_LO-SPLH)/2+F3HEIGHT/2 ;+BALLH ;240 ENDIF IF RES600 MIDDLE_RASTER = (SH-SPLH)/2+SPLH ELSE MIDDLE_RASTER_LO = (SH_LO-SPLH)/2 MIDDLE_RASTER_HI = (SH_HI-SPLH)/2 ENDIF UPPER EQU TRUE LOWER EQU FALSE IF CREATE_FLIP_DATA PUBLIC FLIPLINFO ENDIF public exahitx,exahity,rotation,sc_X,sc_y,adjusttable,x_pos,y_pos,x_pos_hi,y_pos_hi,x_hast,y_hast,gfxmask21_offset,gfxmask23_offset,gfxmask13_offset,hitpointer,screenhast,screenpos,screenposy,materialdata,bumper2lista_l,bumperlista_l,gravx,gravy public INSIDE_RASTINT,holdstill,ballhigh,hitvalue,materialbit,bumperwashit,ball_down,allowflip,shiftkeys,tiltflag,tiltkey public moveflipmask DATA SEGMENT PARA PUBLIC 'DATA' extrn MINUSHAST:word ;l„gg dessa externer i datasegmentet extrn pluSHAST:word extrn bumperpower:word extrn kickerpower:word extrn kickminhast:word extrn TILTHASTFW:word extrn TILTHASTRV:word SOUNDCFG DB "SOUND.CFG",0 DRV DB "c:\Masm\DS20\RESIPLAY\resiplay.exe",15 DUP(0) PARMS DW 10 DUP(0) LASTJINGLE DB ? LASTLASTJINGLE DB ? LASTPRIORITY DB ? JINGLEJUMPCNT DB ? ;LASTLOOPVAL DB ? SLOWCNT DB 0 ;**************** STUDS-VARIABLER ************************************** PAUSEFLAG DB FALSE TILTKEY DB FALSE TILTFLAG DB FALSE EVENDATA TILTCOUNTER DW ? STOTMAX EQU 2048 SCREENPOS DW 0 SCREENPOSY DW 0 SCREENHAST DW 0 muzik_off db false kvot=4 MaterialData dw 1792,1792/Kvot,400,-300,38,0,0,0 FLipprubber dw 1792,1792/Kvot,400,-600,18,0,0,0 ;Flipper dw 1792,1792/Kvot,400,-600,18,0,0,0 rubber dw 896,896/Kvot,875,-200,38,0,0,0 ;Rubber dw 1792,1792/Kvot,400,-300,38,0,0,0 staal dw 30000,30000/Kvot,1000,-400,38,0,0,0 ;Spring Steel Steel dw 10000,10000/Kvot,450,-700,38,0,0,0 ;Steel plastic dw 10000,10000/Kvot,400,-500,38,0,0,0 ;Plastic bumperwashit db false ball_down db false hitpointer dw ? GFXMASK21_OFFSET dw FIRSTMASK_GFXADR GFXMASK23_OFFSET dw ? gFXMASK13_OFFSET dw ? springpos db 0 realpos db 0 SPRINGTASK DW OFFSET SPRINGSTEEN INSIDE_RASTINT DB FALSE INSIDE_BALLHANDLER DB FALSE INSIDE_RESTOFVBLANK DB FALSE SLIME_FACTOR DW SLIME_FACTOR_DEFAULT ;5=OUT OF SCREEN 55=HARD ;********************************************** ADJUST EQU 55 ;******************************* dw adjust*2 dup(0) ;h”r adjusttable dw adjust*24 dup(0) ; ihop ;*********************************** hitvalue db 0,0 materialbit db 0,0 ROTATION DW 0 SC_X DW XST SC_Y DW YST X_POS DW 0 X_POS_HI DW 0 Y_POS DW 0 Y_POS_HI DW 0 X_HAST DW 0 Y_HAST DW 0 EXAHITX DW 0 EXAHITY DW 0 GRAVY DW 10*tt/nn GRAVX DW 0 OLDPOS DW ? OLDSHIFT DW ? oldx dw 0 oldy dw 25 IF HIRES SPLITLINE DW SH-SPLH ELSE SPLITLINE DW ? ;HI:SH_HI-SPLH, LO:(SH_LO-33)*2 ENDIF START_RASTER DW ? RASTERPOS DW 0 STATUS DB ? LATEGFX DB ? VERYFIRSTPUT DB ? PUTITBETWEEN DB ? PUTF3BETWEEN DB ? FORCELATEF3 DB ? BUFR DW 0 FLIPPEKARE DW ? FLIPPTR DW ? FLIPADR DW ? FLIPXPOS DW ? FLIPYPOS DW ? FLIPSEG DW ? FLIPWIDTH DW ? FLIPHEIGHT DW ? FLIPSTORLEK DW ? FLIPLINESIZE DW ? ASSUME DS:DATAFLIP ;******************************************* LEFTFLIP2PTR DW OFFSET LEFTFLIP2TAB LEFTFLIPPTR DW OFFSET LEFTFLIPTAB RIGHTFLIPPTR DW OFFSET RIGHTFLIPTAB ASSUME DS:DATA ;************************************************** SHIFTKEYS DB 0 INTERRUPTS_ON DB false HOLDSTILL DB FALSE uppstartad db false RGBBUFFER DB RGB_BUFFER_LEN DUP(0) RGBBUFPTR DW RGBBUFFER LASTCHECK DW ? LASTAREA DW ? BALLHIGH DB ? TASKLIST DW NOOFTASKS DUP(DUMRET) NO_OF_ACTIVE_TASKS DW 0 SAVESOURCE DW ? SCREENFORCE DW ? SCREENFORCE2 DW -1 SCROLLPOS DW ? CURRENT_PRIORITY DB ? SPRING_VALID DB ? SHIFTPRESSED DB ? KEYTASK DW ? JINGLE_READY_ANIM DB TRUE JINGLE_READY_LOGIC DB TRUE MATRIX_SPEED DW ? MATRIX_CNT DW ? MATRIX_ONOFF DW ? MATRIX_IS_FLASHING DB ? INTFLAG DB FALSE INH_EFF DB ? BONUSSIFFRORNA DB 12 DUP(?) ;BCD CODED TEMPSIFFRORNA DB 12 DUP(?) ;BCD CODED BONUSMULTIPEL DW ? ADDOR DB 11 DUP(0), 1, 11 DUP(0) ADDORPEK DW ? BONUSPEK DW ? LOOSING DB ? ALLOWFLIP DB ? first_time_you_fool db true ;Jaaaa det r„cker s† h„r! (ANVˇNDS ˇVEN VID ESC I CHUTEN) if demover MINUTE_5_COUNTER DW 0 fiveminutes db false endif BALLS DB 12 DUP(0) ;FIRST 11 DIGITS MUST NEVER BE CHANGED NO_OF_BALLS DB 1 ;WILL BE CHANGED SCORECHANGED DB ? SPECIAL_SCORE_CHANGED DB ? I_UTSKJUT DB TRUE behovs_provad db false SPECIALMODE DB FALSE ADDPLAYERS DB true SUPER_INIT DB ? ;TRUE WHILE INITING SUPER MODE (FOR JP ETC) NEXT_A DW 0 DOTRUT DW offset cs:nodot sisa dw 0 clearval dw ? slump_countern dw ? MAKE_BAD DB false ;cpskydd (ska va true) calamares_delay db 0 already_beaten db ? VISAKEYS DB ? VISAPOANG DW 0 STUDSSCOREN DW 0 INHIBIT_COUNT_DOWN DB ? ;(PENETRATION OF SPECIAL MODE) EOTS DB ? ;UPP TILL VARJE BANA ATT ANVˇNDA DOT_READY DB ? LAGERARBETAREN DW ? LILLE_LAGERARBETAREN DB ? PAUSE_LAGRET DB 320/2*16/8+1 DUP(0) PAUSE_TEXT DB 'GAME PAUSED',0 INSIDE_DOLIGHTS DB FALSE SYNC_COUNTER DW 0 INT_WAS_HERE DB ? INT_WAS_HERE2 DB ? DNPRESSED DB FALSE MOUSEINSTALLED DB ? DECCOR DW ? ;WAITJINGLE2 FFLAG DB 0 ;F11/F12 HI_RES DB ? ;350 OR 240 LINES FLASHSTRUC STRUC LNUM DB ? FLASHCOUNTER DB ? TURNOFF DB ? RESETFC DB ? ENDS REALFLASHLIST DB MAX_NO_OF_LIGHTS_FLASHING*SIZE FLASHSTRUC DUP(0) LIGHTSTATUS DB NOOFLIGHTS+1 DUP(0) WAITLIST DW MAX_NO_OF_WAIT_SYNCS DUP(0) TOGGLAR_STRUCEN STRUC S_BALLS DB ? S_ANGLE DB ? S_SCROLLING DB ? S_IM DB ? S_RESOLUTION DB ? S_MODE DB ? ENDS TOGGLAREN DB SIZE TOGGLAR_STRUCEN DUP (0) ;cp cp cp cp! hi_1 db '8 ',94,0 hi_2 db '9 ',94,0 hi_3 db '9'+1,' ',94,0 hi_4 db '9'+2,' ',94,0 ALFA_KEYS DB 13 DUP(0),0,2 DUP(0),'QWERTYUIOP',0,0,0,0,'ASDFGHJKL',0,0,0,0,0,'ZXCVBNM',6 dup (0),'*',(128-50-7) dup (0),20 dup (0) scan_code db ? sec_left dw ? sync_per_sec dw 60 sync_left dw ? val_to_print dw ? time_left dB ? sec_asc db ?,?,0 NODOTCOUNT DW ? fjanttext dw ? PRINTTASK DW ? AX_PRINT DW ? DI_PRINT DW ? clear_box_start dw ? clear_box_bredd dw ? clear_box_hojd dw ? rullstart dw ? rulltext dw ? rull_pos dw ? stop_at_pos dw ? upp_add dw ? first_high db false ;cp? HIGHSCORE DB false ;CP? no_demomusic db false ;cp? DEMOMODE DB TRUE F1F8_CODE DB ? OLD_F1F8_CODE DB ? PLAYERS DB 0 PLAYERS_CP DB FALSE CARMEN DW ? PLAYER DB ? ORGPLAYER DB ? extrn sin:word,material:word ;fonter TOM_BRUN DB 13 DUP(0) ;F™R ¸ R™JJA MED ASS¸! extrn font5,font8,font11,font13 densomsparhanhar db ? TILTDISABLED DB FALSE dont_know_yet db ? AFTER_CHEAT DB TRUE cheatpekare dw 0 cheatinput db 12+2 dup (' ') cheats dw JOHANRUT db 'JOHAN$' dw TECHRUT db 'TECH$' dw TSPRUT db 'TSP$' DW DANIELRUT DB 'DANIEL$' DW GABRIELRUT DB 'GABRIEL$' DW CHEATRUT DB 'CHEAT$' DW TILTRUT DB 'EARTHQUAKE$' DW BALLSRUT DB 'EXTRA*BALLS$' DW SNAILRUT DB 'SNAIL$' DW FAIRPLAYRUT DB 'FAIR*PLAY$' dw robbanrut db 'ROBBAN$' dw steinrut db 'STEIN$' dw greetrut db 'GREET$' dw 255 ;255 avslutar!! SNAILSCROLL DB 21 DUP (1),'I WOULD RATHER BE A SPARROW THAN A SNAIL',21 DUP(1),255 BALLSSCROLL DB 21 DUP (1),'YOU WILL NOW GET 7 BALLS DUDE',21 DUP(1),255 FAIRPLAYSCROLL DB 21 DUP (1),'ALL CHEATS ARE NOW RESET',21 DUP(1),255 TILTSCROLL DB 21 DUP (1),'THE TILT FEATURE IS NOW DISABLED',21 DUP(1),255 CHEATSCROLL DB 21 DUP (1),' THERE ARE A LOT OF NASTY CHEATS IN THIS GAME SO JUST START TYPING ON YOUR KEYBOARD',21 DUP(1),255 johanscroll DB 21 dup(1),'THE DOT MATRIX SYSTEM AND SOME OF THE GAME SYSTEM AND THE WHOLE OF THE SPEED DEVILS TABLE WERE PERFECTLY CODED BY JOHAN ',21 DUP(1),255 DANIELSCROLL DB 21 dup(1),'THE MUSIC PLAYER AND THE BALL CALCULATIONS AND THE BILLION DOLLAR GAMESHOW TABLE WERE SUPERBLY CODED BY DANIEL',21 DUP(1),255 GABRIELSCROLL DB 21 dup(1),'THE GAME SYSTEM AND BOTH THE PARTYLAND AND STONES N BONES TABLES WERE CODED MEGA NICELY BY GABRIEL',21 DUP(1),255 TSPSCROLL DB 21 DUP(1),'THE SPACEPIGS RULE FOREVER',21 DUP (1),255 greetSCROLL DB 21 dup(1),'GREETINGS GO TO ALL THE GUYS WHO HELPED US BETA TEST THIS GAME' DB ' STEIN, BJORN, JENS, RILLE, ROBBAN AND OF COURSE STEWART AND BAZZA' DB ' A MEGA GREET GOES TO ROBBAN FOR THE GUSPLAYER' DB ' DIGITAL ILLUSIONS - HOPE TO SEE YOU AGAIN SOON' db ' STEWART AND BAZZA - WE LOOK FORWARD TO MEETING YOU GUYS' DB ' GREETINGS TO ALL SPACEPIGS MEMBERS HENRIK, ERIK, TOM AND OF COURSE - OURSELVES' DB ' SPECIAL GREETS GO TO CASCADA AND THE CODEBLASTERS' DB ' TO TRITON AND FUTURE CREW - YOUR DEMOS ARE IMPRESSING' DB ' TO ALL OTHER GROUPS - KEEP UP THE GOOD WORK' DB ' ALL OF YOU GUYS STUDYING MASTER OF SCIENCE IN UPPSALA AND STOCKHOLM - BUY US A BEER IF YOU ENJOY THE GAME' DB ' ALSO GREETINGS TO THE CAPED CRUSADER OF THE FINGERBOBS (ATARI SCENE) TCC ' DB 'SAYS HI TO CREEPER, OBERJE, DAWN, RACHAEL AND ANN. HI ALSO TO ' DB 'THE GREAT BAZZA AT 21ST CENTURY. ' DB ' TO THE CODERS OF EMM386 AND QEMM DRIVERS - MAKE THE INTERRUPT HANDLING FASTER' DB ' RIGHT NOW THEY MAKE THE COMPUTER GO SOOOOOOO SLOW',21 DUP(1),255 ROBBANSCROLL DB 21 dup(1),'THANX FOR THE GRAVIS ULTRASOUND PLAYER',21 DUP(1),255 STEINSCROLL DB 21 dup(1),'HOPE WE CAN MAKE THAT VECTORGAME WE TALKED ABOUT',21 DUP(1),255 TECHSCROLL DB 21 dup(1),'YEAH YOU ARE PROBABLY WONDERING HOW IT IS POSSIBLE TO MAKE A GAME LIKE THIS ON THE PC' DB ' FIRST OF ALL THE GAME IS CODED IN 100 PERCENT ASSEMBLER LANGUAGE ' DB ' WE RUN IN A SPECIAL VGA 320 X 240 OR 360 X 350 IN 256 COLOR MODE HARDWARE IS USED FOR SCROLLING THE TABLE ' DB ' THE FLIPPERS AND DOT MATRIX SCOREPANEL ARE DELTA ANIMATED AND TO MAKE THE GRAPHICS RUN FLICKER FREE WE ARE USING RASTER INTERRUPTS THE PALETTE IS USED FOR FLASHING THE LIGHTS ' DB ' THE MUSIC ROUTINE HAS FEATURES SUCH AS SOFT CLIPPING AND INTERPOLATIVE MIXING ' DB ' ALTOGETHER THIS MAKES THE GAME POSSIBLE TO RUN ON A 12 MHZ 286 WITH SOUNDBLASTER MUSIC AT 16KHZ IN EACH FRAME' DB 21 DUP (1),255 techTS label worD clearit dw _scroll,TECHSCROLL dw 0 CHEATTS label worD clearit dw _scroll,CHEATSCROLL dw 0 robbanTS label worD clearit dw _scroll,robbanSCROLL dw 0 steinTS label worD clearit dw _scroll,steinSCROLL dw 0 greetTS label worD clearit dw _scroll,greEtSCROLL dw 0 DANIELTS label worD clearit dw _scroll,DANIELSCROLL dw 0 GABRIELTS label worD clearit dw _scroll,GABRIELSCROLL dw 0 JOHANTS label worD clearit dw _scroll,JOHANSCROLL dw 0 tSPTS label worD clearit dw _scroll,TSPSCROLL dw 0 QUAKETS label worD clearit dw _scroll,TILTSCROLL dw 0 SnailTS LABEL WORD CLEARIT DW _SCROLL,SNAILSCROLL DW 0 BallsTS LABEL WORD CLEARIT DW _SCROLL,BALLSSCROLL DW 0 FairPlayTS LABEL WORD CLEARIT DW _SCROLL,FAIRPLAYSCROLL DW 0 NewplayerTS label word clearit dw _print5,playerstext,sw*2*2/4+16*1/4 dw _print5,no_of_players_text,sw*2*10/4+16*1/4 dw 0 ;quitting fr†gan quit_fragenTS LABEL WORD CLEARIT dw _flashoff,? DW _PRINT13,quit_TEXT,sw*2/4*2+16*0/4 dw _WAIT_YN,? dw _jmp,showhighsTS HALL_DIG_BORTATS dw _wait,1 DW _LOCK,1 dw 0 quit_TEXT DB 'REALLY QUIT ','Z'+2,'Y OR N','Z'+3,0 quitgam_TEXT DB ' END GAME ','Z'+2,'Y OR N','Z'+3,0 DATA ENDS CODE SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA EXTRN UNPKLBM:NEAR,kollakulan:near EXTRN PUTBALL:NEAR,DELBALL:NEAR MARG DB 0 OLDMARG DB 0 FANTASIES PROC FAR MOV BP,DS MOV AH,4AH MOV BX,LASTSEG SUB BX,BP ADD BX,1024/16 INT 21H ;HˇR F™RSVINNER BAN-GRAFIKEN MOV AX,DATA MOV DS,AX IF STAND_ALONE MOV TOGGLAREN.S_SCROLLING,1 ELSE MOV AX,0200H ;RESIDENTA TOGGLAREN => LOKALA TOGGLAREN MOVE ES,DS LEA BX,TOGGLAREN INT KEYHANDLER ENDIF if stand_alone mov hi_res,true else MOV HI_RES,FALSE CMP TOGGLAREN.S_RESOLUTION,0 JZ ITS_LOW_RES MOV HI_RES,TRUE ITS_LOW_RES: endif ;HˇR DANIEL!!! CMP TOGGLAREN.S_ANGLE,0 JZ NORMAL_ANGLE CALL TABLE_ANGLE NORMAL_ANGLE: MOV NO_OF_BALLS,3 CMP TOGGLAREN.S_BALLS,0 JZ ITS_3_BALLS MOV NO_OF_BALLS,5 ITS_3_BALLS: CMP TOGGLAREN.S_IM,0 JE ITS_ON_THE_MUSIC CALL MUSIC_TOGGLE ITS_ON_THE_MUSIC: CMP TOGGLAREN.S_SCROLLING,1 JB CF11 JA CF9 CALL F10 JMP SHORT KLAR CF9: CALL F9 JMP SHORT KLAR CF11: CALL F11 KLAR: if debug debugclear endif IF DEBUG debugmess 0,0,"Pinball Fantasies PC by FrontLine Design" ENDIF cli ;CP!? IF DEBUG debugmess 0,1,"Initing..." ENDIF CALL INIT_SIN CALL INIT_SCROLL call init_ballspeed CALL INIT_MATRIX CALL BREDDA_MASK IF DEBUG debugmess 0,1,"Init gfx..." ENDIF CALL INIT_GFX IF DEMOVER ELSE CALL INIT_HIGHS ENDIF MOVE DS,DATA ;************** CHECKSUMMA 1 START *************** CHECK1_START: MOV RGBBUFPTR,OFFSET RGBBUFFER CALL RECALC_LIGHTS CALL RECALCFLASHLIST CALL MASKS2GFX ;INUTI LIGGER INIT_FLIPPERS (AV N¸N ANLEDNING) ;FATALT_HOPP: CALL INIT_SPRING CALL INIT_KEY cmp hi_res,true jne notcalc3 or shiftkeys,100b notcalc3: CALL INIT_MOUSE CALL INIT_SOUND CHECK1_END: ;************** CHECKSUMMA 1 END *************** MOVE DS,DATA MOV STATUS,LOWER ;INIT BEEM VARS MOV VERYFIRSTPUT,TRUE MOV LATEGFX,FALSE MOV INTERRUPTS_ON,FALSE CALL JUST_ONE_TIME_RESET CALL JUST_ONE_TIME_RESET_TABLE sti call go_DEMO_mode ;CP! DEMO MODE MOV SCREENFORCE,BANH-(SH_LO-SPLH) CMP HI_RES,TRUE JNE NOTHIRES2 MOV SCREENFORCE,BANH-(SH_HI-SPLH) CALL KILL_UPPER_LINE NOTHIRES2: MOV CARMEN,-1 if demover CALL game_MUSIC ;cp! demo mode else CALL demo_MUSIC ;cp! demo mode endif call setscreenstart CALL INIT_INTS call slack_lights_i_pelle CMP TOGGLAREN.S_MODE,0 JZ DONOTCONV CALL COLOR_2_BW call pelle_2_bw DONOTCONV: ; XOR BX,BX ;TONA: ADD BX,1 mov bx,256 CALL SETPAL ; cmp bx,256 ; jb tona MOV AX,4 MOV BX,2 mov cx,0 ;0=use configurated rate INT 66H ;PLAY MODULE IF_ERROR 1,OUTOFMEMORY IF_ERROR 2,INIT_ERR mov uppstartad,true MOV INTERRUPTS_ON,TRUE ;********** INTERRUPTS ENABLED! ********** IF DEBUG debugmess 0,1,"Running... " ENDIF IF DEBUG MOV AH,48H MOV BX,0FFFFH INT 21H DEBUGVAL 0,22,BX,"Free memory after all: " ENDIF jmp main TABLE_ANGLE Proc Near ;for (c=0;c<11;c++) ramptable[c]-=4; mov bx,offset ramptable cmp hi_res,false je goda_grannar mov bx,offset ramptable_hi goda_grannar: mov cx,no_of_ramps luta: sub word ptr [bx+2],3 add bx,4 loop luta retn TABLE_ANGLE EndP init_ballspeed proc near ;ers„tt den gamla med denna cmp hi_res,true je no_adde_malmberg mov bx,offset materialdata mov cx,8 mov bp,5 mov si,6 hemul: mov ax,[bx+6] imul bp idiv si mov [bx+6],ax add bx,16 loop hemul skala56 MINUSHASt skala56 PLUSHAST skala56 bumperpower skala56 kickerpower skala56 kickminhast skala56 TILTHASTFW skala56 TILTHASTRV no_adde_malmberg: retn init_ballspeed endp ;********** already_quitting db false checkquit: cmp cs:already_quitting,true je no_fragen_sie_bitte_die_ende mov cs:keyboard_enabled,false mov CS:ALREADY_QUITTING,TRUE mov bx,offset quit_fragenTS call do_matrix no_fragen_sie_bitte_die_ende: retn ;*********** KILL_UPPER_LINE PROC NEAR SETWRITE 1111B MOVE ES,0A000H MOV DI,SPLH*SW/4 MOV CX,320/4/2 XOR AX,AX LUPPEN: STOSW LOOP LUPPEN RET KILL_UPPER_LINE ENDP checkpause: if demover ; jmp nopause endif CMP PAUSEFLAG,false JE NOPAUSE mov interrupts_on,false mov al,15 int 66h ;STOP CALL PRINT_PAUSE ; DEBUGMESS 20,6,"in i pauseloopen" mov scan_code,-1 FEELP: cmp scan_code,1 ;leverkorv je kaka_calamares ;Esc pressed!! kaka_pasa: cmp scan_code,-1 JE FEELP cmp scan_code,1 je kaka_calamares ;Esc pressed!! Y or N ???? judas: ;L†t han l”pa!! mov calamares_delay,30 mov scan_code,-1 ; DEBUGMESS 20,6,"ut ur den!!!!!!!" mov cx,0 ;0=use configurated rate MOV AX,4 MOV BX,3 INT 66H ;PLAY MODULE IF_ERROR 1,OUTOFMEMORY IF_ERROR 2,INIT_ERR CALL RESTORE_AFTER_PAUSE mov interrupts_on,true mov pauseflag,false NOPAUSE: RETN lat_den_sta: ;=============== DETTA ˇR EN CP-L™SNING F™R ATT F¸ TYST ====================== MOVE DS,DATA MOV HOLDSTILL,TRUE CALL RESTORE_AFTER_PAUSE mov pauseflag,false ;MOV INTERRUPTS_ON,TRUE ;MOV CS:QUITTING,TRUE ;MOV SI,0 ;? ;RETN xor muzik_off,true ;CP? jz its_off_not ;CP? call its_off ;Turn him on . . . not! its_off_not: mov cs:levin,true ;en riktig urban!! mov si,0 push si MOV CX,0 MOV AL,6 INT 66H ;set vol mov interrupts_on,true pop si mov cx,0 ;0=use configurated rate MOV AX,4 MOV BX,3 INT 66H ;PLAY MODULE ; IF_ERROR 1,OUTOFMEMORY ; IF_ERROR 2,INIT_ERR JMP QUIT ;CP!? MOV CS:QUITTING,TRUE mov si,1 retn ;============================================================================= kaka_calamares: PUSH OFFSET quit_TEXT POP AX_PRINT MOVE DI_PRINT,sw*4/4 call print_it_klux do_kk_again: mov scan_code,-1 keck_agan: cmp scan_code,-1 je keck_agan ;wait for keypress! mov bx,offset alfa_keys mov al,scan_code xlat cmp al,'Y' ;y or anything! je quitteras jmp judas ;l†t han g†!! quitteras: jmp lat_den_sta ; jmp judas ifscan macro tangent,rutin local nedu cmp scan_code,tangent jne nedu mov scan_code,-1 call rutin nedu: endm ifscan_set macro tangent,var,val local nedu cmp scan_code,tangent jne nedu mov scan_code,-1 mov var,val nedu: endm checkgamequit: SETBALLPOS 300,570,0,0,FALSE MOV CS:KEYBOARD_ENABLED,TRUE addtask to_demo_from_game CALL DEMO_MUSIC ;CP!??? mov scan_code,-1 call kill_flashor mov bx,offset showhighsTS call do_matrix retn ;checkgamequit: CMP ADDPLAYERS,TRUE JE NO_END_GAME PUSH OFFSET quitgam_TEXT POP AX_PRINT MOVE DI_PRINT,sw*4/4 call print_it_klux do_kks_again: mov scan_code,-1 MOV CS:KEYBOARD_ENABLED,FALSE ADDTASK ALLADIN RETN NO_END_GAME: ADDTASK END_GAMEN ;VID FLERA SPEL:POLYGAMI? RETN ALLADIN: kecks_agan: cmp scan_code,-1 je RETSTICKA ;kecks_agan ;wait for keypress! MOV CS:NEGERN,60 ;S¸ MAN HINNER STˇDA TILLS FARBROR STEWI KOMMER mov bx,offset alfa_keys mov al,scan_code xlatb cmp al,'Y' ;y or anything! je end_gamen ko_gamen: ADDTASK CP_WAIT_FOR_MATRIX mov bx,offset SHOWplayerSTS call do_matrix SUICIDE RETSTICKA: retn NEGERN DB ? CP_WAIT_FOR_MATRIX: ; DEC CS:NEGERN ; JZ JOBBA_DIG cmp dotrut,offset nodot je jobba_dig ;st„dat † klart!! RETN JOBBA_DIG: MOV CS:KEYBOARD_ENABLED,TRUE mov scan_code,-1 SUICIDE end_gamen: SETBALLPOS 300,570,0,0,FALSE addtask to_demolation_derby MOV first_time_you_fool,true MOV CS:NEGERN,6 ;S¸ bollen hinner sl„ckas suicide to_demolation_derby: DEC CS:NEGERN jz negressen retn negressen: MOV CS:KEYBOARD_ENABLED,TRUE addtask to_demo_from_game CALL DEMO_MUSIC ;CP!??? mov scan_code,-1 SUICIDE checkstartkeys: MOV AL,SCAN_CODE CMP AL,3BH JB NOTF1F8 CMP AL,42H JA NOTF1F8 MOV SCAN_CODE,-1 CMP ADDPLAYERS,FALSE JE STARTDONE MOV ADDPLAYERS,FALSE MOV F1F8_CODE,AL ;=0: NOT PRESSED! MOV OLD_F1F8_CODE,AL MOV PLAYERS_CP,FALSE NOTF1F8: CMP AL,1CH JNE NOTENTER MOV SCAN_CODE,-1 CMP PLAYERS,8 JNB STARTDONE CMP ADDPLAYERS,FALSE JE STARTDONE CMP PLAYERS_CP,FALSE JE PLAYERS_NOT_CP MOV PLAYERS,0 MOV PLAYERS_CP,FALSE PLAYERS_NOT_CP: INC PLAYERS MOV AL,PLAYERS ADD AL,3BH-1 ;3BH=CODE FOR F1 MOV ADDPLAYERS,FALSE MOV F1F8_CODE,AL MOV OLD_F1F8_CODE,AL JMP STARTDONE NOTENTER: STARTDONE: RETN KEYBOARD_ENABLED DB true SETTER DB 2 tiltkey2 db false TILTLOGIC: CMP TILTDISABLED,TRUE JE RETTMIGGA pusha cmp i_utskjut,true ;Ej skjutit ut den je tiltdone CMP TILTFLAG,TRUE ;redan 'tilt tilt tilt' JE tiltDONE CMP BALL_DOWN,TRUE ;Redan d”tt JE TILTDONE CMP cs:TILTKEY2,TRUE JE TILTDONE ;REDAN BANKAT!! ADD TILTCOUNTER,60 ; mov bx,tiltcounter ; debugval 0,12,bx,'tiltcounter=' mov cs:tiltkey2,true CMP TILTCOUNTER,120 ;Tv¸ ska g¸ JA DOTIL CMP TILTCOUNTER,60 JBE TILTDONE CALL HE_ALMOST_TILTED ;Varningsjingle JMP tiltDONE DOTIL: MOV TILTFLAG,TRUE ;L†t han f† 'tilt tilt tilt' CALL HE_TILTED JMP TILTDONE TILTDONE: mov scan_code,-1 popa RETTMIGGA: RETN music_toggle: xor muzik_off,true jnz its_off mov al,springjingle mov s_spring,al mov al,mainjingle mov s_main,al mov lastjingle,mainjingle CMP SPRING_VALID,TRUE CMP i_utskjut,TRUE JNE NOSPRINGTUNE MOV LASTJINGLE,SPRINGJINGLE NOSPRINGTUNE: cmp jinglejumpcnt,1 jnl mdone mov jinglejumpcnt,1 jmp mdone its_off: ;NEJ! STˇNG AV! mov al,emptyjingle mov byte ptr s_spring,al mov byte ptr s_main,al cmp lastjingle,emptyjingle je mdone addtask turnoffmusic notM: mdone: retn turnoffmusic: mov current_priority,0 playjingle s_empty suicide checkcheat: mov bx,offset alfa_keys mov al,scan_code cmp al,-1 je novalidkey nil ah xlat cmp al,0 je novalidkey mov densomsparhanhar,al move es,data mov scan_code,-1 mov bx,cheatpekare mov [bx+offset cheatinput],al inc cheatpekare cmp cheatpekare,12 ;av s„kerhetssk„l, ska aldrig h„nda!! jbe eatit mov cheatpekare,0 mov cx,12 mov di,offset cheatinput mov al,' ' rep stosb ; debugmess 0,2,'overflow' retn eatit: ;check it coulditbe: mov si,offset cheats mov dont_know_yet,false checkit: mov di,offset cheatinput lodsw cmp ax,255 je endofcheats ;inga cheats st„mde!! mov bx,ax ;f”r att kunna kalla p† bx om det st„mde!! mov dx,0 nexttest: lodsb cmp al,'$' je found cmp dx,cheatpekare jae nownaaaating inc dx cmp al,[di] jne notfound inc di jmp nexttest nownaaaating: ; debugmess 0,1,'no naating' ; debugmess 0,2,'no naating' mov dont_know_yet,true notfound: lodsb cmp al,'$' je checkit jmp notfound endofcheats: cmp dont_know_yet,true je norezza_ofit mov cheatpekare,1 mov cx,11 mov di,offset cheatinput mov al,densomsparhanhar stosb mov al,' ' rep stosb norezza_ofit: retn novalidkey: retn found: mov cheatpekare,0 call bx retn MAIN: if debug MOV AL,9 INT 66H mov BL,AL NIL BH debugval 40,19,bx,"CURRENT POSITION: " mov BL,LASTJINGLE NIL BH debugval 0,19,bx,"LASTJINGLE: " cmp dotrut,offset nodot je ledignuju debugmess 0,2,'DOT BUSY' jmp ulurkur ledignuju: debugmess 0,2,'DOT FREE' ulurkur: debugbcd 50,0,siffrorna,"siffrorna=" endif cmp cs:keyboard_enabled,false je no_command_keys ;D† tangentbordet „r upptaget . . ;SKALL ALLTID FUNKA: IFSCAN 67,F9 IFSCAN 68,F10 CMP FFLAG,11 JNE NF11 CALL F11 NF11: CMP FFLAG,12 JNE NF12 CALL F12 NF12: ;******** if demomode ****** cmp demomode,true jne no_demomode ;Tangenter: f-keys + quit + cheats (om n†n orkar!) JOHAN ¸RKADE call checkstartkeys call checkcheat ifscan 1,checkquit jmp no_command_keys no_demomode: cmp loosing,true je no_command_keys ;******** if in chute ****** if demover else cmp spring_valid,true ;cp! jne no_chute ifscan 1,checkgamequit cmp cs:keyboard_enabled,false je no_command_keys ;D† tangentbordet „r upptaget . . call checkstartkeys endif no_chute: ;******** if ingame ******** ;Tangenter: pause IFSCAN 57,TILTLOGIC ifscan 50,music_toggle ifscan_set 25,pauseflag,true call checkpause no_command_keys: ifscan_set 1,SCAN_CODE,-1 inc slump_countern cmp holdstill,false je noskruv mova rotation,slump_countern and rotation,1023 test rotation,1 jz noskruv neg rotation noskruv: IF DEBUG debugval 0,6,sc_y,"Ypos=" ; DEBUGVAL 0,8,FLIPLINFO.LASTGFXFRAME,"LASTGFXFRAME" MOV BL,FLIPLINFO.LASTFRAME NIL BH ; DEBUGVAL 0,9,BX,"LASTFRAME" ; DEBUGVAL 0,10,FLIPLINFO.FLIPFRAME,"FLIPFRAME" mov bl,jingle_ready_anim nil bh ; debugval 40,2,bx,"jing_red_anim=" mov bl,jingle_ready_logic nil bh ; debugval 40,3,bx,"JING_RED_LOGIC" debugval 0,3,gravx,"X gravitation=" debugval 0,4,gravy,"Y gravitation=" debugval 0,5,sc_x,"Xpos=" cmp ballhigh,true je notl debugmess 0,7,"Lower level" notl: cmp ballhigh,true jne noth debugmess 0,7,"Upper level" noth: mov cx,word ptr hitvalue debugval 0,8,cx,"Material=" debugval 0,9,rotation,"rotation=" MOV CL,CURRENT_PRIORITY MOV CH,0 ; debugval 0,13,cx,"CURRENT PRIORITY: " ; debugbcd 30,9,JACKVALUE,"JACKPOT=" ; debugbcd 0,9,player_area.p_siffrorna,"player_area Po„ng=" ; debugbcd 0,10,player_area.p_bonussiffrorna,"player_area Bonus=" debugVAL 0,11,NO_OF_ACTIVE_TASKS,"No of active tasks=" ;******* mov ax,sc_y MOV DX,0 mov bX,576/25+1 div bX mov bp,ax mov ax,sc_x MOV DX,0 mov bX,320/40 div bX mov si,ax add si,40 ;******* push si bp mov si,oldx mov bp,oldy debugmess si,bp," " pop bp si mov oldx,si mov oldy,bp debugmess si,bp,"O" ENDIF CMP CS:QUITTING,TRUE JE QUIT ; mov time_left,true SET_ES 0 MOV AX,8 PUSHF CALL DWORD PTR ES:[66H*4] ;CREATE MUSIC JMP MAIN QUITTING DB FALSE F9: MOV SLIME_FACTOR,9 RETN F10: MOV SLIME_FACTOR,SLIME_FACTOR_DEFAULT RETN F11: MOV FFLAG,0 MOV SLIME_FACTOR,20 RETN F12: MOV FFLAG,0 MOV SLIME_FACTOR,40 RETN JUST_ONE_TIME_RESET: mov current_prIORITY,0 MOV LASTJINGLE,0 MOV LASTPRIORITY,0 MOV PRINTTASK,OFFSET DUMRET mov rullstart,0 mov rulltext,0 mov rull_pos,0 mov upp_add,0 mov tabort_diovre,0 mov tabort_diovre_fnt,0 mov rull_pos,0 MOV ALLOWFLIP,FALSE if demover MOV F1F8_CODE,3bh ;CP! automatic 1 player in demo version else MOV F1F8_CODE,0 ;CP! not automatic 1 player in game version MOV OLD_F1F8_CODE,0 endif MOV HOJD_ADD,0 MOV NODOTCOUNT,NOT_PLAYING-2 MOV FJANTTEXT,FALSE MOV CENT,FALSE CALL RESETFLASHLIST CALL RESET_TASK_LIST CALL RESET_WAITLIST cmp hi_res,true calle hires_changes RETN hires_changes: mov sync_per_sec,71 ;? retn RESET_WAITLIST: MOVE ES,DS NIL AX MOV DI,OFFSET WAITLIST MOV CX,MAX_NO_OF_WAIT_SYNCS REP STOSW ;CP! RETN WHEN_NEW_BALL_RESET: MOV LASTCHECK,0 MOV SPRING_VALID,TRUE MOV SHIFTPRESSED,FALSE MOV KEYTASK,OFFSET DUMRET MOV JINGLE_READY_ANIM,TRUE MOV JINGLE_READY_LOGIC,TRUE MOV INH_EFF,FALSE MOV LOOSING,FALSE MOV SPECIALMODE,FALSE MOV INHIBIT_COUNT_DOWN,FALSE ;(PENETRATION OF SPECIAL MODE) MOV DOT_READY,TRUE CALL RESETFLASHLIST CALL RESET_TASK_LIST CALL RESET_WAITLIST CMP PARTYFLASH,TRUE JE NO_UPDAT_PLEASE MOV MATRIX_IS_FLASHING,FALSE call kill_flashor ;F”r att inte senaste spelarens score skall synas!! CMP VISAKEYS,TRUE JNE NONEWPL MOV VISAKEYS,FALSE ; updat_score ; mov bx,offset newplayerTS ; call do_matrix JMP REDIGRET NONEWPL: updat_score mov bx,offset SHOWplayerSTS call do_matrix REDIGRET: retn NO_UPDAT_PLEASE: RETN RESET_TASK_LIST PROC NEAR MOV AX,OFFSET DUMRET MOV CX,NOOFTASKS MOV BX,OFFSET TASKLIST RESETNXTTASK: MOV [BX],AX ADD BX,2 LOOP RESETNXTTASK RETN RESET_TASK_LIST ENDP WHEN_NEW_GAME_RESET: MOV CS:KEYBOARD_ENABLED,TRUE MOV AFTER_CHEAT,FALSE MOV BALLS[11],1 MOV AL,BALLS[11] ADD AL,'7' ;SEPEKOMPENSERING MOV BALLSTEXT[5],AL MOV PLAYER,1 MOV AL,PLAYER ADD AL,'7' ;SEPEKOMPENSERING if demover else MOV PLAYERSTEXT[7],AL endif ;cpskydd MOV MAKE_BAD,true ;gnu urban ;************** CHECKSUMMA 1 AVKˇNNING *************** MOV SI,OFFSET CHECK1_START MOV CX,OFFSET CHECK1_END SUB CX,SI XOR AH,AH MOVE DS,CODE SVEN_BERTIL_TAUBE: LODSB ADD AH,AL LOOP SVEN_BERTIL_TAUBE MOVE DS,DATA SUB AH,2 COMMENT\ ;* #CHK# kommentera bort... PUSHA MOV AL,AH NIL AH DCLS DPRINTVAL AX," AX=" POPA \ if (bana EQ 1) CMP AH,197+7 endif if (bana EQ 2) CMP AH,165+7 endif if (bana EQ 3) CMP AH,37+7 endif if (bana EQ 4) CMP AH,83+7 endif JnE WASnt_OKKK MOV MAKE_BAD,false ;gnu urban WASnt_OKKK: MOV ADDPLAYERS,TRUE MOV DOT_READY,TRUE mov already_beaten,false MOV VISAKEYS,TRUE RETN INIT_ERR: SET_DS DATA CALL UNINST_KEY MOV AX,0 INT 66H MOV AX,3 INT 10H PRINTMESS "Can't init sound device!" MOV AX,4C02H INT 21H errorloadingmod: SET_DS DATA CALL UNINST_KEY MOV AX,0 INT 66H MOV AX,3 INT 10H PRINTMESS "Error loading module!" MOV AX,4C04H INT 21H cantfindmod: SET_DS DATA CALL UNINST_KEY if mongi_resiplay else MOV AX,0 INT 66H endif MOV AX,3 INT 10H PRINTMESS "Can't find " mova ds,data mov dx,offset modul mov ax,900h int 21h if mongi_resiplay MOV AX,0 INT 66H else endif MOV AX,4C04H INT 21H OUTOFMEMORY: SET_DS DATA CALL UNINST_KEY MOV AX,0 INT 66H MOV AX,3 INT 10H PRINTMESS "Out of memory! The selected sounddriver requires more memory!",13,10,"Please refer to the manual!",13,10,13,10 MOV AX,4C01H INT 21H levin db false ERRQUIT: QUIT: IF STAND_ALONE ELSE mov interrupts_on,false mov cs:fading,true call readpal mov si,256 gosp: CMP SYNC_COUNTER,0 JZ GOSP MOV SYNC_COUNTER,0 DEC SI call faderut push si cmp cs:levin,true je goga_dada mova es,0 mov ax,8 pushf call dword ptr es:[66h*4] goga_dada: pop si or si,si jg gosp ENDIF MOV AX,0 INT 66H ;DISINST SOUND MOV AX,0 INT 33H ;RESET MOUSEDRIVER/CHECK IF MOUSE INSTALLED CALL UNINST_KEY IF DEMOVER ELSE CALL SAVE_HIGHS ENDIF IF STAND_ALONE MOV AX,3 INT 10H ENDIF IF DEBUG debugmess 0,1,"Thanx for playing!" ENDIF MOV AX,4C00H INT 21H jcall dw 0 JINGLE_HANDLER PROC FAR IF DEBUG inc cs:jcall debugval 0,12,cs:jcall,"jinglecall no " ENDIF SET_DS DATA cli DEC JINGLEJUMPCNT IF DEBUG pushf mov BL,LASTJINGLE NIL BH debugval 0,19,bx,"LASTJINGLE: " mov bL,jinglejumpcnt NIL BH debugval 0,20,bx,"Jinglejumpcnt: " ; mov bL,LASTLOOPVAL ; NIL BH ; debugval 0,21,bx,"LASTLOOPVAL: " popf ENDIF JZ JINGLEREADY JL JINGLELOOP jmp check_m_off retf JINGLELOOP: MOV JINGLEJUMPCNT,0 jmp check_m_off RETF JINGLEREADY: MOV AL,LASTPRIORITY MOV CURRENT_PRIORITY,AL ; MOV AL,LASTLOOPVAL MOV JINGLEJUMPCNT,0 ;AL MOV AL,LASTJINGLE muzikof: MOV JINGLE_READY_ANIM,TRUE MOV JINGLE_READY_LOGIC,TRUE check_m_off: sti cmp muzik_off,false je goretf cmp al,lastmainpos ja goretf mov al,emptyjingle goretf: RETF ENDP MASKS2GFX PROC NEAR PUSH DS mov bp,GFXMASK21_OFFSET MOVA DS,MASK2_1 MOVA ES,0A000H MOV DX,3C4H MOV AL,2 MOV CX,4 MOV AH,10001B BITPL: PUSH CX OUT DX,AX ROL AH,1 MOV DI,bp MOV SI,CX DEC SI XOR SI,11B MOV CX,510*40/4 FLYT: MOVSB ADD SI,3 LOOP FLYT POP CX LOOP BITPL MOV BP,DI mova ds,data mov GFXMASK23_OFFSET,di PUSHA PUSH ES CALL INIT_FLIPPERS ;CP!? POP ES POPA MOVA DS,MASK2_3 MOV DX,3C4H MOV AL,2 MOV CX,4 MOV AH,10001B BITPL2: PUSH CX OUT DX,AX ROL AH,1 MOV DI,BP ;FIRSTPOS MOV SI,CX DEC SI XOR SI,11B MOV CX,510*40/4 FLYT2: MOVSB ADD SI,3 LOOP FLYT2 POP CX LOOP BITPL2 MOV BP,DI mova ds,data mov GFXMASK13_OFFSET,di MOVA DS,MASK1_3 MOV DX,3C4H MOV AL,2 MOV CX,4 MOV AH,10001B BITPL3: PUSH CX OUT DX,AX ROL AH,1 MOV DI,BP ;FIRSTPOS MOV SI,CX DEC SI XOR SI,11B ADD SI,230*40 ;RESTEN FINNS I MARGINALEN MOV CX,(576-230)*40/4 FLYT3: MOVSB ADD SI,3 LOOP FLYT3 POP CX LOOP BITPL3 MOV DX,3C4H MOV AL,2 MOV CX,4 MOV AH,10001B BITPL4: PUSH CX OUT DX,AX ROL AH,1 MOV DI,SPLH*BPL+80 ;FIRSTPOS MOV SI,CX DEC SI XOR SI,11B MOV CX,575 FLYT4: REPT 4 MOVSB ADD SI,3 ENDM ADD DI,80 LOOP FLYT4 POP CX LOOP BITPL4 POP DS RETN ENDP INIT_FLIPPERS PROC NEAR mov si,offset adjusttable mov cx,adjust*24 mov bx,adjust makeadjust: mov ax,adjust*24 sub ax,cx xor dx,dx div bx mov [si],ax add si,2 loop makeadjust MOVE ES,0A000H MOV DX,3C4H MOV AX,0F02H OUT DX,AX MOV DI,0 MOV CX,SPLH*BPL MOV AL,0 REP STOSB ;RENSA GRAFIKMINNET VID ARB. OMR¸DET if create_flip_data call init_the_flips else call load_the_flips MOV BX,OFFSET FLIPLINFO mov [bx].flipdata,flipleft mov [bx+size flipstruc].flipdata,flipright mov [bx+2*(size flipstruc)].flipdata,flipleft2 cmp hi_res,true je nosk56 SKALA56 [BX].FLIPAXUP SKALA56 [BX].FLIPAXDOWN SKALA56 [BX].FLIPMAXHASTUP SKALA56 [BX].FLIPMAXHASTDOWN FAN=SIZE FLIPSTRUC SKALA56 [BX+FAN].FLIPAXUP SKALA56 [BX+FAN].FLIPAXDOWN SKALA56 [BX+FAN].FLIPMAXHASTUP SKALA56 [BX+FAN].FLIPMAXHASTDOWN SKALA56 [BX+FAN*2].FLIPAXUP SKALA56 [BX+(FAN)*2].FLIPAXDOWN SKALA56 [BX+(FAN)*2].FLIPMAXHASTUP SKALA56 [BX+(FAN)*2].FLIPMAXHASTDOWN ;df ...slutar h„r nosk56: add [bx+size flipstruc].fliptab,8 add [bx+size flipstruc].fliptoppek,8 add [bx+size flipstruc].flippek,8 add [bx+size flipstruc].flipmaxpek,8 push bx add bx,size flipstruc add [bx+size flipstruc].fliptab,8*2 add [bx+size flipstruc].fliptoppek,8*2 add [bx+size flipstruc].flippek,8*2 add [bx+size flipstruc].flipmaxpek,8*2 pop bx MASKAR: CMP [BX].TYP,0 JZ INGA_FLER_MASKAR mov [bx].lastframe,-1 ;force blit mov ax,[bx].flipsize mov cx,3 nil dx div cx mov [bx].flipsize,ax PUSH BX CALL ORMASKFLIP CALL MOVEFLIPMASK POP BX ADD BX,SIZE FLIPstruc JMP MASKAR INGA_FLER_MASKAR: endif RETN load_the_flips: mov si,0 mova ds,flipgfxseg assume ds:flipgfxseg mova es,0a000h bipl=1 rept 4 setwrite bipl mov cx,flipgfxfilesize SHR CX,2 MOV DI,GFXADR_FOR_FLIP_ANIM_DATA rep movsb bipl=bipl*2 endm assume ds:data mova ds,data retn if create_flip_data init_the_flips: MOV BX,OFFSET FLIPLINFO INIT_FLEPS: CMP [BX].TYP,0 JZ FLEPS_INITED MOV FLIPPEKARE,BX PUSH BX ;ES=FLIPSEG; CX=FLIPX; DX=FLIPY ;FLIPPTR=ADR TO FLIPANIMTAB MOVA [BX].FLIPGFXSTART,CS:DIFPTR MOVA ES,[BX].FLIPDATA MOV CX,[BX].LEFTX MOV DX,[BX].TOPY MOVA FLIPPTR,[BX].FLIPTAB MOV AX,[BX].FLIPX SHL AX,1 MOV FLIPLINESIZE,AX SHL AX,3 MOV FLIPWIDTH,AX MOVA FLIPHEIGHT,[BX].FLIPY MOVA FLIPSTORLEK,[BX].FLIPSIZE MOVA CS:MAXDIFFAR,[BX].FLIPDIFS CALL INIT_FLIPPER POP BX CALL ORMASKFLIP CALL MOVEFLIPMASK ADD BX,SIZE FLIPSTRUC JMP INIT_FLEPS FLEPS_INITED: assume ds:dataflip L_len=offset rightfliptab-offset leftfliptab R_len=offset leftflip2tab-offset rightfliptab L2_len=offset temptab-offset leftflip2tab L_pos=offset leftfliptab R_pos=offset rightfliptab L2_pos=offset leftflip2tab assume ds:data createfile flipdatafil_L mova ds,dataflip writefile bx,L_len,L_pos closefile bx mova ds,data createfile flipdatafil_R mova ds,dataflip writefile bx,R_len,R_pos closefile bx mova ds,data createfile flipdatafil_L2 mova ds,dataflip writefile bx,L2_len,L2_pos closefile bx mova ds,data CREATEFILE FLIPSTRUCFIL ;SKRIV FLIPSTRUCKEN MOV SI,OFFSET FLIPLINFO MOV CX,(SIZE FLIPSTRUC)*3+2 WRITEFILE BX,CX,SI CLOSEFILE BX mov bp,cs:difptr mov si,GFXADR_FOR_FLIP_ANIM_DATA sub bp,si createfile flipgfxfil mova ds,0a000h mov cx,4 skriv_gfx: mov dx,3ceh mov ah,4 sub ah,cl mov al,4 out dx,ax ;v„lj l„s plan writefile bx,bp,si loop skriv_gfx mova ds,data closefile bx retn endif MAXDIFFAR DW ? DIV0: IRET MOVEFLIPMASK: ;BX PEKAR TILL FLIPPER MOV CX,[BX].FLIPFRAME cmp cl,[bx].lastframe je dont_doit mov [bx].lastframe,cl MOV SI,[BX].LEFTX MOV DI,[BX].TOPY MOV BP,[BX].FLIPX SHL BP,1 MOV DX,[BX].FLIPY PUSH DS MOV AX,[BX].FLIPSIZE MOVE DS,[BX].FLIPDATA MOVE ES,MASK1_2 PUSH DX MUL CX PUSH AX MOV AX,40 MUL DI SHR SI,3 ADD SI,AX MOV DI,SI POP SI if create_flip_data ADD SI,BP ADD SI,BP endif POP DX MOV CX,DX MOVFLIP: PUSH CX MOV CX,BP REP MOVSB POP CX if create_flip_Data ADD SI,BP ADD SI,BP endif ADD DI,40 SUB DI,BP LOOP MOVFLIP POP DS dont_doit: RETN ORMASKFLIP: MOVE ES,[BX].FLIPDATA MOV SI,[BX].LEFTX MOV DI,[BX].TOPY MOV CX,[BX].FLIPFRAMES INC CX MOV BP,[BX].FLIPX SHL BP,1 MOV DX,[BX].FLIPY PUSH DS MOVE DS,MASK1_2 MOV AX,40 PUSH DX MUL DI POP DX SHR SI,3 ADD SI,AX MOV DI,SI MOV SI,BP SHL SI,1 XCHG SI,DI if create_flip_data else mov di,0 endif ORFLIPS: PUSH SI PUSH CX MOV CX,DX ORFLIP: PUSH SI PUSH CX MOV CX,BP ORRA: LODSB OR ES:[DI],AL INC DI LOOP ORRA POP CX POP SI ADD SI,40 if create_flip_data ADD DI,BP ADD DI,BP endif LOOP ORFLIP POP CX POP SI LOOP ORFLIPS POP DS RETN ENDP IF CREATE_FLIP_DATA INIT_FLIPPER PROC NEAR ;ES=FLIPSEG; CX=FLIPX; DX=FLIPY ;FLIPPTR=ADR TO FLIPANIMTAB MOV FLIPSEG,ES MOV FLIPXPOS,CX MOV FLIPYPOS,DX MOV AX,FLIPYPOS ADD AX,SPLH MOV BX,BPL MUL BX MOV BX,FLIPXPOS SHR BX,2 ADD AX,BX MOV FLIPADR,AX MOV SI,AX ;(FLIPY+SPLH)*BPL+FLIPX/4 MOV DI,(800-60*2)*BPL+40 PUSH DI CALL COPYFLIPBGR POP DI MOV BP,0 MOV AX,FLIPXPOS AND AX,11B CALL PUTFLIPPER OR SHIFTKEYS,11B MOV BX,FLIPPEKARE MOV [BX].FLIPFRAME,0 MOV [BX].FLIPVINKELHAST,0 RITAFLIPPRAR: CALL NESTAFRAME ;BP=FLIPNO MOV SI,FLIPADR ;(FLIPY+SPLH)*BPL+FLIPX/4 MOV DI,(800-60*2)*BPL ADD DI,BUFR PUSH DI CALL COPYFLIPBGR POP DI PUSH DI MOV AX,FLIPXPOS AND AX,11B CALL PUTFLIPPER POP DI PUSH BP MOV BP,40 ;60*BPL CMP BUFR,0 JZ CORC NEG BP CORC: MOV SI,FLIPPTR MOV BX,FLIPPEKARE ADDA FLIPPTR,[BX].FLIPDIFS MOVA [BX].FLIPMAXPEK,FLIPPTR TEST SHIFTKEYS,11B JZ NOSI MOVA [BX].FLIPTOPPEK,FLIPPTR NOSI: CALL CMPFLIPBOX POP BP XOR BUFR,40 ;60*BPL MOV AH,0 ; INT keyhandler OR BP,BP JNZ RITAFLIPPRAR mov bx,flippekare CALL SORTFLIPPERDATA MOV BP,0 MOV DI,FLIPADR ;(FLIPY+SPLH)*BPL+FLIPX/4 MOV AX,FLIPXPOS AND AX,11B CALL PUTFLIPPER RETN NESTAFRAME: MOV BX,FLIPPEKARE INC [BX].FLIPFRAME TEST SHIFTKEYS,11B JNZ NODEC SUB [BX].FLIPFRAME,2 NODEC: MOV BP,[BX].FLIPFRAME CMP BP,[BX].FLIPFRAMES JNE DORET AND SHIFTKEYS,11111100B DORET: RETN ENDP SORTFLIPPERDATA PROC NEAR MOV SI,[BX].FLIPTAB MOV CX,[BX].FLIPFRAMES INC CX call sortflip MOV CX,[BX].FLIPFRAMES ; inc Cx MOV SI,[BX].FLIPtoppek add si,[BX].FLIPDIFS call sortflip retn sortflip: MOVA DS,DATAFLIP MOVA ES,DS ASSUME DS:DATAFLIP ;***************************************** SORTDATA: PUSH CX SI bx ADD SI,9*2 MOV DI,OFFSET TEMPTAB dec cx jz deunika cmp cx,8 jbe sortera mov cx,8 sortera:push cx si mov bp,cx mov cx,[SI-9*2] ;ANTAL DELTA BYTES mov bx,0 sorti: push cx si MOV AX,DS:[SI+bx] cmp ax,-1 je didfind mov cx,bp findit: ADD SI,CS:MAXDIFFAR CALL FINDWORD JnC DIDFIND loop findit stosw pop si mov word ptr ds:[si+bx],-1 ;markera att denna redan „r lagrad mov ax,[si+bx+2] stosw jmp short orvar DIDFIND: pop si orvar: pop cx add bx,4 loop sorti mov ax,di sub ax,offset temptab shr ax,2 shl bp,1 mov ds:[si+bp-9*2],ax ;lagra antal delta som hittats hitils shr bp,1 pop si cx loop sortera deunika: push si ;flytta in de som var helt unika sist mov cx,[si-9*2] desista:lodsw cmp ax,-1 je nostor stosw movsw sub si,2 nostor: add si,2 loop desista pop si mov cx,[si-9*2] mov di,si mov si,offset temptab shl cx,1 rep movsw ;l„gg in den sorterade listan i orginalet POP bx SI CX ADD SI,CS:MAXDIFFAR LOOP SORTDATA MOVA DS,DATA RETN FINDWORD: pusha mov cx,CS:MAXDIFFAR ;Maxdifs-5 SHR CX,2 SUB CX,5 leta: cmp ds:[si],ax je foudit add si,4 loop leta popa stc RETN foudit: popa clc retn ASSUME DS:DATA ;********************************** ENDP ENDIF INIT_KEY PROC NEAR SET_ES 0 CLI MOV AX,OFFSET KEYINT XCHG AX,ES:[9*4] MOV CS:OLD9,AX MOV AX,CS XCHG AX,ES:[9*4+2] MOV CS:OLD9+2,AX MOV AX,OFFSET div0 XCHG AX,ES:[0*4] MOV CS:OLD0,AX MOV AX,CS XCHG AX,ES:[0*4+2] MOV CS:OLD0+2,AX STI RETN OLD9 DW 0,0 old0 dw 0,0 ENDP UNINST_KEY PROC NEAR SET_ES 0 CLI MOVE ES:[9*4],CS:OLD9 MOVE ES:[9*4+2],CS:OLD9+2 MOVE ES:[0*4],CS:OLD0 MOVE ES:[0*4+2],CS:OLD0+2 STI RETN ENDP KEYINT PROC NEAR PUSHA PUSH DS MOV AL,20H OUT 20H,AL MOVA DS,DATA IN AL,60H PUSH AX IN AL,61H OR AL,80H OUT 61H,AL AND AL,7FH OUT 61H,AL POP AX STI ;DPRINTVAL AX," AX=" ;DPRINT " " test al,80h jnz no_alfa_key mov scan_code,al MOV CS:SETTER,TA_TID IF SAVEPAL CMP AL,3 JNE NO_UBBE_KUKEN MOVE ES:[9*4],CS:OLD9 MOVE ES:[9*4+2],CS:OLD9+2 NO_UBBE_KUKEN: ENDIF no_alfa_key: CMP CS:E0,TRUE JE DOE0 CMP AL,0E0H JNE NOTE0 MOV CS:E0,TRUE JMP KEYDONE NOTE0: CMP AL,57H ;F11 JNE NOTF11 MOV FFLAG,11 JMP KEYDONE NOTF11: CMP AL,58H ;F12 JNE NOTF12 MOV FFLAG,12 JMP KEYDONE NOTF12: CMP AL,2AH JE DSSK CMP AL,38H JE DSSK CMP AL,1DH JE DSSK JMP SHORT NOTLSDN DSSK: TEST SHIFTKEYS,10B JNZ NOTLSDN OR SHIFTKEYS,10B MOV SHIFTPRESSED,TRUE ;LEFT SHIFT KEY PRESSED cmp allowflip,false je keydone soundeffect sflippupp,0 JMP KEYDONE NOTLSDN: CMP AL,36H JE DSSKR JMP SHORT NOTRSDN DSSKR: TEST shiftkeys,1 jnz notrsdn OR SHIFTKEYS,1 MOV SHIFTPRESSED,TRUE ;RIGHT SHIFT KEY PRESSED cmp allowflip,false je keydone soundeffect sflippupp,0 JMP KEYDONE NOTRSDN: CMP AL,36H+80H JE DSSKR2 JMP SHORT NOTRSUP DSSKR2: AND SHIFTKEYS,0FEH JMP KEYDONE NOTRSUP: CMP AL,2AH+80H JE DSSK2 CMP AL,38H+80H JE DSSK2 CMP AL,1DH+80H JE DSSK2 JMP SHORT NOTLSup DSSK2: AND SHIFTKEYS,11111101B JMP KEYDONE NOTLSUP: CMP AL,57 JNE NOTSPC CMP TILTKEY,TRUE JE KEYDONE MOV TILTKEY,TRUE JMP KEYDONE NOTSPC: CMP AL,57+80H JNE NOTSPCU MOV TILTKEY,FALSE MOV cs:TILTKEY2,FALSE JMP KEYDONE NOTSPCU: COMMENT\ CMP AL,44 JNE NOTZ MOV CURRENT_PRIORITY,101 JMP KEYDONE NOTZ: \ if arrowS CMP AL,2 JNE NOT2 CLI MOV INTERRUPTS_ON,FALSE SET_ES 0A000H MOV AX,0DH INT 10H MOV SI,0 SET_DS MASK2_2 MOV CX,200*40 MOV DI,0 REP MOVSB cli mov dx,3d4h mov ax,0ch out dx,ax inc al out dx,ax JMP $ NOT2: CMP AL,72 JNE NOTPUP MOV Y_HAST,-1*PILHAST MOV X_HAST,0 JMP KEYDONE NOTPUP: CMP AL,75 JNE NOTPL MOV X_HAST,-1*PILHAST MOV Y_HAST,0 JMP KEYDONE NOTPL: CMP AL,77 JNE NOTPR MOV X_HAST,1*PILHAST MOV Y_HAST,0 JMP KEYDONE NOTPR: CMP AL,80 JNE NOTPDN MOV Y_HAST,1*PILHAST MOV X_HAST,0 JMP KEYDONE NOTPDN: endif KEYDONE: POP DS POPA IRET E0 DB FALSE DOE0: MOV CS:E0,FALSE CMP DEMOMODE,TRUE JE DOE0_DEMO CMP AL,49H JNE NOT_PGUP ; AND SHIFTKEYS,11111011B JMP KEYDONE NOT_PGUP: CMP AL,51H JNE NOT_PGDN ; OR SHIFTKEYS,00000100B JMP KEYDONE NOT_PGDN: CMP AL,50H ;(ARROW DOWN) JNE NOTARD MOV SPRINGTASK,OFFSET SPRINGSTEEN MOV DNPRESSED,TRUE JMP KEYDONE NOTARD: CMP AL,80h+50H ;(ARROW DOWN up) JNE NOTARdu MOV SPRINGTASK,OFFSET SPRINGUP MOV DNPRESSED,FALSE JMP KEYDONE NOTARdu: CMP AL,38H ;right alt JE DSSKR CMP AL,1DH ;right ctrl JE DSSKR CMP AL,38H+80h ;right alt up JE DSSKR2 CMP AL,1DH+80h ;right ctrl up JE DSSKR2 JMP KEYDONE NOTE0_DEMO: JMP KEYDONE DOE0_DEMO: CMP AL,49H JNE NOT_PGUP2 AND SHIFTKEYS,11111011B JMP KEYDONE NOT_PGUP2: CMP AL,51H JNE NOT_PGDN2 OR SHIFTKEYS,00000100B JMP KEYDONE NOT_PGDN2: JMP KEYDONE KEYINT ENDP MINIX DW ? THESCRPOS DW ? if create_flip_data PUTFLIPPER PROC NEAR ;INPUT: BP=FLIP NO, DI=SCRPOS, AX=MINIX MOV CS:THESCRPOS,DI MOV CS:MINIX,AX SET_ES FLIPSEG MOV CX,FLIPHEIGHT ;CX=LINE COUNTER MOV BX,0 ;BX=Y COORD SCANFLIPY: PUSH CX MOV CX,FLIPWIDTH ;CX=ROW COUNTER MOV AX,0 ;AX=X COORD SCANFLIPX: PUSH AX BX CX MOV CX,BP CALL READFLIPPIX MOV BX,OFFSET BIT2COL XLATB OR AL,AL JZ NOPUT MOV DL,AL POP CX BX AX PUSH AX BX CX MOV DI,CS:THESCRPOS ADD AX,CS:MINIX CALL PUTFLIPPIX NOPUT: POP CX BX AX INC AX LOOP SCANFLIPX INC BX POP CX LOOP SCANFLIPY RETN PUTFLIPPER ENDP endif SETSCREENSTART PROC NEAR MOV BX,SC_Y PUSH BP MOV BP,(SH_LO-SPLH)/2-BALLH/2-AWAYFROMMIDDLE CMP HI_RES,TRUE JNE NOTHIRES3 MOV BP,(SH_HI-SPLH)/2-BALLH/2-AWAYFROMMIDDLE NOTHIRES3: SUB BX,BP POP BP JNL BXOK1 IF GLAPP_SIZE MOV BX,-GLAPP_SIZE ELSE MOV BX,0 ENDIF JMP SHORT BXOK2 BXOK1: PUSH AX MOV AX,BANH-(SH_LO-SPLH) CMP HI_RES,TRUE JNE NOTHIRES4 MOV AX,BANH-(SH_HI-SPLH) NOTHIRES4: CMP BX,AX POP AX JB BXOK2 MOV BX,BANH-(SH_LO-SPLH)+GLAPP_SIZE CMP HI_RES,TRUE JNE NOTHIRES5 MOV BX,BANH-(SH_HI-SPLH)+GLAPP_SIZE NOTHIRES5: BXOK2: CMP SCREENFORCE,-1 JE NOSCREENFORCE MOV BX,SCREENFORCE ;THIS IS THE POWERFUL SCREEN FORCE ADD BX,SPLH PUSH BX IF RES600 MOV BX,2 ADD BX,SCREENPOSY ENDIF SETRASTERPOS bx POP BX PUSH BX SHL BX,4 MOV RASTERPOS,BX POP BX SUB BX,SPLH MOV START_RASTER,BX RETN NOSCREENFORCE: cmp screenforce2,-1 je nosf mov bx,screenforce2 nosf: ADD BX,SPLH PUSH BX mov ax,bx mov bx,rasterpos sar bx,4 sub ax,bx IF GLAPP_SIZE PUSHF ;df POP CX CMP SCREENFORCE2,-1 ;INGET GLAPP OM SCREENFORCE!!!!!!!!!!! JNE GLAPP_DONE PUSH CX POPF JS MINSU SUB AX,GLAPP_SIZE JNS GLAPP_DONE XOR AX,AX JMP SHORT GLAPP_DONE MINSU: ADD AX,GLAPP_SIZE JS GLAPP_DONE XOR AX,AX ENDIF GLAPP_DONE: MOV BX,SLIME_FACTOR IMUL BX MOV BX,AX SAR AX,2 add rasterpos,ax POP BX MOV AX,RASTERPOS SAR AX,4 SUB BX,AX JNS GAP_POS PUSH BP MOV BP,MAXGAPU_LO CMP HI_RES,TRUE JNE NOTHIRES10 MOV BP,MAXGAPU_HI NOTHIRES10: ADD BX,BP POP BP JG BX_OKI SAL BX,4 ADD RASTERPOS,BX JMP SHORT BX_OKI GAP_POS: PUSH BP MOV BP,MAXGAPD_LO CMP HI_RES,TRUE JNE NOTHIRES11 MOV BP,MAXGAPD_HI NOTHIRES11: SUB BX,BP POP BP JL BX_OKI SAL BX,4 ADD RASTERPOS,BX BX_OKI: mov bx,rasterpos sar bx,4 ADD BX,SCREENPOSY push bx IF RES600 MOV BX,SCREENPOSY ADD BX,2 ENDIF ; MOV BX,SPLH+BANH SETRASTERPOS bx pop bx sub bx,splh MOV START_RASTER,BX RETN SETSCREENSTART ENDP PUTTHEBALL PROC NEAR ;FN: DELETES AND PUTS THE BALL. ;INPUT: VERYFIRSTPUT, PUTITBETWEEN, PUTF3BETWEEN ; IF XXBETWEEN=TRUE THE FLIPPER(S) ARE DELTA ; MOVED BETWEEN THE DELETING AND THE PUTTING ; OF THE BALL. IF MARGIT SETMARG 1 ENDIF PUSHA SET_ES 0A000H CMP VERYFIRSTPUT,TRUE JE DNDB MOV DI,OLDPOS ;OLDPOS MOV CX,OLDSHIFT ;OLDSHIFT MOV SI,OFFSET UNDANSPR ;SAVEDDATA OFFSET SET_DS HIDDEN1 ;SAVEDDATA SEGMENT CALL DELBALL SET_DS DATA DNDB: CMP PUTITBETWEEN,TRUE JNE DNDLF CALL DOFLIPPER DNDLF: CMP PUTF3BETWEEN,TRUE JNE DNDLF2 CALL DOFLIPPER3 DNDLF2: IF MARGIT SETMARG 1 ENDIF MOV VERYFIRSTPUT,FALSE MOV DX,SC_X ;X POS MOV SI,SC_Y ;Y POS CMP HOLDSTILL,TRUE JE NOTILTADD ADD SI,SCREENPOSY NOTILTADD: ADD SI,SPLH MOV DI,OFFSET UNDANSPR ;SAVEDDATA OFFSET MOV BP,OFFSET HID1-SPLH*SW/8-576*2 SET_ES HIDDEN1 ;SAVEDDATA SEGMENT CMP BALLHIGH,FALSE JE BLHA ADD BP,42*576 BLHA: CALL PUTBALL SET_DS DATA MOV OLDPOS,SI ;OLDPOS MOV OLDSHIFT,DX ;OLDSHIFT POPA IF MARGIT SETMARG 0 ENDIF RETN PUTTHEBALL ENDP VBLANK_INT: MOVE DS,DATA INC SYNC_COUNTER MOV INT_WAS_HERE,TRUE MOV INT_WAS_HERE2,TRUE CMP INTERRUPTS_ON,TRUE JE VBLANKOK RETAF: MOV AX,12345 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER KLARAR JAG RETF ;RET VBLANKOK: OR AX,AX MOV TIME_LEFT,TRUE JZ NO_MUSIC_CRISIS MOV TIME_LEFT,FALSE NO_MUSIC_CRISIS: cmp calamares_delay,0 ;tryck inte p† pause f”r t„tt inp†!! je docaldecc dec calamares_delay docaldecc: ADD SLUMP_COUNTERN,1030 CMP DEMOMODE,TRUE JE VBLANK_INT_DEMO ;********************* SPELETS RUTINER *********************** INC SLOWCNT AND SLOWCNT,SLOW JNZ RETAF CMP CS:LAST_WAS_VB,TRUE JE RETAF MOV AL,INSIDE_BALLHANDLER MOV INSIDE_BALLHANDLER,TRUE CMP AL,TRUE JE RETAF CMP AL,TRUE JE RETAF SAVEGFXREGS MOV PUTF3BETWEEN,FALSE MOV FORCELATEF3,FALSE CMP SC_Y,F3TOP-BALLH+2 ;NO I: SC_Y + BALLH < F3TOP JB NO_INTEFERRENCE CMP SC_Y,F3TOP+F3HEIGHT-2 ;NO I: SC_Y > F3TOP + F3HEIGHT JA NO_INTEFERRENCE MOV PUTF3BETWEEN,TRUE JMP KEEP_COOL NO_INTEFERRENCE: MOV AX,F3TOP+F3HEIGHT/2-SH_LO/2 CMP HI_RES,TRUE JNE NOTHIRES6 MOV AX,F3TOP+F3HEIGHT/2-SH_HI/2 NOTHIRES6: CMP START_RASTER,AX JB F3_IS_LOW MOV FORCELATEF3,TRUE JMP HIGH_F3_DONE F3_IS_LOW: CALL DOFLIPPER3 HIGH_F3_DONE: KEEP_COOL: MOV AX,START_RASTER PUSH BP MOV BP,MIDDLE_RASTER_LO CMP HI_RES,TRUE JNE NOTHIRES8 MOV BP,MIDDLE_RASTER_HI NOTHIRES8: ADD AX,BP POP BP CMP SC_Y,AX JB BALL_HIGH BALL_LOW: CMP STATUS,UPPER JE BALL_LOW_STATUS_HIGH BALL_LOW_STATUS_LOW: MOV PUTITBETWEEN,TRUE ;PUT IT BETWEEN CALL PUTTHEBALL ;PUT THIS SYNC CALL KOLLAKULAN ;CALC NEXT SYNC MOV LATEGFX,FALSE JMP BALLREADY BALL_LOW_STATUS_HIGH: MOV STATUS,LOWER CALL DOFLIPPER ;DO FLIPPER CALL KOLLAKULAN ;CALC NEXT SYNC MOV LATEGFX,FALSE JMP BALLREADY BALL_HIGH: CMP STATUS,UPPER JE BALL_HIGH_STATUS_HIGH BALL_HIGH_STATUS_LOW: MOV STATUS,UPPER MOV LATEGFX,TRUE ;PUT NEXT SYNC LAST MOV PUTITBETWEEN,TRUE ;PUT IT BETWEEN CALL PUTTHEBALL ;PUT THIS SYNC CALL KOLLAKULAN ;CALC NEXT SYNC JMP BALLREADY BALL_HIGH_STATUS_HIGH: CALL DOFLIPPER ;DO FLIPPER CALL KOLLAKULAN ;CALC NEXT SYNC MOV LATEGFX,TRUE ;PUT NEXT SYNC LAST MOV AX,START_RASTER PUSH BP MOV BP,MIDDLE_RASTER_LO+5 ;5=CPMARGINAL CMP HI_RES,TRUE JNE NOTHIRES9 MOV BP,MIDDLE_RASTER_HI+5 ;5=CPMARGINAL NOTHIRES9: ADD AX,BP POP BP CMP AX,F3TOP JB F3ISLOW JMP BALLREADY F3ISLOW: CALL DOFLIPPER3 BALLREADY: CALL DO_PHYSICS ;LEVELS,RAMPER,MM MOV INSIDE_BALLHANDLER,FALSE CMP INSIDE_RESTOFVBLANK,FALSE JE DO_THE_REST RESTOREGFXREGS MOV CS:LAST_WAS_VB,TRUE MOV AX,12345 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER KLARAR JAG RETF DO_THE_REST: MOV CS:LAST_WAS_VB,TRUE MOV INSIDE_RESTOFVBLANK,TRUE CALL UPDATE_COUNTERS CALL DO_ELECTRONICS CALL SPRINGTASK IF MARGIT SETMARG 14 ENDIF cmp time_left,false je skip_matrix ;no time left! Skip it!! ; mov time_left,false ;ok, time was left last time! MOV AL,CS:INSIDE_MATRIX MOV CS:INSIDE_MATRIX,TRUE CMP AL,TRUE JE SKIP_MATRIX CALL DO_THE_DOTMATRIX ;updatera d† matrixen! MOV CS:INSIDE_MATRIX,FALSE skip_matrix: CALL DOLIGHTS IF MARGIT RESTOREMARG ENDIF IF MARGIT SETMARG 0 ENDIF MOV INSIDE_RESTOFVBLANK,FALSE RESTOREGFXREGS MOV AX,12345 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER KLARAR JAG RETF INSIDE_MATRIX DB FALSE LAST_WAS_VB DB FALSE ;****************************************************************************** DO_THE_DOTMATRIX PROC NEAR ;JOHANS TUNGA RUTINER! CALL DO_THE_ANIMATIONS MOV AX,AX_PRINT MOV DI,DI_PRINT CALL PRINTTASK MOV PRINTTASK,OFFSET DUMRET RETN DO_THE_DOTMATRIX ENDP DO_THE_ANIMATIONS PROC NEAR cmp intflag,true ;gabriel vill ABSOLUT penetrera!! je aterstallaren laddanasta: MOV DX,DOTRUT MOV SI,SISA CALL DX MOVE DS,DATA MOV SISA,SI CMP SI,0 JNE NOTFREEYET ;JOBBAR P¸ EN EFFEKT! MOV DOTRUT,OFFSET CS:NODOT MOV BX,NEXT_A CMP BX,0 JE ts_slut ;NOMOREANIMS CALL DO_SPEC_MATRIX ;ANIMATION SLUT, LADDA NˇSTA? jmp nomoreanims ts_slut: ; mov behovs_provad,true CALL KILL_FLASHOR ;cp!!?? ;d”da flashor NOMOREANIMS: MOV DOT_READY,TRUE JMP HOPPA_FORBI aterstallaren: ;(dan efter??) mov intflag,false jmp laddanasta NOTFREEYET: HOPPA_FORBI: RETN DO_THE_ANIMATIONS ENDP DO_MATRIX: call kill_flashor MOV DOT_READY,FALSE MOV NODOTCOUNT,0 MOV BEHOVS_PROVAD,TRUE DO_SPEC_MATRIX: UPDAT_SCORE JMP [BX] _ANIMATION: STARTANIM [BX+2] JMP NORMAL_END _SCROLL: STARTSCROLL [BX+2] JMP NORMAL_END _NUMBER: MOVE SISA,[BX+2] MOV DOTRUT,OFFSET SIFFRORRUT JMP NORMAL_END _FLASHON: ;BX NOT USED! MOV AX,[BX+2] ;AX=FLASHSPEED MOVE SISA,1 ;HUR M†NGA MOV DOTRUT,OFFSET WAITRUT MOV MATRIX_SPEED,AX MOV MATRIX_CNT,AX MOV MATRIX_ONOFF,TRUE MOV MATRIX_IS_FLASHING,TRUE JMP NORMAL_END print8_task: call reset_numberbuf mov si,si_siffror mov di,di_siffror mov hojd_1,8 mov hojd_add,bredd_1/4-sw*8*2/4 mov font_adr,offset font8 call print_number retn print11_task: call reset_numberbuf mov si,si_siffror mov di,di_siffror mov hojd_1,11 mov hojd_add,bredd_1/4-sw*11*2/4 mov font_adr,offset font11 call print_number retn print13_task: call reset_numberbuf mov si,si_siffror mov di,di_siffror mov hojd_1,13 mov hojd_add,bredd_1/4-sw*13*2/4 mov font_adr,offset font13 call print_number retn print5_task: call reset_numberbuf mov si,si_siffror mov di,di_siffror mov hojd_1,5 mov hojd_add,bredd_1/4-sw*5*2/4 mov font_adr,offset font5 call print_number retn _print11_number: move sisa,1 mov dotrut,offset waitrut mov tabort_diovre_fnt,0 PUSH [BX+2] POP si_siffror MOVE DI_siffror,[BX+4] MOV PRINTTASK,OFFSET PRINT11_task jmp print_end _print13_number: move sisa,1 mov dotrut,offset waitrut mov tabort_diovre_fnt,0 PUSH [BX+2] POP si_siffror MOVE DI_siffror,[BX+4] MOV PRINTTASK,OFFSET PRINT13_task jmp print_end _print8_number: move sisa,1 mov dotrut,offset waitrut mov tabort_diovre_fnt,0 PUSH [BX+2] POP si_siffror MOVE DI_siffror,[BX+4] MOV PRINTTASK,OFFSET PRINT8_task jmp print_end _print8_number_CENT: MOV CENT,TRUE move sisa,1 mov dotrut,offset waitrut mov tabort_diovre_fnt,0 PUSH [BX+2] POP si_siffror MOVE DI_siffror,[BX+4] MOV PRINTTASK,OFFSET PRINT8_task jmp print_end _print13_number_CENT: MOV CENT,TRUE move sisa,1 mov dotrut,offset waitrut mov tabort_diovre_fnt,0 PUSH [BX+2] POP si_siffror MOVE DI_siffror,[BX+4] MOV PRINTTASK,OFFSET PRINT13_task jmp print_end _print5_number: move sisa,1 mov dotrut,offset waitrut mov tabort_diovre_fnt,0 PUSH [BX+2] POP si_siffror MOVE DI_siffror,[BX+4] MOV PRINTTASK,OFFSET PRINT5_task jmp print_end _SOUND_EFFECT: move sisa,1 mov dotrut,offset waitrut MOV AX,[BX+2] MOV CX,[BX+4] PUSH BX SOUNDEFFECT2 AX,CL POP BX JMP PRINT_END _lastjingle: move sisa,1 mov dotrut,offset waitrut mov ax,[bx+2] mov lastjingle,al mov si,77 ;urko! jmp normal_end _JINGLE: move sisa,1 mov dotrut,offset waitrut MOV SI,[BX+2] mov current_priority,0 mov jinglejumpcnt,1 ; MOV AL,BYTE PTR [SI] ; MOV LASTJINGLE,AL ; MOV LASTLOOPVAL,1 PUSH BX call DoplaYJINGLE ;JOHAN SOM HAR SKRIVIT? POP BX JMP NORMAL_END _COUNTDOWNCONTINUE: ;INPUT: ?,?, VALUE TO PRINT MOV SUPER_INIT,FALSE MOV SISA,1 MOV DOTRUT,OFFSET COUNTDOWN CALL RESET_NUMBERBUF MOVE VAL_TO_PRINT,[BX+6] MOV SYNC_LEFT,1 MOV INHIBIT_COUNT_DOWN,FALSE JMP THREE_END _countdown: MEGA_RESET: MOV SUPER_INIT,FALSE ;input: seconds, value to print mov sisa,1 mov dotrut,offset countdown call reset_numberbuf move val_to_print,[bx+6] mov sync_left,1 mov [sec_asc],'A'-10+0 mov [sec_asc+1],'A'-10+1 mov al,[bx+2] add [sec_asc],al mov al,[bx+4] add [sec_asc+1],al jmp three_end _countdown2: ;input: ?, ? (update panel!) CMP SUPER_INIT,TRUE JE MEGA_RESET mov sisa,1 mov dotrut,offset countdown call reset_numberbuf mov sync_left,1 jmp three_end countdown: CMP INHIBIT_COUNT_DOWN,TRUE JE INH_CD dec sync_left jnz no_rez_this_sync mova sync_left,sync_per_sec cmp [sec_asc+1],'A'-10 jne over_it_again cmp [sec_asc],'*' je uninstall_count over_it_again: dec [sec_asc+1] cmp [sec_asc+1],'A'-10-1 jnz ingen_fara add [sec_asc+1],10 dec [sec_asc] ingen_fara: CMP [SEC_ASC],'A'-10 JNE NOT_ZERO MOV [SEC_ASC],'*' NOT_ZERO: ;[SEC_ASC] PEKAR P¸ MSD, (0='*') [SEC_ASC+1] PEKAR P¸ LSD ;LˇS AV BARA! PUSHA ;CP! CALL READ_SPECIAL_MODE_COUNTER POPA mov hojd_1,11 mov tabort_diovre,0 mov tabort_diovre_fnt,0 mov hojd_add,bredd_1/4-sw*11*2/4 mov font_adr,offset font11 push offset sec_asc pop AX_PRINT MOVE DI_PRINT,SW*6/4+16*18/4 ;cpw! MOV PRINTTASK,OFFSET PRINT_TEXT mov si,1 retn no_rez_this_sync: INH_CD: mov tabort_diovre_fnt,0 move si_siffror,val_to_print move di_siffror,SW*4/4+16*2/4 ;cpw! mov printtask,offset print13_TASK mov si,1 retn uninstall_count: ; mov specialmode,false mov sisa,0 mov si,0 retn _rullgardin_upp: mov dotrut,offset rullgardin_upp move rulltext,[bx+2] move stop_at_pos,[bx+4] mov rull_pos,16 jmp print_end _rullgardin_ned: mov dotrut,offset rullgardin_ned move rulltext,[bx+2] move stop_at_pos,[bx+4] mov rull_pos,-13 jmp print_end rullgardin_upp: ;rull_pos startv„rde m†ste vara satt till 16!!! dec rull_pos cmp rull_pos,16-14 jg noradering_upp mov ax,rull_pos add ax,13 mov bx,sw*2/4 mul bx mov clear_box_start,ax add clear_box_start,2*sw/4 mov clear_box_bredd,320/4 mov clear_box_hojd,1 call clear_box2 noradering_upp: mov hojd_1,13 mov hojd_add,bredd_1/4-sw*13*2/4 mov font_adr,offset font13 call putfont mov ax,stop_at_pos cmp rull_pos,ax je rezzeta mov si,1 retn rullgardin_ned: ;rull_pos startv„rde m†ste vara satt till -13!!! inc rull_pos cmp rull_pos,1 jl noradering_ned mov ax,rull_pos sub ax,1 mov bx,sw*2/4 mul bx mov clear_box_start,ax add clear_box_start,2*sw/4 mov clear_box_bredd,320/4 mov clear_box_hojd,1 call clear_box2 noradering_ned: mov hojd_1,13 mov hojd_add,bredd_1/4-sw*13*2/4 mov font_adr,offset font13 call putfont mov ax,stop_at_pos cmp rull_pos,ax je rezzeta mov si,1 retn rezzeta: mov si,0 mov tabort_diovre,0 mov tabort_diovre_fnt,0 retn putfont: mov ax,rull_pos cmp ax,0 jge kapa_ej_overkant ;Kapa i ”verkant! neg ax ;g”r ax positiv! mov tabort_diovre,ax mov tabort_diovre_fnt,ax ;s† mycket som skall kapas! mov di,sw*2/4 ;”versta rastern jmp print_it kapa_ej_overkant: cmp ax,16-13 ;matrixhojd-fonthojd jle kapa_ej_nederkant ; neg ax ;-pos ; add ax,16 ;=> ax=16-pos add ax,13-16 mov tabort_diovre,ax ;s† mycket som ska kapas! mov tabort_diovre_fnt,0 ;men inget i ”vekant mov ax,rull_pos inc ax mov bx,sw/4*2 ;di=rull_pos*sw*2/4 mul bx mov di,ax jmp print_it kapa_ej_nederkant: mov tabort_diovre,0 ;s„tt ut hela! mov tabort_diovre_fnt,0 ; mov ax,rull_pos mov bx,sw/4*2 ;di=rull_pos*sw*2/4 mul bx mov di,ax add di,sw/4*2 print_it: CMP TABORT_DIOVRE,13 JAE SKIPIT_PRINT mov ax,rulltext call print_text SKIPIT_PRINT: retn clear_box2: ;obs EJ en taskig rutin!! mov cx,clear_box_hojd mov di,clear_box_start move es,0a000h doline_clear2: push cx mov cx,clear_box_bredd push di push cx setwrite 1 mov al,matrixhi rep stosb pop cx pop di push di setwrite 100b mov al,matrixhi rep stosb pop di pop cx add di,sw*2/4 loop doline_clear2 retn PP_DO_LINE PROC NEAR ;INPUT: ES:SI=SOURCE, LAGERARBETARNA=DEST MOV CX,320/4 MOV DI,LAGERARBETAREN MOV BYTE PTR DS:[DI],0 PP_NEXT_BYTE: PUSH CX NIL DH CMP BYTE PTR ES:[SI],MATRIXLO JNE ITS_GREY NOT DH ITS_GREY: AND DH,LILLE_LAGERARBETAREN OR DS:[DI],DH INC SI ROR LILLE_LAGERARBETAREN,1 JNC EJ_BYTE_AV_BYTE INC DI MOV BYTE PTR DS:[DI],0 EJ_BYTE_AV_BYTE: POP CX LOOP PP_NEXT_BYTE MOV LAGERARBETAREN,DI RETN PP_DO_LINE ENDP PP_DO_BITPLANE PROC NEAR ;INPUT: RˇTT BITPLAN SATT MOV CX,16 MOV SI,SW*4/4/2 PP_NEXT_LINE: PUSH CX SI CALL PP_DO_LINE POP SI CX ADD SI,SW/4*2 LOOP PP_NEXT_LINE RETN PP_DO_BITPLANE ENDP PRINT_PAUSE: CALL MATRIXON_ CALL DOLIGHTS MOV LAGERARBETAREN,OFFSET PAUSE_LAGRET MOV LILLE_LAGERARBETAREN,10000000B MOVE ES,0A000H MOV CX,4 PP_NEXT_BITPLANE: PUSH CX MOV AL,4 SUB AL,CL SETREAD AL CALL PP_DO_BITPLANE POP CX DEC CX LOOP PP_NEXT_BITPLANE PUSH OFFSET PAUSE_TEXT POP AX_PRINT MOVE DI_PRINT,sw*4/4+16*0/4+4*5-2 call print_it_klux CALL MATRIXON_ CALL DOLIGHTS RETN print_it_klux: MOV CLEAR_BOX_START,SW/4*2 MOV CLEAR_BOX_BREDD,320/4 MOV CLEAR_BOX_HOJD,16 CALL CLEAR_BOX2 MOV HOJD_1,13 MOV HOJD_ADD,BREDD_1/4-SW*13*2/4 MOV FONT_ADR,OFFSET FONT13 MOV TABORT_DIOVRE,0 MOV TABORT_DIOVRE_FNT,0 MOV AX,AX_PRINT MOV DI,DI_PRINT CALL PRINT_TEXT retn PP_DO_LINE2 PROC NEAR ;INPUT: ES:DI=DEST, LAGERARBETARNA=SOURCE MOV CX,320/4 MOV SI,LAGERARBETAREN PP_NEXT_BYTE2: PUSH CX MOV AL,DS:[SI] AND AL,LILLE_LAGERARBETAREN MOV AL,MATRIXLO JNZ ITS_YELLOW MOV AL,MATRIXHI ITS_YELLOW: STOSB ROR LILLE_LAGERARBETAREN,1 JNC EJ_BYTE_AV_BYTE2 INC SI EJ_BYTE_AV_BYTE2: POP CX LOOP PP_NEXT_BYTE2 MOV LAGERARBETAREN,SI RETN PP_DO_LINE2 ENDP PP_DO_BITPLANE2 PROC NEAR ;INPUT: RˇTT BITPLAN SATT MOV CX,16 MOV DI,SW*4/4/2 PP_NEXT_LINE2: PUSH CX DI CALL PP_DO_LINE2 POP DI CX ADD DI,SW/4*2 LOOP PP_NEXT_LINE2 RETN PP_DO_BITPLANE2 ENDP RESTORE_AFTER_PAUSE PROC NEAR MOV LAGERARBETAREN,OFFSET PAUSE_LAGRET MOV LILLE_LAGERARBETAREN,10000000B MOVE ES,0A000H MOV CX,2 MOV AL,1 PP_NEXT_BITPLANE2: PUSH AX CX SETWRITE AL CALL PP_DO_BITPLANE2 POP CX AX SHL AL,2 LOOP PP_NEXT_BITPLANE2 RETN RESTORE_AFTER_PAUSE ENDP _print13: move sisa,1 mov dotrut,offset waitrut MOV HOJD_1,13 MOV HOJD_ADD,BREDD_1/4-SW*13*2/4 MOV FONT_ADR,OFFSET FONT13 mov tabort_diovre,0 mov tabort_diovre_fnt,0 MOVE AX_PRINT,[BX+2] MOVE DI_PRINT,[BX+4] MOV PRINTTASK,OFFSET PRINT_TEXT jmp print_end _print11: move sisa,1 mov dotrut,offset waitrut mov hojd_1,11 mov tabort_diovre,0 mov tabort_diovre_fnt,0 mov hojd_add,bredd_1/4-sw*11*2/4 mov font_adr,offset font11 MOVE AX_PRINT,[BX+2] MOVE DI_PRINT,[BX+4] MOV PRINTTASK,OFFSET PRINT_TEXT jmp print_end _print8: move sisa,1 mov dotrut,offset waitrut mov hojd_1,8 mov tabort_diovre,0 mov tabort_diovre_fnt,0 mov hojd_add,bredd_1/4-sw*8*2/4 mov font_adr,offset font8 MOVE AX_PRINT,[BX+2] MOVE DI_PRINT,[BX+4] MOV PRINTTASK,OFFSET PRINT_TEXT jmp print_end _print5: move sisa,1 mov dotrut,offset waitrut mov hojd_1,5 mov tabort_diovre,0 mov tabort_diovre_fnt,0 mov hojd_add,bredd_1/4-sw*5*2/4 mov font_adr,offset font5 MOVE AX_PRINT,[BX+2] MOVE DI_PRINT,[BX+4] MOV PRINTTASK,OFFSET PRINT_TEXT jmp print_end ;****************************** print_END: ADD BX,6 CMP WORD PTR [BX],0 JNE _NEXTp_ MOV BX,0 _NEXTp_: MOV NEXT_A,BX RETN ;****************************** three_end: ADD BX,6+2 CMP WORD PTR [BX],0 JNE _NEXTp_Q MOV BX,0 _NEXTp_Q: MOV NEXT_A,BX RETN MATRIX_BLINKOR: CMP MATRIX_IS_FLASHING,TRUE JNE NOBLINKOR DEC MATRIX_CNT JNZ DUMRET MOVE MATRIX_CNT,MATRIX_SPEED MOV SI,OFFSET MATRIXOFF XOR MATRIX_ONOFF,0FFH JZ THE_OTHER MOV SI,OFFSET MATRIXON THE_OTHER: MOVE ES,DS MOV DI,RGBBUFPTR ;FLYTTA [SI] TILL [DI] & UPPDAT RGBBUFPTR! MOVSB ;START COL LODSB ;AL=RGB LEN STOSB MOV CL,AL NIL CH REP MOVSB ;R,G,B ETC MOV RGBBUFPTR,DI NOBLINKOR: RETN MATRIXON_: MOV SI,OFFSET MATRIXON MOVE ES,DS MOV DI,RGBBUFPTR ;FLYTTA [SI] TILL [DI] & UPPDAT RGBBUFPTR! MOVSB ;START COL LODSB ;AL=RGB LEN STOSB MOV CL,AL NIL CH REP MOVSB ;R,G,B ETC MOV RGBBUFPTR,DI ; CALL DOLIGHTS RETN MATRIXOFF_: MOV SI,OFFSET MATRIXOFF MOVE ES,DS MOV DI,RGBBUFPTR ;FLYTTA [SI] TILL [DI] & UPPDAT RGBBUFPTR! MOVSB ;START COL LODSB ;AL=RGB LEN STOSB MOV CL,AL NIL CH REP MOVSB ;R,G,B ETC MOV RGBBUFPTR,DI ; CALL DOLIGHTS RETN _FLASHOFF: MOVE SISA,1 ;HUR M†NGA MOV DOTRUT,OFFSET WAITRUT CALL KILL_FLASHOR JMP NORMAL_END _MATRIXLGT: MOVE SISA,1 ;HUR M†NGA MOV DOTRUT,OFFSET WAITRUT CMP WORD PTR [BX+2],0 JE OFF_WITH_IT CALL MATRIXON_ JMP BORT_LELLE_VAN OFF_WITH_IT: CALL MATRIXOFF_ BORT_LELLE_VAN: JMP NORMAL_END _SETDECCOR: MOVE SISA,1 ;HUR M†NGA MOV DOTRUT,OFFSET WAITRUT MOVE DECCOR,DS:[BX+2] JMP NORMAL_END KILL_FLASHOR PROC NEAR pusha MOV MATRIX_IS_FLASHING,FALSE MOV SI,OFFSET MATRIXON MOVE ES,DS MOV DI,RGBBUFPTR ;FLYTTA [SI] TILL [DI] & UPPDAT RGBBUFPTR! MOVSB ;START COL LODSB ;AL=RGB LEN STOSB MOV CL,AL NIL CH REP MOVSB ;R,G,B ETC MOV RGBBUFPTR,DI popa RETN KILL_FLASHOR ENDP _WAIT: MOVE SISA,[BX+2] ;HUR M†NGA MOV DOTRUT,OFFSET WAITRUT ;galopp JMP NORMAL_END _WAITifmulti: MOVE SISA,[BX+2] ;HUR M†NGA cmp players,1 jne dowwe mov sisa,2 ;cpgnu? venta inte om ej multiplayer dowwe: MOV DOTRUT,OFFSET WAITRUT ;galopp JMP NORMAL_END _LOCK: MOVE SISA,[BX+2] ;HUR M†NGA MOV DOTRUT,OFFSET LOCKRUT ;galopp JMP NORMAL_END LOCKRUT: MOV SI,1 RETN _WAIT_YN: MOVE SISA,[BX+2] ;HUR M†NGA MOV DOTRUT,OFFSET WAITRUT_YN ;galopp JMP NORMAL_END endit: ADD BX,2 CMP WORD PTR [BX],0 JNE _NEXT_hh MOV BX,0 _NEXT_hh: MOV NEXT_A,BX RETN clearend: mov si,0 retn _clear1: ;clear all matrix MOVE SISA,1 MOV DOTRUT,OFFSET rclear1 mov clearval,0 jmp endit rclear1: add clearval,2*sw/4 move clear_box_start,clearval mov clear_box_bredd,320/4 mov clear_box_hojd,16 call clear_box2 jmp clearend _clear2: ;clear from top to bottom MOVE SISA,1 MOV DOTRUT,OFFSET rclear2 mov clearval,0 jmp endit rclear2: add clearval,2*sw/4 cmp clearval,2*sw*18/4-2*SW/4 je clearend move clear_box_start,clearval mov clear_box_bredd,320/4 mov clear_box_hojd,1 call clear_box2 mov si,1 retn _clear3: ;clear from left to right MOVE SISA,1 MOV DOTRUT,OFFSET rclear3 mov clearval,sw*2/4-1 jmp endit rclear3: add clearval,1 cmp clearval,320/4+sw*2/4 je clearend move clear_box_start,clearval mov clear_box_bredd,1 mov clear_box_hojd,16 call clear_box2 mov si,1 retn _clear4: ;clear 4 raster top to bottom MOVE SISA,1 MOV DOTRUT,OFFSET rclear4 mov clearval,0 jmp endit rclear4: add clearval,2*sw/4 cmp clearval,2*sw*5/4 je clearend move clear_box_start,clearval mov clear_box_bredd,320/4 mov clear_box_hojd,1 call clear_box2 move clear_box_start,clearval add clear_box_start,4*2*sw/4 mov clear_box_bredd,320/4 mov clear_box_hojd,1 call clear_box2 move clear_box_start,clearval add clear_box_start,8*2*sw/4 mov clear_box_bredd,320/4 mov clear_box_hojd,1 call clear_box2 move clear_box_start,clearval add clear_box_start,12*2*sw/4 mov clear_box_bredd,320/4 mov clear_box_hojd,1 call clear_box2 mov si,1 retn _FADE: MOVE SISA,[BX+2] ;HUR M†NGA MOV DOTRUT,OFFSET FADERUT PUSHA PUSH ES MOV CS:FADING,TRUE CALL READPAL POP ES POPA ;galopp JMP NORMAL_END FADING DB FALSE READPAL: MOV DX,3C7H MOV AL,0 OUT DX,AL MOV DX,3C9H MOV CX,3*256 MOVA ES,CS MOV DI,OFFSET CS:PALLE RPAL: IN AL,DX STOSB LOOP RPAL RETN SETPAL: MOV DX,3C8H MOV AL,0 OUT DX,AL MOV CX,3*256 MOV DI,OFFSET CS:PALLE SPAL: MOV AL,CS:[DI] XOR AH,AH MUL BX MOV AL,AH MOV DX,3C9H OUT DX,AL INC DI LOOP SPAL RETN PALLE DB 3*256 DUP(32) FADERUT: DEC SI PUSHA PUSH ES MOV CX,SI TEST CX,15 JNZ NONEW16 MOV AL,6 INT 66H NONEW16:MOV BX,CX CALL SETPAL POP ES POPA RETN _WAITJINGLE: MOV DOtRUT,OFFSET WAITJINGLE JMP NORMAL_END _WAITJINGLE2: MOV DOtRUT,OFFSET WAITJINGLE2 JMP NORMAL_END WAITRUT: DEC SI RETN WAITRUT_YN: mov al,scan_code cmp al,-1 je feltecken_du2 ;ej tryckt! mov scan_code,-1 mov bx,offset alfa_keys xlat cmp al,0 je feltecken_du2 ;felaktigt tecken! CMP AL,'N' JE NOKVTTER CMP AL,'Y' JE do_quit_mr jmp nokvtter do_quit_mr: MOV CS:QUITTING,TRUE NOKVTTER: mov cs:already_quitting,false mov cs:keyboard_enabled,true MOV SI,0 RETN feltecken_du2: MOV SI,1 RETN PARTYRUT: ; DEC SI RETN WAITJINGLE: mov si,TRUE CMP JINGLE_READY_ANIM,TRUE JNE DUMRET MOV SI,0 RETN WAITJINGLE2: ;WAITJINGLE2 HAR EN SPECIALARE F™R NOSOUND ;OBS! DECCOR M¸STE VARA SATT INNAN DENNA RUT ANVˇNDS. mov si,TRUE PUSH ES PUSHA SET_ES 0 MOV AX,21 PUSHF CALL DWORD PTR ES:[66H*4] ;TEST IF NOSOUND TEST AL,1000B JNZ ITWASNOSOUND CMP JINGLE_READY_ANIM,TRUE JNE QWJ2 JMP SHORT ENDOFIT ITWASNOSOUND: DEC DECCOR JZ ENDOFIT QWJ2: POPA POP ES RETN ENDOFIT: POPA POP ES NIL SI RETN PEKORB DW SCORE DW CODE2 SIFFRORRUT: PUSHA MOV BX,SW*2/4-16*2/4 ;TJA, VAD¸ CENTRERAD?? MOVE ES,CS CALL DWORD PTR ES:PEKORB POPA UPDAT_SCORE MOV SI,0 RETN ;****************************** NORMAL_END: ADD BX,4 CMP WORD PTR [BX],0 JNE _NEXT_ MOV BX,0 _NEXT_: MOV NEXT_A,BX RETN ;****************************** PEKOR DW SCORE DW CODE2 NODOT: ;NO EFFECT IS RUNNING!! ;SHOW THE SCORE! ; debugmess 0,1,'NODOT ' cmp cs:keyboard_enabled,false je i_show_naaathing ;if keyb disabled, a quest is on the screen!! CMP NODOTCOUNT,NOT_PLAYING JE SHOW_HI_ETC CMP AFTER_CHEAT,TRUE JE CHEATED CMP DEMOMODE,TRUE JE SHOW_HI_2 ; CMP NODOTCOUNT,0 ; JNE ONLY_SCORE CMP I_UTSKJUT,TRUE JE ONLY_SCORE cmp behovs_provad,true jne only_score mov behovs_provad,false ;skriv ut bara f”rsta g†ngen! MOV BX,OFFSET showplayersTS CALL DO_SPEC_MATRIX JMP ONLY_SCORE CHEATED: MOV AFTER_CHEAT,FALSE MOV BX,OFFSET showHighSTS CALL DO_MATRIX ; debugmess 0,0,"cheat" JMP i_show_naaathing SHOW_HI_ETC: cmp spring_valid,true je overitagain mov fjanttext,true if demover moval play_text[8],'7'+1 else moval play_text[8],playerstext[7] endif moval play_text[18],ballstext[5] MOV BX,OFFSET showInfoTS CALL DO_MATRIX JMP OVERITAGAIN SHOW_HI_2: MOV BX,OFFSET AfterDemoModeTS ;cp!!?? CALL DO_MATRIX jmp overitagain overitagain_heter_nisse: mov first_time_you_fool,false OVERIT: MOV BX,OFFSET showHighSTS CALL DO_MATRIX OVERITAGAIN: ONLY_SCORE: CALL CHECKHIGHSCORE INC NODOTCOUNT mov si,offset siffrorna mov bx,SW*2/4+(320-12*16)/4 ;h”ger justerad! MOVE ES,CS CALL DWORD PTR ES:PEKOR i_show_naaathing: MOV SI,0 RETN ;DUMRET F™R DOTS CHECKHIGHSCORE: pusha cmp i_utskjut,true je end_chkofhiscre cmp specialmode,true je end_chkofhiscre cmp already_beaten,true je end_chkofhiscre mov di,offset hi_score_list MOV SI,OFFSET SIFFRORNA Hcheck_list: mov cx,12 mov bx,0 Hcheck_num: mov al,[di+bx] cmp [si+bx],al jb Hnot_beaten ja Hbeaten inc bx loop Hcheck_num Hnot_beaten: end_chkofhiscre: popa RETN Hbeaten: mov already_beaten,true MOV BX,OFFSET BEATENTS CALL DO_MATRIX mov behovs_provad,true popa RETN ;****** _beaten_matrix: pusha cmp already_beaten,true je bend_chkofhiscre mov di,offset hi_score_list MOV SI,OFFSET SIFFRORNA bHcheck_list: mov cx,12 mov bx,0 bHcheck_num: mov al,[di+bx] cmp [si+bx],al jb bHnot_beaten ja bHbeaten inc bx loop bHcheck_num bHnot_beaten: bend_chkofhiscre: popa add bx,2 jmp [bx] bHbeaten: mov already_beaten,true popa mov bx,offset beaten_bh_ts JMP [BX] print_siffror5__: ;print_numbers input e si=offset till bcd:n, di=pos † skriva ut mov si,si_siffror mov di,di_siffror mov hojd_1,5 mov hojd_add,bredd_1/4-sw*5*2/4 mov font_adr,offset font5 call print_number print_siffror5: ;DETTA ˇR HˇRMED EN TASKRUTIN!!! ;print_numbers input e si=offset till bcd:n, di=pos † skriva ut mov si,si_siffror mov di,di_siffror mov hojd_1,5 mov hojd_add,bredd_1/4-sw*5*2/4 mov font_adr,offset font5 call print_number SUICIDE print_siffror8: ;CP! ;print_numbers input e si=offset till bcd:n, di=pos † skriva ut mov hojd_1,8 mov hojd_add,bredd_1/4-sw*8*2/4 mov font_adr,offset font8 call print_number retn print_siffror11: ;print_numbers input e si=offset till bcd:n, di=pos † skriva ut mov hojd_1,11 mov hojd_add,bredd_1/4-sw*11*2/4 mov font_adr,offset font11 call print_number retn print_siffror13: ;print_numbers input e si=offset till bcd:n, di=pos † skriva ut mov hojd_1,13 mov hojd_add,bredd_1/4-sw*13*2/4 mov font_adr,offset font13 call print_number Retn FLIPPRA: IF DEBUG mov cs:Reknare,0 ;cp! debugging info ; DEBUGVAL 0,5,[BX].LASTGFXFRAME,"LASTGFXFRAME: " ENDIF SET_ES 0A000H MOV DX,3C4H MOV AX,0F02H OUT DX,AX ;;ALLA BITPLAN P¸ MOV DX,3CEH MOV AX,4105H OUT DX,AX ;ARONSSON ON MOV AX,[BX].TOPY ADD AX,SPLH MOV DI,BPL MUL DI MOV DI,AX MOV AX,[BX].LEFTX SHR AX,2 ADD DI,AX MOV AX,[BX].FLIPFRAME MOV CX,AX SUB CX,[BX].LASTGFXFRAME XCHG [BX].LASTGFXFRAME,AX JE NOMOVE ;;OM 0: INGET JAG KAN G™RA JA WAYUP NEG CX MOV DX,[BX].FLIPDIFS MUL DX MOVE [BX].FLIPPEK,[BX].FLIPMAXPEK SUB [BX].FLIPPEK,AX JMP DANIM reknare dw 0 maxreknare dw 0 WAYUP: MOV DX,[BX].FLIPDIFS MUL DX ADD AX,[BX].FLIPTAB MOV [BX].FLIPPEK,AX DANIM: PUSH 0 CMP CX,9 JBE DELTA_ANIMERA POP AX ;DUMMY POP MOV AX,CX SUB AX,9 PUSH AX MOV CX,9 DELTA_ANIMERA: PUSH CX DI PUSH BX MOV BX,[BX].FLIPPEK ; debugclear ; debugval 10,10,bx,"=" ; jmp quit MOVA DS,DATAFLIP mov si,cx dec si shl si,1 MOV CX,[BX+si] ;cp! ska va bx+si jcxz nobytestoanim IF DEBUG add cs:reknare,cx CMP CS:REKNARE,300 JB INGEN_HORSE DEBUGVAL 0,4,BX,"BX VA=" DEBUGVAL 15,4,SI,"SI VA=" DEBUGVAL 35,4,[BX+SI],"[BX+SI] VA=" POP BX MOVA DS,DATA DEBUGVAL 20,5,[BX].LASTGFXFRAME,"NEW GFXFRAME: " JMP QUIT ENDIF INGEN_HORSE: ADD BX,2*9 CALL DELTANIM nobytestoanim: MOVA DS,DATA POP BX ADDA [BX].FLIPPEK,[BX].FLIPDIFS POP DI CX LOOP DELTA_ANIMERA POP CX IF DEBUG mov cs:Reknare,0 ;cp! debugging info ENDIF OR CX,CX PUSH 0 JNZ DELTA_ANIMERA POP AX ;DUMMY POP IF DEBUG mov cx,cs:reknare cmp cs:maxreknare,cx ja nomove mov cs:maxreknare,cx debugval 0,3,cs:maxreknare,"max antal deltade bytes per frame: " ENDIF NOMOVE: MOV DX,3CEH MOV AX,4005H OUT DX,AX ;ARONSSON OFF RETN DOFLIPPER: IF MARGIT SETMARG 31 ENDIF MOV BX,OFFSET FLIPLINFO CALL FLIPPRA ADD BX,(SIZE FLIPSTRUC) CALL FLIPPRA IF MARGIT SETMARG 0 ENDIF RETN DOFLIPPER3: IF MARGIT SETMARG 15 ENDIF MOV BX,OFFSET FLIPLINFO+(SIZE FLIPSTRUC)*2 cmp byte ptr [bx],0 jz no_upper_flip CALL FLIPPRA no_upper_flip: IF MARGIT SETMARG 0 ENDIF RETN LATE_RASTER_INTERRUPT: MOVE DS,DATA MOV INT_WAS_HERE,TRUE MOV INT_WAS_HERE2,TRUE CMP SLOWCNT,0 JNZ RETTEF CMP INTERRUPTS_ON,TRUE JE LRINTOK RETTEF: MOV AX,12345 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER KLARAR JAG RETF ;RET LRINTOK: MOV TIME_LEFT,TRUE OR AX,AX JZ NO_MUSIC_CRISIS3 MOV TIME_LEFT,FALSE NO_MUSIC_CRISIS3: CMP DEMOMODE,TRUE JE LATE_RASTER_INTERRUPT_DEMO ;*********************** SPELETS RUTINER **************************** CMP INSIDE_RASTINT,FALSE JNE RETTEF CMP CS:LAST_WAS_VB,TRUE JNE RETTEF CALL SETSCREENSTART CMP INSIDE_BALLHANDLER,FALSE JNE RETTEF MOV INSIDE_RASTINT,TRUE SAVEGFXREGS CALL KOLLAKULAN ;G”R TV† BER„KNINGAR CMP LATEGFX,TRUE JNE NOLGFX MOV PUTITBETWEEN,FALSE CALL PUTTHEBALL NOLGFX: CMP FORCELATEF3,TRUE JNE NOFF3 CALL DOFLIPPER3 NOFF3: MOV AL,F1F8_CODE ;TAR HAND OM F1F8_CODE I GAMEMODE OR AL,AL JZ NOF1F8_TODAY MOV F1F8_CODE,0 SUB AL,3BH-1 ;3BH=CODE FOR F1 MOV PLAYERS,AL ADD AL,'0'+7 MOV NO_OF_PLAYERS_TEXT[8],AL MOV BX,OFFSET no_of_playersTS CALL DO_MATRIX SOUNDEFFECT S_ADDPLAYER2,0 mov addplayers,false addtask allow_addpl NOF1F8_TODAY: RESTOREGFXREGS MOV CS:LAST_WAS_VB,FALSE MOV INSIDE_RASTINT,FALSE MOV AX,12345 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER KLARAR JAG RETF DOLON PROC NEAR REALON BL RETN DOLON ENDP DOLOFF PROC NEAR REALOFF BL RETN DOLOFF ENDP DOSUICIDE PROC NEAR MOV BX,SAVESOURCE MOV DS:[BX],OFFSET DUMRET DEC NO_OF_ACTIVE_TASKS RETN DOSUICIDE ENDP DOWAITSYNCS PROC NEAR CMP DS:[BX],DX JE THISISIT INC WORD PTR DS:[BX] CLC RETN THISISIT: MOV WORD PTR DS:[BX],0 STC RETN DOWAITSYNCS ENDP DOLIGHTON PROC NEAR NIL BH MOV LIGHTSTATUS[BX],TRUE LON BL RETN DOLIGHTON ENDP DOLIGHTOFF PROC NEAR NIL BH MOV LIGHTSTATUS[BX],FALSE LOFF BL RETN DOLIGHTOFF ENDP DOLIGHTFLASH PROC NEAR MOV BX,OFFSET REALFLASHLIST NEXTFLASHPOST: CMP [BX].LNUM,0 JE FOUNDFLASHPOST ADD BX,SIZE FLASHSTRUC CMP BX,MAX_NO_OF_LIGHTS_FLASHING*SIZE FLASHSTRUC+OFFSET REALFLASHLIST JNE NEXTFLASHPOST JMP CP_MEN_OKEJ FOUNDFLASHPOST: MOV [BX].LNUM,DL MOV [BX].FLASHCOUNTER,AL MOV [BX].TURNOFF,DH SHL DH,1 MOV [BX].RESETFC,DH CP_MEN_OKEJ: RETN DOLIGHTFLASH ENDP DOENDFLASH PROC NEAR MOV BX,OFFSET REALFLASHLIST NEXTFLASHPOST2: CMP [BX].LNUM,DL JNE WASNTTHISONE MOV [BX].LNUM,0 JMP DONTBOTHER WASNTTHISONE: ADD BX,SIZE FLASHSTRUC CMP BX,MAX_NO_OF_LIGHTS_FLASHING*SIZE FLASHSTRUC+OFFSET REALFLASHLIST JNE NEXTFLASHPOST2 DONTBOTHER: RETN DOENDFLASH ENDP RESETFLASHLIST PROC NEAR MOV CX,MAX_NO_OF_LIGHTS_FLASHING*SIZE FLASHSTRUC MOV DI,OFFSET REALFLASHLIST MOVA ES,DS NIL AL REP STOSB RETN RESETFLASHLIST ENDP FLASHTHELIGHTS PROC NEAR ;OBS! ˇNDRAR ENDAST PALETTEN, EJ STATUS!!! MOV BX,OFFSET REALFLASHLIST NEXTFLASHER: CMP [BX].LNUM,0 JZ NOTTHISONE CMP [BX].FLASHCOUNTER,0 JNZ NOTZEROISIT GOTOZERO: PUSH BX LON [BX].LNUM POP BX JMP LETSINCIT NOTZEROISIT: MOV AL,[BX].TURNOFF CMP [BX].FLASHCOUNTER,AL JNE NOTOFFISIT PUSH BX LOFF [BX].LNUM POP BX JMP LETSINCIT NOTOFFISIT: MOV AL,[BX].RESETFC CMP [BX].FLASHCOUNTER,AL JNE NOTRESETISIT MOV [BX].FLASHCOUNTER,0 JMP GOTOZERO NOTRESETISIT: LETSINCIT: INC [BX].FLASHCOUNTER NOTTHISONE: ADD BX,SIZE FLASHSTRUC CMP BX,MAX_NO_OF_LIGHTS_FLASHING*SIZE FLASHSTRUC+OFFSET REALFLASHLIST JNE NEXTFLASHER RETN FLASHTHELIGHTS ENDP RECALC_LIGHTS PROC NEAR ;FN: DPAINT RGB VALUES -> MCGA RGB VALUES MOV SI,OFFSET LON1 MOV DI,OFFSET LON1 MOVE ES,DS NEXTPOST: LODSB ;START COL OR AL,AL JZ NOMOREPOSTS STOSB LODSB ;BLOCK LEN MOV DL,3 MUL DL MOV CX,AX STOSB NEXTCOLOR: LODSB ;RECALC 0-100 -> 0-63 MOV DL,162 ;(63/100*256=161.28) AX=AL*162*256 MUL DL MOV AL,AH STOSB LOOP NEXTCOLOR JMP NEXTPOST NOMOREPOSTS: RETN RECALC_LIGHTS ENDP SLACK_LIGHTS PROC NEAR ;FN: TURNS OUT ALL LIGHTS cmp uppstartad,true jne dumret MOV AX,1 SLAGAIN:PUSH AX MOV BX,AX MOV LIGHTSTATUS[BX],FALSE MOV BL,AL NIL BH DEC BX SHL BX,1 MOV SI,LONINDEX[BX] MOVE ES,DS CALL SLACK_THIS_LIGHT POP AX INC AX CMP AX,NOOFLIGHTS JBE SLAGAIN RETN SLACK_LIGHTS ENDP SLACK_THIS_LIGHT PROC NEAR ;FN: SLˇCKER RGBPOST. KOLLAR ATT DET GICK BRA! ;INPUT: SI PEKAR P¸ RGB-POSTEN ;OUTPUT: SI PEKAR P¸ NˇSTA RGB-POST PUSH AX BX CX DX BP MOV BL,INTERRUPTS_ON MOV INTERRUPTS_ON,FALSE MOV BP,SI TRY_IT_AGAIN2: MOV INT_WAS_HERE2,FALSE ;G™R POSTEN [SI] FAST SLACK! MOV DX,3C8H LODSB ;AL=START COL OUT DX,AL INC DX LODSB ;AL=RGB DATA LEN MOV CL,AL NIL CH REPUTA: LODSB SHR AL,1 OUT DX,AL LOOP REPUTA CMP INT_WAS_HERE2,FALSE JE ITS_REALLY_OK2 MOV SI,BP JMP TRY_IT_AGAIN2 ITS_REALLY_OK2: MOV INTERRUPTS_ON,BL POP BP DX CX BX AX RETN SLACK_THIS_LIGHT ENDP SLACK_THIS_LIGHT_i_pelle PROC NEAR ;FN: SLˇCKER RGBPOST. KOLLAR ATT DET GICK BRA! ;INPUT: SI PEKAR P¸ RGB-POSTEN ;OUTPUT: SI PEKAR P¸ NˇSTA RGB-POST PUSH AX BX CX DX BP ;G™R POSTEN [SI] FAST SLACK! LODSB ;AL=START COL mov ah,3 mul ah add ax,offset cs:palle mov di,ax LODSB ;AL=RGB DATA LEN MOV Cx,Ax xor ch,ch REPUTA7:LODSB SHR AL,1 mov cs:[di],al inc di LOOP REPUTA7 POP BP DX CX BX AX RETN SLACK_THIS_LIGHT_i_pelle ENDP SLACK_LIGHTS_i_pelle PROC NEAR ;FN: TURNS OUT ALL LIGHTS MOV AX,1 SLAGAIN2:PUSH AX MOV BX,AX MOV LIGHTSTATUS[BX],FALSE MOV BL,AL NIL BH DEC BX SHL BX,1 MOV SI,LONINDEX[BX] MOVE ES,DS CALL SLACK_THIS_LIGHT_i_pelle POP AX INC AX CMP AX,NOOFLIGHTS JBE SLAGAIN2 RETN SLACK_LIGHTS_i_pelle ENDP DOLIGHTS PROC NEAR CMP INSIDE_DOLIGHTS,TRUE JE DONT_BOTHER MOV INSIDE_DOLIGHTS,TRUE CMP CS:FADING,TRUE JE ITSFADING MOV SI,OFFSET RGBBUFFER DONEXTLIGHT: CMP SI,RGBBUFPTR JE DONOMORE CALL DO_THIS_LIGHT JMP DONEXTLIGHT ITSFADING: DONOMORE: MOV RGBBUFPTR,OFFSET RGBBUFFER MOV INSIDE_DOLIGHTS,FALSE DONT_BOTHER: RETN DOLIGHTS ENDP DO_THIS_LIGHT PROC NEAR ;FN: UTF™R RGBPOST. KOLLAR ATT DET GICK BRA! ;INPUT: SI PEKAR P¸ RGB-POSTEN ;OUTPUT: SI PEKAR P¸ NˇSTA RGB-POST PUSH AX BX CX DX BP MOV BL,INTERRUPTS_ON MOV INTERRUPTS_ON,FALSE MOV BP,SI TRY_IT_AGAIN: MOV INT_WAS_HERE,FALSE ;G™R POSTEN [SI]! MOV DX,3C8H LODSB ;AL=START COL OUT DX,AL INC DX LODSB ;AL=RGB DATA LEN MOV CL,AL NIL CH REP OUTSB CMP INT_WAS_HERE,FALSE JE ITS_REALLY_OK MOV SI,BP JMP TRY_IT_AGAIN ITS_REALLY_OK: MOV INTERRUPTS_ON,BL POP BP DX CX BX AX RETN DO_THIS_LIGHT ENDP DO_ELECTRONICS PROC NEAR ;EXEKVERAS VARJE UTRˇKNING, EJ VARJE SYNC PUSHA PUSH ES if demover INC MINUTE_5_COUNTER CMP MINUTE_5_COUNTER,5*60*60-2 Jne NOLIMIT mov fiveminutes,true ; MOV SPECIALMODE,FALSE ; MOV INH_EFF,FALSE MOV HOLDSTILL,TRUE PLAYJINGLE S_GAMEOVER2 MOV BX,OFFSET MINUTE5TS CALL DO_MATRIX ; EFFECT MINUTE5 ; MOV SPECIALMODE,TRUE NOLIMIT: endif CALL CHECK_AREAS CALL CHECK_TARGETS CALL CHECK_SHIFTKEYS CALL MATRIX_BLINKOR ; CALL DO_PHYSICS CALL KEYTASK ;KEYTASK CHANGED BY KEYINT MOV KEYTASK,OFFSET DUMRET CALL DO_TASKS CALL FLASHTHELIGHTS POP ES POPA RETN DO_ELECTRONICS ENDP DO_PHYSICS PROC NEAR CMP TILTCOUNTER,0 JZ NOTI DEC TILTCOUNTER NOTI: CALL CHECK_BUMPERS CALL CHECK_RAMPS CALL CHECK_LEVELS CMP BALL_DOWN,TRUE JNE DONT_LOOSE_BALL CMP LOOSING,TRUE JE DONT_LOOSE_BALL CALL LOOSE_BALL DONT_LOOSE_BALL: RET DO_PHYSICS ENDP CHECK_RAMPS PROC NEAR MOV SI,SC_X ADD SI,8 SHR SI,3 MOV AX,SC_Y ADD AX,8 MOV CX,40 MUL CX ADD SI,AX DEC SI MOV CX,3 FINDRAMP: PUSH SI CX call get_hi_ramp_byte CMP BALLHIGH,TRUE Je GotLo CALL GET_LO_RAMP_BYTE GOTLO: POP CX SI INC SI OR AL,AL JZ GETRAMP LOOP FINDRAMP JMP NORAMP GETRAMP: CMP BX,NO_OF_RAMPS JAE NORAMP SHL BX,2 cmp hi_res,true je hiramp MOVA GRAVX,ramptable[BX] MOVA GRAVY,ramptable[BX+2] NORAMP: RETN hiramp: MOVA GRAVX,ramptable_hi[BX] MOVA GRAVY,ramptable_hi[BX+2] retn get_hi_ramp_byte: push si PUSH SI MOV AX,SI XCHG AH,AL AND AH,11B SHR SI,2 MOV AL,4 MOV DX,3CEH OUT DX,AX MOV BX,GFXMASK21_OFFSET set_es 0a000h MOV AL,BYTE PTR ES:[SI+BX] POP SI SET_ES MASK2_2 OR AL,BYTE PTR ES:[SI] SET_ES 0A000H SHR SI,2 ADD SI,GFXMASK23_OFFSET MOV BL,ES:[SI] AND BX,15 pop si RETN GET_LO_RAMP_BYTE: push si SET_ES MASK1_1 MOV AL,ES:[SI] SET_ES MASK1_2 OR AL,ES:[SI] PUSH AX SET_ES 0A000H CMP SI,230*40 JAE GO_STD PUSH SI MOV AX,SI SHR AX,4 INC AX MOV CX,80 MUL CX SHR SI,2 ADD SI,AX ADD SI,SPLH*BPL MOV BL,ES:[SI] POP SI SHR SI,2 JMP DONE_WEIRD GO_STD: SHR SI,2 ADD SI,GFXMASK13_OFFSET MOV BL,ES:[SI-(9200/4)] DONE_WEIRD: POP AX AND BX,15 pop si RETN ENDP CHECK_BUMPERS PROC NEAR CMP BUMPERWASHIT,FALSE JE NOBUMPA MOV BUMPERWASHIT,FALSE MOV BX,HITPOINTER LEA SI,[BX+2] MOV DI,OFFSET SIFFRORNA PUSH BX CALL ADDSCOREBCD POP BX MOV SCORECHANGED,TRUE MOV BP,DS:[BX] SOUNDEFFECT DS:[BP],0 CALL BUMPER_WAS_HIT_PROC NOBUMPA: RETN ENDP DOADDTASK PROC NEAR ;INPUT:DX=OFFSET THETASK MOV BX,OFFSET TASKLIST HOWABOUTNEXTTASKTHEN: CMP DS:[BX],OFFSET DUMRET JE FOUNDFREETASK ADD BX,2 CMP BX,NOOFTASKS*2+OFFSET TASKLIST JNE HOWABOUTNEXTTASKTHEN ; DEBUGMESS 40,2,"MAX NO OF TASKS" JMP ERRQUIT FOUNDFREETASK: INC NO_OF_ACTIVE_TASKS MOV DS:[BX],DX IF DEBUG debugVAL 0,11,NO_OF_ACTIVE_TASKS,"No of active tasks=" ENDIF RETN DOADDTASK ENDP DO_TASKS PROC NEAR MOV CX,NOOFTASKS MOV BX,OFFSET TASKLIST DONXTTASK: PUSH CX PUSH BX MOV SAVESOURCE,BX CALL [BX] ;M¸STE VARA [BX]! POP BX POP CX ADD BX,2 LOOP DONXTTASK RETN DO_TASKS ENDP DOEFFECTBRACK PROC NEAR ;INPUT: SI=OFFSET EFFECT STRUCTURE ;OUTPUT: AL=1 IF TS DONE ELSE AL=0 LODSW ;OFFSET JINGLE STRUC OR AX,AX JZ NOJINGLE2 PUSH SI PLAYJINGLE AX POP SI JUMP_2_JUMP_2: UPDAT_INFOBAR pusha mov di,offset siffrorna ;hela scoren!! call addscorebcd MOV SCORECHANGED,TRUE popa add si,12 ;SCORE SIZE=12 pusha mov di,offset BONUSsiffrorna call addscorebcd popa add si,12 ;BONUS SIZE=12 LODSW ;OFFSET DOT STRUC OR AX,AX JZ NO_EFF_IT_IS_STAR_WARS MOV BX,AX CALL DO_MATRIX ;KALLA P¸ JOHAN! MOV AL,1 RETN NO_EFF_IT_IS_STAR_WARS: MOV AL,0 RETN NOJINGLE2: LODSB ;PRIORITY JMP JUMP_2_JUMP_2 DOEFFECTBRACK ENDP DOEFFECT PROC NEAR ;INPUT: SI=OFFSET EFFECT STRUCTURE ;OUTPUT: AL=1 IF TS DONE ELSE AL=0 LODSW ;OFFSET JINGLE STRUC OR AX,AX JZ NOJINGLE CMP AL,BYTE PTR S_LOSTBALL ;CP!? (ANNARS H™RS INTE LOSTBALL!) JE DOEFF CMP INH_EFF,TRUE JE NOEFF1 CMP SPECIALMODE,TRUE JE NOEFF1 DOEFF: PUSH SI PLAYJINGLE AX POP SI NOEFF1: JUMP_2_JUMP: PUSHF ;Gabriel! H„r „r hur man addar p† en score!! ;detta „r upp till dig att r”ja upp! ;(si pekar p† effektscoren!!) ;JAHAPP, MEN DET ˇR JU REDAN GJORT! UPDAT_INFOBAR pusha mov di,offset siffrorna ;hela scoren!! call addscorebcd MOV SCORECHANGED,TRUE popa add si,12 ;SCORE SIZE=12 pusha mov di,offset BONUSsiffrorna call addscorebcd popa add si,12 ;BONUS SIZE=12 POPF JC SORRY_MORE_IMPORTANT_STUFF_TO_DO LODSW ;OFFSET DOT STRUC OR AX,AX JZ NO_EFF_IT_IS CMP INH_EFF,TRUE JE NOEFF2 CMP SPECIALMODE,TRUE JE NOEFF2 MOV BX,AX CALL DO_MATRIX ;KALLA P¸ JOHAN! MOV AL,1 RETN NOEFF2: NO_EFF_IT_IS: SORRY_MORE_IMPORTANT_STUFF_TO_DO: MOV EOTS,TRUE MOV AL,0 RETN NOJINGLE: LODSB ;PRIORITY CMP AL,CURRENT_PRIORITY JMP JUMP_2_JUMP DOEFFECT ENDP DOPLAYJINGLE PROC NEAR ;INPUT: SI=OFFSET JINGLE STRUCTURE OR SI,SI JZ NOPLAYJINGLE LODSB ;JINGLE NO NIL AH MOV BX,AX LODSB ;REPEAT ??? ;CP? ;AL=REPEAT push ax xchg JINGLEJUMPCNT,AL mov bp,ax LODSB ;PRIORITY CMP AL,CURRENT_PRIORITY JB NOTNOW_ASHOLE ;SAME PRIORITY OVERRIDES! MOV CURRENT_PRIORITY,AL MOV AL,16 PUSH BX INT 66H ;AL=FORCE POSITION, BX=THE POSITION POP BX ;ret: AL=OLD POSITION pop dx ; utifall att jinglehandlern har gjort mov jinglejumpcnt,dl ; sitt under tiden..... MOV JINGLE_READY_ANIM,FALSE MOV JINGLE_READY_LOGIC,FALSE IF DEBUG DEBUGVAL 0,17,BX,"SENASTE BEORDRAD JINGLE: " ENDIF MOV BL,AL XOR BH,BH IF DEBUG DEBUGVAL 0,15,BX,"RETURNED JINGLE POSITION: " INC CS:JINGLEORDER DEBUGVAL 0,16,CS:JINGLEORDER,"JINGLE ORDER NO: " ENDIF mov bx,bp cmp bl,0 jg noplayjingle CMP AL,62 JE NOPLAYJINGLE MOV LASTJINGLE,AL NOPLAYJINGLE: CLC RETN NOTNOW_ASHOLE: pop ax ;trash STC RETN JINGLEORDER DW 0 DOPLAYJINGLE ENDP ;****************************************************************************** DOADVANCE PROC NEAR ;FN: LIGHT NEXT LIGHT IN LIST ;INPUT: SI=OFFSET TO THE LIST ; LIST STRUC: DB COUNTER,LNO1,LNO2,...,-1 ;OUTPUT: -C- IF END OF LIST REACHED PUSH SI LODSB ;GET LIST COUNTER NIL AH ADD SI,AX LODSB ;AL=LIGHT TO LIGHTED PUSH SI LIGHTON AL ;TURN ON CORRECT LIGHT POP SI LODSB ;AL=NEXT LIGHT, IF -1: END OF LIST CMP AL,-1 JE REACHED_END_OF_LIST POP SI INC BYTE PTR [SI] ;INC LIST COUNTER CLC RETN REACHED_END_OF_LIST: POP SI MOV BYTE PTR [SI],0 ;RESET LIST COUNTER STC RETN DOADVANCE ENDP CHECK_TARGETS PROC NEAR CMP TILTFLAG,TRUE JE QCT CMP EXAHITX,0 JNZ ITSAHIT CMP EXAHITY,0 JZ NOHIT ITSAHIT: MOV CX,EXAHITX MOV DX,EXAHITY ADD DX,SCREENPOSY ;CP!? DET SKA NOG VA S¸ HˇR MOV EXAHITX,0 MOV EXAHITY,0 MOV SI,OFFSET ZONLISTA_L CMP BALLHIGH,TRUE JE NOHIT JMP STARTITHERE3 NASTAAREA3: POP SI ADD SI,5*2 STARTITHERE3: PUSH SI LODSW OR AX,AX JZ NOMOREAREAS3 CMP CX,AX JB NASTAAREA3 LODSW CMP DX,AX JB NASTAAREA3 LODSW CMP CX,AX JA NASTAAREA3 LODSW CMP DX,AX JA NASTAAREA3 LODSW CALL AX NOMOREAREAS3: POP SI NOHit: QCT: RETN CHECK_TARGETS ENDP CHECK_LEVELS PROC NEAR MOV CX,SC_X ADD CX,BALLH/2 MOV DX,SC_Y ADD DX,BALLH/2 ADD DX,SCREENPOSY ;CP!? DET SKA NOG VA S¸ HˇR MOV SI,OFFSET LEVEL1LISTA CMP BALLHIGH,TRUE JE BALLHGH2 MOV SI,OFFSET LEVEL2LISTA BALLHGH2: JMP STARTITHERE2 NASTAAREA2: POP SI ADD SI,4*2 STARTITHERE2: PUSH SI LODSW CMP AX,-1 JE NOMOREAREAS2 CMP CX,AX JB NASTAAREA2 LODSW CMP DX,AX JB NASTAAREA2 LODSW CMP CX,AX JA NASTAAREA2 LODSW CMP DX,AX JA NASTAAREA2 NOT BALLHIGH NOMOREAREAS2: POP SI RETN CHECK_LEVELS ENDP CHECK_AREAS PROC NEAR MOV CX,SC_X ADD CX,BALLH/2 MOV DX,SC_Y ADD DX,BALLH/2 ADD DX,SCREENPOSY ;CP!? DET SKA NOG VA S¸ HˇR MOV SI,OFFSET AREALISTA_U CMP BALLHIGH,TRUE JE BALLHGH MOV SI,OFFSET AREALISTA_L BALLHGH: CMP TILTFLAG,TRUE JNE NOT_TILT_AREOR MOV SI,OFFSET AREALISTA_U_T CMP BALLHIGH,TRUE JE BALLHGH3 MOV SI,OFFSET AREALISTA_L_T BALLHGH3: NOT_TILT_AREOR: JMP STARTITHERE NASTAAREA: POP SI ADD SI,5*2 STARTITHERE: PUSH SI LODSW OR AX,AX JZ NOMOREAREAS CMP CX,AX JB NASTAAREA LODSW CMP DX,AX JB NASTAAREA LODSW CMP CX,AX JA NASTAAREA LODSW CMP DX,AX JA NASTAAREA LODSW CMP LASTCHECK,AX JE CALLREADY MOV LASTCHECK,AX CALL AX MOVE LASTAREA,LASTCHECK JMP CALLREADY NOMOREAREAS: MOV LASTCHECK,0 CALLREADY: POP SI RETN CHECK_AREAS ENDP SPRINGIT: ;THIS not IS A TASK anymore, not TRIGGED BY KEYINT CMP DNPRESSED,FALSE JE NO_WAY CMP SPRINGPOS,(SPRINGH-1)*2 JAE NO_WAY INC SPRINGPOS CALL PUTSPRING NO_WAY: RETN SPRINGSTEEN: ;BRUCE! CMP MOUSEINSTALLED,TRUE JNE NOT_OKIDOK MOV AX,03H INT 33H CMP DL,MOUSEMIDDLE JB MOVED_UP JNA DIDNT_MOVE CMP SPRINGPOS,(SPRINGH-1)*2 JAE _4GETIT INC SPRINGPOS JMP SPRINGPOS_CALCED MOVED_UP: CMP SPRINGPOS,0 JZ _4GETIT DEC SPRINGPOS SPRINGPOS_CALCED: PUSH BX CALL PUTSPRING MOV CX,0 MOV DX,MOUSEMIDDLE MOV AX,04H INT 33H ;SET MOUSE YPOS TO MOUSEMIDDLE POP BX DIDNT_MOVE: _4GETIT: TEST BL,1 JZ NOSPRINGUP MOV SPRINGTASK,OFFSET SPRINGUP NOSPRINGUP: NOT_OKIDOK: CALL SPRINGIT RETN springup: mov Cl,springpos xor Ch,Ch JCXZ NOUP CMP SPRING_VALID,FALSE JE DOUP2 cmp hi_res,true je nilsbedrupp mov ax,(-5000/15)/2*TT/NN jmp kukenkarl nilsbedrupp: mov ax,(-5000/15)/2 kukenkarl: imul Cx mov bp,ax mov ax,slump_countern and ax,255 sub bp,ax CMP MAKE_BAD,TRUE JE BADDAREN SETBALLSPEED 0,bp ;cp! BADDAREN: mova rotation,slump_countern and rotation,15 ;cp!? DOUP2: MOV AL,SPRINGPOS XOR AH,AH SHL AX,6 MOV BL,(SPRINGH-1)*2 DIV BL ;AL=CALCULATED SPRING SOUND VOLUME soundeffect sfjader,AL mov springpos,0 call putspring CMP MOUSEINSTALLED,TRUE JNE NO_M_INST MOV AX,04H NIL CX MOV DX,MOUSEMIDDLE INT 33H ;SET MOUSE YPOS TILL MOUSEMIDDLE NO_M_INST: NOUP: MOV SPRINGTASK,OFFSET SPRINGSTEEN ;INTE PRINCE retn INIT_MOUSE: MOVE ES,0 CMP WORD PTR ES:[33H*4],0 JNE OKIDOK CMP WORD PTR ES:[33H*4+2],0 JE NOT_OKIDOKI OKIDOK: MOV MOUSEINSTALLED,TRUE JMP OVERHOPP NOT_OKIDOKI: MOV MOUSEINSTALLED,FALSE OVERHOPP: MOVE ES,0A000H MOV AX,0 INT 33H ;RESET MOUSEDRIVER/CHECK IF MOUSE INSTALLED CMP AX,0 JE NOMOUSEINSTALLED MOV AX,08H MOV CX,0 ;MIN MOUSE POS MOV DX,MOUSETOTAL ;MAX MOUSE POS INT 33H MOV AX,0FH MOV CX,8 MOV DX,16*4 INT 33H ;SET MICKEY TO PIXEL RATIO RETN NOMOUSEINSTALLED: MOV MOUSEINSTALLED,FALSE RETN GATE_STRUC STRUC G_POS DW ? G_NEG DW ? G_WHERE DW ? G_WIDTH DW ? G_HEIGHT DW ? ENDS MOVE_MASK_DATA PROC NEAR ;FN: OPENS OR CLOSES GATES ;INPUT: DS:SI=SOURCE, ES:DI=DEST ; DX=WIDTH, CX=HEIGHT NEXTLINE: PUSH CX MOV CX,DX PUSH DI REP MOVSB POP DI ADD DI,40 POP CX LOOP NEXTLINE RETN MOVE_MASK_DATA ENDP MOVE_MASK_DATA_b PROC NEAR ;FN: OPENS OR CLOSES GATES ;INPUT: DS:SI=SOURCE, ES:DI=DEST ; DX=WIDTH, CX=HEIGHT NEXTLINE3: PUSH CX MOV CX,DX PUSH DI REP MOVSB add si,dx add si,dx POP DI ADD DI,40 POP CX LOOP NEXTLINE3 RETN MOVE_MASK_DATA_b ENDP DO_PUT_GATE_POS_HIGH: ;INPUT BX=OFFS GATE MOV SI,[BX].G_POS MOV DI,[BX].G_WHERE MOVE ES,MASK2_2 MOV DX,[BX].G_WIDTH MOV CX,[BX].G_HEIGHT ADD SI,DX CALL MOVE_MASK_DATA_B RETN DO_PUT_GATE_NEG_HIGH: ;INPUT BX=OFFS GATE MOV SI,[BX].G_NEG MOV DI,[BX].G_WHERE MOVE ES,MASK2_2 MOV DX,[BX].G_WIDTH MOV CX,[BX].G_HEIGHT ADD SI,DX CALL MOVE_MASK_DATA_B RETN DO_PUT_GATE_POS_LOW: ;INPUT BX=OFFS GATE MOV SI,[BX].G_POS MOV DI,[BX].G_WHERE MOVE ES,MASK1_2 MOV DX,[BX].G_WIDTH MOV CX,[BX].G_HEIGHT ADD SI,DX CALL MOVE_MASK_DATA_B RETN DO_PUT_GATE_NEG_LOW: ;INPUT BX=OFFS GATE MOV SI,[BX].G_NEG MOV DI,[BX].G_WHERE MOVE ES,MASK1_2 MOV DX,[BX].G_WIDTH MOV CX,[BX].G_HEIGHT ADD SI,DX CALL MOVE_MASK_DATA_B RETN INIT_INTS PROC NEAR MOV AX,11 ;INIT VBLANK INT MOV BL,100 MOV DX,OFFSET VBLANK_INT MOVE ES,CS INT 66H MOV CX,LATE_INTERRUPT_RASTER_LO*2 CMP HI_RES,TRUE JNE NOTHIRES1 MOV CX,LATE_INTERRUPT_RASTER_HI*2 NOTHIRES1: MOV DX,OFFSET LATE_RASTER_INTERRUPT MOV BL,200 MOVE ES,CS MOV AX,12 ;INIT RASTER INT INT 66H RETN INIT_INTS ENDP GO_GAME_MODE PROC NEAR ;TURNS OFF THE DEMO MODE AND STARTS THE GAME MOV DEMOMODE,FALSE RETN GO_GAME_MODE ENDP GO_DEMO_MODE PROC NEAR ;TURNS ON THE DEMO MODE MOV CS:ALREADY_QUITTING,FALSE MOV CS:KEYBOARD_ENABLED,TRUE MOV DEMOMODE,TRUE RETN GO_DEMO_MODE ENDP VBLANK_INT_DEMO: MOVE DS,DATA SAVEGFXREGS CALL FLASH CALL MATRIX_BLINKOR IF MARGIT SETMARG 14 ENDIF cmp time_left,false je skip_matrixD ;no time left! Skip it!! ; mov time_left,false ;ok, time was left last time! MOV AL,CS:INSIDE_MATRIX MOV CS:INSIDE_MATRIX,TRUE CMP AL,TRUE JE SKIP_MATRIXD CALL DO_THE_DOTMATRIX ;updatera d† matrixen! MOV CS:INSIDE_MATRIX,FALSE skip_matrixD: CALL DOLIGHTS IF MARGIT RESTOREMARG ENDIF IF MARGIT SETMARG 0 ENDIF RESTOREGFXREGS MOV AX,12345 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER KLARAR JAG RETF LATE_RASTER_INTERRUPT_DEMO: MOVE DS,DATA CMP INTERRUPTS_ON,TRUE JE LRINTOKD MOV AX,0 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER F¸R HAN KLARA RETF ;RET LRINTOKD: SAVEGFXREGS MOV AX,BANH-(SH_LO-SPLH) CMP HI_RES,TRUE JNE NOTHIRES7 MOV AX,BANH-(SH_HI-SPLH) NOTHIRES7: CMP SCREENFORCE,AX JL NOT_BOTTOM MOV CARMEN,-1 NOT_BOTTOM: CMP SCREENFORCE,0 JG NOT_TOP MOV CARMEN,1 NOT_TOP: MOV AX,CARMEN ADD SCREENFORCE,AX CALL SETSCREENSTART CMP F1F8_CODE,0 ;TAR HAND OM F1F8_CODE I DEMOMODE JZ NOF1F8 MOV AL,F1F8_CODE MOV F1F8_CODE,0 SUB AL,3BH-1 ;3BH=CODE FOR F1 MOV PLAYERS,AL ADD AL,'0'+7 MOV NO_OF_PLAYERS_TEXT[8],AL MOV BX,OFFSET first_no_of_playersTS CALL DO_MATRIX SOUNDEFFECT S_ADDPLAYER2,0 MOV SCREENFORCE,-1 CALL GO_GAME_MODE ;TO GAME FROM DEMO CALL WHEN_NEW_GAME_RESET CALL WHEN_NEW_GAME_RESET_TABLE CALL GAME_MUSIC CALL NEW_BALL MOV ADDPLAYERS,FALSE ADDTASK ALLOW_ADDPL ;TILL†T INGA NYA ADDS F”RNS OM 30 SYNCAR NOF1F8: RESTOREGFXREGS MOV AX,12345 ;MEDDELA TILL MUSIKRUTINEN ATT KRISER KLARAR JAG RETF ALLOW_ADDPL: WAITSYNCS 15 MOV ADDPLAYERS,TRUE SUICIDE SNART_NEW_BALL: WAITSYNCS 30 CALL NEW_BALL_PART_TWO SUICIDE ;****************************************************************************** ;*************************** Updatera alla spelares pstruc!!!! *********** UPDATE_P_STRUC_4_ALL_PLAYERS: MOV BX,0 MOV CX,8 THE_PLAYERS: PUSH BX CX MOV AX,SIZE PLAYER_STRUC MUL BX MOV BX,AX ;BX=INDEX TO CORRECT PLAYER DATA IN PLAYER_AREA CALL VARS_2_P_STRUC_2 POP CX BX INC BX LOOP THE_PLAYERS RETN FLASH PROC NEAR MOVE DS,DATA MOV SI,OFFSET FLASHLIST MOVE ES,DS FLASHAGAIN: CMP WORD PTR DS:[SI],-1 JZ NOMOREFLASHING PUSH SI CALL DOTHISFLASH POP SI ADD SI,10 JMP FLASHAGAIN NOMOREFLASHING: RETN FLASH ENDP DOTHISFLASH PROC NEAR ;INPUT:SI MOV DI,SI LODSW INC AX STOSW MOV BP,AX LODSW MOV DI,AX LODSW CMP BP,AX JE TURNITOFF LODSW CMP BP,AX JE TURNITON TURNBACK: RETN TURNITOFF: LODSW LODSW LOFF AL JMP TURNBACK TURNITON: LODSW PUSH SI PUSH DI PUSH ES LON AL POP ES POP AX POP DI SUB DI,10 STOSW JMP TURNBACK DOTHISFLASH ENDP RECALCFLASHLIST PROC NEAR MOVE ES,DS MOV SI,OFFSET FLASHLIST NEXTPOSTEN: CMP WORD PTR DS:[SI],-1 JE NOMOREFPOSTS PUSH SI MOV DI,SI MOVSW ;CNT LODSW STOSW ;1ST MOV BX,AX LODSW ADD AX,BX MOV BX,AX STOSW ;OFF LODSW ADD AX,BX STOSW ;ON POP SI ADD SI,10 JMP NEXTPOSTEN NOMOREFPOSTS: RETN RECALCFLASHLIST ENDP INIT_SOUND PROC NEAR OPENFILE SOUNDCFG JC NOSOUNDCFG if musikkaos else READFILE BX,13,DRV ;get name of selected sound driver endif CLOSEFILE BX MOV AX,DS MOV ES,AX MOV AX,4B00H ;fn 4b = load and execute exe file MOV BX,OFFSET PARMS MOV DX,OFFSET DRV INT 21H ;LOAD DRIVER MOV AL,19 MOV DX,OFFSET JINGLE_HANDLER MOVE ES,CS INT 66H MOV AX,18 ;fn 18 MOV DX,OFFSET MODUL INT 66H ;LOAD MODULE IF_ERROR 1,outofmemory IF_ERROR 3,cantfindmod IF_ERROR 4,errorloadingmod SLACKDRIVELED CLC RETN NOSOUNDCFG: MOV AX,3 INT 10H PRINTMESS "Can't find sound configurations file." STC RETN ENDP INIT_HIGHS PROC NEAR ;READ HIGH-SCORES OPENFILE HI_SCORE_FILE JC NOFILE READFILE BX,16*4,HI_SCORE_LIST CLOSEFILE BX NOFILE: RETN INIT_HIGHS ENDP SAVE_HIGHS PROC NEAR ;WRITE HIGH-SCORES CREATEFILE HI_SCORE_FILE JC NOFILE2 WRITEFILE BX,16*4,HI_SCORE_LIST CLOSEFILE BX NOFILE2:RETN SAVE_HIGHS ENDP INIT_MATRIX PROC NEAR PUSHA MOV DOTRUT,OFFSET NODOT MOV SISA,0 MOV BX,OFFSET CLEARTS CALL DO_MATRIX ;RENSA UPP LITE!! UPDAT_SCORE POPA RETN INIT_MATRIX ENDP set_360x350: mov ax,13h int 10h ; Video display ah=functn 00h ; set display mode in al mov dx,3C4h mov al,4 out dx,al ; port 3C4h, EGA sequencr index ; al = 4, memory mode select mov dx,3C5h mov al,6 out dx,al ; port 3C5h, EGA sequencr func mov dx,3C4h mov al,2 out dx,al ; port 3C4h, EGA sequencr index ; al = 2, map mask register mov dx,3C5h mov al,0Fh out dx,al ; port 3C5h, EGA sequencr func mov ax,0A000h mov es,ax mov cx,0ffffh mov al,0 mov di,0 cld rep stosb mov dx,3C2h mov al,0A7H ;0E7h out dx,al ; port 3C2h, EGA misl out reg mov dx,3D4h mov al,11h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 11h, light pen low mov dx,3D5h in al,dx ; port 3D5h, CGA/EGA indxd data and al,7 push ax mov dx,3D4h mov al,11h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 11h, light pen low pop ax mov dx,3D5h out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,0 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 0, horiz char total mov dx,3D5h mov al,6Bh ; 'k' out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,1 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 1, horiz char display mov dx,3D5h mov al,59h ; 'Y' out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,2 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 2, horz sync position mov dx,3D5h mov al,5Ah ; 'Z' out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,3 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 3, horiz sync width mov dx,3D5h mov al,8Eh out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,4 out dx,al ; port 3D4h, CGA/EGA reg index mov dx,3D5h mov al,5Eh-CENTSCREEN ; '^' out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,5 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 5, vert total adjust mov dx,3D5h mov al,8Ah-CENTSCREEN out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,6 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 6, vert char displayd mov dx,3D5h mov al,0BFH ;0Dh ;VERTICAL TOTAL out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,7 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 7, vert sync position mov dx,3D5h mov al,1FH ;3Eh ; '>' out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,9 out dx,al ; port 3D4h, CGA/EGA reg index ; al = 9, max raster address mov dx,3D5h mov al,40h ; '@' out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,10h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 10h, light pen high mov dx,3D5h mov al,83H ;0EAh out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,12h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 12h, vert end scan line mov dx,3D5h mov al,05DH ;0DFh out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,13h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 13h, offset line width mov dx,3D5h mov al,BPL/2 ;2Dh ; '-' out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,14h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 14h, underline scan lin mov dx,3D5h mov al,0FH ;0 out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,15h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 15h, vert start blankng mov dx,3D5h mov al,063H ;E7h out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,16h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 16h, vert end blanking mov dx,3D5h mov al,0BAH ;6 out dx,al ; port 3D5h, CGA/EGA indxd data mov dx,3D4h mov al,17h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 17h, mode control mov dx,3D5h mov al,0E3h out dx,al ; port 3D5h, CGA/EGA indxd data MOV DX,3D4H ;SET HORIZ END MOV AL,01H MOV AH,80-1 ;(DET MAN VILL HA GENOM 4) OUT DX,AX mov dx,3D4h mov al,11h out dx,al ; port 3D4h, CGA/EGA reg index ; al = 11h, light pen low mov dx,3D5h mov al,0A5H ;0ACh out dx,al ; port 3D5h, CGA/EGA indxd data retn INIT_GFX PROC NEAR CALL SET_MCGAB CALL SET240 IF HZ50 call set50hz ENDIF MOVE DS,DATA CMP HI_RES,TRUE JNE NOTHIRES13 CALL SET_360X350 NOTHIRES13: CALL SETSCREENSTART IF RES600 ELSE CALL SETSPLIT ENDIF mov bx,0 call setpal ;sl„ck sk„rmen SLˇCK SET_ES 0A000H MOV AX,STAGE1_1 MOV ES,AX MOV AX,0 ;xpos MOV BX,0+SPLH ;ypos MOV CX,SW MOV BP,10b ;bp=0: s„tt inte paletten MOV DX,0 ;es:dx=adress till bild CALL UNPKLBM MOV AX,STAGE1_2 MOV ES,AX MOV AX,0 ;xpos MOV BX,144+SPLH ;ypos MOV CX,SW MOV BP,10b ;bp=0: s„tt inte paletten MOV DX,0 ;es:dx=adress till bild CALL UNPKLBM MOV AX,STAGE1_3 MOV ES,AX MOV AX,0 ;xpos MOV BX,288+SPLH ;ypos MOV CX,SW MOV BP,10b ;bp=0: s„tt inte paletten MOV DX,0 ;es:dx=adress till bild CALL UNPKLBM MOV AX,STAGE1_4 MOV ES,AX MOV AX,0 ;xpos MOV BX,432+SPLH ;ypos MOV CX,SW IFDEF HALFBRIGHT MOV BP,110b ;bp=111: s„tt paletten, HALFBRIGHT ELSE MOV BP,10b ;bp=11: s„tt paletten, NO HALFBRIGHT ENDIF MOV DX,0 ;es:dx=adress till bild CALL UNPKLBM mov si,dx mova ds,stage1_4 mov di,offset CS:PALLE ;tempor„r lagringsplats mova es,CS mov cx,768 rep movsb mova ds,data COMMENT\ MOV AX,1000H MOV BL,10H MOV BH,1 INT 10H \ RETN INIT_SPRING: CALL PUTSPRINGINGFX mov dx,3c4h mov ax,0f02h out dx,ax set_es 0a000h mov al,00 mov di,(splh+banh)*bpl mov cx,bpl*4 rep stosb call putspring RETN INIT_GFX ENDP PUTSPRINGINGFX PROC NEAR PUSH DS MOVA DS,SPRINGSEG MOVA ES,0A000H MOV SI,0 MOV DI,SPRINGSOURCEADR MOV DX,3C4H MOV AL,2 MOV CX,23 SROW: PUSH CX MOV AH,10001B MOV CX,10 SPR: PUSH CX OUT DX,AX MOVSB ROL AH,1 JC NEWBYTE DEC DI NEWBYTE:POP CX LOOP SPR INC DI POP CX LOOP SROW POP DS RETN ENDP putspring proc near mov al,springpos shr al,1 sub al,3 mov realpos,al mov si,springsourceadr jge goforit mov realpos,0 mov bl,-3 imul bl add si,ax goforit: push ds mov ax,0a000h mov es,ax mov al,realpos mov bl,bpl mul bl add ax,springdestadr mov di,ax mov dx,3c4h mov ax,0f02h out dx,ax cmp realpos,0 jz noclear sub di,bpl XOR AX,AX mov es:[di],ax mov ax,0302h out dx,ax XOR AL,AL mov es:[di+2],al mov ax,0f02h out dx,ax add di,bpl noclear: MOV DX,3CEH mov Ax,4105h out dx,ax mov cx,springh sub cl,realpos mov ax,es mov ds,ax push cx di SI ritaspring: movsb movsb INC SI add di,bpl-2 loop ritaspring pop SI di cx mov dx,3c4h mov ax,302h out dx,ax add di,2 ritaspring2: ADD SI,2 movsb add di,bpl-1 loop ritaspring2 mov dx,3ceh mov ax,4005h out dx,ax pop ds retn putspring endp Set50Hz proc near mov dx,3d4h mov ax,0011h out dx,ax ;unprotect 0-7 in crtc! mov ax,07006h out dx,ax mov ax,0ba07h ;3e out dx,ax mov ax,02510h ;ea out dx,ax mov ax,0011h ;let be! out dx,ax mov ax,0ff12h ; out dx,ax mov ax,0ff15h ;b7 out dx,ax mov ax,01116h ;28 out dx,ax mov dx,3c4h mov ax,0100h ; synchronous reset out dx,ax ; mov dx,3c2h ; mov al,0e3h ; use 25 mHz dot clock, 480 lines res. out dx,al ; mov dx,3c4h ; mov ax,0300h ; restart sequencer out dx,ax ; running again retn endp setsplit PROC NEAR vga: ;bit 0-8 MOV DX,3D4H MOV AL,11H OUT DX,AL INC DX IN AL,DX AND AL,127 OUT DX,AL ;OSKRIVSKYDDA ;bit 0-8 mov dx,3d4h mov al,18h MOV SPLITLINE,(SH_LO-33)*2 CMP HI_RES,TRUE JNE NOTHIRES12 MOV SPLITLINE,SH_HI-SPLH NOTHIRES12: mov ah,BYTE PTR SPLITLINE DEC AH out dx,ax ;bit 9 mov al,BYTE PTR SPLITLINE+1 and al,1 shL al,4 mov ah,al mov al,07 out dx,al inc dx in al,dx dec dx and al,11101111b or al,ah mov ah,al mov al,7 out dx,ax ;bit 10 mov dx,3d4h mov al,09 out dx,al inc dx in al,dx dec dx and al,10111111b mov ah,al mov al,09 out dx,ax ;All 10 bits set ret SETSPLIT ENDP BIOSDATA DB 64 DUP(0) SET_MCGAB PROC NEAR SET_ES CS MOV AX,13H IF HIRES FINDMODE: PUSH AX INT 10H MOV AH,1BH MOV BX,0 MOV DI,OFFSET CS:BIOSDATA INT 10H POP AX CMP WORD PTR BIOSDATA[27H],256 JNE NOTTHISMODE IF RES600 CMP BYTE PTR BIOSDATA[2AH],5 ;600 LINJER ELSE CMP BYTE PTR BIOSDATA[2AH],3 ;480 LINJER ENDIF JE MODEFOUND NOTTHISMODE: INC AX JMP FINDMODE MODEFOUND: ELSE INT 10H ENDIF MOV BX,SW ;CALC BX (SET LINE LENGTH) SHR BX,3 MOV CX,320 ;CALC CX (HORIZ END) SHR CX,2 DEC CX MOV DX,3D4H ;UNLOCK MOV AL,11H MOV AH,0 OUT DX,AX MOV DX,3D4H ;SET HORIZ END MOV AL,01H MOV AH,CL ;(DET MAN VILL HA GENOM 4) OUT DX,AX MOV DX,3D4H ;SET LINE LENGTH (I MINNESUPPBYGGNADEN) MOV AL,13H MOV AH,BL OUT DX,AX MOV DX,3C4H ;SET MCGAB (NO CHAIN FOUR, USE 256KB) MOV AL,04H OUT DX,AL INC DX IN AL,DX AND AL,11110110B OUT DX,AL if hires IF RES600 else JMP NO_1417 ENDIF ENDIF MOV DX,3D4H ;COUNT BY FOUR AND NO DOUBLE WORD MODE MOV AL,14H OUT DX,AL INC DX IN AL,DX AND AL,10111111B ;10011111B SVARAR MOT KOMMENTAREN OUT DX,AL MOV DX,3D4H ;MODE CONTROL (STANDARD ADRESSING MODE) MOV AL,17H MOV AH,11100011B OUT DX,AX NO_1417: if hires ELSE MOV DX,3CCH IN AL,DX MOV DX,3C2H OR AL,11000000B OUT DX,AL ;s„tt 240-linjers sk„rmh”jd endif RETN SET_MCGAB ENDP SET240 PROC NEAR mov dx,03d4h mov al,11h out dx,al inc dx in al,dx and al,7fh out dx,al dec dx cld IF RES600 mov si,offset xparabl mov cx,1 ELSE MOV SI,OFFSET XPARABL2 MOV CX,10 ENDIF xvploop: mov ax,cs:[si] add si,02h out dx,ax jmp $+2 loop xvploop IF HIRES MOV DX,3D4H MOV AL,9 OUT DX,AL INC DX IN AL,DX AND AL,01111111B OUT DX,AL ENDIF RETN xparabl db 14h,00h xparabl2 db 06h,0Dh ,07h,03eh ,09h,40H+80H,10h,0EAh ,11h,0ch ,12h,0dfh ,14h,00h db 15h,0eah,016h,06h,17h,0e3h SET240 ENDP READFLIPPIX PROC NEAR ;AX=X ;BX=Y ;CX=FLIP NO ;ES=SEGPTR TO FLIPS PUSH AX MOV AX,FLIPSTORLEK MUL CX MOV SI,AX ;SI=ADR TO FLIPPER AREA MOV AX,FLIPLINESIZE ADD AX,AX ADD AX,FLIPLINESIZE MUL BX ADD SI,AX ;SI=ADR TO CORRECT LINE POP AX MOV CL,AL SHR AX,3 ADD SI,AX ;SI=ADR TO BYTE CONTAINING FLIPPER PIXEL AND CX,111B MOV DL,128 JCXZ NOROR SHR DL,CL ;DL=BITMASK IN BYTE NOROR: XOR AL,AL TEST BYTE PTR ES:[SI],DL JZ NOTB0 OR AL,1 NOTB0: PUSH SI ADD SI,FLIPLINESIZE TEST BYTE PTR ES:[SI],DL POP SI JZ NOTB1 OR AL,10B NOTB1: PUSH SI ADD SI,FLIPLINESIZE ADD SI,FLIPLINESIZE TEST BYTE PTR ES:[SI],DL POP SI JZ NOTB2 OR AL,100B NOTB2: RETN ENDP PUTFLIPPIX PROC NEAR ;DI=SKˇRM OFFSET ;AX,BX=X,Y ;DL=COLOR PUSH ES MOV CX,AX MOV AL,BPL MUL BL ADD DI,AX MOV AX,CX SHR AX,2 ADD DI,AX AND CX,11B MOV AH,1 JZ NOSHL SHL AH,CL NOSHL: MOV AL,2 MOV CL,DL MOV DX,3C4H OUT DX,AX SET_ES 0A000H MOV ES:[DI],CL POP ES RETN ENDP COPYFLIPBGR PROC NEAR ;SI=ADR TO S¸S ;DI=ADR TO DEST PUSH ES DS SET_ES 0A000H SET_DS ES MOV DX,3C4H MOV AX,0F02H OUT DX,AX MOV DX,3CEH MOV AX,4105H OUT DX,AX MOV CX,53 COPPYA: PUSH CX MOV CX,20 REP MOVSB POP CX ADD DI,BPL-20 ADD SI,BPL-20 LOOP COPPYA MOV AX,4005H OUT DX,AX POP DS ES RETN ENDP CMPFLIPBOX PROC NEAR ;DI=ADR TO NEW FLIPPER BOX ;BP=OFFSET FROM NEW TO OLD ;DS:SI=ADR TO ADR-AREA MOV CS:DIFCNT,0 MOV CS:ORGDI,DI PUSH DS SI SET_DS DATAFLIP SET_ES 0A000H MOV DX,3C4H MOV AX,0F02H OUT DX,AX MOV DX,3CEH MOV AX,4105H OUT DX,AX MOV AX,4 MOV CX,53 CMPR: PUSH CX MOV CX,16 CHECK4: OUT DX,AX MOV BL,ES:[DI+BP] CMP BL,ES:[DI] JE LIKA SUB DI,CS:ORGDI MOV DS:[SI+2*9],DI ;2*9 ˇR F™R DE WORD SOM TALAR OM ADD DI,CS:ORGDI ;HUR MYCKET SOM BEH™VS F™R ETT S¸ STORT HOPP INC CS:DIFCNT PUSH DI CALL LOOK4BLOCK JC COULDNTFIND MOV DS:[SI+2*9+2],DI ADD SI,4 POP DI JMP SHORT NEXT4 COULDNTFIND: MOV BL,ES:[DI] ;LADDA L¸SKRETSARNA MED DET MAN VILL HA MOV DI,CS:DIFPTR MOV DS:[SI+2*9+2],DI ADD SI,4 STOSB MOV CS:DIFPTR,DI POP DI JMP SHORT NEXT4 LIKA: INC AH AND AH,11B JNZ CHECK4 NEXT4: MOV AH,0 INC DI LOOP CHECK4 ADD DI,BPL-16 POP CX LOOP CMPR POP SI MOVE DS:[SI],CS:DIFCNT POP DS MOV AX,4005H OUT DX,AX IF DEBUG mov ax,cs:difcnt cmp cs:maxdifcnt,ax jae dumret mov cs:maxdifcnt,ax DEBUGVAL 0,23,CS:maxDIFCNT,"max ANTAL 4-BLOCK SOM SKILLDE: " ENDIF RETN maxdifcnt dw 0 LOOK4BLOCK: PUSH AX BX CX SI MOV AX,4 OUT DX,AX MOV BL,ES:[DI] INC AH OUT DX,AX MOV BH,ES:[DI] INC AH OUT DX,AX MOV CL,ES:[DI] INC AH OUT DX,AX MOV CH,ES:[DI] move ds,data MOV SI,GFXADR_FOR_FLIP_ANIM_DATA move ds,dataflip NEXTBLOCK: XOR AH,AH OUT DX,AX CMP BYTE PTR ES:[SI],BL JNE NOTTHISBLOCK INC AH OUT DX,AX CMP BYTE PTR ES:[SI],BH JNE NOTTHISBLOCK INC AH OUT DX,AX CMP BYTE PTR ES:[SI],CL JNE NOTTHISBLOCK INC AH OUT DX,AX CMP BYTE PTR ES:[SI],CH JNE NOTTHISBLOCK THISBLOCK: ;! MOV DI,SI CLC UNIQUE: POP SI CX BX AX RETN NOTTHISBLOCK: INC SI CMP SI,CS:DIFPTR JB NEXTBLOCK STC JMP UNIQUE DIFCNT DW ? DIFPTR DW GFXADR_FOR_FLIP_ANIM_DATA ORGDI DW ? ENDP DELTANIM PROC NEAR ;BX=ADR TO ADR-LISTA ;SI=ADR TO GFXDELTA ;DI=ADR FOR OUTPUT MOV AX,DI DODELTA: MOV DI,[BX] ADD DI,AX ;CP! KAN G™RAS INNAN MOV SI,[BX+2] DB 26H ;ES: MOVSB ADD BX,4 LOOP DODELTA RETN ENDP INIT_SIN: MOV SI,OFFSET SIN MOV CX,2048+2048/4 XCHGSIN:LODSB MOV AH,AL LODSB MOV DS:[SI-2],AX LOOP XCHGSIN RETN BREDDA_MASK: PUSH DS ASSUME DS:HIDDEN1 SET_DS HIDDEN1 SET_ES DS MOV DI,OFFSET HIDDA MOV SI,OFFSET HID1 CALL BREDDA SET_DS HIDDEN2 SET_ES DS MOV DI,OFFSET HIDDA2 MOV SI,OFFSET HID2 CALL BREDDA ASSUME DS:DATA POP DS RETN BREDDA: MOV CX,576 LINE1: PUSH CX MOV CX,40 REP MOVSB ADD DI,2 POP CX LOOP LINE1 RETN DUMRET: RETN pelle_2_bw proc near mov si,offset cs:palle mov ax,cs mov es,ax mov cx,256 xor bh,bh bmw: mov bl,es:[si] mov ax,bx mov bl,es:[si+1] add ax,bx mov bl,es:[si+2] add ax,bx mov bl,3 div bl mov es:[si],al mov es:[si+1],al mov es:[si+2],al add si,3 loop bmw retn pelle_2_bw endp COLOR_2_BW PROC NEAR ;FN: CONV PALETTE AND LIGHT RGB DATA TO BW ;WARNING! MUST BE RUN AFTER THE MAIN RGB DATA ;CONVERTER HAS FINISHED ITS JOB. comment\ MOV BX,0 ;START WITH COLOR 0 MOV CX,256 ;256 COLORS NEXT_COL: PUSH CX CALL GET_COLOR_DATA ;DH,CH,CL=COLOR DATA MOV DL,DH NIL DH MOV AL,CH NIL AH ADD DX,AX MOV AL,CL ADD AX,DX MOV CL,3 DIV CL MOV CL,AL CALL SET_COLOR_DATA_BW ;CL=COLOR DATA INC BX POP CX LOOP NEXT_COL \ ;*** THAT WAS THE PALETTE. NOW LET'S CONVERT THE RGB DATA *** MOVE ES,DS MOV SI,OFFSET LON1 MOV CX,NOOFLIGHTS+1 CONV_NEXT_POST: PUSH CX INC SI LODSB ;AL=RGB DATA LEN NIL AH MOV BL,3 DIV BL MOV CX,AX CONV_NEXT_RGB_BLOCK: PUSH CX MOV DI,SI NIL AH LODSB MOV DX,AX LODSB ADD DX,AX LODSB ADD AX,DX MOV BL,3 DIV BL STOSB STOSB STOSB POP CX LOOP CONV_NEXT_RGB_BLOCK POP CX LOOP CONV_NEXT_POST RETN COLOR_2_BW ENDP comment\ GET_COLOR_DATA PROC NEAR ;FN: READ SINGLE COLOR FROM PALETTE ;INPUT: BX=COLOR NO ;OUTPUT: DH,CH,CL=COLOR DATA, BX UNTOUCHED ;WARNING! USING BIOS! PUSH BX MOV AL,15H MOV AH,10H INT 10H POP BX RETN GET_COLOR_DATA ENDP SET_COLOR_DATA_BW PROC NEAR ;FN: WRITE SINGLE COLOR TO PALETTE ;INPUT: BL=COL NO, CL=BW COLOR DATA ;OUTPUT: BX UNTOUCHED MOV DX,3C8H MOV AL,BL OUT DX,AL INC DX MOV AL,CL OUT DX,AL ;OUT R OUT DX,AL ;OUT G OUT DX,AL ;OUT B RETN SET_COLOR_DATA_BW ENDP \ FANTASIES ENDP addscoreBCD: ;funkar typ: addbcd [di],[si], addera [di] med [si] antalsiffror=11 ;(999.999.999.999) mov al,[di+antalsiffror] add al,[si+antalsiffror] aaa mov [di+antalsiffror],al pos=1 rept (antalsiffror) mov al,[di-pos+antalsiffror] adc al,[si-pos+antalsiffror] aaa mov [di-pos+antalsiffror],al pos=pos+1 endm retn DO_UPDATE_LIGHT PROC NEAR ;INPUT:AL=LINUM, AH=[STRUCADR] CMP AH,TRUE JE ITS_ON LIGHTOFF AL RETN ITS_ON: LIGHTON AL RETN DO_UPDATE_LIGHT ENDP DO_UPDATE_PSTRUC PROC NEAR ;INPUT:AL=LINUM, BX=STRUCADR PUSH BX MOV BL,AL NIL BH MOV AH,TRUE CMP LIGHTSTATUS[BX],AH POP BX JE ITS_ON2 MOV BYTE PTR [BX],FALSE RETN ITS_ON2: MOV BYTE PTR [BX],TRUE RETN DO_UPDATE_PSTRUC ENDP TECHrut: MOV AFTER_CHEAT,TRUE mov bx,offset TECHTS call do_matrix retn TSPrut: MOV AFTER_CHEAT,TRUE mov bx,offset TSPTS call do_matrix retn JOHANrut: MOV AFTER_CHEAT,TRUE mov bx,offset JOHANTS call do_matrix retn DANIELrut: MOV AFTER_CHEAT,TRUE mov bx,offset DANIELTS call do_matrix retn GABRIELrut: MOV AFTER_CHEAT,TRUE mov bx,offset GABRIELTS call do_matrix retn CHEATrut: MOV AFTER_CHEAT,TRUE mov bx,offset CHEATTS call do_matrix retn TILTrut: MOV AFTER_CHEAT,TRUE MOV TILTDISABLED,TRUE mov bx,offset QUAKETS call do_matrix retn robbanrut: MOV AFTER_CHEAT,TRUE mov bx,offset robbanTS call do_matrix retn steinrut: MOV AFTER_CHEAT,TRUE mov bx,offset steinTS call do_matrix retn greetrut: MOV AFTER_CHEAT,TRUE mov bx,offset GREETTS call do_matrix retn SNAILRUT: MOV AFTER_CHEAT,TRUE MOV BX,OFFSET SnailTS CALL DO_MATRIX OR SHIFTKEYS,00000100B RETN BALLSRUT: MOV AFTER_CHEAT,TRUE MOV BX,OFFSET BallsTS CALL DO_MATRIX MOV NO_OF_BALLS,5 RETN FAIRPLAYRUT: MOV AFTER_CHEAT,TRUE MOV BX,OFFSET FairPlayTS CALL DO_MATRIX AND SHIFTKEYS,11111011B ;RESET SPEED MOV TILTDISABLED,FALSE ;RESET TILT MOV NO_OF_BALLS,3 RETN include print.asm ;INCLUDE BALLCODE.ASM INCLUDE SCROLL.ASM INCLUDE ANIMA.ASM INCLUDE SCORE.ASM CODE ENDS END FANTASIES