All pastes #9908 Raw Edit

Something

public text v1 · immutable
#9908 ·published 2005-04-20 14:58 UTC
rendered paste body
;##################LEMONADE STAND#######################
;Coded by: Art Coates and Ben Morris
;C335 
;Updated April 20, 2005
;#######################################################

Extrn   GetDec:Far, PutDec:Far, PutDec:Far, PutStrng:Far, NewLine:Far     ; #include "iostream.h"

Data    Segment
;######Game variables#################
	Day		dw	1
	GlassesSold	dw	?
	PriceperGlass	dw	?
	Income		dw	?
	Expenses	dw	?
	GlassesMade	dw	?
	AdvertisingMade	dw	?
	AdvertisingCost	dw	?
	Profit		dw	?
	Assets		dw	?
	CurrentAssets	dw	200	;starting amount
	DaystoPlay	dw	?
        WeatherCond	dw	?
	CostPerGlass	dw	?
;######inputforday function prompts######
	OnDay		db	"On day: " ; length 8
	LemonadeCost0	db	"The cost to make lemonade is " ; length 29
	LemonadeCost1	db	" per glass." ; 11
;######Random number function vars#######
	RAND_seed     	dw      ? 
;######prompts###########################
	Intro			db	"Welcome to Lemonade Stand"	  			; basic intro prompt 25
	Instructions01		db	'               Welcome to the wonderful world of Entrepreneurship!              ' 

; 80
	Seperator1		db	'* $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ * $ '
	Instructions02		db	'You have chosen to run a lemonade stand from 1-30 days in an attempt to make a  '
	Instructions03		db	'little money.  You must take into account your assests, advertising budget and  '
	Instructions04		db	'the current weather conditions in an attempt to make your stand profitable.     '
	Instructions05		db	'                          Good luck in your quest!                              '
	DailyStatement		db	'Lemonade stand Daily Statement:' 			; daily statement 31
	Date			db	'On day: '			  			; day output 8
	Seperator		db	'******************************'  			; seperator 30
	Sales			db	'Glasses sold: '		  			; glasses sold 14
	Priceprompt		db	'Price per glass: '		  			; price per glass 17
	Production		db	'Glasses made: '		  			; glasses made 14
	Advertsprompt		db	'Signs made: '			  			; signs made 12
	Profitprompt		db	'Profit: '			  			; profit prompt 8
	AssetsPrompt		db	'Assets: '		          			; asset prompt 8
	GlassesPrompt		db	'How many glasses of lemonade do you wish to make? '    ; length 50
        AdvertisingPrompt0 	db   	'How many advertising signs do you wish to make at '    ; 50
        AdvertisingPrompt1      db      ' cents each? '                                         ; 13
	LemonadePricePrompt 	db	'What price (in cents) do you wish to charge for lemonade? ' ; 56
	DaysPrompt		db	'Please enter the number of days to run the stand (1-30): '  ; 57
	NumberOutOfRange	db	'Number out of range, try again  '	 ; 32
	CannotAfford		db	'You cannot afford this many     '       ; 32
	OutOfMoney		db	'Game Over - you are out of money'       ; 32
;########Weather report##################
	Weather0	db	"Today's weather is: Hot and Humid  "	; 35
	Weather1	db	"Today's weather is: Sunny          "	; 
	Weather2	db	"Today's weather is: Fair           "	; 
	Weather3	db	"Today's weather is: Cloudy and Cool"	; 
	Weather4	db	"Today's weather is: Raining        "	; 
;#######Glasses Sold#####################
	MaxPrice	dw	?	;max price of lemondade for a given day 
	MaxGlassesSold	dw	?	;max number of glasses sold in one day	
	GlassMul	dw	?
