; Below is the beginning of the source code for Solaris.  Thanks to
; Glenn Saunders for sending me a printout of the original code.
; I used Distella to disassemble the ROM image of the game, then
; manually added all of the variable names, formatting and
; comments from the original author.  The goal was to make the
; listing as authentic as possible while keeping it compilable.  
; The full listing is compilable with Dasm 2.12 and will create a
; binary file identical to the real Solaris ROM image. This listing
; is provided solely for educational purposes to try and learn more
; about how to program the Atari 2600.  If you do not own an
; original Atari 2600 Solaris cartridge, you are not permitted to
; download the source code.  You can purchase an original
; cartridge for 80 cents at http://www.oshealtd.com/.

      processor 6502
      seg.u stella

;LIST ON
;PW 80
;PL 253
;SYNTAX 6502
;CODE
;RADIX 10
;ABSOLUTE
;  VERSION 19.4 DATE 22-FEB-86
;
;TITLE   UNIVERSE   COPYRIGHT 1986, DOUGLAS NEUBAUER
;
;
;  ********************************
; COPYRIGHT (C) 1986, DOUGLAS NEUBAUER
; THIS SOURCE LISTING IS COPYRIGHTED.
; NO RIGHT TO REPRODUCE THIS LISTING
; IS GRANTED UNLESS BY WRITTEN AGREEMENT
; OR WRITTEN PERMISSION BY DOUGLAS NEUBAUER
;  ********************************
;
; FILE NAME UNIV.ASM,UNIV.OBJ
;
; BEGINS 07-JAN-83
; SCREEN 11-MAR-83
; ENDS ????????
;
;  ********************************
;    BURN = 1 THEN BURN PROMS, BURN = 0 THEN ASSEMBLE FOR DEVELOPMENT SYSTEM
BURN EQU 1
;  ********************************
;
;      BANK2         BANK4
; 0   FIGHTER       PLN FIG
; 8   PIRATE        PLN PIR
; 10  WARP GRA.     MISC GRAPH
; 14  DARTER        ----
; 18  HYPERJUMPER   MAN + KEY
; 20  P KILLER      LANDING ZONE
; 28  BLOCKADER     TRN TOWER
; 30  ENEMY PHOTON  ENE PHOTON
; 38  EXPLOSIONS    EXPLOS
; 40  SATURN RINGS  CRATER
; 48-53  MOON1
; 54-5F  MOON2
; E0  PBLK   (60+80)
;
;
;  *** ZERO PAGE RAM ***
;
;   BEGIN DATA SECTION
;DATA
;
      ORG $80
MAZRAM DS 8
CURSOR DS 1
JMPCNT DS 1
MAZSTA DS 1 ;MUST BE RIGHT AFTER JMPCNT (FOR FINDV)
RANDOM DS 2
PROGST DS 1
HCOLP1 DS 2
JMPTIM DS 1
NOCLER
             ; DONT CLEAR PREVIOUS RAM ON WARM START
NEWLEV DS 1  ;NO CLEAR ON GAME SEL.
PNTR1  DS 2
PNTR2  DS 2
PNTR3  DS 2
PNTR4  DS 2
PNTR5  DS 2
PNTR6  DS 2
ATRACT DS 2  ;2 BYTE FRAME TIMER
ONESHT DS 1
;
HGRAP1 DS 3  ; PLAYER TYPE
       DS 1
HGRAP0 DS 4
IQREAP DS 1  ;ALSO HWARF TARGET NUM.
;
HHORP1 DS 3  ; PLAYER X
       DS 1
HHORP0 DS 4
PLINES DS 1
;
HVERP1 DS 3  ; PLAYER Y
       DS 1
HVERP0 DS 4
VWALL  DS 1
;
ZPOSP1 DS 2  ; PHOTON Z
       DS 1
ZPOSP0 DS 4
       DS 1  ;IQPATH-1
