09       .OPT NO LIST
10 ;  SAVE #D1:SCREEN3.M65
20 ;
30 ;
40 ;  LOAD #D1:SCREEN4.M65
50        LIST  
062821 ?DBDDEC LDA #2 Double-byte
062823   BNE ?DBSUB  double decrement
062825 ?TSTFINE LDY FINE Store data for
062828   BEQ ?STORE  fine scrolling
062830   ORA #$20    Set bit 5
062832 ?STORE LDY DSTAT return on error
062834   BMI ?STROK
062836   LDY #0
062838   STA (ADRESS),Y
062840 ?DBDEC LDA #1 Double byte
062842 ?DBSUB STA SUBTMP single dec
062845   LDA DSTAT
062847   BMI ?STROK
062849   LDA ADRESS
062851   SEC 
062852   SBC SUBTMP
062855   STA ADRESS
062857   BCS ?DBSUB1
062859   DEC ADRESS+1
062861 ?DBSUB1 LDA APPMHI+1 Make sure
062863   CMP ADRESS+1 nothing overwrites
062865   BCC ?STROK  appmhi
062867   BNE ?STRERR
062869   LDA APPMHI
062871   CMP ADRESS
062873   BCC ?STROK
062875 ?STRERR LDA #147 Mem too small
062877   STA DSTAT   for screen
062879 ?STROK RTS 
062880 ?SETSCROL LDA #2 Set scrolling
062882   JSR ?STORE  DList entry
062885   LDA #$A2
062887   JSR ?STORE
062890   DEX 
062891   RTS 
062892 ?CONVRT LDX #1 Convert row and
062894   STX MLTTMP  column to real
062896   DEX         address
062897   STX ADRESS+1 Put 5*rowcrsr
062899   LDA ROWCRS  into adress
062901   ASL A
062902   ROL ADRESS+1
062904   ASL A
062905   ROL ADRESS+1
062907   ADC ROWCRS
062909   STA ADRESS
062911   BCC ?CONV1
062913   INC ADRESS+1
062915 ?CONV1 LDY DINDEX Shift Adress keft
062917   LDX DHLINE,Y Dhline times
062920 ?CONV2 ASL ADRESS to finish
062922   ROL ADRESS+1
062924   DEX 
062925   BNE ?CONV2
062927   LDA COLCRS+1 Divide colcrs
062929   LSR A       to account for
062930   LDA COLCRS  partial byte
062932   LDX DIV2TB,Y
062935   BEQ ?CONV3
062937 ?CONV4 ROR A
062938   ASL MLTTMP
062940   DEX 
062941   BNE ?CONV4
062943 ?CONV3 ADC ADRESS
062945   BCC ?CONV5
062947   INC ADRESS+1
062949 ?CONV5 CLC 
062950   ADC SAVMSC
062952   STA ADRESS
062954   STA OLDADR
062956   LDA ADRESS+1
062958   ADC SAVMSC+1
062960   STA ADRESS+1
062962   STA OLDADR+1
062964   LDX DIV2TB,Y
062967   LDA TMSK,X
062970   AND COLCRS
062972   ADC MLTTMP
062974   TAY 
062975   LDA DMASKT-1,Y
062978   STA DMASK
062981   STA SHFAMT
062983   LDY #0
062985 ?INCRS3 RTS 
062986 ?INCRSB LDA #0 Advance cursor
062988   BEQ ?INCRSC routines
062990 ?INCRSR LDA #155
062992 ?INCRSC STA INSDAT
062994 ?INCRSA INC LOGCOL Inschr entry
062996   INC COLCRS
062998   BNE ?INCRS2
063000   INC COLCRS+1
063002 ?INCRS2 LDA COLCRS Test end of line
063004   LDX DINDEX
063006   CMP COLUMN,X
063009   BEQ ?INC2A
063011   CPX #0      Mode 0?
063013   BNE ?INCRS3 No just return
063015   CMP RMARGN  Test against
063017   BEQ ?INCRS3 rmargn. <= is
063019   BCC ?INCRS3 ok
063021 ?INC2A CPX #8 If not mode 8
063023   BNE ?DOCR1  go do it
063025   LDA COLCRS+1 Check high byte
063027   BEQ ?INCRS3 Only at 64, skip it
063029 ?DOCR1 LDA DINDEX Skip logmap
063031   BNE ?DOCR   if not mode 0
063033   LDA LOGCOL  Test line over run
063035   CMP #80+1
063037   BCC ?DOCR1B If less, not line 3
063039   LDA INSDAT  Only do logline overrun if Insdat <>0
063041   BEQ ?DOCR
063043   JSR DOCRWS
063046   JMP ?INCRS1
063049 ?DOCR1B JSR ?DOCR
063052   LDA ROWCRS
063054   CLC         Test logline bitmap
063055   ADC #120
063057   JSR ?BITGET Don't extend if overrun into middle of line
063060   BCC ?DOCR1A
063062   LDA INSDAT  Don't extend if
063064   BEQ ?DOCR1A insdat is 0
063066   CLC         Insert 0 into
063067   JSR ?INSLIA bitmap
063070 ?DOCR1A JMP ?DOLCOL exit
063073 DOCRWS LDA #155 Return with
063075   STA INSDAT  scrolling
063077 ?DOCR JSR ?COLCR
063080   LDA #0      Colcrs to left
063082   STA COLCRS+1
063084   INC ROWCRS
063086   LDX DINDEX
063088   LDY #24     Set up scroll loop count
063090   BIT SWPFLG
063092   BPL ?DOCR2A Go if normal
063094   LDY #4
063096   TYA 
063097   BNE ?DOCR2B Go always
063099 ?DOCR2A LDA NOROWS,X Get number
063102 ?DOCR2B CMP ROWCRS of rows
063104   BNE ?INCRS1
063106   STY HOLD3
063109   TXA         Don't scroll if
063110   BNE ?INCRS1 mode <>0
063112   LDA INSDAT  Or insdat=0
063114   BEQ ?INCRS1
063116   CMP #155    If not a cr then
063118   BEQ ?DOCR4B roll in 0 to extend logline
063120   CLC 
063121 ?DOCR4B JSR SCR Go scroll
063124   INC SCRFLG
063127   DEC BUFSTR  Rows move up so bufstr does too
063129   BPL ?DOCRX
063131   INC BUFSTR
063133 ?DOCRX DEC HOLD3
063136   LDA LOGMAP
063139   SEC         For partial lines roll in a 1
063140   BPL ?DOCR4B Again if partial logline
063142   LDA HOLD3   Place cursor at new line
063145   STA ROWCRS
063147 ?INCRS1 JMP ?DOLCOL
063150 ?SUBEND SEC   Subtract end
063151   LDA ROWAC,X point from
063153   SBC ENDPT   rowac or colac
063155   STA ROWAC,X (x=0 or x=2)
063157   LDA ROWAC+1,X
063159   SBC ENDPT+1
063161   STA ROWAC+1,X
063163   RTS 
063164 ?ERANGE LDA BOTSCR If botscr=4
063167   CMP #4      then in mixed mode
063169   BEQ ?RANGE  and ok
063171   LDA DINDEX  If mode=0 then
063173   BEQ ?RANGE  editor mode and ok
063175   JSR OPEN.E  Else open editor
063178 ?RANGE LDA #39 Verify rmargn
063180   CMP RMARGN  setting
063182   BCS ?RANGE3
063184   STA RMARGN  Bad set to 39
063186 ?RANGE3 LDX DINDEX
063188   LDA NOROWS,X Check rows
063191   CMP ROWCRS
063193   BCC ?RNGERR Error if table is
063195   BEQ ?RNGERR less or equal rowcrs
063197   CPX #8      Check for two byte
063199   BNE ?RANGE1 column (Gr.8)
063201   LDA COLCRS+1
063203   BEQ ?RNGOK  If msb 0 ok
063205   CMP #1
063207   BNE ?RNGERR Err if not 1
063209   BEQ ?RANGE2 If 1 check lsb
063211 ?RANGE1 LDA COLCRS+1 For others
063213   BNE ?RNGERR non-0 msb is err
063215 ?RANGE2 LDA COLUMN,X Check lsb
063218   CMP COLCRS
063220   BCC ?RNGERR
063222   BEQ ?RNGERR
063224 ?RNGOK LDA #1 Status ok
063226   STA DSTAT
063228   LDA #$80    Prepare break abort
063230   LDX BRKKEY  Check brkkey flag
063232   STA BRKKEY  Clear break
063234   BEQ ?RNGER2 Exit if break pressed
063236   RTS 
063237 ?RNGERR JSR HOME Home cursor
063240   LDA #141    Flag range error
063242 ?RNGER2 STA DSTAT
063244   PLA         Restore stack (routine
063245   PLA         always 1 level from cio
063246   LDA SWPFLG  If swapped
063248   BPL ?RETUR3
063250   JMP ?SWAP   swap back
063253 ?RETUR3 JMP STATUS.S
063256 ?OFFCRS LDY #0 Restore old data
063258   LDA OLDADR+1 under cursor
063260   BEQ ?OFFCR2 Screen never on
063262   LDA OLDCHR  page 0
063264   STA (OLDADR),Y
063266 ?OFFCR2 RTS 
063267 BITMAP PHA    Bit map routines
063268   AND #7      for Editor and
063270   TAX         Screen
063271   LDA DMASKT+7,X Get mask
063274   STA BITMSK
063276   PLA         Process index
063277   LSR A
063278   LSR A
063279   LSR A
063280   TAX 
063281   RTS 
063282 ?BITROL ROL LOGMAP+2
063285   ROL LOGMAP+1
063288   ROL LOGMAP
063291   RTS 
063292 ?BITPUT BCC ?BITCLR
063294 ?BITSET JSR BITMAP
063297   LDA TABMAP,X
063300   ORA BITMSK
063302   STA TABMAP,X
063305   RTS 
063306 ?BITCLR JSR BITMAP
063309   LDA BITMSK
063311   EOR #$FF
063313   AND TABMAP,X
063316   STA TABMAP,X
063319   RTS 
063320 ?LOGGET LDA ROWCRS
063322 ?LO1GET CLC 
063323 ?LO2GET ADC #120
063325 ?BITGET JSR BITMAP
063328   CLC 
063329   LDA TABMAP,X
063332   AND BITMSK
063334   BEQ ?BITGE1
063336   SEC 
063337 ?BITGE1 RTS 
063338 ?INATAC LDA CHAR If graphics
063341   LDY DINDEX  modes then
063343   CPY #14     don't change
063345   BCS ?INATA1 character
063347   CPY #12
063349   BCS ?INATA2
063351   CPY #3
063353   BCS ?INATA1
063355 ?INATA2 ROL A
063356   ROL A
063357   ROL A
063358   ROL A
063359   AND #3
063361   TAX 
063362   LDA CHAR
063365   AND #$9F
063367   ORA INTATA,X
063370 ?INATA1 STA ATACHR
063373 ?INARTS RTS 
063374 ?MOVLIN LDX RAMTOP
063376   DEX 
063377   STX SAVADR+1
063379   STX MLTTMP+1
063381   LDA #$B0    point 80 bytes
063383   STA SAVADR  below ramtop
063385   LDA #$D8    point 40 bytes
063387   STA MLTTMP  below ramtop
063389   LDX ROWCRS
063391 ?MOVL1 INX    If at bottom of
063392   CPX BOTSCR  screen, nothing
063395   BEQ ?INARTS more to move
063397   LDY #39
063399 ?MOVL2 LDA (SAVADR),Y Move 40
063401   STA (MLTTMP),Y bytes one line
063403   DEY         up
063404   BPL ?MOVL2
063406   SEC 
063407   LDA SAVADR  Copy from pointer
063409   STA MLTTMP  to dest pointer
063411   SBC #40     and decr from
063413   STA SAVADR  pointer by 40
063415   LDA SAVADR+1
063417   STA MLTTMP+1
063419   SBC #0      Loop until
063421   STA SAVADR+1 bottom of
063423   JMP ?MOVL1  screen
063426 ?EXTEND PHP   Extend log line
063427   LDY #22     from rowcrs
063429 ?EXTEN1 TYA 
063430   JSR ?LO1GET
063433   PHP 
063434   TYA 
063435   CLC 
063436   ADC #121
063438   PLP 
063439   JSR ?BITPUT
063442   DEY 
063443   BMI ?EXTEN4
063445   CPY ROWCRS
063447   BCS ?EXTEN1
063449 ?EXTEN4 LDA ROWCRS
063451   CLC 
063452   ADC #120
063454   PLP 
063455   JMP ?BITPUT Store bit & return
063458 ?CLRLIN LDA LMARGN Clear line
063460   STA COLCRS  cursor is on
063462   JSR ?CONVRT
063465   SEC 
063466   LDA RMARGN
063468   SBC LMARGN
063470   TAY 
063471   LDA #0
063473 ?CLRLI1 STA (ADRESS),Y
063475   DEY 
063476   BPL ?CLRLI1
063478   RTS 
063479 SCR JSR ?BITROL Screen
063482   LDA FINE    scroll routines
063485   BEQ ?SCROL2
063487 ?SCW1 LDA VSFLAG Wait til
063490   BNE ?SCW1   vblank makes this 0
063492   LDA #8      Reset fine
063494   STA VSFLAG  scroll amount
063497 ?SCW2 LDA VSFLAG Wait til
063500   CMP #1      last scan line
063502   BNE ?SCW2   before coarse scroll
063504 ?SCW3 LDA VCOUNT If vcount
063507   CMP #64     below visible
063509   BCS ?SCW3   screen wait for vbi
063511   LDX #13     Assume not text
063513   LDA BOTSCR  window and see
063516   CMP #4      if true
063518   BNE ?SCW4   It is
063520   LDX #112    New top screen posit
063522 ?SCW4 CPX VCOUNT Wait for screen
063525   BCS ?SCW4   redraw
063526 ; Coarse scroll
063527 ?SCROL2 JSR ?PUTMSC Copy savmsc
063530 ?SCROL1 LDA ADRESS to adress
063532   LDX ADRESS+1
063534 ?SCROL3 INX   Last line?
063535   CPX RAMTOP
063537   BEQ ?SCROL4 maybe
063539   SEC 
063540   SBC #16
063542   JMP ?SCROL3
063545 ?SCROL4 ADC #40-1 allow for carry
063547   BNE ?SCROL6
063549   LDX ADRESS+1
063551   INX         Last line?
063552   CPX RAMTOP
063554   BEQ ?SCROL5 yes go do it
063556   CLC 
063557   ADC #16
063559 ?SCROL6 TAY 
063560   STA COUNTR
063562   SEC 
063563   LDA ADRESS
063565   SBC COUNTR
063567   STA ADRESS
063569   BCS ?SCROL7
063571   DEC ADRESS+1
063573 ?SCROL7 LDA ADRESS
063575   CLC 
063576   ADC #40
063578   STA COUNTR
063580   LDA ADRESS+1
063582   ADC #0
063584   STA COUNTR+1
063586 ?SCROL8 LDA (COUNTR),Y
063588   STA (ADRESS),Y
063590   INY 
063591   BNE ?SCROL8
063593   LDY #$10
063595   LDA ADRESS
063597   CMP #$D8
063599   BEQ ?SCROL5
063601   CLC 
063602   ADC #$F0
063604   STA ADRESS
063606   BCC ?SCROL7
063608   INC ADRESS+1
063610   BNE ?SCROL7
063612 ?SCROL5 LDX RAMTOP Do last
063614   DEX         line
063615   STX COUNTR+1
063617   LDX #$D8
063619   STX COUNTR
063621   LDA #0      i.e. clear it
063623   LDY #39
063625 ?SCROL9 STA (COUNTR),Y
063627   DEY 
063628   BPL ?SCROL9
063630 ?DOLCOL LDA #0
063632   STA LOGCOL
063634   LDA ROWCRS
063636   STA HOLD1
063638 ?DOLCO1 LDA HOLD1 add in row
063640   JSR ?LO1GET component
063643   BCS ?DOCOL2 Found beginning
063645   LDA LOGCOL  Add 40 and look back
063647   CLC         one
063648   ADC #40
063650   STA LOGCOL
063652   DEC HOLD1   up one line
063654   JMP ?DOLCO1
063657 ?DOCOL2 CLC   add in colcrs
063658   LDA LOGCOL
063660   ADC COLCRS
063662   STA LOGCOL
063664   RTS 
063665 CBC JSR ?PHACRS Buffer count
063668   LDA LOGCOL  routines
063670   PHA 
063671   LDA BUFSTR
063673   STA ROWCRS
063675   LDA BUFSTR+1
063677   STA COLCRS
063679   LDA #1
063681   STA BUFCNT
063683 ?DOBUF1 LDX #23 normal
063685   LDA SWPFLG  if swapped, row 3
063687   BPL ?DOB1   is last screen line
063689   LDX #3
063691 ?DOB1 CPX ROWCRS Is cursor at
063693   BNE ?DOBU1A last screen posit?
063695   LDA COLCRS
063697   CMP RMARGN
063699   BNE ?DOBU1A
063701   INC BUFCNT  Yes so fake incrsr
063703   JMP ?DOBUF2 to avoid scroll
063706 ?DOBU1A JSR ?INCRSB
063709   INC BUFCNT
063711   LDA LOGCOL
063713   CMP LMARGN
063715   BNE ?DOBUF1 Not yet eol
063717   DEC ROWCRS  Back up one
063719   JSR CRSRLF
063722 ?DOBUF2 JSR ?GETPLT Test curr col
063725   BNE ?DOBUF4 If<>0 quit
063727   DEC BUFCNT  dec counter
063729   LDA LOGCOL  Beginning of log line?
063731   CMP LMARGN
063733   BEQ ?DOBUF4 Yes quit
063735   JSR CRSRLF  Back up cursor
063738   LDA COLCRS  If logcol=rmargn
063740   CMP RMARGN  go up one row
063742   BNE ?DOBUF3
063744   DEC ROWCRS
063746 ?DOBUF3 LDA BUFCNT
063748   BNE ?DOBUF2 loop til 0
063750 ?DOBUF4 PLA 
063751   STA LOGCOL
063753   JMP ?PLACRS
063754 ; Move bufstr to beginning of log line
063756 ?STRBEG JSR ?DOLCOL Set hold1
063759   LDA HOLD1
063761   STA BUFSTR
063763   LDA LMARGN
063765   STA BUFSTR+1
063767 ?STRRTS RTS 
063768 ?DELTIA LDA LOGCOL If logcol<>lmargn
063770   CMP LMARGN  then don't move up
063772   BNE ?DELTIB before testing
063774   DEC ROWCRS
063776 ?DELTIB JSR ?DOLCOL
063777 ; Time to delete a line if it is empty and an extension
063779 ?DELTIM LDA LOGCOL test for extension
063781   CMP LMARGN
063783   BEQ ?STRRTS No
063785   JSR ?CONVRT
063788   LDA RMARGN  Set up count
063790   SEC 
063791   SBC LMARGN
063793   TAY 
063794 ?DELTI1 LDA (ADRESS),Y
063796   BNE ?STRRTS Quit on non-0
063798   DEY 
063799   BPL ?DELTI1
063801   JMP ?DELLIB Delete line, return
