Gem Drop - Source Code

GEMINTRO.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

This is the splash intro that loads first when you boot up the Gem Drop disk.

  ; GEMINTRO.ACT
  
  ; Gem Drop Intro
  ; by Bill Kendrick
  ; kendrick@zippy.sonoma.edu
  ; http://zippy.sonoma.edu/kendrick/
  
  ; Sept. 24, 1997
  
  INCLUDE "GEMRT.ACT"
  
  
  Byte Array Buf(19200)
  Byte TIMER=20
  
  
  PROC CIO=$E456(BYTE areg,xreg)
  
  CARD FUNC Burst(BYTE chan,mode,
  {16 SPACES}CARD addr,buflen)
  
    TYPE IOCB=[BYTE id,num,cmd,stat
  {13 SPACES}CARD badr,padr,blen
  {13 SPACES}BYTE a1,a2,a3,a4,a5,a6]
  
    IOCB POINTER iptr
  
    chan==&$07
    iptr=$340+(chan LSH 4)
    iptr.cmd=mode
    iptr.blen=buflen
    iptr.badr=addr
    CIO(0,chan LSH 4)
  RETURN(iptr.blen)
  
  CARD FUNC BGet(BYTE chan CARD addr,len
  )
  
    CARD temp
  
    temp=Burst(chan,7,addr,len)
  RETURN (temp)
  
  
  
  Proc Load(Byte Which)
    Char Array File(20)
  
    SCopy(File,"D:x.GR7")
    File(3)=Which+'A
  
    Close(1)
    Open(1,File,4,0)
    BGet(1,Buf+Which*3840,3840)
    Close(1)
  
    TIMER=0
    Do Until TIMER>=20 Od
  Return
  
  Proc Display()
    Card SC=88
    Byte I
  
    Graphics(23)
    Poke(708,4)
    Poke(709,8)
    Poke(710,14)
  
    For I=0 To 4 Do
  {4 SPACES}MoveBlock(SC,Buf+I*3840,3840)
  {4 SPACES}TIMER=0
  {4 SPACES}Do 
  {4 SPACES}Until TIMER>=10 Od
    Od
  
    For I=0 To 15 Do
  {4 SPACES}Sound(0,I*5,0,I/2)
    Od
  
  
    For I=0 To 60 Do
  {4 SPACES}Sound(0,200,0,15-I/4)
  {4 SPACES}TIMER=0
  {4 SPACES}Do Until TIMER>=2 Od
    Od
  Return
  
  Proc Setup()
    Graphics(0)
    PokeC(82,9984)
    PokeC(709,0)
    Poke(65,0)
    Poke(752,1)
    Put('{CLEAR})
  Return
  
  Proc Write(Char Array Text)
    byte I
  
    For I=0 To 150 Do
  {4 SPACES}Poke(709,15-I/10)
    Od
    Put('{CLEAR})
    Position(20-Text(0)/2,12)
    PrintE(Text)
    For I=0 To 150 Do
  {4 SPACES}Poke(709,I/10)
    Od
  Return
  
  Proc Main()
    Byte KEY=764
  
    Setup()
  
    Write("New Breed Software")
    Load(0)
  
    Write("proudly presents")
    Load(1)
  
    Write("a challenging new puzzle game
  ")
    Load(2)
  
    Write("")
    Load(3)
  
    Write("Gem Drop")
    Load(4)
  
    Display()
  
    TIMER=0
    KEY=255
    Do
    Until KEY<255 OR TIMER>=250 OD
    KEY=255
  Return

GEMINC.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

The first half of the game code. (Too large to fit in the Action! editor and compile it all!)

  ; GEMINC.ACT
  
  ; Gem Drop
  ; by Bill Kendrick
  ; kendrick@zippy.sonoma.edu
  ; http://zippy.sonoma.edu/kendrick/
  
  ; August 17, 1997 - Sept. 24, 1997
  
  
  DEFINE NO="0"
  DEFINE YES="1"
  DEFINE ATARI="0"
  DEFINE SEGA="1"
  DEFINE BOMB="5"
  DEFINE WILDCARD="6"
  DEFINE CLOCK="7"
  DEFINE SCORE="0"
  DEFINE EXPLOSION="1"
  
  Byte Array Blocks(110),MemBuf(4096),
  {3 SPACES}KillsX(100),KillsY(100),ExY(4)
  Card Array ScrVals(15)
  Byte KEY=764,CONSOL=53279,
  {3 SPACES}STICK0=632,STRIG0=644,
  {3 SPACES}COLPF4=712,PADDL0=624,RTCLOCK=20,
  {3 SPACES}AUDF0=53760,AUDC0=53761
  Byte Level,Controller,Gameover,Frozen,
  {3 SPACES}Carrying,HowMany,LevelDone,
  {3 SPACES}FLIP,CHAddr,CIO_status,NumKills,
  {3 SPACES}WhichPM,ExAnim0,ExAnim1,ExAnim2,
  {3 SPACES}ExAnim3,TOGL,KillScore,Lines,
  {3 SPACES}Max_Level,FirstRound,LinesNeeded,
  {3 SPACES}Happy,ScrH,HiScrH
  Card SC=88
  Card OLDVEC,CH,PMG,DL,Scr,HiScr
  
  
  Char Func CIO=*(Byte dev, Card addr, s
  ize, Byte cmd, aux1, aux2)
  [$29$F$85$A0$86$A1$A$A$A$A$AA$A5$A5
  $9D$342$A5$A3$9D$348$A5$A4$9D$349
  $A5$A6$F0$8$9D$34A$A5$A7$9D$34B$98
  $9D$345$A5$A1$9D$344$20$E456
  $8C CIO_status $C0$88$D0$6$98$A4$A0
  $99 EOF $A085$60]
  
  Card Func ReadBlock=*(Byte dev, Card a
  ddr, size)
  [$48$A9$7$85$A5$A9$0$85$A6$A5$A3$5$A4
  $D0$6$85$A0$85$A1$68$60$68$20 CIO
  $BD$348$85$A0$BD$349$85$A1$60]
  
  
  Proc Quiet()
   Sound(0,0,0,0)
   Sound(1,0,0,0)
   Sound(2,0,0,0)
   Sound(3,0,0,0)
  Return
  
  
  Proc Setup()
   Int I
   Byte C
  
   CH=(MemBuf/1024)+1 
   CH=CH*1024
   CHAddr=CH/256
  
   Level=1
   Controller=0
   If PADDL0=1 Then
    Controller=1
   Fi
   Poke(53775,3)
   Poke(53768,0)
   Quiet()
  
   Close(1)
  
   Open(1,"D:GEMDROP1.FNT",4,0)
   ReadBlock(1,CH,1024)
   Close(1)
  
   Open(1,"D:GEMDROP2.FNT",4,0)
   ReadBlock(1,CH+1024,1024)
   Close(1)
  
   PMG=CH+2048
   Zero(PMG,1024)
   Poke(53277,3)
   Zero(53248,13)
   Poke(54279,PMG/256) 
   PokeC(704,0)
   PokeC(706,0)
  
   For I=0 To 3 Do
    ExY(I)=0
   Od
  
   TOGL=0
  
   Close(1)
   Open(1,"D:GEMDROP.DAT",4,0)
   Max_Level=InputBD(1)
   HiScr=InputCD(1)
   HiScrH=InputBD(1)
   Close(1)
  
   ScrVals(0)=0
   ScrVals(1)=0
   ScrVals(2)=0 
   ScrVals(3)=1
   ScrVals(4)=2
   ScrVals(5)=5
   ScrVals(6)=10
   ScrVals(7)=15
   ScrVals(8)=20
   ScrVals(9)=25
   ScrVals(10)=30
   ScrVals(11)=50
   ScrVals(12)=100
   ScrVals(13)=100
   ScrVals(14)=100
  Return
  
  
  Proc VBLANKD()
   Byte Pointer Q
   Byte I,CHBAS=756,
  {4 SPACES}PMCOLR0=704,PMCOLR1=705,
  {4 SPACES}PMCOLR2=706,PMCOLR3=707,
  {4 SPACES}PMX0=53248,PMX1=53249,
  {4 SPACES}PMX2=53250,PMX3=53251
  
   FLIP=4-FLIP
   CHBAS=CHAddr+FLIP 
  
   TOGL=TOGL+1
   If TOGL=4 Then
    TOGL=0
    If ExAnim0>0 Then
  {3 SPACES}PMCOLR0=ExAnim0
  {3 SPACES}ExAnim0=ExAnim0-1
    Else
  {3 SPACES}PMX0=0
    Fi{3 SPACES}
  
    If ExAnim1>0 Then
  {3 SPACES}PMCOLR1=ExAnim1
  {3 SPACES}ExAnim1=ExAnim1-1
    Else
  {3 SPACES}PMX1=0
    Fi{3 SPACES}
  
    If ExAnim2>0 Then
  {3 SPACES}PMCOLR2=ExAnim2
  {3 SPACES}ExAnim2=ExAnim2-1
    Else
  {3 SPACES}PMX2=0
    Fi{3 SPACES}
  
    If ExAnim3>0 Then
  {3 SPACES}PMCOLR3=ExAnim3
  {3 SPACES}ExAnim3=ExAnim3-1
    Else
  {3 SPACES}PMX3=0
    Fi{3 SPACES}
   Fi{3 SPACES}
  [$6C OLDVEC]
  
  
  Proc SETVBV(Byte Which,Card Addr)
   Card Pointer Temp
   Byte V
  
   Temp=$216+(Which LSH 1)
   V=RTCLOCK+1
   While V<>RTCLOCK Do oD
   Temp^=Addr
  
   FLIP=0
  Return
  
  
  Proc DrawScr(Card Addr, Card Scr, Byte
   ScrH)
   Byte V,I,J
   Card Z,SS
  
   SS=ScrH
   Z=10
  
   For I=0 To 1 Do
    V=SS/Z
    Poke(Addr+I,96+V)
  
    For J=1 To V Do
  {3 SPACES}SS=SS-Z
    Od
  
    Z=Z/10
   Od
  
   SS=Scr
   Z=1000
  
   For I=0 To 3 Do
    V=SS/Z
    Poke(Addr+I+2,96+V)
  
    For J=1 To V Do
  {3 SPACES}SS=SS-Z
    Od
  
    Z=Z/10
   Od
  Return
  
  
  Proc Draw2Digits(Card Addr, Byte Num)
   Byte Z,N
   Int I
  
   Z=10 
   N=Num
  
   For I=0 To 1 Do
    Poke(Addr+I,(N/Z)+96)
    N=N-((N/Z)*Z)
    Z=Z/10
   Od
  Return
  
  
  Byte Func RandBlock()
   Byte I
  
   If Level<15 Then
    I=Rand(4)+1
   Else
    I=Rand(4)+1
    If Rand(20)<10 Then
  {3 SPACES}I=Rand(4)+8
    Fi
   Fi
  
   If Rand(40)<1 Then
    I=4+Rand(4)
   Fi
  Return(I)
  
  
  Proc Pause()
   Int Z
  
   For Z=0 To 5 Do
   Od
  Return
  
  
  Proc DrawGameScreen()
   Byte A,CHBAS=756
   Card VVBLKD=$224
  
   Graphics(0) 
   Poke(559,46)
   DL=PeekC(560)+4
   For A=2 To 24 Do
    Poke(DL+A,4)
   Od
   Poke(DL-1,68)
  
   CHBAS=CHAddr
  
   Poke(708,74)
   Poke(709,206)
   Poke(710,138)
   Poke(711,30)
  
   OLDVEC=VVBLKD
   SETVBV(7,VBLANKD)
  
   MoveBlock(SC+2,"QRSTU"+1,5)
   SetBlock(SC+41,7,'{.})
  
   MoveBlock(SC+31,"VWXVQRSTU"+1,9)
   SetBlock(SC+72,7,'{.})
   DrawScr(SC+72,HiScr,HiScrH)
  
   MoveBlock(SC+122,"YW[UQ"+1,5)
  
   MoveBlock(SC+153,"YUZUY"+1,5)
  Return
  
  
  Proc DrawBlock(Byte X, Y)
   Card Loc,V
   Byte C
  
   Loc=SC+Y*80+10+(X LSH 1)
   C=Blocks(Y*10+X)
  
   If C=0 Then
    PokeC(Loc,0)
    PokeC(Loc+40,0)
   Else
    V=(C LSH 2)-2
    V=V+((C LSH 2)-1)*256
    PokeC(Loc,V)
  
    V=C LSH 2
    V=V+((C LSH 2)+1)*256
    PokeC(Loc+40,V)
   Fi
  Return
  
  
  Byte Func Title()
   Byte Quit,Ok,CHBAS=756,HIGH,LOW
   Card SC=88
  
   Graphics(18)
   CHBAS=ChAddr+6
   MoveBlock(SC+6,"AB{C}{,}{D}EF{G}"+1,8)
   MoveBlock(SC+87,"HIJ{,}{BACK S}{TAB}"+1,6)
   MoveBlock(SC+127,"KLM"+1,3)
   Poke(SC+132,'O-Controller)
   HIGH=Level/10
   LOW=Level-HIGH*10
   MoveBlock(CH+2032,CH+1408+(HIGH LSH 3
  ),8)
   MoveBlock(CH+2040,CH+1408+(LOW LSH 3)
  ,8)
  
  
   Quit=NO
   Ok=NO
  
   KEY=255
   Do Until CONSOL=7 And STRIG0=1 Od
  
   Do
    If KEY=28 Then
  {3 SPACES}Ok=YES
  {3 SPACES}Quit=YES
    Fi
    If CONSOL=5 Then 
  {3 SPACES}Level=Level+1
  {3 SPACES}If Level>Max_Level Then Level=1 Fi
  {3 SPACES}HIGH=Level/10
  {3 SPACES}LOW=Level-HIGH*10
  {3 SPACES}MoveBlock(CH+2032,CH+1408+(HIGH LSH 3
  ),8)
  {3 SPACES}MoveBlock(CH+2040,CH+1408+(LOW LSH 3)
  ,8)
  {3 SPACES}RTCLOCK=0
  {3 SPACES}Do Until CONSOL=7 Or RTCLOCK=20 Od
    ElseIf CONSOL=3 Then 
  {3 SPACES}Controller=1-Controller
  {3 SPACES}Poke(SC+132,'O-Controller)
  {3 SPACES}Do Until CONSOL=7 Or RTCLOCK=20 Od
    ElseIf CONSOL=6 Or STRIG0=0 Then
  {3 SPACES}Ok=YES
    Fi
   Until Ok=YES Od
  
   KEY=255
   Do Until CONSOL=7 And STRIG0=1 Od
  Return(Quit)
  
  
  Proc InitLevel()
   Byte X,Y,YY
  
   For Y=0 To 10 Do
    For X=0 To 9 Do
  {3 SPACES}Blocks(Y*10+X)=0
    Od
   Od
  
   YY=Level
   If Level>14 Then
    YY=YY-9
   Fi
   If YY>9 Then YY=9 Fi
   For Y=0 To YY Do
    For X=0 To 9 Do
  {3 SPACES}Blocks(Y*10+X)=RandBlock()
    Od
   Od
  
   For Y=0 To 10 Do
    For X=0 To 9 Do
  {3 SPACES}DrawBlock(X,Y)
    Od
   Od
  
   LevelDone=NO
  
   Carrying=0
   HowMany=0
   Frozen=0
   FirstRound=0
   If YY<6 Then
    Happy=YES
   Else
    Happy=NO
   Fi
  
   WhichPM=0
   Zero(53248,4)
  
   Lines=0
   LinesNeeded=(Level*3)+2
  
   Draw2Digits(SC+164,Lines)
   Draw2Digits(SC+204,LinesNeeded)
   Draw2Digits(SC+195,Level)
  Return
  
  
  Proc EraseYou(Byte X)
   Zero(SC+888+(X LSH 1),6)
   Zero(SC+928+(X LSH 1),6)
  Return
  
  
  Proc DrawYou(Byte X)
   Card Loc,V1,V2
  
   Loc=SC+890+(X LSH 1)
  
   If HowMany<3 Then
    If Happy=YES Then
  {3 SPACES}PokeC(Loc,27498) ; 106,107
  {3 SPACES}PokeC(Loc+40,28012) ; 108,109
    Else
  {3 SPACES}PokeC(Loc,30582) ; 118,119
  {3 SPACES}PokeC(Loc+40,31096) ; 120,121
    Fi
   Fi
  
   If Carrying<>0 Then
    V1=(Carrying LSH 2)-2
    V1=V1+((Carrying LSH 2)-1)*256
  
    V2=Carrying*4
    V2=V2+((Carrying LSH 2)+1)*256
  
    PokeC(Loc+2,V1)
    PokeC(Loc+42,V2)
  
    If HowMany>=2 Then{4 SPACES}
  {3 SPACES}PokeC(Loc-2,V1)
  {3 SPACES}PokeC(Loc+38,V2)
  
  {3 SPACES}If HowMany>=3 Then
  {4 SPACES}PokeC(Loc,V1)
  {4 SPACES}PokeC(Loc+40,V2)
  {3 SPACES}Fi
    Fi
   Fi
  Return
  
  
  Proc AddKill(Byte X,Y)
   KillsX(NumKills)=X
   KillsY(NumKills)=Y
  
   NumKills=NumKills+1
   If NumKills>=100 Then
    NumKills=99
   Fi
  
   KillScore=KillScore+1
   If KillScore>13 Then
    KillScore=13
   Fi
  Return
  
  
  Proc ExplodeBlock(Byte X,Y,Typ)
   WhichPM=WhichPM+1
   If WhichPM=4 Then WhichPM=0 Fi
   Zero(PMG+512+WhichPM*128+ExY(WhichPM)
  ,8)
   Poke(53248+WhichPM,48+(X+5) LSH 3)
   If WhichPM=0 Then
    ExAnim0=15
   ElseIf WhichPM=1 Then
    ExAnim1=15
   ElseIf WhichPM=2 Then
    ExAnim2=15
   ElseIf WhichPM=3 Then
    ExAnim3=15
   Fi
   ExY(WhichPM)=16+(Y LSH 3)
  
   If Typ<>EXPLOSION Then
    MoveBlock(PMG+512+WhichPM*128+ExY(Wh
  ichPM),CH+504+(KillScore LSH 3),8)
   Else
    MoveBlock(PMG+512+WhichPM*128+ExY(Wh
  ichPM),CH+616,8)
   Fi
  Return
  
  
  Byte Func Same(Byte A,B)
   Byte Match
  
   Match=NO
   If A=B Or (A>4 And A<8) Or B=WILDCARD
   Then
    Match=YES
   Fi
  Return(Match)
  
  
  Proc KillBlock(Byte X,Y)
   Byte B,C
  
   C=Blocks(Y*10+X)
  
   If C<>0 Then
    Blocks(Y*10+X)=0
    DrawBlock(X,Y)
    ExplodeBlock(X,Y,SCORE)
  
    For B=0 To 100 Do
  {3 SPACES}Sound(0,KillScore*20,B,10)
    Od
    AUDF0=0
    AUDC0=0
  
    If C=BOMB Then
  {3 SPACES}If Y>0 Then
  {4 SPACES}Blocks((Y-1)*10+X)=0
  {4 SPACES}DrawBlock(X,Y-1)
  {4 SPACES}ExplodeBlock(X,Y-1,EXPLOSION)
  {3 SPACES}Fi
  
  {3 SPACES}If Y<10 Then
  {4 SPACES}Blocks((Y+1)*10+X)=0
  {4 SPACES}DrawBlock(X,Y+1)
  {4 SPACES}ExplodeBlock(X,Y+1,EXPLOSION)
  {3 SPACES}Fi
  
  {3 SPACES}If X>0 Then
  {4 SPACES}Blocks(Y*10+X-1)=0
  {4 SPACES}DrawBlock(X-1,Y)
  {4 SPACES}ExplodeBlock(X-1,Y,EXPLOSION)
  {3 SPACES}Fi
  
  {3 SPACES}If X<9 Then
  {4 SPACES}Blocks(Y*10+X+1)=0
  {4 SPACES}DrawBlock(X+1,Y)
  {4 SPACES}ExplodeBlock(X+1,Y,EXPLOSION)
  {3 SPACES}Fi
    ElseIf C=CLOCK Then
  {3 SPACES}Frozen=255
    Fi
  
    If Y>0 Then
  {3 SPACES}If Same(Blocks((Y-1)*10+X),C)=YES The
  n
  {4 SPACES}AddKill(X,Y-1)
  {3 SPACES}Fi
    Fi
  
    If Y<10 Then
  {3 SPACES}If Same(Blocks((Y+1)*10+X),C)=YES The
  n
  {4 SPACES}AddKill(X,Y+1)
  {3 SPACES}Fi
    Fi
  
    If X>0 Then
  {3 SPACES}If Same(Blocks(Y*10+X-1),C)=YES Then
  {4 SPACES}AddKill(X-1,Y)
  {3 SPACES}Fi
    Fi
  
    If X<9 Then
  {3 SPACES}If Same(Blocks(Y*10+X+1),C)=YES Then
  {4 SPACES}AddKill(X+1,Y)
  {3 SPACES}Fi
    Fi
   Fi
  Return
  
  
  Proc Honk()
   Byte B
  
   Sound(0,50,12,10)
   COLPF4=72 
   For B=0 To 200 Do
    Pause()
   Od
   COLPF4=0
   AUDF0=0
   AUDC0=0
  Return
  
  
  Proc Throw(Byte X)
   Int LastY
   Byte Y,C,Last,NextLast,B,YTop,YBot,
  {4 SPACES}KX,KY,Ok,DoIt
  
   If Carrying=0 Then
   Else
    Last=0
    NextLast=0
    LastY=-1
    For Y=0 To 10 Do
  {3 SPACES}C=Blocks(Y*10+X)
  {3 SPACES}If C<>0 Then
  {4 SPACES}NextLast=Last
  {4 SPACES}Last=C
  {4 SPACES}LastY=Y
  {3 SPACES}Fi
    Od
  
    Ok=NO
    If Same(Last,Carrying)=YES Then
  {3 SPACES}If (Same(NextLast,Carrying)=YES Or Ho
  wMany>1) Then
  {4 SPACES}Ok=YES
  {3 SPACES}Fi
    Fi
  
    DoIt=YES
  
    YBot=LastY+1+HowMany-1
    If YBot>10 Then
  {3 SPACES}DoIt=NO
  {3 SPACES}YBot=10
  {3 SPACES}If Ok=YES Or HowMany>2 Then
  {4 SPACES}DoIt=YES
  {3 SPACES}Fi
    Fi
  
    If DoIt=YES Then
  {3 SPACES}For B=0 To 200 Do
  {4 SPACES}Sound(0,200-B,10,10)
  {4 SPACES}Pause()
  {3 SPACES}Od
  {3 SPACES}AUDF0=0
  {3 SPACES}AUDC0=0
  
  {3 SPACES}For Y=LastY+1 To YBot Do
  {4 SPACES}Blocks(Y*10+X)=Carrying
  {4 SPACES}DrawBlock(X,Y)
  {3 SPACES}Od
  
  {3 SPACES}Ok=NO
  
  {3 SPACES}If Same(Last,Carrying)=YES Then
  {4 SPACES}If (Same(NextLast,Carrying)=YES Or Ho
  wMany>1) Then
  {5 SPACES}Ok=YES
  {4 SPACES}Fi
  {3 SPACES}Fi
  
  {3 SPACES}If (HowMany>2) Then
  {4 SPACES}Ok=YES
  {3 SPACES}Fi
  
  {3 SPACES}If Ok=YES Then
  {4 SPACES}YTop=0
  {4 SPACES}For Y=0 To YBot Do
  {5 SPACES}If Blocks(Y*10+X)<>Carrying Then
  {6 SPACES}YTop=Y+1
  {5 SPACES}Fi
  {4 SPACES}Od
  
  {4 SPACES}NumKills=0
  {4 SPACES}KillScore=0
  {4 SPACES}AddKill(X,YBot)
  
  {4 SPACES}Lines=Lines+1
  
  {4 SPACES}Draw2Digits(SC+164,Lines)
  
  {4 SPACES}B=0
  {4 SPACES}Do
  {5 SPACES}KX=KillsX(B)
  {5 SPACES}KY=KillsY(B)
  {5 SPACES}KillBlock(KX,KY)
  
  {5 SPACES}B=B+1
  {4 SPACES}Until B>=NumKills Od
  
  {4 SPACES}Scr=Scr+ScrVals(KillScore)
  {4 SPACES}If Scr>=10000 Then
  {5 SPACES}Scr=Scr-10000
  {5 SPACES}ScrH=ScrH+1
  {4 SPACES}Fi
  
  {4 SPACES}DrawScr(SC+41,Scr,ScrH)
  
  {4 SPACES}If Scr>=HiScr Or ScrH>HiScrH Then
  {5 SPACES}HiScr=Scr
  {5 SPACES}HiScrH=ScrH
  {5 SPACES}DrawScr(SC+72,Scr,ScrH)
  {4 SPACES}Fi
  {3 SPACES}Fi
  
  {3 SPACES}Carrying=0
  {3 SPACES}HowMany=0
    Else
  {3 SPACES}Honk()
    Fi
   Fi
  
   If Lines>=LinesNeeded Then
    LevelDone=YES
   Fi
  Return
  
  
  Proc Grab(Byte X)
   Byte Y,C,Last,LastY,B,Ok
  
   Last=0
   LastY=0
  
   For Y=0 To 10 Do
    C=Blocks(Y*10+X)
    If C<>0 Then
  {3 SPACES}Last=C
  {3 SPACES}LastY=Y
    Fi
   Od
  
   If Last=0 Or (Last>4 And Last<8) Then
    Honk()
   Else
    If Last<>Carrying And Carrying<>0 Th
  en
  {3 SPACES}Honk()
    Else
  {3 SPACES}Carrying=Last
  {3 SPACES}Blocks(LastY*10+X)=0
  {3 SPACES}DrawBlock(X,LastY)
  {3 SPACES}HowMany=HowMany+1
  
  {3 SPACES}Do
  {4 SPACES}Ok=0
  {4 SPACES}LastY=LastY-1
  {4 SPACES}If LastY>=0 Then
  {5 SPACES}If Blocks(LastY*10+X)=Last Then
  {6 SPACES}Blocks(LastY*10+X)=0
  {6 SPACES}DrawBlock(X,LastY)
  {6 SPACES}Ok=1
  {6 SPACES}HowMany=HowMany+1
  {5 SPACES}Fi
  {4 SPACES}Fi
  {3 SPACES}Until Ok=0 Od
    Fi
  
    For B=0 To 200 Do
  {3 SPACES}Sound(0,B,10,10)
  {3 SPACES}Pause()
    Od
    AUDF0=0
    AUDC0=0
   Fi
  Return
  
  
  Proc AddMore()
   Byte X,Y,Y1
  
   For X=0 To 9 Do
    If Blocks(10*10+X)<>0 Then
  {3 SPACES}GameOver=YES
    Fi 
   Od
   
   If Gameover=NO Then
    For Y=0 To 9 Do ; Stupid Action!
  {3 SPACES}Y1=10-Y
  
  {3 SPACES}For X=0 To 9 Do
  {4 SPACES}Blocks(Y1*10+X)=Blocks((Y1-1)*10+X)
  {4 SPACES}DrawBlock(X,Y1)
  {3 SPACES}Od
    Od
  
    For X=0 To 9 Do
  {3 SPACES}Blocks(0*10+X)=RandBlock()
  {3 SPACES}DrawBlock(X,0)
    Od
   Fi
  Return
  

GEMDROP.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

The latter half of the game code.

  ; GEMDROP.ACT
  
  ; Gem Drop
  ; by Bill Kendrick
  ; kendrick@zippy.sonoma.edu
  ; http://zippy.sonoma.edu/kendrick/
  
  ; August 17, 1997 - Sept. 24, 1997
  
  INCLUDE "GEMRT.ACT"
  INCLUDE "GEMINC.ACT"
  
  Proc CheckHappy()
   Byte X,Y
  
   Happy=YES
   For Y=8 To 10 Do
    For X=0 To 9 Do
  {3 SPACES}If Blocks(Y*10+X)<>0 Then
  {4 SPACES}Happy=NO
  {3 SPACES}Fi
    Od
   Od
  Return
  
  
  Proc LevelEndFX(Byte YourX)
   Byte X,Y,B,Togl
   Card Loc
  
   Loc=SC+890+(YourX LSH 1)
   Togl=0
  
   For Y=0 To 10 Do
    For X=0 To 9 Do
  {3 SPACES}Blocks(Y*10+X)=0
  {3 SPACES}DrawBlock(X,Y)
    Od 
    For X=0 To 9 Do
  {3 SPACES}If Rand(10)<2 Then
  {4 SPACES}ExplodeBlock(X,Y,EXPLOSION)
  {3 SPACES}Fi
    Od
    For B=0 To 150 Do
  {3 SPACES}Pause()
  {3 SPACES}Pause()
  {3 SPACES}Pause()
  {3 SPACES}Sound(0,B,0,15-B/10)
    Od
  
    Togl=1-Togl
    If Togl=0 Then
  {3 SPACES}PokeC(Loc,28526) ; 110,111
  {3 SPACES}PokeC(Loc+40,29040) ; 112,113
    Else
  {3 SPACES}PokeC(Loc,29554) ; 114,115
  {3 SPACES}PokeC(Loc+40,30068) ; 116,117
    Fi
  
    Pause()
    Pause()
   Od
  Return
  
  
  Proc Level15FX()
   Byte X,I,T
  
   Zero(53248,4)
   Zero(PMG,1024)
   Pause()
   MoveBlock(PMG+512+000+16+40,57344+('U
  -32)*8,8)
   MoveBlock(PMG+512+128+16+40,57344+('H
  -32)*8,8)
   MoveBlock(PMG+512+256+16+40,57344+('O
  -32)*8,8)
   MoveBlock(PMG+512+384+16+40,57344+('H
  -32)*8,8)
  
   T=0
   For X=0 To 230 Do
    Poke(53248,250-X)
    Poke(53249,250-X+8)
    Poke(53250,250-X+24)
    Poke(53251,250-X+32)
    For I=0 To 50 Do
  {3 SPACES}Pause()
    Od
    SetBlock(704,4,15)
    Sound(0,X,4,T)
    If (X MOD 10)=0 Then
  {3 SPACES}Poke(712,T)
  {3 SPACES}T=15-T
    Fi
   Od
   Poke(712,0)
   Sound(0,0,0,0)
   Zero(PMG,1024)
  Return
  
  
  Proc Play()
   Byte X,S,K,OX,A,B,FrozCount,
    HappyTest,Fire,SegaFire,Activity,
    OAct
   Int Clicks
   Card Q,Loc
  
   DrawGameScreen()
   InitLevel()
   Clicks=0
   X=5
   Gameover=NO
   OAct=0 
   FrozCount=0
   Scr=0
   ScrH=0
  
   DrawYou(X)
  
   Do
    S=STICK0
    Fire=STRIG0
    If PADDL0=228 And Controller=SEGA Th
  en SegaFire=0
    Else SegaFire=1
    Fi
  
    If (S<>15 Or Fire=0 Or SegaFire=0) T
  hen
  {3 SPACES}OAct=1
  {3 SPACES}If OAct=1 And RTCLOCK<8 Then
  {4 SPACES}S=15
  {4 SPACES}Fire=1
  {4 SPACES}SegaFire=1
  {3 SPACES}Else
  {4 SPACES}RTCLOCK=0
  {3 SPACES}Fi
    Else
  {3 SPACES}OAct=0
  {3 SPACES}RTCLOCK=10
    Fi
    
    K=KEY
    KEY=255
  
    If S=7 Then K=7
    ElseIf S=11 Then K=6
    ElseIf S=14 Or SegaFire=0 Then K=14
    ElseIf S=13 Or Fire=0 Then K=15
    Fi
  
    OX=X
  
    If K=28 Or CONSOL<7 Then
  {3 SPACES}Gameover=YES
    ElseIf K=7 Then
  {3 SPACES}X=X+1
  {3 SPACES}If X>9 Then X=0 Fi
    ElseIf K=6 Then
  {3 SPACES}If X>0 Then
  {4 SPACES}X=X-1
  {3 SPACES}Else
  {4 SPACES}X=9
  {3 SPACES}Fi
    ElseIf K=14 Then
  {3 SPACES}Throw(X)
  {3 SPACES}EraseYou(X)
  {3 SPACES}DrawYou(X)
    ElseIf K=15 Then
  {3 SPACES}Grab(X)
  {3 SPACES}EraseYou(X)
  {3 SPACES}DrawYou(X)
    ElseIf K=33 Then
  {3 SPACES}Poke(708,2)
  {3 SPACES}Poke(709,4)
  {3 SPACES}Poke(710,6)
  {3 SPACES}Poke(711,8)
  {3 SPACES}KEY=255
  {3 SPACES}Do Until KEY=33 Or KEY=28 Or CONSOL<7
   Od
  {3 SPACES}If KEY<>33 Then
  {4 SPACES}Gameover=YES
  {3 SPACES}Fi
  {3 SPACES}KEY=255
  {3 SPACES}Poke(708,74)
  {3 SPACES}Poke(709,206)
  {3 SPACES}Poke(710,138)
  {3 SPACES}Poke(711,30)
    Fi
  
    If OX<>X Then
  {3 SPACES}EraseYou(OX)
  {3 SPACES}DrawYou(X)
    Fi
  
    If Frozen=0 Then
  {3 SPACES}HappyTest=HappyTest+1
  {3 SPACES}If HappyTest>=100 Then
  {4 SPACES}HappyTest=0
  {4 SPACES}CheckHappy()
  {4 SPACES}DrawYou(X)
  {3 SPACES}Fi
  
  {3 SPACES}Clicks=Clicks+1
  
  {3 SPACES}If Level<15 Then Q=Level*125
  {3 SPACES}Else Q=(Level-10)*100
  {3 SPACES}Fi
   
  {3 SPACES}If Clicks>4500-Q And FirstRound=1 The
  n
  {4 SPACES}Poke(DL-2,96+(16*(Clicks MOD 2)))
  {4 SPACES}Sound(0,100,0,8*(Clicks MOD 2))
  {3 SPACES}Fi
  
  {3 SPACES}If Clicks>4800-Q Then
  {4 SPACES}If FirstRound=1 Then
  {5 SPACES}Sound(0,0,0,0)
  {5 SPACES}Poke(DL-2,112)
  {5 SPACES}Clicks=0
  {5 SPACES}AddMore()
  {4 SPACES}Else
  {5 SPACES}FirstRound=1
  {5 SPACES}Clicks=0
  {4 SPACES}Fi
  {3 SPACES}Fi
    Else
  {3 SPACES}Happy=YES
  
  {3 SPACES}FrozCount=FrozCount+1
  
  {3 SPACES}If FrozCount=60 Then
  {4 SPACES}FrozCount=0
  {4 SPACES}Frozen=Frozen-1
  {4 SPACES}If (Frozen MOD 10)=0 Then
  {5 SPACES}For B=0 To 15 Do
  {6 SPACES}Sound(0,(Frozen MOD 20)*10+50,10,15-B
  )
  {5 SPACES}Od
  {4 SPACES}Fi
  {3 SPACES}Fi
    Fi
  
    If LevelDone=YES Then
  {3 SPACES}LevelEndFX(X)
  
  {3 SPACES}Level=Level+1
  {3 SPACES}If Level>20 Then
  {4 SPACES}Level=20
  {3 SPACES}Fi
  {3 SPACES}If Level>Max_Level Then
  {4 SPACES}Max_Level=Level
  {3 SPACES}Fi
  
  {3 SPACES}If Level=15 Then
  {5 SPACES}Level15FX()
  {3 SPACES}Fi
  
  {3 SPACES}InitLevel()
  {3 SPACES}Clicks=0
    Fi
   Until Gameover=YES Od
  
   Zero(53248,13)
  
   Quiet()
  
   Loc=SC+880+10+(X LSH 1)
  
   PokeC(Loc,30582) ; 118,119
   PokeC(Loc+40,31096) ; 120,121
  
   For A=0 To 254 Do
    Sound(0,A,10,15)
    SetBlock(SC+(A/12)*40+10,20,'\)
    Pause()
    Pause()
    Pause()
    Pause()
   Od
  
   MoveBlock(SC+131,"]]]\]]]\]]]]]\]]]\"
  +1,18)
   MoveBlock(SC+171,"]{3 ,}]{,}]{,}]{,}]{,}]{,}]{3 ,}"+1,1
  8)
   MoveBlock(SC+211,"]{,}]\]]]{,}]{,}]{,}]{,}]]\\"
  +1,18)
   MoveBlock(SC+251,"]{,}]{,}]{,}]{,}]{,}\{,}]{,}]{,}{,}\"
  +1,18)
   MoveBlock(SC+291,"]]]{,}]{,}]{,}]{,}\\]{,}]]]\"
  +1,18)
   MoveBlock(SC+331,"\{3 ,}\{,}\{,}\{,}\\\{,}\{3 ,}"+1,1
  8)
  
   MoveBlock(SC+413,"]]]\]\]\]]]\]]]\"+1
  ,16)
   MoveBlock(SC+453,"]{,}]{,}]{,}]{,}]{3 ,}]{,}]{,}"+1,1
  6)
   MoveBlock(SC+493,"]{,}]{,}]{,}]{,}]]\\]]\{,}"+1
  ,16)
   MoveBlock(SC+533,"]{,}]{,}\]\{,}]{,}{,}\]{,}]\"+1
  ,16)
   MoveBlock(SC+573,"]]]{,}\]{,}\]]]\]{,}]{,}"+1
  ,16)
   MoveBlock(SC+613,"\{3 ,}\\{,}\\{3 ,}\{,}\{,}"+1,16)
  
   Quiet()
  
   KEY=255
   Do Until CONSOL=7 And STRIG0=1 Od
  
   Do
   Until KEY<255 Or CONSOL<7 Or STRIG0=0
   Od
  
   KEY=255
   Do Until CONSOL=7 And STRIG0=1 Od
  
   SETVBV(7,OLDVEC)
  
   Quiet()
  Return
  
  
  Proc QuitApp()
   Graphics(0)
   Quiet()
   PutE()
   PrintE("Thanks for playing {H}GEMDrop{J}"
  )
   PrintE("Please visit NBS's website!")
   PrintE("http://zippy.sonoma.edu/kendr
  ick/nbs/")
  Return
  
  
  Proc Main()
   Byte Quit
  
   Setup()
   Do
    Quit=Title()
    If Quit=NO Then
  {3 SPACES}Play()
  {3 SPACES}Graphics(0)
  {3 SPACES}Poke(559,0)
  {3 SPACES}Close(1)
  {3 SPACES}Open(1,"D:GEMDROP.DAT",8,0)
  {3 SPACES}PrintBDE(1,Max_Level)
  {3 SPACES}PrintCDE(1,HiScr)
  {3 SPACES}PrintBDE(1,HiScrH)
  {3 SPACES}Close(1)
    Fi
   Until Quit=YES Od
   QuitApp()
  Return

GEMRT.ACT

HTML ATASCII Viewer by Bill Kendrick, 2012-2013
Options:
Columns: 38 | 40 | Unlimited
Style: Unicode | Images | Images (2x) | Compute! listings

These are "runtime" libraries; things that must be compiled into the game to allow it to run without an Action! programming cartridge installed. (It consists of just the parts of a runtime needed for Gem Drop to run — it appears to be Jeff Reister's PD Runtime package for the Action! 8 bit language, which can be found in the "Code" section of Eric Parent ("Joyful Coder")'s Action! website.)

  ; GEMRT.ACT
  ; ACTION! RUNTIME LIBRARY
  ; FOR GEMDROP
  
  PROC _CPYPRM=*()
  SET $4EE = _CPYPRM
  [$85$A0$86$A1$84$A2$18$68$85$84$69$03
  $A8$68$85$85$69$00$48$98$48$A0$01$B1
  $84$85$82$C8$B1$84$85$83$C8$B1$84$A8
  $B9$A0$00$91$82$88$10$F8$60]
  
  PROC _CHGSGN=*()
  [$85$C0$86$C1$38$A9$00$E5$C0$48$A9$00
  $E5$C1$AA$68$60]
  
  PROC _FIXSGN=*()
  [$86$C2$E0$00$10$03$20 _CHGSGN $85$82
  $86$83$A5$85$45$C2$85$C2$A6$85$10$09
  $A5$84$20 _CHGSGN $85$84$86$85$60]
  
  PROC _FIXRES=*()
  [$A5$86$A6$87$A4$C2$10$03$4C _CHGSGN
  $60]
  
  PROC _MUL=*()
  SET $4E8 = _MUL
  [$20 _FIXSGN $A9$00$85$86$85$87$A5$82
  $D0$04$A5$83$F0$22$A5$84$D0$04$A5$85
  $F0$1A$46$85$66$84$90$0D$18$A5$86$65
  $82$85$86$A5$87$65$83$85$87$06$82$26
  $83$38$B0$D6$4C _FIXRES]
  
  PROC _DIV=*()
  SET $4EA = _DIV
  [$20 _FIXSGN $A9$00$85$86$85$87$85$C1
  $A9$01$85$C0$A5$82$D0$04$A5$83$F0$5F
  $A5$84$D0$04$A5$85$F0$57$A5$82$C5$84
  $A5$83$E5$85$90$0F$A5$C1$30$0B$06$84
  $26$85$06$C0$26$C1$38$B0$E7$A5$C0$D0
  $04$A5$C1$F0$36$A5$82$D0$04$A5$83$F0
  $2E$A5$82$C5$84$A5$83$E5$85$90$19$38
  $A5$82$E5$84$85$82$A5$83$E5$85$85$83
  $A5$86$05$C0$85$86$A5$87$05$C1$85$87
  $46$85$66$84$46$C1$66$C0$38$B0$C2$4C
  _FIXRES]
  
  PROC _MODOP=*()
  SET $4EC = _MODOP
  [$20 _DIV $A5$82$A6$83$60]
  
  ;PROC _RSHOP=*()
  ;SET $4E6 = _RSHOP
  ;[$A4$84$F0$0A$86$86$46$86$6A$88$D0$FA
  ;$A6$86$60]
  
  PROC _LSHOP=*()
  SET $4E4 = _LSHOP
  [$A4$84$F0$0A$86$86$0A$26$86$88$D0$FA
  $A6$86$60]
  
  PROC _ERROU=*()
  [$A9$70$AA$A9$0C$9D$42$03$20$56$E4$8A
  $38$E9$10$D0$F1$6C$0A$00]
  
  PROC _ERRVEC=*()
  [_ERROU]
  
  PROC _DEVIC=*()
  [$00]
  
  MODULE
  CARD Error=_ERRVEC
  BYTE device=_DEVIC
  
  PROC _GOCIO=*()
  [$20$56$E4$10$1A$C0$88$F0$06$68$68$98
  $6C _ERRVEC $48$8A$48$4A$4A$4A$4A$AA
  $A9$01$9D$C0$05$68$AA$68$60]
  
  PROC _LODCHN=*()
  [$C9$08$90$07$68$68$A9$86$6C _ERRVEC
  $0A$0A$0A$0A$AA$60]
  
  PROC _STONAM=*()
  [$18$69$01$9D$44$03$98$69$00$9D$45$03
  $60]
  
  PROC _SHFTR=*()
  [$48$8A$A8$68$AA$AD _DEVIC $60]
  
  ;PROC _CLREOL=*()
  ;[$48$A9$00$85$A5$68$60]
  
  PROC _SETEOL=*()
  [$48$A9$01$85$A5$68$60]
  
  PROC _PRECON=*()
  [$8A$48$98$AA$68$A0$03$84$A3$A0$FD$60]
  
  PROC _DOPRNT=*()
  [$86$A3$84$A4$20 _LODCHN $A9$00$9D$49
  $03$A8$B1$A3$F0$1A$9D$48$03$18$A5$A3
  $69$01$9D$44$03$A5$A4$69$00$9D$45$03
  $A9$0B$9D$42$03$20 _GOCIO $A5$A5$F0
  $12$A9$00$9D$48$03$9D$49$03$A9$0B$9D
  $42$03$A9$9B$20 _GOCIO $60]
  
  PROC StrC=*(CARD c, s)
  [$85$D4$86$D5$84$A2$20$AA$D9$20$E6$D8
  $A0$00$B1$F3$30$06$C8$91$A2$38$B0$F6
  $29$7F$C8$91$A2$98$A0$00$91$A2$60]
  
  ;PROC StrB=*(BYTE b CARD s)
  ;[$84$A3$48$8A$A8$A2$00$68$4C StrC]
  
  ;PROC StrI=*(INT i CARD s)
  ;[$E0$00$30$03$4C StrC{3 SPACES}$49$FF$85$A2
  ;$8A$49$FF$AA$E6$A2$D0$01$E8$A5$A2$20
  ;StrC $A0$00$18$B1$A2$69$01$91$A2$A8
  ;$88$B1$A2$C8$91$A2$88$88$D0$F7$C8$A9
  ;$2D$91$A2$60]
  
  PROC _DOPRNC=*()
  [$48$20 _PRECON $20 StrC $68$A2$FD$A0
  $03$4C _DOPRNT]
  
  ;PROC DOPRNI=*()
  ;[$48$20 _PRECON $20 StrI $68$A2$FD$A0
  ;$03$4C _DOPRNT]
  
  ;PROC PrintCD=*(BYTE d CARD c)
  ;[$20 _CLREOL $4C _DOPRNC]
  
  ;PROC PrintC=*(CARD c)
  ;[$20 _SHFTR $4C PrintCD]
  
  PROC PrintCDE=*(BYTE d CARD c)
  [$20 _SETEOL $4C _DOPRNC]
  
  ;PROC PrintCE=*(CARD c)
  ;[$20 _SHFTR $4C PrintCDE]
  
  ;PROC PrintBD=*(BYTE d, b)
  ;[$A0$00$4C PrintCD]
  
  ;PROC PrintB=*(BYTE b)
  ;[$20 _SHFTR $4C PrintBD]
  
  PROC PrintBDE=*(BYTE d, b)
  [$A0$00$4C PrintCDE]
  
  ;PROC PrintBE=*(BYTE b)
  ;[$20 _SHFTR $4C PrintBDE]
  
  ;PROC PrintID=*(BYTE d INT i)
  ;[$20 _CLREOL $4C _DOPRNI]
  
  ;PROC PrintI=*(INT i)
  ;[$20 _SHFTR $4C PrintID]
  
  ;PROC PrintIDE=*(BYTE d INT i)
  ;[$20 _SETEOL $4C _DOPRNI]
  
  ;PROC PrintIE=*(INT i)
  ;[$20 _SHFTR $4C PrintIDE]
  
  ;PROC PrintD=*(BYTE d CARD s)
  ;[$20 _CLREOL $4C _DOPRNT]
  
  ;PROC Print=*(CARD s)
  ;[$20 _SHFTR $4C PrintD]
  
  PROC PrintDE=*(BYTE d CARD s)
  [$20 _SETEOL $4C _DOPRNT]
  
  PROC PrintE=*(CARD s)
  [$20 _SHFTR $4C PrintDE]
  
  ;PROC _HEXSTR=*()
  ;[$85$84$86$85$A9$FD$85$A2$A9$03$85$A3
  ;$A0$00$A9$05$91$A2$C8$A9$24$91$A2$A9
  ;$00$A2$04$06$84$26$85$2A$CA$D0$F8$69
  ;$30$C9$3A$90$02$69$06$C8$91$A2$C0$05
  ;$D0$E5$60]
  
  ;PROC PrintF=*(CARD s,a,b,c,d,e,f,g)
  ;[$85$82$86$83$84$A2$AD _DEVIC $0A$0A
  ;$0A$0A$85$C1$A0$00$84$87$84$C0$B1$82
  ;$F0$4C$85$86$E6$C0$F0$46$A4$C0$C4$86
  ;$F0$02$B0$3E$B1$82$C9$25$D0$3E$E6$C0
  ;$C8$C4$86$F0$02$B0$35$B1$82$C9$25$F0
  ;$2F$C9$45$F0$29$A8$A6$87$E0$0E$B0$D4
  ;$B5$A2$48$B5$A3$E8$E8$86$87$AA$68$C0
  ;$43$F0$15$C0$49$F0$34$C0$48$F0$3C$C0
  ;$53$F0$3F$38$B0$1D$60$38$B0$B2$A9$9B
  ;$A8$A6$C1$A9$00$9D$48$03$9D$49$03$A9
  ;$0B$9D$42$03$98$20 _GOCIO $38$B0$E4
  ;$A0$03$84$A3$A0$FD$20 StrC $38$B0$0F
  ;$A0$03$84$A3$A0$FD$20 StrI $38$B0$03
  ;$20 _HEXSTR $A9$FD$A2$03$85$84$86$85
  ;$A6$C1$A9$00$9D$49$03$A8$B1$84$F0$B5
  ;$9D$48$03$18$A5$84$69$01$9D$44$03$A5
  ;$85$69$00$9D$45$03$A9$0B$9D$42$03$20
  ;_GOCIO $38$B0$98]
  
  PROC PutD=*(BYTE d, c)
  [$86$A0$20 _LODCHN $A9$00$9D$48$03$9D
  $49$03$A9$0B$9D$42$03$A5$A0$20 _GOCIO
  $60]
  
  ;PROC PutDE=*(BYTE d)
  ;[$A2$9B$4C PutD]
  
  PROC Put=*(BYTE c)
  [$AA$AD _DEVIC $4C PutD]
  
  PROC PutE=*()
  [$A9$9B$4C Put]
  
  ;BYTE FUNC ValB=*(CARD a)
  CARD FUNC ValC=*(CARD a)
  ;INT FUNC ValI=*(CARD a)
  [$85$A2$86$A3$A9$00$85$A0$85$A1$85$A5
  $A8$B1$A2$85$A4$C8$B1$A2$C9$20$F0$F9
  $C9$2D$D0$0B$C6$A5$C8$C4$A4$F0$02$B0
  $31$B1$A2$38$E9$30$90$2A$C9$0A$B0$26
  $48$06$A0$26$A1$A5$A0$A6$A1$0A$26$A1
  $0A$26$A1$18$65$A0$85$A0$8A$65$A1$85
  $A1$18$68$65$A0$85$A0$90$CD$E6$A1$38
  $B0$C8$A5$A5$F0$0D$38$A9$00$E5$A0$85
  $A0$A9$00$E5$A1$85$A1$60]
  
  PROC _DOINPT=*()
  [$86$A4$84$A5$20 _LODCHN $18$A5$A4$69
  $01$9D$44$03$A5$A5$69$00$9D$45$03$A5
  $A3$F0$18$9D$48$03$A9$00$9D$49$03$A9
  $05$9D$42$03$20 _GOCIO $BD$48$03$F0
  $03$38$E9$01$A0$00$91$A4$A5$A6$F0$07
  $A5$A4$A6$A5$4C ValC $60]
  
  BYTE FUNC InputBD=*(BYTE d)
  CARD FUNC InputCD=*(BYTE d)
  ;INT FUNC InputID=*(BYTE d)
  [$48$A9$78$85$A3$A9$01$85$A6$68$A2$FD
  $A0$03$4C _DOINPT]
  
  ;BYTE FUNC InputB=*()
  ;CARD FUNC InputC=*()
  ;INT FUNC InputI=*()
  ;[$AD _DEVIC$4C InputCD]
  
  ;PROC InputMD=*(BYTE d CARD s BYTE l)
  ;[$48$A9$00$85$A6$68$4C _DOINPT]
  
  ;PROC InputSD=*(BYTE d CARD s)
  ;[$48$A9$FF$85$A3$68$4C InputMD]
  
  ;PROC InputS=*(CARD s)
  ;[$20 _SHFTR $4C InputSD]
  
  ;CHAR FUNC GetD=*(BYTE d)
  ;[$20 _LODCHN $A9$00$9D$48$03
  ;$9D$49$03$A9$07$9D$42$03$20 _GOCIO
  ;$85$A0$60]
  
  PROC Open=*(BYTE d CARD s BYTE m, a)
  [$86$A1$20 _LODCHN $A5$A1$20
   _STONAM $A5$A3$9D$4A$03$A5$A4$9D$4B
  $03$A9$03$9D$42$03$20 _GOCIO $8A$4A
  $4A$4A$4A$AA$A9$00$9D$C0$05$60]
  
  PROC Close=*(BYTE d)
  [$20 _LODCHN $A9$0C$9D$42$03$20
  _GOCIO $60]
  
  ;PROC XIO=*(BYTE d,z,c,a1,a2 CARD s)
  ;[$20 _LODCHN $98$9D$42$03$A5$A3$9D$4A
  ;$03$A5$A4$9D$4B$03$A5$A5$A4$A6$20
  ;_STONAM $20 _GOCIO $60]
  
  ;PROC Note=*(BYTE d CARD s, o)
  ;[$86$A1$84$A2$20 _LODCHN $A9$26$9D$42
  ;$03$20 _GOCIO $A0$00$BD$4C$03$91$A1
  ;$BD$4E$03$91$A3$BD$4D$03$C8$91$A1$60]
  
  ;PROC Point=*(BYTE d CARD s BYTE o)
  ;[$86$A1$20 _LODCHN $A5$A1$9D$4C$03$98
  ;$9D$4D$03$A5$A3$9D$4E$03$A9$25$9D$42
  ;$03$20 _GOCIO $60]
  
  PROC Graphics=*(BYTE m)
  [$48$A2$60$A9$0C$9D$42$03$20$56$E4$68
  $9D$4B$03$49$10$09$0C$9D$4A$03$A9$53
  $85$A0$A9$3A$85$A1$A9$A0$9D$44$03$A9
  $00$9D$45$03$A9$03$9D$42$03$20 _GOCIO
  $60]
  
  ;PROC SetColor=*(BYTE r, h, l)
  ;[$C9$05$B0$13$85$A0$8A$0A$0A$0A$0A$85
  ;$A1$98$29$0F$05$A1$A6$A0$9D$C4$02$60]
  
  PROC Position=*(CARD x BYTE y)
  [$85$55$86$56$84$54$60]
  
  ;PROC Plot=*(CARD x BYTE y)
  ;[$20 Position $A9$06$AE$FD$02$4C
  ;PutD]
  
  ;PROC DrawTo=*(CARD x BYTE y)
  ;[$20 Position $A2$60$A9$11
  ;$9D$42$03$AD$FB$02$8D$FD$02$20 _GOCIO
  ;$60]
  
  ;PROC Fill=*(CARD x BYTE y)
  ;[$20 Position $A2$60$A9$12
  ;$9D$42$03$AD$FB$02$8D$FD$02$20 _GOCIO
  ;$60]
  
  ;BYTE FUNC Locate=*(CARD x BYTE y)
  ;[$20 Position $A9$06$4C GetD]
  
  PROC Sound=*(BYTE c, p, d, v)
  [$C9$04$B0$25$86$A1$0A$AA$A9$00$8D$08
  $D2$A9$03$8D$0F$D2$A5$A3$29$0F$85$A3
  $98$29$0E$0A$0A$0A$0A$05$A3$9D$01$D2
  $A5$A1$9D$00$D2$60]
  
  ;PROC SndRst=*()
  ;[$A9$00$A2$07$9D$00$D2$CA$10$FA$60]
  
  ;BYTE FUNC Paddle=*(BYTE p)
  ;[$29$07$AA$BD$70$02$85$A0$60]
  
  ;BYTE FUNC PTrig=*(BYTE p)
  ;[$29$07$AA$BD$7C$02$85$A0$60]
  
  ;BYTE FUNC Stick=*(BYTE p)
  ;[$29$03$AA$BD$78$02$85$A0$60]
  
  ;BYTE FUNC STrig=*(BYTE p)
  ;[$29$03$AA$BD$84$02$85$A0$60]
  
  ;INT FUNC SCompare=*(CARD s1, s2)
  ;[$85$A4$86$A5$84$A2$A0$00$84$A0$84$A1
  ;$B1$A4$85$A6$B1$A2$85$A7$C4$A6$F0$15
  ;$C4$A7$F0$11$C8$B1$A4$D1$A2$F0$F1$90
  ;$03$E6$A0$60$C6$A0$C6$A1$60$A5$A6$C5
  ;$A7$F0$F9$B0$F0$90$F1]
  
  PROC SCopy=*(CARD d, s)
  [$85$A0$86$A1$84$A2$A0$00$B1$A2$A8$B1
  $A2$91$A0$C0$00$F0$04$88$38$B0$F4$60]
  
  ;PROC SCopyS=*(CARD d, s BYTE b, e)
  ;[$85$A0$86$A1$84$A2$A0$00$84$A6$B1$A2
  ;$C5$A5$B0$02$85$A5$A5$A4$F0$15$C5$A5
  ;$F0$02$B0$0F$A4$A4$E6$A4$B1$A2$E6$A6
  ;$A4$A6$91$A0$38$B0$E7$A5$A6$A0$00$91
  ;$A0$60]
  
  ;PROC SAssign=*(CARD d, s BYTE b, e)
  ;[$85$A0$86$A1$84$A2$A5$A4$F0$3B$C5$A5
  ;$F0$02$B0$35$85$A7$C6$A7$A0$00$84$A8
  ;$B1$A0$85$A9$B1$A2$85$AA$A5$A7$C5$A5
  ;$B0$15$A5$A8$C5$AA$B0$0F$E6$A8$A4$A8
  ;$B1$A2$E6$A7$A4$A7$91$A0$38$B0$E5$A5
  ;$A7$C5$A9$90$04$A0$00$91$A0$60]
  
  BYTE FUNC Rand=*(BYTE r)
  [$85$A2$C6$A2$A9$01$C5$A2$B0$05$38$2A
  $38$B0$F7$85$A3$AD$0A$D2$25$A3$C5$A2
  $F0$04$90$02$B0$F3$85$A0$60]
  
  PROC Poke=*(CARD a BYTE v)
  [$85$A0$86$A1$98$A0$00$91$A0$60]
  
  PROC PokeC=*(CARD a, v)
  [$20 Poke $C8$A5$A3$91$A0$60]
  
  ;BYTE FUNC Peek=*(CARD a)
  CARD FUNC PeekC=*(CARD a)
  [$85$A2$86$A3$A0$00$B1$A2$85$A0$C8$B1
  $A2$85$A1$60]
  
  PROC SetBlock=*(CARD a, l, v)
  [$85$A0$86$A1$84$A2$A0$00$A5$A2$D0$04
  $A5$A3$F0$16$A5$A4$91$A0$C8$D0$02$E6
  $A1$C6$A2$A5$A2$C9$FF$D0$E7$C6$A3$38
  $B0$E2$60]
  
  PROC Zero=*(CARD a, l)
  [$48$A9$00$85$A4$68$4C SetBlock]
  
  PROC MoveBlock=*(CARD d, s, l)
  [133 160 134 161 132 162 160{3 SPACES}0 166
   165 240  14 177 162 145 160 200 208
   249 230 163 230 161 202 208 242 166
   164 240{3 SPACES}8 177 162 145 160 200 202
   208 248  96]
  
  MODULE

← Back to Gem Drop docs