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

  1. ;*** ZED TEXT EDITOR PROGRAM
  2.  
  3. .SEQ ACEHEAD.S
  4. .ORG ACE┴PP┴DDRESS
  5. .OBJ "@0:VI"
  6.  
  7. JMP MAIN
  8. .BYTE ACE╔─1,ACE╔─2,ACE╔─3
  9. .BYTE 64,0  ;** STACK,RESERVED
  10.  
  11. ;*** GLOBAL DECLARATIONS
  12.  
  13. WORK1 = $02 ;(16)
  14. WORK2 = $12 ;(16)
  15. WORK3 = $22 ;(14)
  16.  
  17. CHR├╥ = $0D
  18. CHR╘AB = $09
  19. CHR╤UOTE = $22
  20.  
  21. ;SCREEN
  22.  
  23. SCR╘OP┴DDR      = $30 ;(2)
  24. SCR╠INE┴DDR     = $32 ;(2)
  25. CUR╥OW          = $34 ;(1)
  26. CUR├OL          = $35 ;(1)
  27. SCR╥OWS         = $36 ;(1)
  28. SCR├OLS         = $37 ;(1)
  29. SCR╥OW╔NC       = $38 ;(2)
  30. CUR╠EFT═ARGIN   = $3A ;(1)
  31. STATUS═ARGIN    .BUF 1
  32.  
  33. ;DOCUMENT
  34.  
  35. LINE╨TR         = $40 ;(4)
  36. LINE╬UM         = $44 ;(4)
  37. TOS╠INE╨TR      = $48 ;(4)
  38. TOP╠INE╨TR      = $4C ;(4)
  39. BOT╠INE╨TR      = $50 ;(4)
  40. LINE├OUNT       = $54 ;(4)
  41. FILE╠ENGTH      = $58 ;(4)
  42. TARGET╠EN       = $5C ;(1)
  43. WRAP╞LAG        = $5D ;(1) ;128=WRAP,64=SHOW├╥
  44.  
  45. ;MANAGEMENT
  46.  
  47. MODIFIED        = $3B ;(1) ;$00=NO, $FF=MODIFIED
  48. MODE╞LAGS       = $3C ;(1) ;$80=INSERT, $40=INDENT
  49. STATUS╒PDATE    = $3D ;(1) ;128=LINE,64=COL,32=MOD,16=INS,8=BYT,4=FRE,2=NM,1=MSG
  50. MARKED╠INE╨TR   .BUF 4 ;(4)
  51. MARKED╠INE╬UM   .BUF 4 ;(4)
  52. MARKED├OL       .BUF 4 ;(1)
  53.  
  54. ;LINE FORMAT
  55.  
  56. HEAD┬UFFER      = $70 ;(11)
  57. HEAD╬EXT╨TR     = $70 ;(4)
  58. HEAD╨REV╨TR     = $74 ;(4)
  59. HEAD╠INE╠EN     = $78 ;(1)
  60. HEAD╔NDENT      = $79 ;(1)
  61. HEAD╞LAGS       = $7A ;(1) ;$80=CONNECTED, $40=NULL╠INE, $3╞=INDENT
  62. HEAD╠ENGTH      = $0B
  63.  
  64. ;KILL BUFFER
  65.  
  66. BUFFER╘OP╨TR    .BUF 4 ;(4)
  67. BUFFER┬OT╨TR    .BUF 4 ;(4)
  68. BUFFER╠INE├OUNT .BUF 4 ;(4)
  69.  
  70. ;DOCUMENT BUFFERS
  71.  
  72. ;COLORS
  73.  
  74. CHAR├OLOR   .BYTE $0C  ;$0E
  75. CURSOR├OLOR .BYTE $06
  76. STATUS├OLOR .BYTE $04
  77. SEPAR├OLOR  .BYTE $0F  ;$03
  78. HILITE├OLOR .BYTE $0D  ;$0C
  79. ALERT├OLOR  .BYTE $0F
  80. BORDER├OLOR .BYTE $00
  81. BKGND├OLOR  .BYTE $00
  82.  
  83. ;=== NEW ===
  84.  
  85. SCREEN╔NIT = *
  86.    ;** GET SCREEN PARMS
  87.    JSR WINSIZE
  88.    STA SCR╥OWS
  89.    STX SCR├OLS
  90.    LDA SYSWORK+2
  91.    LDY SYSWORK+3
  92.    STA SCR╘OP┴DDR+0
  93.    STY SCR╘OP┴DDR+1
  94.    LDA SYSWORK+4
  95.    LDY SYSWORK+5
  96.    STA SCR╥OW╔NC+0
  97.    STY SCR╥OW╔NC+1
  98.    ;** GET COLOR PALETTE
  99.    JSR CONPALETTE
  100.    LDX #7
  101. -  LDA SYSWORK,X
  102.    STA CHAR├OLOR,X
  103.    DEX
  104.    BPL -
  105.    ;** CLEAR SCREEN
  106.    LDA #$E0
  107.    LDX #$20
  108.    LDY CHAR├OLOR
  109.    JSR WINCLS
  110.    LDA #2
  111.    LDX #0
  112.    JSR CONPOS
  113.    ;** SET STATUS COLOR
  114.    LDA SCR╘OP┴DDR+0
  115.    LDY SCR╘OP┴DDR+1
  116.    STA SYSWORK+0
  117.    STY SYSWORK+1
  118.    LDA SCR├OLS
  119.    STA SYSWORK+5
  120.    LDA #$60
  121.    LDY STATUS├OLOR
  122.    LDX #0
  123.    JSR WINPUT
  124.    ;** SET SEPARATOR COLOR
  125.    JSR SET╙EPAR┴DDR
  126.    LDA #$60
  127.    LDY SEPAR├OLOR
  128.    LDX #0
  129.    JSR WINPUT
  130.    JSR DISPLAY╙EPARATOR
  131.    LDA #$FF
  132.    STA STATUS╒PDATE
  133.    JSR UPDATE╙TATUS
  134.    RTS
  135.  
  136. SET╙EPAR┴DDR = *
  137.    CLC
  138.    LDA SCR╘OP┴DDR+0
  139.    ADC SCR╥OW╔NC+0
  140.    STA SYSWORK+0
  141.    LDA SCR╘OP┴DDR+1
  142.    ADC SCR╥OW╔NC+1
  143.    STA SYSWORK+1
  144.    RTS
  145.  
  146. DISPLAY╙TATUS = *
  147.    LDA SCR╘OP┴DDR+0
  148.    LDY SCR╘OP┴DDR+1
  149.    STA SYSWORK+0
  150.    STY SYSWORK+1
  151.    LDA #<STATUS╠INE
  152.    LDY #>STATUS╠INE
  153.    CLC
  154.    ADC STATUS═ARGIN
  155.    BCC +
  156.    INY
  157. +  STA SYSWORK+2
  158.    STY SYSWORK+3
  159.    LDA SCR├OLS
  160.    STA SYSWORK+5
  161.    LDA #$80
  162.    LDX SCR├OLS
  163.    JSR WINPUT
  164.    RTS
  165.  
  166. STATUS╠INE = *
  167.   .ASC "╠:12345678├:241 *  ╔NS  ╔ND  ┬:12345678  ╞:12345678 "
  168.      ; "0----+----1----+----2----+----3----+----4----+----5-"
  169.   .ASC "1234567890123456789012345678"
  170.      ; "---+----6----+----7----+----"
  171.  
  172. UPDATE╙TATUS = *
  173.    JSR DISPLAY╙TATUS
  174.    RTS
  175.  
  176. DISPLAY╙EPARATOR = *
  177.    JSR SET╙EPAR┴DDR
  178.    LDA #"-"
  179.    STA SYSWORK+4
  180.    LDA SCR├OLS
  181.    STA SYSWORK+5
  182.    LDA #$80
  183.    LDX #0
  184.    JSR WINPUT
  185.    RTS
  186.  
  187. ;=== MAIN ===
  188.  
  189. MAIN = *
  190.    JSR MALLOC╔NIT
  191.    JSR MAIN╔NIT
  192.    JSR SCREEN╔NIT
  193.    JSR DISPLAY╙TATUS
  194.    LDA #1
  195.    LDY #0
  196.    JSR GETARG
  197.    JSR LOAD╞ILE
  198.    JSR DUMP─OC
  199.    RTS
  200.  
  201. MSG .ASC "┌ED FOR ┴├┼ VERSION ┴├┼-0.01"
  202.     .BYTE CHR├╥,0
  203.  
  204. MAIN╔NIT = *
  205.    LDX #$7F-$02
  206.    LDA #0
  207. -  STA 2,X
  208.    DEX
  209.    BPL -
  210.    LDA #$80
  211.    STA WRAP╞LAG
  212.    JSR WINSIZE
  213.    STX TARGET╠EN
  214.    RTS
  215.  
  216. ;*** LOAD FILE: USES WORK2 ***
  217.  
  218. LOAD╚EAD  = WORK2+0
  219. LOAD╘AIL  = WORK2+4
  220. LOAD╠INES = WORK2+8
  221. LOAD┬YTES = WORK2+12
  222. LOAD╞CB      = WORK3+0
  223. LOAD╠INE╙CAN = WORK3+1
  224. LOAD╠INE╠EN  = WORK3+2
  225. LOAD┬UF├OUNT = WORK3+3
  226. LOAD┬UF╨TR   = WORK3+4
  227.  
  228. LOAD╞ILE = *  ;( (ZP)=NAME ) : [W2]=HEAD, [W2]=TAIL, [W2]=LINES, [W2]=BYTES
  229.    JSR SAVE╫ORK3
  230.    JSR LOAD╔NIT
  231.    LDA #"R"
  232.    JSR OPEN
  233.    STA LOAD╞CB
  234. -  JSR LOAD╠INE
  235.    BCS +
  236.    JSR LOAD╠INE╫RAP
  237.    JSR LOAD╠INE╙TORE
  238.    JSR LOAD╠INE╧VERFLOW
  239.    JMP -
  240. +  LDA LOAD╠INE╠EN
  241.    BEQ +
  242.    JSR LOAD╠INE╫RAP
  243.    LDA #$00
  244.    STA HEAD╞LAGS
  245.    JSR LOAD╠INE╙TORE
  246. +  LDA LOAD╞CB
  247.    JSR CLOSE
  248.    JSR RESTORE╫ORK3
  249.    RTS
  250.  
  251. LOAD╔NIT = *
  252.    LDA #0
  253.    LDX #16+14-1
  254. -  STA LOAD╚EAD,X
  255.    DEX
  256.    BPL -
  257.    RTS
  258.  
  259. LOAD╠INE = *  ;( ) : .├╙=END
  260.    ;TAB EXPANSION WILL GO INTO THIS ROUTINE
  261.    LDX LOAD┬UF╨TR
  262.    LDY LOAD╠INE╠EN
  263.  
  264.    LOAD╬EXT┬YTE = *
  265.    LDA LOAD┬UF├OUNT
  266.    BNE ++
  267.    STY LOAD╠INE╠EN
  268.    JSR LOAD┬UF
  269.    BCC +
  270.    RTS
  271. +  LDY LOAD╠INE╠EN
  272.    LDX LOAD┬UF╨TR
  273. +  NOP
  274.  
  275. -  LDA FILEBUF,X
  276.    STA LINE,Y
  277.    INX
  278.    INY
  279.    CMP #CHR├╥
  280.    BEQ ++
  281.    CPY TARGET╠EN
  282.    BEQ +  ;DETERMINES IF ├╥S WILL GO BEYOND LEN
  283.    BCS ++
  284. +  DEC LOAD┬UF├OUNT
  285.    BNE -
  286.    BEQ LOAD╬EXT┬YTE
  287.  
  288. +  DEC LOAD┬UF├OUNT
  289.    STX LOAD┬UF╨TR
  290.    STY LOAD╠INE╠EN
  291.    CLC
  292.    RTS
  293.  
  294. LOAD┬UF = *  ;( ) : .├╙=EOF
  295.    JSR STOPKEY
  296.    BCS +
  297.    LDA #<FILEBUF
  298.    LDY #>FILEBUF
  299.    STA ZP+0
  300.    STY ZP+1
  301.    LDA #<254
  302.    LDY #>254
  303.    LDX LOAD╞CB
  304.    JSR READ
  305.    BCS +
  306.    BEQ +
  307.    STA LOAD┬UF├OUNT
  308.    LDA #0
  309.    STA LOAD┬UF╨TR
  310.    CLC
  311.    RTS
  312. +  SEC
  313.    RTS
  314.  
  315. LOAD╠INE╫RAP = *
  316.    LDX LOAD╠INE╠EN
  317.    DEX
  318.    LDY #$00
  319.    LDA LINE,X
  320.    CMP #CHR├╥
  321.    BEQ +
  322.    LDY #$80
  323. +  STY HEAD╞LAGS
  324.    CMP #CHR├╥
  325.    BNE +
  326. -  STX HEAD╠INE╠EN
  327.    STX LOAD╠INE╙CAN
  328.    STX LOAD╠INE╠EN
  329.    RTS
  330.  
  331. +  LDX LOAD╠INE╠EN
  332.    CPX TARGET╠EN
  333.    BCC -
  334.  
  335. +  BIT WRAP╞LAG
  336.    BMI +
  337. -  LDA TARGET╠EN
  338.    STA LOAD╠INE╙CAN
  339.    STA HEAD╠INE╠EN
  340.    RTS
  341.  
  342. +  LDX TARGET╠EN
  343. -  DEX
  344.    CPX #255
  345.    BEQ --
  346.    LDA LINE,X
  347.    CMP #" "
  348.    BNE -
  349. +  INX
  350.    STX LOAD╠INE╙CAN
  351.    STX HEAD╠INE╠EN
  352.    RTS
  353.  
  354. LOAD╠INE╙TORE = *
  355.    INC LOAD╠INES+0
  356.    BNE +
  357.    INC LOAD╠INES+1
  358.    BNE +
  359.    INC LOAD╠INES+2
  360.    BNE +
  361.    INC LOAD╠INES+3
  362. +  SEC
  363.    BIT HEAD╞LAGS
  364.    BMI +
  365.    CLC
  366. +  LDA LOAD┬YTES+0
  367.    ADC HEAD╠INE╠EN
  368.    STA LOAD┬YTES+0
  369.    BCC +
  370.    INC LOAD┬YTES+1
  371.    BNE +
  372.    INC LOAD┬YTES+2
  373.    BNE +
  374.    INC LOAD┬YTES+3
  375. +  LDX #3
  376. -  LDA #ACE═EM╬ULL
  377.    STA HEAD╬EXT╨TR,X
  378.    LDA LOAD╘AIL,X
  379.    STA HEAD╨REV╨TR,X
  380.    DEX
  381.    BPL -
  382.    JSR STASH╠INE
  383.  
  384.    ;** FIRST LINE TO BE STORED
  385.    LDA LOAD╚EAD+3
  386.    CMP #ACE═EM╬ULL
  387.    BNE +
  388.    LDX #3
  389. -  LDA MP,X
  390.    STA LOAD╚EAD,X
  391.    STA LOAD╘AIL,X
  392.    DEX
  393.    BPL -
  394.    RTS
  395.  
  396.    ;** ADDITIONAL LINES
  397. +  LDX #3
  398. -  LDA MP,X
  399.    LDY LOAD╘AIL,X
  400.    STA LOAD╘AIL,X
  401.    STY MP,X
  402.    DEX
  403.    BPL -
  404.    JSR FETCH╚EAD
  405.    LDX #3
  406. -  LDA LOAD╘AIL,X
  407.    STA HEAD╬EXT╨TR,X
  408.    DEX
  409.    BPL -
  410.    JSR STASH╚EAD
  411.    RTS
  412.  
  413. LOAD╠INE╧VERFLOW = *
  414.    LDX LOAD╠INE╙CAN
  415.    LDY #0
  416. -  CPX LOAD╠INE╠EN
  417.    BCS +
  418.    LDA LINE,X
  419.    STA LINE,Y
  420.    INX
  421.    INY
  422.    BNE -
  423. +  STY LOAD╠INE╠EN
  424.    RTS
  425.  
  426. ;=== MANAGEMENT ROUTINES ===
  427.  
  428. WORK3╙AVE .BUF 14
  429.  
  430. SAVE╫ORK3 = *
  431.    LDX #13
  432. -  LDA WORK3,X
  433.    STA WORK3╙AVE,X
  434.    DEX
  435.    BPL -
  436.    RTS
  437.  
  438. RESTORE╫ORK3 = *
  439.    LDX #13
  440. -  LDA WORK3╙AVE,X
  441.    STA WORK3,X
  442.    DEX
  443.    BPL -
  444.    RTS
  445.  
  446. FETCH╠INE┼XTRA = 6
  447.  
  448. FETCH╠INE = *  ;( [MP]=FAR╠INE ) : HEAD*, LINEBUF
  449.    LDA #<LINEBUF
  450.    LDY #>LINEBUF
  451.    STA ZP+0
  452.    STY ZP+1
  453.    LDA #HEAD╠ENGTH+FETCH╠INE┼XTRA
  454.    LDY #0
  455.    JSR FETCH
  456.    LDX #HEAD╠ENGTH-1
  457. -  LDA LINEBUF,X
  458.    STA HEAD┬UFFER,X
  459.    DEX
  460.    BPL -
  461.    LDA HEAD╠INE╠EN
  462.    CMP #FETCH╠INE┼XTRA+1
  463.    BCC +
  464.    CLC
  465.    ADC #HEAD╠ENGTH
  466.    LDY #0
  467.    JSR FETCH
  468. +  RTS
  469.  
  470. STASH╠INE = *  ;( HEAD*, LINEBUF ) : [MP]=STORED╠INE, .├╙=ERR
  471.    LDA #0
  472.    STA HEAD╔NDENT
  473.    LDX #HEAD╠ENGTH-1
  474. -  LDA HEAD┬UFFER,X
  475.    STA LINEBUF,X
  476.    DEX
  477.    BPL -
  478.    CLC
  479.    LDA HEAD╠INE╠EN
  480.    ADC #HEAD╠ENGTH
  481.    LDY #0
  482.    JSR MALLOC
  483.    BCC +
  484.    RTS
  485. +  LDA #<LINEBUF
  486.    LDY #>LINEBUF
  487.    STA ZP+0
  488.    STY ZP+1
  489.    CLC
  490.    LDA HEAD╠INE╠EN
  491.    ADC #HEAD╠ENGTH
  492.    LDY #0
  493.    JSR STASH
  494.    CLC
  495.    RTS
  496.    
  497. FETCH╚EAD = *  ;( [MP]=FAR╠INE╨TR ) : HEAD┬UFFER
  498.    LDX #HEAD┬UFFER
  499.    LDY #HEAD╠ENGTH
  500.    JSR ZPLOAD
  501.    RTS
  502.  
  503. STASH╚EAD = *  ;( [MP]=FAR╠INE╨TR, HEAD┬UFFER )
  504.    LDX #HEAD┬UFFER
  505.    LDY #HEAD╠ENGTH
  506.    JSR ZPSTORE
  507.    RTS
  508.  
  509. ;=== DYNAMIC MEMORY ROUTINES ===
  510.  
  511. MALLOC╫ORK = WORK1
  512.  
  513. MALLOC╚EAD   .BUF 4
  514. TPA╞REE╞IRST .BUF 1
  515. TPA╞REE═IN   .BUF 1
  516. TPA╞REE╨AGES .BUF 1
  517. TPA┴REA╙TART .BUF 1
  518. TPA┴REA┼ND   .BUF 1
  519.  
  520. ;*** MALLOC╔NIT()
  521.  
  522. MALLOC╔NIT = *
  523.    LDA #ACE═EM╬ULL
  524.    STA MALLOC╚EAD+3
  525.    LDX #0
  526.    LDA #$FF
  527. -  STA TPA╞REEMAP,X
  528.    INX
  529.    BNE -
  530.    LDX #>BSS┼ND
  531.    LDA #<BSS┼ND
  532.    BEQ +
  533.    INX
  534. +  STX TPA╞REE╞IRST
  535.    STX TPA┴REA╙TART
  536.    LDX ACE═EM╘OP+1
  537.    STX MALLOC╫ORK
  538.    STX TPA┴REA┼ND
  539.    TXA
  540.    SEC
  541.    SBC TPA╞REE╞IRST
  542.    BCS +
  543.    LDA #0
  544. +  STA TPA╞REE╨AGES
  545.    CLC
  546.    ADC #1
  547.    STA TPA╞REE═IN
  548.    LDX TPA╞REE╞IRST
  549.    CPX MALLOC╫ORK
  550.    BCS +
  551.    LDA #$00
  552. -  STA TPA╞REEMAP,X
  553.    INX
  554.    CPX MALLOC╫ORK
  555.    BCC -
  556. +  RTS
  557.  
  558. LIB╨AGES .BUF 1
  559.  
  560. LIB╨AGE┴LLOC = *  ;( .┴=PAGES ) : [MP]
  561.    STA LIB╨AGES
  562.    LDX #$00
  563.    LDY #ACE═EM╔NTERNAL-1
  564.    JSR PAGEALLOC
  565.    BCS +
  566.    RTS
  567. +  JSR TPA╨AGE┴LLOC
  568.    BCS +
  569.    RTS
  570. +  LDA LIB╨AGES
  571.    LDX #ACE═EM╔NTERNAL
  572.    LDY #$FF
  573.    JSR PAGEALLOC
  574.    BCS +
  575.    RTS
  576. +  LDA #<NOMEM═SG
  577.    LDY #>NOMEM═SG
  578.    JSR EPUTS
  579.    LDA #1
  580.    JMP EXIT
  581.  
  582.    NOMEM═SG = *
  583.    .BYTE CHR├╥
  584.    .ASC "╔NSUFFICIENT MEMORY, ABORTING."
  585.    .BYTE CHR├╥,0
  586.  
  587. NEWMAX   .BUF 1
  588.  
  589. TPA╨AGE┴LLOC = *  ;( LIB╨AGES ) : [MP]
  590.    LDA LIB╨AGES
  591.    CMP TPA╞REE═IN
  592.    BCS TPA╞REEMAP╞ULL
  593.    ;** FIRST FREE
  594.    LDX TPA╞REE╞IRST
  595.    LDA TPA╞REEMAP,X
  596.    BEQ ++
  597. -  INX
  598.    BEQ TPA╞REEMAP╞ULL
  599.    LDA TPA╞REEMAP,X
  600.    BNE -
  601.    STX TPA╞REE╞IRST
  602.    JMP ++
  603.    TPA╞REEMAP╞ULL = *
  604.    LDA LIB╨AGES
  605.    CMP TPA╞REE═IN
  606.    BCS +
  607.    STA TPA╞REE═IN
  608. +  SEC
  609.    RTS
  610.  
  611.    ;** SEARCH
  612. +  DEX
  613. -  LDY LIB╨AGES
  614. -  INX
  615.    BEQ TPA╞REEMAP╞ULL
  616.    LDA TPA╞REEMAP,X
  617.    BNE --
  618.    DEY
  619.    BNE -
  620.  
  621.    ;** ALLOCATE
  622.    STX NEWMAX
  623.    LDY LIB╨AGES
  624.    LDA #$41
  625. -  STA TPA╞REEMAP,X
  626.    DEX
  627.    DEY
  628.    BNE -
  629.    INX
  630.    CPX TPA╞REE╞IRST
  631.    BNE +
  632.    LDY NEWMAX
  633.    INY
  634.    STY TPA╞REE╞IRST
  635. +  SEC
  636.    LDA TPA╞REE╨AGES
  637.    SBC LIB╨AGES
  638.    STA TPA╞REE╨AGES
  639.    LDA #0
  640.    LDY #ACE═EM╔NTERNAL
  641.    STA MP+0
  642.    STX MP+1
  643.    STA MP+2
  644.    STY MP+3
  645.    CLC
  646.    RTS
  647.  
  648. MALLOC╠EN╙AVE .BUF 3
  649.  
  650. MALLOC = *
  651. QUICK═ALLOC = *
  652.    STA MALLOC╠EN╙AVE+0
  653.    STY MALLOC╠EN╙AVE+1
  654.    JSR LIB═ALLOC
  655.    BCS +
  656.    RTS
  657. +  LDX MALLOC╠EN╙AVE+1
  658.    LDA MALLOC╠EN╙AVE+0
  659.    BEQ +
  660.    INX
  661. +  TXA
  662.    CPX #>1024
  663.    BCS +
  664.    LDX #>1024
  665. +  TXA
  666.    STA MALLOC╠EN╙AVE+2
  667.    JSR LIB╨AGE┴LLOC
  668.    BCC +
  669.    RTS
  670. +  LDA #0
  671.    LDY MALLOC╠EN╙AVE+2
  672.    JSR FREE
  673.    LDA MALLOC╠EN╙AVE+0
  674.    LDY MALLOC╠EN╙AVE+1
  675.    JMP MALLOC
  676.  
  677. ;*** MALLOC( .┴┘=┬YTES ) : [MP]=╞AR╨OINTER
  678.  
  679. MALLOC═EM╬EXT╨TR = MALLOC╫ORK+0 ;(4)
  680. MALLOC═EM╠ENGTH  = MALLOC╫ORK+4 ;(2)
  681. MALLOC╠ENGTH     = MALLOC╫ORK+6 ;(2)
  682. MALLOC╤          = MALLOC╫ORK+8 ;(4)
  683.  
  684. LIB═ALLOC = *
  685.    CLC
  686.    ADC #7
  687.    BCC +
  688.    INY
  689. +  AND #$F8
  690.    STA MALLOC╠ENGTH
  691.    STY MALLOC╠ENGTH+1
  692.    LDX #3
  693. -  LDA MALLOC╚EAD,X
  694.    STA MP,X
  695.    LDA #ACE═EM╬ULL
  696.    STA MALLOC╤,X
  697.    DEX
  698.    BPL -
  699.  
  700.    MALLOC╠OOK = *
  701.    LDA MP+3
  702.    CMP #ACE═EM╬ULL
  703.    BNE +
  704.  
  705.    MALLOC┼RROR┼XIT = *
  706.    LDA #ACE═EM╬ULL
  707.    STA MP+3
  708.    LDA #ACE┼RR╔NSUFFICIENT═EMORY
  709.    STA ERRNO
  710.    SEC
  711.    RTS
  712.  
  713. +  LDX #MALLOC═EM╬EXT╨TR
  714.    LDY #6
  715.    JSR ZPLOAD
  716.    LDA MALLOC═EM╠ENGTH
  717.    CMP MALLOC╠ENGTH
  718.    LDA MALLOC═EM╠ENGTH+1
  719.    SBC MALLOC╠ENGTH+1
  720.    BCS MALLOC╟OT┬LOCK
  721.    LDX #3
  722. -  LDA MP,X
  723.    STA MALLOC╤,X
  724.    LDA MALLOC═EM╬EXT╨TR,X
  725.    STA MP,X
  726.    DEX
  727.    BPL -
  728.    JMP MALLOC╠OOK
  729.  
  730.    MALLOC╟OT┬LOCK = *
  731.    LDA MALLOC═EM╠ENGTH
  732.    CMP MALLOC╠ENGTH
  733.    BNE +
  734.    LDA MALLOC═EM╠ENGTH+1
  735.    SBC MALLOC╠ENGTH+1
  736.    BEQ MALLOC╘AKE╫HOLE┬LOCK
  737. +  SEC
  738.    LDA MALLOC═EM╠ENGTH
  739.    SBC MALLOC╠ENGTH
  740.    STA MALLOC═EM╠ENGTH
  741.    LDA MALLOC═EM╠ENGTH+1
  742.    SBC MALLOC╠ENGTH+1
  743.    STA MALLOC═EM╠ENGTH+1
  744.    LDX #MALLOC═EM╬EXT╨TR
  745.    LDY #6
  746.    JSR ZPSTORE
  747.    CLC
  748.    LDA MP+0
  749.    ADC MALLOC═EM╠ENGTH
  750.    STA MP+0
  751.    LDA MP+1
  752.    ADC MALLOC═EM╠ENGTH+1
  753.    STA MP+1
  754.    CLC
  755.    RTS
  756.  
  757.    MALLOC╘AKE╫HOLE┬LOCK = *
  758.    LDA MALLOC╤+3
  759.    CMP #ACE═EM╬ULL
  760.    BNE +
  761.    LDX #3
  762. -  LDA MALLOC═EM╬EXT╨TR,X
  763.    STA MALLOC╚EAD,X
  764.    DEX
  765.    BPL -
  766.    CLC
  767.    RTS
  768. +  LDX #3
  769. -  LDA MP,X
  770.    LDY MALLOC╤,X
  771.    STA MALLOC╤,X
  772.    STY MP,X
  773.    DEX
  774.    BPL -
  775.    LDX #MALLOC═EM╬EXT╨TR
  776.    LDY #4
  777.    JSR ZPSTORE
  778.    LDX #3
  779. -  LDA MALLOC╤,X
  780.    STA MP,X
  781.    DEX
  782.    BPL -
  783.    CLC
  784.    RTS
  785.  
  786. ;*** FREE( [MP]=╞AR╨OINTER, .┴┘=╠ENGTH )  ALTERS [MP]
  787.  
  788. FREE═EM╬EXT╨TR = MALLOC╫ORK+0  ;(4)
  789. FREE═EM╠ENGTH  = MALLOC╫ORK+4  ;(2)
  790. FREE╠ENGTH     = MALLOC╫ORK+6  ;(2)
  791. FREE╬EW╨TR     = MALLOC╫ORK+8  ;(4)
  792. FREE╤          = MALLOC╫ORK+12 ;(4)
  793.  
  794. FREE = *
  795.    CLC
  796.    ADC #7
  797.    BCC +
  798.    INY
  799. +  AND #$F8
  800.    STA FREE╠ENGTH+0
  801.    STY FREE╠ENGTH+1
  802.    LDX #3
  803. -  LDA MP,X
  804.    STA FREE╬EW╨TR,X
  805.    LDA MALLOC╚EAD,X
  806.    STA MP,X
  807.    LDA #ACE═EM╬ULL
  808.    STA FREE╤,X
  809.    DEX
  810.    BPL -
  811.  
  812.    FREE╙EARCH╠OOP = *
  813.    LDA MP+3
  814.    CMP #ACE═EM╬ULL
  815.    BEQ FREE├OALESCE╤AND╬EW
  816.    LDA MP+0
  817.    CMP FREE╬EW╨TR+0
  818.    LDA MP+1
  819.    SBC FREE╬EW╨TR+1
  820.    LDA MP+2
  821.    SBC FREE╬EW╨TR+2
  822.    LDA MP+3
  823.    SBC FREE╬EW╨TR+3
  824.    BCS FREE├OALESCE╤AND╬EW
  825. +  LDX #FREE═EM╬EXT╨TR
  826.    LDY #4
  827.    JSR ZPLOAD
  828.    LDX #3
  829. -  LDA MP,X
  830.    STA FREE╤,X
  831.    LDA FREE═EM╬EXT╨TR,X
  832.    STA MP,X
  833.    DEX
  834.    BPL -
  835.    BMI FREE╙EARCH╠OOP
  836.  
  837.    FREE├OALESCE╤AND╬EW = *
  838.    LDX #3
  839. -  LDA FREE╤,X
  840.    STA MP,X
  841.    DEX
  842.    BPL -
  843.    LDA MP+3
  844.    CMP #ACE═EM╬ULL
  845.    BNE +
  846.    ;** PREV IS HEAD
  847.    LDX #3
  848. -  LDA MALLOC╚EAD,X
  849.    STA FREE═EM╬EXT╨TR,X
  850.    LDA FREE╬EW╨TR,X
  851.    STA MALLOC╚EAD,X
  852.    DEX
  853.    BPL -
  854.    LDA FREE╠ENGTH+0
  855.    LDY FREE╠ENGTH+1
  856.    STA FREE═EM╠ENGTH+0
  857.    STY FREE═EM╠ENGTH+1
  858.    JMP FREE├OALESCE╬EW┴ND╨
  859.  
  860.    ;** PREV IS REAL
  861. +  LDX #FREE═EM╬EXT╨TR
  862.    LDY #6
  863.    JSR ZPLOAD
  864.    LDA MP+3
  865.    CMP FREE╬EW╨TR+3
  866.    BNE +
  867.    LDA MP+2
  868.    CMP FREE╬EW╨TR+2
  869.    BNE +
  870.    CLC
  871.    LDA MP+0
  872.    ADC FREE═EM╠ENGTH
  873.    TAX
  874.    LDA MP+1
  875.    ADC FREE═EM╠ENGTH+1
  876.    CMP FREE╬EW╨TR+1
  877.    BNE +
  878.    CPX FREE╬EW╨TR
  879.    BNE +
  880.    ;** PREV DOES COALESCE
  881.    CLC
  882.    LDA FREE═EM╠ENGTH
  883.    ADC FREE╠ENGTH
  884.    STA FREE═EM╠ENGTH
  885.    LDA FREE═EM╠ENGTH+1
  886.    ADC FREE╠ENGTH+1
  887.    STA FREE═EM╠ENGTH+1
  888.    LDX #3
  889. -  LDA FREE╤,X
  890.    STA FREE╬EW╨TR,X
  891.    DEX
  892.    BPL -
  893.    BMI FREE├OALESCE╬EW┴ND╨
  894.  
  895.    ;** PREV DOES NOT COALESCE
  896. +  LDX #FREE╬EW╨TR
  897.    LDY #4
  898.    JSR ZPSTORE
  899.    LDA FREE╠ENGTH+0
  900.    LDY FREE╠ENGTH+1
  901.    STA FREE═EM╠ENGTH+0
  902.    STY FREE═EM╠ENGTH+1
  903.  
  904.    FREE├OALESCE╬EW┴ND╨ = *
  905.    LDA FREE╬EW╨TR+3
  906.    CMP FREE═EM╬EXT╨TR+3
  907.    BNE +
  908.    LDA FREE╬EW╨TR+2
  909.    CMP FREE═EM╬EXT╨TR+2
  910.    BNE +
  911.    CLC
  912.    LDA FREE╬EW╨TR
  913.    ADC FREE═EM╠ENGTH
  914.    TAX
  915.    LDA FREE╬EW╨TR+1
  916.    ADC FREE═EM╠ENGTH+1
  917.    CMP FREE═EM╬EXT╨TR+1
  918.    BNE +
  919.    CPX FREE═EM╬EXT╨TR
  920.    BNE +
  921.  
  922.    ;** NEW AND NEXT COALESCE
  923.    LDX #3
  924. -  LDA FREE═EM╬EXT╨TR,X
  925.    STA MP,X
  926.    DEX
  927.    BPL -
  928.    LDA FREE═EM╠ENGTH+1
  929.    PHA
  930.    LDA FREE═EM╠ENGTH+0
  931.    PHA
  932.    LDX #FREE═EM╬EXT╨TR
  933.    LDY #6
  934.    JSR ZPLOAD
  935.    CLC
  936.    PLA
  937.    ADC FREE═EM╠ENGTH+0
  938.    STA FREE═EM╠ENGTH+0
  939.    PLA
  940.    ADC FREE═EM╠ENGTH+1
  941.    STA FREE═EM╠ENGTH+1
  942.  
  943. +  LDX #3
  944. -  LDA FREE╬EW╨TR,X
  945.    STA MP,X
  946.    DEX
  947.    BPL -
  948.    LDX #FREE═EM╬EXT╨TR
  949.    LDY #6
  950.    JSR ZPSTORE
  951.    CLC
  952.    RTS
  953.  
  954. ;=== STANDARD LIBRARY ===
  955.  
  956. PUTS = *
  957.    LDX #STDOUT
  958. FPUTS = *
  959.    STA ZP+0
  960.    STY ZP+1
  961.    LDY #$FF
  962. -  INY
  963.    LDA (ZP),Y
  964.    BNE -
  965.    TYA
  966.    LDY #0
  967.    JMP WRITE
  968. EPUTS = *
  969.    LDX #STDERR
  970.    JMP FPUTS
  971.  
  972. PUTCHAR = *
  973.    STX XSAVE
  974.    STY YSAVE
  975.    LDX #STDOUT
  976.    JSR PUTC
  977.    LDX XSAVE
  978.    LDY YSAVE
  979.    RTS
  980.    XSAVE .BUF 1
  981.    YSAVE .BUF 1
  982.  
  983. PUTC = *
  984.    STA PUTC┬UFFER
  985.    LDA #<PUTC┬UFFER
  986.    LDY #>PUTC┬UFFER
  987.    STA ZP+0
  988.    STY ZP+1
  989.    LDA #1
  990.    LDY #0
  991.    JMP WRITE
  992.    PUTC┬UFFER .BUF 1
  993.  
  994. GETCHAR = *
  995.    LDX #STDIN
  996. GETC = *
  997.    LDA #<GETC┬UFFER
  998.    LDY #>GETC┬UFFER
  999.    STA ZP+0
  1000.    STY ZP+1
  1001.    LDA #1
  1002.    LDY #0
  1003.    JSR READ
  1004.    BEQ +
  1005.    LDA GETC┬UFFER
  1006.    RTS
  1007. +  SEC
  1008.    RTS
  1009.    GETC┬UFFER .BUF 1
  1010.  
  1011. GETARG = *
  1012.    STY ZP+1
  1013.    ASL
  1014.    STA ZP+0
  1015.    ROL ZP+1
  1016.    CLC
  1017.    LDA ACE┴RGV
  1018.    ADC ZP+0
  1019.    STA ZP+0
  1020.    LDA ACE┴RGV+1
  1021.    ADC ZP+1
  1022.    STA ZP+1
  1023.    LDY #0
  1024.    LDA (ZP),Y
  1025.    TAX
  1026.    INY
  1027.    LDA (ZP),Y
  1028.    STX ZP+0
  1029.    STA ZP+1
  1030.    RTS
  1031.  
  1032. ;===╬┼╫ ╞╒╬├╘╔╧╬╙===
  1033.  
  1034. STOP├OUNTDOWN .BYTE 0
  1035.  
  1036. DUMP─OC = *
  1037.    LDA #$E0
  1038.    LDX #$20
  1039.    LDY CHAR├OLOR
  1040.    JSR WINCLS
  1041.  
  1042.    LDX #3
  1043. -  LDA LOAD╚EAD,X
  1044.    STA MP,X
  1045.    DEX
  1046.    BPL -
  1047.  
  1048. -  LDA MP+3
  1049.    CMP #ACE═EM╬ULL
  1050.    BNE +
  1051.    RTS
  1052. +  JSR FETCH╠INE
  1053.    LDA #<LINE
  1054.    LDY #>LINE
  1055.    STA ZP+0
  1056.    STY ZP+1
  1057.    LDA HEAD╠INE╠EN
  1058.    LDY #0
  1059.    LDX #STDOUT
  1060.    JSR WRITE
  1061.    LDA HEAD╞LAGS
  1062.    BPL +
  1063.    ;LDA #"="
  1064.    ;JSR PUTCHAR
  1065. +  LDA #CHR├╥
  1066.    JSR PUTCHAR
  1067.    LDX #3
  1068. -  LDA HEAD╬EXT╨TR,X
  1069.    STA MP,X
  1070.    DEX
  1071.    BPL -
  1072.    INC STOP├OUNTDOWN
  1073.    LDA STOP├OUNTDOWN
  1074.    AND #7
  1075.    BNE +
  1076.    JSR STOPKEY
  1077.    BCC +
  1078.    LDA #1
  1079.    LDX #0
  1080.    JMP EXIT
  1081. +  JMP --
  1082.  
  1083. ;===BSS===
  1084.  
  1085. BSS             = *
  1086. LINEBUF         = BSS+0  ;(256)
  1087. LINE            = LINEBUF+HEAD╠ENGTH ;(241)
  1088.  
  1089. FILEBUF         = LINEBUF+256  ;(256)
  1090. TPA╞REEMAP      = FILEBUF+256  ;(256)
  1091. BSS┼ND          = TPA╞REEMAP+256
  1092.