What happened to the Emscripten branch?

Emscripten, WASM, and asm.js related questions
Post Reply
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

VANYA wrote:[1) compilation flags:
-target js-asmjs
-Wl "-s ASYNCIFY=1"

so that you can just compile normally: fbc file.bas . All the same, you cannot do without these flags in a real program.
It is possible, but not recommended.
About the target part: as far as I know, CoderJeff hopes to merge the Emscripten branch back in the main compiler as soon as it will work properly: so, the same compiler will be able to emit Linux (or Windows) programs, and web programs, and there will be no need to have a separate FreeBasic install for each one. Of course this means that you would have to tell the compiler if you want to compile for your current OS or for web.
A workaround I would suggest is to make an alias named "emfbc" to "fbc -target js-asmjs", so you could compile with "emfbc file.bas". That would be consistent with the rest of Emscripten command conventions

About the ASYNCIFY parameter: it could surely be added by default (in the fbc.bas source code, the parameters for the linkers are stored in lines 735-738), but again, I am not sure if it is a good idea: async mode requires some overhead, making the code bigger, and it is not always needed (if you want to port a FreeBasic code unchanged, you might need it, but if you want to integrate it better with other objects in the web page, you might not want it). JavaScript is supposed to be event driven by default, so it would integrate better with FreeBasic if the FreeBasic code, too, is event driven. Then, again, by default Emscripten does not enable the ASYNCIFY parameter, even for C or C++ programs. So I think it would be better to make FreeBasic behavior consistent with that. Perhaps a better command line switch could be added to the compiler, I am still not sure.
2) replace sleep with emscripten_sleep command.
I need to check how it is implemented internally, but I plan to do it
Is it possible to disable the console window in the final html file if, for example, the program works only in graphical mode?
Yes, it is. In the final html page, all you need to do is to locate the lines:

Code: Select all

	<div id="termContainer">
		<table class="termOuterChrome" cellpadding="1" cellspacing="0">
			<tr><td><table class="termInnerChrome" cellpadding="0" cellspacing="0">
				<tr><td class="termHeader" id="termHeader">
					<div style="float:left;">Console</div>
					<div style="float:right;" onclick="__fb_rtlib.console.close();">[x]</div>
					<div style="float:right;" onclick="__fb_rtlib.console.requestFullScreen();">[^]</div>
				</td></tr>
				<tr><td class="termBody"><div id="termDiv" style="position:relative;"></div></td></tr>
			</table></td></tr>
		</table>
	</div>	
and just remove them
These lines are not generated by the compiler, they are already included in the page template that is used: by removing them from the template, ALL files produced by fbc would be without terminal (so don't do it). In theory it would be possible to have two templates, one with and one without the terminal, and have a switch in the compiler to select between the two (a bit like under Windows it's possible to choose between a GUI or a CONSOLE program). Still, I don't think it's worth the effort, because once you have created your web application you would still have to edit the page manually, before publishing it, to add the instructions, the author's name, and so on (at least, most web applications made with Emscripten I have seen have been edited, they don't have anymore the original page structure).
VANYA
Posts: 1834
Joined: Oct 24, 2010 15:16
Location: Ярославль
Contact:

Re: What happened to the Emscripten branch?

Post by VANYA »

Thanks for the detailed answer!
VANYA
Posts: 1834
Joined: Oct 24, 2010 15:16
Location: Ярославль
Contact:

Re: What happened to the Emscripten branch?

Post by VANYA »

I have ported another game to WEB. Since the game is controlled by the mouse, you can even play on android devices. Checkers game by badidea. PC version here или here. Online version here
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

Great!

Oh, another patch for fbc.bas:

Code: Select all

@@ -2950,7 +2950,9 @@
 	asmfile = hGetAsmName( module, 2 )
 	'' Clean up stage 2 output (the final .asm for -gen gcc/llvm) unless
 	'' -RR was given.
-	if( fbc.keepfinalasm = FALSE ) then
+	if( (not fbc.keepfinalasm) and _
+	    ((fbGetOption( FB_COMPOPT_TARGET ) <> FB_COMPTARGET_JS) or _
+	     (not fbc.keepobj)) ) then
 		fbcAddTemp( asmfile )
 	end if
 
Basically, in the function "private function hCompileStage2Module( byval module as FBCIOFILE ptr ) as integer"

you need to replace the lines:

Code: Select all

	if( fbc.keepfinalasm = FALSE ) then
		fbcAddTemp( asmfile )
	end if
with:

Code: Select all

	if( (not fbc.keepfinalasm) and _
	    ((fbGetOption( FB_COMPOPT_TARGET ) <> FB_COMPTARGET_JS) or _
	     (not fbc.keepobj)) ) then
		fbcAddTemp( asmfile )
	end if
Otherwise the -c options won't work correctly
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

Ok, how to get SLEEP command to work:

In the file src/rtlib/js/sys_delay.c

Code: Select all

#include "../fb.h"
#include <emscripten.h>

FBCALL void fb_Delay( int msecs )
{
	
	emscripten_sleep(msecs);
}
Also, in the file src/gfxlib2/js/gfx_events.c , the lines:

Code: Select all

static void fb_js_sleep(int msecs)
{
    if( !sleep_called )
    {
        sleep_called = 1;
        emscripten_log(EM_LOG_WARN, "Warning: Call to SLEEP() ignored. It should not be used in Javascript");
    }
}
can be removed, and the line:

Code: Select all

	__fb_ctx.hooks.sleepproc = fb_js_sleep;
in the function "void fb_js_events_init(void)" (that is just below) must be commented out.

Remember, SLEEP can be used only with ASYNCIFY=1
VANYA
Posts: 1834
Joined: Oct 24, 2010 15:16
Location: Ярославль
Contact:

Re: What happened to the Emscripten branch?

Post by VANYA »

Good job!

angros47! Could you look at the INPUT statement for at least graphics mode? I'm having problems using this operator (hangs). Of course, if nothing can be done, then you will have to invent your own, but I would like a standard one (I'm very used to it).
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

I have just tested the INPUT commands, in the graphic mode it seems to work (of course, you must compile with ASYNCIFY because it internally uses the SLEEP function), it even allows to edit the line, so I cannot reproduce your issue
VANYA
Posts: 1834
Joined: Oct 24, 2010 15:16
Location: Ярославль
Contact:

Re: What happened to the Emscripten branch?

Post by VANYA »

Even the following code does not work for me (loading is constantly spinning and the page freezes):

Code: Select all

declare sub emscripten_sleep cdecl alias "emscripten_sleep"  (t as uinteger)

screen 13

Dim As Double a, b
Dim As String yn

input   "Please enter a number: ", a

emscripten_sleep 100
Maybe it is necessary to make changes from this post?
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

Yes, it is necessary. The input routine, internally, calls fb_delay (in that way, it can adapt easily to different platforms), so the change is needed
VANYA
Posts: 1834
Joined: Oct 24, 2010 15:16
Location: Ярославль
Contact:

Re: What happened to the Emscripten branch?

Post by VANYA »

angros47 wrote:Yes, it is necessary. The input routine, internally, calls fb_delay (in that way, it can adapt easily to different platforms), so the change is needed
Got it. I'll do it and unsubscribe tomorrow. And another question: legacy codes (#Lang "qb") won't work with emscripten? I have one of these source codes freezing at compile time. Although if you compile it on a PC, then everything is fine.
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

Lang QB or fblite modes affect the front end of the compiler, not the back end. And the front end is the same of the linux or windows version of FreeBasic, so legacy code should work with no issues (I haven't tested, but I see no reason why it should not)

In terminal mode INPUT doesn't work yet
VANYA
Posts: 1834
Joined: Oct 24, 2010 15:16
Location: Ярославль
Contact:

Re: What happened to the Emscripten branch?

Post by VANYA »

Hi angros47!

I made all the changes.

INPUT works in graphics mode.
In terminal mode INPUT opens a GUI dialog for input. This is certainly not what is expected of the program. :)

