?login_element?

Subversion Repositories NedoOS

Rev

Rev 1469 | Blame | Compare with Previous | Last modification | View Log | Download

  1.       if 0
  2. TEMP_SEC EQU #5CF4
  3. SEC_LEN EQU #5CEA
  4. SECTOR  EQU #5CEB
  5. TRACK   EQU #5CEC
  6. FILENAME EQU #5CDD
  7. FILEEXT  EQU #5CE5
  8. FREE EQU #E5 ;смещение в секторе 9, где
  9. ;находится количество свободных секторов
  10. FREESECT EQU #E1; смещение в секторе 9,
  11. ;где находится первый свободный трек и
  12. ;сектор
  13.       endif
  14.  
  15.       if 0
  16.        IF atm
  17. TRDOS
  18.         PUSH AF
  19.         PUSH BC
  20.         PUSH HL
  21.         CALL ATMOFF
  22.         POP HL
  23.         POP BC
  24.         POP AF
  25.         CALL #3D13
  26.         PUSH AF
  27.         PUSH BC
  28.         PUSH HL
  29.         CALL ATMON
  30.         POP HL
  31.         POP BC
  32.         POP AF
  33.         RET
  34.        ELSE
  35. TRDOS   EQU #3D13
  36.        ENDIF
  37.      endif
  38.  
  39. dosunit
  40.           SCF
  41.           RET
  42.  
  43.  
  44. st_close
  45.  
  46.          LD A,(tsflag)
  47.          AND A
  48.          CALL NZ,ts_close
  49.          SCF
  50.          RET
  51.  
  52.  
  53. dosinit
  54. ;0x705C содержит имя файла с точкой, в конце 0xff,'$'
  55. ;хэндл файла надо сохранить в STORY
  56. ;потом переделать имя файла в 8.3 с точкой, в конце 0xff,'$'
  57.      if 1
  58.      else
  59.  
  60.          LD B,8    ;Заполняем восмью
  61.          LD HL,FILENAME ;пробелами
  62. MET7     LD (HL),#20 ;имя файла
  63.          INC HL
  64.          DJNZ MET7
  65.  
  66. ;Перенос информации в область
  67. ;переменных DOS'а
  68.       LD BC,FILENAME ;Нормально рабо-
  69.       LD HL,#705C ;тающий, безглючный
  70. MET6  LD A,(HL) ;определитель имени
  71.       CP #FF
  72.       JP Z,END1 ;Точка должна быть
  73.       CP "." ;только одна
  74.       JP NZ,MET5
  75.  
  76.       LD BC,FILEEXT
  77.       INC HL
  78.       LD A,(HL)
  79.  
  80. MET5  LD (BC),A
  81.       INC BC
  82.       INC HL
  83.       JP MET6
  84.  
  85. END1
  86.          AND A
  87.       PUSH BC
  88.       POP HL
  89.       LD BC,FILENAME
  90.       SBC HL,BC
  91.       LD A,L ;количество байтов маски
  92.  
  93. ;Поиск файла в каталоге по
  94. ;маске "имя.ext"
  95.       LD C,#0A
  96.       LD (23814),A
  97.       CALL TRDOS
  98.  
  99. ;Чтение полного заголовка файла
  100.       LD A,C
  101.       LD (STORY),A
  102.       LD C,#08
  103.       CALL TRDOS
  104.  
  105. ;Перенос из дескриптора в #705c
  106. ;Нужно для нормального вывода на экран
  107. ;имени файла, а не его огрызка
  108.       LD HL,#705C
  109.       LD C,#14
  110.       CALL TRDOS
  111.       LD A,(#7065)
  112.       LD (#7066),A
  113.       LD A,(#7064)
  114.       LD (#7065),A
  115.       LD HL,#7064
  116.       LD (HL),"."
  117.  
  118.       LD HL,#7067
  119.       LD (HL),#FF ;Такие требования
  120.       INC HL      ;идут в ZXZVM +3
  121.       LD (HL),"$"
  122.     endif
  123.       SCF
  124.       RET
  125.  
  126.  
  127.  
  128.  
  129. st_reload
  130. ;???
  131.       XOR A ; в 6-й банке (буфер) ничего
  132.       LD (BUFMEM),A ;нет
  133.       LD HL,(REAL_LEN2) ;восстанавливаем
  134.       LD (REAL_LEN),HL ;реальную длину
  135.  
  136.     if 1
  137.     else
  138.       LD A,(STORY) ;считывание заголовка
  139.       LD C,#08
  140.       CALL TRDOS
  141.     endif
  142.  
  143.  
  144.       CALL RRR ;считываем первые 64 Кб
  145. ;z-памяти (динамическая память)
  146.  
  147.       SCF
  148.       RET
  149.  
  150.  
  151. st_open
  152.  
  153.  
  154. MET4  LD A,(BANKM) ;На всякий случай
  155.       LD (TEMPBANKA),A ;запоминаем какая
  156. ;банка и в каком режиме была включена
  157.     if 1
  158.       ld hl,0x705C
  159.       ld d,h
  160.       ld e,l
  161.       ld a,0xff
  162.       ld b,1
  163.       cpir
  164.       dec hl
  165.       push hl
  166.       inc (hl);0x00 для ASCIIZ
  167.  
  168.       OS_OPENHANDLE
  169.       ld a,b
  170.       ld (STORY),a
  171.  
  172.       OS_GETFILESIZE ;dehl=file size
  173.         ld l,h
  174.         ld h,e
  175.           LD (REAL_LEN),HL
  176.           LD (REAL_LEN2),HL
  177.  
  178.       pop hl
  179.       dec (hl);0xff как было
  180.      
  181.     else
  182.       LD A,(STORY)
  183.       LD C,#08
  184.       CALL TRDOS
  185.       LD A,(SEC_LEN)
  186.       CP #FF ;Сравниваем, а не нужна ли
  187. ;проверка на наличие дополнительных
  188. ;файлов к основному (ext = 0,1,2,...)
  189.       LD E,A
  190.       LD D,#00
  191.       LD (REAL_LEN),DE
  192.       LD (REAL_LEN2),DE
  193.       CALL Z,real_len
  194.  
  195.       LD A,(STORY) ;Т.к. после вызова
  196.       LD C,#08 ;real_len дескриптор мог
  197.       CALL TRDOS ;измениться восстанав-
  198. ;ливаем дескриптор основного файла
  199.       LD HL,(SECTOR) ;трек и сектор
  200.       LD (FILE_BEGIN),HL ;начала файла
  201.     endif
  202.  
  203. RRR   LD HL,BankN
  204.       LD (WHERE),HL
  205. ;сюда переходим при рестарте
  206.  
  207.  
  208. MET3
  209.        ;LD DE,(SECTOR) ;FIXME?
  210. ;помещаем информацию о треке и
  211. ;секторе файла
  212.  
  213.        LD HL,(WHERE)
  214.        LD A,(HL)
  215.        CP BANKN_TERMINATOR;#02
  216.        JR Z,LOADED64K ;Загружены все
  217. ;банки (не только 64к), переход на конец
  218. ;загрузки файла
  219.  
  220.        CALL selmem; Переключаем страницу
  221. ;для загрузки в нее данных
  222.  
  223.        INC HL
  224.        LD (WHERE),HL
  225.  
  226.        LD HL,(REAL_LEN)
  227.        LD BC,#0040
  228. ; #40 = 64 сектора = страница
  229. ;количество секторов файла
  230.        AND A
  231.        SBC HL,BC
  232.        JR Z,MET2
  233.        JR C,MET2
  234.        LD (REAL_LEN),HL
  235.        
  236.     if 1
  237.       ld hl,0x4000
  238.       ld de,0xc000
  239.       ld a,(STORY)
  240.       ld b,a
  241.       OS_READHANDLE
  242.     else
  243.        LD B,64
  244.        LD A,(TRACK)
  245.        ADD A,#04
  246.        LD (TRACK),A
  247.        CALL READ ;DE брали из переменной TR-DOS, т.е. продолжаем читать файл
  248.     endif
  249.  
  250.        JP MET3
  251.  
  252.  
  253. MET2   LD A,(REAL_LEN) ;Все влезло в
  254. ;доступные банки, посему загружаем
  255. ;остаток и спокойно идем дальше
  256.     if 1
  257.       ld hl,0x4000
  258.       ld de,0xc000
  259.       ld a,(STORY)
  260.       ld b,a
  261.       OS_READHANDLE
  262.     else
  263.        LD B,A
  264.        CALL READ
  265.     endif
  266.  
  267. LOADED64K  LD A,(TEMPBANKA)
  268.            CALL selmem
  269.  
  270.            LD A,BANKN_TERMINATOR;#02 ;для возможности
  271.            LD (BankN+4),A ;restart'а
  272.            SCF
  273.            RET
  274.  
  275.      if 0
  276. READ   LD HL,#C000 ;Чтение группы
  277.        LD C,#05    ;секторов
  278.        CALL TRDOS
  279.        RET
  280.      endif
  281.  
  282.  
  283.      if 0
  284. real_len
  285.          LD A,#30   ;Загоняем начальное
  286.           LD (EXT),A ;расширение '0'
  287.  
  288.           LD HL,#705C ;переносим инфор-
  289.           LD C,#14 ;мацию из дескриптора
  290. ;файла в адрес #705c
  291.           CALL TRDOS
  292.           LD A,(STORY)
  293.           LD (TEMPSTORY),A
  294.  
  295. CYCLE3    LD A,(TEMPSTORY)
  296.           INC A
  297.           LD (TEMPSTORY),A
  298.           LD C,#08 ;Считываем следущий
  299.           CALL TRDOS;за игровым файл
  300. ;для дальнейщей его проверки
  301.           LD HL,#705C
  302.           LD DE,FILENAME
  303.           LD B,8
  304. CYCLE2    LD C,(HL) ;Цикл проверки
  305.           LD A,(DE) ;Сравниваем имена
  306.           SUB C
  307.           RET NZ
  308.           INC HL
  309.           INC DE
  310.           DJNZ CYCLE2
  311.           LD A,(DE) ;Проверяем правиль-
  312.           LD C,A ;ность расширения
  313.           LD A,(EXT)
  314.           SUB C
  315.           RET NZ
  316.           LD A,(EXT)
  317.           INC A
  318.           LD (EXT),A
  319.           LD DE,(SEC_LEN)
  320.           LD D,#00
  321.           LD HL,(REAL_LEN)
  322.           ADD HL,DE
  323.           LD (REAL_LEN),HL
  324.           LD (REAL_LEN2),HL
  325.           JR CYCLE3
  326.      endif
  327.  
  328.  
  329.      if 0
  330. st_peek
  331.  
  332.         IF bigmem
  333.         PUSH HL
  334.         ENDIF
  335.          PUSH BC
  336.          PUSH DE
  337.          PUSH IX
  338.  
  339. ;Вставить проверку на ошибку
  340.  
  341.          LD A,H
  342.          LD HL,TEMP
  343.          LD (HL),A
  344.          LD A,E
  345.  
  346.          RRD
  347.          LD A,(HL)
  348.  
  349.          AND #FC
  350. ;#x0,#x1,#x2,#x3 -> #x0
  351. ;#x4,#x5,#x6,#x7 -> #x4
  352. ;#x8,#x9,#xA,#xB -> #x8
  353. ;#xC,#xD,#xE,#xF -> #xC
  354.  
  355.          LD (BUFMEM),A
  356.  
  357.          LD DE,(FILE_BEGIN)
  358.          ADD A,D
  359.          LD D,A
  360.  
  361.          LD B,64    ;Загрузка в буфер
  362.          LD HL,#C000 ;нужной части памя-
  363.          LD C,#05    ;ти
  364.          CALL TRDOS
  365.  
  366.          DI
  367.  
  368.          LD HL,(HL_)
  369.  
  370.          POP IX
  371.          POP DE
  372.          POP BC
  373.  
  374.         IF bigmem
  375.          POP HL
  376.         ELSE
  377.          LD HL,(HL_)
  378.         ENDIF
  379.  
  380.          RET
  381.      endif
  382.  
  383. ;;;;;;
  384. ; Открытие и закрытие файла-отгрузки
  385. ;
  386.  
  387.  
  388.       if 0
  389. init_name
  390. ;hl=name
  391.          LD C,#13 ;Переносим имя из
  392.            CALL TRDOS ;HL в системную
  393. ;область TR-DOS'а
  394.  
  395.           LD A,#FF ;Находим конец имени
  396.           LD HL,FILENAME
  397.           LD BC,#0009
  398.           CPIR
  399.           LD B,C
  400.           INC B
  401.           DEC HL
  402.  
  403. CYCLE4    LD A,#20 ;и забиваем #FF и
  404.           LD (HL),A ;далее пробелами
  405.           INC HL
  406.           DEC B
  407.           JR NZ,CYCLE4
  408.  
  409.           LD A,"!" ;устанавливаем рас-
  410.           LD (FILEEXT),A ;ширение '!'
  411.           RET
  412.       endif
  413. ;;;;;
  414. ;;;;;;;
  415. p3read
  416.         PUSH AF
  417.         PUSH HL
  418.         PUSH BC
  419.         PUSH DE
  420.         PUSH IX
  421.        XOR A
  422.        LD (WHAT),A
  423.        CALL driver
  424.  
  425.        POP IX
  426.        POP DE
  427.        POP BC
  428.        POP HL
  429.        POP AF
  430.  
  431.        SCF
  432.        RET
  433. ;;;;;;
  434. p3write
  435.  
  436.         PUSH AF
  437.         PUSH HL
  438.         PUSH BC
  439.         PUSH DE
  440.         PUSH IX
  441.  
  442.         LD A,#01
  443.         LD (WHAT),A
  444.         CALL driver
  445.  
  446.         POP IX
  447.         POP DE
  448.         POP BC
  449.         POP HL
  450.         POP AF
  451.         SCF
  452.         RET
  453. ;;;;;;
  454. p3rmem
  455.         PUSH AF
  456.         PUSH HL
  457.         PUSH BC
  458.         PUSH DE
  459.         PUSH IX
  460.  
  461.         LD A,#02
  462.         LD (WHAT),A
  463.         CALL driver
  464.  
  465.         POP IX
  466.         POP DE
  467.         POP BC
  468.         POP HL
  469.         POP AF
  470.         SCF
  471.         RET
  472. ;;;;;;;
  473. p3wmem
  474.         PUSH AF
  475.         PUSH HL
  476.         PUSH BC
  477.         PUSH DE
  478.         PUSH IX
  479.  
  480.         LD A,#03
  481.         LD (WHAT),A
  482.         CALL driver
  483.  
  484.         POP IX
  485.         POP DE
  486.         POP BC
  487.         POP HL
  488.         POP AF
  489.         SCF
  490.         RET
  491.  
  492. ;;;;;;;;;;
  493.  
  494. p3opn
  495.          PUSH AF ;сохраняем все регистры
  496.        PUSH HL ; (на всякий случай)
  497.        PUSH BC
  498.        PUSH DE
  499.        PUSH IX
  500.      if 0
  501.        LD A,#09 ;маска в 9 символов
  502.        LD (23814),A
  503.      endif
  504.  
  505.        LD A,B ;b=0 - открыть файл
  506.        AND A  ;b=1 - создать файл
  507.  
  508.        JR NZ,createe
  509.  
  510. read ;для отгрузок
  511. ;hl=name
  512.      if 1
  513.        ld d,h
  514.        ld e,l
  515.        ld a,0xff
  516.        ld b,1
  517.        cpir
  518.        dec hl
  519.        push hl
  520.        inc (hl) ;0x00 для ASCIIZ
  521.        OS_OPENHANDLE
  522.        pop hl
  523.        dec (hl) ;0xff как было
  524.        or a
  525.        JR nz,NO_FILE
  526.        LD A,b ;запоминаем
  527.        LD (OPENFILE),A ;его
  528.        ld hl,0
  529.        ld (SECT),hl ;запоминаем начало файла
  530.        
  531.      else
  532.        CALL init_name
  533.        LD C,#0A ;получаем номер файла
  534.        CALL TRDOS
  535.        LD A,C ;запоминаем
  536.        LD (OPENFILE),A ;его
  537.        CP #FF
  538.        JR Z,NO_FILE
  539.  
  540.        LD C,#08   ;считываем полную
  541.        CALL TRDOS ;информацию о нем
  542.  
  543.        LD HL,(SECTOR) ;запоминаем
  544.        LD (SECT),HL   ;начало файла
  545.      endif
  546.        XOR A ;устанавливаем естественно
  547.        LD (SMESH),A ;смещение (внутри сектора) в ноль
  548.  
  549.        POP IX
  550.        POP DE
  551.        POP BC
  552.        POP HL
  553.        POP AF
  554.        SCF
  555.        RET
  556.  
  557. NO_FILE POP IX
  558.         POP DE
  559.         POP BC
  560.         POP HL
  561.         POP AF
  562.         AND A
  563.         RET
  564.  
  565. createe ;для отгрузок
  566.  
  567.         LD A,(tsflag)
  568.         AND A
  569.         CALL NZ,ts_close
  570.  
  571.      if 1
  572.       ;jr $
  573.        ld d,h
  574.        ld e,l
  575.        ld a,0xff
  576.        ld b,1
  577.        cpir
  578.        dec hl
  579.        push hl
  580.        inc (hl) ;0x00 для ASCIIZ
  581.        OS_CREATEHANDLE
  582.        pop hl
  583.        dec (hl) ;0xff как было
  584.        ;or a
  585.        ;JR nz,NO_FILE
  586.        LD A,b ;запоминаем
  587.        LD (OPENFILE),A ;его
  588.        ld hl,0
  589.        ld (SECT),hl ;запоминаем начало файла
  590.        
  591.      else
  592.         CALL init_name
  593.  
  594.         LD C,#12
  595.         CALL TRDOS
  596.  
  597.         LD HL,#0000 ;создание заголовка
  598.         LD DE,#0001 ;файла
  599.         LD C,#0B
  600.         CALL TRDOS
  601.  
  602.  
  603.         LD HL,(SECTOR) ;запоминание на-
  604.         LD (FILEBEG),HL ;начального
  605.         LD (SECT),HL ;сектора
  606.  
  607.         LD A,#09 ;установление маски
  608.         LD (23814),A ;длиной в 9 байт
  609.         LD C,#0A ;получение номера файла
  610.         CALL TRDOS ;в каталоге
  611.         LD A,C
  612.         LD (OPENFILE),A
  613.      endif
  614.  
  615.         XOR A ;установление смещения в
  616.         LD (SMESH),A ;ноль
  617.  
  618.         POP IX
  619.         POP DE
  620.         POP BC
  621.         POP HL
  622.         POP AF
  623.         SCF
  624.         RET
  625. ;;;;;;
  626.       if 0
  627. NO17SEC LD A,L ;дабы не было 17-го
  628.         CP 16  ;сектора
  629.         RET C
  630.         SUB 16
  631.         LD L,A
  632.         INC H
  633.         RET
  634.       endif
  635.  
  636. ;;;;
  637. ;Close file
  638. ;
  639. p3clse
  640.         PUSH AF
  641.         PUSH HL
  642.         PUSH BC
  643.         PUSH DE
  644.         PUSH IX
  645.  
  646.         LD A,(WHAT);если для открытия
  647.         AND A ;файла, то сразу переход
  648.         JR Z,FOR_OPEN ;на конец
  649.  
  650.       if 1
  651.        ld a,(OPENFILE)
  652.        ld b,a
  653.        OS_CLOSEHANDLE
  654.       else
  655.         LD HL,(SECT) ;получаем информа-
  656.         INC HL ;цию о следущем свободном
  657. ;секторе
  658.         CALL NO17SEC
  659.  
  660.         LD (SECT),HL
  661.  
  662.         LD DE,#0008 ;считываем
  663.         LD BC,#0105 ;9-й (системный)
  664.         LD HL,BUFFER ;сектор
  665.         CALL TRDOS
  666.  
  667.         LD HL,(SECT)
  668.         LD (BUFFER+FREESECT),HL
  669. ;записываем первый свободный трек
  670. ;и сектор
  671.  
  672.         LD DE,(FILEBEG)
  673.         LD A,H ;длина файла в треках
  674.         SUB D  ;без секторов
  675.  
  676. ;!!!
  677.  
  678.         SLA A ;получаем количество
  679.         SLA A ;секторов
  680.         SLA A
  681.         SLA A
  682.  
  683.         SUB E ;получаем полное
  684.         ADD A,L;количество секторов
  685.         DEC A
  686.  
  687.         PUSH AF
  688.         LD B,#00 ;вычисляем количество
  689.         LD C,A   ;свободных секторов
  690.         LD HL,(BUFFER+FREE)
  691.         AND A
  692.         SBC HL,BC
  693.  
  694.         LD (BUFFER+FREE),HL
  695.  
  696.         LD HL,BUFFER ;сохраняем измене-
  697.         LD BC,#0106  ;ный 9-й сектор
  698.         LD DE,#0008
  699.         CALL TRDOS
  700.  
  701.  
  702.         LD A,(OPENFILE) ;получаем
  703.         LD C,#08 ;полную информацию о
  704.         CALL TRDOS ;открытом файле
  705.  
  706.         POP AF
  707.         INC A  ;сохраняем длину файла
  708.         LD (SEC_LEN),A ;в секторах
  709.  
  710.         LD A,(OPENFILE) ;записываем
  711.         LD C,#09 ;измененный дескриптор
  712.         CALL TRDOS ;файла
  713.      endif
  714. FOR_OPEN XOR A ;на всякий случай
  715.          LD (OPENFILE),A
  716.  
  717.         POP IX
  718.         POP DE
  719.         POP BC
  720.         POP HL
  721.         POP AF
  722.         SCF
  723.         RET
  724. ;;;;;;
  725. SMESH_ADD
  726.         LD B,#00
  727.         LD A,(SMESH)
  728.         LD C,A
  729.         ADD HL,BC
  730.         RET
  731.  
  732.  
  733. ;;;;;;;;;
  734.  
  735. load1
  736.                 ;переносим из
  737.         LD HL,BUFFER ;буфера нужную
  738.         CALL SMESH_ADD
  739.         LD DE,(ADRESS) ;нам информацию
  740.         LD BC,(BUFLEN)
  741.  
  742.         LDIR
  743.         JP CONTINUE
  744.  
  745. load2
  746.         LD HL,BUFFER ;переносим из
  747.         CALL SMESH_ADD ;буфера нужную
  748.         LD DE,(ADRESS) ;нам информацию
  749.         LD BC,(BUFLEN)
  750.  
  751.         LD A,C ;а не ноль ли в BC
  752.         OR B
  753.         JR Z,MMM
  754.  
  755. CYCLE1  LD A,(HL) ;этот цикл является
  756.         EX DE,HL ;фактически ldir'ом,
  757.         CALL poke1 ;только для z-memory
  758.         EX DE,HL
  759.  
  760.         INC HL
  761.         INC DE
  762.         DEC BC
  763.  
  764.         LD A,C
  765.         OR B
  766.         JR NZ,CYCLE1
  767.  
  768. MMM     JP CONTINUE
  769.  
  770.  
  771. save1
  772.                 ;переносим информацию из памяти
  773.         LD DE,BUFFER ;в буфер
  774.         EX DE,HL
  775.         CALL SMESH_ADD
  776.         EX DE,HL
  777.         LD BC,(BUFLEN)
  778.         LD HL,(ADRESS)
  779.         LDIR
  780.  
  781.       if 1
  782.         ld hl,(SECT)
  783.         ld d,0
  784.         ld e,h
  785.         ld h,l
  786.         ld l,d;0
  787.         ld a,(OPENFILE)
  788.         ld b,a
  789.         OS_SEEKHANDLE
  790.         ld de,BUFFER
  791.         ld hl,0x0100
  792.         ld a,(OPENFILE)
  793.         ld b,a
  794.         OS_READHANDLE
  795.       else
  796.         LD BC,#0106 ;записываем сектор
  797.         LD DE,(SECT)
  798.         LD HL,BUFFER
  799.         CALL TRDOS
  800.       endif
  801.         JP CONTINUE
  802.  
  803. save2
  804.                 ;переносим информацию из памяти
  805.         LD DE,BUFFER ;в буфер
  806.         EX DE,HL
  807.         CALL SMESH_ADD
  808.         EX DE,HL
  809.         LD HL,(ADRESS)
  810.         LD BC,(BUFLEN)
  811.  
  812.         LD A,C
  813.         OR B
  814.         JR Z,MMM1
  815.  
  816. CYCLE5  CALL peek64 ;этот цикл
  817.         EX DE,HL ;фактически является
  818.         LD (HL),A ;ldir'ом
  819.         EX DE,HL
  820.  
  821.         INC HL
  822.         INC DE
  823.         DEC BC
  824.  
  825.         LD A,B
  826.         OR C
  827.         JR NZ,CYCLE5
  828.  
  829.       if 1
  830.         ld hl,(SECT)
  831.         ld d,0
  832.         ld e,h
  833.         ld h,l
  834.         ld l,d;0
  835.         ld a,(OPENFILE)
  836.         ld b,a
  837.         OS_SEEKHANDLE
  838.         ld de,BUFFER
  839.         ld hl,0x0100
  840.         ld a,(OPENFILE)
  841.         ld b,a
  842.         OS_READHANDLE
  843.       else
  844.         LD BC,#0106 ;записываем сектор
  845.         LD DE,(SECT)
  846.         LD HL,BUFFER
  847.         CALL TRDOS
  848.       endif
  849. MMM1    JP CONTINUE
  850.  
  851.  
  852.  
  853. ;;;;;;;;;;;;;;;;;;;;
  854. ;
  855. ;Read/write savefile
  856. ;
  857. driver
  858.         LD      A,B ;если передали
  859.         OR      C   ;длину = 0, то сразу
  860.         SCF         ;выход
  861.         RET     Z
  862.  
  863.         LD (ADRESS),HL ;сохраняем нужную
  864. ;для считывания адрес (куда считывать)
  865.         LD (LENGTH),BC ; и длину
  866. ;(сколько)
  867.  
  868. next
  869.         LD HL,#0100 ;получаем в HL
  870.         LD A,(SMESH)
  871.         LD B,#00
  872.         LD C,A ;количество байт до
  873.         AND A ;конца сектора
  874.         SBC HL,BC
  875.  
  876.         LD (BUFLEN),HL
  877.         LD BC,(LENGTH)
  878.         AND A
  879.         SBC HL,BC ;сколько байт нужно
  880.         JR C,metka ;считать?
  881.         LD (BUFLEN),BC
  882.  
  883. metka
  884.  
  885.       if 1
  886.         ld hl,(SECT)
  887.         ld d,0
  888.         ld e,h
  889.         ld h,l
  890.         ld l,d;0
  891.         ld a,(OPENFILE)
  892.         ld b,a
  893.         OS_SEEKHANDLE
  894.         ld de,BUFFER
  895.         ld hl,0x0100
  896.         ld a,(OPENFILE)
  897.         ld b,a
  898.         OS_READHANDLE
  899.       else
  900.         LD BC,#0105 ;считываем один сектор
  901.         LD HL,BUFFER ;в нужный буфер
  902.         LD DE,(SECT)
  903.         CALL TRDOS
  904.       endif
  905.  
  906.         LD A,(WHAT)
  907.         CP #00
  908.         JP Z,load1; чтение в память из файла
  909.         CP #01
  910.         JP Z,save1; запись из памяти в файл
  911.         CP #02
  912.         JP Z,load2; чтение в Z-памяти в файл
  913.         CP #03
  914.         JP Z,save2; запись из Z-памяти в файл
  915.  
  916. CONTINUE  LD HL,(ADRESS) ;устанавливаем
  917.           LD BC,(BUFLEN) ;следущий адрес
  918.         ADD HL,BC ;считывания
  919.         LD (ADRESS),HL
  920.  
  921.         LD A,(SMESH) ;а также другое
  922.         LD H,#00
  923.         LD L,A
  924.         ADD HL,BC ;смещение в секторе
  925.         LD A,L
  926.         LD (SMESH),A
  927.  
  928.         LD A,H ;и другой номер сектора
  929.         LD H,#00
  930.         LD L,A
  931.         LD BC,(SECT)
  932.         ADD HL,BC
  933.         ;CALL NO17SEC
  934.         LD (SECT),HL
  935.  
  936.         LD BC,(BUFLEN) ;и уменьшаем
  937.         LD HL,(LENGTH) ;общую длину
  938.         AND A ;считывания
  939.         SBC HL,BC
  940.         LD (LENGTH),HL
  941.  
  942.         LD A,H ;а не равна ли длина
  943.         OR L   ;нулю
  944.         SCF
  945.         RET Z ;если она равна нулю, то
  946. ;возврат
  947.         jp next
  948.  
  949. ;
  950. ;;;;;;;;;;;;;;;;;;;;;
  951. ;
  952. ;Transcript functions (отгрузки)
  953. ;
  954. ts_open
  955.  
  956.         CALL ZXNAME
  957.         LD A,H
  958.         OR L
  959.         SCF
  960.         RET Z
  961.         LD B,#01
  962.         CALL p3opn
  963.         RET NC
  964.         LD A,#01
  965.         LD (tsflag),A
  966.         SCF
  967.         RET
  968.  
  969. ;;;
  970. ts_close
  971.  
  972.          LD A,(tsflag)
  973.          OR A
  974.          SCF
  975.          RET Z
  976.  
  977.          PUSH HL ;Т.к. участвует и при
  978.          PUSH BC ;создании файла
  979.          PUSH DE
  980.  
  981.          LD HL,#0003
  982.          CALL ts_char
  983.          RET NC
  984.  
  985.          LD A,(SMESH)
  986.          LD C,A
  987.          LD B,#00
  988.          LD HL,BUFFER
  989.          ADD HL,BC
  990.  
  991. CYCLE9   LD A,#20 ;' '
  992.          LD (HL),A
  993.          INC HL
  994.          INC C
  995.          JR NZ,CYCLE9
  996.  
  997.          CALL full_buffer
  998.          LD A,#01
  999.          LD (WHAT),A
  1000.          LD HL,(SECT)
  1001.          DEC HL
  1002.          LD (SECT),HL
  1003.          CALL p3clse
  1004.          RET NC
  1005.          XOR A
  1006.          LD (tsflag),A
  1007.  
  1008.          POP DE
  1009.          POP BC
  1010.          POP HL
  1011.  
  1012.          SCF
  1013.          RET
  1014. ;;;
  1015. ts_char
  1016.  
  1017.         LD A,(tsflag)
  1018.         OR A
  1019.         SCF
  1020.         RET Z
  1021.         LD A,(cwin)
  1022.         OR A
  1023.         SCF
  1024.         RET Z
  1025.  
  1026.         LD A,L
  1027.         PUSH AF
  1028.         LD HL,BUFFER
  1029.         LD B,#00
  1030.         LD A,(SMESH); В SMESH в данном
  1031.         LD C,A ;случае хранится смещение
  1032.         ADD HL,BC ;в BUFFER (от 0 до FF)
  1033.         POP AF
  1034.         LD (HL),A
  1035.         INC C
  1036.         CALL Z,full_buffer
  1037.         LD A,(SMESH)
  1038.         INC A
  1039.         LD (SMESH),A
  1040.  
  1041.         SCF
  1042.         RET
  1043.  
  1044. full_buffer
  1045.       if 1
  1046.         ld a,(OPENFILE)
  1047.         ld b,a
  1048.         ld hl,(SECT)
  1049.         ld d,0
  1050.         ld e,h
  1051.         ld h,l
  1052.         ld l,d;0
  1053.         OS_SEEKHANDLE ;dehl=shift
  1054.         ld a,(OPENFILE)
  1055.         ld b,a
  1056.         ld hl,0x0100
  1057.         ld de,BUFFER
  1058.         OS_WRITEHANDLE
  1059.         LD HL,(SECT)
  1060.         inc hl
  1061.         LD (SECT),HL
  1062.       else
  1063.         LD BC,#0106
  1064.         LD DE,(SECT)
  1065.         LD HL,BUFFER
  1066.         CALL TRDOS
  1067.         LD HL,(TEMP_SEC)
  1068.         LD (SECT),HL
  1069.       endif
  1070.         RET
  1071.  
  1072.  
  1073. OPENFILE DB #00 ;Номер открываемого
  1074. ;файла
  1075.  
  1076. LENGTH DB #00,#00
  1077. ;Длина какую надо считать/записать
  1078.  
  1079. ADRESS DB #00,#00
  1080. ;Куда надо записывать/откуда считывать
  1081.  
  1082. SECT   DB #00,#00
  1083. ;Номер трека и сектора последовательного файла (или номер сектора в файле)
  1084.  
  1085. BUFFER DB #00
  1086.        DUP 255
  1087.         DB #00
  1088.        EDUP
  1089. ;Буфер для Save/Load
  1090.  
  1091. BUFLEN DB #00,#00
  1092. ;Длина из буфера, которую надо перенести
  1093.  
  1094. SMESH  DB #00
  1095. ;Смещение внутри сектора (от 0 до FF)
  1096.  
  1097. WHAT DB #00 ; для чтения или для
  1098. ;записи нужно это? 0=чтение; 1=запись
  1099.  
  1100. ;FILEBEG DB #00,#00 ;начало файла-отгрузки
  1101. ;;;;;;;;;;;;;;;;;;
  1102.  
  1103.       if 0
  1104. EXT DB #30; проверочное расширение
  1105. ; сначала равно '0'
  1106.       endif
  1107.  
  1108. WHERE DB #00,#00; используется при
  1109. ;начальной загрузке и рестарте (адрес в BankN+)
  1110.  
  1111. STORY DB #00 ;Номер игрового файла (хэндл)
  1112.  
  1113.  
  1114. BUFMEM DB #00 ; А для какого адреса
  1115. ;Z-machine забита 6-я банка :
  1116. ;содержится младшая часть E и старшая H
  1117.  
  1118. REAL_LEN DB #00, #00 ; действительная
  1119. ;длина в секторах
  1120.  
  1121.       if 0
  1122. TEMPSTORY DB #00 ;номер файла для прове-
  1123. ;рки: не является ли он продолжением
  1124. ;игрового
  1125.  
  1126. FILE_BEGIN DB #00,#00 ;трек и сектор
  1127. ;начала игрового файла. Используется для
  1128. ;подсчета длины файла при закрытии
  1129. ;потока
  1130.       endif
  1131.  
  1132. ; ИСПОЛЬЗУЕТСЯ ДЛЯ RESTART'А
  1133. REAL_LEN2 DB #00,#00
  1134.  
  1135. tsflag
  1136.         DEFB 0
  1137. ;Transcripting on or off?
  1138.