09       .OPT NO LIST
10 ;  SAVE #D1:SCREEN1.M65
20 ;
30 ;
40 ;  LOAD #D1:SCREEN2.M65
50 ;
60 ;  *= $EF6E 07 Oct 94
61       .PAGE "Editor and Screen"
70        LIST  
72       .LOCAL 
80 CHAR  =   COLINC+1
061294 SINIT LDA #$FF Init screen
061296   STA CH
061299   LDA RAMSIZ
061302   STA RAMTOP
061304   LDA #$40    Default upper
061306   STA SHFLOK  case alpha
061309   LDA # <KEYTBL
061311   STA KEYDEF
061313   LDA # >KEYTBL
061315   STA KEYDEF+1
061317   LDA # <FNTBL
061319   STA FKDEF
061321   LDA # >FNTBL
061323   STA FKDEF+1
061325   RTS 
061326 OPEN.S LDA ICAX2Z Screen open
061328   AND #$0F    If mode 0 clear icax1z
061330   BNE ?OPNCOM and inhibit and mixed mode
061332 OPEN.E LDA ICAX1Z Editor open
061334   AND #$0F
061336   STA ICAX1Z
061338   LDA #0
061340 ?OPNCOM STA DINDEX Complete open
061342   CMP #15+1   Check mode
061344   BCC ?INRNG
061346   LDA #145    Bad mode
061348   JMP ?61780
061351 ?INRNG LDA # >CHARSET1 Set up
061353   STA CHBAS   vblank ram
061356   LDA # >CHARSET2
061358   STA CHSALT
061361   LDA #2
061363   STA CHACT
061366   STA SDMCTL  kill dma next vblank
061369   LDA #1      flag success
061371   STA DSTAT
061373   LDA #$C0    enable break key
061375   ORA POKMSK  and key interrupts
061377   STA POKMSK
061379   STA IRQEN
061382   LDA #$40    disable dlis
061384   STA NMIEN
061387   BIT FINE    Fine scroll?
061390   BPL ?NOFINE No
061392   LDA # <FDL  Set dli vector
061394   STA VDSLST
061397   LDA # >FDL
061399   STA VDSLST+1
061402   LDA #$C0    enable dlis
061404 ?NOFINE STA NMIEN
061407   LDA #0
061409   STA TINDEX  text index must be 0
061412   STA ADRESS
061414   STA SWPFLG
061416   STA CRSINH  cursor on
061419   LDY #14     set default tab
061421   LDA #1      stops
061423 ?CLRTAB STA TABMAP,Y
061426   DEY 
061427   BPL ?CLRTAB
061429   LDX #4
061431 ?DOPEN8 LDA COLRTB,X set default
061434   STA COLOR0,X colors
061437   DEX 
061438   BPL ?DOPEN8
061440   LDY RAMTOP  Set text window
061442   DEY         address 160 bytes
061443   STY TXTMSC+1 under ramtop
061446   LDA #$60
061448   STA TXTMSC
061451   LDX DINDEX
061453   LDA ANCONV,X Convert to
061456   STA HOLD1   antic code
061458   LDA RAMTOP
061460   STA ADRESS+1
061462   LDY DSPTBL,X
061465 ?DOPEN1 LDA #40 allocate in
061467   JSR ?DBSUB  blocks of 40 bytes
061470   DEY 
061471   BNE ?DOPEN1
061473   LDA GPRIOR  Clear gtia modes
061476   AND #$3F
061478   STA MLTTMP+1
061480   TAY 
061481   CPX #8      test if 320*1
061483   BCC ?NOT8
061485   CPX #15
061487   BEQ ?MODE15
061489   CPX #12
061491   BCS ?NOT8
061493   TXA         Get two low bits
061494   ROR A
061495   ROR A
061496   ROR A
061497   AND #$C0    Now two top bits
061499   ORA MLTTMP+1
061501   TAY 
061502 ?MODE15 LDA #16 Subtract 16 more
061504   JSR ?DBSUB  for page boundary
061507   CPX #11
061509   BNE ?NOT8
061511   LDA #6      Mode=11 put gtia lum
061513   STA COLOR4  value into bakground
061516 ?NOT8 STY GPRIOR Store priority
061519   LDA ADRESS  Save memory scan
061521   STA SAVMSC  counter address
061523   LDA ADRESS+1
061525   STA SAVMSC+1
061527 ?VBWAIT LDA VCOUNT wait for next
061530   CMP #$7A    vblank before playing
061532   BNE ?VBWAIT with dlist
061534   JSR ?DBDEC  Start d/l right under ram
061537   LDA PAGETB,X test if d/l might cross page boundary
061540   BEQ ?NOMOD
061542   LDA #$FF    If so drop down
061544   STA ADRESS  a page
061546   DEC ADRESS+1
061548 ?NOMOD JSR ?DBDDEC Double byte double dec
061551   LDA ADRESS  Save d/l end
061553   STA SAVADR  for later
061555   LDA ADRESS+1
061557   STA SAVADR+1
061559   LDA #$41    Antic JVB
061561   JSR ?STORE
061564   STX MLTTMP
061566   LDA #24     Init bottom of
061568   STA BOTSCR  screen
061571   LDA DINDEX
061573   CMP #12
061575   BCS ?TSTMOD
061577   CMP #9      Disallow mixed
061579   BCS ?NOTMXD if Gr 9-11
061581 ?TSTMOD LDA ICAX1Z Test mixed
061583   AND #$10    mode
061585   BEQ ?NOTMXD
061587   LDA #4
061589   STA BOTSCR  Add 4 text lines
061592   LDX #2      at bottom
061594   LDA FINE
061597   BEQ ?NOTFIN
061599   JSR ?SETSCROL Set scrolling dk entry
061602 ?NOTFIN LDA #2
061604   JSR ?TSTFINE
061607   DEX 
061608   BPL ?NOTFIN
061610   LDY RAMTOP  Reload msc
061612   DEY         for text
061613   TYA 
061614   JSR ?STORE
061617   LDA #$60
061619   JSR ?STORE
061622   LDA #$42    Antic LMS
061624   JSR ?TSTFINE
061627   CLC 
061628   LDA #16
061630   ADC MLTTMP
061632   TAY 
061633   LDX NUMDLE,Y
061636   BNE ?DOPEN3 Go always
061638 ?NOTMXD LDY MLTTMP
061640   LDX NUMDLE,Y
061643   LDA DINDEX
061645   BNE ?DOPEN3
061647   LDA FINE
061650   BEQ ?DOPEN3
061652   JSR ?SETSCROL
061655   LDA #$22
061657   STA HOLD1
061659 ?DOPEN3 LDA HOLD1 Store number
061661   JSR ?STORE  of dl entries
061664   DEX 
061665   BNE ?DOPEN3
061667   LDA DINDEX  Do the 320*1
061669   CMP #8      problem
061671   BCC ?DOPEN5
061673   CMP #15
061675   BEQ ?FIXSCAN
061677   CMP #12
061679   BCS ?DOPEN5
061681 ?FIXSCAN LDX #93 Get remaining
061683   LDA RAMTOP  number of dle's
061685   SEC         reload memory scan
061686   SBC #$10
061688   JSR ?STORE
061691   LDA #0
061693   JSR ?STORE
061696   LDA HOLD1
061698   ORA #$40    Add LMS bit
061700   JSR ?STORE
061703 ?DOPEN4 LDA HOLD1
061705   JSR ?STORE
061708   DEX 
061709   BNE ?DOPEN4
061711 ?DOPEN5 LDA SAVMSC+1 Finish off
061713   JSR ?STORE  dlist
061716   LDA SAVMSC
061718   JSR ?STORE
061721   LDA HOLD1
061723   ORA #$40
061725   JSR ?STORE
061728   LDA #$70    24 blank lines
061730   JSR ?STORE
061733   LDA #$70
061735   JSR ?STORE
061738   LDA ADRESS  Save dl address
061740   STA SDLSTL
061743   LDA ADRESS+1
061745   STA SDLSTH
061748   LDA #$70    Add last blank
061750   JSR ?STORE  line entry
061753   LDA ADRESS  Position address=sdlst-1
061755   STA MEMTOP
061758   LDA ADRESS+1
061760   STA MEMTOP+1
061763   LDY #1
061765   LDA SDLSTL
061768   STA (SAVADR),Y
061770   INY 
061771   LDA SDLSTH
061774   STA (SAVADR),Y
061776   LDA DSTAT   If error on allocation open the ed
061778   BPL ?DOPEN9
061780 ?61780 STA DERRF open E:
061783   JSR OPEN.E
061786   LDA DERRF
061789   LDY #0
061791   STY DERRF
061794   TAY         Return status
061795   RTS 
061796 ?DOPEN9 LDA ICAX1Z Test clear
061798   AND #$20    inhibit bit
061800   BNE ?DOPEN7
061802   JSR CLRSCR  Clear screen
061805   STA TXTROW  Home cursor a=0
061808   LDA LMARGN
061810   STA TXTCOL
061813 ?DOPEN7 LDA #34 Everything set
061815   ORA SDMCTL  enable dma
061818   STA SDMCTL
061821   JMP ?RETUR2
061822 ; Screen get byte
061824 GET.S JSR ?RANGE Does incrsr
061827   JSR ?GETPLT getplt doesn't
061830   JSR ?INATAC Internal to Atascii
061833   JSR ?INCRSB
061836   JMP STATUS.S
061837 ; Get data under cursor
061839 ?GETPLT JSR ?CONVRT conv row/col to address
061842   LDA (ADRESS),Y
061844   AND DMASK
061847 ?SHIFTD LSR SHFAMT Shift data
061849   BCS ?SHIFT1 down to low bits
061851   LSR A
061852   BPL ?SHIFTD Go always
061854 ?SHIFT1 STA CHAR
061857   CMP #0      Restore flags
061859   RTS 
061860 PUT.S STA ATACHR Screen put-
061863   CMP #125    byte routine
061865   BNE ?NOCLS
061867   JSR CLRSCR  Clear screen
061870   JMP ?RETUR2
061873 ?NOCLS JSR ?RANGE Check end
061876 ?OUTCHA LDA ATACHR of line
061879   CMP #155
061881   BNE ?OUTCHB
061883   JSR DOCRWS  Do cr
061886   JMP ?RETUR2
061889 ?OUTCHB JSR ?OUTPLT
061892   JSR ?INCRSR
061895   JMP ?RETUR2
061898 ?OUTPLT LDA SSFLAG Plot point
061901   BNE ?OUTPLT
061903   LDX #2
061905 ?CRLOOP LDA ROWCRS,X Save cursor
061907   STA OLDROW,X loc for draw line
061909   DEX 
061910   BPL ?CRLOOP
061912   LDA ATACHR  Convert atascii
061915   TAY         to internal
061916   ROL A
061917   ROL A
061918   ROL A
061919   ROL A
061920   AND #3
061922   TAX         x=index
061923   TYA         restore atascii
061924   AND #$9F    strip column address
061926   ORA ATAINT,X
061929 ?OUTCH2 STA CHAR Display
061932   JSR ?CONVRT
061935   LDA CHAR
061938 ?SHIFTU LSR SHFAMT Shift up to
061940   BCS ?SHIFT2 proper position
061942   ASL A
061943   JMP ?SHIFTU
061946 ?SHIFT2 AND DMASK Save shifted
061949   STA TMPCHR  data
061951   LDA DMASK   invert mask
061954   EOR #$FF    Mask off old data
061956   AND (ADRESS),Y
061958   ORA TMPCHR  or in new data
061960   STA (ADRESS),Y
061962   RTS 
061963 ?RETUR2 JSR ?GETPLT Do cursor
061966   STA OLDCHR  on the way out
061968   LDX DINDEX  Graphics have
061970   BNE STATUS.S invisible cursor
061972   LDX CRSINH  Test cursor
061975   BNE STATUS.S off
061977   EOR #$80    Toggle msb and
061979   JSR ?OUTCH2 display it
061982 STATUS.S LDY DSTAT Screen
061984   JMP ?STAT2  status and exit
061987 BYE JMP JSLFTST to match blackbd vector
061990 ?STAT2 LDA #1
061992   STA DSTAT
061994   LDA ATACHR  Return character
061997 JUSTRTS RTS   Editor Special
061998 CLOSE.E BIT FINE Editor Close
062001   BPL STATUS.S Go if fast scroll
062003   LDA #$40    disable dli/nmi
062005   STA NMIEN
062008   LDA #0      Clear flag
062010   STA FINE
062013   LDA # <RTI  Point vdslst to
062015   STA VDSLST  an rti
062018   LDA # >RTI
062020   STA VDSLST+1
062023   JMP OPEN.E
062026 GETCHAR JSR ?SWAP Editor
062029   JSR ?ERANGE ; Get-byte
062032   LDA BUFCNT  Anything in buffer?
062034   BNE ?EGETC3 Yes
062036   LDA ROWCRS  Save buffer
062038   STA BUFSTR  start address
062040   LDA COLCRS
062042   STA BUFSTR+1
062044 ?EGETC1 JSR KGB Fill buffer
062047   STY DSTAT   save status
062049   LDA ATACHR  Test for cr
062052   CMP #155
062054   BEQ ?EGETC2
062056   JSR ?DOSS   Not cr, so print it
062059   JSR ?SWAP   previous sub swapped
062062   LDA LOGCOL  Beep if nearing
062064   CMP #113    column 120
062066   BNE ?EGETC6
062068   JSR BELL
062071 ?EGETC6 JMP ?EGETC1
062074 ?EGETC2 JSR ?OFFCRS Get buffer count
062077   JSR CBC
062080   LDA BUFSTR  Return a character
062082   STA ROWCRS
062084   LDA BUFSTR+1
062086   STA COLCRS
062088 ?EGETC3 LDA BUFCNT
062090   BEQ ?EGETC5
062092 ?EGETC7 DEC BUFCNT Return until 0
062094   BEQ ?EGETC5
062096   LDA DSTAT   If err, loop til
062098   BMI ?EGETC7 byffer empty
062100   JSR GET.S
062103   STA ATACHR
062106   JMP ?SWAP   return without enabling cursor
062109 ?EGETC5 JSR DOCRWS Do real cr
062112   LDA #155    and return eol
062114   STA ATACHR
062117   JSR ?RETUR2 enable cursor then swap
062120   STY DSTAT   save keyboard status
062122   JMP ?SWAP   and exit via ?retur1
062125 ?JSRIND JMP (ADRESS) Indirect subroutine
062128 OUTCHAR STA ATACHR Editor
062131   JSR ?SWAP   ;  Put-byte
062134   JSR ?ERANGE
062137   LDA #0
062139   STA SUPERF
062142 ?DOSS JSR ?OFFCRS Cursor off
062145   JSR ?TSTCTL Test control
062148   BEQ ?EOUTC5
062150 ?EOUTC6 ASL ESCFLG Escflg only works once
062153   JSR ?OUTCHA output
062156   JMP ?SWAP   and exit
062159 ?EOUTC5 LDA DSPFLG Do dsp and esc flags
062162   ORA ESCFLG  if non-0, display
062165   BNE ?EOUTC6 instead of execute
062167   ASL ESCFLG  Process controls
062170   INX 
062171   LDA SUPERF  Check for fn keys
062174   BEQ ?DOCTL
062176   TXA         Add offset for
062177   CLC         shifted fn
062178   ADC #45     keys
062180   TAX 
062181 ?DOCTL LDA CNTRLS,X Set up for
062184   STA ADRESS  indirect subrtn
062186   LDA CNTRLS+1,X
062189   STA ADRESS+1
062191   JSR ?JSRIND Do it
062194   JSR ?RETUR2 Do cursor
062197   JMP ?SWAP   Exit
062198 ; end screen editor