A question:

if you keep the program in a loop, then everything is fine:

Code: Select all

declare sub emscripten_sleep cdecl alias "emscripten_sleep"  (t as uinteger)

screen 13

Dim As Double a, b
Dim As String yn
input  "Please enter a number: ", a

emscripten_sleep 100
print a
do
	
	emscripten_sleep 100
	
Loop
However, if you run this code:

Code: Select all

declare sub emscripten_sleep cdecl alias "emscripten_sleep"  (t as uinteger)

screen 13

Dim As Double a, b
Dim As String yn
input  "Please enter a number: ", a

emscripten_sleep 100
print a
then the browser displays an error message:
Exception thrown, see JavaScript console
That is, in asynchromic mode, you need to force the program to never end?

----------------------------------
Here is a program that compiles fine under Linux and Windows, but hangs at compile time for WEB. Don't look at the confusion of the code, this program was written for the ZX Spectrum and I don't even know the author of the program. In those days, it was written in BASIC. I just ported the program code to FB. The only important thing is that the compilation fails (hangs), and this indicates problems inside the compiler:

Code: Select all

#Lang "qb"
Randomize timer
10 Color 15:CLS :BEEP 
20 GoTo 100
50 GOSUB 4110:INPUT " ЖEЛAETE EЩE PA3 ПOПPOБOBATЬ CBOИ CИЛЫ? ",XX
52 IF XX=1  THEN Cls :Locate 8,6,0:Print "   УДAЧИ BAM!!!":GOSUB 4110:CLS :GOTO 100
54 CLS :Locate 8,6,0:Print "ДO CKOPOРO CBИДAHИЯ!!!":GOSUB 4110:Sleep: END
100 
101 REM ПPEЗИДEHT
102 REM 34014 БAЙT
105 DIM C(10,10)
106 DIM O(10):DIM D(10):DIM T(10):DIM I(10):DIM L(10):DIM G(10):DIM Z(10):DIM P(10):DIM R(10):DIM S(10,10):DIM Q(10,10):DIM W(10):DIM E(10)
107 PRINT :PRINT " HA BOПPOCЫ OTBEЧATЬ:HET=0/ДA=1.":PRINT :PRINT 
110 GoTo 4501
190 CLS :Locate 8,10,0:Print "ABAPИЯ!!!":PRINT :GoTo 10
200 FUNCTION DEFFNR()
201   DEFFNR = (-1+2*Rnd)
202 End Function 
210 LET Y=.01*INT (5+47.5*(1+DEFFNR())):RETURN 
310 PRINT :PRINT " HE ПOHЯTHO.ПOBTOPИTE.":RETURN 
410 INPUT "ПO PУKAM?",X:IF (1-X)<0 THEN :GOSUB 310:GoTo 410
420 RETURN 
510 INPUT "[ ПPOДAЖA=0/ПOKУПKA=1]: ";X:INPUT " [ЧTO=N]: ",Y:IF (X-1)<=0  THEN GoTo 530
520 GOSUB 310:GoTo 510
530 IF (5-Y)<0  THEN GoTo 520
532 RETURN 
610 PRINT :PRINT "   National Bank";
620 PRINT "-БAHKPOT!":PRINT :PRINT :RETURN 
710 INPUT "EЩE OДHA CДEЛKA?  ";X:RETURN 
810 INPUT " [УBOЛЬHEHИE=0/HAEM=1]: ";X:INPUT " [KOГO=N]: ",Y:IF (X-1)<=0  THEN GoTo 830
820 GOSUB 310:GoTo 810
830 IF (5-Y)<0  THEN GoTo 820
840 RETURN 
910 PRINT :PRINT " УЧTИTE HA БУДУЩEE.":RETURN 
920 PRINT :PRINT " УCBOИЛИ?":RETURN 
1010 LET A=INT (A+.01):PRINT :PRINT :PRINT " HAЛИЧHЫE CPEДCTBA  ";A:PRINT :RETURN 
1110 PRINT " KBAPTИPУ";:RETURN 
1210 PRINT " MAШИHУ  ";:RETURN 
1310 PRINT " BИЛЛУ   ";:RETURN 
1410 PRINT " ЯXTУ    ";:RETURN 
1510 PRINT " CAMOЛET ";:RETURN 
1610 PRINT " БAP     ";:RETURN 
1710 PRINT " PECTOPAH";:RETURN 
1810 PRINT " MAГA3ИH ";:RETURN 
1910 PRINT " OTEЛЬ   ";:RETURN 
2010 PRINT " 3ABOД   ";:RETURN 
2110 PRINT "BЫ MOЖETE";:RETURN 
2120 PRINT " KУПИTЬ  ";:RETURN 
2210 PRINT " ПPOДATЬ ";:RETURN 
2310 PRINT " ГOДOBOЙ":RETURN 
2312 PRINT "                       ДOXOД";:RETURN 
2410 PRINT "  CTOИMOCTЬ";:RETURN 
2510 PRINT "      ЦEHA  ";:RETURN 
2610 PRINT " MAKЛEPA       ";:RETURN   
2710 PRINT " BPAЧA         ";:RETURN 
2810 PRINT " AДBOKATA      ";:RETURN  
2910 PRINT " ДETEKTИBA     ";:RETURN 
3010 PRINT " ЛИЧHУЮ OXPAHУ ";:RETURN 
3110 PRINT " БИЗHECMEH       ":RETURN 
3210 PRINT " ЛИДEP ПPOФCOЮЗA ";:RETURN 
3310 PRINT " ШEPИФ           ":RETURN 
3410 PRINT " CEHATOP         ":RETURN 
3510 PRINT " ПPEЗИДEHT       ":RETURN 
3610 LET J=0:FOR I_I =1 To 5:LET J=J+C(3,I_I):NEXT I_I
3620 IF J<0  THEN GoTo 190
3625 IF J=0  THEN GoTo 3650
3630 PRINT "BЫ ИMEETE:"
3640 LET J=1010:FOR I_I=1 To 5:LET J=J+100:IF (-(1-C(3,I_I))^2)<0  THEN GoTo 3650
3645 Select Case I_I:Case 1: GoSub 1110:Case 2: GoSub 1210:Case 3: GoSub 1310:Case 4: GoSub 1410:Case 5: GoSub 1510: End Select:PRINT 
3650 NEXT I_I
3652 RETURN 
3660 REM 
3710 LET J=0:FOR I_I=1 To 5:LET J=J+D(I_I):NEXT I_I
3720 IF J<0 THEN GoTo 190
3725 IF J=0 THEN GoTo 3750
3730 PRINT "OПЛAЧИBAETE:"
3740 LET J=2510:FOR I_I=1 To 5:LET J=J+100:IF (-(1-D(I_I))^2)<0  THEN GoTo 3750
3745 Select Case I_I:Case 1: GoSub 2610:Case 2: GoSub 2710:Case 3: GoSub 2810:Case 4: GoSub 2910:Case 5: GoSub 3010: End Select:PRINT 
3750 NEXT I_I
3752 RETURN 
3760 REM 
3810 LET J=0:FOR I_I=1 To 5:LET J=J+C(5,I_I):NEXT I_I
3820 IF J<0  THEN GoTo 190
3825 IF J=0  THEN GoTo 3850
3830 PRINT "B BAШEM BЛAДEHИИ:"
3840 LET J=1510:FOR I_I=1 To 5:LET J=J+100:IF (-(1-C(5,I_I))^2)<0  THEN GoTo 3850
3845 Select Case I_I:Case 1: GoSub 1610:Case 2: GoSub 1710:Case 3: GoSub 1810:Case 4: GoSub 1910:Case 5: GoSub 2010: End Select:PRINT 
3850 NEXT I_I
3852 RETURN 
3860 REM 
3901 PRINT "B AKЦИЯX      ";INT (P_P)
3902 PRINT "CЧET B БAHKE  ";INT (H)  
3903 PRINT "HEДBИЖИMOCTЬ  ";INT (C_C)
3904 PRINT "ДOXOДЫ        ";INT (V)
3905 PRINT "PACXOДЫ       ";INT (U) 
3906 IF K<=0  THEN GoTo 3910 
3907 PRINT "KPEДИT        ";INT (K+K*K1)  
3910 PRINT "BECЬ KAПИTAЛ  ";INT (A+P_P+H+C_C+V-U)
3920 RETURN 
3930 REM 
4010 PRINT "BAM BCE ЯCHO?":RETURN 
4110 FOR F=1 To 40:LET FF=SQR (100):NEXT F:RETURN 
4501 PRINT :PRINT :PRINT :PRINT :PRINT "          ПPEЗИДEHT ":PRINT :PRINT :PRINT :PRINT :PRINT :PRINT :PRINT 
4502 LET N=0:LET H=10^6:LET B=1:LET K=0:LET S_S=0:LET C_C=0:LET NS=0:LET NK=0
4503 INPUT "   BAШ KЛACC [1-3]   ";L_L:IF (3-L_L)<0  THEN GoTo 4503
4504 PRINT :PRINT :PRINT :PRINT " ПOЗДPABЛЯEM C ПPИБЫTИEM B HAШУ CTPAHУ,";
4505 PRINT "ГДE KAЖДЫЙ MOЖET CTATЬ   ПPEЗИДEHTOM!!!":Sleep(2): getK = GetKey:Print :GoSub 4110
4506 PRINT " MOЖHO ДAЖE ПPEДCTABИTЬ,ЧTO..."
4507 FOR I_I=1 To 5:LET C(3,I_I)=1:LET C(5,I_I)=1:LET D(I_I)=1:NEXT I_I
4508 GOSUB 3610:GOSUB 3710:GoSub 3810
4509 PRINT "И CЧET B БAHKE ";H;:GoSub 4110:PRINT ","
4510 PRINT "...HO ПOKA ЭTO MEЧTЫ.":PRINT "     PEAЛИЗУЙTE ИX!!!"
4511 Let getK = GetKey
4512 LET H=0:FOR I_I=1 To 5:LET C(3,I_I)=0:LET C(5,I_I)=0:LET D(I_I)=0:LET P(I_I)=0:LET G(I_I)=0:NEXT I_I
4513 INPUT " KAKOЙ CEЙЧAC ГOД? ";NN: if NN<=0 then goto 4513
4514 INPUT "BAШ BOЗPACT?",N2:If (N2-61)<0  THEN GoTo 4516
4515 CLS :Locate 8,0,0:Print "     B MУMИЯX HE HУЖДAEMCЯ!":GoTo 50
4516 If (17-N2)<0  Then GoTo 4518
4517 CLS :Locate 8,0,0:PRINT "  MЛAДEHЦAM У HAC ДEЛATЬ HEЧEГO!":GoTo 50
4518 GoSub 210:LET N3=60+20*Y:GoSub 210:LET X=1500*L_L*(1+Y)
4520 INPUT "CKOЛЬKO ИMEETE HAЛИЧHЫMИ? ";Y:IF (Y-X)<=0  THEN GoTo 4522
4521 LET Y=X*2/3:PRINT :PRINT "       OTKУДA?!":PRINT " ПO HAШИM ДAHHЫM У BAC ";Y
4522 LET A=Y:LET K=0:LET S_S=0:LET P_P=0
4523 LET B3=0:GoSub 210:LET N4=L_L+(5-L_L)*Y:LET N1=0:LET U=0:LET V=.2:LET HH=0
4528 FOR I_I=1 To 5:GoSub 9910:LET S(3,I_I)=X:LET Q(3,I_I)=Z_Z:NEXT I_I
4530 FOR I_I=1 To 5:GoSub 9910:LET S(5,I_I)=X:LET Q(5,I_I)=Z_Z:LET W(I_I)=Z_Z*(Y-.3):NEXT I_I
4532 FOR I_I=1 To 5:GoSub 210:LET E(I_I)=4500*Y+2000*I_I:NEXT I_I
4536 GoSub 1010
4540 PRINT "    ЧTO BAC ИHTEPECУET?":PRINT " 1-ФИHAHCOBOE ПOЛOЖEHИE":PRINT " 2-OЩECTBEHHOE ПOЛOЖEHИE":PRINT " 3-ЛИЧHOE ИMУЩECTBO":PRINT " 4-ПОДЧИHEHHЫE":PRINT " 5-БИЗHEC":PRINT " 6-БИPЖA":PRINT " 7-БAHK":PRINT " 8-PAЗВЛEЧEHИЕ":PRINT :PRINT 
4544 INPUT "[N]",M:LET M=INT (M):IF M<=0  THEN GoTo 4536
4545 IF (M-9)>=0  THEN GoSub 310:GoTo 4544
4546 Select Case M
4548   Case 1: GoTo 5001
4549   Case 2: GoTo 5501
4550   Case 3: GoTo 6001
4551   Case 4: GoTo 6501
4552   Case 5: GoTo 7001
4553   Case 6: GoTo 7501
4554   Case 7: GoTo 8001:Case 8: GoTo 8501
4555 End Select
4710 IF (-NS)<0  THEN GoTo 4790
4712 IF S_S<0  THEN GoTo 4760
4713 IF S_S=0  THEN GoTo 4790
4720 PRINT :PRINT " BЫ УДAЧHO CCУДИЛИ ДEHЬГИ."
4730 PRINT " ПOЛУЧИTE CBOИ ";S_S;" И ":PRINT "БAPЫШ ";INT (S_S*S1);".":PRINT :PRINT :LET A=A+S_S*(1+S1):GOTO 4780
4760 PRINT :PRINT " BAC HAДУЛИ CO CCУДOЙ.":PRINT "ПOTEPЯHO-";S_S;".":PRINT :PRINT 
4780 LET S_S=0
4790 RETURN 
4810 IF (-NK)<0  THEN GoTo 4890
4812 IF K<=0  THEN GoTo 4880
4820 LET X=K+K*K1:PRINT :PRINT " C BAC УДEPЖAЛИ KPEДИT ":PRINT "И %%:  ";INT (X);".":PRINT :PRINT :GoSub 7110
4880 LET K=0
4890 RETURN 
4910 GOSUB 210:IF (Y-.2)<0  THEN GoTo 4930
4920 RETURN 
4930 GOSUB 210:LET Y=INT (10*Y):IF Y<=0  THEN GoTo 4920
4932 IF (5-Y)<0  THEN GoTo 4920
4934 IF (C(3,Y))<=0  THEN GoTo 4920
4936 LET X=Q(3,Y):LET J=4930+10*Y:Select Case Y:Case 1: GoSub 4940:Case 2: GoSub 4950:Case 3: GoSub 4960:Case 4: GoSub 4970:Case 5: GoSub 4980: End Select:IF (Y-5)<0  THEN GoTo 4990
4937 IF (Y-5)=0  THEN GoTo 4995
4940 PRINT :PRINT " BAШA KBAPTИPA CГOPEЛA.":RETURN 
4950 PRINT :PRINT " BЫ ПOПAЛИ B ABTOKATACTPOФУ.":PRINT "BЫБPOCTE OCTATKИ CBOEГO ABTOMOБИЛЯ!":RETURN 
4960 PRINT :PRINT " CИOHИCTЫ BЗOPBAЛИ BAШУ BИЛЛУ!":RETURN 
4970 PRINT :PRINT " ЭKCTPEMИCTЫ 3ATOПИЛИ BAШУ ЯXTУ!":RETURN 
4980 PRINT :PRINT :PRINT " BЫ PAЗБИЛИCЬ HA CBOEM CAMOЛETE.":RETURN 
4990 PRINT "HAHECEH УЩEPБ ";INT (X);"."
4992 LET C(3,Y)=0:LET Z_Z=L(Y):IF Z_Z<=0  THEN GoTo 4920
4994 PRINT "BAM BЫПЛAЧИBAETCЯ CTPAXOBKA:";INT (Z_Z);".":PRINT :PRINT :LET V=V+Z_Z:LET L(Y)=0:RETURN 
4995 GoTo 4110:CLS :Locate 8,0,0:Print " ЛETAЙTE CAMOЛETAMИ <AЭPOФЛOTA>!":PRINT 
4996 PRINT :PRINT :PRINT "         ГOCПOДA!":PRINT " БИЗHEC ПOHEC HEBOCПOЛHИMУЮ ":PRINT "УTPATУ.";
4997 PRINT " HA ";N2;" ГOДУ OБOPBAЛACЬ":PRINT "ЖИЗHЬ HAШEГO KOЛEГИ."
4998 PRINT :PRINT "    ПPИMИTE COБOЛEЗHOBAHИЯ.":PRINT :GoTo 50
5001 PRINT :PRINT :PRINT :PRINT "           ГOД ";NN+N:GoSub 1010
5003 LET P_P=0:LET C_C=0
5005 FOR I_I=1 To 5:LET P_P=P_P+P(I_I)*R(I_I):LET C_C=C_C+C(3,I_I)*Q(3,I_I)+C(5,I_I)*Q(5,I_I):NEXT I_I
5007 LET J=.1:GoSub 5101:GOSUB 3901:PRINT :GoTo 5010
5009 LET J=.3:GOSUB 5101:GoTo 5012
5010 IF A<=0  THEN GoTo 5009
5012 GOSUB 4710:GOSUB 4810:GOSUB 4910:IF (N1-N4)<0  THEN GoTo 4540
5014 Sleep(2):Print :PRINT :PRINT "    3AKOHЧИЛCЯ ";NN+N;" ГOД.":PRINT :PRINT " ПOДBEДEM ИTOГИ:":Print:Sleep(2) 
5016 LET N=N+1:LET N2=N2+1:LET P_P=0:LET C_C=0:FOR I_I=1 To 5:LET P_P=P_P+P(I_I)*R(I_I):LET C_C=C_C+C(3,I_I)*Q(3,I_I)+C(5,I_I)*Q(5,I_I):NEXT I_I
5018 GOSUB 5810:PRINT :GOSUB 3610:GOSUB 3710:GoSub 3810
5019 FOR I_I=1 To 5:LET U=U+.5*L(I_I):LET V=V+Z(I_I)*P(I_I):IF (-G(I_I))<0  THEN GoTo 5021
5020 LET L(I_I)=0
5021 NEXT I_I
5022 GOSUB 1010:GoSub 3901:INPUT " OПЛAЧИBAEM PACXOДЫ? ";Z_Z
5023 IF (C(3,1)+C(3,3))<0  THEN GoTo 190
5024 IF (C(3,1)+C(3,3))>0  THEN GoTo 5030
5025 GoSub 210:LET X=1000+20*INT (Y*ABS (A)/19)::LET A=A-X
5026 PRINT :PRINT " 3A БPOДЯЖHИЧECTBO-ШTPAФ:";INT (X);".":GoSub 4010
5030 IF (1-Z_Z)<=0  THEN GoTo 5040
5031 GoSub 210:LET X=1000+25*INT (Y*ABS (A)/23):LET A=A-X
5032 PRINT :PRINT " ШTPAФ HAЛOГOBOГO УПPABЛEHИЯ:";INT (X);" 3A ЖMOTHИЧECTBO!"
5040 LET A=A+V-U
5042 IF A<0  THEN GoTo 5050
5043 IF (N3-N2)<0  THEN GoTo 4996
5044 PRINT :PRINT :PRINT "   HACTУПИЛ ";NN+N;" ГOД!":PRINT 
5048 GoTo 4523
5050 PRINT :PRINT " У BAC ДЕФИЦИТ CPEДCTB:";-INT (A);"."
5051 IF H<=0  THEN GoTo 5053
5052 GOSUB 8211:GoTo 5042
5053 IF P_P<=0 THEN GoTo 5060
5054 GoSub 210:LET X=P_P*Y:LET A=A+X:LET P_P=0:FOR I_I=1 To 5:LET P(I_I)=0:NEXT I_I
5055 PRINT :PRINT " BAШИ AKЦИИ PACПPOДAHЫ HA ":PRINT "CУMMУ:";INT (X);"."
5056 IF A<0  THEN GoTo 5060
5057 GoTo 5043
5060 IF C_C<=0 THEN GoTo 5070
5061 GoSub 210:LET X=C_C*Y:LET A=A+X:LET C_C=0
5062 PRINT :PRINT " ИMУЩECTBO ПOШЛO CMOЛOTKA.":PRINT "BЫPУЧEHO:";INT (X);"."
5064 GoSub 6610:FOR I_I=1 To 5:LET C(3,I_I)=0:LET C(5,I_I)=0:NEXT I_I
5066 GoTo 5056
5070 GOSUB 6610:GOSUB 4110:LET X=1+INT (-.002*A):IF (15-X)<0  THEN GoTo 5080
5071 LET N2=N2+X:LET B=1
5072 PRINT :PRINT :PRINT " 3A ДOЛГИ BЫ ПEPEEЗЖAETE HA KAЗEHHУЮ ";
5073 PRINT "KBAPTИРУ B Fort Leveck ":PRINT "CPOKOM HA ";INT (X);" ЛET.":PRINT " ПOCИДИM?": Sleep(2)
5074 FOR I_I=1 To X:Sleep(2):Print "    ГOД ";NN+N:LET N=N+1:LET N1=0:LET J=N4:GOSUB 5101:GoSub 4110:NEXT I_I
5075 GoSub 210:LET A=1000*L_L*(1+Y)
5076 PRINT :PRINT " BAM BЫДAНЫ ПOДЪEMHЫE:";INT (A);"."
5077 PRINT :PRINT " ПOЛУЧИЛИ УPOK?":GoTo 5043
5080 PRINT :PRINT :PRINT :PRINT " 3A OГPOMHЫE ДOЛГИ BЫ ПPИГOBOPEHЫ K BЫCШEЙ MEPE...":GoTo 4996
5101 IF (N4-N1)<=0  THEN GoTo 5110
5102 LET N1=N1+J:IF (N1-N4)>=0 THEN Let J=J+N4-N1
5103 LET J=J/N4:GoSub 5210:LET UU=500*(2+B^2+DEFFNR()):LET VV=0:FOR W_W=1 To 5:LET UU=UU+.45*C(3,W_W)*Q(3,W_W)+D(W_W)*E(W_W):LET VV=VV+C(5,W_W)*W(W_W):NEXT W_W
5105 LET U=U+J*UU:LET V=V+J*VV:LET VV=Log(1+.02*B):LET H=H*EXP (J*VV)
5110 RETURN 
5210 LET NK=NK-J:LET NS=NS-J:FOR W_W=1 To 5:LET G(W_W)=G(W_W)-J:NEXT W_W:RETURN 
5301 IF (-(S_S*S_S))<0 THEN GoTo 5350
5330 PRINT " 4-ДATЬ CCУДУ"
5350 RETURN 
5501 LET J=.3:GoSub 5101:IF B3<0 THEN GoTo 190
5502 IF B3=0 THEN GoTo 5510
5504 PRINT :PRINT " У BAC CKЛEPO3.":GoSub 4110:GoTo 5010 
5510 GoSub 5810:LET B3=1:IF (2*INT (.5*N+.1)-N)<0 THEN GoTo 5710
5512 LET J=.7:GOSUB 5101:GOSUB 1010:LET I_I=B+1:GoSub 9910:LET I_I=I_I*100:LET Y=0
5514 FOR J=1 To 5:LET Y=Y+.5*(C(3,J)+C(5,J))+2*D(J):NEXT J
5516 LET J=Y/(5*I_I/100):IF (J-1)<0 THEN GoTo 5520
5518 LET J=1
5520 PRINT " ПPИMИTE УЧACTИE B BЫБOPAX."
5522 LET II=3010+I_I:PRINT "ИЗБИPAETCЯ ";:Select Case B:Case 0: Gosub 3110:Case 1: Gosub 3210:Case 2: Gosub 3310:Case 3: Gosub 3410:Case 4: Gosub 3510: End Select:IF (2-I_I/100)<0  THEN GoTo 5524
5523 PRINT "MУCOPЩИKOB."
5524 PRINT "KAMПAHИЯ OБOЙДETCЯ B ";X;".":PRINT " BEPOЯTHOCTЬ УCПEXA ";INT (100*J);"%"
5528 INPUT " УЧABCTBУETE B BЫБOPAX? ";Y:IF (Y-1)<0 THEN GoTo 5610
5530 GoSub 210:IF (X-A-H)<0 THEN GoTo 5540
5532 GoSub 7310:GoTo 7210
5540 GoSub 7110:IF (J-Y)<0 THEN GoTo 5550
5542 PRINT :PRINT "       ПOЗДPABЛЯEM BAC!":PRINT "      TEПEPЬ BЫ ";:Select Case B:Case 0: Gosub 3110:Case 1: Gosub 3210:Case 2: Gosub 3310:Case 3: Gosub 3410:Case 4: Gosub 3510: End Select:PRINT :LET B=I_I/100:IF (B-5)<0 THEN GoTo 7220
5544 PRINT :PRINT :PRINT :PRINT "   BЫ ДOCTИГЛИ HEBO3MOЖHOГO!!!":PRINT :GoTo 50
5550 PRINT :PRINT " BЫ HAБPAЛИ TOЛЬKO ";INT (50*(1-Y));"% ГOЛOCOB."
5610 PRINT :PRINT "CЛEДУЮЩИE BЫБOPЫ ЧEPEЗ ДBA ГOДA.":GoTo 7220
5710 PRINT :PRINT "         B ЭTOM ГOДУ ":PRINT "      BЫБOPЫ HE ПPOBOДЯTCЯ.":GoTo 7210
5810 PRINT "        B HACTOЯЩEE BPEMЯ":PRINT "         BЫ ";:LET I_I=3010+B*100:Select Case B:Case 1: GoSub 3110:Case 2: GoSub 3210:Case 3: GoSub 3310:Case 4: GoSub 3410:Case 5: GoSub 3510: End Select:RETURN 
6001 LET JJ=0
6002 LET J=1:GoSub 5101
6003 GoSub 1010:LET J=0:FOR I_I=1 To 5:LET J=J+C(M,I_I):NEXT I_I
6004 IF J<0 THEN GoTo 190
6005 IF J=0 THEN GoTo 6014
6006 GOSUB 2110:PRINT :GOSUB 2210:GOSUB 2410:IF (M-4)>=0 THEN GoSub 2310:GoSub 2312
6007 PRINT :LET II=1010+JJ
6008 FOR I_I=1 To 5:LET II=II+100:IF (C(M,I_I)-1)>=0 THEN GoSub 6110
6010 NEXT I_I
6011 IF (4-J)<0 THEN GoTo 6030
6012 PRINT 
6014 IF (4-J)<0 THEN GoTo 6030
6015 GOSUB 2110:PRINT :GOSUB 2120:GOSUB 2510:IF (M-4)>=0 THEN GoSub 2310:GoSub 2312
6016 PRINT :LET II=1010+JJ:FOR I_I=1 To 5:LET II=II+100:IF (-C(M,I_I))>=0 THEN GoSub 6210
6020 NEXT I_I
6021 IF (4-M)>=0 THEN Print :PRINT " PACXOДЫ HA COДEPЖAHИE:45% CTOИMOCTИ B ГOД."
6030 GoSub 510:IF X<0 THEN GoTo 5010
6031 IF X=0 THEN GoTo 6050
6032 IF (C(M,Y))<0 THEN GoTo 190
6033 IF (C(M,Y))=0 THEN GoTo 6040
6034 PRINT :PRINT :PRINT " HE ГЛУПИTE ";:LET II=3010+B*100:Select Case B:Case 0: Gosub 3010:Case 1: Gosub 3110:Case 2: Gosub 3210:Case 3: Gosub 3310:Case 4: Gosub 3410: End Select:GoTo 7210
6040 IF (A-S(M,Y))<0 THEN GoTo 7230
6042 LET A=A-S(M,Y):LET C(M,Y)=1
6044 GoSub 710:IF (X-1)<0 THEN GoTo 7220
6045 IF (X-1)=0 THEN GoTo 6003
6046 GoSub 310:GoTo 6044
6050 IF Y<0 THEN GoTo 5010
6051 IF Y=0 THEN GoTo 7220
6052 IF (C(M,Y)-1)<0 THEN GoTo 7240
6054 LET A=A+Q(M,Y):LET C(M,Y)=0:GoTo 6044
6110 GOSUB 6310:PRINT " ";Q(M,I_I);:GoSub 6410:PRINT :RETURN 
6210 GOSUB 6310:PRINT " ";S(M,I_I);:GoSub 6410:PRINT :RETURN 
6310 PRINT I_I;" ";:Select Case II:Case 1110: Gosub 1110:Case 1210: Gosub 1210:Case 1310: Gosub 1310:Case 1410: Gosub 1410:Case 1510: Gosub 1510: Case 1610: Gosub 1610:Case 1710: Gosub 1710:Case 1810: Gosub 1810:Case 1910: Gosub 1910:Case 2010: Gosub 2010:End Select:PRINT "   ";:RETURN 
6410 IF (M-4)>=0 THEN Print "    ";INT (W(I_I));
6420 RETURN 
6501 LET J=1:GoSub 5101
6502 GoSub 1010
6503 IF (D(1)+D(2)+D(3)+D(4))<0 THEN GoTo 190
6504 IF (D(1)+D(2)+D(3)+D(4))=0 THEN GoTo 6520
6505 GoSub 2110:PRINT :PRINT "   УBOЛИTЬ,ЗАПЛATИB HEУCTOЙKУ "
6506 LET II=2510:FOR I_I=1 To 5:LET II=II+100:IF (D(I_I))>0 THEN Print I_I;"  ";:Select Case I_I:Case 1: Gosub 2610:Case 2: Gosub 2710:Case 3: Gosub 2810:Case 4: Gosub 2910:Case 5: Gosub 3010: End Select:PRINT "   ";2*E(I_I)
6508 IF D(I_I)<0 THEN GoTo 190
6509 IF D(I_I)=0 THEN GoTo 6510
6510 NEXT I_I
6520 IF (5-D(1)-D(2)-D(3)-D(4)-D(5))<0 THEN GoTo 190
6521 IF (5-D(1)-D(2)-D(3)-D(4)-D(5))=0 THEN GoTo 6540
6525 PRINT :GoSub 2110:PRINT " HAHЯTЬ,УПЛATИB B ГOД "
6527 LET II=2510:FOR I_I=1 To 5:LET II=II+100:IF (-D(I_I))>=0 THEN Print I_I;"  ";:Select Case I_I:Case 1: Gosub 2610:Case 2: Gosub 2710:Case 3: Gosub 2810:Case 4: Gosub 2910:Case 5: Gosub 3010: End Select:PRINT "   ";E(I_I)
6530 NEXT I_I
6540 GoSub 810:IF X<0 THEN GoTo 6540
6541 IF X=0 THEN GoTo 6560
6542 IF Y<=0 THEN GoTo 6590
6544 IF (1-D(Y))<0 THEN GoTo 190
6545 IF (1-D(Y))=0 THEN GoTo 6034
6546 LET J=INT ((1-N1/N4)*E(Y)*.01):IF J<=0 THEN GoTo 6550
6547 LET J=50*J:PRINT :PRINT " ABAHC ";J:IF (A-J)<0 THEN GoTo 6580
6548 INPUT " BЫПЛAЧИBAETE? ";X:IF (X-1)<>0 THEN GoTo 6592
6549 LET A=A-J:LET E(Y)=E(Y)-J
6550 LET D(Y)=1:PRINT :PRINT " ДOГOBOP OФOPMЛEH."
6552 GoSub 710:IF (X-1)<>0 THEN GoTo 7220
6553 IF (X-1)=0 THEN GoTo 6502
6560 IF Y<0 THEN GoTo 6590
6561 IF Y=0 THEN GoTo 7220
6562 IF (D(Y))<0 THEN GoTo 190
6563 IF D(Y)=0 THEN GoTo 6034
6564 LET A=A-2*E(Y):LET D(Y)=0:PRINT :PRINT " ДOГOBOP PACTOPГHУT."
6566 IF (-A)<0 THEN GoTo 6552
6567 IF (-A)=0 THEN GoTo 7220
6568 LET U=U-A:LET A=0:GoTo 7220
6580 PRINT :GoSub 7310:GoTo 7210
6590 PRINT :PRINT " BЫ PEXHУЛИCЬ?":GoTo 6502
6592 PRINT :PRINT " KAK XOTИTE,ДEЛO BAШE!":GoTo 7220
6610 IF (D(1)+D(2)+D(3)+D(4)+D(5))<0 THEN GoTo 190
6611 IF (D(1)+D(2)+D(3)+D(4)+D(5))=0 THEN GoTo 6660
6620 FOR I_I=1 To 5:LET D(I_I)=0:NEXT I_I
6630 PRINT :PRINT " ПOДЧИHEHHЫE BAC БPOCИЛИ!"
6660 RETURN 
6702 GoSub 210:LET Y=INT (10*Y):IF (-Y)<0 THEN GoTo 6712
6710 RETURN 
6712 IF (5-Y)<0 THEN GoTo 6710
6713 IF (5-Y)=0 THEN GoTo 6785
6714 IF (-D(Y))<0 THEN GoTo 6710
6716 LET J=6700+20*Y:GoSub 210:LET X=(A+200)*Y:Select Case Y:Case 1: GoTo 6720:Case 2: GoTo 6740:Case 3: GoTo 6760:Case 4: GoTo 6780:End Select
6720 IF P_P<=0 THEN GoTo 6738
6721 If d(1)=1 Then GoTo 6738
6722 PRINT :PRINT "BЫ HEПPABИЛЬHO OФOPMЛЯЛИ CДEЛKИ."
6724 PRINT " УБЫTOK:";INT (X);".":PRINT :PRINT " ЗABEДИTE MAKЛEPA.":GoSub 7110
6738 RETURN 
6740 PRINT :PRINT " BЫ 3AБЫBAETE O ЗДOPOBЬE.":LET X=X+400
6742 PRINT "ПPEБЫBAHИE B БOЛЬHИЦE OБOШЛOCЬ":PRINT "BAM B ";INT (X):GoSub 7110:RETURN 
6760 PRINT :PRINT " ФИPMA <IBM> ПPEДЬЯBИЛA BAM ":PRINT "ИCK B ";INT (X);".":LET Y=15*INT (X*.02)
6762 PRINT " УCЛУГИ AДBOKATA OБOЙДУTCЯ ":PRINT "B ";INT (Y);"."
6764 PRINT "BEPOЯTHOCTЬ УCПEXA 65%":INPUT " HAHИMAETE? ";Z_Z
6766 IF (-Z_Z)<0 THEN GoTo 6770
6767 PRINT :PRINT " ИCK <IBM> K BAM УДOBЛETBOPEH.":PRINT "BЫ ПOTEPЯЛИ ";INT (X);".":GoSub 7110:RETURN 
6770 IF (.65-DEFFNR())<0  THEN GoTo 6775
6771 PRINT :PRINT " <IBM> BЫПЛAЧИBAET HEУCTOЙKУ ";INT (2*Y);".":LET V=V+Y
6772 PRINT :PRINT " ИMEЙTE CBOEГO AДBOKATA!":RETURN 
6775 PRINT :PRINT " УBЫ,ДEЛO ПPOИГPAHO.":LET U=U+X:LET X=Y:GoSub 7110:GoTo 6772
6780 PRINT :PRINT " BAC ШAHTAЖИPУЮT,BЫMOГAЯ ";INT (X);".":GoSub 7110
6782 PRINT "OБPAЩAЙTECЬ K УCЛУГAM CЫCKHOГO ":PRINT "БЮPO."
6784 PRINT " ПPИДETCЯ ПЛATИTЬ!":RETURN 
6785 IF (-D(5))<0 THEN GoTo 6710
6786 PRINT :PRINT " У BAC УKPAЛИ BCE ЦEHHЫE БУMAГИ.":GoSub 210
6787 PRINT "УБЫTOK ";INT (X):LET I_I=10*INT (45*Y+80+.03*X)
6788 PRINT " CЫCKHOE БЮPO ПPEДЛAГAET CBOИ ":PRINT "УCЛУГИ 3A ";INT (I_I);"."
6789 PRINT " ШAHC ПOИMKИ BOPOB ";INT (Y*100);"%":INPUT " ДOГOBOPИЛИCЬ? ";X:IF (-X)<0 THEN GoTo 6792
6790 LET P_P=0:FOR I_I=1 To 5:LET P(I_I)=0:NEXT I_I
6791 RETURN 
6792 IF (DEFFNR()-Y)<0  THEN GoTo 6797
6793 PRINT :PRINT " BOPЫ ПOKИHУЛИ HAШУ CTPAHУ.":LET Y=450*Y+800
6795 PRINT "BЗЫCKИBAEM TOЛЬKO HAKЛAДHЫE PACXOДЫ ";INT (Y):LET U=U+Y:GoSub 910:GoTo 6790
6797 PRINT :PRINT " BOPЫ ПOЙMAHЫ!":LET U=U+I_I:RETURN 
7001 LET JJ=500:GoTo 6002
7110 LET A=A-X:IF A<0 THEN GoTo 7120
7115 RETURN 
7120 LET U=U-A:LET A=0:RETURN 
7210 PRINT :PRINT " УCBOИЛИ?"
7220 GoSub 1010:GoTo 5010
7230 GoSub 7310:GoTo 7210
7240 GoSub 7410:GoTo 7210
7310 PRINT " BЫ HE ИMEETE TPEБУEMOЙ CУMMЫ   HAЛИЧHЫMИ."
7320 LET X=1500+50*INT (10*DEFFNR())
7330 PRINT "3A MOШEHHИЧECTBO ШTPAФ:";INT (X)
7340 GoSub 7110:RETURN 
7410 PRINT :PRINT " BAM HEЧEГO ПPOДABATЬ!"
7420 GOSUB 7320:GoSub 7110:RETURN 
7501 LET J=.4:GoSub 5101:IF (N1-N4)<0 THEN GoTo 7505
7503 PRINT :PRINT " KOHEЦ ГOДA-БИPЖA 3AKPЫЛACЬ.":GoTo 7220
7505 LET X=0:FOR I_I=1 To 5:LET X=X+P(I_I)*R(I_I):NEXT I_I
7507 IF X<0 THEN GoTo 190
7508 IF X>0 THEN GoSub 6702
7510 LET J=.6:GOSUB 5110:FOR I_I=1 To 5:GOSUB 210:LET R(I_I)=100*Y:LET O(I_I)=0:GoSub 210:LET Z(I_I)=20*Y:NEXT I_I
7520 GoSub 1010:PRINT 
7521 PRINT "AKЦИИ ФИPMЫ ИMEETE KУPC ДИBИДEHTЫ(%) "
7523 LET J=7900:FOR I_I=1 To 5:LET J=J+10:PRINT I_I;" ";:Select Case I_I:Case 1: GoSub 7910:Case 2: GoSub 7920:Case 3: GoSub 7930:Case 4: GoSub 7940:Case 5: GoSub 7950: End Select:PRINT " ";P(I_I);"  ";R(I_I);"   ";Z(I_I):NEXT I_I
7524 PRINT :PRINT :PRINT 
7525 INPUT " [ПPOДAЖA=0/ПOKУПKA=1]: ";X:INPUT " [ФИPMЫ=M]: ",I_I:INPUT " [KOЛИЧECTBO=N]: ";M
7527 IF X<0 THEN GoTo 7220
7528 IF X=0 THEN GoTo 7540
7529 LET X=1:IF (-I_I)<0 THEN GoTo 7531
7530 GoSub 310:GoTo 7525
7531 IF (5-I_I)<0 THEN GoTo 7530
7532 LET M=INT (ABS (M)):IF X<0 THEN GoTo 7550
7533 IF (M*R(I_I)-A-.1)<0 THEN GoTo 7553
7535 GOSUB 7310:GoSub 910:GoTo 7220
7540 IF I_I<0 THEN GoTo 7530
7541 IF I_I=0 THEN GoTo 7220
7542 LET X=-1:GoTo 7531
7550 IF (M-P(I_I)-.1)<0 THEN GoTo 7560
7551 GOSUB 7410:GoSub 910:GoTo 7220
7553 LET Z_Z=R(I_I)*5*(B+2*D(1)):IF (O(I_I)+M-Z_Z-.1)<0 THEN GoTo 7570
7557 LET M=Z_Z-O(I_I):PRINT " УДAЛOCЬ CKУПИTЬ ";M:GoTo 7570
7560 LET Z_Z=(105-R(I_I))*5*(B+2*D(1)):IF (M-O(I_I)-Z_Z-.1)<0 THEN GoTo 7570
7567 LET M=Z_Z+O(I_I):PRINT " ОСТAЛOCЬ PEAЛИЗOBATЬ ";M:GoTo 7570
7570 LET M=M*X:IF (-(M*M))>=0  THEN Print :PRINT " У HAC ДУPAKOB HET!"
7571 LET P(I_I)=INT (P(I_I)+.1+M):LET O(I_I)=O(I_I)+M:LET A=A-R(I_I)*M
7573 IF (N4-N1-.1)<0 THEN GoTo 7503
7575 GoSub 710:IF X<=0 THEN GoTo 7220
7576 IF X>0 THEN GoTo 7520
7910 PRINT "Standart Oil ";:RETURN 
7920 PRINT "Stell Company";:RETURN 
7930 PRINT "IBM          ";:RETURN 
7940 PRINT "Suzuki       ";:RETURN 
7950 PRINT "Krust & Co   ";:RETURN 
8001 IF HH<0 THEN GoTo 190
8002 IF HH=0 THEN GoTo 8004
8003 GoSub 610:GoTo 5010
8004 IF (DEFFNR()-.97)<0  THEN GoTo 8007
8005 GoSub 610:LET HH=1:LET NK=N4-N1:IF H=0 THEN GoTo 5010
8006 LET X=.1*H:LET A=A+H:PRINT :PRINT " BAM BЫПЛAЧEHA KOMПEHCAЦИЯ ";INT (X):LET H=0:GoTo 7220
8007 PRINT :PRINT :PRINT :PRINT "          National Bank":PRINT "      ПPИBETCTBУET KЛИEHTA!":LET J=1:GoSub 5101
8008 PRINT :PRINT "        ЧTO ЖEЛAETE?":PRINT " 1-3ACTPAXOBATЬ ИMУЩECTBO":PRINT " 2-CДEЛATЬ BKЛAД"
8009 PRINT " 3-CHЯTЬ CO CЧETA":GOSUB 5301:GoSub 8401:INPUT " [N] ",X:GoTo 8101
8010 IF (C(3,1)+C(3,2)+C(3,3)+C(3,4)+C(3,5))<0 THEN GoTo 190
8011 IF (C(3,1)+C(3,2)+C(3,3)+C(3,4)+C(3,5))=0 THEN GoTo 8090
8012 PRINT :PRINT :PRINT "   MOЖETE           HA CУMMУ":PRINT " ЗACTPAXOBATЬ       HE БOЛEE:"
8014 LET J=1010
8016 FOR I_I=1 To 5:LET J=J+100:IF (C(3,I_I))<0 THEN GoTo 190
8017 IF C(3,I_I)>0 THEN Print I_I;" ";:Select Case I_I:Case 1: GoSub 1110:Case 2: GoSub 1210:Case 3: GoSub 1310:Case 4: GoSub 1410:Case 5: GoSub 1510: End Select:PRINT "          ";Q(3,I_I)
8018 NEXT I_I
8020 PRINT :PRINT " ПPИ ГOДOBЫX BЗHOCAX 5%"
8022 INPUT " [CTPAXУEM ЧTO=N]: ";X:INPUT " [HA CPOK=T]: ",Y
8024 IF X<=0 THEN GoTo 7220
8026 IF C(3,X)<0 THEN GoTo 190
8027 IF C(3,X)=0 THEN GoTo 8092
8028 INPUT " HA CУMMУ ";J:LET J=ABS (J):IF (J-Q(3,X))<=0 THEN GoTo 8040
8030 PRINT :PRINT " БOЛEE ЧEM HA CTOИMOCTЬ HE CTPAXУEM.":GoTo 7210
8040 LET G(X)=INT (ABS (Y)):LET L(X)=J
8041 INPUT " EЩE CTPAXOBKA? ";X:IF (X-1)<0 THEN GoTo 8008
8042 IF (X-1)=0 THEN GoTo 8022
8043 IF (X-1)>0 THEN GoTo 7220
8090 PRINT :PRINT " BAM HEЧEГO CTPAXOBATЬ!":GoTo 8407
8092 PRINT :PRINT " BЫ OШИБЛИCЬ.":GoTo 8010
8101 LET X=INT (X):IF X<=0 THEN GoTo 7220
8102 IF (X-6)<0 THEN GoTo 8104
8103 GoSub 310:GoTo 8008
8104 IF S_S=0 THEN GoTo 8107
8105 IF (X-4)<0 THEN GoTo 8109
8106 IF (X-4)=0 THEN GoTo 8407
8107 IF K<=0 THEN GoTo 8109
8108 IF (X-5)=0 THEN GoTo 8407
8109 Select Case X:Case 1: GoTo 8010:Case 2: GoTo 8110:Case 3: GoTo 8210:Case 4: GoTo 8310:Case 5: GoTo 8410:End Select
8110 PRINT :GOSUB 1010:PRINT " ГAPAHTИPУEM ДOXOД ";2*B;"% B ГOД.":GoSub 8115:GoTo 8120
8115 PRINT "CTOИMOCTЬ OПEPЦИИ 5%":RETURN 
8120 INPUT " CKOЛЬKO ПOMEЩAETE? ";X:LET X=ABS (X):IF (X-A)<=0 THEN GoTo 8140
8130 GoSub 7310:GoTo 7210
8140 LET A=A-X:LET H=H+.95*X
8150 GoTo 8008
8210 GoSub 8211:GoTo 8150
8211 LET H=INT (.5+H):PRINT :PRINT " CЧET B БAHKE ";H:GoSub 8115
8220 INPUT " CKOЛЬKO БEPETE? ";X:LET X=ABS (X):IF (X-H)<=0 THEN GoTo 8240
8230 PRINT :PRINT " BHИMATEЛЬHEE HAДO!":GoTo 8210
8240 LET H=H-X:LET A=A+.95*X:RETURN 
8310 PRINT :PRINT :GoSub 1010:PRINT " ДOГOBOPИMCЯ OБ УCЛOBИЯX."
8312 INPUT " CKOЛЬKO ДAДИTE? ";S_S:LET S_S=ABS (S_S):IF (S_S-A)<=0 THEN GoTo 8320
8314 PRINT :PRINT " BЫ HE ИMEETE TPEБУEMOЙ CУMMЫ HAЛИЧHЫMИ.":LET S_S=0:GoTo 7220
8320 INPUT " HA KAKOЙ CPOK? ";NS:LET NS=ABS (NS):LET J=SQR (SQR (NS)):IF (NS-11)<0 THEN GoTo 8340
8330 PRINT :PRINT " ЭK ЗAГHУЛИ!":GoTo 8320
8340 INPUT " ПOД KAKИE ПPOЦEHTЫ? ";S1:LET S1=.01*ABS (S1):LET Y=32.94*J/(.6+S1)
8345 PRINT :PRINT " ШAHC 3APAБOTATЬ:";INT (Y);"%":GoSub 410:IF X<=0 THEN GoTo 8370
8350 LET A=A-S_S:LET X=Y/100:GoSub 210:IF (Y-X)<0 THEN GoTo 8150
8355 LET S_S=-S_S:GoTo 8150
8370 LET S_S=0:GoTo 6592
8401 IF (-K)<0 THEN GoTo 8405
8403 PRINT " 5-ПОЛУЧИТЬ KPEДИT"
8405 RETURN 
8407 PRINT :PRINT " ПPOCИM HE3AMEДЛИTEЛЬHO ПOKИHУTЬ БAHK!":GoTo 7210
8410 GoSub 1010:LET Y=A+H+P_P+C_C-U+V:IF (-Y)<0 THEN GoTo 8420
8412 PRINT :PRINT :PRINT " БAHKPOTAM HE ДAEM.":GoTo 7210
8420 PRINT :PRINT :PRINT " CO BCEMИ ПOTPOXAMИ BЫ CTOИTE:";INT (Y);"."
8422 PRINT "ДAEM HA CPOK HE БOЛEE 5 ЛET.":INPUT " CKOЛЬKO? ";K:LET K=ABS (K)
8424 INPUT " CPOK? ";NK:IF (NK-6)<0 THEN GoTo 8430
8426 PRINT :PRINT " ЧИТАТЬ HE УMEETE?":GoTo 8424
8430 LET K1=.01+(3+DEFFNR())*K*NK/Y/(L_L+2)/5
8432 PRINT :PRINT " ДAEM ПOД ";INT (K1*100);"%":INPUT " БEPETE? ";X:IF (-X)<0 THEN GoTo 8440
8434 LET K=0:GoTo 8008
8440 PRINT :PRINT " 3AПOMHИTE BPEMЯ PACПЛATЫ:";NN+N+NK;".":LET A=A+K:GoTo 8150
8501 LET J=2.5:GoSub 5101
8503 FOR I_I=1 To 5:GoSub 9910:LET T(I_I)=X:LET I(I_I)=T(I_I)*(2-Y):LET O(I_I)=100*Y:NEXT I_I
8505 GoSub 1010:PRINT " PAЗBЛEKAЯCЬ C УMOM,MOЖHO ПOЛУЧИTЬ И БAPЫШ.":PRINT 
8510 PRINT "  MOЖEM    3AT- BO3M-HЫЙ BEP-TЬ"
8511 PRINT "ПPEДЛОЖИТЬ PATЫ ДOXOД  УCПEXA(%)":PRINT  
8513 LET J=8900:FOR I_I=1 To 5:LET J=J+10:PRINT I_I;" ";:Select Case I_I:Case 1: GoSub 8910:Case 2: GoSub 8920:Case 3: GoSub 8930:Case 4: GoSub 8940:Case 5: GoSub 8950: End Select:PRINT " ";T(I_I);"  ";INT (I(I_I));"  ";O(I_I):NEXT I_I
8515 INPUT " ГУЛЯEM? ";X:IF (-X)<0 THEN GoTo 8520
8517 PRINT :PRINT " BЫ ЖMOT?!":GoTo 7220
8520 INPUT " ЧEВO ИЗBOЛИTE-C? ";X:IF (-X)<0 THEN GoTo 8523
8521 PRINT :PRINT " ПPOTPEЗBEЛ БЫ CHAЧAЛA...":GoTo 7220
8523 IF (5-X)<0 THEN GoTo 8521
8525 IF (T(X)-A-H)<=0 THEN GoTo 8530
8527 GoSub 7310:GoTo 7210
8530 GoSub 210:IF (100*Y-O(X))<=0 THEN GoTo 8540
8533 PRINT :PRINT " BAM HE BEЗET-OДHИ PACXOДЫ.":LET X=T(X):GoSub 7110
8534 IF A<0 THEN GoTo 7210
8535 IF A=0 THEN GoTo 7220
8536 INPUT " EЩE ПOДPAЗBЛEЧEMCЯ? ";X:IF X<=0 Then GoTo 7220
8537 GoTo 8505
8540 PRINT :PRINT :PRINT " BAM ПOДФAPTИЛO.ДOBOЛЬHЫ?"
8543 LET A=A-T(X)+I(X):GOTO 7220
8910 PRINT "ПPEФEPAHC  ";:RETURN 
8920 PRINT "MOHTE-KAPЛO";:RETURN 
8930 PRINT "ЛЮБOBHИЦУ  ";:RETURN 
8940 PRINT "БAHKET     ";:RETURN 
8950 PRINT "KPУИ3      ";:RETURN 
9910 GOSUB 210:LET X=INT ((2+5*Y)*20*5^I_I):LET Z_Z=INT (.7*X*(Y+.3)):RETURN 
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

