Видимо так же, как на tr-dos раздел?
Почему это правильнее и полезнее? tr-dos раздел пережиток прошлого, искусственное ограничение. На свежих версиях ПрофПЗУ можно прекрасно жить вообще без tr-dos раздела, весь архив софта храня на fat32, хочешь в trd, хочешь в scl, хочешь в tap. А при наличии z-controller - SD карты, вынул, записал на PC все, что нужно, вставил обратно, скопировал на HDD/CF.Правильнее и полезнее смонтировать tr-dos раздел и копировать с него.
Нашёл mount.com для скорпионовской CP/M.
В исходнике написано, что я это писал в 1999 году, а я об этом почти забыл.
Где-то был драйвер, я его к биосу прикручивал, это помню.
На дисках чёрт ногу сломит, всё свалено в кучу, иногда нахожу вот такое.
- - - Добавлено - - -
Держите исходник, пока не потерял. Нашёл более свежую версию 1.5, эта уже не актуальна.
Собирать обычно:
ma80 =mnt.as
mlink /p:100h /ws:100h mnt.rel
Код:;(c) Jason 1999 ; CP/M: select and mount partition on SMUC HDD v.1.2 ; Если compact =0, то выбирать можно из 99 разделов, ; иначе только из первых 35 (цифры 1-9 буквы A-Z). ; Разделов м.б. до 64 (?). ; вызов: mnt /d=3 \cpm001 .z80 compact equ 0 ;compact версия м.б. частью bios (не нужен bdos) ndrv equ 3 ;точка монтирования, 0...3 ptype equ 2 ;1=tr-dos, 2=cp/m, 3=is-dos cmore equ 16 ;пауза каждые 16 строк $setwrk equ 9 $hddid equ 34 $hddmount equ 35 ;23h $hddrd equ 36 $hddwr equ 37 $hddpart equ 38 stop macro di halt endm start: ld a,8 ;защита от моргания экрана ld (5b5ch),a ld hl,here ld de,entry ld bc,wbuff-entry ;len ldir call entry ei rst 0 here: .phase 4000h entry: di if compact eq 1 else ld hl,80h ;разбор комстроки ld a,(hl) or a jr z,_nosw ld c,a ld b,0 ld a,"/" inc hl cpir jp po,_nosw jr nz,_nosw ld a,(hl) res 5,a cp "D" jr nz,_nosw cpi jp po,_nosw ld a,"=" cpi jp po,_nosw jr nz,_nosw ld a,(hl) cp "A" jr c,$+3 dec a and 3 or 8 ld (mncmd+1),a jr z,_nosw ld a,"\" cpir jr nz,_nosw call mntnm ; явно указано имя ret nc ld hl,noth ; м.б. проблемы с регистром букв jp str noth: db "Nothing mounted...",13,10,0 endif ;=======================; или интерактивно _nosw: call fihdd ; показ модели диска ret c ld hl,wbuff xor a ld c,$hddpart call ram0off rst 8 db 81h call ram0on shlist: ld hl,mprt call str ld hl,wbuff call shprt ;поиск и показ списка разделов, ld a,b or a scf ret z ; call crlf ld hl,selp ;msg call str ei if compact eq 1 _ri: call conin ;ввод кнопки sub 30h ret z ;="0", выход jr c,_ri res 5,a cp 0ah jr c,_l10 sub 7 ;A-Z _l10: ld b,a else call crlf _ri: call cll ;очистка ld hl,mprt call inum ;ввод числа or a ret z push af ld hl,nump+2 call byte2a call str pop bc endif ld hl,wbuff call fiprt ;поиск имени раздела по номеру в b or a jr z,_ri mntnm: ld (adnm+1),hl ;подкл. по имени ex de,hl ld c,$hddmount mncmd: ld a,8+ndrv ;команда и номер диска di call ram0off rst 8 db 81h call ram0on ret c ld a,(mncmd+1) ;OK msg and 3 add a,30h ld (mdrv),a ld hl,mmsg call str adnm: ld hl,0 ;имя ld b,6 call lnstr call crlf or a ret ;========================; ;ввод строки и перевод её в число if compact eq 1 else inum: ld (hl),2 ex de,hl ld c,10 ;readcon push de call 5 pop hl inc hl ;длина ld a,(hl) or a ret z ;длина =0 ld b,a inc hl push hl inc hl djnz $-1 ld (hl),0 pop hl call a2byte ret cll: ld hl,spcs jp str nump: db "000 ",0 spcs: db " ",13,0 endif ;========================; ram0on: push bc push af ld a,1 _outc: ld bc,1ffdh out (c),a pop af pop bc ret ram0off: push bc push af xor a jr _outc ;========================; ;поиск имени раздела по номеру в b ;[out] a=2 - hl= имя; a=0 - не найден fiprt: _fcpm: ld a,(hl) or a ret z cp ptype ;тип раздела jr nz,_nxf dec b jr nz,_nxf ld de,10 add hl,de ret _nxf: ld de,16 add hl,de jr _fcpm ;========================; ;поиск и показ списка разделов, ;[out] b= кол-во shprt: ld bc,cmore _shpl: ld a,(hl) or a ret z cp ptype jr nz,_nprt inc b push bc push hl if compact eq 1 ld a,b add a,30h ;"0" cp 3ah jr c,_19 add a,7 ;A-Z _19: ld c,a call conout ld b,4 _spc: ld c," " call conout djnz _spc else ld a,b ld hl,nump push hl call byte2a pop hl call str ;num endif pop hl push hl ld de,10 add hl,de ld b,6 call lnstr ;name pop hl push hl ld de,6 add hl,de ld e,(hl) inc hl ld d,(hl) srl d rr e ld hl,num5+1 call word2a ld hl,num5 call str ;size call crlf pop hl pop bc dec c jr nz,_nprt call more ret z ;нажат пробел, выход ld c,cmore _nprt: ld de,16 add hl,de jr _shpl more: push bc push hl ld hl,mmore call str call conin pop hl pop bc cp " " ret num5: db " 0000 KB",0 mmore: db "more...",13,0 ;=======================; ;число A -> 3-значная dec строка (HL) ;ведущие нули заменяет пробелами. byte2a: ld c,-100 call _ba ld c,-10 call _ba add a,30h ld (hl),a dec hl dec hl ld b,2 jr lzz _ba: ld b,2fh _dm1: inc b add a,c jr c,_dm1 sub c ld (hl),b inc hl ret ;=======================; if compact eq 1 else ;строка (HL) до 99 -> число в A ;без пробелов в начале ;конец строки - любой байт < 30h a2byte: ld a,(hl) ;десятки sub 30h ld b,a inc hl ld a,(hl) ;ед sub 30h ld c,a jr nc,_2d ld a,b ret _2d: xor a ld e,10 _a2b: add a,e djnz _a2b add a,c ret endif ;=======================; ;число DE -> 5-значная dec строка (HL) ;ведущие 0 заменяет пробелами. word2a: push hl ex de,hl ld bc,-10000 call _wa ld bc,-1000 call _wa ld bc,-100 call _wa ld c,-10 call _wa ld a,l add a,30h ld (de),a pop hl ld b,4 lzz: ld a,30h ;ведущие 00 _lz: cp (hl) ret nz ld (hl),20h inc hl djnz _lz ret _wa: ld a,2fh _dm2: inc a add hl,bc jr c,_dm2 sbc hl,bc ld (de),a inc de ret ;========================; lnstr: ld c,(hl) push hl call conout pop hl inc hl djnz lnstr ret str: ld a,(hl) or a ret z ld c,a push hl call conout pop hl inc hl jr str ;========================; crlf: ld c,13 call conout ld c,10 jp conout ;========================; ;показ модели диска, иначе CF=1 fihdd: ld hl,wbuff ld c,$setwrk call ram0off rst 8 db 81h ld c,$hddid rst 8 db 81h call ram0on ret c ld hl,mhdd call str ld hl,wbuff+36h call shid or a ret shid: ld b,19 _shi: push bc ld e,(hl) inc hl ld c,(hl) inc hl push hl push de call conout pop bc call conout pop hl pop bc djnz _shi jp crlf ;========================; ;conin6: ld a,0ffh ; ld c,6 ; jp 5 if compact eq 1 conin: jp 0f009h conout: push bc call 0f00ch pop bc ret else conin: ld c,1 jp 5 conout: push bc ld e,c ld c,2 call 5 pop bc ret endif mhdd: db "HDD: ",0 mprt: db "Num Name Size",13,10 db "--- ------ -------",13,10,0 ; 001 cpm001 8192 KB selp: db "Select part num, or 0 to quit: ",0 mmsg: db 13,10,"Mounted OK on dr" mdrv: db "0: ",0 wbuff: .dephase db "(c) 1999 Jason" END
Последний раз редактировалось Jason; 10.05.2025 в 12:57.
Она сырая. Там размеры биткарт от балды, поэтому они наползают на соседние, с непредсказуемым результатом...
У меня сейчас так:
(Я нашёл диск со своими старыми наработками, сейчас ковыряюсь.)Код:;allocation vector all_fd0: ds 20 ;биткарты дисков, 1 бит на кластер all_fd1: ds 20 ;20 = до 160 кл. (moa =155) all_fd2: ds 50 ;для 800k fdd надо 400/8 =50 all_fd3: ds 50 all_ram: ds 28 ;896кб рамдиск all_hdd: ds 64 ;512 кластеров ;checksums vector chk_fd0: ds 32 ;32 = (DRM+1)/4 = до 128 файлов chk_fd1: ds 32 ;чексуммы для каждого 128б блока chk_fd2: ds 32 ;каталога chk_fd3: ds 32 chk_ram: ds 32 chk_hdd: ds 128 ; до 512 файлов
Вот кстати из исходников cp/m 2.0 (были на Klug BBS).
Эх, 8-дюймовые дискеты, 64 файла в каталоге, да.Код:; fixed data tables for four-drive standard ; IBM-compatible 8" disks ; disk parameter header for disk 00 dpbase: dw trans,0000H,0000H,0000H,dirbf,dpblk,chk00,all00 dirbf: ds 128 ;scratch directory area all00: ds 31 ;allocation vector 0 all01: ds 31 ;allocation vector 1 all02: ds 31 ;allocation vector 2 all03: ds 31 ;allocation vector 3 chk00: ds 16 ;check vector 0 chk01: ds 16 ;check vector 1 chk02: ds 16 ;check vector 2 chk03: ds 16 ;check vector 3
Из подраздела - сектора считают от 0. Если смонтирован tr-dos диск - тогда от 1.
Я дизассемблеровал драйвер от исдоса, он считает от 0. И копирайты МОА при нём.
assign работает только в Microdos или похожих. У них биос более продвинутый.
Если диск на 640 кб - то формат просто не нужен, достаточно era *.*
Есть format.com от Марковского, но она хочет открытые порты. Можно переделать, это нетрудно, она мелкая.
Это лечится - программированием HDD через порты. Если лазить к ним через #3D2F - то это небыстро, но у меня получалось вдвое быстрее дисковода, около 70 кб/с или 30 тыс тактов на 512б сектор.
А если открыть порты (#1FFD bit 2) - то имеем 240 кб/с при чтении длинными кусками. См. idesmuc.blk для исдоса.
Ох. Драйвер idesmuc.blk делает именно это. Я написал его в 1998 году.
И под немовскую схему я тоже писал в то время, см. jason.blk. А в ide+5.blk есть куски моего кода.
Думаю насчёт прикрутить к CP/M читалку HDD через порты. Уже есть готовое, надо засунуть в 6-ю банку и вызывать из 1-й.
Обкатанный драйвер через RST 8 тоже есть, уже работает. Причём правильно работает, ибо различает виды записи - буферизованную, немедленную и без предчтения (C=0,1,2).
Последний раз редактировалось Jason; 21.04.2025 в 10:02.
Dima_ZX(16.12.2025)
Скрытый текст
https://drive.google.com/drive/folde...xZ83juCuaBe32I
Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
Leningrad 1/Sega Joy Adapter
DivGMX
ZX Spectrum +2A
ZX Evolution rev. C
TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
[свернуть]
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Много всего было ещё раньше, просто нам это не досталось.
Вот например, WalnutCD с софтом для CP/M. И почти всё (кроме аппаратно зависимого) работает у нас, без всяких переделок.
Я нашёл 102 игрушки на бейсике, решил сыграть в покер - и выиграл $200, виртуальных. Запускать: mbasic poker или mbasic menu.
Тогда нужен эмулятор терминала VT-52 для GMX. Есть такое?
Коды цвета <ЕSС> "P" можно взять от Heath/Zenith, на профике так сделано. До кучи, можно поддержать коды консоли ATM <ЕSС> "F", они не пересекаются.
Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.
Seamos realistas y hagamos lo imposible!
Ernesto Che GuevaraПереехал сюда: SteinBlume (ex ATM CP/M Explorer)
http://era-cg.su
Смонтировать недостаточно, нужно ещё DPB указать -размеры кластера, кол-во входов в директории и прочее. А они на диске не хранятся. Можно исходя из размера диска назначить ему некие "стандартные" параметры, и не более.
Например, для 8 МБ диска, 4к кластера и макс. 1024 входов:
Каталог весит всего 32 кб.Код:;8192k dpblk_hdd: dw 128 ;trks db 5 ;4k db 1fh ;4k db 1 ;32k hddexms: dw 2047 ;DSM hddsz: dw 1023 ;DRM db 0ffh,0 ;32k alloc: dw 0 ; без чексумм dw 0
Если записать туда 1024 мелких файлов до 4 кб - место в каталоге кончится, но занято будет всего 4 МБ.
Можно сделать 2048 входов, но каталог станет вдвое больше, а это тормоза.
Последний раз редактировалось Jason; 11.05.2025 в 12:40.
Для этой версии, которую я дорабатывал, прикрутил драйвер экрана. Файл "PR80.AS".
А он просто печатает символ на экране, какой скажут. То же самое, что и драйвер на 64 символа.
Там в первом сообщении ссылка на папку, архив от 2023.05.31.
А какая вообще версия CPM для скорпа более лучшая? Какую запускать? Чтобы работал mount.com.
Скрытый текст
https://drive.google.com/drive/folde...xZ83juCuaBe32I
Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
Leningrad 1/Sega Joy Adapter
DivGMX
ZX Spectrum +2A
ZX Evolution rev. C
TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
[свернуть]
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)