       NAM GRAPHICS SUBROUTINES
*      HARVEY BROFMAN 6-24-82

*THIS MODULE IS FOR SINGLE SCREEN GRAPHICS SETUPS.

*SETUP FOR GRAPHICS
SETUP  LDX #65472
       CLRA
       STA ,X
       STA 3,X
       STA 5,X
       LDX #65478 SET GP 5.
       STA 1,X BIT 0 SET
       STA 2,X BIT 1 OFF
       STA 5,X BIT 2 SET
       STA 6,X ALL OTHERS OFF
       STA 8,X
       STA 10,X
       STA 12,X
       LDA 65314
       ANDA #7
       ORA #224
       STA 65314
       RTS

*CLEAR SCREEN INDEXED IN X TO
*THE COLOR IN BACG.
CLEAR  LDX #SCRSTA
       LDA BACG
       LDB BACG
A@     STD ,X++
       CMPX #SCRSTA+192*32
       BLE A@
       RTS

       PAGE
*SET A PIXEL ON THE SCREEN
* A IS THE X COORDINATE
* B IS THE Y COORDINATE
* COLOR IS A 4 PIXEL DESCRIPTER
* OF THE DESIRED COLOR
*
*ALTERNATE ENTRY HAS ALL BUT X
*COORDINATES OFFSET IN 'X'. THE
*X OFFSET IS IN 'TEMP'.
SETXY  PSH A,B,X,Y
       STA TEMP
       LDA #32
       MUL
       ADDD #SCRSTA
       TFR D,X
       BSR SETX
       PUL A,B,X,Y,PC

SETX   PSH X,Y
       LDB TEMP
       LSRB
       LSRB
       ABX X=BYTE PIXEL IS IN
       LDB TEMP GET PIXEL OFFSET
       ANDB #3
       LDY #PIXELP
       LDA B,Y
       ANDA ,X
       STA ,X
       LDA B,Y
       COMA
       ANDA COLOR
       ORA ,X
       STA ,X
       PUL X,Y,PC

*PIXEL POSITION TABLE FOR PROPER
*MANAGEMENT OF PIXEL SET/RESET
PIXELP FCB %00111111
       FCB %11001111
       FCB %11110011
       FCB %11111100

       PAGE
*READ PIXEL COLOR AT A,B
*RETURNS PIXEL COLOR IN A
READPX PSH B,X,Y
       LDX #SCRSTA
       STA TEMP
       LDA #32
       MUL
       LEAX D,X
       BSR RDPX
       PUL B,X,Y,PC

RDPX   PSH X,Y
       LDB TEMP
       LSRB
       LSRB
       ABX
       LDB TEMP
       ANDB #3
       LDY #PIXELP
       LDA B,Y
       COMA
       ANDA ,X
B@     CMPA #3
       BLS A@
       LSRA
       BRA B@
A@     PUL X,Y,PC

       PAGE
*DRAW A SHAPE INDEXED IN 'Y' AT
*X,Y (A,B).
SHAPE  PSH A,B,X,Y,U
       LDX #SCRSTA
       STA T1 SAVE X COORDINATE
       LDA #32 COMPUTE Y ADDRESS
       MUL
       LEAX D,X
       LDU #COLORS INDEX COLORS
       LDA ,Y+ GET SHAPE WIDTH
       STA C1 SAVE IN COUNTER
       STA C2
       LDA ,Y+ GET SHAPE LENGTH
       STA C3 STORE IN COUNTER
       LDA T1
       ANDA #3
       LSLA
       LDY A,Y
A@     LDA T1 SET X COORD
       STA TEMP
B@     LDA ,Y+ GET PIXEL COLOR
       LDA A,U NOW ITS VALUE
       STA COLOR STORE TO SET
       LBSR SETX AND SET PIXEL
       INC TEMP X CORD=X CORD+1
       DEC C2 LOOP SHAPE WIDTH
       BNE B@
       LDA C1 RESET X WIDTH
       STA C2 TO LOOP AGAIN
       LEAX -32,X INCRIMENT Y
       DEC C3 LOOP SHAPE LENGTH
       BNE A@
       PUL A,B,X,Y,U,PC

*COLOR VALUES; 4 PIXELS PER BYTE
*ENABLES FAST COLOR CHANGES IN
*SHAPE ROUTINES
COLORS EQU *-48
COLOR2 FCB GR,YL,BL,RD

       PAGE
*MOVE A SHAPE
*
*      X=DIRECTION CODE*256+AMOUNT OF MOVE
*      D=X COORDINATE, Y COORDINATE
*      Y=SHAPE TABLE ADDRESS
*
* DIRECTION CODE IS ONE OF THE FOLLOWING
*      0 TO MOVE SHAPE UP
*      1 TO MOVE SHAPE DOWN
*      2 TO MOVE SHAPE RIGHT
*      3 TO MOVE SHAPE LEFT
*
MOVE   PSH X,Y,D
       EXG D,X
       STD DIRCT SAVE DR & AMT
       CMPA #2 LEFT OR RIGHT?
       BLO A@ NO, MUST BE UP OR DOWN
       CMPB ,Y SEE IF AMT>SH WD
       BLO B@ YES, ERASE SHAPE
       TFR X,D AND RE-DRAW
       JSR ERASE
       LDB DIRCT
       CMPB #2
       BEQ C@
       TFR X,D
       SUBA AMONT
       BRA D@