;#######Game Graphics####################
	logo01		db	'   888                                                            888           ' ; 80
	logo02		db	'   888                                                            888           '
	logo03		db	'   888                                                            888           '
	logo04		db	'   888      .d88b.  88888b.d88b.   .d88b.  88888b.   8888b.   .d88888  .d88b.   '
	logo05		db	'   888     d8P  Y8b 888 "888 "88b d88""88b 888 "88b     "88b d88" 888 d8P  Y8b  '
	logo06		db	'   888     88888888 888  888  888 888  888 888  888 .d888888 888  888 88888888  '
	logo07		db	'   888     Y8b.     888  888  888 Y88..88P 888  888 888  888 Y88b 888 Y8b.      '
	logo08		db	'   88888888 "Y8888  888  888  888  "Y88P"  888  888 "Y888888  "Y88888  "Y8888   '
	logo09		db	'                                                                                '          

                                                                  
	logo10		db	'                                                                                '          

                                                                  
	logo11		db	'                                                                                '	    

                                                                        
	logo12		db	'    .d8888b.  888                           888                                 '
	logo13		db	'   d88P  Y88b 888                           888                                 '
	logo14		db	'   Y88b.      888                           888                                 '
	logo15		db	'    "Y888b.   888888  8888b.  88888b.   .d88888                                 '
	logo16		db	'       "Y88b. 888        "88b 888 "88b d88" 888                                 '
	logo17		db	'         "888 888    .d888888 888  888 888  888                                 '
	logo18		db	'   Y88b  d88P Y88b.  888  888 888  888 Y88b 888                                 '
	logo19		db	'    "Y8888P"   "Y888 "Y888888 888  888  "Y88888                                 '
	logo20		db	'                                                    Press Enter to Continue...  '		

                                                     
;####Game Over###########################
	GameOver01	db	"            _____                         ____                 _                " ; 80
	GameOver02	db	"           / ____|                       / __ \               | |               "
	GameOver03	db	"          | |  __  __ _ _ __ ___   ___  | |  | |_   _____ _ __| |               "
	GameOver04	db	"          | | |_ |/ _` | '_ ` _ \ / _ \ | |  | \ \ / / _ \ '__| |               "
	GameOver05	db	"          | |__| | (_| | | | | | |  __/ | |__| |\ V /  __/ |  |_|               "
	GameOver06	db	"           \_____|\__,_|_| |_| |_|\___|  \____/  \_/ \___|_|  (_)               "
	GameOver07	db	"                     Game Over! - Thank you for playing!                        "
Data    Ends

Code    Segment
        Assume  Cs:Code, Ds:Data, Ss:Sseg

;#####Convert to Dollar##################
;takes 1 value converts it front cents
;to dollars
;Returns Whole # in Ax
;Cents # in DX
@CentsToDollars Proc Near C, @CASH:WORD
	push	bx
	xor	dx,dx		;divided cash by 100
	mov	ax, @Cash	;creates the actual number
	cwd
	mov	bx, 100		;remainder is cents
	iDiv	bx		;goes to DX
	pop	bx
@ctdif:
	cmp	dx, 0		;if dx < 0
	jl	@ctdthen	
	jmp	@ctdendif
@ctdthen:			;then negate dx
	neg	dx
	jmp	@ctdendif
@ctdendif:
	
	ret
@CentsToDollars Endp

;#####random number generator############
;gets a large number, a seed, and an upper limit
;seed is wiped out initially
;system time is used for seed
;answer is returned in Ax
@RANDOMNUMBER Proc Near C, @high:word
	
	push	bx
	push 	cx
	push	dx

	xor 	ax, ax		;clear AX
	mov 	ah, 2Ch		;load 2Ch into ah
	int	21h		;load system time into registers
	mov	RAND_seed, dx	;dh holds seconds, dl holds ms, move to seed
	
	mov	bx, @high	;move high value into bx
	add	bx, 1		;add one
	mov	ax, RAND_seed	;put random seed into Ax
	xor	dx,dx		;clear dx
	cwd			;convert word to double
	div	bx		;divide seed by high
	mov	ax, dx		;move seed mod high into ax
	
	pop	dx
	pop	cx
	pop	bx

	ret 

@RANDOMNUMBER ENDp

;####SetCostPerGlass####################
;Generates a random number
;loads that number into costperglass
;#######################################
@SetCostPerGlass Proc Near

	push	ax
	invoke	@RandomNumber,4	;generate random 0-4
	add	ax,3		;add 3 to it
	mov	CostPerGlass,Ax	;load result into costperglass
	pop	ax
	
	ret

@SetCostPerGlass ENDp

;####SetAdvertisingCost##################
;generates a random number
;loads that number into advertising cost
;########################################
@SetAdvertisingCost Proc Near

	push	ax
	invoke	@RandomNumber,5		;generate random 0-5
	add	ax,5			;add 5 to the number
	mov	AdvertisingCost,Ax	;move result into advertising cost
	pop	ax

	ret

