А как они попадут на fat32 раздел?
Правильнее и полезнее смонтировать tr-dos раздел и копировать с него.
Копировщик tr-dos <-> cp/m для того и нужен.
Хех, я из фидошников-реальщиков 90-х. У нас была другая реальность.
Вид для печати
Видимо так же, как на 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
Она сырая. Там размеры биткарт от балды, поэтому они наползают на соседние, с непредсказуемым результатом...
У меня сейчас так:
(Я нашёл диск со своими старыми наработками, сейчас ковыряюсь.)Код:;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).
Много всего было ещё раньше, просто нам это не досталось.
Вот например, WalnutCD с софтом для CP/M. И почти всё (кроме аппаратно зависимого) работает у нас, без всяких переделок.
Я нашёл 102 игрушки на бейсике, решил сыграть в покер - и выиграл $200, виртуальных. Запускать: mbasic poker или mbasic menu.
Тогда нужен эмулятор терминала VT-52 для GMX. Есть такое?
Коды цвета <ЕSС> "P" можно взять от Heath/Zenith, на профике так сделано. До кучи, можно поддержать коды консоли ATM <ЕSС> "F", они не пересекаются.
Смонтировать недостаточно, нужно ещё 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 входов, но каталог станет вдвое больше, а это тормоза.
Для этой версии, которую я дорабатывал, прикрутил драйвер экрана. Файл "PR80.AS".
А он просто печатает символ на экране, какой скажут. То же самое, что и драйвер на 64 символа.
Там в первом сообщении ссылка на папку, архив от 2023.05.31.
А какая вообще версия CPM для скорпа более лучшая? Какую запускать? Чтобы работал mount.com.