C@     TFR X,D
       ADDA AMONT
D@     JSR SHAPE
       LBRA Z@ L/R AM>SH WD DONE
B@     CMPA #3 L/R MV<WD
       BNE E@ LEFT FIRST
       LDB 1,Y GET SHAPE L&W
       LDA AMONT WD=WD-AM OF MV
       STD DATA STORE FOR ACESS
       PSH Y
       LDY #DATA ADDRESS TO IT
       TFR X,D
       JSR ERASE ERASE OLD PORTION
       TFR X,D
       ADDA AMONT
       PUL Y
       JSR SHAPE
       LBRA Z@
E@     LDA AMONT
       LDB 1,Y
       STD DATA
       LDA ,Y
       SUBA AMONT WD-AM+X COORD
       STA T0
       TFR X,D
       ADDA T0
       PSH Y
       LDY #DATA
       JSR ERASE
       TFR X,D
       SUBA AMONT
       PUL Y
       JSR SHAPE
       BRA Z@ DONE
A@     CMPB 1,Y IF MV>LN THEN
       BLO F@ ERASE AND REDRAW
       TFR X,D
       JSR ERASE
       LDB DIRCT
       BEQ G@ =0, THEN UP
       TFR X,D ELSE DOWN
       ADDB AMONT
       BRA H@
G@     TFR X,D
       SUBB AMONT
H@     JSR SHAPE
       BRA Z@
F@     LDB DIRCT
       BEQ I@ DOWN FIRST
       TFR X,D
       ADDB AMONT
       JSR SHAPE
       LDA ,Y
       LDB AMONT
       STD DATA
       LDB 1,Y
       SUBB AMONT
       STB T0
       TFR X,D
       SUBB T0
       LDY #DATA
       JSR ERASE
       BRA Z@
I@     TFR X,D
       SUBB AMONT
       JSR SHAPE
       LDA ,Y
       LDB AMONT
       STD DATA
       TFR X,D
       LDY #DATA
       JSR ERASE
Z@     PUL X,Y,D,PC

       PAGE
*ERASE SHAPE AT X,Y (A,B). SHAPE
*IS INDEXED IN 'Y'. THIS ROUTINE
*SETS AREA THAT WAS COVERED BY A
*SHAPE TO THE BACKGROUND COLOR
ERASE  PSH A,B,X,Y
       LDX #SCRSTA
       STA T1
       LDA #32
       MUL
       LEAX D,X
       LDA BACG
       STA COLOR
       LDA ,Y+
       STA C1
       STA C2
       LDA ,Y
       STA C3
A@     LDA T1
       STA TEMP
B@     JSR SETX
       INC TEMP
       DEC C2
       BNE B@
       LDA C1
       STA C2
       LEAX -32,X
       DEC C3
       BNE A@
       PUL A,B,X,Y,PC

       PAGE
*PRINT OUT DECIMAL NUMBER IN
*ADR-ADR PLUS 5.
*CALLING FORMAT:
*
*  A=DIGIT TO ADD
*  B=PLACE VALUE TO ADD TO
*  Y=NUMBER DATA BLOCK
*
* NUMBER DATA BLOCK IS IN FORM:
*
*  BLOCK WIDTH, LENGTH OF NUMBER
*     +2 X,Y COORDINATE OF NUMBER
*     +4 COLOR OF NUMBER
*
DECOUT PSH A,B,X,Y,U
       CLR DELAY
       CLR DELAY+1
       ADDB #4
A@     CMPB #10
       BHS Z@
       ADDA B,Y
       CMPA #10
       BLT C@
       SUBA #10
       STA B,Y
       INCB
       LDA #1
       BRA A@
C@     STA B,Y
Z@     LDA ,Y
       STA SIZEX
       LDA 1,Y
       STA SIZEY
       LDX 2,Y
       LDA 4,Y
       STA FORG
       LDU #NUMBER+6
       CLR ,U
       LEAY 5,Y
       LDB #6
B@     LDA ,Y+
       ADDA #'0
       STA ,-U
       DECB
       BNE B@
       LDY #NUMBER
       JSR WRITE
       PUL A,B,X,Y,U,PC

       PAGE
*WRITE SENTANCE IN 'Y' AT (X).
*SIZEX IS THE WIDTH OF THE CHARS
*SIZEY IS THE LENGTH "  "    "
*DELAY IS THE DELAY TIME BETWEEN
*EACH CHARACTER.
WRITE  PSH A,B,X,Y
A@     LDA ,Y+
       BEQ C@
       CMPA #'@
       BNE B@
       LDA SIZEY
G@     LEAX 9,X
       DECA
       BNE G@
       TFR X,D
       CLRA
       TFR D,X
       BRA A@
