Classic Computer Magazine Archive A.N.A.L.O.G. ISSUE 59 / APRIL 1988 / PAGE 15

Upward

  Upward



Climb for your life
in this Action! game.


by Greg Knauss

    They left you! They actually left you! Sure, you had wandered off without telling anybody. Sure, the main transport was running short of air. Sure, nobody really likes you anyway. But still...
    "Well," you think, glancing up into the dimly filtered and dirty light, "gotta get out somehow. What to do, what to do ... "
    For no very good reason, you think back fondly on your carefree and happy adventuring days, the years you spent exploring, discovering and fighting-all for fun and profit. You were brave, you were valiant. You were the type of guy who, on a bet, would walk into a Marine recruiting office and start signing papers without reading them. You would eat a plateful of beans and then attend an opera. Yes, you bordered on foolhardy. And then you signed up with the government. No, not the Marines; that test with the pegs is a lot harder than it looks... You joined the Solar Energy Commission, Subterranean Division.
    And now you're trapped at the bottom of an unpleasantly deep cavern with only a full tank of oxygen, an ugly brute of a bat and the ever-present poison-tipped darts.
    "Oh dear," blue-pencils in the editor after seeing what you would probably say in this situation. "Well, I might as well get started."
    You plug your headphones into the government issue Ultimate Heavy-Duty Super-Compact Tape Player Complete with Ashtray and drop in a tape. Gunk music, just your luck ...
    As you start your long, long ascent, a thought flitters across your mind: "I hope the ropes hold."