@SetAdvertisingCost ENDp

;###########Post Daily info#############
;post the daily information
;#######################################
@PostDailyInfo Proc Near

	push	ax
	push	cx
	Mov     cx, 8		;output onday prompt
        Lea     Di, OnDay
        Call    PutStrng
	mov 	Ax, Day		;show day
	call	PutDec
	mov	cx, 30
	call	NewLine
	lea	di, Seperator	;load the separator
	call	PutStrng
	call	NewLine		;blank lines
	call	NewLine
	pop	cx
	pop	ax
	
	ret

@PostDailyInfo ENDp

;####ClearScreen#########################
;clears the screen with a loop
;puts @line # of new lines on the screen
;########################################
@cLEARSCREEN 	Proc Near C, @Lines:word
	push	Bx
	mov 	Bx, @Lines	;bx = # of lines on the screen
@CSfor:	cmp 	bx, 0		;for bx > 0 do
	ja 	@CSdo
	jmp	@CSendfor
@CSdo:	
	call	NewLine		;print new line
	dec	Bx		;dec bx
	jmp	@CSfor		;loop
@CSendfor: 
	pop	Bx

	ret
          
@CLEARSCREEN ENDp

;######outputs cents formated nicely#####
;outputs -3453 or 300 as $34.53 or $3.00
;input is money in cents
;########################################
@OutputDollars Proc Near C, @Money:word
	push	ax
	push	bx
	push	cx
	push	dx
	invoke	@CentsToDollars, @Money ;break money apart into 
					;dollars and cents
	push 	ax
	push	dx	
	xor	ax, ax			;clears registers for
	xor	dx, dx			;interrup call
	mov 	ah, 02h			;int 21h puts $ on the screen
	mov	dl, 36			;call 36 = $
	int	21h
	pop	dx
	pop	ax
@optif2:				; if money < 0
	cmp 	@Money, 0
	jl 	@optand2
	jmp	@optendif2
@optand2:				; AND
	cmp	@Money, -100		; money > -100
	jg	@optthen2
	jmp	@optendif2
@optthen2:
	push 	ax
	push	dx			;clear registers
	xor	ax, ax
	xor	dx, dx
	mov 	ah, 02h			;use int21h again
	mov	dl, 45			;character 45 = -
	int	21h			;call int
	pop	dx
	pop	ax
	jmp	@optendif2
@optendif2:
	call	PutDec			;output whole $
	push 	ax
	push	dx	
	xor	ax, ax
	xor	dx, dx
	mov 	ah, 02h			;int 21h again
	mov	dl, 46			;character 46 = .
	int	21h			;call int
	pop	dx
	pop	ax
	mov	ax, dx			;move into ax, the decimal portion
@optif:
	cmp	ax, 10			;if ax < 10
	Jb 	@optthen		
	jmp	@optendif	
@optthen:				;this has to be added to keep a zero infront
	push	ax			;of decimals < 10 or 9 would print out .9 instead
	mov 	ax, 0			;of .09
	call	PutDec			
	pop	ax
	jmp	@optendif
@optendif:
	call	PutDec			;output the decimal portion 
	pop	dx
	pop	cx
	pop	bx
	pop	ax

	ret

@outputdollars ENDp

;#########INPUT FOR DAY##################
;gets input for the day
;provides error handling for
;entering data also
;########################################
@InputForDay Proc Near C
	push	ax
	push	bx
	push	cx
	push	dx
		
	mov     cx, 29				;output the cost per glass
        lea     di, LemonadeCost0
        call    PutStrng  
	invoke	@OutputDollars, CostPerGlass

	mov	cx, 11				;append perglass
	lea	di, LemonadeCost1
	call	PutStrng
	call	NewLine				;blank lines
	call	NewLine
	
	mov     cx, 7				;output current assets
        lea     di, AssetsPrompt
        call    PutStrng  
	invoke	@OutputDollars, CurrentAssets
	call	NewLine
