Subversion Repositories pentevo

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 07.01.2022 savelij
  3.  
  4.                 TITLE "extend.a80"
  5.  
  6. ; инфа для создания 9 сектора нового диска
  7. DSKINFO         DB 0                    ; +0XE1 - номер первого свободного сектора
  8.                 DB 1                    ; +0XE2 - номер первого свободного трека
  9.                 DB 0X16                 ; +0XE3 - тип дискеты
  10.                 DB 0                    ; +0XE4 - количество файлов на дискете
  11. SECFREE         DW 2544                 ; +0XE5 - количество свободных секторов
  12.                 DB 0X10                 ; +0XE7 - идентификационный код TRDOS
  13.                 DW 0                    ; +0XE8 - 2 байта 0
  14.                 DUPL 9," "              ; +0XEA - 9 байт 0x20
  15.                 DB 0                    ; +0XF3 - 1 байт 0
  16.                 DB 0                    ; +0XF4 - количество удаленных файлов
  17.                 DB "RAMDISKO"           ; +0XF5 - имя дискеты
  18. DSK_END
  19.  
  20. ; обработчик вызова RST 8
  21. DOS2RST8        EX (SP),HL                      ; HL
  22.                 PUSH AF                         ; AF
  23.                 PUSH BC                         ; BC
  24.                 LD A,R
  25.                 JP PE,.L1
  26.                 LD A,R
  27. .L1             DI
  28.                 PUSH AF                         ; RF
  29.                 PUSH HL                         ; ADR_RET
  30.                 PUSH DE                         ; DE
  31.                 IN A,(PEVO_CONF)
  32.                 LD L,A
  33.                 OR 1
  34.                 OUT (PEVO_CONF),A
  35.                 LD BC,RD_1WINA0
  36.                 IN A,(C)
  37.                 LD H,A
  38.                 AND 0X3E
  39.                 RES 0,H
  40.                 LD B,HIGH (RD_DOS7FFD)
  41.                 IN E,(C)
  42.                 RES 4,E
  43.                 DEC B
  44.                 IN D,(C)
  45.                 LD BC,WIN_A0
  46.                 OUT (C),A
  47.                 LD B,HIGH (WIN_P0)
  48.                 XOR A
  49.                 JP ADR_SEL_ROM
  50.  
  51. EDOS2RST8       LD A,ROM_BAS48 | 0X80
  52.                 LD BC,WIN_A0
  53.                 CALL WR_BYTE_RET
  54.                 LD A,L
  55.                 OUT (PEVO_CONF),A
  56.                 POP DE
  57.                 POP HL
  58.                 POP AF
  59.                 JP PO,.L1
  60.                 EI
  61. .L1             POP BC
  62.                 POP AF
  63.                 EX (SP),HL
  64.                 RET
  65.  
  66. ; ABCDEFGHIJKLMNOPQRSTUVWXYZ
  67. EXTEND_COM     
  68.                 BBW "CD",CD                     ; смена пути на FAT устройстве
  69.                 BBW "CLRCMOS",CLRCMOS           ; сброс CMOS на значения по умолчанию
  70.                 BBW "DIR",DIR                   ; показ содержимого директории на FAT
  71.                 BBW "DRIVE",DRIVE               ; показ найденных/переключение текущего FAT устройств
  72.                 BBW "HELP",HELP                 ; вывод списка возможных команд
  73.                 BBW "MOUNT",MOUNT               ; монтирование образа на букву A..D
  74.                 BBW "UMOUNT",UMOUNT             ; демонтрование образа на букве A..D
  75.                 BBW "VER",PRT_VERS              ; показ версии и даты сборки DOS
  76.                 BBW "VIRT",SET_VIRT             ; показ/переключение виртуального дисковода
  77.                 DB 0
  78.  
  79. ; обработчик расширенных команд
  80. END_EXT_COM     INC DE
  81.                 LD A,(DE)
  82.                 CP ":"
  83.                 DEC DE
  84.                 JP NZ,SINTAX_ERROR
  85.                 LD A,(DE)
  86.                 AND 0DFH
  87.                 SUB "A"
  88.                 JP C,SINTAX_ERROR
  89.                 CP 4
  90.                 JR NC,SELFATDRV
  91.                 LD (TRD_5CF6),A                 ; дисковод для временной операции
  92.                 LD (TRD_5D19),A                 ; дисковод по умолчанию
  93.                 LD B,A
  94.                 LD A,(TRD_5D16)                 ; копия системного регистра (порт 0xFF)
  95.                 AND 7CH
  96.                 OR B
  97.                 LD (TRD_5D16),A                 ; копия системного регистра (порт 0xFF)
  98.                 LD HL,ERR_OK
  99.                 PUSH HL
  100. SET_CURRVIRT    LD H,VIRT_REAL_DRIVE
  101.                 CALL READCMOS
  102.                 AND %00000011
  103.                 LD L,A
  104.                 LD A,B
  105.                 RLCA
  106.                 RLCA
  107.                 OR L
  108.                 LD L,A
  109.         RST8D _CMOS_RW,_WRITE_CMOS
  110.                 RRCA
  111.                 RRCA
  112.                 AND 3
  113.                 OR 0X3C
  114.                 RET
  115.  
  116. SELFATDRV       SUB 4
  117.                 PUSH AF
  118.         RST8D _COM_DEV,_DEVFIND
  119.         RST8D _COM_DEV,_KOL_VOL
  120.                 POP AF
  121.                 CP E
  122.                 JP NC,SINTAX_ERROR
  123.         RST8D _COM_DEV,_SET_VOL
  124.                 JP ERR_OK
  125.  
  126. COM_DOT         CALL EXIT_IF_SINTAX
  127.                 LD HL,EXTEND_COM
  128. NEXT_CMP_COM    LD A,1
  129.                 LD (TRD_5CEF),A
  130.                 LD DE,(TRD_5D11)
  131.                 INC DE
  132.                 LD A,(HL)
  133.                 INC HL
  134.                 AND A
  135.                 JP Z,END_EXT_COM
  136.                 LD B,A
  137. LOC_C34         LD A,(DE)
  138.                 AND 0DFH
  139.                 CP (HL)
  140.                 JR NZ,PROPUSK
  141.                 INC DE
  142.                 INC HL
  143.                 DJNZ LOC_C34
  144.                 LD A,(DE)
  145.                 CP 0DH
  146.                 JR Z,NO_PARAM
  147.                 CP " "
  148.                 JR Z,GET_PARAM
  149.                 JR LOC_C58
  150.  
  151. PROPUSK         INC HL
  152.                 DJNZ PROPUSK
  153. LOC_C58         INC HL
  154.                 INC HL
  155.                 JR NEXT_CMP_COM
  156.  
  157. GET_PARAM       INC DE
  158. NO_PARAM        LD A,(HL)
  159.                 INC HL
  160.                 LD H,(HL)
  161.                 LD L,A
  162.                 PUSH HL
  163.                 LD HL,END_COMAND
  164.                 EX (SP),HL
  165.                 JP (HL)
  166.  
  167. ; вывод имени виртуального диска если не указано имя для изменения
  168. PRT_NUM_VIRT    LD HL,TXT4VIRTDRV
  169.                 LD B,ETXT4VIRTDRV-TXT4VIRTDRV-1
  170.                 CALL PRT_B_HL_
  171.                 LD A," "
  172.                 RST 0X10
  173.                 LD H,VIRT_REAL_DRIVE
  174.                 CALL READCMOS
  175.                 AND 3
  176.                 ADD A,"A"
  177.                 RST 0X10
  178.                 LD A,0X0D
  179.                 RST 0X10
  180.                 RET
  181.  
  182. ; установка виртуального диска
  183. SET_VIRT        LD A,(DE)
  184.                 CP 0X0D
  185.                 JR Z,PRT_NUM_VIRT
  186.                 LD C,A
  187.                 INC DE
  188.                 LD A,(DE)
  189.                 CP ":"
  190.                 JP NZ,SINTAX_ERROR
  191.                 LD A,C
  192.                 CALL NUMDSK2BYTE                ; получили новый номер дисковода указанный в командной строке
  193.         RST8D _MOUNTER,_SET_VIRT
  194.                 RET
  195.  
  196. ; печать версии доса и даты компиляции
  197. PRT_VERS        LD HL,0X3FF8
  198.                 LD B,6
  199.                 CALL PRT_B_HL_
  200.                 LD A," "
  201.                 RST 0X10
  202.                 LD C,(HL)
  203.                 INC HL
  204.                 LD B,(HL)
  205.                 PUSH BC
  206.                 LD HL,ZASTAVKA_VER
  207.                 LD B,9
  208.                 CALL PRT_B_HL_
  209.                 LD A," "
  210.                 RST 0X10
  211.                 POP BC
  212.                 LD A,C
  213.                 AND 0X1F                        ; нужны 5 бит-число месяца
  214.                 CALL A2TXT                      ; конверсия и укладка даты
  215.                 SRL B
  216.                 RR C                            ; сдвинули для целостности номера месяца
  217.                 LD A,"."
  218.                 RST 0X10
  219.                 LD A,C                          ; взяли биты месяца
  220.                 RRCA
  221.                 RRCA
  222.                 RRCA
  223.                 RRCA                            ; сдвинули в младшие биты
  224.                 AND 0X0F                        ; нам нужны только 4 бита месяца
  225.                 CALL A2TXT                      ; конверсия и укладка месяца
  226.                 LD A,"."
  227.                 RST 0X10
  228.                 LD A,B                          ; взяли номер года
  229.                 AND 0X3F                        ; нужны только 6 бит
  230.                 CALL A2TXT                      ; конверсия и укладка года
  231.                 BIT 6,B                         ; если бит 6 (сдвинутый бит 7) установлен
  232.                 RET Z
  233.                 LD HL,TXT_BETA
  234. PRT_ROMVER      RST 0X18
  235.                 LD A,0X0D
  236.                 RST 0X10
  237.                 RET
  238.  
  239. ; печать B = количество символов из HL = адрес текста для вывода
  240. PRT_B_HL_       LD A,(HL)
  241.                 INC HL
  242.                 RST 0X10
  243.                 DJNZ PRT_B_HL_
  244.                 RET
  245.  
  246. TXT_BETA        DC " beta"
  247.  
  248. ; перевод "A" в десятичку и в текст
  249. A2TXT           LD L,A
  250.                 LD H,0
  251.                 LD DE,10
  252.                 XOR A
  253.                 DEC A
  254. .L1             INC A
  255.                 SBC HL,DE
  256.                 JR NC,.L1
  257.                 ADD HL,DE
  258.                 ADD A,"0"
  259.                 RST 0X10
  260.                 LD A,L
  261.                 ADD A,"0"
  262.                 RST 0X10
  263.                 RET
  264.  
  265. DRIVES          DC "Drives: "
  266. EDRIVES
  267.  
  268. DRIVE
  269.         RST8D _COM_DEV,_DEVFIND
  270.                 JP C,FAT_NOT_FOUND
  271.         RST8D _COM_DEV,_KOL_VOL
  272.                 LD A,"D"
  273.                 ADD A,E
  274.                 PUSH AF
  275.                 LD HL,DRIVES
  276.                 RST 0X18
  277.                 LD A,"E"
  278.                 RST 0X10
  279.                 LD A,"-"
  280.                 RST 0X10
  281.                 POP AF
  282.                 RST 0X10
  283.                 RET
  284.  
  285. TXT_DIR         DC "<DIR> "
  286. TXT_FATERR      DC "FAT not found"
  287.  
  288. ; команда DIR
  289. DIR             LD B,0
  290.                 LD A,(DE)
  291.                 INC DE
  292.                 CP "/"
  293.                 JR NZ,DIR06
  294.                 LD A,(DE)
  295.                 AND 0XDF
  296.                 CP "L"
  297.                 JR NZ,DIR06
  298.                 LD B,A
  299. DIR06
  300.         RST8D _COM_DEV,_DEVFIND
  301.                 JR NC,DIR061
  302. FAT_NOT_FOUND   CALL OPEN_CHAN_0
  303.                 LD HL,TXT_FATERR                ; ни одного раздела не найдено
  304.                 RST 0X18
  305.                 RET
  306.  
  307. DIR061          PUSH IX
  308.                 LD IXL,B
  309.                 CALL CLEAR_SCREEN
  310.                 CALL OPEN_CHAN_2
  311.                 LD A,2
  312.         RST8D _COM_FAT,_POS_FILES
  313. DIR05           LD E,0X17
  314. DIR01           PUSH DE
  315.                 PUSH BC
  316.                 LD HL,TRD_5D25
  317.         RST8D _COM_FAT,_READ_DIR
  318.                 LD DE,0X0B
  319.                 ADD HL,DE
  320.                 LD A,(HL)
  321.                 SBC HL,DE
  322.                 AND 0X10
  323.                 JR Z,DIR04
  324.                 PUSH HL
  325.                 LD HL,TXT_DIR
  326.                 RST 0X18
  327.                 POP HL
  328. DIR04           LD A,IXL
  329.                 AND A
  330.                 JR Z,DIR08
  331.                 PUSH HL
  332.         RST8D _COM_FAT,_GET_LONGNAME
  333.                 POP HL
  334. DIR03           LD A,(HL)
  335.                 AND A
  336.                 JR Z,DIR02
  337.                 INC HL
  338.                 RST 0X10
  339.                 JR DIR03
  340.  
  341. DIR08           LD B,8
  342. DIR081          LD A,(HL)
  343.                 CP " "
  344.                 JR Z,DIR082
  345.                 RST 0X10
  346.                 INC HL
  347.                 DJNZ DIR081
  348. DIR082          LD A,B
  349.                 AND A
  350.                 JR Z,DIR085
  351. DIR086          LD A,(HL)
  352.                 CP " "
  353.                 JR NZ,DIR085
  354.                 INC HL
  355.                 DJNZ DIR086
  356. DIR085          LD A,(HL)
  357.                 CP " "
  358.                 JR Z,DIR084
  359.                 LD A,"."
  360.                 RST 0X10
  361. DIR084          LD B,3
  362. DIR083          LD A,(HL)
  363.                 CP " "
  364.                 JR Z,DIR02
  365.                 RST 0X10
  366.                 INC HL
  367.                 DJNZ DIR083
  368. DIR02           LD A,0X0D
  369.                 RST 0X10
  370.                 LD A,4
  371.                 LD B,1
  372.         RST8D _COM_FAT,_POS_FILES
  373.                 POP HL
  374.                 AND A
  375.                 SBC HL,BC
  376.                 POP DE
  377.                 JR Z,DIR07
  378.                 DEC E
  379.                 JR NZ,DIR01
  380.                 JR DIR05
  381.  
  382. DIR07           POP IX
  383.                 RET
  384.  
  385. ; команда CD
  386. CD              PUSH DE
  387.         RST8D _COM_DEV,_DEVFIND
  388.                 POP HL
  389.         RST8D _COM_FAT,_FIND_NAME
  390.                 JP C,SINTAX_ERROR
  391.         RST8D _COM_FAT,_ENTER_DIR
  392.                 RET
  393.  
  394. NOMER_DRV
  395.         RST8D _COM_DEV,_DEVFIND
  396.                 CCF
  397.                 RET NC                          ; ни одного раздела не найдено
  398.         RST8D _COM_DEV,_KOL_VOL
  399.                 CALL CREATE_BUF
  400.                 LD HL,TRD_5D25
  401.         RST8D _COM_FAT,_GET_PATH
  402.                 CALL PRINT2ZERO
  403.                 CALL DEL_BUF
  404.                 SCF
  405.                 RET
  406.  
  407. ; команда MOUNT
  408. MOUNT           PUSH DE
  409.         RST8D _COM_DEV,_DEVFIND
  410.                 EX DE,HL
  411.                 POP HL
  412.                 JP C,FAT_NOT_FOUND
  413.                 PUSH HL
  414.         RST8D _COM_FAT,_FIND_NAME
  415.                 JP C,SINTAX_ERROR
  416.                 POP DE
  417.                 LD B,0X0C
  418. MOUNT02         LD A,(DE)
  419.                 CP "!"
  420.                 JR C,MOUNT01
  421.                 INC DE
  422.                 DJNZ MOUNT02
  423. MOUNT01         LD A,(DE)
  424.                 CP 0X0D
  425.                 JP Z,SINTAX_ERROR
  426.                 CP " "
  427.                 JP NZ,SINTAX_ERROR
  428.                 INC DE
  429.                 LD A,(DE)
  430.                 CP "A"
  431.                 JP C,SINTAX_ERROR
  432.                 AND 0XDF
  433.                 CP "E"
  434.                 JP NC,SINTAX_ERROR
  435.                 SUB "A"
  436.                 LD C,A
  437.                 INC DE
  438.                 LD A,(DE)
  439.                 CP ":"
  440.                 JP NZ,SINTAX_ERROR
  441.                 LD A,C
  442.         RST8D _MOUNTER,_OPEN_MOUNT
  443.                 RET
  444.  
  445. ; команда UMOUNT
  446. UMOUNT          LD A,(DE)
  447.                 INC DE
  448.                 AND 0XDF
  449.                 LD B,A
  450.                 LD A,(DE)
  451.                 INC DE
  452.                 CP ":"
  453.                 JP NZ,SINTAX_ERROR
  454.                 LD A,B
  455.                 CP "A"
  456.                 JP C,SINTAX_ERROR
  457.                 CP "E"
  458.                 JP NC,SINTAX_ERROR
  459.                 SUB "A"
  460.         RST8D _MOUNTER,_CLOSEMOUNT
  461.                 RET
  462.  
  463. ; команда очистки CMOS
  464. CLRCMOS
  465.         RST8D _CMOS_RW,_CLEAR_CMOS
  466.                 RET
  467.  
  468. ; команды вывода на экран списка расширенных команд
  469. HELP            CALL CLEAR_SCREEN
  470.                 CALL OPEN_CHAN_2
  471.                 LD HL,EXTEND_COM
  472. HELP4           LD C,3
  473. HELP2           LD A,(HL)
  474.                 AND A
  475.                 RET Z
  476.                 INC HL
  477.                 LD B,A
  478.                 PUSH BC
  479.                 LD A,"."
  480.                 RST 0X10
  481. HELP1           LD A,(HL)
  482.                 INC HL
  483.                 RST 0X10
  484.                 DJNZ HELP1
  485.                 INC HL
  486.                 INC HL
  487.                 POP BC
  488.                 LD A,9
  489.                 SUB B
  490.                 LD B,A
  491. HELP3           LD A," "
  492.                 RST 0X10
  493.                 DJNZ HELP3
  494.                 DEC C
  495.                 JR NZ,HELP2
  496.                 LD A,0X0D
  497.                 RST 0X10
  498.                 JR HELP4
  499.  
  500. ; чтение CMOS
  501. ; На входе: H - адрес ячейки
  502. ;           L - прочитанное значение
  503. READCMOS        PUSH BC
  504.                 LD BC,CMOSD_SET_ADR
  505.                 OUT (C),H
  506.                 LD B,HIGH (CMOSD_RD_WR)
  507.                 IN L,(C)
  508.                 POP BC
  509.                 LD A,L
  510.                 AND A
  511.                 RET
  512.  
  513. ; запись CMOS
  514. ; На входе: H - адрес ячейки
  515. ;           L - что туда записать
  516. WRITECMOS
  517.         RST8D _CMOS_RW,_WRITE_CMOS
  518.                 RET
  519.