home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol075
/
id.frt
< prev
next >
Wrap
Text File
|
1984-04-29
|
12KB
|
487 lines
C---- PROGRAM ID 29/10/80
COMPILER(1)=100H
COMPILER(3)=26FFH
SUBROUTINE RANDOM(SEED)
C---- ROUTINE TO RETURN A 16-BIT RANDOM NUMBER GIVEN
C A SEED. USES THE ADDITIVE CONGRUENTIAL METHOD.
INTEGER*2 SEED
C---- NEW NUMBER IS GENERATED FROM THE FORMULA:-
C NEW=SEED*(2**11+2**2+1)+33031Q
C
C---- THE ACTUAL CODE IS:-
C LHLD SEED ; MOV C,L ; MOV B,H ; MOV H,L ;
C MVI L,0 ; DAD H ; DAD B ; DAD H ;
C DAD H ; DAD B ; LXI B,33031Q
C DAD B ; SHLD SEED ;
INLINE/2AH,ADDRESS(SEED),4DH,44H,65H,2EH,00H/
INLINE/29H,09H,29H,29H,09H,01H,19H,36H/
INLINE/09H,22H,ADDRESS(SEED)/
RETURN
END
INTEGER*2 FUNCTION RAND0
INTEGER*2 ISEED
100 CALL RANDOM(ISEED)
RAND0=ISEED.AND.0FFFH
RETURN
END
INTEGER*2 FUNCTION MOD(I,J)
INTEGER*2 I,J
MOD=I-I/J*J
RETURN
END
REAL*8 FUNCTION AMOD(A,B)
REAL*8 A,B,C
C=A
200 IF(C.LT.B)GO TO 100
C=C-B
GO TO 200
100 AMOD=C
RETURN
END
INTEGER*1 KMERC,NX,IWA
INTEGER*1 INAME(16)
1 WRITE(1,1001)
1001 FORMAT(//' THIS IS THE KINGDOM OF ID'/
1 ' YOU HAVE BEEN CALLED BEFORE THE KING!'//
2 ' WHAT IS YOUR NAME?....')
READ(1)STRING(INAME,16)
ICN=INAME(1)+INAME(2)+INAME(3)
DO 999 I = 1,ICN
999 J=RAND0
C---- CONSTANTS USED IN THIS PROGRAM.
LAZY=0
NOFEED=0
IAFFC=100
IWARN=0
IWA=.FALSE.
IWMAX=25
IWLIM=20
MERC=0
IMERC=80
IBTHS=0
IDTHS=0
PLANT=0.0
YIELD=5.0
WHEAT=5.001
IPUT=9
NBTHS=7
NDTHS=14
JMERC=11
LMERC=5
AMERC=0.3
KMERC=.FALSE.
PLAGE=0.7
RRATE=60.0
REATR=0.06
WEEVILS=0.4
RANRATE=0.13
STARVE=20.0
NSTRV=0
IPPLG=0
WEAT=0.0
IREAT=0
ACRAT=7.0
ACBUY=7.0
PLSTK=0.7
NMIN=21
IYR=1
GRAIN=5000.1
ACRES=1500.1
IPOP=100
C---- START OF PASS.
C---- DOES THE VICTIM DESERVE TO CONTINUE?
2 IF(IWARN-IWMAX)22,22,510
C---- GIVE ALL THE YEAR'S INPUT PARAMETERS.
22 FLOAT=IPOP
IAFFL=(ACRES+GRAIN/25.0)/17.0*100.0/FLOAT
IAFFC=IAFFL-IAFFC
WRITE(1,115)(INAME(I),I=1,16),IYR,IAFFL,IAFFC
115 FORMAT(//2X,16A1/' YEAR',I4,' AFFLUENCE RATIO',
1 I5,'% CHANGE',I5,'%')
IAFFC=IAFFL
C---- MAYBE THE USER NEEDS A WARNING.
IF(IWA)GO TO 51
IF(IWARN-IWLIM)51,52,52
52 IWA=.TRUE.
WRITE(1,1002)
1002 FORMAT(' YOUR MANAGEMENT DISPLEASES THE KING.'/
1 ' YOU WILL BE IN BIG TROUBLE IF YOU DO NOT IMPROVE.')
51 IF(MERC)53,31,53
53 IPOPA=IBTHS*3/2
IBTHS=IBTHS+IPOPA
IPOP=IPOP+IPOPA
WRITE(1,1003)
1003 FORMAT(' THE MERCENARIES YOU HIRED RAPED THE WOMEN,'/
1 ' RESULTING IN AN ABNORMALLY HIGH BIRTH RATE.')
31 ICN=ACRES
WRITE(1,101)IPOP,ICN,GRAIN
101 FORMAT(' THE KINGDOM HAS',I5,' PEASANTS',I6,' ACRES AND',
1 F8.0,' BUSHELLS.')
IF(IYR-1)57,54,57
54 WRITE(1,123)
123 FORMAT(' YOU ARE HEREBY COMMANDED BY HIS MAJESTY,',
1 ' THE FINK, TO'/
2 ' IMPROVE THE KINGDOMS ASSETS.'/
3 ' GOOD LUCK (YOU WILL NEED IT) AND GOOD MANAGEMENT!'//)
57 IF(IYR-1)58,59,58
58 WRITE(1,122)IBTHS,IDTHS
122 FORMAT(' THERE WERE',I4,' BIRTHS &',I4,' NATURAL DEATHS.')
59 IF(NSTRV)61,61,60
60 WRITE(1,116)NSTRV
116 FORMAT(' STARVATION KILLED',I5,' PEASANTS.')
61 IF(IREAT)63,63,62
62 WRITE(1,114)IREAT
114 FORMAT(' THE RATS ATE',I5,' BUSHELLS.')
63 IF(WEAT)66,66,64
64 WRITE(1,111)WEAT
111 FORMAT(' THE WEEVILS RUINED',F7.0,' BUSHELLS.')
66 IF(IPPLG)68,68,67
67 WRITE(1,113)IPPLG
113 FORMAT(' THE PLAGUE & THE POX STRUCK',I4,' PEASANTS.')
68 IF(.NOT.KMERC)GO TO 26
WRITE(1,1004)
1004 FORMAT(' THE HUNS LOOTED & PLUNDERED BECAUSE'/
1 ' YOU DID NOT HIRE ENOUGH MERCENARIES!')
26 IF(PLANT-1.0)261,69,69
69 IF(YIELD-2.0)70,71,71
70 WRITE(1,1005)
1005 FORMAT(' A FAMINE HAS STRUCK! ')
71 WRITE(1,105)YIELD
105 FORMAT(' THE HARVEST YIELD WAS',F4.1,' BUSHELLS/ACRE.')
C---- SET UP PASS PARAMETERS.
261 NSTRV=0
MERC=0
KMERC=.FALSE.
NX=.FALSE.
BUSH=1.0E6
WEAT=0.0
IREAT=0
IPPLG=0
C---- COMPUTE INITIAL BUY AND SELL RATES.
NBUY=NMIN+MOD(RAND0,9)
NSELL=NBUY-1
C---- DOES THE FELLA WANNA BUY?
3 WRITE(1,125)NBUY
125 FORMAT(' HOW MANY ACRES DO YOU WISH TO ',
1 'BUY AT',I3,' BUSHELLS/ACRE? ')
READ(1,ERR=3)ICN
CRES=ICN
IF(CRES)3,4,5
5 FLOAT=NBUY
IF(FLOAT*CRES-GRAIN)55,55,72
72 IWARN=IWARN+1
WRITE(1,104)
104 FORMAT(' THERE IS NOT ENOUGH GRAIN!')
GO TO 3
55 IF(ACRES-ACBUY*CRES)73,73,56
73 IF(NX)GO TO 56
C---- HE TRIED TO BUY TOO MUCH. UP HIS PRICE.
WRITE(1,1006)
1006 FORMAT(' SPECULATION INCREASES THE LAND PRICE!')
IWARN=IWARN+1
NBUY=NBUY+1
NX=.TRUE.
GO TO 3
56 ACRES=ACRES+CRES
FLOAT=NBUY
GRAIN=GRAIN-FLOAT*CRES
GO TO 65
C---- DOES HE WANNA SELL?
4 WRITE(1,118)NSELL
118 FORMAT(' HOW MANY ACRES DO YOU WISH TO SELL AT',
2 I3,' BUSHELLS/ACRE? ')
READ(1,ERR=4)ICN
CRES=ICN
IF(ICN)4,65,7
7 IF(ACRES-ACRAT*CRES)74,74,8
74 IF(NX)GO TO 8
C---- THIS IS WHAT HAPPENS IF YOU TRY TO SELL TOO MUCH.
NX=.TRUE.
IWARN=IWARN+1
WRITE(1,1007)
1007 FORMAT(' EXCESSIVE SELLING OF LAND LOWERS THE PRICE!')
NSELL=NSELL-2
GO TO 4
8 IF(CRES-ACRES)88,88,75
75 IWARN=IWARN+1
WRITE(1,106)
106 FORMAT(' THE KINGDOM IS NOT THAT BIG!')
GO TO 4
88 ACRES=ACRES-CRES
FLOAT=NSELL
GRAIN=GRAIN+FLOAT*CRES
65 NPLN=(RAND0/7).AND.3
C---- SEND THE PEASANTS TO WORK PLANTING THE FIELDS.
6 WRITE(1,1008)
1008 FORMAT(' HOW MANY ACRES DO YOU WISH TO PLANT? ')
READ(1,ERR=6)ICN
PLANT=ICN
IF(ICN)6,212,616
616 IF(PLANT-ACRES)10,10,76
76 IWARN=IWARN+1
WRITE(1,106)
GO TO 6
10 IF(PLANT-GRAIN)11,77,77
77 IWARN=IWARN+1
WRITE(1,104)
GO TO 6
11 IF(ICN-IPOP*(IPUT+NPLN))112,78,78
C---- THEY CAN ONLY DO SO MUCH WORK!
78 WRITE(1,1009)
1009 FORMAT(' THAT IS OVERWORKING THE PEASANTS.')
IWARN=IWARN+1
GO TO 6
112 GRAIN=GRAIN-PLANT
IF(LAZY-4)212,79,79
79 LAZY=0
C---- LAZINESS CAN REDUCE THE AMOUNT SOWN.
PLANT=PLANT*PLSTK
ICN=PLANT
WRITE(1,119)ICN
119 FORMAT(' THE LAZY PEASANTS ONLY PLANTED',I5,' ACRES.')
212 IF(RAND0-31000)12,211,211
C---- SOMETIMES THE FIELDS NEED A BOOST. NOT ENOUGH WILL BE BAD.
211 IFERT=(RAND0.AND.3)+1
221 WRITE(1,120)IFERT
120 FORMAT(' HOW MANY BAGS OF FERTILIZER WILL WE BUY AT',I2,
1 ' BUSHELLS EACH? ')
READ(1,ERR=221)ICN
BUSH=ICN*IFERT
IF(BUSH-GRAIN)311,80,80
80 IWARN=IWARN+1
WRITE(1,104)
GO TO 211
311 GRAIN=GRAIN-BUSH
C---- FINALLY, THE PEASANTS MUST BE FED.
12 WRITE(1,1010)
1010 FORMAT(' HOW MANY BUSHELLS DO YOU WISH TO USE AS FOOD? ')
READ(1,ERR=12)ICN
GIVEN=ICN
IF(ICN)12,13,13
13 IF(GIVEN-GRAIN)14,14,81
81 IWARN=IWARN+1
WRITE(1,104)
WRITE(1,1011)
1011 FORMAT(' THEY HAVE BEEN GIVEN ALL THAT REMAINS.')
GIVEN=GRAIN
14 GRAIN=GRAIN-GIVEN
FLOAT=RAND0.AND.0FFH
USER=37.5+AMOD(FLOAT,3.0)
IPOPA=GIVEN/USER
IF(IPOPA-IPOP-3)83,83,82
82 LAZY=LAZY+1
83 IF(IAFFC-110)15,84,84
84 IF(RAND0-26000)15,85,85
C---- OCCASIONALLY THE HUNS ATTACK OUR LITTLE PARADISE.
C---- (ONLY IF IT IS WORTH WHILE.)
85 WRITE(1,1012)
1012 FORMAT(' THE HUNS THREATEN THE KINGDOM!!!')
ICN=IMERC+MOD(NO.AND.0FFFH,7)
17 WRITE(1,121)ICN
121 FORMAT(' HOW MANY MERCENARIES WILL WE HIRE AT',I3,
1 ' BUSHELLS EACH? ')
READ(1,ERR=17)MERC
FLOAT=MERC*ICN
IF(FLOAT-GRAIN)16,16,86
86 IWARN=IWARN+1
WRITE(1,104)
GO TO 17
16 GRAIN=GRAIN-FLOAT
IF(IPOP-MERC*JMERC)15,87,87
C---- NOT ENOUGH MERCENARIES MEANS LOOT & PLUNDER.
87 IWARN=IWARN+1
KMERC=.TRUE.
GRAIN=GRAIN*AMERC
IPOP=IPOP/LMERC+2
C---- FIND OUT WHAT THIS YEAR'S YIELD WILL BE.
15 FLOAT=MOD(RAND0/7,4)
YIELD=WHEAT+FLOAT
C---- A FAMINE CAN STRIKE ONCE EVERY 15 YEARS.
IF(IYR-5)151,89,89
89 IF(RAND0-30000)151,151,90
90 YIELD=1.00001
C---- OR WE MAY NOT HAVE ADEQUATELY FERTILIZED.
151 IF(BUSH-PLANT/5.0)91,92,92
91 YIELD=YIELD/2.0
92 GRAIN=GRAIN+YIELD*PLANT
C---- HATCHED AND DISPATCHED SECTION.
C---- BIRTHS AND NATURAL DEATHS ARE RELATED TO THE AMOUNT
C---- OF GRAIN/PEASANT PROVIDED. STARVATION MAY KNOCK OUT
C---- MORE IF THERE IS INADEQUATE GRAIN.
IBTHS=IPOPA/(NBTHS+(RAND0.AND.7))+2
IDTHS=IPOPA/(NDTHS+(RAND0.AND.3))
NSTRV=IPOP-IPOPA
IF(NSTRV.LT.0)NSTRV=0
IF(NSTRV)19,19,93
93 NOFEED=NOFEED+1
IWARN=IWARN+1
FLOAT=IPOP
GLOAT=NSTRV
IF(FLOAT-STARVE*GLOAT)94,95,95
94 IWARN=IWARN+4
95 IPOP=IPOPA
19 IYR=IYR+1
IPOP=IPOP+IBTHS-IDTHS
C---- THE PLAGUE & THE POX WREAK HAVOC ON THE POPULATION.
IF(RAND0-31000)20,96,96
96 IF(IPOP-25)20,97,97
97 FLOAT=IPOP
IPPLG=FLOAT*PLAGE
IPOP=IPOP-IPPLG
20 IF(RAND0-29000)21,98,98
C---- WHEN THE WEEVILS STRIKE, THEY REALLY STRIKE!
98 WEAT=GRAIN*WEEVILS
GRAIN=GRAIN-WEAT
21 FLOAT=IPOP
IF(GRAIN/FLOAT-RRATE)23,99,99
99 IF(RAND0-27000)23,40,40
C---- TOO MUCH SPARE GRAIN. THE RATS GOT IN.
C---- TOO BAD ABOUT THAT.
40 REAT=GRAIN*REATR
IF(REAT.GT.32700.0)REAT=32700.0
GRAIN=GRAIN-REAT
IREAT=REAT
23 IF(RAND0-31000)32,41,41
C---- A CRISIS HITS THE PEOPLE! THE KING IS KIDNAPPED.
41 WRITE(1,1013)
1013 FORMAT(' THE KING HAS BEEN KIDNAPPED!')
39 WRITE(1,1014)
1014 FORMAT(' HOW MANY BUSHELLS RANSOM WILL WE PAY? ')
READ(1,ERR=39)ICN
RANSOM=ICN
IF(RANSOM-GRAIN)38,38,42
42 IWARN=IWARN+1
WRITE(1,104)
GO TO 39
38 IF(RANSOM-GRAIN*RANRATE)43,43,24
C---- NOT ENOUGH. SLIT HIS THROAT!
43 WRITE(1,1015)
1015 FORMAT(' IT WAS NOT ENOUGH. THE KING IS NO MORE.')
GO TO 1
24 WRITE(1,1016)
1016 FORMAT(' THE KING HAS BEEN RELEASED.')
GRAIN=GRAIN-RANSOM
32 IF(NOFEED-4)2,44,44
C---- AN UPRISING MUST BE AVERTED. MORE FOOD IS THE WAY.
44 WRITE(1,1017)
1017 FORMAT(' THE PEASANTS ARE THREATENING TO REVOLT IF YOU DONT'/
1 ' GIVE THEM MORE FOOD. HOW MUCH WILL YOU GIVE THEM? ')
35 READ(1,ERR=44)ICN
GRNT=ICN
NOFEED=0
FLOAT=IPOP*MOD(RAND0,5)
IF(GRNT-FLOAT)33,45,45
45 IF(GRNT-GRAIN)34,34,46
46 IWARN=IWARN+1
WRITE(1,104)
WRITE(1,1018)
1018 FORMAT(' HOW MUCH MORE WILL YOU GIVE THE PEASANTS? ')
GO TO 35
C---- THE RESULTS DEPEND ON THE MANAGER'S GENEROSITY.
34 WRITE(1,1019)
1019 FORMAT(' THEY ACCEPTED YOUR OFFER.')
GRAIN=GRAIN-GRNT
GO TO 2
33 WRITE(1,1020)
1020 FORMAT(' YOUR MEASLY OFFER ANGERED THE PEASANTS,'/
1 ' SO THEY RAIDED THE GRAIN STORES.')
IWARN=IWARN+1
GRAIN=GRAIN/2.0
GO TO 2
C---- HERE ENDS ALL VICTIMS EVENTUALLY.
510 WRITE(1,1021)(INAME(I),I=1,16)
1021 FORMAT(/1X,16A1/' YOUR MANAGEMENT WAS LOUSY.'/)
IWARN=(RAND0.AND.3)+1
GO TO (511,512,513,514),IWARN
511 WRITE(1,1022)
1022 FORMAT(' YOU HAVE FLED THE COUNTRY .')
GO TO 1030
512 WRITE(1,1023)
1023 FORMAT(' YOU HAVE BEEN HUNG!')
GO TO 1030
513 WRITE(1,1024)
1024 FORMAT(' YOU TOO ARE NOW A PEASANT.')
GO TO 1030
514 WRITE(1,1025)
1025 FORMAT(' YOU NOW RESIDE IN THE DUNGEONS.')
GO TO 1030
1030 WRITE(1,1031)
1031 FORMAT(///' ANOTHER SUCKER FOR THE FINK(YES OR NO)?....')
READ(1)STRING(INAME,1)
IF(INAME(1).EQ.'Y')GO TO 1
STOP
END