Metropoli BBS
VIEWER: ex2.s MODE: TEXT (ASCII)
        STITLE EXAL 5.0
	

xROMID 4C4

INCLUDE exext.h

ASSEMBLE
=exalcfg
RPL
::
# 4C4 TOSRRP
;

ASSEMBLE
        CON(1)  8
RPL
xNAME SPRD
::
 $ "FNT" palparse DROP ROMPTR@ 
 ITE
 DROP
 ::	
   $ "UFL not found!" xKILL
 ; 
 ClrDA1IsStat % 500 ' ID NUMBER STO xRCLF DUP ' ID FLGS STO CARCOMP
 ' ID SETTINGS @ NOT
 ITE
 HXS 10 0000000000000000
 ::
  DUPTYPELIST?
   IT
   ::
   INCOMPDROP ' ID Times STO
  ;
 ;
 TWO{}N xSTOF FORTY ClrSysFlag TWENTYTWO SetSysFlag TWENTYONE
 SetSysFlag ONE ClrSysFlag TWO ClrSysFlag ID PT TYPEIDNT?
 IT
 ::
  ZEROZERO TWO{}N ' ID GPOS STO ZEROZERO EX3A THREE{}N ' ID TP8
  STO ZERO EIGHT TWO{}N ' ID PT STO $ "UNNAMED" ' ID NAMES STO EX35
 ;
 EX39 EX40 EX37 EX54 EX36 ID FLGS xSTOF ' ID FLGS PURGE ' ID NUMBER PURGE
;

ASSEMBLE
        CON(1) 8
RPL
xNAME PLOTTER
::
 CK2&Dispatch
 #55
 ::
  EX70 SWAP EX70 SWAP OVER TYPELIST? OVER TYPELIST? AND
  IT
  EX6F
 ;
;

ASSEMBLE
        CON(1) 8
RPL
xNAME ABOUT
::
 RECLAIMDISP ClrDA1IsStat DOCLLCD TURNMENUOFF
GROB 23A 41000C6000000000CF0300000303FF3000CF00000000CF0300000303FF3000CF000000003033000003033000003030000000303300000303300000303000000030330000030330000030300000003033000003033000003030CF0303303300000303FF00003C30CF0303303300000303FF00003C30303303FF33000003030030003330303303FF33000003030030003330FF3CC0303300000CC0003000F030FF3CC0303300000CC0003000F030300030303300000CC00030003030300030303300000CC00030003030300CC0303300000030303C303030300CC0303300000030303C303030CF0303303FF3000030CF0C30CF00CF0303303FF3000030CF0C30CF0000000000000000000000000000000000000000000000000000000000
 $ "    by Al Arduengo"
 $ "     April 25, 97 "
 DISPROW7 DISPROW5 ABUFF TWELVE FIVE GROB! WaitForKey 2DROP 
 RECLAIMDISP
 ;

NULLNAME EX03
::
 DUPTYPEIDNT?
 IT
 ::
  ID>$ DUP DUP CAR$ CHR># SIXTYFOUR OVER #< SWAP # 5B #< AND OVER CAR$ CHR>#
  SIXTYFOUR #- ID M_ CARCOMP LENCOMP #1+ #< AND SWAP CDR$
  DUP NULL$? NOT
  IT
  DOSTR>
  DUPTYPEREAL?
  ITE
  ::
  ID M_ LENCOMP #1+ UNCOERCE %<
  ;
  DROPFALSE
  AND
  ITE
  ::
  EX51 INCOMPDROP COERCE2 EX58
  DUPTYPELIST?
  IT
  ::
  TWO NTHCOMPDROP
  ;
  ;
  $>ID
  ;
  LAM US SWAP >TCOMP ' LAM US STOLAM
;
***********************************************************************
NULLNAME EX04
::
 TURNMENUOFF
 $ "------------NO" $ "SHIFT-----------" $ "[ON]   Exit"
 $ " [*]    TOGBar" $ "[STO]  Sto SHT" $ " [+]    +Col"
 $ "[']    FRM ENT" $ " [-]    +Row" $ "[EVAL] RCLC SHT"
 $ " [SPC]  RDRW" $ "[VAR]  Make Var" $ " [/]    FRM/VAL"
 $ "[F]    SDev" $ " [\8E]    STK\8D" $ "[E]    Mean"
 $ " [DEL]  DEL" $ "[D]    TOT" $ " [EEX]  Grid"
 $ "[C]    Copy" $ " [ENTER] \8DSTK"
 TWENTY EX6E
 $ "-----------Left" $ "Shift-----------" $ "[0]     STD"
 $ " [2]     Fix2" $ "[3]     Fix3" $ " [1/X]   JUST\8E\8D"
 $ "[-]     -Row" $ " [+]     -Col" $ "[VIEW]  EQView"
 $ " [/]     CMPLX" $ "[EVAL]  RCLC Cell" $ " [+/-]   Edit"
 $ "[']      RCLC\90\8F" $ " [NXT]   Info" $ "[TAN]   Save \85DAT"
 $ " [\8D]     Move\8F\8D"
 SIXTEEN EX6E
 $ "-----------Right"
 $ "Shift-----------" $ "[\90] [\8E] [\8F] [\8D]" $ " Jump"
 $ "[TAN]  +\85" $ " [EVAL] #RCLC" $ "[-]    $ ENT"
 $ " [0]    \8DGLBL" $ "[SPC]  Toggle" $ "AutoAdj"
 TEN EX6E

;
***********************************************************************
NULLNAME EX05
::
 RECLAIMDISP TOADISP EX40 EX50 EX5B EX40 TOGDISP THIRTYFIVE
 UserITE EX49 EX4E
;
***********************************************************************
NULLNAME EX06
::
 $ " " SWAP TWO ZEROZERO EX05
;
***********************************************************************
NULLNAME EX07
::
 SIX DUP UserITE ClrUserFlag SetUserFlag 
;
***********************************************************************
NULLNAME EX08
GROB 11A 800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
***********************************************************************
NULLNAME EX09
::
 BEGIN
 ::
  REPEATERCH SEVENTEEN EX49 TRUE
 ;
 UNTIL
;
***********************************************************************
NULLNAME EX0A
::
 DUPTYPELIST? IT CARCOMP EX61 DUPTYPEIDNT? IT
 xEVAL EX56 EX51 INCOMPDROP COERCE2 EX5A EX5B
;
***********************************************************************
NULLNAME EX0B
::
 BEGIN
 ::
  REPEATERCH SIXTEEN EX4C TRUE
 ;
 UNTIL
;
***********************************************************************
NULLNAME EX0C
::
 NINE SetUserFlag $ "Copy " ' ID BR STO ZERO EX0D
;
***********************************************************************
NULLNAME EX0D
::
 EX3A EX60 DUP THREE
 #<case
 ::
  ID BR EX56 &$ EX5F EX33
 ;
 DUP THREE
 #=case
 ::
  DROP ' ID BR PURGE EX4B
 ;
 FOUR
 #=case
 ::
  ' ID BR PURGE
 ;
;
***********************************************************************
NULLNAME EX0E
::
 BEGIN
 ::
  REPEATERCH EIGHTEEN EX4E TRUE
 ;
 UNTIL
;
***********************************************************************
NULLNAME EX0F
::
 BEGIN
 ::
  REPEATERCH ELEVEN EX4F TRUE
 ;
 UNTIL
;
***********************************************************************
NULLNAME EX10
::
 RECLAIMDISP TOADISP EX45 TOGDISP
