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

  1. ;┴├┼-128/64 KERNEL RAMDISK DRIVER, STARTED 18-┴PR-1994.
  2.  
  3. RD─IRENT╠ENGTH  = 48
  4. RD─IRENT┬UF     .BUF RD─IRENT╠ENGTH
  5. RD─IRENT┬YTES   = ACE─IRENT┬YTES-ACE─IRENT┬UFFER+RD─IRENT┬UF
  6. RD─IRENT─ATE    = ACE─IRENT─ATE-ACE─IRENT┬UFFER+RD─IRENT┬UF
  7. RD─IRENT╘YPE    = ACE─IRENT╘YPE-ACE─IRENT┬UFFER+RD─IRENT┬UF
  8. RD─IRENT╞LAGS   = ACE─IRENT╞LAGS-ACE─IRENT┬UFFER+RD─IRENT┬UF
  9. RD─IRENT╒SAGE   = ACE─IRENT╒SAGE-ACE─IRENT┬UFFER+RD─IRENT┬UF
  10. RD─IRENT╬AME╠EN = ACE─IRENT╬AME╠EN-ACE─IRENT┬UFFER+RD─IRENT┬UF
  11. RD─IRENT╬AME    = ACE─IRENT╬AME-ACE─IRENT┬UFFER+RD─IRENT┬UF
  12. RD─IRENT╚EAD╨TR = RD─IRENT┬UF+$24
  13. RD─IRENT╘AIL╨TR = RD─IRENT┬UF+$28
  14. RD─IRENT╥ESERVED = RD─IRENT┬UF+$2C
  15. RD─CB╧PEN═ODE   = FCB╘ABLE1+0  ;(1)
  16. RD─CB╙TATUS     = FCB╘ABLE1+1  ;(1)
  17. RD─CB╬EXT─IRENT = FCB╘ABLE1+2  ;(4)
  18. RD╞CBR╧PEN═ODE  = FCB╘ABLE1+0  ;(1)
  19. RD╞CBR╬EXT┬LK   = FCB╘ABLE1+1  ;(3)
  20. RD╞CBR╞ILE╨TR   = FCB╘ABLE1+4  ;(4)
  21. RD╞CBR┬LK┬YTES  = FCB╘ABLE1+8  ;(2)
  22.  
  23. RD╞CBW╧PEN═ODE  = FCB╘ABLE1+0  ;(1)
  24. RD╞CBW┬LK╨AGE   = FCB╘ABLE1+1  ;(1)
  25. RD╞CBW╥EM┬YTES  = FCB╘ABLE1+2  ;(2)
  26. RD╞CBW╞ILE╨TR   = FCB╘ABLE1+4  ;(4)
  27. RD╞CBW╞ILE╙IZE  = FCB╘ABLE1+8  ;(4)
  28. RD╞CBW─IRENT    = FCB╘ABLE1+$C ;(4)
  29.  
  30. RD╞CBW┬UF .BUF 18
  31. RD╞CBW┬UF╧PEN═ODE = RD╞CBW╧PEN═ODE-RD╞CBW╧PEN═ODE+RD╞CBW┬UF
  32. RD╞CBW┬UF┬LK╨AGE  = RD╞CBW┬LK╨AGE-RD╞CBW╧PEN═ODE+RD╞CBW┬UF
  33. RD╞CBW┬UF╥EM┬YTES = RD╞CBW╥EM┬YTES-RD╞CBW╧PEN═ODE+RD╞CBW┬UF
  34. RD╞CBW┬UF╞ILE╨TR  = RD╞CBW╞ILE╨TR-RD╞CBW╧PEN═ODE+RD╞CBW┬UF
  35. RD╞CBW┬UF╞ILE╙IZE = RD╞CBW╞ILE╙IZE-RD╞CBW╧PEN═ODE+RD╞CBW┬UF
  36. RD╞CBW┬UF─IRENT   = RD╞CBW─IRENT-RD╞CBW╧PEN═ODE+RD╞CBW┬UF
  37. RD╔NIT╔NDEX .BUF 1
  38.  
  39. RD╔NIT = *
  40.    LDX #0
  41.    STX RD╔NIT╔NDEX
  42. -  LDX RD╔NIT╔NDEX
  43.    LDA CONFIG┬UF+0,X
  44.    CMP #4
  45.    BNE +
  46.    JSR RD╔NIT─RIVE
  47. +  CLC
  48.    LDA RD╔NIT╔NDEX
  49.    ADC #4
  50.    STA RD╔NIT╔NDEX
  51.    CMP #$80
  52.    BCC -
  53.    RTS
  54.  
  55. RD═ALLOC╞LAGS .BUF 1  ;XX NOT USED YET
  56.  
  57. RD╓AR═ALLOC = *  ;( .┴=PAGES╥EQUESTED ) : .├╙=ERR, [MP]=MEM, .┴=PAGES╟OTTEN
  58.    JSR RD═ALLOC
  59.    BCC +
  60.    LDA ERRNO
  61.    CMP #ACE┼RR╔NSUFFICIENT═EMORY
  62.    BEQ ++
  63.    SEC
  64. +  RTS
  65. +  LDA #1
  66.    ;XX FALL THROUGH
  67.  
  68. RD═ALLOC = *  ;( .┴=PAGES╥EQUIRED ) : .├╙=ERR, [MP]=MEM, .┴=PAGES╟OTTEN
  69.    PHA
  70.    PHA
  71.    LDA #$FD
  72.    STA ALLOC╨ROC╔─
  73.    PLA
  74.    LDX #$00
  75.    LDY #$FF
  76.    JSR KERN╨AGE┴LLOC
  77.    PLA
  78.    RTS
  79.  
  80. RD╞REE = *  ;( [MP]=MEM╨TR, .┴=PAGES ) : .├╙=ERR
  81.    PHA
  82.    LDA #$FD
  83.    STA ALLOC╨ROC╔─
  84.    PLA
  85.    JSR KERN╨AGE╞REE
  86.    RTS
  87.  
  88. RD╔NIT─RIVE = *  ;( RD╔NIT╔NDEX )
  89.    ;** ALLOC ROOT DIRENT, ROOT DIR CONTENTS
  90.    LDA #2
  91.    JSR RD═ALLOC
  92.    BCC +
  93.    RTS
  94.  
  95.    ;** INIT DEVICE TABLE ENTRY: ROOT DIR, CURRENT DIR
  96. +  LDA RD╔NIT╔NDEX
  97.    ASL
  98.    TAY
  99.    LDA RD─IRENT╧FFSET╘AB+0
  100.    STA DEVICE╘ABLE+0,Y
  101.    STA DEVICE╘ABLE+4,Y
  102.    INY
  103.    LDX #1
  104. -  LDA MP,X
  105.    STA DEVICE╘ABLE+0,Y
  106.    STA DEVICE╘ABLE+4,Y
  107.    INY
  108.    INX
  109.    CPX #4
  110.    BCC -
  111.  
  112.    ;** INIT ROOT DIRENT
  113.    JSR RD╔NIT─IR┬LOCK╙TRBUF
  114.    LDX #RD─IRENT╠ENGTH-1
  115.    LDA #0
  116. -  STA RD─IRENT┬UF,X
  117.    DEX
  118.    BPL -
  119.    LDA #1
  120.    STA RD─IRENT┬YTES+1
  121.    LDA #<RD─IRENT─ATE
  122.    LDY #>RD─IRENT─ATE
  123.    JSR GETDATE
  124.    LDX #3
  125. -  LDA RD╥OOT╘YPE,X
  126.    STA RD─IRENT╘YPE,X
  127.    DEX
  128.    BPL -
  129.    LDA #%11110100
  130.    STA RD─IRENT╞LAGS
  131.    LDA #13
  132.    STA RD─IRENT╬AME╠EN
  133.    LDX #16
  134. -  LDA RD╥OOT╬AME,X
  135.    STA RD─IRENT╬AME,X
  136.    DEX
  137.    BPL -
  138.    LDA RD╔NIT╔NDEX
  139.    LSR
  140.    LSR
  141.    CLC
  142.    ADC #"@"
  143.    STA RD─IRENT╬AME+12
  144.    LDA #%10000000
  145.    STA RD─IRENT╒SAGE
  146.    LDX #3
  147. -  LDA MP,X
  148.    STA RD─IRENT╚EAD╨TR,X
  149.    STA RD─IRENT╘AIL╨TR,X
  150.    DEX
  151.    BPL -
  152.    INC RD─IRENT╚EAD╨TR+1
  153.    INC RD─IRENT╘AIL╨TR+1
  154.    LDX #RD─IRENT╠ENGTH-1
  155. -  LDA RD─IRENT┬UF,X
  156.    STA WORKBUF+$10,X
  157.    DEX
  158.    BPL -
  159.    LDA #<WORKBUF
  160.    LDY #>WORKBUF
  161.    STA ZP+0
  162.    STY ZP+1
  163.    LDA #<256
  164.    LDY #>256
  165.    JSR STASH
  166.  
  167.    ;** INIT ROOT DIR CONTENTS
  168.    ;** "." ENTRY
  169.    LDA #0
  170.    STA RD─IRENT┬YTES+1
  171.    LDA #%01100100
  172.    STA RD─IRENT╞LAGS
  173.    LDX #3
  174. -  LDA RD─OT╘YPE,X
  175.    STA RD─IRENT╘YPE,X
  176.    DEX
  177.    BPL -
  178.    LDA #1
  179.    STA RD─IRENT╬AME╠EN
  180.    LDX #16
  181.    LDA #0
  182. -  STA RD─IRENT╬AME,X
  183.    DEX
  184.    BPL -
  185.    LDA #"."
  186.    STA RD─IRENT╬AME+0
  187.    LDA #%11010000
  188.    STA RD─IRENT╒SAGE
  189.    LDA #$10
  190.    STA RD─IRENT╚EAD╨TR+0
  191.    DEC RD─IRENT╚EAD╨TR+1
  192.    LDX #RD─IRENT╠ENGTH-1
  193. -  LDA RD─IRENT┬UF,X
  194.    STA WORKBUF+$10,X
  195.    DEX
  196.    BPL -
  197.    ;** ".." ENTRY
  198.    LDA #2
  199.    STA RD─IRENT╬AME╠EN
  200.    LDA #"."
  201.    STA RD─IRENT╬AME+1
  202.    LDX #RD─IRENT╠ENGTH-1
  203. -  LDA RD─IRENT┬UF,X
  204.    STA WORKBUF+$40,X
  205.    DEX
  206.    BPL -
  207.    ;** STORE DIR BLOCK
  208.    INC MP+1
  209.    LDA #<256
  210.    LDY #>256
  211.    JSR STASH
  212.    RTS
  213.  
  214. RD╥OOT╬AME = *
  215.    .ASC "ACE-RAMDISK-A"
  216.    .BYTE 0,0,0,0
  217. RD╥OOT╘YPE = *
  218.    .ASC "DIR"
  219.    .BYTE 0
  220. RD─OT╘YPE = *
  221.    .ASC "HLN"
  222.    .BYTE 0
  223. RD─IRENT╧FFSET╘AB = *
  224.    .BYTE $10,$40,$70,$A0,$D0
  225.  
  226. RD╔NIT─IR┬LOCK╙TRBUF = *
  227.    LDX #0
  228.    LDA #0
  229. -  STA WORKBUF,X
  230.    INX
  231.    BNE -
  232.    LDA #1
  233.    STA WORKBUF+$00
  234.    STA WORKBUF+$05
  235.    LDA #ACE═EM╬ULL
  236.    STA WORKBUF+$03
  237.    RTS
  238.  
  239. RD─CB╧FFSET .BUF 1
  240. RD╞CB╧FFSET = RD─CB╧FFSET
  241. RD─EV╧FFSET .BUF 1
  242. RD═P╙AVE .BUF 4
  243. RD┌P╙AVE .BUF 2
  244. RD├OUNT .BUF 1
  245. RD╥EG╙AVE .BUF 3
  246.  
  247. RD╙AVE═P┌P = *
  248.    LDX #3
  249. -  LDA MP,X
  250.    STA RD═P╙AVE,X
  251.    DEX
  252.    BPL -
  253.    LDA ZP+0
  254.    LDY ZP+1
  255.    STA RD┌P╙AVE+0
  256.    STY RD┌P╙AVE+1
  257.    RTS
  258.  
  259. RD╥ESTORE═P┌P = *
  260.    LDX #3
  261. -  LDA RD═P╙AVE,X
  262.    STA MP,X
  263.    DEX
  264.    BPL -
  265.    LDA RD┌P╙AVE+0
  266.    LDY RD┌P╙AVE+1
  267.    STA ZP+0
  268.    STY ZP+1
  269.    RTS
  270.  
  271. RD─IR╧PEN = *
  272. RD╧PEN╨REAMBLE = *
  273.    LDA OPEN─EVICE
  274.    ASL
  275.    STA RD─EV╧FFSET
  276.    LDA OPEN╞CB
  277.    ASL
  278.    ASL
  279.    ASL
  280.    ASL
  281.    STA RD─CB╧FFSET
  282.    TAX
  283.    LDA #"D"
  284.    STA RD─CB╧PEN═ODE,X
  285.    INX
  286.    LDY #15
  287.    LDA #0
  288. -  STA RD─CB╧PEN═ODE,X
  289.    INX
  290.    DEY
  291.    BNE -
  292.    LDX RD─CB╧FFSET
  293.    LDA #$00
  294.    STA RD─CB╙TATUS,X
  295.    LDY RD─EV╧FFSET
  296.    INY
  297.    INY
  298.    INY
  299.    INY
  300.    LDA #0
  301.    STA RD├OUNT
  302.    LDX RD─CB╧FFSET
  303. -  LDA DEVICE╘ABLE,Y
  304.    STA RD─CB╬EXT─IRENT,X
  305.    STX RD╥EG╙AVE+1
  306.    LDX RD├OUNT
  307.    STA RD╫ORK─IR,X
  308.    LDX RD╥EG╙AVE+1
  309.    INX
  310.    INY
  311.    INC RD├OUNT
  312.    LDA RD├OUNT
  313.    CMP #4
  314.    BCC -
  315.    LDA OPEN╞CB
  316.    CLC
  317.    RTS
  318.  
  319. RD─IR├LOSE = *
  320.    JMP CLOSE╞D┼NTRY
  321.  
  322. ;*** DIRREAD( .╪=DCB, .┘=DEV├FG╧FF ) : .┌=EOF, ACE─IRENT┬UFFER=DATA
  323.  
  324. RD─CB╬UM .BUF 1
  325.  
  326. RD─IR╥EAD = *
  327.    STX RD─CB╬UM
  328.    TYA
  329.    ASL
  330.    STA RD─EV╧FFSET
  331.    LDA RD─CB╬UM
  332.    ASL
  333.    ASL
  334.    ASL
  335.    ASL
  336.    STA RD─CB╧FFSET
  337.    JSR RD╙AVE═P┌P
  338.    LDX RD─CB╧FFSET
  339.    LDA RD─CB╧PEN═ODE,X
  340.    CMP #"D"
  341.    BEQ +
  342.    LDA #ACE┼RR╞ILE╬OT╔NPUT
  343.    JMP RD─IR╥EAD┼RROR
  344. +  LDA RD─CB╙TATUS,X
  345.    CMP #$00
  346.    BEQ RD─IR╥EAD╘ITLE
  347.    CMP #$01
  348.    BNE +
  349.    JMP RD─IR╥EAD─IRENT
  350. +  LDA #0
  351.    STA ACE─IRENT╬AME╠EN
  352.    STA ACE─IRENT╬AME+0
  353.    CLC
  354.    ;** FALL THROUGH
  355. RD─IR╥EAD┼XIT = *
  356.    PHP
  357.    JSR RD╥ESTORE═P┌P
  358.    PLP
  359.    RTS
  360. RD─IR╥EAD┼RROR = *
  361.    STA ERRNO
  362.    SEC
  363.    LDA #0
  364.    JMP RD─IR╥EAD┼XIT
  365.  
  366. RD─IR╥EAD╘ITLE = *
  367.    LDX RD─CB╧FFSET
  368.    LDA #$01
  369.    STA RD─CB╙TATUS,X
  370.    LDY #0
  371. -  LDA RD─CB╬EXT─IRENT,X
  372.    STA MP,Y
  373.    INX
  374.    INY
  375.    CPY #4
  376.    BCC -
  377.    LDA #<RD─IRENT┬UF
  378.    LDY #>RD─IRENT┬UF
  379.    STA ZP+0
  380.    STY ZP+1
  381.    LDA #RD─IRENT╠ENGTH
  382.    LDY #0
  383.    JSR FETCH
  384.    LDX #ACE─IRENT╠ENGTH-1
  385. -  LDA RD─IRENT┬UF,X
  386.    STA ACE─IRENT┬UFFER,X
  387.    DEX
  388.    BPL -
  389.    LDX RD─CB╧FFSET
  390.    LDY #0
  391. -  LDA RD─IRENT╚EAD╨TR,Y
  392.    STA RD─CB╬EXT─IRENT,X
  393.    INX
  394.    INY
  395.    CPY #4
  396.    BCC -
  397.    LDX RD─CB╧FFSET
  398.    LDA #$10
  399.    STA RD─CB╬EXT─IRENT+0,X
  400.    LDA #$FF
  401.    CLC
  402.    JMP RD─IR╥EAD┼XIT
  403.  
  404. RD─IR╥EAD─IRENT = *
  405.    LDX RD─CB╧FFSET
  406.    LDY #0
  407. -  LDA RD─CB╬EXT─IRENT,X
  408.    STA MP,Y
  409.    INX
  410.    INY
  411.    CPY #4
  412.    BCC -
  413.    LDA MP+0
  414.    CMP #$FF
  415.    BEQ RD─IR╥EAD╬EXT┬LOCK
  416.    LDX RD─CB╧FFSET
  417.    CLC
  418.    ADC #RD─IRENT╠ENGTH
  419.    BCC +
  420.    LDA #$FF
  421. +  STA RD─CB╬EXT─IRENT+0,X
  422.    LDA #<RD─IRENT┬UF
  423.    LDY #>RD─IRENT┬UF
  424.    STA ZP+0
  425.    STY ZP+1
  426.    LDA #RD─IRENT╠ENGTH
  427.    LDY #0
  428.    JSR FETCH
  429.    LDA RD─IRENT╒SAGE
  430.    BPL RD─IR╥EAD─IRENT
  431.    LDX #ACE─IRENT╠ENGTH-1
  432. -  LDA RD─IRENT┬UF,X
  433.    STA ACE─IRENT┬UFFER,X
  434.    DEX
  435.    BPL -
  436.    LDA #$FF
  437.    CLC
  438.    JMP RD─IR╥EAD┼XIT
  439.  
  440. RD┬LOCK╚EAD .BUF 6
  441. RD┬H╨AGES   = RD┬LOCK╚EAD+0
  442. RD┬H╬EXT╨G  = RD┬LOCK╚EAD+1
  443. RD┬H┬YTES   = RD┬LOCK╚EAD+4
  444.  
  445.    RD─IR╥EAD╬EXT┬LOCK = *
  446.    LDA #$00
  447.    STA MP+0
  448.    LDA #<RD┬LOCK╚EAD
  449.    LDY #>RD┬LOCK╚EAD
  450.    STA ZP+0
  451.    STY ZP+1
  452.    LDA #6
  453.    LDY #0
  454.    JSR FETCH
  455.    LDA RD┬H╬EXT╨G+2
  456.    CMP #ACE═EM╬ULL
  457.    BEQ RD─IR╥EAD╞REE
  458.    LDX RD─CB╧FFSET
  459.    LDA #$10
  460.    STA RD─CB╬EXT─IRENT+0,X
  461.    INX
  462.    LDY #0
  463. -  LDA RD┬H╬EXT╨G,Y
  464.    STA RD─CB╬EXT─IRENT,X
  465.    INX
  466.    INY
  467.    CPY #3
  468.    BCC -
  469.    JMP RD─IR╥EAD─IRENT
  470.  
  471. RD─IR╥EAD╞REE = *
  472.    LDX RD─CB╧FFSET
  473.    LDA #$FF
  474.    STA RD─CB╙TATUS,X
  475.    LDA #0
  476.    LDX #ACE─IRENT╠ENGTH-1
  477. -  STA ACE─IRENT┬UFFER,X
  478.    DEX
  479.    BPL -
  480.    LDX #3
  481. -  LDA ACE╞REE═EMORY,X
  482.    STA ACE─IRENT┬YTES,X
  483.    DEX
  484.    BPL -
  485.    LDA #%01000100
  486.    STA ACE─IRENT╞LAGS
  487.    LDA #%00000000
  488.    STA ACE─IRENT╒SAGE
  489.    JSR RD╥ESTORE═P┌P
  490.    LDA #$FF
  491.    CLC
  492.    RTS
  493.  
  494. RD├H─IR = *
  495.    LDA #0
  496.    STA STRING┬UFFER+2
  497.    JMP CHDIR╙ET╬AME
  498.  
  499. RD╞ILE╘YPE .BUF 1
  500.  
  501. RD╧PEN = *
  502.    JSR RD╧PEN╨REAMBLE
  503.    JSR RD╙AVE═P┌P
  504.    LDY OPEN╬AME╙CAN
  505.    LDX #0
  506. -  LDA (ZP),Y
  507.    STA STRING┬UFFER,X
  508.    BEQ +
  509.    INX
  510.    INY
  511.    BNE -
  512. +  LDA #"S"
  513.    STA RD╞ILE╘YPE
  514.    LDA STRING┬UFFER-2,X
  515.    CMP #","
  516.    BNE +
  517.    LDA STRING┬UFFER-1,X
  518.    STA RD╞ILE╘YPE
  519.    LDA #0
  520.    STA STRING┬UFFER-2,X
  521. +  LDX RD╞CB╧FFSET
  522.    LDA OPEN═ODE
  523.    STA RD╞CBR╧PEN═ODE,X
  524.    CMP #"R"
  525.    BEQ +
  526.    JMP RD╧PEN╫RITE
  527.  
  528.    ;** OPEN FOR READ
  529. +  JSR RD╙CAN─IR
  530.    BCC +
  531.    LDA ERRNO
  532.    JMP RD╧PEN┼RROR
  533. +  LDX RD╞CB╧FFSET
  534.    LDA #0
  535.    STA RD╞CBR┬LK┬YTES+0,X
  536.    STA RD╞CBR┬LK┬YTES+1,X
  537.    LDY #0
  538. -  LDA RD─IRENT╚EAD╨TR+1,Y
  539.    STA RD╞CBR╬EXT┬LK,X
  540.    INX
  541.    INY
  542.    CPY #3
  543.    BCC -
  544.    JSR RD╥ESTORE═P┌P
  545.    LDA OPEN╞CB
  546.    CLC
  547.    RTS
  548.  
  549.    RD╧PEN╫RITE = *
  550.    CMP #"W"
  551.    BEQ +
  552.    JMP RD╧PEN┴PPEND
  553. +  JSR RD╙CAN─IR
  554.    BCS +
  555.    LDA #ACE┼RR╞ILE┼XISTS
  556.    RD╧PEN┼RROR = *
  557.    PHA
  558.    JSR RD╥ESTORE═P┌P
  559.    PLA
  560.    STA ERRNO
  561.    LDX OPEN╞CB
  562.    LDA #LFNULL
  563.    STA LFTABLE,X
  564.    SEC
  565.    LDA #FCB╬ULL
  566.    RTS
  567. +  LDA RD╞REE─IRENT+3
  568.    CMP #ACE═EM╬ULL
  569.    BNE +
  570.    JSR RD┴DD─IR┬LOCK
  571.    BCC +
  572.    LDA #ACE┼RR─ISK╞ULL
  573.    JMP RD╧PEN┼RROR
  574.    ;** INITIALIZE DIRECTORY ENTRY
  575. +  LDX #RD─IRENT╠ENGTH-1
  576.    LDA #0
  577. -  STA RD─IRENT┬UF,X
  578.    DEX
  579.    BPL -
  580.    LDA #$00
  581.    STA STRING┬UFFER+16
  582.    LDX #$FF
  583. -  INX
  584.    LDA STRING┬UFFER,X
  585.    STA RD─IRENT╬AME,X
  586.    BNE -
  587.    STX RD─IRENT╬AME╠EN
  588.    LDA #<RD─IRENT─ATE
  589.    LDY #>RD─IRENT─ATE
  590.    JSR GETDATE
  591.    LDY #0
  592.    LDA RD╞ILE╘YPE
  593.    CMP #"P"
  594.    BNE +
  595.    LDY #4
  596. +  LDX #0
  597. -  LDA RD╧PEN╫RITE╘YPES,Y
  598.    STA RD─IRENT╘YPE,X
  599.    INY
  600.    INX
  601.    CPX #4
  602.    BCC -
  603.    LDA #%01101100
  604.    STA RD─IRENT╞LAGS
  605.    LDA #%10000000
  606.    STA RD─IRENT╒SAGE
  607.    LDX #3
  608. -  LDA #ACE═EM╬ULL
  609.    STA RD─IRENT╚EAD╨TR,X
  610.    STA RD─IRENT╘AIL╨TR,X
  611.    DEX
  612.    BPL -
  613.    ;** INITIALIZE FCB BUFFER
  614.    LDX #15
  615.    LDA #$00  ;XX ASSUME NULL=$00
  616. -  STA RD╞CBW┬UF╧PEN═ODE,X
  617.    DEX
  618.    BPL -
  619.    LDA #"W"
  620.    STA RD╞CBW┬UF╧PEN═ODE
  621.    LDX #3
  622. -  LDA RD╞REE─IRENT,X
  623.    STA RD╞CBW┬UF─IRENT,X
  624.    STA MP,X
  625.    DEX
  626.    BPL -
  627.    ;** WRITE DIRECTORY ENTRY
  628.    RD╧PEN╫RITE╞LUSH = *
  629.    LDA #<RD─IRENT┬UF
  630.    LDY #>RD─IRENT┬UF
  631.    STA ZP+0
  632.    STY ZP+1
  633.    LDA #RD─IRENT╠ENGTH
  634.    LDY #0
  635.    JSR STASH
  636.    ;** WRITE FCB ENTRY
  637.    LDX #0
  638.    LDY RD╞CB╧FFSET
  639. -  LDA RD╞CBW┬UF╧PEN═ODE,X
  640.    STA RD╞CBW╧PEN═ODE,Y
  641.    INY
  642.    INX
  643.    CPX #16
  644.    BCC -
  645.    JSR RD╥ESTORE═P┌P
  646.    LDA OPEN╞CB
  647.    CLC
  648.    RTS
  649.  
  650. RD╧PEN╫RITE╘YPES = *
  651.    .ASC "SEQ"
  652.    .BYTE $00
  653.    .ASC "PRG"
  654.    .BYTE $00
  655.  
  656.    RD╧PEN┴PPEND = *
  657.    CMP #"A"
  658.    BEQ +
  659.    LDA #ACE┼RR╔NVALID╞ILE═ODE
  660.    JMP RD╧PEN┼RROR
  661. +  JSR RD╙CAN─IR
  662.    BCC +
  663.    LDA ERRNO
  664.    JMP RD╧PEN┼RROR
  665. +  LDA RD─IRENT╞LAGS
  666.    BPL +
  667.    LDA #ACE┼RR╧PEN─IRECTORY
  668.    JMP RD╧PEN┼RROR
  669. +  AND #%00100000
  670.    BNE +
  671.    LDA #ACE┼RR╨ERMISSION─ENIED
  672.    JMP RD╧PEN┼RROR
  673. +  LDA RD─IRENT╞LAGS
  674.    ORA #%00001000
  675.    STA RD─IRENT╞LAGS
  676.    LDA #<RD─IRENT─ATE
  677.    LDY #>RD─IRENT─ATE
  678.    JSR GETDATE
  679.    LDA #"W"
  680.    STA RD╞CBW┬UF╧PEN═ODE
  681.    LDX #3
  682. -  LDA RD─IRENT╘AIL╨TR,X
  683.    STA RD╞CBW┬UF╞ILE╨TR,X
  684.    STA MP,X
  685.    LDA RD─IRENT┬YTES,X
  686.    STA RD╞CBW┬UF╞ILE╙IZE,X
  687.    LDA RD─IRENT╨TR,X
  688.    STA RD╞CBW┬UF─IRENT,X
  689.    DEX
  690.    BPL -
  691.    LDA #$06
  692.    STA RD╞CBW┬UF╞ILE╨TR+0
  693.    LDA RD╞CBW┬UF╞ILE╨TR+1
  694.    STA RD╞CBW┬UF┬LK╨AGE   ;%%%
  695.    LDA #<RD╧PEN┬LK╚DR
  696.    LDY #>RD╧PEN┬LK╚DR
  697.    STA ZP+0
  698.    STY ZP+1
  699.    LDA #6
  700.    LDY #0
  701.    JSR FETCH
  702.    CLC
  703.    LDA RD╞CBW┬UF╞ILE╨TR+0
  704.    ADC RD╧PEN┬LK╚DR+4
  705.    STA RD╞CBW┬UF╞ILE╨TR+0
  706.    LDA RD╞CBW┬UF╞ILE╨TR+1
  707.    ADC RD╧PEN┬LK╚DR+5
  708.    STA RD╞CBW┬UF╞ILE╨TR+1
  709.    SEC
  710.    LDA #250
  711.    SBC RD╧PEN┬LK╚DR+4
  712.    STA RD╞CBW┬UF╥EM┬YTES+0
  713.    LDX RD╧PEN┬LK╚DR+0
  714.    DEX
  715.    TXA
  716.    SBC RD╧PEN┬LK╚DR+5
  717.    STA RD╞CBW┬UF╥EM┬YTES+1
  718.    LDX #3
  719. -  LDA RD─IRENT╨TR,X
  720.    STA MP,X
  721.    DEX
  722.    BPL -
  723.    JMP RD╧PEN╫RITE╞LUSH
  724.  
  725. RD╧PEN┬LK╚DR .BUF 6
  726.  
  727. RD╫ORK─IR       .BUF 4
  728. RD─IRENT╨TR     .BUF 4
  729. RD╞REE─IRENT    .BUF 4
  730. RD╙CAN─IR╧FFSET .BUF 1
  731.  
  732. RD╙CAN─IR = *  ;( STRING┬UFFER=FILENAME, [RD╫ORK─IR] ) : [RD─IRENT╨TR]=DIRENT
  733.    LDX #3
  734. -  LDA RD╫ORK─IR,X
  735.    STA MP,X
  736.    LDA #ACE═EM╬ULL
  737.    STA RD╞REE─IRENT,X
  738.    DEX
  739.    BPL -
  740.    LDA #<RD─IRENT┬UF
  741.    LDY #>RD─IRENT┬UF
  742.    STA ZP+0
  743.    STY ZP+1
  744.    LDA #RD─IRENT╠ENGTH
  745.    LDY #0
  746.    JSR FETCH
  747.    LDX #3
  748. -  LDA RD─IRENT╚EAD╨TR,X
  749.    STA MP,X
  750.    DEX
  751.    BPL -
  752.    LDA #<WORKBUF
  753.    LDY #>WORKBUF
  754.    STA ZP+0
  755.    STY ZP+1
  756.  
  757.    RD╙CAN─IR╬EXT┬LOCK = *
  758.    LDA MP+3
  759.    CMP #ACE═EM╬ULL
  760.    BNE +
  761.    LDA #ACE┼RR╞ILE╬OT╞OUND
  762.    STA ERRNO
  763.    SEC
  764.    RTS
  765. +  LDA #<256
  766.    LDY #>256
  767.    JSR FETCH
  768.    LDA #$10
  769.    STA RD╙CAN─IR╧FFSET
  770.  
  771.    RD╙CAN─IR╬EXT─IRENT = *
  772.    LDX RD╙CAN─IR╧FFSET
  773.    LDA RD─IRENT╒SAGE-RD─IRENT┬UF+WORKBUF,X
  774.    BMI +
  775.    LDA RD╞REE─IRENT+3
  776.    CMP #ACE═EM╬ULL
  777.    BNE RD╙CAN─IR├ONTINUE
  778.    LDX #3
  779. -  LDA MP,X
  780.    STA RD╞REE─IRENT,X
  781.    DEX
  782.    BPL -
  783.    LDA RD╙CAN─IR╧FFSET
  784.    STA RD╞REE─IRENT+0
  785.    JMP RD╙CAN─IR├ONTINUE
  786. +  LDY #0
  787. -  LDA RD─IRENT╬AME-RD─IRENT┬UF+WORKBUF,X
  788.    CMP STRING┬UFFER,Y
  789.    BNE RD╙CAN─IR├ONTINUE
  790.    INX
  791.    INY
  792.    CMP #0
  793.    BNE -
  794.    LDA RD╙CAN─IR╧FFSET
  795.    STA MP+0
  796.    LDX #3
  797. -  LDA MP,X
  798.    STA RD─IRENT╨TR,X
  799.    DEX
  800.    BPL -
  801.    LDX RD╙CAN─IR╧FFSET
  802.    LDY #0
  803. -  LDA WORKBUF,X
  804.    STA RD─IRENT┬UF,Y
  805.    INX
  806.    INY
  807.    CPY #RD─IRENT╠ENGTH
  808.    BCC -
  809.    CLC
  810.    RTS
  811.  
  812.    RD╙CAN─IR├ONTINUE = *
  813.    CLC
  814.    LDA RD╙CAN─IR╧FFSET
  815.    ADC #RD─IRENT╠ENGTH
  816.    STA RD╙CAN─IR╧FFSET
  817.    BCC RD╙CAN─IR╬EXT─IRENT
  818.    LDX #3
  819. -  LDA WORKBUF,X
  820.    STA MP,X
  821.    DEX
  822.    BPL -
  823.    LDA #$00
  824.    STA MP+0
  825.    JMP RD╙CAN─IR╬EXT┬LOCK
  826.  
  827. RD┴DD─IR┬LOCK = *  ;( [RD╫ORK─IR] ) : [RD╞REE─IRENT], .├╙=ERR
  828.    ;** ALLOC NEW BLOCK
  829.    LDA #$00 ;XX
  830.    STA RD═ALLOC╞LAGS
  831.    LDA #1
  832.    JSR RD═ALLOC
  833.    BCC +
  834.    LDA #ACE┼RR─ISK╞ULL
  835.    STA ERRNO
  836.    SEC
  837.    RTS
  838.    ;** INIT NEW BLOCK
  839. +  JSR RD╔NIT─IR┬LOCK╙TRBUF
  840.    LDA #<WORKBUF
  841.    LDY #>WORKBUF
  842.    STA ZP+0
  843.    STY ZP+1
  844.    LDA #<256
  845.    LDY #>256
  846.    JSR STASH
  847.    LDX #3
  848. -  LDA MP,X
  849.    STA RD╞REE─IRENT,X
  850.    DEX
  851.    BPL -
  852.  
  853.    ;** MODIFY WORKING DIRECTORY DIRENT
  854.    LDX #3
  855. -  LDA RD╫ORK─IR,X
  856.    STA MP,X
  857.    DEX
  858.    BPL -
  859.    LDA #<RD─IRENT┬UF
  860.    LDY #>RD─IRENT┬UF
  861.    STA ZP+0
  862.    STY ZP+1
  863.    LDA #RD─IRENT╠ENGTH
  864.    LDY #0
  865.    JSR FETCH
  866.    LDX #3
  867. -  LDA RD─IRENT╘AIL╨TR,X
  868.    STA RD╨REV┬LK╨TR,X
  869.    LDA RD╞REE─IRENT,X
  870.    STA RD─IRENT╘AIL╨TR,X
  871.    DEX
  872.    BPL -
  873.    LDA #RD─IRENT╠ENGTH
  874.    LDY #0
  875.    JSR STASH
  876.    ;** LINK PREVIOUS DIR BLOCK
  877.    LDX #3
  878. -  LDA RD╨REV┬LK╨TR,X
  879.    STA MP,X
  880.    DEX
  881.    BPL -
  882.    LDA #$01
  883.    STA MP+0
  884.    LDA #<RD─IRENT╘AIL╨TR+1
  885.    LDY #>RD─IRENT╘AIL╨TR+1
  886.    STA ZP+0
  887.    STY ZP+1
  888.    LDA #3
  889.    LDY #0
  890.    JSR STASH
  891.    ;** CLEAN UP
  892.    LDA #$10
  893.    STA RD╞REE─IRENT+0
  894.    CLC
  895.    RTS
  896.  
  897. RD╨REV┬LK╨TR .BUF 4
  898.  
  899. RD╥EAD├HUNK = SYSWORK+8
  900. RD╞CBR┬UF .BUF 12
  901. RD╞CBR┬UF╧PEN═ODE = RD╞CBR╧PEN═ODE-RD╞CBR╧PEN═ODE+RD╞CBR┬UF
  902. RD╞CBR┬UF╬EXT┬LK  = RD╞CBR╬EXT┬LK-RD╞CBR╧PEN═ODE+RD╞CBR┬UF
  903. RD╞CBR┬UF╞ILE╨TR  = RD╞CBR╞ILE╨TR-RD╞CBR╧PEN═ODE+RD╞CBR┬UF
  904. RD╞CBR┬UF┬LK┬YTES = RD╞CBR┬LK┬YTES-RD╞CBR╧PEN═ODE+RD╞CBR┬UF
  905.  
  906. RD╥EAD = *  ;( ) :.┴┘=(ZW)=LEN,.┌=EOF
  907.    LDA READ╞CB
  908.    ASL
  909.    ASL
  910.    ASL
  911.    ASL
  912.    STA RD╞CB╧FFSET
  913.    JSR RD╙AVE═P┌P
  914.    LDX RD╞CB╧FFSET
  915.    LDY #0
  916. -  LDA RD╞CBR╧PEN═ODE,X
  917.    STA RD╞CBR┬UF,Y
  918.    INX
  919.    INY
  920.    CPY #10
  921.    BCC -
  922.    LDA RD╞CBR┬UF╧PEN═ODE
  923.    CMP #"R"
  924.    BEQ RD╥EAD═ORE
  925.    LDA #ACE┼RR╞ILE╬OT╔NPUT
  926.  
  927.    RD╥EAD┼RROR = *
  928.    STA ERRNO
  929.    LDA #0
  930.    LDY #0
  931.    SEC
  932.    RD╥EAD┼XIT = *
  933.    PHP
  934.    STA ZW+0
  935.    STY ZW+1
  936.    LDY #0
  937.    LDX RD╞CB╧FFSET
  938. -  LDA RD╞CBR┬UF,Y
  939.    STA RD╞CBR╧PEN═ODE,X
  940.    INX
  941.    INY
  942.    CPY #10
  943.    BCC -
  944.    JSR RD╥ESTORE═P┌P
  945.    LDA ZW+0
  946.    LDY ZW+1
  947.    PLP
  948.    RTS
  949.  
  950.    RD╥EAD═ORE = *
  951.    LDA READ═AX╠EN+0
  952.    ORA READ═AX╠EN+1
  953.    BNE +
  954. -  LDA READ╠ENGTH+0
  955.    ORA READ╠ENGTH+1
  956.    PHP
  957.    LDA READ╠ENGTH+0
  958.    LDY READ╠ENGTH+1
  959.    PLP
  960.    CLC
  961.    JMP RD╥EAD┼XIT
  962. +  LDA RD╞CBR┬UF┬LK┬YTES+0
  963.    LDY RD╞CBR┬UF┬LK┬YTES+1
  964.    STA RD╥EAD├HUNK+0
  965.    STY RD╥EAD├HUNK+1
  966.    ORA RD╥EAD├HUNK+1
  967.    BNE +
  968.    LDA #$06
  969.    STA RD╞CBR┬UF╞ILE╨TR+0
  970.    LDA #$00
  971.    STA MP+0
  972.    LDX #2
  973. -  LDA RD╞CBR┬UF╬EXT┬LK,X
  974.    STA RD╞CBR┬UF╞ILE╨TR+1,X
  975.    STA MP+1,X
  976.    DEX
  977.    BPL -
  978.    LDA MP+3
  979.    CMP #ACE═EM╬ULL
  980.    BEQ --
  981.    LDA #<WORKBUF
  982.    LDY #>WORKBUF
  983.    STA ZP+0
  984.    STY ZP+1
  985.    LDA #6
  986.    LDY #0
  987.    JSR FETCH
  988.    LDA WORKBUF+$04
  989.    LDY WORKBUF+$05
  990.    STA RD╞CBR┬UF┬LK┬YTES+0
  991.    STY RD╞CBR┬UF┬LK┬YTES+1
  992.    LDX #2
  993. -  LDA WORKBUF+$01,X
  994.    STA RD╞CBR┬UF╬EXT┬LK,X
  995.    DEX
  996.    BPL -
  997.    JMP RD╥EAD═ORE
  998.  
  999. +  LDA RD╥EAD├HUNK+0
  1000.    CMP READ═AX╠EN+0
  1001.    LDA RD╥EAD├HUNK+1
  1002.    SBC READ═AX╠EN+1
  1003.    BCC +
  1004.    LDA READ═AX╠EN+0
  1005.    LDY READ═AX╠EN+1
  1006.    STA RD╥EAD├HUNK+0
  1007.    STY RD╥EAD├HUNK+1
  1008. +  LDX #3
  1009. -  LDA RD╞CBR┬UF╞ILE╨TR,X
  1010.    STA MP,X
  1011.    DEX
  1012.    BPL -
  1013.    LDA READ╨TR+0
  1014.    LDY READ╨TR+1
  1015.    STA ZP+0
  1016.    STY ZP+1
  1017.    LDA RD╥EAD├HUNK+0
  1018.    LDY RD╥EAD├HUNK+1
  1019.    JSR FETCH
  1020.  
  1021.    CLC
  1022.    LDA READ╨TR+0
  1023.    ADC RD╥EAD├HUNK+0
  1024.    STA READ╨TR+0
  1025.    LDA READ╨TR+1
  1026.    ADC RD╥EAD├HUNK+1
  1027.    STA READ╨TR+1
  1028.    CLC
  1029.    LDA READ╠ENGTH+0
  1030.    ADC RD╥EAD├HUNK+0
  1031.    STA READ╠ENGTH+0
  1032.    LDA READ╠ENGTH+1
  1033.    ADC RD╥EAD├HUNK+1
  1034.    STA READ╠ENGTH+1
  1035.    CLC
  1036.    LDA RD╞CBR┬UF╞ILE╨TR+0
  1037.    ADC RD╥EAD├HUNK+0
  1038.    STA RD╞CBR┬UF╞ILE╨TR+0
  1039.    LDA RD╞CBR┬UF╞ILE╨TR+1
  1040.    ADC RD╥EAD├HUNK+1
  1041.    STA RD╞CBR┬UF╞ILE╨TR+1
  1042.    SEC
  1043.    LDA READ═AX╠EN+0
  1044.    SBC RD╥EAD├HUNK+0
  1045.    STA READ═AX╠EN+0
  1046.    LDA READ═AX╠EN+1
  1047.    SBC RD╥EAD├HUNK+1
  1048.    STA READ═AX╠EN+1
  1049.    SEC
  1050.    LDA RD╞CBR┬UF┬LK┬YTES+0
  1051.    SBC RD╥EAD├HUNK+0
  1052.    STA RD╞CBR┬UF┬LK┬YTES+0
  1053.    LDA RD╞CBR┬UF┬LK┬YTES+1
  1054.    SBC RD╥EAD├HUNK+1
  1055.    STA RD╞CBR┬UF┬LK┬YTES+1
  1056.    JMP RD╥EAD═ORE
  1057.  
  1058. RD├FG╧FFSET .BUF 1
  1059. RD╫RITE├HUNK = SYSWORK+4
  1060.  
  1061. RD╫RITE = *  ;( WRITE╠ENGTH, WRITE╨TR ) : (ZP)=DATA╙TART
  1062.    STX RD├FG╧FFSET
  1063.    LDA CONFIG┬UF+$03,X
  1064.    STA RD═ALLOC╞LAGS
  1065.    LDA REGSAVE+1  ;FD
  1066.    ASL
  1067.    ASL
  1068.    ASL
  1069.    ASL
  1070.    STA RD╞CB╧FFSET
  1071.    JSR RD╙AVE═P┌P
  1072.    LDX RD╞CB╧FFSET
  1073.    LDY #0
  1074. -  LDA RD╞CBW╧PEN═ODE,X
  1075.    STA RD╞CBW┬UF,Y
  1076.    INX
  1077.    INY
  1078.    CPY #16
  1079.    BCC -
  1080.    LDA RD╞CBW┬UF╧PEN═ODE
  1081.    CMP #"W"
  1082.    BEQ RD╫RITE═ORE
  1083.    LDA #ACE┼RR╞ILE╬OT╧UTPUT
  1084.  
  1085.    RD╫RITE┼RROR = *
  1086.    STA ERRNO
  1087.    LDA #0
  1088.    LDY #0
  1089.    SEC
  1090.    RD╫RITE┼XIT = *
  1091.    PHP
  1092.    LDY #0
  1093.    LDX RD╞CB╧FFSET
  1094. -  LDA RD╞CBW┬UF,Y
  1095.    STA RD╞CBW╧PEN═ODE,X
  1096.    INX
  1097.    INY
  1098.    CPY #16
  1099.    BCC -
  1100.    JSR RD╥ESTORE═P┌P
  1101.    PLP
  1102.    RTS
  1103.  
  1104.    RD╫RITE═ORE = *
  1105.    LDA WRITE╠ENGTH+0
  1106.    ORA WRITE╠ENGTH+1
  1107.    BNE +
  1108.    CLC
  1109.    JMP RD╫RITE┼XIT
  1110.    ;** GET NEW BLOCK IF OLD ONE FULL
  1111. +  LDA RD╞CBW┬UF╥EM┬YTES+0
  1112.    ORA RD╞CBW┬UF╥EM┬YTES+1
  1113.    BEQ +
  1114.    JMP RD╫RITE├OPY
  1115.    ;** GET NEW BLOCK
  1116. +  LDX WRITE╠ENGTH+1
  1117.    LDA WRITE╠ENGTH+0
  1118.    BEQ +
  1119.    INX
  1120. +  TXA
  1121.    JSR RD╓AR═ALLOC
  1122.    BCC +
  1123.    LDA #ACE┼RR─ISK╞ULL
  1124.    JMP RD╫RITE┼RROR
  1125. +  TAX
  1126.    LDA #0
  1127.    SEC
  1128.    SBC #6
  1129.    STA RD╞CBW┬UF╥EM┬YTES+0
  1130.    TXA
  1131.    SBC #0
  1132.    STA RD╞CBW┬UF╥EM┬YTES+1
  1133.    ;** INITIALIZE NEW BLOCK
  1134.    STX RD╬EW┬LK─ATA+0
  1135.    LDA #<RD╬EW┬LK─ATA
  1136.    LDY #>RD╬EW┬LK─ATA
  1137.    STA ZP+0
  1138.    STY ZP+1
  1139.    LDA #6
  1140.    LDY #0
  1141.    JSR STASH  ;NECESSARY?
  1142.    ;** LINK IN BLOCK, INIT FCB
  1143.    SEC
  1144.    LDA RD╞CBW┬UF╞ILE╨TR+1
  1145.    SBC RD╞CBW┬UF┬LK╨AGE
  1146.    SEC
  1147.    SBC #1
  1148.    STA RD╧LD┬LK─ATA+5
  1149.    LDA #250
  1150.    STA RD╧LD┬LK─ATA+4
  1151.    LDX #3
  1152. -  LDA MP,X
  1153.    LDY RD╞CBW┬UF╞ILE╨TR,X
  1154.    STA RD╞CBW┬UF╞ILE╨TR,X
  1155.    STA RD╧LD┬LK─ATA,X
  1156.    STY MP,X
  1157.    DEX
  1158.    BPL -
  1159.    LDA RD╞CBW┬UF┬LK╨AGE
  1160.    STA MP+1
  1161.    LDA #$01
  1162.    STA MP+0
  1163.    LDA RD╞CBW┬UF╞ILE╨TR+1
  1164.    STA RD╞CBW┬UF┬LK╨AGE
  1165.    LDA #<RD╧LD┬LK─ATA+1
  1166.    LDY #>RD╧LD┬LK─ATA+1
  1167.    STA ZP+0
  1168.    STY ZP+1
  1169.    LDA #5
  1170.    LDX MP+3
  1171.    CPX #ACE═EM╬ULL
  1172.    BNE +
  1173.    LDX #3
  1174. -  LDA RD╞CBW┬UF─IRENT,X
  1175.    STA MP,X
  1176.    DEX
  1177.    BPL -
  1178.    CLC
  1179.    LDA MP+0
  1180.    ADC #RD─IRENT╚EAD╨TR-RD─IRENT┬UF+1
  1181.    STA MP+0
  1182.    LDA #3
  1183. +  LDY #0
  1184.    JSR STASH
  1185.    LDA #$06
  1186.    STA RD╞CBW┬UF╞ILE╨TR+0
  1187.  
  1188.    ;** COPY DATA INTO BLOCK
  1189.    RD╫RITE├OPY = *
  1190.    LDX WRITE╠ENGTH+0
  1191.    LDY WRITE╠ENGTH+1
  1192.    CPX RD╞CBW┬UF╥EM┬YTES+0
  1193.    TYA
  1194.    SBC RD╞CBW┬UF╥EM┬YTES+1
  1195.    BCC +
  1196.    LDX RD╞CBW┬UF╥EM┬YTES+0
  1197.    LDY RD╞CBW┬UF╥EM┬YTES+1
  1198. +  STX RD╫RITE├HUNK+0
  1199.    STY RD╫RITE├HUNK+1
  1200.    LDX #3
  1201. -  LDA RD╞CBW┬UF╞ILE╨TR,X
  1202.    STA MP,X
  1203.    DEX
  1204.    BPL -
  1205.    LDA WRITE╨TR+0
  1206.    LDY WRITE╨TR+1
  1207.    STA ZP+0
  1208.    STY ZP+1
  1209.    LDA RD╫RITE├HUNK+0
  1210.    LDY RD╫RITE├HUNK+1
  1211.    JSR STASH
  1212.  
  1213.    ;** UPDATE CONTROL VARIABLES
  1214.    CLC
  1215.    LDA RD╞CBW┬UF╞ILE╨TR+0
  1216.    ADC RD╫RITE├HUNK+0
  1217.    STA RD╞CBW┬UF╞ILE╨TR+0
  1218.    LDA RD╞CBW┬UF╞ILE╨TR+1
  1219.    ADC RD╫RITE├HUNK+1
  1220.    STA RD╞CBW┬UF╞ILE╨TR+1
  1221.    SEC
  1222.    LDA RD╞CBW┬UF╥EM┬YTES+0
  1223.    SBC RD╫RITE├HUNK+0
  1224.    STA RD╞CBW┬UF╥EM┬YTES+0
  1225.    LDA RD╞CBW┬UF╥EM┬YTES+1
  1226.    SBC RD╫RITE├HUNK+1
  1227.    STA RD╞CBW┬UF╥EM┬YTES+1
  1228.    CLC
  1229.    LDA WRITE╨TR+0
  1230.    ADC RD╫RITE├HUNK+0
  1231.    STA WRITE╨TR+0
  1232.    LDA WRITE╨TR+1
  1233.    ADC RD╫RITE├HUNK+1
  1234.    STA WRITE╨TR+1
  1235.    SEC
  1236.    LDA WRITE╠ENGTH+0
  1237.    SBC RD╫RITE├HUNK+0
  1238.    STA WRITE╠ENGTH+0
  1239.    LDA WRITE╠ENGTH+1
  1240.    SBC RD╫RITE├HUNK+1
  1241.    STA WRITE╠ENGTH+1
  1242.    CLC
  1243.    LDA RD╞CBW┬UF╞ILE╙IZE+0
  1244.    ADC RD╫RITE├HUNK+0
  1245.    STA RD╞CBW┬UF╞ILE╙IZE+0
  1246.    LDA RD╞CBW┬UF╞ILE╙IZE+1
  1247.    ADC RD╫RITE├HUNK+1
  1248.    STA RD╞CBW┬UF╞ILE╙IZE+1
  1249.    BCC +
  1250.    INC RD╞CBW┬UF╞ILE╙IZE+2
  1251.    BNE +
  1252.    INC RD╞CBW┬UF╞ILE╙IZE+3
  1253. +  JMP RD╫RITE═ORE
  1254.  
  1255. RD╬EW┬LK─ATA = * ;GETS MODIFIED
  1256.    .BYTE $00
  1257.    .BYTE ACE═EM╬ULL,ACE═EM╬ULL,ACE═EM╬ULL
  1258.    .BYTE $00,$00
  1259. RD╧LD┬LK─ATA = * ;GETS MODIFIED
  1260.    .BYTE $00
  1261.    .BYTE ACE═EM╬ULL,ACE═EM╬ULL,ACE═EM╬ULL
  1262.    .BYTE 250,$00
  1263.  
  1264. RD├LOSE = *  ;( CLOSE╞D )
  1265.    LDA CLOSE╞D
  1266.    ASL
  1267.    ASL
  1268.    ASL
  1269.    ASL
  1270.    STA RD╞CB╧FFSET
  1271.    TAX
  1272.    LDA RD╞CBR╧PEN═ODE,X
  1273.    CMP #"W"
  1274.    BEQ +
  1275.    RTS
  1276. +  LDY #0
  1277. -  LDA RD╞CBW╧PEN═ODE,X
  1278.    STA RD╞CBW┬UF,Y
  1279.    INX
  1280.    INY
  1281.    CPY #16
  1282.    BCC -
  1283.    JSR RD╙AVE═P┌P
  1284.    ;** TIDY UP LAST BLOCK CONTROL INFO
  1285.    LDX #3
  1286. -  LDA RD╞CBW┬UF╞ILE╨TR,X
  1287.    STA MP,X
  1288.    DEX
  1289.    BPL -
  1290.    LDA RD╞CBW┬UF┬LK╨AGE
  1291.    STA MP+1
  1292.    LDA #$01
  1293.    STA MP+0
  1294.    SEC
  1295.    LDA RD╞CBW┬UF╞ILE╨TR+0
  1296.    SBC #$06
  1297.    STA RD╧LD┬LK─ATA+4
  1298.    LDA RD╞CBW┬UF╞ILE╨TR+1
  1299.    SBC RD╞CBW┬UF┬LK╨AGE
  1300.    STA RD╧LD┬LK─ATA+5
  1301.    LDA #ACE═EM╬ULL
  1302.    STA RD╧LD┬LK─ATA+1
  1303.    STA RD╧LD┬LK─ATA+2
  1304.    STA RD╧LD┬LK─ATA+3
  1305.    LDA #<RD╧LD┬LK─ATA+1
  1306.    LDY #>RD╧LD┬LK─ATA+1
  1307.    STA ZP+0
  1308.    STY ZP+1
  1309.    LDA #5
  1310.    LDY #0
  1311.    JSR STASH
  1312.    ;** TIDY UP DIRECTORY ENTRY
  1313.    LDX #3
  1314. -  LDA MP,X
  1315.    STA RD╞CBW┬UF╞ILE╨TR,X
  1316.    LDA RD╞CBW┬UF─IRENT,X
  1317.    STA MP,X
  1318.    DEX
  1319.    BPL -
  1320.    LDA #$00
  1321.    STA RD╞CBW┬UF╞ILE╨TR+0
  1322.    LDA #<RD─IRENT┬UF
  1323.    LDY #>RD─IRENT┬UF
  1324.    STA ZP+0
  1325.    STY ZP+1
  1326.    LDA #RD─IRENT╠ENGTH
  1327.    LDY #0
  1328.    JSR FETCH
  1329.    LDA RD─IRENT╞LAGS
  1330.    AND #%11110111
  1331.    STA RD─IRENT╞LAGS
  1332.    LDX #3
  1333. -  LDA RD╞CBW┬UF╞ILE╨TR,X
  1334.    STA RD─IRENT╘AIL╨TR,X
  1335.    LDA RD╞CBW┬UF╞ILE╙IZE,X
  1336.    STA RD─IRENT┬YTES,X
  1337.    DEX
  1338.    BPL -
  1339.    LDA #RD─IRENT╠ENGTH
  1340.    LDY #0
  1341.    JSR STASH
  1342.    JSR RD╥ESTORE═P┌P
  1343.    RTS
  1344.  
  1345. RD┬LOAD┴DDR  .BUF 2
  1346. RD┬LOAD╘OP   .BUF 2
  1347. RD┬LOAD╠EN   .BUF 2
  1348. RD┬LOAD╞D    .BUF 1
  1349. RD┬LOAD┬YTES .BUF 2
  1350. RD┬LOAD╬AME  .BUF 2
  1351. RD┬LOAD┼ND   .BUF 2
  1352.  
  1353. RD┬LOAD = *
  1354.    ;** BINARY-LOAD A FILE
  1355.    ;** THIS ROUTINE IS FAIRLY HIGH-LEVEL AND CALLS THE REGULAR FILE SYSTEM
  1356.    ;** CALLS; MAKE SURE ONE FCB IS FREE
  1357.    LDX #1
  1358. -  LDA BLOAD┴DDRESS,X
  1359.    STA RD┬LOAD┴DDR,X
  1360.    LDA ZP,X
  1361.    STA RD┬LOAD╬AME,X
  1362.    DEX
  1363.    BPL -
  1364.    SEC
  1365.    LDA ZW+0
  1366.    STA RD┬LOAD╘OP+0
  1367.    SBC BLOAD┴DDRESS+0
  1368.    STA RD┬LOAD╠EN+0
  1369.    LDA ZW+1
  1370.    STA RD┬LOAD╘OP+1
  1371.    SBC BLOAD┴DDRESS+1
  1372.    STA RD┬LOAD╠EN+1
  1373.    ;** (ZP) ALREADY CONTAINS FILENAME
  1374.    LDA #"R"
  1375.    JSR OPEN
  1376.    STA RD┬LOAD╞D
  1377.    BCC +
  1378.    RTS
  1379. +  LDA #<RD┬LOAD┬YTES
  1380.    LDY #>RD┬LOAD┬YTES
  1381.    STA ZP+0
  1382.    STY ZP+1
  1383.    LDA #2
  1384.    LDY #0
  1385.    LDX RD┬LOAD╞D
  1386.    JSR READ
  1387.    BCS RD┬LOAD┼RR├LOSE
  1388.    LDA RD┬LOAD┴DDR+0
  1389.    LDY RD┬LOAD┴DDR+1
  1390.    STA ZP+0
  1391.    STY ZP+1
  1392.    LDA RD┬LOAD╠EN+0
  1393.    LDY RD┬LOAD╠EN+1
  1394.    LDX RD┬LOAD╞D
  1395.    JSR READ
  1396.    BCC +
  1397.    RD┬LOAD┼RR├LOSE = *
  1398.    LDA ERRNO
  1399.    PHA
  1400.    LDA RD┬LOAD╞D
  1401.    JSR CLOSE
  1402.    PLA
  1403.    STA ERRNO
  1404.    JSR RD┬LOAD├LEANUP
  1405.    SEC
  1406.    RTS
  1407.  
  1408. +  CLC
  1409.    ADC RD┬LOAD┴DDR+0
  1410.    STA RD┬LOAD┼ND+0
  1411.    TYA
  1412.    ADC RD┬LOAD┴DDR+1
  1413.    STA RD┬LOAD┼ND+1
  1414.    LDA #<RD┬LOAD┬YTES
  1415.    LDY #>RD┬LOAD┬YTES
  1416.    STA ZP+0
  1417.    STY ZP+1
  1418.    LDA #1
  1419.    LDY #0
  1420.    LDX RD┬LOAD╞D
  1421.    JSR READ
  1422.    BEQ +
  1423.  
  1424.    LDA #ACE┼RR┬LOAD╘RUNCATED
  1425.    STA ERRNO
  1426.    JMP RD┬LOAD┼RR├LOSE
  1427.  
  1428. +  LDA RD┬LOAD╞D
  1429.    JSR CLOSE
  1430.    RD┬LOAD├LEANUP = *
  1431.    LDX #1
  1432. -  LDA RD┬LOAD╬AME,X
  1433.    STA ZP,X
  1434.    LDA RD┬LOAD╘OP,X
  1435.    STA ZW,X
  1436.    DEX
  1437.    BPL -
  1438.    LDA RD┬LOAD┼ND+0
  1439.    LDY RD┬LOAD┼ND+1
  1440.    CLC
  1441.    RTS
  1442.  
  1443. RD┼XTRACT╞ILETYPE = *  ;( STRING┬UFFER, .╪=STRLEN ) : .┴=FILETYPE, STR┬UF
  1444.    LDA #"S"
  1445.    CPX #2
  1446.    BCS +
  1447. -  LDA #"S"
  1448.    SEC
  1449.    RTS
  1450. +  LDA STRING┬UFFER-2,X
  1451.    CMP #","
  1452.    BNE -
  1453.    LDA #0
  1454.    STA STRING┬UFFER-2,X
  1455.    LDA STRING┬UFFER-1,X
  1456.    CLC
  1457.    RTS
  1458.  
  1459. RD╥EMOVE─EVICE .BUF 1
  1460. RD╥EMOVE┬LK╚DR .BUF 7
  1461. RDUMMY .BUF 1
  1462.  
  1463. RD╥EMOVE = *  ;( .┴=DEVICE, .┘=SCAN╨OS ) : .├├=OK
  1464.    STA RD╥EMOVE─EVICE
  1465.    ;** FETCH FILENAME STRING FOR DIR-SCAN
  1466.    LDX #0
  1467. -  LDA (ZP),Y
  1468.    STA STRING┬UFFER,X
  1469.    BEQ +
  1470.    INX
  1471.    INY
  1472.    BNE -
  1473. +  JSR RD┼XTRACT╞ILETYPE
  1474.    JSR RD╙AVE═P┌P
  1475.    ;** GET WORKING DIRECTORY FOR DIR-SCAN
  1476.    LDA RD╥EMOVE─EVICE
  1477.    ASL
  1478.    TAY
  1479.    INY
  1480.    INY
  1481.    INY
  1482.    INY
  1483.    LDX #0
  1484. -  LDA DEVICE╘ABLE,Y
  1485.    STA RD╫ORK─IR,X
  1486.    INY
  1487.    INX
  1488.    CPX #4
  1489.    BCC -
  1490.    ;** SCAN DIRECTORY, GET FILE ENTRY
  1491.    JSR RD╙CAN─IR
  1492.    BCC +
  1493.    JSR RD╥ESTORE═P┌P
  1494.    SEC
  1495.    RTS
  1496.    ;** REMOVE ALL BLOCKS OF FILE
  1497. +  LDX #3
  1498. -  LDA RD─IRENT╚EAD╨TR,X
  1499.    STA MP,X
  1500.    DEX
  1501.    BPL -
  1502.    RD╥EMOVE╬EXT┬LOCK = *
  1503.    LDA MP+3
  1504.    CMP #ACE═EM╬ULL
  1505.    BEQ RD╥EMOVE─IRENT
  1506.    ;*** FETCH BLOCK HEADER
  1507.    LDA #<RD╥EMOVE┬LK╚DR
  1508.    LDY #>RD╥EMOVE┬LK╚DR
  1509.    STA ZP+0
  1510.    STY ZP+1
  1511.    LDA #6
  1512.    LDY #0
  1513.    JSR FETCH
  1514.    ;*** FREE BLOCK
  1515.    LDA RD╥EMOVE┬LK╚DR+0
  1516.    JSR RD╞REE
  1517.    ;*** GO TO NEXT BLOCK
  1518.    LDX #2
  1519. -  LDA RD╥EMOVE┬LK╚DR+1,X
  1520.    STA MP+1,X
  1521.    DEX
  1522.    BPL -
  1523.    LDA #0
  1524.    STA MP+0
  1525.    JMP RD╥EMOVE╬EXT┬LOCK
  1526.    
  1527.    ;** MARK DIRECTORY ENTRY DELETED
  1528.    RD╥EMOVE─IRENT = *
  1529.    LDA RD─IRENT╒SAGE
  1530.    AND #%01111111
  1531.    STA RD─IRENT╒SAGE
  1532.    ;** WRITE OUT UPDATED DIRECTORY ENTRY
  1533.    LDX #3
  1534. -  LDA RD─IRENT╨TR,X
  1535.    STA MP,X
  1536.    DEX
  1537.    BPL -
  1538.    LDA #<RD─IRENT┬UF
  1539.    LDY #>RD─IRENT┬UF
  1540.    STA ZP+0
  1541.    STY ZP+1
  1542.    LDA #RD─IRENT╠ENGTH
  1543.    LDY #0
  1544.    JSR STASH
  1545.    ;** TIDY UP AND EXIT
  1546.    JSR RD╥ESTORE═P┌P
  1547.    CLC
  1548.    RTS
  1549.  
  1550. RD╥ENAME─EVICE .BUF 1
  1551. RD╥ENAME╙CAN   .BUF 1
  1552. RD╥ENAME╘YPE   .BUF 1
  1553. RD╥ENAME╬EW╬AME .BUF 17
  1554.  
  1555. RD╥ENAME = *  ;( .┴=DEVICE, .┘=SCAN╨OS ) : .├├=OK
  1556.    STA RD╥ENAME─EVICE
  1557.    STY RD╥ENAME╙CAN
  1558.    ;** SCAN FOR NEW NAME (SHOULD NOT EXIST)
  1559.    LDY #0
  1560.    LDX #0
  1561. -  LDA (ZW),Y
  1562.    STA STRING┬UFFER,X
  1563.    BEQ +
  1564.    INX
  1565.    INY
  1566.    BNE -
  1567. +  JSR RD┼XTRACT╞ILETYPE
  1568.    BCC +
  1569.    LDA #0
  1570. +  STA RD╥ENAME╘YPE
  1571.    LDA #0
  1572.    STA STRING┬UFFER+16
  1573.    LDX #16
  1574. -  LDA STRING┬UFFER,X
  1575.    STA RD╥ENAME╬EW╬AME,X
  1576.    DEX
  1577.    BPL -
  1578.    JSR RD╙AVE═P┌P
  1579.    ;** GET WORKING DIRECTORY FOR NEW-NAME-DIR-SCAN
  1580.    LDA RD╥ENAME─EVICE
  1581.    ASL
  1582.    TAY
  1583.    INY
  1584.    INY
  1585.    INY
  1586.    INY
  1587.    LDX #0
  1588. -  LDA DEVICE╘ABLE,Y
  1589.    STA RD╫ORK─IR,X
  1590.    INY
  1591.    INX
  1592.    CPX #4
  1593.    BCC -
  1594.    ;** SCAN DIRECTORY, GET FILE ENTRY
  1595.    JSR RD╙CAN─IR
  1596.    BCS +
  1597.    JSR RD╥ESTORE═P┌P
  1598.    LDA #ACE┼RR╞ILE┼XISTS
  1599.    STA ERRNO
  1600.    SEC
  1601.    RTS
  1602.    ;** SCAN FOR DIRENT TO MODIFY
  1603. +  LDA RD┌P╙AVE+0
  1604.    LDY RD┌P╙AVE+1
  1605.    STA ZP+0
  1606.    STY ZP+1
  1607.    LDY RD╥ENAME╙CAN
  1608.    LDX #0
  1609. -  LDA (ZP),Y
  1610.    STA STRING┬UFFER,X
  1611.    BEQ +
  1612.    INX
  1613.    INY
  1614.    BNE -
  1615. +  JSR RD┼XTRACT╞ILETYPE
  1616.    JSR RD╙AVE═P┌P
  1617.    ;** SCAN DIRECTORY, GET FILE ENTRY
  1618.    JSR RD╙CAN─IR
  1619.    BCC +
  1620.    JSR RD╥ESTORE═P┌P
  1621.    SEC
  1622.    RTS
  1623. +  LDX #16
  1624. -  LDA RD╥ENAME╬EW╬AME,X
  1625.    STA RD─IRENT╬AME,X
  1626.    DEX
  1627.    BPL -
  1628.    LDX #2
  1629. -  LDA RD╥ENAME╦NOWN╘YPES1,X
  1630.    CMP RD╥ENAME╘YPE
  1631.    BEQ +
  1632.    DEX
  1633.    BPL -
  1634.    JMP ++
  1635. +  STA RD─IRENT╘YPE+0
  1636.    LDA RD╥ENAME╦NOWN╘YPES2,X
  1637.    STA RD─IRENT╘YPE+1
  1638.    LDA RD╥ENAME╦NOWN╘YPES3,X
  1639.    STA RD─IRENT╘YPE+2
  1640.    ;** WRITE OUT UPDATED DIRECTORY ENTRY
  1641. +  LDX #3
  1642. -  LDA RD─IRENT╨TR,X
  1643.    STA MP,X
  1644.    DEX
  1645.    BPL -
  1646.    LDA #<RD─IRENT┬UF
  1647.    LDY #>RD─IRENT┬UF
  1648.    STA ZP+0
  1649.    STY ZP+1
  1650.    LDA #RD─IRENT╠ENGTH
  1651.    LDY #0
  1652.    JSR STASH
  1653.    ;** TIDY UP AND EXIT
  1654.    JSR RD╥ESTORE═P┌P
  1655.    CLC
  1656.    RTS
  1657.  
  1658. RD╥ENAME╦NOWN╘YPES1 .ASC "SPU"
  1659. RD╥ENAME╦NOWN╘YPES2 .ASC "ERS"
  1660. RD╥ENAME╦NOWN╘YPES3 .ASC "QGR"
  1661.  
  1662. ;THE END + BLANK LINE
  1663.  
  1664.