From RoadsideThoughts ...
A Bit of Vectrex History
 
Introduction
Programmer's
Guide
 
The RUM
 
Mine Storm
Fortress of
Narzod
 
Dark Tower
   
Sitemap
     
 

Vectrex 6809 Source Code

Fortress of Narzod




Index of Narzod Files

The top most file for the Fortress of Narzod:

NARZOD.ASM

The associated files:

CITDEL.NAR GBULET.NAR MAIN.NAR TAIL.NAR
COLLIDE.NAR GGUARD.NAR PACKS.NAR TIMERS.NAR
GAME.NAR GSPIKE.NAR PRSPCT.NAR WALLS.NAR
GBIRD.NAR INIT.NAR SOUND.NAR  
GBLAST.NAR KILLER.NAR SUBR.NAR  

SUBR.NAR - Rev. B


;
;
         IF      L.SUBR = OFF     ;-------------------------------------------
         LIST    -L               ;--  SUBR  ---------------------------------
         ENDIF                    ;-------------------------------------------
;
;
;
;
;  ***********************************************
;  ***********************************************
;  ***                                         ***
;  ***          S U B R O U T I N E S          ***
;  ***                                         ***
;  ***********************************************
;  ***********************************************
;
;
;  CLEAR GAME RELATED TABLES
;  =========================
;
         SETDP   $C8
;        =====   ===
;
CLRGAM   LDX     #BLTTBL          ;  CLEAR GAME TABLES
         LDD     #$0000           ;  .
CGAM1    STD     X++              ;  .
         CMPX    #ENDBRD          ;  .
         BLE     CGAM1            ;  .
;
         LDA     #$0F             ;  SET BLASTER INHIBIT TIMER
         STA     BLSTMR           ;  .
;
         LDD     #$9000           ;  RESET BLASTER POSITION
         STD     BLSTY            ;  .
         STD     BLSTYX           ;  .
         LDD     #$0000           ;  .
         STD     BLSTX            ;  .
;
FSTCLR   CLR     TMR1             ;  RESET PROGRAMMABLE TIMERS
         CLR     TMR2             ;  .
;
;==========================================================================JJH
         CLR     ABORT            ;  CODE ADDED - REV. B CHANGES     ======JJH
         CLR     LOCK             ;  .                               ======JJH
;==========================================================================JJH
;
         CLR     CBLT             ;  CLEAR BULLET COUNTER
         CLR     CGRD             ;  CLEAR GUARDIAN COUNTER
         CLR     CSPK             ;  CLEAR SPIKER COUNTER
         CLR     CBRD             ;  CLEAR WAR-BIRD COUNTER
;
         CLR     SHOOT            ;  CLEAR SOUND EFFECT FLAGS
         CLR     OUCH             ;  .
         CLR     SQUAWK           ;  .
         CLR     SIZZLE           ;  .
         CLR     EXPLO1           ;  .
         CLR     EXPLO2           ;  .
         CLR     XACON            ;  .
         JSR     INTREQ           ;  .
;
         CLR     EKLTMR           ;  CLEAR KILLER EXPLOSION TIMER
;
         LDA     #$7F             ;  SET LEVEL DISPLAY TIMER
         STA     LVLTMR           ;  .
;
         STA     LCKTMR           ;  SET LOCK-UP BUTTON INHIBIT TIMER
;
         RTS                      ;  RETURN TO CALLER
;
;
;
;
;  CALCULATE TABLE POINTER FOR ACTIVE PLAYER
;  =========================================
;
ACTPTR   LDY     #PTABLE
         LDA     ACTPLY
         LDY     A,Y
         RTS
;
;
;
;
;  HANDLE LOCK-UP LOGIC
;  ====================
;
LOCKUP   JSR     INTREQ           ;  RESET SOUND EFFECTS
         CLR     SIZZLE           ;  .
         CLR     EXPLO1           ;  .
         CLR     EXPLO2           ;  .
         CLR     XACON            ;  .
;
         PSHS    DP               ;  DISPLAY BOTH PLAYERS SCORE
         LDA     #$D0             ;  .    SET 'DP' TO I/O
         TFR     A,DP             ;  .    .
         SETDP   $D0              ;  .    .
