First commit main
authorHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 22:03:46 +0000 (18:03 -0400)
committerHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 22:03:46 +0000 (18:03 -0400)
15 files changed:
A35127.XX [new file with mode: 0644]
A35131.1A [new file with mode: 0644]
A35131.1B [new file with mode: 0644]
A35131.1C [new file with mode: 0644]
A35131.1D [new file with mode: 0644]
A35131.1E [new file with mode: 0644]
ASTDEC.XX [new file with mode: 0644]
ASTROD.DOC [new file with mode: 0644]
ASTROD.MAP [new file with mode: 0644]
COIN65.XX [new file with mode: 0644]
RTMLCR.XX [new file with mode: 0644]
RTMUL.XX [new file with mode: 0644]
VECAN.XX [new file with mode: 0644]
VECINC.XX [new file with mode: 0644]
VECMAC.XX [new file with mode: 0644]

diff --git a/A35127.XX b/A35127.XX
new file mode 100644 (file)
index 0000000..f699bd4
--- /dev/null
+++ b/A35127.XX
@@ -0,0 +1,581 @@
+       .TITLE ASTVEC - ASTEROID STATIC VECTORS\r
+       .RADIX 10\r
+       .ASECT\r
+       .SBTTL *****************************\r
+       .SBTTL *                           *\r
+       .SBTTL * PROGRAMMER:  ED LOGG     *\r
+       .SBTTL *                           *\r
+       .SBTTL *****************************\r
+       \r
+       .GLOBL SHIPS,ROCKS,EXPPIC,SAUCER,EXPSHP ;GLOBAL ENTRY POINTS\r
+       .GLOBL TEST1,BNKERR                     ;SELF TEST PATTERNS\r
+       .GLOBL EXPDIR,ASTMSG,L0,SINCOS,SHIP17\r
+       \r
+       .REPT 0\r
+\r
+DATE INITIATED:                23-FEB-79\r
+\r
+PROJECT CHARGE #:      21503\r
+\r
+DISK #:                        32 (BACKUP B46)\r
+\r
+OTHER INFORMATION:     SEE FILE 'ASTROD'\r
+\r
+ASSEMBLY COMMAND:      R MAC65\r
+                       ASTVEC/A\r
+\r
+LINK COMMAND:          SEE FILE 'ASTROD'\r
+\r
+       .ENDR\r
+       .INCLUDE VECMAC\r
+       \r
+;ASCIN - TAKE AN ASCII STRING AND MAP 3 CHARACTERS TO 2 BYTES\r
+;\r
+;THIS MACRO PACKS 3 ASCII CHARACTERS (BLANK, A THRU Z,0,1 OR 2) INTO 2\r
+;BYTES IN THE FORMAT\r
+;      AAAAABBB BBCCCCCD\r
+;WHERE D=1 MEANS END OF LIST\r
+;      AAAAA,BBBBB,CCCCC=INDEX AS FOLLOWS\r
+;      0=END OF LIST\r
+;      1=BLANK\r
+;      2=0\r
+;      3=1\r
+;      4=2\r
+;      5=A\r
+;      ETC.\r
+       .MACRO ASCIN STRING\r
+       ..N=0\r
+       .NCHR ..C,<STRING>\r
+       .ENABL M68\r
+       .IRPC ..5,<STRING>\r
+       ..4=''..5\r
+       ..C=..C-1\r
+       ..3=0\r
+       .IIF EQ,..4-^H20,..3=1\r
+       .IF GE,..4-^H30\r
+       .IIF LT,..4-^H33,..3=..4-^H30+2\r
+       .ENDC\r
+       .IF GE,..4-^H41\r
+       .IIF LT,..4-^H5B,..3=..4-^H41+5\r
+       .ENDC\r
+       .IIF EQ,..N,..1=..3\r
+       .IIF EQ,..N-1,..2=..3\r
+       ..N=..N+1\r
+       .IF EQ,..N-3\r
+       ..N=0\r
+       .IIF EQ,..C,.WORD <..1*^H800>+<..2*^H40>+<..3*2>+1\r
+       .IIF NE,..C,.WORD <..1*^H800>+<..2*^H40>+<..3*2>\r
+       .ENDC\r
+       .ENDM\r
+       .IIF EQ,..N-1,.WORD ..1*^H800\r
+       .IIF EQ,..N-2,.WORD <..1*^H800>+<..2*^H40>\r
+       .DSABL M68\r
+       .ENDM\r
+       \r
+       \r
+.BRITE =7                      ;VECTOR BRIGHTNESS\r
+.BRITR =.BRITE+5\r
+       .=^H5000\r
+\r
+TEST1: LABS 0,128              ;JMPL USED TO START THIS TEST\r
+       WAIT 7\r
+       VCTR 1023,0,.BRITE              ;DRAW EDGE OF SCREEN\r
+       VCTR 0,767,.BRITE\r
+       VCTR -1023,0,.BRITE\r
+       VCTR 0,-767,.BRITE\r
+       VCTR 767,767,.BRITE             ;DRAW 45 DEGREE LINES\r
+       VCTR 256,-256,.BRITE\r
+       VCTR -511,-511,.BRITE\r
+       VCTR -512,512,.BRITE\r
+       VCTR 256,255,.BRITE\r
+       VCTR 767,-767,.BRITE\r
+       LABS 1023,895           ;DRAW THE OTHER 45 DEGREE LINES\r
+       WAIT 7\r
+       VCTR -767,-767,.BRITE\r
+       VCTR -256,255,.BRITE\r
+       VCTR 512,512,.BRITE\r
+       VCTR 511,-511,.BRITE\r
+       VCTR -256,-256,.BRITE\r
+       VCTR -767,767,.BRITE\r
+       LABS 500,508\r
+       WAIT 7\r
+       VCTR 24,0,13\r
+       VCTR 0,4,0\r
+       VCTR -24,0,12\r
+       VCTR 0,4,0\r
+       VCTR 24,0,11\r
+       VCTR 0,4,0\r
+       VCTR -24,0,10\r
+       VCTR 0,4,0\r
+       VCTR 24,0,9\r
+       VCTR 0,4,0\r
+       VCTR -24,0,8\r
+       VCTR 0,4,0\r
+       VCTR 24,0,7\r
+       VCTR 0,4,0\r
+       VCTR -24,0,6\r
+       VCTR 0,4,0\r
+       VCTR 24,0,5\r
+       VCTR 0,4,0\r
+       VCTR -24,0,4\r
+       VCTR 0,4,0\r
+       VCTR 24,0,3\r
+       VCTR 0,4,0\r
+       VCTR -24,0,2\r
+       RTSL\r
+\r
+       .=.-2\r
+CKSUM0:        .BYTE ^H04C             ;CHKSUM FOR 5000-53FF\r
+       .=.+1\r
+\r
+BNKERR:        LABS 300,228,1          ;SELF-TEST ERROR MESSAGE\r
+       WAIT 7                  ;FOR BANK SELECT NOT WORKING\r
+       ALPHA <PAGE SELECT ERROR>\r
+       RTSL\r
+       \r
+       \r
+ASTMSG:        LABS 380,128            ;ASTEROIDS COPY RIGHT MESSAGE\r
+       WAIT 7\r
+       ALPHA <ASTEROIDS BY ATARI>\r
+       RTSL\r
+\r
+\r
+       \r
+       \r
+EXPSHP:        VCTR    -8,-12,.BRITR   ;PICTURES OF SHIP PIECES FOR EXPLOSION\r
+       VCTR    4,-8,.BRITR     ;THESE MUST BE ALPH INSTRUCTIONS\r
+       VCTR    6,2,.BRITR\r
+       VCTR    -8,8,.BRITR\r
+       VCTR    -6,2,.BRITR\r
+       VCTR    4,-4,.BRITR\r
+       \r
+EXPDIR:        .BYTE   -40,30          ;(X,Y) CHANGE IN DIRECTION\r
+       .BYTE   50,-20          ;ALSO USED FOR STARTING POSITION OF EACH\r
+       .BYTE   0,-60           ;EXPLODING PIECE\r
+       .BYTE   60,20\r
+       .BYTE   10,70\r
+       .BYTE   -40,-40\r
+\r
+\r
+EXPPIC:        JSRL    EXP10           ;10/16 SIZE OF EXPLOSION\r
+       JSRL    EXP12           ;12/16 SIZE OF EXPLOSION\r
+       JSRL    EXP14           ;14/16 SIZE OF EXPLOSION\r
+       JSRL    EXP16           ;EXPOLOSION PICTURES-FULL PICTURE\r
+       \r
+EXP16: VCTR    -16,0,0         ;16/16 PICTURE OF EXPLOSION\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -16,-16,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    16,-16,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    24,8,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    16,-8,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    0,16,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    8,24,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -8,24,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -32,-8,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -24,8,0\r
+       VCTR    0,0,.BRITE\r
+       RTSL\r
+\r
+EXP14: VCTR    -14,0,0                 ;14/16 PICTURE OF EXPLOSION\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -14,-14,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    14,-14,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    21,7,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    14,-7,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    0,14,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    7,21,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -7,21,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -28,-7,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -21,7,0\r
+       VCTR    0,0,.BRITE\r
+       RTSL\r
+       \r
+EXP12: VCTR    -12,0,0                 ;12/16 PICTURE OF EXPLOSION\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -12,-12,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    12,-12,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    18,6,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    12,-6,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    0,12,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    6,18,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -6,18,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -24,-6,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -18,6,0\r
+       VCTR    0,0,.BRITE\r
+       RTSL\r
+       \r
+EXP10: VCTR    -10,0,0                 ;10/16 PICTURE OF EXPLOSION\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -10,-10,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    10,-10,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    15,5,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    10,-5,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    0,10,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    5,15,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -5,15,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -20,-5,0\r
+       VCTR    0,0,.BRITE\r
+       VCTR    -15,5,0\r
+       VCTR    0,0,.BRITE\r
+       RTSL\r
+       \r
+       \r
+ROCKS: JSRL ROCK1                      ;JSRL TABLE FOR ASTEROID PICTURES\r
+       JSRL ROCK2\r
+       JSRL ROCK3\r
+       JSRL ROCK4\r
+       \r
+ROCK1: VCTR    0,16,0\r
+       VCTR    16,16,.BRITE\r
+       VCTR    16,-16,.BRITE\r
+       VCTR    -8,-16,.BRITE\r
+       VCTR    8,-16,.BRITE\r
+       VCTR    -24,-16,.BRITE+1\r
+       VCTR    -24,0,.BRITE+1\r
+       VCTR    -16,16,.BRITE\r
+       VCTR    0,32,.BRITE\r
+       VCTR    16,16,.BRITE\r
+       VCTR    16,-16,.BRITE\r
+       RTSL\r
+       \r
+ROCK2: VCTR    16,8,0\r
+       VCTR    16,8,.BRITE\r
+       VCTR    -16,16,.BRITE\r
+       VCTR    -16,-8,.BRITE\r
+       VCTR    -16,8,.BRITE\r
+       VCTR    -16,-16,.BRITE\r
+       VCTR    8,-16,.BRITE\r
+       VCTR    -8,-16,.BRITE\r
+       VCTR    16,-16,.BRITE\r
+       VCTR    8,8,.BRITE\r
+       VCTR    24,-8,.BRITE+1\r
+       VCTR    16,24,.BRITE+1\r
+       VCTR    -16,16,.BRITE\r
+       RTSL\r
+       \r
+ROCK3: VCTR    -16,0,0\r
+       VCTR    -16,-8,.BRITE\r
+       VCTR    16,-24,.BRITE\r
+       VCTR    16,24,.BRITE\r
+       VCTR    0,-24,.BRITE\r
+       VCTR    16,0,.BRITE\r
+       VCTR    16,24,.BRITE\r
+       VCTR    0,16,.BRITE\r
+       VCTR    -16,24,.BRITE\r
+       VCTR    -24,0,.BRITE\r
+       VCTR    -24,-24,.BRITE\r
+       VCTR    16,-8,.BRITE\r
+       RTSL\r
+\r
+ROCK4: VCTR    8,0,0\r
+       VCTR    24,8,.BRITE\r
+       VCTR    0,8,.BRITE-1\r
+       VCTR    -24,16,.BRITE\r
+       VCTR    -24,0,.BRITE\r
+       VCTR    8,-16,.BRITE-1\r
+       VCTR    -24,0,.BRITE\r
+       VCTR    0,-24,.BRITE\r
+       VCTR    16,-24,.BRITE\r
+       VCTR    24,8,.BRITE\r
+       VCTR    8,-8,.BRITE-1\r
+       VCTR    16,16,.BRITE-1\r
+       VCTR    -24,16,.BRITE\r
+       RTSL\r
+       \r
+SAUCER:        JSRL 10$\r
+\r
+10$:   VCTR    -16,8,0\r
+       VCTR    32,0,.BRITR\r
+       VCTR    24,-16,0\r
+       VCTR    -80,0,.BRITR+1\r
+       VCTR    24,-16,.BRITR+1\r
+       VCTR    32,0,.BRITR\r
+       VCTR    24,16,.BRITR+1\r
+       VCTR    -24,16,.BRITR+1\r
+       VCTR    -8,16,.BRITR\r
+       VCTR    -16,0,.BRITR\r
+       VCTR    -8,-16,.BRITR\r
+       VCTR    -24,-16,.BRITR+1\r
+       RTSL\r
+       \r
+       \r
+SHIPS: .WORD SHIP0                     ;JSRL TABLE FOR SHIP PICTURES\r
+       .WORD SHIP1\r
+       .WORD SHIP2\r
+       .WORD SHIP3\r
+       .WORD SHIP4\r
+       .WORD SHIP5\r
+       .WORD SHIP6\r
+       .WORD SHIP7\r
+       .WORD SHIP8\r
+       .WORD SHIP9\r
+       .WORD SHIP10\r
+       .WORD SHIP11\r
+       .WORD SHIP12\r
+       .WORD SHIP13\r
+       .WORD SHIP14\r
+       .WORD SHIP15\r
+       .WORD SHIP16\r
+       \r
+SHIP0:\r
+              VCTR -24,-16,0\r
+              VCTR  0, 32,.BRITR\r
+              VCTR -16, 16,.BRITR-1\r
+              VCTR  96,-32,.BRITR\r
+              VCTR -96,-32,.BRITR\r
+              VCTR  16, 16,.BRITR-1\r
+              RTSL\r
+               VCTR -32,16,.BRITR              ;FLAME PICTURE AFTER SHIP PICTURE\r
+               VCTR 32,16,.BRITR\r
+               RTSL\r
+SHIP1:\r
+              VCTR -22,-18,0\r
+              VCTR -3, 32,.BRITR\r
+              VCTR -17, 14,.BRITR\r
+              VCTR  99,-22,.BRITR\r
+              VCTR -92,-41,.BRITR\r
+              VCTR  14, 17,.BRITR\r
+              RTSL\r
+               VCTR -33,13,.BRITR\r
+               VCTR 30,19,.BRITR\r
+               RTSL\r
+SHIP2:\r
+              VCTR -20,-20,0\r
+              VCTR -6, 31,.BRITR\r
+              VCTR -19, 13,.BRITR\r
+              VCTR  100,-13,.BRITR\r
+              VCTR -88,-50,.BRITR\r
+              VCTR  13, 19,.BRITR\r
+              RTSL\r
+               VCTR -35,9,.BRITR\r
+               VCTR 28,22,.BRITR\r
+               RTSL\r
+SHIP3:\r
+              VCTR -18,-22,0\r
+              VCTR -9, 31,.BRITR\r
+              VCTR -20, 11,.BRITR\r
+              VCTR  101,-3,.BRITR\r
+              VCTR -83,-58,.BRITR\r
+              VCTR  11, 20,.BRITR\r
+              RTSL\r
+               VCTR -35,6,.BRITR\r
+               VCTR 26,25,.BRITR\r
+               RTSL\r
+SHIP4:\r
+              VCTR -16,-24,0\r
+              VCTR -12, 30,.BRITR\r
+              VCTR -21, 9,.BRITR\r
+              VCTR  101, 7,.BRITR\r
+              VCTR -76,-66,.BRITR\r
+              VCTR  9, 21,.BRITR\r
+              RTSL\r
+               VCTR -36,3,.BRITR\r
+               VCTR 23,27,.BRITR\r
+               RTSL\r
+SHIP5:\r
+              VCTR -14,-25,0\r
+              VCTR -15, 28,.BRITR\r
+              VCTR -22, 7,.BRITR\r
+              VCTR  100, 17,.BRITR\r
+              VCTR -70,-73,.BRITR\r
+              VCTR  7, 22,.BRITR\r
+              RTSL\r
+               VCTR -36,-1,.BRITR\r
+               VCTR 21,29,.BRITR\r
+               RTSL\r
+SHIP6:\r
+              VCTR -11,-27,0\r
+              VCTR -18, 27,.BRITR\r
+              VCTR -22, 4,.BRITR\r
+              VCTR  98, 27,.BRITR\r
+              VCTR -62,-80,.BRITR\r
+              VCTR  4, 22,.BRITR\r
+              RTSL\r
+               VCTR -35,-4,.BRITR\r
+               VCTR 18,31,.BRITR\r
+               RTSL\r
+SHIP7:\r
+              VCTR -8,-28,0\r
+              VCTR -20, 25,.BRITR\r
+              VCTR -23, 2,.BRITR\r
+              VCTR  95, 36,.BRITR\r
+              VCTR -54,-86,.BRITR\r
+              VCTR  2, 23,.BRITR\r
+              RTSL\r
+               VCTR -35,-8,.BRITR\r
+               VCTR 15,33,.BRITR\r
+               RTSL\r
+SHIP8:\r
+              VCTR -6,-28,0\r
+              VCTR -23, 23,.BRITR\r
+              VCTR -23, 0,.BRITR\r
+              VCTR  91, 45,.BRITR\r
+              VCTR -45,-91,.BRITR\r
+              VCTR  0, 23,.BRITR\r
+              RTSL\r
+               VCTR -34,-11,.BRITR\r
+               VCTR 11,34,.BRITR\r
+               RTSL\r
+SHIP9:\r
+              VCTR -3,-29,0\r
+              VCTR -25, 20,.BRITR\r
+              VCTR -23,-2,.BRITR\r
+              VCTR  86, 54,.BRITR\r
+              VCTR -36,-95,.BRITR\r
+              VCTR -2, 23,.BRITR\r
+              RTSL\r
+               VCTR -33,-15,.BRITR\r
+               VCTR 8,35,.BRITR\r
+               RTSL\r
+SHIP10:\r
+              VCTR  0,-29,0\r
+              VCTR -27, 18,.BRITR\r
+              VCTR -22,-4,.BRITR\r
+              VCTR  80, 62,.BRITR\r
+              VCTR -27,-98,.BRITR\r
+              VCTR -4, 22,.BRITR\r
+              RTSL\r
+               VCTR -31,-18,.BRITR\r
+               VCTR 4,35,.BRITR\r
+               RTSL\r
+SHIP11:\r
+              VCTR  3,-29,0\r
+              VCTR -28, 15,.BRITR\r
+              VCTR -22,-7,.BRITR\r
+              VCTR  73, 70,.BRITR\r
+              VCTR -17,-100,.BRITR\r
+              VCTR -7, 22,.BRITR\r
+              RTSL\r
+               VCTR -29,-21,.BRITR\r
+               VCTR 1,36,.BRITR\r
+               RTSL\r
+SHIP12:\r
+              VCTR  6,-28,0\r
+              VCTR -30, 12,.BRITR\r
+              VCTR -21,-9,.BRITR\r
+              VCTR  66, 76,.BRITR\r
+              VCTR -7,-101,.BRITR\r
+              VCTR -9, 21,.BRITR\r
+              RTSL\r
+               VCTR -27,-23,.BRITR\r
+               VCTR -3,36,.BRITR\r
+               RTSL\r
+SHIP13:\r
+              VCTR  8,-28,0\r
+              VCTR -31, 9,.BRITR\r
+              VCTR -20,-11,.BRITR\r
+              VCTR  58, 83,.BRITR\r
+              VCTR  3,-101,.BRITR\r
+              VCTR -11, 20,.BRITR\r
+              RTSL\r
+               VCTR -25,-26,.BRITR\r
+               VCTR -6,35,.BRITR\r
+               RTSL\r
+SHIP14:\r
+              VCTR  11,-27,0\r
+              VCTR -31, 6,.BRITR\r
+              VCTR -19,-13,.BRITR\r
+              VCTR  50, 88,.BRITR\r
+              VCTR  13,-100,.BRITR\r
+              VCTR -13, 19,.BRITR\r
+              RTSL\r
+               VCTR -22,-28,.BRITR\r
+               VCTR -9,35,.BRITR\r
+               RTSL\r
+SHIP15:\r
+              VCTR  14,-25,0\r
+              VCTR -32, 3,.BRITR\r
+              VCTR -17,-14,.BRITR\r
+              VCTR  41, 92,.BRITR\r
+              VCTR  22,-99,.BRITR\r
+              VCTR -14, 17,.BRITR\r
+              RTSL\r
+               VCTR -19,-30,.BRITR\r
+               VCTR -13,33,.BRITR\r
+               RTSL\r
+SHIP16:\r
+              VCTR  16,-24,0\r
+              VCTR -32, 0,.BRITR\r
+              VCTR -16,-16,.BRITR\r
+              VCTR  32, 96,.BRITR\r
+              VCTR  32,-96,.BRITR\r
+              VCTR -16, 16,.BRITR\r
+              RTSL\r
+               VCTR -16,-32,.BRITR\r
+               VCTR -16,32,.BRITR\r
+               RTSL\r
+\r
+SHIP17:                VCTR -16,-24,0  ;SHIP FOR NUMBER OF LIVES\r
+               VCTR 32,0,.BRITE\r
+               VCTR 16,-16,.BRITE\r
+               VCTR -32,96,.BRITE\r
+               VCTR -32,-96,.BRITE\r
+               VCTR 16,16,.BRITE\r
+               VCTR 80,24,0\r
+               RTSL\r
+\r
+       .=.-2\r
+CKSUM1:        .BYTE ^H032             ;CHKSUM FOR 5400-57FF\r
+       .=.+1\r
+\r
+\f      .INCLUDE VECAN\r
+L0:    .BYTE 10$-L0,11$-L0,12$-L0,13$-L0,14$-L0\r
+       .BYTE 15$-L0,16$-L0,17$-L0,18$-L0,19$-L0\r
+       .BYTE 20$-L0\r
+10$:   ASCIN ^/HIGH SCORES/\r
+11$:   ASCIN ^/PLAYER /\r
+12$:   ASCIN ^/YOUR SCORE IS ONE OF THE TEN BEST/\r
+13$:   ASCIN ^/PLEASE ENTER YOUR INITIALS/\r
+14$:   ASCIN ^/PUSH ROTATE TO SELECT LETTER/\r
+15$:   ASCIN ^/PUSH HYPERSPACE WHEN LETTER IS CORRECT/\r
+16$:   ASCIN ^/PUSH START/\r
+17$:   ASCIN ^/GAME OVER/\r
+18$:   ASCIN ^/1 COIN 2 PLAYS/\r
+19$:   ASCIN ^/1 COIN 1 PLAY/\r
+20$:   ASCIN ^/2 COINS 1 PLAY/\r
+SINCOS:        .BYTE 0,3,6,9,12,16,19,22       ;SIN(0 TO 7)\r
+       .BYTE 25,28,31,34,37,40,43,46\r
+       .BYTE 49,51,54,57,60,63,65,68\r
+       .BYTE 71,73,76,78,81,83,85,88\r
+       .BYTE 90,92,94,96,98,100,102,104\r
+       .BYTE 106,107,109,111,112,113,115,116\r
+       .BYTE 117,118,120,121,122,122,123,124\r
+       .BYTE 125,125,126,126,126,127,127,127   ;SIN(0-63)\r
+       .BYTE 127               ;SIN(64)\r
+       .NLIST MEB\r
+       .REPT ^H5800-.\r
+       .BYTE 0                 ;FILL WITH ZEROS\r
+       .ENDR\r
+       .END\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
\ No newline at end of file
diff --git a/A35131.1A b/A35131.1A
new file mode 100644 (file)
index 0000000..651d325
--- /dev/null
+++ b/A35131.1A
@@ -0,0 +1,2441 @@
+       .TITLE ASTROD (21503)\r
+       .ASECT\r
+       .ENABLE AMA\r
+       .RADIX 16\r
+;***********************************************\r
+;*\r
+;*DATE INITIATED:              23-FEB-79\r
+;*\r
+;*PROJECT CHARGE #:            21503\r
+;*\r
+;*DISK #:                      32 (BACKUP B46)\r
+;*\r
+;*HARDWARE REQUIREMENTS:       VECTOR HARDWARE WITH PAGE SELECT ON 2\r
+;*\r
+;*\r
+;*MEMORY REQUIREMENTS:         VECTOR RAM:  4000-47FF (2K)\r
+;*                             VECTOR ROM:  5000-57FF (2K)\r
+;*                             PROGRAM ROM: 6800-7FFF (6K)\r
+;*                             SCRATCH:     PAGE 0\r
+;*                             STACK:       PAGE 1\r
+;*                             PLAYER1:     PAGE 2\r
+;;*                            PLAYER2:     PAGE 3\r
+;*\r
+;*INTERRUPTS:                  NMI (4 MS)\r
+;*\r
+;*ASSEMBLY COMMAND STRING:     R MAC65\r
+;*                             ASTROD/A/C\r
+;*\r
+;*LINK COMMAND:                        OUTPUT(S)=DX1:ASTVEC,ASTROD,ASTMSG,ASTNMI,VECUT,ASTTST\r
+;*\r
+;*PROGRAM DESCRIPTION:         THIRD PERSON VIEW OF A SPACE SHIP\r
+;*                             WITH ASTEROIDS THROUGHOUT SPACE.\r
+;*                             LARGE ASTEROIDS BREAK UP WHEN\r
+;*                             HIT AND SMALLER ASTEROIDS DISINTEGRATE\r
+;*                             WHEN HIT. A LARGE AND SMALL\r
+;*                             SAUCER ALSO APPEAR TO SHOOT AT\r
+;*                             THE SHIP\r
+;*\r
+;*CONTROLS:                    ROTATE LEFT, ROTATE RIGHT, THRUST, FIRE\r
+;*                             AND HYPERSPACE BUTTONS\r
+;*\r
+;*******************************************************\r
+       .SBTTL ************************\r
+       .SBTTL *\r
+       .SBTTL *PROGRAMMER: ED LOGG\r
+       .SBTTL *\r
+       .SBTTL ************************\r
+       .PAGE\r
+       .SBTTL GLOBAL SYMBOL DECLARATIONS\r
+;\r
+;ENTRY POINTS\r
+;\r
+       .GLOBL START\r
+;\r
+;\r
+;EXTERNAL ENTRY POINTS\r
+;\r
+       .GLOBL VGHALT,VGVCTR,VGRTSL,VGMSGA              ;UTILITY ROUTINES(SEE VECUT.MAC)\r
+       .GLOBL VGJMPL,VGJSRL,VGLABS\r
+       .GLOBL VGADD,VGWAIT\r
+       .GLOBL VGHEX,VGHEXZ,VGSABS,VGDOT\r
+       .GLOBL SHIPS,ROCKS,EXPPIC,SAUCER        ;PICTURES OF SHIP AND ASTEROIDS\r
+       .GLOBL VGMSG                            ;MESSAGE PROCESSOR\r
+       .GLOBL PWRON                            ;ENTRY POINTS FOR ASTTST.MAC\r
+       .GLOBL EXPSHP,EXPDIR                    ;EXPLODING SHIP PICTURES\r
+       .GLOBL ASTMSG                           ;COPYRIGHT MESSAGE\r
+       .GLOBL SINCOS,SHIP17\r
+;\r
+;ZERO PAGE GLOBALS\r
+;\r
+       .GLOBL VGSIZE,XCOMP,TEMP1,VGLIST,VGBRIT\r
+       .GLOBL SYNC,LOUT1,TEMP3,UPDFLG,SND3,FRAME,TEMP2,TEMP4\r
+       .GLOBL $CCTIM,$$CRDT,$CMODE,$PSTSL,$LMTIM,$CNCT,$CNSTT,$INTCT\r
+\r
+\r
+       .INCLUDE ASTDEC\r
+\r
+\r
+       .SBTTL PAGE 0 DECLARATIONS\r
+       \r
+VGSIZE:        .BLKB 1                 ;SCALING SIZE (0,10,20,...,F0)\r
+VGBRIT:        .BLKB 1                 ;VECTOR BRIGHTNESS (0=OFF, F0=MAX, 10INC)\r
+VGLIST:        .BLKB 2                 ;VECTOR LIST POINTER\r
+XCOMP: .BLKB 4                 ;X COMPONENT FOR VECTORS\r
+TEMP1: .BLKB 2                 ;SCRATCH\r
+TEMP2: .BLKB 2\r
+TEMP3: .BLKB 8                 ;8 CKSUMS IN SELF TEST\r
+TEMP4: .BLKB 3\r
+PLAYR: .BLKB 1                 ;PLAYER NUMBER (0 OR 1)\r
+PLAYR2:        .BLKB 1                 ;PLAYER NUMBER *2 (0 OR 2)\r
+LPLAYR:        .BLKB 2                 ;THE VALUE OF NPLAYR FOR LAST GAME\r
+NPLAYR:        .BLKB 1                 ;NUMBER OF PLAYERS (1 OR 2)(0=END OF GAME)(-1=UPDATE HIGH SCORES)\r
+HSCORE:        .BLKB 2*10.             ;HIGH SCORES (LSB,MSB)\r
+UPDINT:        .BLKB 1                 ;0,1, OR 2 TO INDICATE WHICH INITIAL IS BEING SELECTED\r
+UPDFLG:        .BLKB 2                 ;POSITIVE MEANS THIS PLAYER HAS SET NEW HIGH SCORE\r
+INITL: .BLKB 3*10.             ;INITIALS FOR HIGH SCORE (FIRST,SECOND,THRID)\r
+SCORE: .BLKB 2*2               ;PLAYER 1 AND 2 SCORES (LSB1,MSB1,LSB2,MSB2)\r
+NHITS: .BLKB 1                 ;STARTING NUMBER OF HITS PER PLAYER\r
+HITS:  .BLKB 2                 ;NUMBER OF HITS REMAINING (=0 FOR ATTRACT MODE)\r
+RENTRY:        .BLKB 1                 ;BLOW UP ON REENTRY IF NEGATIVE (NON-ZERO\r
+                               ;IF HE JUST HYPERSPACED)\r
+GDELAY:        .BLKB 1                 ;DELAY BEFORE STARTING GAME\r
+SYNC:  .BLKB 1                 ;FRAME COUNTER SYNC\r
+FRAME: .BLKB 2                 ;FRAME COUNTER\r
+$INTCT:        .BLKB 1                 ;INTERRUPT COUNTER\r
+POLYL: .BLKB 1                 ;POLY COUNTER VALUES\r
+POLYH: .BLKB 1 \r
+ANGLE: .BLKB 2                 ;ANGLE OF ROTATION OF SHIP AND SAUCER\r
+LASTSW:        .BLKB 1                 ;LAST SWITCH READING\r
+XINCL: .BLKB 1                 ;SHIPS LSB FOR X INCREMENT\r
+YINCL: .BLKB 1                 ;SHIPS LSB FOR Y INCREMENT\r
+SND1:  .BLKB 1                 ;NEGATIVE TO START SHIPS FIRE SOUND ELSE LENGTH OF SOUND\r
+SND2:  .BLKB 1                 ;NEGATIVE TO START SAUCER FIRE SOUND ELSE LENGTH OF SOUND\r
+SND3:  .BLKB 1                 ;LENGTH OF TONE SOUND\r
+LEXPSND:.BLKB 1                        ;LAST VALUE FOR EXPLOSION SOUND (SEE EXPSND)\r
+LSND1: .BLKB 1                 ;LAST VALUE FOR SHIP FIRE SOUND (SEE SHPFIR)\r
+LSND2: .BLKB 1                 ;LAST VALUE FOR SAUCER FIRE SOUND (SEE SCRFIR)\r
+LTHUMP:        .BLKB 1                 ;LAST VALUE FOR THUMP SOUND (SEE THUMP)\r
+THUMP1:        .BLKB 1                 ;LENGTH OF THUMP SOUNDS\r
+THUMP2:        .BLKB 1                 ;LENGTH BETWEEN THUMP SOUNDS\r
+LOUT1: .BLKB 1                 ;LAST VALUE OF OUTPUT LATCH\r
+$$CRDT:        .BLKB 1                 ;COIN ROUTINE DEFINITION (SEE COIN65.MAC)       \r
+\r
+$CMODE:        .BLKB 1\r
+$LMTIM:        .BLKB 1\r
+$CNCT: .BLKB 1\r
+$CCTIM:        .BLKB 3\r
+$PSTSL:        .BLKB 3\r
+$CNSTT:        .BLKB 3\r
+SHIPX: .BLKB 2*6               ;EXPLOSION PICTURE X POSITION (LSB,MSB)\r
+SHIPY: .BLKB 2*6               ;       "       "  Y    "       "\r
+\r
+\r
+       .SBTTL PAGE 2 AND 3 DECLARATIONS\r
+\r
+       .=200\r
+OBJ:   .BLKB NOBJ+8            ;ZERO IF OBJECT NOT ACTIVE- OTHERWISE PICTURE NUMBER\r
+                               ;BITS 0-2=SIZE, 1=SMALL, 2=MEDIUM, 4=LARGE\r
+                               ;BITS 3-6=PICTURE NUMBER\r
+XINC:  .BLKB NOBJ+8            ;X INCREMENT FOR UPDATING POSITION(S8999.BBB)\r
+YINC:  .BLKB NOBJ+8            ;Y INCREMENT FOR UPDATING POSITION(S9999.BBB)\r
+OBJXH: .BLKB NOBJ+8            ;X POSITION OF OBJECT (HIGH ORDER)(00099999)\r
+OBJYH: .BLKB NOBJ+8            ;Y POSITION OF OBJECT (HIGH ORDER)(00099999)\r
+OBJXL: .BLKB NOBJ+8            ;X POSITION OF OBJECT (LOW ORDER)(99999.BBB)\r
+OBJYL: .BLKB NOBJ+8            ;Y POSITION OF OBJECT (LOW ORDER)(99999.BBB)\r
+SROCKS:        .BLKB 1                 ;NUMBER OF ROCKS TO START WITH\r
+NROCKS:        .BLKB 1                 ;CURRENT NUMBER OF ROCKS\r
+EDELAY:        .BLKB 1                 ;DELAY BEFORE ENEMY ENTRY OR FIRING\r
+SEDLAY:        .BLKB 1                 ;STARTING ENEMY DELAY\r
+RTIMER:        .BLKB 1                 ;ROCK TIME - IF 0 SEND IN SAUCER ANYWAY\r
+SDELAY:        .BLKB 1                 ;DELAY COUNT BEFORE ADDING SHIP (80=SHIP JUST DESTROYED)\r
+RDELAY:        .BLKB 1                 ;DELAY COUNT BEFORE ADDING ROCKS\r
+THUMP3:        .BLKB 1                 ;STARTING VALUE FOR THUMP2\r
+DIFCTY:        .BLKB 1                 ;DIFFICULTY VALUE FOR STARTING SAUCERS\r
+       .PAGE\r
+       .SBTTL MAIN LINE LOOP\r
+       .=6800\r
+;      JMP PWRON\r
+START: JSR INIT1               ;TURN OFF SOUNDS\r
+       JSR INIT                ;INITIALIZE PLAYER 1 FOR START OF GAME\r
+START1:        JSR NEWAST              ;START UP NEW ASTEROIDS\r
+START2:        LDA A,STSTSW            ;NOTE NMI NOT ACTIVE IF STSTSW ON\r
+5$:    BMI 5$                  ;IN SELF TEST-WANT FOR WATCHDOG TO RESET SOUNDS\r
+       LSR SYNC\r
+       BCC START2                      ;WAIT FOR START OF FRAME\r
+10$:   LDA A,HALT\r
+       BMI 10$                 ;WAIT FOR BEAM TO HALT\r
+       LDA A,VECRAM+1          ;SWITCH VECTOR BUFFERS\r
+       EOR I,02\r
+       STA A,VECRAM+1          ;CHANGE JMPL TO STARTING BUFFER\r
+       STA A,GOADD             ;START VECTOR GENERATOR\r
+       STA A,WTDOG\r
+       INC FRAME               ;INCREMENT FRAME COUNTER\r
+       BNE 11$                 ;NO OVERFLOW\r
+       INC FRAME+1\r
+11$:   LDX I,VECRAM/100\r
+       AND I,02\r
+       BNE 12$                 ;USE LOWER BUFFER\r
+       LDX I,VECRAM/100+04     ;USE UPPER BUFFER\r
+12$:   LDA I,VECRAM&0FF+2\r
+       STA VGLIST\r
+       STX VGLIST+1            ;RESET VECTOR LIST POINTER\r
+       JSR CHKST               ;CHECK FOR START\r
+       BCS START               ;START NEW GAME\r
+       JSR UPDATE              ;UPDATE HIGH SCORE TABLES\r
+       JSR GETINT              ;GET INITIALS FOR ANY NEW HIGH SCORE\r
+       BPL 20$                 ;UPDATE IN PROGRESS\r
+       JSR SCORES              ;DISPLAY HIGH SCORES\r
+       BCS 20$                 ;WE ARE DISPLAYING SCORE TABLE\r
+       LDA GDELAY              ;(NOT ENOUGH TIME FOR ASTEROIDS AND SCORE TABLES)\r
+       BNE 15$                 ;STARTING A NEW PLAYER\r
+       JSR FIRE                ;FIRE SHIPS TORPEDOS\r
+       JSR HYPER               ;CHECK FOR HYPERSPACE\r
+       JSR MOVE                ;MOVE SHIP BY CONTROLS\r
+       JSR ENEMY               ;LAUNCH ENEMY SAUCER AND TORPEDOS\r
+15$:   JSR MOTION              ;MOVE OBJECTS\r
+       JSR COLIDE              ;CHECK FOR COLLISIONS\r
+20$:   JSR PARAMS              ;DISPLAY SCORE AND OTHER PARAMETERS\r
+       JSR SOUNDS              ;GENERATE SOUNDS\r
+       LDA I,1023./8\r
+       TAX\r
+       JSR VGSABS              ;POSITION BEAM FOR MINIMUM CURRENT DRAW\r
+       JSR RAND                ;KEEP RANDOM NUMBERS COMING\r
+       JSR VGHALT              ;ADD HALT TO VECTOR LIST\r
+       LDA RDELAY\r
+       BEQ 30$                 ;NO DELAY TO DECREMENT\r
+       DEC RDELAY\r
+30$:   ORA NROCKS\r
+       BNE START2                      ;LOOP FOR NEXT PASS\r
+       BEQ START1              ;START NEW SET OF ASTEROIDS\r
+\f      .SBTTL CHKST-CHECK FOR START/END OF GAME\r
+;CHKST -CHECK FOR START/END OF GAME\r
+;\r
+;EXIT  (C)=SET IF STARTING A NEW GAME\r
+CHKST: LDA NPLAYR\r
+       BEQ 10$                 ;GAME NOT IN PROGRESS\r
+       LDA GDELAY\r
+       BNE 60$                 ;STAY READY MODE\r
+       JMP CHKST1              ;WE ARE NOT IN PLAYER READY MODE\r
+\r
+60$:   DEC GDELAY\r
+       JSR CHKST2              ;DISPLAY PLAYER NUMBER MESSAGE\r
+30$:   CLC\r
+       RTS\r
+       \r
+35$:   LDA I,2\r
+       STA $$CRDT              ;FREE PLAY CREDIT\r
+       BNE 15$                 ;ALWAYS\r
+       \r
+10$:   LDA UPDFLG\r
+       AND UPDFLG+1\r
+       BPL 30$                 ;IF UPDATING INITIALS\r
+       LDA $CMODE              ;IF FREE PLAY\r
+       AND I,03\r
+       BEQ 35$\r
+       CLC\r
+       ADC I,07\r
+       TAY\r
+       JSR VGMSG               ;GAME COST MESSAGE\r
+15$:   LAH ASTMSG\r
+       LXL ASTMSG\r
+       JSR VGJSRL              ;PUT OUT "ASTEROIDS BY ATARI"\r
+       LDY $$CRDT\r
+       BEQ 30$                 ;NO CREDIT-NO PLAY\r
+       LDX I,01\r
+       LDA A,STRT1\r
+       BMI 20$                 ;ONE PLAYER START\r
+       CPY I,02\r
+       BCC 40$                 ;ONLY 1 CREDIT\r
+       LDA A,STRT2\r
+       BPL 40$                 ;NO START YET\r
+       LDA LOUT1               ;LAST VALUE TO OUT1\r
+       ORA I,04                ;SWITCH PAGE 2\r
+       STA LOUT1\r
+       STA A,OUT1\r
+       JSR INIT                ;REINITIALIZE MEMORY\r
+       JSR NEWAST              ;NEW ASTEROIDS\r
+       JSR NEWSHP              ;PUT SHIP IN MIDDLE\r
+       LDA NHITS\r
+       STA HITS+1\r
+       LDX I,02\r
+       DEC $$CRDT              ;ONE CREDIT LESS\r
+20$:   STX NPLAYR              ;NUMBER OF PLAYERS\r
+       DEC $$CRDT              ;ONE CREDIT LESS\r
+       LDA LOUT1\r
+       AND I,0F8               ;BE SURE WE ARE ON THE RIGHT SIDE\r
+       EOR NPLAYR              ;LEAVE LITE ON FOR RIGHT GAME\r
+       STA LOUT1\r
+       STA A,OUT1              ;SET BANK FOR PLAYER 1\r
+       JSR NEWSHP              ;PUT SHIP IN MIDDLE\r
+       LDA I,01\r
+       STA SDELAY\r
+       STA SDELAY+100\r
+       LDA I,92                ;ENOUGH FOR 3 LARGE SAUCERS\r
+       STA SEDLAY              ;STARTING ENEMY DELAY\r
+       STA SEDLAY+100\r
+       STA EDELAY+100\r
+       STA EDELAY              ;DELAY ENTRY OF SHIP\r
+       LDA I,7F\r
+       STA RDELAY              ;DELAY FOR ROCKS\r
+       STA RDELAY+100\r
+       LDA I,05                ;INITIALIZE GAME DIFFICULTY\r
+       STA DIFCTY\r
+       STA DIFCTY+100\r
+       LDA I,-1\r
+       STA UPDFLG\r
+       STA UPDFLG+1\r
+       LDA I,80\r
+       STA GDELAY\r
+       ASL                     ;LDA I,0 SETS CARRY TOO\r
+       STA PLAYR\r
+       STA PLAYR2\r
+       LDA NHITS\r
+       STA HITS                ;NUMBER OF HITS ALLOWED\r
+       LDA I,04\r
+       STA LTHUMP              ;INITIALIZE THUMP SOUND AND COUNTERS\r
+       STA THUMP2\r
+       LDA I,30\r
+       STA THUMP3\r
+       STA THUMP3+100          ;RESET STARTING THUMP SOUND\r
+       STA A,NRESET            ;RESET NOISE GENERATOR\r
+       RTS\r
+       \r
+40$:   LDA FRAME\r
+       AND I,20\r
+       BNE 41$                 ;NOT TIME TO DISPLAY MESSAGE\r
+       LDY I,6\r
+       JSR VGMSG               ;DISPLAY "PUSH START" MESSAGE\r
+41$:   LDA FRAME\r
+       AND I,0F\r
+       BNE 45$                 ;DO NOT CHANGE LITE\r
+       LDA I,01\r
+       CMP $$CRDT              ;SET CARRY IF $$CRDT=1\r
+       ADC I,01                ;A=2 IF $$CRDT > 1 ELSE 3\r
+       EOR I,01                ;A=3 IF $$CRDT > 1 ELSE 2\r
+       EOR LOUT1\r
+       STA LOUT1               ;SET NMI WRITE TO OUT1\r
+45$:   CLC\r
+       RTS\r
+\r
+CHKST1:        LDA Z,FRAME\r
+       AND I,3F\r
+       BNE 70$                 ;ONLY EVERY 1 SECOND\r
+       LDA THUMP3\r
+       CMP I,08\r
+       BEQ 70$                 ;AT FASTEST RATE NOW\r
+       DEC THUMP3\r
+70$:   LDX PLAYR\r
+       LDA X,HITS\r
+       BNE 60$                 ;IF HE STILL IN GAME\r
+       LDA OBJ+NOBJ+4\r
+       ORA OBJ+NOBJ+5\r
+       ORA OBJ+NOBJ+6\r
+       ORA OBJ+NOBJ+7\r
+       BNE 60$                 ;TORPEDO STILL ALIVE\r
+       LDY I,7\r
+       JSR VGMSG               ;GAME OVER MESSAGE\r
+       LDA NPLAYR\r
+       CMP I,02\r
+       BCC 60$                 ;1 PLAYER GAME\r
+       JSR CHKST2              ;DISPLAY PLAYER NUMBER\r
+60$:   LDA OBJ+NOBJ\r
+       BNE 80$                 ;IF SHIP ALIVE OR EXPLODING\r
+       LDA SDELAY\r
+       CMP I,80\r
+       BNE 80$                 ;SHIP RETURNING TO LIFE\r
+       LDA I,10\r
+       STA SDELAY              ;RESET DELAY BEFORE ENTERING SHIP\r
+       LDX NPLAYR\r
+       LDA HITS\r
+       ORA HITS+1\r
+       BEQ 90$                 ;GAME IS ALL OVER\r
+       JSR RSAUCR              ;RESET SAUCER VALUES\r
+       DEX\r
+       BEQ 80$                 ;ONE PLAYER NO MESSAGE NEEDED\r
+       LDA I,80\r
+       STA GDELAY              ;DELAY BEFORE STARTING PLAYER\r
+       LDA PLAYR\r
+       EOR I,01\r
+       TAX                     ;1 TO 0 AND 0 TO 1\r
+       LDA X,HITS\r
+       BEQ 80$                 ;NO HITS FOR THIS PLAYER\r
+       STX PLAYR               ;SET PLAYER NUMBER\r
+       LDA I,04\r
+       EOR LOUT1\r
+       STA LOUT1\r
+       STA A,OUT1              ;SET BANK FOR PLAYER\r
+       TXA\r
+       ASL\r
+       STA PLAYR2\r
+80$:   CLC\r
+       RTS\r
+\r
+90$:   STX LPLAYR              ;SAVE NUMBER OF PLAYERS IN THIS GAME\r
+       LDA I,-1\r
+       STA NPLAYR              ;FLAG TO UPDATE HIGH SCORES\r
+       JSR INIT1               ;TURN OFF SOUNDS\r
+       LDA I,03\r
+       ORA LOUT1               ;TURN OFF LIGHTS\r
+       STA LOUT1               ;LET NMI WRITE TO OUT1\r
+       CLC\r
+       RTS\r
+       \r
+CHKST2:        LDY I,1\r
+       JSR VGMSG               ;DISPLAY "PLAYER" MESSAGE\r
+       LDY PLAYR\r
+       INY\r
+       TYA                     ;1 OR 2\r
+       JSR VGHEX               ;DISPLAY PLAYER NUMBER\r
+       RTS\r
+       \r
+CKSUM2:        .BYTE 23        ;6800-6BFF\r
+\r
+\r
+       .SBTTL COLLIDE-COLLISION DETECTOR\r
+COLIDE:        LDX I,07\r
+10$:   LDA X,OBJ+NOBJ\r
+       BEQ 13$                 ;IF INACTIVE TORPEDO\r
+       BPL 15$\r
+13$:   DEX\r
+       BPL 10$\r
+       RTS\r
+       \r
+15$:   LDY I,NOBJ+1\r
+       CPX I,04\r
+       BCS 20$                 ;NOT SAUCER OR SHIP OR SAUCERS TORPEDOES\r
+       DEY                     ;BYPASS SAUCER TO SAUCER COLISION\r
+       TXA\r
+       BNE 20$                 ;SHIP DOESN'T COLIDE WITH SHIP\r
+19$:   DEY\r
+       BMI 13$                 ;END OF LOOP\r
+20$:   LDA Y,OBJ\r
+       BEQ 19$                 ;IF INACTIVE\r
+       BMI 19$                 ;IF AN EXPLOSION\r
+       STA TEMP2\r
+       LDA Y,OBJXL             ;TEST X DIRECTION\r
+       SEC\r
+       SBC X,OBJXL+NOBJ\r
+       STA TEMP1\r
+       LDA Y,OBJXH\r
+       SBC X,OBJXH+NOBJ\r
+       LSR\r
+       ROR TEMP1\r
+       ASL\r
+       BEQ 25$                 ;IF WITHIN 64.\r
+       BPL 40$                 ;TOO FAR AWAY\r
+       EOR I,0FE\r
+       BNE 40$                 ;TOO FAR AWAY\r
+       LDA TEMP1\r
+       EOR I,0FF\r
+       STA TEMP1               ;DISTANCE FROM TORPEDO\r
+25$:   LDA Y,OBJYL\r
+       SEC\r
+       SBC X,OBJYL+NOBJ\r
+       STA TEMP1+1\r
+       LDA Y,OBJYH\r
+       SBC X,OBJYH+NOBJ\r
+       LSR\r
+       ROR TEMP1+1\r
+       ASL\r
+       BEQ 35$                 ;IF WITHIN 64.\r
+       BPL 40$                 ;TOO FAR AWAY\r
+       EOR I,0FE\r
+       BNE 40$                 ;TOO FAR AWAY\r
+       LDA TEMP1+1\r
+       EOR I,0FF\r
+       STA TEMP1+1             ;DISTANCE-1 FROM TORPEDO\r
+35$:   LDA I,42.\r
+       LSR TEMP2\r
+       BCS 37$                 ;SMALL SIZE\r
+       LDA I,72.\r
+       LSR TEMP2\r
+       BCS 37$                 ;MEDIUM SIZE\r
+       LDA I,132.              ;LARGE SIZE\r
+37$:   CPX I,01\r
+       BCS 36$                 ;NOT THE SHIP\r
+       ADC I,28.               ;CARRY CLEAR\r
+36$:   BNE 38$                 ;NOT THE SAUCER\r
+       ADC I,18.               ;FOR SMALL SAUCER\r
+       LDX OBJ+NOBJ+1\r
+       DEX\r
+       BEQ 34$                 ;IF SMALL SAUCER\r
+       ADC I,18.\r
+34$:   LDX I,01                ;RESTORE X\r
+38$:   CMP TEMP1\r
+       BCC 40$                 ;NO HIT\r
+       CMP TEMP1+1\r
+       BCC 40$                 ;NO HIT\r
+       STA TEMP2\r
+       LSR                     \r
+       CLC\r
+       ADC TEMP2\r
+       STA TEMP2               ;3/2 DISTANCE (NO CARRY IF LESS THAN 172.)\r
+       LDA TEMP1+1             ;CARRY IS CLEAR\r
+       ADC TEMP1\r
+       BCS 40$                 ;NUMBERS TOO LARGE\r
+       CMP TEMP2\r
+       BCS 40$                 ;CHOP OFF CORNERS-A MISS ON OBJECT\r
+       JSR DSTRCT\r
+39$:   JMP 13$\r
+       \r
+40$:   DEY\r
+       BMI 39$                 ;NEXT TORPEDO, SAUCER OR SHIP\r
+       JMP 20$                 ;NEXT ROCK\r
+       \r
+       \r
+\r
+\r
+       .SBTTL CPYPOS - COPY ATTRIBUTES OF ROCK\r
+;CPYPOS - COPY ATTRIBUTES OF ROCK\r
+;\r
+;ENTRY (X)=NEW ROCK INDEX\r
+;      (Y)=OLD ROCK INDEX\r
+CPYPOS:        LDA Y,OBJ               ;COPY PICTURE\r
+       AND I,07\r
+       STA TEMP1               ;SAVE SIZE\r
+       JSR RAND                ;RANDOM NUMBER\r
+       AND I,18                ;PICTURE NUMBER\r
+       ORA TEMP1\r
+       STA X,OBJ\r
+       LDA Y,OBJXL             ;COPY POSITION\r
+       STA X,OBJXL\r
+       LDA Y,OBJXH\r
+       STA X,OBJXH\r
+       LDA Y,OBJYL\r
+       STA X,OBJYL\r
+       LDA Y,OBJYH\r
+       STA X,OBJYH\r
+       LDA Y,XINC              ;COPY VELOCITY\r
+       STA X,XINC\r
+       LDA Y,YINC\r
+       STA X,YINC\r
+       RTS\r
+       \r
+       \r
+       .SBTTL CPYVEC-COPY AND MODIFY VECTORS\r
+;CPYVEC-COPY AND MODIFY VECTORS (UP TO ONE PAGE WORTH)\r
+;\r
+;ENTRY (TEMP1)=MASK FOR X SIGN (0 OR 4)\r
+;      (TEMP1+1)=MASK FOR Y SIGN (0 OR 4)\r
+;      (TEMP4+2)=VALUE TO BE ADDED TO INTENSITY (0,10,20...)\r
+;      (A)=LSB OF VECTOR TABLE TO COPY\r
+;      (X)=MSB OF VECTOR TABLE TO COPY\r
+;EXIT  (VGLIST,VGLIST+1)=UPDATED VECTOR LIST POINTER\r
+;      (TEMP2,TEMP2+1)=ADDRESS OF VECTOR TABLE\r
+;      (Y)=INDEX-1 INTO PICTURE (AT RTSL-1)\r
+;USES  (TEMP2,TEMP2+1),A,Y\r
+CPYVEC:        STA TEMP2\r
+       STX TEMP2+1             ;SETUP INDIRECT POINTER\r
+       LDY I,0\r
+COPY:  INY\r
+       LDA NY,TEMP2\r
+       EOR TEMP1+1             ;MASK SIGN TO MATCH Y\r
+       STA NY,VGLIST\r
+       DEY\r
+       CMP I,0F0\r
+       BCS 20$                 ;IF AN ALPH INSTRUCTION\r
+       CMP I,0A0\r
+       BCS 30$                 ;NOT A VECTOR INSTRUCTION-QUIT\r
+       LDA NY,TEMP2            ;COPY REST\r
+       STA NY,VGLIST\r
+       INY\r
+       INY\r
+       LDA NY,TEMP2\r
+       STA NY,VGLIST\r
+       INY\r
+       LDA NY,TEMP2\r
+       EOR TEMP1               ;MASK SIGN TO MATCH X\r
+       ADC TEMP4+2             ;CHANGE INTENSITY\r
+       STA NY,VGLIST\r
+15$:   INY\r
+       BNE COPY                ;ALWAYS (I HOPE)\r
+\r
+30$:   DEY                     ;USE INDEX\r
+       JMP VGADD               ;UPDATE VECTOR LIST POINTER\r
+       \r
+20$:   LDA NY,TEMP2            ;ALPH INSTRUCTION\r
+       EOR TEMP1               ;MASK FOR X SIGN\r
+       CLC\r
+       ADC TEMP4+2             ;CHANGE INTENSITY\r
+       STA NY,VGLIST\r
+       INY\r
+       BNE 15$                 ;ALWAYS\r
+       \r
+       .SBTTL DSTRCT-DESTRUCTION DURING COLLISION\r
+;DSTRCT-DESTRUCTION DURING COLLISION\r
+;\r
+;ENTRY (X)=SHIP, SAUCER OR TORPEDO INDEX-NOBJ\r
+;      (Y)=ROCK, SHIP OR SAUCER INDEX\r
+;\r
+DSTRCT:        CPX I,01\r
+       BNE 60$                 ;NOT SAUCER HITTING SHIP OR ROCKS\r
+       CPY I,NOBJ\r
+       BNE 62$                 ;SAUCER HIT ROCK\r
+       LDX I,0\r
+       LDY I,NOBJ+1            ;SHIP HIT SAUCER\r
+60$:   TXA\r
+       BNE 63$                 ;IF NOT SHIP HIT A ROCK\r
+       LDA I,081\r
+       STA SDELAY              ;DELAY RESTARTING SHIP\r
+       LDX PLAYR\r
+       DEC X,HITS              ;DECREASE NUMBER OF LIVES\r
+       LDX I,0\r
+62$:   LDA I,0A0\r
+       STA X,OBJ+NOBJ          ;EXPLOSION TIMER\r
+       LDA I,0\r
+       STA X,XINC+NOBJ         ;STOP SHIP\r
+       STA X,YINC+NOBJ\r
+       CPY I,NOBJ\r
+       BCC 65$                 ;SHIP OR SAUCER HITTING ROCK\r
+       BCS 80$                 ;SHIP & SAUCER COLLIDE\r
+\r
+63$:   LDA I,0\r
+       STA X,OBJ+NOBJ          ;CLEAR TORPEDO\r
+       CPY I,NOBJ\r
+       BEQ 75$                 ;HIT SHIP WITH TORPEDO\r
+       BCS 80$                 ;HIT SAUCER WITH TORPEDO\r
+65$:   JSR SPLIT               ;SPLIT UP ROCKS\r
+70$:   LDA Y,OBJ\r
+       AND I,03                ;SIZE 0=SMALL,1=MEDUIM,2=LARGE\r
+       EOR I,02                ;2=SMALL,3=MEDUIM,0=LARGE\r
+       LSR\r
+       ROR\r
+       ROR\r
+       ORA I,3F                ;LENGTH OF EXPLOSION\r
+       STA LEXPSND\r
+       LDA I,0A0               ;TIMER FOR EXPLOSION\r
+       STA Y,OBJ               ;STOP OBJECTS MOTION\r
+       LDA I,0\r
+       STA Y,XINC\r
+       STA Y,YINC\r
+90$:   RTS\r
+       \r
+75$:   TXA\r
+       LDX PLAYR\r
+       DEC X,HITS              ;DECREASE NUMBER OF LIVES\r
+       TAX                     ;RESTORE X\r
+       LDA I,081               ;DELAY BEFORE REENTERING SHIP\r
+       STA SDELAY\r
+       BNE 70$                 ;ALWAYS\r
+       \r
+80$:   LDA SEDLAY\r
+       STA EDELAY              ;DELAY BEFORE ENTERING SAUCER\r
+       LDA NPLAYR\r
+       BEQ 70$                 ;IF IN ATTRACT\r
+       STX TEMP3               ;SAVE X\r
+       LDX PLAYR2\r
+       LDA OBJ+NOBJ+1\r
+       LSR\r
+       LDA I,99                ;1000 FOR SMALL\r
+       BCS 85$                 ;IF SMALL SAUCER\r
+       LDA I,20                ;200 POINTS FOR LARGE SAUCER\r
+85$:   JSR POINTS              ;ADD 1000 PTS AND CHECK FOR 10K\r
+       LDX TEMP3               ;RESTORE X\r
+       JMP 70$\r
+       \r
+       .SBTTL ENEMY-LAUNCH EMEMY SAUCER\r
+;ENEMY -LAUNCH ENEMY SAUCER\r
+;\r
+ENEMY: LDA FRAME\r
+       AND I,03\r
+       BEQ 1$                  ;EVERY FOURTH FRAME\r
+50$:   RTS\r
+       \r
+1$:    LDA OBJ+NOBJ+1\r
+       BMI 50$                 ;IF EXPLODING\r
+       BEQ 15$                 ;IF NOT ALIVE YET\r
+       JMP EFIRE               ;FIRE ENEMY TORPEDOES\r
+       \r
+15$:   LDA NPLAYR\r
+       BEQ 6$                  ;IF IN ATTRACT SEND IN SAUCER\r
+       LDA OBJ+NOBJ\r
+       BEQ 50$                 ;IF YOU ARE NOT VISIBLE\r
+       BMI 50$                 ;IF EXPLODING\r
+6$:    LDA RTIMER\r
+       BEQ 2$                  ;IF TIMER ALREADY\r
+       DEC RTIMER              ;DECREMENT ZERO TIMER\r
+2$:    DEC EDELAY\r
+       BNE 50$                 ;NO TIME YET\r
+       LDA I,18.\r
+       STA EDELAY              ;DELAY BEFORE SHOOTING OR ENTERING\r
+       LDA RTIMER\r
+       BEQ 5$                  ;IF NO ROCKS HIT ENTER SAUCER\r
+       LDA NROCKS\r
+       BEQ 50$                 ;IF NO ROCKS\r
+       CMP DIFCTY\r
+       BCS 50$                 ;TOO MANY ROCKS\r
+5$:    LDA SEDLAY\r
+       SEC\r
+       SBC I,06\r
+       CMP I,20\r
+       BCC 8$                  ;IF BELOW MINIMUM\r
+       STA SEDLAY\r
+8$:    LDA I,0\r
+       STA A,OBJXL+NOBJ+1\r
+       STA A,OBJXH+NOBJ+1\r
+       JSR RAND                ;RANDOM NUMBER\r
+       LSR\r
+       ROR A,OBJYL+NOBJ+1\r
+       LSR\r
+       ROR A,OBJYL+NOBJ+1\r
+       LSR\r
+       ROR A,OBJYL+NOBJ+1\r
+       CMP I,18\r
+       BCC 10$                 ;MUST BE 0 TO 767\r
+       AND I,17\r
+10$:   STA A,OBJYH+NOBJ+1      ;STARTING VERTICAL POSITION\r
+       LDX I,10\r
+       BIT POLYH\r
+       BVS 20$                 ;PICK DIRECTION\r
+       LDA I,1F\r
+       STA A,OBJXH+NOBJ+1\r
+       LDA I,0FF\r
+       STA A,OBJXL+NOBJ+1      ;START ON RIGHT SIDE\r
+       LDX I,-10\r
+20$:   STX XINC+NOBJ+1\r
+       LDX I,02\r
+       LDA SEDLAY\r
+       BMI 40$                 ;KEEP IT LARGE FOR FIRST FEW APPEARANCES\r
+       LDY PLAYR2\r
+       LDA Y,SCORE+1\r
+       CMP I,30\r
+       BCS 38$                 ;IF SCORE LARGER, KEEP SMALL SAUCER\r
+       JSR RAND\r
+       STA TEMP1\r
+       LDA SEDLAY\r
+       LSR                     ;START AT 1/4 LARGE SAUCER\r
+       CMP TEMP1\r
+       BCS 40$                 ;KEEP LARGE SAUCER\r
+38$:   DEX                     ;SMALL SAUCER\r
+40$:   STX OBJ+NOBJ+1          ;USE MEDUIM SIZE PICTURE\r
+       RTS\r
+\r
+       \r
+       .SBTTL EFIRE-ENEMY FIRE CONTROL\r
+;EFIRE-ENEMY FIRE CONTROL\r
+;\r
+EFIRE: LDA FRAME\r
+       ASL\r
+       BNE 10$                 ;NOT TIME TO CHANGE DIRECTION\r
+       JSR RAND\r
+       AND I,03\r
+       TAX\r
+       LDA X,99$\r
+       STA YINC+NOBJ+1\r
+10$:   LDA NPLAYR\r
+       BEQ 30$                 ;IF IN ATTRACT\r
+       LDA SDELAY\r
+       BNE 40$                 ;DONT FIRE IF YOU ARE DEAD\r
+30$:   DEC EDELAY\r
+       BEQ 50$                 ;NOT TIME TO SHOOT\r
+40$:   RTS\r
+       \r
+50$:   LDA I,10.\r
+       STA EDELAY              ;DELAY BEFORE NEXT SHOT\r
+       LDA OBJ+NOBJ+1\r
+       LSR\r
+       BEQ 80$                 ;IF SMALL SAUCER\r
+       JSR RAND\r
+       JMP 96$                 ;FIRE IN RANDOM DIRECTION\r
+\r
+80$:   LDA XINC+NOBJ+1\r
+       CMP I,80\r
+       ROR\r
+       STA TEMP2+1\r
+       LDA A,OBJXL+NOBJ        ;GET X DISTANCE TO SHIP\r
+       SEC\r
+       SBC A,OBJXL+NOBJ+1\r
+       STA TEMP2\r
+       LDA A,OBJXH+NOBJ\r
+       SBC A,OBJXH+NOBJ+1\r
+       ASL TEMP2\r
+       ROL\r
+       ASL TEMP2\r
+       ROL                     ;-7F TO +7F\r
+       SEC                     ;REMEMBER TORPEDO VELOCITY DEPENDS ON\r
+       SBC TEMP2+1             ;SAUCER SPEED\r
+       TAX\r
+       LDA YINC+NOBJ+1\r
+       CMP I,80\r
+       ROR\r
+       STA TEMP2+1\r
+       LDA A,OBJYL+NOBJ\r
+       SEC\r
+       SBC A,OBJYL+NOBJ+1\r
+       STA TEMP2\r
+       LDA A,OBJYH+NOBJ\r
+       SBC A,OBJYH+NOBJ+1\r
+       ASL TEMP2\r
+       ROL\r
+       ASL TEMP2\r
+       ROL                     ;-5F TO +5F\r
+       SEC\r
+       SBC TEMP2+1             ;REMEMBER TO ACCOUNT FOR OUR MOTION\r
+       TAY                     ;-60 TO +60\r
+       JSR ATAN                ;ARCTAN (Y/X)\r
+       STA ANGLE+1\r
+       JSR RAND                ;RANDOM NUMBER\r
+       LDX PLAYR2\r
+       LDY X,SCORE+1\r
+       CPY I,35\r
+       LDX I,0\r
+       BCC 90$                 ;IF NOT TO LIMIT YET\r
+       INX\r
+90$:   AND X,97$\r
+       BPL 95$                 ;NO SIGN EXTENSION\r
+       ORA X,98$\r
+95$:   ADC ANGLE+1             ;DONT BE TOO GOOD-JUST CLOSE\r
+96$:   STA ANGLE+1             ;ANGLE TO AIM\r
+       LDY I,03                ;START LOOKING HERE\r
+       LDX I,01                ;FIRE FOR SAUCER\r
+       STX TEMP3+1             ;3 SAUCER TORPEDOS\r
+       JMP FIRE1               ;FIRE A TORPEDO\r
+       \r
+97$:   .BYTE 8F,87             ;(GOOD,REAL GOOD) SMALL SAUCER\r
+98$:   .BYTE 70,78\r
+99$:   .BYTE -10,0,0,10        ;DIFFERENT SAUCER VELOCITIES\r
+\f      .SBTTL FIRE-FIRE SHIPS TORPEDOS\r
+;FIRE- FIRE SHIP TORPEDOS\r
+;\r
+FIRE:  LDA NPLAYR\r
+       BEQ FIRE2               ;IN ATTRACT\r
+       ASL A,FIRESW            ;FULLY DECODED FOR R/W\r
+       ROR LASTSW\r
+       BIT LASTSW\r
+       BPL FIRE2               ;IF NOT ON\r
+       BVS FIRE2               ;IF NOT OFF BEFORE\r
+       LDA SDELAY\r
+       BNE FIRE2               ;SHIP NOT VISIBLE YET\r
+       TAX                     ;LDX I,0\r
+       LDA I,03\r
+       STA TEMP3+1             ;STOPPING INDEX FOR SHIP\r
+       LDY I,7                 ;NUMBER OF TORPEDOS ALLOWED\r
+FIRE1: LDA Y,OBJ+NOBJ\r
+       BEQ FIRE3               ;WE FOUND INACTIVE ONE\r
+       DEY\r
+       CPY TEMP3+1\r
+       BNE FIRE1\r\r
+FIRE2: RTS                     ;FIND INACTIVE TORPEDO TO USE\r
+       \r
+FIRE3: STX TEMP3\r
+       LDA I,12\r
+       STA Y,OBJ+NOBJ          ;SET TIMER FOR LENGTH OF LIFE\r
+       LDA X,ANGLE\r
+       JSR COS                 ;COS(ANGLE)-SHIPS SPEED=X CHANGE TO TORPEDO\r
+       LDX TEMP3\r
+       CMP I,80                ;DIVIDE BY 2\r
+       ROR                     ;SS999.BBB\r
+       STA TEMP1+1\r
+       CLC\r
+       ADC X,XINC+NOBJ\r
+       BMI 23$                 ;IF NEGATVE\r
+       CMP I,70\r
+       BCC 30$                 ;IF MAX NOT EXCEEDED\r
+       LDA I,6F\r
+       BNE 30$                 ;ALWAYS\r
+       \r
+23$:   CMP I,-6F\r
+       BCS 30$                 ;IF MIN NOT EXCEEDED\r
+       LDA I,-6F\r
+30$:   STA Y,XINC+NOBJ ;SET X SPEED\r
+       LDA X,ANGLE\r
+       JSR SIN                 ;SIN (ANGLE)\r
+       LDX TEMP3\r
+       CMP I,80                ;DIVIDE BY 2\r
+       ROR                     ;SSAAA.BBB\r
+       STA TEMP2+1\r
+       CLC\r
+       ADC X,YINC+NOBJ\r
+       BMI 33$                 ;IF NEGATIVE\r
+       CMP I,70\r
+       BCC 40$                 ;IF IN RANGE\r
+       LDA I,6F                ;SET MAX\r
+       BNE 40$                 ;ALWAYS\r
+       \r
+33$:   CMP I,-6F\r
+       BCS 40$                 ;IF IN RANGE\r
+       LDA I,-6F\r
+40$:   STA Y,YINC+NOBJ\r
+       LDX I,0\r
+       LDA TEMP1+1             ;SCALE TO PUT TORP AT NOSE OF SHIP\r
+       BPL 45$                 ;SIGN EXTENSION\r
+       DEX                     ;LDX I,0FF\r
+45$:   STX TEMP1\r
+       LDX TEMP3\r
+       CMP I,80\r
+       ROR\r
+       CLC\r
+       ADC TEMP1+1             ;MULTIPLY BY 3/2\r
+       CLC\r
+       ADC X,OBJXL+NOBJ                ;ADD SHIPS POSITION TO GET STARTING POSITION\r
+       STA Y,OBJXL+NOBJ\r
+       LDA TEMP1\r
+       ADC X,OBJXH+NOBJ\r
+       STA Y,OBJXH+NOBJ\r
+       LDX I,0\r
+       LDA TEMP2+1             ;SCALE AGAIN TO PUT AT NOSE\r
+       BPL 50$                 ;SIGN EXTENSION\r
+       DEX                     ;LDX I,0FF\r
+50$:   STX TEMP2\r
+       LDX TEMP3\r
+       CMP I,80\r
+       ROR\r
+       CLC\r
+       ADC TEMP2+1             ;MULTIPLY BY 3/2\r
+       CLC\r
+       ADC X,OBJYL+NOBJ                ;ADD SHIPS POSITION TO GET STARTING POSITION\r
+       STA Y,OBJYL+NOBJ\r
+       LDA TEMP2\r
+       ADC X,OBJYH+NOBJ\r
+       STA Y,OBJYH+NOBJ\r
+       LDA I,80\r
+       STA X,SND1              ;START FIRE SOUND FOR SHIP OR SAUCER\r
+       RTS\r
+       \r
+CKSUM3:        .BYTE 0DC               ;6C00-6FFF\r
+       \r
+       \r
+       .SBTTL GETINT-GET PLAYERS INITIALS FOR HIGH SCORE\r
+;GETINT-GET PLAYERS INITIALS FOR HIGH SCORE\r
+;\r
+GETINT:        LDA UPDFLG\r
+       AND UPDFLG+1\r
+       BPL 10$                 ;GET PLAYERS INITIALS\r
+       RTS\r
+       \r
+10$:   LDA LPLAYR\r
+       LSR\r
+       BEQ 25$                 ;IF LAST GAME WAS 1 PLAYER GAME\r
+       LDY I,1\r
+       JSR VGMSG               ;DISPLAY MESSAGE 1\r
+       LDY I,02\r
+       LDX UPDFLG+1\r
+       BPL 20$                 ;IF PLAYER 2\r
+       DEY                     ;LDY I,01\r
+20$:   STY PLAYR\r
+       LDA FRAME\r
+       AND I,10\r
+       BNE 25$                 ;FLASH PLAYER NUMBER\r
+       TYA\r
+       JSR VGHEX               ;DISPLAY PLAYER NUMBER\r
+25$:   LDY I,2\r
+       JSR VGMSG               ;DISPLAY MESSAGE 2 - INSTRUCTIONS\r
+       LDY I,3\r
+       JSR VGMSG\r
+       LDY I,4\r
+       JSR VGMSG\r
+       LDY I,5\r
+       JSR VGMSG\r
+       LDA I,20\r
+       STA VGSIZE              ;USE LARGER CHARACTER FOR INITIALS\r
+       LDA I,400./4\r
+       LDX I,228./4\r
+       JSR VGSABS              ;POSITION BEAM\r
+       LDA I,70\r
+       JSR VGWAIT              ;WAIT FOR BEAM\r
+       LSR PLAYR               ;0 OR 1=PLAYER NUMBER-FOR FLASHING SCORE\r
+       LDX PLAYR\r
+       LDY X,UPDFLG\r
+       STY TEMP2\r
+       TYA\r
+       CLC\r
+       ADC UPDINT\r
+       STA TEMP2+1             ;INDEX FOR THE INITIAL WE ARE WORKING ON\r
+       JSR INITAL              ;DISPLAY INITIAL\r
+       LDY TEMP2\r
+       INY\r
+       JSR INITAL              ;DISPLAY INITIAL\r
+       LDY TEMP2\r
+       INY\r
+       INY\r
+       JSR INITAL              ;DISPLAY THIRD INITIAL\r
+50$:   LDA A,HYPSW\r
+       ROL\r
+       ROL LASTSW              ;SWITCH DEBOUNCE\r
+       LDA LASTSW\r
+       AND I,1F\r
+       CMP I,07\r
+       BNE 60$                 ;NOT A VALID SWITCH\r
+       INC UPDINT              ;ADVANCE TO NEXT LETTER\r
+       LDA UPDINT\r
+       CMP I,03\r
+       BCC 55$                 ;IF WE ARE NOT DONE\r
+       LDX PLAYR\r
+       LDA I,-1\r
+       STA X,UPDFLG            ;CLEAR UPDATING FLAG\r
+       LDX I,0\r
+       STX UPDINT              ;START NEXT PLAYER\r
+       INX                     ;PREVENT TIMEOUT IF BOTH PLAYERS SET HIGH SCORE\r
+       STX FRAME+1             ;BRING UP HIGH SCORE TABLE NEXT\r
+       RTS\r
+       \r
+55$:   INC TEMP2+1\r
+       LDX TEMP2+1\r
+       LDA I,0F0               ;ABOUT 64 SECONDS\r
+       STA FRAME+1             ;RESET TIMEOUT\r
+       LDA I,11.\r
+       STA X,INITL             ;SET INITIAL TO A\r
+60$:   LDA FRAME+1\r
+       BNE 65$                 ;NO TIMEOUT\r
+       LDA I,-1\r
+       STA UPDFLG\r
+       STA UPDFLG+1            ;STOP INITIALS\r
+       BMI 90$                 ;ALWAYS\r
+\r
+65$:   LDA FRAME\r
+       AND I,07\r
+       BNE 90$                 ;EVERY 8TH FRAME\r
+       LDA A,ROTL\r
+       BPL 70$                 ;NOT ROTATING LEFT\r
+       LDA I,01\r
+       BNE 75$                 ;ADD 1 TO LETTER NUMBER\r
+       \r
+70$:   LDA A,ROTR\r
+       BPL 90$                 ;NOT ROTATING RIGHT\r
+       LDA I,-1\r
+75$:   LDX TEMP2+1\r
+       CLC\r
+       ADC X,INITL             ;CHANGE INITIAL\r
+       BMI 78$                 ;BEFORE A BLANK MUST BE Z\r
+       CMP I,11.\r
+       BCS 80$                 ;IF GREATER THAN A\r
+       CMP I,01\r
+       BEQ 77$                 ;AFTER BLANK COMES A\r
+       LDA I,0                 ;BEFORE A COMES A BLANK\r
+       BEQ 85$\r
+\r
+77$:   LDA I,11.               ;A\r
+       BNE 85$                 ;ALWAYS\r
+\r
+78$:   LDA I,36.               ;MAKE IT A Z\r
+80$:   CMP I,37.\r
+       BCC 85$                 ;LESS THAN Z\r
+       LDA I,0\r
+85$:   STA X,INITL\r
+90$:   LDA I,0                 ;MUST BE POSITIVE ON RETURN\r
+       RTS\r
+\r
+\r
+       .SBTTL HYPER - HYPERSPACE BUTTON PROCESSING\r
+;HYPER - HYPERSPACE BUTTON PROCESSING\r
+;\r
+HYPER: LDA NPLAYR\r
+       BEQ 90$                 ;IF IN ATTRACT\r
+       LDA OBJ+NOBJ\r
+       BMI 90$                 ;IF EXPLODING\r
+       LDA SDELAY\r
+       BNE 90$                 ;NOT ON SCREEN YET\r
+       LDA A,HYPSW\r
+       BPL 90$                 ;HYPERSWITCH NOT ON\r
+       LDA I,0\r
+       STA OBJ+NOBJ            ;CLEAR PICTURE\r
+       STA XINC+NOBJ           ;STOP SHIP\r
+       STA YINC+NOBJ\r
+       LDA I,30\r
+       STA SDELAY              ;DELAY BEFORE ADDING SHIP\r
+       JSR RAND\r
+       AND I,1F\r
+       CMP I,1D                ;STAY AWAY FROM THE EDGE\r
+       BCC 2$\r
+       LDA I,1C\r
+2$:    CMP I,03\r
+       BCS 4$                  ;STAY AWAY FROM THE EDGE\r
+       LDA I,03\r
+4$:    STA A,OBJXH+NOBJ\r
+       LDX I,5\r
+5$:    JSR RAND                ;5 CALLS TO RAND TO GET RANDOM NUMBER\r
+       DEX\r
+       BNE 5$\r
+       AND I,1F\r
+       INX                     ;LDX I,1\r
+       CMP I,18\r
+       BCC 10$                 ;IF IN RANGE\r
+       AND I,07                ;DESTRUCTION PROPORTIONAL TO NROCKS\r
+       ASL\r
+       ADC I,04                ;CARRY WAS CLEAR (4 TO 12)\r
+       CMP NROCKS\r
+       BCC 10$                 ;LET HIM LIVE\r
+       LDX I,80                ;FLAG FOR DISTRUCT\r
+10$:   CMP I,15\r
+       BCC 12$                 ;STAY AWAY FROM TOP\r
+       LDA I,14\r
+12$:   CMP I,03\r
+       BCS 20$                 ;STAY AWAY FROM BOTTOM\r
+       LDA I,03\r
+20$:   STA A,OBJYH+NOBJ        ;NEW Y POSITION\r
+       STX RENTRY              ;FLAG HYPERSPACE\r
+90$:   RTS\r
+       \r
+       \r
+       .SBTTL INIT-INITIALIZATION\r
+INIT:  LDA I,02                ;STARTING NUMBER OF ROCKS-2 (ADDS 2 IN START LOOP)\r
+       STA SROCKS\r
+       LDX I,03\r
+       LSR OPTN3\r
+       BCS 10$                 ;IF HARD GAME\r
+       INX                     ;IF EASY GAME\r
+10$:   STX NHITS\r
+       LDA I,0\r
+       LDX I,04\r
+30$:   STA X,OBJ+NOBJ\r
+       STA X,OBJ+NOBJ+4\r
+       STA X,SCORE-1           ;CLEAR SCORE\r
+       DEX\r
+       BPL 30$                 ;CLEAR TORPEDOS AND SAUCER\r
+       STA NROCKS              ;CLEAR NUMBER OF ROCKS\r
+       RTS\r
+\r
+\r
+;INIT1 - INITIALIZE ALL SOUNDS\r
+;\r
+INIT1: LDA I,0                 ;STOP ALL SOUNDS\r
+       STA A,EXPSND\r
+       STA A,THUMP\r
+       STA A,SCRSND\r
+       STA A,SCRFIR\r
+       STA A,SHPSND\r
+       STA A,SHPFIR\r
+       STA A,TONE\r
+       STA LEXPSND             ;TURN OF SOUNDS IN SOFTWARE TOO\r
+       STA SND1\r
+       STA SND2\r
+       STA SND3\r
+       RTS\r
+       \r
+       \r
+       .SBTTL INITAL-DISPLAY AN INITIAL ON THE SCREEN\r
+;INITIAL-DISPLAY INITIAL ON SCREEN\r
+;ENTRY (Y)=INDEX INTO INITL TABLE\r
+INITAL:        LDA Y,INITL             ;INITIAL\r
+       ASL                     ;INDEX INTO VGMSGA TABLE\r
+       TAY\r
+       BNE VGCHAR              ;IF NOT A BLANK\r
+       LDA UPDFLG\r
+       AND UPDFLG+1\r
+       BMI VGCHAR              ;NOT UPDATING INITIALS\r
+       LDA I,72                ;ASSUMES .BRITE=7\r
+       LDX I,0F8               ;VCTR 8,0,7\r
+       JSR VGADD2              ;UNDERLINE\r
+       LDA I,01\r
+       LDX I,0F8               ;VCTR 4,0,0\r
+;      JMP VGADD2\r
+\r
+\r
+;VGADD2-ADD 2 WORDS TO VECTOR LIST\r
+;\r
+;ENTRY (A)=FIRST BYTE\r
+;      (X)=SECOND BYTE\r
+;EXIT  (VGLIST,VGLIST+1)=NEW VECTOR LIST POINTER\r
+;USES  A,Y\r
+VGADD2:        LDY I,0\r
+       STA NY,VGLIST\r
+       INY\r
+       TXA\r
+       STA NY,VGLIST\r
+       JMP VGADD               ;UPDATE VECTOR POINTER\r
+       \r
+;VGCHAR-DISPLAY A CHARACTER\r
+;\r
+;ENTRY (Y)=INDEX OF CHARACTER (0=BLANK,2=0,4=1,ETC)\r
+;USES  A,X,Y\r
+VGCHAR:        LDA AY,VGMSGA\r
+       LDX AY,VGMSGA+1\r
+       JMP VGADD2              ;ADD TO VECTOR LIST\r
+\r
+\r
+       .SBTTL LIVES - DRAW A SHIP FOR EACH LIFE YOU HAVE LEFT\r
+;LIVES - DRAW A SHIP FOR EACH LIFE YOU HAVE LEFT\r
+;\r
+;ENTRY (A)=X POSITION FOR START OF PICTURES\r
+;      (CC)=ZERO IF (Y)=0\r
+;      (Y)=NUMBER OF LIFES\r
+LIVES: BEQ 99$                 ;NO LIVES LEFT\r
+       STY TEMP1\r
+       LDX I,852./4            ;Y POSITION FOR PICTURES\r
+       LDY I,0E0               ;1/4 SIZE PICTURE\r
+       STY VGSIZE\r
+       JSR VGSABS              ;POSITION BEAM AND RESET SCALE FACTOR\r
+10$:   LXL SHIP17              ;LSB OF SHIP PICTURE ROUTINE\r
+       LAH SHIP17\r
+       JSR VGJSRL              ;JSRL TO PICTURE\r
+       DEC TEMP1\r
+       BNE 10$                 ;IF MORE LIVES LEFT\r
+99$:   RTS\r
+\r
+\r
+       .SBTTL MOTION - MOTION UPDATE ROUTINE\r
+;MOTION-MOTION UPDATE ROUTINE\r
+;\r
+;THIS ROUTINE ALSO UPDATES THE EXPLOSION INDEX TO SEQUENCE\r
+;THRU THE PICTURES.\r
+MOTION:        LDX I,NOBJ+7            ;NUMBER OF OBJECTS TO MOVE\r
+10$:   LDA X,OBJ\r
+       BNE 12$                 ;ACTIVE OBJECT\r
+13$:   DEX\r
+       BPL 10$                 ;MORE OBJECTS\r
+       RTS\r
+       \r
+12$:   BPL 14$                 ;IF OBJECT ACTIVE\r
+       JSR COMP                ;TIME REMAINING (0 TO 60)\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       CPX I,NOBJ\r
+       BNE 16$                 ;NOT THE SHIP\r
+       LDA FRAME\r
+       AND I,01                ;ADD 1 EVERYOTHER FRAME\r
+       LSR\r
+       BEQ 42$                 ;ALWAYS\r
+\r
+16$:   SEC                     ;1+ VALUE /16\r
+42$:   ADC X,OBJ               ;NEW EXPLOSION PICTURE\r
+       BMI 11$                 ;STILL INACTIVE\r
+       CPX I,NOBJ\r
+       BEQ 18$                 ;IF THE SHIP\r
+       BCS 40$                 ;IF THE SAUCER\r
+       DEC NROCKS\r
+       BNE 17$                 ;IF MORE ROCKS REMAIN\r
+       LDY I,7F                ;DELAY BEFORE STARTING\r
+       STY RDELAY\r
+17$:   LDA I,0\r
+       STA X,OBJ               ;RESET PICTURE\r
+       BEQ 13$\r
+       \r
+18$:   JSR NEWSHP              ;RESET SHIP\r
+       JMP 17$\r
+\r
+40$:   LDA SEDLAY\r
+       STA EDELAY              ;DELAY BEFORE REENTERING\r
+       BNE 17$                 ;ALWAYS\r
+       \r
+11$:   STA X,OBJ\r
+       AND I,0F0               ;A0 TO 0F0\r
+       CLC\r
+       ADC I,10                ;B0 TO 0\r
+       CPX I,NOBJ\r
+       BNE 41$                 ;NOT THE SHIP\r
+       LDA I,0                 ;NO SCALING FOR SHIP EXPLOSION\r
+41$:   TAY\r
+       LDA X,OBJXL\r
+       STA XCOMP\r
+       LDA X,OBJXH\r
+       STA XCOMP+1\r
+       LDA X,OBJYL\r
+       STA XCOMP+2\r
+       LDA X,OBJYH\r
+       STA XCOMP+3\r
+       JMP 30$\r
+       \r
+14$:   CLC\r
+       LDY I,0\r
+       LDA X,XINC\r
+       BPL 15$                 ;SIGN EXTENSION\r
+       DEY\r
+15$:   ADC X,OBJXL\r
+       STA X,OBJXL\r
+       STA XCOMP\r
+       TYA\r
+       ADC X,OBJXH\r
+       CMP I,20\r
+       BCC 19$                 ;IF 0 TO 1023\r
+       AND I,1F\r
+       CPX I,NOBJ+1\r
+       BNE 19$                 ;NOT THE SAUCER\r
+       JSR RSAUCR              ;RESET SAUCER VALUES\r
+       JMP 13$                 ;ALWAYS\r
+\r
+19$:   STA X,OBJXH\r
+       STA XCOMP+1\r
+       CLC\r
+       LDY I,0\r
+       LDA X,YINC\r
+       BPL 20$                 ;SIGN EXTENSION\r
+       LDY I,0FF\r
+20$:   ADC X,OBJYL\r
+       STA X,OBJYL\r
+       STA XCOMP+2\r
+       TYA\r
+       ADC X,OBJYH             ;0 TO 767 PLEASE\r
+       CMP I,18\r
+       BCC 25$                 ;ALREADY 0 TO 767\r
+       BEQ 24$                 ;IF 768 UP\r
+       LDA I,17\r
+       BNE 25$\r
+\r
+24$:   LDA I,0\r
+25$:   STA X,OBJYH\r
+       STA XCOMP+3\r
+       LDA X,OBJ\r
+       LDY I,0E0               ;1/4 SIZE PICTURE\r
+       LSR\r
+       BCS 30$                 ;SMALLEST SIZE\r
+       LDY I,0F0               ;1/2 SIZE PICTOR\r
+       LSR\r
+       BCS 30$                 ;MEDIUM SIZE\r
+       LDY I,0                 ;FULL SIZE\r
+30$:   JSR PICTUR              ;DISPLAY PICTURE\r
+       JMP 13$\r
+       \r
+RSAUCR:        LDA SEDLAY\r
+       STA EDELAY              ;DELAY BEFORE RESTARTING\r
+       LDA I,0\r
+       STA OBJ+NOBJ+1          ;CLEAR SAUCER\r
+       STA XINC+NOBJ+1         ;STOP SPEED FOR NEWAST\r
+       STA YINC+NOBJ+1\r
+       RTS\r
+\f      .SBTTL MOVE-MOVE SHIP\r
+;MOVE-MOVE SHIP\r
+;\r
+MOVE:  LDA NPLAYR\r
+       BEQ 90$                 ;IN ATTRACT MODE\r
+       LDA OBJ+NOBJ\r
+       BMI 90$                 ;IF EXPLODING\r
+       LDA SDELAY\r
+       BEQ 5$                  ;SHIP IS VISIBLE\r
+       DEC SDELAY              ;DECREMENT COUNT\r
+       BNE 90$                 ;NOT DONE YET\r
+       LDY RENTRY\r
+       BMI 93$                 ;IF BLOW UP OR RE-ENTRY\r
+       BNE 92$                 ;IF RETURNING FROM HYPERSPACE\r
+       JSR NEARBY              ;CHECK FOR AREA FREE OF ROCKS\r
+       BNE 97$                 ;IF SOMETHING CLOSE BY\r
+       LDY OBJ+NOBJ+1\r
+       BEQ 92$                 ;IF SAUCER NOT VISIBLE\r
+       LDY I,02\r
+       STY SDELAY              ;DELAY SOME MORE\r
+       RTS\r
+       \r
+92$:   LDA I,01\r
+       STA OBJ+NOBJ            ;USE 1/4 SIZE PICTURE\r
+       BNE 97$\r
+\r
+93$:   LDA I,0A0\r
+       STA OBJ+NOBJ            ;BLOW UP\r
+       LDX I,3E\r
+       STX LEXPSND             ;SOUND OF EXPLOSION\r
+       LDX PLAYR\r
+       DEC X,HITS\r
+       LDA I,081\r
+       STA SDELAY              ;DELAY BEFORE ENTRY\r
+97$:   LDA I,0\r
+       STA RENTRY              ;CLEAR HYPERSPACE FLAG\r
+90$:   RTS\r
+       \r
+5$:    LDA A,ROTL\r
+       BPL 10$                 ;NO ROTATE LEFT\r
+       LDA I,03\r
+       BNE 15$                 ;ALWAYS\r
+       \r
+10$:   LDA A,ROTR\r
+       BPL 20$                 ;NO ROTATE RIGHT\r
+       LDA I,-3\r
+15$:   CLC\r
+       ADC ANGLE\r
+       STA ANGLE               ;NEW ROTATION ANGLE\r
+20$:   LDA FRAME\r
+       LSR\r
+       BCS 90$                 ;EVERY OTHER FRAME CHECK THRUST\r
+MOVE1: LDA A,THRUST\r
+       BPL 80$                 ;NO THRUST\r
+       LDA I,80\r
+       STA A,SHPSND            ;SOUND FOR THRUST\r
+       LDY I,0\r
+       LDA ANGLE\r
+       JSR COS                 ;COS(ANGLE)=(CHANGE IN XINC)*4\r
+       BPL 25$                 ;SIGN EXTENSION\r
+       DEY                     ;LDY I,-1\r
+25$:   ASL\r
+       CLC\r
+       ADC XINCL               ;ADD TO SHIPS VELOCITY\r
+       TAX\r
+       TYA\r
+       ADC XINC+NOBJ\r
+       JSR MOVE2               ;CHECK FOR RANGE\r
+       STA XINC+NOBJ\r
+       STX XINCL\r
+       LDY I,0\r
+       LDA ANGLE\r
+       JSR SIN                 ;SIN(ANGLE)\r
+       BPL 50$                 ;SIGN EXTEND\r
+       DEY                     ;LDY I,0FF\r
+50$:   ASL\r
+       CLC\r
+       ADC YINCL\r
+       TAX\r
+       TYA\r
+       ADC YINC+NOBJ\r
+       JSR MOVE2               ;CHECK FOR RANGE\r
+       STA YINC+NOBJ\r
+       STX YINCL\r
+       RTS\r
+\r
+80$:   LDA I,0\r
+       STA A,SHPSND            ;TURN OFF THRUST SOUND\r
+       LDA XINC+NOBJ\r
+       ORA XINCL\r
+       BEQ 87$                 ;IF X=0\r
+       LDA XINC+NOBJ\r
+       ASL                     ;ASSUMES SPEED IS (-3F TO 3F)\r
+       LDX I,0FF               ;SIGN EXTENSION\r
+       CLC\r
+       EOR I,0FF\r
+       BMI 86$                 ;IF IT WAS POSITIVE\r
+       INX                     ;LDX I,0\r
+       SEC                     ;1+ X/128 FOR FRICTION\r
+86$:   ADC XINCL\r
+       STA XINCL\r
+       TXA\r
+       ADC XINC+NOBJ\r
+       STA XINC+NOBJ\r
+87$:   LDA YINCL\r
+       ORA YINC+NOBJ\r
+       BEQ 89$                 ;IF Y=0\r
+       LDA YINC+NOBJ\r
+       ASL\r
+       LDX I,0FF               ;SIGN EXTENSION\r
+       CLC\r
+       EOR I,0FF\r
+       BMI 88$                 ;IF WAS POSITIVE\r
+       SEC                     ;1+Y/128\r
+       INX                     ;LDX I,0\r
+88$:   ADC YINCL\r
+       STA YINCL\r
+       TXA\r
+       ADC YINC+NOBJ\r
+       STA YINC+NOBJ\r
+89$:   RTS\r
+\r
+MOVE2: BMI 30$                 ;IF OUT OF RANGE\r
+       CMP I,40\r
+       BCC 35$                 ;IF IN RANGE\r
+       LDX I,0FF               ;MAX\r
+       LDA I,3F\r
+       RTS\r
+\r
+30$:   CMP I,-3F\r
+       BCS 35$                 ;IF IN RANGE\r
+       LDX I,01                ;-3FFF=C001\r
+       LDA I,0C0               ;SET MAX NEGATIVE\r
+35$:   RTS\r
+\r
+\r
+       .SBTTL NEARBY - CHECK FOR ROCKS NEARBY\r
+;NEARBY - CHECK FOR ROCKS NEAR SHIP\r
+;\r
+;EXIT  (CC)=0 IF AREA FREE OF ROCKS\r
+;      (SDELAY)>0 IF ROCK NEAR SHIP\r
+NEARBY:        LDX I,NOBJ+1\r
+10$:   LDA X,OBJ\r
+       BEQ 40$                 ;OBJECT NOT ALIVE\r
+       LDA X,OBJXH\r
+       SEC\r
+       SBC OBJXH+NOBJ\r
+       CMP I,04\r
+       BCC 20$                 ;IF CLOSE ENOUGH\r
+       CMP I,-4\r
+       BCC 40$                 ;TOO FAR AWAY\r
+20$:   LDA X,OBJYH\r
+       SEC\r
+       SBC OBJYH+NOBJ\r
+       CMP I,04\r
+       BCC 50$                 ;TOO CLOSE\r
+       CMP I,-4\r
+       BCS 50$                 ;TOO CLOSE\r
+40$:   DEX\r
+       BPL 10$                 ;LOOP THRU ALL OBJECTS\r
+       INX                     ;ZERO FLAG ON EXIT\r
+       RTS\r
+\r
+50$:   INC SDELAY              ;DELAY BEFORE ENTERING SHIP\r
+       RTS                     ;SETS NON-ZERO FLAG\r
+       \r
+CKSUM4:        .BYTE 99                ;7000-73FF\r
+       \r
+\r
+       .SBTTL NEWAST - START UP NEW ASTEROIDS\r
+;NEWAST-START NEW ASTEROIDS\r
+;\r
+NEWAST:        LDX I,NOBJ-1\r
+       LDA RDELAY\r
+       BNE 65$                 ;DELAY FIRST - CLEAR OLD ROCKS IF ANY\r
+       LDA OBJ+NOBJ+1\r
+       BNE 90$                 ;NOT WHILE SAUCER IS THERE\r
+       STA XINC+NOBJ+1         ;CLEAR SPEED OF SAUCER\r
+       STA YINC+NOBJ+1\r
+       INC DIFCTY\r
+       LDA DIFCTY\r
+       CMP I,11.\r
+       BCC 2$                  ;NOT TOO DIFFICULT\r
+       DEC DIFCTY\r
+2$:    LDA SROCKS\r
+       CLC\r
+       ADC I,02\r
+       CMP I,11.\r
+       BCC 5$                  ;MAX NUMBER OF OBJECTS\r
+       LDA I,11.               ;LEAVE ONE OPEN PICTURE\r
+5$:    STA NROCKS              ;NUMBER OF ROCKS ACTIVE\r
+       STA SROCKS\r
+       STA TEMP1\r
+       LDY I,NOBJ+1\r
+10$:   JSR RAND                ;RANDOM NUMBER\r
+       AND I,18                ;PICTURE NUMBER\r
+       ORA I,04                ;SIZE OF OBJECT\r
+       STA X,OBJ               ;SET PICTURE\r
+       JSR NEWVEL              ;GET NEW VELOCITY\r
+       JSR RAND                ;RANDOM NUMBER\r
+       LSR\r
+       AND I,1F\r
+       BCC 50$                 ;START ON X ARIS\r
+       CMP I,18                ;START ON Y AXIS\r
+       BCC 35$                 ;IF 0 TO 767\r
+       AND I,17                ;384 TO 512\r
+35$:   STA X,OBJYH\r
+       LDA I,0\r
+       STA X,OBJXH\r
+       STA X,OBJXL\r
+       BEQ 60$                 ;ALWAYS\r
+       \r
+50$:   STA X,OBJXH\r
+       LDA I,0\r
+       STA X,OBJYH\r
+       STA X,OBJYL\r
+60$:   DEX\r
+       DEC TEMP1\r
+       BNE 10$                 ;LOOP FOR EACH NEW ROCK\r
+       LDA I,7F\r
+       STA EDELAY              ;SAUCER SHOULD WAIT\r
+       LDA I,30\r
+       STA THUMP3              ;RESET THUMP SOUND\r
+65$:   LDA I,0\r
+70$:   STA X,OBJ               ;CLEAR REST OF OBJECTS\r
+       DEX\r
+       BPL 70$                 ;ASSUMES SROCKS < NOBJ\r
+90$:   RTS\r
+       \r
+       \r
+;NEWSHP-POSITION SHIP FOR START\r
+;\r
+NEWSHP:        LDA I,0\r
+       STA A,OBJXL+NOBJ        ;POSITION IN MIDDLE\r
+       STA A,OBJYL+NOBJ\r
+       STA XINC+NOBJ           ;WITH NO VELOCITY\r
+       STA YINC+NOBJ\r
+       LDA I,10\r
+       STA A,OBJXH+NOBJ\r
+       LDA I,0C\r
+       STA A,OBJYH+NOBJ\r
+       RTS\r
+\r
+\r
+       .SBTTL NEWVEL - NEW RANDOM VELOCITY USING OLD\r
+;NEWVEL - NEW RANDOM VELOCITY FOR NEW VELOCITY\r
+;\r
+;ENTRY (X)=INDEX FOR NEW VELOCITY\r
+;      (Y)=INDEX OF OLD VELOCITY\r
+;\r
+NEWVEL:        JSR RAND                ;RANDOM NUMBER\r
+       AND I,8F\r
+       BPL 10$                 ;IF POSITIVE NUMBER 0 TO 3\r
+       ORA I,0F0               ;-1 TO -4\r
+10$:   CLC\r
+       ADC Y,XINC\r
+       JSR NEWVE1              ;CHECK RANGE OF VELOCITIES\r
+       STA X,XINC\r
+       JSR RAND                ;NUMBERS WILL NOT BE RANDOM IF UNLESS\r
+       JSR RAND                ;WE SHIFT AT LEAST 4 BITS\r
+       JSR RAND\r
+       JSR RAND                ;RANDOM NUMBER\r
+       AND I,8F\r
+       BPL 40$                 ;POSITIVE NUMBER 0 TO 3\r
+       ORA I,0F0               ;NEGATIVE -1 TO -4\r
+40$:   CLC\r
+       ADC Y,YINC\r
+       JSR NEWVE1              ;CHECK RANGE OF VELOCITY\r
+       STA X,YINC\r
+       RTS\r
+\r
+NEWVE1:        BPL 20$                 ;POSITIVE RESULT\r
+       CMP I,-1F\r
+       BCS 15$                 ;WITHIN RANGE\r
+       LDA I,-1F\r
+15$:   CMP I,-5\r
+       BCC 30$                 ;NOT TOO CLOSE TO ZERO\r
+       LDA I,-6                ;AT LEAST 1/2\r
+       RTS\r
+\r
+20$:   CMP I,06\r
+       BCS 25$                 ;NOT TOO CLOSE TO ZERO\r
+       LDA I,06\r
+25$:   CMP I,20\r
+       BCC 30$                 ;WITHIN RANGE\r
+       LDA I,1F\r
+30$:   RTS\r
+       \r
+       \r
+       .SBTTL PARAMS-DISPLAY PARAMETERS\r
+;PARAMS-DISPLAY PARAMETERS\r
+;\r
+PARAMS:        LDA I,10\r
+       STA VGSIZE              ;STANDARD SIZE CHARACTER\r
+       LDA I,0\r
+       TAX\r
+       JSR VGSABS              ;PREVENT SPORT KILL FROM BLANKING OVER PICTURE\r
+       LDA I,60\r
+       JSR VGWAIT\r
+       LDA I,100./4\r
+       LDX I,876./4\r
+       JSR VGSABS              ;POSITION BEAM\r
+       LDA I,60\r
+       JSR VGWAIT              ;WAIT FOR BEAM\r
+       LDX I,0\r
+       LDA NPLAYR\r
+       CMP I,02\r
+       BNE 10$                 ;IF NOT 2 PLAYER GAME\r
+       LDA PLAYR\r
+       BNE 10$                 ;IF PLAYER 2 UP\r
+       LDX I,20                ;INTENSITY CHANGE FOR VECTORS\r
+       LDA OBJ+NOBJ\r
+       ORA RENTRY\r
+       BNE 10$                 ;IF HE HAS APPEARED\r
+       LDA SDELAY\r
+       BMI 10$                 ;HE HAS DIED\r
+       LDA FRAME\r
+       AND I,10\r
+       BEQ 20$                 ;FLASH SCORE\r
+10$:   LDA I,SCORE\r
+       LDY I,02\r
+       SEC\r
+       JSR DIGITS              ;DISPLAY PLAYER 1 SCORE\r
+       LDA I,0\r
+       JSR HEX                 ;ADD EXTRA ZERO TO SCORE\r
+20$:   LDA I,160./4\r
+       LDY HITS\r
+       JSR LIVES               ;DISPLAY NUMBER OF LIFES\r
+       LDA I,00\r
+       STA VGSIZE              ;SMALL CHARACTERS\r
+       LDA I,480./4\r
+       LDX I,876./4\r
+       JSR VGSABS              ;POSITION BEAM\r
+       LDA I,50                \r
+       JSR VGWAIT              ;WAIT FOR BEAM\r
+       LDA I,HSCORE\r
+       LDY I,02\r
+       SEC\r
+       JSR DIGITS              ;DISPLAY HIGH SCORE\r
+       LDA I,0\r
+       JSR VGHEX               ;ADD A ZERO TO SCORE\r
+       LDA I,10\r
+       STA VGSIZE              ;MEDIUM SIZE CHARACTERS\r
+       LDA I,768./4\r
+       LDX I,876./4\r
+       JSR VGSABS              ;POSITION BEAM\r
+       LDA I,50\r
+       JSR VGWAIT              ;WAIT FOR BEAM\r
+       LDX I,0\r
+       LDA NPLAYR\r
+       CMP I,01\r
+       BEQ 90$                 ;NO PLAYER 2 IN 1 PLAYER GAME\r
+       BCC 30$                 ;IF IN ATTRACT\r
+       LDA PLAYR\r
+       BEQ 30$                 ;NOT PLAYER 2 UP\r
+       LDX I,20                ;INTENSITY CHANGE FOR DIGITS\r
+       LDA OBJ+NOBJ\r
+       ORA RENTRY\r
+       BNE 30$                 ;IF HE HAS APPEARED\r
+       LDA SDELAY\r
+       BMI 30$                 ;HE HAS DIED\r
+       LDA FRAME\r
+       AND I,10\r
+       BEQ 40$                 ;FLASH SCORE\r
+30$:   LDA I,SCORE+2\r
+       LDY I,02\r
+       SEC                     ;ZERO SUPPRESS\r
+       JSR DIGITS              ;DISPLAY SCORE FOR PLAYER 2\r
+       LDA I,0\r
+       JSR HEX                 ;ADD A ZERO TO SCORE\r
+40$:   LDA I,828./4\r
+       LDY HITS+1\r
+       JMP LIVES               ;DISPLAY NUMBER OF LIVES\r
+\r
+90$:   RTS\r
+\r
+       .SBTTL PICTUR-DISPLAY OBJECT PICTURE\r
+;PICTUR-DISPLAY OBJECT PICTURE\r
+;\r
+;ENTRY (Y)=SCALING FACTOR TO BE USED\r
+;      (XCOMP,XCOMP+3)=OBJECT POSITION\r
+PICTUR:        STY VGSIZE              ;SET SCALING FACTOR\r
+       STX TEMP3               ;SAVE X\r
+       LDA XCOMP+1             ;PUT VALUES INTO RIGHT FORMAT\r
+       LSR\r
+       ROR XCOMP\r
+       LSR\r
+       ROR XCOMP\r
+       LSR\r
+       ROR XCOMP\r
+       STA XCOMP+1\r
+       LDA XCOMP+3\r
+       CLC\r
+       ADC I,04                ;ADD 128-RANGE IS 127<Y<897\r
+       LSR\r
+       ROR XCOMP+2\r
+       LSR\r
+       ROR XCOMP+2\r
+       LSR\r
+       ROR XCOMP+2\r
+       STA XCOMP+3\r
+       LDX I,XCOMP\r
+       JSR VGLABS              ;POSITION PIECE\r
+       LDA I,70                ;WE WANT WAIT OF 7\r
+       SEC\r
+       SBC VGSIZE              ;SCALE FACTOR EFFECT WAIT TOO\r
+       CMP I,0A0\r
+       BCC 30$                 ;IF 0 TO 90\r
+       LDA I,90\r
+       JSR VGWAIT              ;TWO WAITS ARE NEEDED\r
+       LDA I,90                ;SET MAX TO PREVENT TEARING\r
+30$:   JSR VGWAIT              ;WAIT FOR BEAMS\r
+       LDX TEMP3\r
+       LDA X,OBJ\r
+       BPL 35$                 ;IF NOT EXPLODING\r
+       CPX I,NOBJ\r
+       BEQ 33$                 ;IF THE SHIP\r
+       AND I,0C\r
+       LSR                     ;0, 2, 4 OR 6\r
+       TAY\r
+       LDA AY,EXPPIC\r
+       LDX AY,EXPPIC+1\r
+       BNE 78$                 ;ALWAYS\r
+       \r
+33$:   JSR SHPEXP              ;EXPLODE SHIP\r
+       LDX TEMP3               ;RESTORE X\r
+       RTS\r
+\r
+35$:   CPX I,NOBJ\r
+       BEQ 50$                 ;IF THE SHIP\r
+       CPX I,NOBJ+1\r
+       BEQ 60$                 ;IF SAUCER\r
+       BCS 70$                 ;IF A TORPEDO (DOT)\r
+       AND I,18                ;PICTURE NUMBER\r
+       LSR\r
+       LSR\r
+       TAY\r
+       LDA AY,ROCKS\r
+       LDX AY,ROCKS+1\r
+78$:   JSR VGADD2              ;ADD JSRL OF PICTURE TO VECTOR LIST\r
+       LDX TEMP3               ;RESTORE X\r
+       RTS\r
+       \r
+50$:   JSR SHPPIC              ;DISPLAY SHIP PICTURE\r
+       LDX TEMP3\r
+       RTS\r
+\r
+60$:   LDA A,SAUCER\r
+       LDX A,SAUCER+1\r
+       BNE 78$                 ;ALWAYS\r
+       \r
+70$:   LDA I,70\r
+       LDX I,0F0\r
+       JSR VGDOT               ;PUT A DOT THERE\r
+       LDX TEMP3\r
+       LDA FRAME\r
+       AND I,03\r
+       BNE 75$                 ;EVERY FOURTH FRAME\r
+       DEC X,OBJ               ;DECREMENT ACTIVE COUNT\r
+75$:   RTS\r
+       \r
+       \r
+       .SBTTL POINTS-ADD POINTS TO SCORE\r
+;POINTS-ADD POINTS TO SCORE\r
+;\r
+;ENTRY (CC)=CARRY AND DECIMAL MODE SET\r
+;      (X)=PLAYER NUMBER\r
+;      (A)=POINTS TO ADD\r
+POINTS:        SED\r
+       ADC X,SCORE\r
+       STA X,SCORE\r
+       BCC 19$                 ;NO EXTRA 1000\r
+       LDA X,SCORE+1\r
+       ADC I,0\r
+       STA X,SCORE+1\r
+       AND I,0F\r
+       BNE 19$                 ;EVERY 1000 GIVE A NEW LIFE\r
+       LDA I,0B0\r
+       STA SND3                ;SET OFF TONE\r
+       LDX PLAYR\r
+       INC X,HITS              ;ONE MORE LIFE\r
+19$:   CLD\r
+       RTS\r
+       \r
+       \r
+       .SBTTL SCORES-DISPLAY HIGH SCORE TABLE\r
+;SCORES-DISPLAY HIGH SCORE TABLE\r
+;\r
+;(CC)=CARRY SET IF DISPLAYING TABLE\r
+SCORES:        LDA NPLAYR      \r
+       BEQ 10$                 ;IF END OF GAME\r
+90$:   CLC\r
+       RTS\r
+       \r
+10$:   LDA FRAME+1\r
+       AND I,04\r
+       BNE 90$                 ;NOT TIME TO DISPLAY TABLE\r
+       LDA HSCORE\r
+       ORA HSCORE+1\r
+       BEQ 90$                 ;IF NO HIGH SCORES\r
+       LDY I,0\r
+       JSR VGMSG               ;DISPLAY "HIGH SCORE" MESSAGE\r
+       LDX I,0                 ;INDEX FOR HIGH SCORE TABLE\r
+       STX TEMP3+3             ;INDEX FOR TABLE OF INITIALS\r
+       LDA I,01\r
+       STA VGSIZE              ;CHARACTER SIZE\r
+       LDA I,668./4\r
+       STA TEMP3+1             ;STARTING Y FOR EACH LINE\r
+       LDA I,10\r
+       STA VGSIZE              ;SET CHARACTER SIZE\r
+20$:   LDA X,HSCORE\r
+       ORA X,HSCORE+1\r
+       BEQ 80$                 ;A ZERO ENDS LIST\r
+       STX TEMP3+2             ;SAVE INDEX\r
+       LDA I,380./4\r
+       LDX TEMP3+1\r
+       JSR VGSABS              ;POSITION FOR START OF LINE\r
+       LDA I,40\r
+       JSR VGWAIT              ;WAIT FOR BEAM TO STOP\r
+       LDA TEMP3+2             ;0,2,4,...,18\r
+       LSR                     ;CARRY IS CLEAR\r
+       SED\r
+       ADC I,01\r
+       CLD\r
+       STA TEMP3\r
+       LDA I,TEMP3             ;ADDRESS OF NUM\r
+       SEC\r
+       LDY I,01                ;2 DIGITS ONLY\r
+       LDX I,0\r
+       JSR DIGITS              ;DISPLAY PLACE NUMBER (1 TO 10)\r
+       LDA I,40\r
+       TAX\r
+       JSR VGDOT               ;PUT A PEROID\r
+       LDY I,0\r
+       JSR VGCHAR              ;DISPLAY A BLANK\r
+       LDA TEMP3+2\r
+       CLC\r
+       ADC I,HSCORE\r
+       LDY I,02\r
+       SEC\r
+       LDX I,0\r
+       JSR DIGITS              ;DISPLAY SCORE\r
+       LDA I,0\r
+       JSR VGHEX               ;ADD A ZERO TO SCORE\r
+       LDY I,0\r
+       JSR VGCHAR              ;ADD A BLANK AFTER SCORE\r
+       LDY TEMP3+3\r
+       JSR INITAL              ;FIRST INITIAL\r
+       INC TEMP3+3\r
+       LDY TEMP3+3\r
+       JSR INITAL              ;SECOND INITIAL\r
+       INC TEMP3+3\r
+       LDY TEMP3+3\r
+       JSR INITAL              ;THIRD INITIAL\r
+       INC TEMP3+3             ;SET INDEX FOR NEXT PLAYER\r
+       LDA TEMP3+1\r
+       SEC\r
+       SBC I,32./4\r
+       STA TEMP3+1             ;STARTING Y FOR NEXT LINE\r
+       LDX TEMP3+2\r
+       INX\r
+       INX\r
+       CPX I,2*10.\r
+       BCC 20$                 ;IF MORE PLAYERS TO GO\r
+80$:   SEC\r
+       RTS\r
+\r
+\r
+       .SBTTL SEARCH - SEARCH FOR FREE ROCK ENTRY\r
+;SEARCH - SEARCH FOR FREE ROCK ENTRY\r
+;\r
+;EXIT  (CC)=POSITIVE IF ENTRY EXISTS\r
+;      (X)=FREE ENTRY INDEX IF POSSIBLE\r
+;\r
+SEARCH:        LDX I,NOBJ-1\r
+SEARC1:        LDA X,OBJ\r
+       BEQ 20$                 ;FOUND ONE\r
+       DEX\r
+       BPL SEARC1              ;LOOP TIL EXHAUSTED\r
+20$:   RTS\r
+       \r
+       \r
+       .SBTTL SHPEXP-SHIP EXPLODING PICTURES\r
+;SHPEXP-SHP EXPLODING PICTURES\r
+;\r
+SHPEXP:        LDA OBJ+NOBJ\r
+       CMP I,0A2\r
+       BCS 20$                 ;IF NOT THE FIRST EXPLOSION\r
+       LDX I,10.               ;2*NUMBER OF PIECES -2\r
+10$:   LDA X,EXPDIR            ;INITIALIZE POSITIONS OF PIECES\r
+       LSR                     ;DIVIDE BY 16\r
+       LSR\r
+       LSR\r
+       LSR\r
+       CLC\r
+       ADC I,0F8\r
+       EOR I,0F8               ;SIGN EXTEND\r
+       STA X,SHIPX+1\r
+       LDA X,EXPDIR+1\r
+       LSR                     ;DIVIDE BY 16\r
+       LSR\r
+       LSR\r
+       LSR\r
+       CLC\r
+       ADC I,0F8\r
+       EOR I,0F8               ;SIGN EXTEND\r
+       STA X,SHIPY+1\r
+       DEX\r
+       DEX\r
+       BPL 10$                 ;LOOP FOR ALL PIECES\r
+20$:   LDA OBJ+NOBJ\r
+       EOR I,0FF               ;0 TO 5F\r
+       AND I,70\r
+       LSR\r
+       LSR\r
+       LSR                     ;0 TO A\r
+       TAX                     ;STARTING INDEX\r
+25$:   STX TEMP1+1\r
+       LDY I,0\r
+       LDA AX,EXPDIR\r
+       BPL 27$\r
+       DEY                     ;SIGN EXTENSION (Y=0FF)\r
+27$:   CLC\r
+       ADC ZX,SHIPX\r
+       STA ZX,SHIPX            ;LSB\r
+       TYA\r
+       ADC ZX,SHIPX+1\r
+       STA ZX,SHIPX+1          ;MSB-ACTUAL COUNT OF X-Y LINES\r
+       STA XCOMP\r
+       STY XCOMP+1\r
+       LDY I,0\r
+       LDA AX,EXPDIR+1\r
+       BPL 28$\r
+       DEY                     ;SIGN EXTENSION (Y=0FF)\r
+28$:   CLC\r
+       ADC ZX,SHIPY\r
+       STA ZX,SHIPY\r
+       TYA\r
+       ADC ZX,SHIPY+1\r
+       STA ZX,SHIPY+1\r
+       STA XCOMP+2\r
+       STY XCOMP+3\r
+       LDA VGLIST\r
+       STA TEMP2\r
+       LDA VGLIST+1\r
+       STA TEMP2+1\r
+       JSR VGVCTR              ;DRAW VECTOR TO START OF SHIP PIECE\r
+       LDY TEMP1+1\r
+       LDA AY,EXPSHP\r
+       LDX AY,EXPSHP+1\r
+       JSR VGADD2              ;ADD SHIP PIECE TO VECTOR LIST\r
+       LDY TEMP1+1\r
+       LDA AY,EXPSHP+1\r
+       EOR I,04                ;REVERSE SIGN\r
+       TAX\r
+       LDA AY,EXPSHP\r
+       AND I,0F                ;NO INTENSITY\r
+       EOR I,04                ;REVERSE SIGN\r
+       JSR VGADD2\r
+       LDY I,0FF\r
+30$:   INY\r
+       LDA NY,TEMP2\r
+       STA NY,VGLIST           ;REVERSE VECTOR BACK TO MIDDLE\r
+       INY\r
+       LDA NY,TEMP2\r
+       EOR I,04                ;REVERSE SIGN\r
+       STA NY,VGLIST\r
+       CPY I,03\r
+       BCC 30$\r
+       JSR VGADD               ;UPDATE VGUST\r
+       LDX TEMP1+1\r
+       DEX\r
+       DEX\r
+       BPL 25$                 ;LOOP THRU ALL PIECES\r
+       RTS\r
+       \r
+       .SBTTL SHPPIC-DISPLAY SHIP PICTURE\r
+;SHPPIC-DISPLAY SHIP PICTURE\r
+;\r
+;ENTRY (ANGLE)=SHIP ROTATION (0 TO FF)\r
+;EXIT  (VGLIST,VGLIST+1)=UPDATED VECTOR LIST POINTER\r
+;USES  A,X,Y,(TEMP1,TEMP1+1),(TEMP2,TEMP2+1)\r
+SHPPIC:        LDX I,0\r
+       STX TEMP4+2             ;NO CHANGE IN BRITENESS\r
+       LDY I,0                 ;FLAG X=X AND Y=Y\r
+       LDA ANGLE\r
+       BPL 10$                 ;IF IN VECTORS 0,1,2 OR 3\r
+       LDY I,04                ;Y=-Y\r
+       TXA                     ;LDA I,0\r
+       SEC\r
+       SBC ANGLE               ;256.-ANGLE=NEW ANGLE\r
+10$:   STA TEMP1               ;0 TO 80\r
+       BIT TEMP1\r
+       BMI 15$                 ;IF ANGLE=80\r
+       BVC 20$                 ;IF IN SECTORS 0 OR 1\r
+15$:   LDX I,04                ;X=-X\r
+       LDA I,80\r
+       SEC\r
+       SBC TEMP1               ;128.-ANGLE=NEW ANGLE\r
+20$:   STX TEMP1\r
+       STY TEMP1+1             ;SAVE MASKS FOR CPYVEC\r
+       LSR                     ;ROTATION/2=PICTURE NUMBER*2\r
+       AND I,0FE               ;MUST BE EVEN\r
+       TAY\r
+       LDA AY,SHIPS\r
+       LDX AY,SHIPS+1          ;GET PICTURE ADDRESS\r
+       JSR CPYVEC              ;COPY VECTOR AND CHECK SIGNS AND X/Y\r
+       LDA A,THRUST\r
+       BPL 1$                  ;IF NO THRUST\r
+       LDA FRAME\r
+       AND I,04\r
+       BEQ 1$                  ;FLICKER AT 15 HZ\r
+       INY\r
+       INY\r
+       SEC                     ;SKIP OVER RTSL\r
+       LDX TEMP2+1\r
+       TYA\r
+       ADC TEMP2               ;ADD 3+ INDEX TO GET START OF FLAME\r
+       BCC 30$                 ;NO PAGE CROSSING\r
+       INX\r
+30$:   JSR CPYVEC              ;SHOW FLAME\r
+1$:    RTS\r
+       \r
+       \r
+       .SBTTL SOUNDS-GENERATE SOUNDS\r
+;SOUNDS-GENERATE SOUNDS\r
+;\r
+SOUNDS:        LDA NPLAYR\r
+       BNE 10$                 ;NOT IN ATTRACT\r
+       RTS\r
+       \r
+10$:   LDX I,0\r
+       LDA OBJ+NOBJ+1\r
+       BMI 20$                 ;SAUCER EXPLODING\r
+       BEQ 20$                 ;NO SAUCER\r
+       ROR\r
+       ROR\r
+       ROR\r
+       STA A,SCRSEL            ;SAUCER SELECT\r
+       LDX I,80\r
+20$:   STX A,SCRSND            ;SOUND SAUCER\r
+       LDX I,01                ;INDEX=SAUCER FIRING SOUND\r
+       JSR SOUND1              ;GET VALUE FOR SAUCER FIRING SOUND\r
+       STA A,SCRFIR\r
+       DEX                     ;LDX I,0\r
+       JSR SOUND1              ;GET VALUE FOR SHIP FIRING SOUND\r
+       STA A,SHPFIR\r
+       LDA OBJ+NOBJ\r
+       CMP I,01\r
+       BEQ 25$                 ;IF SHIP IS ALIVE\r
+       TXA                     ;LDA I,0\r
+       STA A,SHPSND            ;TURN OFF THRUST\r
+25$:   LDA NROCKS\r
+       BEQ 27$                 ;IF NOT ROCKS\r
+       LDA OBJ+NOBJ            ;NO THUMP\r
+       BMI 27$                 ;SHIP IS DESTROYED\r
+       ORA RENTRY\r
+       BEQ 27$                 ;SHIP NOT ON SCREEN YET\r
+       LDA THUMP1\r
+       BEQ 30$                 ;IF THUMP SOUND IS OFF\r
+       DEC THUMP1\r
+       BNE 50$                 ;LEAVE SOUND ON\r
+27$:   LDA LTHUMP\r
+       AND I,0F                ;TURN OFF THUMP SOUND\r
+       STA LTHUMP\r
+       STA A,THUMP\r
+       LDA THUMP3\r
+       STA THUMP2              ;AT LEAST 8 FRAMES BEFORE ITS ON AGAIN\r
+       BPL 50$                 ;ALWAYS\r
+\r
+30$:   DEC THUMP2\r
+       BNE 50$                 ;LEAVE SOUND OFF\r
+       LDA I,04\r
+       STA THUMP1              ;NUMBER FRAMES FOR SOUND TO BE ON\r
+       LDA LTHUMP\r
+       EOR I,14                ;TURN ON SOUND AND CHANGE ITS TONE\r
+       STA LTHUMP\r
+       STA A,THUMP\r
+50$:   LDA LEXPSND\r
+       TAX\r
+       AND I,3F\r
+       BEQ 60$                 ;IF NO EXPLOSION VOLUME\r
+       DEX\r
+60$:   STX LEXPSND\r
+       STX A,EXPSND            ;SET SOUND FREQUENCY/LEVEL\r
+       RTS\r
+       \r
+       \r
+;SOUND1-GET VALUE FOR SOUND\r
+;\r
+;EXIT (A)=80 TO TURN ON SOUND, POSITIVE TO TURN IT OFF\r
+SOUND1:        LDA X,LSND1\r
+       BMI 50$                 ;IF SOUND IS ON\r
+       LDA X,SND1\r
+       BPL 70$                 ;NOT SUPPOSED TO START\r
+       LDA I,10\r
+       STA X,SND1              ;LENGTH OF SOUND\r
+10$:   LDA I,80                ;TURN ON SOUND\r
+       BMI 80$                 ;ALWAYS\r
+       \r
+50$:   LDA X,SND1\r
+       BEQ 70$                 ;OOPS-TURN IT OFF SOMEONE GOOFED\r
+       BMI 70$                 ;IF SOUND ON AND MUST START A NEW\r
+       DEC X,SND1\r
+       BNE 10$                 ;NOT AT END OF COUNTDOWN        \r
+70$:   LDA I,0\r
+80$:   STA X,LSND1             ;TURN SOUND OFF\r
+       RTS\r
+\r
+\r
+       .SBTTL SPLIT - SPLIT ROCK INTO FRAGMENTS\r
+;SPLIT - SPLIT ROCK INTO FRAGMENTS\r
+;\r
+;ENTRY (Y)=INDEX OF OBJECT BEING SPLIT\r
+;      (X)=INDEX OF SHIP, SAUCER OR TORPEDO\r
+SPLIT: STX TEMP3               ;SAVE X\r
+       LDA I,50\r
+       STA RTIMER              ;RESET TIMER IF ROCK HAS BEEN HIT\r
+       LDA Y,OBJ\r
+       AND I,78                ;SAVE PICTURE\r
+       STA TEMP3+1\r
+       LDA Y,OBJ\r
+       AND I,07\r
+       LSR\r
+       TAX\r
+       BEQ 10$                 ;EMPTY NOW\r
+       ORA TEMP3+1\r
+10$:   STA Y,OBJ               ;NEW PICTURE & SIZE\r
+       LDA NPLAYR\r
+       BEQ 20$                 ;WE ARE IN ATTRACT\r
+       LDA TEMP3\r
+       BEQ 15$                 ;SHIP DOES IT\r
+       CMP I,04\r
+       BCC 20$                 ;NO POINTS IF SAUCER DOES IT\r
+15$:   LDA X,99$               ;SCORE FOR HIT\r
+       LDX PLAYR2\r
+       CLC\r
+       JSR POINTS              ;ADD POINTS AND CHECK FOR 10K\r
+20$:   LDX Y,OBJ\r
+       BEQ 90$                 ;DISAPPEARED\r
+       JSR SEARCH              ;SEARCH FOR NEW ENTRY\r
+       BMI 90$                 ;NO MORE ENTRIES\r
+       INC NROCKS\r
+       JSR CPYPOS              ;COPY POSITION FOR NEW ENTRY\r
+       JSR NEWVEL              ;NEW VELOCITY\r
+       LDA X,XINC\r
+       AND I,1F\r
+       ASL\r
+       EOR X,OBJXL\r
+       STA X,OBJXL             ;PREVENT OVERLAPING ROCKS\r
+       JSR SEARC1              ;LOOK FOR NEW ENTRY\r
+       BMI 90$                 ;NO MORE ROOM\r
+       INC NROCKS\r
+       JSR CPYPOS              ;COPY POSITION & PICTURE + VELOCITY\r
+       JSR NEWVEL              ;NEW VELOCITY USING OLD\r
+       LDA X,YINC\r
+       AND I,1F\r
+       ASL\r
+       EOR X,OBJYL\r
+       STA X,OBJYL\r
+90$:   LDX TEMP3\r
+       RTS\r
+\r
+99$:   .BYTE 10,5,2            ;SCORES FOR HITTING SMALL, MEDIUM & LARGE ROCKS\r
+       \r
+       \r
+       .SBTTL UPDATE-UPDATE HIGH SCORE TABLE\r
+;UPDATE-UPDATE HIGH SCORE TABLE\r
+;\r
+UPDATE:        LDA NPLAYR\r
+       BPL 90$                 ;FRAME AFTER END OF GAME (A=-1)\r
+       LDX I,02                ;INDEX FOR PLAYER SCORE\r
+       STA FRAME+1             ;PUT UP HIGH SCORE TABLE NEXT\r
+       STA UPDFLG\r
+       STA UPDFLG+1            ;CLEAR FLAGS\r
+18$:   LDY I,0                 ;INDEX INTO HIGH SCORE TABLE\r
+20$:   LDA Y,HSCORE\r
+       CMP X,SCORE             ;SETS CARRY\r
+       LDA Y,HSCORE+1\r
+       SBC X,SCORE+1\r
+       BCC 30$                 ;NEW HIGH SCORE\r
+25$:   INY\r
+       INY\r
+       CPY I,2*10.\r
+       BCC 20$                 ;LOOP FOR 10 EXTRIES\r
+28$:   DEX\r
+       DEX\r
+       BPL 18$                 ;NEXT PLAYER\r
+       LDA UPDFLG+1\r
+       BMI 29$                 ;NO PLAYER 2 HIGH SCORE\r
+       CMP UPDFLG\r
+       BCC 29$                 ;IF PLAYER 2 SCORE IS BETTER THAN PLAYER 1\r
+       ADC I,02                ;ADD 3\r
+       CMP I,3*10.\r
+       BCC 27$                 ;IF NOT OUT OF TABLE NOW\r
+       LDA I,-1\r
+27$:   STA UPDFLG+1            ;NEW INDEX\r
+29$:   LDA I,0\r
+       STA NPLAYR              ;FLAG DONE WITH UPDATE\r
+       STA UPDINT              ;STARTING WITH FIRST INITIAL\r
+90$:   RTS\r
+       \r
+30$:   STX TEMP2               ;SAVE INDEX\r
+       STY TEMP2+1\r
+       TXA\r
+       LSR\r
+       TAX                     ;0 OR 1\r
+       TYA\r
+       LSR                     ;CLEARS CARRY\r
+       ADC TEMP2+1     \r
+       STA TEMP3               ;INDEX FOR INITIAL TABLE\r
+       STA X,UPDFLG            ;FLAG TO GET PLAYERS INITIALS\r
+       LDX I,3*10.-3\r
+       LDY I,2*10.-2\r
+40$:   CPX TEMP3\r
+       BEQ 45$                 ;IF END OF COPY\r
+       LDA X,INITL-3           ;COPY INITIALS DOWN\r
+       STA X,INITL\r
+       LDA X,INITL-2\r
+       STA X,INITL+1\r
+       LDA X,INITL-1\r
+       STA X,INITL+2\r
+       LDA Y,HSCORE-2                  ;COPY HIGH SCORES\r
+       STA Y,HSCORE\r
+       LDA Y,HSCORE-1\r
+       STA Y,HSCORE+1\r
+       DEY\r
+       DEY\r
+       DEX\r
+       DEX\r
+       DEX\r
+       BNE 40$                 ;LOOP UNTIL X=0 OR DONE\r
+45$:   LDA I,11.\r
+       STA X,INITL             ;START LETTERS AT A\r
+       LDA I,0                 ;CLEARS SECOND AND THIRD INITIALS\r
+       STA X,INITL+1\r
+       STA X,INITL+2\r
+       LDA I,0F0               ;1 MINUTE AT 60HZ\r
+       STA FRAME+1             ;PREPARE TO TIMEOUT GETTING INITIALS\r
+       LDX TEMP2               ;LOOP FOR NEXT PLAYER\r
+       LDY TEMP2+1             ;MOVE HIGH SCORE IN\r
+       LDA X,SCORE+1\r
+       STA Y,HSCORE+1\r
+       LDA X,SCORE\r
+       STA Y,HSCORE\r
+       LDY I,0\r
+       BEQ 28$                 ;ALWAYS\r
+       \r
+CKSUM5:        .BYTE 77                ;7400-77FF\r
+       .PAGE\r
+       .PAGE\r
+;ATAN-ARCTANGENT\r
+;\r
+;ENTRY (X)=X PART OF ARCTAN (Y/X) (SIGNED NUMBER)\r
+;      (Y)=Y PART (SIGNED NUMBER)\r
+;EXIT  (A)=ARCTAN RESULT (0 TO FF, 40=90 DEGREES)\r
+;USES  A,X,Y,(TEMP2,TEMP2+1)\r
+ATAN:  TYA\r
+       BPL ATAN1               ;IF Y>-0\r
+       JSR COMP                ;+Y=-Y\r
+       JSR ATAN1               ;ATAN (-Y/X)\r
+       JMP COMP                ;ARCTAN(Y/X)=-ARCTAN(-Y/X)\r
+               \r
+ATAN1: TAY                     ;DIVISOR\r
+       TXA\r
+       BPL ATAN2               ;IF X=-0\r
+       JSR COMP                ;X=-X\r
+       JSR ATAN2               ;ATAN(Y/-X)\r
+       EOR I,80                ;ARCTAN(Y/X)=80-ARTCAN(Y/-X)\r
+;      JMP COMP\r
+       \r
+       \r
+;COMP-COMPLEMENT ACCUMULATOR\r
+;\r
+;ENTRY (A)=VALUE TO BE COMPLEMENTED\r
+;EXIT  (A)=ANSWER\r
+;USES  A\r
+COMP:  EOR I,0FF\r
+       CLC\r
+       ADC I,01\r
+       RTS\r
+\r
+ATAN2: STA TEMP2+1             ;DIVISOR (X)\r
+       TYA                     ;DIVIDEND (Y)\r
+       CMP TEMP2+1\r
+       BEQ 10$                 ;IF Y=X\r
+       BCC ATAN3               ;IF Y<X USE ARCTAN ON 45 DEGREE SECTOR\r
+       LDY TEMP2+1\r
+       STA TEMP2+1\r
+       TYA\r
+       JSR ATAN3               ;ARCTAN (X/Y)\r
+       SEC\r
+       SBC I,40\r
+       JMP COMP                ;ARCTAN (Y/X)=40-ARCTAN(X/Y)\r
+               \r
+10$:   LDA I,20                ;45 DEGRESS\r
+       RTS\r
+       \r
+ATAN3: JSR DIVIDE              ;4 BIT DIVIDE\r
+       LDA X,ATANA             ;TABLE LOOKUP\r
+       RTS\r
+       \r
+ATANA: .BYTE 0,2,5,7           ;0-3\r
+       .BYTE 10.,12.,15.,17.   ;4-7\r
+       .BYTE 19.,21.,23.,25.   ;8-B\r
+       .BYTE 26.,28.,29.,31.   ;C-F\r
+       \r
+;DIGITS - DISPLAY 2Y DIGIT NUMBERS\r
+;\r
+;ENTRY (C) = CARRY SET FOR ZERO SUPPRESSION\r
+;      (A) = ADDRESS OF (Y) ZERO PAGE LOCATIONS CONTAINING NUMBER (LSB TO MSB)\r
+;      (X) = CHANGE IN INTENSITY (0,10,20,...)\r
+;      (Y) = NUMBER OF ZERO PAGE LOCATIONS TO USE (1 TO 256).\r
+;USES  A,X,Y (TEMP4,TEMP4+2)\r
+DIGITS:        PHP                     ;SAVE INPU PARAMEERS\r
+       STX TEMP4+2\r
+       DEY\r
+       STY TEMP4+1\r
+       CLC\r
+       ADC TEMP4+1\r
+       STA TEMP4               ;MSB OF DIGITS\r
+       PLP\r
+       TAX\r
+10$:   PHP\r
+       LDA X,0\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       PLP\r
+       JSR HEXZ                ;FIRST DIGIT\r
+       LDA TEMP4+1\r
+       BNE 20$\r
+       CLC                     ;DISPLAY LAST DIGIT (EVEN 0)\r
+20$:   LDX TEMP4\r
+       LDA X,0\r
+       JSR HEXZ                ;SECOND DIGIT\r
+       DEC TEMP4\r
+       LDX TEMP4\r
+       DEC TEMP4+1\r
+       BPL 10$                 ;LOOP FOR EACH SET OF DIGITS\r
+       RTS\r
+       \r
+       \r
+;DIVIDE-4 BIT RESULT DIVIDE\r
+;\r
+;ENTRY (A)=DIVIDEND (UNSIGNED)\r
+;      (TEMP2+1)=DIVISOR (UNSIGNED)\r
+;EXIT  (X)=QUOTUNT (4 BITS)\r
+DIVIDE:        LDY I,0\r
+       STY TEMP2               ;CLEAR LSB\r
+       LDY I,4                 ;4 BITS OF RESOLUTION\r
+10$:   ROL TEMP2               ;SHIFT IN BIT OF ANSWER\r
+       ROL\r
+       CMP TEMP2+1\r
+       BCC 20$                 ;NOT LARGE ENOUGH\r
+       SBC TEMP2+1             ;LEAVES CARRY SET\r
+20$:   DEY\r
+       BNE 10$\r
+       LDA TEMP2\r
+       ROL                     ;SHIFT IN LAST BIT\r
+       AND I,0F                ;4 BITS OF RESULTS\r
+       TAX\r
+       RTS\r
+\r
+\r
+;HEXZ - DISPLAY DIGITS WITH ZERO SUPPRESSION\r
+;\r
+;ENTRY (A)=LOWER 4 BITS ARE TO BE DISPLAYED\r
+;      (TEMP4+2)=INTENSITY CHANGE\r
+;      (C)=CLEAR IF NO ZERO SUPPRESSION\r
+;EXIT  (C)=CLEAR IF NO ZERO SUPPRESSION\r
+HEXZ:  BCC HEX                 ;NO ZERO-SUPPRESSION\r
+       AND I,0F\r
+       BEQ HEX1                ;USE BLANK\r
+HEX:   LDX TEMP4+2\r
+       BEQ HEX1                ;USE JSRL TO CHARACTER ROUTINES\r
+       AND I,0F\r
+       CLC\r
+       ADC I,01                ;SKIP OVER BLANK IN\r
+       PHP                     ;SAVE CARRY\r
+       ASL\r
+       TAY\r
+       LDA AY,VGMSGA\r
+       ASL\r
+       STA TEMP2\r
+       LDA AY,VGMSGA+1\r
+       ROL\r
+       AND I,1F\r
+       ORA I,40                ;ADDRESS IS 4000-5FFF\r
+       STA TEMP2+1\r
+       LDY I,0\r
+       STY TEMP1\r
+       STY TEMP1+1\r
+       JSR COPY                ;COPY VECTORS WITH INTENSITY CHANGE\r
+       PLP\r
+       RTS\r
+\r
+HEX1:  JMP VGHEXZ\r
+\r
+       \r
+;RAND-RANDOM NUMBER GENERATOR\r
+;\r
+;EXIT  (A)=RANDOM NUMBER\r
+;\r
+RAND:  ASL POLYL\r
+       ROL POLYH\r
+       BPL 1$\r
+       INC POLYL\r
+1$:    LDA POLYL               ;CHANGE BIT 0 DISPENDING ON BIT 1\r
+       BIT 9$\r
+       BEQ 2$\r
+       EOR I,01\r
+       STA POLYL\r
+2$:    ORA POLYH               ;BEWARE THE 0 CASE\r
+       BNE 3$\r
+       INC POLYL\r
+3$:    LDA POLYL\r
+       RTS\r
+\r
+9$:    .BYTE 2\r
+       \r
+       \r
+;COS-COSINE\r
+;ENTRY =ANGLE (0 TO FF)\r
+;EXIT  (A)=COSINE(-127,127)\r
+COS:   CLC                     ;COS(A)=SIN(A+PI/2)\r
+       ADC I,40\r
+;      JMP SIN\r
+       \r
+       \r
+;SIN-SINE\r
+;\r
+;ENTRY (A)=ANGLE (0 TO FF REPRESENTS 0 TO 360 DEGREES)\r
+;      (CC)=MINUS/PLUS FLAG SET CORRECTLY\r
+;EXIT  (A)=SINE (-127 TO +127)\r
+;USES  A,X\r
+SIN:   BPL SIN1                ;IF PI > ANGLE >-0\r
+       AND I,7F\r
+       JSR SIN1                ;SIN(A) WHEN PI > A >= 0\r
+       JMP COMP                ;SIN(PI+A)=-SIN(A)\r
+\r
+SIN1:  CMP I,41\r
+       BCC 10$                 ;PI/2 >- ANGLE >- 0\r
+       EOR I,7F                ;SIN(PI/2+A)=SIN(PI/2-A)\r
+       ADC I,0                 ;ADD 1\r
+10$:   TAX\r
+       LDA AX,SINCOS\r
+       RTS\r
+\r
+       .END\r
+\r
+\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
\ No newline at end of file
diff --git a/A35131.1B b/A35131.1B
new file mode 100644 (file)
index 0000000..18fb449
Binary files /dev/null and b/A35131.1B differ
diff --git a/A35131.1C b/A35131.1C
new file mode 100644 (file)
index 0000000..8c7183c
--- /dev/null
+++ b/A35131.1C
@@ -0,0 +1,461 @@
+       .SBTTL VECUT-VECTOR GENERATION UTILITY \r
+       .RADIX 16\r
+\r
+;ZERO PAGE GLOBALS\r
+\r
+       .GLOBL VGSIZE,XCOMP,TEMP1,VGLIST,VGBRIT\r
+\r
+;EXTERNAL ENTRY POINTS\r
+\r
+       .GLOBL  VGMSGA\r
+\r
+;ENTRY POINTS\r
+\r
+       .GLOBL VGADD,VGHALT,VGHEX,VGHEXZ,VGSABS,VGDOT\r
+       .GLOBL VGJMPL,VGJSRL,VGLABS\r
+       .GLOBL VGRTSL,VGVCTR,VGWAIT\r
+\r
+\r
+       .SBTTL*********************************************\r
+       .SBTTL*\r
+       .SBTTL*PROGRAMMER:  LOGG\r
+       .SBTTL*\r
+       .SBTTL*CHECKER:\r
+       .SBTTL*\r
+       .SBTTL*********************************************\r
+       .SBTTL VECUT - VECTOR GENERATOR UTILITY SUBROUTINES\r
+;\r
+;DATE INITIATED: 6-MARCH-78\r
+;\r
+;PROJECT CHARGE #: 6W000\r
+;\r
+;DISK #:        96\r
+;\r
+;HARWARE REQUIREMENTS: LYLE RAIN'S VECTOR GENERATOR\r
+;\r
+;MEMORY REQUIREMENTS:  \r
+;      NOT APPLICABLE - SUBROUTINE\r
+;\r
+;INTERRUPT REQUIREMENTS:\r
+;      NOT APPLICABLE - SUBROUTINE\r
+;\r
+;ASSEMBLY COMMAND STRING:\r
+;      R MAC65\r
+;      DX1:VECUT,DK1:VECUT=DX1:VECUT/C\r
+;\r
+;LINK COMMAND STRING:\r
+;      NOT APPLICABLE - SUBROUTINE\r
+;\r
+;PROGRAM DESCRIPTION:\r
+;      A SET OF UTILITY ROUTINES FOR GENERATING\r
+;      VECTORS USING LYLE'S VECTOR GENERATOR\r
+\f;ZERO PAGE GLOBALS REQUIRED:\r
+;\r
+;      VGSIZE: THIS VARIABLE IS USED BY VGSABS AND VGLABS \r
+;              TO CONTROL THE SCALING SIZE OF VECTORS DRAW\r
+;              FOLLOWING THIS VECTOR INSTRUCTION. ITS VALUES RANGE\r
+;              FROM 0 TO F0 IN INCRMENTS OF 10. THIS\r
+;              VALUE WILL BE ADDED TO THE TIMER VALUE\r
+;              OF ALL FOLLOWING VECTORS.\r
+;\r
+;      VGLIST: THIS 2 BYTE VARIABLE CONTAINS THE CURRENT VECTOR GENERATOR RAM\r
+;              ADDRESS USED TO BUILD INSTRUCTIONS FOR THE VECTOR GENERATOR.\r
+;              IT SHOULD BE INITIALIZED BEFORE CALLING ANY OF THESE ROUTINES.\r
+;\r
+;      XCOMP:  THIS 4 BYTE VARIABLE IS USED TO CONTAIN THE X (LSB,MSB) COMPONENT\r
+;              AND Y (LSB,MSB) COMPONENT USED IN SEVERAL OF THE VECTOR INSTRUC-\r
+;              TIONS.  FOR THE VGVCTR ROUTINE THESE FIELDS ARE SIGNED 2'S\r
+;              COMPLEMENT NUMBERS.  SOME ROUTINES USE THIS AREA AS SCRATCH\r
+;              SPACE TO GENERATE X AND Y COMPONENTS (SEE VGSABS).\r
+;\r
+;      TEMP1:  THIS 2 BYTE VARIABLE IS USED AS SCRATCH SPACE.\r
+;\r
+;      VGBRIT: THIS VARIABLE IS USED BY VGVCTR TO GENERATE VECTORS\r
+;              WITH THE GIVEN BRIGHTNESS. IT'S VALUES ARE 0,10,\r
+;              20,...F0 WHERE 0 IS OFF AND F0 IS MAX BRIGHTNESS.\r
+;              A VALUE OF 70 IS USED FOR THE ALPHANUMERIC CHARACTERS.\r
+;\r
+;\r
+;EXTERNAL ENTRY POINTS REQUIRED:\r
+;\r
+;      VGMSGA: THIS ENTRY POINT PROVIDES JSRL INSTRUCTIONS TO THE CHAR.X\r
+;              ROUTINES.  THIS ENTRY POINT IS PROVIDED BY VECAN.MAC.\r
+;\r
+;THESE ROUTINES WERE WRITTEN TO PROVIDE PROGRAMMERS USING LYLE RAIN'S VECTOR\r
+;GENERATOR A MEANS OF:\r
+;      1)      DYNAMICALLY GENERATING VECTORS JUST AS VECMAC ALLOWS STATIC\r
+;              GENERATION OF VECTORS.\r
+;      2)      DISPLAY NUMBERS WITH OR WITHOUT ZERO SUPPRESSION.\r
+;\r
+;EXAMPLE 1:\r
+;\r
+;      LDA I,VECRAM&0FF                ;INITIALIZE VECTOR RAM POINTER\r
+;      STA VGLIST\r
+;      LDA I,VECRAM/100\r
+;      STA VGLIST+1\r
+;      LDA I,256./4            ;POSITION BEAM AT (256,256)\r
+;      LDX I,256./4            ;AND SET SCALE SIZE FOR NEXT VECTORS\r
+;      JSR VGSABS\r
+;      LDA I,40                ;WAIT FOR BEAM TO SETTLE\r
+;      JSR VGWAIT\r
+;      ETC....\r
+;\r
+;\r
+;NOTE: If VGVCTR is not needed, it can be eliminated by defining the\r
+;      symbol VGVCTR before .INCLUDE VECUT.  The same can be done for\r
+;      the routine VGHEX(VGHEXZ).  The zero page locations TEMP1 and\r
+;      VGBRIT are not needed if VGVCTR is not part of VECUT.\r
+;\r
+;\r
+;EXAMPLE 3:\r
+;\r
+;      LDA PLAYER              ;DISPLAY PLAYER NUMBER\r
+;      JSR VGHEX\r
+;      LDA SCORE1              ;MSB OF SCORE\r
+;      LSR\r
+;      LSR\r
+;      LSR\r
+;      LSR\r
+;      SEC\r
+;      JSR VGHEXZ              ;DISPLAY UPPER DIGIT WITH ZERO SUPPRESSION\r
+;      LDA SCORE1\r
+;      JSR VGHEXZ              ;DISPLAY SECOND DIGIT WITH ZERO SUPPRESSION\r
+;      LDA SCORE0              ;LSB OF SCORE\r
+;      PHP\r
+;      LSR\r
+;      LSR\r
+;      LSR\r
+;      LSR\r
+;      PLP\r
+;      JSR VGHEXZ              ;DISPLAY THIRD DIGIT WITH ZERO SUPPRESSION\r
+;      LDA SCORE0\r
+;      JSR VGHEX               ;DISPLAY LAST DIGIT\r
+;      ETC....\r
+\f      .SBTTL VGHALT - ADD HALT TO VECTOR LIST\r
+;VGHALT - ADD HALT TO VECTOR LIST\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,X,Y(VGLIST,VGLIST+1)\r
+\r
+VGHALT:        LDA I,0B0               ;BXXX IS HALT\r
+VGHAL1:        LDY I,0\r
+       STA NY,VGLIST\r
+       INY\r
+       STA NY,VGLIST\r
+       BNE VGADD               ;UPDATE VECTOR LIST\r
+\r
+\r
+       .IIF NDF,VGHEXZ,VGHEXZ=.\r
+       .IF EQ,VGHEXZ-.\r
+       .SBTTL VGHEXZ - DISPLAY DIGIT WITH ZERO SUPPRESSION\r
+;VGHEXZ - DISPLAY DIGIT WITH ZERO SUPPRESSION\r
+;\r
+;THIS ROUTINE WILL DISPLAY A DIGIT USING THE DEFAULT CHARACTER SIZE.\r
+;NO ATTEMPT IS MADE TO USE THE VARIABLE VGSIZE.\r
+;\r
+;ENTRY (A) = LOWER 4 BITS TO BE DISPLAYED\r
+;      (C) = CLEAR IF NO ZERO SUPPRESSION\r
+;EXIT  (C) = CLEARED IF NON-ZERO DIGIT DISPLAYED\r
+;USES  A,X,Y,(VGLIST,VGLIST+1)\r
+\r
+       BCC VGHEX               ;IF NO ZERO SUPPRESSION\r
+       AND I,0F\r
+       BEQ VGHEX1              ;LEAVE C SET\r
+\r
+\r
+       .SBTTL VGHEX - DISPLAY DIGIT\r
+;VGHEX - DISPLAY DIGIT\r
+;\r
+;THIS ROUTINE WILL DISPLAY A DIGIT USING THE DEFAULT CHARACTER SIZE.\r
+;NO ATTEMPT IS MADE TO USE THE VARIABLE VGSIZE.\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;      (A) = LOWER 4 BITS TO BE DISPLAYED\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;      (C) = 0\r
+;USES  A,X,Y,(VGLIST,VGLIST+1)\r
+\r
+VGHEX: AND I,0F\r
+       CLC\r
+       ADC I,01                ;CLEARS C BIT\r
+VGHEX1:        PHP                     ;SAVE C FLAG\r
+       ASL\r
+       LDY I,0\r
+       TAX\r
+       LDA AX,VGMSGA\r
+       STA NY,VGLIST\r
+       LDA AX,VGMSGA+1         ;COPY JSRL TO CHARACTER ROUTINE\r
+       INY\r
+       STA NY,VGLIST\r
+       JSR VGADD               ;UPDATE VECTOR LIST POINTER\r
+       PLP                     ;RESTORE C FLAG\r
+       RTS\r
+       .ENDC\r
+\r
+\r
+       .SBTTL VGJMPL - ADD JMPL TO VECTOR LIST\r
+;VGJMPL - ADD JMPL TO VECTOR LIST\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;      (A) = MSB OF ADDRESS\r
+;      (X) = LSB OF ADDRESS\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,Y,(VGLIST,VGLIST+1)\r
+\r
+VGJMPL:        LSR\r
+       AND I,0F                ;BASE ADDRESS IS RELATIVE TO ZERO\r
+       ORA I,0E0\r
+VGJMP1:        LDY I,01\r
+       STA NY,VGLIST\r
+       DEY\r
+       TXA\r
+       ROR\r
+       STA NY,VGLIST           ;SAVE MSB + OPCODE\r
+       INY\r
+       BNE VGADD               ;UPDATE VECTOR POINTER\r
+\r
+\r
+       .SBTTL VGJSRL - ADD JSRL TO VECTOR LIST\r
+;VGJSRL - ADD JSRL TO VECTOR LIST\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;      (A) = MSB OF ADDRESS\r
+;      (X) = LSB OF ADDRESS\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,Y,(VGLIST,VGLIST+1)\r
+\r
+VGJSRL:        LSR\r
+       AND I,0F                ;BASE ADDRESS IS RELATIVE\r
+       ORA I,0C0\r
+       BNE VGJMP1              ;MOVE INTO VECTOR LIST\r
+\r
+\r
+       .SBTTL VGSABS - SHORT FORM VGLABS CALL\r
+;VGSABS - SHORT FORM VGLABS CALL\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;      (A) = X POSITION/4\r
+;      (X) = Y POSITION/4\r
+;      (VGSIZE)=SCALE FACTOR (0,10,20,...F0)\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,X,Y,(VGLIST,VGLIST+1),(XCOMP,XCOMP+3)\r
+\r
+VGSABS:        LDY I,0\r
+       STY XCOMP+1\r
+       STY XCOMP+3\r
+       ASL\r
+       ROL XCOMP+1\r
+       ASL\r
+       ROL XCOMP+1\r
+       STA XCOMP\r
+       TXA                     ;Y COMPONENT/4\r
+       ASL\r
+       ROL XCOMP+3\r
+       ASL\r
+       ROL XCOMP+3\r
+       STA XCOMP+2\r
+       LDX I,XCOMP\r
+;      JMP VGLABS              ;LABS OF STARTING POSITION\r
+\r
+\r
+       .SBTTL VGLABS - ADD LABS INTO VECTOR LIST\r
+;VGLABS - ADD LABS INTO VECTOR LIST\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;      (X) = ZERO PAGE ADDRESS OF (X LSB, X MSB, Y LSB, Y MSB)\r
+;      (VGSIZE)=SCALE FACTOR (0,10,20,...F0)\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR ADDRESS LIST\r
+;USES  A,Y,(VGLIST,VGLIST+1)\r
+\r
+VGLABS:        LDA ZX,2\r
+       LDY I,0\r
+       STA NY,VGLIST           ;Y LSB\r
+       LDA ZX,3\r
+       AND I,0F\r
+       ORA I,0A0\r
+       INY\r
+       STA NY,VGLIST           ;Y MSB+OPCODE\r
+       LDA ZX,0\r
+       INY\r
+       STA NY,VGLIST           ;X LSB\r
+       LDA ZX,1\r
+       AND I,0F\r
+       ORA VGSIZE              ;ADD SCALE TO DETERMIN SIZE\r
+       INY\r
+       STA NY,VGLIST           ;X MSB\r
+;      JMP VGADD\r
+\r
+\r
+       .SBTTL VGADD - ADD Y+1 TO VECTOR ADDRESS\r
+;VGADD - ADD Y+1 TO VECTOR LIST ADDRESS\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;      (Y) = VALUE+1 TO BE ADDED TO VECTOR LIST\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,(VGLIST,VGLIST+1)\r
+\r
+VGADD: TYA                     ;ADD 1+(Y) TO VGLIST\r
+       SEC\r
+       ADC VGLIST\r
+       STA VGLIST\r
+       BCC 10$\r
+       INC VGLIST+1\r
+10$:   RTS\r
+       \r
+\r
+       .SBTTL VGRTSL - ADD RTSL TO VECTOR LIST\r
+;VGRTSL - ADD RTSL TO VECTOR LIST\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,Y,(VGLIST,VGLIST+1)\r
+\r
+VGRTSL:        LDA I,0D0               ;DXXX IS RTSL\r
+       JMP VGHAL1\r
+\r
+\r
+       .IIF NDF,VGVCTR,VGVCTR=.\r
+       .IF EQ,VGVCTR-.\r
+       .SBTTL VGVCTR - ADD VCTR TO VECTOR LIST\r
+;VGVCTR - CONVERT TO SIGN MAGNITUDE\r
+;\r
+;DESCRIPTION:\r
+;      1) CONVERT 16 BIT 2'S COMPLEMENT #'S\r
+;         TO 11 BIT SIGN-MAGNITUDE\r
+;      2) NORMALIZE LARGER #\r
+;      3) ALIGN SMALLER # WITH LARGER\r
+;      4) PACK WITH EXPONENT (OP-CODE) AND BRIGHTNESS\r
+;      5) WRITE THIS TO VECTOR LIST\r
+;\r
+;NOTE: IF THE NUMBERS GIVEN ARE MORE THAN\r
+;      10 BITS IN SIGNIFICANE THEN AN\r
+;      INCORRECT VECTOR WILL BE GENERATED.\r
+;\r
+;ENTRY (XCOMP-XCOMP+3) = ZERO PAGE LOCN.  CONTAINING (X LSB,X MSB,Y MSB,Y LSB)\r
+;      (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,X,Y,(XCOMP-XCOMP+3),TEMP1\r
+\r
+       LDA XCOMP+1             ;GET HIGH BYTE OF X\r
+       CMP I,80                ;SET CARRY PER SIGN\r
+       BCC 2$                  ;BPL\r
+       EOR I,0FF\r
+       STA XCOMP+1\r
+       LDA XCOMP\r
+       EOR I,0FF\r
+       ADC I,0                 ;ADDS ONE (CARRY SET)\r
+       STA XCOMP\r
+       BCC 1$\r
+       INC XCOMP+1\r
+1$:    SEC\r
+2$:    ROL TEMP1               ;SAVE SIGN OF X\r
+       LDA XCOMP+3             ;REPEAT ABOVE FOR Y\r
+       CMP I,80\r
+       BCC 4$\r
+       EOR I,0FF\r
+       STA XCOMP+3\r
+       LDA XCOMP+2\r
+       EOR I,0FF\r
+       ADC I,0\r
+       STA XCOMP+2\r
+       BCC 3$\r
+       INC XCOMP+3\r
+3$:    SEC\r
+4$:    ROL TEMP1               ;SAVE SIGN OF Y\r
+       LDA XCOMP+1\r
+       ORA XCOMP+3\r
+       BEQ 5$                  ;IF LESS THAN 256 IN LENGTH\r
+       LDX I,0\r
+       CMP I,02\r
+       BCS 20$                 ;NO NORMALIZE NEEDED\r
+       LDY I,01                ;ONE SHIFT NEEDED\r
+       BNE 8$                  ;ALWAYS\r
+       \r
+5$:    LDY I,02\r
+       LDX I,9.\r
+       LDA XCOMP\r
+       ORA XCOMP+2\r
+       BEQ 20$                 ;ZERO LENGTH VECTOR\r
+6$:    BMI 8$                  ;COUNT IS RIGHT\r
+7$:    INY                     ;GET NORMALIZE COUNT\r
+       ASL\r
+       BPL 7$\r
+8$:    TYA\r
+       TAX                     ;SAVE SHIFT COUNT FOR TIMER\r
+       LDA XCOMP+1\r
+10$:   ASL XCOMP\r
+       ROL\r
+       ASL XCOMP+2\r
+       ROL XCOMP+3\r
+       DEY\r
+       BNE 10$                 ;NORMALIZE NUMBERS\r
+       STA XCOMP+1\r
+20$:   TXA\r
+       SEC\r
+       SBC I,10.\r
+       EOR I,0FF               ;9-COUNT=TIMER (TTTT)\r
+       ASL\r
+       ROR TEMP1               ;SIGN OF Y (S)\r
+       ROL\r
+       ROR TEMP1               ;SIGN OF X (S)\r
+       ROL\r
+       ASL\r
+       STA TEMP1               ;TTTTXSSX\r
+       LDY I,0\r
+       LDA XCOMP+2\r
+       STA NY,VGLIST\r
+       LDA TEMP1\r
+       AND I,0F4               ;SIGN+EXPONENT\r
+       ORA XCOMP+3\r
+       INY\r
+       STA NY,VGLIST\r
+       LDA XCOMP\r
+       INY\r
+       STA NY,VGLIST\r
+       LDA TEMP1\r
+       AND I,02\r
+       ASL                     ;SIGN\r
+       ORA VGBRIT              ;BRIGHTNESS\r
+       ORA XCOMP+1\r
+       INY\r
+       STA NY,VGLIST           ;STORE LAST BYTE OF VCTR\r
+       JMP VGADD               ;UPDATE VECTOR ADDRESS POINTER\r
+       .ENDC\r
+\r
+\r
+       .SBTTL VGWAIT - ADD WAIT TO VECTOR LIST\r
+;VGWAIT - ADD WAIT TO VECTOR LIST\r
+;\r
+;ENTRY (VGLIST,VGLIST+1) = VECTOR ADDRESS LIST\r
+;      (A) = TIMER (0=NO DELAY, 90=MAX DELAY, INCREMENTS OF 10)\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR ADDRESS LIST\r
+;USES  A,X,Y,(VGLIST,VGLIST+1)\r
+\r
+VGWAIT:        LDX I,0                 ;NO INTENSITY\r
+;      JMP VGDOT\r
+\r
+\r
+\r
+       .SBTTL VGDOT - DRAW A DOT AT THE CURRENT POSITION\r
+;VGDOT - DRAW A DOT AT CURRENT POSITION\r
+;\r
+;ENTRY         (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
+;      (A) = TIMER (0 = NO DELYA, 90 = MAX DELAY, 10 = INCREMENT)\r
+;      (X) = INTENSITY (0 = OFF, F0 = MAX, 10 = INCREMENT)\r
+;EXIT  (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
+;USES  A,Y, (VGLIST,VGLIST+1)\r
+\r
+VGDOT: LDY I,1\r
+       STA NY,VGLIST           ;SAVE TIMER VALUE\r
+       DEY\r
+       TYA                     ;(A):=(Y):=0\r
+       STA NY,VGLIST           ;0, TIMER, 0, 0=WAIT\r
+       INY\r
+       INY\r
+       STA NY,VGLIST\r
+       INY\r
+       TXA                     ;INSERT INTENSITY\r
+       STA NY,VGLIST\r
+       JMP VGADD\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
\ No newline at end of file
diff --git a/A35131.1D b/A35131.1D
new file mode 100644 (file)
index 0000000..ff28764
Binary files /dev/null and b/A35131.1D differ
diff --git a/A35131.1E b/A35131.1E
new file mode 100644 (file)
index 0000000..dec53a5
--- /dev/null
+++ b/A35131.1E
@@ -0,0 +1,439 @@
+       .TITLE ASTTST-ASTEROID SELF TEST\r
+       .CSECT\r
+       .RADIX 16\r
+       .ENABL AMA\r
+       .LIST MEB\r
+       .NLIST BYT\r
+;*******************************\r
+;*\r
+;* THIS PROGRAM RESIDES IN THE UPPER 1K OF PROGRAM SPACE\r
+;* ITPERFORMS POWER ON RESET PROCESSING\r
+;* AS WELL AS SELF-TEST. SEE ASTROD.MAC FOR HARDWARE\r
+;* CONFIGURATION\r
+;*\r
+;*******************************\r
+       .SBTTL ****************************\r
+       .SBTTL *\r
+       .SBTTL *PROGRAMMER: ED LOGG\r
+       .SBTTL *\r
+       .SBTTL ****************************\r
+;\r
+;ENTRY POINTS\r
+;\r
+       .GLOBL PWRON\r
+       \r
+;\r
+;EXTERNAL ENTRY POINTS\r
+;\r
+       .GLOBL TEST1,BNKERR                     ;SELF TEST X-Y PATTERN\r
+       .GLOBL START,NMI\r
+       .GLOBL VGHALT,VGVCTR,VGRTSL,VGMSGA      ;UTILITY X-Y ROUTINES\r
+       .GLOBL VGJMPL,VGJSRL,VGLABS,VGADD\r
+       .GLOBL VGWAIT,VGSABS,VGHEX,VGHEXZ\r
+       .GLOBL VGDOT\r
+;\r
+;ZERO PAGE DECLARATIONS\r
+;\r
+       .GLOBL SYNC,UPDFLG,VGLIST,TEMP3,LOUT1,VGSIZE\r
+       .GLOBL TEMP1,TEMP2,$CMODE,TEMP4\r
+       \r
+       \r
+       .INCLUDE ASTDEC\r
+       \r
+       \r
+\f      .SBTTL PWRON - POWER ON INITIALIZATION\r
+;PWRON-POWER ON INITIALIZATION\r
+;\r
+;THIS ROUTINE SETS UP POINTERS FOR THE VECTOR GENERATOR AND\r
+;CLEARS AND SETS 0 PAGE AS NEEDED.\r
+;\r
+PWRON: LDX I,0FE\r
+       TXS                     ;SET STACK\r
+       CLD                     ;NO DECIMAL\r
+       LDA I,0\r
+       TAX\r
+10$:   DEX\r
+       STA AX,300              ;CLEAR PLAYER OBJECT\r
+       STA AX,200\r
+       STA AX,100\r
+       STA X,0\r
+       BNE 10$                 ;ALL OF ZERO PAGE\r
+       LDY A,STSTSW\r
+       BMI STEST               ;IF SELF TEST SWITCH ON\r
+       INX\r
+       STX A,VECRAM            ;SET UPPER JUMP IN VECTOR BUFFERS\r
+       LDA I,0E2\r
+       STA A,VECRAM+1\r
+       LDA I,0B0               ;HALT FOR FIRST TIME THRU\r
+       STA A,VECRAM+3\r
+       STA Z,UPDFLG            ;FLAG THAT WE ARE NOT GETTING HIGH SCORE INITIALS\r
+       STA Z,UPDFLG+1\r
+       LDA I,03\r
+       STA Z,LOUT1             ;TURN OFF LIGHTS AND CLEAR BANK SELECT\r
+       STA A,OUT1\r
+       AND A,OPTN1\r
+       STA Z,$CMODE            ;SET COIN MODE\r
+       LDA A,OPTN2             ;GET 1,4,5 OR 6 COIN MULTIPLIER\r
+       AND I,03\r
+       ASL\r
+       ASL\r
+       ORA Z,$CMODE\r
+       STA Z,$CMODE\r
+       LDA A,OPTN3             ;GET 1 OR 2 MULTIPLIER COIN MODE\r
+       AND I,02\r
+       ASL\r
+       ASL\r
+       ASL\r
+       ORA Z,$CMODE\r
+       STA Z,$CMODE\r
+       JMP START               ;START MAIN LINE OVER\r
+\r
+\r
+       .SBTTL STEST - SELF TEST PROCESSING\r
+STEST: STA AX,4000             ;CLEAR ALL OF MEMORY -TURN LIGHTS ON-SOUNDS OFF\r
+       STA AX,4100             ;NOTE PAGE 0,1,2 AND 3 CLEARED BY POWER ON RESET\r
+       STA AX,4200\r
+       STA AX,4300\r
+       STA AX,4400\r
+       STA AX,4500\r
+       STA AX,4600\r
+       STA AX,4700\r
+       INX\r
+       BNE STEST               ;CLEAR ALL THE ABOVE PAGES\r
+       STA A,WTDOG             ;WATCHDOG TIME\r
+       LDX I,0                 ;INDEX WITHIN ZERO PAGE\r
+20$:   LDA ZX,0\r
+       BNE 70$                 ;NOT A ZERO - ERROR\r
+       LDA I,11\r
+30$:   STA ZX,0                ;WRITE OUT TEST PATTERN\r
+       TAY\r
+       EOR ZX,0\r
+       BNE 70$                 ;NOT THE SAME - ERROR\r
+       TYA\r
+       ASL\r
+       BCC 30$                 ;SHIFT PATTERN\r
+       INX\r
+       BNE 20$                 ;NEXT LOCATION\r
+       STA A,WTDOG             ;WATCHDOG DON'T WORRY ABOUT US\r
+       TXA                     ;LDA I,0\r
+       STA 0\r
+       ROL                     ;LDA I,01\r
+35$:   STA 1                   ;USE ZERO PAGE FOR REST OF MEMORY TESTS\r
+       LDY I,0\r
+40$:   LDX I,11                ;CURRENT PATTERN\r
+       LDA NY,0\r
+       BNE 80$                 ;AN ERROR - MUST START ZERO\r
+45$:   TXA\r
+       STA NY,0                ;WRITE TO LOCATION\r
+       EOR NY,0                ;COMPARE IT\r
+       BNE 80$                 ;AN ERROR\r
+       TXA\r
+       ASL\r
+       TAX\r
+       BCC 45$                 ;NEXT PATTERN\r
+       INY\r
+       BNE 40$                 ;NEXT LOCATION TO TEST\r
+       STA A,WTDOG             ;NO BARKING NOW - WHY SURE....\r
+       INC 1\r
+       LDX 1\r
+       CPX I,04\r
+       BCC 40$                 ;NEXT PAGE TO TEST\r
+       LDA I,40\r
+       CPX I,40\r
+       BCC 35$                 ;TEST 2K OF RAM AT 4000\r
+       CPX I,48\r
+       BCC 40$                 ;MORE OF 2K BLOCK LEFT\r
+       BCS STEST3              ;RAM IS GOOD\r
+\r
+70$:   LDY I,0                 ;ERROR IN FIRST 1K\r
+       BEQ STEST1\r
+\r
+80$:   LDY I,0\r
+       LDX 1\r
+       CPX I,04\r
+       BCC STEST1              ;IF ERROR IN FIRST 1K OF RAM\r
+       INY\r
+       CPX I,44\r
+       BCC STEST1              ;ERROR IN SECOND 1K RAM\r
+       INY                     ;ERROR MUST BE IN THIRD 1K RAM\r
+STEST1:        CMP I,10                ;SET TO 1,2 OR 3\r
+       ROL\r
+       AND I,1F\r
+       CMP I,02\r
+       ROL                     ;EACH 1 REPRESENTS A BAD 2114\r
+       AND I,03\r
+15$:   DEY\r
+       BMI 20$                 ;IF THIS 1K BLOCK WAS BAD\r
+       ASL                     ;FLAG 2 RAM IC'S AS GOOD\r
+       ASL\r
+       BCC 15$                 ;ALWAYS\r
+\r
+20$:   LSR\r
+       LDX I,14\r
+       BCC 25$                 ;IF RAM IC IS GOOD\r
+       LDX I,1D\r
+25$:   STX A,THUMP\r
+       LDX I,0\r
+       LDY I,08\r
+31$:   BIT A,THRKHZ            ;COUNT 1 3KHZ SIGNAL\r
+       BPL 31$\r
+32$:   BIT A,THRKHZ\r
+       BMI 32$\r
+       DEX\r
+       STA A,WTDOG             ;NOW NOT\r
+       BNE 31$                 ;COUNT FOR 256/3000 OF A SECOND\r
+       DEY\r
+       BNE 31$                 ;8*256/3000 OF A SECOND\r
+       STX A,THUMP             ;TURN OFF SOUND\r
+       LDY I,08\r
+35$:   BIT A,THRKHZ            ;COUNT 3KHZ SIGNALS\r
+       BPL 35$\r
+36$:   BIT A,THRKHZ\r
+       BMI 36$\r
+       DEX\r
+       STA A,WTDOG             ;NOT NOW\r
+       BNE 35$                 ;COUNT TIL 256/3000 OF A SECOND\r
+       DEY\r
+       BNE 35$                 ;COUNT TIL 8*256/3000 SECONDS\r
+       TAX                     ;SET FLAGS\r
+       BNE 20$                 ;MORE TO COME\r
+STOP:  STA A,WTDOG             ;NO BITING NOW\r
+       LDA A,STSTSW\r
+       BMI STOP                ;WAIT UNTIL STEST SWITCH IS PUSHED\r
+10$:   BPL 10$                 ;START ALL OVER - WITH WATCHDOG\r
+\r
+STEST3:        LDA I,0                 ;CKSUM ALL ROMS\r
+       TAY\r
+       TAX\r
+       STA Z,TEMP1\r
+       LDA I,50\r
+5$:    STA Z,TEMP1+1\r
+       LDA I,04\r
+       STA Z,TEMP2\r
+       LDA I,0FF               ;STARTING PATTERN\r
+10$:   EOR NY,TEMP1\r
+       INY\r
+       BNE 10$                 ;DO ONE PAGE\r
+       INC Z,TEMP1+1\r
+       DEC Z,TEMP2\r
+       BNE 10$                 ;DO 4 PAGES\r
+       STA ZX,TEMP3            ;STORE 8 CKSUMS STARTING AT TEMP3\r
+       INX\r
+       STA A,WTDOG             ;WHAT HAVE YOU BEEN TYPING ON THESE, LINDA?\r
+       LDA Z,TEMP1+1\r
+       CMP I,58\r
+       BCC 5$                  ;CKSUM 5000 TO 5800\r
+       BNE 20$                 ;THEN SKIP TO 6800\r
+       LDA I,68\r
+20$:   CMP I,80\r
+       BCC 5$                  ;CKSUM 6800 TO 8000\r
+       STA A,300               ;200=88 AND 300=80\r
+       LDX I,04                ;200=88 FROM RAM TEST\r
+       STX A,OUT1              ;SWITCH PAGE 2 AND 3\r
+       STX Z,TEMP4             ;INDEX FOR DIAGNOSTICS BELOW\r
+       LDX I,0\r
+       CMP A,200\r
+       BEQ 25$                 ;BANK SELECT APPEARS OK\r
+       INX\r
+25$:   LDA A,300\r
+       CMP I,88\r
+       BEQ 30$\r
+       INX\r
+30$:   STX Z,TEMP2+1           ;SAVE BANK SELECT ERROR FLAG\r
+       LDA I,10\r
+       STA Z,VGSIZE            ;SET CHARACTER SIZE\r
+STEST5:        LDX I,0A8               ;THIS IS SET FOR 16MS BEST CASE\r
+1$:    LDA A,HALT              ;IT TAKES 20 MX FOR WORST COS\r
+       BPL 9$                  ;IF VECTOR GENERATOR HALTED OK\r
+5$:    LDA A,THRKHZ            ;WAIT THRU ONE 3KHZ CYCLE\r
+       BPL 5$\r
+7$:    LDA A,THRKHZ\r
+       BMI 7$\r
+       DEX                     ;COUNTDOWN TO VECTORS REPEAT EVERY 16MS\r
+       BMI 5$                  ;WAIT UNTIL 16 MX ARE UP\r
+       STA A,WTDOG\r
+       BNE 1$                  ;AFTER 60 MS VECTOR GENERATOR MUST BE STUCK\r
+8$:    BEQ 8$                  ;WAIT FOR WATCHDOG\r
+\r
+9$:    LDA I,VECRAM&0FF\r
+       STA Z,VGLIST\r
+       LDA I,VECRAM/100\r
+       STA Z,VGLIST+1\r
+       LDA DIAGSW\r
+       BPL STEST6              ;NOT IN DIAGS\r
+       LDX Z,TEMP4             ;0 TO 3\r
+       LDA A,HYPSW             ;DECREMENT INDEX IF HYPERSPACE RUSHED\r
+       BPL 20$                 ;IF HYPERSPACE SWITCH OFF\r
+       EOR TEMP1+1\r
+       BPL 20$                 ;IF IT WAS ON BEFORE TOO\r
+       DEX\r
+       BEQ 20$                 ;ALREADY AT 0\r
+       STX Z,TEMP4             ;NEW INDEX\r
+20$:   LDY AX,80$-1            ;LENGTH OF COPY\r
+       LDA I,0B0\r
+       STA NY,VGLIST           ;ADD HALT AT END\r
+       DEY\r
+       DEY                     ;XX BX IS INSTRUCTION FOR HALT\r
+10$:   LDA AY,90$              ;COPY IN TEST PATTERN\r
+       STA NY,VGLIST\r
+       DEY\r
+       BPL 10$\r
+       JMP STEST7              ;CHECK SELF TEST SWITCH\r
+\r
+80$:   .BYTE 51.,29.,23.,13.\r
+\r
+90$:   .BYTE 80,0A0,0,0        ;LABS 0,128.,0\r
+       .BYTE 0,70,0,0          ;WAIT 7\r
+       .BYTE 0FF,92,0FF,73     ;VCTR 767.,1023.,7\r
+       .BYTE 0D0,0A1,30,2      ;LABS 560.,464.,0       -SHORT VECTOR TEST\r
+       .BYTE 0,70,0,0          ;WAIT 7\r
+       .BYTE 7F,0FB            ;VCTR -48.,+48.,7       =SHORT VECTOR BACK TO MIDDLE\r
+       .BYTE 0D,0E0            ;JMP 91$                -JUMP TEST\r
+       .BYTE 0,0B0             ;HALT\r
+91$:   .BYTE 7E,0FA            ;VCTR -32.,32.,7\r
+       .BYTE 11,0C0            ;JSRL 92$               -JSRL TEST - 4 LEVELS\r
+       .BYTE 78,0FE            ;VCTR 0,-32,7\r
+       .BYTE 0,0B0             ;HALT\r
+92$:   .BYTE 13,0C0            ;JSRL 93$\r
+       .BYTE 0,0D0             ;RTSL\r
+93$:   .BYTE 15,0C0            ;JSRL 94$\r
+       .BYTE 0,0D0             ;RTSL\r
+94$:   .BYTE 17,0C0            ;JSRL 95$\r
+       .BYTE 0,0D0             ;RTSL\r
+95$:   .BYTE 7A,0F8            ;VCTR 32,0,7\r
+       .BYTE 0,0D0             ;RTSL\r
+\r
+STEST6:        LAH TEST1\r
+       LXL TEST1\r
+       JSR VGJSRL              ;JSRL TO TEST PATTERN\r
+       LDA I,420./4\r
+       LDX I,590./4\r
+       JSR VGSABS              ;POSITION BEAM\r
+       LDA I,30\r
+       JSR VGWAIT\r
+       LDX I,03                ;NO NEED TO WAIT\r
+28$:   LDA AX,OPTN1            ;GO FROM SW1 TO SW8\r
+       AND I,01\r
+       STX Z,TEMP2\r
+       JSR VGHEX               ;DISPLAY 0 OR 1\r
+       LDX Z,TEMP2\r
+       LDA AX,OPTN1\r
+       AND I,02\r
+       LSR\r
+       JSR VGHEX               ;DISPLAY 0 OR 1\r
+       LDX Z,TEMP2\r
+       DEX\r
+       BPL 28$                 ;LOOP THRU 8 SWITCHES\r
+       LDA I,490./4\r
+       LDX I,630./4\r
+       JSR VGSABS              ;POSITION BEAM\r
+       LDA A,OPTN3             ;NO WAIT NEEDED\r
+       AND I,02\r
+       LSR                     ;CLEAR CARRY\r
+       ADC I,01                ;1 OR 2\r
+       JSR VGHEX               ;PUT UP CHARACTER\r
+       LDA A,OPTN2\r
+       AND I,03\r
+       TAX\r
+       LDA AX,STEST8\r
+       JSR VGHEX               ;PUT UP DOLLAR MECH VALUE\r
+       LDA Z,TEMP2+1\r
+       BEQ 30$\r
+       LXL BNKERR\r
+       LAH BNKERR\r
+       JSR VGJSRL              ;JSRL BNKERR FOR BANK SELECT ERROR \r
+30$:   LDA I,200./4\r
+       LDX I,728./4\r
+       JSR VGSABS              ;POSITION BEAM\r
+       LDA I,70\r
+       JSR VGWAIT\r
+       LDX I,0                 ;0 TO 7\r
+32$:   LDA ZX,TEMP3\r
+       BEQ 35$                 ;NO ERROR IN THIS ROM\r
+       LDA I,0B                ;VCTR 48,0,0 -SPACING BETWEEN CHARACTERS\r
+       LDY I,0\r
+       STA NY,VGLIST\r
+       INY\r
+       LDA I,0F0               ;REMEMBER SCALING =10\r
+       STA NY,VGLIST\r
+       JSR VGADD               ;UPDATE VGLIST\r
+       STX Z,TEMP2\r
+       TXA\r
+       JSR VGHEX               ;DISPLAY DIGIT\r
+       LDX Z,TEMP2\r
+35$:   INX\r
+       CPX I,08\r
+       BCC 32$                 ;ONLY PROM'S 0 THRU 7 (8 1K BLOCKS)\r
+       LDA I,200./4\r
+       LDX I,678./4\r
+       JSR VGSABS              ;POSITION LINE\r
+       LDA I,70\r
+       JSR VGWAIT\r
+       LDX I,0\r
+40$:   LDA ZX,TEMP3\r
+       BEQ 45$                 ;NO ERROR IN THIS ROM\r
+       LDA I,03                ;VCTR 24,0,0 -SPACING BETWEEN NUMBERS\r
+       LDY I,0\r
+       STA NY,VGLIST\r
+       INY\r
+       LDA I,0F8\r
+       STA NY,VGLIST\r
+       JSR VGADD\r
+       STX Z,TEMP2\r
+       LDA ZX,TEMP3\r
+       PHA\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       JSR VGHEX               ;UPPER DIGIT OF CKSUM\r
+       PLA\r
+       JSR VGHEX               ;LOWER DIGIT OF CKSUM\r
+       LDX Z,TEMP2\r
+45$:   INX\r
+       CPX I,08\r
+       BCC 40$                 ;LOOP THRU 8 1K BLOCKS\r
+       LDA I,1023./8\r
+       TAX\r
+       JSR VGSABS              ;CENTER BEAM\r
+       JSR VGHALT              ;STOP BEAM\r
+STEST7:        STA A,GOADD             ;START PICTURE\r
+       LDA I,0                 ;COLLECT EACH SWITCH AS A BIT\r
+       LDX I,04\r
+5$:    ROL AX,HYPSW            ;ASSUMES ALL SWITCHES ARE\r
+       ROR                     ;DECODED FOR READ ONLY AND\r
+       DEX                     ;THAT A WRITE WILL NOT\r
+       BPL 5$                  ;EFFECT ANYTHING\r
+       TAY\r
+       LDX I,07\r
+10$:   ROL AX,$COINA           ;THIS ASSUMES THAT THE 8\r
+       ROL                     ;SWITCH ARE CONSECUTIVE\r
+       DEX\r
+       BPL 10$                 ;8 SWITCHES TO READ\r
+       TAX\r
+       EOR Z,TEMP1\r
+       BNE 20$                 ;A SWITCH HAS CHANGED\r
+       TYA\r
+       EOR Z,TEMP1+1\r
+       BEQ 25$                 ;NO CHANGE IN ANY SWITCH\r
+20$:   LDA I,80                ;TURN ON SOUND\r
+25$:   STA A,TONE\r
+       STX Z,TEMP1             ;SAVE SWITCH READINGS\r
+       STY Z,TEMP1+1\r
+       LDA A,STSTSW\r
+90$:   BPL 90$                 ;START ALL OVER AGAIN - WATCHDOG WILL RESET EVERYTHING\r
+       JMP STEST5              ;CONTINUE THIS PHASE OF SELF-TEST\r
+\r
+       \r
+STEST8:        .BYTE 1,4,5,6           ;DOLLAR MECH VALUES\r
+CKSUM7:        .BYTE 0B1       ;CHECKSUM FOR 7C00-7FFF\r
+\r
+       .REPT 37\r
+       .BYTE 0                 ;FILL RESET OF ROM\r
+       .ENDR\r
+\r
+       .WORD NMI\r
+       .WORD PWRON\r
+       .WORD PWRON\r
+       .END\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
\ No newline at end of file
diff --git a/ASTDEC.XX b/ASTDEC.XX
new file mode 100644 (file)
index 0000000..fe0a5c2
Binary files /dev/null and b/ASTDEC.XX differ
diff --git a/ASTROD.DOC b/ASTROD.DOC
new file mode 100644 (file)
index 0000000..230fbb9
Binary files /dev/null and b/ASTROD.DOC differ
diff --git a/ASTROD.MAP b/ASTROD.MAP
new file mode 100644 (file)
index 0000000..e7fcf7b
Binary files /dev/null and b/ASTROD.MAP differ
diff --git a/COIN65.XX b/COIN65.XX
new file mode 100644 (file)
index 0000000..0751d38
--- /dev/null
+++ b/COIN65.XX
@@ -0,0 +1,497 @@
+;        .TITLE COIN65 - 650X "UNIVERSAL" COIN ROUTINE\r
+        .SBTTL *********************************\r
+        .SBTTL * PROGRAMERS: DOWNEND & ALBAUGH *\r
+        .SBTTL *                               *\r
+        .SBTTL * CHECKER:                      *\r
+        .SBTTL *                               *\r
+        .SBTTL *********************************\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
+        .SBTTL DEFAULT ASSIGNMENTS\r
+        .LIST CND\r
+        .IIF NDF,MODES,MODES=4          ;FOUR COIN MODES STANDARD\r
+                                       ;ALTERNATE IS MODES=0\r
+       .IIF NDF,MECHS,MECHS=3          ;# OF MECHS (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
+       .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
+       \r
+       .IFF                            ;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-3\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>\r
+       .ERROR          ;NONE,ONE, OR THREE E.M.CTRS ONLY\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
+       .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
+        .NLIST CND\r
+;ENTRY POINT\r
+        .GLOBL MOOLAH\r
+;\r
+;EXTERNAL REFERENCES\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>      ;CHECK # OF MECHS SPEC'D\r
+       .ERROR ;2 OR 3 MECHS ONLY, PLEASE\r
+       .ENDC                           ;NE,<MECHS-2>*CMECHS-3>\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,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:   Three base page bytes ($CNSTT, $CNSTT+OFFSET,$CNSTT+2*OFFSET) which should be\r
+       initialized to 00 (the timers for coin detection).\r
+$COINA:   Three 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
+       D1-MId, D2-Left.\r
+       D6-Mid, D5-Left. If Coin01=1, D0-Right\r
+       .ENDR\r
+       .IF NE,SEPCCT\r
+       .REPT 0\r
+$CNCT:    Three 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 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:   Three (or 2,if Mechs=2) 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.\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, 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
+       $CCTIM: .BLKB 1         ;COIN COUNTER TIMER (IF 1 USED)\r
+        $$CRDT: .BLKB 1                ;CREDIT TOTAL\r
+        $CNCT:  .BLKB 6                ;COIN COUNTS\r
+       $LMTIM  =$CNCT+1        ;PRE-COIN SLAM-TIMER\r
+       $CMODE  =$CNCT+3        ;COIN MODE\r
+        $PSTSL: .BLKB 6                ;POST-COIN SLAM TIMERS (@ 1,3,5)\r
+        $CNSTT  =$CNCT+1\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
+       $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
+        LDX I,OFFSET*<MECHS-1> ;X IS USED TO INDEX FROM RIGHT TO LEFT COIN MECH\r
+        .IF EQ,COIN67!COIN01\r
+DETECT: LDA AX,$COINA\r
+        ASL\r
+        .IFF\r
+DETECT:        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
+        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
+        TAY                     ;ELSE SAVE STATUS\r
+        LDA Z,$INTCT            ;CHECK INTERUPT CTR\r
+        AND I,7                 ;ARE D0-D2 ALL ONES?\r
+        CMP I,7\r
+        TYA                     ;STATUS BACK INTO ACC\r
+        BCC 1$                  ;SKIP IF NOT BOTH ONES\r
+10$:    SBC I,1                 ;CARRY SET\r
+1$:     STA ZX,$CNSTT           ;SAVE UPDATED STATUS\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\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
+        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
+        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
+        LDA ZX,$CNSTT           ;GET STATUS AGAIN\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
+        STA ZX,$CNSTT           ;SAVE RESET STATUS\r
+;       [CLC]                   DEFAULT TO "NO COIN" (CARRY IS ALREADY CLEAR)\r
+        LDA ZX,$PSTSL           ;CHECK HOWIES ASSUMPTION\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
+        STA ZX,$PSTSL           ;DELAY ACCEPTANCE FOR POST 60 SEC.\r
+        \r
+8$:                             ;CARRY=1 IF COIN FALLS OUT\r
+        BCC 9$\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
+       .IFF                    ;I.E., 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
+       .IFTF                   ;MECHS=2 OR 3\r
+       GDM                     ;ELSE GET DOLLAR MUL\r
+       BEQ 85$                 ;00-ADD 1\r
+       ADC I,2                 ;ELSE MAP 1,2,3 TO 3,4,5\r
+       .IFF                    ;EQ,MECHS-2\r
+       BNE 85$                 ;(ALWAYS)\r
+       \r
+83$:   GHM\r
+       BEQ 85$\r
+       LDA I,1\r
+       .ENDC                   ;EQ,MECHS-2\r
+85$:   SEC\r
+       .IF NE,SEPCCT\r
+       .PRINT                  ;I'M NOT SURE YOU WANT TO DO THIS, ARE YOU?\r
+       ADC X,$CNCT\r
+       STA X,$CNCT             ;UPDATE COIN COUNT FOR PROGRAM\r
+       .IFF                    ;NE,SEPCCT\r
+       .IF EQ,<MULTS-1>!<EMCTRS-1>\r
+\r
+;THE NORMAN AVELLAR MEMORIAL KLUGE\r
+\r
+       TAY                     ;SAVE INCREMENT\r
+       .IFTF                   ;EQ,<MULTS-1>!<EMCTRS-1>\r
+       ADC $CNCT\r
+       STA $CNCT\r
+       .IFT                    ;EQ,<MULTS-1>!<EMCTRS-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
+;\r
+;###NOTE:  THIS CODE PROVIDED ONLY FOR OLD AMERICAN GAMES. USE WITH 5 DM\r
+;MECHS IS STRONGLY DISCOURAGED\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>!<EMCTRS-1>\r
+       .ENDC                   ;SEPCCT\r
+       .IFF                    ;NE, MULTS\r
+;FALL THROUGH TO BUMP $CNCT\r
+       .IF NE,SEPCCT           ;IF ASKED FOR SEPARATE COUNT,\r
+       INC X,$CNCT             ;USE INDEXED INC\r
+       .IFF                    ;ELSE USE COMMON COUNTER\r
+        INC $CNCT\r
+       .ENDC                   ;NE,SEPCCT\r
+       .ENDC                   ;NE,MULTS\r
+       .IF EQ,EMCTRS-1         ;IF 1 COIN COUNTER USED\r
+       .IF NE,MECHS-2!<MULTS-1>\r
+       INC $CCTIM              ;INIT COIN PULSE TO E.M. COUNTER\r
+       .ENDC                   ;NE,MECHS-2!<MULTS-1>\r
+       .ENDC                   ;EQ,EMCTRS-1\r
+       .IF EQ,EMCTRS-3         ;IF 3 COUNTERS USED\r
+       INC X,$CCTIM            ;"QUEUE" PULSE FOR E.M. COUNTER\r
+       .ENDC                   ;EQ,EMCTRS-3\r
+9$:\r
+100$:\r
+        .REPT OFFSET\r
+        DEX\r
+        .ENDR\r
+       .IF GT,.-DETECT-126.\r
+       BMI 120$\r
+       JMP DETECT\r
+120$:\r
+       .IFF\r
+        BPL DETECT\r
+       .ENDC                   ;GT,.-DETECT-126.\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
+CONVRT: GCM                     ;GET COIN MODE IN ACC 0,1\r
+        TAY                     ;SAVE IT & TEST IT\r
+        BEQ 2$                  ;IF FREE PLAY, KEEP COIN COUNT CLEAR, LEAVE CREDIT\r
+        LSR\r
+        ADC I,0                 ;FORM PRICE (0,1,1,2)\r
+        EOR I,0FF\r
+        SEC                     ;NEGATE\r
+        ADC $CNCT               ;ACC <- COINCT - PRICE\r
+        BCC EXIT                ;BRANCH ON BORROW\r
+        CPY I,2                 ;COIN MODE 2 OR 3?\r
+        BCS 1$                  ;YES, JUST ONE CREDIT\r
+        INC $$CRDT              ;ELSE GIVE TWO FOR MODES 0,1\r
+1$:    INC $$CRDT\r
+2$:     STA $CNCT               ;STORE REDUCED (OR CLEARED) COINCT\r
+        .ENDC\r
+EXIT:\r
+       .IIF NE,CNTINT, INC Z,$INTCT    ;COUNT INTERUPTS WHEN REQUESTED\r
+       .IF EQ,EMCTRS-1*<EMCTRS-3>      ;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                   ;EQ,EMCTRS-1*<EMCTRS-3>\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 EQ,EMCTRS-3         ;IF 3 CTRS\r
+       LDY I,0                 ;START WITH FLAG OF 0\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
+       INY                     ;SET ON FLAG\r
+2$:    STA X,$CCTIM\r
+3$:\r
+       .REPT OFFSET\r
+       DEX\r
+       .ENDR\r
+       BPL 1$\r
+       TYA                     ;CHECK "ON" FLAG\r
+       BNE 99$                 ;SKIP IF ANY ON\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                   ;EQ, 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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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/RTMLCR.XX b/RTMLCR.XX
new file mode 100644 (file)
index 0000000..0a7d848
Binary files /dev/null and b/RTMLCR.XX differ
diff --git a/RTMUL.XX b/RTMUL.XX
new file mode 100644 (file)
index 0000000..fa9370b
Binary files /dev/null and b/RTMUL.XX differ
diff --git a/VECAN.XX b/VECAN.XX
new file mode 100644 (file)
index 0000000..1f7dc63
Binary files /dev/null and b/VECAN.XX differ
diff --git a/VECINC.XX b/VECINC.XX
new file mode 100644 (file)
index 0000000..113acfc
Binary files /dev/null and b/VECINC.XX differ
diff --git a/VECMAC.XX b/VECMAC.XX
new file mode 100644 (file)
index 0000000..14bb08a
Binary files /dev/null and b/VECMAC.XX differ