Advertisement
jareth_2005

Updated graphics library

Apr 21st, 2022
1,711
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.          ; written by Paul Baxter 4/16/22
  2.  
  3.         .inc "macros.asm"
  4.         .inc "pagezero.asm"
  5.         .inc "basic.asm"
  6.         .inc "kernal.asm"
  7.  
  8. ;********************************************
  9.         BITMAPBASE = 4096 * 2
  10.         COLORBASE = 1024
  11.  
  12.         ; Some zero page has multiple uses
  13.  
  14.         XCOORD = LINNUM ; DO NOT CHANGE set by basic parse routine
  15.         LOC = UNUSED2
  16.         DX = BITTS
  17.         DY = BITCI
  18.         XS = RIDATA
  19.         YS = RIPRTY + 1
  20.         K1 = OLDLIN
  21.         K2 = FREKZP
  22.         _D = FREKZP + 2
  23.         _X = LINNUM
  24.         _Y = RESHO
  25.         _CMD = FREKZP
  26.         TMP = UNUSED2 + 2
  27.         CMDTABLE = UNUSED2
  28.         BASICTEXT = RESHO
  29.         CMDJUMP = UNUSED2
  30.         WEDGE_TMP = LINNUM
  31.         CURLOC = BITTS
  32.         CURLOCB = BITCI
  33.         COUNTER = UNUSED2
  34.         MASKB = RESHO
  35.         MASKE = FREKZP
  36.         YCOUNT = FREKZP + 2
  37.         YCOL = PTR1
  38.         XD   = PTR1
  39.         COLORPTR = TMPDATA
  40.         X0 = FORPNT
  41.         X1 = OPPTR
  42.         Y0 = PRTY
  43.         Y1 = MSGFLG
  44.         R = FREKZP
  45.         PK = OLDLIN
  46.         CURX = BITCI
  47.         CURY = FREKZP + 2
  48.         CX = RIDATA
  49.         CY = RIPRTY + 1
  50.         XDIST  = INDEX
  51.         YDIST  = INDEX + 2
  52.         StartX = DSCPNT
  53.         YMAX = OLDLIN
  54.         XMAX = BLNCT
  55.  
  56.         ;************************************
  57.         ; The values below are globals must
  58.         ; not be modified by basic
  59.         ; The values below will work if you do
  60.         ; not you tape
  61.         ;************************************
  62.         CIRJUMP = CNTDN
  63.         IGONE_SV = BSOUR
  64.         Color = CMP0
  65.        
  66.         .org $C000
  67.  
  68. ;********************************************
  69. ;*                                          *
  70. ;*  INSTALL                                 *
  71. ;*                                          *
  72. ;*   Installs Basic Wedge                   *
  73. ;*                                          *
  74. ;********************************************
  75. INSTALL
  76.         php
  77.  
  78.         cli
  79.  
  80.         ;
  81.         ;   install wedge
  82.         ;
  83.         MOVE16 IGONE, IGONE_SV
  84.         MOVE16I IGONE, WEDGE
  85.  
  86.         ; fix basic pointers
  87.         MOVE16I TXTTAB,2049
  88.         MOVE16I STREND,2051
  89.  
  90.         ; clear first 5 bytes of BASIC
  91.         ; same as doing a NEW
  92.         lda #0
  93.         ldy #5
  94. -
  95.         sta (TXTTAB),y
  96.         dey
  97.         bne -
  98.  
  99.         lda #3
  100.         sta COLOR
  101.        
  102.         plp
  103.  
  104.         jmp WARM
  105.  
  106. ;********************************************
  107. ;*                                          *
  108. ;*  WEDGE                                   *
  109. ;*                                          *
  110. ;* TXTPTR - pointer to BASIC text           *
  111. ;* IGONE  - jump vector back to BASIC       *
  112. ;*                                          *
  113. ;********************************************
  114. WEDGE
  115.         ; move the address of the table to pagezero
  116.         MOVE16I CMDTABLE, _Commands
  117.         MOVE16 TXTPTR, BASICTEXT
  118.  
  119.         ; init _cmd INDEX TO 0
  120.         ; also init y to 1
  121.         ldy #0
  122.         sty _CMD
  123.         iny
  124.  
  125. @SkipSpace
  126.         lda (BASICTEXT),y
  127.         cmp #' '
  128.         bne @MatchCmd
  129.         INC16 BASICTEXT
  130.         jmp @SkipSpace
  131.  
  132. @MatchCmd
  133.         lda (BASICTEXT),y
  134.         ; if it's a null then its the end of a command
  135.         beq @NextCmd
  136.  
  137.         ; if its a colon let basic handle it
  138.         cmp #':'
  139.         beq @NextCmd
  140.  
  141.         ; compare to the table entry
  142.         cmp (CMDTABLE),y
  143.         bne @NextCmd
  144.  
  145.         ; get the next char
  146.         iny
  147.         jmp @MatchCmd
  148.  
  149. ; -------------------------------------
  150. @NextCmd
  151.         lda (CMDTABLE),y
  152.         beq @ExecuteCmd
  153.  
  154.         inc _CMD
  155.  
  156.         ldy #0
  157. @CmdTableInc
  158.         INC16 CMDTABLE
  159.         lda (CMDTABLE),y
  160.         bne @CmdTableInc
  161.         iny
  162.         lda (CMDTABLE),y
  163.         beq @ExitToBasic
  164.         INC16 CMDTABLE
  165.         iny
  166.         jmp @MatchCmd
  167. ; -------------------------------------
  168. @ExecuteCmd
  169.         dey
  170.         sty WEDGE_TMP
  171.         lda #0
  172.         sta WEDGE_TMP + 1
  173.  
  174.         ADD16 BASICTEXT, WEDGE_TMP, BASICTEXT
  175.         MOVE16 BASICTEXT, TXTPTR
  176.  
  177.         ; multiply _CMD by two to get jump offset
  178.         lda _CMD
  179.         asl
  180.  
  181.         ; move offset to x
  182.         ; move jump entry to
  183.         ; pagezero jump
  184.         tax
  185.  
  186.         lda _Jump,x
  187.         sta CMDJUMP
  188.         lda _jump + 1,x
  189.         sta CMDJUMP + 1
  190.  
  191.         jsr @Jump
  192.  
  193. @Cleanup
  194.         jsr CHRGOT
  195.         beq @Exit2
  196.         jsr CHRGET
  197.         jmp @Cleanup
  198. @Exit2
  199.         DEC16 TXTPTR
  200.  
  201. @ExitToBasic
  202.         jmp (IGONE_SV)
  203.  
  204. @Jump
  205.         ; execute the command
  206.         jmp (CMDJUMP)
  207.  
  208. ; -------------------------------------
  209. ; each command
  210. ; 1st byte space or 0 for end of table
  211. ; 0 terminates the string entry
  212. ; -------------------------------------
  213. _Commands
  214.         .byte " H", FRE_TOK, "CT", 0
  215.         .byte " HLINE", 0
  216.         .byte " HPLOT", 0
  217.         .byte " HRECT", 0
  218.         .byte " HGROFF", 0
  219.         .byte " HFCOL", 0
  220.         .byte " HBCOL", 0
  221.         .byte " HCLS", 0
  222.         .byte " HGR", 0
  223.         .byte " HCIR", 0
  224.         .byte " HFCIR", 0
  225.         .byte 0
  226.  
  227.  ; offsets to commands
  228. _Jump
  229.         .word HGRFillRect
  230.         .word HGRLine
  231.         .word HGRPlot
  232.         .word HGRRect
  233.         .word HGROff
  234.         .word HGRFColor
  235.         .word HGRBColor
  236.         .word HGRCls
  237.         .word HGROn
  238.         .word HGRCircle
  239.         .word HGRFillCircle
  240.  
  241. ;********************************************
  242. ;*                                          *
  243. ;*  HGROn                                   *
  244. ;*                                          *
  245. ;*  Enter HGR Mode                          *
  246. ;*                                          *
  247. ;********************************************
  248. HGROn
  249.         ; hires on
  250.         lda $D018
  251.         ora #%00001000
  252.         sta $D018
  253.  
  254.         lda $D011
  255.         ora #%00100000
  256.         sta $D011
  257.         rts
  258.  
  259. ;********************************************
  260. ;*                                          *
  261. ;*  HGRCls                                  *
  262. ;*                                          *
  263. ;*  Clear graphics bitmap and colors        *
  264. ;*                                          *
  265. ;********************************************
  266. HGRCls
  267.         ldx #0
  268.         lda #0
  269. @_ClrLoop
  270.         sta BITMAPBASE + ($0100 * 0),x
  271.         sta BITMAPBASE + ($0100 * 1),x
  272.         sta BITMAPBASE + ($0100 * 2),x
  273.         sta BITMAPBASE + ($0100 * 3),x
  274.         sta BITMAPBASE + ($0100 * 4),x
  275.         sta BITMAPBASE + ($0100 * 5),x
  276.         sta BITMAPBASE + ($0100 * 6),x
  277.         sta BITMAPBASE + ($0100 * 7),x
  278.         sta BITMAPBASE + ($0100 * 8),x
  279.         sta BITMAPBASE + ($0100 * 9),x
  280.         sta BITMAPBASE + ($0100 * 10),x
  281.         sta BITMAPBASE + ($0100 * 11),x
  282.         sta BITMAPBASE + ($0100 * 12),x
  283.         sta BITMAPBASE + ($0100 * 13),x
  284.         sta BITMAPBASE + ($0100 * 14),x
  285.         sta BITMAPBASE + ($0100 * 15),x
  286.         sta BITMAPBASE + ($0100 * 16),x
  287.         sta BITMAPBASE + ($0100 * 17),x
  288.         sta BITMAPBASE + ($0100 * 18),x
  289.         sta BITMAPBASE + ($0100 * 19),x
  290.         sta BITMAPBASE + ($0100 * 20),x
  291.         sta BITMAPBASE + ($0100 * 21),x
  292.         sta BITMAPBASE + ($0100 * 22),x
  293.         sta BITMAPBASE + ($0100 * 23),x
  294.         sta BITMAPBASE + ($0100 * 24),x
  295.         sta BITMAPBASE + ($0100 * 25),x
  296.         sta BITMAPBASE + ($0100 * 26),x
  297.         sta BITMAPBASE + ($0100 * 27),x
  298.         sta BITMAPBASE + ($0100 * 28),x
  299.         sta BITMAPBASE + ($0100 * 29),x
  300.         sta BITMAPBASE + ($0100 * 30),x
  301.         inx
  302.         bne @_ClrLoop
  303. @_ClrLoop2
  304.         sta BITMAPBASE + ($0100 * 31),x
  305.         inx
  306.         cpx #8000-31*255
  307.         bne @_ClrLoop2
  308.  
  309.         jmp ClearColor
  310.  
  311. ;********************************************
  312. ;
  313. ;  HGRBColor
  314. ;     Set HGR Background Color
  315. ;
  316. ;********************************************
  317. HGRBColor
  318.         jsr GETBYTC
  319.         txa
  320.         and #$0F
  321.         sta TMP
  322.         lda Color
  323.         and #$F0
  324.         ora TMP
  325.         sta Color
  326.         rts
  327.  
  328. ;********************************************
  329. ;
  330. ;  HGRFColor
  331. ;     Set HGR Forground Color
  332. ;
  333. ;********************************************
  334. HGRFColor
  335.         jsr GETBYTC
  336.         txa
  337.         and #$0F
  338.         asl
  339.         asl
  340.         asl
  341.         asl
  342.         sta TMP
  343.  
  344.         lda Color
  345.         and #$0F
  346.         ora TMP
  347.         sta Color
  348.         rts
  349.  
  350. ;********************************************
  351. ;
  352. ;  ClearColor
  353. ;     clear color memory
  354. ;
  355. ;********************************************
  356. ClearColor
  357.         lda Color
  358.         ldx #0
  359. @Clear3
  360.         sta COLORBASE + ($0100 * 0),x
  361.         sta COLORBASE + ($0100 * 1),x
  362.         sta COLORBASE + ($0100 * 2),x
  363.         inx
  364.         bne @Clear3
  365. @Clear4
  366.         sta COLORBASE + ($0100 * 3),x
  367.         inx
  368.         cpx #1000-3*255
  369.         bne @Clear4
  370.         rts
  371.  
  372. ;********************************************
  373. ;
  374. ;  HGROff
  375. ;
  376. ;********************************************
  377. HGROff
  378.         ; hires off
  379.         lda $D018
  380.         and #~ %00001000
  381.         sta $D018
  382.  
  383.         lda $D011
  384.         and #~ %00100000
  385.         sta $D011
  386.         rts
  387.  
  388. ;********************************************
  389. ;
  390. ;  HGRPlot
  391. ;
  392. ; Parses Basic Text and plot a point
  393. ;
  394. ; Calls
  395. ;   GETNUM $B7EB
  396. ;   _Plot
  397. ;
  398. ; HGRPlot x,y
  399. ;
  400. ;********************************************
  401. HGRPlot
  402.         INC16 TXTPTR
  403.         jsr GETNUM ; get address in $14/$15 y next integer at X
  404.  
  405.         jsr RangeCheckXY
  406.  
  407. ;********************************************
  408. ;
  409. ;  _Plot
  410. ;       XCOORD     IN  2 byte x coordinate
  411. ;       X register IN  y coordinate
  412. ;
  413. ; Plot a single point
  414. ; Must not be called Plot because it collides with Kernal
  415. ; PLOT    = $E50A
  416. ;
  417. ; Calls
  418. ;   CalcPlot
  419. ;
  420. ;********************************************
  421. _Plot
  422.         stx YCOL
  423.         MOVE16 XCOORD, COLORPTR
  424.  
  425.         ; Calc Bitmap location
  426.         jsr CalcPlot
  427.         ldy #0
  428.         lda (LOC),y
  429.         ora MaskStart,x
  430.         sta (LOC),y
  431.  
  432.         ; Calc Color map location
  433.         jsr CalcColorByte
  434.         lda Color
  435.         ldy #0
  436.         sta (COLORPTR),y
  437.         rts
  438.  
  439. ;********************************************
  440. ;
  441. ; CalcColorByte
  442. ;
  443. ; COLORPTR = x location
  444. ; YCOL = y location
  445. ;
  446. ; Warning:
  447. ;     Destroys both COLORPTR and YCOL
  448. ;********************************************
  449. CalcColorByte
  450.         lda #0
  451.         sta YCOL + 1
  452.         RSHIFT16 COLORPTR, 3  ; COLORPTR = x / 8
  453.         RSHIFT16 YCOL, 3      ; ycol int(y/8)*40
  454.         MULT40 YCOL
  455.  
  456.         ADD16 COLORPTR, YCOL, COLORPTR  ; COLORPTR = COLORPTR + ycol
  457.         ADD16I COLORPTR, COLORBASE, COLORPTR ; COLORPTR = COLORPTR + COLORBASE
  458.         rts
  459.  
  460. ;********************************************
  461. ;
  462. ;  CalcPlot
  463. ;       XCOORD IN  2 byte x coordinate
  464. ;       X reg  IN  y coordinate
  465. ;
  466. ;       LOC    OUT  byte of bitemap
  467. ;       X reg  OUT  bit of bitmap
  468. ;
  469. ;********************************************
  470. CalcPlot
  471. ; 320*int(y/8)=32*[8*int(y/8)] + 8*[8*int(y/8)]
  472.         lda #0
  473.         sta LOC
  474.         txa ;X register has Y coordinate
  475.         lsr
  476.         lsr
  477.         lsr
  478.         sta LOC + 1 ; high-byte of 32*8*int(y/8)
  479. ;-------------------------------------------------
  480.         lsr
  481.         ror LOC
  482.         lsr
  483.         ror LOC ; low byte of 8*[8*int(y/8)]
  484. ;-------------------------------------------------
  485.         adc LOC + 1
  486.         adc #>BITMAPBASE
  487.         sta LOC+1 ; high byte of memory=BITMAPBASE + 320*int(y/8)
  488. ;-------------------------------------------------
  489.         lda XCOORD
  490.         and #%11111000 ; 8*int(x/8)
  491.         adc LOC
  492.         sta LOC ; set address memory block of bytes
  493. ;-----------------------------------------------
  494.         lda XCOORD + 1
  495.         adc LOC + 1
  496.         sta LOC + 1
  497. ;-----------------------------------------------
  498.         txa
  499.         and #%00000111 ; int(y/7), byte offset inside bLOCk
  500.         tay
  501.  
  502. ;-----------------------------------------------
  503.         lda XCOORD
  504.         and #%00000111 ; int(x/7), bit inside byte
  505.         tax
  506.  
  507.         ; add y to LOC
  508.         sty TMP
  509.         lda #0
  510.         sta TMP + 1
  511.         ADD16 TMP, LOC, LOC
  512.  
  513. ;-----------------------------------------------
  514.         ; given: x (0 - 7)
  515.         ; x = 7 - x
  516.         MOVE8I TMP, 7
  517.         stx TMP + 1
  518.         SUB8 TMP, TMP + 1, TMP
  519.         ldx TMP
  520.         rts
  521.  
  522. ;********************************************
  523. ;
  524. ;  HGRLine
  525. ;
  526. ; This routine draws a line
  527. ;
  528. ; Calls:
  529. ;  GETNUM
  530. ;  _Line
  531. ;
  532. ;********************************************
  533. HGRLine
  534.         INC16 TXTPTR
  535.  
  536.         jsr GETNUM ; get address in LINNUM $14/$15 y next integer at X
  537.         jsr RangeCheckXY
  538.  
  539.         stx Y0
  540.         MOVE16 XCOORD, X0
  541.  
  542.         jsr CHKCOM
  543.         jsr GETNUM ; get address in LINNUM $14/$15 y next integer at X
  544.         jsr RangeCheckXY
  545.  
  546.         stx Y1
  547.         MOVE16 XCOORD, X1
  548.  
  549. ;********************************************
  550. ;
  551. ; _Line
  552. ;
  553. ;    XO - start X
  554. ;    Y0 - start Y
  555. ;    X1 - end X
  556. ;    Y1 - end Y
  557. ;
  558. ; optimized for horizontal lines
  559. ;********************************************
  560. _Line
  561.         ldx Y0
  562.         cpx Y1
  563.         bne NotHorizontal
  564.  
  565. ;---------------------------------------
  566.         lda X0 + 1
  567.         cmp X1 + 1
  568.         bcc _Line2
  569. ;---------------------------------------
  570.         lda X0
  571.         cmp X1
  572.         bcc _Line2
  573. ;---------------------------------------
  574.         MOVE16 X1, XCOORD
  575.         SUB16 X0, X1, XDIST
  576.         jmp CalcPlotHLine
  577.  
  578. ;********************************************
  579. ;*                                          *
  580. ;*  _Line2                                  *
  581. ;*    Draw Horizontal line                  *
  582. ;*    X0 must be less than X1               *
  583. ;*                                          *
  584. ;*    XO - start X                          *
  585. ;*    Y0 - start Y                          *
  586. ;*    X1 - end X                            *
  587. ;*    Y1 - end Y                            *
  588. ;*                                          *
  589. ;********************************************
  590. _Line2
  591.         MOVE16 X0,XCOORD
  592.         SUB16 X1, X0, XDIST
  593.  
  594. ;---------------------------------------
  595. CalcPlotHLine
  596.         MOVE16 XCOORD, COLORPTR
  597.         MOVE8 Y0, YCOL
  598.         ldx Y0
  599.         ; Calculate 1st byte and bit of BitMap
  600.         jsr CalcPlot
  601.         MOVE16 LOC, CURLOC
  602.         ; Draw the horizontal Line
  603.         jsr HGRHorizontalLine
  604.         ; Set the Lines color memory
  605.         jmp HCPlotLine
  606.  
  607. ;---------------------------------------
  608.  
  609. NotHorizontal
  610.         MOVE8I DY+1, 0
  611.  
  612.         ; DX% = abs(x0%-x1%)
  613.         ; set XS to add or substract
  614.         ;
  615.         lda X0 + 1
  616.         cmp X1 + 1
  617.         bcc @X1_larger
  618.  
  619.         lda X0
  620.         cmp X1
  621.         bcc @X1_larger
  622.  
  623. ;-------------------------------------------
  624.         SUB16 X0, X1, DX
  625.         lda #1
  626.         bne @Calc_DY
  627.  
  628. @X1_larger
  629.         SUB16 X1, X0, DX
  630.         lda #0
  631. @Calc_DY
  632.         sta XS
  633.  
  634. ;-------------------------------------------
  635.         ; DY = abs(y0% - y1%)
  636.         ; set YS to add or substract
  637.         lda Y0
  638.         cmp Y1
  639.         bcc @Y1_larger
  640.  
  641.         SUB8 Y0, Y1, DY
  642.         lda #1
  643.         bne @Done_calc
  644.  
  645. @Y1_larger
  646.         SUB8 Y1, Y0, DY
  647.         lda #0
  648. @Done_calc
  649.         sta YS
  650. ;-------------------------------------------
  651.         ; y is 8 bit so if this is not 0 its larger
  652.         lda DX + 1
  653.  
  654.         ; using reverse logic because branch is > 128
  655.         beq @DX_DY_compare
  656.         jmp @DX_larger
  657.  
  658. @DX_DY_compare
  659.         lda DX
  660.         cmp DY
  661.  
  662.         ; using reverse logic because branch is > 128
  663.         bcc @DY_larger
  664.         jmp @DX_larger
  665.  
  666. @DY_larger
  667.         ; K1 = 2 * DX
  668.         MOVE16 DX, K1
  669.         LSHIFT16 K1, 1
  670.  
  671.         ; K2%=2*(DX%-DY%)
  672.         SUB16 DX, DY, K2
  673.         LSHIFT16 K2, 1
  674.  
  675.         ; d%=K1%-DY
  676.         SUB16 K1, DY, _D
  677. ;-------------------------------------------
  678.         ; y=y0%
  679.         lda Y0
  680.         sta _Y
  681.  
  682.         ; x = x0
  683.         MOVE16 X0, _X
  684. ;-------------------------------------------
  685. ; for y=y0% to y1% step YS%
  686. @Y_loop_start
  687.         lda _Y
  688.         cmp Y1
  689.  
  690.         bne @Y_loop_continue
  691.         jmp @Exitline
  692.  
  693. @Y_loop_continue
  694.         ; plot
  695.         ldx _Y
  696.         jsr _Plot
  697. ; -------------------------------------------
  698.         ; if d%<0 then y_loop_d0_minus
  699.         lda _D + 1
  700.         bmi @Y_loop_d0_minus
  701.  
  702.         ; x = x + XS
  703.         lda XS
  704.         beq @Y_loop_X_inc
  705.  
  706.         DEC16 _X
  707.         jmp  @Y_loop_add_d
  708.  
  709. @Y_loop_X_inc
  710.         INC16 _X
  711.  
  712. @Y_loop_add_d
  713.         ; d% = d% + K2%
  714.         ADD16 _D, K2, _D
  715.         jmp @Y_loop_next
  716. ; -------------------------------------------
  717. @y_loop_d0_minus
  718.         ; d%=d%+K1%
  719.         ADD16 _D, K1, _D
  720. ; -------------------------------------------
  721. @y_loop_next
  722.         ; y = y + YS
  723.         lda YS
  724.         beq @Y_loop_next_inc
  725.  
  726.         DEC8 _Y
  727.         jmp @Y_loop_start
  728.  
  729. @Y_loop_next_inc
  730.         inc _Y
  731.         jmp @Y_loop_start
  732. ; -------------------------------------------
  733. @DX_larger
  734.         ; K1 = 2 * DY
  735.         MOVE16 DY, K1
  736.         LSHIFT16 K1, 1
  737.  
  738.         ; K2%=2*(DY%-DX%)
  739.         SUB16 DY, DX, K2
  740.         LSHIFT16 K2, 1
  741.  
  742.         ; d%=K1%-DX
  743.         SUB16 K1, DX, _D
  744. ; -------------------------------------------
  745.         ; y=y0%
  746.         lda Y0
  747.         sta _Y
  748.  
  749.         ; x = x0
  750.         MOVE16 X0, _X
  751. ;-------------------------------------------
  752. ; for x=x0% to x1% step XS%
  753. @X_loop_start
  754.  
  755.         lda _X + 1
  756.         cmp X1 + 1
  757.         bne @X_loop_continue
  758.  
  759.         lda _X
  760.         cmp X1
  761.         bne @X_loop_continue
  762.  
  763.         jmp @Exitline
  764.  
  765. @X_loop_continue
  766.         ; plot
  767.         ldx _Y
  768.         jsr _Plot
  769. ; -------------------------------------------
  770.         ; if d%<0 then x_loop_d0_minus
  771.         lda _D + 1
  772.         bmi @X_loop_d0_minus
  773.  
  774.         ; y = y + YS
  775.         lda YS
  776.         beq @X_loop_Y_inc
  777.  
  778.         DEC8 _Y
  779.         jmp  @X_loop_add_d
  780.  
  781. @X_loop_Y_inc
  782.         inc _Y
  783.  
  784. @X_loop_add_d
  785.         ; d% = d% + K2%
  786.         ADD16 _D, K2, _D
  787.         jmp @X_loop_next
  788.  
  789. @X_loop_d0_minus
  790.         ; d%=d%+K1%
  791.         ADD16 _D, K1, _D
  792. ; -------------------------------------------
  793. @X_loop_next
  794.         ; x = x + XS
  795.         lda XS
  796.         beq @x_loop_next_inc
  797.  
  798.         DEC16 _X
  799.         jmp @X_loop_start
  800.  
  801. @X_loop_next_inc
  802.         INC16 _X
  803.         jmp @X_loop_start
  804. ; -------------------------------------------
  805. @Exitline
  806.         ldx _Y
  807.         jmp _Plot
  808.  
  809. ;********************************************
  810. ;
  811. ;  HCPlotLine
  812. ;
  813. ; COLORPTR - X start
  814. ; XDIST   - X Distance
  815. ; YCOL     - Y Location
  816. ;
  817. ; Plot color memory line
  818. ;
  819. ;********************************************
  820. HCPlotLine
  821.         ; Save start, distance and end
  822.         MOVE16 COLORPTR, StartX
  823.  
  824.         ; get the start byte
  825.         jsr CalcColorByte
  826.  
  827.         MOVE16 XDIST, XD
  828.         INC16 XD
  829.  
  830.         lda StartX
  831.         and #%00000111
  832.         beq @InitLoop
  833.  
  834. ; -------------------------------------------
  835.  
  836.         ; subtract 8 - N from XD
  837.         sta TMP
  838.         sec
  839.         lda #8
  840.         sbc TMP
  841.         sta TMP
  842.         SUB168 XD, TMP, XD
  843.  
  844. ; -------------------------------------------
  845.  
  846.         ; set Color Memory
  847.         ldy #0
  848.         lda Color
  849.         sta (COLORPTR),y
  850.         INC16 COLORPTR
  851.  
  852. ; -------------------------------------------
  853.  
  854.         ; set y to 0
  855. @InitLoop
  856.         ldy #0
  857. @Loop
  858.         lda XD + 1  ; check that there is more to process
  859.                     ; check high byte first
  860.         bne @LoopContinue
  861.         lda XD      ; check low byte is at least 8 pixels
  862.         cmp #08
  863.         bcc @LoopExit
  864.  
  865. ; -------------------------------------------
  866. @LoopContinue
  867.         ; set Color Memory
  868.         lda Color
  869.         sta (COLORPTR),y
  870.         INC16 COLORPTR
  871.  
  872.         ; subtract 8 from distance
  873.         SUB16I XD, 8, XD
  874.         jmp @Loop
  875.  
  876. ; -------------------------------------------
  877. @LoopExit
  878.         ; check for last byte
  879.         lda XD
  880.         beq @Exit
  881.  
  882.         ; set Color Memory
  883.         lda Color
  884.         sta (COLORPTR),y
  885. @Exit
  886.         rts
  887.  
  888. ;********************************************
  889. ;
  890. ;  HGRHorizontalLine
  891. ;
  892. ; CURLOC IN POINTER to bitmap byte
  893. ; XDIST IN x distance
  894. ; X register IN bit in first byte of bitmap
  895. ;
  896. ;********************************************
  897. HGRHorizontalLine
  898.         ; If there are 8 bits to set then we can use bytes
  899.         ; instead of using bits
  900.         ;
  901.         ; set the first potentially partial byte
  902.         ; set x to number of bits in first byte
  903.         lda XDIST + 1  ; load HI byte
  904.         bne @HFirstByte ; if its not 0 then it > 8 bits
  905.         cpx XDIST      ; see if bit is within distance
  906.         bcc @HFirstByte ; yes so we leave x unmodified
  907.         ldx XDIST      ; set x to XDIST
  908.         jmp @HLastByte
  909.  
  910. ;----------------------------------------------
  911. @HFirstByte
  912.         stx  COUNTER     ; save in counter
  913.         lda #0          ; zero out high byte
  914.         sta COUNTER + 1
  915. ;----------------------------------------------
  916.         ; substract COUNTER from distance of first byte
  917.         ; and save in COUNTER
  918.         SUB16 XDIST, COUNTER, COUNTER
  919. ;----------------------------------------------
  920.         ; Plot the first byte
  921.         ldy #0
  922.         lda (CURLOC),y
  923.         ora MaskData,x
  924.         sta (CURLOC),y
  925. ;----------------------------------------------
  926. ; Horizontal Line - Loop
  927. ; here we plot bytes instead of bits
  928. ;----------------------------------------------
  929. @HLoop1
  930.         ; test that there are at least 8 bits to plot
  931.         lda COUNTER + 1 ; get the high byte
  932.         bne @HLoop_Cont ; if its set there are more than 8 bits left
  933.         lda COUNTER     ; load lo byte
  934.         cmp #8          ; compare it to 8
  935.         beq @HLoop1End  ; if it is equal then go to the last byte
  936.         bcs @HLoop_Cont ; continue if > 8
  937.         jmp @HLoop1End  ; less than 8 go to last byte
  938.  
  939. ; -------------------------------------------
  940. @HLoop_Cont             ; add 8 to current pointer
  941.         ADD16I CURLOC, 8, CURLOC
  942.         lda #$FF        ; load a with FF
  943.         sta (CURLOC),y  ; store the byte
  944.  
  945.                         ; Increrment COUNTER by 8
  946.         SUB16I COUNTER, 8, COUNTER
  947.         jmp @HLoop1     ; goto to byte loop
  948.  
  949. ; -------------------------------------------
  950. @HLoop1End
  951.         ldx COUNTER     ; see if there are bits left
  952.         beq @HLoop1EXIT ; if no then exit
  953.  
  954. ;----------------------------------------------
  955. ; Horizontal Lines Last Byte
  956. ;----------------------------------------------
  957.         ADD16I CURLOC, 8, CURLOC
  958. @HLastByte
  959.         lda (CURLOC),y
  960.         ora MaskDataEnd,x
  961.         sta (CURLOC),y
  962. @HLoop1EXIT
  963.         rts
  964.  
  965. ;********************************************
  966. ;
  967. ;  HGRFillRect
  968. ;
  969. ;********************************************
  970. HGRFillRect
  971.         INC16 TXTPTR    ; advance basic textptr
  972.  
  973.         ; get the start position, xdistance and ydistance
  974.  
  975.         jsr GETNUM ; get address in $14/$15 y next integer at X
  976.         jsr RangeCheckXY
  977.  
  978.         stx Y0
  979.         MOVE16 XCOORD, X0
  980.  
  981.         jsr CHKCOM
  982.         jsr GETNUM ; get address in $14/$15 y next integer at X
  983.         jsr RangeCheckXY
  984.  
  985.         stx YDIST
  986.         MOVE16 XCOORD, XDIST
  987.  
  988. ;********************************************
  989. ;
  990. ;  HFillRect
  991. ;
  992. ; X0        -  xstart
  993. ; Y0        -  ystart
  994. ; XDIST     -  xdistance
  995. ; YDIST     -  ydistance
  996. ;
  997. ;********************************************
  998. HFillRect
  999.         ADD8 Y0, YDIST, YMAX
  1000.         ADD16 X0, XDIST, X1
  1001.         lda Y0
  1002.  
  1003. ; -------------------------------------------
  1004. @YLOOP
  1005.         sta Y1
  1006.         jsr _Line2
  1007.  
  1008.         ldy Y0
  1009.         cpy YMAX
  1010.         beq @Exit
  1011.         iny
  1012.         sty Y0
  1013.         jmp @YLOOP
  1014. @Exit
  1015.         rts
  1016.  
  1017. ;********************************************
  1018. ;
  1019. ;  HGRRect
  1020. ;
  1021. ;  Parse Basic text for
  1022. ;  x, y, xdist, ydist
  1023. ;
  1024. ;  Call HRect for to draw rectangle
  1025. ;
  1026. ;********************************************
  1027. HGRRect
  1028.         INC16 TXTPTR    ; advance basic textptr
  1029.  
  1030.         ; get the start position, xdistance and ydistance
  1031.  
  1032.         jsr GETNUM ; get address in $14/$15 y next integer at X
  1033.         jsr RangeCheckXY
  1034.         stx Y0
  1035.         MOVE16 XCOORD, X0
  1036.  
  1037.         jsr CHKCOM
  1038.         jsr GETNUM ; get address in $14/$15 y next integer at X
  1039.         jsr RangeCheckXY
  1040.         stx YDIST
  1041.         MOVE16 XCOORD, XDIST
  1042.  
  1043. ;********************************************
  1044. ;
  1045. ;  HRect
  1046. ;
  1047. ;  X0       - x start
  1048. ;  Y0       - y start
  1049. ;  XDIST    - x distance
  1050. ;  YDIST    - y distance
  1051. ;********************************************
  1052. HRect
  1053.         ADD16 X0, XDIST, XMAX
  1054.         ADD8 Y0, YDIST, YMAX
  1055.  
  1056.         ; ------------------------------
  1057.         ;
  1058.         ; Top Horizontal Line
  1059.         ;
  1060.         ; ------------------------------
  1061.         MOVE16 XMAX, X1
  1062.         MOVE8 Y0, Y1
  1063.         pha
  1064.         jsr _Line2
  1065.  
  1066.         ; ------------------------------
  1067.         ;
  1068.         ; Bottom Horizontal Line
  1069.         ;
  1070.         ; ------------------------------
  1071.         lda YMAX
  1072.         sta Y0
  1073.         sta Y1
  1074.         jsr _Line2
  1075.  
  1076.         ; ------------------------------
  1077.         ;
  1078.         ; Left Vertical Line
  1079.         ;
  1080.         ; ------------------------------
  1081.         MOVE16 X0, X1
  1082.         pla
  1083.         sta Y0
  1084.         jsr _Line
  1085.  
  1086.         ; ------------------------------
  1087.         ;
  1088.         ; Right Vertical Line
  1089.         ;
  1090.         ; ------------------------------
  1091.         MOVE16 XMAX, X0
  1092.         MOVE16 X0, X1
  1093.         jsr _Line
  1094.         rts
  1095.  
  1096. ;********************************************
  1097. ;
  1098. ;  SetCircleJump
  1099. ;
  1100. ;  set routine for circle to plot or fill
  1101. ;
  1102. ;********************************************
  1103. SetCircleJump
  1104.         asl
  1105.         tax
  1106.         lda JumpTable, x
  1107.         sta CIRJUMP
  1108.         inx
  1109.         lda JumpTable, x
  1110.         sta CIRJUMP + 1
  1111.         rts
  1112.  
  1113. ;********************************************
  1114. ;
  1115. ;  JumpCircle
  1116. ;
  1117. ;  SetCircleJump MUST be called first
  1118. ;  This will fill or plot for circles
  1119. ;
  1120. ;********************************************
  1121. JumpCircle
  1122.          jmp (CIRJUMP)
  1123.  
  1124. JumpTable
  1125.         .word PlotCirclePixels
  1126.         .word PlotFillCircle
  1127.  
  1128. ;********************************************
  1129. ;
  1130. ;  HGRFillCircle
  1131. ;
  1132. ;  Fill a circle from BASIC
  1133. ;  x, y, radius
  1134. ;
  1135. ;*******************************************
  1136. HGRFillCircle
  1137.         lda #1
  1138.         jsr SetCircleJump
  1139.         jmp HGRCircle2
  1140.  
  1141. ;********************************************
  1142. ;
  1143. ;  HGRFillCircle
  1144. ;
  1145. ;  Fill a circle from asm
  1146. ;
  1147. ;*******************************************
  1148. HGRFillCircle2
  1149.         lda #1
  1150.         jsr SetCircleJump
  1151.         jmp HGRCircle3
  1152.  
  1153. ;********************************************
  1154. ;
  1155. ;  HGRCircle
  1156. ;
  1157. ;  Parse Basic text for
  1158. ;  x, y, radius
  1159. ;
  1160. ;********************************************
  1161. HGRCircle
  1162.         lda #0
  1163.         jsr SetCircleJump
  1164.  
  1165. HGRCircle2
  1166.         INC16 TXTPTR    ; advance basic textptr
  1167.  
  1168.         ; get the start position, xdistance and ydistance
  1169.  
  1170.         jsr GETNUM ; get address in $14/$15 y next integer at X
  1171.         stx CY
  1172.         MOVE16 XCOORD, CX
  1173.         jsr GETBYTC
  1174.         stx R
  1175.  
  1176.         jsr RangeCheckCircle
  1177.  
  1178. HGRCircle3
  1179.         ; pk = 3 - 2 * r;
  1180.         lda #0
  1181.         sta PK + 1
  1182.         MOVE8 R, PK         ; pk = r
  1183.         LSHIFT16 PK,1       ; pk = r * 2
  1184.         MOVE16I TMP, 3;     ; tmp = 3
  1185.         SUB16 TMP, PK, PK   ; pk = tmp - pk
  1186.  
  1187.         MOVE16I CURX, 0     ; x = 0
  1188.         MOVE8 R, CURY       ; y = r
  1189.  
  1190.         ; PlotPixels(x, y, xc, yc);
  1191.         jsr JumpCircle
  1192.  
  1193. @StartWhile
  1194.         ; while (x < y)
  1195.         lda CURX + 1
  1196.         bne @ContinueWhile
  1197.         lda CURX
  1198.         cmp CURY
  1199.         bcs @Exit
  1200.  
  1201. @ContinueWhile
  1202.         ; if (pk <= 0)
  1203.         lda PK+1
  1204.         bmi @PKLessEqualZero
  1205.         bne @PKGreaterZero
  1206.         lda PK
  1207.         bne @PKGreaterZero
  1208.  
  1209. @PKLessEqualZero
  1210.         ; pk = pk + (4 * x) + 6;
  1211.         MOVE16 CURX, TMP
  1212.         LSHIFT16 TMP, 2
  1213.         ADD16 PK, TMP, PK
  1214.         ADD16I PK, 6, PK
  1215.  
  1216.         ;++x;
  1217.         INC16 CURX
  1218.         jmp @EndWhile
  1219.  
  1220. @PKGreaterZero
  1221.         ; pk = pk + (4 * (x - y)) + 10;
  1222.         SUB168 CURX, CURY, TMP
  1223.         LSHIFT16 TMP, 2
  1224.         ADD16I TMP, 10, TMP
  1225.         ADD16 PK, TMP, PK
  1226.  
  1227.         ; ++x;
  1228.         INC16 CURX
  1229.         ; --y;
  1230.         DEC8 CURY
  1231.  
  1232. @EndWhile
  1233.  
  1234.         ; PlotPixels(x, y, xc, yc);
  1235.         jsr JumpCircle
  1236.         jmp @StartWhile
  1237. @Exit
  1238.         rts
  1239.  
  1240. ;********************************************
  1241. ;
  1242. ;  PlotCirclePixels
  1243. ;
  1244. ;  plot circle pixels
  1245. ;
  1246. ;*******************************************
  1247. PlotCirclePixels
  1248.         ; PutPixel(CX - CURX, CY + CURY);
  1249.         SUB16 CX, CURX, XCOORD
  1250.         ADD8 CY, CURY, Y1
  1251.         tax
  1252.         jsr _Plot
  1253.  
  1254. ;----------------------------------------------
  1255.  
  1256.         ; PutPixel(CX + CURX, CY + CURY);
  1257.         ADD16 CX, CURX, XCOORD
  1258.         ldx Y1
  1259.         jsr _Plot
  1260.  
  1261. ;----------------------------------------------
  1262.  
  1263.         ; PutPixel(CX - CURX,  CY - CURY);
  1264.         SUB16 CX, CURX, XCOORD
  1265.         SUB8 CY, CURY, Y1
  1266.         tax
  1267.         jsr _Plot
  1268.  
  1269. ;----------------------------------------------
  1270.  
  1271.         ; PutPixel(CX + CURX, CY - CURY);
  1272.         ADD16 CX, CURX, XCOORD
  1273.         ldx Y1
  1274.         jsr _Plot
  1275.  
  1276. ;----------------------------------------------
  1277.  
  1278.         ; PutPixel(CX - CURY, CY + CURX);
  1279.         SUB168 CX, CURY, XCOORD
  1280.         ADD8 CY, CURX, Y1
  1281.         tax
  1282.         jsr _Plot
  1283.  
  1284. ;----------------------------------------------
  1285.  
  1286.         ; PutPixel(CX + CURY, CY + CURX);
  1287.         ADD168 CX, CURY, XCOORD
  1288.         ldx Y1
  1289.         jsr _Plot
  1290.  
  1291. ;----------------------------------------------
  1292.  
  1293.         ; PutPixel(CX - CURY, CY - CURX);
  1294.         SUB168 CX, CURY, XCOORD
  1295.         SUB8 CY, CURX, Y1
  1296.         tax
  1297.         jsr _Plot
  1298.  
  1299. ;----------------------------------------------
  1300.  
  1301.         ; PutPixel(CX + CURY, CY - CURX);
  1302.         ADD168 CX, CURY, XCOORD
  1303.         ldx Y1
  1304.         jmp _Plot
  1305.  
  1306. ;********************************************
  1307. ;
  1308. ;  PlotFillCircle
  1309. ;
  1310. ;  fill circle pixels
  1311. ;
  1312. ;*******************************************
  1313. PlotFillCircle
  1314.         ; Line(CX - CURY, CY + CURX) to (CX + CURY, CY + CURX)
  1315.         SUB168 CX, CURY, X0
  1316.         ADD8 CY, CURX, Y0
  1317.         ADD168 CX, CURY, X1
  1318.         MOVE8 Y0, Y1
  1319.         jsr _Line2
  1320.  
  1321. ;----------------------------------------------
  1322.  
  1323.         ; Line (CX - CURY, CY - CURX) to (CX + CURY, CY - CURX)
  1324.         SUB168 CX, CURY, X0
  1325.         SUB8 CY, CURX, Y0
  1326.         ADD168 CX, CURY, X1
  1327.         MOVE8 Y0, Y1
  1328.         jsr _Line2
  1329.  
  1330. ;----------------------------------------------
  1331.  
  1332.         ; Line(CX - CURX, CY + CURY) to (CX + CURX, CY + CURY)
  1333.         SUB16 CX, CURX, X0
  1334.         ADD8 CY, CURY, Y0
  1335.         ADD16 CX, CURX, X1
  1336.         MOVE8 Y0, Y1
  1337.         jsr _Line2
  1338.  
  1339. ;----------------------------------------------
  1340.  
  1341.         ; Line(CX - CURX, CY - CURY) to (CX + CURX, CY - CURY)
  1342.         SUB16 CX, CURX, X0
  1343.         SUB8 CY, CURY, Y0
  1344.         ADD16 CX, CURX, X1
  1345.         MOVE8 Y0, Y1
  1346.         jmp _Line2
  1347.  
  1348. ;********************************************
  1349. ;
  1350. ;  RangeCheckXY
  1351. ;
  1352. ;  Check XCOORD and x range
  1353. ;
  1354. ;*******************************************
  1355. RangeCheckXY
  1356.         cpx # 200
  1357.         bcs RangeError
  1358.        
  1359.         lda XCOORD + 1
  1360.         beq @Exit
  1361.        
  1362.         lda XCOORD
  1363.         cmp # 320 - 256
  1364.         bcs RangeError        
  1365. @Exit
  1366.         rts
  1367. RangeError
  1368.         ldx # ILLEGALQUANITY
  1369.         jmp ERROR
  1370.  
  1371. ;********************************************
  1372. ;
  1373. ;  RangeCheckCircle
  1374. ;
  1375. ;  Range check Circle parameters
  1376. ;
  1377. ;*******************************************
  1378. RangeCheckCircle
  1379.         lda CY
  1380.         cmp R
  1381.         bcc RangeError
  1382.        
  1383.         adc R
  1384.         tax
  1385.  
  1386.         lda CX + 1
  1387.         bne @CheckMax
  1388.        
  1389.         lda CX
  1390.         cmp R
  1391.         bcc RangeError
  1392.        
  1393. @CheckMax        
  1394.         ADD168 CX,R,XCOORD
  1395.         jmp RangeCheckXY
  1396.  
  1397. ;----------------------------------------------
  1398.  
  1399. MaskStart
  1400.         .byte %00000001 ; 0
  1401.         .byte %00000010 ; 1
  1402.         .byte %00000100 ; 2
  1403.         .byte %00001000 ; 3
  1404.         .byte %00010000 ; 4
  1405.         .byte %00100000 ; 5
  1406.         .byte %01000000 ; 6
  1407.         .byte %10000000 ; 7
  1408.  
  1409. MaskData
  1410.         .byte %00000001 ; 0
  1411.         .byte %00000011 ; 1
  1412.         .byte %00000111 ; 2
  1413.         .byte %00001111 ; 3
  1414.         .byte %00011111 ; 4
  1415.         .byte %00111111 ; 5
  1416.         .byte %01111111 ; 6
  1417.         .byte %11111111 ; 7
  1418.  
  1419. MaskDataEnd
  1420.         .byte %00000000 ; 0
  1421.         .byte %10000000 ; 1
  1422.         .byte %11000000 ; 2
  1423.         .byte %11100000 ; 3
  1424.         .byte %11110000 ; 4
  1425.         .byte %11111000 ; 5
  1426.         .byte %11111100 ; 6
  1427.         .byte %11111110 ; 7
  1428.         .byte %11111111 ; 8
  1429.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement