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

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