Subversion Repositories pentevo

Rev

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

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