home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / ACE-R11-SCR1.ARC / ACECON.S < prev    next >
Encoding:
Text File  |  2019-04-13  |  28.2 KB  |  1,740 lines

  1. ;┴├┼-128/64 KERNEL CONSOLE DRIVER: HIGH LEVEL ╔/╧ & KEYBOARD
  2.  
  3. CON╫IN╙TART  .BUF 2
  4. CON╫IN╥OWS   .BUF 1
  5. CON╫IN├OLS   .BUF 1
  6. CON╥OW╔NC    .BUF 2
  7. CON╠INE┴DDR  .BUF 2
  8. CON├UR╥OW    .BUF 1
  9. CON├UR├OL    .BUF 1
  10.  
  11. CON╨UT═ASK   .BYTE $80  ;.BUF 1
  12. CON├HAR├OLOR .BYTE $0E  ;.BUF 1
  13. CON├URSOR├OLOR .BYTE $07 ;.BUF 1
  14. CON╔GNORE├TRL .BYTE $00
  15.  
  16. KEYLINE╬EXT  = KEYLINE┬UF+0  ;(3)
  17. KEYLINE╨REV  = KEYLINE┬UF+3  ;(3)
  18. KEYLINE╠EN   = KEYLINE┬UF+6  ;(1)
  19. KEYLINE╞LAGS = KEYLINE┬UF+7  ;(1)
  20. KEYLINE      = KEYLINE┬UF+8  ;(248)
  21. KEYLINE═AX   = 248
  22.  
  23. KEYLINE╨TR   .BUF 1
  24. KEYLINE╨OS   .BUF 1
  25. KEYLINE├OUNT .BUF 1
  26.  
  27. .IF COMPUTER-64
  28.    SHIFT╓ALUE = $D3
  29. .ELSE
  30.    SHIFT╓ALUE = $28D
  31. .IFE
  32.  
  33. CON╔NIT╠INE╬UM .BUF 1
  34. CON╚ISTBUF╙CAN╨TR .BUF 4
  35. CON╚ISTBUF╥EPLACE╨TR .BUF 4
  36. CON╔NIT╨REV = SYSWORK+4
  37.  
  38. CON╔NIT = *
  39.    LDA CONFIG┬UF+$8E
  40.    STA CON╙S═AX
  41.    STA CON╙S├OUNTDOWN
  42.    LDA #0
  43.    STA KEYLINE├OUNT
  44.    JSR KEYSCAN╔NIT
  45.    LDA #ACE═EM╬ULL
  46.    STA CON╚ISTBUF╙CAN╨TR+3
  47.    STA CON╚ISTBUF╥EPLACE╨TR+3
  48.    STA CON╔NIT╨REV+3
  49.    LDA #$00
  50.    STA CON╔NIT╨REV+0
  51.    LDA CONFIG┬UF+$CB
  52.    BNE +
  53.    JMP CON╫IN╔NIT
  54. +  STA CON╔NIT╠INE╬UM
  55.  
  56.    CON╔NIT╬EXT = *
  57.    LDA CON╔NIT╠INE╬UM
  58.    BNE +
  59.    JMP CON╔NIT├LEAN╚IST
  60. +  LDA #1
  61.    LDX #$00  ;XXX GO FOR THE SLOW
  62.    LDY #$FF
  63.    JSR PAGEALLOC
  64.    BCS CON╔NIT├LEAN╚IST
  65.    ;** CHECK FIRST LINE
  66.    LDA CON╚ISTBUF╥EPLACE╨TR+3
  67.    CMP #ACE═EM╬ULL
  68.    BNE +
  69.    LDX #3
  70. -  LDA MP,X
  71.    STA CON╚ISTBUF╥EPLACE╨TR,X
  72.    DEX
  73.    BPL -
  74.    ;** INITIALIZE LINE
  75. +  LDX #2
  76. -  LDA CON╚ISTBUF╥EPLACE╨TR+1,X
  77.    STA KEYLINE╬EXT,X
  78.    LDA CON╔NIT╨REV+1,X
  79.    STA KEYLINE╨REV,X
  80.    LDA MP+1,X
  81.    STA CON╔NIT╨REV+1,X
  82.    DEX
  83.    BPL -
  84.    LDA #0
  85.    STA KEYLINE╠EN
  86.    STA KEYLINE╞LAGS
  87.    ;** STORE NEW LINE
  88.    LDA #<KEYLINE┬UF
  89.    LDY #>KEYLINE┬UF
  90.    STA ZP+0
  91.    STY ZP+1
  92.    LDA #9
  93.    LDY #0
  94.    JSR STASH
  95.    ;** LINK PREVIOUS LINE'S NEXT POINTER
  96.    LDX #2
  97. -  LDA KEYLINE╨REV,X
  98.    STA MP+1,X
  99.    DEX
  100.    BPL -
  101.    LDA #$00
  102.    STA MP+0
  103.    LDX #CON╔NIT╨REV+1
  104.    LDY #3
  105.    JSR ZPSTORE
  106.    ;** GO ON TO NEXT LINE
  107.    DEC CON╔NIT╠INE╬UM
  108.    JMP CON╔NIT╬EXT
  109.  
  110.    CON╔NIT├LEAN╚IST = *
  111.    LDA CON╚ISTBUF╥EPLACE╨TR+3
  112.    CMP #ACE═EM╬ULL
  113.    BEQ CON╫IN╔NIT
  114.    ;** LINK FIRST LINE'S PREV PTR TO LAST LINE
  115.    LDX #3
  116. -  LDA CON╚ISTBUF╥EPLACE╨TR,X
  117.    STA MP,X
  118.    DEX
  119.    BPL -
  120.    LDA #$03
  121.    STA MP+0
  122.    LDX #CON╔NIT╨REV+1
  123.    LDY #3
  124.    JSR ZPSTORE
  125.    ;XX FALL THROUGH
  126.  
  127. CON╫IN╔NIT = *
  128.    JSR CON╫IN╨ARMS
  129.    JMP CON├LS
  130.  
  131. CON╫IN╨ARMS = *
  132.    JSR WINSIZE
  133.    STA CON╫IN╥OWS
  134.    STX CON╫IN├OLS
  135.    LDA SYSWORK+2
  136.    LDY SYSWORK+3
  137.    STA CON╫IN╙TART+0
  138.    STY CON╫IN╙TART+1
  139.    LDA SYSWORK+4
  140.    LDY SYSWORK+5
  141.    STA CON╥OW╔NC+0
  142.    STY CON╥OW╔NC+1
  143.    RTS
  144.  
  145. CON├LS = *
  146.    LDA #$E0
  147.    LDX #" "
  148.    LDY CON├HAR├OLOR
  149.    JSR WINCLS
  150.    JSR CON╚OME
  151.    RTS
  152.  
  153. CON╙HUTDOWN = *
  154.    RTS
  155.  
  156. CON╫IN├HANGE├ALLBACK = *
  157.    JSR CON╫IN╨ARMS
  158.    JMP CON╚OME
  159.    RTS
  160.  
  161. CON╚OME = *
  162.    LDA CON╫IN╙TART+0
  163.    LDY CON╫IN╙TART+1
  164.    STA CON╠INE┴DDR+0
  165.    STY CON╠INE┴DDR+1
  166.    LDA #0
  167.    STA CON├UR╥OW
  168.    STA CON├UR├OL
  169.    RTS
  170.  
  171. CON╨UT╙AVE .BUF 1
  172.  
  173. CON╨UTCHAR = *  ;( .┴=CHAR )
  174.    CMP #CHR├╥
  175.    BEQ CON╬EWLINE
  176.    CMP #CHR├╠╥
  177.    BEQ CON├LS
  178.    CMP #CHR╘┴┬
  179.    BNE +
  180.    JMP CON╘AB
  181. +  CMP #CHR┬╙
  182.    BNE +
  183.    JMP CON┬ACKSPACE
  184. +  CMP #CHR┬┼╠
  185.    BNE +
  186.    JMP CON┬ELL
  187. +  CMP #CHR╠╞
  188.    BNE CON╨UTCHAR╠IT
  189.    JMP CON╠INEFEED
  190.  
  191.    CON╨UTCHAR╠IT = *  ;( .┴=CHAR )
  192.    STA CON╨UT╙AVE
  193.    LDA CON├UR├OL
  194.    CMP CON╫IN├OLS
  195.    BCC +
  196.    JSR CON╬EWLINE
  197. +  CLC
  198.    LDA CON╠INE┴DDR+0
  199.    ADC CON├UR├OL
  200.    STA SYSWORK+0
  201.    LDA CON╠INE┴DDR+1
  202.    ADC #0
  203.    STA SYSWORK+1
  204.    LDA #<CON╨UT╙AVE
  205.    LDY #>CON╨UT╙AVE
  206.    STA SYSWORK+2
  207.    STY SYSWORK+3
  208.    LDX #1
  209.    STX SYSWORK+5
  210.    LDA CON╨UT═ASK
  211.    LDY CON├HAR├OLOR
  212.    JSR WINPUT
  213.    INC CON├UR├OL
  214.    RTS
  215.  
  216. CON╟ET├URSOR┴DDR = *
  217.    CLC
  218.    LDA CON╠INE┴DDR+0
  219.    ADC CON├UR├OL
  220.    STA SYSWORK+0
  221.    LDA CON╠INE┴DDR+1
  222.    ADC #0
  223.    STA SYSWORK+1
  224.    RTS
  225.  
  226. CON╙YNCH├URSOR = *
  227.    LDA CON├UR├OL
  228.    CMP CON╫IN├OLS
  229.    BCC +
  230.    JSR CON╬EWLINE
  231. +  RTS
  232.  
  233. CON╬EWLINE = *
  234.    LDA CON╔GNORE├TRL
  235.    BMI +
  236. -  LDA SHIFT╓ALUE
  237.    AND #$0F
  238.    CMP #$04
  239.    BEQ -
  240.    LDA SCROLL╞REEZE
  241.    BNE -
  242. +  LDA #0
  243.    STA CON├UR├OL
  244.    INC CON├UR╥OW
  245.    LDA CON├UR╥OW
  246.    CMP CON╫IN╥OWS
  247.    BCS +
  248.    CLC
  249.    LDA CON╠INE┴DDR+0
  250.    ADC CON╥OW╔NC+0
  251.    STA CON╠INE┴DDR+0
  252.    LDA CON╠INE┴DDR+1
  253.    ADC CON╥OW╔NC+1
  254.    STA CON╠INE┴DDR+1
  255.    CLC
  256.    RTS
  257. +  DEC CON├UR╥OW
  258.    JSR CON╙CROLL
  259.    CLC
  260.    RTS
  261.  
  262. CON╙CROLL = *
  263.    LDA #20
  264.    STA SCROLL├OUNTDOWN
  265. -  LDA SHIFT╓ALUE
  266.    AND #%10
  267.    BEQ +
  268.    CLI
  269.    LDA SCROLL├OUNTDOWN
  270.    BNE -
  271. +  LDA #" "
  272.    STA SYSWORK+4
  273.    LDA CON╨UT═ASK
  274.    ORA #$08
  275.    LDX #1
  276.    LDY CON├HAR├OLOR
  277.    JSR WINSCROLL
  278.    RTS
  279.  
  280. CON╘AB = *
  281.    LDA CON├UR├OL
  282.    AND #7
  283.    STA SYSWORK+0
  284.    SEC
  285.    LDA #8
  286.    SBC SYSWORK+0
  287.    CLC
  288.    ADC CON├UR├OL
  289.    CMP CON╫IN├OLS
  290.    BCC +
  291.    LDA CON╫IN├OLS
  292. +  STA CON├UR├OL
  293.    RTS
  294.  
  295. CON╠INEFEED = *
  296.    LDA #0
  297.    STA CON├UR├OL
  298.    RTS
  299.  
  300. CON┬ELL = *
  301.    LDA #$15
  302.    STA $D418
  303.    LDY #$09
  304.    LDX #$00
  305.    STY $D405
  306.    STX $D406
  307.    LDA #$30
  308.    STA $D401
  309.    LDA #$20
  310.    STA $D404
  311.    LDA #$21
  312.    STA $D404
  313.    RTS
  314.  
  315. ;*** CON╫RITE( (ZP)=BUF, .┴┘=WRITE╠ENGTH ) **ZW GETS MODIFIED**
  316.  
  317. CON╫RITE╨TR    = SYSWORK+8
  318. CON╫RITE╠ENGTH = SYSWORK+10
  319. CON╫RITE╘EMP   = SYSWORK+12
  320.  
  321. CON╫RITE = *
  322.    STA CON╫RITE╠ENGTH+0
  323.    STY CON╫RITE╠ENGTH+1
  324.    LDA ZP+0
  325.    LDY ZP+1
  326.    STA CON╫RITE╨TR+0
  327.    STY CON╫RITE╨TR+1
  328.  
  329.    CON╫RITE╬EXT├HUNK = *
  330.    LDA #255
  331.    LDX CON╫RITE╠ENGTH+1
  332.    BNE +
  333.    LDA CON╫RITE╠ENGTH+0
  334.    BEQ CON╫RITE╞INISH
  335. +  JSR CON╫RITE├HUNK
  336.    STA CON╫RITE╘EMP
  337.    CLC
  338.    ADC CON╫RITE╨TR+0
  339.    STA CON╫RITE╨TR+0
  340.    BCC +
  341.    INC CON╫RITE╨TR+1
  342. +  SEC
  343.    LDA CON╫RITE╠ENGTH+0
  344.    SBC CON╫RITE╘EMP
  345.    STA CON╫RITE╠ENGTH+0
  346.    BCS +
  347.    DEC CON╫RITE╠ENGTH+1
  348. +  JMP CON╫RITE╬EXT├HUNK
  349.    
  350.    CON╫RITE╞INISH = *
  351.    CLC
  352.    RTS
  353.  
  354. CON╫R├HK═AX╠EN .BUF 1
  355.  
  356. CON╫RITE├HUNK = *  ;( CON╫RITE╨TR, .┴=DATA╠EN ) : .┴=DATA╫RITTEN
  357.    STA CON╫R├HK═AX╠EN
  358. -  SEC
  359.    LDA CON╫IN├OLS
  360.    SBC CON├UR├OL
  361.    BNE +
  362.    JSR CON╫RITE╬EWLINE
  363.    LDY #0
  364.    LDA (CON╫RITE╨TR),Y
  365.    CMP #CHR├╥
  366.    BNE -
  367.    LDA #1
  368.    RTS
  369. +  CMP CON╫R├HK═AX╠EN
  370.    BCS +
  371.    STA CON╫R├HK═AX╠EN
  372. +  LDY #0
  373.  
  374. -  LDA (CON╫RITE╨TR),Y
  375.    CMP #21
  376.    BCS ++
  377. -  CPY #0
  378.    BNE CON╫R├HK╞LUSH
  379.    CMP #CHR├╥
  380.    BNE +
  381.    JSR CON╫RITE╬EWLINE
  382.    LDA #1
  383.    RTS
  384. +  JSR CON╨UTCHAR
  385.    LDA #1
  386.    RTS
  387. +  CMP #147
  388.    BEQ -
  389.    INY
  390.    CPY CON╫R├HK═AX╠EN
  391.    BCC --
  392.  
  393.    CON╫R├HK╞LUSH = *
  394.    STY CON╫R├HK═AX╠EN
  395.    CLC
  396.    LDA CON╠INE┴DDR+0
  397.    ADC CON├UR├OL
  398.    STA SYSWORK+0
  399.    LDA CON╠INE┴DDR+1
  400.    ADC #0
  401.    STA SYSWORK+1
  402.    LDA CON╫RITE╨TR+0
  403.    LDX CON╫RITE╨TR+1
  404.    STA SYSWORK+2
  405.    STX SYSWORK+3
  406.    STY SYSWORK+5
  407.    LDA CON╨UT═ASK
  408.    LDY CON├HAR├OLOR
  409.    LDX SYSWORK+5
  410.    JSR WINPUT
  411.    CLC
  412.    LDA CON├UR├OL
  413.    ADC CON╫R├HK═AX╠EN
  414.    STA CON├UR├OL
  415.    LDA CON╫R├HK═AX╠EN
  416.    RTS
  417.  
  418. ;*** CON╥EAD( (ZP)=BUF, .┴┘=READ═AX╠EN ) : .┴┘=(ZW)=LEN, .┌
  419.  
  420. CON╥EAD = *
  421.    STA READ═AX╠EN+0
  422.    STY READ═AX╠EN+1
  423.    LDA #0
  424.    STA READ╠ENGTH+0
  425.    STA READ╠ENGTH+1
  426.    LDA ZP+0
  427.    LDY ZP+1
  428.    STA READ╨TR+0
  429.    STY READ╨TR+1
  430.  
  431. CON╥EAD╠OOP = *
  432.    LDA READ╠ENGTH+0
  433.    CMP READ═AX╠EN+0
  434.    LDA READ╠ENGTH+1
  435.    SBC READ═AX╠EN+1
  436.    BCS CON╥EAD┼XIT
  437.    JSR KEYLINE╟ET
  438.    BCS CON╥EAD┼OF┼XIT
  439.    LDY #0
  440.    STA (READ╨TR),Y
  441.    INC READ╨TR+0
  442.    BNE +
  443.    INC READ╨TR+1
  444. +  INC READ╠ENGTH+0
  445.    BNE +
  446.    INC READ╠ENGTH+1
  447. +  CMP #$0D
  448.    BEQ CON╥EAD┼XIT
  449.    JMP CON╥EAD╠OOP
  450.  
  451.    CON╥EAD┼XIT = *
  452.    LDA READ╠ENGTH+0
  453.    LDY READ╠ENGTH+1
  454.    STA ZW+0
  455.    STY ZW+1
  456.    LDX #$FF
  457.    CLC
  458.    RTS
  459.  
  460.    CON╥EAD┼OF┼XIT = *
  461.    LDA #0
  462.    LDY #0
  463.    STA ZW+0
  464.    STY ZW+1
  465.    CLC
  466.    RTS
  467.  
  468. KEYLINE╟ET = *  ;( KEYLINE╨TR, KEYLINE├OUNT ) : .┴=CHAR, .├╙=EOF
  469.    LDA KEYLINE├OUNT
  470.    BNE +
  471.    JSR CON╔NPUT
  472.    BCS ++
  473. +  LDX KEYLINE╨TR
  474.    INC KEYLINE╨TR
  475.    DEC KEYLINE├OUNT
  476.    LDA KEYLINE,X
  477.    CLC
  478. +  RTS
  479.  
  480. CON╨ARM╙AVE .BUF 8
  481. CON╨ARM═P   .BUF 4
  482. CON╨ARM┌P   .BUF 2
  483.  
  484. CON╔NPUT = *
  485.    LDX #7
  486. -  LDA SYSWORK,X
  487.    STA CON╨ARM╙AVE,X
  488.    DEX
  489.    BPL -
  490.    LDX #0
  491.    STX KEYLINE╨TR
  492.    STX KEYLINE╨OS
  493.    STX KEYLINE├OUNT
  494.    LDA #$00
  495.    STA CON╚ISTBUF╥EPLACE╨TR+0
  496.    LDX #3
  497. -  LDA CON╚ISTBUF╥EPLACE╨TR,X
  498.    STA CON╚ISTBUF╙CAN╨TR,X
  499.    LDA MP,X
  500.    STA CON╨ARM═P,X
  501.    LDA CON╚ISTBUF╥EPLACE╨TR,X
  502.    STA MP,X
  503.    DEX
  504.    BPL -
  505.    LDA #$06
  506.    STA MP+0
  507.    LDA #0
  508.    STA SYSWORK
  509.    LDX #SYSWORK
  510.    LDY #1
  511.    JSR ZPSTORE
  512.    LDA #$00
  513.    STA MP+0
  514.    LDX #1
  515. -  LDA ZP,X
  516.    STA CON╨ARM┌P,X
  517.    DEX
  518.    BPL -
  519.  
  520.    CON╔N╬EXT = *
  521.    JSR CON╙YNCH├URSOR
  522.    JSR CON├URSOR╧N
  523.    JSR CON╟ETKEY
  524.    JSR CON├URSOR╧FF
  525.    CMP #$0D
  526.    BNE +
  527.    JMP CON╔N╥ETURN
  528. +  CMP #$14  ;BACKSPACE
  529.    BNE +
  530.    JMP CON╔N┬ACKSPACE
  531. +  CMP #$03  ;STOP
  532.    BEQ CON╔N╬EXT
  533.    CMP #147  ;CLEAR
  534.    BNE +
  535.    JMP CON╔N├LEAR
  536. +  CMP #$E4
  537.    BNE +
  538.    LDX KEYLINE├OUNT
  539.    BNE +
  540.    JSR CON╥ESTORE╨ARMS
  541.    SEC
  542.    RTS
  543. +  CMP #$F5  ;CT-U
  544.    BNE +
  545.    JMP CON╔N╦ILL
  546. +  CMP #29  ;RIGHT
  547.    BNE +
  548.    JMP CON╔N╥IGHT
  549. +  CMP #157 ;LEFT
  550.    BNE +
  551.    JMP CON╔N╠EFT
  552. +  CMP #$10  ;CO-LEFT
  553.    BNE +
  554. -  JMP CON╔N┬OL
  555. +  CMP #$EA  ;CT-J
  556.    BEQ -
  557.    CMP #$15  ;CO-RIGHT
  558.    BNE +
  559. -  JMP CON╔N┼OL
  560. +  CMP #$EB  ;CT-K
  561.    BEQ -
  562.    CMP #$F2  ;CT-R
  563.    BNE +
  564.    JMP CON╔N╥EDISPLAY
  565. +  CMP #145  ;UP
  566.    BNE +
  567.    JMP CON╔N╨REV╠INE
  568. +  CMP #17   ;DOWN
  569.    BNE +
  570.    JMP CON╔N╬EXT╠INE
  571. +  LDX KEYLINE├OUNT
  572.    CPX #KEYLINE═AX
  573.    BCC +
  574.    JSR CON┬ELL
  575.    JMP CON╔N╬EXT
  576. +  PHA
  577.    ;** INSERT SPACE FOR NEW CHAR
  578.    INX
  579.    STX KEYLINE├OUNT
  580. -  LDA KEYLINE-1,X
  581.    STA KEYLINE,X
  582.    DEX
  583.    BEQ +
  584.    CPX KEYLINE╨OS
  585.    BCS -
  586.    BEQ -
  587. +  PLA
  588.    LDX KEYLINE╨OS
  589.    STA KEYLINE,X
  590.    INC KEYLINE╨OS
  591.    JSR CON╨UTCHAR╠IT
  592.    JSR CON╔N╙LOSH
  593.    JSR CON╔N┬ACKUP
  594.    JSR CON╔N╙AVE╠INE
  595.    JMP CON╔N╬EXT
  596.  
  597. CON╔N╥ETURN = *
  598.    JSR CON╔N╙AVE╠INE
  599.    JSR CON╔N╙LOSH
  600.    LDA #CHR├╥
  601.    LDX KEYLINE├OUNT
  602.    STA KEYLINE,X
  603.    INC KEYLINE├OUNT
  604.    JSR CON╨UTCHAR
  605.    LDX #0
  606.    STX KEYLINE╨TR
  607.    LDA KEYLINE╠EN
  608.    BEQ +
  609.    LDX #3
  610. -  LDA CON╚ISTBUF╥EPLACE╨TR,X
  611.    STA MP,X
  612.    DEX
  613.    BPL -
  614.    LDA #<KEYLINE┬UF
  615.    LDY #>KEYLINE┬UF
  616.    STA ZP+0
  617.    STY ZP+1
  618.    LDA #3
  619.    LDY #0
  620.    JSR FETCH
  621.    LDX #2
  622. -  LDA KEYLINE╬EXT,X
  623.    STA CON╚ISTBUF╥EPLACE╨TR+1,X
  624.    DEX
  625.    BPL -
  626. +  JSR CON╥ESTORE╨ARMS
  627.    CLC
  628.    RTS
  629.  
  630. CON╔N├LEAR = *
  631.    JSR CON╨UTCHAR
  632.    LDA #0
  633.    STA KEYLINE╨OS
  634.    STA KEYLINE├OUNT
  635.    JMP CON╔N╬EXT
  636.  
  637. CON╔N┬ACKSPACE = *
  638.    LDX KEYLINE╨OS
  639.    BNE +
  640.    JMP CON╔N╬EXT
  641. +  DEC KEYLINE╨OS
  642.    DEC KEYLINE├OUNT
  643.    LDX KEYLINE╨OS
  644.    JMP +
  645. -  LDA KEYLINE+1,X
  646.    STA KEYLINE,X
  647.    INX
  648. +  CPX KEYLINE├OUNT
  649.    BCC -
  650.    JSR CON┬ACKSPACE
  651.    JSR CON╔N╙LOSH
  652.    PHA
  653.    LDA #" "
  654.    JSR CON╨UTCHAR
  655.    PLA
  656.    CLC
  657.    ADC #1
  658.    JSR CON╔N┬ACKUP
  659.    JSR CON╔N╙AVE╠INE
  660.    JMP CON╔N╬EXT
  661.  
  662. CON╔N╠EFT = *
  663.    LDA KEYLINE╨OS
  664.    BEQ +
  665.    JSR CON┬ACKSPACE
  666.    DEC KEYLINE╨OS
  667. +  JMP CON╔N╬EXT
  668.  
  669. CON╔N╥IGHT = *
  670.    LDX KEYLINE╨OS
  671.    CPX KEYLINE├OUNT
  672.    BEQ +
  673.    LDA KEYLINE,X
  674.    JSR CON╨UTCHAR
  675.    INC KEYLINE╨OS
  676. +  JMP CON╔N╬EXT
  677.  
  678. CON╔N┬OL = *
  679.    LDA KEYLINE╨OS
  680.    JSR CON╔N┬ACKUP
  681.    LDA #0
  682.    STA KEYLINE╨OS
  683.    JMP CON╔N╬EXT
  684.  
  685. CON╔N┼OL = *
  686.    JSR CON╔N╙LOSH
  687.    LDA KEYLINE├OUNT
  688.    STA KEYLINE╨OS
  689.    JMP CON╔N╬EXT
  690.  
  691. CON╔N╥EDISPLAY = *
  692.    LDA KEYLINE╨OS
  693.    PHA
  694.    JSR CON╔N┬ACKUP
  695.    LDA #0
  696.    STA KEYLINE╨OS
  697.    JSR CON╔N╙LOSH
  698.    PLA
  699.    STA KEYLINE╨OS
  700.    SEC
  701.    LDA KEYLINE├OUNT
  702.    SBC KEYLINE╨OS
  703.    JSR CON╔N┬ACKUP
  704.    JMP CON╔N╬EXT
  705.  
  706. CON╔N╦ILL = *
  707.    JSR CON╔N╦ILL╙UB
  708.    JMP CON╔N╬EXT
  709. CON╔N╦ILL├NT .BUF 1
  710. CON╔N╦ILL╙UB = *
  711.    ;** GOTO BEGINNING OF LINE
  712.    LDA KEYLINE╨OS
  713.    JSR CON╔N┬ACKUP
  714.    ;** BLANK OUT LINE
  715.    LDA #$FF
  716.    STA CON╔GNORE├TRL
  717.    LDA KEYLINE├OUNT
  718.    STA CON╔N╦ILL├NT
  719.    BEQ +
  720. -  LDA #" "
  721.    JSR CON╨UTCHAR
  722.    DEC CON╔N╦ILL├NT
  723.    BNE -
  724.    ;** BACKUP
  725. +  LDA KEYLINE├OUNT
  726.    JSR CON╔N┬ACKUP
  727.    LDA #$00
  728.    STA CON╔GNORE├TRL
  729.    ;** INTERNAL
  730.    LDA #0
  731.    STA KEYLINE╨OS
  732.    STA KEYLINE├OUNT
  733.    RTS
  734.  
  735. CON╙LOSH╨TR .BUF 1
  736.  
  737. CON╔N╙LOSH = *  ;( ) : ┬╙COUNT ;SLOSH OUT LINE FROM KEYLINE╨OS TO KEYLINE├OUNT
  738.    LDA #$FF
  739.    STA CON╔GNORE├TRL
  740.    LDA KEYLINE╨OS
  741.    STA CON╙LOSH╨TR
  742. -  LDX CON╙LOSH╨TR
  743.    CPX KEYLINE├OUNT
  744.    BCS +
  745.    LDA KEYLINE,X
  746.    JSR CON╨UTCHAR╠IT
  747.    INC CON╙LOSH╨TR
  748.    JMP -
  749. +  LDA #$00
  750.    STA CON╔GNORE├TRL
  751.    SEC
  752.    LDA KEYLINE├OUNT
  753.    SBC KEYLINE╨OS
  754.    RTS
  755.  
  756. CON┬ACKUP├OUNT .BUF 1
  757.  
  758. CON╔N┬ACKUP = *  ;( .┴=COUNT ) ;BACKUP THE CURSOR .┴ SPACES
  759.    STA CON┬ACKUP├OUNT
  760.    CMP #0
  761.    BEQ +
  762. -  LDA #CHR┬╙
  763.    JSR CON╨UTCHAR
  764.    DEC CON┬ACKUP├OUNT
  765.    BNE -
  766. +  RTS
  767.  
  768. CON╥ESTORE╨ARMS = *
  769.    LDX #7
  770. -  LDA CON╨ARM╙AVE,X
  771.    STA SYSWORK,X
  772.    DEX
  773.    BPL -
  774.    LDX #3
  775. -  LDA CON╨ARM═P,X
  776.    STA MP,X
  777.    DEX
  778.    BPL -
  779.    LDX #1
  780. -  LDA CON╨ARM┌P,X
  781.    STA ZP,X
  782.    DEX
  783.    BPL -
  784.    RTS
  785.  
  786. CON╔N╬EXT╠INE = *
  787.    ;** LOCATE NEXT SCAN LINE
  788.    LDA CON╚ISTBUF╥EPLACE╨TR+3
  789.    CMP #ACE═EM╬ULL
  790.    BEQ +
  791.    JSR CON╔N╠INE╞ETCH╚EAD
  792.    LDX #2
  793. -  LDA CON╚ISTBUF╙CAN╨TR+1,X
  794.    CMP CON╚ISTBUF╥EPLACE╨TR+1,X
  795.    BNE ++
  796.    DEX
  797.    BPL -
  798. +  JMP CON╔N╬EXT
  799. +  LDX #2
  800. -  LDA KEYLINE╬EXT,X
  801.    STA CON╚ISTBUF╙CAN╨TR+1,X
  802.    STA MP+1,X
  803.    DEX
  804.    BPL -
  805.    JMP +++
  806.    
  807. CON╔N╨REV╠INE = *
  808.    ;** LOCATE PREVIOUS SCAN LINE
  809.    LDA CON╚ISTBUF╥EPLACE╨TR+3
  810.    CMP #ACE═EM╬ULL
  811.    BEQ +
  812.    JSR CON╔N╠INE╞ETCH╚EAD
  813.    LDX #2
  814. -  LDA KEYLINE╨REV,X
  815.    CMP CON╚ISTBUF╥EPLACE╨TR+1,X
  816.    BNE ++
  817.    DEX
  818.    BPL -
  819. +  JSR CON┬ELL
  820.    JMP CON╔N╬EXT
  821. +  LDX #2
  822. -  LDA KEYLINE╨REV,X
  823.    STA CON╚ISTBUF╙CAN╨TR+1,X
  824.    STA MP+1,X
  825.    DEX
  826.    BPL -
  827. +  LDA #$00
  828.    STA MP+0
  829.    ;** UNDISPLAY CURRENT LINE
  830.    JSR CON╔N╦ILL╙UB
  831.    ;** FETCH NEW LINE
  832.    LDA #<256
  833.    LDY #>256
  834.    JSR FETCH
  835.    ;** DISPLAY NEW LINE
  836.    LDA #0
  837.    STA KEYLINE╨OS
  838.    LDA KEYLINE╠EN
  839.    STA KEYLINE├OUNT
  840.    JSR CON╔N╙LOSH
  841.    LDA KEYLINE├OUNT
  842.    STA KEYLINE╨OS
  843.    JMP CON╔N╬EXT
  844.  
  845. CON╔N╠INE╞ETCH╚EAD = *
  846.    LDX #3
  847. -  LDA CON╚ISTBUF╙CAN╨TR,X
  848.    STA MP,X
  849.    DEX
  850.    BPL -
  851.    LDA #<KEYLINE┬UF
  852.    LDY #>KEYLINE┬UF
  853.    STA ZP+0
  854.    STY ZP+1
  855.    LDA #6
  856.    LDY #0
  857.    JSR FETCH
  858.    RTS
  859.  
  860. CON╔N╙AVE╠INE = *
  861.    LDA CON╚ISTBUF╥EPLACE╨TR+3
  862.    CMP #ACE═EM╬ULL
  863.    BNE +
  864.    RTS
  865. +  LDA KEYLINE├OUNT
  866.    STA KEYLINE╠EN
  867.    LDX #3
  868. -  LDA CON╚ISTBUF╥EPLACE╨TR,X
  869.    STA MP,X
  870.    DEX
  871.    BPL -
  872.    LDA #$06
  873.    STA MP+0
  874.    LDA #<KEYLINE┬UF+6
  875.    LDY #>KEYLINE┬UF+6
  876.    STA ZP+0
  877.    STY ZP+1
  878.    CLC
  879.    LDA KEYLINE├OUNT
  880.    ADC #2
  881.    LDY #0
  882.    JSR STASH
  883.    LDA #$00
  884.    STA MP+0
  885.    RTS
  886.  
  887. CON┬ACKSPACE = *
  888.    DEC CON├UR├OL
  889.    BPL +
  890.    LDX CON╫IN├OLS
  891.    DEX
  892.    STX CON├UR├OL
  893.    LDA CON├UR╥OW
  894.    BEQ +
  895.    DEC CON├UR╥OW
  896.    SEC
  897.    LDA CON╠INE┴DDR+0
  898.    SBC CON╥OW╔NC+0
  899.    STA CON╠INE┴DDR+0
  900.    LDA CON╠INE┴DDR+1
  901.    SBC CON╥OW╔NC+1
  902.    STA CON╠INE┴DDR+1
  903. +  RTS
  904.  
  905. CON├URSOR╧N = *  ;( )
  906.    JSR CON╟ET├URSOR┴DDR
  907.    LDY CON├URSOR├OLOR
  908.    LDA #$FF
  909.    JSR WINCURSOR
  910.    RTS
  911.  
  912. CON├URSOR╧FF = *  ;( )  ;.┴ PRESERVED
  913.    PHA
  914.    JSR CON╟ET├URSOR┴DDR
  915.    LDA #0
  916.    JSR WINCURSOR
  917.    PLA
  918.    RTS
  919.  
  920. CON├OLOR = *
  921.    STA SYSWORK+15
  922.    AND #$02
  923.    BEQ +
  924.    STX CON├HAR├OLOR
  925. +  LDA SYSWORK+15
  926.    AND #$01
  927.    BEQ +
  928.    STY CON├URSOR├OLOR
  929. +  LDX CON├HAR├OLOR
  930.    LDY CON├URSOR├OLOR
  931.    RTS
  932.  
  933. CON╨ALETTE = *
  934.    LDY #0
  935.    BIT TEXT═ODE
  936.    BMI +
  937.    LDY #8
  938. +  LDX #0
  939. -  NOP
  940.    .IF COMPUTER-64
  941.    LDA CONFIG┬UF+$B0,Y
  942.    .ELSE
  943.    LDA CONFIG┬UF+$D0,Y
  944.    .IFE
  945.    STA SYSWORK+0,X
  946.    INY
  947.    INX
  948.    CPX #8
  949.    BCC -
  950.    RTS
  951.  
  952. CON╙CREEN = *
  953.    ;** CHECK SPECIAL SIZES
  954.    CMP #0
  955.    BNE +
  956. -  LDA #25
  957. +  CMP #255
  958.    BEQ -
  959.    CPX #0
  960.    BNE +
  961.    LDX #40
  962.    BIT TEXT═ODE
  963.    BPL +
  964.    LDX #80
  965. +  CPX #255
  966.    BNE +
  967.    LDX #80   ;CHANGE FOR ├64 WITHOUT SOFT 80-COL SUPPORT
  968.    ;** CHECK SCREEN LIMITS
  969. +  CMP #26
  970.    BCC +
  971. -  LDA #ACE┼RR╔NVALID├ON╨ARMS
  972.    STA ERRNO
  973.    SEC
  974.    RTS
  975. +  CPX #81
  976.    BCS -
  977.    ;** SET SCREEN
  978.    LDY #$00
  979.    CPX #40+1
  980.    BCC +
  981.    LDY #$80
  982. +  STY TEXT═ODE
  983. .IF COMPUTER-64
  984.    ;** 128-SET FAST/SLOW
  985.    CPY #0
  986.    BEQ +
  987.    LDA VIC+$11
  988.    AND #%01101111
  989.    STA VIC+$11
  990.    LDA #1
  991.    STA VIC+$30
  992.    JMP ++
  993. +  LDA #0
  994.    STA VIC+$30
  995.    LDA VIC+$11
  996.    AND #%01111111
  997.    ORA #%00010000
  998.    STA VIC+$11
  999. +  NOP
  1000. .ELSE
  1001.    ;** 64-INITIALIZE SCREEN HARDWARE
  1002.    CPY #$00
  1003.    BNE +
  1004.    JSR VIC╔NIT
  1005.    JMP ++
  1006. +  JSR VDC╔NIT
  1007. +  NOP
  1008. .IFE
  1009.    ;** CHANGE COLORS
  1010.    JSR CONPALETTE
  1011.    LDX SYSWORK+0
  1012.    LDY SYSWORK+1
  1013.    LDA #$23
  1014.    JSR CONCOLOR
  1015.    JSR CONPALETTE
  1016.    LDX SYSWORK+7
  1017.    LDY SYSWORK+6
  1018.    LDA #$C0
  1019.    JSR WINCOLOR
  1020.    ;** WINDOW PARMS
  1021.    JSR WINMAX
  1022.    JSR CON╫IN╔NIT
  1023.    LDA CON╫IN╥OWS
  1024.    LDX CON╫IN├OLS
  1025.    CLC
  1026.    RTS
  1027.  
  1028. CON╨OS = *
  1029.    CMP CON╫IN╥OWS
  1030.    BCC +
  1031. -  LDA #ACE┼RR╔NVALID├ON╨ARMS
  1032.    STA ERRNO
  1033.    SEC
  1034.    RTS
  1035. +  CPX CON╫IN├OLS
  1036.    BCS -
  1037.    STA CON├UR╥OW
  1038.    STX CON├UR├OL
  1039.    LDX #0
  1040.    JSR WINPOS
  1041.    LDA SYSWORK+0
  1042.    LDY SYSWORK+1
  1043.    STA CON╠INE┴DDR+0
  1044.    STY CON╠INE┴DDR+1
  1045.    CLC
  1046.    RTS
  1047.  
  1048. ;3-╦EY ╥OLLOVER-128 BY ├RAIG ┬RUCE 18-╩UN-93 FROM ├= ╚ACKING MAGAZINE
  1049.  
  1050. .IF COMPUTER-64
  1051.    SCANROWS = 11
  1052.    PK = $D02F
  1053.    NEWPOS = $CC
  1054.    KEYCODE = $D4
  1055.    PREV╦EYCODE = $D5
  1056.    XSAVE = $CD
  1057.    MASK = $CC
  1058.    CAPS╨ORT = $0001
  1059.    KEYMAP╨TR = $CC
  1060. .ELSE
  1061.    SCANROWS = 8
  1062.    PK .BUF 1  ;DUMMY
  1063.    NEWPOS = $F5
  1064.    KEYCODE = $CB
  1065.    PREV╦EYCODE = $C5
  1066.    XSAVE = $F6
  1067.    MASK = $F5
  1068.    CAPS╨ORT .BYTE $40
  1069.    KEYMAP╨TR = $F5
  1070. .IFE
  1071. STOP╦EY╥OW .BUF 1
  1072. ROLLOVER = 3
  1073. NULL╦EY = $FF
  1074.  
  1075. PA = $DC00
  1076. PB = $DC01
  1077.  
  1078. CON╔RQ╦EYSCAN = *
  1079.    LDA SCROLL├OUNTDOWN
  1080.    BEQ +
  1081.    DEC SCROLL├OUNTDOWN
  1082. +  LDA #0
  1083.    STA PA
  1084.    STA PK
  1085. -  LDA PB
  1086.    CMP PB
  1087.    BNE -
  1088.    CMP #$FF
  1089.    BEQ NO╦EY╨RESSED
  1090.  
  1091.    JSR CHECK╩OYSTICK
  1092.    BCC NO╦EY╨RESSED
  1093.    JSR KEYSCAN
  1094.    JSR CHECK╩OYSTICK
  1095.    BCC NO╦EY╨RESSED
  1096.    LDA SCAN╘ABLE+7
  1097.    STA STOP╦EY╥OW
  1098.    JSR SELECT═OUSE
  1099.    JSR SHIFTDECODE
  1100.    JSR KEYDECODE
  1101.    JSR CON╙CREEN╒NSAVE
  1102.    JSR KEYORDER
  1103.    BIT IGNORE╦EYS
  1104.    BMI +
  1105.    LDA PREV╦EYS+0
  1106.    CMP #NULL╦EY
  1107.    BEQ +
  1108.    STA KEYCODE
  1109.    JMP INTERP╦EY
  1110.  
  1111.    NO╦EY╨RESSED = *
  1112.    JSR SELECT═OUSE
  1113.    LDA #NULL╦EY
  1114.    LDX #ROLLOVER-1
  1115. -  STA PREV╦EYS,X
  1116.    DEX
  1117.    BPL -
  1118.    JSR SCAN├APS
  1119.    LDA #0
  1120.    STA IGNORE╦EYS
  1121.    STA STOP╦EY╥OW
  1122.  
  1123. +  LDA #NULL╦EY
  1124.    STA KEYCODE
  1125.    STA PREV╦EYCODE
  1126.    RTS
  1127.  
  1128. SELECT═OUSE = *
  1129.    LDA #$FF
  1130.    STA PK
  1131.    LDA #$7F  ;SELECTS PADDLE/MOUSE ┴
  1132.    STA PA
  1133.    RTS
  1134.  
  1135. KEYSCAN╔NIT = *
  1136.    LDA #NULL╦EY
  1137.    LDX #ROLLOVER-1
  1138. -  STA PREV╦EYS,X
  1139.    DEX
  1140.    BPL -
  1141.    LDA #0
  1142.    STA IGNORE╦EYS
  1143.    RTS
  1144.  
  1145. KEYSCAN = *
  1146. .IF COMPUTER-64
  1147.    LDX #$FF
  1148.    LDY #$FF
  1149.    LDA #$FE
  1150.    STA MASK+0
  1151.    LDA #$FF
  1152.    STA MASK+1
  1153.    JMP +
  1154.    NEXT╥OW = *
  1155. -  LDA PB
  1156.    CMP PB
  1157.    BNE -
  1158.    STY PA
  1159.    STY PK
  1160.    EOR #$FF
  1161.    STA SCAN╘ABLE,X
  1162.    SEC
  1163.    ROL MASK+0
  1164.    ROL MASK+1
  1165. +  LDA MASK+0
  1166.    STA PA
  1167.    LDA MASK+1
  1168.    STA PK
  1169.    INX
  1170.    CPX #SCANROWS
  1171.    BCC NEXT╥OW
  1172.    RTS
  1173. .ELSE
  1174.    LDX #$FF
  1175.    LDY #$FF
  1176.    LDA #$FE
  1177.    STA MASK
  1178.    JMP +
  1179.    NEXT╥OW = *
  1180. -  LDA PB
  1181.    CMP PB
  1182.    BNE -
  1183.    STY PA
  1184.    EOR #$FF
  1185.    STA SCAN╘ABLE,X
  1186.    SEC
  1187.    ROL MASK
  1188. +  LDA MASK
  1189.    STA PA
  1190.    INX
  1191.    CPX #SCANROWS
  1192.    BCC NEXT╥OW
  1193.    RTS
  1194. .IFE
  1195.  
  1196. SHIFT╥OWS .BYTE $01,$06,$07,$07,$0A
  1197. SHIFT┬ITS .BYTE $80,$10,$20,$04,$01
  1198. SHIFT═ASK .BYTE $01,$01,$02,$04,$08
  1199.  
  1200. SHIFTDECODE = *
  1201.    JSR SCAN├APS
  1202. .IF COMPUTER-64
  1203.    LDY #4
  1204. .ELSE
  1205.    LDY #3
  1206. .IFE
  1207. -  LDX SHIFT╥OWS,Y
  1208.    LDA SCAN╘ABLE,X
  1209.    AND SHIFT┬ITS,Y
  1210.    BEQ +
  1211.    LDA SHIFT═ASK,Y
  1212.    ORA SHIFT╓ALUE
  1213.    STA SHIFT╓ALUE
  1214.    LDA SHIFT┬ITS,Y
  1215.    EOR #$FF
  1216.    AND SCAN╘ABLE,X
  1217.    STA SCAN╘ABLE,X
  1218. +  DEY
  1219.    BPL -
  1220.    RTS
  1221.  
  1222. SCAN├APS = *
  1223. -  LDA CAPS╨ORT
  1224.    CMP CAPS╨ORT
  1225.    BNE -
  1226.    EOR #$FF
  1227.    AND #$40
  1228.    LSR
  1229.    LSR
  1230.    STA SHIFT╓ALUE
  1231.    RTS
  1232.  
  1233. KEYDECODE = *
  1234.    LDX #ROLLOVER-1
  1235.    LDA #$FF
  1236. -  STA NEW╦EYS,X
  1237.    DEX
  1238.    BPL -
  1239.    LDY #0
  1240.    STY NEWPOS
  1241.    LDX #0
  1242.    STX KEYCODE
  1243.  
  1244.    DECODE╬EXT╥OW = *
  1245.    LDA SCAN╘ABLE,X
  1246.    BEQ DECODE├ONTINUE
  1247.  
  1248.    LDY KEYCODE
  1249. -  LSR
  1250.    BCC ++
  1251.    PHA
  1252.    STX XSAVE
  1253.    LDX NEWPOS
  1254.    CPX #ROLLOVER
  1255.    BCS +
  1256.    TYA
  1257.    STA NEW╦EYS,X
  1258.    INC NEWPOS
  1259. +  LDX XSAVE
  1260.    PLA
  1261. +  INY
  1262.    CMP #$00
  1263.    BNE -
  1264.  
  1265.    DECODE├ONTINUE = *
  1266.    CLC
  1267.    LDA KEYCODE
  1268.    ADC #8
  1269.    STA KEYCODE
  1270.    INX
  1271.    CPX #SCANROWS
  1272.    BCC DECODE╬EXT╥OW
  1273.    RTS
  1274.  
  1275. KEYORDER = *
  1276.    ;** REMOVE OLD KEYS NO LONGER HELD
  1277.    LDY #0
  1278.    NEXT╥EMOVE = *
  1279.    LDA PREV╦EYS,Y
  1280.    CMP #$FF
  1281.    BEQ ++
  1282.    LDX #ROLLOVER-1
  1283. -  CMP NEW╦EYS,X
  1284.    BEQ +
  1285.    DEX
  1286.    BPL -
  1287.    TYA
  1288.    TAX
  1289. -  LDA PREV╦EYS+1,X
  1290.    STA PREV╦EYS+0,X
  1291.    INX
  1292.    CPX #ROLLOVER-1
  1293.    BCC -
  1294.    LDA #$FF
  1295.    STA PREV╦EYS+ROLLOVER-1
  1296.    STA IGNORE╦EYS
  1297. +  INY
  1298.    CPY #ROLLOVER
  1299.    BCC NEXT╥EMOVE
  1300.  
  1301.    ;** INSERT NEW KEY AT FRONT
  1302. +  LDY #0
  1303.    NEXT╔NSERT = *
  1304.    LDA NEW╦EYS,Y
  1305.    CMP #$FF
  1306.    BEQ ++
  1307.    LDX #ROLLOVER-1
  1308. -  CMP PREV╦EYS,X
  1309.    BEQ +
  1310.    DEX
  1311.    BPL -
  1312.    PHA
  1313.    LDX #ROLLOVER-2
  1314. -  LDA PREV╦EYS+0,X
  1315.    STA PREV╦EYS+1,X
  1316.    DEX
  1317.    BPL -
  1318.    LDA #0
  1319.    STA IGNORE╦EYS
  1320.    PLA
  1321.    STA PREV╦EYS+0
  1322.    LDY #ROLLOVER
  1323. +  INY
  1324.    CPY #ROLLOVER
  1325.    BCC NEXT╔NSERT
  1326. +  RTS
  1327.  
  1328. CHECK╩OYSTICK = *
  1329.    LDA #$FF
  1330.    STA PA
  1331.    STA PK
  1332. -  LDA PB
  1333.    CMP PB
  1334.    BNE -
  1335.    CMP #$FF
  1336.    RTS
  1337.  
  1338. SCAN╘ABLE  .BUF SCANROWS
  1339. NEW╦EYS    .BUF ROLLOVER
  1340. IGNORE╦EYS .BUF 1
  1341. PREV╦EYS   .BUF ROLLOVER+2
  1342.  
  1343. SCROLL╞REEZE    .BYTE $00
  1344. DELAY├OUNTDOWN  .BYTE $00
  1345. REPEAT├OUNTDOWN .BYTE $00
  1346. SCROLL├OUNTDOWN .BYTE $00
  1347.  
  1348. INTERP╦EY = *  ;( KEYCODE )
  1349.    LDA KEYCODE
  1350.    ;** NOSCROLL
  1351. .IF COMPUTER-64
  1352.    CMP #87      ;NOSCROLL
  1353.    BNE INTERP├APS
  1354. .ELSE
  1355.    CMP #63      ;RUN/STOP
  1356.    BNE INTERP├APS
  1357.    LDA SHIFT╓ALUE
  1358.    AND #%1111
  1359.    CMP #4       ;CONTROL
  1360.    BNE INTERP├APS
  1361.    LDA KEYCODE
  1362. .IFE
  1363.    CMP PREV╦EYCODE
  1364.    BEQ +
  1365.    STA PREV╦EYCODE
  1366.    LDA SCROLL╞REEZE
  1367.    EOR #$FF
  1368.    STA SCROLL╞REEZE
  1369. +  RTS
  1370.  
  1371.    INTERP├APS = *
  1372. .IF COMPUTER-64
  1373. .ELSE
  1374.    LDA KEYCODE
  1375.    CMP #63      ;RUN/STOP
  1376.    BNE INTERP╙HIFTS
  1377.    LDA SHIFT╓ALUE
  1378.    AND #%1111
  1379.    CMP #2       ;COMMODORE
  1380.    BNE INTERP╙HIFTS
  1381.    LDA KEYCODE
  1382.    CMP PREV╦EYCODE
  1383.    BEQ +
  1384.    STA PREV╦EYCODE
  1385.    LDA CAPS╨ORT
  1386.    EOR #$40
  1387.    STA CAPS╨ORT
  1388. +  RTS
  1389. .IFE
  1390.  
  1391.    INTERP╙HIFTS = *
  1392.    LDA SHIFT╓ALUE
  1393.    AND #%00011111
  1394.    CMP #%00010000
  1395.    BNE +
  1396.    LDA #5
  1397.    JMP HANDLE╦EY  ;CAPS
  1398. +  AND #%1111
  1399.    TAX
  1400.    LDA SHIFT╨RI╓EC,X
  1401.    JMP HANDLE╦EY
  1402.  
  1403. SHIFT╨RI╓EC = *
  1404. .IF COMPUTER-64
  1405. ;          0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  1406.    .BYTE $00,$01,$02,$02,$03,$03,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04
  1407. .ELSE
  1408.    .BYTE $00,$01,$02,$02,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04
  1409. .IFE
  1410.  
  1411. HANDLE╦EY = * ;( KEYCODE, .┴=SHIFT╘ABLE╬UM )
  1412.    ASL
  1413.    TAX
  1414.    LDA KEYCODE
  1415.    CMP PREV╦EYCODE
  1416.    BEQ HANDLE╥EPEAT
  1417.    JMP HANDLE╧RIG╦EY
  1418.  
  1419. HANDLE╥EPEAT = *
  1420.    STX XSAVE
  1421.    LDA DELAY├OUNTDOWN
  1422.    BEQ +
  1423.    DEC DELAY├OUNTDOWN
  1424.    BEQ ++
  1425.    RTS
  1426. +  DEC REPEAT├OUNTDOWN
  1427.    BEQ +
  1428. -  RTS
  1429. +  LDA CONFIG┬UF+$C9
  1430.    STA REPEAT├OUNTDOWN
  1431.    LDA KEYBUF├OUNT
  1432.    BNE -
  1433.    LDX XSAVE
  1434.    JMP +
  1435.  
  1436. HANDLE╧RIG╦EY = * ;( .╪=SHIFT╘AB╧FF )
  1437.    LDA CONFIG┬UF+$C8
  1438.    STA DELAY├OUNTDOWN
  1439.    LDA #0
  1440.    STA SCROLL╞REEZE
  1441. +  LDA CON╦EYMAP╔NDIRECT+0,X
  1442.    STA KEYMAP╨TR+0
  1443.    LDA CON╦EYMAP╔NDIRECT+1,X
  1444.    STA KEYMAP╨TR+1
  1445.    LDY KEYCODE
  1446.    STY PREV╦EYCODE
  1447.    LDA (KEYMAP╨TR),Y
  1448.    BNE STORE╦EY
  1449.    RTS
  1450.  
  1451. KEYBUF╚EAD  .BYTE 0
  1452. KEYBUF╘AIL  .BYTE 0
  1453. KEYBUF├OUNT .BYTE 0
  1454. KEYBUF╙IZE  = 32  ;POWER OF 2
  1455. KEYBUF─ATA  .BUF KEYBUF╙IZE
  1456.  
  1457. STORE╦EY = *  ;( .┴=CHAR )
  1458.    LDX KEYBUF├OUNT
  1459.    CPX #KEYBUF╙IZE
  1460.    BCC +
  1461.    ;XX RING BELL
  1462.    RTS
  1463. +  LDX KEYBUF╘AIL
  1464.    STA KEYBUF─ATA,X
  1465.    INC KEYBUF╘AIL
  1466.    LDA KEYBUF╘AIL
  1467.    AND #KEYBUF╙IZE-1
  1468.    STA KEYBUF╘AIL
  1469.    INC KEYBUF├OUNT
  1470.    RTS
  1471.  
  1472. ;*** GETKEY( ) : .┴=KEY├HAR
  1473.  
  1474. CON╟ETKEY = *
  1475. -  CLI
  1476.    LDA KEYBUF├OUNT
  1477.    BEQ -
  1478.    SEI
  1479.    LDX KEYBUF╚EAD
  1480.    DEC KEYBUF├OUNT
  1481.    INC KEYBUF╚EAD
  1482.    LDA KEYBUF╚EAD
  1483.    AND #KEYBUF╙IZE-1
  1484.    STA KEYBUF╚EAD
  1485.    LDA KEYBUF─ATA,X
  1486.    CLI
  1487.    RTS
  1488.  
  1489. ;*** STOPKEY( ) : .├├=NOT╨RESSED
  1490.  
  1491. ACE╙TOP╦EY = *
  1492.    LDA STOP╦EY╥OW
  1493.    CMP #$80
  1494.    BEQ +
  1495. -  CLC
  1496.    RTS
  1497. +  LDA SHIFT╓ALUE
  1498.    AND #$0F
  1499.    BNE -
  1500.    LDA #0
  1501.    STA KEYBUF├OUNT
  1502.    STA KEYBUF╚EAD
  1503.    STA KEYBUF╘AIL
  1504.    STA SCROLL╞REEZE
  1505.    LDA #ACE┼RR╙TOPPED
  1506.    STA ERRNO
  1507.    SEC
  1508.    RTS
  1509.  
  1510. CON╦EYMAP╔NDIRECT = *
  1511.    .WORD CON╦EYMAP╬ORMAL,CON╦EYMAP╙HIFT,CON╦EYMAP├OMMODORE,CON╦EYMAP├ONTROL
  1512.    .WORD CON╦EYMAP┴LTERNATE,CON╦EYMAP├APS
  1513.  
  1514. CON╦EYMAP╬ORMAL = *
  1515.    .BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$57,$41,$34,$5A,$53,$45,$01
  1516.    .BYTE $35,$52,$44,$36,$43,$46,$54,$58,$0037,$59,$47,$38,$42,$48,$55,$56
  1517.    .BYTE $39,$49,$4A,$30,$4D,$4B,$4F,$4E,$002B,$50,$4C,$2D,$2E,$3A,$40,$2C
  1518.    .BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$51,$03
  1519.    .BYTE $84,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
  1520.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  1521.  
  1522. CON╦EYMAP╙HIFT = *
  1523.    .BYTE $94,$8D,$9D,$8C,$89,$8A,$8B,$91,$0023,$D7,$C1,$24,$DA,$D3,$C5,$01
  1524.    .BYTE $25,$D2,$C4,$26,$C3,$C6,$D4,$D8,$0027,$D9,$C7,$28,$C2,$C8,$D5,$D6
  1525.    .BYTE $29,$C9,$CA,$30,$CD,$CB,$CF,$CE,$00DB,$D0,$CC,$DD,$3E,$5B,$BA,$3C
  1526.    .BYTE $DC,$C0,$5D,$93,$01,$3D,$DE,$3F,$0021,$DF,$04,$22,$20,$02,$D1,$83
  1527.    .BYTE $04,$38,$35,$02,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
  1528.    .BYTE $08,$30,$2E,$16,$17,$06,$0B,$00
  1529.  
  1530. CON╦EYMAP├OMMODORE = *
  1531.    .BYTE $08,$0D,$9D,$8F,$80,$82,$84,$91,$0096,$B7,$A1,$97,$BA,$B3,$A5,$01
  1532.    .BYTE $98,$B2,$A4,$99,$A3,$A6,$B4,$B8,$009A,$B9,$A7,$9B,$A2,$A8,$B5,$B6
  1533.    .BYTE $29,$A9,$AA,$30,$AD,$AB,$AF,$AE,$00A6,$B0,$AC,$7C,$3E,$BB,$A0,$3C
  1534.    .BYTE $BC,$7F,$BD,$93,$01,$BF,$BE,$3F,$0081,$BF,$04,$95,$5F,$02,$B1,$03
  1535.    .BYTE $04,$38,$35,$18,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$8D,$36,$39,$33
  1536.    .BYTE $08,$30,$2E,$0C,$0F,$10,$15,$00
  1537.  
  1538. CON╦EYMAP├ONTROL = *
  1539.    .BYTE $08,$00,$00,$8F,$80,$82,$84,$00,$001C,$F7,$E1,$9F,$FA,$F3,$E5,$00
  1540.    .BYTE $9C,$F2,$E4,$1E,$E3,$E6,$F4,$F8,$001F,$F9,$E7,$9E,$E2,$E8,$F5,$F6
  1541.    .BYTE $12,$E9,$EA,$92,$ED,$EB,$EF,$EE,$007B,$F0,$EC,$7D,$00,$FB,$E0,$00
  1542.    .BYTE $FC,$60,$FD,$00,$00,$FF,$FE,$00,$0090,$FF,$00,$05,$20,$00,$F1,$00
  1543.    .BYTE $04,$8C,$87,$18,$89,$8A,$88,$85,$001B,$84,$8F,$0A,$00,$8B,$80,$86
  1544.    .BYTE $08,$82,$2E,$16,$17,$19,$1A,$00
  1545.  
  1546. CON╦EYMAP┴LTERNATE = *
  1547.    .BYTE $08,$0D,$1D,$88,$85,$86,$87,$11,$0033,$77,$61,$34,$7A,$73,$65,$00
  1548.    .BYTE $35,$72,$64,$36,$63,$66,$74,$78,$0037,$79,$67,$78,$62,$68,$75,$76
  1549.    .BYTE $39,$69,$6A,$30,$6D,$6B,$6F,$6E,$007B,$70,$6C,$7D,$2E,$7B,$BA,$2C
  1550.    .BYTE $A9,$60,$7D,$13,$00,$7F,$7E,$2F,$0031,$7F,$04,$32,$20,$02,$71,$03
  1551.    .BYTE $04,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
  1552.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  1553.  
  1554. CON╦EYMAP├APS = *
  1555.    .BYTE $14,$0D,$1D,$88,$85,$86,$87,$11,$0033,$D7,$C1,$34,$DA,$D3,$C5,$01
  1556.    .BYTE $35,$D2,$C4,$36,$C3,$C6,$D4,$D8,$0037,$D9,$C7,$38,$C2,$C8,$D5,$D6
  1557.    .BYTE $39,$C9,$CA,$30,$CD,$CB,$CF,$CE,$002B,$D0,$CC,$2D,$2E,$3A,$40,$2C
  1558.    .BYTE $5C,$2A,$3B,$13,$01,$3D,$5E,$2F,$0031,$5F,$04,$32,$20,$02,$D1,$03
  1559.    .BYTE $04,$38,$35,$09,$32,$34,$37,$31,$001B,$2B,$2D,$0A,$0D,$36,$39,$33
  1560.    .BYTE $08,$30,$2E,$91,$11,$9D,$1D,$00
  1561.  
  1562. CON╙S├OUNTDOWN .BYTE 1
  1563. CON╩IFS╨ER═IN = 3600
  1564. CON╙S═INUTE .WORD CON╩IFS╨ER═IN
  1565. CON╙S═AX .BYTE 1
  1566. CON╙S┴CTIVE .BYTE $00
  1567.  
  1568. CON╙CREEN╙AVE = *
  1569.    LDA CON╙S├OUNTDOWN
  1570.    BNE +
  1571. -  RTS
  1572. +  LDA CON╙S═INUTE+0
  1573.    BNE +
  1574.    DEC CON╙S═INUTE+1
  1575. +  DEC CON╙S═INUTE+0
  1576.    LDA CON╙S═INUTE+0
  1577.    ORA CON╙S═INUTE+1
  1578.    BNE -
  1579.    LDA #<CON╩IFS╨ER═IN
  1580.    LDY #>CON╩IFS╨ER═IN
  1581.    STA CON╙S═INUTE+0
  1582.    STY CON╙S═INUTE+1
  1583.    DEC CON╙S├OUNTDOWN
  1584.    BNE -
  1585.    JSR VDC╙CREEN╙AVE
  1586.    JSR VIC╙CREEN╙AVE
  1587.    LDA #$FF
  1588.    STA CON╙S┴CTIVE
  1589.    RTS
  1590.  
  1591. CON╙CREEN╒NSAVE = *
  1592.    LDA CON╙S═AX
  1593.    STA CON╙S├OUNTDOWN
  1594.    LDA #<CON╩IFS╨ER═IN
  1595.    LDY #>CON╩IFS╨ER═IN
  1596.    STA CON╙S═INUTE+0
  1597.    STY CON╙S═INUTE+1
  1598.    LDA CON╙S┴CTIVE
  1599.    BNE +
  1600.    RTS
  1601. +  JSR VDC╙CREEN╒NSAVE
  1602.    JSR VIC╙CREEN╒NSAVE
  1603.    LDA #$00
  1604.    STA CON╙S┴CTIVE
  1605.    RTS
  1606.  
  1607. ;╘HIS IS TO BE DONE WHEN WE ARE IN THE WRITE ROUTINE ABOUT TO SCROLL THE SCREEN
  1608. ;BECAUSE WE HAVE HIT THE BOTTOM LINE OF THE DISPLAY.  ╔T IS ALSO TO BE DONE IN
  1609. ;THE CONTEXT OF THE DATA REMAINING TO BE PRINTED AT THE TIME.
  1610.  
  1611. CON╠INES╘O╙CROLL .BUF 1
  1612. CON┬YTES╘O╙CROLL .BUF 2
  1613. CON╙CAN╨TR = SYSWORK+14 ;(2)
  1614. CON├OL╬UMBER .BUF 1
  1615. CON═AX╨RESCROLL .BUF 1
  1616.  
  1617. CON╫RITE╬EWLINE = *
  1618.    LDA SHIFT╓ALUE
  1619.    AND #$07
  1620.    BEQ +
  1621. -  JMP CON╬EWLINE
  1622. +  LDX CON├UR╥OW
  1623.    INX
  1624.    CPX CON╫IN╥OWS
  1625.    BCC -
  1626.  
  1627. ;FIND MAXIMUM PRESCROLL AMOUNT;
  1628. ;IF MAXIMUM PRESCROLL AMOUNT < 2 THEN NEVER MIND;
  1629. ;LINES_TO_SCROLL := 1;
  1630. ;BYTES_TO_SCROLL := SCREEN_WIDTH;
  1631. ;SCAN_POINTER := DISPLAY_DATA_PTR;
  1632. ;COL_NUMBER := 0;
  1633.  
  1634. .IF COMPUTER-64
  1635.    LDA CONFIG┬UF+$AC
  1636.    BIT TEXT═ODE ;%%%
  1637.    BMI CON╨RESCROLL┬EGIN
  1638.    LDA CONFIG┬UF+$AD
  1639. .ELSE
  1640.    LDA CONFIG┬UF+$40
  1641.    BIT TEXT═ODE
  1642.    BPL CON╨RESCROLL┬EGIN
  1643.    LDA CONFIG┬UF+$AE
  1644.    LDX VDC╙CROLL╥EU╫ORK+3
  1645.    CPX #ACE═EM╬ULL
  1646.    BEQ CON╨RESCROLL┬EGIN
  1647.    LDA CONFIG┬UF+$AB
  1648. .IFE
  1649.    CON╨RESCROLL┬EGIN = *
  1650.    STA CON═AX╨RESCROLL
  1651.    CMP #2
  1652.    BCS +
  1653.    JMP CON╬EWLINE
  1654. +  LDA #1
  1655.    STA CON╠INES╘O╙CROLL
  1656.    LDA #0 ;CON╥OW╔NC+0
  1657.    LDY #0 ;CON╥OW╔NC+1
  1658.    STA CON┬YTES╘O╙CROLL+0
  1659.    STY CON┬YTES╘O╙CROLL+1
  1660.    LDA #0
  1661.    STA CON├OL╬UMBER
  1662.    INC CON├UR╥OW
  1663.  
  1664. ;REPEAT:
  1665. ;IF CHAR == NEWLINE GOTO LINESCROLLED;
  1666. ;IF COL_NUMBER > LINE_WIDTH ╟╧╙╒┬ LINESCROLLED;
  1667. ;IF CHAR == NORMAL THEN COL_NUMBER += 1; GOTO NEXTCHAR;
  1668. ;IF CHAR == CLEAR GOTO EXIT;  OPTIONAL
  1669. ;IF CHAR == TAB THEN COL_NUMBER += 8 - COL_NUMBER%8; GOTO NEXTCHAR;  OPTIONAL
  1670. ;IF CHAR == BELL GOTO NEXTCHAR;
  1671. ;IF CHAR == RETURN THEN COL_NUMBER := 0; GOTO NEXTCHAR;
  1672. ;IF CHAR == BACKSPACE THEN
  1673. ;    COL_NUMBER -= 1;
  1674. ;    IF COL_NUMBER < 0 THEN COL_NUMBER = 0;
  1675. ;    GOTO NEXTCHAR;
  1676. ;ENDIF
  1677. ;BRK;
  1678. CON╨RESCROLL╥EPEAT = *
  1679.    JMP CON╠INE╙CROLLED
  1680.  
  1681. ;LINESCROLLED:
  1682. ;COL_NUMBER := 0;
  1683. ;LINES_TO_SCROLL += 1;
  1684. ;BYTES_TO_SCROLL += LINE_INC;
  1685. ;IF LINES_TO_SCROLL >= MAXIMUM_PRESCROLL GOTO EXIT;
  1686. CON╠INE╙CROLLED = *
  1687.    JSR CON╠INE╙CROLLED╙UB
  1688.    BCC CON╨RESCROLL╬EXT├HAR
  1689.    BCS CON╨RESCROLL┼XIT
  1690. CON╠INE╙CROLLED╙UB = *
  1691.    LDA #0
  1692.    STA CON├OL╬UMBER
  1693.    INC CON╠INES╘O╙CROLL
  1694.    CLC
  1695.    LDA CON┬YTES╘O╙CROLL+0
  1696.    ADC CON╥OW╔NC+0
  1697.    STA CON┬YTES╘O╙CROLL+0
  1698.    BCC +
  1699.    INC CON┬YTES╘O╙CROLL+1
  1700. +  LDA CON╠INES╘O╙CROLL
  1701.    CMP CON═AX╨RESCROLL
  1702.    RTS
  1703.  
  1704. ;NEXTCHAR:
  1705. ;SCAN POINTER++;
  1706. ;IF SCAN POINTER < SCAN LIMIT GOTO REPEAT;
  1707. CON╨RESCROLL╬EXT├HAR = *
  1708.    JMP CON╨RESCROLL╥EPEAT
  1709.  
  1710. ;EXIT:
  1711. ;SCROLL SCREEN BY LINES_TO_SCROLL;
  1712. ;SUBTRACT BYTES_TO_SCROLL FROM LINE ADDRESS;
  1713. ;LINE_COL := 0;
  1714. ;LINE_ROW -= LINES_TO_SCROLL;
  1715. CON╨RESCROLL┼XIT = *
  1716.    LDA #" "
  1717.    STA SYSWORK+4
  1718.    LDA CON╨UT═ASK
  1719.    ORA #$08
  1720.    LDX CON╠INES╘O╙CROLL
  1721.    LDY CON├HAR├OLOR
  1722.    JSR WINSCROLL
  1723.    SEC
  1724.    LDA CON├UR╥OW
  1725.    SBC CON╠INES╘O╙CROLL
  1726.    STA CON├UR╥OW
  1727.    SEC
  1728.    LDA CON╠INE┴DDR+0
  1729.    SBC CON┬YTES╘O╙CROLL+0
  1730.    STA CON╠INE┴DDR+0
  1731.    LDA CON╠INE┴DDR+1
  1732.    SBC CON┬YTES╘O╙CROLL+1
  1733.    STA CON╠INE┴DDR+1
  1734.    LDA #0
  1735.    STA CON├UR├OL
  1736.    RTS
  1737.  
  1738. ;THE END + BLANK LINE
  1739.  
  1740.