IQPATH DS 4
;
;  TEMPORARY STUFF  *********
STARS  DS 2  ;STAR PNTR
REQUST DS 1
BOTSCN DS 1
HHORM2 DS 1  ; STAR HPOS
NEWATT DS 1
PAUTIM DS 1
CENTER DS 1  ; HORIZ ZOOM BYTE
IQPNTR DS 1  ;IQ RAM
IQSTAK DS 1
IQWARP DS 1
SHIPST DS 1
HOLDM2 DS 1
HOLDM0 DS 1
;  END TEMP ******************
;
GAMTIM DS 1
LSTCUR DS 1
GAMEST DS 1
LIVES  DS 1
TARNUM DS 1
FUEL   DS 1
SCORE  DS 3
CH0PTR DS 1
CH1PTR DS 1
CH0SHD DS 1
CH1SHD DS 1
 ORG $E3
; BEGIN CHART BLOCK
EXPNTR DS 1  ; ALSO USED AS CHART TIMER
CHTBLK
VECTP1 DS 2
PNTRP1 DS 1
       DS 1
XDELP0 DS 4
       DS 1
YDELP0 DS 4
       DS 1
ZDELP0 DS 4  ; SPEED OF OBJS.
VELOC  DS 1  ; FOR HORIZ SHIP
HPOSL  DS 1  ; FOR HORIZ SHIP
HHITP0 DS 4  ; USES STAK1 TOO ,ALSO USED FOR STACK IN BRAIN, 4LEV DEEP
; END CHART BLOCK
; FOLLOWING VARIABLES RESIDE IN STACK
STAK1  DS 1
STAK2  DS 1
STAK3  DS 1
STAK4  DS 1
;
;
;  END DATA SECTION
;; CODE
;
;
;  VCS EQUATES
VSYNC  EQU 0
VBLANK EQU 1
WSYNC  EQU 2
SIZPM0 EQU 4
SIZPM1 EQU 5
COLPM0 EQU 6
COLPM1 EQU 7
COLPF  EQU 8
COLBK  EQU 9
PRIOR  EQU $A
REFP0  EQU $B
REFP1  EQU $C
GRFPF0 EQU $D
GRFPF1 EQU $E
GRFPF2 EQU $F
HPOSP0 EQU $10
HPOSP1 EQU $11
HPOSM0 EQU $12
HPOSM1 EQU $13
HPOSM2 EQU $14
AUDC0  EQU $15
AUDC1  EQU $16
AUDF0  EQU $17
AUDF1  EQU $18
AUDV0  EQU $19
AUDV1  EQU $1A
GRAFP0 EQU $1B
GRAFP1 EQU $1C
GRAFM0 EQU $1D
GRAFM1 EQU $1E
GRAFM2 EQU $1F
HDELP0 EQU $20
HDELP1 EQU $21
HDELM0 EQU $22
HDELM1 EQU $23
HDELM2 EQU $24
VDELP0 EQU $25
VDELP1 EQU $26
VDELM2 EQU $27
GCTLM0 EQU $28
GCTLM1 EQU $29
ADDEL  EQU $2A
CLRDEL EQU $2B
HITCLR EQU $2C
M0PL   EQU $30
M1PL   EQU $31
P0PF   EQU $32
P1PF   EQU $33
M0PF   EQU $34
M1PF   EQU $35
M2PF   EQU $36
MIPL   EQU $37
POT0   EQU $38
POT1   EQU $39
POT2   EQU $3A
POT3   EQU $3B
TRIG0  EQU $3C
TRIG1  EQU $3D
PORTA  EQU $280
RACTL  EQU $281
PORTB  EQU $282
PBCTL  EQU $283
RTIMER EQU $284
RFLAG  EQU $285
STIME1 EQU $294
STIME8 EQU $295
STIM64 EQU $296
ST1024 EQU $297
FTIME1 EQU $29C
FTIME8 EQU $29D
FTIM64 EQU $29E
FT1024 EQU $29F
;
;
;  BANK SELECT EQUATES

 IFCONST BURN
