First commit main
authorHistorical Source <49599193+historicalsource@users.noreply.github.com>
Sat, 16 Oct 2021 04:14:30 +0000 (00:14 -0400)
committerHistorical Source <49599193+historicalsource@users.noreply.github.com>
Sat, 16 Oct 2021 04:14:30 +0000 (00:14 -0400)
155 files changed:
022X1.DAT [new file with mode: 0644]
372BR.RS4 [new file with mode: 0644]
372X1.DOC [new file with mode: 0644]
BITPAT.MAC [new file with mode: 0644]
C00.DAT [new file with mode: 0644]
C01.DAT [new file with mode: 0644]
C02.DAT [new file with mode: 0644]
C03.DAT [new file with mode: 0644]
C10.DAT [new file with mode: 0644]
C11.DAT [new file with mode: 0644]
C12.DAT [new file with mode: 0644]
C13.DAT [new file with mode: 0644]
C20.DAT [new file with mode: 0644]
C21.DAT [new file with mode: 0644]
C22.DAT [new file with mode: 0644]
C23.DAT [new file with mode: 0644]
C30.DAT [new file with mode: 0644]
C31.DAT [new file with mode: 0644]
C32.DAT [new file with mode: 0644]
C33.DAT [new file with mode: 0644]
C99.LDA [new file with mode: 0644]
C99.MAC [new file with mode: 0644]
CAL.MAC [new file with mode: 0644]
CATOUT.MAC [new file with mode: 0644]
CCN.MAC [new file with mode: 0644]
CCT.MAC [new file with mode: 0644]
CCUBE.MAC [new file with mode: 0644]
CDB.MAC [new file with mode: 0644]
CEE.MAC [new file with mode: 0644]
CEEDEF.MAC [new file with mode: 0644]
CEL.MAC [new file with mode: 0644]
CEN.MAC [new file with mode: 0644]
CET.MAC [new file with mode: 0644]
CG.MAC [new file with mode: 0644]
CGR.MAC [new file with mode: 0644]
CIN.MAC [new file with mode: 0644]
CLS.MAC [new file with mode: 0644]
CMAC.MAC [new file with mode: 0644]
CMN.MAC [new file with mode: 0644]
CMR.MAC [new file with mode: 0644]
CMS.MAC [new file with mode: 0644]
CMTB.MAC [new file with mode: 0644]
CRF.LDA [new file with mode: 0644]
CRF.MAC [new file with mode: 0644]
CRP.MAC [new file with mode: 0644]
CSL.MAC [new file with mode: 0644]
CSS.MAC [new file with mode: 0644]
CST.MAC [new file with mode: 0644]
CSTART.MAC [new file with mode: 0644]
CWV.MAC [new file with mode: 0644]
HLL65F.MAC [new file with mode: 0644]
M6502.MAC [new file with mode: 0644]
TOPOWP.LDA [new file with mode: 0644]
TPBUS.LDA [new file with mode: 0644]
TPI.LDA [new file with mode: 0644]
TPSYNC.LDA [new file with mode: 0644]
version-2/022X2.DAT [new file with mode: 0644]
version-2/372BR.RS4 [new file with mode: 0644]
version-2/372X2.DOC [new file with mode: 0644]
version-2/BITPAT.MAC [new file with mode: 0644]
version-2/C00.DAT [new file with mode: 0644]
version-2/C01.DAT [new file with mode: 0644]
version-2/C02.DAT [new file with mode: 0644]
version-2/C03.DAT [new file with mode: 0644]
version-2/C10.DAT [new file with mode: 0644]
version-2/C11.DAT [new file with mode: 0644]
version-2/C12.DAT [new file with mode: 0644]
version-2/C13.DAT [new file with mode: 0644]
version-2/C20.DAT [new file with mode: 0644]
version-2/C21.DAT [new file with mode: 0644]
version-2/C22.DAT [new file with mode: 0644]
version-2/C23.DAT [new file with mode: 0644]
version-2/C30.DAT [new file with mode: 0644]
version-2/C31.DAT [new file with mode: 0644]
version-2/C32.DAT [new file with mode: 0644]
version-2/C33.DAT [new file with mode: 0644]
version-2/C99.LDA [new file with mode: 0644]
version-2/C99.MAC [new file with mode: 0644]
version-2/CAL.MAC [new file with mode: 0644]
version-2/CATOUT.MAC [new file with mode: 0644]
version-2/CCN.MAC [new file with mode: 0644]
version-2/CCT.MAC [new file with mode: 0644]
version-2/CCUBE.MAC [new file with mode: 0644]
version-2/CDB.MAC [new file with mode: 0644]
version-2/CEE.MAC [new file with mode: 0644]
version-2/CEEDEF.MAC [new file with mode: 0644]
version-2/CEL.MAC [new file with mode: 0644]
version-2/CEN.MAC [new file with mode: 0644]
version-2/CET.MAC [new file with mode: 0644]
version-2/CG.MAC [new file with mode: 0644]
version-2/CGR.MAC [new file with mode: 0644]
version-2/CIN.MAC [new file with mode: 0644]
version-2/CLS.MAC [new file with mode: 0644]
version-2/CMAC.MAC [new file with mode: 0644]
version-2/CMN.MAC [new file with mode: 0644]
version-2/CMR.MAC [new file with mode: 0644]
version-2/CMS.MAC [new file with mode: 0644]
version-2/CMTB.MAC [new file with mode: 0644]
version-2/CRF.LDA [new file with mode: 0644]
version-2/CRF.MAC [new file with mode: 0644]
version-2/CRP.MAC [new file with mode: 0644]
version-2/CSL.MAC [new file with mode: 0644]
version-2/CSS.MAC [new file with mode: 0644]
version-2/CST.MAC [new file with mode: 0644]
version-2/CSTART.MAC [new file with mode: 0644]
version-2/CWV.MAC [new file with mode: 0644]
version-2/HLL65F.MAC [new file with mode: 0644]
version-2/M6502.MAC [new file with mode: 0644]
version-2/TOPOWP.LDA [new file with mode: 0644]
version-2/TPBUS.LDA [new file with mode: 0644]
version-2/TPI.LDA [new file with mode: 0644]
version-2/TPSYNC.LDA [new file with mode: 0644]
version-3/022X3.DAT [new file with mode: 0644]
version-3/372X3.DOC [new file with mode: 0644]
version-3/BITPAT.MAC [new file with mode: 0644]
version-3/C99.LDA [new file with mode: 0644]
version-3/CAL.MAC [new file with mode: 0644]
version-3/CATOUT.MAC [new file with mode: 0644]
version-3/CCN.MAC [new file with mode: 0644]
version-3/CCT.MAC [new file with mode: 0644]
version-3/CCUBE.MAC [new file with mode: 0644]
version-3/CDB.MAC [new file with mode: 0644]
version-3/CEE.MAC [new file with mode: 0644]
version-3/CEEDEF.MAC [new file with mode: 0644]
version-3/CEEDUM.MAC [new file with mode: 0644]
version-3/CEL.MAC [new file with mode: 0644]
version-3/CEN.MAC [new file with mode: 0644]
version-3/CET.MAC [new file with mode: 0644]
version-3/CG.MAC [new file with mode: 0644]
version-3/CGR.MAC [new file with mode: 0644]
version-3/CIN.MAC [new file with mode: 0644]
version-3/CJTB.MAC [new file with mode: 0644]
version-3/CLS.MAC [new file with mode: 0644]
version-3/CLS.SND [new file with mode: 0644]
version-3/CMAC.MAC [new file with mode: 0644]
version-3/CMN.MAC [new file with mode: 0644]
version-3/CMR.MAC [new file with mode: 0644]
version-3/CMS.MAC [new file with mode: 0644]
version-3/CMTB.MAC [new file with mode: 0644]
version-3/CRB.LDA [new file with mode: 0644]
version-3/CRF.LDA [new file with mode: 0644]
version-3/CRF.MAC [new file with mode: 0644]
version-3/CRM.LDA [new file with mode: 0644]
version-3/CRM.MAC [new file with mode: 0644]
version-3/CRN.LDA [new file with mode: 0644]
version-3/CRN.MAC [new file with mode: 0644]
version-3/CRP.MAC [new file with mode: 0644]
version-3/CSL.MAC [new file with mode: 0644]
version-3/CSS.MAC [new file with mode: 0644]
version-3/CST.MAC [new file with mode: 0644]
version-3/CSTART.MAC [new file with mode: 0644]
version-3/CWORDS.TXT [new file with mode: 0644]
version-3/CWV.MAC [new file with mode: 0644]
version-3/HLL65F.MAC [new file with mode: 0644]
version-3/M6502.MAC [new file with mode: 0644]