;
         JSR     SCRBTH           ;  .    DISPLAY SCORES
         LDU     #MEND            ;  .    DISPLAY 'END-OF-GAME' MESSAGE
         JSR     SMESS            ;  .    .
;
         PULS    DP               ;  SET 'DP' TO RAM
         SETDP   $C8              ;  .
;
         LDX     #SCOR1           ;  IS PLAYER #1 SCORE HIGHEST ?
         LDU     #HISCOR          ;  .
         JSR     HISCR            ;  .
;
         LDX     #SCOR2           ;  IS PLAYER #2 SCORE HIGHEST ?
         LDU     #HISCOR          ;  .
         JSR     HISCR            ;  .
;
         LDX     TIMOUT           ;  SEQUENCE TIME-OUT ?
         LEAX    -1,X             ;  .
         STX     TIMOUT           ;  .
         BEQ     LCKENT           ;  .
;
         LDA     LCKTMR           ;  DECREMENT LOCK-OUT TIMER
         BEQ     LOCK1            ;  .
         DEC     LCKTMR           ;  .
         BRA     LOCK2            ;  .
;
LOCK1    LDA     TRIGGR           ;  PLAYER ABORTED LOCK-UP SEQUENCE ?
         BNE     LCKGAM           ;  .
;
LOCK2    RTS                      ;  RETURN TO CALLER
;
;
LCKENT   PULS    D                ;  RESTART VECTREX
         JMP     ENTRY            ;  .
;
;
LCKGAM   PULS    D                ;  RESTART THIS GAME - SAME OPTIONS
         JMP     GAME2            ;  .
;
;
;
;
;  CHECK FOR PLAYER ACTIVITY
;  =========================
;
         SETDP   $C8
;        =====   ===
;
BTNACT   LDA     TRIGGR           ;  HAS ANY BUTTON BEEN PUSHED ?
         BNE     ACTV1            ;  .
;
         LDX     BTNTMR           ;  NO PLAYER ACTIVITY THIS FRAME
         LEAX    -1,X             ;  .    DECREMENT BUTTON TIMER
         STX     BTNTMR           ;  .    .
         BEQ     ACTENT           ;  .    .    BUTTON TIMER TIME-OUT ?
         RTS                      ;  .    RETURN TO CALLER
;
;
ACTV1    LDX     #$8000           ;  SOMEBODY HIT A KEY
         STX     BTNTMR           ;  .
         RTS                      ;  .    RETURN TO CALLER
;
;
ACTENT   PULS    D                ;  NOBODY IS PLAYING - RESTART VECTREX
         JMP     ENTRY            ;  .
;
;
;
;
;  RECORD SCORE CHANGE
;  ===================
;
;        ENTRY VALUES
;        ------------
;           D  = BCD FORMAT SCORE
;
         SETDP   $C8
;        =====   ===
;
SCORED   PSHS    D,X              ;  SAVE ENTRY VALUES
;
         LDX     #SCRPTR          ;  FETCH ACTIVE PLAYER SCORE
         LDA     ACTPLY           ;  .
         LDX     A,X              ;  .
;
;==========================================================================JJH
;        LDD     0,S              ;  CODE DELETED - REV. B CHANGES   ======JJH
;==========================================================================JJH
;
;==========================================================================JJH
         LDD     ,S               ;  CODE ADDED - REV. B CHANGES     ======JJH
;==========================================================================JJH
;
         JSR     SCRADD           ;  .
;
         PULS    D,X,PC           ;  RETURN TO CALLER
;
;
;
;
;  CALCULATE DISPLACEMENTS FOR INDICATED OBJECT
;  ============================================
;
;        ENTRY VALUES
;        ------------
;           A  = SPEED OF OBJECT
;           U  = OBJECT TABLE POINTER
;                   + 1/2  = 'Y' AXIS DISPLACEMENT
;                   + 3/4  = 'X' AXIS DISPLACEMENT
;                   + 11   = ANGLE OF MOTION
;
         SETDP   $C8