;
***********************************************************
NULLNAME EX11
::
 LAM CPY EX51 INCOMPDROP COERCE2 EX58
 DUPTYPELIST?
 IT
 ::
  CARCOMP LAM CPY CAR$ CHR># LAM FRM CAR$ CHR># #=
   ITE
   ::
   LAM FRM CDR$ DOSTR> LAM CPY CDR$ DOSTR> %- COERCE DUP
   ZERO #<>
   ITE
   ::
    ONE SetUserFlag SWAP DUPTYPESYMB?
    ITE
    ::
     SWAP #1+ ONE DO EX1C LOOP
    ;
    ::
     SWAP #1+ ONE DO EX1E LOOP
    ;
     ONE ClrUserFlag
   ;
   DROP
  ;
  ::
   LAM FRM CAR$ CHR># LAM CPY CAR$ CHR># #- ONE ClrUserFlag SWAP
   DUPTYPESYMB?
   ITE
   ::
    SWAP #1+ ONE DO EX1C LOOP
    ;
    ::
    SWAP #1+ ONE DO EX1E LOOP
   ;
   LAM FRM CDR$ DOSTR> LAM CPY CDR$ DOSTR> %- COERCE DUP #0<>
   ITE
   ::
    ONE SetUserFlag SWAP DUPTYPESYMB? ITE
    ::
     SWAP #1+ ONE DO EX1C LOOP
    ;
    ::
     SWAP #1+ ONE DO EX1E LOOP
    ;
    ONE ClrUserFlag
   ;
    DROP
  ;
 ;
;
***********************************************************************
NULLNAME EX12
::
 EX56 EX51 INCOMPDROP COERCE2 EX58
;
***********************************************************************
NULLNAME EX13
::
 %1 a%>$ LEN$ #1- SWAP DUPLEN$ ROT #- ONE SWAP SUB$
;
**********************************************************************	
**********************************************************************
NULLNAME BEEPER
::
% 2000 % .2 xBEEP
;
**********************************************************************
NULLNAME EX14
::
 ID M_ CARCOMP LENCOMP FOUR #= ITE
 BEEPER
  ::
  EX43 RECLAIMDISP TOADISP KILLGDISP DOCLLCD $ "  Deleting Column..."
  DISPROW3 FORTYTWO SetUserFlag ID PT CARCOMP THIRTYTHREE #/
  SWAPDROP #1+ DUP UNCOERCE ' ID NUMBER STO 1LAMBIND ID M_ INNERCOMP
  #1+ ONE DO INNERCOMP reversym 1GETLAM #1+ ROLL DROP #1- reversym 
  {}N ISTOP@ #1- ROLL LOOP ID M_ LENCOMP {}N ID M_ REPLACE DROP 
  1GETLAM ID M_ CARCOMP LENCOMP #> IT
  ::
   ID GPOS INCOMPDROP THIRTYTHREE #- TWO {}N ID GPOS REPLACE DROP ID PT
   INCOMPDROP SWAP THIRTYTHREE #- SWAP TWO {}N ID PT REPLACE DROP
  ;
  ABND EX39 THIRTYSIX TestUserFlag IT
  EX6B EX40 FORTYTWO ClrUserFlag % 500 ' ID NUMBER STO EX37
 ;
;
***********************************************************************
NULLNAME EX15
::
 EX40 EX12 TYPECSTR? NOT IT
 ::
  THIRTEEN SetUserFlag
  ;
 $ "      " EX48 EX5B EX40
;
***********************************************************************
NULLNAME EX16
::
 ID M_ LENCOMP EIGHT #= ITE
BEEPER
 ::
  EX43 RECLAIMDISP TOADISP KILLGDISP DOCLLCD $ "  Deleting Row..."
  DISPROW3 THIRTYTWO SetUserFlag ID PT TWO NTHCOMPDROP EIGHT #/
  SWAPDROP DUP UNCOERCE ' ID NUMBER STO 1LAMBIND ID M_ INNERCOMP
  reversym 1GETABND #1+ ROLL DROP #1- reversym {}N ID M_ REPLACE
  DROP ID PT INCOMPDROP SWAPDROP EIGHT #<> IT
  ::
   ID PT INCOMPDROP EIGHT #- TWO{}N ' ID PT STO
  ;
  EX39 THIRTYSIX TestUserFlag IT
  EX6B EX40 THIRTYTWO ClrUserFlag % 500 ' ID NUMBER STO EX37
 ;
;
***********************************************************************
NULLNAME EX17
::
 TakeOver RECLAIMDISP EX40 EX12 DUPTYPELIST? IT CARCOMP TOADISP ObEdit
 IT
 ::
  EX12 TYPECSTR? NOT IT
  ::
   THIRTEEN SetUserFlag
  ;
  ERRSET CK1 ERRTRAP $ "Error!" EX61 DUPTYPELIST? IT
  ::
   THIRTEEN SetUserFlag
  ;
  ID PT INCOMPDROP EX44 #1- EX5A
 ;
 TOGDISP EX5B EX40
;
***********************************************************************
NULLNAME EX18
::
 EX43 RECLAIMDISP TRUE ' LAM EXIT STOLAM
;
***********************************************************************
NULLNAME EX19
::
 SEVENTEEN DUP TestUserFlag ITE ClrUserFlag SetUserFlag
 ID TP8 INCOMPDROP GBUFF UNROT GROB!
;
***********************************************************************
NULLNAME EX1A
::
 DEPTH #0<> IT
 ::
  EX40 STRIPTAGS EX0A EX40
 ;
;
***********************************************************************
NULLNAME EX1B
::
 RECLAIMDISP TOADISP EX04 TOGDISP
;
***********************************************************************
NULLNAME EX1C
::
 EXPLODE DUP
  {
  LAM COUNT
 }
 BIND #1+ ONE DO LAM COUNT ROLL DUPTYPEIDNT? IT
 ::
  ID>$ DUP CAR$ CHR># THIRTYSIX #<> IT
  ::
   ONE TestUserFlag ITE EX52 EX53
  ;
  $>ID
 ;
 LOOP
 LAM COUNT IMPLODE ABND
;
***********************************************************************
NULLNAME EX1D
::
 EX43 RECLAIMDISP TOADISP KILLGDISP DOCLLCD $ "  Inserting Col..."
 DISPROW3 FORTYONE SetUserFlag ID M_ INNERCOMP EX56 CAR$ CHR># SIXTYFOUR
 #- DUP UNCOERCE ' ID NUMBER STO 
 {
  LAM KNT
  LAM COLP
 }
 BIND LAM KNT #1+ ONE DO ISTOP@ #1- ROLL NULL$ LAM COLP EX2E LOOP
 ID M_ LENCOMP {}N ID M_ REPLACE DROP ABND EX39 THIRTYSIX TestUserFlag
 IT EX6B EX40 FORTYONE ClrUserFlag % 500 ' ID NUMBER STO EX37
;
***********************************************************************
NULLNAME EX1E
::
 INNERCOMP DUP
 {
  LAM COUNT
 }
 BIND #1+ ONE DO LAM COUNT ROLL DUPTYPEIDNT? IT
 ::
  ID>$ DUP CAR$ CHR># THIRTYSIX #<> IT
  ::
   ONE TestUserFlag ITE EX52 EX53
  ;
  $>ID
 ;
 LOOP LAM COUNT ::N ABND
;
***********************************************************************
NULLNAME EX1F
::
 EX43 RECLAIMDISP TOADISP KILLGDISP DOCLLCD $ "  Inserting Row..."
 DISPROW3 THIRTYONE SetUserFlag ID M_ DUP CARCOMP LENCOMP DUP
 1LAMBIND #1+ ONE DO $ "" LOOP 1GETABND {}N EX56 EX51 TWO NTHCOMPDROP 
 DUP ' ID NUMBER STO COERCE EX2E ID M_ REPLACE DROP EX39 THIRTYSIX 
 TestUserFlag IT EX6B EX40 % 500 ' ID NUMBER STO THIRTYONE ClrUserFlag EX37
;
***********************************************************************
NULLNAME EX20
::
 EX40 EX38 JUMPBOT EX3D CARCOMP GBUFF GROBDIM DROP EIGHT #-
 TWO{}N ' ID PT STO EX40 EX37
;
***********************************************************************
NULLNAME EX21
::
 EX40 EX38 JUMPLEFT EX3D ZERO SWAP TWO NTHCOMPDROP TWO{}N '
 ID PT STO EX40 EX37
;
***********************************************************************
NULLNAME EX22
::
 JUMPRIGHT EX40 EX38 EX3D TWO NTHCOMPDROP GBUFF GROBDIM SWAPDROP
 THIRTYTHREE #- SWAP TWO{}N ID PT REPLACE DROP EX40 EX37
