;HAM Spectrum by Daniel Wolf Ph.D.
;COPYRIGHT 1989 by AMIGA Plus Magazine
;08/14/89
;
;Aztec users: as -CD spectrum.asm  ln spectrum.o
;and change DATA to DSEG down below!

 BRA _START

DEPTH EQU 6
MASK              EQU      (1<<DEPTH)-1
JAM1              EQU      0
BORDERLESS        EQU      $80
SCRN.VIEWPORT     EQU      $2C
WW.SCREEN         EQU      $2E
WW.RPORT          EQU      $32
BACKDROP          EQU      $100
HAM               EQU      $800
NW.SCREEN         EQU      $1E
CUSTOMSCREEN      EQU      $F
ACTIVATE          EQU      $1000
SMART_REFRESH     EQU      $0

LVO.OPENLIBRARY         EQU $FFFFFDD8
LVO.CLOSELIBRARY        EQU $FFFFFE62

LVO.OPENSCREEN          EQU $FFFFFF3A
LVO.CLOSESCREEN         EQU $FFFFFFBE
LVO.OPENWINDOW          EQU $FFFFFF34
LVO.CLOSEWINDOW         EQU $FFFFFFB8
LVO.SETWINDOWTITLES     EQU $FFFFFEEC

LVO.SETDRMD             EQU $FFFFFE9E
LVO.SETAPEN             EQU $FFFFFEAA
LVO.LOADRGB4            EQU $FFFFFF40
LVO.RECTFILL            EQU $FFFFFECE

SYSLIB MACRO            ;MACROS TO CALL LIBRARY ROUTINES VIA ADDRESS REG #6
 MOVE.L 4,A6
 JSR LVO.\1(A6)
 ENDM

INTLIB MACRO
 MOVE.L _INTBASE,A6
 JSR LVO.\1(A6)
 ENDM

GFXLIB MACRO
 MOVE.L _GFXBASE,A6
 JSR LVO.\1(A6)
 ENDM

;*** SYSTEM STARTUP CODE ***

_START
 MOVE.L SP,_STACK               ;SAVE STACK POINTER

OPENLIBS                        ;OPEN ALL THE LIBRARIES WE NEED
 LEA _GFXNAME,A1
 MOVEQ #0,D0
 SYSLIB OPENLIBRARY
 MOVE.L D0,_GFXBASE             ;AND SAVE THEIR JUMP TABLE POINTERS
 BEQ _ERROR

 LEA _INTNAME,A1
 MOVEQ #0,D0
 SYSLIB OPENLIBRARY
 MOVE.L D0,_INTBASE
 BEQ _ERROR

 JSR MAIN                       ;BRANCH TO 'MAIN' LABEL

;*** NOW CLEAN UP AND EXIT TO SYSTEM ***

_ERROR                          ;RETURN HERE TO CLEAN UP AND EXIT
 MOVE.L _GFXBASE,D0             ;CLOSE ANY OPEN LIBRARIES
 BEQ.S 1$
 MOVE.L D0,A1
 SYSLIB CLOSELIBRARY
1$
 MOVE.L _INTBASE,D0
 BEQ.S 2$
 MOVE.L D0,A1
 SYSLIB CLOSELIBRARY
2$
 MOVE.L _STACK,SP               ;RESTORE STACK POINTER
 RTS                            ;EXIT WHERE THIS PROGRAM CAME FROM!


MAIN

SPECTRALSCREEN                  ;OPEN A HAM SCREEN OF 320 X 200
 LEA NEWSCREEN,A0
 INTLIB OPENSCREEN
 MOVE.L D0,SCREEN
 BEQ DONE                       ;NO ERROR, GOT AN ADDRESS BACK

 LEA NEWWINDOW,A0               ;AND SAME SIZE BORDERLESS BACKDROP WINDOW
 MOVE.L D0,NW.SCREEN(A0)
 INTLIB OPENWINDOW
 MOVE.L D0,WINDOW
 BEQ DONE

 MOVE.L D0,A0
 MOVEA.L WW.RPORT(A0),A1
 MOVE.L A1,RP                   ;WINDOW RASTPORT ADDRESS FOR DRAWING
 MOVE.L SCREEN,A0
 LEA SCRN.VIEWPORT(A0),A1
 MOVE.L A1,VP                   ;VIEWPORT ADDRESS FOR COLOR PALETTE CHANGES

 MOVE.L WINDOW,A0
 MOVE.L #SPECTITLE,A2
 MOVE.L #-1,A1
 INTLIB SETWINDOWTITLES         ;EVERY GOOD PROGRAM DESERVES A TITLE

 MOVE.L RP,A1
 MOVE.L #JAM1,D0
 GFXLIB SETDRMD                 ;SIMPLE FOREGROUND GRAPHICS DRAWING MODE

 BSR SETCOLORS

