?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.     MODULE Dos
  2. ; API methods
  3. ESX_GETSETDRV = #89
  4. ESX_FOPEN = #9A
  5. ESX_FCLOSE = #9B
  6. ESX_FSYNC = #9C
  7. ESX_FREAD = #9D
  8. ESX_FWRITE = #9E
  9.  
  10. ; File modes
  11. FMODE_READ = #01
  12. FMODE_WRITE = #06
  13. FMODE_CREATE = #0E
  14.  
  15.     ; MACRO esxCall func
  16.     ; rst #8 : db func
  17.     ; ENDM
  18.        
  19. ;id = 0 файл не открыт
  20. ;id = 1 файл для чтения
  21. ;id = 2 файл для записи
  22. ;id = 3 файл для записи тип TRD
  23. ;id = 4 файл для записи тип SCL
  24.  
  25. ; HL - filename in ASCIIZ
  26. loadBuffer:
  27.     ld b, Dos.FMODE_READ: call Dos.fopen
  28.     push af
  29.         ld hl, outputBuffer, bc, #ffff - outputBuffer : call Dos.fread
  30.         ld hl, outputBuffer : add hl, bc : xor a : ld (hl), a : inc hl : ld (hl), a
  31.     pop af
  32.     call Dos.fclose
  33.     ret
  34.  
  35.  
  36. ; Returns:
  37. ;  A - current drive
  38. ; getDefaultDrive: ;нигде не используется
  39.     ; ld a, 0 : esxCall ESX_GETSETDRV
  40.     ; ret
  41.  
  42.  
  43.  
  44. ; Opens file on default drive
  45. ; B - File mode
  46. ; HL - File name
  47. ; Returns:
  48. ;  A - file stream id
  49. fopen:
  50.     ; push bc : push hl
  51.     ; call getDefaultDrive
  52.     ; pop ix : pop bc
  53.     ; esxCall ESX_FOPEN
  54.     ; ret
  55.         ld a,b
  56.         cp FMODE_READ ;если режим открытие файла
  57.         jr z,fopen_r
  58.         cp FMODE_CREATE
  59.         jr z,fopen_c ;если режим создание файла
  60.         jr fopen_err ;иначе выход
  61.        
  62. fopen_r ;открытие существующего файла на чтение (id=1)
  63.                         call format_name ;
  64.                         ld      c,#13 ;move file info to syst var
  65.             call    #3d13
  66.             ld      c,#0a ;find file
  67.             call    #3d13
  68.             ld      a,c
  69.                         cp              #ff
  70.                         jr              z,fopen_err ;если не нашли файла
  71.             ld      c,#08 ;read file title
  72.             call    #3d13
  73.             ;ld      hl,loadadr ;куда
  74.             ld      de,(#5ceb) ;начало файла сектор дорожка
  75.             ld      (f_r_cur_trk),de
  76.  
  77.             ld      a,(#5cea)
  78.             ld      (f_r_len_sec),a ;длина в секторах
  79.             ;or      a
  80.             ;ret     z    ;выход если пустой
  81.  
  82.             ; ld      de,(fcurtrk) ;текущие сектор дорожка
  83.             ; ld      (#5cf4),de ;восстановим
  84.                         xor a
  85.                         ld              a,1
  86.                         ld (f_r_flag),a ;флаг что файл для чтения открыт
  87.                         ;id канала будет 1
  88.         ret
  89.        
  90. fopen_err
  91.         xor a ;если никакой файл не открыли, то id = 0
  92.         scf ;флаг ошибки
  93.         ret
  94.  
  95.  
  96. fopen_c ;создание нового файла (id=2-4)
  97.         call format_name ;
  98.         ld a,(de) ;выясним, не образ ли это для разворачивания
  99.         cp "t"
  100.         jr nz,fopen_c_s
  101.         inc de
  102.         ld a,(de)
  103.         cp "r"
  104.         jr nz,fopen_c_2
  105.         inc de
  106.         ld a,(de)
  107.         cp "d"
  108.         jr nz,fopen_c_2
  109.         jr fopen_c_trd
  110.        
  111. fopen_c_s
  112.         ld a,(de)
  113.         cp "s" 
  114.         jr nz,fopen_c_2
  115.         inc de
  116.         ld a,(de)
  117.         cp "c"
  118.         jr nz,fopen_c_2        
  119.         inc de
  120.         ld a,(de)
  121.         cp "l"
  122.         jr nz,fopen_c_2        
  123.         jr fopen_c_scl
  124.        
  125. fopen_c_2       ;создание произвольного файла
  126.         jr              fopen_err ;пока отключено
  127.  
  128.         ld      c,#13 ;move file info to syst var
  129.     call    #3d13
  130.         ld de,256 ;запишем пока 1 сектор
  131.         ld hl,#4000 ;возьмём случайные данные из экрана
  132.     ld      c,#0b ;запись файла CODE
  133.     call    #3d13
  134.     ld      a,c
  135.         cp              #ff
  136.         jr              z,fopen_err ;если ошибка
  137.                
  138.     ld      de,(#5ceb) ;начало файла сектор дорожка
  139.     ld      (f_w_cur_trk),de
  140.     ld      a,(#5cea)
  141.     ld      (f_w_len_sec),a ;длина в секторах
  142.         xor a ;id канала будет 2
  143.         ld a,2
  144.         ld (f_w_flag),a ;флаг что файл для записи открыт
  145.         ret            
  146.        
  147.  
  148.  
  149.  
  150.  
  151. fopen_c_trd     ;разворачивание образа trd (id=3)
  152.         ld a,(#5D19) ;номер дисковода по умолчанию
  153.         add a,"A"
  154.         ld (write_trd_d),a ;подставим букву в запросе
  155.     ld hl, write_trd
  156.     call DialogBox.msgBox ;предуреждение
  157. WAITKEY_trd    
  158.         ld              a,(23556)
  159.         cp 255
  160.         JR Z,WAITKEY_trd        ;ждём любую клавишу
  161.        
  162.         ld      de,0 ;начало сектор дорожка
  163.     ld      (#5cf4),de
  164.         xor a
  165.         ld (sec_shift),a ;переменная
  166.         ld hl,0
  167.         ld (f_w_len+0),hl
  168.         ld (f_w_len+2),hl
  169.         ld a,3 ;id канала
  170.         ld (f_w_flag),a ;флаг что trd для записи открыт
  171.         ret
  172.  
  173.  
  174.  
  175.  
  176. fopen_c_scl     ;разворачивание образа scl (id=4)
  177.         jp              fopen_err ;пока отключено
  178.  
  179.         ld      de,0 ;начало сектор дорожка
  180.     ld      (f_w_cur_trk),de
  181.         xor a
  182.         ld a,4 ;id канала
  183.         ld (f_w_flag),a ;флаг что scl для записи открыт
  184.         ret    
  185.  
  186.  
  187.  
  188. ; A - file stream id
  189. fclose:
  190.     ;esxCall ESX_FCLOSE
  191.         xor a ;как бы закрываем все файлы
  192.         ld (f_r_flag),a
  193.         ld (f_w_flag),a
  194.     ret
  195.  
  196.  
  197.  
  198.  
  199. ; A - file stream id
  200. ; BC - length
  201. ; HL - buffer
  202. ; Returns
  203. ;  BC - length(how much was actually read)
  204. fread: ;(id=1)
  205.     ; push hl : pop ix
  206.     ; esxCall ESX_FREAD
  207.         ; push af
  208.         ; ld a,4
  209.         ; out (254),a
  210. ; WAITKEY       XOR A:IN A,(#FE):CPL:AND #1F:JR Z,WAITKEY
  211.         ; xor a
  212.         ; out (254),a
  213.         ; pop af
  214.  
  215.         cp 1 ;id = 1?
  216.         jr nz,fread_no_chek ;выход если номер потока не = 1
  217.         ld a,(f_r_flag)
  218.         or a
  219.         jr nz,fread_chek ;файл уже открыт?
  220. fread_no_chek ;выход с ошибкой
  221.         xor a
  222.         scf ;флаг ошибки
  223.         ld bc,0 ;ничего мы не считали
  224.         ret
  225.        
  226. fread_chek
  227.         push bc
  228.         ld bc,(f_r_len_sec-1) ;загружаем файл целиком, не смотря на то, сколько байт было запрошено
  229.     ld      c,5 ;read читаем целыми секторами
  230.         ld de,(f_r_cur_trk)
  231.     call    #3d13      
  232.         pop bc ;возвратим, что сколько запрашивали, столько и считали байт
  233.         xor a ;флаги сбросим
  234.     ret
  235.  
  236. ; A - file stream id
  237. ; BC - length
  238. ; HL - buffer
  239. ; Returns:
  240. ;   BC - actually written bytes
  241. fwrite: ;
  242.     ; push hl : pop ix
  243.     ; esxCall ESX_FWRITE
  244.        
  245.         ; push af
  246.         ; ld a,2
  247.         ; out (254),a
  248. ; WAITKEY1      XOR A:IN A,(#FE):CPL:AND #1F:JR Z,WAITKEY1
  249.         ; xor a
  250.         ; out (254),a
  251.         ; pop af
  252.  
  253.         cp 2 ;id = 2?
  254.         jr z,fwrite_chek ;проверка id потока
  255.         cp 3 ;id = 3?
  256.         jr z,fwrite_chek_trd ;проверка id потока
  257.         cp 4 ;id = 4?
  258.         jp z,fwrite_chek_scl ;проверка id потока
  259.  
  260.        
  261. fwrite_no_chek ;выход с ошибкой
  262.         xor a
  263.         scf ;флаг ошибки
  264.         ld bc,0 ;ничего мы не записали
  265.         ret
  266.        
  267. fwrite_chek ;запись произвольного типа файла
  268.         jr fwrite_no_chek ;пока отключено
  269.         ld a,(f_w_flag)
  270.         or a
  271.         jr z,fwrite_no_chek ;файл уже открыт?
  272.         ld (temp_bc),bc
  273.         ;ld bc,(f_r_len_sec-1) ;
  274.     ld      c,6 ;пишем целыми секторами
  275.         ld de,(f_w_cur_trk)
  276.     call    #3d13      
  277.         ld bc,(temp_bc) ;возвратим, что сколько запрашивали, столько и считали байт
  278.         xor a ;флаги сбросим
  279.     ret
  280.  
  281.  
  282.  
  283. fwrite_chek_trd ;запись trd файла (разворачивание образа)
  284.         ld a,(f_w_flag)
  285.         or a
  286.         jr z,fwrite_no_chek ;файл уже открыт?
  287.         ld (temp_bc),bc
  288.         ld (temp_hl),hl
  289.         ld a,b
  290.         or c
  291.         jr z,fwrite_no_chek ; если длина 0, то выход
  292.        
  293.         ld a,b
  294.         or a
  295.         jr nz,testt1
  296.         nop
  297.        
  298. testt1
  299.        
  300.         xor a
  301.         ld (sec_part),a ;обнулить переменные
  302.         ld (sec_shift2),a
  303.         ld (sec_shift2+1),a
  304.         ld (sec_shift_flag),a
  305.        
  306.  
  307.         ld a,(sec_shift)
  308.         or a
  309.         jr z,fwrite_trd3 ;если смещения нет, то первую часть пропустим
  310.        
  311.         ld c,a
  312.         ld b,0
  313.         ld hl,(temp_bc) ;проверка заполнится ли целый сектор
  314.         add hl,bc
  315.         ld a,h
  316.         or a
  317.         jr nz,fwrite_trd4
  318.         ld a,1
  319.         ld (sec_shift_flag),a ;флаг что не заполнен сектор
  320.        
  321. fwrite_trd4    
  322.         ld hl,sec_buf ;буфер последнего сектора  
  323.         add hl,bc ;на этой точке остановились
  324.         ex de,hl
  325.         ld hl,(temp_hl) ;присоединим начало данных в конец предыдущих
  326.         ld a,c
  327.         or a
  328.         jr nz,fwrite_trd2
  329.         inc b ;коррекция
  330. fwrite_trd2            
  331.         ld c,a
  332.         xor a
  333.         sub c
  334.         ld c,a ;сколько осталось перенести до заполнения сектора
  335.         ld (sec_shift2),bc ;сохраним сколько добавили байт
  336.         ldir
  337.        
  338.         ld hl,sec_buf
  339.         ld de,(#5cf4)
  340.         ld (f_w_cur_trk),de     ;запомним позицию
  341.     ld      bc,#0106 ;пишем 1 сектор из буфера
  342.     call    #3d13      
  343.         ld a,c
  344.         cp 255
  345.         jp z,fwrite_no_chek ;выход если ошибка  
  346.         ld a,(sec_shift_flag)
  347.         or a
  348.         jr z,fwrite_trd3
  349.         ld de,(f_w_cur_trk) ;если сектор ещё не заполнен, останемся на старой позиции
  350.         ld (#5cf4),de
  351.         ; ld b,1 ;на сектор вперёд
  352.         ; ld de,(f_w_cur_trk)
  353.         ; call calc_next_pos
  354.         ; ld (f_w_cur_trk),de  
  355.  
  356. fwrite_trd3    
  357.         ld hl,(temp_hl) ;запишем остаток данных
  358.         ;ld a,(sec_shift)
  359.         ;ld c,a
  360.         ;ld b,0
  361.         ld bc,(sec_shift2)
  362.         add hl,bc ;с этой точки пишем
  363.         ld (temp_hl2),hl ;сохраним начало записи второго сектора
  364.        
  365.         ld hl,(temp_bc) ;вычисление на чём остановимся в этот раз
  366.         and a
  367.         sbc hl,bc ;вычтем то, что добавили к первому сектору
  368.         ld c,l
  369.         ld b,h
  370.         jr nc,fwrite_trd5
  371.         ld b,0 ;коррекция если вышел минус
  372. fwrite_trd5
  373.         ld hl,(temp_hl)
  374.         add hl,bc
  375.        
  376.         ld a,l
  377.         ld (sec_shift),a ;смещение на следующий раз
  378.         ;ld hl,(temp_hl)       
  379.        
  380.        
  381.         ; or a
  382.         ; jr z,fwrite_trd1
  383.         ; inc b  ;коррекция количества секторов
  384.        
  385.         ld a,b ;нужна проверка на количество секторов!!!
  386.         ld (sec_part),a ;запомним сколько секторов во второй части
  387.         or a
  388.         jr z,fwrite_trd_ex ;если размер данных меньше сектора, то пропустим второй этап
  389.        
  390.         ld hl,(temp_hl2)
  391.         ;push bc
  392.         ld de,(#5cf4)
  393.     ld      c,6 ;пишем целыми секторами
  394.     call    #3d13      
  395.         ld a,c
  396.         ;pop bc
  397.         cp 255
  398.         jp z,fwrite_no_chek ;выход если ошибка
  399.         ; ld de,(f_w_cur_trk)
  400.         ; call calc_next_pos
  401.         ; ld (f_w_cur_trk),de
  402.        
  403. fwrite_trd1    
  404.         ld hl,(temp_hl2) ;сохраним последний сектор
  405.         ld a,(sec_part)
  406.         ld b,a
  407.         ld c,0
  408.         add hl,bc
  409.         ld bc,256
  410.         ld de,sec_buf
  411.         ldir
  412.        
  413.        
  414. fwrite_trd_ex  
  415.         ld bc,(temp_bc) ;возвратим, что сколько запрашивали, столько и считали байт
  416.         ;посчитаем общую длину записанного
  417.         ld hl,(f_w_len)
  418.         add hl,bc
  419.         ld (f_w_len),hl
  420.         jr nc,fwrite_trd_ex1
  421.         ld hl,(f_w_len+2)
  422.         inc hl
  423.         ld (f_w_len+2),hl
  424.        
  425. fwrite_trd_ex1
  426.         xor a ;флаги сбросим
  427.     ret
  428.  
  429.  
  430.  
  431. fwrite_chek_scl ;запись scl файла ---------------
  432.         jp fwrite_no_chek ;пока отключено
  433.         ld a,(f_w_flag)
  434.         or a
  435.         jp z,fwrite_no_chek ;файл уже открыт?
  436.         ld (temp_bc),bc
  437.         ;ld bc,(f_r_len_sec-1) ;
  438.     ld      c,6 ;пишем целыми секторами
  439.         ld de,(f_w_cur_trk)
  440.     call    #3d13      
  441.         ld bc,(temp_bc) ;возвратим, что сколько запрашивали, столько и считали байт
  442.         xor a ;флаги сбросим
  443.     ret
  444.  
  445.    
  446. ; A - file stream id
  447. ; fsync:
  448. ;     esxCall ESX_FSYNC
  449.     ; ret
  450.  
  451.  
  452. ; HL - name (name.ext)
  453. ; Returns:
  454. ; HL - name (name    e)
  455. format_name ;подгоняет имя файла под стандарт trdos (8+1)
  456.         push hl ;сначала очистим место
  457.         ld hl,f_name
  458.         ld de,f_name+1
  459.         ld (hl)," "
  460.         ld bc,8
  461.         ldir
  462.         pop hl
  463.  
  464.         ld bc,#09ff ;длина имени 9 символов
  465.         ld de,f_name ;куда
  466. format_name2   
  467.         ld a,(hl)
  468.         cp "."
  469.         jr nz,format_name1
  470.         inc hl
  471.         ld a,(hl)
  472.         ld (f_name+8),a ; и в конце первую букву расширения
  473.         ex de,hl ;сохраним адрес исходного расширения
  474.         jr format_name_e
  475. format_name1
  476.         ldi
  477.         djnz format_name2
  478. format_name_e
  479.         ld hl,f_name ;вернём результат
  480.         ret
  481.  
  482. ; DE - trk/sec
  483. ; B - sectors step
  484. ; Returns:
  485. ; DE - trk/sec 
  486. calc_next_pos           ;вперёд на N секторов  
  487.                         ;ld b,4
  488.                         ;ld  de,(#5ceb)
  489. calc_next_pos2         
  490.                         inc e
  491.                         ld a,e
  492.                         cp 16
  493.                         jr c,calc_next_pos1
  494.                         inc d
  495.                         ld e,0
  496. calc_next_pos1
  497.                         ;ld (#5ceb),de
  498.                         djnz calc_next_pos2
  499.                         ret
  500.                        
  501.  
  502. ;testt db "123.trd"
  503. write_trd db "Insert disk to drive "
  504. write_trd_d db "A. "
  505.                 db "All data will be lost!",0
  506.  
  507. f_name ds 9 ;имя файла
  508. f_r_cur_trk dw   0 ;текущие сектор-дорожка файла на чтение
  509. f_r_len_sec db 0 ;длина файла на чтение в секторах
  510. f_r_flag db 0 ;флаг что открыт файл на чтение
  511.  
  512. f_w_cur_trk dw   0 ;текущие сектор-дорожка файла на запись
  513. f_w_len_sec db 0 ;длина файла на запись в секторах
  514. f_w_flag db 0 ;флаг что открыт файл на запись
  515. f_w_len ds 4 ;длина записанных данных
  516.  
  517. temp_bc dw 0 ;хранение регистра
  518. temp_hl dw 0 ;хранение регистра
  519. temp_hl2 dw 0 ;хранение регистра
  520.  
  521. sec_shift db 0 ;указатель на каком байте остановлена запись
  522. sec_shift2 db 0 ;указатель на каком байте остановлена запись (остаток)
  523. sec_part db 0 ;сколько секторов во второй порции для записи
  524. sec_shift_flag db 0 ;флаг что буфер сектора не заполнен
  525.  
  526.         align 256 ;временно
  527. sec_buf ds 256 ;буфер сектора для записи
  528.     ENDMODULE