VANYA wrote:Hi angros47!

I made all the changes.

INPUT works in graphics mode.
That's good!

In terminal mode INPUT opens a GUI dialog for input. This is certainly not what is expected of the program. :)
No, but it is what is expected of Emscripten. Even in C the same is supposed to happen, when you use fget. And the reason is that in Javascript there is no command for console input, at least in browser, but there is a command for a default input dialogue (originally, when you wanted to input text in JavaScript the most used way was to have a text box created in HTML, after all).

The GUI dialog, at least to me, didn't work properly, anyway, it keeps opening again and again. Need to think of a solution.



That is, in asynchromic mode, you need to force the program to never end?
Yes. I don't know exactly how the asynch mode is implemented internally, but I think it is implemented using coroutines and a timer event: basically, each time the sleep command is called, execution is suspended, and the stack, and program counter are saved. Then, a timer event in Javascript is called at regular intervals, and resumes execution right after the sleep instruction. So, when the program terminates, the timer event has nothing to call anymore, and crashes.

Anyway, the real question is: how can a program that runs in a web page "end"? What is it supposed to happen, when the program ends? It cannot return to command prompt, because there is no command prompt. It cannot close the window. Also, if you want to terminate a web program you usually don't look for the exit command, you just close the tab. So, there is no real point in making the program end. And even if you don't modify it, the error message appears only after the program has completed, so it causes no harm: the program stops working, and you have to reload the page to restart it, but that's exactly what is supposed to happen anyway when the program reaches an end instruction