;        =====   ===
;
CALDSP   PSHS    X,Y              ;  SAVE ENTRY VALUES
;
         LDB     11,U             ;  FETCH OBJECT ANGLE OF MOTION
         JSR     MLTY16           ;  CALCULATE NEW DISPLACEMENTS
         STY     1,U              ;  .    'Y' DISPLACEMENT
         STX     3,U              ;  .    'X' DISPLACEMENT
;
         PULS    X,Y,PC           ;  RETURN TO CALLER
;
;
;
;
;  UPDATE OBJECT POSITION
;  ======================
;
;        ENTRY VALUES
;        ------------
;           U  = OBJECT TABLE POINTER
;                   + 1/2  = 'Y' AXIS DISPLACEMENT
;                   + 3/4  = 'X' AXIS DISPLACEMENT
;                   + 5/6  = 'Y' AXIS POSITION
;                   + 7/8  = 'X' AXIS POSITION
;                   + 9/10 = 'YX' POSITION
;
;        RETURN VALUES
;        -------------
;           C  = SET IF 'Y' AXIS OVER-FLOW
;           V  = SET IF 'X' AXIS OVER-FLOW
;
;           LASTY  = 'Y' POSITION LAST FRAME
;           LASTX  = 'X' POSITION LAST FRAME
;           NEXTY  = 'Y' POSITION NEXT FRAME
;           NEXTX  = 'X' POSITION NEXT FRAME
;
         SETDP   $C8
;        =====   ===
;
MOVOBJ   LDD     5,U              ;  UPDATE 'Y' AXIS POSITION
         STD     LASTY            ;  .    SAVE LAST 'Y'
         ADDD    1,U              ;  .    CALCULATE CURRENT 'Y'
         PSHS    A                ;  .    .    SAVE 'V' FOR 'Y' AXIS
         TFR     CC,A             ;  .    .    .    PLACE 'V' STATUS IN 'C'
         ANDA    #$02             ;  .    .    .    .
         LSRA                     ;  .    .    .    .
         STA     -1,S             ;  .    .    .    .
         PULS    A                ;  .    .    .
         STD     5,U              ;  .    .
         STA     9,U              ;  .    .    SAVE 'YX' POSITION
         ADDD    1,U              ;  .    CALCULATE NEXT 'Y'
         STD     NEXTY            ;  .    .
;
         LDD     7,U              ;  UPDATE 'X' AXIS POSITION
         STD     LASTX            ;  .    SAVE LAST 'X'
         ADDD    3,U              ;  .    CALCULATE CURRENT 'X'
         PSHS    A                ;  .    .    SAVE 'V' FOR 'X' AXIS
         TFR     CC,A             ;  .    .    .
         ANDA    #$F2             ;  .    .    .
         ORA     -1,S             ;  .    .    .
         STA     -1,S             ;  .    .    .
         PULS    A                ;  .    .    .
         STD     7,U              ;  .    .
         STA     10,U             ;  .    .    SAVE 'YX' POSITION
         ADDD    3,U              ;  .    CALCULATE NEXT 'X'
         STD     NEXTX            ;  .    .
;
         LDA     -2,S             ;  RECALL STATUS
         TFR     A,CC             ;  .    .    .
;
         RTS                      ;  RETURN TO CALLER
;
;
;
;
;  MOVE EXPLOSION FRAGMENTS
;  ========================
;
;        ENTRY VALUES
;        ------------
;           A  = ROTATIONAL VALUE
;           X  = SOURCE 'DUFFY' POINTER
;           Y  = EXPLOSION TABLE POINTER
;           U  = DESTINATION 'DUFFY' POINTER
;
         SETDP   $C8
;        =====   ===
;
MOVEXP   PSHS    X,Y,U            ;  SAVE ENTRY VALUES
;
         ADDA    EKLROT,Y         ;  ROTATE FRAGMENT
         STA     EKLROT,Y         ;  .    CALCULATE NEW ROTATION VALUE
         LDB     X+               ;  .    FETCH VECTOR COUNT
         STB     U+               ;  .    .
         JSR     DROT             ;  .    ROTATE DUFFY