@if1:						;begin prompts for 3 values, loop to here
	call	NewLine

	Mov     cx, 50				;prompt for how many glasses to make
        Lea     di, GlassesPrompt
        Call    PutStrng  			

	call	GetDec				;get the value into ax
	
	mov	GlassesMade, Ax			;load that into glassesmade
	call	NewLine				

	mul	CostPerGlass			;multiply costperglass x # glasses
	mov	Expenses, ax			;move result into expenses for below
	cmp	ax, Currentassets		;if expenses > currentassets then
	jg	@then1				
	jmp	@endif1
@then1:
	mov     cx, 32
        lea     di, CannotAfford		;show you can't afford message
        call    PutStrng  			
	invoke	@OutputDollars, ax		;show how much it would cost
	jmp	@if1				;jump to the top to reprompt
@endif1:
	
@if2:	
	call	NewLine
	mov     cx, 50
        lea     di, AdvertisingPrompt0		;show the cost of advertising
        call    PutStrng
	mov	ax,AdvertisingCost		
	call	PutDec
	mov	cx, 13
	lea	di,AdvertisingPrompt1		;append per sign
	call	PutStrng
	call	GetDec				;load the input into ax
	mov	AdvertisingMade, ax		;move that into advertising made
	call	NewLine	
	mul	AdvertisingCost			;multiply advertising cost x advertising made
	add	ax, Expenses			;add expenses to the result
	cmp	ax, CurrentAssets		;if the result is > currentassets then
	jg	@then2
	jmp	@endif2
@then2:
	mov     cx, 28
        lea     di, CannotAfford		;print you cant afford this
        call    PutStrng  
	invoke	@OutputDollars, ax		;show how much it cost
	jmp	@if2				;jmp back to the top again
@endif2:

	mov     Cx, 58
        lea     Di, LemonadePricePrompt		;prompt for how much you want to charger /glass
        call    PutStrng  

	call	GetDec				;load into ax
	mov	PricePerGlass, ax		;move into priceperglass
	call	NewLine
	
	pop	dx
	pop	cx
	pop	bx
	pop	ax

	ret

@InputForDay endp

;#######Asset Statement##################
;finacial summary prints out 
;important figures which show you 
;where you stand in the game
;#######################################
@AssetStatement	Proc Near C

	push	cx
	push	ax

	mov	ax,PricePerGlass	;priceperglass x glassessold = income
	mul	GlassesSold		;move into income
	mov	Income,ax

	mov	ax,AdvertisingCost	;advertisingcost x advertisingmade = expenses
	mul	AdvertisingMade
	mov	Expenses,ax		;move into expenses

	mov	ax,CostPerGlass		;costperglass x glassesmade + expenses = expenses
	mul	GlassesMade
	add	Expenses,ax		;add value to expeneses
	
	mov	ax,Income		;income - expenses = profit
	sub	ax,Expenses
	mov	Profit,ax		
	
	add	ax,CurrentAssets	;add current assets to profit
	mov	Assets,ax		;move result into assets 
	
	mov	Currentassets, Ax	;move result into currentassets
	
	invoke	@clearscreen,25		;clear the screen 25 times
	mov	cx,31
	lea	di,dailystatement	;print daily statment
	call	PutStrng
	mov	cx,30
	call	NewLine
	lea	di,seperator		;print the separator
	call	PutStrng
	invoke	@clearscreen,2

	mov	cx,8
	lea	di,date			;show the day
	call	PutStrng
	mov	ax,day
	call	putdec
	call	NewLine

	mov	cx,12
	lea	di,advertsprompt	;show advertisingmade
	call	PutStrng
	mov	ax,AdvertisingMade	
	call	putdec
	call	NewLine	

	mov	cx,14
	lea	di,production		;show glassesmade
	call	PutStrng
	mov	ax,GlassesMade
	call	putdec
	call	NewLine

	mov	cx,17
	lea	di,priceprompt		;show priceperglass
	call	PutStrng
	invoke	@outputdollars,PriceperGlass
	call	NewLine

	mov	cx,14
	lea	di,sales		;show glassessold
	call	PutStrng
	mov	ax,GlassesSold
	call	putdec
	call	NewLine

	mov	cx,8
	lea	di,profitprompt		;show profit
	call	PutStrng
	invoke	@outputdollars,Profit
	call	NewLine

	lea	di,assetsprompt
	call	PutStrng		;show assets
	invoke	@outputdollars,assets
	invoke	@clearscreen,3
	
	inc	day			;add one to day

	pop	cx
	pop	ax

	ret
