00001 *************************
00002 *
00003 * XLINE.ASM
00004 * MDJ 09-24-90
00005 *
00006 * DRAWS A GRAPHICS LINE
00007 *
00008 *************************
00009 *
00010 * REQUIRES: XJUMP1
00011 *           XPSET
00012 *
00013 * MUST ENTER WITH START
00014 * POINT IN
00015 * (HORBEG,VERBEG)
00016 * AND END POINT IN
00017 * (HOREND,VEREND)
00018 *
00019 *************************
00020 *
00021 * REF. PAGE B52 AND
00022 * SURROUNDING PAGES
00023 * EXTENDED COLOR BASIC
00024 * UNRAVELLED
00025 *
00026 *************************
00027 *
00028 XJUMP1  EQU     $3A2E   GRAPHICS SUBROUTINES SET ONE
00029 XJMP1A  EQU     $3A38     ALTERNATE ENTRY POINT
00030 XPSETA  EQU     $3C32   SET POINT ALTERNATE ENTRY
00031 VERBEG  EQU     $BF     STARTING VERTICAL COORDINATE
00032 HORBEG  EQU     $BD     STARTING HORIZONTAL COORDINATE
00033 VEREND  EQU     $C5     ENDING VERTICAL COORDINATE
00034 HOREND  EQU     $C3     ENDING HORIZONTAL COORDINATE
00035 HORBYT  EQU     $B9     # OF BYTES PER HORIZONTAL LINE
00036 PMODE   EQU     $B6     MODE ARGUMENT
00037 VD7     EQU     $D7     SCRATCHPAD VARIABLE
00038         ORG     $3C50
00039 XLINE   LDY     #XLIV   POINT Y TO VERTICAL BUMP ROUTINE
00040         JSR     XLABSV  CALCULATE VERTICAL DIFFERENCE
00041         LBEQ    XLH     IF = 0, DRAW HORIZONTAL LINE
00042         BCC     XLINE1  GO IF VEREND > VERBEG
00043         LDY     #XLDV   POINT Y TO NEG. VERTICAL BUMP
00044 XLINE1  PSHS    A,B     SAVE VERTICAL DIFFERENCE
00045         LDU     #XLIH   POINT U TO HORIZONTAL BUMP
00046         JSR     XLABSH  CALCULATE HORIZONTAL DIFFERENCE
00047         LBEQ    XLV     IF = 0, DRAW A VERTICAL LINE
00048         BCC     XLINE2  GO IF HOREND > HORBEG
00049         LDU     #XLDH   POINT U TO NEG. HORIZONTAL BUMP
00050 XLINE2  CMPD    ,S      COMPARE HORIZ. & VERT. DIFFERENCE
00051         PULS    X       PUT VERTICAL DIFFERENCE IN X
00052         BCC     XLINE3  GO IF HORIZ.DIFF > VERT.DIFF
00053         EXG     U,Y     SWAP CHANGE ADDRESSES
00054         EXG     D,X     EXCHANGE HORIZ.DIFF AND VERT.DIFF
00055 XLINE3  PSHS    A,B,U   SAVE LARGER OF H.DIFF OR V.DIFF
00056 *                          AND THE INCR/DECR ADDRESS
00057         PSHS    A,B     SAVE LARGER OF H.DIFF OR V.DIFF
00058         LSRA            DIVIDE BY 2
 
 
 
 
 
 
 
 
00059         RORB
00060         BCS     XLINE4  GO IF ODD NUMBER
00061         CMPU    #XLIV+1 INCR OR DECR?
00062         BCS     XLINE4  GO IF INCR
00063         SUBD    #1      SUBTRACT 1 IF DECR
00064 XLINE4  PSHS    A,B,X   SAVE DELTA AND COUNTER
00065         LDU     #XJMP1A
00066         LDA     PMODE   GET MODE ARGUMENT
00067         ASLA            MULTIPLY BY 2
00068         LDU     A,U     OFFSET
00069 XLINE5  JSR     ,U      CONVERT COORDS TO SCREEN ADDRESS
00070         JSR     XPSETA  GO SET POINT
00071         LDX     6,S     GET DISTANCE COUNTER
00072         BEQ     XLINE6  GO IF LINE DRAW IS COMPLETE
00073         LEAX    -1,X    DECREMENT BY ONE
00074         STX     6,S     SAVE COUNTER
00075         JSR     [8,S]   GO TO (INCR OR DECR) BASED ON
00076 *                         WHICH HAS LARGEST DELTA
00077         LDD     ,S      GET MINOR COORDINATE COUNTER
00078         ADDD    2,S     ADD THE SMALLEST DIFFERENCE
00079         STD     ,S      SAVE NEW MINOR COORDINATE COUNTER
00080         SUBD    4,S     SUBTRACT LARGEST DIFFERENCE
00081         BCS     XLINE5  GO IF RESULT NOT > LARGEST DIFF.
00082         STD     ,S      STORE NEW MINOR COORDINATE DIFF.
00083         JSR     ,Y      INCR/DECR COORD. WITH LEAST DELTA
00084         BRA     XLINE5  KEEP GOING
00085 XLINE6  PULS    X
00086         PULS    A,B,X,Y,U
00087         RTS
00088 XLIH    LDX     HORBEG  GET COORDINATE
00089         LEAX    1,X     ADD ONE
00090         STX     HORBEG  SAVE COORDINATE
00091         RTS
00092 XLIV    LDX     VERBEG  GET COORDINATE
00093         LEAX    1,X     ADD ONE
00094         STX     VERBEG  SAVE COORDINATE
00095         RTS
00096 XLDH    LDX     HORBEG  GET COORDINATE
00097         LEAX    -1,X    SUBTRACT ONE
00098         STX     HORBEG  SAVE COORDINATE
00099         RTS
00100 XLDV    LDX     VERBEG  GET COORDINATE
00101         LEAX    -1,X    SUBTRACT ONE
00102         STX     VERBEG  SAVE COORDINATE
00103         RTS
00104 XLABSH  LDD     HOREND  GET HORIZONTAL END COORDINATE
00105         SUBD    HORBEG  SUBTRACT HORIZONTAL START COORD.
00106         BRA     XLABSX  GET ABSOLUTE VALUE
00107 XLABSV  LDD     VEREND  GET VERTICAL END COORDINATE
00108         SUBD    VERBEG  SUBTRACT VERTICAL START COORD.
00109 XLABSX  BCC     XLABSY  GO IF END >= START
00110         PSHS    CC      SAVE STATUS
00111         NEGA            NEGATE ACCD
00112         NEGB
00113         SBCA    #0
00114         PULS    CC      RESTORE STATUS
00115 XLABSY  RTS
00116 XLV     PULS    A,B     CLEAN STACK
 
 
 
 
 
 
 
 
00117         LDD     VERBEG  GET COORDINATES
00118         PSHS    A,B     SAVE THEM
00119         JSR     XLABSV  CALCULATE ABSOLUTE VALUE
00120         BCC     XLV1    GO IF END COORD. > START COORD.
00121         LDX     VEREND
00122         STX     VERBEG  SWITCH COORDINATES
00123 XLV1    TFR     D,Y     LENGTH OF LINE TO Y
00124         LEAY    1,Y     SET BOTH START AND END COORDS.
00125         JSR     XJUMP1
00126         PULS    U       GET END COORDINATE
00127         STU     VERBEG  RESTORE THEM
00128         LDU     #XLPMD  POINT TO "DOWN 1 ROW" ROUTINE
00129         BRA     XLH2    DRAW VERTICAL LINE
00130 XLH     LDX     HORBEG  GET COORDINATES
00131         PSHS    X       SAVE THEM
00132         JSR     XLABSH  GET ABSOLUTE VALUE
00133         BCC     XLH1    GO IF END > START
00134         LDX     HOREND  TRANSFER END COORDINATE TO START
00135         STX     HORBEG
00136 XLH1    TFR     D,Y     SAVE DIFFERENCE IN Y
00137         LEAY    1,Y     ADD ONE TO DIFFERENCE
00138         JSR     XJUMP1
00139         PULS    U       GET START COORDINATES
00140         STU     HORBEG  RESTORE THEM
00141         BSR     XLPM    POINT TO ROUTINE TO MOVE PIXEL
00142 *                         POINTERS TO THE RIGHT
00143 XLH2    STA     VD7     SAVE PIXEL MASK
00144         JSR     XPSETA  GO SET POINT
00145         LDA     VD7     GET OLD PIXEL MASK
00146         JSR     ,U      MOVE TO NEXT ONE TO RIGHT
00147         LEAY    -1,Y    DECREMENT COUNTER
00148         BNE     XLH2    LOOP IF NOT DONE
00149 XLH3    RTS
00150 XLPM    LDU     #XLPMA  POINT TO JUMP TABLE
00151         LDB     PMODE   GET MODE ARGUMENT
00152         ASLB            MULTIPLY BY TWO
00153         LDU     B,U     GET JUMP ADDRESS
00154         RTS
00155 XLPMA   FDB     XLPMB   JUMP TABLE
00156         FDB     XLPMC
00157         FDB     XLPMB
00158         FDB     XLPMC
00159         FDB     XLPMB
00160 XLPMB   LSRA            SHIFT ONE BIT TO RIGHT
00161         BCC     XLPMB1  GO IF IN SAME BYTE
00162         RORA            SET BIT 7 IF IN NEXT BYTE
00163         LEAX    1,X     ADD ONE TO X
00164 XLPMB1  RTS
00165 XLPMC   LSRA            SHIFT MASK ONE BIT TO RIGHT
00166         BCC     XLPMB   SHIFT RIGHT AGAIN IF SAME BYTE
00167         LDA     #$C0    SET PIXEL #3 IF NEW BYTE
00168         LEAX    1,X     ADD ONE TO ABS SCREEN LOCATION
00169         RTS
00170 XLPMD   LDB     HORBYT  GET # OF BYTES/HORIZONTAL ROW
00171         ABX             ADD TO ABSOLUTE SCREEN POSITION
00172 ZEND    RTS
00173         END
 
 
 
 
 
 
 
 
 