Instructions.
    To start this finger-mangling business of typing in Upward, first, select a disk with only DOS and DUP on it. Get the disk ready to store the thing on, and slam (or, for those of lesser enthusiasm, put) the Action! cartridge into your computer.
    Now start typing Listing 1. A bit of advice: the numbers are easier to enter if you have a (soon to be ex-) friend read them to you.
    Done? Okay, save the file (as UPWARD) through the editor before compiling! Also, make sure you check your typing with "D:CHECK in Action!" (issue 44). This is because, if you made a mistake, you don't want the whole program eaten. Half the game is machine language, and, if you mistyped something, the computer will acquire a bad case of schizophrenia. So save the silly thing!
    Now, remove Action!, put in BASIC and type in Listing 2, the CREATOR, checking your typing with "BASIC Editor II (issue 47). This program is only used once, since it creates a file on disk which Upward reads in as a set.
    Now, after saving and running (in that order) CREATOR, reinsert the Action! cartridge, go to the monitor, and type R"UPWARD". (You need to run it straight from the monitor, because the source and object code won't fit into the computer at once.)

The rules.
    When the game is run, you'll see, low on the screen, the game title and a little man running around. Chasing our hero is an irritating bat named Skyler. Skyler's speed can be changed between its three settings by hitting the SELECT key. Choose one of his three accuracy levels with OPTION. Press START or tap on the joystick button to begin play.
    You start the game at the bottom of a nauseatingly deep cavern, and you must reach the top while both your life and air hold out.
For you masochists, there are several ways to die:
    (1) Lava has the predictable effect on your guy-anybody who's lost a marshmallow while toasting it knows what that's like.
    (2) Skyler the bat takes huge joy in chomping large bites out of you, thus reducing your strength and killing you slowly. To indicate that Skyler's hurting you, your character will turn a bright pink, partly from anger, partly from rage-but, mostly, from embarrassment.
    (3) Darts. Your good friend Illinois Smith told you there were lots of these sorts of things in big caves. They're here, en masse. As with Skyler, these don't kill you instantly, but reduce your strength.

    And, of course, there's one way to lose air: breathe. Since you're assumed to be human (be it a correct assumption or not), you do this automatically.
    When the game is in progress, there are two gray bars across the top of the screen. The top one, labeled Str:, is how much strength you have left. The second one, Air:, is the oxygen left in your tanks. Once either reaches zero, it's bye-bye!
    Life, tenuous as it is, is apportioned to you at the rate of only one per game. Now, since one life in a cave where death can come at any instant is very aggravating (not to mention annoying and frustrating), I would advise you to look before you leap.
    Move the joystick to have your man, er, person (sorry) move about. As might be predicted, you must be by a rope to move up and down.
    Jumping is accomplished by pressing the button. And, yes, you can jump off of and onto ropes.
    The SPACE BAR toggles the pause feature.
    When the game ends, the obvious message will be displayed, along with your score and, if appropriate, an asterisk beside it to proclaim a high score. Hit the trigger to return to the title page.

    And now, Upward!

    Greg Knauss is: politically, liberal; physically, not too hot; scholastically, fairly bored; psychologically, very confused; cosmically, insignificant; and emotionally, quite happy, thank you. On a whim, he has been know to program an entire game just to write a new biography.

The two-letter checksum code preceding the line numbers in Listing 2 is not a part of the BASIC program. For further information, see the "BASIC Editor II," in issue 47.

    Listing 1.
Action! listing.

; UPWARD by Greg Knauss

; CHECKSUM DATA
;[6A 3D ED A8 39 AC IE D9
; FF 74 FC 62 C0 0B 27 6C
; 92 E6 FF 87 E9 7E E6 9F
; AA A6 E8 78 A7 9A 95 62
; 80 D9 29 79 79 70 EF 7C
; C0 85 AA CD IA B4 EF ED
; B8 E1 E9 F2 DD FB 78 D0
; 45 29 D6 58 AB 75 E8 7E
; 8F 16 A5 2E D9 6E 31 61 ]

BYTE
  P,PLY=1780,PIC,PL=1784,PD=1772,
  DRW=[1],SKX,SKY=1782,SPIC=[1],
  SSP=[3],SAC=[80],SCT=[0],DAX,
  DAY=1783,DART,Y,S,I,L,PM,PC=53253,
  PPC=53260,SLO,SHI,LO,HI,N,V,ES,STR,
  SN,LNS=[0]

BYTE ARRAY
  ST="D:UPSET.A"

INT
  K1,Y1,K,SK,SY,DX,DY

CARD
  DRB,DL,CH,SC=[0],HSC=[0],AIR,J

PROC DLIST()
  [112 112 112  71   0   0   6   2
     0   2 128   0 101   0   0  37
    37  37  37  37  37  37  37  37
     5  65   0   0]
RETURN

PROC DLI()
  [ 72 169   0 141  10 212 141  22
   208 169   0 141  23 208 169   0
   141  24 208 169   0 141  25 208
   169   0 141  10 212 169   0 141
    26 208 169   0 141   9 212 104
    64]
RETURN

PROC PLRVBI()
  [162     3 189 244   6 240  89  56
   221 240   6 240  83 141 254   6
   106 141 255   6 142 253   6  24
   169   0 109 253   6  24 169 252
     6 133 204 133 206 189 240   6
   133 203 173 254   6 133 205 189
   248   6 170 232  46 255   6 144
    16 168 177 203 145 205 169   0
   145 203 136 202 208 244  76  87
     6 166   0 177 203 145 205 169
     0 145 203 200 202 268 244 174
   253   6 173 254   6 157 240   6
   189 236   6 240  48 133 203  24
   138 141 253   6 109 235   6 133
   204  24 173 253   6 109 252   6
   133 206 189 240   6 133 205 189
   248   6 170 160   0 177 203 145
   205 200 202 208 248 174 253   6
   169   0 157 236   6 202  48   3
    76   2   6  76  98 228   0   0]
RETURN

PROC CHSTORE()
  [170 170 170 170 170 170 170 170
    85 170 170 170 170 170 170 170
     0  85 170 170 170 170 170 170
     0   0  85 170 170 170 170 170
     0   0   0  85 170 170 170 170
     0   0   0   0  85 170 170 170
     0   0   0   0   0  85 170 170
     0   0   0   0   0   0  85 170
     0   0   0   0   0   0   0  85
   168  32   0   0   0   0   0   0
   178  42  32   0   0   0   0   0
   170  42  34   0   0   0   0   0
   170 170 170 168  32   0   0   0
   170 170 170 170 168  32   0   0
   170 170 170 170 170 168  32   0
   170 170 170 170 170 170  40  32
     0   0   0   0   0   0   0   0
    85 170 170 170 170 170 170  32
    85 170  42  42  42  10  10   0
    85 170 170 168 168 160 128 128
     0   0  64 128 144 164 168 169
     0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0
     1   2   2   6  10  26  42 106
   170  42  42  10  18   2   2   2
   170 168 160 128 128 128   0   0
   125 190 190 190 174 190 190 190
    48  60  60  60  12  60  60  60
   186 190 190 190 174 190 190 190
   255 255 255 255 255 255 255 255
   255 191 191 191 175 175 171 170
   255 254 254 250 250 234 178 170
   170 171 175 175 191 191 255 255
   170 234 234 250 258 250 254 254]
RETURN

PROC GPIX()
  [ 56  56  56  16 124 254 186 186
   186 124  56  48  40  40  40 108
    56 186 186 146 254 124  56  56
    56  56  56  40  40  40  40 108
   184 184 186 210 122  62  60  56
    56  60  60  44  40  44  32  96
    56 186 186 146 254 124  56  56
    56  56  56  40  40  40  40 108
    58  58 186 150 188 248 120  56
    56 120 128 104  40 104   8  12
    28  24  28   8  28  60  60  62
    60  30  31  17  50  34  32  48
    28  24  28   8  60 125  95  94
    28  28  28  54  98  66  67   0
    28  24  28   8  28  60  60  60
    62  28 108  60  20   4   4   6
    28  24  28   8  28  28  28  28
    28  28  30  30  28   8   8  12
    56  24  56  16  56  60  60 124
    60 120 248 136  76  68   4  12
    56  24  56  16  60 190 250 122
    56  56  56 108  70  66 194   0
    56  24  56  16  56  60  60  60
   120  56  54  60  24  16  16  48
    56  24  56  16  56  56  56  56
    56  56 120 120  56   8   8  24
    56  58  58  18 126 252 184 184
   184 120  56  40  40  40  40 108]
RETURN

PRO( SPIX()
  [  0   0   0   0   0   0  40 186
   214 124  56  16  40  56 214 124
    56  16  40  56  84 254 186  16
    40  56  84 254  56 16]
RETURN

PROC MUS()
  [  0   0   0   0 150   0 180 100
     0   0  75   0 100 100   0  55
    75 100   0 180  75  55   0   0]

PROC MUS1()
  [250   0   0 250   0   0 250   0
     0 250   0   0 250   0   0 250
     0   0 250   0   0 250   0   0]

PROC SETUP ()
  Graphics(0)
  Poke (82,0)
  Poke(752,1)
  PrintE(" ")
  CH=(Peek(106)-40)*256
  MoveBlock(CH+80,CHSTORE,272)
  Zero(CH,8)
  DL=PeekC(560)
  SHI=Peek(106)-36
  SLO=0
  MOveBlock(DL,DLIST,29)
  J=PeekC(88)

  PokeC(DL+4,J)
  PokeC(DL+13,SHI*256)
  PokeC(DL+26,DL)
  Zero(704,9)
  Poke(DLI+2,0)
  Poke(DLI+10,0)
  Poke(DLI+15,0)
  Poke(DLI+20,0)
  Poke(DLI+25,0)
  Poke(DLI+35,CH/256)
  PokeC(512,DLI)
  Poke(54286,192)
  MoveBlock(1536,PLRVBI,168)
  PM=Peek(106)-16
  DRB=PM*256+1
  Zero(DRB+1024,1024)
  Poke(623,4)
  Poke(559,62)
  Poke(1788,PM+4)
  Poke(53277,3)
  Poke(54279,PM)
  Poke(1771,PM)
  PL=16
  Poke(1785,3)
  PD=1
  Poke(1773,1)
  SKY=6
  SKX=0
  Poke(1786,6)
  Poke(1774,0)
  Poke(1787,1)
  Poke (1775,1)
  MoveBlock(DRB,GPIK,240)
  MoveBlock(DRB+511,SPIX,30)
  FOR J=DRB TO DRB+2 DO
    Poke(J+256,56)
    Poke(J+512+255,60)
  OD
  POKEC(548,PLRVBI)
RETURN

PROC OXY()
  Color=32
  Plot(38,2)
  DrawTo(AIR/280+5,2)
RETURN

PROC LIFE()
  Color=32
  Plot(38,1)
  DrawTo(STR/6-2,1)
RETURN

PROC PLAY()
  V==+2
  IF V>15 THEN
    N==+1 V=0
    Sound(0,0,0,0)
    Sound(l,0,0,0)
  FI
  IF N=24 THEN
    N=0
  FI
  J=Peek(MUS+N)
  IF J>0 THEN
    Sound(0,J,12,15-V)
  FI
  J=Peek(MUS1+N)
  IF J>0 THEN
    Sound(1,J,10,15-V)
  FI
RETURN

PROC MOVE()
  PLY==+Y1
  P==+X1
  Poke(53248,P)
  Poke(53249,P)
  Poke(1781,PLY+15)
  Poke(704,15)
  IF PPC=6 THEN
    STR==-1
    Poke(704,70)
    LIFE()
  FI
  IF PPC=10 OR PPC=8 THEN
    STR==-25
    Poke(53251,0)
    DART=0
    LIFE()
  FI
RETURN

PROC SRTDRT()
  DART=0
  Poke(53251,0)
  DAX=Rand(50)+100
  DAY=0
RETURN

PROC BANG()
  DAX=DAX+DX
  Poke(53251,DAX)
  IF DAX=2 OR DAX=252 THEN
    DART=0
    SRTDRT()
  FI
RETURN

PROC SKYLER()
  IF SCT=SSP THEN
    SCT=0
    IF SKX MOD SAC=0 THEN
      SX=0
      SY=0
      IF SKX<P THEN
        SX=1
      FI
      IF SKX>P THEN
        Sx=-1
      FI
      IF SKY<PLY THEN
        SY=1
      FI
      IF SKY>PLY THEN
        SY=-1
      FI
    FI
    SPIC==+1
    IF SPIC=5 THEN
      SPIC=1
    FI
    Poke(1774,SPIC*6)
    SKY==+SY
    SKX==+SX
    Poke(53256,SKX)
  FI
  SCT==+1
RETURN

PROC WAY()
  x1=0
  Y1=0
  IF S=14 THEN
    Y1=-1
    LO=1
    HI=4
  FI
  IF S=13 THEN
    Y1=1
    LO=1
    HI=4
  FI
  IF S=7 THEN
    X1=1
    LO=5
    HI=8
  FI
  IF S=11 THEN
    X1=-1
    LO=9
    HI=12
  FI
  IF X1<>0 THEN
    K=X1
  FI
RETURN

PROC LEGAL()
  IF PC=0 THEN
    Y1=1
    X1=0
  FI
  IF PC=1 OR PC=9 THEN
    Y1=0
  FI
  IF PC=2 THEN
    P==-K
    Y1=1
    x1=0
  FI
  IF PC=3 THEN
    Y1=-1
  FI
  IF PC=4 OR PC=6 THEN
    X1=0
  FI
  IF P<48 THEN
    P=48
  FI
  IF P>202 THEN
    P=202
  FI
RETURN

PROC ANIMATE()
  IF S=15 THEN
    IF PC=1 OR PC=5 OR PC=9 THEN
      PD=DRW
    FI
    IF PC=0 THEN
      PD=DRW+16
    FI
  FI
  IF PC=1 OR PC=9 THEN
    IF S=13 OR S=14 THEN
      PD=DRW+208
      S=15
    FI
  FI
  IF (S=7 OR S=11) AND
     (PC=4 OR PC=6) THEN
    S=15
  FI
  IF S<>15 THEN
    IF (X1<>0 AND P MOD 2=0) OR
       (PC<>0 AND Y1<>0 AND
        PLY MOD 3=0) OR
       (PC=0 AND (S=7 OR S=11)) THEN
      PIC==+1
    FI
    IF PIC<LO OR PIC)HI THEN
      PIC=LO
    FI
    PD=DRW+PIC*16
  FI
RETURN

PROC JUMP()
  IF X1=1 THEN
    PD=DRW+96
  FI
  IF X1=-1 THEN
    PD=DRW+160
  FI
  FOR I=1 TO 40 DO
    IF 1>35 THEN
      Y1=2
    FI
    IF I<19 THEN
      Y1=1
    FI
    IF I<11 THEN
      Y1=0
    FI
    IF I<8 THEN
      Y1=-1
    FI
    IF I<4 THEN
      Y1=-2
    FI
    Poke(53278,0)
    FOR J=1 TO 750 DO OD
    IF (PC=4 OR PC=6) AND I>10 THEN
      PD=DRW+32
    FI
    IF PC>0 AND PC<>2 AND 1>10 THEN
      RETURN
    FI
    IF PLY=189 OR STR<54 THEN
      RETURN
    FI
    IF P<48 OR P>202 THEN
      X1=-X1
      K=X1
    FI
    IF PC=2 THEN
      X1=-X1
    FI
    MOVE()
    SKYLER()
    PLAY()
    IF DART=1 THEN
      BANG()
    FI
  OD
RETURN

PROC DN()
  SndRst()
  FOR S=1 TO 6 DO
    FOR I=8 TO 15 DO
      Poke(54277,13
      PLY==-1
      SKY==-1
      DAY==-1
      Poke(1781,PLY+15)
      FOR J=1 TO 100 DO OD
    OD
    Poke(54277,0)
    SLO==+40
    IF SLO<40 THEN
      SHI==+1
    FI
    Poke(DL+13,SLO)
    Poke(DL+14,SHI)
  OD
  SRTDRT()
  SC==-10
RETURN

PROC UP()
  SndRst()
  FOR S=1 TO 6 DO
    Poke(54277,15)
    SLO==-40
    IF SL0>215 THEN
      SHI==-1
    FI
    Poke(DL+13,SLO)
    Poke(DL+14,SHI)
    I=15
    FOR Y=1 TO 16 DO
      Poke(54277,I)
      I==-1
      PLY==+1
      SKY==+1
      DAY==+1
      Poke(1781,PLY+15)
      FOR J=1 TO 100 DO OD
    OD
  OD
  SRTDRT()
  SC==+10
RETURN

PROC FADEIN()
  FOR I=0 TO 15 DO
    Poke(704,I)
    Poke(707,I)
    Poke(710,I)
    IF I<5 THEN
      Poke(DLI+20,64+I)
    FI
    IF I<5 THEN
      Poke(712,144+I)
    FI
    IF I<7 THEN
      Poke(DLI+10,48+I)
      Poke(709,I)
    FI
    IF I<9 THEN
      Poke(DLI+2,48+I)
      Poke(706,I)
    FI
    IF I<11 THEN
      Poke(DLI+15,I)
    FI
    IF I<13 THEN
      Poke(708,32+I)
    FI
    FOR J=1 TO 2000 DO OD
    Sound(0,200,8,15-I)
  OD
RETURN

PROC PLRGO()
  FOR I=0 TO 3 DO
    Poke(704+I,0)
    Poke(53248+I,O)
  OD
  DN()
  PLY=200
  DN()
  Poke(559,0)
  Poke(712,0)
  UP()
  PLY=50
  UP()
RETURN

PROC PAUSE()
  Poke(764,255)
  SndRst()
  Position(27,0)
  Print("PAUSED")
  WHILE Peek(764)<>33 DO OD
  Position(27,0)
  Print("      ")
  Poke(764,255)
RETURN

PROC TITLE()
  SndRst()
  J=PeekC(88)
  Poke(77,0)
  Poke(88,SLO-40)
  Poke(89,SHI-1)
  Print("***>   B*C          ")
  Print("             A******")
  Print("***C    3           ")
  Print("             B******")
  Print("***                 ")
  Print("              4B****")
  Print("**C     + + ++> +   ")
  Print("+ A+> ++> ++>   3B**")
  Print("*C      * * * * *   ")
  Print("* * * * * *B*     B*")
  Print("*>      * * *+C * + ")
  Print("* *+* *+C * *      *")
  Print("**      *>* *   *>*A")
  Print("* * * *B> *A*     A*")
  Print("**>     B*C *   B***")
  Print("C * * * B>**C    A**")
  Print("B**+++++++++++++++++")
  Print("+++++++++++++++++**C")
  Print(" 3456789876543456789")
  Print("8987654345678987653 ")
  Zero(SHI*256+400,600)
  PokeC(88,J)
  Print("")
  Position(4,1)
  Print("Copyright 1985 ")
  Print("ANALOG Computing")
  IF HSC=0 THEN
    Position(13,2)
    Print ("By Greg Knauss")
  FI
  IF HSC>0 THEN
    Position(13,2)
    Printt"High Store: ")
    PrintC(HSC)
  FI
  AIR=6600
  STR=246
  SN=1
  N=0
  V=0
  P=183
  PLY=187
  S=15
  PIC=0
  MOVE()
  FADEIN()
  FOR L=1 TO 5 Do
  PLY=187
    PD=DRW+208
    FOR J=1 TO 10000 DO OD
    PD=DRW
    FOR J=1 TO 10000 DO OD
  OD
  SRTDRT()
  S=11
  WHILE Peek(53279)<>6 AND
        STrig(0)<>0 DO
    AIR=6600
    STR=246
    IF P=190 THEN
      S=11
    FI
    IF P=58 THEN
      S=7
    FI
    PLY=187
    WAY()
    MOVE()
    ANIMATE()
    SKYLER()
    PLAY()
    Poke(53278,0)
    FOR J=1 TO 700 DO OD
    IF Peek(53279)=5 THEN
      SSP==-1
      SCT=0
      IF SSP=0 THEN
        SSP=3
      FI
      SndRst()
      FOR J=1 TO 250 DO
        Sound(0,J,10,15-J/16)
      OD
    FI
    IF Peek(53279)=3 THEN
      SAC==-20
      IF SAC=0 THEN
        SAC=80
      FI
      SndRst[7
      FOR J=1 TO 250 DO
        Sound(0,250-J,18,15-J/16)
      OD
    FI
    IF P=DAX AND DART=0
             AND DAY=0 THEN
      DART=1
      DAY=Rand(100)+75
      DX=Rand(2)
      IF DX=0 THEN
        DX=-3
        DAX=245
      FI
      IF DX=1 THEN
        DX=3
        DAX=3
      FI
    FI
    IF DART=1 THEN
      BANG()
    FI
    IF DART=0 THEN
      SRTDRT()
    FI
  OD
  SC=118
  PLRGO()
  SHI=SHI+4
  Poke(DL+14,SHI)
RETURN

PROC ERR()
  Close(1)
  IF SN=1 THEN
    Position(0,1)
    Print(" Please insert a ")
    PrintE("disk With Upward sets ")
    Print("    present and press")
    Print(" the .    ")
    Poke(712,149)
    Poke(559,62)
    WHILE STrig(0)=1 DO OD
    SSP==+1
    SAC==+20
    Poke(559,0)
    Poke(712,0)
  FI
  SN=1
  SSP==-1
  IF SSP=0 THEN
    SSP=1
    SAC==-20
    IF SAC=0 THEN
      SAC=20
      SSP=1
    FI
  FI
  Open(1,"D:UPSET.A",4,0)
RETURN

PROC READSET()
  IF LNS=0 THEN
    Close(1)
    LNS=1
    Poke(ST+9,SN+64)
    Error=ERR
    Open(1,ST,4,0)
    FOR J=0 TO 2999 DO
      S=GetD(1)
      Poke(SHI*256+J,S)
    OD
  FI
  Close(1)
  AIR=6600
  STR=246
  ES=0
  Print("")
  Position(2,1)
  Print("Str:")
  Print("")
  Position(2,2)
  Print("Air:")
  Print("")
  FOR J=3000 TO 3079 DO
    Poke(SHI*256+J,10)
  OD
  Poke(559,62)
  FADEIN()
  FOR P=1 TO 11 DO
    DN ()
    PLY=200
  OD
  PD=DRW
  Poke(704,8)
  P=185
  PLY=187
  MOVE()
  FOR I=0 TO 15 DO
    Poke(704,I)
    FOR J=1 TO 3800 DO OD
  OD
RETURN

PROC GOGOGO()
  DO
    SETUP()
    TITLE()
    DO
      READSET()
      WHILE ES=B DO
        Poke(77,0)
        IF PC=8 OR PC=18 OR PC=12 OR
           STR<54 OR AIR<54 THEN
          ES=1
        FI
        IF PLY<110 AND SLO=0 THEN
          ES=2
        FI
        AIR==-1
        IF AIR MOD 200=0 THEN
          OXY()
        FI
        S=Stick(0)
        WAY()
        IF STrig(0)=0 AND PC<>0 AND
           PC<>2 AND PC<>3 AND
           PC<>8 THEN
          JUMP 0
        FI
        LEGAL()
        MOVE()
        SKYLER()
        ANIMATE()
        PLAY()
        Poke(53278,8)
        IF P=DAX AND DART=0 AND
           DAY=0 THEN
          DART=1
          DAY=PLY+10
          DX=Rand(2)
          IF DX=0 THEN
            DX=-3
            DAX=245
          FI
          IF DX=1 THEN
            DX=3
            DAX=3
          FI
        FI
        IF DART=1 THEN
          BANG()
        FI
        IF PLY>189 THEN
          DN()
        FI
        IF PLY<85 THEN
          UP()
        FI
        FOR J=1 TO 788 DO OD
        IF Peek(764)=33 THEN
          PAUSE()
        FI
      OD
      IF ES=2 THEN
        SC==+(STR/3)+(AIR/100)
        Poke(706,0)
        Poke(707,0)
        Position(25,0)
        Print("SCORE: ")
        PrintCE(SC)
        Print("            ")
        Print("Congratulations!")
        PrintE["           ")
        Print("  For next cavern ")
        Print("press the .")
        WHILE STrig(0)=1 DO
          PD=DRW+16
          x1=0
          SKY=200
          JUMP()
          FOR J=1 TO 800 DO OD
        OD
        Zero(SHI*256+400,600)
        PLRGO()
        SC==+110
        LNS=0
        SN==+1
      FI
      UNTIL ES=1
    OD
    PD=DRW+16
    FOR I=0 TO 15 DO
      PL==-1
      PLY==+1
      Poke(704,15-I)
      SKYLER()
      IF DART=1 THEN
        BANG()
      FI
      PLAY()
      FOR J=1 TO 1000 DO OD
    OD
    S=0
    WHILE STrig(0)=1 DO
      SKYLER()
      IF DART=1 THEN
        BANG()
      FI
      PLAY()
      S==+1
      IF S=1 THEN
        Position(21,0)
        Print("      ")
      FI
      IF S=100 THEN
        Position(21,0)
        Print("    SCORE: ")
        PrintC(SC)
        IF SC)HSC THEN
          Print("")
        FI
        Print("   ")
      FI
      FOR DL=1 TO 800 DO OD
    OD
    IF SC>HSC THEN
      HSC=SC
    FI
    IF SN)1 THEN LNS=0 FI
  OD