;
         LDU     2,S              ;  MOVE FRAGMENT
         LEAU    -1,U             ;  .
         BSR     MOVOBJ           ;  .
;
         PULS    X,Y,U,PC         ;  RETURN TO CALLER
;
;
;
;
;  CALCULATE DISPLACEMENTS FOR EXPLOSION OBJECT
;  ============================================
;
;        ENTRY VALUES
;        ------------
;           A  = SPEED OF OBJECT
;           X  = POINTER TO 32-BIT INITIAL EXPLOSION POSITION
;           U  = OBJECT TABLE POINTER
;                   + 0/1  = 'Y' AXIS DISPLACEMENT
;                   + 2/3  = 'X' AXIS DISPLACEMENT
;                   + 4/5  = CURRENT 'Y' POSITION
;                   + 6/7  = CURRENT 'X' POSITION
;                   + 8/9  = CURRENT 'YX' POSITION
;                   + 10   = ROTATION COUNTERS
;
         SETDP   $C8
;        =====   ===
;
EXPDSP   PSHS    X,Y              ;  SAVE ENTRY VALUES
;
         JSR     SWING            ;  FETCH OBJECT ANGLE OF MOTION
         JSR     MLTY16           ;  CALCULATE NEW DISPLACEMENTS
         STY     0,U              ;  .    'Y' DISPLACEMENT
         STX     2,U              ;  .    'X' DISPLACEMENT
;
         PULS    X,Y              ;  RECOVER POINTERS
;
         LDD     0,X              ;  SET INITIAL 'Y' POSITION
         STD     4,U              ;  .
         STA     8,U              ;  .    SET 'YX' POSITION
;
         LDD     2,X              ;  SET INITIAL 'X' POSITION
         STD     6,U              ;  .
         STA     9,U              ;  .    SET 'YX' POSITION
;
         CLR     10,U             ;  CLEAR ROTATION COUNTER
;
         RTS                      ;  RETURN TO CALLER
;
;
;
;
;  CLEAR INDICATED BULLET ENTRY
;  ============================
;
;        ENTRY VALUES
;        ------------
;           U  = BULLET TABLE POINTER
;
         SETDP   $C8
;        =====   ===
;
CLRBLT   CLR     BLTFLG,U         ;  CLEAR BULLET ENTRY
         DEC     CBLT             ;  DECREMENT ACTIVE BULLET COUNTER
         CLR     BLSTMR           ;  RESET BLASTER INHIBIT
         RTS                      ;  RETURN TO CALLER
;
;
;
;
;  INITIALIZE ROADWAY LIMITS
;  =========================
;
         SETDP   $C8
;        =====   ===
;
INTROD   LDA     LFLAG            ;  INITIALIZE WHICH ROADWAY ?
         CMPA    #$03             ;  .    KILLER SEQUENCE ?
         BEQ     INTRD2           ;  .    .
         CMPA    #$01             ;  .    MIDDLE ROADWAY ?
         BEQ     INTRD1           ;  .    .
;
         LDU     #LR.LIM          ;  SET-UP LOWER OR UPPER ROADWAY LIMITS
         LDX     #CR.LIM          ;  .    ROADWAY LIMITS
         LDA     #64              ;  .    .
         JSR     BLKMOV           ;  .    .
         LDU     #HR.LIM          ;  .    HIDDEN ROADWAY LIMITS
         LDX     #CHRLIM          ;  .    .
         LDA     #64              ;  .    .
         JSR     BLKMOV           ;  .    .
         RTS                      ;  .    RETURN TO CALLER
;
;
INTRD1   LDU     #LR.LIM          ;  SET-UP MIDDLE ROADWAY LIMITS
         LDX     #CL.LIM          ;  .    ROADWAY LIMITS
         LDB     #32              ;  .    .
         BSR     NEGMOV           ;  .    .
         LDU     #LL.LIM          ;  .    .
         LDX     #CR.LIM          ;  .    .
         LDB     #32              ;  .    .
         BSR     NEGMOV           ;  .    .
