calculate wpm for the game

 ;

;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



Comments

Popular posts from this blog

BOTTOM LIVE script

Fawlty Towers script for "A Touch of Class"