RETURN


    Listing 2.
BASIC listing.

IK 8 POKE 82,8:DIM AS(42),BS(42)
DZ 10 ? " PLEASE PUT THE DISK TO CON
   TAIN THE     SET INTO DRIVE ONE AND P
   RESS .":INPUT AS
UE 20 OPEN #1,8,0,"D:UPSET. A"
QV 30 FOR J=1 TO 75:READ A$
BP 40 IF LEN(A$)=42 THEN 70
SR 50 A$(LEN(A$)+1)=","
NQ 60 READ B$:A$(LEN(A$)+1)=B$:GOTO 40
JN 70 B$=A$(2,41)
QJ 80 FOR I=1 TO 40:PUT #1,ASC(B$(I))-32
PH 90 NEXT I:NEXT J
FJ 100 CLOSE #l:? "  OK! SET'S DONE, YOU
   CAN PLAY NOW!"
SO 10000 DATA '
                 '
SS 10010 DATA '
                 '
FZ 10020 DATA '//012   2212   21000000000
   011100112     '
RV 10030 DATA '*****+D+****+++***********
   *********+,,--'
OG 10040 DATA '954343EB89876543B******765
   43456789876E43'
GI 10050 DATA '      E          4B***C
              E  '
UU 10060 DATA '      E            BC3
              E  '