;
***********************************************************************
NULLNAME EX23
::
 EX40 EX38 JUMPTOP EX3D CARCOMP EIGHT TWO{}N ID PT REPLACE DROP
 EX40 EX37
;
***********************************************************************
NULLNAME EX24
::
 {
  ID SETTINGS
  ID TP8
  ID GPOS
  ID PT
  ID NAMES
  ID Times
 }
 xPURGE
 ' ID M_ PURGE
;
***********************************************************************
NULLNAME EX25
::
 DUP ID M_ ID PT ID GPOS ID TP8 xRCLF TWO NTHCOMPDROP ' ID Times @
 IT TWO{}N '
 ::
  ' ID SETTINGS STO ' ID TP8 STO ' ID GPOS STO ' ID PT STO ' ID M_ STO
  ' ID NAMES STO xSPRD
 ;
 SEVEN ::N SWAP $ ".S" &$ $>ID STO
;
***********************************************************************
NULLNAME EX26
::
 CK3&Dispatch
 # 333
 ::
  {
   LAM CPY
   LAM FRM
   LAM goto
  }
  BIND
  EX5E LAM FRM LAM goto 2DUP CAR$ CHR># SWAP CAR$ CHR># SWAP #> ROT CDR$ DOSTR>
  ROT CDR$ DOSTR> %> OR ITE
  ::
   TOADISP DOCLLCD $ " Invalid Limits!" FlashWarning TOGDISP
  ;
  ::
   THIRTEEN SetUserFlag EX40 EX38 LAM goto CAR$ CHR># LAM FRM CAR$ CHR># #- #1+
   #1+ ONE DO EX11 LAM FRM DUP CAR$ LAM goto CDR$ &$ 
   EX4D LAM FRM ' LAM CPY STO LAM FRM DUP CAR$ SWAP CDR$ 
   &$ ' LAM FRM STO LOOP EX5B EX37 EX40
  ;
  ABND
 ;
;
***********************************************************************
NULLNAME EX27
::
 ID TOTLST DUPTYPELIST?
 ITE
 ::
  DUPLENCOMP #1= ITE
  ::
   INCOMPDROP EX0A
  ;
  ::
   INNERCOMP
   {
    LAM SZ
   }
   BIND LAM SZ #1- #1+ ONE DO x+ LOOP LAM SZ ABND UNCOERCE x/ EX0A
  ;
 ;
 DROP
;
***********************************************************************
NULLNAME EX28
::
 ID TOTLST DUPTYPELIST?
 ITE
 ::
  DUPLENCOMP #1= ITE DROP
  ::
   LENCOMP #1-
   {
    LAM SZ
   }
   BIND
   %1 LAM SZ UNCOERCE x/ ID TOTLST INCOMPDROP LAM SZ #1+ ONE DO
   x+ LOOP LAM SZ #1+ UNCOERCE x/
   {
    LAM MEN
   }
   BIND ID TOTLST INNERCOMP #1+ ONE DO LAM MEN x- xSQ LAM SZ #1+ ROLL
   LOOP LAM SZ #1+ ONE DO x+ LOOP x* xSQRT ABND ABND EX0A
  ;
 ;
 DROP
;
***********************************************************************
NULLNAME EX29
::
 ID TOTLST DUPTYPELIST?
 ITE
 ::
  DUPLENCOMP #1= ITE
  ::
   INCOMPDROP EX0A
  ;
  ::
   INNERCOMP #1- #1+ ONE DO x+ LOOP EX0A
  ;
 ;
 DROP
;
***********************************************************************
NULLNAME EX2A
::
 EX43 RECLAIMDISP TOADISP KILLGDISP EX39
;
***********************************************************************
NULLNAME EX2B
::
 TOADISP $ "JUSTSAVE" EX36 TOGDISP
;
***********************************************************************
NULLNAME EX2C
::
 RECLAIMDISP TOADISP EX3E TOGDISP
;
***********************************************************************
NULLNAME EX2D
::
 EX12 DUPTYPELIST? IT
 ::
  TWO NTHCOMPDROP
 ;
 DUPTYPEREAL? OVER TYPECMP? OR
 ITE
 ::
  $ "$" EX56 &$ $>ID STO
 ;
 DROP
;
***********************************************************************
NULLNAME EX2E
::
 SWAPROT INNERCOMP #1+DUP #1+ROLL OVERDUP #3+ ROLL #- #2+UNROLL {}N
;
***********************************************************************
NULLNAME EX2F
::
 # 0
 {
  LAM NUMB
 }
 BIND EX12 DUPTYPELIST?
 ITE
 ::
  CARCOMP ONE ' LAM NUMB STOLAM
 ;
 ::
  DUPTYPEREAL? OVER TYPECMP? OR NOT
  ITE
  DROP
  ::
   ONE ' LAM NUMB STOLAM
  ;
 ;
 LAM NUMB #1=
 IT
 ::
  ID TOTLST DUPTYPEIDNT?
  IT
  ::
   DROP NULL{} ' ID TOTLST STO ID TOTLST
  ;
  INNERCOMP #1+ {}N ' ID TOTLST STO
 ;
 ABND
;
***********************************************************************
NULLNAME EX30
::
 EX12 EX56 x->TAG
;
***********************************************************************
NULLNAME EX31
::
 THIRTEEN DUP TestUserFlag
 ITE
 ClrUserFlag
 DROP
 $ "         Recalculating....      "
 EX5F VERYSLOW EX38 EX40 ID Times DUPTYPEREAL?
 ITE
 COERCE
 ::
  DROP ZERO
 ;
 #1+ ONE
 DO
 EX46
 LOOP
 EX40
;
***********************************************************************
NULLNAME EX32
::
 $ "AGROB" palparse DROP ROMPTR@ IT
 ::	
 DROP	
 TOADISP DOCLLCD TURNMENUOFF EX12 DUPTYPELIST?
 ITE
 ::
  CARCOMP DUPTYPESYMB?
  ITE
  ::
   %1 $ "AGROB" DOSTR>
   ;
  DO>STR
 ;
 DO>STR $ "VV" DOSTR> DROP RECLAIMDISP TOGDISP
  ;
;
***********************************************************************
NULLNAME EX33
::
 WaitForKey DROP TWENTYFIVE
 OVER#=case
 ::
  DROP ZERO
  OVER#=case
  ::
   DROP ID BR EX56 &$ $ " from " &$ ID BR REPLACE DROP EX56 ONE EX0D
  ;
  ONE
  OVER#=case
  ::
   DROP ID BR EX56 &$ $ " thru " &$ ID BR REPLACE DROP EX56 TWO EX0D
  ;
  TWO
  #=case
  ::
   EX56 THREE EX0D
  ;
 ;
 FORTYFIVE
 OVER#=case
 ::
  DROP NDROP NINE ClrUserFlag FOUR EX0D
 ;
 ELEVEN
 OVER#=case
 ::
  DROP EX0F EX0D
 ;
 SIXTEEN
 OVER#=case
 ::
  DROP EX0B EX0D
 ;
 SEVENTEEN
 OVER#=case
 ::
  DROP EX09 EX0D
 ;
 EIGHTEEN
 OVER#=case
 ::
  DROP EX0E EX0D
 ;
 DROP % 2200 % .05 xBEEP EX0D
;
***********************************************************************
NULLNAME EX38
::
 ID TP8 INCOMPDROP GBUFF UNROT GROB!
;
***********************************************************************
NULLNAME EX3B
::
 SEVENTEEN TestUserFlag NOT
 IT
 ::
  EX3A EX60 EX56 DUP $ " :" &$ SWAP EX51 INCOMPDROP COERCE2 EX58
  DUPTYPELIST?
  IT
  ::
   SIX
   TestUserFlag
   ITE
   ::
    TWO NTHCOMPDROP
   ;
   CARCOMP
  ;
  DO>STR &$ DUP SGROB DUPGROBDIM SWAPDROP # 81 #>
  ITE
  ::
   DROP DUPLEN$ THIRTYTHREE #>
   IT
   ::
    ONE THIRTYONE SUB$ $ ".." &$
   ;
   SGROB
  ;
  SWAPDROP GBUFF WINDOWCORNER #2+ SWAP #1+ GROB!
 ;
 THIRTEEN TestUserFlag
 IT
 SetAlphaAnn
