' Numerus2.ibas

BEGIN
   REPEAT
      E=DOEVENTS
      IF E>=1 IF E<=7 GOSUB _AddNum
      IF E>=11 IF E<=15 GOSUB _Calculate
      IF E>=21 IF E<=25 CHAIN "Numerus3.ibas"
      IF E=31 LET E=NOTICEBOX(2)
      IF E=32 LET E=NOTICEBOX(1) : IF E=2 LET E=NOTICEBOX(2)
      IF E=33 THEN
         E=NOTICEBOX(6)+2
         IF E<>6 LET E=NOTICEBOX(E)
      ENDIF
      IF E=34 CHAIN "Numerus3.ibas"
   UNTIL E<0
   IF E=-2 CHAIN "Numerus3.ibas"
   GOSUB _SavePrefs
END

_ReverseNum:
   V=0
   FOR A=27 TO 33
      U$=A$(A)
      IF U$=V$ LET V=A(A)
   NEXT
RETURN

_CheckSubRule:
   V=0
   IF V$="IV" LET V=1
   IF V$="IX" LET V=1
   IF V$="XL" LET V=1
   IF V$="XC" LET V=1
   IF V$="CD" LET V=1
   IF V$="CM" LET V=1
RETURN

_CheckTriplet:
   V=0
   A=T MOD 10
   IF A=0 THEN
      IF R>=T LET V=1
   ELSE
      IF R>T LET V=1
   ENDIF
RETURN

_Concat2:
   V$=R$+S$
   GOSUB _CheckSubRule
   IF V=0 THEN
      V$=S$+T$
      GOSUB _CheckSubRule
      IF V=0 THEN
         IF S>=T LET U=T
      ELSE
         GOSUB _CheckTriplet
         IF V=1 LET U=-2*S+T
      ENDIF
   ELSE
      IF R>T LET U=T
   ENDIF
RETURN

_Concat1:
   V$=S$+T$
   GOSUB _CheckSubRule
   IF V=0 THEN
      IF S>=T LET U=T
   ELSE
      U=-2*S+T
   ENDIF
RETURN

_ConcatMethod:
   R$=" " : S$=" " : U=LEN(N$)
   IF U>1 LET V=U-1 : R$=CHAR$(N$,V) : V$=R$ : GOSUB _ReverseNum : R=V
   IF U>0 LET S$=CHAR$(N$,U) : V$=S$ : GOSUB _ReverseNum : S=V
   T$=A$(E) : T=A(E)
   U=0
   IF R$=" " IF S$=" " LET U=T
   IF R$=" " IF S$<>" " GOSUB _Concat1
   IF R$<>" " GOSUB _Concat2
   IF U=0 THEN
      IF H=1 THEN V=NOTICEBOX(23)
      ELSE BEEP 1,2
      ENDIF
   ENDIF
RETURN

_AddNum:
   IF M=-1 LET M=0 : N$=""
   E=E+26
   IF F=1 THEN
      U=A(E)
   ELSE GOSUB _ConcatMethod
   ENDIF
   M=M+U
   IF M>99999 LET M=-1
   K=2 : E=-2
RETURN

_CalculateIt:
   IF O=11 LET L=L+M
   IF O=12 LET L=L-M
   IF O=13 LET L=L*M : IF L>99999 LET L=-1
   IF O=14 IF M=0 LET L=-1
   IF O=14 IF M<>0 LET L=L\M
   IF O=15 IF M>0 LET L=M
   O=E : M=-1
   K=1 : E=-2
RETURN

_Calculate:
   IF M=-1 IF O<>15 IF E=15 LET M=L : GOSUB _CalculateIt
   IF E>0 IF M=-1 IF O<>15 IF E<>15 LET O=E : E=0
   IF E>0 GOSUB _CalculateIt
RETURN

_SavePrefs:
   SAVEPREF #1,K
   SAVEPREF #2,L
   SAVEPREF #3,M
   SAVEPREF #4,Q
   SAVEPREF #5,O
   SAVEPREF #6,F
   SAVEPREF #7,G
   SAVEPREF #8,H
RETURN