NV 10070 DATA '      E
              E  '
BY 10080 DATA '      E          <++=    .
     1l       E  '
WL 10090 DATA '      E   <=      34     3
     34       E  '
OX 10100 DATA '
      2       E  '
EP 10110 DATA '                  210/.-,=
      4       E  '
ZL 10120 DATA ' E 210/.-,=       345678C
              E  '
UP 10130 DATA '<D;8987654
              E  '
KV 10140 DATA ' E            A+++++++++,-,
   /012          '
UL 10150 DATA ' E           A*********C B*
   ****+,-./812 2'
DT 10160 DATA ' E           *********C   3
   B***********DC'
AP 10170 DATA '      <=     **C  E BC
    4 B********E '
FG 10180 DATA '             B*   E
       BC 5678CE '
VF 10190 DATA ' <D=       0  8   E      <=
               E '
US 10200 DATA ' E     <=  31    //
       2   0   E '
IZ 10210 DATA ' E          4    43
       4   3   E '
TG 10220 DATA '++D+
   ++++'
DG 10230 DATA '74E45678987654345678987654
   34567898765434'
OT 10240 DATA '  E
                 '
PB 10250 DATA '++++++++=    <,-./012
                 '
FY 10260 DATA '89876543      3456789;,-./
   012           '
SR 10270 DATA '                      3456
   789;+++++++D++'