DRAWRECTANGLES                  ;FIRST THE HSTRIPS THEN THE VSTRIPS
 MOVE.W #10,YMIN
 MOVE.W #15,D6
DRAWHSTRIPS
 BSR LONGRECT                   ;DRAW BOTH HORIZONTAL HAM MODIFIED STRIPS
 ADD.W #10,YMIN                 ;TO RIGHT OF EACH VERTICAL STRIP RECTANGLE
 DBRA D6,DRAWHSTRIPS            ;HSTRIPS PURE RED/BLUE UNTIL VSTRIPS ARE DRAWN

 MOVE.W #0,COLOR
 MOVE.W #0,XMIN                 ;FIRST VERTICAL STRIP IS AT X=0
 MOVE.W #10,YMIN                ;START JUST UNDERNEATH THE TITLE BAR
 MOVE.W #15,D6                  ;16 RECTANGLES IN EACH STRIP
 BSR DRAWVSTRIPS

 MOVE.W #0,COLOR
 MOVE.W #$80,XMIN               ;SECOND VERTICAL STRIP IS AT X=128
 MOVE.W #10,YMIN
 MOVE.W #15,D6
 BSR DRAWVSTRIPS                ;RECOLORS WHOLE HSTRIPS FAST - LIKE HAMAGIC!

NOWCYCLE
 MOVE.W #255,D3                 ;SIMPLE COLOR CYCLING ROUTINE
CYCLECOLORS                     ;DOES NOT CYCLE THE 0 COLOR, ONLY 1-15
 LEA PALETTE,A0
 MOVE.W 30(A0),D6               ;KEEP COLOR #15 FOR A MOMENT
 MOVE.W #28,D5                  ;AN OFFSET INTO THE COLOR PALETTE TABLE
 MOVE.W #13,D4                  ;MOVE 14 COLORS AUTOMATICALLY
CYCLE
 MOVE.W 0(A0,D5.W),2(A0,D5.W)   ;MOVE COLOR 14 TO COLOR 15
 SUBQ.W #2,D5                   ;THEN 13 TO 14, 12 TO 13, ETC.
 DBRA D4,CYCLE                  ;DOWN TO CHANGING COLOR 1 TO COLOR 2
 MOVE.W D6,2(A0)                ;NOW MAKE OLD COLOR #15 INTO COLOR #1
 BSR SETCOLORS                  ;PUT THE COLORS INTO THE VIEWPORT
 MOVE.W #$FFFF,D2
TIME                            ;DUMB NON-AMIGA TYPE TIMING LOOP
 ASL.L #1,D1
; ASL.L #1,D1
 DBRA D2,TIME
 DBRA D3,CYCLECOLORS

DONE
 MOVE.L WINDOW,D0
 BEQ.S 1$
 MOVE.L D0,A0
 INTLIB CLOSEWINDOW
1$
 MOVE.L SCREEN,D0
 BEQ.S 2$
 MOVE.L D0,A0
 INTLIB CLOSESCREEN
2$
 RTS

************    ;SUBROUTINES

RECTANGL
 MOVE.L RP,A1
 MOVE.W COLOR,D0
 GFXLIB SETAPEN
 MOVE.L RP,A1
 MOVE.W XMIN,D0
 MOVE.W YMIN,D1
 MOVE.W D0,D2
 MOVE.W D1,D3
 ADD.W #8,D2
 ADD.W #10,D3
 GFXLIB RECTFILL
 RTS