:
         LDU     #HR.LIM          ;  .    HIDDEN ROADWAY LIMITS
         LDX     #CHLLIM          ;  .    .
         LDB     #32              ;  .    .
         BSR     NEGMOV           ;  .    .
         LDU     #HL.LIM          ;  .    .
         LDX     #CHRLIM          ;  .    .
         LDB     #32              ;  .    .
         BSR     NEGMOV           ;  .    .
         RTS                      ;  .    RETURN TO CALLER
;
;
INTRD2   LDA     #$B0             ;  SET-UP LIMITS FOR KILLER SEQUENCE
         LDB     #32              ;  .    LEFT ROADWAY LIMITS
         LDX     #CL.LIM          ;  .    .
         JSR     BLKFIL           ;  .    .
         LDB     #32              ;  .    LEFT HIDDEN ROADWAY LIMITS
         LDX     #CHLLIM          ;  .    .
         JSR     BLKFIL           ;  .    .
         LDA     #$48             ;  .    RIGHT ROADWAY LIMITS
         LDB     #32              ;  .    .
         LDX     #CR.LIM          ;  .    .
         JSR     BLKFIL           ;  .    .
         LDB     #32              ;  .    RIGHT HIDDEN ROADWAY LIMITS
         LDX     #CHRLIM          ;  .    .
         JSR     BLKFIL           ;  .    .
         RTS                      ;  .    .
;
;
;
;
;  MOVE INDICATED BUFFER AND TWO'S COMPLEMENT CONTENTS
;  ===================================================
;
;        ENTRY VALUES
;        ------------
;           B  = NUMBER OF BYTES TO TRANSFER
;           X  = POINTER TO DESTINATION BUFFER
;           U  = POINTER TO SOURCE BUFFER
;
         SETDP   $00
;        =====   ===
;
NEGMOV   LDA     U+               ;  FETCH BYTE FROM SOURCE BUFFER
         NEGA                     ;  COMPLEMENT BYTE
         STA     X+               ;  SAVE BYTE IN DESTINATION BUFFER
         DECB                     ;  END-OF-TRANSFER ?
         BNE     NEGMOV           ;  .
         RTS                      ;  RETURN TO CALLER
;
;
;
;
;  STRING BLOCK MOVE
;  =================
;
;        ENTRY VALUES
;        ------------
;           X  = POINTER TO SOURCE BUFFER
;           Y  = POINTER TO DESTINATION BUFFER
;
         SETDP   $00
;        =====   ===
;
SMOVE    LDB     X+               ;  FETCH BYTES TO BE TRANSFERRED
;
SMOV1    LDA     X+               ;  MOVE BYTE FROM SOURCE TO DESTINATION
         STA     Y+               ;  .
;
         DECB                     ;  DONE MOVIN' ?
         BNE     SMOV1            ;  .
;
         RTS                      ;  RETURN TO CALLER
;
;
;
;
;  CALCULATE PERSPECTIVE POINTER AND FETCH TABLE ENTRY
;  ===================================================
;
;        ENTRY VALUES
;        ------------
;           A  = VERTICAL POSITION
;           X  = TABLE POINTER
;
;        RETURN VALUES
;        -------------
;           A  = PERSPECTIVE POINTER
;           B  = PERSPECTIVE RELATED TABLE ENTRY
;
         SETDP   $00
;        =====   ===
;
PRSPCT   ADDA    #$80             ;  MAKE POSITIVE
;
         LSRA                     ;  DIVIDE BY 8
         LSRA                     ;  .
         LSRA                     ;  .
;
         LDB     A,X              ;  FETCH TABLE ENTRY FOR THIS POINTER
;
         RTS                      ;  RETURN TO CALLER
;
;    
;
;
;  SELECT THE 'SWING' VALUE
;  ========================
;
;        ENTRY VALUES
;        ------------
;           DP = $C8
;
;        RETURN VALUES
;        -------------
;           B  = SWING VALUE
;
         SETDP   $C8
;        =====   ===
;
SWING    PSHS    A,X              ;  SAVE ENTRY VALUES
;
         JSR     RANDOM           ;  FETCH A RANDOM NUMBER
         LDX     #SWGTBL          ;  FETCH SWING VALUE
         ANDA    #$0F             ;  .
         LDB     A,X              ;  .
         PULS    A,X,PC           ;  RETURN TO CALLER