BANK1 EQU $F000
BANK2 EQU $F000
BANK3 EQU $F000
BANK4 EQU $F000
 ELSE
BANK1 EQU $C000
BANK2 EQU $D000
BANK3 EQU $E000
BANK4 EQU $F000
 ENDIF
STROB1 EQU $FFF6
STROB2 EQU $FFF8
STROB3 EQU $FFF7
STROB4 EQU $FFF9
;
;
;  GAME EQUATES
NUMCOL EQU 3+4
K      EQU 8   ; CHTRAM POS. OF HOME PLANET
U      EQU 1
TOPSCN EQU $99
SCNSIZ EQU TOPSCN+39
MTNTOP EQU $62
TRNTOP EQU $62
VSHIP  EQU $1D
ZVIS   EQU $78
PBLK   EQU $60+$80  ; BLANK P0
POFF   EQU $A8   ;NEW P0
SCLR   EQU $F2  ;STAR COLOR
VCENT  EQU $53 ;VERT ZOOM CENTR OF SCRN
SKYCOL EQU $70
SURCOL EQU $62
TRNCOL EQU $84
; Z= USED IN BANK2
; EQUATE Q= BRNTB1
; EQUATE W= TYPTAB
; EQUATE J= AUDTAB
; BOTTOM OF SCREEN = 0
;
; VBLANK EQUATES
;
TEMP4    EQU PNTR5+0
TEMP5    EQU PNTR2+1
TEMP6    EQU PNTR1+0
TEMP7    EQU PNTR1+1
TEMP9    EQU PNTR4+0
TEMP10   EQU PNTR4+1
JOYRMH   EQU PNTR6+0
JOYRMV   EQU PNTR6+1
TEMP11   EQU PNTR2+0
TEMP12   EQU PNTR3+0
TEMP13   EQU PNTR3+1
THGRP1   EQU PNTR5+1  ;SHIP GRAPHIC 0,1,2
NEWAVE   EQU STARS+1
;
;
;  SCREEN EQUATES
VECTP0 EQU PNTR1
HOLDP1 EQU PNTR2+0
CROSP1 EQU PNTR2+1
VERTP0 EQU PNTR3+0
VERTP1 EQU PNTR3+1
MISC1  EQU PNTR4
MOON2  EQU PNTR5
MOON1  EQU PNTR6
MOON3  EQU STAK1  ;AND STAK2
MISC2  EQU STAK3  ;AND STAK4
;
;
;
; .BEGIN PROGRAM
;
; LIST OFF
; INCLUDE B:BANK2.ASM
;
;
; LIST OFF
; INCLUDE B:BANK3.ASM
;
;
; LIST OFF
; INCLUDE B:BANK4.ASM
;
;
; LIST OFF
; INCLUDE B:BANK1.ASM
;
;
; LIST OFF
 IFNCONST BURN
;  JUMP VECTORS FOR UNIV.ASM DURNING DEVELOPMENT
; BK3
 ORG BANK3+$FCC
 JMP BANK2+$FCF
 JMP BANK1+$FD2
 JMP BANK4+$FD5
 ORG BANK3+$FEA
 JMP BANK2+$FED
 JMP BANK4+$FF0
; BK1
 ORG BANK1+$FCF
 JMP BANK4+$FD2
 ORG BANK1+$FD5
 JMP BANK3+$FD8
 ORG BANK1+$FDE
 JMP BANK2+$FE1
 ORG BANK1+$FF0
 JMP BANK3+$FF3
; BK4
 ORG BANK4+$FD2
 JMP BANK3+$FD5
 ORG BANK4+$FD8
 JMP BANK1+$FDB
 ORG BANK4+$FE4
 JMP BANK3+$FE7
 ORG BANK4+$FEA
 JMP BANK1+$FED
 JMP BANK3+$FF0