DRAWVSTRIPS
 BSR RECTANGL
 ADD.W #1,COLOR
 ADD.W #10,YMIN
 DBRA D6,DRAWVSTRIPS
 RTS

SETCOLORS                       ;ATTACH A SET OF COLORS TO A VIEWPORT
 MOVE.L VP,A0                   ;ADDRESS OF SCREEN VIEWPORT STRUCTURE
 MOVE.L #PALETTE,A1             ;ADDRESS OF PALETTE TABLE (SEE DATA BELOW)
 MOVE.L #16,D0                  ;NUMBER OF WORDS TO TRANSFER
 GFXLIB LOADRGB4
 RTS

LONGRECT
 MOVE.W #14,D7
 MOVE.W #$11,COLOR
 MOVE.W #$08,XMIN       ;THIS SUBROUTINE HANDLES LEFTHAND GROUP OF
 BSR MAKEAREC           ;HORIZONTAL STRIPS

LONGRECT1
 MOVE.W #$21,COLOR
 MOVE.W #$88,XMIN       ;THIS ONE HANDLES RIGHTHAND GROUP OF
 MOVE.W #14,D7          ;HORIZONTAL STRIPS
MAKEAREC
 MOVE.W COLOR,D0        ;START WITH #$21 OR #$11 AS THE PEN COLOR
 MOVE.L RP,A1           ;2 MODIFIES RED, 1 MODIFIES BLUE, WHILE LOW NIBBLE
 GFXLIB SETAPEN         ;SPECIFIES THE AMOUNT OF RED OR BLUE MODIFICATION
 MOVE.W XMIN,D0
 MOVE.W YMIN,D1
 MOVE.W D0,D2
 ADD.W #8,D2
 MOVE.W D1,D3
 ADD.W #10,D3
 GFXLIB RECTFILL        ;FILL FROM XMIN,YMIN TO XMIN+8,YMIN+10
 ADD.W #8,XMIN          ;MOVE XMIN ALONG 8 PIXELS TO THE RIGHT
 ADD.W #1,COLOR         ;INCREASE THE PEN COLOR # AS WE MOVE TO RIGHT
 DBRA D7,MAKEAREC       ;DO IT AGAIN FOR ALL 15 VALUES OF THE LOW NIBBLE
 RTS

**********************

 DATA   ; comment this line and ...
; DSEG   ; uncomment this line for the Aztec assembler

 CNOP 0,4

_STACK DC.L 0
_GFXBASE DC.L 0
_INTBASE DC.L 0

XMIN DC.W 0
YMIN DC.W 0
COLOR DC.W 0

_GFXNAME DC.B 'graphics.library',0
 EVEN
_INTNAME DC.B 'intuition.library',0
 EVEN

NEWSCREEN
 DC.W 0,0,320,200,DEPTH         ;DEPTH IS 6 FOR 6 BIT PLANES
 DC.B MASK,0
 DC.W HAM                       ;THIS IS THE VIEWMODES ENTRY
 DC.W CUSTOMSCREEN
 DC.L 0,0,0,0

NEWWINDOW                       ;A HANDY WAY TO GET A RASTPORT WITH A
 DC.W 0,0,320,200               ;NEARLY WIDE OPEN SCREEN TO DRAW IN
 DC.B MASK,0
 DC.L 0
 DC.L BACKDROP!BORDERLESS!ACTIVATE!SMART_REFRESH
 DC.L 0,0
 DC.L SPECTITLE
 DC.L 0,0
 DC.W 100,100,320,200
 DC.W CUSTOMSCREEN

SCREEN DC.L 0
WINDOW DC.L 0
VP DC.L 0
RP DC.L 0

PALETTE                         ;ALL GREEN COLOR VALUES
 DC.W $000,$010,$020,$030       ;SET OF 16 12-BIT COLOR PALETTE VALUES
 DC.W $040,$050,$060,$070
 DC.W $080,$090,$0A0,$0B0       ;
 DC.W $0C0,$0D0,$0E0,$0F0

SPECTITLE
 DC.B 'HAM Spectrum by Daniel Wolf',0
 EVEN