@AssetStatement ENDp


;############promt for days#########
;prompts for the number of days to 
;play the game
;###################################
@PromptforDays	proc near C

	push	cx
	push	ax
	
@pfdfor:			
	mov	cx,57		;shows the day prompt
	lea	di,daysprompt
	call	PutStrng	
				;input the number of days to play
	call	getdec		
	cmp	ax,30		;make sure that number isnt over 30
	jg	@pfdtryagain
	cmp	ax,0		;make sure it isnt over zero
	jle	@pfdtryagain
	jmp	@pfdendfor
@pfdtryagain:
	mov	cx,32			;try again out of range message
	lea	di,numberoutofrange
	call	PutStrng		
	call	NewLine
	jmp	@pfdfor
@pfdendfor:

	mov	DaystoPlay,ax	;load the value into daystoplay

	pop	cx
	pop	ax

	ret
@promptforDays	endp

;########Generate weather report#########
;Generates the weather report for the day
@GenerateWeather Proc near C
	push	ax
	push	bx
	push	cx
	push	dx

	invoke 	@randomnumber, 4 	;generate a random number 0-4
	Mov     Cx, 35
@gswitch:				;case statment
	cmp	ax, 0
	je	@gcase0
	cmp	ax, 1
	je	@gcase1
	cmp	ax, 2
	je	@gcase2
	cmp	ax, 3
	je 	@gcase3
	cmp	ax, 4
	je	@gcase4
	jmp	@gdefault
@gcase0:			;if number is zero 
        Lea     Di, weather0	;weather is raining
        Call    PutStrng
	Call	NewLine    
	mov	weathercond, 0		
	jmp	@gendswitch
@gcase1:
        Lea     Di, weather1	;if number is 1
        Call    PutStrng	;weather is cloudy and cool
	Call	NewLine 
	mov	weathercond, 1
	jmp	@gendswitch
@gcase2:			;if number is 2
        Lea     Di, weather2	;weather is fair
        Call    PutStrng
	Call	NewLine 
	mov	weathercond, 2
	jmp	@gendswitch
@gcase3:			;if number is 3
        Lea     Di, weather3	;weather is sunny
        Call    PutStrng
	Call	NewLine 
	mov	weathercond, 3
	jmp	@gendswitch
@gcase4:			;if number 4
        Lea     Di, weather4	;weather is hot and humid
        Call    PutStrng
	Call	NewLine 
	mov	weathercond, 4
	jmp	@gendswitch
@gdefault:
@gendswitch:
	call	NewLine

	pop	dx
	pop	cx
	pop	bx
	pop	ax	
	ret
@generateweather endp

;#########Glasses Sold###################
;Figures the #of glasses sold
;Based on the weather, advertising
;and price charged.
;########################################
@glassessold Proc Near

	push	ax
	push	bx
	push	cx
	push	dx
	
	invoke	@RandomNumber, 20 	;generate the max selling price
	mov	MaxPrice, ax		;move into max selling variable

	mov	ax, WeatherCond		;Adjust max price to reflect the weather
					;switch changes max price to a percentage divider
@mxswitch:	
	cmp	ax, 0
	je	@mxcase0
	cmp	ax, 1
	je	@mxcase1
	cmp	ax, 2
	je	@mxcase2
	cmp	ax, 3
	je 	@mxcase3
	cmp	ax, 4
	je	@mxcase4
	jmp	@mxdefault
@mxcase0:				;adjust the divider accordingly
	mov	WeatherCond, 40
	jmp	@mxendswitch
@mxcase1:
	mov	WeatherCond, 20
	jmp	@mxendswitch
@mxcase2:
	mov	WeatherCond, 4
	jmp	@mxendswitch
@mxcase3:
	mov	WeatherCond, 2
	jmp	@mxendswitch
@mxcase4:
	mov	WeatherCond, 1
	jmp	@mxendswitch