; BK2
 ORG BANK2+$FCC
 JMP BANK1+$FCF
 ORG BANK2+$FD5
 JMP BANK3+$FD8
 ORG BANK2+$FDE
 JMP BANK4+$FE1
 ORG BANK2+$FE4
 JMP BANK4+$FE7
;   DEFINE PC (FOR DEVELOPMENT SYSTEM)
 ORG $9C04
 DW INIT
;   FOR HALT DURING VBLANK
 ORG HACKCLI
 CLI
 ORG HACKSEI
 SEI
 ENDIF

;.END

; bank 1
       seg bank1
       ORG $0000
       rorg $f000
DIVTB1 
       .byte $08,$03,$02,$01,$01,$01,$00,$00
       .byte $00,$00,$00,$00,$00,$00,$00,$00
       .byte $0C,$08,$05,$13,$13,$12,$12,$22
       .byte $22,$31,$41,$51,$61,$71,$80,$F0
       .byte $0E,$09,$18,$16,$14,$24,$23,$33
       .byte $32,$42,$62,$72,$82,$91,$91,$F1
       .byte $0F,$0B,$19,$18,$26,$25,$34,$34
       .byte $43,$63,$73,$82,$92,$92,$A2,$F2
       .byte $0F,$1C,$19,$28,$38,$37,$46,$45
       .byte $54,$74,$83,$93,$A3,$A3,$B2,$F2
       .byte $0F,$1D,$1B,$29,$38,$48,$47,$56
       .byte $65,$85,$94,$A4,$B4,$B3,$C3,$F3
       .byte $0F,$1E,$2B,$3A,$39,$48,$58,$67
       .byte $76,$95,$95,$A4,$B4,$C4,$D3,$F3
       .byte $0F,$1F,$2C,$3A,$49,$59,$68,$78
       .byte $87,$96,$A6,$B5,$C5,$D4,$E4,$F4
ZOOMTB 
       .byte $0F,$7F,$5D,$4B,$3A,$29,$29,$28
       .byte $28,$17,$17,$16,$15,$15,$15,$04
       .byte $1F,$0F,$1E,$0B,$9A,$89,$99,$89
       .byte $08,$18,$07,$07,$06,$16,$05,$05
       .byte $8F,$8F,$9C,$8C,$0B,$0A,$09,$09
       .byte $08,$18,$08,$07,$07,$06,$06,$05
       .byte $0F,$0F,$1F,$0C,$0B,$0A,$0A,$09
       .byte $89,$88,$88,$88,$07,$07,$06,$06
       .byte $9F,$8F,$8F,$8D,$0C,$0B,$0A,$09
       .byte $89,$89,$88,$88,$08,$07,$07,$06
       .byte $0F,$0F,$0F,$0E,$8C,$8B,$8A,$9A
       .byte $09,$09,$09,$08,$08,$08,$07,$07
       .byte $0F,$0F,$0F,$0E,$0C,$0B,$0A,$0A
GRATB7 
       .byte $09,$09,$89,$08,$88,$08,$08,$07
       .byte $8F,$8F,$0F,$0F,$8D,$0C,$8B,$8A
       .byte $0A,$89,$89,$89,$88,$88,$88,$88
;
;
;
;   SUBROUTINES FOR BANK 1
NEWOB1
;  SUB.
       STY    IQSTAK
NEWOB2
; GTO
       STA    IQPNTR 
;
NEWOBJ
       LDY    IQPNTR 
       LDA    TYPTAB,Y
       BMI    NEWOB3
       STA    PNTR3 
       LDA    #>NEWOB1
       STA    PNTR3+1 
       CLC
       LDA    TYPTAB+1,Y
       JMP.ind (PNTR3)
NEWB55
;  EMP
       CMP    HGRAP0+3
       JMP    NEWB62