XV 10280 DATA ' AD>
       345678CE34'
DX 10290 DATA '+CE*   <=
              E  '
QG 10300 DATA '*>E*    4567654
              E  '
ZU 10310 DATA '**F*>          00 <=
         2    E  '
MW 10320 DATA '*CEB*   <++=   43        <
   ++=   4    E  '
K8 10330 DATA '* E *>   34
   34            '
CW 10340 DATA '*>E **
   '
DK 10350 DATA '**EA**********************
   **************'
TM 10360 DATA '*CEB****F******F****F****F
   ********F****F'
ZY 10370 DATA '3 E 3454E345654E3453E 343E
   34678765E3453E'
UE 18380 DATA '  E     E      E         E
           E    E'
FL 10390 DATA '  E     E      E         E
                E'
AH 10400 DATA '  E            E         E
                E'
DA 10410 DATA '               E
                E'
PI 10420 DATA '
                E'
PH 10430 DATA '
                E'
VX 10440 DATA '+++++++++++++++++++
   +++++++++++++D'
GR 10450 DATA '75434567898765434567898765
   4345678987654E'
PY 10460 DATA '
                E'
GX 18470 DATA '<D++++++++++++++++++++++++
   ++++++++++'
CA 10480 DATA ' EB78987654345678987654345
   67898765434567'