B@     BSR PRINT
       LDA SIZEX
D@     LEAX 6*256,X
       DECA
       BNE D@
       PSH Y
       LDY DELAY
       BEQ E@
F@     NOP
       NOP
       LEAY -1,Y
       BNE F@
E@     PUL Y
       BRA A@
C@     CLR DELAY
       CLR DELAY+1
       LDA #1
       STA SIZEX
       STA SIZEY
       PUL A,B,X,Y,PC

       PAGE
*PRINT CHARACTER IN 'A' AT (X).
PRINT  PSH A,B,X,Y
       SUBA #32
       LDB #9
       MUL
       TFR D,Y
       LEAY ALPHA,Y
       LDA #9
       STA C0
       TFR X,D
       STA T0
       STA T1
       LDA #32
       MUL
       LDX #SCRSTA
       LEAX D,X
X@     LDA SIZEY
       STA C1
C@     LDA ,Y
       SUBA #';
       LSLA
       LSLA
       LSLA
       LDB #5
       STB C3
D@     LSLA
       BCC J@
       PSH A
       LDA FORG
       BRA K@
J@     PSH A
       LDA BACG
K@     STA COLOR
       LDA SIZEX
       STA C2
       LDA T0
       STA TEMP
H@     JSR SETX
       INC TEMP
       DEC C2
       BNE H@
       PUL A
E@     LDB SIZEX
I@     INC T0
       DECB
       BNE I@
       DEC C3
       BNE D@
F@     LDA T1
       STA T0
       LEAX 32,X
       DEC C1
       BNE C@
       LEAY 1,Y
       DEC C0
       BNE X@
A@     PUL A,B,X,Y,PC

*HOLD HERE FOR X LOOPS
HOLD   PSH D,X
A@     MUL
       MUL
       MUL
       LEAX -1,X
       BNE A@
       PUL D,X,PC

       PAGE
*DATA AREA AND TABLES FOR ABOVE ROUTINES

ALPHA  FCC ';;;;;;;;;?????;;?;EE;;;;;;;EEZEZEE;;'  !"#
       FCC 'IPOI@PI;;LL=?CLL;;IMMIPMH;;=?;;;;;;;' $%&'
       FCC '?CKKKC?;;?=<<<=?;;;PIZIP;;;;??Z??;;;' ()*+
       FCC ';;;;;??C;;;;Z;;;;;;;;;;??;;<<=?CKK;;' ,-./
       FCC 'ILLLLLI;;W?????Z;;IL<=?CZ;;IL>I>LI;;' 0123
       FCC 'LLLZ<<<;;ZKKY<LI;;ILKYLLI;;Z<<<<<<;;' 4567
       FCC 'ILLILLI;;ILLJ<LI;;;;??;??;;;;??;??C;' 89:;
       FCC '=?CKC?=;;;;Z;Z;;;;C?=<=?C;;IL<A?;?;;' <=>?
       FCC 'IL<XTPY;;?ELZLLL;;YLLYLLY;;ILKKKLI;;' @ABC
       FCC 'YLLLLLY;;ZKKYKKZ;;ZKKYKKK;;ILKNLLI;;' DEFG
       FCC 'LLLZLLL;;Z?????Z;;B====MG;;LMOSOML;;' HIJK
       FCC 'KKKKKKZ;;LVPLLLL;;LTPPPNL;;ILLLLLI;;' LMNO
       FCC 'YLLYKKK;;ILLLPMH;;YLLYWML;;ILKI<LI;;' PQRS
       FCC 'Z??????;;LLLLLLJ;;LLLLLE?;;LLLLPVL;;' TUVW
       FCC 'LLE?ELL;;LLLI???;;Z<=?CKZ;;;;;;;;;;;' XYZ
       FCC ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'
       FCC ';;I<JLJ;;KKYLLLY;;;;ILKLI;;<<JLLLJ;;' abcd
       FCC ';;ILZKJ;;ADCWCCC;;;;ILLJ<<IKKKYLLL;;' efgh
       FCC '=;A===B;;<;<<<<LLIKLMOWML;;A=====B;;' ijkl
       FCC ';;UPPLL;;;;YLLLL;;;;ILLLI;;;;YLLLYKK' mnop
       FCC ';;JLLLJ<<;;QTKKK;;;;JKI<Y;;CCWCCQA;;' qrst
       FCC ';;LLLLJ;;;;LLLE?;;;;LLPPE;;;;LE?EL;;' uvwx
       FCC ';;LLLLJ<I;;Z>?SZ;;'                   yz

T0     RMB 1
T1     RMB 1
T2     RMB 1
T3     RMB 1

C0     RMB 1
C1     RMB 1
C2     RMB 1
C3     RMB 1

TEMP   RMB 2
COLOR  RMB 1
SIZEX  RMB 1
SIZEY  RMB 1
DELAY  RMB 2
BEHIND RMB 2
OLDXY  RMB 1
FORG   RMB 1
BACG   RMB 1
DIRCT  RMB 1
AMONT  RMB 1
DATA   RMB 2

