;------------------------------------------------- ; Иниц. список типов дисков системы ; (послед. читает BPB каждого диска) ;------------------------------------------------- init_list_types_drives: ld a,(disk) ; диск акт. панели ld c,1 ; уст. диск rst ToDSS jr nc,init_list_types_drv1 ; исп. номер boot-диска ld bc,0009h rst ToDSS ld (disk),a ; узнать номер посл. диска в системе ld c,1 ; уст. диск rst ToDSS init_list_types_drv1: ld (lastdrive),a ; послед. диск в системе (0..25) cp 1+1 jr c,init_list_types_done ; только A,B диски dec a ld b,a ld c,2 ; начать с "C:" ld hl,scan_code_letters+5 ; таблица дисков с "C:" make_dlist_loop: push bc push hl ; прочитать BPB диска push bc ld a,c ; номер диска ld c,1 ; open device rst ToDSS.DRV pop bc jr c,make_dlist_err push bc ld a,c ld de,work_buffer ; буфер ld c,4 ; get BPB rst ToDSS.DRV pop bc jr c,make_dlist_err ld a,c ; номер диска ld c,2 ; close device rst ToDSS.DRV pop hl pop bc ld a,(work_buffer+21) ; байт формата носителя ld (hl),a inc hl inc hl ; след. ячейка типа диска inc c ; ++номер диска djnz make_dlist_loop init_list_types_done: ; тест на доступность диска у пасс. панели ld hl,disk1 ld a,(lastdrive) dec a cp (hl) ret nc ld (hl),a ret ; make_dlist_err: pop hl pop bc jr init_list_types_done ;---------------------------------------------------------------------- ; Структура списка меню выбора дисков ; <номер пункта>, <имя пункта,0>, <скен-код буквы>, <номер контекста> ;---------------------------------------------------------------------- ; db 0,"&A: removable",0 ; db 1Dh ; скен-код ; db CTnodef ; контекст (не исп.) ; ; ; db 1,"&B: removable",0 ; db 2Eh ; db CTnodef ; ; ; db 2,"&C: fixed",0 ; db 2Ch ; скен-код ; db CTnodef ; ; ; db 3,"&D: CD-ROM",0 ; db 1Fh ; db CTnodef ; ; ; db 4,"&E: RAM-disk",0 ; db 12h ; db CTnodef ; ; ; db -1 ; конец описателя ;------------------------------------------------- ; Создать в буфере структуру списка дисков ;------------------------------------------------- make_struct_drives: exx ld hl,scan_code_letters ; список скен-кодов букв exx ld a,(lastdrive) ld b,a ld c,0 ; A=0 ld hl,work_buffer make_drives_loop: ld (hl),c ; номер диска (команды) inc hl ld (hl),"&" inc hl ld a,"A" add a,c ld (hl),a inc hl ld (hl),":" inc hl ld (hl)," " inc hl exx ld a,(hl) ; скен-код ex af,af' inc hl ld a,(hl) ; тип диска inc hl exx ld de,fix_drive ; винт cp 0F8h jr z,make_drives_type ld de,ram_drive ; ram-диск cp 0FAh jr z,make_drives_type ld de,rem_drive ; дискета cp 0F0h ; 1.44Mb jr z,make_drives__ cp 0F9h ; 720kB jr z,make_drives__ ld de,cd_drive ; cd-rom jr make_drives_type make_drives__: ld a,c cp 2 ; меньше "C:" ? jr c,make_drives_type ld de,ram_drive ; ram-диск make_drives_type: ; скопир. тип диска ld a,(de) ld (hl),a inc hl inc de or a jr nz,$-5 ex af,af' ld (hl),a ; скен-код inc hl inc hl ; пройти контекст inc c ; ++номер диска djnz make_drives_loop ld (hl),-1 ; конец списка ; настроить Y полож. меню от числа дисков ld c,5 ; Y полож. меню ld a,(lastdrive) ; 0..25 cp 14+1 jr c,$+9 dec c cp 18+1 jr c,$+4 ld c,2 ld a,c ld (table_left_drive+1),a ld (table_right_drive+1),a ret ; Таблица букв дисков ; <скен-код>, <байт формата диска> scan_code_letters: db 1Dh,0F0h ; A db 2Eh,0F0h ; B db 2Ch,0F8h ; C db 1Fh,0F8h ; D db 12h,0F8h ; E db 20h,0F8h ; F db 21h,0F8h ; G db 22h,0F8h ; H db 17h,0F8h ; I db 23h,0F8h ; J db 24h,0F8h ; K db 25h,0F8h ; L db 30h,0F8h ; M db 2Fh,0F8h ; N db 18h,0F8h ; O db 19h,0F8h ; P db 10h,0F8h ; Q db 13h,0F8h ; R db 1Eh,0F8h ; S db 14h,0F8h ; T db 16h,0F8h ; U db 2Dh,0F8h ; V db 11h,0F8h ; W db 2Bh,0F8h ; X db 15h,0F8h ; Y db 2Ah,0F8h ; Z