0I 10490 DATA ' E
                 '
BM 10500 DATA '++=  <=   <+=   <+++=    <
   +++=   <=   <D'
GY 10510 DATA '43         3    *C3
   43           E'
LU 10520 DATA '               A*
                E'
GP 10530 DATA '  <++++++++++++*C
                E'
EL 10540 DATA '   3456789876543210/.-,=
     <+++++++++++'
ML 10550 DATA '        210/.-,;8876B**
      **C 3456788'
JE 10560 DATA ' 210/.-,;9876543     B*
   *C         '
LG 10570 DATA 'D9765433              B*9
   898C          '
NX 10580 DATA 'E                     3
                 '
WX 10590 DATA '++++++++++++++++++++++++++
   +++++++++++++D'
ZW 10600 DATA '54345678987654345678987654
   3456789876543E'
IU 10610 DATA '               2
                E'
SM 10620 DATA '+D++++=   A+>  4    <+++++
    +++++++++++++'
SU 10630 DATA 'CEB876    BFC         3456
   78987654345677'
KR 10640 DATA ' E         E    <++=
                 '
PC 10650 DATA ' E 2222    E     34
                 '
DK 10660 DATA '**C   E
      <+++++++D= '
XO 10670 DATA '*C    E
       345678CE  '
OV 10680 DATA '**C   <++++++++++++++++
   ++=      E  '
EW 10690 DATA '***C3     4457654345678987
    6543      E  '
TU 10700 DATA '653
              E  '
NN 10710 DATA '  <D=   <++++++++++++++
   +++++++=   E  '
GA 10720 DATA '   E     54345678987654345
   6789863      A'
MW 10730 DATA '      E           2   2
               A*'
PF 10748 DATA '+++++++++++++++**++++++
   ++++++++++++**'



    Listing 3.
Action! listing.

;UPWARD EDITOR by Greg Knauss

;      CHECKSUM DATA
;[B4 F9 4B 46 88 45 83 FF
; 5A 8C 27 3D EC 4A IF 34
; 24 27 7E 19 65 C4 11 E8
; 69 63 6C C8 DE AC 77 1F
; 4F 3A 18 9D 15 33 5B 6D
; 65 AD 02 5F 74 60 ]

BYTE
  P,I,R=[1],Y=[1],S,STG=[0],SLO,SHI,
  STC=[32],SN=[1],CLR=[32],ERR=[0],
  L=[1]

INT
  X1,Y1

CARD
  J,SCN,DL,CH

BYTE ARRAY
  ST="D:UPSET.A"