;
SWGTBL   DB      11,10,9,8,7,6,5,4
         DB      -4,-5,-6,-7,-8,-9,-10,-11
;
;
;
;
;  SELECT DIRECTION WITHIN LIMIT CONES
;  ===================================
;
;        ENTRY VALUES
;        ------------
;           DP = $C8
;
;        RETURN VALUES
;        -------------
;           A  = RANDOM ANGLE WITH-IN LEFT / RIGHT CONE
;
         SETDP   $C8
;        =====   ===
;
LRCONE   PSHS    X                ;  SAVE ENTRY VALUES
;
         LSRA                     ;  SAVE PREVIOUS ROTATION SIGN
         LSRA                     ;  .
         LSRA                     ;  .
         ANDA    #$04             ;  .
         PSHS    A                ;  .
;
         JSR     RANDOM           ;  FETCH NEW ROTATION ANGLE
         ANDA    #$03             ;  .
         ADDA    S+               ;  .
         LDX     #LRTBL           ;  .
         LDA     A,X              ;  .
         PULS    X,PC             ;  RETURN TO CALLER
;
LRTBL    DB      $28,$2E,$2D,$2C
         DB      $18,$16,$13,$14
;
;
;
;  8 X 8 SIGNED MULTIPLY
;  =====================
;
;        ENTRY VALUES
;        ------------
;           A  = 8-BIT TWO'S COMPLEMENT MULTIPLICAND
;           B  = 8-BIT TWO'S COMPLEMENT MULTIPLIER
;           DP = $C8
;
;        RETURN VALUES
;        -------------
;           D  = 16-BIT TWO'S COMPLEMENT PRODUCT
;
         SETDP   $C8
;        =====   ===
;
MULT8    PSHS    D                ;  CALCULATE SIGN OF RESULT
         LDA     S                ;  .
         EORA    1,S              ;  .
         PULS    D                ;  .
         PSHS    CC               ;  .
;
         JSR     ABSAB            ;  FORM PARTIAL RESULT
         MUL                      ;  .
;
         PULS    CC               ;  COMPLEMENT RESULT ?
         BPL     MLT800           ;  .
         COMA                     ;  .    TWO'S COMPLEMENT
         COMB                     ;  .    .
         ADDD    #$0001           ;  .    .
;
MLT800   RTS                      ;  RETURN TO CALLER
;
;
;
;
;==========================================================================JJH
;  CODE ADDED - REV. B CHANGES                                       ======JJH
;==========================================================================JJH
;                                                                    ======JJH
;  DRAW COMPACT 'DUFFY' FORMAT                                       ======JJH
;  ===========================                                       ======JJH
;                                                                    ======JJH
;        ENTRY VALUES                                                ======JJH
;        ------------                                                ======JJH
;           B  = 'DUFFY' SIZE                                        ======JJH
;           X  = POINTER TO 'DUFFY'                                  ======JJH
;           Y  = ABSOLUTE SCREEN POSITION (Y:X)                      ======JJH
;           DP = $D0                                                 ======JJH
;                                                                    ======JJH
         SETDP   $D0              ;                                  ======JJH
;        =====   ===              ;                                  ======JJH
;                                                                    ======JJH
DFSHRT   PSHS    B                ;  SAVE ENTRY VALUES               ======JJH
;                                                                    ======JJH
         TFR     Y,D              ;  POSITION 'DUFFY'                ======JJH
         JSR     POSITD           ;  .                               ======JJH
;                                                                    ======JJH
         LDA     X+               ;  DRAW 'DUFFY'                    ======JJH
         LDB     ,S               ;  .                               ======JJH
         JSR     TDUFFY           ;  .                               ======JJH
;                                                                    ======JJH
         PULS    B,PC             ;  RETURN TO CALLER                ======JJH