;
***********************************************************************
NULLNAME EX3C
::
 NULL{}
 {
  LAM EQ
  LAM US
 }
 BIND LAM EQ INNERCOMP {}N ' LAM EQ STOLAM LAM EQ LENCOMP #1+ ONE
 DO
 LAM EQ INDEX@ NTHCOMPDROP
 EX03
 LOOP
 DEPTH #1+ 1LAMBIND
 ERRSET
 ::
  LAM US INNERCOMP ::N EVAL
 ;
 ERRTRAP
 $ "ERROR!"
 ERRSET
 ::
  DEPTH #0=
  IT
  $ "Error!"
  DUPTYPEREAL? OVER TYPECMP? OR OVER TYPECSTR? OR NOT
  IT
  $ "Error!"
 ;
 ERRTRAP
 $ "ERROR!" LAM EQ INNERCOMP ::N SWAP TWO{}N DEPTH 1GETLAM #<>
 IT
 ::
  DEPTH 1GETABND #- #1+ ONE
  DO
  SWAPDROP
  LOOP
 ;
 ABND
 INCOMPDROP
;
***********************************************************************
NULLNAME EX3D
 ID PT

***********************************************************************
NULLNAME EX3E
::
 $ "Enter name for data..."
 $ ""
 TWO ZERO TWO EX42
 IT
 ::
  ERRSET
  ::
   xOBJ> ID TOTLST DUPTYPELIST?
   ITE
   ::
    SWAP STO ' ID TOTLST PURGE
   ;
   ::
    DOCLLCD $ "NO CURRENT \85DAT" DISPROW3 VERYSLOW
   ;
  ;
  ERRTRAP
  NOP
 ;
;
***********************************************************************
NULLNAME EX3F
::
 EX40 EX3D INCOMPDROP
;
***********************************************************************
NULLNAME EX41
::
 EX47 GBUFF 4ROLL 4ROLL GROB! EX5B
;
***********************************************************************
NULLNAME EX42
::
 TWELVE TestUserFlag
 ITE
 ONE
 ZERO
 EditMenu ONE TRUE ZERO InputLine TWELVE ClrUserFlag
;
***********************************************************************
NULLNAME EX43
::
 WINDOWCORNER TWO{}N ID GPOS REPLACE DROP
;
***********************************************************************
NULLNAME EX44
::
 EIGHT #/ #1+ SWAPDROP SWAP THIRTYTHREE #/ #1+ SWAPDROP SWAP
;
***********************************************************************
NULLNAME EX45
::
 $ "Enter info..." $ ":contents:\n:    name:" ELEVEN ZERO ZERO EX42
 IT
 ::
  $ "Wait..." DISPROW3 xOBJ> xEVAL ID>$ $ "$" SWAP &$ $>ID SWAP xEVAL
  SWAP STO
 ;
;
***********************************************************************
NULLNAME EX46
::
 NULL{} ' ID ELE STO ID M_ INNERCOMP FOURTEEN TestUserFlag NOT
 IT
 reversym #1+ ONE
 DO
 BEGIN
 DUPTYPELIST? NOT
 ITE
 ::
  DROPFALSE
 ;
 TRUE
 UNTIL
 ID ELE REPLACE DROP ID ELE LENCOMP #1+ ONE
 DO
 ID ELE INDEX@ NTHCOMPDROP DUPTYPELIST?
 ITE
 ::
  SetAlphaAnn CARCOMP EX61 DUP TWO NTHCOMPDROP DO>STR EX57 EX62 SGROB
  SIX THIRTYONE MAKEGROB GBUFF INDEX@ #1- THIRTYTHREE #* #1+ JINDEX@
  FOURTEEN TestUserFlag
  IT
  ::
   ID M_ LENCOMP SWAP#- #1+
  ;
  EIGHT #* #1+ THREE NDUP 7ROLL 4UNROLL GROB! GROB! ClrAlphaAnn INDEX@
  JINDEX@ FOURTEEN TestUserFlag
  IT
  ::
   ID M_ LENCOMP SWAP#- #1+
  ;
  EX5A
 ;
 DROP
 LOOP
 LOOP
 EX5B ' ID ELE PURGE
;
***********************************************************************
NULLNAME EX47
::
 NULL{}
 {
  LAM EQ
  LAM US
 }
 BIND LAM EQ INNERCOMP {}N ' LAM EQ STOLAM LAM EQ LENCOMP #1+ ONE
 DO
 LAM EQ INDEX@ NTHCOMPDROP
 EX03
 LOOP
 DEPTH #1+ 1LAMBIND
 ERRSET
 ::
  LAM US INNERCOMP IMPLODE CRUNCH DUPTYPECSTR?
  IT
  ::
   DROP $ "Error!"
  ;
 ;
 ERRTRAP
 $ "Error!" LAM EQ INNERCOMP IMPLODE SWAP TWO{}N DEPTH 1GETLAM #<>
 IT
 ::
  DEPTH 1GETABND #- #1+ ONE
  DO
  SWAPDROP
  LOOP
 ;
 ABND
 INCOMPDROP
;
***********************************************************************
NULLNAME EX48
::
 EX56 EX51 INCOMPDROP COERCE2 EX5A EX5B
;
***********************************************************************
NULLNAME EX49
::
 ID PT TWO NTHCOMPDROP GBUFF GROBDIM DROP SWAP SIXTEEN #+ #< NOT
 IT
 ::
  EX40 ID PT INCOMPDROP EIGHT #+ TWO{}N ID PT REPLACE DROP EX40
  BOTROW EX3D TWO NTHCOMPDROP #<
  IT
  ::
   EX38 EIGHT #1+ ONE
   DO
   WINDOWDOWN
   LOOP
   EX37
  ;
 ;
;
***********************************************************************
NULLNAME EX4A
::
 INNERDUP
 {
  LAM COUNT
 }
 BIND #1+ ONE
 DO
 LAM COUNT ROLL DUPTYPEIDNT?
 IT
 ::
  ID>$ DUP CAR$ CHR># THIRTYSIX #<>
  ITE
  ::
   ONE TestUserFlag
   ITE
   EX52
   EX53
   $>ID
  ;
  $>ID
 ;
 LOOP
 LAM COUNT ::N ABND
;
***********************************************************************
NULLNAME EX4B
::
 EX26
;
***********************************************************************
NULLNAME EX4C
::
 ID PT CARCOMP ZERO #<>
 IT
 ::
  EX40 ID PT INCOMPDROP SWAP THIRTYTHREE #- SWAP TWO{}N ID PT REPLACE
  DROP EX40 LEFTCOL ID PT CARCOMP #>
  IT
  ::
   EX38 THIRTYTHREE #1+ ONE
   DO
   WINDOWLEFT
   LOOP
   EX37
  ;
 ;
;
***********************************************************************
NULLNAME EX4D
::
 ONE SetUserFlag ROT ' ID COPE STO
 {
  LAM STRT
  LAM STOP
 }
 BIND
 LAM STOP CDR$ DOSTR> LAM STRT CDR$ DOSTR> %- COERCE #1+ #1+ ONE
 DO
 SetAlphaAnn ' ID COPE @ DROP EX61 DUPTYPELIST?
 ITE
 ::
  DUP TWO NTHCOMPDROP
 ;
 DUP DO>STR EX57 EX62 SGROB SIX THIRTYONE MAKEGROB GBUFF LAM STRT
 EX51 INCOMPDROP COERCE2 SWAP #1- THIRTYTHREE #* #1+ SWAP EIGHT #*
 #1+ THREE NDUP 7ROLL 4UNROLL GROB! GROB! ClrAlphaAnn LAM STRT EX51
 INCOMPDROP COERCE2 EX5A LAM STRT EX52 ' LAM STRT STOLAM ' ID COPE
 @ DROP DUPTYPESYMB?
 IT
 EX1C
 DUPTYPECOL?
 IT
 EX1E
 ' ID COPE @ DROP REPLACE DROP
 LOOP
 ' ID COPE PURGE ABND ONE ClrUserFlag