diff --git a/022X1.DAT b/022X1.DAT
new file mode 100644 (file)
index 0000000..13e3d52
Binary files /dev/null and b/022X1.DAT differ
diff --git a/372BR.RS4 b/372BR.RS4
new file mode 100644 (file)
index 0000000..62de068
Binary files /dev/null and b/372BR.RS4 differ
diff --git a/372X1.DOC b/372X1.DOC
new file mode 100644 (file)
index 0000000..e766075
Binary files /dev/null and b/372X1.DOC differ
diff --git a/BITPAT.MAC b/BITPAT.MAC
new file mode 100644 (file)
index 0000000..124a01b
Binary files /dev/null and b/BITPAT.MAC differ
diff --git a/C00.DAT b/C00.DAT
new file mode 100644 (file)
index 0000000..045d912
Binary files /dev/null and b/C00.DAT differ
diff --git a/C01.DAT b/C01.DAT
new file mode 100644 (file)
index 0000000..091fa77
Binary files /dev/null and b/C01.DAT differ
diff --git a/C02.DAT b/C02.DAT
new file mode 100644 (file)
index 0000000..d450aa9
Binary files /dev/null and b/C02.DAT differ
diff --git a/C03.DAT b/C03.DAT
new file mode 100644 (file)
index 0000000..236d140
Binary files /dev/null and b/C03.DAT differ
diff --git a/C10.DAT b/C10.DAT
new file mode 100644 (file)
index 0000000..55bddfa
Binary files /dev/null and b/C10.DAT differ
diff --git a/C11.DAT b/C11.DAT
new file mode 100644 (file)
index 0000000..8807a33
Binary files /dev/null and b/C11.DAT differ
diff --git a/C12.DAT b/C12.DAT
new file mode 100644 (file)
index 0000000..edb81bb
Binary files /dev/null and b/C12.DAT differ
diff --git a/C13.DAT b/C13.DAT
new file mode 100644 (file)
index 0000000..583b32e
Binary files /dev/null and b/C13.DAT differ
diff --git a/C20.DAT b/C20.DAT
new file mode 100644 (file)
index 0000000..9f89194
Binary files /dev/null and b/C20.DAT differ
diff --git a/C21.DAT b/C21.DAT
new file mode 100644 (file)
index 0000000..86c6951
Binary files /dev/null and b/C21.DAT differ
diff --git a/C22.DAT b/C22.DAT
new file mode 100644 (file)
index 0000000..bc362e6
Binary files /dev/null and b/C22.DAT differ
diff --git a/C23.DAT b/C23.DAT
new file mode 100644 (file)
index 0000000..6776ee0
Binary files /dev/null and b/C23.DAT differ
diff --git a/C30.DAT b/C30.DAT
new file mode 100644 (file)
index 0000000..477d8f0
Binary files /dev/null and b/C30.DAT differ
diff --git a/C31.DAT b/C31.DAT
new file mode 100644 (file)
index 0000000..3c426c8
Binary files /dev/null and b/C31.DAT differ
diff --git a/C32.DAT b/C32.DAT
new file mode 100644 (file)
index 0000000..8e4f5a4
Binary files /dev/null and b/C32.DAT differ
diff --git a/C33.DAT b/C33.DAT
new file mode 100644 (file)
index 0000000..46b1054
Binary files /dev/null and b/C33.DAT differ
diff --git a/C99.LDA b/C99.LDA
new file mode 100644 (file)
index 0000000..3b024ed
Binary files /dev/null and b/C99.LDA differ
diff --git a/C99.MAC b/C99.MAC
new file mode 100644 (file)
index 0000000..4b66080
Binary files /dev/null and b/C99.MAC differ
diff --git a/CAL.MAC b/CAL.MAC
new file mode 100644 (file)
index 0000000..b62cb17
Binary files /dev/null and b/CAL.MAC differ
diff --git a/CATOUT.MAC b/CATOUT.MAC
new file mode 100644 (file)
index 0000000..10c78a4
Binary files /dev/null and b/CATOUT.MAC differ
diff --git a/CCN.MAC b/CCN.MAC
new file mode 100644 (file)
index 0000000..6f34d5c
--- /dev/null
+++ b/CCN.MAC
@@ -0,0 +1,706 @@
+;  filename CCN.MAC\r
+;  coin routine copied from [ALBAUGH.INTER]COIN65.MAC\r
+;  12-1-82\r
+\r
+        .SBTTL COIN65 - 650X "UNIVERSAL" COIN ROUTINE\r
+        .SBTTL *********************************\r
+        .SBTTL * PROGRAMERS: DOWNEND & ALBAUGH *\r
+        .SBTTL *                               *\r
+        .SBTTL * CHECKER:                      *\r
+        .SBTTL *                               *\r
+        .SBTTL *********************************\r
+\r
+        .SBTTL EXPLANATION\r
+       .RAD=10\r
+        .RADIX 16\r
+       .ENABL LC\r
+        .LIST MEB\r
+;THIS IS A MAJOR REVISION OF THE COIN ROUTINE DERIVED FROM PENNY.\r
+;ALL NEW PROGRAMS SHOULD USE THIS ROUTINE.  OLD PROGRAMS CAN CONTINUE\r
+;TO USE PENNY, BUT NO FURTHER OPTIONS WILL BE SUPPORTED IN PENNY.\r
+;REVISED 7/80 TO SUPPORT BONUS-ADDER\r
+        .SBTTL DEFAULT ASSIGNMENTS\r
+        .LIST CND\r
+       .IIF NDF,FTEST,FTEST=0          ;NOT FIELD TEST\r
+        .IIF NDF,MODES,MODES=4          ;FOUR COIN MODES STANDARD\r
+                                       ;ALTERNATE IS MODES=0\r
+       .IIF NDF,MECHS,MECHS=3          ;# OF MECHS (1,2 OR 3)\r
+       .IIF NDF,INCLUDE,INCLUDE=0      ;NOT ".INCLUDE"'D\r
+;IF "INCLUDE=1",THE ".END" IS SUPPRESSED\r
+       .IIF NDF,RTS,RTS=1              ;EXIT VIA RTS\r
+;IF RTS=0,EXITS BY FALLING OUT\r
+       .IIF NDF,BONADD,BONADD=0        ;DO NOT BONUS-ADDER,BONADD=1 TO DO BONUS ADDER\r
+       .IIF NDF,QUICK,QUICK=0          ;NO Quickies, unless asked for.\r
+;If QUICK=1, Much overhead is skipped if no coin activity\r
+\r
+       .IF EQ,MECHS-3                  ;DEFAULTS FOR MECHS=3\r
+       .IIF NDF,MULTS,MULTS=1                  ;IMPLEMENT H.DELMAN STANDARD MULTIPLIERS\r
+                                               ;(SEE GHM,GDM BELOW)\r
+       .IIF NDF,EMCTRS,EMCTRS=3                ;3 ELECTRO-MECH COUNTERS\r
+       .IIF NDF,OFFSET,OFFSET=1                ;OFFSET BY 1\r
+       .ENDC                           ;EQ,MECHS-3\r
+       \r
+       .IF EQ,MECHS-2                  ;DEFAULTS FOR MECHS=2\r
+       .IIF NDF,MULTS,MULTS=0                  ;MULTIPLIERS DO NOT APPLY\r
+       .IIF NDF,EMCTRS,EMCTRS=0                ;NO E.M. COUNTERS\r
+        .IIF NDF,OFFSET,OFFSET=2               ;SWITCHES AND STATUS BYTES TWO-APART\r
+       .ENDC                           ;EQ, MECHS-2\r
+\r
+       .IF EQ,MECHS-1                  ;DEFAULTS FOR MECHS=1\r
+       .IIF NDF,MULTS,MULTS=1                  ;H. DELMAN STD. MULTS\r
+       .IIF NDF,EMCTRS,EMCTRS=1                ;1 COUNTER\r
+       .IIF NDF,OFFSET,OFFSET=1                ;OFFSET FOR COUNTERS\r
+       .ENDC                           ;EQ,MECHS-1\r
+\r
+       .IIF NDF,SEPCCT,SEPCCT=0        ;DO NOT IMPLEMENT SEPARATE $CNCT'S\r
+;USE SEPCCT=1 ONLY FOR WIERD,NON-STANDARD MECH-MULTIPLIERS\r
+        .IIF NDF,COIN,COIN=0            ;COIN IS LOW-TRUE\r
+        .IIF NDF,CNTINT,CNTINT=1        ;COUNT INTERRUPTS (IN $INTCT)\r
+        .IIF NDF,SLAM,SLAM=1            ;SLAM IS HIGH-TRUE\r
+        .IIF NDF,CMZP,CMZP=1            ;COIN MODE IS IN ZERO-PAGE\r
+;D0,D1=0,1,2,3 FOR FREE, 2 PLAY/COIN, 1 PLAY/COIN,2 COIN/PLAY\r
+;D2,D3=0,1,2,3 FOR 1,4,5,6 "UNITS"/RIGHT COIN\r
+;D4=0,1 FOR 1,2 "UNITS"/MIDDLE COIN\r
+;ONLY D2,3,4 USED IF MODES=0\r
+        .IIF NDF,COIN67,COIN67=0        ;COINS NOT IN D7,D6 OF SAME BYTE\r
+       .IIF NDF,COIN01,COIN01=0        ;COINS NOT IN D0,D1 EITHER\r
+        .IIF NDF,PRST,PRST=30.          ;PRE-COIN SLAM KILLS COINS FOR 30 FRAMES\r
+        .IIF NDF,POST,POST=30.          ;POST-COIN SLAM KILLS COINS WITHIN 30 FRAMES\r
+       .IF NE,<EMCTRS>*<EMCTRS-1>*<EMCTRS-3>*<EMCTRS-4>\r
+       .ERROR          ;NONE,ONE,THREE, OR FOUR E.M.CTRS ONLY\r
+       .ENDC\r
+       .IF NE,FTEST\r
+       CCTRS   =1                      ;FIELD TEST, 1 COIN COUNTER\r
+       .IFF\r
+       CCTRS   =EMCTRS                 ;NORMALLY\r
+       .ENDC\r
+        .IF NE,CMZP\r
+;IF YOU USE CMZP=0, DEFINE EQUIVALENT MACROS\r
+;(GCM NOT NEEDED IF MODES=0)\r
+        .MACRO GCM\r
+;ACC0,ACC1:=COIN OPTION ACC 2-7=0,Z-FLAG SET PER ACC  CARRY IS DON'T CARE.\r
+        LDA Z,$CMODE                   ;GET COIN MODE FROM ZERO-PAGE\r
+       .IF NE,MULTS\r
+       AND I,3                         ;ISOLATE COINS-CREDITS OPTION\r
+       .ENDC                           ;NE,MULTS\r
+        .ENDM\r
+\r
+;GHM, GDM NOT NEEDED IF MULTS=0\r
+       .MACRO GHM\r
+;ACC=0 FOR 1 "UNIT" ,<>0 FOR 2 "UNITS" PER MIDDLE-MECH COIN.\r
+;  Z FLAG SET PER ACC.  CARRY IS DON'T CARE\r
+       LDA Z,$CMODE                    ;GET COIN MODE FROM ZERO-PAGE\r
+       AND I,10                        ;ISOLATE HALF-MULTIPLIER\r
+       .ENDM\r
+\r
+       .MACRO GDM\r
+;ACC=0,1,2,3 FOR 1,4,5,6 "UNITS" PER RIGHT-MECH COIN.  CARRY CLEAR.  Z-FLAG SET PER ACC\r
+       LDA Z,$CMODE\r
+       AND I,0C\r
+       LSR\r
+       LSR\r
+       .ENDM\r
+        .ENDC                  ;NE,CMZP\r
+       .MACRO GBAM\r
+;ACC= 0,1,2,3,4,5,6,7 FOR BONUS-ADDER MODE\r
+       LDA Z,$CMODE\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR                     ;ISOLATE BONUS-ADDER MODE IN BITS 0-2\r
+       .ENDM\r
+        .NLIST CND\r
+       .NLIST CND\r
+;ENTRY POINT\r
+        .GLOBL MOOLAH\r
+;\r
+;EXTERNAL REFERENCES\r
+       .IF NE,BONADD\r
+       .GLOBL $BCCNT\r
+       .GLOBL $BC\r
+       .ENDC\r
+       .IF NE,MODES!MULTS\r
+       .IF NE,CMZP\r
+        .GLOBL $CMODE                   ;INPUT COIN MODE\r
+       .ENDC                           ;NE, CMZP\r
+       .ENDC                           ;NE,MODES!MULTS\r
+        .GLOBL $COINA,$LAM              ;SWITCH LOCATIONS (COIN & SLAM)\r
+        .GLOBL $LMBIT                   ;MASK WITH 1 IN BIT WHERE SLAM SW. IS\r
+        .GLOBL $CNSTT,$PSTSL           ;INTERNAL LOCATIONS\r
+       .GLOBL $INTCT                   ;INTERRUPT COUNTER\r
+        .GLOBL $LMTIM,$CNCT             ;SLAM-TIMER, COINCOUNT\r
+       .IF NE,MODES\r
+        .GLOBL $$CRDT                   ;RESULT OF ALL THIS\r
+       .ENDC                           ;NE,MODES\r
+       .IF NE,EMCTRS\r
+       .GLOBL $CCTIM                   ;COIN-COUNTER TIMER BYTE(S)\r
+       .ENDC                           ;NE,EMCTRS\r
+        .IF NE,MODES*<MODES-4>\r
+        .ERROR   ;2 FLAVORS-0 OR 4 MODES\r
+        .ENDC                          ;NE,MODES*<MODES-4>\r
+       .IF NE,<MECHS-2>*<MECHS-3>*<MECHS-1>    ;CHECK # OF MECHS SPEC'D\r
+       .ERROR ;1, 2 OR 3 MECHS ONLY, PLEASE\r
+       .ENDC                           ;NE,<MECHS-2>*<CMECHS-3>*<MECHS-1>\r
+       .IF EQ,RTS!INCLUDE\r
+       .ERROR ;NO RTS, NO INCLUDE???\r
+       .ENDC                   ;RTS!INCLUDE\r
+       .IF NE,MULTS*SEPCCT\r
+       .ERROR ;BOTH MULTS AND SEPCCT?!?\r
+       .ENDC                           ;NE,MULTS*SEPCCT\r
+       .IF NE,MODES*SEPCCT\r
+       .ERROR ;SEPCCT AND MODES TOO?!?\r
+       .ENDC                           ;NE,MODES*SEPCCT\r
+        .IIF GT,PRST-31.,PRST=31.\r
+        .IIF GT,POST-63.,POST=63.\r
+;        The coin routine assumes the presence of the following .GLOBL variables:\r
+       .IF NE,BONADD\r
+       .REPT 0\r
+$BCCNT:        ONE BASE PAGE BYTE USED TO COUNT COINS TOWARDS\r
+       BONUS COINS. IT MUST BE INITIALIZED TO ZERO ON\r
+       POWER-ON. IT MUST ALSO BE INITIALIZED TO ZERO\r
+       WHEN A START-BUTTON IA PUSHED.\r
+$BC:   ONE BASE-PAGE BYTE USED TO\r
+       HOLD ACTUAL BONUS COINS ACCRUED.\r
+       INITIALIZE TO ZERO AT POWER-ON\r
+       AND EACH TIME A START BUTTON IS\r
+       PUSED.***CLEAR $BCCNT, THEN & BC.\r
+       .ENDR\r
+       .ENDC\r
+       .IF NE,MODES\r
+       .REPT 0\r
+$$CRDT:   Base page byte initialized to 0 on restart.  This is where accrued  credit\r
+        is  kept.   Should  be  decremented  for each player-start.  Note that a DECREMENT\r
+        instruction must be used to insure  mutual  exclusion  between  the  main  program\r
+        accessing  $$CRDT  and  the  interrupt-driven coin routine accessing $$CRDT".  Not\r
+        used if MODES=0\r
+       .ENDR\r
+       .ENDC                   ;NE,MODES\r
+       .IF NE,CMZP\r
+       .REPT 0\r
+       .IIF NDF,SEPCCT,SEPCCT=0        ;DO NOT IMPLEMENT SEPARATE $CNCT'S\r
+$CMODE:   Base page byte that contains the coin option  switches  in  its  low-order\r
+        bits  (high true).  You must put them there.  This is not used if flag CMZP=0.\r
+       See bit definitions in DEFAULT ASSIGNMENTS, and Macro definitions GCM,GHM,GDM.\r
+       .ENDR\r
+       .ENDC                   ;NE,CMZP\r
+       .REPT 0\r
+$CNSTT:   "MECHS" base page bytes ($CNSTT, $CNSTT+OFFSET,$CNSTT+2*OFFSET) which should be\r
+       initialized to 00 (the timers for coin detection).\r
+$COINA:   "MECHS" locations containing coin switches in D7. Left mech is at  $COINA,  Right\r
+        mech is  at  $COINA+(2*OFFSET). If COIN67=1, Switches  are  all in $COINA, D7-Right,\r
+       D6-Mid, D5-Left. If Coin01=1, D0-Right, D1-MId, D2-Left.\r
+       .ENDR\r
+       .IF NE,SEPCCT\r
+       .REPT 0\r
+$CNCT:    "MECHS" base page bytes ($CNCT, $CNCT+OFFSET, $CNCT+(2*OFFSET)) which must be zeroed\r
+        on pwron - coin counters for program (As distinct from $CCTIM,Below). Only one is used\r
+       if SEPCCT=0.\r
+       .ENDR\r
+       .IFF\r
+       .REPT 0\r
+$CNCT:   Base page byte which must be initialized to zero on pwron. This is used to count\r
+       coins for program (As distinct from $CCTIM, below).\r
+       .ENDR\r
+       .ENDC                   ;NE,SEPCCT\r
+       .REPT 0\r
+$PSTSL:   "MECHS" base page bytes  ($PSTSL, $PSTSL+OFFSET,$PSTSL+(2*OFFSET)used to\r
+       time post-coin slam.\r
+$LAM:     Address of the SLAM switch.  The bit position inside $LAM is specified  by\r
+       $LMBIT (see below)\r
+$LMBIT:  Mask used to select which bit in the slam switch  byte  should  be  tested\r
+        (used as I,$LMBIT).  NOT A LOCATION, JUST A VALUE!!\r
+$LMTIM:   Base  page  byte  used  as  a  timer  for  pre-slam  protection.   May  be\r
+        initialized  to  0FF  at  pwron  to  disallow  coin input for 4 seconds.  Coins are\r
+        disallowed for two frames anyway.  This will be non-zero if SLAM was\r
+       true within PRST*4 frames.\r
+$INTCT:  Interrupt counter for  long  string-timer.   If  CNTINT=1,  this  will  be\r
+        incremented  (default  case).   If CNTINT=0, this should be equated to an existing\r
+        counter.\r
+$CCTIM:  Timers(s) for pulses output to electro-mechanical counters, if EMCTRS > 0.\r
+       Sign of $CCTIM(X) set if assoc. coin counter should be turned on, cleared\r
+       for off. If 3 used, they are Left @ $CCTIM, Mid @ $CCTIM+OFFSET,\r
+       Right @ $CCTIM+(2*OFFSET)\r
+Space requirements:\r
+                RAM: 3+CMZP+2*MECHS+EMCTRS (13. TYPICAL)\r
+                ROM: About 200. bytes\r
+The coin routine also assumes it will be called 4 times  a  frame,  where  one  frame=1/60\r
+second.   In  most  cases  this may be accomplished by making the coin routine part of the\r
+interrupt routine.\r
+       .ENDR\r
+       .IF EQ,OFFSET-2\r
+       .REPT 0\r
+SAMPLE BASE PAGE ALLOCATION:  (WHERE OFFSET=2,MECHS=3)\r
+       $BCCNT: .BLKB 1         ;COUNT TOWARDS BONUS COIN\r
+       $BC:    .BLKB 1         ;BONUS COINS\r
+       $CCTIM: .BLKB 1         ;COIN COUNTER TIMER (IF 1 USED)\r
+        $$CRDT: .BLKB 1                ;CREDIT TOTAL\r
+        $CNCT:  .BLKB 1                ;COIN COUNT\r
+       $LMTIM: .BLKB 1         ;PRE-COIN SLAM-TIMER\r
+       $CMODE: .BLKB 1         ;COIN MODE\r
+        $PSTSL: .BLKB 6                ;POST-COIN SLAM TIMERS (@ 0,2,4)\r
+        $CNSTT  =$PSTSL+1      ;COIN STATUS/TIMERS (@ 1,3,5)\r
+        .ENDR\r
+       .ENDC                   ;EQ,OFFSET-2\r
+       .IF EQ,OFFSET-1\r
+       .REPT 0\r
+SAMPLE BASE PAGE ALLOCATION: (WHERE OFFSET=1,MODES=4)\r
+       $BCCNT: .BLKB 1         ;COUNT TOWARDS BONUS COIN\r
+       $BC:    .BLKB 1         ;BONUS COINS\r
+       $CCTIM: .BLKB EMCTRS    ;E.M. COUNTER TIMERS (-FOR ON)\r
+       $$CRDT: .BLKB 1         ;CREDIT TOTAL\r
+       $CNCT:  .BLKB 1         ;"UNIT-COIN" COUNT\r
+       $PSTSL: .BLKB MECHS     ;POST-COIN SLAM TIMERS\r
+       $CNSTT: .BLKB MECHS     ;COIN-STATUS/TIMER\r
+       $LMTIM: .BLKB 1         ;PRE-COIN SLAM TIMER\r
+       $CMODE: .BLKB 1         ;COIN MODE\r
+       .ENDR\r
+       .ENDC                   ;EQ,OFFSET-1\r
+        .IF EQ,MODES-4\r
+        .REPT 0\r
+THE COIN MODES ARE:\r
+  0:    FREE PLAY- $CNCT is zeroed, $$CRDT is not changed\r
+  1:    2 PLAYS PER COIN\r
+  2:    1 PLAY PER COIN\r
+  3:    2 COINS PER PLAY\r
+        .ENDR\r
+        .ENDC                  ;EQ,MODES-4\r
+        .REPT 0\r
+                   *** COIN DETECTION ***\r
+Coin detection, courtesy of Mike Albaugh, uses two counters in one  byte  ($CNSTT).   This\r
+byte  is  used to remember the condition of the coin switch.  The upper counter (D7,D6,D5)\r
+runs when the coin is absent and is reset when the coin is  present.   The  lower  counter\r
+(D4-D0)  runs  when  the  coin is present and is reset when the coin is absent, unless the\r
+coin was present for 5 successive samples.  This "unless"  enables  $CNSTT  to  "remember"\r
+that a coin has been VALID-HIGH while waiting for VALID-LOW.\r
+Basically, a valid coin is defined as between 16 and 800 ms of coin present, preceded  and\r
+followed  by  33 ms of coin absent.  The 33 ms lows need not immediately precede or follow\r
+the high.  The lower five bits count  down  from  31  when  the  coin  is  present.   This\r
+countdown  is  fast  (once  per  interupt)  for the first five samples (31-26, about 16-20\r
+milliseconds) then slow (once per EIGHT interrupts) for the remaining counts (26-0,  about\r
+800  ms).   The  count  then  stops  at zero.  This counter is reset if the coin goes away\r
+during the first five counts, I.E., the coin must be present for at least  16  ms.   After\r
+that  the coin must go away for eight counts to reset it.  This is because after the first\r
+five counts a coin is VALID HIGH and must not be reset until VALID LOW occurs  to  prevent\r
+mid-coin glitches from making a valid coin into 0 or 2 (or more) coins.\r
+\r
+The upper three bits count up from zero when the coin is absent.  The count  is  reset  if\r
+coin  is  ever  found  present.   When  the  count  finally wraps (8 samples, 33 ms).  The\r
+coin-present counter is checked.  A count from 27-31 (less than 16-20 ms) is too short.  A\r
+count of 0 (more than 800 ms) is too long.  Both of these cases are simply reset to 31.  A\r
+count of 1-26 is a (tentatively) valid coin.  The counter is again set to 31, but  another\r
+counter ($PSTSL) is started.\r
+\r
+$PSTSL is the POST-COIN-SLAM timer.  Initially  set  to  120,  it  counts  down  once  per\r
+interrupt  (4  times per frame) to give a nominal 1/2 second delay.  If the slam switch is\r
+seen during this time, $PSTSL is cleared, invalidating the coin.  The length of the  delay\r
+(in  frames)  is  defined by POST which defaults to 30.  It may be set as high as 63 (1.05\r
+seconds) by definition E.G.\r
+\r
+        POST=50         ;POST-SLAM=50 FRAMES\r
+\r
+SIMILARY A SLAM IS "REMEMBERED" FOR PRST frames (default=30, max=31) and no  coin  can  be\r
+"seen" during this time.\r
+\r
+Note that the proper initial  state  of  all  these  counters  etc  is  0,  therefore  the\r
+traditional power-on clear does the trick.  Since coins "transit" from $CNSTT to $PSTSL to\r
+$CNCT to $$CRDT, locations should be cleared in that order, I.E.   $$CRDT  should  be  the\r
+last location cleared. ($$CRDT, of course, exists only if MODES=4)\r
+        .ENDR\r
+\f        .SBTTL DETECT COIN\r
+;INSTRUCTIONS IN BRACKETS( "[" AND "]" ) ARE FOR ILLUSTRATION ONLY, AND ARE NOT\r
+;ACTUALLY ASSEMBLED.\r
+MOOLAH:\r
+       .IIF    NE,QUICK,       LDY     #0      ;Clear "Coin Activity" flag\r
+       .IF EQ,MECHS-1\r
+       LDA A,$COINA\r
+       .IF EQ,COIN01           ;IF NOT IN D0\r
+       ASL                     ;SHIFT SWITCH (D7) INTO CARRY\r
+       .IFF\r
+       LSR                     ;SHIFT SWITCH (D0) INTO CARRY\r
+       .ENDC                   ;EQ, COIN01\r
+       LDA Z,$CNSTT\r
+       .IFF                    ;IF MECHS=2 OR 3\r
+        LDX I,OFFSET*<MECHS-1> ;X IS USED TO INDEX FROM RIGHT TO LEFT COIN MECH\r
+        .IF EQ,COIN67!COIN01\r
+$DETCT: LDA AX,$COINA\r
+        ASL\r
+        .IFF\r
+$DETCT:        LDA A,$COINA            ;GET COIN SWITCHES\r
+       CPX I,OFFSET            ;WHICH MECH ARE WE DOING\r
+       BEQ 11$                 ;MIDDLE (X=OFFSET) SHIFT TWICE\r
+       BCS 12$                 ;RIGHT (X=2*OFFSET) SHIFT ONCE\r
+       .IF NE,COIN01\r
+       LSR                     ;ELSE LEFT, SHIFT THRICE\r
+11$:   LSR\r
+12$:   LSR\r
+       .IFF\r
+       ASL                     ;ELSE LEFT, SHIFT THRICE\r
+11$:   ASL\r
+12$:   ASL\r
+        .ENDC                  ;NE,COIN01\r
+       .ENDC                   ;EQ,COIN67!COIN01\r
+        LDA ZX,$CNSTT\r
+       .IFTF                   ;ANY # OF MECHS\r
+        AND I,31.               ;SHARED INST. SEE BELOW IN BRACKETS []\r
+        .IF EQ,COIN\r
+        BCS 5$                  ;BRANCH IF INPUT HIGH (COIN ABSENT)\r
+        .IFF\r
+        BCC 5$                  ;BRANCH IF INPUT LOW (COIN ABSENT)\r
+        .ENDC                  ;EQ,COIN\r
+;       [AND I,31.]             ISOLATE COIN-ON DOWN-COUNTER, RESET COIN-OFF UP-CTR.\r
+        BEQ 1$                  ;STICK AT 0 (TERMINAL COUNT)\r
+        CMP I,27.               ;IN FIRST FIVE SAMPLES?\r
+        BCS 10$                 ;YES, RUN FAST\r
+       .IF     NE,QUICK\r
+        PHA                    ;ELSE SAVE STATUS\r
+       .IFF                    ;NE,QUICK\r
+        TAY                     ;ELSE SAVE STATUS\r
+       .IFTF                   ;QUICK OR NOT\r
+        LDA Z,$INTCT            ;CHECK INTERUPT CTR\r
+        AND I,7                 ;ARE D0-D2 ALL ONES?\r
+        CMP I,7                        ;SET CARRY IF SO\r
+       .IFT                    ;NE,QUICK\r
+       PLA                     ;STATUS BACK INTO ACC\r
+       .IFF                    ;NE,QUICK\r
+        TYA                     ;STATUS BACK INTO ACC\r
+       .ENDC                   ;NE,QUICK\r
+        BCC 1$                  ;SKIP IF NOT ALL ONES\r
+10$:    SBC I,1                 ;CARRY SET\r
+       .IFT                    ;EQ, MECHS-1\r
+1$:    STA Z,$CNSTT\r
+       .IFF                    ;IF MECHS>1\r
+1$:     STA ZX,$CNSTT           ;SAVE UPDATED STATUS\r
+       .IFTF                   ;ANY # OF MECHS\r
+        LDA A,$LAM              ;CHECK SLAM SWITCH\r
+        AND I,$LMBIT\r
+        .IF NE,SLAM\r
+        BEQ 2$                  ;BRANCH IF BIT LO (SWITCH OFF)\r
+        .IFF\r
+        BNE 2$                  ;BRANCH IF BIT HI (SWITCH OFF)\r
+        .ENDC                  ;NE,SLAM\r
+        LDA I,PRST*8            ;ELSE SET PRE-COIN SLAM TIMER\r
+        STA Z,$LMTIM            ;DECR. 8 TIMES/FRAME=PRST FRAMES\r
+2$:     LDA Z,$LMTIM            ;CHECK PRE-COIN SLAM TIMER\r
+        BEQ 3$                  ;O.K.\r
+        DEC Z,$LMTIM            ;ELSE RUN TIMER\r
+        LDA I,0\r
+       .IFT                    ;MECHS=1\r
+       STA Z,$CNSTT            ;CLEAR COIN STATUS\r
+       STA Z,$PSTSL            ;CLEAR POST-COIN SLAM TIMER\r
+3$:    CLC                     ;DEFAULT "NO COIN DETECTED"\r
+       LDA Z,$PSTSL            ;CHECK POST-COIN SLAM TIMER\r
+       BEQ 8$                  ;EMPTY, PROCEED\r
+       DEC Z,$PSTSL            ;ELSE RUN TIMER\r
+       .IFF                    ;IF MECHS>1\r
+        STA ZX,$CNSTT           ;CLEAR COIN STATUS\r
+        STA ZX,$PSTSL           ;CLEAR POST-COIN SLAM-TIMER\r
+3$:     CLC                     ;DEFAULT "NO COIN DETECTED"\r
+        LDA ZX,$PSTSL           ;CHECK POST-COIN SLAM-TIMER\r
+        BEQ 8$                  ;EMPTY, PROCEED\r
+        DEC ZX,$PSTSL           ;RUN TIMER\r
+       .IFTF                   ;ANY # OF MECHS\r
+        BNE 8$                  ;NOT DONE, PROCEED\r
+        SEC                     ;WHEN IT BECOMES ZERO, INDICATE A COIN\r
+        BCS 8$                  ;(ALWAYS)\r
+       \r
+5$:;    [AND I,31.]             GET COIN-ON DOWN-CTR (ACTUALLY DONE BEFORE)\r
+        CMP I,27.               ;IS COIN VALID YET (ON FOR >4 SAMPLES)\r
+        BCS 6$                  ;NO, RESET IT\r
+       .IFT                    ;MECHS=1\r
+       LDA Z,$CNSTT            ;GET STATUS AGAIN\r
+       .IFF                    ;MECHS>1\r
+        LDA ZX,$CNSTT           ;GET STATUS AGAIN\r
+       .IFTF                   ;ANY # OF MECHS\r
+        ADC I,32.               ;BUMP COIN-OFF UP-CTR.\r
+        BCC 1$                  ;IF IT DIDN'T WRAP, JUST STORE STATUS\r
+        BEQ 6$                  ;IT WRAPPED BUT COIN WAS ON TOO LONG, JUST RESET\r
+        CLC                     ;SET "VALIDITY" AGAIN\r
+6$:     LDA I,31.               ;RESET DOWN-COUNTER\r
+        BCS 1$                  ;BRANCH IF COIN TOO LONG OR TOO SHORT\r
+       .IFT\r
+       STA Z,$CNSTT            ;SAVE RESET STATUS\r
+       LDA Z,$PSTSL            ;CHECK HOWIE'S ASSUMPTION\r
+       .IFF\r
+        STA ZX,$CNSTT           ;SAVE RESET STATUS\r
+;       [CLC]                   DEFAULT TO "NO COIN" (CARRY IS ALREADY CLEAR)\r
+        LDA ZX,$PSTSL           ;CHECK HOWIES ASSUMPTION\r
+       .IFTF                   ;ANY # MECHS\r
+        BEQ 7$                  ;BRANCH IF $PSTSL VACANT\r
+        SEC                     ;ELSE GIVE CREDIT A LITTLE EARLY\r
+7$:     LDA I,POST*4            ;/(4 COUNTS/FRAME)="POST" FRAMES\r
+       .IFT                    ;MECHS=1\r
+       STA Z,$PSTSL\r
+       .IFF                    ;MECHS>1\r
+        STA ZX,$PSTSL           ;DELAY ACCEPTANCE FOR POST/60 SEC.\r
+       .ENDC                   ;EQ,MECHS-1\r
+        \r
+8$:                             ;CARRY=1 IF COIN FALLS OUT\r
+        BCC 9$\r
+       .IIF    NE,QUICK,       INY             ;FLAG CHANGE IN COINS\r
+       .IF NE,MULTS\r
+;FALL THROUGH TO "MECH-MULTIPLIERS"\r
+       .PAGE\r
+       .SBTTL MECH-MULTIPLIERS\r
+       .IF EQ,MECHS-2  \r
+       TXA                     ;WHICH MECH\r
+       BEQ 85$                 ;LEFT,ADD1\r
+       .ENDC                   ;EQ,MECHS-2\r
+       .IF EQ,MECHS-3\r
+       LDA I,0                 ;START WITH 0 (TO ADD 1)\r
+       CPX I,OFFSET            ;CHECK WHICH MECH\r
+       BCC 85$                 ;IF LEFT, ALWAYS ADD 1\r
+       BEQ 83$                 ;IF CENTER, CHECK HALF-MUL\r
+       .ENDC                   ;EQ,MECHS-3\r
+       GDM                     ;GET DOLLAR MUL\r
+       BEQ 85$                 ;00-ADD 1\r
+       ADC I,2                 ;ELSE MAP 1,2,3 TO 3,4,5\r
+       .IF EQ,MECHS-3\r
+       BNE 85$                 ;(ALWAYS)\r
+       \r
+83$:   GHM\r
+       BEQ 85$\r
+       LDA I,1\r
+       .ENDC                   ;EQ,MECHS-3\r
+85$:   SEC\r
+       .IF EQ,MECHS-1\r
+       .IF NE,BONADD\r
+       PHA\r
+       ADC Z,$BCCNT                    ;UPDATE BONUS-ADDER COUNTER\r
+       STA Z,$BCCNT\r
+       PLA\r
+       SEC\r
+       .ENDC                           ;NE.BONADD\r
+       ADC Z,$CNCT\r
+       STA Z,$CNCT             ;UPDATE CNCT\r
+       .IFF                    ;IF MORE THAN ONE MECH\r
+       .IF NE,SEPCCT\r
+       .PRINT                  ;I'M NOT SURE YOU WANT TO DO THIS, ARE YOU?\r
+       .IF NE,BONADD\r
+       .PRINT  ;ERROR:ERROR:!!!!\r
+       .PRINT  ;ERROR:YOU CANNOT HAVE\r
+       .PRINT  ;SEPARATE COIN-COUNTS(SEPCCT=1)\r
+       .PRINT  ;AND BONUS-ADDER(BONADD=1)AT\r
+       .PRINT  ;THE SAME TIME. SORRY.\r
+       .PRINT  ;********************\r
+       INC AY,$BCCNT                   ;ASSEMBLED IN TO CAUSE AN ERROR.\r
+       .ENDC\r
+       ADC X,$CNCT\r
+       STA X,$CNCT             ;UPDATE COIN COUNT FOR PROGRAM\r
+       .IFF                    ;NE,SEPCCT\r
+       .IF EQ,<MULTS-1>!<CCTRS-1>      ;IF MULTS REQUIRED, BUT ONLY ONE COUNTER\r
+\r
+;THE NORMAN AVELLAR MEMORIAL KLUGE\r
+\r
+;\r
+;###NOTE:  THIS CODE PROVIDED ONLY FOR OLD AMERICAN GAMES. USE WITH 5 DM\r
+;MECHS IS STRONGLY DISCOURAGED\r
+       TAY                     ;SAVE INCREMENT\r
+       .IFTF                   ;EQ,<MULTS-1>!<CCTRS-1>\r
+       .IF NE,BONADD\r
+       PHA\r
+       ADC Z,$BCCNT                    ;UPDATE BONUS-ADDER COUNTER\r
+       STA Z,$BCCNT\r
+       PLA\r
+       SEC\r
+       .ENDC                           ;NE, BONADD\r
+       ADC $CNCT\r
+       STA $CNCT\r
+       .IFT                    ;EQ,<MULTS-1>!<CCTRS-1>\r
+       INY\r
+       TYA\r
+       .IF EQ,MECHS-3\r
+       CMP I,3                 ;IS IT DOLLAR MULT\r
+       BCC 87$                 ;NO, SKIP       \r
+       LDA I,3                 ;ELSE FORCE 4 (3+CARRY)\r
+       .IFF                    ;EQ,MECHS-3\r
+       AND I,4\r
+       BNE 87$\r
+       SEC\r
+       .ENDC                   ;EQ,MECHS-3\r
+87$:   ADC $CCTIM\r
+       STA $CCTIM\r
+       .ENDC                   ;EQ,<MULTS-1>!<CCTRS-1>\r
+       .ENDC                   ;SEPCCT\r
+       .ENDC                   ;EQ,MECHS-1\r
+       .IFF                    ;NE, MULTS\r
+;FALL THROUGH TO BUMP $CNCT\r
+       .IF EQ,MECHS-1\r
+       INC Z,$CNCT             ;BUMP COIN COUNT\r
+       .IF NE,BONADD\r
+       INC Z,$BCCNT            ;UPDATE BONUS-ADDER COUNTER\r
+       .ENDC                   ;NE, BONADD\r
+       .IFF                    ;IF MECHS=2 OR 3\r
+       .IF NE,SEPCCT           ;IF ASKED FOR SEPARATE COUNT,\r
+       INC X,$CNCT             ;USE INDEXED INC\r
+       .IF NE,BONADD\r
+       .PRINT  ;ERROR:ERROR:!!!!\r
+       .PRINT  ;ERROR:YOU CANOT HAVE\r
+       .PRINT  ;SEPARATE COIN-COUNTS(SEPCCT=1)\r
+       .PRINT  ;AND BONUS-ADDER(BONADD=1)AT\r
+       .PRINT  ;THE SAME TIME.SORRY.\r
+       .PRINT  ;********************\r
+       INC AY,$BCCNT                   ;ASSEMBLED IN TO CAUSE AN ERROR.\r
+       .ENDC\r
+       .IFF                    ;ELSE USE COMMON COUNTER\r
+        INC $CNCT\r
+       .IF NE,BONADD\r
+       INC Z,$BCCNT            ;UPDATE BONUS-ADDER COUNTER\r
+       .ENDC                   ;NE,BONADD\r
+       .ENDC                   ;NE,SEPCCT\r
+       .ENDC                   ;EQ, MECHS-1\r
+       .ENDC                   ;NE,MULTS\r
+       .IF EQ,CCTRS-1          ;IF 1 COIN COUNTER USED\r
+       .IF EQ,MULTS*<MECHS-1>  ;AND NO MULTS, OR JUST 1 MECH\r
+       INC $CCTIM              ;INIT COIN PULSE TO E.M. COUNTER\r
+       .ENDC                   ;EQ,MULTS*<MECHS-1>\r
+       .ENDC                   ;EQ,CCTRS-1\r
+       .IF NE,MECHS-1          ;IF 2 OR 3 MECHS\r
+       .IF GE,CCTRS-3          ;IF 3 OR 4 COUNTERS USED\r
+       INC X,$CCTIM            ;"QUEUE" PULSE FOR E.M. COUNTER\r
+       .ENDC                   ;EQ,CCTRS-3\r
+       .IFTF                   ;ANY # OF MECHS\r
+9$:\r
+       .IFT                    ;ONLY FOR MORE THAN ONE MECH\r
+        .REPT OFFSET\r
+        DEX\r
+        .ENDR\r
+       .IF GT,.-$DETCT-126.\r
+       BMI 120$\r
+       JMP $DETCT\r
+120$:\r
+       .IFF\r
+        BPL $DETCT\r
+       .ENDC                   ;GT,.-DETECT-126.\r
+       .ENDC                   ;NE,MECHS-1\r
+       .IF     NE,QUICK\r
+       TYA\r
+       BEQ     $EXT            ;SKIP ON OUT IF NO NEW COINS\r
+       .ENDC                   ;NE,QUICK\r
+       .IF NE,BONADD\r
+       ;FALL THRU TO BONUS-ADDER\r
+       .PAGE\r
+       .SBTTL BONUS-ADDER\r
+$BONUS:        GBAM                    ;GET BONUS ADDER MODE\r
+       TAY\r
+       LDA Z,$BCCNT\r
+       SEC\r
+       SBC AY,$MODLO           ;SEE IF ENOUGH UNIT-COINS HAVE ACCUMULATED\r
+       BMI $EXTB               ;BRANCH IF NOT\r
+       STA Z,$BCCNT            ;ELSE UPDATE BONUS-ADDER AND...\r
+       INC Z,$BC               ;GIVE ONE OR TWO BONUS UNIT-COINS\r
+       CPY I,3\r
+       BNE $EXTB\r
+       INC Z,$BC               ;MODE 3 YIELDS 2 BONUS COINS FOR 4 INSERTED\r
+       BNE $EXTB               ;BRA\r
+$MODLO:                                ;THIS IS THE NUMBER OF UNIT-COINS REQUIRED TO RECEIVE BONUS\r
+       .BYTE 7F,2,4,4,5,3,7F,7F        ;7F IS USED TO GENERATE ZERO BONUS COINS\r
+$EXTB:\r
+       .ENDC\r
+        .IF EQ,MODES-4          ;ONLY IF MODES=4\r
+;FALL THROUGH TO CONVERT COINS TO CREDITS\r
+       .PAGE\r
+       .SBTTL COINS TO CREDITS\r
+$CNVRT:        GCM             ;GET COIN MODE IN 0,1\r
+       TAY                     ;SAVE IT\r
+       BEQ 2$                  ;IF FREE PLAY CMODE=0, DO NOTHING\r
+       LSR                     ;ELSE FORM PRICE (0,1,1,2)\r
+       ADC I,0\r
+       EOR I,0FF\r
+       SEC\r
+       ADC $CNCT               ;ACC <- COINCT-PRICE\r
+       .IIF EQ,BONADD,BCC $EXT\r
+       .IF NE,BONADD\r
+       BCS 33$                 ;BRANCH IF NO BORROW\r
+       ;[CLC]\r
+       ADC Z,$BC                       ;ADD IN BONUS COINS-SEE IF THEY HELP\r
+       BMI $EXT                ;BRANCH IF COINCT+BONUS COINS <PRICE\r
+       STA Z,$BC                       ;ELSE ACC=UNUSED BONUS COINS\r
+       LDA I,0                 ;ACC=NEW $CNCT\r
+       .ENDC\r
+33$:                           ;GENERATE CREDITS: 1 OR 2\r
+       CPY I,2                 ;Y=COIN MODE-COIN MODE 2 OR 3?\r
+       BCS 1$                  ;BRANCH IF MODE 2 OR 3-GIVE 1 CREDIT\r
+       INC $$CRDT              ;ELSE GIVE 2 FOR MODE 1\r
+1$:    INC $$CRDT\r
+2$:    STA $CNCT               ;UPDAT COINCT\r
+       .IIF NE,QUICK,  BNE $CNVRT\r
+               ;  to make coin mech multipliers work\r
+       .ENDC\r
+$EXT:\r
+       .IIF NE,CNTINT, INC Z,$INTCT    ;COUNT INTERUPTS WHEN REQUESTED\r
+       .IF NE,EMCTRS           ;INCLUDE PULSER FOR E.M. CTRS\r
+;FALL THROUGH TO HANDLE E.M. COUNTERS\r
+       .SBTTL ELECTRO-MECH. CTRS\r
+       LDA Z,$INTCT            ;GET $INTCT \r
+       LSR                     ;USE LSB FOR PULSE=4 FRAMES\r
+       BCS 99$\r
+       .ENDC                   ;NE,EMCTRS\r
+       .IF EQ,EMCTRS-1\r
+       LDA Z,$CCTIM            ;GET COIN-COUNTER TIMER\r
+       BEQ 99$                 ;BRANCH IF IDLE\r
+       CMP I,10                ;MSB'S CLEAR?\r
+       BCS 1$                  ;NO,SKIP\r
+       ADC I,-1                ;ELSE INIT PULSE, SET CARRY\r
+1$:    ADC I,0EF               ;(ONE LESS CUZ CARRY SET) DEC MSB'S OF TIMER\r
+       STA Z,$CCTIM            ;STORE UPDATED TIMER\r
+       .ENDC                   ;EQ,EMCTRS-1\r
+       .IF GE,EMCTRS-3         ;IF 3 OR 4 CTRS -----------------,\r
+       .IF     NE,QUICK        ; ----------------------,\r
+       LDA     $CCTIM\r
+...CCX =       OFFSET\r
+       .REPT   EMCTRS-1\r
+       ORA     $CCTIM+...CCX\r
+...CCX =       ...CCX+OFFSET\r
+       .ENDR\r
+       BEQ     99$             ;NONE RUNNING OR PENDING, SKIP IT\r
+       CMP     #10             ;ANY RUNNING?\r
+       BCC     35$             ;NO, START A PENDING ONE\r
+       .IFF                    ;NE,QUICK --------------+\r
+       LDY I,0                 ;START WITH FLAG OF 0\r
+       .IFTF                   ;NE,QUICK --------------+\r
+       LDX I,OFFSET*<EMCTRS-1>\r
+1$:    LDA X,$CCTIM            ;CHECK TIMER(X)\r
+       BEQ 3$                  ;NEITHER RUNNING NOR PENDING\r
+       CMP I,10                ;IS IT RUNNING\r
+       BCC 3$                  ;NO, SKIP\r
+       ADC I,0EF               ;ELSE DEC 4 MSB\r
+       .IFF                    ;NE,QUICK --------------+\r
+       INY                     ;SET ON FLAG\r
+       .IFTF                   ;NE,QUICK --------------+\r
+2$:    STA X,$CCTIM\r
+3$:\r
+       .REPT OFFSET\r
+       DEX\r
+       .ENDR\r
+       BPL 1$\r
+       .IFT                    ;NE,QUICK --------------+\r
+       BMI     99$\r
+35$:\r
+       .IFF                    ;NE,QUICK --------------+\r
+       TYA                     ;CHECK "ON" FLAG\r
+       BNE 99$                 ;SKIP IF ANY ON\r
+       .ENDC                   ;NE,QUICK --------------'\r
+;IF NONE OF THE COUNTERS ARE CURRENTLY ON, WE CHECK TO SEE IF ANY CAN BE\r
+;STARTED.\r
+       LDX I,OFFSET*<EMCTRS-1> \r
+4$:    LDA X,$CCTIM            ;NEED WE START THIS ONE\r
+       BEQ 5$                  ;NO, NO COUNTS PENDING\r
+       CLC\r
+       ADC I,0EF               ;SET 4 MSB, DEC 4 LSB\r
+       STA X,$CCTIM            ;START TIMER\r
+       BMI 99$                 ;EXIT, SO WE DON'T START MORE\r
+5$:\r
+       .REPT OFFSET\r
+       DEX\r
+       .ENDR\r
+       BPL 4$\r
+       .ENDC                   ;GE, EMCTRS-3 -------------------'\r
+99$:\r
+       .IF NE,RTS              ;IF THIS IS A SUBROUTINE ---,\r
+       RTS\r
+       .ENDC                   ;NE,RTS --------------------'\r
+       .RADIX .RAD             ;RESTORE RADIX\r
+\r
+       .IIF EQ,INCLUDE,        .END    ;NO .END TO ".INCLUDE"'D FILES\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/CCT.MAC b/CCT.MAC
new file mode 100644 (file)
index 0000000..e1f307f
--- /dev/null
+++ b/CCT.MAC
@@ -0,0 +1,827 @@
+       ; filename cct.mac\r
+\r
+;----------------------------\r
+;  routine to initialize city\r
+CT.INI:\r
+       CT.XSZ=4\r
+       CT.YSZ=8\r
+       CT.XDM=13\r
+       CT.YDM=13\r
+\r
+       JSR CT.TRA      ; tfer playfield from ROM to RAM\r
+\r
+;  compute regions\r
+\r
+       JSR CR.INI\r
+10$:\r
+       JSR CT.RGR\r
+       DEC CT.CNT\r
+       IFPL\r
+        JSR CR.ADV\r
+        JMP 10$\r
+       ENDIF\r
+\r
+;  put in tunnel for warp\r
+;  also put in high score initials\r
+       LDA WV.XCO\r
+       ORA WV.YCO\r
+       IFEQ\r
+\r
+       TRAI 4 TEMP4\r
+       BEGIN\r
+        JSR CT.HIN     ;  put in initial\r
+       DEC TEMP4\r
+       MIEND\r
+\r
+       LDA WV.WAR\r
+       IFNE\r
+\r
+        LDA ATRACT\r
+        IFNE\r
+         TR16AI 16+6*16+0A+CTRAM CT.A2L\r
+         LDY #0\r
+         LDA @CT.A2L(Y)\r
+         ORA #20\r
+         STA @CT.A2L(Y)\r
+        ENDIF\r
+        ENDIF\r
+       ENDIF\r
+       RTS\r
+\r
+;------------------------------\r
+;  routines for traversing city\r
+\r
+;  init for traverse of rows\r
+CR.INI:\r
+       TR16AI CTRAM+CT.YDM+4 CT.ADL\r
+       TRAI CT.HST CR.HST\r
+       TRAI CT.VST CR.VST\r
+       TRAI CT.XDM CT.CNT\r
+       RTS\r
+\r
+;  advance to the next row\r
+CR.ADV:\r
+       LDA CR.HST\r
+       SUB #CT.XSZ\r
+       STA CR.HST\r
+\r
+       LDA CR.VST\r
+       ADD #CT.XSZ\r
+       STA CR.VST\r
+       RTS\r
+\r
+;  init for row traverse\r
+BL.INI:\r
+       TRAM CR.HST BL.HST\r
+       TRAM CR.VST BL.VST\r
+       TRAI CT.YDM CR.CNT\r
+\r
+.INCLUDE CATOUT.MAC\r
+       RTS\r
+\r
+BL.IN2:\r
+       LDY #0\r
+       TRAM @CT.ADL(Y) BL.HEI\r
+\r
+       TR16AM CT.ADL,CT.A2L\r
+       AD16AI CT.A2L,16*16\r
+       RTS\r
+\r
+;  advance to next block\r
+BL.ADV:\r
+       LDA BL.HST\r
+       ADD #CT.YSZ\r
+       STA BL.HST\r
+       INC BL.VST\r
+       INC BL.VST\r
+       RTS\r
+\r
+;----------------------\r
+;  routine to draw city\r
+CT.DRW:\r
+;  traverse through rows\r
+       TR16AI CTRAM CT.ACL\r
+       TR16AI CTRAM+1 CT.ARL\r
+       TR16AI CTRAM+2 CT.AFL\r
+       TR16AI CTRAM+CT.YDM+3 CT.ALL\r
+\r
+       JSR CR.INI\r
+10$:\r
+       JSR CR.DRW\r
+       DEC CT.CNT\r
+       BMI 20$\r
+       JSR CR.ADV\r
+       JSR MN.HOU\r
+       JMP 10$\r
+\r
+20$:\r
+       RTS\r
+\r
+;--------------------------\r
+;  routine to draw city row\r
+CR.DRW:\r
+       JSR BL.INI\r
+10$:\r
+       JSR BL.IN2\r
+\r
+;   compute if necessary to draw face1,face2\r
+       TR16AM CT.ADL CT.ADB    ; square before ADL X dir\r
+       INC16 CT.ADB\r
+       TRAM @CT.ADB(Y) TEMP1\r
+       LDA BL.HEI\r
+       SUB TEMP1\r
+       IFMI\r
+        LDA BL.VST\r
+        SUB BL.HEI\r
+        STA BL.V1S\r
+        TRAI 0 BL.V1N\r
+       ELSE\r
+        STA BL.V1N\r
+        LDA BL.VST\r
+        SUB TEMP1\r
+        STA BL.V1S\r
+       ENDIF\r
+\r
+       TR16AM CT.ADL CT.ADB    ; square before ADL Y dir\r
+       AD16AI CT.ADB 16\r
+       TRAM @CT.ADB(Y) TEMP1\r
+       LDA BL.HEI\r
+       SUB TEMP1\r
+       IFMI\r
+        LDA BL.VST\r
+        SUB BL.HEI\r
+        STA BL.V2S\r
+        TRAI 0 BL.V2N\r
+       ELSE\r
+        STA BL.V2N\r
+        LDA BL.VST\r
+        SUB TEMP1\r
+        STA BL.V2S\r
+       ENDIF\r
+\r
+;  priority\r
+       LDY #0\r
+       LDA @CT.A2L(Y)\r
+       JSR CL.PR\r
+\r
+; accessibility\r
+       LDA @CT.A2L(Y)\r
+       AND #4\r
+       IFNE\r
+        LDA FC.BV3\r
+       ELSE\r
+        LDA FC.BVC\r
+       ENDIF\r
+       STA CT.BV3\r
+\r
+;  tunnel\r
+       LDA @CT.A2L(Y)\r
+       AND #20\r
+       STA CT.TUN\r
+\r
+       JSR BL.EDT\r
+\r
+       LDA BL.HEI\r
+       IFNE\r
+        JSR BL.DRW\r
+       ENDIF\r
+\r
+\r
+       INC16 CT.ADL\r
+\r
+       DEC CR.CNT\r
+       BMI 20$\r
+       JSR BL.ADV\r
+       JMP 10$\r
+20$:           ; increment ADL,ACL,ARL,AFL,ALL twice\r
+       \r
+       INC16 CT.ADL\r
+       INC16 CT.ADL\r
+       INC16 CT.ACL\r
+       INC16 CT.ACL\r
+       INC16 CT.ARL\r
+       INC16 CT.ARL\r
+       INC16 CT.AFL\r
+       INC16 CT.AFL\r
+       INC16 CT.ALL\r
+       INC16 CT.ALL\r
+\r
+       RTS\r
+\r
+;------------------------------------\r
+;  routine to determine edge switches\r
+BL.EDT:        LDY #0\r
+       JSR BL.URC\r
+       JSR BL.ULC\r
+       BIT BL.URE\r
+       BMI 10$\r
+       BIT BL.ULE\r
+       BMI 10$\r
+       JSR BL.UCC\r
+       JMP 20$\r
+10$:   TRAI 0FF BL.UCR\r
+20$:\r
+       JSR BL.HRC\r
+       JSR BL.HLC\r
+       INC16 CT.ACL\r
+       INC16 CT.ARL\r
+       INC16 CT.AFL\r
+       INC16 CT.ALL\r
+       RTS\r
+\r
+;------------------\r
+;  calculate BL.ULE\r
+;  upper left edge\r
+BL.ULC:        CMPIN CT.ALL,CT.ADL\r
+       IFNE\r
+        LDA #0FF\r
+       ELSE            ; if heights equal, dont draw edge\r
+        LDA #0\r
+       ENDIF\r
+       STA BL.ULE\r
+       RTS\r
+\r
+;-----------------\r
+; calculate BL.URE\r
+;  upper right edge\r
+BL.URC:        CMPIN CT.ARL,CT.ADL\r
+       IFNE\r
+        LDA #0FF\r
+       ELSE\r
+        LDA #0\r
+       ENDIF\r
+       STA BL.URE\r
+       RTS\r
+\r
+;-----------------\r
+; calculate BL.UCR\r
+; upper corner pixel\r
+BL.UCC:        CMPIN CT.ACL,CT.ADL\r
+       IFNE\r
+        LDA #0FF\r
+       ELSE\r
+        LDA #0\r
+       ENDIF\r
+       STA BL.UCR\r
+       RTS\r
+\r
+;-----------------------------\r
+;  calculate right hidden line\r
+;  HES HEL start and length of hidden edge\r
+BL.HRC:        LDA #0FF\r
+       STA BL.HRE\r
+       CMPIN CT.ADL,CT.ARL\r
+       BCC 10$\r
+       CMPIN CT.AFL,CT.ARL\r
+       BCC 30$\r
+; cases 4 and 6,  no erase\r
+5$:    LDA #0\r
+       STA BL.HRE\r
+       JMP 60$ \r
+\r
+10$:   CMPIN CT.ADL,CT.AFL\r
+       BCS 30$\r
+       JMP 5$\r
+                       ; cases 1 and 2 used to be here\r
+25$:   STA BL.HEL\r
+       BMI 5$\r
+       DEC BL.HEL\r
+       BMI 5$\r
+       DEC BL.HEL\r
+       BMI 5$\r
+       JMP 60$\r
+30$:   TRAM @CT.AFL(Y) BL.HES  ; cases 3 and 5\r
+       INC BL.HES\r
+       TRAM FC.BV1 FC.COH\r
+       CMPIN CT.ARL,CT.ADL\r
+       BCC 35$\r
+       LDA NY,CT.ADL\r
+35$:\r
+       SUB @CT.AFL(Y)\r
+       JMP 25$\r
+60$:\r
+\r
+       RTS\r
+;---------------------------\r
+; calculate left hidden line\r
+BL.HLC:        LDA #0FF\r
+       STA BL.HLE\r
+       CMPIN CT.ADL,CT.ALL\r
+       BCC 10$         ; erase line to min of ALL,ADL\r
+       LDA NY,CT.ALL\r
+10$:   STA BL.HLL\r
+       BEQ 40$\r
+       DEC BL.HLL\r
+       BEQ 40$\r
+       DEC BL.HLL\r
+       BEQ 40$\r
+       JMP 50$\r
+\r
+40$:   LDA #0\r
+       STA BL.HLE\r
+50$:\r
+       RTS\r
+\r
+;---------------\r
+;   draw a block\r
+BL.DRW: TRAM BL.HST FC.HST\r
+       TRAM BL.VST FC.VST\r
+\r
+       TRAM BL.V1S FC.V1S\r
+       TRAM BL.V1N FC.V1N\r
+       JSR FACE1\r
+\r
+       TRAM BL.V2S FC.V2S\r
+       TRAM BL.V2N FC.V2N\r
+       JSR FACE2\r
+\r
+       LDA FC.VST\r
+       SUB BL.HEI\r
+       STA FC.VST\r
+       JSR FACE3\r
+\r
+       LDA CT.TUN\r
+       IFNE\r
+        JSR FC.TUN\r
+       ENDIF\r
+       RTS\r
+\r
+;---------------------\r
+;  draw face of type 1\r
+FACE1:\r
+       TRAM FC.HST LN.HCR\r
+       TRAM FC.V1S LN.VCR\r
+       TRAM FC.BV1 LN.CO1\r
+       TRAM FC.V1N CURLIN\r
+\r
+10$:   JSR LN.F1\r
+       DEC CURLIN\r
+       BMI 20$\r
+       DEC LN.VCR\r
+       JMP 10$\r
+20$:   JSR BORDR1\r
+\r
+       RTS\r
+\r
+;-------------------\r
+;  border for face 1\r
+BORDR1:        TRAM FC.BVB LN.CO1      ; upper edge\r
+       STA LN.CO3\r
+       JSR LN.F1\r
+\r
+       TRAM FC.VST LN.VCR      ; lower edge\r
+       JSR LN.F1\r
+\r
+       TRAM FC.V1N LN.LG3\r
+       LDA FC.HST              ; right edge\r
+       ADD #CT.XSZ\r
+       STA LN.HCR\r
+\r
+       LDA FC.V1S\r
+       SUB #CT.XSZ\r
+       STA LN.VCR\r
+       JSR LN.3\r
+\r
+;  hidden edge\r
+       BIT BL.HRE\r
+       IFMI\r
+        LDA FC.V1N\r
+        IFNE\r
+         TRAM BL.HEL LN.LG3\r
+         TRAM FC.COH LN.CO3\r
+\r
+         LDA FC.VST\r
+         SUB #CT.XSZ\r
+         SUB BL.HES\r
+         STA LN.VCR\r
+\r
+         JSR LN.3      \r
+        ENDIF\r
+       ENDIF\r
+       RTS\r
+\r
+;----------------\r
+;  face of type 2\r
+FACE2:\r
+       TRAM FC.HST LN.HCR\r
+       TRAM FC.V2S LN.VCR\r
+       TRAM FC.BV2 LN.CO2\r
+       TRAM FC.V2N CURLIN\r
+10$:   JSR LN.F2\r
+       DEC CURLIN\r
+       BMI 20$\r
+       DEC LN.VCR\r
+       JMP 10$\r
+20$:   JSR BORDR2\r
+\r
+       RTS\r
+\r
+;------------------\r
+; border for face 2\r
+BORDR2:        TRAM FC.BVB LN.CO2      ; upper line\r
+       STA LN.CO3\r
+       JSR LN.F2\r
+\r
+       TRAM FC.V2S LN.VCR      ; lower line\r
+       JSR LN.F2\r
+\r
+       TRAM FC.V2S LN.VCR\r
+       TRAM FC.V2N LN.LG3      ; right vertical line\r
+       JSR LN.3\r
+\r
+       LDA FC.HST      ; left vertical line\r
+       SUB #CT.YSZ\r
+       STA LN.HCR\r
+       LDA LN.VCR\r
+       SUB #CT.YSZ/4\r
+       STA LN.VCR\r
+       JSR LN.3\r
+\r
+;  hidden edge\r
+       BIT BL.HLE\r
+       IFMI\r
+        LDA FC.V2N\r
+        IFNE\r
+         LDA FC.VST\r
+         SUB #CT.YSZ/4\r
+         STA LN.VCR\r
+         DEC LN.VCR\r
+         TRAM FC.BV2 LN.CO3\r
+         TRAM BL.HLL LN.LG3\r
+         JSR LN.3\r
+        ENDIF\r
+       ENDIF\r
+       RTS\r
+\r
+;----------------\r
+;  face of type 3\r
+FACE3: TRAI CT.XSZ LN.LG1\r
+       TRAI CT.YSZ CURLIN\r
+       TRAM FC.HST LN.HCR\r
+       TRAM FC.VST LN.VCR\r
+       TRAM CT.BV3 LN.CO1\r
+\r
+10$:   JSR LN.F1\r
+       DEC CURLIN\r
+       BMI 20$\r
+       DEC LN.HCR\r
+\r
+       JSR LN.F1\r
+       DEC CURLIN\r
+       BMI 20$\r
+       DEC LN.HCR\r
+\r
+       JSR LN.F1\r
+       DEC CURLIN\r
+       BMI 20$\r
+\r
+       DEC LN.VCR\r
+       DEC LN.LG1\r
+       JSR LN.1\r
+       INC LN.LG1\r
+       DEC LN.HCR\r
+\r
+       JSR LN.F1\r
+       DEC CURLIN\r
+       BMI 20$\r
+       DEC LN.HCR\r
+\r
+       JMP 10$\r
+20$:   JSR BORDR3\r
+       RTS\r
+\r
+;-----------------------\r
+; draw border for face 3\r
+BORDR3: TRAM FC.BVB LN.CO1     ; upper left edge\r
+       STA LN.CO2\r
+       BIT BL.ULE\r
+       IFMI\r
+        JSR LN.F1\r
+       ELSE\r
+                       ; delete extraneous line\r
+        TRAM CT.BV3 LN.CO1\r
+        DEC LN.LG1\r
+        JSR LN.1\r
+        INC LN.LG1\r
+        TRAM FC.BVB LN.CO1\r
+       ENDIF\r
+       TRAM FC.HST LN.HCR      ; lower right edge\r
+       TRAM FC.VST LN.VCR\r
+       JSR LN.F1\r
+\r
+                               ; lower left edge\r
+       JSR LN.F2\r
+\r
+       LDA FC.HST      ; upper right edge\r
+       ADD #CT.XSZ\r
+       STA LN.HCR\r
+       LDA FC.VST\r
+       SUB #CT.XSZ\r
+       STA LN.VCR\r
+       BIT BL.URE\r
+       IFMI\r
+        JSR LN.F2\r
+       ENDIF\r
+;  upper corner pixel\r
+       BIT BL.UCR\r
+       IFMI\r
+        LDA LN.HCR\r
+        SUB #CT.YSZ\r
+        STA XB\r
+        DEC LN.VCR\r
+        DEC LN.VCR\r
+        TRAM LN.VCR YB\r
+        TRAM FC.BVB VB\r
+       ENDIF\r
+\r
+       RTS\r
+\r
+\r
+;------------------\r
+;  draw all gems\r
+CT.GD:\r
+       JSR CT.GIN\r
+10$:\r
+       JSR CT.GRD\r
+       DEC CT.CNT\r
+       IFPL\r
+        JSR CR.ADV\r
+        JSR MN.HOU\r
+        JMP 10$\r
+       ENDIF\r
+       RTS\r
+\r
+;-----------------------\r
+;  init for drawing gems\r
+CT.GIN:\r
+       TR16AI 0 CE.COC\r
+       JSR CR.INI\r
+       RTS\r
+\r
+;--------------------\r
+;  draw a row of gems\r
+CT.GDR:\r
+       LDA FRAME\r
+       AND #1\r
+       IFEQ\r
+       JSR CT.GRD\r
+       DEC CT.CNT\r
+       IFPL\r
+       JSR CR.ADV\r
+       RTS\r
+       ENDIF\r
+\r
+       JSR GM.WO0      ; done, so go to next game state\r
+\r
+       ENDIF\r
+       RTS\r
+\r
+;--------------\r
+;  draw gem row\r
+CT.GRD:\r
+       JSR BL.INI\r
+10$:\r
+       JSR BL.IN2\r
+\r
+       LDA @CT.A2L(Y)\r
+       AND #10\r
+       IFNE                    ;  gem present\r
+        INC16 CE.COC           ;  increment gem count\r
+        JSR CT.SGD             ;  draw it\r
+       ENDIF\r
+\r
+       INC16 CT.ADL\r
+       DEC CR.CNT\r
+       BMI 20$\r
+       JSR BL.ADV\r
+       JMP 10$\r
+20$:   \r
+       INC16 CT.ADL\r
+       INC16 CT.ADL\r
+\r
+       RTS\r
+\r
+;--------------------------\r
+;  draw single gem\r
+CT.SGD:\r
+        \r
+        LDA @CT.A2L(Y)         ;  set priority\r
+        JSR CL.PR\r
+\r
+        LDA BL.HST\r
+        SUB #02\r
+        STA XB\r
+        LDA BL.VST\r
+        SUB BL.HEI\r
+        SUB #02\r
+        STA YB\r
+        TRAM FC.BVC VB\r
+        DEC XB\r
+        STA VB\r
+        DEC YB\r
+        DEC XB\r
+        STA VB\r
+        DEC YB\r
+        INC XB\r
+        STA VB\r
+        INC XB\r
+        STA VB\r
+        INC XB\r
+        STA VB\r
+        INC YB\r
+        INC XB\r
+        STA VB\r
+        INC YB\r
+        DEC XB\r
+        STA VB\r
+\r
+        DEC YB\r
+        STA VB\r
+        DEC XB\r
+        STA VB\r
+        DEC XB\r
+        LDA FC.BVS     ;  white highlight\r
+        STA VB\r
+       RTS\r
+\r
+\r
+;--------------\r
+;  traverse row\r
+CT.RGR:\r
+       JSR BL.INI\r
+10$:\r
+       JSR BL.IN2\r
+\r
+       LDY #0\r
+       LDA @CT.A2L(Y)\r
+       AND #3\r
+       IFNE\r
+\r
+       CMP #1\r
+       IFEQ                            ; region 1\r
+        LDA CT.HR1\r
+       ELSE\r
+       CMP #2                          ; region 2\r
+       IFEQ\r
+        LDA CT.HR2\r
+       ELSE                            ; region 3\r
+        LDA CT.HR3\r
+       ENDIF\r
+       ENDIF\r
+\r
+       IFMI\r
+        LDA @CT.A2L(Y)\r
+        AND #^B11101111\r
+        STA @CT.A2L(Y) ;  no gems when height=0\r
+        LDA #0\r
+       ELSE\r
+        ADD @CT.ADL(Y)\r
+       ENDIF\r
+       STA @CT.ADL(Y)\r
+\r
+       ENDIF\r
+\r
+\r
+       INC16 CT.ADL\r
+       DEC CR.CNT\r
+       IFPL\r
+        JSR BL.ADV\r
+        JMP 10$\r
+       ENDIF\r
+       INC16 CT.ADL\r
+       INC16 CT.ADL\r
+       RTS\r
+\r
+;--------------\r
+;  draw tunnel\r
+FC.TUN:\r
+       TRAM BL.HST LN.HCR\r
+       TRAM BL.VST LN.VCR\r
+       TRAM #08F LN.CO1\r
+       TRAM #08F LN.CO2\r
+       TRAI 28 CURLIN\r
+10$:   JSR LN.F2\r
+       DEC CURLIN\r
+       BMI 20$\r
+       DEC LN.VCR\r
+       JMP 10$\r
+20$:   \r
+\r
+       TRAM BL.VST LN.VCR\r
+       TRAI 28 CURLIN\r
+\r
+30$:   JSR LN.F1\r
+       DEC CURLIN\r
+       BMI 40$\r
+       DEC LN.VCR\r
+       JMP 30$\r
+40$:\r
+\r
+       RTS\r
+\r
+\r
+;---------------------------------------------\r
+;  swap playfield data\r
+;  PL.1A length PL.AZ and PL.2A\r
+\r
+CT.SWP:\r
+       TR16AI PL.1A,CT.ROM\r
+       TR16AI PL.2A,CT.RAM\r
+\r
+       LDX #PL.AZ&0FF00/100\r
+       LDY #00\r
+10$:\r
+       JSR 60$\r
+\r
+       DEY\r
+       BNE 10$\r
+\r
+20$:\r
+       INC CT.ROM+1\r
+       INC CT.RAM+1\r
+       DEX\r
+       BMI 50$\r
+       BNE 10$\r
+       LDY #PL.AZ&0FF\r
+       BNE 10$\r
+50$:   DEC CT.ROM+1            ;  transfer last byte\r
+       DEC CT.RAM+1\r
+       JSR 60$\r
+       RTS\r
+\r
+;---------------------------------------\r
+;  swap\r
+60$:\r
+       LDA @CT.ROM(Y)\r
+       STA TEMP1\r
+       TRAM @CT.RAM(Y) @CT.ROM(Y)\r
+       TRAM TEMP1      @CT.RAM(Y)\r
+       RTS\r
+\r
+\r
+;---------------------------------\r
+;  put in initial\r
+CT.HSS: .WORD SC.HI1+HFSIZ-1,SC.HI2+HFSIZ-1,SC.HI3+HFSIZ-1\r
+       .WORD SC.HI2+HFSIZ-1,SC.HI3+HFSIZ-1\r
+CT.HS2:        .WORD SC.HSD,SC.HSD+1,SC.HSD+2,SC.HSD+1,SC.HSD+2\r
+CT.RMS: .WORD CTRAM+<6*16>+2,CTRAM+<6*16>+7,CTRAM+<6*16>+0C\r
+       .WORD CTRAM+<0B*16>+2,CTRAM+<10*16>+2\r
+CT.HIN: \r
+       ;  get initial\r
+       LDA TEMP4\r
+       ASL\r
+       TAX\r
+\r
+       LDA PL.UP\r
+       IFEQ            ;  player 1\r
+        LDA CT.HSS(X)\r
+        STA TEMP1\r
+        LDA 1+CT.HSS(X)\r
+       ELSE            ;  player 2\r
+        LDA CT.HS2(X)\r
+        STA TEMP1\r
+        LDA 1+CT.HS2(X)\r
+       ENDIF\r
+       STA 1+TEMP1\r
+\r
+       TR16AM CT.RMS(X) CT.ADL\r
+\r
+       LDY #0\r
+       LDA @TEMP1(Y)           ;  now have initial\r
+       SUB #4A\r
+\r
+       STA TEMP1       ;  mult by 5 so (A) points to sym\r
+       ASLS 2\r
+       ADD TEMP1\r
+       STA TEMP1\r
+\r
+       TRAI 4 TEMP3\r
+       BEGIN\r
+\r
+       LDX TEMP1\r
+       LDA AL.55L(X)\r
+       STA TEMP5\r
+\r
+       LDX #4\r
+       BEGIN\r
+       ASL TEMP5\r
+       IFCS\r
+        LDA @CT.ADL(Y)\r
+        ADD #0A\r
+        STA @CT.ADL(Y)\r
+        JSR BL.IN2\r
+        LDA @CT.A2L(Y)\r
+        AND #^B11111011        ;  Accessibility=0\r
+        STA @CT.A2L(Y)\r
+       ENDIF\r
+       SB16AI CT.ADL 16\r
+       DEX\r
+       MIEND\r
+\r
+       AD16AI CT.ADL 16*5+1\r
+       INC TEMP1\r
+       DEC TEMP3\r
+       MIEND\r
+\r
+       RTS\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/CCUBE.MAC b/CCUBE.MAC
new file mode 100644 (file)
index 0000000..fd8ddb9
Binary files /dev/null and b/CCUBE.MAC differ
diff --git a/CDB.MAC b/CDB.MAC
new file mode 100644 (file)
index 0000000..2bf5ade
Binary files /dev/null and b/CDB.MAC differ
diff --git a/CEE.MAC b/CEE.MAC
new file mode 100644 (file)
index 0000000..1cc84d7
--- /dev/null
+++ b/CEE.MAC
@@ -0,0 +1,576 @@
+;  filename CEE.mac\r
+;  EEROM routines\r
+;  programmed by ED LOGG and FRANZ LANZINGER\r
+;  original routines used checksums, these routines use\r
+;  triplication of data.\r
+\r
+\r
+;      Copyright Atari 1982\r
+;      Unauthorized reproduction, adaptation, distribution\r
+;      performance or display of this computer\r
+;      program on the associated audiovisual work\r
+;      is prohibited\r
+\r
+.REPT 0\r
+HOW TO ACCESS EEROM:\r
+\r
+to write:\r
+       store data\r
+\r
+to store, i.e. copy RAM to ROM\r
+       FF EE.SIR\r
+       0  EE.SLO\r
+       FF EE.SHI\r
+       FF EE.SLO\r
+       0  EE.SHI\r
+\r
+to recall\r
+       0 EE.SIR\r
+       X EE.REC\r
+       0 9E84\r
+       0FF 9E84\r
+\r
+to enable store on power down\r
+       FF EE.SIR\r
+       .ENDR\r
+\r
+       .PAGE\r
+       .SBTTL  EEACC-display accounting info\r
+;\r
+;      This routine takes the accounting info and\r
+;      displays it.\r
+;      T.HIST=TIMES FOR HISTOGRAM TABLE\r
+;      T.ACCV=PLAYFIELD ADDRESSES FOR ALL VALUES\r
+;\r
+;ENTRY (EEROM,EEROM+255.)=EEROM DATA\r
+;USES  A,X,Y,(TEMP1,TEMP1+1),(TEMP2,TEMP2+1),(TEMP4,TEMP4+1),(TEMP5,TEMP5+1)\r
+EEACC: JSR GR.SCL              ;CLEAR THE SCREEN\r
+\r
+;  display the accounting messages\r
+       LDA #22\r
+       JSR MESS\r
+\r
+       TRAI 0 TEMP3+1\r
+       LDX #AMECH-EEROM\r
+       BEGIN\r
+        STX TEMP3\r
+        TR24AM EEROM(X) SC.NM\r
+        TRAI 0B0 AL.X\r
+        LDX TEMP3+1\r
+        TRAM T.ACCV(X) AL.Y\r
+        JSR SC.NDS\r
+        ADAI 8 AL.Y\r
+        LDX TEMP3\r
+        INXS 3\r
+       INC TEMP3+1\r
+       LDA TEMP3+1\r
+       CMP #5\r
+       EQEND\r
+\r
+       JSR EETOTP\r
+\r
+       TR24AM TEMP1 SC.NM\r
+       TRAI 0B0 AL.X\r
+       TRAI 58  AL.Y\r
+       JSR SC.NDS\r
+\r
+       LDX I,0\r
+       LDY I,3\r
+       CLC\r
+       SED\r
+15$:   LDA X,EEROM+GAME2       ;2 * number of 2 play games\r
+       ADC X,EEROM+GAME2\r
+       STA X,TEMP1\r
+       INX\r
+       DEY\r
+       BNE 15$\r
+       LDX I,0\r
+       LDY I,3\r
+       CLC\r
+20$:   LDA X,TEMP1\r
+       ADC X,EEROM+GAME1       ;add 1 player games\r
+       STA X,TEMP1             ;get total number of games\r
+       INX\r
+       DEY\r
+       BNE 20$\r
+       CLD\r
+\r
+       TR24AM TEMP1 SC.NM\r
+       TRAI 0B0 AL.X\r
+       TRAI 070 AL.Y\r
+       JSR SC.NDS       ; display total number of games\r
+\r
+;  calculate average game time\r
+;\r
+       LDX I,3\r
+28$:   LDA X,EEROM+GTIME\r
+       STA X,TEMP4\r
+       DEX\r
+       BPL 28$         ; copy total game time to zero page\r
+\r
+       LDA SC.NM\r
+       ORA SC.NM+1\r
+       ORA SC.NM+2             ;for no games\r
+       BEQ 45$                 ;average game time=0\r
+\r
+;  subtractive divide\r
+       LDY I,0FF\r
+       SED\r
+30$:   INY\r
+       CPY I,0EF\r
+       BEQ 40$                 ;OVERFLOW-LEAVE AT MAX\r
+       LDA TEMP4               ;SUBTRACT NUMBER OF GAMES\r
+       SEC             ;UNTIL TOTAL GAME TIME IS NEGATIVE\r
+       SBC SC.NM  ;NOTE THAT  RESULT IS MODUL0 16 MINUTES\r
+       STA TEMP4               ;64 SECONDS = 1 MINUTE\r
+       LDA TEMP4+1\r
+       SBC SC.NM+1\r
+       STA TEMP4+1\r
+       LDA TEMP5\r
+       SBC SC.NM+2\r
+       STA TEMP5\r
+       LDA TEMP5+1\r
+       SBC I,0\r
+       STA TEMP5+1\r
+       BPL 30$                 ;IF NOT DONE\r
+40$:\r
+;  (Y) contains result of division\r
+       CLD\r
+       TYA\r
+;  convert from HEX to time format\r
+       AND I,0F\r
+       CMP I,0F\r
+       TYA\r
+       BCC 42$ ;IF 60 SECONDS THEN ADD 1 TO MINUTES\r
+       INY\r
+42$:   LSRS 4  ;ADD 64 SEC NIBBLE TO 4 SECOND NIBBLE BECAUSE\r
+               ;64 SECONDS=1 MINUTES + 4 SECONDS\r
+       STY TEMP2\r
+       CLC\r
+       ADC TEMP2       ;ADJUSTED MINUTES + SECONDS/4\r
+       STA TEMP2\r
+       AND I,0F\r
+       CMP I,0F\r
+       BCC 45$  ;IF 60 SECONDS THEN ADD 1 TO MINUTES\r
+       INC TEMP2\r
+\r
+45$:\r
+;  ( TEMP2) contains result\r
+\r
+       TRAI 078 AL.Y\r
+       TRAI 0B0 AL.X\r
+       LDX TEMP2\r
+       JSR TIME                ;display average time\r
+\r
+;  display histogram,  modified for 6 digits\r
+\r
+       TRAI 194. AL.Y\r
+       LDA I,EECK2-HISTOG-3\r
+       STA TEMP2               ;  histogram data\r
+       LDA I,EECK2-HISTOG/3-1\r
+       STA TEMP3               ;  time data\r
+50$:   LDY TEMP3\r
+       SBAI 6 AL.Y\r
+       TRAI 60 AL.X\r
+       LDX T.HIST(Y)           ;get time interval\r
+       JSR TIME                ;display time\r
+       TRAI 090 AL.X           ;move over\r
+       LDX TEMP2\r
+       LDA X,HISTOG\r
+       STA SC.NM\r
+       LDA X,HISTOG+1\r
+       STA SC.NM+1\r
+       LDA X,HISTOG+2\r
+       STA SC.NM+2\r
+       JSR SC.NDS              ;display number\r
+       SBAI 3 TEMP2\r
+       DEC TEMP3\r
+       BPL 50$\r
+\r
+       TRAI 0F0 AL.Y           ;  display failure index\r
+       TRAI 80  AL.X\r
+       TRAM EEROM+0FF SC.NM\r
+       TRAI 0 SC.NM+1\r
+       STA    SC.NM+2\r
+       JSR SC.NDS\r
+\r
+       RTS\r
+\r
+;------------------------------\r
+;  get total paid coins\r
+EETOTP:\r
+       SED\r
+       LDA LMECH\r
+       CLC\r
+       ADC RMECH               ;GET TOTAL PAID COINS\r
+       STA TEMP1\r
+       LDA LMECH+1\r
+       ADC RMECH+1\r
+       STA TEMP1+1\r
+       LDA LMECH+2\r
+       ADC RMECH+2\r
+       STA TEMP2\r
+       CLD\r
+       RTS\r
+\r
+       .PAGE\r
+\r
+       .SBTTL  EEACC1 - UPDATE ACCOUNTING FOR COIN COUNTERS\r
+;\r
+;      CALL THIS ROUTINE ONCE A FRAME TO UPDATE THE COIN COUNTER\r
+;      ACCOUNTING INFO IN THE EEROM.  BE CAREFULL TO INITIALIZE \r
+;      "EECOIN" TO THE COIN COUNTER OFF STATE.\r
+;\r
+;ENTRY (EECOINS)=LAST STATE OF COIN COUNTERS\r
+;      ($CCTIM,$CCTIM+2)=AUX, LEFT AND RIGHT COIN COUNTER STATE\r
+;EXIT  (EECOINS)=STATE OF COIN COUNTERS\r
+;USES  A,X,Y,TEMP1,(TEMP2,TEMP2+1)\r
+EEACC1:        LDY I,RMECH-EEROM\r
+       LDX EECOIN\r
+       LDA $CCTIM\r
+       ASL\r
+       ROL EECOIN\r
+       LDA $CCTIM+1\r
+       ASL\r
+       ROL EECOIN\r
+       LDA $CCTIM+2\r
+       ASL\r
+       ROL EECOIN      ;new state of the coin counters\r
+       TXA\r
+       EOR EECOIN      ;1=for a change in state\r
+       AND EECOIN      ;1=coin counters just turned on\r
+10$:   LSR\r
+       BCC 20$                 ;NO CHANGE\r
+       STA TEMP2\r
+\r
+       STY TEMP2+1\r
+       JSR EEINC\r
+\r
+       LDY TEMP2+1\r
+       LDA TEMP2\r
+20$:   DEY\r
+       DEY\r
+       DEY\r
+       CPY I,AMECH-EEROM\r
+       BCS 10$                 ;CONTINUE THRU ALL COUNTERS\r
+       RTS\r
+\r
+       .PAGE\r
+\r
+       .SBTTL  EEACC2-accumulate game time statistics  \r
+;\r
+;      CALL THIS ROUTINE AT END OF GAME.  REMEMBER TO\r
+;      CLEAR THE GAME TIME WHEN A GAME IS STARTED.\r
+;\r
+;ENTRY (ST.TIM,1+ST.TIM)=GAME TIME FOR current player\r
+;      (PL.FLG)=NUMBER OF PLAYERS 0,1\r
+;USES  A,X,Y\r
+EEACC2:\r
+       JSR EECHKT      ;  check triplication\r
+\r
+       TRAI 0 EE.SIR\r
+       SED\r
+       LDY #GTIME\r
+       LDA EEROM(Y)\r
+       CLC\r
+       ADC ST.TIM\r
+       STA EEROM(Y)\r
+       LDA 1+EEROM(Y)\r
+       ADC 1+ST.TIM\r
+       STA 1+EEROM(Y)\r
+       LDA 2+EEROM(Y)\r
+       ADC I,0\r
+       STA 2+EEROM(Y)\r
+       LDA 3+EEROM(Y)\r
+       ADC I,0\r
+       IFCC                    ;DO NOT OVERFLOW COUNTER\r
+       STA 3+EEROM(Y)\r
+       ENDIF\r
+       CLD\r
+\r
+       LDX #3\r
+       JSR EEUPD\r
+\r
+       LDA #GAME1\r
+       LDX PL.FLG              ;0 OR 1\r
+       BEQ 10$                 ;1 PLAYER GAME\r
+       ADD #3\r
+\r
+       LDX PL.UP\r
+       IFEQ                    ; for two player game\r
+                               ; update number of plays\r
+                               ; only once\r
+10$:\r
+       TAY\r
+       JSR EEINC\r
+       ENDIF\r
+\r
+;  histogram update\r
+11$:   LDX I,EECK2-HISTOG/3-1\r
+       LDA ST.TIM+1\r
+       BNE 14$                 ;if exceeded 6:40\r
+       LDA ST.TIM              ; 10 means 10.x4secs=40secs\r
+       LDX I,0\r
+\r
+12$:\r
+       SED\r
+       SEC\r
+       SBC #10         ;NUMBER OF seconds per interval\r
+       CLD\r
+       BCC 14$                 ;end of loop\r
+       INX\r
+       CPX I,EECK2-HISTOG/3-1\r
+       BCC 12$                 ;if not at max yet\r
+14$:\r
+       TXA                     ; multiply by 3\r
+       STA TEMP1\r
+       ASL\r
+       ADD TEMP1\r
+       ADC #HISTOG-EEROM\r
+       TAY\r
+\r
+;      JMP EEINC\r
+\r
+;---------------------------------------\r
+;  increment EEROM(Y) to 2+EEROM(Y)\r
+EEINC:\r
+       TRAI 0 EE.SIR\r
+       SED\r
+       LDA EEROM(Y)\r
+       CLC\r
+       ADC I,1\r
+       STA EEROM(Y)\r
+       LDA 1+EEROM(Y)\r
+       ADC I,0\r
+       STA 1+EEROM(Y)\r
+       LDA 2+EEROM(Y)\r
+       ADC I,0\r
+       STA 2+EEROM(Y)  ;IF THIS OVERFLOWS EEROM IS DEAD\r
+       CLD\r
+\r
+       LDX #2\r
+;      JMP EEUPD\r
+\r
+;-----------------------------------------------------\r
+;  update in triplicate starting at EEROM(Y) (X)+1 times\r
+EEUPD:\r
+       BEGIN\r
+        LDA EEROM(Y)\r
+        JSR EESTO\r
+        INY\r
+        DEX\r
+       MIEND\r
+       TRAI 0FF EE.SIR\r
+       RTS\r
+\r
+.PAGE\r
+;------------------------------------------------------\r
+       .SBTTL  EEINIT-read and initialize EEROM data\r
+\r
+EEINIT:\r
+EECHKT:\r
+       LDA #0          ;  check the data\r
+       STA TEMP3\r
+       LDY #EETRIP-1\r
+       BEGIN\r
+        JSR EECHK\r
+        DEY\r
+       MIEND\r
+\r
+       LDY #EETRIP-1\r
+       LDA EEROM(Y)\r
+       CMP #0F\r
+       BNE 10$\r
+       \r
+       LDA TEMP3\r
+       CMP #4\r
+       IFCS  ; if more than 4 failures,  reset EEROM data\r
+10$:\r
+        TRAI 0 EE.SIR\r
+        LDY #EETRIP-1\r
+        LDA #0F        ;  so you don't get garbage if EEROM's are swapped\r
+        JSR EESTO      ;\r
+        LDY #EETRIP-2\r
+        BEGIN\r
+         JSR EERES\r
+        DEY\r
+        MIEND\r
+        INY            ;  now 0\r
+        STY EEROM+0FF\r
+        DEY            ;  now 0FF\r
+        STY EE.SIR\r
+       ENDIF\r
+\r
+       RTS\r
+\r
+;-----------------------\r
+;  clear accounting info\r
+EECLAC:\r
+        TRAI 0 EE.SIR          ;  don't store\r
+        LDY #EECK2-EEROM-1     ;  end of accounting info\r
+        BEGIN\r
+         JSR EERES\r
+        DEY\r
+        CPY #GAME1-1\r
+        EQEND\r
+        TRAI 0FF EE.SIR\r
+        RTS\r
+\r
+;-----------------------------------\r
+;  check up on triplication\r
+EECHK:\r
+       LDX #0          ;  0 for EE.SIR\r
+\r
+       LDA EERM1(Y)\r
+       EOR #0FF\r
+       STA TEMP1\r
+       LDA EERM2(Y)\r
+       EOR #0AA\r
+       STA TEMP2\r
+\r
+       LDA EEROM(Y)\r
+       CMP TEMP1\r
+       IFNE\r
+        STX EE.SIR\r
+        CMP TEMP2\r
+        IFEQ\r
+         EOR #0FF\r
+         STA EERM1(Y)\r
+         JMP 40$\r
+        ELSE\r
+         LDA TEMP1\r
+         CMP TEMP2\r
+         IFEQ\r
+          STA EEROM(Y)\r
+          BEQ 40$\r
+         ELSE\r
+          BNE 30$\r
+         ENDIF\r
+        ENDIF\r
+       ELSE\r
+        CMP TEMP2\r
+        IFNE\r
+         STX EE.SIR\r
+         EOR #0AA\r
+         STA EERM2(Y)\r
+         JMP 40$\r
+        ELSE\r
+         RTS\r
+        ENDIF\r
+       ENDIF\r
+\r
+30$:\r
+       JSR EERES\r
+40$:   LDA TEMP3\r
+       ADD #1\r
+       IFCC\r
+        STA TEMP3\r
+       ENDIF\r
+       INC EEROM+0FF           ;  increment failure counter\r
+       TRAI 0FF EE.SIR\r
+       RTS\r
+\r
+;----------------------\r
+;  reset EEROM location\r
+EERES:\r
+       LDA #0\r
+\r
+;  store value in EEROM location\r
+EESTO:\r
+       STA EEROM(Y)\r
+       EOR #0FF\r
+       STA EERM1(Y)\r
+       EOR #055\r
+       STA EERM2(Y)\r
+       RTS\r
+\r
+.PAGE\r
+;----------------------------------\r
+;  compute coin mode, given options\r
+EE.CMD:\r
+       LDA EEOPT\r
+       ADD #2\r
+       AND #3\r
+       STA $CMODE\r
+       LDA EEOPT+1\r
+       AND #1\r
+       ASLS 4\r
+       ADC $CMODE\r
+       STA $CMODE\r
+       LDA EEOPT+2\r
+       AND #3\r
+       ASLS 2\r
+       ADC $CMODE\r
+       STA $CMODE\r
+       RTS\r
+\r
+.SBTTL  EETST1\r
+;\r
+;      THIS ROUTINE USES THE "EESTOR" TWICE SO DO NOT OVER\r
+; USE THIS ROUTINE BECAUSE THE XICOR IS VALID FOR 1000\r
+;      STORES.  THIS DATA WILL NOT DESTROY THE DATA UNLESS\r
+; THE EEROM FAILS.  THE SYMBOL "NWAIT" MUST BE DEFINED\r
+;      SO THAT THIS ROUTINE CAN WAIT THE REQUIRED 10 MILLI\r
+;      SECONDS FOR A STORE.\r
+;\r
+;EXIT  (EEBUF)=A SEPARATE 256 BYTE BUFFER\r
+;      (CC)=zero if test passed\r
+;      (X)=index where ROM failed\r
+;      (A)=difference (EOR) in error and expected result\r
+;USES  A,X,Y,(EEBUF,EEBUF+255.)\r
+EETST1:\r
+       LDX I,0\r
+10$:   LDA X,EEROM\r
+       STA X,EEBUF             ; save data\r
+       TXA\r
+       STA X,EEROM             ; generate test data\r
+       INX\r
+       BNE 10$\r
+\r
+       JSR EESTOR              ; store test data\r
+95$:   STA X,EEROM             ;clear RAM in EEROM\r
+       DEX\r
+       BNE 95$\r
+\r
+       STX EE.SIR\r
+       STX EE.REC              ; recall test data\r
+       STX EE.RE2\r
+       TRAI 0FF EE.RE2 \r
+\r
+30$:   LDA X,EEROM             ; is it the same?\r
+       STX TEMP1\r
+       EOR TEMP1\r
+       BNE 50$\r
+       INX\r
+       BNE 30$\r
+               ;  test passed, so restore from EEBUF\r
+40$:   LDA X,EEBUF\r
+       STA X,EEROM\r
+       INX\r
+       BNE 40$\r
+\r
+       JSR EECHKT              ;  verify validity\r
+       JSR EESTOR              ;  and store it, so that no garbage in ROM\r
+50$:\r
+       RTS\r
+\r
+EESTOR:\r
+       LDY #0FF\r
+       LDA #000\r
+       STY EE.SIR\r
+       STA EE.SLO\r
+       STY EE.SHI\r
+       STY EE.SLO\r
+       STA EE.SHI\r
+\r
+EEWAIT:\r
+;      LDY I,NWAIT\r
+       LDY #10\r
+20$:   INX\r
+       BNE 20$                 ;WAIT 850 US AT 1.5 MHZ\r
+       DEY\r
+       BNE 20$                 ;WAIT AT LEAST 10 MS (NWAIT=10 FOR 12.75 MS)\r
+\r
+;  on exit of EESTOR (A),(X),(Y) are 0\r
+       RTS\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/CEEDEF.MAC b/CEEDEF.MAC
new file mode 100644 (file)
index 0000000..c469350
Binary files /dev/null and b/CEEDEF.MAC differ
diff --git a/CEL.MAC b/CEL.MAC
new file mode 100644 (file)
index 0000000..3228d63
Binary files /dev/null and b/CEL.MAC differ
diff --git a/CEN.MAC b/CEN.MAC
new file mode 100644 (file)
index 0000000..96e76ed
--- /dev/null
+++ b/CEN.MAC
@@ -0,0 +1,2567 @@
+;  filename  CEN.MAC\r
+\r
+;------------------------\r
+;  init for start of wave\r
+EN.INI:\r
+       TRAI 2*EN.MAX EN.NUM\r
+       LDX #0\r
+       STX EN.EWM      ;  end of wave mode init\r
+       STX EN.WRF      ;  warp flag\r
+       STX EN.TFL\r
+       STX SC.GEM      ;  gem counter\r
+       \r
+       BEGIN\r
+        JSR EN.IN3\r
+       INXS 2\r
+       CPX EN.NUM\r
+       PLEND\r
+\r
+       RTS\r
+\r
+;----------------------------------\r
+;  init positions on wave (re)start\r
+EN.INP:\r
+\r
+       LDA HW.TBH      ;  init trackball\r
+       STA TR.I\r
+\r
+       LDA HW.TBV\r
+       STA TR.J\r
+\r
+       TRAI 040 EN.GDL\r
+       TRAI 2*EN.MAX EN.NUM\r
+\r
+       LDX #0\r
+       STX EN.CDL      ;  init collision delay\r
+       BEGIN\r
+        JSR EN.IN2\r
+       INXS 2\r
+       CPX EN.NUM\r
+       PLEND\r
+\r
+       RTS\r
+\r
+;-----------------\r
+;  death of player\r
+EN.DTH:\r
+       LDY #0\r
+       TRAI 2*EN.MAX EN.NUM\r
+\r
+       LDX #0\r
+       BEGIN\r
+       TXA\r
+       IFNE\r
+       TR16AM EN.MA2(X) EZ.MA2\r
+       JSR EN.CCB\r
+       ENDIF\r
+\r
+       INXS 2\r
+       CPX EN.NUM\r
+       PLEND\r
+\r
+       RTS\r
+\r
+;---------------------------------------------\r
+; update EN\r
+EN.UPD:\r
+\r
+       LDA FRAME\r
+       AND #7F\r
+       IFEQ\r
+        LDA SN.GFL\r
+        IFEQ\r
+         LDA 1+WV.TIM\r
+         CMP #0C\r
+         IFCC\r
+         STA RS.KEY+1\r
+         LDA #15\r
+         JSR MN.SN1\r
+         ENDIF\r
+        ENDIF\r
+        TRAI 0 SN.GFL\r
+       ENDIF\r
+\r
+       JSR TR.UPD      ; trackball update\r
+       JSR EN.EWC      ; end of wave calculation\r
+\r
+       LDA GM.STA\r
+       CMP #5\r
+       IFEQ\r
+        RTS\r
+       ENDIF\r
+\r
+       JSR EN.PLU      ; player update\r
+\r
+       LDA EN.GDL\r
+       IFNE\r
+        DEC EN.GDL\r
+       ENDIF\r
+\r
+       LDA EN.CDL      ;  collision delay\r
+       IFNE\r
+        DEC EN.CDL\r
+       ENDIF\r
+\r
+       LDX #0\r
+       BEGIN\r
+\r
+        TXA\r
+        IFNE\r
+         LDA EN.LMD    ;  if player alive\r
+         IFEQ\r
+          JSR EN.COL   ; collision detect\r
+         ENDIF\r
+        ENDIF\r
+\r
+        JSR EN.UP2     ; update EN\r
+        JSR EN.OUT\r
+\r
+       INXS 2\r
+       CPX EN.NUM\r
+       PLEND\r
+\r
+       RTS\r
+\r
+;---------------------------\r
+;  update player,  jump etc.\r
+EN.JTL:\r
+.BYTE 00,04,08,0B,0E,11,14,16,18,1A,1C,1D,1E,1F,1F,20\r
+.BYTE 20,20,1F,1F,1E,1D,1C,1A,18,16,14,11,0E,0B,08,04\r
+EN.PLU:\r
+       LDA EN.LMD      ;  must be alive\r
+       IFNE\r
+        RTS\r
+       ENDIF\r
+\r
+       JSR EN.BRD              ;  read both buttons\r
+\r
+       LDA ATRACT\r
+       IFEQ\r
+        TRAI 0 EN.JBP          ;  usually not jumping\r
+        LDA WV.TIM+1\r
+        IFNE\r
+        LDA WV.TIM\r
+        IFEQ\r
+         TRAI 1 EN.JBP\r
+        ENDIF\r
+        ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.JFL      ;  jump flag update\r
+       IFEQ\r
+        LDA EN.JDL\r
+        IFEQ\r
+         LDA EN.JBP\r
+         IFNE          ;  button down\r
+          LDA EN.TFL   ; if not in tunnel\r
+          IFEQ\r
+           TRAI 0FF EN.JFL\r
+           TRAI 20 EN.JDL      ;  start jump\r
+           LDA #9\r
+           JSR MN.SN1          ;  jump sound\r
+          ENDIF\r
+         ENDIF\r
+        ELSE\r
+         DEC EN.JDL\r
+        ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.JFL\r
+       IFNE\r
+        DEC EN.JDL\r
+        IFEQ                   ;  landing\r
+         LDA #2\r
+         STA EN.JDL\r
+         LDA #0\r
+         STA EN.JFL\r
+         LDA EN.MX\r
+         AND EN.MY\r
+         CMP #14\r
+         IFEQ\r
+          INC AT.OUT\r
+         ENDIF\r
+        ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.JFL\r
+       IFNE\r
+        LDA EN.JDL\r
+        TAY\r
+        LDA EN.JTL(Y)\r
+        STA EN.HOF\r
+       ELSE\r
+        TRAI 0 EN.HOF\r
+       ENDIF\r
+\r
+       RTS\r
+\r
+\r
+;---------------------\r
+;  read both buttons\r
+EN.BRD:\r
+       LDA HW.VBL\r
+       AND #MA.BUT\r
+       TAY             ;  0     0    1   1\r
+       EOR EN.JBO      ;  0     1    0   1\r
+                       ;  0     1    1   0\r
+       AND EN.JBO      ;  0     1    0   0\r
+       STA EN.JBP      ;  positive transition\r
+       \r
+       STY EN.JBO\r
+\r
+       .IF NE,CG.PC\r
+       LDA HW.VBL\r
+       AND #MA.BU2\r
+       TAY             ;  0     0    1   1\r
+       EOR EN.JB2      ;  0     1    0   1\r
+                       ;  0     1    1   0\r
+       AND EN.JB2      ;  0     1    0   0\r
+       ORA EN.JBP      ;  positive transition\r
+       STA EN.JBP\r
+\r
+       STY EN.JB2\r
+       .ENDC\r
+       RTS\r
+\r
+\r
+;-------------------------------\r
+;  compute absolute value of (A)\r
+EN.ABS:\r
+       CMP #0\r
+       IFMI\r
+        NEGA\r
+       ENDIF\r
+       RTS\r
+\r
+;------------------------------\r
+;  rotate trackball coordinates\r
+TR.UPD:\r
+       JSR TR.DEL\r
+\r
+; calculate CE deltas given TR deltas\r
+\r
+   ; truncate TR deltas, store in CE deltas\r
+       TRAI 9 TEMP1\r
+       LDA TR.XD\r
+       JSR GP.TRC\r
+       STA CE.XD\r
+       LDA TR.YD\r
+       JSR GP.TRC\r
+       NEGA            ;  invert delta Y\r
+       STA CE.YD\r
+\r
+   ;  rotate\r
+       LDA CE.XD       ; calculate new CE.YD\r
+       ASL\r
+       ADD CE.YD\r
+       STA CE.TMP      ; store in temp\r
+\r
+       LDA CE.YD       ; calculate new CE.XD\r
+       ASL\r
+       SUB CE.XD\r
+       STA CE.XD       ; and store\r
+       TRAM CE.TMP CE.YD       ; also store CE.YD\r
+\r
+\r
+;  truncate again\r
+       TRAI 0F TEMP1\r
+       LDA CE.XD\r
+       JSR GP.TRC\r
+       STA CE.XD\r
+       LDA CE.YD\r
+       JSR GP.TRC\r
+       STA CE.YD\r
+\r
+;    jumping\r
+       LDA EN.JFL\r
+       IFNE\r
+        LDA EN.JDL\r
+        CMP #1F\r
+        IFEQ\r
+         LDA EN.IX\r
+         ASLS 3\r
+         STA EN.JPX\r
+         LDA EN.IY\r
+         ASLS 3\r
+         STA EN.JPY\r
+        ENDIF\r
+        LDA EN.JDL\r
+        CMP #1E\r
+        IFEQ\r
+         LDA EN.IX\r
+         ASLS 3\r
+         SUB EN.JPX\r
+         DIV2\r
+         DIV2\r
+         DIV2\r
+         STA EN.JPX\r
+\r
+         LDA EN.IY\r
+         ASLS 3\r
+         SUB EN.JPY\r
+         DIV2\r
+         DIV2\r
+         DIV2\r
+         STA EN.JPY\r
+        ENDIF\r
+        LDA EN.JDL\r
+        CMP #1E\r
+        IFCC\r
+         TRAM EN.JPX CE.XD\r
+         TRAM EN.JPY CE.YD\r
+        ENDIF\r
+       ENDIF\r
+\r
+\r
+       RTS\r
+\r
+TR.DEL:\r
+       LDA HW.TBH\r
+       SUB TR.I\r
+       STA TR.XD\r
+\r
+       LDA HW.TBV\r
+       SUB TR.J\r
+       STA TR.YD\r
+\r
+       LDA HW.TBH\r
+       STA TR.I\r
+       LDA HW.TBV\r
+       STA TR.J\r
+       RTS\r
+\r
+;--------------------------\r
+;  truncation routine:  truncates to -TEMP1:TEMP1\r
+;    input  A\r
+;    output A\r
+;----------------------\r
+GP.TRC:\r
+       CMP TEMP1\r
+       BMI 10$\r
+       LDA TEMP1\r
+       RTS\r
+10$:   NEGA\r
+       CMP TEMP1\r
+       BMI 20$\r
+       LDA TEMP1\r
+20$:   NEGA\r
+       RTS\r
+\r
+\r
+;-------------------------\r
+;  end of wave calculation\r
+EN.EWC:        \r
+\r
+;  if everybody in limbo, and no gems, advance wave\r
+\r
+       LDX #2\r
+       BEGIN\r
+        LDA EN.LMD(X)\r
+        CMP #3\r
+        BNE 20$\r
+       INXS 2\r
+       CPX EN.NUM\r
+       PLEND\r
+\r
+       LDA EN.WRF\r
+       IFEQ\r
+\r
+       LDA CE.COC\r
+       ORA CE.COC+1\r
+       IFEQ            ;  all gems gone\r
+        JSR EN.LDB     ;  last dot bonus awarded\r
+        JSR WV.UPD\r
+        JSR GM.EW0     ;  end of wave state\r
+       ENDIF\r
+\r
+       ELSE            ;  end wave quickly when warping\r
+       JSR WV.MBF\r
+       JSR WV.UPD\r
+       JSR GM.EW0\r
+       ENDIF\r
+20$:\r
+\r
+       LDA EN.EWM\r
+       IFNE\r
+        RTS\r
+       ENDIF\r
+\r
+;  all gems gone?\r
+       LDA CE.COC\r
+       ORA 1+CE.COC\r
+       IFEQ\r
+        JSR EN.EW      ;  end of wave\r
+       ENDIF\r
+\r
+\r
+;  warp\r
+       LDA EN.JBP\r
+       IFEQ\r
+        RTS\r
+       ENDIF\r
+;  jump button depressed\r
+\r
+       LDA WV.XCO\r
+       IFNE\r
+        JMP 55$\r
+       ENDIF\r
+\r
+;  ordinary warp\r
+       IFEQA WV.YCO 0\r
+       LDA EN.TFL\r
+       IFNE\r
+       LDA WV.WAR\r
+       IFNE\r
+10$:\r
+        STA TEMP5+1\r
+\r
+        LDA #0\r
+        STA SC.SCO\r
+        STA SC.SCO+1\r
+        STA SC.SCO+2\r
+        STA SC.INC\r
+        STA SC.INC+1\r
+        STA SC.INC+2\r
+        LDA #99\r
+        STA SC.GEM\r
+        LDX TEMP5+1\r
+        BEGIN\r
+         SED\r
+         LDA SC.INC+2\r
+         ADD #7\r
+         STA SC.INC+2\r
+         CLD\r
+         DEX\r
+        EQEND\r
+\r
+        LDY #4\r
+        LDX TEMP5+1\r
+        CPX #3\r
+        IFCS\r
+        LDY #5\r
+        ENDIF\r
+        JSR MN.STL\r
+        STA TEMP1\r
+        CPY TEMP1\r
+        IFCC           ;  give at least the starting lives\r
+         LDY TEMP1\r
+        ENDIF\r
+        STY WV.LIV\r
+        JSR SC.UPD\r
+\r
+        TRAM TEMP5+1 WV.XCD    ;  warp\r
+        LDX #0\r
+        STX WV.YCD\r
+        DEX\r
+        STX EN.WRF     ;  end wave immediately\r
+        JMP EN.EW\r
+;       RTS\r
+       ENDIF\r
+       ENDIF\r
+       ENDIF\r
+\r
+;  secret warp #1\r
+       LDA WV.YCO\r
+       IFEQ\r
+       IFEQA EN.MX 1\r
+       IFEQA EN.MY 1\r
+        LDA #2\r
+        JMP 10$\r
+       ENDIF\r
+       ENDIF\r
+       ENDIF\r
+\r
+55$:\r
+\r
+;  secret warp #2\r
+       IFEQA WV.XCO 2\r
+       IFEQA WV.YCO 0\r
+       IFEQA EN.MX 3\r
+       IFEQA EN.MY 3\r
+       LDA EN.CDL\r
+       IFNE\r
+        LDA #4\r
+        JMP 10$\r
+       ENDIF\r
+       ENDIF\r
+       ENDIF\r
+       ENDIF\r
+       ENDIF\r
+\r
+;  secret warp #3\r
+       IFEQA WV.XCO 4\r
+       IFEQA WV.YCO 2\r
+       IFEQA EN.MX 1\r
+       IFEQA EN.MY 1\r
+        LDA #6\r
+        JMP 10$\r
+       ENDIF\r
+       ENDIF\r
+       ENDIF\r
+       ENDIF\r
+       RTS\r
+\r
+;----------------------\r
+;  last dot bonus award\r
+EN.LDB:\r
+       JSR WV.MBF      ;  move bear out of the way\r
+       JSR AL.MDB      ;  message display board\r
+\r
+       LDA EN.LDF\r
+       IFEQ\r
+        LDA #0E\r
+        JSR MN.SN1\r
+\r
+        LDA #0\r
+        STA SC.INC\r
+        STA 2+SC.INC\r
+        STA SC.NM\r
+        STA 2+SC.NM\r
+\r
+        TRAI 094 AL.X\r
+        TRAI 088 AL.Y\r
+\r
+        LDA WV.XCO\r
+        ASLS 2\r
+        ADD WV.YCO\r
+        ADD #10.\r
+        JSR AL.CNV\r
+        STA 1+SC.NM\r
+        STA 1+SC.INC\r
+        JSR SC.NDS             ;  display bonus awarded\r
+        JSR SC.UPD\r
+\r
+        LDA #20\r
+       ELSE\r
+        LDA #0F\r
+        JSR MN.SN1\r
+        LDA #21\r
+       ENDIF\r
+       JSR MS.DRW\r
+\r
+       TRAI 90 MN.DEL\r
+       BEGIN\r
+        JSR MN.FRA\r
+        DEC MN.DEL\r
+       EQEND\r
+\r
+       RTS\r
+\r
+\r
+;----------------------------\r
+;  start end of wave sequence\r
+EN.EW:\r
+       LDX #2\r
+       BEGIN\r
+         LDA EN.LMD(X)\r
+         CMP #3\r
+         IFNE\r
+          TRAI 1 EN.LMD(X)     ;  everybody is dying\r
+         ENDIF\r
+       INXS 2\r
+       CPX EN.NUM\r
+       PLEND\r
+\r
+       TRAI 0FF EN.EWM ;  end of wave mode 1\r
+       RTS\r
+\r
+;-----------------------\r
+;  collision EN vs EN(0)\r
+\r
+EN.COL:\r
+       COLSIZ=080\r
+       LDA EN.LMD(X)   ;  if not on maze, no collision\r
+       IFNE\r
+        JMP 50$\r
+       ENDIF\r
+\r
+;  compare EN CE X\r
+       LDA EN.IX(X)\r
+       ASLS 3\r
+       STA EN.T1\r
+\r
+       LDA EN.IX\r
+       ASLS 3\r
+       SUB EN.T1\r
+       STA EN.T2\r
+       LDA EN.MX\r
+       SBC EN.MX(X)\r
+       STA EN.T3\r
+       AD16AI EN.T2 COLSIZ\r
+\r
+       LDA EN.T3       ; high byte of difference must =0,1\r
+       CMP #1\r
+       IFCS\r
+        JMP 50$\r
+       ENDIF\r
+;      LDA EN.T2\r
+;      CMP #2*COLSIZ\r
+;      IFCS\r
+;       JMP 50$\r
+;      ENDIF           ; 0<=EX-CX+COLSIZ<=2*COLSIZ\r
+\r
+       LDA EN.IY(X)\r
+       ASLS 3\r
+       STA EN.T4\r
+\r
+       LDA EN.IY\r
+       ASLS 3\r
+       SUB EN.T4\r
+       STA EN.T5\r
+       LDA EN.MY\r
+       SBC EN.MY(X)\r
+       STA EN.T6\r
+       AD16AI EN.T5 COLSIZ\r
+\r
+       LDA EN.T6       ;  high byte of difference must =0\r
+       CMP #1\r
+       IFCS\r
+        JMP 50$\r
+       ENDIF\r
+;      LDA TEMP2\r
+;      CMP #2*COLSIZ\r
+;      IFCS\r
+;       JMP 50$\r
+;      ENDIF\r
+\r
+       LDA EN.JFL      ;  if not jumping\r
+       IFEQ\r
+        LDA EN.HEI(X)  ;  height difference <=2 \r
+        SUB EN.HEI\r
+        BINT 2,40$\r
+        JMP 50$\r
+       ENDIF\r
+40$:\r
+       LDA EN.STA(X)\r
+\r
+       CMP #7          ;  honey\r
+       IFEQ\r
+        LDA #14\r
+        JSR MN.SN1\r
+\r
+        TRAI 01 EN.ANV(X)\r
+        LDA #10        ;  1000 points\r
+41$:\r
+        STA 1+SC.INC\r
+        LDA #0\r
+        STA SC.INC\r
+        STA 2+SC.INC\r
+        JSR SC.UPD\r
+        TRAI 0D EN.STA(X)\r
+        TRAI 080 EN.DEL(X)\r
+        JMP 50$\r
+       ENDIF\r
+\r
+       CMP #6          ;  witch\r
+       IFEQ\r
+        LDA EN.CDL\r
+        IFNE\r
+         TRAI 02 EN.ANV(X)\r
+         LDA #30       ;  3000 points\r
+         JMP 41$\r
+        ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.CDL\r
+       IFNE\r
+        JMP 50$\r
+       ENDIF\r
+\r
+       LDA EN.STA(X)\r
+       CMP #0D         ;  score display\r
+       IFEQ\r
+        JMP 50$\r
+       ENDIF\r
+\r
+       CMP #0A         ;  stationary hat\r
+       IFEQ\r
+        TRAI 0FF EN.CDL        ;  collision delay\r
+        SEI\r
+        TXA\r
+        PHA\r
+        JSR RCN\r
+        PLA\r
+        TAX\r
+        CLI\r
+        LDA #8\r
+        JSR MN.SN1\r
+        TRAI 0 EN.ANV(X)\r
+        LDA #05\r
+        JMP 41$\r
+       ENDIF\r
+\r
+;      LDA EN.STA(X)   ;  if creature eating\r
+       CMP #3\r
+       IFEQ\r
+        LDA EN.JFL\r
+        IFEQ           ;  and no jumping\r
+         LDA #2\r
+         JSR MN.SN1\r
+         TRAI 0 EN.ANV(X)\r
+         LDA #05\r
+         JMP 41$       ;  500 points\r
+        ENDIF\r
+       ELSE\r
+        LDA EN.JFL     ; if jumping\r
+        IFNE\r
+         LDA EN.STA(X)\r
+         IFEQ          ; if  a tree\r
+          TRAI 0 EN.ANV(X)     ;  youth regained\r
+          LDY WV.DF2\r
+          TRAM DF.TRG(Y) EN.DEL(X)     ; tree growing time\r
+          TRAI 0 1+EN.DEL(X)\r
+         ELSE          ; if not\r
+          CMP #1\r
+          IFPL\r
+          CMP #3\r
+          IFMI\r
+           TRAI 5 EN.STA(X)    ;  stun it\r
+           TR16AI 60 EN.DEL(X)\r
+          ENDIF\r
+          ENDIF\r
+         ENDIF\r
+        ELSE\r
+         TRAI 1 EN.LMD ;  else player death\r
+         TRAI 07F EN.DEL\r
+         LDA #3\r
+         JSR MN.SN1    ;  pl death sound\r
+        ENDIF\r
+       ENDIF\r
+50$:\r
+       RTS\r
+\r
+;---------------------------------------\r
+; routine to initialize EN,  on gp start\r
+EN.IN2:\r
+;  life mode\r
+       TXA\r
+       STA TEMP1       ;  for comparison later\r
+       IFEQ\r
+        STA EN.LMD     ;  player is alive\r
+       ELSE\r
+       CPX #2\r
+       IFEQ\r
+        TRAI 3 EN.LMD(X);  swarm comes in later\r
+       ELSE\r
+\r
+       LDY WV.NUM\r
+       LDA DF.CRN(Y)\r
+       ADD WV.DF2              ;  increase number\r
+       CMP #8                  ;  of creatures\r
+       IFCS                    ;  max of 8\r
+        LDA #8\r
+       ENDIF\r
+\r
+       ASL\r
+       ADD #2\r
+       CMP TEMP1\r
+       IFPL\r
+        LDA EN.DEA(X)\r
+        IFEQ           ;  if not completely dead\r
+         TRAI 2 EN.LMD(X)      ;  start descent\r
+         LDA EN.STA(X)\r
+         SUB #7\r
+         IFEQ\r
+          STA EN.LMD(X)\r
+         ENDIF\r
+        ENDIF\r
+       ELSE\r
+        TRAI 3 EN.LMD(X)\r
+       ENDIF\r
+\r
+       ENDIF\r
+       ENDIF\r
+\r
+EN.INR:                        ;  entry for init positions\r
+       JSR EN.PSI      ;  position init\r
+10$:\r
+       TR16AI CTRAM EN.MAT(X)\r
+       JSR EN.MUL\r
+       AD16AM EN.MAT(X) EN.OFF \r
+       \r
+       TR16AM EN.MAT(X) EN.MA2(X)\r
+       AD16AI EN.MA2(X) 16*16\r
+       TR16AM EN.MAT(X) EZ.MAT\r
+       TR16AM EN.MA2(X) EZ.MA2\r
+       LDY #0\r
+       TRAM @EZ.MAT(Y) EN.HEI(X)\r
+\r
+;  height at 1 1 must not be 0 !!!!!!!! otherwise\r
+;  an infinite loop happens here\r
+\r
+       LDA EN.HEI(X)\r
+       IFEQ\r
+        TRAI 1 EN.MX(X)\r
+        TRAI 1 EN.MY(X)\r
+        JMP 10$\r
+       ENDIF\r
+\r
+; horizontal position\r
+       LDA EN.MX(X)\r
+       SUB #1\r
+       ASLS 2\r
+       STA EN.T1\r
+       LDA EN.MY(X)\r
+       SUB #1\r
+       ASLS 3\r
+       STA EN.T2\r
+       LDA #CT.HST-9   ; picture offset\r
+       ADD EN.T2\r
+       SUB EN.T1\r
+       STA EN.HP(X)\r
+\r
+; vertical position\r
+       LDA EN.MY(X)\r
+       SUB #1\r
+       ASL\r
+       STA EN.T2\r
+       LDA #0-CT.VST-0B+06+0A  ; picture offset\r
+       SUB EN.T2\r
+       SUB EN.T1\r
+       STA EN.VP(X)\r
+\r
+;  screen vert coordinate (used for scrolling down)\r
+       ADD EN.HEI(X)\r
+       STA EN.Y(X)\r
+       LDA EN.HP(X)\r
+       STA EN.X(X)\r
+\r
+; pictures\r
+       TRAI 2  EN.AND(X)\r
+\r
+       LDA #11\r
+       JSR EN.PCF      ;  bear\r
+\r
+; priority\r
+       LDY #0\r
+       LDA @EZ.MA2(Y)\r
+       AND #40\r
+       IFNE\r
+        TRAI 0 EN.PR1(X)\r
+       ELSE\r
+        TRAI 0FF EN.PR1(X)\r
+       ENDIF\r
+\r
+; fine x,y\r
+       TRAI 10 EN.IX(X)\r
+       TRAI 0C EN.IY(X)\r
+\r
+;  set collision bit, if not dead\r
+       LDA EN.LMD(X)\r
+       CMP #3\r
+       IFNE\r
+\r
+       CPX #0\r
+       IFNE\r
+        LDA @EZ.MA2(Y)\r
+        ORA #08\r
+        STA @EZ.MA2(Y)\r
+       ENDIF\r
+\r
+       ENDIF\r
+\r
+       RTS\r
+\r
+;--------------------------------------------\r
+;  initialize positions etc., after death etc.\r
+EN.PSI:\r
+       TXA\r
+       IFEQ            ;  player\r
+         STA  EN.JDL   ; not jumping\r
+         STA  EN.JFL   ; anymore\r
+         STA  EN.BLK\r
+         TRAI 14 EN.MX\r
+         TRAI 11 EN.MY\r
+       ELSE\r
+;  init positions of creatures\r
+         LDA WV.NUM    ; 0-15\r
+         ASLS 3\r
+         ADD WV.NUM\r
+         STA TEMP1\r
+         TXA\r
+         LSR\r
+         SUB #1\r
+         ADD TEMP1\r
+         TAY\r
+         TRAM DF.INX(Y) EN.MX(X)\r
+         TRAM DF.INY(Y) EN.MY(X)\r
+\r
+;  swarm on top of player after too much time\r
+         LDA EN.STA(X)\r
+         CMP #8\r
+         IFEQ\r
+          LDA WV.TIM+1\r
+          STA RS.KEY+1         ; key of swarm sound\r
+\r
+          LDA WV.DF2\r
+          LSR\r
+          NEGA\r
+          ADD #0B              ;  44 seconds\r
+          CMP 1+WV.TIM\r
+          IFCC\r
\r
+          LDA EN.TFL\r
+          IFEQ\r
+           LDA WV.TIM+1\r
+           ADC #3\r
+           STA RS.KEY+1\r
+\r
+           TRAM EN.MX EN.MX(X)\r
+           LDA EN.MY\r
+          ELSE\r
+           LDA #014\r
+           STA EN.MX(X)\r
+;          LDY WV.NUM\r
+;          TRAM DF.TEX(Y) EN.MX(X)\r
+;          TRAM DF.TEY(Y) EN.MY(X)\r
+          ENDIF\r
+          STA EN.MY(X)\r
+\r
+          ENDIF\r
+         ENDIF\r
+\r
+         TRAI 0 EN.DR(X)       ; direction\r
+         TRAI 0 EN.HOF(X)\r
+\r
+         LDA EN.STA(X)\r
+         CMP #7\r
+         IFEQ\r
+          LDA #0\r
+         ELSE\r
+          LDA #0FF\r
+         ENDIF\r
+         STA EN.BLK(X)\r
+\r
+         TRAI 0 EN.ANV(X)      ;  animation variable init\r
+         STA EN.GP1(X)         ;  general purpose init\r
+         STA EN.GP2(X)\r
+\r
+         LDA EN.STA(X)\r
+         IFEQ\r
+          STA 1+EN.DEL(X)\r
+          LDY WV.DF2\r
+          TRAM DF.TRG(Y) EN.DEL(X)     ; tree growing time\r
+\r
+         ELSE\r
+         CMP #8                ;  swarm\r
+         IFEQ\r
+          TR16AI 140 EN.DEL(X)\r
+         ELSE\r
+          TR16AI 20 EN.DEL(X)\r
+         ENDIF\r
+         ENDIF\r
+\r
+         \r
+         LDY WV.DF2\r
+         LDA DF.SP1(Y)\r
+         ADD WV.DFO\r
+         STA EN.SP1(X)\r
+         LDA DF.MSG(Y)\r
+         ADD WV.DFO\r
+         STA EN.MSG            ;  max speed g-eat\r
+         TRAM DF.CMS(Y) EN.CMS         ;  crys mons speed\r
+\r
+       ENDIF\r
+\r
+       RTS\r
+\r
+;------------------------------\r
+;  init state, at start of wave\r
+EN.IN3:\r
+;  state, picture offsets,  life or death\r
+\r
+       TRAI 0 EN.DEA(X)        ;  everybody is alive\r
+       STA AT.OUT\r
+\r
+       TXA\r
+       IFEQ\r
+        STA EN.STA\r
+        TRAI 0F-3  EN.YO1\r
+        STA        EN.YO2\r
+        TRAI 0FF-3 EN.YO3\r
+        STA        EN.YO4\r
+\r
+        TRAI 0FC   EN.XO1\r
+        STA        EN.XO3\r
+        TRAI 4     EN.XO2\r
+        STA        EN.XO4\r
+       ELSE\r
+\r
+        TRAI 0F    EN.YO1(X)\r
+        STA        EN.YO2(X)\r
+        TRAI 0FF   EN.YO3(X)\r
+        STA        EN.YO4(X)\r
+\r
+        TRAI 0FF EN.XO1(X)\r
+        STA     EN.XO3(X)\r
+        TRAI 7   EN.XO2(X)\r
+        STA     EN.XO4(X)\r
+\r
+        CPX #2 ; slot for swarm\r
+        IFEQ\r
+         TRAI 8 EN.STA(X)\r
+        ELSE\r
+         TXA\r
+         LSR\r
+         SUB #2\r
+         STA TEMP1      ; table entry\r
+\r
+         LDA WV.NUM\r
+;  now have distribution number (0-0F)\r
+         ASLS 3\r
+         ADD TEMP1\r
+         TAY\r
+\r
+         LDA DF.CRT(Y)\r
+         STA EN.STA(X)\r
+\r
+        ENDIF\r
+       ENDIF\r
+       RTS\r
+;----------------------------------------------\r
+; calculate address offset by multiplying by 22\r
+EN.MUL:        \r
+       LDA EN.MX(X)\r
+       ASL\r
+       STA TEMP1\r
+       ASL\r
+       STA TEMP2\r
+       ASL\r
+       ASL\r
+       STA EN.OFF\r
+       LDA #0\r
+       ROL\r
+       STA EN.OFF+1\r
+\r
+       AD16A8 EN.OFF TEMP1\r
+       AD16A8 EN.OFF TEMP2\r
+       AD16A8 EN.OFF EN.MY(X)\r
+\r
+       RTS\r
+\r
+;----------------------\r
+;  update EN\r
+EN.UP2:\r
+       TR16AM EN.MAT(X) EZ.MAT\r
+       TR16AM EN.MA2(X) EZ.MA2\r
+;  if not in tunnel, update height\r
+       LDY #0\r
+       LDA @EZ.MA2(Y)\r
+       AND #20\r
+       IFEQ\r
+        TRAM @EZ.MAT(Y) EN.HEI(X)\r
+       ENDIF\r
+\r
+       JSR EN.MOV\r
+\r
+       TR16AM EZ.MAT EN.MAT(X)\r
+       TR16AM EZ.MA2 EN.MA2(X)\r
+       RTS\r
+\r
+AT.XD: .BYTE 0FD,0,0FB,4,5,0,2,3\r
+       .BYTE 0,0FF,0FD,0,2,3,4,5\r
+AT.YD: .BYTE 0FD,0,0,0,0,0,0,2\r
+       .BYTE 3,4,0,2,5,0F9,2,0\r
+\r
+;---------\r
+;  move EN\r
+EN.MOV:\r
+       TXA\r
+       IFEQ\r
+\r
+;  detect gems only if player not jumping\r
+       LDA EN.JFL\r
+       BNE 10$\r
+       ENDIF\r
+       JSR EN.CDT\r
+10$:\r
+\r
+       JSR EN.STC      ;  state calculation\r
+       JSR EN.LMC      ;  life mode calculation\r
+\r
+\r
+       LDA EN.LMD\r
+       IFEQ            ;  if player alive\r
+        TXA\r
+        IFEQ\r
+         LDA ATRACT\r
+         IFNE\r
+          TRAM CE.XD EN.XD     ; trackball inputs\r
+          TRAM CE.YD EN.YD\r
+         ELSE\r
+          LDA WV.TIM\r
+          AND #3F              ;  once per second\r
+          IFEQ\r
+           INC WV.ATP  ;  increment atract mode pointer\r
+          ENDIF\r
+          LDA WV.ATP\r
+          CMP #0F\r
+          IFCS\r
+           TRAI 0F WV.ATP\r
+          ENDIF\r
+          TAY\r
+          TRAM AT.XD(Y) EN.XD\r
+          TRAM AT.YD(Y) EN.YD\r
+         ENDIF\r
+        ENDIF\r
+       ELSE            ;  if player dead, everything stops\r
+        TRAI 0 EN.XD\r
+        TRAI 0 EN.YD\r
+       ENDIF\r
+\r
+       LDA EN.GDL\r
+       IFNE\r
+         TXA\r
+         IFNE\r
+         TRAI 0 EN.XD          ;  creature freeze\r
+         STA EN.YD\r
+.REPT 0\r
+         ELSE\r
+         LDA EN.GDL            ;  flash\r
+         CMP #020\r
+         IFCS          \r
+         AND #08\r
+         IFEQ\r
+           TRAI 0 CL.SHR+17    ;  white\r
+           STA CL.SHR+1F\r
+           STA CL.SHR+37\r
+           STA CL.SHR+3F\r
+         ELSE\r
+           TRAM RANDOM CL.SHR+17   ;  random\r
+           STA CL.SHR+1F\r
+           AND #20\r
+           STA CL.SHR+37\r
+           STA CL.SHR+3F\r
+         ENDIF\r
+         ENDIF\r
+.ENDM\r
+         ENDIF\r
+       ENDIF\r
+\r
+50$:\r
+       CPX #0\r
+       IFEQ\r
+        JSR EN.PUP     ;  player animation\r
+       ENDIF\r
+\r
+;  collision with playfield\r
+       TRAI 0 EN.WCF(X)        ; no wall collision\r
+       STA    EN.NSF(X)        ; no new square\r
+\r
+       LDA EN.IX(X)\r
+       ADD EN.XD\r
+       STA EN.IX(X)\r
+       LDY EN.XD\r
+       IFPL\r
+        JSR EN.CXI\r
+       ELSE\r
+        JSR EN.CXD\r
+       ENDIF\r
+\r
+       LDA EN.IY(X)\r
+       ADD EN.YD\r
+       STA EN.IY(X)\r
+       LDY EN.YD\r
+       IFPL\r
+        JSR EN.CYI\r
+       ELSE\r
+        JSR EN.CYD\r
+       ENDIF\r
+\r
+60$:\r
+       RTS\r
+\r
+;---------------------\r
+;  plunger pictures\r
+EN.PLP:\r
+       LDA FRAME\r
+       AND #^B00110000\r
+       LSRS 4\r
+       TAY\r
+       LDA 50$(Y)\r
+       JSR EN.PCF\r
+       RTS\r
+\r
+50$:   .BYTE 080,084,088,084\r
+\r
+;----------------------------\r
+;  table for eating animation\r
+EN.EAT:\r
+\r
+.BYTE 090,094,098,09C,0A0,0A4,0A8,0A8\r
+.BYTE 0A8,0A8,0A8,0A8,0A8,0A8,0A8,0A8\r
+;  used to have 0AC at end here\r
+\r
+;-------------------------------------------\r
+;  calculate EN movement,  state calculation\r
+EN.STC:\r
+       TXA     ;  do nothing for player\r
+       IFEQ\r
+        RTS\r
+       ENDIF\r
+\r
+       TRAI 0 EN.XD\r
+       STA EN.YD\r
+\r
+       LDA EN.STA(X)\r
+       CMP #10\r
+       IFCS\r
+        LDA #10\r
+       ENDIF\r
+       ASL\r
+       TAY\r
+       JMPIN 1$\r
+\r
+       ;  state 0 :  trees state\r
+10$:\r
+       DEC16A EN.DEL(X)        ;  change state after timer\r
+       LDA EN.DEL(X)\r
+       IFEQ\r
+       LDA 1+EN.DEL(X)\r
+       IFEQ\r
+        LDA EN.ANV(X)\r
+        CMP #03\r
+        IFMI\r
+         LDY WV.DF2\r
+         TRAM DF.TRG(Y) EN.DEL(X)\r
+         TRAI 0 1+EN.DEL(X)\r
+         INC EN.ANV(X)\r
+        ENDIF\r
+       ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.ANV(X)\r
+       CMP #03\r
+       IFMI\r
+        TRAI 0 EN.SP1(X)\r
+       ELSE\r
+        LDY WV.DF2\r
+        LDA DF.TRS(Y)\r
+        ADD WV.DFO\r
+        STA EN.SP1(X)\r
+\r
+        LDA FRAME\r
+        AND #0F\r
+        IFEQ\r
+         LDA EN.ANV(X)\r
+         CMP #03\r
+         IFEQ\r
+          LDA #04\r
+         ELSE\r
+          LDA #03\r
+         ENDIF\r
+         STA EN.ANV(X)\r
+        ENDIF\r
+       ENDIF\r
+\r
+       JSR EN.VAN\r
+\r
+45$:                   ;  killer algorithm\r
+       LDA EN.IX(X)\r
+       LSRS 2\r
+       STA TEMP1\r
+       LDA EN.MX(X)\r
+       ASLS 3\r
+       ORA TEMP1\r
+       STA TEMP2\r
+\r
+       LDA EN.IX\r
+       LSRS 2\r
+       STA TEMP1\r
+       LDA EN.MX\r
+       ASLS 3\r
+       ORA TEMP1\r
+       SUB TEMP2\r
+\r
+       IFCS\r
+        CMP EN.SP1(X)\r
+        IFCS\r
+         LDA EN.SP1(X)\r
+        ENDIF\r
+       ELSE\r
+        NEGA\r
+        CMP EN.SP1(X)\r
+        IFCS\r
+         LDA EN.SP1(X)\r
+        ENDIF\r
+        NEGA\r
+       ENDIF\r
+\r
+       STA EN.XD\r
+\r
+\r
+       LDA EN.IY(X)\r
+       LSRS 2\r
+       STA TEMP1\r
+       LDA EN.MY(X)\r
+       ASLS 3\r
+       ORA TEMP1\r
+       STA TEMP2\r
+\r
+       LDA EN.IY\r
+       LSRS 2\r
+       STA TEMP1\r
+       LDA EN.MY\r
+       ASLS 3\r
+       ORA TEMP1\r
+       SUB TEMP2\r
+\r
+       IFCS\r
+        CMP EN.SP1(X)\r
+        IFCS\r
+         LDA EN.SP1(X)\r
+        ENDIF\r
+       ELSE\r
+        NEGA\r
+        CMP EN.SP1(X)\r
+        IFCS\r
+         LDA EN.SP1(X)\r
+        ENDIF\r
+        NEGA\r
+       ENDIF\r
+\r
+       STA EN.YD\r
+\r
+       JMP 50$\r
+\r
+;  state 1: plunger moving towards wall\r
+\r
+11$:\r
+        DEC16A EN.DEL(X)\r
+        LDA EN.DEL(X)\r
+        IFEQ\r
+        LDA 1+EN.DEL(X)\r
+        IFEQ\r
+         LDA EN.SP1(X)\r
+         CMP EN.MSG\r
+         IFMI\r
+         INC EN.SP1(X)\r
+         ENDIF\r
+\r
+         TR16AI 100 EN.DEL(X)\r
+        ENDIF\r
+        ENDIF\r
\r
+        LDA EN.WCF(X)\r
+        IFNE           ;  if wall was hit\r
+         TRAI 0FF TEMP1 ;  turn right\r
+         LDA EN.DR(X)\r
+         ADD TEMP1\r
+         AND #03\r
+         STA EN.DR(X)\r
+         TRAI 2 EN.STA(X)      ; and follow wall\r
+         TRAI 3 EN.ANV(X)      ; reset turn-counter\r
+        ENDIF\r
+        JSR EN.DRC     ;  direction calc\r
+        JSR EN.PLP\r
+        JMP 50$\r
+\r
+;  state 2:  plunger follows wall\r
+12$:\r
+        DEC16A EN.DEL(X)\r
+        LDA EN.DEL(X)\r
+        IFEQ\r
+        LDA 1+EN.DEL(X)\r
+        IFEQ\r
+         LDA EN.SP1(X)\r
+         CMP EN.MSG\r
+         IFMI\r
+         INC EN.SP1(X)\r
+         ENDIF\r
+\r
+         TR16AI 50 EN.DEL(X)\r
+         LDA RANDOM\r
+         AND #03\r
+         STA EN.DR(X)\r
+        ENDIF\r
+        ENDIF\r
+\r
+       LDA EN.NSF(X)\r
+       IFNE\r
+        TRAI 1 TEMP1\r
+        LDA EN.DR(X)   ;  turn left at new square\r
+        ADD TEMP1\r
+        AND #03\r
+        STA EN.DR(X)\r
+        DEC EN.ANV(X)\r
+        IFEQ\r
+         TRAI 1 EN.STA(X)\r
+        ENDIF\r
+\r
+        ELSE\r
+\r
+       LDA EN.WCF(X)\r
+       IFNE\r
+        TRAI 0FF TEMP1\r
+        LDA EN.DR(X)   ;  turn right at wall\r
+        ADD TEMP1\r
+        AND #03\r
+        STA EN.DR(X)\r
+        TRAI 3 EN.ANV(X)\r
+       ENDIF\r
+       ENDIF\r
+\r
+       JSR EN.DRC\r
+       JSR EN.PLP\r
+\r
+       JMP 50$ \r
+\r
+;  state 3: plunger eating\r
+13$:\r
+       TRAI 0 EN.XD\r
+       STA EN.YD\r
+       DEC EN.DEL(X)\r
+       LDA EN.DEL(X)\r
+       IFEQ\r
+         TRAI 1 EN.STA(X)\r
+         TR16AI 60 EN.DEL(X)\r
+         TRAI 3 EN.SP1(X)\r
+       ENDIF\r
+\r
+       TRAI 10 EN.IX(X)\r
+       STA EN.IY(X)\r
+\r
+       LDY WV.DF2\r
+       LDA DF.ETD(Y)\r
+       LSRS 5          ;  2, 1, or 0\r
+       STA TEMP1\r
+\r
+       LDA DF.ETD(Y)\r
+       SUB EN.DEL(X)\r
+       ASL\r
+       BEGIN\r
+        LSR            ;  3, 2, or 1 LSR's \r
+        DEC TEMP1\r
+       MIEND\r
+\r
+       AND #0F\r
+       TAY\r
+       LDA EN.EAT(Y)\r
+       JSR EN.PCF\r
+       JMP 50$\r
+\r
+;   not used\r
+14$:\r
+       RTS\r
+        \r
+\r
+;  plunger stunned state\r
+15$:\r
+        DEC16A EN.DEL(X)\r
+        LDA EN.DEL(X)\r
+        IFEQ\r
+        LDA 1+EN.DEL(X)\r
+        IFEQ\r
+         TRAI 1 EN.STA(X)\r
+         TRAI 1 EN.SP1(X)\r
+         TR16AI 50 EN.DEL(X)\r
+         LDA RANDOM\r
+         AND #03\r
+         STA EN.DR(X)\r
+        ENDIF\r
+        ENDIF\r
+\r
+       LDA #80\r
+       JSR EN.PCF\r
+\r
+       RTS\r
+\r
+32$:   .BYTE 0,1,2,3, 0,1,2,3\r
+;  witch state\r
+16$:\r
+       LDA FRAME\r
+       AND #1F\r
+       IFEQ\r
+       LDA RANDOM\r
+       AND #07\r
+       STA RS.KEY\r
+       LDA #16\r
+       JSR MN.SN1\r
+\r
+       LDA EN.GP1(X)\r
+       ADD #1\r
+       AND #07\r
+       STA EN.GP1(X)\r
+       ENDIF\r
+       LDY EN.GP1(X)\r
+       LDA 32$(Y)\r
+       STA EN.DR(X)\r
+\r
+;  animation\r
+       JSR EN.DRC\r
+       LDA EN.DR(X)\r
+       ADD #5\r
+       STA EN.ANV(X)\r
+       JSR EN.VAN\r
+\r
+       JMP 50$\r
+\r
+\r
+;  honey\r
+17$:\r
+       LDA FRAME\r
+       AND #030\r
+       LSRS 2          ;  0,4,8, or 0C\r
+       STA TEMP1\r
+       LDA #176.\r
+       ADD TEMP1\r
+       JSR EN.PCF\r
+\r
+       RTS\r
+\r
+; swarm\r
+18$:\r
+       DEC16A EN.DEL(X)\r
+       LDA EN.DEL(X)\r
+       IFEQ\r
+       LDA 1+EN.DEL(X)\r
+       IFEQ\r
+        TRAI 1 EN.LMD(X)\r
+        JSR EN.CCB\r
+       ENDIF\r
+       ENDIF\r
+\r
+       LDA FRAME\r
+       AND #0C\r
+;      LSR             ; 0,4,8 OR C\r
+\r
+       ADD #128.+68.\r
+       JSR EN.PCF\r
+\r
+       LDY WV.DF2\r
+       LDA 1+WV.TIM\r
+       LSR\r
+       ADD DF.SWS(Y)\r
+       CMP #10\r
+       IFCS\r
+       LDA #10\r
+       ENDIF\r
+       STA EN.SP1(X)\r
+\r
+       JMP 45$\r
+\r
+37$:   .BYTE 228.,230.,232.,234.,234.,234.,236.,238.\r
+;  crystal ball, state 9\r
+19$:\r
+       LDA #0\r
+       JSR EN.PCF\r
+       LDA FRAME\r
+       AND #70\r
+       LSRS 4\r
+       TAY\r
+       LDA 37$(Y)\r
+       STA EN.PC3(X)\r
+       ADD #1\r
+       STA EN.PC4(X)\r
+\r
+       LDA FRAME\r
+       AND #03\r
+       IFEQ\r
+        TRAM EN.CMS TEMP1\r
+\r
+        LDA EN.MX\r
+        SUB EN.MX(X)\r
+        IFMI\r
+         LDA EN.GP1(X)\r
+         SUB #1\r
+        ELSE\r
+         CMP #1\r
+         IFPL\r
+          LDA EN.GP1(X)\r
+          ADD #1\r
+         ELSE\r
+          LDA EN.GP1(X)\r
+         ENDIF\r
+        ENDIF\r
+        JSR GP.TRC\r
+        STA EN.GP1(X)\r
+\r
+;  y coordinate\r
+\r
+        LDA EN.MY\r
+        SUB EN.MY(X)\r
+        IFMI\r
+         LDA EN.GP2(X)\r
+         SUB #1\r
+        ELSE\r
+         CMP #1\r
+         IFPL\r
+          LDA EN.GP2(X)\r
+          ADD #1\r
+         ELSE\r
+          LDA EN.GP2(X)\r
+         ENDIF\r
+        ENDIF\r
+        JSR GP.TRC\r
+        STA EN.GP2(X)\r
+       ENDIF\r
+\r
+       TRAM EN.GP1(X) EN.XD\r
+       TRAM EN.GP2(X) EN.YD\r
+       RTS\r
+\r
+;  state 0A: stationary hat\r
+20$:\r
+       LDA #0\r
+       JSR EN.PCF\r
+       LDA FRAME\r
+       AND #030\r
+       LSRS 3          ;  0,2,4 OR 6\r
+       STA TEMP1\r
+       LDA #109.\r
+       ADD TEMP1\r
+       STA EN.PC3(X)\r
+       ADC #1\r
+       STA EN.PC4(X)\r
+       RTS\r
+\r
+21$:\r
+       ;  state 0B: cauldron\r
+       LDA FRAME\r
+       AND #08\r
+       LSRS 2          ;  0 or 2\r
+       STA TEMP1\r
+       LDA #128.+12.\r
+       ADD TEMP1\r
+       STA EN.PC3(X)\r
+       ADC #1\r
+       STA EN.PC4(X)\r
+       LDA #121.\r
+       STA EN.PC1(X)\r
+       ADC #1\r
+       STA EN.PC2(X)\r
+\r
+       RTS\r
+\r
+;  state 0C: skeleton\r
+22$:\r
+       TRAI 02 EN.SP1(X)\r
+\r
+\r
+       LDA FRAME\r
+       AND #0F\r
+       IFEQ\r
+       LDA RANDOM\r
+       AND #3\r
+       IFEQ\r
+        ADD #2\r
+       ENDIF\r
+       SUB #2\r
+       ADD EN.DR(X)\r
+       AND #3\r
+       STA EN.DR(X)\r
+       ENDIF\r
+\r
+       JSR EN.DRC\r
+;  animation\r
+       LDA FRAME\r
+       AND #030\r
+       LSRS 2          ; 0 4 8 OR 0C\r
+       STA TEMP1\r
+       LDA #128.+84.\r
+       ADD TEMP1\r
+       JSR EN.PCF\r
+\r
+       JMP 50$\r
+\r
+39$:   .BYTE 125.,128.+64.,123.        ; 500,1000,3000\r
+;  D:  score display\r
+23$:\r
+       LDA #128.+64.\r
+       JSR EN.PCF\r
+       LDY EN.ANV(X)\r
+       LDA 39$(Y)\r
+       STA EN.PC1(X)\r
+       ADD #1\r
+       STA EN.PC2(X)\r
+\r
+       DEC EN.DEL(X)\r
+       IFEQ\r
+        TRAI 3 EN.LMD(X)       ;  it disappears\r
+        STA EN.DEA(X)\r
+        TR16AM EN.MA2(X) EZ.MA2\r
+        JSR EN.CCB             ;  clear col bit\r
+       ENDIF\r
+       RTS\r
+24$:\r
+\r
+;  state 0E: ghost\r
+       TRAI 05 EN.SP1(X)\r
+       LDA FRAME\r
+       AND #03\r
+       IFEQ\r
+;      LDA EN.GP1(X)\r
+;      ADD #1\r
+       LDA RANDOM\r
+       AND #07\r
+       STA EN.GP1(X)\r
+       ENDIF\r
+       LDY EN.GP1(X)\r
+       LDA 32$(Y)\r
+       STA EN.DR(X)\r
+\r
+       JSR EN.DRC\r
+;  animation\r
+       LDA FRAME\r
+       AND #030\r
+       LSRS 2          ; 0 4 8 OR 0C\r
+       STA TEMP1\r
+       LDA #128.+112.\r
+       ADD TEMP1\r
+       JSR EN.PCF\r
+\r
+       JMP 50$\r
+\r
+25$:\r
+\r
+;  dummy state\r
+26$:\r
+       RTS\r
+\r
+;  table of addresses for state handlers\r
+1$:    10$-1,11$-1,12$-1,13$-1,14$-1,15$-1\r
+       16$-1,17$-1,18$-1,19$-1\r
+       20$-1,21$-1,22$-1,23$-1,24$-1,25$-1,26$-1\r
+\r
+50$:\r
+       TRAI 0C TEMP1   ;  truncate difs\r
+       LDA EN.XD\r
+       JSR GP.TRC\r
+       STA EN.XD\r
+\r
+       LDA EN.YD\r
+       JSR GP.TRC\r
+       STA EN.YD       \r
+\r
+       RTS\r
+\r
+;----------------------\r
+;  fill pictures with data\r
+EN.PCF:\r
+       STA EN.PC1(X)\r
+       BEQ 10$\r
+       ADD #1\r
+       STA EN.PC2(X)\r
+       ADC #1\r
+       STA EN.PC3(X)\r
+       ADC #1\r
+       STA EN.PC4(X)\r
+       RTS\r
+10$:\r
+       STA EN.PC2(X)\r
+       STA EN.PC3(X)\r
+       STA EN.PC4(X)\r
+       RTS\r
+\r
+;----------------------------------\r
+;  calculate difs given direction\r
+;  0 r 1 b 2 l 3 f\r
+EN.DRC:\r
+       LDA EN.DR(X)\r
+       IFEQ\r
+        TRAI 0 EN.XD\r
+        TRAM EN.SP1(X) EN.YD\r
+        JMP 50$\r
+       ENDIF\r
+       \r
+       CMP #1\r
+       IFEQ\r
+        LDA EN.SP1(X)\r
+        NEGA\r
+        STA EN.XD\r
+        TRAI  0 EN.YD\r
+        JMP 50$\r
+       ENDIF\r
+\r
+       CMP #2\r
+       IFEQ\r
+        TRAI 0 EN.XD\r
+        LDA EN.SP1(X)\r
+        NEGA\r
+        STA EN.YD\r
+        JMP 50$\r
+       ENDIF\r
+\r
+       CMP #3\r
+       IFEQ\r
+        TRAM EN.SP1(X) EN.XD\r
+        TRAI 0 EN.YD\r
+        JMP 50$\r
+       ENDIF\r
+\r
+50$:\r
+       RTS\r
+\r
+\r
+;-----------------------\r
+;  life mode calculation\r
+EN.LMC:\r
+       LDA EN.LMD(X)\r
+       IFEQ            ;  if alive skip this\r
+        RTS\r
+       ENDIF\r
+\r
+       TRAI 0 EN.XD\r
+       STA EN.YD\r
+\r
+       LDA EN.LMD(X)\r
+       CMP #1          ;  if dying rise to top\r
+       IFNE\r
+        JMP 40$\r
+       ENDIF\r
+\r
+       TXA\r
+       IFEQ            ;  player rises to top, then dies\r
+         LDA EN.DEL\r
+         IFEQ\r
+          LDA EN.Y\r
+          ADD #8\r
+          STA EN.Y\r
+          CMP #0FF-18\r
+          IFCS\r
+           LDA #0\r
+           JSR EN.PCF\r
+           TRAI 3 EN.LMD\r
+           JSR GM.DT0\r
+          ENDIF\r
+         ELSE\r
+          DEC EN.DEL\r
+         ENDIF\r
+\r
+       ;  creature dying\r
+       ELSE\r
+        JSR EN.CCB\r
+        LDA EN.Y(X)\r
+        CMP #0FF-24\r
+        IFCS\r
+         TRAI 3 EN.LMD(X)\r
+        ELSE                   ;  rise to top\r
+         ADD #4\r
+         STA EN.Y(X)\r
+        ENDIF\r
+\r
+       ENDIF\r
+       RTS\r
+  40$:         ;  if being born, then come in from top\r
+\r
+       LDA EN.LMD(X)\r
+       CMP #2\r
+       IFEQ\r
+\r
+       LDA EN.VP(X)\r
+       ADD EN.HEI(X)\r
+       STA TEMP1\r
+\r
+       LDA EN.STA(X)\r
+       CMP #8\r
+       IFEQ\r
+        LDA #8         ;  delete this if really pressed\r
+        LDY WV.DF2\r
+        CPY #4\r
+        IFCC\r
+        LDA WV.TIM+1\r
+        CMP #12\r
+        IFCC\r
+        LDA #2\r
+        ENDIF\r
+        ENDIF\r
+       ELSE\r
+        LDA #4\r
+       ENDIF\r
+       STA TEMP2\r
+\r
+       LDA EN.Y(X)\r
+       SUB TEMP2\r
+       STA EN.Y(X)\r
+       CMP #-28\r
+       IFPL\r
+        CMP #-28+8     ;  between -4 and -1\r
+        IFMI\r
+        TRAI 0 EN.BLK(X)       ;  no more blanking\r
+        ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.Y(X)\r
+       SUB #1\r
+       CMP TEMP1       ;  if at destination\r
+       IFCC\r
+        LDA EN.BLK(X)  ;  and visible\r
+        IFEQ\r
+         TRAI 0 EN.LMD(X)\r
+        ENDIF\r
+       ENDIF\r
+\r
+       RTS\r
+\r
+       ENDIF\r
+\r
+;   swarm in limbo  start afresh, after timer\r
+\r
+       LDA EN.STA(X)\r
+       CMP #8\r
+       IFEQ\r
+\r
+       LDA 1+WV.TIM\r
+       CMP #06\r
+       IFCC\r
+        LDA WV.TIM     ;   check only every 4 secs\r
+        IFEQ\r
+        LDA 4+EN.STA\r
+        CMP #7         ;   if honey there\r
+        ENDIF\r
+       ELSE\r
+        LDA #0         ;   or too much time\r
+       ENDIF\r
+       IFEQ\r
+\r
+       LDA WV.TIM+1\r
+       CMP #1          ;  after 4 secs, come out anyway\r
+       IFCS\r
+       LDA EN.EWM\r
+       IFEQ            ;  not while eow in progress\r
+        LDA EN.DEA(X)\r
+        IFEQ\r
+         TRAI 2 EN.LMD(X)      ;  start to scroll down\r
+         JSR EN.INR            ;  re-init position\r
+         LDA #4\r
+         JSR MN.SN1            ;  start bee warning sound\r
+        ENDIF\r
+        ENDIF\r
+        ENDIF\r
+       ENDIF\r
+       ENDIF\r
+\r
+       RTS\r
+\r
+;---------------\r
+;  clear col bit\r
+EN.CCB:\r
+       LDY #0          ; clear collision bit\r
+       LDA @EZ.MA2(Y)\r
+       AND #^B11110111\r
+       STA @EZ.MA2(Y)\r
+       RTS\r
+\r
+\r
+;---------------------------------- \r
+;   calculate picture for animation\r
+\r
+;----------------------------------\r
+.RADIX 10\r
+EN.TBL:        .BYTE 1,5,25,29,17,21,9,13\r
+EN.DTL:        \r
+       .BYTE 105.,105.,85.,81.\r
+       .BYTE 101.,101.,85.,81.\r
+       .BYTE 97.,93.,93.,81.\r
+       .BYTE 89.,89.,85.,81.\r
+.RADIX 16\r
+\r
+\r
+EN.PUP:\r
+       LDA EN.LMD\r
+       CMP #1\r
+       IFEQ\r
+        LDA EN.DEL\r
+        IFNE\r
+         LSRS 5        ;  input 0-7F, output 0-3\r
+         AND #03       ;  just in case\r
+         STA TEMP1\r
+         LDA WV.LIV\r
+         CMP #4\r
+         IFCS\r
+          LDA #4\r
+         ENDIF\r
+         SUB #1\r
+         ASLS 2\r
+         ADD TEMP1\r
+         TAY\r
+         LDA EN.DTL(Y)\r
+        JSR EN.PCF\r
+        ENDIF\r
+        RTS\r
+       ENDIF\r
+\r
+;  get one of four directions\r
+       LDA EN.AND(X)\r
+       ASL\r
+       STA TEMP5\r
+\r
+;  get step,  left-right\r
+       LDA #0\r
+       LDY EN.JFL\r
+       IFEQ            ;  only if not jumping\r
+       LDA EN.IX\r
+       ADD EN.IY\r
+       AND #10\r
+       LSRS 4\r
+       ENDIF\r
+       ADD TEMP5\r
+\r
+;  picture\r
+       TAY\r
+       LDA EN.TBL(Y)\r
+       ADD #2\r
+       STA EN.PC3(X)\r
+       ADC #1\r
+       STA EN.PC4(X)\r
+       LDY EN.CDL\r
+       IFEQ    \r
+        SUB #3\r
+       ELSE\r
+        LDA #109.\r
+       ENDIF\r
+       STA EN.PC1(X)\r
+       ADD #1\r
+       STA EN.PC2(X)\r
+       RTS\r
+\r
+;-----------------------\r
+;  animation data table\r
+EN.ANT:\r
+; 0-5 tree\r
+       .BYTE 21,25,29,2D,75\r
+\r
+; 6-9 witch\r
+       .BYTE 41,31,49,39\r
+\r
+\r
+;-------------------\r
+;  various animation\r
+EN.VAN:\r
+       LDY EN.ANV(X)\r
+       LDA EN.ANT(Y)\r
+       JSR EN.PCF\r
+       RTS\r
+\r
+;--------------------------\r
+;  check X border condition\r
+EN.CXI:\r
+       CMP #14\r
+       BMI 40$\r
+                       ; larger than #17\r
+       TR16AM EZ.MAT,EZ.BOR\r
+       AD16AI EZ.BOR,16\r
+       JSR EN.B2C\r
+\r
+       SUBIN EN.HEI(X),EZ.BOR\r
+       BINT 2,10$\r
+       LDY #0\r
+       LDA @EZ.BO2(Y)\r
+       AND #20\r
+       STA EN.TFP(X)\r
+       BNE 20$         ; if tunnel, no collision\r
+5$:\r
+       TRAI 13 EN.IX(X)        ;  collision\r
+       TRAI 1 EN.WCF(X)\r
+       JMP 40$\r
+10$:\r
+       TRAI 0,EN.TFP(X)\r
+\r
+20$:\r
+       LDA EN.COB\r
+       BNE 5$\r
+\r
+       JSR EN.XIN      ; increment X, modify EN.IX etal\r
+40$:\r
+       RTS\r
+\r
+\r
+EN.CXD:\r
+       CMP #0C\r
+       BPL 40$\r
+\r
+       TR16AM EZ.MAT,EZ.BOR    ; smaller than 16\r
+       SB16AI EZ.BOR,16\r
+       JSR EN.B2C\r
+\r
+       SUBIN EN.HEI(X),EZ.BOR\r
+       BINT 2,10$\r
+       LDY #0\r
+       LDA @EZ.BO2(Y)\r
+       AND #20\r
+       STA EN.TFP(X)\r
+       BNE 20$         ; if tunnel, no collision\r
+5$:\r
+       TRAI 0C EN.IX(X)        ; collision\r
+       TRAI 1 EN.WCF(X)\r
+       JMP 40$\r
+10$:\r
+       TRAI 0 EN.TFP(X)\r
+20$:\r
+       LDA EN.COB\r
+       BNE 5$\r
+       JSR EN.XDE      ; decrement X, modify EN.IX etal\r
+40$:\r
+       RTS\r
+\r
+\r
+\r
+;----------------------------\r
+;  check Y border condition -\r
+;----------------------------\r
+EN.CYI:\r
+       CMP #14\r
+       BMI 40$\r
+                       ; larger than 31-8\r
+       TR16AM EZ.MAT,EZ.BOR\r
+       INC16  EZ.BOR\r
+       JSR EN.B2C\r
+\r
+       SUBIN EN.HEI(X),EZ.BOR\r
+       BINT 2,10$\r
+       LDY #0\r
+       LDA @EZ.BO2(Y)\r
+       AND #20\r
+       STA EN.TFP(X)\r
+       BNE 20$         ; if tunnel, no collision\r
+5$:\r
+       TRAI 13 EN.IY(X)        ; collision\r
+       TRAI 1 EN.WCF(X)\r
+       JMP 40$\r
+10$:\r
+       TRAI 0 EN.TFP(X)\r
+20$:\r
+       LDA EN.COB\r
+       BNE 5$\r
+       JSR EN.YIN\r
+40$:\r
+       RTS\r
+\r
+EN.CYD:\r
+       CMP #0C\r
+       BPL 40$\r
+\r
+       TR16AM EZ.MAT,EZ.BOR    ; smaller than 12\r
+       DEC16A EZ.BOR\r
+       JSR EN.B2C\r
+\r
+       SUBIN EN.HEI(X),EZ.BOR\r
+       BINT 2,10$\r
+       LDY #0\r
+       LDA @EZ.BO2(Y)\r
+       AND #20\r
+       STA EN.TFP(X)\r
+       BNE 20$         ; if tunnel, no collision\r
+\r
+5$:\r
+       TRAI 0C EN.IY(X)        ; collision\r
+       TRAI 1 EN.WCF(X)\r
+       JMP 40$\r
+10$:\r
+       LDA EN.COB      ;  collision with other entities\r
+       BNE 5$\r
+       TRAI 0 EN.TFP(X)\r
+20$:\r
+       JSR EN.YDE\r
+40$:\r
+       RTS\r
+\r
+\r
+;----------------------------\r
+; increment in  X-direction -\r
+;----------------------------\r
+EN.XIN:\r
+       LDA EN.IX(X)\r
+       SUB #20\r
+       BMI 40$\r
+\r
+       STA EN.IX(X)\r
+\r
+       LDA EN.HP(X)\r
+       SUB #04\r
+       STA EN.HP(X)\r
+\r
+       LDA EN.VP(X)\r
+       SUB #04\r
+       STA EN.VP(X)\r
+\r
+       INC EN.MX(X)\r
+       JSR EN.MUP              ;  new square\r
+       TRAI 0 EN.AND(X)        ;  animation direction\r
+40$:\r
+       RTS\r
+\r
+\r
+\r
+;--------------------------\r
+;  decrement in X direction\r
+EN.XDE:\r
+       LDA EN.IX(X)\r
+       BPL 40$\r
+       ADD #20\r
+       STA EN.IX(X)\r
+\r
+       LDA EN.HP(X)\r
+       ADD #04\r
+       STA EN.HP(X)\r
+\r
+       LDA EN.VP(X)\r
+       ADD #04\r
+       STA EN.VP(X)\r
+\r
+       DEC EN.MX(X)\r
+       JSR EN.MUP              ;  new square\r
+       TRAI 2 EN.AND(X)        ;  animation direction\r
+40$:\r
+       RTS\r
+\r
+\r
+;------------------------------\r
+;  increment in Y direction   -\r
+;------------------------------\r
+EN.YIN:\r
+       LDA EN.IY(X)\r
+       SUB #20\r
+       BMI 40$\r
+       STA EN.IY(X)\r
+\r
+       LDA EN.HP(X)\r
+       ADD #08\r
+       STA EN.HP(X)\r
+\r
+       DEC EN.VP(X)\r
+       DEC EN.VP(X)\r
+\r
+       INC EN.MY(X)\r
+       JSR EN.MUP              ;  new square\r
+       TRAI 3 EN.AND(X)        ;  animation direction\r
+40$:\r
+       RTS\r
+\r
+;------------------------------\r
+;  decrement in Y direction   -\r
+;------------------------------\r
+EN.YDE:\r
+       LDA EN.IY(X)\r
+       BPL 40$\r
+\r
+       ADD #20\r
+       STA EN.IY(X\r
+\r
+       LDA EN.HP(X\r
+       SUB #08\r
+       STA EN.HP(X)\r
+\r
+       INC EN.VP(X)\r
+       INC EN.VP(X)\r
+\r
+       DEC EN.MY(X)\r
+       JSR EN.MUP      ;  new sqare update\r
+       TRAI 1 EN.AND(X)        ;  animation direction\r
+40$:\r
+       RTS\r
+\r
+\r
+;-------------------------------\r
+;  routine to update ez.bo2\r
+;  and check for collision bit\r
+EN.B2C:\r
+       TR16AM EZ.BOR EZ.BO2\r
+       AD16AI EZ.BO2 16*16\r
+       LDY #0\r
+       LDA @EZ.BO2(Y)\r
+       AND #08\r
+       STA EN.COB\r
+       TXA\r
+       IFEQ\r
+        STA EN.COB\r
+       ENDIF\r
+\r
+\r
+       RTS\r
+\r
+;--------------------------------------------------\r
+;  routine to update for new square\r
+EN.MUP:\r
+       LDY #0\r
+       TXA\r
+       IFNE\r
+               ; clear collision bit\r
+       LDA @EZ.MA2(Y)\r
+       AND #^B11110111\r
+       STA @EZ.MA2(Y)\r
+       ENDIF\r
+\r
+       TR16AM EZ.BOR,EZ.MAT\r
+       TR16AM EZ.BO2,EZ.MA2\r
+\r
+       TXA\r
+       IFNE\r
+       LDA @EZ.MA2(Y)  ;  set collision bit, except player\r
+       ORA #^B00001000\r
+       STA @EZ.MA2(Y)\r
+       ENDIF\r
+\r
+       LDA @EZ.MA2(Y)\r
+       AND #20\r
+       IFEQ\r
+        STA EN.TFL(X)\r
+       ELSE            ; if tunnel\r
+        LDA EN.TFP(X)    ; update tunnel flag\r
+        IFNE\r
+         TRAI 1 EN.TFL(X)\r
+        ENDIF\r
+        LDA EN.TFL(X)    ; and mt priority\r
+        IFNE\r
+         TRAI 0FF EN.PR1(X) \r
+         JMP 50$\r
+        ENDIF\r
+       ENDIF\r
+\r
+       LDA  @EZ.MA2(Y)\r
+       AND #40\r
+       IFNE\r
+        TRAI 0 EN.PR1(X)\r
+       ELSE\r
+        TRAI 0FF EN.PR1(X)\r
+       ENDIF\r
+\r
+50$:\r
+       TRAI 1 EN.NSF(X)        ;  new square flag\r
+\r
+       RTS\r
+\r
+;----------------------------------------\r
+;  output EN\r
+;  convert to screen coordinates\r
+;  INPUT  EN.HP VP HEI HOF IX IY\r
+;  OUTPUT EN.X EN.Y\r
+EN.OUT:\r
+       LDA EN.BLK(X)\r
+       BNE 10$         ;  blanking\r
+\r
+       LDA EN.LMD(X)\r
+       CMP #3          ;  if dead, no picture\r
+       IFEQ\r
+10$:     LDA #0\r
+         JSR EN.PCF\r
+       ENDIF\r
+\r
+       LDA EN.LMD(X)\r
+                       ;  if unalive, skip this\r
+       IFNE\r
+        JMP 50$\r
+       ENDIF\r
+\r
+       LDA EN.HEI(X)\r
+       ADD EN.HOF(X)\r
+       STA EN.HTO(X)\r
+\r
+       LDA EN.IY(X)    ; EN.IY/4\r
+       LSRS 2\r
+       STA EN.TMP\r
+\r
+       LDA EN.HP(X)\r
+       ADD EN.TMP\r
+       TAY             ; + EN.HP\r
+\r
+       LDA EN.IX(X)\r
+       LSRS 3\r
+       STA EN.TMP      ; EN.IX/8\r
+\r
+       TYA\r
+       SUB EN.TMP\r
+       STA EN.X(X)     ; EN.HP+EN.IY/4-EN.IX/8\r
+\r
+       LDA EN.VP(X)\r
+       SUB EN.TMP\r
+       TAY             ; EN.VP-EN.IX/8\r
+\r
+       LDA EN.IY(X)\r
+       ADD #08\r
+       LSRS 4\r
+       STA EN.TMP\r
+       TYA\r
+       SUB EN.TMP\r
+       ADD EN.HTO(X)\r
+       STA EN.Y(X)     ; -(EN.IY+8)/16+HEIGHT\r
+\r
+50$:\r
+       RTS\r
+\r
+\r
+;------------\r
+;  detect gem\r
+EN.CDT:\r
+       LDA EN.LMD(X)\r
+       IFNE\r
+       RTS             ; must be alive to see gems\r
+       ENDIF\r
+\r
+       LDA EN.STA(X)\r
+       CMP #06         ; only gem-eaters and trees see gems\r
+       IFPL\r
+       CMP #9\r
+       IFNE\r
+       RTS\r
+       ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.TFL(X)\r
+       IFEQ            ; if not in tunnel\r
+       LDA @EZ.MA2(Y)\r
+       AND #10\r
+       IFNE            ; first time there\r
+       LDA @EZ.MA2(Y)\r
+       AND #^B11101111\r
+       STA @EZ.MA2(Y)\r
+\r
+\r
+       CPX #0\r
+       IFEQ            ;  bear\r
+        LDA SC.GEM\r
+        CMP #99\r
+        IFCC\r
+         SED\r
+         ADC #1\r
+         CLD\r
+         STA SC.GEM\r
+        ENDIF\r
+        LDA #0\r
+        STA 1+SC.INC\r
+        STA 2+SC.INC\r
+        TRAM SC.GEM SC.INC\r
+        JSR SC.UPD\r
+        JSR MN.SN2     ;  sound for gem\r
+       ELSE            ;  others\r
+        JSR MN.SN3\r
+\r
+        LDA EN.STA(X)\r
+        CMP #1\r
+        IFNE\r
+        CMP #2\r
+        IFNE\r
+        JMP 10$\r
+        ENDIF\r
+        ENDIF\r
+\r
+         LDY WV.DF2\r
+         TRAM DF.ETD(Y) EN.DEL(X)\r
+         TRAI 0 1+EN.DEL(X)\r
+         TRAI 3 EN.STA(X)\r
+ 10$:\r
+       ENDIF\r
+\r
+       JSR EN.COE              ;  erase gem\r
+       INC SN.GFL\r
+\r
+       DEC16A CE.COC           ;  dec gem count\r
+\r
+       LDA CE.COC\r
+       ORA 1+CE.COC\r
+       IFEQ\r
+        STX EN.LDF\r
+       ENDIF\r
+       \r
+       ENDIF\r
+       ENDIF\r
+       RTS\r
+\r
+;-----------\r
+;  erase gem\r
+EN.COE:\r
+       LDY #0\r
+       LDA @EZ.MA2(Y)\r
+       JSR CL.PR\r
+\r
+       LDA EN.HP(X)\r
+       ADD #06\r
+       STA XB\r
+\r
+       LDA EN.VP(X)\r
+       SUB #03\r
+       ADD EN.HEI(X)\r
+       NEGA\r
+       STA YB\r
+       LDA FC.BV3\r
+       STA VB\r
+       INC XB\r
+       STA VB\r
+       INC XB\r
+       STA VB\r
+\r
+       DEC YB\r
+       INC XB\r
+       STA VB\r
+       DEC XB\r
+       STA VB\r
+       DEC XB\r
+       STA VB\r
+       DEC XB\r
+       STA VB\r
+       DEC XB\r
+       STA VB\r
+\r
+       DEC YB\r
+       INC XB  \r
+       STA VB\r
+       INC XB\r
+       STA VB\r
+       INC XB\r
+       STA VB\r
+\r
+       RTS\r
+\r
+\r
+\r
+;-------------------\r
+;  explanation board\r
+EN.BEX: .BYTE 20,20,0D8,0A0,0B0,020,40,70,90,0C0\r
+EN.BEY: .BYTE 0B8,090,90,70,058,038, 2,2,2,2\r
+EN.BEP:        .BYTE 107.,1,49.,80+16.,80\r
+       .BYTE 80+68.,33.,33.,33.,33.\r
+EN.ZFL:        .BYTE 0\r
+EN.BEK:        .BYTE 07,1F,1F,1F,07,0F,0F,0F,0F,0F\r
+\r
+EN.BEM:\r
+       LDX #0\r
+       BEGIN\r
+         TXA\r
+         LSR\r
+         TAY\r
+         TRAM EN.BEX(Y) EN.X(X)\r
+         TRAM EN.BEY(Y) EN.Y(X)\r
+         LDA EN.ANV(X)\r
+         ADD EN.BEP(Y)\r
+         JSR EN.PCF\r
+         LDA EN.ZFL(Y)\r
+         IFEQ\r
+          STA EN.PC1(X)\r
+          STA EN.PC2(X)\r
+         ENDIF\r
+\r
+         CPX #08\r
+         IFEQ\r
+          LDA FRAME\r
+          AND #3F\r
+          LSR\r
+          CMP #10\r
+          IFPL\r
+           NEGA\r
+           ADD #20\r
+          ENDIF\r
+          ADD EN.BEX(Y)\r
+          STA EN.X(X)\r
+         ENDIF\r
+\r
+         LDA EN.ANV(X)\r
+         IFPL\r
+          LDA FRAME\r
+          AND #0F\r
+          IFEQ\r
+           LDA EN.ANV(X)\r
+           CPY #0\r
+           IFEQ\r
+            ADD #2\r
+           ELSE\r
+            ADD #4\r
+           ENDIF\r
+           AND EN.BEK(Y)\r
+           STA EN.ANV(X)\r
+          ENDIF\r
+         ENDIF\r
+       INXS 2\r
+       CPX EN.NUM\r
+       PLEND\r
+       RTS\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/CET.MAC b/CET.MAC
new file mode 100644 (file)
index 0000000..1c5a6f9
Binary files /dev/null and b/CET.MAC differ
diff --git a/CG.MAC b/CG.MAC
new file mode 100644 (file)
index 0000000..a7501f6
--- /dev/null
+++ b/CG.MAC
@@ -0,0 +1,619 @@
+;  filename  CG.MAC\r
+;  global definitions and memory allocation\r
+;------------------------------------------\r
+\r
+CG.PC=1                ;  PC = 0  wirewrap, 1  PC board\r
+CG.ROM=1       ;  0  dev sys,  1  ROMs\r
+\r
+CG.MUS=1       ;  music on/off\r
+CG.ST=1        ;  self-test on/off\r
+\r
+;  general purpose definitions\r
+;      masks\r
+MD0    = 01\r
+MD1    = 02\r
+MD2    = 04\r
+MD3    = 08\r
+MD4    = 10\r
+MD5    = 20\r
+MD6    = 40\r
+MD7    = 80\r
+\r
+;  checksums\r
+CHK01  = 082?7F?01\r
+CHK02  = 0AA?02\r
+CHK03  = 017?03\r
+CHK04  = 008\r
+CHK05  = 0EC\r
+\r
+;-----------------------------\r
+;  memory map equates\r
+\r
+;  POKEY\r
+\r
+POKEY0 = 9800\r
+POKCT0 = 0F+POKEY0\r
+\r
+POKEY1 = 9A00\r
+POKCT1 = 0F+POKEY1\r
+\r
+RANDOM = 0A+POKEY0\r
+\r
+;  TOPOROIDS hardware addresses\r
+XB     = 0     ;  bit mode X position 0-255\r
+YB     = 1     ;  bit mode Y position 24-255\r
+VB     = 2     ;  bit mode value (0F,1F,2F,...,FF)\r
+\r
+.IF EQ,CG.PC\r
+.IFT\r
+;  wirewrap\r
+HW.BHR = 9F06          ; bothram\r
+HW.VSC = 9C80          ; vert scroll\r
+HW.HSC = 03            ; hor  scroll\r
+\r
+HW.FLP = 9F04          ; flip\r
+HW.SIR = 9F05          ; EEROM write inhibit\r
+\r
+HW.WDC = 9E00          ; watchdog clear\r
+WCHDOG=HW.WDC\r
+\r
+HW.IAC = 9D80          ; interrupt acknowledge\r
+\r
+HW.TBH = 9400          ;  trackball horizontal\r
+HW.TBV = 9401          ;  trackball vertical\r
+HW.VBL = 9601          ; Vblank, D7=0\r
+                       ; buttons: top D3=0, bot D2=0\r
+                       ; start:   top D6=0, bot D5=0\r
+MA.VBL = MD7\r
+MA.BUT = MD3\r
+MA.ST1 = MD6\r
+MA.ST2 = MD5\r
+\r
+HW.ST1 = HW.VBL\r
+HW.ST2 = HW.VBL\r
+\r
+HW.BSL = 9E87          ; bank select 0,FF\r
+\r
+HW.AX  = 9F00          ; autoinc x, 0 on, FF off\r
+HW.AY  = 9F01          ;         y, 0 on, FF off\r
+HW.XIN = 9F02          ; xinc  , 0 inc, FF dec\r
+HW.YIN = 9F03          ; yinc  , 0 inc, FF dec\r
+\r
+HW.TL  = 9E80          ; Trackball light 0=off,  0FF=on\r
+\r
+HW.JOU = 9601          ; joystick up\r
+MA.JOU = MD1\r
+HW.JOD = 9601          ; down\r
+MA.JOD = MD0\r
+HW.JOL = 9600          ; left\r
+MA.JOL = MD5\r
+HW.JOR = 9600          ; right\r
+MA.JOR = MD4\r
+\r
+HW.STS = 9600          ;  self test\r
+MA.STS = MD7\r
+\r
+;  Color RAM\r
+CL.RAM = 9F80\r
+\r
+;  motion objects\r
+MT.BU0 = 8E00  ; motion object buffer  0\r
+MT.BU1 = 8F00  ;                       1\r
+MT.BSL = 9F07  ;  buffer select flag\r
+\r
+\r
+.IFF\r
+;   PC  memory equates\r
+\r
+HW.BHR = 9F06          ; bothram\r
+HW.VSC = 9D00          ; vert scroll\r
+HW.HSC = 9C80          ; hor  scroll\r
+\r
+HW.FLP = 9F04          ; flip\r
+HW.SIR = 9F05          ; EEROM write inhibit\r
+\r
+HW.WDC = 9E00          ; watchdog clear\r
+WCHDOG=HW.WDC\r
+\r
+HW.IAC = 9D80          ; interrupt acknowledge\r
+\r
+HW.TBV = 9400          ;  trackball vert\r
+HW.TBH = 9401          ;  trackball hor\r
+\r
+HW.VBL = 9600\r
+MA.VBL = MD5\r
+MA.BUT = MD6           ;  left\r
+MA.BU2 = MD7           ;  right\r
+MA.ST1 = MD6           ;  left\r
+MA.ST2 = MD7           ;  right\r
+\r
+HW.ST1 = HW.VBL\r
+HW.ST2 = HW.VBL\r
+\r
+HW.STS = 9600\r
+MA.STS = MD4\r
+\r
+HW.BSL = 9E87          ; bank select 0,FF\r
+\r
+HW.AX  = 9F00          ; autoinc x, 0 on, FF off\r
+HW.AY  = 9F01          ;         y, 0 on, FF off\r
+HW.XIN = 9F02          ; xinc  , 0 inc, FF dec\r
+HW.YIN = 9F03          ; yinc  , 0 inc, FF dec\r
+\r
+HW.TL  = 9E80          ; trackball light, 0=off, FF=on\r
+\r
+;  Color RAM\r
+CL.RAM = 9F80\r
+\r
+;  motion objects\r
+MT.BU0 = 8E00  ; motion object buffer  0\r
+MT.BU1 = 8F00  ;                       1\r
+MT.BSL = 9F07  ;  buffer select flag\r
+\r
+.ENDC\r
+\r
+; EEROM\r
+EE.ROM = 9000\r
+EE.SIR = 9F05          ;  0 .. store inhibit, enable recall\r
+                       ;  0FF .. reverse\r
+EE.RE2 = 9E84          ;  recall, version 2\r
+EE.REC = 9C00          ;  recall, write\r
+EE.SLO = 9E82          ;  store low\r
+EE.SHI = 9E83          ;  store high\r
+\r
+;------------------------------------------\r
+;  Zero page storage etc.\r
+\r
+       .= 04\r
+TS.PXD:        .BLKB 1\r
+TS.PYD:        .BLKB 1\r
+\r
+HW.VSV:        .BLKB 1         ;  vert scroll flag\r
+HW.HSV:        .BLKB 1         ;  hor scroll flag\r
+HW.FLV:        .BLKB 1         ;  cocktail flag\r
+IN.BSL:        .BLKB 1         ;  interrupt bank select flag\r
+\r
+OV.RES:        .BLKB 2         ;  overhead:  remainder\r
+GM.STA:        .BLKB 1         ;  game state\r
+\r
+WV.SIZ=400             ;  size of storage for 1 playfield\r
+WV.STR=0A000           ;  start of split storage\r
+\r
+WV.OFF:        .BLKB 2         ;  wave offset\r
+WV.TIM:        .BLKB 2         ;  wave timer\r
+WV.ATP:        .BLKB 1         ;  attract mode pointer\r
+WV.CIN:        .BLKB 1         ;  color transfer inhibit\r
+\r
+PL.FLG:        .BLKB 1         ;  2-player flag: 0= 1 player game\r
+                       ;                 1= 2 players\r
+PL.UP: .BLKB 1         ;  which player up: 0=player 1\r
+                       ;                   1=player 2\r
+PL.SFL:        .BLKB 1         ;  start flag for player 2\r
+\r
+; CL.TIN:.BLKB 2               ;  color table index\r
+CL.PT1:        .BLKB 2         ;  pointer 1\r
+CL.PT2:        .BLKB 2         ;  pointer 2\r
+\r
+MT.CUR:        .BLKB 1         ;  current motion object buffer 0,1\r
+MT.PRE:        .BLKB 1         ;  previous mt ob buf\r
+MT.PTR:        .BLKB 2         ;  motion object pointer\r
+\r
+ISYNC: .BLKB 1 \r
+SYNC:  .BLKB 1\r
+FRAME: .BLKB 2         ;  frame counter\r
+\r
+CURLIN:        .BLKB 1\r
+LINMOD:        .BLKB 1\r
+\r
+BL.HEI:        .BLKB 1\r
+BL.HST:        .BLKB 1\r
+BL.VST:        .BLKB 1\r
+BL.V1S:        .BLKB 1\r
+BL.V1N:        .BLKB 1\r
+BL.V2S:        .BLKB 1\r
+BL.V2N:        .BLKB 1\r
+BL.ULE:        .BLKB 1\r
+BL.URE:        .BLKB 1\r
+BL.UCR:        .BLKB 1\r
+BL.HRE:        .BLKB 1\r
+BL.HES:        .BLKB 1\r
+BL.HEL:        .BLKB 1\r
+BL.HLE:        .BLKB 1\r
+BL.HLL:        .BLKB 1\r
+\r
+LN.LG1:        .BLKB 1\r
+LN.LG2:        .BLKB 1\r
+LN.LG3:        .BLKB 1\r
+LN.HCR:        .BLKB 1\r
+LN.VCR:        .BLKB 1\r
+LN.CO1:        .BLKB 1\r
+LN.CO2:        .BLKB 1\r
+LN.CO3:        .BLKB 1\r
+\r
+FC.HST:        .BLKB 1\r
+FC.VST:        .BLKB 1\r
+FC.V1S:        .BLKB 1\r
+FC.V1N:        .BLKB 1\r
+FC.V2S:        .BLKB 1\r
+FC.V2N:        .BLKB 1\r
+FC.COH:        .BLKB 1\r
+\r
+FC.BV:\r
+FC.BV3:        .BLKB 1         ;  bit-map value for face 3\r
+FC.BV2:        .BLKB 1         ;       2\r
+FC.BV1:        .BLKB 1         ;       1\r
+FC.BVB:        .BLKB 1         ;       border\r
+FC.BVC:        .BLKB 1         ;       gem\r
+FC.BVR: .BLKB 1                ;       road\r
+FC.BVS:        .BLKB 1         ;       score\r
+\r
+CT.HST = 05C\r
+CT.VST = 086\r
+\r
+CT.TUN:        .BLKB 1\r
+CT.CNT:        .BLKB 1\r
+\r
+CT.ADL:        .BLKB 2\r
+CT.ALL:        .BLKB 2\r
+CT.ARL:        .BLKB 2\r
+CT.ACL:        .BLKB 2\r
+CT.AFL:        .BLKB 2\r
+CT.A2L:        .BLKB 2\r
+CT.ADB:        .BLKB 2\r
+\r
+CT.ROM:        .BLKB 2\r
+CT.RAM:        .BLKB 2\r
+CT.BV3:        .BLKB 1         ; face 3 color (accessible or not)\r
+\r
+CT.HR1:        .BLKB 1         ;  height offset region 1\r
+CT.HR2:        .BLKB 1         ;  height offset region 2\r
+CT.HR3:        .BLKB 1         ;  height offset region 3\r
+CT.GMD:        .BLKB 1         ;  gem regeneration mode\r
+\r
+CR.VST:        .BLKB 1\r
+CR.HST:        .BLKB 1\r
+CR.CNT:        .BLKB 1\r
+\r
+;  the following must be on zero page\r
+EZ.MAT:        .BLKB 2\r
+EZ.MA2:        .BLKB 2\r
+EZ.BOR:        .BLKB 2\r
+EZ.BO2:        .BLKB 2\r
+\r
+; end\r
+\r
+CE.TMP:        .BLKB 1\r
+CE.XD: .BLKB 1\r
+CE.YD: .BLKB 1\r
+CE.COC:        .BLKB 2                 ;  gem count\r
+\r
+TR.XD: .BLKB 1                 ;  trackball deltas\r
+TR.YD: .BLKB 1\r
+EN.JPX:        .BLKB 1                 ;  jumping deltas\r
+EN.JPY:        .BLKB 1\r
+TR.I:  .BLKB 1\r
+TR.J:  .BLKB 1\r
+\r
+EL.MOD:        .BLKB 1\r
+EL.SIT:        .BLKB 1\r
+EL.UPF:        .BLKB 1\r
+       EC.USZ = .-EL.MOD       ; update buffer size\r
+EL.MAT:        .BLKB 2\r
+EL.TOP:        .BLKB 1\r
+EL.BOT:        .BLKB 1\r
+EL.HP: .BLKB 1\r
+EL.VP: .BLKB 1\r
+EL.WAI:        .BLKB 1\r
+EL.PRI:        .BLKB 1\r
+       EC.BSZ = .-EL.MOD       ; buffer size per elevator\r
+\r
+EC.PTR:        .BLKB 2\r
+EW.PTR:        .BLKB 2\r
+EW.NPT:        .BLKB 2\r
+\r
+WR.TPT:        .BLKB 2                 ;  word table pointer\r
+WR.PTR:        .BLKB 2                 ;  word data pointer\r
+WR.LEN:        .BLKB 2                 ;  word length\r
+\r
+MS.PTR:        .BLKB 2                 ;  message pointer\r
+MS.LEN:        .BLKB 2                 ;  message length\r
+AL.PTR:        .BLKB 2\r
+\r
+AL.X:  .BLKB 1                 ;  letter x-position\r
+AL.Y:  .BLKB 1                 ;  y-position\r
+AL.COL:        .BLKB 1                 ;  color\r
+AL.DIG:        .BLKB 1\r
+AL.TMP:        .BLKB 1\r
+AL.LMG:        .BLKB 1                 ;  left margin\r
+\r
+\r
+;  coin section\r
+;  coin configuration flags\r
+OFFSET =1              ;VARS ARE OFFSET BY 1\r
+BONADD =0              ;BONUS ADDER ACTIVE\r
+COIN   =0              ;COIN SWITCHES ARE ACTIVE LOW\r
+COIN67 =0              ;COINS ARE NOT IN D5-D7\r
+COIN01 =1              ;COINS ARE IN D0-D2\r
+EMCTRS =3              ;COIN COUNTERS\r
+SLAM   =0              ;SLAM LO TRUE\r
+CNTINT =0              ;$INTCT already exists\r
+INCLUDE        =1              ;DONT GENERATE .END\r
+QUICK  =1              ;  quick version, coutesy of Dr. B\r
+\r
+;  zero page allocation\r
+$$CRDT:        .BLKB 1         ;TOTAL CREDITS\r
+$PSTSL:        .BLKB 3         ;POST-COIN SLAM TIMERS\r
+$CNSTT:        .BLKB 3         ;COIN DETECTION TIMERS\r
+$CNCT: .BLKB 3         ;COIN COUNTERS FOR PROGRAM\r
+$CMODE:        .BLKB 1         ;COIN MODE\r
+$LMTIM:        .BLKB 1         ;SLAM TIMER ENABLE\r
+\r
+$INTCT::       .BLKB 1\r
+\r
+$CCTIM:        .BLKB 3         ;COIN COUNTER TIMERS\r
+$BCCNT:        .BLKB 1         ;BONUS COIN COUNTER\r
+$BC:   .BLKB 1         ;BONUS COINS ACCRUED\r
+$COINS:        .BLKB 1         ;COIN SWITCH SHADOW\r
+\r
+;  more coin equates\r
+$LMBIT =MD3            ;BIT POSITION OF SLAM\r
+$CNCTR =9E85           ;COUNT COUNTER ADDRESSES\r
+$COINA =$COINS         ;COIN SWITCHES\r
+$LAM   =9600           ;D3=PUSHED\r
+\r
+;  general purpose temporary variables\r
+\r
+TEMP1::        .BLKB 2\r
+TEMP2::        .BLKB 2\r
+TEMP3::        .BLKB 2\r
+TEMP4::        .BLKB 2\r
+TEMP5::        .BLKB 2\r
+\r
+TFLASH:        .BLKB 1         ;  trackball flash mode   0 .. off\r
+                       ;  0FF on,  else flashing\r
+ST.CRF:        .BLKB 1         ;  selftest coinroutine flag\r
+BR.STP:        .BLKB 1         ;  bear stepping variable\r
+SN.GFL:        .BLKB 1         ;  sound flag for background sound\r
+AT.OUT:        .BLKB 1         ;  ?\r
+;  sound variables\r
+\r
+ATRACT::       .BLKB 1\r
+SN.NUM::       .BLKB 1 ;  sound number\r
+AT.PRO:                .BLKB 1\r
+AT.PRT:                .BLKB 1\r
+\r
+.GLOBL RCN,RCS\r
+.GLOBL  RS.KEY,RS.K2,RS.K3,RS.K4\r
+\r
+; EEROM zero page variables\r
+.INCLUDE CEEDEF.MAC\r
+\r
+.IF GE,.-0F0\r
+.ERROR ;  RAM overlap with sounds\r
+.ENDC\r
+\r
+;-------------------\r
+;  other RAM storage\r
+\r
+.=202\r
+;  background display storage\r
+SQ.NUM=0F              ;  sixteen background regions\r
+SQ.LEF:        .BLKB 1         ;  square left border\r
+SQ.RIG:        .BLKB 1         ;  sqare right border\r
+SQ.LS1: .BLKB SQ.NUM+1\r
+SQ.LS2: .BLKB SQ.NUM+1\r
+SQ.LS3: .BLKB SQ.NUM+1\r
+SQ.LS4: .BLKB SQ.NUM+1\r
+\r
+\r
+;  score variables\r
+SC.INC:        .BLKB 3         ;  increment\r
+SC.COI:        .BLKB 1         ;  coin display flag\r
+\r
+SC.NM: .BLKB 3\r
+SC.DIG:        .BLKB 1\r
+SC.FNZ:        .BLKB 1\r
+SC.LEF:        .BLKB 1         ;  number of pixels left to erase\r
+\r
+SC.SCI:        .BLKB 3         ;  current initials\r
+SC.NWP:        .BLKB 1         ;  new position in hs table\r
+SC.WLT:        .BLKB 1         ;  which letter enter?\r
+SC.HSO:        .BLKB 2         ;  track ball pos for hs\r
+SC.HSD:        .BLKB 3         ;  remember initials for player 2\r
+                       ;  display on wave 1\r
+EN.MAX=0A\r
+;  sorting storage\r
+EN.SPT:        .BLKB 16                ; pointers for sorter\r
+EN.SOR:        .BLKB EN.MAX*16         ; histogram sorting storage\r
+\r
+EN.DSX:        .BLKB 1         ;  screen destination of bear\r
+EN.DSY: .BLKB 1\r
+\r
+EN.EWM:        .BLKB 1         ;  end of wave mode\r
+EN.WRF:        .BLKB 1         ;  warp flag\r
+\r
+MN.DEL:        .BLKB 2         ;  main loop delay\r
+MN.MOD:        .BLKB 1         ;  main loop mode, allows combining\r
+                       ;  game states\r
+\r
+CL.SHR:        .BLKB 10*2*2    ;  shadaw color RAM\r
+\r
+CL.OLH:        .BLKB 1         ;  selftest color output values\r
+CL.OLV: .BLKB 1\r
+\r
+ST.PLY:        .BLKB 1         ;  game play flag (0FF=play, 0 atr)\r
+ST.VBC:        .BLKB 1         ;  Vblank count\r
+\r
+WV.SCF:        .BLKB 1         ;  scroll flag 0,1,2,3 (no,r,l,u)\r
+WV.MFL:        .BLKB 1         ;  message flag, 0FF .. display mess\r
+WV.MNM:        .BLKB 1         ;  message number\r
+WV.WAR:        .BLKB 1         ;  warp level\r
+\r
+AR.STA:        .BLKB 1         ;  arrow state\r
+AR.MAX:        .BLKB 1         ;  number of arrow states\r
+ST.COP:        .BLKB 1         ;  self-test coin option\r
+\r
+EEBUF: .BLKB 100       ;  buffer for EEROM test\r
+\r
+HFSIZ=250.\r
+SC.HS1:        .BLKB HFSIZ     ;  high scores\r
+SC.HS2: .BLKB HFSIZ\r
+SC.HS3:        .BLKB HFSIZ\r
+SC.HI1:        .BLKB HFSIZ     ;  and initials\r
+SC.HI2: .BLKB HFSIZ\r
+SC.HI3: .BLKB HFSIZ\r
+\r
+\r
+;  lower RAM ends at 0C00\r
+.IF GE,.-0C00\r
+.ERROR ;  out of lower RAM\r
+.ENDC\r
+\r
+; additional RAM\r
+       RAM.ST=8000\r
+       .= RAM.ST\r
+\r
+;  if this gets moved, change the FORTRAN program\r
+;  (  elevators !!)\r
+;  player 1 area\r
+\r
+PL.1A:\r
+\r
+;  city ram storage\r
+CTRAM  = .\r
+       .BLKB 16*16\r
+CTRA2  = .\r
+       .BLKB 16*16\r
+\r
+;  elevator storage\r
+       EC.MAX = 5              ; maximum # of elevators\r
+EC.BLK:        .BLKB EC.BSZ*EC.MAX     ; block size * # of blocks\r
+\r
+EC.NUM:        .BLKB 1\r
+EC.CUR:        .BLKB 1\r
+\r
+;  wave control storage\r
+WV.XCO:        .BLKB 1         ;  wave x coordinate (0-255)\r
+WV.YCO:        .BLKB 1         ;  wave y coordinate (0-255)\r
+WV.XCD:        .BLKB 1         ;  destination wave x\r
+WV.YCD:        .BLKB 1         ;  destination wave y\r
+\r
+WV.DF1:        .BLKB 1         ;  short term difficulty 0-0F\r
+WV.DF2:        .BLKB 1         ;  long term  difficulty 0-0F\r
+WV.DFO: .BLKB 1                ;  difficultly offset, used by difficulty settings\r
+WV.NUM:        .BLKB 1         ;  wave number\r
+\r
+\r
+WV.EOG:        .BLKB 1         ;  end of game flag\r
+\r
+P1.LIV:\r
+WV.LIV:        .BLKB 1         ;  lives left\r
+\r
+P1.SCO:\r
+SC.SCO:        .BLKB 3         ;  score\r
+SC.NEL:        .BLKB 1         ;  next extra life \r
+\r
+;  entities storage\r
+;  for each variable a table of EN.MAX bytes is set aside\r
+;  alternating, and 2 bytes apart\r
+\r
+EN.STA:        .BLKB 1                 ;  state\r
+EN.LMD:        .BLKB 2*EN.MAX-1        ;  life mode\r
+\r
+EN.IX: .BLKB 1\r
+EN.IY: .BLKB 2*EN.MAX-1\r
+EN.MX: .BLKB 1\r
+EN.MY: .BLKB 2*EN.MAX-1\r
+EN.HP: .BLKB 1\r
+EN.VP: .BLKB 2*EN.MAX-1\r
+EN.HTO:        .BLKB 1\r
+EN.HOF:        .BLKB 2*EN.MAX-1\r
+EN.HEI:: .BLKB 1\r
+EN.TFL:        .BLKB 2*EN.MAX-1\r
+EN.TFP:        .BLKB 1\r
+EN.WCF:        .BLKB 2*EN.MAX-1        ;  wall collision flag\r
+EN.NSF:        .BLKB 1                 ;  new square flag\r
+EN.DR: .BLKB 2*EN.MAX-1        ;  direction 0<=EN.DR<=3\r
+EN.PRE:        .BLKB 1\r
+EN.DIR:        .BLKB 2*EN.MAX-1\r
+EN.ANV:        .BLKB 1                 ;  animation variable\r
+EN.GP1: .BLKB 2*EN.MAX-1       ;  general purpose\r
+\r
+EN.GP2: .BLKB 1                        ;  more gen pur\r
+EN.GP3:        .BLKB 2*EN.MAX-1\r
+\r
+EN.X:  .BLKB 1\r
+EN.Y:  .BLKB 2*EN.MAX-1\r
+\r
+EN.BLK:        .BLKB 1                 ;  blanking flag\r
+EN.DEA:        .BLKB 2*EN.MAX-1        ;  death flag\r
+\r
+EN.MPC=4               ;  max number of pictures/en\r
+EN.PR1:        .BLKB 1\r
+EN.PC1:        .BLKB 2*EN.MAX-1\r
+EN.XO1:        .BLKB 1\r
+EN.YO1:        .BLKB 2*EN.MAX-1\r
+EN.PR2:        .BLKB 1\r
+EN.PC2:        .BLKB 2*EN.MAX-1\r
+EN.XO2:        .BLKB 1\r
+EN.YO2:        .BLKB 2*EN.MAX-1\r
+EN.PR3:        .BLKB 1\r
+EN.PC3:        .BLKB 2*EN.MAX-1\r
+EN.XO3:        .BLKB 1\r
+EN.YO3:        .BLKB 2*EN.MAX-1\r
+EN.PR4:        .BLKB 1\r
+EN.PC4:        .BLKB 2*EN.MAX-1\r
+EN.XO4:        .BLKB 1\r
+EN.YO4:        .BLKB 2*EN.MAX-1\r
+\r
+EN.LIV:        .BLKB 1\r
+EN.SP1:        .BLKB 2*EN.MAX-1        ;  slow speed\r
+EN.SP2:        .BLKB 1                 ;  fast speed\r
+EN.AND:        .BLKB 2*EN.MAX-1        ;  animation direction\r
+\r
+EN.DEL:        .BLKB 2*EN.MAX\r
+EN.MAT:        .BLKB 2*EN.MAX          ;  \r
+EN.MA2:        .BLKB 2*EN.MAX          ;  format 2 bytes adjacent\r
+\r
+;  single EN variables\r
+EN.COB:        .BLKB 1                 ;  collision bit\r
+EN.TMP:        .BLKB 1\r
+EN.NUM:        .BLKB 1\r
+EN.T1: .BLKB 1\r
+EN.T2: .BLKB 1\r
+EN.T3: .BLKB 1\r
+EN.T4: .BLKB 1\r
+EN.T5: .BLKB 1\r
+EN.T6: .BLKB 1\r
+EN.LDF:        .BLKB 1         ;  last dot flag\r
+EN.XD: .BLKB 1         ;  delta x\r
+EN.YD: .BLKB 1         ;  delta y\r
+EN.OFF:        .BLKB 2         ;  playfield offset\r
+EN.MSG:        .BLKB 1         ;  max speed of gemeaters\r
+EN.CMS:        .BLKB 1         ;  crystal monster speed\r
+EN.JFL:        .BLKB 1         ;  jump flag\r
+EN.JDL:        .BLKB 1         ;  jump delay\r
+EN.JBO:        .BLKB 1         ;  old jump button value\r
+EN.JB2:        .BLKB 1         ;  ditto for button 2\r
+EN.JBP:        .BLKB 1         ;  positive jump but transition\r
+\r
+EN.PDL:        .BLKB 1         ;  player delay\r
+EN.GDL:        .BLKB 1         ;  general delay at start\r
+EN.CDL:        .BLKB 1         ;  collision delay, when hat on\r
+\r
+ST.TIM:        .BLKB 2         ;  game time\r
+SC.PRH:        .BLKB 6         ;  previous initials for hs\r
+SC.GEM:        .BLKB 1         ;  player gem counter\r
+\r
+; player 2 area\r
+PL.AZ=.-PL.1A          ;  size, in bytes, of player area\r
+PL.2A:\r
+       .BLKB PL.AZ\r
+P2.LIV=P1.LIV+PL.AZ    ;  number of lives of other player\r
+P2.SCO=P1.SCO+PL.AZ    ;  score of other player\r
+\r
+;  upper working RAM ends at 8DFF\r
+.IF GE,.-8E00\r
+.ERROR ;  out of upper RAM\r
+.ENDC\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/CGR.MAC b/CGR.MAC
new file mode 100644 (file)
index 0000000..952c2ae
--- /dev/null
+++ b/CGR.MAC
@@ -0,0 +1,511 @@
+;  filename CGR.MAC\r
+;  global routines\r
+\r
+       .ASCII  /  (C) 1983 ATARI ALL RIGHTS RESERVED/\r
+       .BYTE   CHK01\r
+\r
+;-------------------\r
+;  difficulty tables\r
+\r
+;   initial speeds for gem-eaters\r
+DF.SP1:        .BYTE 2,2,3,4, 5,7,8,9\r
+       .BYTE 0A,01\r
+\r
+;  max speed for gem-eaters\r
+DF.MSG:        .BYTE  3, 5, 7, 9, 0A,0B,0C,0D\r
+       .BYTE 0E,01\r
+\r
+;  crystal monster speed\r
+DF.CMS:        .BYTE   1, 4, 5, 6, 7, 8, 9,0A\r
+       .BYTE  10,08\r
+\r
+;   eating times\r
+DF.ETD:        .BYTE 40,20,10,10, 10,10, 8, 8\r
+       .BYTE  4,10\r
+\r
+;   tree growing times\r
+DF.TRG:        .BYTE 040,020, 20,010,   8, 08, 08, 08\r
+       .BYTE  04,020\r
+\r
+;   tree speed\r
+DF.TRS:        .BYTE 02, 03, 03, 05,  07, 09, 0A, 0B\r
+       .BYTE 0F, 0A\r
+\r
+;   swarm speed\r
+DF.SWS:        .BYTE 01, 03, 06, 03,  05, 06, 04, 08\r
+       .BYTE 0F, 0F\r
+\r
+;  creature numbers\r
+DF.CRN: .BYTE 3,8,5,5,  5,5,5,5\r
+       .BYTE 5,5,5,5,  6,6,6,6\r
+\r
+; creature distribution, depends on wave number\r
+; creature table\r
+DF.CRT:\r
+       .BYTE 9, 9, 9, 9,  9, 1, 1, 1   ; 00\r
+       .BYTE 1,01,0A,01,  1, 1, 1, 1   ; 10\r
+       .BYTE 7, 0, 0, 0,  0, 0, 0, 0   ; 20\r
+       .BYTE 7, 6,0A, 1,  1, 1, 1, 1   ; 30\r
+       .BYTE 7, 0,0A, 1,  1, 1, 1, 1   ; 01\r
+       .BYTE 7, 9,0A,0C,  1, 1,0E,0B   ; 11\r
+       .BYTE 7, 0,0A, 1,  1, 1, 1, 0   ; 21\r
+       .BYTE 7, 6,0A, 9,  9, 1, 1, 0   ; 31\r
+\r
+       .BYTE 7, 0,0A, 1,  1, 1, 0, 9   ; 02\r
+       .BYTE 1,0C,0A, 1,  1, 1, 0, 9   ; 12\r
+       .BYTE 7, 1,0A, 1,  1, 1, 1, 0   ; 22\r
+       .BYTE 7, 6,0A, 1,  1, 1,0A, 9   ; 32\r
+       .BYTE 7, 1,0A, 1,  1, 1, 1, 0   ; 03\r
+       .BYTE 7, 1,0A, 1,  1, 1, 1, 0   ; 13\r
+       .BYTE 7, 1, 0, 0,  9, 9, 9,0B   ; 23\r
+       .BYTE 7, 6,0A,0E, 0E, 1, 1, 0   ; 33\r
+\r
+; init position 9 creatures\r
+DF.INX: .BYTE 02,03,04,05,06,07,08,09,0A\r
+       .BYTE 0F,10,14,14,08,09,0A,0B,0C\r
+       .BYTE 01,01,01,01,01,01,01,01,14\r
+       .BYTE 0C,0D,02,07,14,13,12,11,10\r
+       .BYTE 01,01,01,02,03,04,05,06,07\r
+       .BYTE 0C,0C,14,0D,08,01,02,02,0C\r
+       .BYTE 0B,0B,0E,0F,10,11,12,13,14\r
+       .BYTE 0A,0A,01,12,11,10,0F,0E,0D\r
+\r
+       .BYTE 02,02,02,03,04,05,06,07,01\r
+       .BYTE 0D,08,0D,01,04,05,06,07,01\r
+       .BYTE 02,02,02,01,04,05,06,07,08\r
+       .BYTE 02,02,03,02,05,04,03,02,01\r
+       .BYTE 08,08,02,03,04,05,06,07,01\r
+       .BYTE 13,13,02,03,04,05,06,07,01\r
+       .BYTE 01,02,14,03,04,05,06,14,0B\r
+       .BYTE 08,08,02,14,04,05,06,07,01\r
+\r
+DF.INY: .BYTE 0C,14,14,14,14,14,14,14,14\r
+       .BYTE 13,10,03,04,14,14,14,14,14\r
+       .BYTE 02,01,04,08,0C,10,0A,06,14\r
+       .BYTE 02,02,14,14,14,14,14,14,14\r
+       .BYTE 01,01,14,14,14,14,14,14,14\r
+       .BYTE 01,01,02,02,0C,14,14,02,06\r
+       .BYTE 0B,0B,14,14,14,14,14,14,14\r
+       .BYTE 0C,0C,10,14,14,14,14,14,14\r
+\r
+       .BYTE 09,09,14,14,14,14,14,14,14\r
+       .BYTE 0D,14,0E,14,14,14,14,14,14\r
+       .BYTE 02,02,14,01,14,14,14,14,14\r
+       .BYTE 0C,0D,02,02,14,14,14,14,14\r
+       .BYTE 14,14,14,14,14,14,14,14,14\r
+       .BYTE 06,06,14,14,14,14,14,14,14\r
+       .BYTE 02,02,02,02,02,14,14,14,0B\r
+       .BYTE 01,01,02,14,04,05,06,07,09\r
+\r
+;----------------------------\r
+;  reset software init\r
+RS.INI:\r
+       JSR EE.CMD      ;  get coin mode from EEROM\r
+\r
+;  attract mode flag\r
+       TRAI 0FF ATRACT\r
+\r
+;  scrolling and flip\r
+       TRAI 18 HW.VSV\r
+       TRAI 0  HW.HSV\r
+       STA     HW.FLV\r
+       STA ST.PLY      ;  game play\r
+       STA GM.STA      ;  game state\r
+       STA $$CRDT\r
+       STA WV.WAR      ;  warp\r
+\r
+;  high score table\r
+;  transfer data from EEROM\r
+\r
+       JSR EECHKT              ;  check if data OK\r
+\r
+       LDX #HFSIZ-3\r
+       LDY #2\r
+       BEGIN\r
+        TRAM   HFPSCO(Y) SC.HS1(X)\r
+        TRAM 3+HFPSCO(Y) SC.HS2(X)\r
+        TRAM 6+HFPSCO(Y) SC.HS3(X)\r
+        TRAM   HFPINI(Y) SC.HI1(X)\r
+        TRAM 3+HFPINI(Y) SC.HI2(X)\r
+        TRAM 6+HFPINI(Y) SC.HI3(X)\r
+        INX\r
+        DEY\r
+       MIEND\r
+\r
+       LDA #0\r
+       LDX #HFSIZ-3\r
+       BEGIN\r
+        ORA SC.HS3(X)\r
+       INX\r
+       CPX #HFSIZ\r
+       EQEND\r
+\r
+       CMP #3\r
+       IFCC\r
+\r
+       LDX #HFSIZ-3\r
+       BEGIN\r
+        LDA #3\r
+        STA SC.HS3(X)\r
+        LDA #0\r
+        STA SC.HS2(X)\r
+        STA SC.HS1(X)\r
+        LDA #4A\r
+        STA SC.HI1(X)\r
+        STA SC.HI2(X)\r
+        STA SC.HI3(X)\r
+       INX\r
+       CPX #HFSIZ\r
+       EQEND\r
+\r
+       ENDIF\r
+\r
+\r
+       TRAI HFSIZ-3 TEMP1\r
+       TRAI 99 TEMP2\r
+       TRAI 2 TEMP2+1\r
+       BEGIN\r
+        DEC TEMP1\r
+        LDA TEMP2\r
+        IFEQ\r
+         DEC TEMP2+1\r
+        ENDIF\r
+\r
+        SED                    ;  scores\r
+        LDA TEMP2\r
+        SUB #1\r
+        STA TEMP2\r
+        CLD\r
+\r
+        LDX TEMP1\r
+        STA SC.HS2(X)\r
+        LDA #0\r
+        STA SC.HS1(X)\r
+        LDA TEMP2+1\r
+        STA SC.HS3(X)\r
+                               ;  initials\r
+        LDA RANDOM\r
+        AND #1F\r
+        TAY\r
+        TRAM SC.DE1(Y) SC.HI1(X)\r
+        TRAM SC.DE2(Y) SC.HI2(X)\r
+        TRAM SC.DE3(Y) SC.HI3(X)\r
+\r
+       STA HW.WDC              ;  WOOF\r
+       LDA TEMP1\r
+       EQEND\r
+\r
+;  test inits\r
+       RTS\r
+\r
+;  A   B  C  D  E  F  G  H  I  J  K  L  M  N\r
+;  4A  4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57\r
+;  O   P  Q  R  S  T  U  V  W  X  Y  Z\r
+;  58 59 5A 5B 5C 5D 5E 5F 60 61 62 63\r
+\r
+;  bbm,edg,mar,mec,BAS,fxl,SMB,leb ,clt,pdm,wgc,s l,sf ,ray,rbd,ed\r
+;  GDS  ORR REM  DAR  DAT   MFP BUB BAS  BB  TW\r
+;  CTC  BEN STM  GJR  REX\r
+\r
+SC.DE1:        .BYTE 4B,4E,56,56, 4B,4F,5C,55\r
+       .BYTE 4C,59,60,5C, 5C,5B,5B,4E\r
+       .BYTE 50,58,5B,4D, 4D,56,4B,4B\r
+       .BYTE 4B,5D,59,4C, 4B,5C,50,5B\r
+\r
+SC.DE2:        .BYTE 4B,4D,4A,4E, 4A,61,56,4E\r
+       .BYTE 55,4D,50,64, 4F,4A,4B,4D\r
+       .BYTE 4D,5B,4E,4A, 4A,4F,5E,4A\r
+       .BYTE 64,64,4C,5D, 4E,5D,53,4E\r
+SC.DE3:        .BYTE 56,50,5B,4C, 5C,55,4B,4B\r
+       .BYTE 5D,56,4C,55, 64,62,4D,64\r
+       .BYTE 5C,5B,56,5B, 5D,59,4B,5C\r
+       .BYTE 4B,60,5D,4C, 57,56,5B,61\r
+\r
+;-------------------------\r
+;  hide all motion objects\r
+GR.MCL:\r
+       TR16AI MT.BU1 MT.PTR\r
+       JSR GR.MC1\r
+       TR16AI MT.BU0 MT.PTR\r
+       JSR GR.MC1\r
+       RTS\r
+GR.MC1:\r
+       LDY #28*4\r
+       BEGIN\r
+       DEY\r
+        TRAI 0F0 @MT.PTR(Y)\r
+        TYA\r
+       EQEND\r
+       RTS\r
+\r
+;------------------------\r
+; routine to clear screen\r
+GR.SCL:\r
+       JSR GR.MCL      ;  clear motion objects\r
+\r
+;  bit-map too\r
+       LDX #0\r
+       STX HW.AY\r
+       STX TEMP1\r
+       DEX\r
+       STX HW.YIN\r
+\r
+       TRAI 0 TEMP1\r
+       LDA #00F\r
+5$:    LDY #40\r
+       LDX TEMP1\r
+       STX XB\r
+10$:\r
+       .REPT 4\r
+       STA VB\r
+       .ENDM\r
+       DEY\r
+       BNE 10$\r
+       JSR MN.HOU      ;  housekeeping\r
+       DEC TEMP1\r
+       BNE 5$\r
+\r
+       TRAI 0FF HW.AY\r
+       RTS\r
+\r
+\r
+;----------------------------\r
+;  determine end of scrolling\r
+WV.ESD:\r
+       LDA WV.XCO\r
+       CMP WV.XCD\r
+       IFEQ\r
+       LDA WV.YCO\r
+       SBC WV.YCD              ;  carry set because EQ\r
+       IFEQ\r
+          STA WV.SCF\r
+          JSR GM.EY0\r
+          RTS\r
+       ENDIF\r
+       ENDIF\r
+\r
+       LDA EN.WRF\r
+       IFNE\r
+        LDA WV.XCO\r
+        ASLS 2\r
+        STA RS.KEY+1\r
+        LDA #12\r
+        JSR MN.SN1\r
+       ENDIF\r
+       RTS\r
+\r
+;----------------------------------------\r
+;  routine to set bitmap-values of faces\r
+CL.PR:  \r
+       EOR #80\r
+       ORA #0F\r
+       AND #8F\r
+\r
+       LDY #7\r
+       BEGIN\r
+        SUB #10\r
+        STA FC.BV-1(Y)\r
+        DEY\r
+       EQEND\r
+       RTS\r
+\r
+;----------------------------\r
+; routine to draw type 1 line\r
+; input: LN.LG1 ... number of segments\r
+;        LN.HCR ... horizontal coordinate\r
+;       LN.VCR ... vertical coordinate\r
+;       LN.CO1 ... pixel color\r
+LN.1:  LDY LN.LG1\r
+       TRAM LN.HCR XB\r
+       TRAM LN.VCR YB\r
+       LDA LN.CO1\r
+10$:   \r
+; horizontal\r
+       STA VB\r
+       DEY\r
+       BMI 20$\r
+       INC XB\r
+\r
+       DEC YB\r
+       JMP 10$\r
+20$:   \r
+       RTS\r
+\r
+;   fast version\r
+LN.F1:\r
+       TRAI 0 HW.AY\r
+       STA  HW.AX\r
+       STA  HW.XIN\r
+       TRAI 0FF HW.YIN\r
+\r
+       TRAM LN.HCR XB      ;   LN.LG harwired to 4\r
+       TRAM LN.VCR YB\r
+       LDA LN.CO1\r
+\r
+       .REPT 4\r
+       STA VB\r
+;      INC XB\r
+;      DEC YB\r
+       .ENDM\r
+       STA VB\r
+\r
+\r
+       TRAI 0FF HW.AY\r
+       STA      HW.AX\r
+       RTS\r
+\r
+\r
+;-----------------------------\r
+; routine to draw type 2 line\r
+\r
+; input: LN.LG2 ... number of segments\r
+;        LN.HCR ... horizontal coordinate\r
+;       LN.VCR ... vertical coordinate\r
+;       LN.CO2 ... pixel color\r
+LN.2:\r
+       LDY LN.LG2\r
+       TRAM LN.HCR XB\r
+       TRAM LN.VCR YB\r
+       LDA LN.CO2\r
+10$:   \r
+       STA VB\r
+       DEY\r
+       BMI 20$\r
+       DEC XB\r
+\r
+       STA VB\r
+       DEY\r
+       BMI 20$\r
+       DEC XB\r
+\r
+       STA VB\r
+       DEY\r
+       BMI 20$\r
+       DEC XB\r
+\r
+       STA VB\r
+       DEY\r
+       BMI 20$\r
+       DEC XB\r
+       DEC YB\r
+\r
+       JMP 10$\r
+\r
+ 20$:  \r
+       RTS\r
+\r
+\r
+LN.F2:                 ; fast version,  LN.LG2=8\r
+       TRAM LN.HCR XB\r
+       TRAM LN.VCR YB\r
+\r
+       TRAI 0 HW.AX\r
+       TRAI 0FF HW.XIN\r
+\r
+       LDA LN.CO2\r
+\r
+       .REPT 3\r
+       STA VB\r
+;      DEC XB\r
+       .ENDM\r
+\r
+       DEC YB\r
+       .REPT 4\r
+       STA VB\r
+;      DEC XB\r
+       .ENDM\r
+\r
+       DEC YB\r
+\r
+       STA VB\r
+;      DEC XB\r
+       STA VB\r
+\r
+       TRAI 0FF HW.AX\r
+       RTS\r
+\r
+;-------------------------------\r
+; routine to draw line of type 3\r
+LN.3:\r
+       LDY #0\r
+       STY HW.AY\r
+       DEY\r
+       STY HW.YIN\r
+\r
+       LDY LN.LG3\r
+       TRAM LN.HCR XB\r
+       TRAM LN.VCR YB\r
+\r
+\r
+       LDA LN.CO3\r
+10$:   STA VB\r
+       DEY\r
+       BMI 20$\r
+;      DEC YB\r
+       JMP 10$\r
+\r
+20$:\r
+       TRAI 0FF HW.AY  \r
+       RTS\r
+\r
+\r
+;----------------------\r
+;  update score\r
+SC.UPD: SED\r
+       LDA SC.SCO\r
+       ADD SC.INC\r
+       STA SC.SCO\r
+       LDA SC.SCO+1\r
+       ADC SC.INC+1\r
+       STA SC.SCO+1\r
+       LDA SC.SCO+2\r
+       ADC SC.INC+2\r
+       STA SC.SCO+2\r
+       CLD\r
+\r
+       PHXYA                   ;  don't zap (X)\r
+       JSR SC.OT2\r
+       PLXYA\r
+\r
+       LDA SC.NEL\r
+       IFNE\r
+       LDA SC.SCO+2\r
+       CMP SC.NEL\r
+       IFCS\r
+\r
+        SED\r
+10$:    LDA SC.NEL\r
+        ADD #7         ;  extra life every 70000\r
+        IFCS\r
+         LDA #0\r
+        ENDIF          ;  no bugs at 1 million please\r
+        STA SC.NEL\r
+        LDA SC.SCO+2\r
+        CMP SC.NEL\r
+        BCS 10$        ;  max of 1 extra life per inc\r
+\r
+        CLD\r
+        LDA WV.LIV\r
+        CMP #6         ;  max of six lives\r
+        IFCC\r
+\r
+        LDA #1\r
+        JSR MN.SN1     ; extra life sound\r
+\r
+        LDA SC.INC+2\r
+        CMP #2         ;  don't give extra lives for warp\r
+        IFCC\r
+         INC WV.LIV\r
+        ENDIF\r
+\r
+        TRAM WV.LIV TEMP5\r
+        PHXYA                  ;  don't zap (X)\r
+        JSR SC.LD2\r
+        PLXYA\r
+\r
+        ENDIF\r
+       ENDIF\r
+       ENDIF\r
+\r
+       RTS\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/CIN.MAC b/CIN.MAC
new file mode 100644 (file)
index 0000000..f611d60
Binary files /dev/null and b/CIN.MAC differ
diff --git a/CLS.MAC b/CLS.MAC
new file mode 100644 (file)
index 0000000..fb1af3e
--- /dev/null
+++ b/CLS.MAC
@@ -0,0 +1,2219 @@
+       .RADIX  16.\r
+       .TITLE  CLS.SND, CLS.MAC\r
+\r
+       .PAGE\r
+       .ASECT\r
+       .=0D540\r
+;TUNE TABLE\r
+       .GLOBL  RS.DPL,RS.DOT,RS.KEY,RS.K2,RS.K3,RS.K4\r
+TUNTAB::\r
+       .WORD   MEFIS1,MEFIS2,MEFIS3    ;  0,1,2\r
+       .WORD   BEET1,BEET2,BEET3       ;  3,4,5\r
+       .WORD   TCHAI1,TCHAI2,TCHAI3    ;  6,7,8\r
+\r
+       .WORD   BEETA1,BEETA2,BEETA3,DUM ; 9,0A,0B,0C\r
+       .WORD   MEFW1,MEFW2,MEFW3       ;  0D,0E,0F\r
+       .WORD   MC1,MC2,MC3,MC4         ;  10,11,12,13\r
+       .WORD   GBD1,GBD2,GBD3,GBD4     ;  14,15,16,17\r
+       .WORD   BEES                    ;  18\r
+       .WORD   RS.DPL,RS.DOT           ;  19,1A\r
+       .WORD   GMO1,GMO2,GMO3,DUM      ;  1B,1C,1D,1E\r
+       .WORD   TC1A,TC2A,TC3A,TC4A     ;  1F,20,21,22\r
+       .WORD   JUMP                    ;  23\r
+       .WORD   SUB24,SUB25,SUB26       ;  24,25,26\r
+       .WORD   RS.KEY,RS.K2,RS.K3      ;  27,28,29\r
+       .WORD   BR1,BR2,BR3,BR4         ;  2A,2B,2C,2D\r
+       .WORD   NC1,NC2,NC3,NC4         ;  2E,2F,30,31\r
+       .WORD   ND1,ND2,ND3,ND4         ;  32,33,34,35\r
+       .WORD   T181,T182,T183,T184     ;  36,37,38,39\r
+       .WORD   BACKG                   ;  3A\r
+       .WORD   WARP1,WARP2             ;  3B,3C\r
+       .WORD   SUB3D,SUB3E             ;  3D,3E\r
+       .WORD   HONEY                   ;  3F\r
+       .WORD   SKEL                    ;  40\r
+       .WORD   WITCH                   ;  41\r
+       .WORD   CUBES                   ;  42\r
+       .WORD   BACKG                   ;  43\r
+       .WORD   BACKG                   ;  44\r
+       .WORD   RS.K4                   ;  45\r
+       .WORD   SCR1,SCR2,SCR3,SCR4     ;  46,47,48,49\r
+\r
+;  player picks up dot\r
+DOTPL:: ;.CKEY   40\r
+       .BYTE   85, 40\r
+       ;.NVOL  F\r
+       .BYTE   82, 0A\r
+       .BYTE   10,2.\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+; others pick up dot\r
+DOTOT:: ;.CKEY 20\r
+       .BYTE   85, 20\r
+       ;.NVOL  F\r
+       .BYTE   82, 0A\r
+       .BYTE   20,1.\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+KEYGN::        ;.CKEY  10\r
+       .BYTE   85, 10\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+       ;.CKEY  10\r
+       .BYTE   85, 10\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+       ;.CKEY  10\r
+       .BYTE   85, 10\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+       ;.CKEY  10\r
+       .BYTE   85, 10\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+;*********************************\r
+; modified Mephisto Waltz\r
+; start on 8th measure of line 3 page 14 for 8 measures\r
+;*********************************\r
+MEFIS1:        ;.NVOL MF               ;voice 1\r
+       .BYTE   82, 9\r
+       ;.NRATE 100.            ;3/8 time\r
+       .BYTE   80, 100.\r
+       ;.SIGNTR S,3\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE E4E,A4E          ;m1 (first eighth note not played)\r
+       .BYTE   035, 020\r
+       .BYTE   03a, 020\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE E5Q,C5E          ;m2\r
+       .BYTE   041, 040\r
+       .BYTE   03e, 020\r
+\r
+       ;.NOTE B4S              ;m3\r
+       .BYTE   03c, 010\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTEC C5S,B4E,A4E\r
+       .BYTE   03e, 010\r
+       .BYTE   03c, 020\r
+       .BYTE   03a, 020\r
+\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE G4S              ;m4\r
+       .BYTE   039, 010\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTEC A4S,G4E,F4E\r
+       .BYTE   03a, 010\r
+       .BYTE   039, 020\r
+       .BYTE   037, 020\r
+\r
+       ;.CVOL 2\r
+       .BYTE   83, 2\r
+       ;.NOTE ES4E             ;m5 \r
+       .BYTE   036, 020\r
+       ;.CVOL -2\r
+       .BYTE   83, -2\r
+       ;.NOTEC G4E,F4E\r
+       .BYTE   039, 020\r
+       .BYTE   037, 020\r
+\r
+       ;.CVOL 2\r
+       .BYTE   83, 2\r
+       ;.NOTE DS4E             ;m6\r
+       .BYTE   034, 020\r
+       ;.CVOL -2\r
+       .BYTE   83, -2\r
+       ;.NOTEC F4E,E4E\r
+       .BYTE   037, 020\r
+       .BYTE   035, 020\r
+\r
+       \r
+       ;.NOTE R4E,C4E,D4E      ;m7\r
+       .BYTE   00, 020\r
+       .BYTE   032, 020\r
+       .BYTE   033, 020\r
+       ;.CVOL 1\r
+       .BYTE   83, 1\r
+       ;.NOTE DS4E,F4E,E4E     ;m8\r
+       .BYTE   034, 020\r
+       .BYTE   037, 020\r
+       .BYTE   035, 020\r
+\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       .BYTE 83,0              ;\r
+       ;.NOTE R4Y\r
+       .BYTE   00, 02\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+MEFIS2:        ;.NVOL P                        ;voice 2\r
+       .BYTE   82, 3\r
+       ;.NRATE 100.\r
+       .BYTE   80, 100.\r
+       ;.SIGNTR S,3\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE C4E,C4E\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.NOTE C4E,C4E,C4E\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.NOTE E4E,E4E,E4E\r
+       .BYTE   035, 020\r
+       .BYTE   035, 020\r
+       .BYTE   035, 020\r
+       ;.NOTE C4E,C4E,C4E\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.NOTE C4E,C4E,C4E\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.NOTE C4E,C4E,C4E\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.NOTE R4E,C4E,C4E\r
+       .BYTE   00, 020\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.NOTE C4E,C4E,C4E\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       .BYTE 83,0\r
+       ;.NOTE R4Y\r
+       .BYTE   00, 02\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+MEFIS3:        ;.NVOL P                        ;voice 3\r
+       .BYTE   82, 3\r
+       ;.NRATE 100.\r
+       .BYTE   80, 100.\r
+       ;.SIGNTR S,3\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE A3E,A3E\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       ;.NOTE A3E,A3E,A3E\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       ;.NOTE C4E,C4E,C4E\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       .BYTE   032, 020\r
+       ;.NOTE A3E,A3E,A3E\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       ;.NOTE A3E,A3E,A3E\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       ;.NOTE A3E,A3E,A3E\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       ;.NOTE R3E,A3E,A3E\r
+       .BYTE   00, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       ;.NOTE A3E,A3E,A3E\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   02e, 020\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       .BYTE 83,0\r
+       ;.NOTE R4Y\r
+       .BYTE   00, 02\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+;***************** end 1st mephisto tune **************\r
+\r
+\r
+;  minor chords increasing\r
+MC1:   ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.NOTE C2T\r
+       .BYTE   01a, 08\r
+       ;.LOOP 32.\r
+       .BYTE   8E, 32.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE C2T\r
+       .BYTE   01a, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+MC2:   ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.NOTE A2T\r
+       .BYTE   022, 08\r
+       ;.LOOP 32.\r
+       .BYTE   8E, 32.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE EF2T\r
+       .BYTE   01c, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+MC3:   ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.NOTE G2T\r
+       .BYTE   021, 08\r
+       ;.LOOP 32.\r
+       .BYTE   8E, 32.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE G2T\r
+       .BYTE   021, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+MC4:   ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.NOTE BF2T\r
+       .BYTE   023, 08\r
+       ;.LOOP 32.\r
+       .BYTE   8E, 32.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE BF2T\r
+       .BYTE   023, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+;  goblin death\r
+GBD1:\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.LOOP 64.\r
+       .BYTE   8E, 64.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE C1X\r
+       .BYTE   0e, 04\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+GBD2:\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.LOOP 64.\r
+       .BYTE   8E, 64.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE E1X\r
+       .BYTE   011, 04\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+GBD3:\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.LOOP 64.\r
+       .BYTE   8E, 64.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE GF1X\r
+       .BYTE   013, 04\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+GBD4:\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.NKEY 10\r
+       .BYTE   84, 10\r
+       ;.LOOP 64.\r
+       .BYTE   8E, 64.\r
+       ;.CKEY 1\r
+       .BYTE   85, 1\r
+       ;.NOTE A1X\r
+       .BYTE   016, 04\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+\r
+DUM:   ;.NVOL M\r
+       .BYTE   82, 7\r
+       ;.NRATE 64.\r
+       .BYTE   80, 64.\r
+       ;.NOTE C4E.,B3S,B3E.,B3S,B3Q\r
+       .BYTE   032, 030\r
+       .BYTE   030, 010\r
+       .BYTE   030, 030\r
+       .BYTE   030, 010\r
+       .BYTE   030, 040\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+;************************************\r
+; 2nd Mephisto waltz tune (extra life)\r
+; \r
+MEFW1: ;.NVOL MF\r
+       .BYTE   82, 9\r
+       ;.NRATE 140.\r
+       .BYTE   80, 140.\r
+       ;.SIGNTR F,5\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE G6S,A6S,G6S,A6S,G6S,A6S\r
+       .BYTE   04f, 010\r
+       .BYTE   051, 010\r
+       .BYTE   04f, 010\r
+       .BYTE   051, 010\r
+       .BYTE   04f, 010\r
+       .BYTE   051, 010\r
+       ;.AENV 2\r
+       .BYTE   87, 2\r
+       ;.NOTE G6E,E6E,G6E\r
+       .BYTE   04f, 020\r
+       .BYTE   04c, 020\r
+       .BYTE   04f, 020\r
+       ;.NOTE F6E,D6E,F6E\r
+       .BYTE   04e, 020\r
+       .BYTE   04a, 020\r
+       .BYTE   04e, 020\r
+       ;.NOTE D6E,B5E,D6E\r
+       .BYTE   04a, 020\r
+       .BYTE   047, 020\r
+       .BYTE   04a, 020\r
+\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE B5S,C6S,B5S,C6S,B5S,C6S\r
+       .BYTE   047, 010\r
+       .BYTE   049, 010\r
+       .BYTE   047, 010\r
+       .BYTE   049, 010\r
+       .BYTE   047, 010\r
+       .BYTE   049, 010\r
+       ;.AENV 2\r
+       .BYTE   87, 2\r
+       ;.NOTE B5E,G5E,B5E\r
+       .BYTE   047, 020\r
+       .BYTE   043, 020\r
+       .BYTE   047, 020\r
+       ;.NOTE D6E,B5E,D6E\r
+       .BYTE   04a, 020\r
+       .BYTE   047, 020\r
+       .BYTE   04a, 020\r
+       ;.NOTE B5E,F5E,B5E\r
+       .BYTE   047, 020\r
+       .BYTE   042, 020\r
+       .BYTE   047, 020\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+MEFW2: ;.NVOL M\r
+       .BYTE   82, 7\r
+       ;.NRATE 140.\r
+       .BYTE   80, 140.\r
+       ;.SIGNTR F,5\r
+\r
+       ;.AENV 2\r
+       .BYTE   87, 2\r
+       ;.NOTE E6E,E6E,E6E\r
+       .BYTE   04c, 020\r
+       .BYTE   04c, 020\r
+       .BYTE   04c, 020\r
+       ;.NOTE E6E,C6E,E6E\r
+       .BYTE   04c, 020\r
+       .BYTE   049, 020\r
+       .BYTE   04c, 020\r
+       ;.NOTE D6E,B5E,D6E\r
+       .BYTE   04a, 020\r
+       .BYTE   047, 020\r
+       .BYTE   04a, 020\r
+       ;.NOTE B5E,F5E,B5E\r
+       .BYTE   047, 020\r
+       .BYTE   042, 020\r
+       .BYTE   047, 020\r
+       ;.NOTE G5E,G5E,G5E\r
+       .BYTE   043, 020\r
+       .BYTE   043, 020\r
+       .BYTE   043, 020\r
+       ;.NOTE G5E,EN5E,G5E\r
+       .BYTE   043, 020\r
+       .BYTE   041, 020\r
+       .BYTE   043, 020\r
+       ;.NOTE B5E,F5E,B5E\r
+       .BYTE   047, 020\r
+       .BYTE   042, 020\r
+       .BYTE   047, 020\r
+       ;.NOTE F5E,D5E,F5E\r
+       .BYTE   042, 020\r
+       .BYTE   03e, 020\r
+       .BYTE   042, 020\r
+\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+\r
+MEFW3: ;.NVOL M\r
+       .BYTE   82, 7\r
+       ;.NRATE 140.\r
+       .BYTE   80, 140.\r
+       ;.SIGNTR F,5\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE AN5S,C6S,A5S,C6S,A5S,C6S\r
+       .BYTE   046, 010\r
+       .BYTE   049, 010\r
+       .BYTE   046, 010\r
+       .BYTE   049, 010\r
+       .BYTE   046, 010\r
+       .BYTE   049, 010\r
+       ;.AENV 2\r
+       .BYTE   87, 2\r
+       ;.NOTE AN5E,G5E,A5E\r
+       .BYTE   046, 020\r
+       .BYTE   043, 020\r
+       .BYTE   046, 020\r
+       ;.NOTE B5E,F5E,B5E\r
+       .BYTE   047, 020\r
+       .BYTE   042, 020\r
+       .BYTE   047, 020\r
+       ;.NOTE F5E,D5E,F5E\r
+       .BYTE   042, 020\r
+       .BYTE   03e, 020\r
+       .BYTE   042, 020\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE D5S,EN5S,D5S,E5S,D5S,E5S\r
+       .BYTE   03e, 010\r
+       .BYTE   041, 010\r
+       .BYTE   03e, 010\r
+       .BYTE   041, 010\r
+       .BYTE   03e, 010\r
+       .BYTE   041, 010\r
+       ;.AENV 2\r
+       .BYTE   87, 2\r
+       ;.NOTE D5E,B4E,D5E\r
+       .BYTE   03e, 020\r
+       .BYTE   03b, 020\r
+       .BYTE   03e, 020\r
+       ;.NOTE F5E,D5E,F5E\r
+       .BYTE   042, 020\r
+       .BYTE   03e, 020\r
+       .BYTE   042, 020\r
+       ;.NOTE D5E,B4E,D5E\r
+       .BYTE   03e, 020\r
+       .BYTE   03b, 020\r
+       .BYTE   03e, 020\r
+\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+BEES:\r
+       ;.NVOL FF\r
+       .BYTE   82, 0D\r
+       ;.NRATE 200.\r
+       .BYTE   80, 200.\r
+       ;.CALL 27\r
+       .BYTE   8D, 27\r
+       ;.LOOP 34.\r
+       .BYTE   8E, 34.\r
+       ;.NOTE C2S,R2T\r
+       .BYTE   019, 010\r
+       .BYTE   00, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.LOOP 16.\r
+       .BYTE   8E, 16.\r
+       ;.NOTE CS2S,R2T\r
+       .BYTE   01a, 010\r
+       .BYTE   00, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.LOOP 16.\r
+       .BYTE   8E, 16.\r
+       ;.NOTE C2S,R2T\r
+       .BYTE   019, 010\r
+       .BYTE   00, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.LOOP 16.\r
+       .BYTE   8E, 16.\r
+       ;.NOTE CS2S,R2T\r
+       .BYTE   01a, 010\r
+       .BYTE   00, 08\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+;  Beethoven trio from symphony #3\r
+BEET1:\r
+       ;.NRATE 200.\r
+       .BYTE   80, 200.\r
+       ;.SIGNTR F,3\r
+\r
+       ;.LOOP 3\r
+       .BYTE   8E, 3\r
+       ;.NOTE B3Q              ;pickup to 1st full measure\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3H.T            ;M1\r
+       .BYTE   02f, 0c0\r
+       ;.NOTE B3H,E4Q\r
+       .BYTE   02f, 081\r
+       .BYTE   034, 040\r
+       ;.NOTE E4H,G4Q\r
+       .BYTE   034, 080\r
+       .BYTE   038, 040\r
+       ;.NOTE G4H,B4Q\r
+       .BYTE   038, 080\r
+       .BYTE   03b, 040\r
+       ;.NOTE B4H,G4Q\r
+       .BYTE   03b, 080\r
+       .BYTE   038, 040\r
+       ;.NOTE E4H,G4Q\r
+       .BYTE   034, 080\r
+       .BYTE   038, 040\r
+       ;.NOTE F4Q,G5Q,G5Q\r
+       .BYTE   036, 040\r
+       .BYTE   044, 040\r
+       .BYTE   044, 040\r
+       ;.NOTE F5E,R5E,R5H\r
+       .BYTE   042, 020\r
+       .BYTE   00, 020\r
+       .BYTE   00, 080\r
+       ;.NOTE R3H,B3Q\r
+       .BYTE   00, 080\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3QT,G3Q,G4Q\r
+       .BYTE   02f, 040\r
+       .BYTE   02c, 041\r
+       .BYTE   038, 040\r
+       ;.NOTE G4QT,E4Q,B4Q\r
+       .BYTE   038, 040\r
+       .BYTE   034, 041\r
+       .BYTE   03b, 040\r
+       ;.NOTE B4H,B4QT\r
+       .BYTE   03b, 080\r
+       .BYTE   03b, 040\r
+       ;.NOTE B4Q,R4Q,B4Q\r
+       .BYTE   03b, 041\r
+       .BYTE   00, 040\r
+       .BYTE   03b, 040\r
+       ;.NOTE C5Q,R5Q,D5Q\r
+       .BYTE   03d, 040\r
+       .BYTE   00, 040\r
+       .BYTE   03f, 040\r
+       ;.NOTE E5Q,C6Q,D6Q\r
+       .BYTE   040, 040\r
+       .BYTE   049, 040\r
+       .BYTE   04b, 040\r
+       ;.NOTE E6Q\r
+       .BYTE   04c, 040\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+BEET2:\r
+       ;.NRATE 200.\r
+       .BYTE   80, 200.\r
+       ;.SIGNTR F,3\r
+       ;.LOOP 3\r
+       .BYTE   8E, 3\r
+       ;.NOTE G3Q\r
+       .BYTE   02c, 040\r
+       ;.NOTE G3H.T\r
+       .BYTE   02c, 0c0\r
+       ;.NOTE G3H,B3Q\r
+       .BYTE   02c, 081\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3H,E4Q\r
+       .BYTE   02f, 080\r
+       .BYTE   034, 040\r
+       ;.NOTE E4H,G4Q\r
+       .BYTE   034, 080\r
+       .BYTE   038, 040\r
+       ;.NOTE G4H,E4Q\r
+       .BYTE   038, 080\r
+       .BYTE   034, 040\r
+       ;.NOTE B3Q,R3Q,E4Q\r
+       .BYTE   02f, 040\r
+       .BYTE   00, 040\r
+       .BYTE   034, 040\r
+       ;.NOTE D4Q,E5Q,E5Q\r
+       .BYTE   033, 040\r
+       .BYTE   040, 040\r
+       .BYTE   040, 040\r
+       ;.NOTE D5Q,R5H\r
+       .BYTE   03f, 040\r
+       .BYTE   00, 080\r
+       ;.NOTE R3H.\r
+       .BYTE   00, 0c0\r
+       ;.NOTE R3H,E4Q\r
+       .BYTE   00, 080\r
+       .BYTE   034, 040\r
+       ;.NOTE E4QT,B3Q,G4Q\r
+       .BYTE   034, 040\r
+       .BYTE   02f, 041\r
+       .BYTE   038, 040\r
+       ;.NOTE G4QT,E4Q,R4Q\r
+       .BYTE   038, 040\r
+       .BYTE   034, 041\r
+       .BYTE   00, 040\r
+       ;.NOTE G4Q,R4Q,G4Q\r
+       .BYTE   038, 040\r
+       .BYTE   00, 040\r
+       .BYTE   038, 040\r
+       ;.NOTE A4Q,R4Q,F4Q\r
+       .BYTE   039, 040\r
+       .BYTE   00, 040\r
+       .BYTE   036, 040\r
+       ;.NOTE E4Q,A5Q,F5Q\r
+       .BYTE   034, 040\r
+       .BYTE   045, 040\r
+       .BYTE   042, 040\r
+       ;.NOTE G5Q\r
+       .BYTE   044, 040\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+BEET3:\r
+       ;.NRATE 200.\r
+       .BYTE   80, 200.\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.SIGNTR F,3\r
+       ;.LOOP 3\r
+       .BYTE   8E, 3\r
+       ;.NOTE E3Q\r
+       .BYTE   028, 040\r
+       ;.NOTE E3H.T\r
+       .BYTE   028, 0c0\r
+       ;.NOTE E3H,G3Q\r
+       .BYTE   028, 081\r
+       .BYTE   02c, 040\r
+       ;.NOTE G3H,B3Q\r
+       .BYTE   02c, 080\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3H,E4Q\r
+       .BYTE   02f, 080\r
+       .BYTE   034, 040\r
+       ;.NOTE E4H,B3Q\r
+       .BYTE   034, 080\r
+       .BYTE   02f, 040\r
+       ;.NOTE G3Q,B3E,G3E,E3Q\r
+       .BYTE   02c, 040\r
+       .BYTE   02f, 020\r
+       .BYTE   02c, 020\r
+       .BYTE   028, 040\r
+       ;.NOTE B2Q,B3Q,B3Q\r
+       .BYTE   023, 040\r
+       .BYTE   02f, 040\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3Q,R3Q,E3Q,\r
+       .BYTE   02f, 040\r
+       .BYTE   00, 040\r
+       .BYTE   028, 040\r
+       ;.NOTE E3QT,B2Q,G3Q\r
+       .BYTE   028, 040\r
+       .BYTE   023, 041\r
+       .BYTE   02c, 040\r
+       ;.NOTE G3QT,E3Q,B3Q\r
+       .BYTE   02c, 040\r
+       .BYTE   028, 041\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3QT,G3Q,E4Q\r
+       .BYTE   02f, 040\r
+       .BYTE   02c, 041\r
+       .BYTE   034, 040\r
+       ;.NOTE E4QT,B3Q,G4Q\r
+       .BYTE   034, 040\r
+       .BYTE   02f, 041\r
+       .BYTE   038, 040\r
+       ;.NOTE R3Q,B3E,G3E,E3Q\r
+       .BYTE   00, 040\r
+       .BYTE   02f, 020\r
+       .BYTE   02c, 020\r
+       .BYTE   028, 040\r
+       ;.NOTE B2Q,R2Q.B2Q\r
+       .BYTE   023, 040\r
+       .BYTE   00, 060\r
+       ;.NOTE E2Q,B3Q,B3Q\r
+       .BYTE   01c, 040\r
+       .BYTE   02f, 040\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3Q\r
+       .BYTE   02f, 040\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+;************************************\r
+TCHAI1:\r
+       ;.NRATE 90.\r
+       .BYTE   80, 90.\r
+       ;.NVOL M\r
+       .BYTE   82, 7\r
+       ;.SIGNTR S,4\r
+       ;.NOTE E4E,R3E,B3E,R3S,B3S,E4E,R4E,B3E,R3E ;4/4\r
+       .BYTE   035, 020\r
+       .BYTE   00, 020\r
+       .BYTE   030, 020\r
+       .BYTE   00, 010\r
+       .BYTE   030, 010\r
+       .BYTE   035, 020\r
+       .BYTE   00, 020\r
+       .BYTE   030, 020\r
+       .BYTE   00, 020\r
+       ;.NOTE E4E,A4ET,A4H,G4E,R3S,F4S\r
+       .BYTE   035, 020\r
+       .BYTE   03a, 020\r
+       .BYTE   03a, 081\r
+       .BYTE   039, 020\r
+       .BYTE   00, 010\r
+       .BYTE   037, 010\r
+       ;.NOTE B3E,R4S.,F4T,E4E,R4S,D4S,E4E,R4E,B3E,R3E\r
+       .BYTE   030, 020\r
+       .BYTE   00, 018\r
+       .BYTE   037, 08\r
+       .BYTE   035, 020\r
+       .BYTE   00, 010\r
+       .BYTE   034, 010\r
+       .BYTE   035, 020\r
+       .BYTE   00, 020\r
+       .BYTE   030, 020\r
+       .BYTE   00, 020\r
+       ;.NOTE E4H.\r
+       .BYTE   035, 0c0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+TCHAI2:\r
+       ;.NRATE 90.\r
+       .BYTE   80, 90.\r
+       ;.NVOL M\r
+       .BYTE   82, 7\r
+       ;.SIGNTR        S,4\r
+       ;.NOTE B3E,R3E,A3E,R3E,B3E,R4E,F3E,R3E  ;4/4\r
+       .BYTE   030, 020\r
+       .BYTE   00, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   00, 020\r
+       .BYTE   030, 020\r
+       .BYTE   00, 020\r
+       .BYTE   02b, 020\r
+       .BYTE   00, 020\r
+       ;.NOTE E4E,R3E,E4E,R3E,D4E,R3E,D4E,R3S,D4S\r
+       .BYTE   035, 020\r
+       .BYTE   00, 020\r
+       .BYTE   035, 020\r
+       .BYTE   00, 020\r
+       .BYTE   034, 020\r
+       .BYTE   00, 020\r
+       .BYTE   034, 020\r
+       .BYTE   00, 010\r
+       .BYTE   034, 010\r
+       ;.NOTE E4E,R4E,A3E,R4E,G3E,R4E,F3E,R3E\r
+       .BYTE   035, 020\r
+       .BYTE   00, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   00, 020\r
+       .BYTE   02d, 020\r
+       .BYTE   00, 020\r
+       .BYTE   02b, 020\r
+       .BYTE   00, 020\r
+       ;.NOTE A3E,R3E,A3E,R3S,A3S,G3E\r
+       .BYTE   02e, 020\r
+       .BYTE   00, 020\r
+       .BYTE   02e, 020\r
+       .BYTE   00, 010\r
+       .BYTE   02e, 010\r
+       .BYTE   02d, 020\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+TCHAI3:\r
+       ;.NRATE 90.\r
+       .BYTE   80, 90.\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.SIGNTR S,4\r
+       ;.NOTE G4C,A4C,G4D,F4C,G4C,F4D,E4C,F4C,E4D,D4C,E4C,D4D    ;12/8\r
+       .BYTE   039, 016\r
+       .BYTE   03a, 016\r
+       .BYTE   039, 014\r
+       .BYTE   037, 016\r
+       .BYTE   039, 016\r
+       .BYTE   037, 014\r
+       .BYTE   035, 016\r
+       .BYTE   037, 016\r
+       .BYTE   035, 014\r
+       .BYTE   034, 016\r
+       .BYTE   035, 016\r
+       .BYTE   034, 014\r
+       ;.NOTE C4C,D4C,C4D,CN4C,DN4C,C4D,B3C,CS4C,B3D,A3C,B3C,A3D\r
+       .BYTE   032, 016\r
+       .BYTE   034, 016\r
+       .BYTE   032, 014\r
+       .BYTE   031, 016\r
+       .BYTE   033, 016\r
+       .BYTE   031, 014\r
+       .BYTE   030, 016\r
+       .BYTE   032, 016\r
+       .BYTE   030, 014\r
+       .BYTE   02e, 016\r
+       .BYTE   030, 016\r
+       .BYTE   02e, 014\r
+       ;.NOTE G3C,A3C,G3D,F3C,G3C,F3D,E3C,F3C,E3D,D3C,E3C,D3D\r
+       .BYTE   02d, 016\r
+       .BYTE   02e, 016\r
+       .BYTE   02d, 014\r
+       .BYTE   02b, 016\r
+       .BYTE   02d, 016\r
+       .BYTE   02b, 014\r
+       .BYTE   029, 016\r
+       .BYTE   02b, 016\r
+       .BYTE   029, 014\r
+       .BYTE   028, 016\r
+       .BYTE   029, 016\r
+       .BYTE   028, 014\r
+       ;.NOTE C3C,D3C,C3D,CN3C,D3C,C3D,B3C\r
+       .BYTE   026, 016\r
+       .BYTE   028, 016\r
+       .BYTE   026, 014\r
+       .BYTE   025, 016\r
+       .BYTE   028, 016\r
+       .BYTE   025, 014\r
+       .BYTE   030, 016\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+\r
+;TCHAIKOVSKY MELODIES\r
+\r
+TC1A:\r
+       ;.SIGNTR S,1\r
+       ;.NRATE 40              ;2/4 TIME\r
+       .BYTE   80, 40\r
+\r
+       ;.LOOP  2\r
+       .BYTE   8E, 2\r
+       ;.NOTE D4ST,D5ST,DS4ST,DS5S\r
+       .BYTE   033, 010\r
+       .BYTE   03f, 011\r
+       .BYTE   034, 011\r
+       .BYTE   040, 011\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.LOOP 2\r
+       .BYTE   8E, 2\r
+       ;.NOTE FN4ST,FN5ST,FS4ST,FS5S\r
+       .BYTE   036, 010\r
+       .BYTE   042, 011\r
+       .BYTE   037, 011\r
+       .BYTE   043, 011\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.LOOP 2\r
+       .BYTE   8E, 2\r
+       ;.NOTE A4ST,A5ST,B4ST,B5S\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 011\r
+       .BYTE   03c, 011\r
+       .BYTE   048, 011\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.LOOP 2\r
+       .BYTE   8E, 2\r
+       ;.NOTE D5ST,D6ST,DS5ST,DS6S\r
+       .BYTE   03f, 010\r
+       .BYTE   04b, 011\r
+       .BYTE   040, 011\r
+       .BYTE   04c, 011\r
+       ;.ENDL\r
+       .BYTE   8F, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+TC2A:\r
+       ;.SIGNTR S,1\r
+       ;.NRATE 40              ;2/4 TIME\r
+       .BYTE   80, 40\r
+       ;.NOTE R4X,F4S,F5S,F4S,F5T.T\r
+       .BYTE   00, 04\r
+       .BYTE   037, 010\r
+       .BYTE   043, 010\r
+       .BYTE   037, 010\r
+       .BYTE   043, 0c\r
+       ;.NOTE F5X,F4S,F5S,F4S,F5T.T\r
+       .BYTE   043, 05\r
+       .BYTE   037, 010\r
+       .BYTE   043, 010\r
+       .BYTE   037, 010\r
+       .BYTE   043, 0c\r
+       ;.NOTE F5X,A4S,A5S,A4S,A5T.T\r
+       .BYTE   043, 05\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 010\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 0c\r
+       ;.NOTE A5X,A4S,A5S,A4S,A5T.T\r
+       .BYTE   046, 05\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 010\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 0c\r
+       ;.NOTE A5X,C5S,C6S,DS5S,DS6T.T\r
+       .BYTE   046, 05\r
+       .BYTE   03d, 010\r
+       .BYTE   049, 010\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 0c\r
+       ;.NOTE DS6X,C5S,C6S,DS5S,DS6T.T\r
+       .BYTE   04c, 05\r
+       .BYTE   03d, 010\r
+       .BYTE   049, 010\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 0c\r
+       ;.NOTE DS6X,F5S,F6S,F5S,F6T.T\r
+       .BYTE   04c, 05\r
+       .BYTE   043, 010\r
+       .BYTE   04f, 010\r
+       .BYTE   043, 010\r
+       .BYTE   04f, 0c\r
+       ;.NOTE F6X,F5S,F6S,F5S,F6T.\r
+       .BYTE   04f, 05\r
+       .BYTE   043, 010\r
+       .BYTE   04f, 010\r
+       .BYTE   043, 010\r
+       .BYTE   04f, 0c\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+TC3A:\r
+       ;.SIGNTR S,1\r
+       ;.NRATE 40              ;2/4 TIME\r
+       .BYTE   80, 40\r
+       ;.NOTE R4T,A4S,A5S,A4S,A5TT\r
+       .BYTE   00, 08\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 010\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 08\r
+       ;.NOTE A5T,A4S,A5S,A4S,A5TT\r
+       .BYTE   046, 09\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 010\r
+       .BYTE   03a, 010\r
+       .BYTE   046, 08\r
+       ;.NOTE A5T,C5S,C6S,B4S,B5TT\r
+       .BYTE   046, 09\r
+       .BYTE   03d, 010\r
+       .BYTE   049, 010\r
+       .BYTE   03c, 010\r
+       .BYTE   048, 08\r
+       ;.NOTE B5T,C5S,C6S,B4S,B5TT\r
+       .BYTE   048, 09\r
+       .BYTE   03d, 010\r
+       .BYTE   049, 010\r
+       .BYTE   03c, 010\r
+       .BYTE   048, 08\r
+       ;.NOTE B5T,DS5S,DS6S,D5S,D6TT\r
+       .BYTE   048, 09\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 010\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 08\r
+       ;.NOTE DS6T,DS5S,DS6S,D5S,D6TT\r
+       .BYTE   04c, 09\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 010\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 08\r
+       ;.NOTE DS6T,A5S,A6S,A5S,A6TT\r
+       .BYTE   04c, 09\r
+       .BYTE   046, 010\r
+       .BYTE   052, 010\r
+       .BYTE   046, 010\r
+       .BYTE   052, 08\r
+       ;.NOTE A6T,A5S,A6S,A5S,A6T\r
+       .BYTE   052, 09\r
+       .BYTE   046, 010\r
+       .BYTE   052, 010\r
+       .BYTE   046, 010\r
+       .BYTE   052, 08\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+TC4A:\r
+       ;.SIGNTR S,1\r
+       ;.NRATE 40              ;2/4 TIME\r
+       .BYTE   80, 40\r
+       ;.NOTE R5T.,C5S,C6S,B4S,B6XT\r
+       .BYTE   00, 0c\r
+       .BYTE   03d, 010\r
+       .BYTE   049, 010\r
+       .BYTE   03c, 010\r
+       .BYTE   054, 04\r
+       ;.NOTE B6T.,C5S,C6S,B4S,B6XT\r
+       .BYTE   054, 0d\r
+       .BYTE   03d, 010\r
+       .BYTE   049, 010\r
+       .BYTE   03c, 010\r
+       .BYTE   054, 04\r
+       ;.NOTE B6T.,E5S,E6S,DS5S,DS6XT\r
+       .BYTE   054, 0d\r
+       .BYTE   041, 010\r
+       .BYTE   04d, 010\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 04\r
+       ;.NOTE DS6T.,E5S,E6S,DS5S,DS6XT\r
+       .BYTE   04c, 0d\r
+       .BYTE   041, 010\r
+       .BYTE   04d, 010\r
+       .BYTE   040, 010\r
+       .BYTE   04c, 04\r
+       ;.NOTE DS6T.,G5S,G6S,F5S,F6XT\r
+       .BYTE   04c, 0d\r
+       .BYTE   044, 010\r
+       .BYTE   050, 010\r
+       .BYTE   043, 010\r
+       .BYTE   04f, 04\r
+       ;.NOTE F6T.,G5S,G6S,F5S,F6XT\r
+       .BYTE   04f, 0d\r
+       .BYTE   044, 010\r
+       .BYTE   050, 010\r
+       .BYTE   043, 010\r
+       .BYTE   04f, 04\r
+       ;.NOTE F6T.,C6S,C7S,B6S,B7XT\r
+       .BYTE   04f, 0d\r
+       .BYTE   049, 010\r
+       .BYTE   055, 010\r
+       .BYTE   054, 010\r
+       .BYTE   060, 04\r
+       ;.NOTE C7T.,C6S,C7S,B5S,B6X\r
+       .BYTE   055, 0d\r
+       .BYTE   049, 010\r
+       .BYTE   055, 010\r
+       .BYTE   048, 010\r
+       .BYTE   054, 04\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+ON     = 1\r
+OFF    = 0\r
+\r
+JUMP:\r
+       ;.NRATE 100.\r
+       .BYTE   80, 100.\r
+       ;.SYN ON\r
+       .BYTE   8C, 0FF\r
+       ;.NOTE  C1TT,C2TT,C3TT,C4TT,C5TT,C6TT,FS5TT,C5TT,FS4TT,C4TT\r
+       .BYTE   0d, 08\r
+       .BYTE   019, 09\r
+       .BYTE   025, 09\r
+       .BYTE   031, 09\r
+       .BYTE   03d, 09\r
+       .BYTE   049, 09\r
+       .BYTE   043, 09\r
+       .BYTE   03d, 09\r
+       .BYTE   037, 09\r
+       .BYTE   031, 09\r
+       ;.NOTE  FS3TT,C3TT,FS2TT,C2TT,FS1TT,C1T\r
+       .BYTE   02b, 09\r
+       .BYTE   025, 09\r
+       .BYTE   01f, 09\r
+       .BYTE   019, 09\r
+       .BYTE   013, 09\r
+       .BYTE   0d, 09\r
+       ;.SYN OFF\r
+       .BYTE   8C, 0\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+\r
+\r
+;SCHERZO FROM EROICA\r
+BEETA1:\r
+       ;.SIGNTR F,3\r
+       ;.NRATE 0FF\r
+       .BYTE   80, 0FF\r
+       ;.NVOL MP\r
+       .BYTE   82, 5\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE B3Q\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3Q,C4Q,B3Q\r
+       .BYTE   02f, 040\r
+       .BYTE   031, 040\r
+       .BYTE   02f, 040\r
+       ;.NOTE C4Q,B3Q,C4Q\r
+       .BYTE   031, 040\r
+       .BYTE   02f, 040\r
+       .BYTE   031, 040\r
+       ;.NOTE B3Q,C4Q,B3Q\r
+       .BYTE   02f, 040\r
+       .BYTE   031, 040\r
+       .BYTE   02f, 040\r
+       ;.NOTE C4Q,B3Q,D4Q\r
+       .BYTE   031, 040\r
+       .BYTE   02f, 040\r
+       .BYTE   033, 040\r
+       ;.NOTE E4Q,F4Q,FS4Q\r
+       .BYTE   034, 040\r
+       .BYTE   036, 040\r
+       .BYTE   037, 040\r
+       ;.NOTE G4Q,AF4Q,AN4Q\r
+       .BYTE   038, 040\r
+       .BYTE   039, 040\r
+       .BYTE   03a, 040\r
+       ;.NOTE B4Q,B5Q,B5Q\r
+       .BYTE   03b, 040\r
+       .BYTE   047, 040\r
+       .BYTE   047, 040\r
+       ;.NOTE B5Q,B5Q,B5Q\r
+       .BYTE   047, 040\r
+       .BYTE   047, 040\r
+       .BYTE   047, 040\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE B5Q,C6E,B5E,AN5E,G5E\r
+       .BYTE   047, 040\r
+       .BYTE   049, 020\r
+       .BYTE   047, 020\r
+       .BYTE   046, 020\r
+       .BYTE   044, 020\r
+       ;.NOTE F5H.\r
+       .BYTE   042, 0c0\r
+       ;.NOTE E5H.\r
+       .BYTE   040, 0c0\r
+       ;.NOTE D5Q\r
+       .BYTE   03f, 040\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE F5Q,D5Q\r
+       .BYTE   042, 040\r
+       .BYTE   03f, 040\r
+       ;.AENV 0\r
+       .BYTE   87, 0\r
+       ;.NOTE C5Q\r
+       .BYTE   03d, 040\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE E5Q,C5Q\r
+       .BYTE   040, 040\r
+       .BYTE   03d, 040\r
+       ;.NOTE B4Q\r
+       .BYTE   03b, 040\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+BEETA2:\r
+       ;.SIGNTR F,3\r
+       ;.NRATE 0FF\r
+       .BYTE   80, 0FF\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE G3Q\r
+       .BYTE   02c, 040\r
+       ;.NOTE G3Q,A3Q,G3Q\r
+       .BYTE   02c, 040\r
+       .BYTE   02d, 040\r
+       .BYTE   02c, 040\r
+       ;.NOTE A3Q,G3Q,A3Q\r
+       .BYTE   02d, 040\r
+       .BYTE   02c, 040\r
+       .BYTE   02d, 040\r
+       ;.NOTE G3Q,A3Q,G3Q\r
+       .BYTE   02c, 040\r
+       .BYTE   02d, 040\r
+       .BYTE   02c, 040\r
+       ;.NOTE A3Q,G3Q,A3Q\r
+       .BYTE   02d, 040\r
+       .BYTE   02c, 040\r
+       .BYTE   02d, 040\r
+       ;.NOTE B3Q,B3Q,B3Q\r
+       .BYTE   02f, 040\r
+       .BYTE   02f, 040\r
+       .BYTE   02f, 040\r
+       ;.NOTE B3Q,F4Q,E4Q\r
+       .BYTE   02f, 040\r
+       .BYTE   036, 040\r
+       .BYTE   034, 040\r
+       ;.NOTE D4Q,F4Q,E4Q\r
+       .BYTE   033, 040\r
+       .BYTE   036, 040\r
+       .BYTE   034, 040\r
+       ;.NOTE D4Q,F4Q,E4Q\r
+       .BYTE   033, 040\r
+       .BYTE   036, 040\r
+       .BYTE   034, 040\r
+       ;.NOTE D4Q,D4Q,E4Q\r
+       .BYTE   033, 040\r
+       .BYTE   033, 040\r
+       .BYTE   034, 040\r
+       ;.NOTE F4Q,C4Q,D4Q\r
+       .BYTE   036, 040\r
+       .BYTE   031, 040\r
+       .BYTE   033, 040\r
+       ;.NOTE E4Q,B3Q,C4Q\r
+       .BYTE   034, 040\r
+       .BYTE   02f, 040\r
+       .BYTE   031, 040\r
+       ;.NOTE D4Q,AN3Q,B3Q\r
+       .BYTE   033, 040\r
+       .BYTE   02e, 040\r
+       .BYTE   02f, 040\r
+       ;.NOTE G3Q,C3Q,AN3Q\r
+       .BYTE   02c, 040\r
+       .BYTE   025, 040\r
+       .BYTE   02e, 040\r
+       ;.NOTE D4Q\r
+       .BYTE   033, 040\r
+       ;.ENDT\r
+       .BYTE   0, 0\r
+BEETA3:\r
+       ;.SIGNTR F,3\r
+       ;.NRATE 0FF\r
+       .BYTE   80, 0FF\r
+       ;.NVOL P\r
+       .BYTE   82, 3\r
+       ;.AENV 1\r
+       .BYTE   87, 1\r
+       ;.NOTE E3Q,E3Q,E3Q\r
+       .BYTE   028, 040\r
+       .BYTE   028, 040\r
+       .BYTE   028, 040\r
+       ;.NOTE E3Q,E3Q,E3Q\r
+       .BYTE   028, 040\r
+       .BYTE   028, 040\r
+       .BYTE   028, 040\r
+       ;.NOTE E3Q,E3Q,E3Q\r
+       .BYTE   028, 040\r
+       .BYTE   028, 040\r
+       .BYTE   028, 040\r
+       ;.NOTE E3Q,E3Q,F3Q\r
+       .BYTE   028, 040\r
+       .BYTE   028, 040\r
+       .BYTE   02a, 040\r
+       ;.NOTE G3Q,E3Q,D3Q\r
+       .BYTE   02c, 040\r
+       .BYTE   028, 040\r
+       .BYTE   027, 040\r
+       ;.NOTE E3Q,D3Q,C3Q\r
+       .BYTE   028, 040\r
+       .BYTE   027, 040\r
+       .BYTE   025, 040\r
+       ;.NOTE B2Q,D4Q,C4Q\r
+       .BYTE   023, 040\r
+       .BYTE   033, 040\r
+       .BYTE   031, 040\r
+       ;.NOTE B3Q,D4Q,C4Q\r
+       .BYTE   02f, 040\r
+       .BYTE   033, 040\r
+       .BYTE   031, 040\r
+       ;.NOTE B3Q,B3Q,C4Q\r
+       .BYTE   02f, 040\r
+       .BYTE   02f, 040\r
+       .BYTE   031, 040\r
+       ;.NOTE D4Q,AN3Q,BN3Q\r
+       .BYTE   033, 040\r
+       .BYTE   02e, 040\r
+    &n