Subversion Repositories pentevo

Rev

Rev 1011 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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