09       .OPT NO LIST
10 ;  SAVE #D1:SCREEN4.M65
20 ;
30 ;
40 ;  LOAD #D1:STABLE2.M65
50        LIST  
063804 ?TSTCTL LDX #45 Check for
063806 ?TSTCT1 LDA CNTRLS,X control
063809   CMP ATACHR  character
063812   BEQ ?TSTCT2
063814   DEX 
063815   DEX 
063816   DEX 
063817   BPL ?TSTCT1
063819 ?TSTCT2 RTS 
063820 ?PHACRS LDX #2 Save row/column
063822 ?PHACR1 LDA ROWCRS,X values
063824   STA TMPROW,X
063827   DEX 
063828   BPL ?PHACR1
063830   RTS 
063831 ?PLACRS LDX #2 Restore row
063833 ?PLACR1 LDA TMPROW,X and column
063836   STA ROWCRS,X
063838   DEX 
063839   BPL ?PLACR1
063841   RTS 
063842 ?SWAP LDA BOTSCR Swap cursor
063845   CMP #24     with regular
063847   BEQ ?SWAP3  cursor position
063849   LDX #11
063851 ?SWAP1 LDA ROWCRS,X
063853   PHA 
063854   LDA TXTROW,X
063857   STA ROWCRS,X
063859   PLA 
063860   STA TXTROW,X
063863   DEX 
063864   BPL ?SWAP1
063866   LDA SWPFLG
063868   EOR #$FF
063870   STA SWPFLG
063872 ?SWAP3 JMP STATUS.S
063875 CLICK LDX #126 Sound key
063877   PHA         click
063878 ?CLICK1 STX CONSOL
063881   LDA VCOUNT
063884 ?CLICK2 CMP VCOUNT wait for
063887   BEQ ?CLICK2 scan line
063889   DEX 
063890   DEX 
063891   BPL ?CLICK1
063893   PLA 
063894   RTS 
063895 ?COLCR LDA #0 Set cursor at
063897   LDX SWPFLG  left edge
063899   BNE ?COLCR1
063901   LDX DINDEX
063903   BNE ?COLCR2
063905 ?COLCR1 LDA LMARGN
063907 ?COLCR2 STA COLCRS
063909   RTS 
063910 ?PUTMSC LDA SAVMSC Set memory
063912   STA ADRESS  scan counter
063914   LDA SAVMSC+1 address
063916   STA ADRESS+1
063918   RTS 
063919 SPECIAL.S LDX #0 Exec screen
063921   LDA ICCOMZ  special command
063923   CMP #17     If not draw to
063925   BEQ ?DRAWA
063927   CMP #18     or fill
063929   BEQ ?DRAWB  then
063931   LDY #132    xio syntax err
063933   RTS 
063934 ?DRAWB INX 
063935 ?DRAWA STX FILFLG
063938   LDA ROWCRS  Put cursor posit
063940   STA NEWROW  into newrow/col
063943   LDA COLCRS
063945   STA NEWCOL
063948   LDA COLCRS+1
063950   STA NEWCOL+1
063953   LDA #1      Set initial
063955   STA ROWINC  directions
063958   STA COLINC
063961   SEC 
063962   LDA NEWROW  Determine delta row
063965   SBC OLDROW
063967   STA DELTAR
063969   BCS ?DRAW1  Do direction and absolute value
063971   LDA #$FF    Borrow attempted
063973   STA ROWINC  Set direction down
063976   LDA DELTAR  Negate delta rows
063978   EOR #$FF    to get absolute
063980   CLC         value
063981   ADC #1
063983   STA DELTAR
063985 ?DRAW1 SEC    Now delta columns
063986   LDA NEWCOL
063989   SBC OLDCOL
063991   STA DELTAC
063993   LDA NEWCOL+1 Two byte value
063996   SBC OLDCOL+1
063998   STA DELTAC+1
064000   BCS ?DRAW2  direction and absolute value
064002   LDA #$FF    Borrow attempted
064004   STA COLINC  Reverse direction
064007   LDA DELTAC  and set absolute
064009   EOR #$FF    value
064011   STA DELTAC
064013   LDA DELTAC+1
064015   EOR #$FF
064017   STA DELTAC+1
064019   INC DELTAC
064021   BNE ?DRAW2
064023   INC DELTAC+1
064025 ?DRAW2 LDX #2 Zero ram for
064027   LDY #0      draw loop
064029   STY COLAC+1
064031 ?DRAW3A TYA 
064032   STA ROWAC,X
064034   LDA OLDROW,X
064036   STA ROWCRS,X
064038   DEX 
064039   BPL ?DRAW3A
064041   LDA DELTAC  Find larger of row or col
064043   INX         x=0
064044   TAY 
064045   LDA DELTAC+1
064047   STA COUNTR+1
064049   STA ENDPT+1
064051   BNE ?DRAW3  larger if msb>0
064053   LDA DELTAC  low col > low row?
064055   CMP DELTAR
064057   BCS ?DRAW3  yes
064059   LDA DELTAR
064061   LDX #2
064063   TAY 
064064 ?DRAW3 TYA    Put in initial
064065   STA COUNTR  conditions
064067   STA ENDPT
064069   PHA         save a
064070   LDA ENDPT+1 put bit0 of hibyte
064072   LSR A       into carry
064073   PLA         restore a
064074   ROR A       now a 9-bit ror
064075   STA ROWAC,X
064077 ?DRAW4A LDA COUNTR test 0
064079   ORA COUNTR+1
064081   BNE ?DRAW11
064083   JMP ?DRAW10 if 0 leave draw
064086 ?DRAW11 CLC   add row to rowac
064087   LDA ROWAC   (plot loop)
064089   ADC DELTAR
064091   STA ROWAC
064093   BCC ?DRAW5
064095   INC ROWAC+1
064097 ?DRAW5 LDA ROWAC+1 Compare rowac
064099   CMP ENDPT+1 to endpoint
064101   BCC ?DRAW6  If less go to column
064103   BNE ?DRAW5A
064105   LDA ROWAC   Ditto for low byte
064107   CMP ENDPT
064109   BCC ?DRAW6
064111 ?DRAW5A CLC   Greater or equal
064112   LDA ROWCRS  so move point
064114   ADC ROWINC
064117   STA ROWCRS
064119   LDX #0      and subtract end point
064121   JSR ?SUBEND from rowac
064124 ?DRAW6 CLC    same for column
064125   LDA COLAC   (double byte add)
064127   ADC DELTAC
064129   STA COLAC
064131   LDA COLAC+1
064133   ADC DELTAC+1
064135   STA COLAC+1
064137   CMP ENDPT+1 Compare hi byte
064139   BCC ?DRAW8
064141   BNE ?DRAE6A
064143   LDA COLAC   Compare lo byte
064145   CMP ENDPT
064147   BCC ?DRAW8
064149 ?DRAE6A BIT COLINC
064152   BPL ?DRAW6B
064154   DEC COLCRS  Do double byte
064156   LDA COLCRS  decrement
064158   CMP #$FF
064160   BNE ?DRAW7
064162   LDA COLCRS+1
064164   BEQ ?DRAW7  Don't dec if 0
064166   DEC COLCRS+1
064168   BPL ?DRAW7  Go always
064170 ?DRAW6B INC COLCRS Double byte
064172   BNE ?DRAW7  increment
064174   INC COLCRS+1
064176 ?DRAW7 LDX #2 Subtract endpt
064178   JSR ?SUBEND from colac
064181 ?DRAW8 JSR ?RANGE
064184   JSR ?OUTPLT plot point
064187   LDA FILFLG  test right fill
064190   BEQ ?DRAW9
064192   JSR ?PHACRS
064195   LDA ATACHR
064198   STA HOLD4
064201 ?DRAW8A LDA ROWCRS Save row in
064203   PHA         case of cr
064204   JSR ?INCRSA posit cursor one past dot
064207   PLA         restore rowcrs
064208   STA ROWCRS
064210   JSR ?RANGE
064213   JSR ?GETPLT get data
064216   BNE ?DRAW8B stop if non-0
064218   LDA FILDAT  fill data
064221   STA ATACHR
064224   JSR ?OUTPLT draw it
064227   JMP ?DRAW8A loop
064230 ?DRAW8B LDA HOLD4
064233   STA ATACHR
064236   JSR ?PLACRS
064239 ?DRAW9 SEC    double byte subtract
064240   LDA COUNTR
064242   SBC #1
064244   STA COUNTR
064246   LDA COUNTR+1
064248   SBC #0
064250   STA COUNTR+1
064252   BMI ?DRAW10
064254   JMP ?DRAW4A
064257 ?DRAW10 JMP STATUS.S