;==========================================================================JJH
;
;
;
;
;  RELEASE INTEGRATORS AND DRAW 'DUFFY' FORMAT
;  ===========================================
;
;        ENTRY VALUES
;        ------------
;           X  = POINTER TO 'DUFFY'
;           DP = $D0
;
         SETDP   $D0
;        =====   ===
;
IDUFFY   LDA     #$FF             ;  RESET DASH PATTERN
         STA     DASH             ;  .
;
         LDA     X+               ;  FETCH VECTOR COUNT
;
;
;
;
;  RELEASE INTEGRATORS AND DRAW DASHED 'DUFFY' FORMAT
;  ==================================================
;
;        ENTRY VALUES
;        ------------
;           A  = NUMBER OF VECTORS - 1
;           X  = POINTER TO 'DUFFY'
;           DP = $D0
;
         SETDP   $D0
;        =====   ===
;
IDASH    DECA                     ;  SET VECTOR COUNT
         STA     LIST             ;  .
;
         LDD     X++              ;  POSITION FOR 'DIFFY'
         JSR     POSITD           ;  .    FAKES 'DUFFY' FORMAT
;
         JMP     DASHDF           ;  DRAW DASHED 'DIFFY' STRING
;
;
;
;
;  DRAW VECTOR STRING WITH STANDARD VALUES
;  =======================================
;
;        ENTRY VALUES
;        ------------
;           U  = POINTER TO GRAPIC STRING
;           DP = $D0
;
         SETDP   $D0
;        =====   ===
;
SPRCNT   LDX     #$0000           ;  POSITION TO Y:00, X:00
         LDA     #$7F             ;  SET STANDARD VECTOR SIZE
         BRA     SUPRDF           ;  .
;
;
;
;
;  DRAW FROM ROTATION TABLES
;  =========================
;
;        ENTRY VALUES
;        ------------
;           A  = VECTOR SIZE
;           X  = COMMON POSITION
;           DP = $D0
;
         SETDP   $D0
;        =====   ===
;
SPRTBL   LDB     RGRD1            ;  SET ROTATION TABLES FOR 'DUFFY' FORMAT
         ORB     #$80             ;  .
         STB     RGRD1            ;  .
;
         LDB     RGRD2            ;  .
         ORB     #$80             ;  .
         STB     RGRD2            ;  .
;
         LDB     RGRD3            ;  .
         ORB     #$80             ;  .
         STB     RGRD3            ;  .
;
         LDU     #XRTBL           ;  .
;
;
;
;
;  DRAW FROM GRAPHIC STIRNG
;  ========================
;
;        ENTRY VALUES
;        ------------
;           A  = VECTOR SIZE
;           X  = COMMON POSITION
;           U  = POINTER TO GRAPHIC STRING
;           DP = $D0
;
         SETDP   $D0
;        =====   ===
;
SUPRDF   STA     ETMP1            ;  SAVE ENTRY VALUES
         STX     ETMP2            ;  .
;
SPRDF1   LDX     U++              ;  FETCH POINTER TO OBJECT
         BEQ     SPRDF4           ;  .    STRING TERMINATOR ?
;
         LDD     ETMP2            ;  POSITION NEXT OBJECT
         JSR     POSITD           ;  .
;
         LDA     ETMP1            ;  SET VECTOR SIZE
         STA     T1LOLC           ;  .
;
         LDA     X+               ;  FETCH VECTOR COUNT - 1
         BMI     SPRDF2           ;  .    'DIFFY' FORMAT ?
;
         JSR     LDIFFY           ;  DRAW 'DIFFY' FORMAT
         BRA     SPRDF1           ;  .    DO NEXT STRING ENTRY
;
SPRDF2   TFR     A,B              ;  'DUFFY' FORMAT ?
         ANDA    #$1F             ;  .
         BITB    #$20             ;  .    BIT 5 = DASHED 'DUFFY' FORMAT
         BNE     SPRDF5           ;  .    .
         BITB    #$40             ;  .    BIT 6 = ZDUFFY FORMAT
         BNE     SPRDF3           ;  .    .
;
         JSR     LDUFFY           ;  DRAW 'DUFFY' FORMAT
         BRA     SPRDF1           ;  .    DO NEXT STRING ENTRY
;
SPRDF3   BSR     ZDUFFY           ;  DRAW 'ZDUFFY' FORMAT
         BRA     SPRDF1           ;  .    DO NEXT STRING ENTRY
;
SPRDF5   BSR     IDASH            ;  DRAW DASHED 'DUFFY' FORMAT
         BRA     SPRDF1           ;  .
;
SPRDF4   LDA     #$FF             ;  RESET DASH PATTERN
         STA     DASH             ;  .
;
         RTS                      ;  RETURN TO CALLER
;
;
;
;
;  DRAW 'DUFFY' FORMAT FOR SCENERY
;  ===============================
;
;        ENTRY VALUES
;        ------------
;           A  = NUMBER OF VECTORS - 1
;           X  = POINTER TO 'DUFFY' STYLE LIST
;
         SETDP   $D0
;        =====   ===
;
ZDUFFY   STA     LIST             ;  SET NUMBER OF VECTORS - 1
;
         LDD     ,X               ;  FETCH RELATIVE 'Y:X'
         STA     DAC              ;  SET 'Y' AXIS VALUE
         CLR     CNTRL            ;  .    START SAMPLE / HOLD STROBE
         LEAX    2,X              ;  .    POSITION TO NEXT ENTRY
         NOP                      ;  .    .    << TIMING >>
         INC     CNTRL            ;  .    STOP SAMPLE / HOLD STROBE
;
         LDA     LFLAG            ;  SET 'X' AXIS VALUE
         CMPA    #$01             ;  .    COMPLEMENT 'X' AXIS ?
         BNE     ZDUF0            ;  .    .
         NEGB                     ;  .    .
ZDUF0    STB     DAC              ;  .    SAVE 'X' VALUE
;
         LDD     #0               ;  POSITION BEAM FOR START OF 'DUFFY' LIST
         BRA     ZDUF3            ;  .
;
;
ZDUF1    STA     LIST             ;  SET VECTOR COUNT
         LDD     ,X               ;  FETCH RELATIVE 'Y:X'
         STA     DAC              ;  SET 'Y' AXIS VALUE
         CLR     CNTRL            ;  .    START SAMPLE / HOLD STROBE
         LEAX    2,X              ;  .    POSITION TO NEXT ENTRY
         NOP                      ;  .    .    << TIMING >>
         INC     CNTRL            ;  .    STOP SAMPLE / HOLD STROBE
;
         LDA     LFLAG            ;  SET 'X' AXIS VALUE
         CMPA    #$01             ;  .    COMPLEMENT 'X' AXIS ?
         BNE     ZDUF2            ;  .    .
         NEGB                     ;  .    .
ZDUF2    STB     DAC              ;  .    SAVE 'X' VALUE
;
         LDD     #$FF00           ;  TURN-ON CRT BEAM
ZDUF3    STA     SHIFT            ;  .
         STB     T1HOC            ;  START VECTOR RAMP
;
         LDD     #$0040           ;  WAIT FOR VECTOR COMPLETION
ZDUF4    BITB    IFLAG            ;  .
         BEQ     ZDUF4            ;  .
         NOP                      ;  .    << TIMING >>
;
         STA     SHIFT            ;  TURN-OFF CRT BEAM
;
         LDA     LIST             ;  END OF LIST ?
         DECA                     ;  .
         BPL     ZDUF1            ;  .
         JMP     ZERGND           ;  .    ZERO INTEGRATORS AND SET ACTIVE GND
;
;
         IF      L.SUBR = OFF     ;-------------------------------------------
         LIST    *                ;-------------------------------------------
         ENDIF                    ;-------------------------------------------



 
 
 
 
 
 

Home
Page
Sitemap Privacy
Statement
Terms
of Use
Feedback

 
 

Please keep in mind that we can not guarantee the accuracy or timeliness of the information on this website, so use with care. We encourage you to double-check the information that is critical to you.

If you've found an error or have additional information that you would like to share, please don't hesitate to write. Click here to contact us.

Copyright 2016
All Rights Reserved
This page was last modified: 12 Jan 2017
By John Hall