;
***********************************************************************
NULLNAME EX4E
::
 ID PT CARCOMP GBUFF GROBDIM SWAPDROP SWAP FOURTWO #+ #< NOT
 IT
 ::
  EX40 ID PT INCOMPDROP SWAP THIRTYTHREE #+ SWAP TWO{}N ID PT
  REPLACE DROP EX40 RIGHTCOL ID PT CARCOMP #<
  IT
  ::
   EX38 THIRTYTHREE #1+ ONE
   DO
   WINDOWRIGHT
   LOOP
   EX37
  ;
 ;
;
***********************************************************************
NULLNAME EX4F
::
 ID PT TWO NTHCOMPDROP EIGHT #>
 IT
 ::
  EX40 ID PT INCOMPDROP EIGHT #- TWO{}N ID PT REPLACE DROP TOPROW
  #8+ ID PT TWO NTHCOMPDROP #>
  IT
  ::
   EX38 EIGHT #1+ ONE
   DO
   WINDOWUP
   LOOP
   EX37
  ;
  EX40
 ;
;
***********************************************************************
NULLNAME EX50
::
 CK5
 EX42
 IT
 ::
  EX12 ClrDA1IsStat TYPECSTR? NOT
  IT
  ::
   THIRTEEN SetUserFlag
  ;
  ERRSET
  ::
   TWELVE TestUserFlag NOT
   IT
   DOSTR>
   CK1
  ;
  ERRTRAP
  $ "Error!" DUPTYPELIST?
  ITE
  EX6C
  ::
   DUPTYPESYMB?
   IT
   xEVAL
   DUPTYPEIDNT?
   IT
   ::
    DUP
    ERRSET
    ::
     xRCL SWAPDROP
    ;
    ERRTRAP
    NOP
   ;
   EX61 EX56 EX51 INCOMPDROP COERCE2 EX5A
  ;
 ;
;
***********************************************************************
NULLNAME EX51
::
 DUP xNUM % 64 %- SWAP CDR$ palparse DROP TWO{}N
;
***********************************************************************
NULLNAME EX52
::
 DUP CAR$ CHR>$ SWAP CDR$ palparse DROP %1+ a%>$ &$
;
***********************************************************************
NULLNAME EX53
::
 DUP CAR$ CHR># #1+ #>CHR CHR>$ SWAP CDR$ &$
;
***********************************************************************
NULLNAME EX54
::
 FALSE
 {
  LAM EXIT
 }
 BIND
 ' EX3B '
 ::
  ONE
  #=casedrop
  ::
   ONE
   ?CaseKeyDef
::
    xTICKS ID TIME1 DUPTYPEIDNT?
    ITE
    ::
     $ "            Timer on              "
     EX5F VERYSLOW VERYSLOW STO
    ;
   ::
     $ "           Timer off              "
     EX5F x- HXS>% % 8192 %/ EX0E EX0A EX40 EX0B EX09 ' ID TIME1
     PURGE
   ;
 ;
   TWENTYSEVEN
   ?CaseKeyDef
   ::
    THIRTY DUP TestUserFlag ITE ClrUserFlag SetUserFlag
    EX38 EX5D EX5C EX37
   ;
   FIFTEEN
   ?CaseKeyDef
   EX31
   THIRTEEN
   ?CaseKeyDef
   ::
    $ "Enter formula for "
    EX56 &$ $ "''" TWO ZERO TWO EX05
   ;
   FORTYSIX
   ?CaseKeyDef
   ::
    $ "0" EX06
   ;
   THIRTYONE
   ?CaseKeyDef
   ::
    $ "7" EX06
   ;
   THIRTYTWO
   ?CaseKeyDef
   ::
    $ "8" EX06
   ;
   THIRTYTHREE
   ?CaseKeyDef
   ::
    $ "9" EX06
   ;
   THIRTYSIX
   ?CaseKeyDef
   ::
    $ "4" EX06
   ;
   THIRTYSEVEN
   ?CaseKeyDef
   ::
    $ "5" EX06
   ;
   THIRTYEIGHT
   ?CaseKeyDef
   ::
    $ "6" EX06
   ;
   FORTYONE
   ?CaseKeyDef
   ::
    $ "1" EX06
   ;
   FORTYTWO
   ?CaseKeyDef
   ::
    $ "2" EX06
   ;
   FORTYTHREE
   ?CaseKeyDef
   ::
    $ "3" EX06
   ;
   FORTYSEVEN
   ?CaseKeyDef
   ::
    $ "." EX06
   ;
   TWO
   ?CaseKeyDef
   EX74
   THREE
   ?CaseKeyDef
   EX0C
   FOUR
   ?CaseKeyDef
   EX29
   FIVE
   ?CaseKeyDef
   EX27
   SIX
   ?CaseKeyDef
   EX28
   TEN
   ?CaseKeyDef
   EX10
   FOURTEEN
   ?CaseKeyDef
   EX2B
   TWELVE
   ?CaseKeyDef
   ::
    TOADISP EX04 TOGDISP
   ;
   TWENTYNINE
   ?CaseKeyDef
   EX1A
   TWENTYEIGHT
   ?CaseKeyDef
   EX15
   ELEVEN
   ?CaseKeyDef
   EX0F
   SIXTEEN
   ?CaseKeyDef
   EX0B
   SEVENTEEN
   ?CaseKeyDef
   EX09
   EIGHTEEN
   ?CaseKeyDef
   EX0E
   TWENTYFIVE
   ?CaseKeyDef
   EX30
   THIRTYFOUR
   ?CaseKeyDef
   EX07
   THIRTYNINE
   ?CaseKeyDef
   EX19
   FORTYFOUR
   ?CaseKeyDef
   EX1F
   FORTYFIVE
   ?CaseKeyDef
   ::
    TWELVE SetUserFlag EX18 TWELVE ClrUserFlag
   ;
   FORTYSIX
   ?CaseKeyDef
   EX2D
   FORTYEIGHT
   ?CaseKeyDef
   ::
    EX2A EX40
   ;
   FORTYNINE
   ?CaseKeyDef
   EX1D
   THIRTYFIVE
   #=casedrpfls
   FORTY
   #=casedrpfls
   DROP
   'DoBadKeyT
  ;
  TWO
  #=casedrop
  ::
   THIRTYTWO
   ?CaseKeyDef
   ::
    THIRTYNINE DUP TestUserFlag
    ITE
    ::
     ClrUserFlag
     $ "           Plot points           "
    ;
    ::
     SetUserFlag
     $ "            Plot lines           "
    ;
    EX5F VERYSLOW VERYSLOW
   ;
   SEVEN
   ?CaseKeyDef
   ::
    SEVENTEEN DUP TestSysFlag ITE ClrSysFlag SetSysFlag EX2A EX40
   ;
   EIGHTEEN
   ?CaseKeyDef
   ::
    THIRTYFIVE DUP TestUserFlag
    ITE
    ::
     ClrUserFlag
     $ "             Move right           "
    ;
    ::
     SetUserFlag
     $ "             Move down            "
    ;
    EX5F VERYSLOW VERYSLOW
   ;
   TWENTYFOUR
   ?CaseKeyDef
   ::
    TWENTY DUP TestUserFlag
    ITE
    ::
     ClrUserFlag
     $ "         Justify left             "
    ;
    ::
     SetUserFlag
     $ "         Justify right           "
    ;
    EX5F VERYSLOW VERYSLOW EX2A EX40
   ;
   FORTYSIX
   ?CaseKeyDef
   ::
    xSTD EX2A EX40
   ;
   FORTYTWO
   ?CaseKeyDef
   ::
    %2 xFIX EX2A EX40
   ;
   FORTYTHREE
   ?CaseKeyDef
   ::
    %3 xFIX EX2A EX40
   ;
   THIRTEEN
   ?CaseKeyDef
   ::
    FOURTEEN DUP TestUserFlag
    ITE
    ::
     ClrUserFlag
     $ "        Recalculate \8F           "
    ;
    ::
     SetUserFlag
     $ "        Recalculate  \90          "
    ;
    EX5F VERYSLOW VERYSLOW
   ;
   TWENTYSIX
   ?CaseKeyDef
   EX17
   THIRTYFOUR
   ?CaseKeyDef
   ::
    $ "()" EX06
   ;
   FIFTEEN
   ?CaseKeyDef
   ::
    EX12 DUPTYPELIST?
    ITE
    ::
     EX40 CARCOMP EX61 DUP TWO NTHCOMPDROP DO>STR EX57 EX62 SGROB
     GBUFF ID PT INCOMPDROP #1+ SWAP #1+ SWAP GROB! EX56 EX51 INCOMPDROP
     COERCE2 EX5A EX5B EX40
    ;
    DROP
   ;
   SEVENTEEN
   ?CaseKeyDef
   EX32
   TWELVE
   ?CaseKeyDef
   EX6D
   TWENTYONE
   ?CaseKeyDef
   EX2C
   FORTYFOUR
   ?CaseKeyDef
   EX16
   FORTYNINE
   ?CaseKeyDef
   EX14
   THIRTYFIVE
   #=casedrpfls
   DROP
   'DoBadKeyT
  ;
  THREE
  #=casedrop
  ::
   THIRTYTWO
   ?CaseKeyDef
   ::
    TOADISP xPLOTTER TOGDISP
   ;
   SEVEN
   ?CaseKeyDef
   ::
    SIXTEEN DUP TestSysFlag ITE ClrSysFlag SetSysFlag EX2A EX40
   ;
   FORTYEIGHT
   ?CaseKeyDef
   ::
    THIRTYSIX DUP TestUserFlag
    ITE
    ::
     ClrUserFlag
     $ "           Don't update          "
    ;
    ::
     SetUserFlag
     $ "              Update             "
    ;
    EX5F VERYSLOW VERYSLOW
   ;
   FIFTEEN
   ?CaseKeyDef
   ::
    TOADISP RECLAIMDISP $ "Evaluate n times" NULL$ ONE ZEROZERO
    ZERO NULL{} ONE TRUE TWO
    InputLine
    IT
    ::
     ' ID Times STO
    ;
    TOGDISP
   ;
   TWENTYONE
   ?CaseKeyDef
   EX2F
   FORTYSIX
   ?CaseKeyDef
   ::
    EX12 DUPTYPELIST?
    IT
    CARCOMP
    EX56 $ "$" SWAP &$ $>ID STO
   ;
   FORTYFOUR
   ?CaseKeyDef
   ::
    TWELVE SetUserFlag $ "Enter string for " EX56 &$ CHR_DblQuote
    CHR>$ DUP &$ TWO ZEROZERO EX05 TWELVE ClrUserFlag
   ;
   ELEVEN
   ?CaseKeyDef
   EX23
   SIXTEEN
   ?CaseKeyDef
   EX21
   SEVENTEEN
   ?CaseKeyDef
   EX20
   EIGHTEEN
   ?CaseKeyDef
   EX22
   FORTY
   #=casedrpfls
   DROP
   'DoBadKeyT
  ;
  2DROP
  'DoBadKeyT
 ;
 TrueTrue NULL{} ONEFALSE ' LAM EXIT ' ERRJMP ParOuterLoop KILLGDISP
 ABND ClrDAsOK $ "LEAVE"