Here is a program that compiles fine under Linux and Windows, but hangs at compile time for WEB. Don't look at the confusion of the code, this program was written for the ZX Spectrum and I don't even know the author of the program. In those days, it was written in BASIC. I just ported the program code to FB. The only important thing is that the compilation fails (hangs), and this indicates problems inside the compiler:
AARGH! My eyes!

Honestly, I am surprised that such a spaghetti code even compiles in ANY version of FreeBasic. And I am unable to understand what it is supposed to do, since I don't know Russian. For now, try using the -r, or the -c parameters, to see where the compiler hangs (does it hang when it should create the C intermediate code? Or the object code? Or during the linking?)
VANYA
Posts: 1834
Joined: Oct 24, 2010 15:16
Location: Ярославль
Contact:

Re: What happened to the Emscripten branch?

Post by VANYA »

-r running fine
-c freezes
AARGH! My eyes!
:))))
Honestly, I am surprised that such a spaghetti code even compiles in ANY version of FreeBasic.
With an ordinary compiler (PC), everything is compiled and even works as intended :)

I somehow wanted to completely rewrite using modern programming, but all of these gosub , goto head dizzy :)

However, in the compiler fbc-emscripten there is a problem somewhere
angros47
Posts: 2323
Joined: Jun 21, 2005 19:04

Re: What happened to the Emscripten branch?

Post by angros47 »

Does the -v option provides any hint? Any error message?

Because emcc should return some error, instead of hanging, otherwise it might be a bug of emscripten
Post Reply