NEWB78
;  RNW
       CMP    RANDOM 
NEWB62
       LDA    TYPTAB+2,Y
       BCC    NEWB61
       BCS    NEWOB2  ;JMP
NEWB50
;  LVS
       ADC    NEWAVE 
       TAX
       LDA    NEWT11,X
       STA    IQREAP 
       JMP    NEWOB7
NEWB51
;  BRN
       DEC    IQREAP 
       BPL    NEWOB2
       BMI    NEWOB7  ;JMP
NEWOB5
;  RET
       LDY    IQSTAK 
       LDA    #$00 
       STA    IQSTAK 
       BEQ    NEWOB7  ;JMP
NEWB81
;  INL
       LDA    LIVES 
       CMP    #$05 
       BCS    NEWOB8
       INC    LIVES 
       BCC    NEWOB8  ;JMP
NEWB41
;  STO
       TAX
       LDA    #$00 
       BEQ    NEWB60  ;JMP
NEWOB4
;  ENB
       TAX
       LDA    0,X
NEWB60
       ORA    TYPTAB+2,Y
NEWB54
       STA    0,X
NEWB61
       INY
NEWOB7
       INY
NEWOB8
       INY
       STY    IQPNTR 
NEWB58
       RTS
NEWB40
;  RND
       LDA    RANDOM 
       AND    #$03 
       ADC    TYPTAB+1,Y
       TAY
       LDA    NEWTB7-$E0,Y
;  FALL THRU TO NEWOB3
;    EQUATES ****
SUB EQU <NEWOB1
GTO EQU <NEWOB2
ENB EQU <NEWOB4
STO EQU <NEWB41
RET EQU <NEWOB5
RNW EQU <NEWB78
LVS EQU <NEWB50
RND EQU <NEWB40
BRN EQU <NEWB51
EMP EQU <NEWB55
INL EQU <NEWB81
;
;
NEWOB3
;  BEGIN LOAD
       CMP    #$E0
       BCS    NEWOB8  ;2ND BYTE OF RND
       CMP    #$A8    ;?
       BCS    NEWB94
       LDY    IQWARP 
       CPY    #$F1 
       BCS    NEWB94
       LDA    #$CB    ;TOO FAST
NEWB94
       STA    TEMP10 
       LDY    #$05 
       STY    TEMP4 
NEWB18
       LDA.wy HGRAP0-2,Y
       ASL
       BPL    NEWB19
       DEC    TEMP4 
NEWB19
       DEY
       BNE    NEWB18
       BIT    PROGST 
       BVC    NEWB13
;  PLANET/TRENCH
       LDX    #$03 
       LDA    TEMP10 
       AND    #$04 
       BEQ    NEWB52
       INX    ;LZ OR MAN
NEWB52
       LDA    TEMP10 
       AND    #$03 
       CMP    TEMP4 
       BCS    NEWB48
       LDA    #$CB 
       STA    TEMP10    ;CRATER DEFAULT
NEWB48
       LDA    HGRAP0-1,X
       CMP    #PBLK
       BNE    NEWB58 ;ABORT
       LDA    HVERP0-2,X
       CMP    #$4E 
       BCS    NEWB58 ;ABORT
       LDA    TEMP10 
       AND    #$7C 
       CMP    #$40 
       BCC    NEWB93
       LDA    PROGST 
       SBC    #$08   ;C=1
       AND    #$68   ;40=PLN, 28=TRN
NEWB93 
       STA    HGRAP0-1,X
       LDA    #$56 

       STA    HVERP0-1,X
       CPX    #$04 
       BEQ    NEWB53 ;LZ OR MAN
       LDY    #$04 
NEWB11
       JMP    NEWB10
NEWB53
       LDA    #AUDMAN-J
       STA    CH1SHD 
       LDY    NEWAVE 
       BEQ    NEWB11  ; EASY JUMP
       JMP    NEWB29