; ;calculate wpm for the game ; wpm proc ; assume cs:codesg,ds:datasg,es:nothing ; ;first get a clock tick ; call clock sub bx,gamtim[+2] mov gamtim[+2],bx sbb cx,gamtim ; cmp cx,0 ;don't calculate if user has je okwpm ;waited longer than 1 minute to mov ax,0 ;get here ... should be impossible, jmp wpm_exit ;... meaning a programming error okwpm: cmp gamtim[+2],0 je wpm_exit2 mov ax,gamcharcnt ;wpm = 0 if no characters typed cmp ax,0 je wpm_exit ; mul word ptr n1200 ;1,200 = ((60 secs/min) ; X (100 ticks/sec) ; / (5 chars/word) under120: div word ptr gamtim[+2] ; / 100ths of a second = chars/min wpm_exit: mov gamewpm,ax wpm_exit2: mov gamcharcnt,0 call clock mov gamtim[+2],bx mov gamtim,cx ret wpm endp ; ;evaluate routine follows ; ;include evaluate.asm ;************************************************************************ ;* FUNCTION: XYCalc() * ;* * ;* PARAMETERS: * ;* Dx - X position on screen. (0..319) * ;* Di - Y position on screen. (0..199) * ;* * ;* DESCRIPTION: Calculates byte address of X, Y. Result is in Di, Dx * ;* where Di is current line address of RowTable and Dx is * ;* the X byte offset. * ;************************************************************************ XYCalc_ PROC NEAR Mov Es,VideoSeg Shr Dx,1 Shr Dx,1 shr dx,1 ;for 40 col modes Shl Di,1 Lea Di,RowTable[Di] Ret XYCalc_ ENDP ;************************************************************************ ;* FUNCTION: PrintAt ( X, Y, Str ) * ;* * ;* PARAMETERS: * ;* X - X position of string. 0..319 is really 0..79. * ;* Y - Y position of string. 0..199 * ;* Str - Points to the string we are to print. * ;* * ;* DESCRIPTION: Prints a string at the given coordinates. * ;************************************************************************ PrintAt_ PROC NEAR ; Mov Bx,Sp ;Set Bx to base of parms. ; shl dx,1 ;<-test shl dx,1 ;"" shl dx,1 ;"" shl dx,1 mul byte ptr eight ;"" Push Si jmp getch db 'uku' ; Mov Dx,2[Bx] ;Get X ; Mov Ax,4[Bx] ;Get Y ; Mov Si,6[Bx] ;Get char pointer GetCh: ;WHILE ( *Pt ) ; BEGIN Xor Ch,Ch ; Make sure Ch is 0 Mov Cl,[Si] ; Acquire the next char to draw Jcxz ExitPrintAt ; Exit if we've found the null char ;taken out so printat will display $ symbols in game text ; cmp cl,'$' ; or a $ - for compatability with DOS ; je exitprintat ; string print call. Push Ax Push Dx Push Cx Call APutChar ; APutChar( Dx, Ax, Cx ); Pop Cx Pop Dx Pop Ax Inc Si ; Pt++; Add Dx,16 ;8 ; X += 8; ; Cmp Cx,'~' ; IF ( ReturnArrow ) THEN ; Jne Norm ; BEGIN ; Add Dx,8 ; X += 8; ; Inc Si ; Pt++; ; END Norm: Jmp SHORT GetCh ; END ExitPrintAt: Pop Si Ret ; Return to the caller. PrintAt_ ENDP ;************************************************************************ ;* FUNCTION: PutChar( X, Y, Ch ) * ;* * ;* PARAMETERS: * ;* X - X position of Character. 0..319 is really 0..79. * ;* Y - Y position of Character. 0..199 * ;* Ch - The character we are to put on the screen. * ;* * ;* DESCRIPTION: Puts the given character on screen. * ;************************************************************************ CharTable EQU 0FA6EH ;Base of graphics character table ;NOTE: hardware dependent PutChar_ PROC NEAR Mov Bx,Sp ;Set BX to base of parms. Mov Dx,2[Bx] ;Get X Mov Ax,4[Bx] ;Get Y Mov Cx,6[Bx] ;Get Char APutChar: ; Cmp Cx,'~' ;IF ( ReturnArrow ) THEN ; Jne NormCh ; DrawSpecial( 3 ); ; Mov Cx,3 ; Call ADrawSpecial ; Ret NormCh: Push Si ;Save Registers Push Di Push Es Push Bp Mov Di,Ax Call XYCalc_ ;Get offset at which to draw the Char Mov Bp,Di Mov Si,Cx ;Point Si at the char in table Shl Si,1 Shl Si,1 Shl Si,1 Add Si,CharTable Cld ;Direction = forward Mov Cx,8 ;8 byte character set NextCharRow: ;DO Mov Di,ds:[Bp] ; Get row pointer <-was using ss:!!! Add Di,Dx Push Ds Mov Ax,0F000H ; Set DS register to the base Mov Ds,Ax ; of last memory ROM segment. Lodsb ; Acquire a byte(pixel map) of the Char Pop Ds Call StoreByte ; Put the byte in screen memory Add Bp,2 ; END Loop NextCharRow ;WHILE( --Cx ); Pop Bp Pop Es Pop Di ;Save Registers Pop Si Ret PutChar_ ENDP ;************************************************************************ ;* FUNCTION: StoreByte * ;* * ;* PARAMETERS: * ;* Reg Al - The byte we are to store. * ;* Es:Di - Points to the screen memory where we are to store byte. * ;* * ;* DESCRIPTION: Takes the byte in Al, converts it to a 16 bit value and * ;* then masks the color bits to the current 'ColorMask'. * ;* Di is incremented by 2 on exit. * ;************************************************************************ StoreByte PROC NEAR Call ExpandByte_ ;Convert to word Xchg Ah,Al And Ax,ColorMask Stosw ;Put the Char into graphics memory Ret StoreByte ENDP ;************************************************************************ ;* FUNCTION: ExpandByte() * ;* * ;* PARAMETERS: * ;* TheByte - Byte to be expanded in Al register. * ;* * ;* DESCRIPTION: Expands a byte into a word. * ;************************************************************************ ExpandByte_ PROC NEAR Push Bx Lea Bx,ExpandTable Mov Ah,Al ;Save a copy in Ah Shr Al,1 ;a 16 bit character bit map. Shr Al,1 Shr Al,1 Shr Al,1 Xlatb ;Take the 8 bit pattern Xchg Ah,Al ;and translate it into And Al,00FH Xlatb Pop Bx Ret ExpandByte_ ENDP plot proc near ; ;position cursor at locx, locy ; mov dh,locy mov dl,locx cmp gamevmode,1 jne plot_exit mov ah,2 mov bh,0 int 10h ;position on screen plot_exit: ret plot endp char_write proc near ; ;Write char in AL at cursor position for mono ;or at position held in dx for graphics. ;Used after call to plot. ; cmp gamevmode,1 jne herc_cga mov ah,9 mov bh,0 mov bl,att_byte mov cx,1 int 10h ret herc_cga: mov colormask,0ffffh mov cl,al mov al,dh cbw xor dh,dh xor ch,ch shl ax,1 shl ax,1 shl ax,1 shl dx,1 shl dx,1 shl dx,1 shl dx,1 call aputchar ret char_write endp ;$PAGE ;************************************************************************ ;* FUNCTION: DoHerc() * ;* * ;* PARAMETERS: None * ;* * ;* DESCRIPTION: Checks to see if the Hercules mono graphics adapter is * ;* there and if it is, it inits it and sets RowTable data * ;* table up accordingly. Uses vertical rettrace check to * ;* to insure that a card is there. * ;* * ;* RETURNS: Carry set if card is not there. * ;************************************************************************ DoHerc PROC NEAR Mov Dx,03BFH ;Turn on Herc card Mov Al,00000011B Out Dx,Al Mov Bl,OldFlag ;Get OldFlag Push Ds ;Restore old equipment flag Mov Ax,EquipSeg Mov Ds,Ax Mov ds:[EquipFlag],Bl Pop Ds Mov Dx,3BAH ;Display status port for Herc Mov Bl,10000000B ;Vertical retrace mask bit for Herc card ;Call CheckRetrace ;Jnc InitHerc ;Stc ;Ret InitHerc: Mov GrAdapterType_,HERCCARD Push Si Push Di Mov Cx,50 ;Do 50 groups of 4 Lea Bx,RowTable ;Point to table Mov Si,0658H ;Line 0 + 8 byte offset Screen center Mov Di,2658H ;Line 1 + 8 byte offset Screen center Mov Ax,4658H ;Line 2 + 8 byte offset Screen center Mov Dx,6658H ;Line 3 + 8 byte offset Screen center TLoop1: Mov [Bx],Si ;Store 4 words Mov [Bx+2],Di Mov [Bx+4],Ax Mov [Bx+6],Dx Add Si,90 ;Add 90 for next line of 4 Add Di,90 Add Ax,90 Add Dx,90 Add Bx,8 ;Move to next 4 pointers Loop TLoop1 ;Loop for all rows Call ClearScreen_ Lea Si,GTable ;Ptr to Herc card init table Call SetParams ;Set the Herc card params. Mov Dx,3B8H ;Set Ctrl Reg for scrn on, Mov Al,10001010B ;Bit 1 - gr mode, Bit 3 - activate scrn Out Dx,Al ;Bit 7 - display page B800H Pop Di Pop Si Clc ;Clear carry to show that herc is there Ret SetParams: Mov Dx,3B4H ;Index register position Mov Cx,12 ;Move 12 parameters to data registers Xor Ah,Ah ;Start with register 0 Parms: Mov Al,Ah ;Send reg number to index reg 3B4H Out Dx,Al Inc Dx ;Now send data to data reg 3B5H Lodsb Out Dx,Al Inc Ah Dec Dx Loop Parms Ret DoHerc ENDP ;$PAGE ;************************************************************************ ;* FUNCTION: ClearScreen() * ;* * ;* PARAMETERS: * ;* None - * ;* * ;* DESCRIPTION: Clears the graphics screen * ;************************************************************************ ClearScreen_ PROC NEAR Push Di Push Es Mov Es,VideoSeg Mov Cx,4000H ;Word count of entire screen Mov Ax,0 ;Write null pattern to screen Mov Di,Ax ;Start at screen address 0 Cld ;Set direction to forward Rep Stosw ;Clear screen a word at a time Pop Es Pop Di Ret ClearScreen_ ENDP begin endp codesg ends end begin