@mxdefault:
@mxendswitch:
	mov	Ax, MaxPrice
	mov	Bx, WeatherCond		;conditions
	xor	dx,dx			;Divide by weather condition add result to
	cwd				;max price  
	idiv	bx			;effect is a higher max price based on higher
	add	MaxPrice, Ax		;weather condition
	invoke	@RandomNumber,10	;generate random number between 0-10
	add	Ax, 5			;shifts the range to 5-15
	mov	MaxGlassesSold, Ax
	mov	Bx, WeatherCond		
	xor	dx,dx			;Divide by weather condition add result to
	cwd				;maxglasses sold  
	idiv	bx			;effect is a higher max glasses sold based on higher
	add	MaxGlassesSold, Ax	;weather condition
	mov	ax, AdvertisingMade
@adswitch:				;uses the number of advertising signs made here
	cmp	ax, 5			;arbitrary values making over 20 signs has no 
	jl	@adcase0		;increase in sales
	cmp	ax, 10
	jl	@adcase1
	cmp	ax, 15
	jl	@adcase2
	cmp	ax, 21
	jl 	@adcase3
	jmp	@addefault
@adcase0:				;loads the divider
	mov	GlassMul, 15
	jmp	@adendswitch
@adcase1:
	mov	GlassMul, 8
	jmp	@adendswitch
@adcase2:
	mov	GlassMul, 3
	jmp	@adendswitch
@adcase3:				;20 signs effectivly double your maxglassessold
	mov	GlassMul, 1
	jmp	@adendswitch
@addefault:
@adendswitch:
	mov	Ax, MaxGlassesSold	;further increase the max # of  glasses sold by
					;figure the multipier for Glasses based on advertising
	mov	Bx, GlassMul		;using the advertising divider
	xor	dx, dx
	cwd
	idiv	bx			;divide by the number
	add	MaxGlassesSold, Ax	;add it to maxglasses sold
	invoke	@RandomNumber, 10	; randomly add/subtract from glasses
@adif:					;50/50 chance of loosing/gaining 1-5 glasses
	cmp	ax, 5
	jl	@adthen
	jmp	@adelse
@adthen:
	invoke	@RandomNumber, 5	;add a random component from max glasses sold
	add	MaxGlassesSold, ax
@adelse:
	invoke	@RandomNumber, 5	;subtract a random component from max glasses sold
	sub	MaxGlassesSold, ax
@adendif:

;########################################
;At this point your ideal max glasses sold and ideal maxprice is figured
;so if your price/glass = maxprice you're going to sell all your glasses up to 
;maxglassessold
;########################################
	mov	cx, PricePerGlass	
@glif:		
	cmp	cx, MaxPrice		;compare the price/glass to max price
	jg	@glthen			;if it's greater then glasses sold
	jmp	@glendif		;will need to be reduced proportionally
@glthen:
	mov	Ax, PricePerGlass
	mov	cx, MaxPrice
	xor	dx, dx
	cwd
	div	cx			;divide priceperglass by max price						
	mov	bx, ax					
	mov	ax, MaxGlassesSold	
	xor	dx, dx
	cwd
	div	bx			;divide by divider
	mov	MaxGlassesSold, ax	;replace the reduced maxglassessold with 

@aif:					;if divider > 3, or your price is 3x higher
	cmp	bx, 3			;than the maxprice, you sell zero
	jg	@athen
	jmp	@aendif
@athen:	
	mov	MaxGlassesSold, 0	;move zero into maxglassessold
@aendif:				;the divided value



@glendif:	;####END IF




	mov	bx, MaxGlassesSold
	mov	GlassesSold, bx		;populate glassessold with final number
	mov	cx, GlassesMade		;load how many were made into Cx
@gsif:	
	cmp	cx, GlassesSold		;if glasses made > glasses sold then
	jl	@gsthen
	jmp	@gsendif
@gsthen:
	mov	GlassesSold, cx		;glasses sold = glasses made
	jmp	@gsendif
@gsendif:
	call	NewLine
	
;########################################
;glassessold is ultimately the output of this function
;it is a global variable therefore the function is a void
;########################################	

	pop	dx
	pop	cx
	pop	bx
	pop	ax

	ret
@glassessold endp