PROC DLI()
  [ 72 169  56 141  10 212 141  22
   208 169  54 141  23 208 169  10
   141  24 208 169  68 141  25 208
   169   0 141  10 212 169   0 141
    26 208 169   0 141   9 212 104
   643
RETURN

PROC NEWLIST()
  [112 112 112  71   0   0   6 130
     0   5  32 101   0   0  37  37
    37  37  37  37  37  37  37   5
    65   8   0]
RETURN

PROC CHSTORE()
  [170 170 170 178 170 170 178 170
    85 170 170 170 170 170 170 170
     0  85 170 170 170 170 170 170
     0   0  85 170 170 170 170 170
     0   0   0  85 170 178 178 170
     0     0   0   0  85 170 170 170
     0   0   0   0   0  85 170 170
     0   0   0   0   0   0  85 170
     0   0   0   0   0   0   0  85
   168  32   0   0   0   0   0   0
   170  42  32   0   0   0   0   0
   170  42  34   0   0   0   0   0
   170 178 170 168  32   0   0   0
   170 170 170 170 168  32   0   0
   170 170 170 170 170 168  32   0
   170 170 170 170 170 170  40  32
     0   0   0   0   0   0   0   0
    85 170 170 170 170 170 170  32
    85 170  42  42  42  10  10   0
    85 170 170 168 168 160 128 128
     0   0  64 128 144 164 168 169
     0   0   0   0   0   0   0   0
     0   0   0   0   0   0   0   0
     1   2   2   6  10  26  42 106
   170  42  42  10  10   2   2   2
   170 168 160 128 128 128   0   0
   125 190 190 190 174 190 190 190
    48  68  60  60  12  60  60  60
   186 190 190 190 174 190 190 190
   255 255 255 255 255 255 255 255
   255 191 191 191 175 175 171 170
   255 254 254 250 250 234 170 170
   170 171 175 175 191 191 255 255
   170 234 234 250 250 250 254 254



   255 195 195 195 195 195 195 255
     0  63  48  63   3   3  63   0
     0  60  51  51  51  51  60   0
    15  15   3  63 207 287  12  60
   192 204  12 248 192 192 192 240]
RETURN

PROC TOPSCRN()
  Poke(83,39)
  Position(0,l)
  Print(" *+,-,/012 3456789; <=>ABC")
  Print(" DEF GHIJK   ")
  Position(0,2)
  Print(" *+,-./012 3456789; <=>ABC")
  Print(" DEF MN ")
  Poke(83,0)
RETURN

PRO( SETUP()
  Graphics()
  Poke(752,1)
  Poke(82,1)
  PrintE(" ")
  DL=PeekC(560)
  SHI=Peek(106)-32
  SHI==+8
  SLO=0
  MoveBlock(DL,NEWLIST,50)
  SCN=PeekC(88)
  J=PeekC(88)
  PokeC(DL+4,J)
  Poke(DL+12,0)
  Poke(DL+13,SHI)
  J=PeekC(560)
  PokeC(DL+25,J)
  CH=(Peek(106)-40)*256
  MoveBlock(CH+80,CHSTORE,512)
  Zero(CH,8)
  Poke(DLI+35,CH/256)
  PokeC(512,DLI)
  Poke(54286,192)
  Poke(708,0)
  Poke(709,6)
  Poke(710,15)
  Poke(712,148)
  Zero(SHI*256+SLO,256*12+40)
  Print("")
  PrintE("         LEVEL: 1"7
  TOPSCRN()
RETURN

PROC OOPS()
  Poke(559,34)
  Position(0,1)
  Printt"   ")
  Print(" Any key to continue.X")
  I=GetD(l)
  ERR=1
  Close(2)
RETURN

PROC SETNO()
  FOR J=1 TO 15000 DO OD
  WHILE STrig(0)=1 DO
    IF Stick(0)=7 AND SN<25 THEN
      SN==+1
    FI
    IF Stick(0)=11 AND SN>1 THEN
      SN==-1
    FI
    IF Stick(0)<>15 THEN
      Position(24,1)
      Print(" ++")
      PrintB(SN)
    FI
    FOR J=1 TO 7000 DO OD
  OD
RETURN

PROC CONFIRM()
  S=0
  Position(31,1)
  Print("Y/")
  FOR J=1 TO 15000 DO OD
  WHILE STri9(0)=1 DO
    IF Stick(0)=7 THEN
      Position(31,1)
      Print("Y/")
      S=0
    FI
    IF Stick(0)=11 THEN
      Position(31,1)
      Print("/N")
      S=1
    FI
  OD
RETURN

PROC SAVE()
  Position(0,1)
  Print("              Save set:")
  Print("            ")
  Position(24,i)
  PrintB(SN)
  SETNO()
  Position(6,1)
  Print("ConfirM: as set ")
  PrintB(SN)
  Print("?")
  CONFIRM()
  IF S=0 THEN
    RETURN
  FI
  Poke(559,0)
  SHI=Peek(106)-32
  SLO=0
  L=1
  Position(33,0)
  Print(" ++")
  PrintB(L)
  Poke(DL+12,SLO)
  Poke(DL+13,SHI)
  Close(2)
  Error=OOPS
  ERR=0
  Poke(ST+9,SN+64)
  Open(2,ST,8,0)
  IF ERR=0 THEN
    FOR J=0 TO 2999 DO
      S=Peek(SHI*256+J)
      PutD(2,S)
    OD
    Close(2)
  FI
  Poke(559,34)
RETURN

PROC LOAD()
  Position[0,1)
  Print("              Load set:")
  Printt"            ")
  PositionC24,1)
  PrintB(SN)
  SETNO()
  Position(6,1)
  Print("Confirm: set ")
  PrintB(SN)
  Printt"?")
  CONFIRM()
  IF S=0 THEN
    RETURN
  FI
  Poke(559,0)
  SHI=Peek(106)-32
  SLO=0
  L=1
  Position(33,0)
  Print("  XX")
  PrintB(L)
  POke(DL+12,SLO)
  Poke(DL+13,SHI)
  Error=OOPS
  ERR=0
  Poke(ST+9,SN+64)
  Open(2,ST,4,0)
  IF ERR=0 THEN
    FOR J=0 TO 2999 DO
      S=GetD(2)
      Poke(SHI*256+J,S)
    OD
    Close(2)
  FI
  Poke(559,34)
RETURN

PROC CLEAR()
  Position(6,1)
  Print("Confirm: set?")
  Print("            ")
  CONFIRM()
  IF S=1 THEN
    SHI=Peek(106)-32
    SLO=0
    L=1
    Position(33,0)
    Print("  ++")
    PrintB(L)
    Poke(DL+12,SLO)
    Poke(DL+13,SHI)
    Zero(SHI*256+SLO,3000)
    POkeC(88,SCN)
  FI
RETURN