;
***********************************************************************
NULLNAME EX55
::
 EX1D GBUFF EX3D INCOMPDROP GROB! EX5B
;
***********************************************************************
NULLNAME EX56
::
 ID PT INCOMPDROP EX44 SWAP UNCOERCE2 % 64 %+ xCHR SWAP %1 %- a%>$
 &$ EX13
;
***********************************************************************
NULLNAME EX57
::
 DUPLEN$ EIGHT #>
 IT
 ::
  ONE SIX SUB$ $ ".." &$
 ;
;
***********************************************************************
NULLNAME EX58
::
 2DUP ID M_ LENCOMP #> SWAP ID M_ CARCOMP LENCOMP #> OR
 ITE
 ::
  DROP DROP $ "INVLD CELL!"
 ;
 ::
  ID M_ SWAP NTHCOMPDROP SWAP NTHCOMPDROP
 ;
;
***********************************************************************
NULLNAME EX59
::
 ID M_ INNERCOMP reversym #1+ ONE
 DO
 INNERCOMP reversym #1+ ONE
 DO
 DUPTYPECSTR? NOT OVER TYPELIST? NOT AND
 IT
 DO>STR
 DUPTYPELIST?
 IT
 ::
  TWO NTHCOMPDROP DO>STR
 ;
 EX57 EX62 SGROB GBUFF INDEX@ #1- THIRTYTHREE #* #1+ JINDEX@ EIGHT
 #* #1+ GROB!
 LOOP
 LOOP
;
***********************************************************************
NULLNAME EX5A
::
 {
  LAM OB
  LAM XB
  LAM YB
 }
 BIND
 ID M_ INNERCOMP reversym DROP LAM YB ROLL LAM OB SWAP LAM XB SWAP PUTLIST
 LAM YB UNROLL ID M_ LENCOMP reversym {}N ID M_ REPLACE DROP ABND
;
***********************************************************************
NULLNAME EX5B
::
 SEVEN THIRTYTWO MAKEGROB GBUFF ID PT INCOMPDROP GROB! ID PT INCOMPDROP
 EIGHT #- EX44 EX58 DUPTYPELIST?
 IT
 ::
  TWO NTHCOMPDROP
 ;
 DUPTYPECSTR? NOT IT DO>STR
 EX57 EX62 SGROB GBUFF ID PT INCOMPDROP #1+ SWAP #1+ SWAP GROB!
;
***********************************************************************
NULLNAME EX5C
::
 ID M_ LENCOMP #1+ ONE
 DO
 ZERO INDEX@ #1+ EIGHT #* #1- GBUFF GROBDIM SWAPDROP OVER ORDERXY#
 TOGLINE3
 LOOP
;
***********************************************************************
NULLNAME EX5D
::
 ID M_ CARCOMP LENCOMP #1+ ONE DO INDEX@ THIRTYTHREE #* DUP #0<>
 IT #1- DUP EIGHT GBUFF GROBDIM DROP ROTSWAP ORDERXY# TOGLINE3
 LOOP
;
***********************************************************************
NULLNAME EX5E
::
 EX08 EX60
;
***********************************************************************
NULLNAME EX5F
::
 SGROB INVGROB GBUFF WINDOWCORNER #1+ SWAP #1+ GROB!
;
***********************************************************************
NULLNAME EX60
::
 GBUFF WINDOWCORNER SWAP GROB!
;
***********************************************************************
NULLNAME EX61
::
 DUPTYPESYMB?
 IT
 ::
  EX47 EX63
 ;
 DUPTYPECOL?
 IT
 ::
  EX3C EX63
 ;
;
***********************************************************************
NULLNAME EX62
::
 TWENTY TestUserFlag
 IT
 ::
  DUPLEN$ SEVEN #<
  IT
  ::
   DUPLEN$ SEVEN SWAP #- #1+ ONE
   DO
   $ " "  SWAP&$
   LOOP
  ;
 ;
;
***********************************************************************
NULLNAME EX63
::
 DUPTYPEREAL?
 IT
 ::
  DUP % 9.9E399 %>
  ITE
  ::
   DROP $ "  inf  "
  ;
  ::
   DUP % -9.9E399 %<
   IT
   ::
    DROP $ " -inf  "
   ;
  ;
 ;
 TWO {}N
;
***********************************************************************
NULLNAME EX64
::
 INNERCOMP DUP
 {
  LAM COUNT
 }
 BIND #1+ ONE
 DO
 LAM COUNT ROLL DUPTYPEIDNT?
 IT
 ::
  ID>$ DUP CAR$ CHR># THIRTYSIX #<>
  IT
  EX65
  $>ID
 ;
 LOOP
 LAM COUNT ::N ABND