;#####PrintIntro#########################
;prints a ASCI graphical intro screen
;########################################
@PrintIntro Proc Near

	push	cx
	invoke	@ClearScreen, 25	;clears the screen
	mov     Cx, 25			
        lea     Di, Intro		;show intro
        call    PutStrng
	invoke	@ClearScreen,2

	mov	cx,80			;load each line of the ASCI ART
	lea	di, logo01		;graphic
	call	PutStrng		
	lea	di, logo02
	call	PutStrng
	lea	di, logo03
	call	PutStrng
	lea	di, logo04
	call	PutStrng
	lea	di, logo05
	call	PutStrng
	lea	di, logo06
	call	PutStrng
	lea	di, logo07
	call	PutStrng
	lea	di, logo08
	call	PutStrng
	lea	di, logo09
	call	PutStrng
	lea	di, logo10
	call	PutStrng
	lea	di, logo11
	call	PutStrng
	lea	di, logo12
	call	PutStrng
	lea	di, logo13
	call	PutStrng
	lea	di, logo14
	call	PutStrng
	lea	di, logo15
	call	PutStrng
	lea	di, logo16
	call	PutStrng
	lea	di, logo17
	call	PutStrng
	lea	di, logo18
	call	PutStrng
	lea	di, logo19
	call	PutStrng
	lea	di, logo20
	call	PutStrng
	push	ax
	call	GetDec		;press enter
	pop	ax
	pop	cx

	ret

@PrintIntro ENDp

;########print instructions#########
;shows the instructions how to play
;the game
;###################################
@PrintInstructions Proc Near

	push	cx
	invoke	@ClearScreen, 25	;clear the screen
	mov	cx, 80
	lea	di, Instructions01	;load each line of the instructions
	call	PutStrng
	call	NewLine
	lea	di, Seperator1
	call	NewLine
	call	PutStrng
	call	NewLine
	lea	di, Instructions02
	call	PutStrng
	lea	di, Instructions03
	call	PutStrng
	lea	di, Instructions04
	call	PutStrng
	call	NewLine
	lea	di, Seperator1
	call	PutStrng
	call	NewLine
	lea	di, Instructions05
	call	PutStrng
	Invoke	@ClearScreen, 5
	pop	cx

	ret

@PrintInstructions ENDp


;##########gameover############
;shows the game over graphic
;##############################
@GameOver Proc Near

	push	cx
	mov	cx,80		;shows the game over graphic
	lea	di, GameOver01	;prints one line at a time
	call	PutStrng
	lea	di, GameOver02
	call	PutStrng
	lea	di, GameOver03
	call	PutStrng
	lea	di, GameOver04
	call	PutStrng
	lea	di, GameOver05
	call	PutStrng
	lea	di, GameOver06
	call	PutStrng
	lea	di, GameOver07
	call	PutStrng
	pop	cx
	
	ret

@GameOver ENDp

;########### MAIN #################
;##################################
main   	Proc    Far
	MOV     AX,SEG DATA  	;intialize registers
        MOV     DS,AX 
        MOV     ES,AX 
	
	invoke	@PrintIntro		;invoke functions print intro
	invoke	@PrintInstructions	;show the instructions
	invoke	@PromptForDays		;prompt for # of days to play
	invoke	@ClearScreen,25		;clear the screen
@for:					;for days to play > 0
	cmp	DaystoPlay,0
	jg	@do
	jmp	@endfor
@do:
	invoke	@SetCostPerGlass	;generate a random glass cost
	invoke  @SetAdvertisingCost	;generate a random advertising cost
	invoke	@PostDailyInfo		;show the daily info
	invoke	@GenerateWeather	;generate a weather report for the day
	invoke	@InputForDay		;get input for the day
	invoke	@GlassesSold		;do the calculations to get glasses sold
	invoke	@AssetStatement		;show the result for the day
	mov	Ax, CostPerGlass	;move into Ax costperglass
@if:
	cmp	CurrentAssets, ax	;if currentassets < costperglass
	jl	@then
	jmp	@endif
@then:
	mov     cx, 32			;show you have ran out of money
        lea     di, OutOfMoney		
        call    PutStrng
	call	NewLine  		
	jmp	@endfor			;jump to gameover
@endif:
	dec	DaysToPlay		;decrement the days to play
	jmp	@for
@endfor: 
	invoke	@GameOver		;show game over graphic
        mov     ah, 4ch
        int     21h
main    ENDp

Code    Ends

SSeg    Segment        STACK       
         DB            254 dup(?)
SSeg    Ends

        End     main