PROC DISK()
  Poke(83,39)
  Position(0,1)
  Print("      EXIT     SAVE     LOAD")
  Print("    CLEAR      ")
  S=1
  WHILE STrig(0)=1 DO
    IF S>1 AND Stick(0)=11 THEN
      S==-1
    FI
    IF S<4 AND Stick(0)=7 THEN
      S==+1
    FI
    IF Stick(0)=7 OR Stick(0)=11 THEN
      Position(0,1)
      Print("      EXIT    SAVE")
      Print("    LOAD   CLEAR      ")
    FI
    IF S=1 THEN
      Position(5,1)
      Print("")
    FI
    IF S=2 THEN
      Position(13,1)
      Print("")
    FI
    IF S=3 THEN
      Position(21,1)
      Print("")
    FI
    IF S=4 THEN
      Position(29,1)
      Print("")
    FI
    FOR J=1 TO 5000 DO OD
  OD
  FOR J=1 TO 10000 DO OD
  IF S=2 THEN
    SAVE()
  FI
  IF S=3 THEN
    LOAD()
  FI
  IF S=4 THEN
    CLEAR()
  FI
  X=38
  STC=32
  TOPSCRN()
  Position(38,2)
  Print("L")
RETURN

PROC LEV()
  PokeC(88,SCN)
  Poke(83,39)
  Position(33,0)
  Print(" XX")
  PrintB(L)
  Poke(83,0)
  Poke(88,SL0)
  Poke 189,SHI)
RETURN

PROC SCROLLDN()
  Color=CLR
  Plot(X,Y)
  FOR S=1 TO 6 DO
    FOR I=6 TO 15 DO
      Poke(54277,I)
      FOR J=1 TO 150 DO OD
    OD
    Poke(54277,0)
    SLO==+40
    IF SLO<40 THEN
      SHI==+1
    FI
    Poke(DL+12,SLO)
    Poke(DL+13,SHI)
    Poke(88,SLO)
    Poke (89, SHI)
  OD
  L==+1
  LEV()
  CLR=Locate(X,Y)
RETURN

PROC SCROLLUP()
  Color=CLR
  Plot(X,Y)
  FOR S=1 TO 6 DO
    Poke(54277,15)
    SLO=SLO-40
    IF SLO>215 THEN
      SHI==-1
    FI
    Poke(DL+12,SLO)
    Poke(DL+13,SHI)
    Poke(88,SLO)
    Poke(89,SHI)
    I=15
    FOR P=1 TO 16 DO
      Poke(54277,I)
      I==-1
      FOR J=1 TO 150 DO OD
    OD
  OD
  L==-1
  LEV()
  CLR=Locate(X,Y)
RETURN

PROC GETNPRNT()
  STC=GetD(l)
  IF STC<33 OR STC>'K THEN
    STC=32
  FI
  IF STC>'F THEN
    STC==+128
  FI
  Color=STC
  Plot(X,Y)
  CLR=STC
  STG=0
  IF X<39 THEN
    X==+1
    CLR=LOCate(X,Y)
  FI
  Color='L
  Plot(X,Y)
  Poke(764,255)
RETURN

PROC CHOOSE()
  Color=CLR
  Plot(X,Y)
  PokeC(88,SCN)
  TOPSCRN()
  Y=2
  CLR=Locate(X,Y)
  Color='L
  Plot(X,Y)
  DO
    S=Stick(0)
    X1=0
    IF S=11 AND X>8 THEN
      X1=-1
    FI
    IF S=7 AND X<39 THEN
      X1=1
    FI
    IF S<>15 AND (X1<>0 OR Yl<>0) THEN
      S=Locate(X+XI,Y+Y1)
      Color=CLR
      Plot(X,Y)
      X==+X1
      Color='L
      Plot(H,Y)
      CLR=S
    FI
    FOR J=1 TO 2000 DO OD
    IF STrig(0)=0 THEN
      STC=CLR
      FOR J=1 TO 255 DO
        Sound(0,J,8,15-J/17)
      OD
      STG=0
    FI
    IF STC='N THEN
      DISK()
    FI
    UNTIL StiCk(0)=13
  OD
  TOPSCRN()
  Poke(88,SL0)
  Poke(89,SHI)
  Y=0
  CLR=Locate(X,Y)
  Color='L
  Plot(X,Y)
  IF STG='M THEN
    STG=1
    STC='3
  FI
RETURN

PROC MAIN()
  SETUP()
  Poke(88,SLO)
  POke(89,SHI)
  Color=32
  For J=0 TO 8 DO
    P=Locate(0,J)
    Plot(8,J)
  OD
  FOR J=3000 TO 3079 DO
    Poke(SHI*256+J,10)
  OD
  Poke(SHI*256+2954,47)
  Poke(SHI*256+2955,48)
  Open(1,"K:",4,0)
  CLR=32
  DO
    S=StiCk(0)
    X1=0
    Y1=0
    IF (S=10 OR S=14 OR S=6) AND
        Y>0 THEN
      Y1=-1
    FI
    IF (S=9 OR S=13 OR S=5) AND
        Y<8 THEN
      Y1=1
    FI
    IF S<12 AND S>8 AND X>0 THEN
      X1=-1
    FI
    IF S<8 AND S>4 AND X<39 THEN
      X1=1
    FI
    IF Stick(0)=14 AND Y=0 THEN
      CHOOSE()
    FI
    IF (X1<>0 OR Y<>0) AND
        S<>15 THEN
      S=Locate(X+X1,Y+Y1)
      Color=CLR
      Plot(X,Y)
      X==+X1
      Y==+Y1
      CLR=S
    FI
    Color='L
    Plot(X,Y)
    IF Peek(532797=6 AND SLO<>80 THEN
      SCROLLDN()
    FI
    IF Peek(53279)=5 AND SLO<>0 THEN
      SCROLLUP()
    FI
    IF Peek(764)<>255 THEN
      GETNPRNT()
    FI
    IF STrig(0)=0 AND STC<>'M THEN
      CLR=STC
    FI
    IF STrig(0)=0 AND STG<>0 THEN
      STC==+STG
      IF STC='9 THEN
        STG=255
      FI
      IF STC='3 THEN
        STG=1
      FI
    FI
    FOR J=1 TO 2088 DO OD
  OD
RETURN