;
***********************************************************************
NULLNAME EX65
::
 THIRTYONE TestUserFlag
 ITE
 EX68
 ::
  THIRTYTWO TestUserFlag
  ITE
  EX6A
  ::
   FORTYONE TestUserFlag
   ITE EX67 EX69
  ;
 ;
;
***********************************************************************
NULLNAME EX66
::
 EXPLODE DUP
 {
  LAM COUNT
 }
 BIND #1+ ONE
 DO
 LAM COUNT ROLL DUPTYPEIDNT?
 IT
 ::
  ID>$ DUP CAR$ CHR># THIRTYSIX #<> IT EX65 $>ID
 ;
 LOOP
 LAM COUNT IMPLODE ABND
;
***********************************************************************
NULLNAME EX67
::
 DUP CAR$ CHR># DUP SIXTYTHREE #- ID NUMBER COERCE #> IT #1+ #>CHR SWAP CDR$ &$
;
***********************************************************************
NULLNAME EX68
::
 DUP CAR$ CHR>$ SWAP CDR$ palparse DROP DUP ID NUMBER %>
 IT %1+ a%>$ &$
;
***********************************************************************
NULLNAME EX69
::
 DUP CAR$ CHR># DUP SIXTYTHREE #- ID NUMBER COERCE #> IT #1- #>CHR SWAP CDR$ &$
;
***********************************************************************
NULLNAME EX6A
::
 DUP CAR$ CHR>$ SWAP CDR$ palparse DROP DUP ID NUMBER %>
 IT %1- a%>$ &$
;
***********************************************************************
NULLNAME EX6B
::
 NULL{} ' ID ELE STO ID M_ INNERCOMP FOURTEEN TestUserFlag NOT
 IT reversym #1+ ONE DO BEGIN DUPTYPELIST? NOT ITE DROPFALSE
 TRUE UNTIL
 ID ELE REPLACE DROP ID ELE LENCOMP #1+ ONE DO
 ID ELE INDEX@ NTHCOMPDROP DUPTYPELIST? ITE
 ::
  SetAlphaAnn CARCOMP DUPTYPESYMB?
  ITE EX66 EX64 EX61 DUP TWO NTHCOMPDROP DO>STR EX57 EX62 SGROB 
  SIX THIRTYONE MAKEGROB GBUFF INDEX@ #1- THIRTYTHREE #* #1+ 
  JINDEX@ FOURTEEN TestUserFlag IT
  ::
   ID M_ LENCOMP SWAP#- #1+
  ;
  EIGHT #* #1+ THREE NDUP 7ROLL 4UNROLL GROB! GROB! ClrAlphaAnn INDEX@
  JINDEX@ FOURTEEN TestUserFlag
  IT
  ::
   ID M_ LENCOMP SWAP#- #1+
  ;
  EX5A
 ;
 DROP
 LOOP
 LOOP
 EX5B ' ID ELE PURGE
;
***********************************************************************
NULLNAME EX6C
::
 DUPNULL{}? NOT
 IT
 ::
  ID PT ' ID PTB STO INNERCOMP reversym ID PT INCOMPDROP THIRTYFIVE
  TestUserFlag
  ITE
  ::
   SWAPDROP EIGHT #/ SWAPDROP #1- ID M_ LENCOMP SWAP #- #MIN
  ;
  ::
   DROP THIRTYTHREE #/ SWAPDROP ID M_ CARCOMP LENCOMP SWAP #- #MIN
  ;
  #1+ ONE DO DUPTYPESYMB? IT xEVAL DUPTYPEIDNT? IT xRCL
  EX61 EX56 EX51 INCOMPDROP COERCE2 EX5A EX5B ID PT INCOMPDROP
  THIRTYFIVE TestUserFlag ITE #8+
  ::
   SWAP THIRTYTHREE #+ SWAP
  ;
  TWO{}N ID PT REPLACE DROP
  LOOP
  ID PTB ID PT REPLACE DROP ' ID PTB PURGE
 ;
;
***********************************************************************
NULLNAME EX6D
::
 TOADISP TURNMENUOFF DOCLLCD THIRTYSIX TestUserFlag
 ITE
 $ "Update   " $ "Don't update   "
 THIRTYFIVE TestUserFlag
 ITE
 $ "Move down" $ "Move right"
 THIRTYNINE TestUserFlag
 ITE
 $ "Plot lines" $ "Plot points"
 TWENTYFIVE TestUserFlag
 ITE
 $ "Justify right" $ "Justify left"
 FOURTEEN TestUserFlag
 ITE
 $ "Recalculate up" $ "Recalculate down"
 ' ID Times @
 ITE
 ::
  $ "  [" SWAP DO>STR &$ EX13 $ "]" &$ &$
 ;
 ::
  $ "  [1]" &$
 ;
 SIX TestUserFlag
 ITE
 $ "Don't show formulas" $ "Show formulas"
 SEVENTEEN TestUserFlag
 ITE
 $ "No status bar" $ "Status bar"
 ID M_ DUPLENCOMP SWAP CARCOMP LENCOMP UNCOERCE2 $ "Cols: "
 SWAP a%>$ EX13 &$ $ "  Rows: " ROT a%>$ EX13 &$ &$ $ "Size of "
 ID NAMES &$ $ ": " &$ ID M_ xBYTES SWAPDROP DO>STR EX13 &$ xMEM
 $ "Mem avail: " SWAP DO>STR EX13 &$ %2 a%>$ DUP EX13 LEN$ SWAP LEN$
 SWAP #- DUP #0=
 ITE
 ::
  DROP $ "   STD"
  ;
 ::
  #1- UNCOERCE a%>$ EX13 $ "   xFIX " SWAP&$
 ;
 &$ TEN #1+ ONE DO SGROB ZERO INDEX@ #1- #6* ROT XYGROBDISP LOOP
 WaitForKey DROP DROP RECLAIMDISP TOGDISP
;
***********************************************************************
NULLNAME EX6E
::
 reversym TWO #/ SWAPDROP DOCLLCD #1+ ONE DO
 SGROB ZERO INDEX@ #1- #6* ROT XYGROBDISP SGROB BINT_65d INDEX@
 #1- #6* ROT XYGROBDISP LOOP WaitForKey DROP DROP
;
***********************************************************************
NULLNAME EX71
::
 CK2&Dispatch
 #33
 ::
  {
   LAM XL
   LAM XR
  }
  BIND LAM XR CDR$ DOSTR> LAM XL CDR$ DOSTR> 2DUP %MAX %1+ ROT ROT
  %MIN COERCE2 DO LAM XR CAR$ CHR># SIXTYFOUR #- LAM XL CAR$ CHR># SIXTYFOUR #- UNCOERCE2 
  TWO{}N SORT INCOMPDROP %1+ SWAP COERCE2 DO ID M_ JINDEX@ NTHCOMPDROP INDEX@ NTHCOMPDROP
  LOOP LAM XR CAR$ CHR># LAM XL CAR$ CHR># #- DUP #0= NOT ITE
  ::
   #1+ {}N
  ;
  DROP LOOP LAM XR CDR$ DOSTR> LAM XL CDR$ DOSTR> %- %ABS DUP %0= NOT
  ITE
  ::
   %1+ COERCE {}N
  ;
  DROP ABND
 ;
;
***********************************************************************
NULLNAME EX72
::
 WaitForKey DROP TWENTYFIVE
 OVER#=case
 ::
  DROP ZERO
  OVER#=case
  ::
   DROP ID BR EX56 &$ $ " Through " &$ ID BR REPLACE DROP EX56 ONE EX73
  ;
  ONE
  #=case
  ::
   EX56 TWO EX73
  ;
 ;
 FORTYFIVE
 OVER#=case
 ::
  DROP NDROP NINE ClrUserFlag THREE EX73
 ;
 ELEVEN
 OVER#=case
 ::
  DROP EX0F EX73
 ;
 SIXTEEN
 OVER#=case
 ::
  DROP EX0B EX73
 ;
 SEVENTEEN
 OVER#=case
 ::
  DROP EX09 EX73
 ;
 EIGHTEEN
 OVER#=case
 ::
  DROP EX0E EX73
 ;
 DROP BEEPER EX73
;
***********************************************************************
NULLNAME EX73
::
 EX3A EX60 DUP TWO
 #<case
 ::
  ID BR EX56 &$ EX5F EX72
 ;
 DUP TWO
 #=case
 ::
  DROP ' ID BR PURGE EX71
 ;
 THREE
 #=case
 ::
  ' ID BR PURGE
 ;
;
***********************************************************************
NULLNAME EX74
::
 NINE SetUserFlag $ "Extract " ' ID BR STO ZERO EX73
;
****************************************************************
NULLNAME SORT
::
 CK1&Dispatch
 FIVE
 ::
  INNERCOMP DUP1LAMBIND #1+ ONE DO 1GETLAM ROLL ZERO INDEX@
  BEGIN 2DUP SWAP#- #2/ DUP#0<> WHILE
  ::
   OVERSWAP #-DUP #4+PICK 5PICK %> ITE ROTDROPSWAP SWAPDROP
  ;
  REPEAT ROT2DROP UNROLL LOOP 1GETABND {}N
 ;
;

NULLNAME EX34
 EX61

* Creates a new sheet with 4 cols and 9 rows
NULLNAME EX35
::
 {
  $ ""
  $ ""
  $ ""
  $ ""
 }
 SEVEN #1+ ONE DO DUP LOOP EIGHT {}N ' ID M_ STO
;

************************************************************************
* This routine saves the current sheet and data to var
************************************************************************

NULLNAME EX36
::
 RECLAIMDISP $ "Save sheet as.." ID NAMES TYPECSTR? NOT ITE $ "Unnamed"
 ID NAMES DUPLEN$ #1+ ZERO ZERO TWELVE SetUserFlag EX42 IT
 EX25 $ "JUSTSAVE" EQUAL NOT IT EX24 TWELVE ClrUserFlag
;

***********************************************************************
* Stores the databox grob to a global var
************************************************************************

NULLNAME EX37
::
 GBUFF WINDOWCORNER SWAP OVER BINT_131d #+ OVER #8+ SUBGROB
 WINDOWCORNER SWAP THREE {}N ' ID TP8 STO
;

***********************************************************************
* Creates a xBLANK grob sized according to sheet size
************************************************************************

NULLNAME EX39
::
 ID M_ CARCOMP LENCOMP THIRTYTHREE
 #* ID M_ LENCOMP EIGHT #* #8+ MAKEPICT# TOGDISP ID GPOS INCOMPDROP WINDOWXY
 TURNMENUOFF ID PT INCOMPDROP GBUFF GROBDIM SWAP ROT #< UNROT #> OR
 IT
 ::
  ZERO EIGHT TWO{}N ' ID PT STO
 ;
 EX59 THIRTY TestUserFlag
 IT
 ::
  EX37 EX5D EX5C EX38
 ;
;

**********************************************************************
* Grob of empty databox
************************************************************************

NULLNAME EX3A
GROB 11A 8000038000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30100000000000000000000000000000004010000000000000000000000000000000401000000000000000000000000000000040100000000000000000000000000000004010000000000000000000000000000000401000000000000000000000000000000040EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30

**********************************************************************
* Toggles on/off the cursor
************************************************************************

NULLNAME EX40
::
 ID PT INCOMPDROP 2DUP 2DUP #7+ SWAP THIRTYTWO #+ SWAP GBUFF 5UNROLL
 SUBGROB INVGROB GBUFF 4ROLL 4ROLL GROB!
;

**********************************************************************
* Plotter routine
************************************************************************

NULLNAME EX6F
::
 CK2&Dispatch
 #55
 ::
  DOCLLCD TURNMENUOFF DUP %0 EQUALPOSCOMP #0=
  IT
  ::
   %0 >HCOMP SWAP %0 >HCOMP SWAP
  ;
  OVER SORT DUP CARCOMP SWAP DUPLENCOMP NTHCOMPDROP 3PICK SORT
  DUP CARCOMP SWAP DUPLENCOMP NTHCOMPDROP 5PICK LENCOMP 7PICK LENCOMP
  #MIN
  {
   LAM XD
   LAM YD
   LAM XLO
   LAM XHI
   LAM YLO
   LAM YHI
   LAM #_
  }
  BIND
  LAM YHI LAM YLO %- % 63 %/ LAM XHI LAM XLO %- % 130 %/
  {
   LAM YR
   LAM XR
  }
  BIND
  ZERO LAM YHI LAM YLO %- LAM YLO %ABS %- LAM YR %/ DUP1LAMBIND COERCE
  # 81 OVER LINEON LAM #_ #1+ ONE DO
  % 130 LAM XHI LAM XD INDEX@ NTHCOMPDROP %- LAM XR %/ %- LAM YHI LAM YD
  INDEX@ NTHCOMPDROP %- LAM YR %/ COERCE2 THIRTYNINE TestUserFlag
  ITE
  ::
   OVER 1GETLAM COERCE ORDERXY# LINEON
   ;
  PIXON LOOP WaitForKey DROP DROP RECLAIMDISP ABND ABND ABND
 ;
;

***********************************************************************
* Process list for plotter, reals only!
************************************************************************

NULLNAME EX70
::
 INNERCOMP DUP1LAMBIND #1+ ONE DO ISTOP@ #1- ROLL DUPTYPELIST? IT
 ::
  TWO NTHCOMPDROP
 ;
 LOOP NULL{} 1GETLAM #1+ ONE DO 1GETLAM #1+ INDEX@ #1- #- ROLL DUPTYPEREAL?
 ITE
 ::
  OVER TYPELIST? ITE >TCOMP DROP
 ;
 ::
  DROP DROP %0
 ;
 LOOP ABND
;

* This is strictly Jack Levy's code.

NULLNAME SGROB
::
  CK1NOLASTWD DUPTYPECSTR? NcaseTYPEERR
  DUPNULL$? casedrop NULLGROB ROMPTR 101 3
  OVERLEN$ FOUR #* SIX SWAP MAKEGROB UNROT
CODE    
        A=DAT1  A               * font address -> A[A]
        A=A+CON A,10            *
        R0=A.F  A               * body of font -> R0[A]
        D1=D1+  5               * 
        D=D+1   A               * 
        A=DAT1  A               *
        R1=A.F  A               * string -> R1[A]
        D1=D1+  5               * 
        D=D+1   A               * 
        GOSBVL  =SAVPTR         * save pointers with grob on stack

        A=DAT1  A               *
        D0=A                    * grob -> D0
        D0=D0+  15              *
        A=DAT0  A               * pixel width -> A[A]
        GOSBVL  =w->W           *
        B=A     A               * row nibbles -> B[A]
        D0=D0+  5               * roll to body of grob
        
        C=R1.F  A               *
        GOSBVL  =GetStrLenC     *
        D=C     A               * characters -> D[A], body -> D1
        
NextChr D=D-1   A               *
        GOC     Quit            * if no more characters, quit
        C=0     A               *
        A=0     A               *
        A=DAT1  B               * read character from string
        C=R0.F  A               * recall address for body of font
        A=A+A   A               *
        C=C+A   A               *
        C=C+A   A               *
        C=C+A   A               *
        CD0EX                   * font address for character -> D0
        A=DAT0  6               * read data for this character
        D0=C                    * grob address -> D0, C[A]

DrwChLp DAT0=A  P               * write data to screen
        CD0EX                   *
        C=C+B   A               * roll to next "row" of grob
        CD0EX                   *
        P=P+1                   *
        ?P#     6               * finished yet?
        GOYES   DrwChLp         *

        P=      0               *
        D0=C                    *
        D0=D0+  1               * advance to next pixel
        D1=D1+  2               * advance to next character
        GOTO    NextChr         * jump back to start drawing

Quit    GOVLNG  =GETPTRLOOP     * get pointers, restore inner loop
ENDCODE
;


****************************************************************
	
[ RETURN TO DIRECTORY ]