; Меню Пользователя ; ; ; Если файл "FM.MNU" не найден, то вызов Меню Пользователя будет не дос- ; тупен. При этом никаких предупреждающих сообщений выводиться не будет. ; Если переменная окружения файл-менеджера определена, то mnu-файл читается ; и записывается только в ней. Если переменной окружения нет, mnu-файл чита- ; ется и записывается в текущем пути менеджера. ; ; Строки названий пунктов и командных строк могут начинаться с пробелов или ; табуляций. Пункты и их ком-строки могут разделяться пустыми строками (или со- ; держащими одни пробелы или табуляции). ; Каждой строке пункта должна соответствовать командная строка, выполняемая ; по этому пункту. ; ; Если первый символ в строке "-", то строка считается разделителем пунктов ; меню и последующие символы строки игнорируются. ; Если строка начинается с символа ";", то данная строка воспринимается как ; комментарий и также пропускается. ; ; В именах пунктов можно задавать hot-символы вызова этих пунктов. В качест- ; ве hot-символов можно использовать алфавитно-цифровые символы основного поля ; клавиатуры. При определении hot-символов латинских и русских пунктов, может ; возникнуть ситуация, когда hot-символы латинских и русских пунктов совпадут. ; Ничего страшного в этом нет, просто по данному hot-символу будет вызываться ; пункт, стоящий первым от начала меню. ; ; Максимальное число обрабатываемых пунктов равно 26. При этом учитываются ; также разделители пунктов. Максимальная длина имен пунктов и ком-строк равна ; 70 символам. ; ; Будьте внимательны - в конце ком-строк не должно быть лишних пробелов или ; табуляций!. ; ; Типичный пример записи файла "FM.MNU" (отступы для ком-строк сделаны для ; наглядности): ; ; ; это комментарий ; &GoldED ; c:\mail\golded\gedw32.exe -f ; ; еще один комментарий ; Тосс&ить почту ; c:\mail\utils\inar.bat ; &T-Mail ; c:\mail\t-mail\t-mailnt.exe ; П&уржить почту ; c:\mail\utils\purge.bat ; - Это разделитель пунктов ; &FFormat ; c:\nc\fformat.exe ; &Rar 2.50 ; c:\nc\rar.exe ; ; Формат описателя пунктов Меню Пользователя ; <имя пункта,0>, <скен-код hot-буквы> ;----------------------------------------------------------- ;list1: db "&GoldED",0 ;db 21h ; скен-код ;db "Т&оссить почту",0 ;db 23h ;db "&T-Mail",0 ;db 14h ;db "П&уржить почту",0 ;db 12h ;db -2 ; разделитель ;db "&FFormat",0 ;db 20h ;db "&Rar 2.50",0 ;db 13h ; ;db -1 ; конец описателя max_user_len equ 70 ; макс. длина строк (лишнее обрезается) max_user_puncts equ 26 ; макс. число пунктов (лишние игнорируются) ;------------------------------------------------- ; Прочитать MNU-файл и подготовить описатель ; Меню Пользователя. ; ; макс. 26 пунктов (26*2 строк) ; макс. 70 символов в пункте/ком-строке ;------------------------------------------------- make_user_menu: in a,(SLOT3) push af ;ld a,(page_dial_screen) ; в качестве врем. буфера ld a,(page_sys_screen) ; в качестве врем. буфера out (SLOT3),a call make_user_menu__ ; чтение файла Меню Пользователя pop af out (SLOT3),a ret make_user_menu__: call read_mnu_file ; чтение mnu-файла ld a,(enable_mnu_file) ; флаг наличия mnu-файла or a ret z ld de,array_read ; начало mnu-файла ld iy,array_user1 ; массив указателей на ком-строки ld hl,array_user2 ; массив пунктов меню ld ix,array_user3 ; массив ком-строк ld b,0 ; счетчик числа пунктов make_user_newline: xor a ld c,a ; сбр. счетчик длины пункта dec a ld (make_user_hot+1),a ; сбр. скен-код буквы make_user_skip: ; пройти пробелы в начале строки ld a,(de) inc de cp " " jr z,make_user_skip cp 9 ; Tab jr z,make_user_skip or a jr nz,$+10 make_user_done: ld (hl),-1 ; конец описателя ret make_user_done1: xor a ld (hl),a ; конец пункта в описатель inc hl jr make_user_done ; cp 0Dh ; пустая строка jr nz,$+5 inc de ; пройти 0Ah jr make_user_newline ; cp ";" ; комментарий jr z,make_user_to_end ; пройти до конца строки cp "-" ; разделитель jr nz,make_user_loc1 ld (hl),-2 ; разделитель пунктов inc hl inc b ; ++число пунктов ld a,b cp max_user_puncts ; 26 jr nc,make_user_done ; пройти до конца строки make_user_to_end: ld a,(de) inc de or a ; конец файла jr z,make_user_done cp 0Dh ; конец строки jr nz,make_user_to_end inc de ; пройти 0Ah jr make_user_newline ; на новую строку ; make_user_loc1: dec de make_user_loc2: ld a,(de) inc de cp "&" ; hot-буква jr nz,make_user_loc3 ld (hl),a inc hl inc c ; ++длина пункта ld a,(de) ld (hl),a ; в описатель inc hl inc c ; ++длина пункта push bc call get_key_scancode ; узнать скен-код hot-буквы ld a,c pop bc ld (make_user_hot+1),a ; скен-код буквы inc de jr make_user_loc2 make_user_loc3: or a ; конец файла jr z,make_user_done1 cp 0Dh ; конец строки jr z,make_user_loc4 ld (hl),a ; в описатель inc hl inc c ; ++длина пункта ld a,c cp max_user_len ; 70 jr c,make_user_loc2 ; пройти до конца строки ld a,(de) inc de or a ; конец файла jr z,make_user_done1 cp 0Dh ; конец строки jr z,make_user_loc4 jr $-9 make_user_loc4: ld (hl),0 ; конец пункта в описатель inc hl make_user_hot: ld (hl),-1 ; скен-код в описатель inc hl inc de ; пройти 0Ah push bc call copy_user_string ; скопир. ком-строку pop bc inc b ; ++число пунктов ld a,b cp max_user_puncts ; 26 jr nc,make_user_done jp make_user_newline ; на разбор новой строки ;----------------------------------------------------------- ; Скопир. ком-строку с перех. на след. новую строку ; ix=массив ком-строк ; iy=массив указателей на ком-строки ;----------------------------------------------------------- copy_user_string: push ix pop bc ld (iy+0),c ; сохр. адрес строки inc iy ld (iy+0),b inc iy ld c,0 ; счетчик длины строки copy_usr_loop: ; пройти вед. пробелы ld a,(de) inc de cp " " jr z,copy_usr_loop cp 9 ; Tab jr z,copy_usr_loop cp 0Dh ; пустая строка jr nz,copy_usr_loop1 inc de ; пройти 0Ah jr copy_usr_loop ; copy_usr_loop1: or a ; конец файла jr z,copy_usr_done1 cp 0Dh ; конец строки jr nz,copy_usr_nxt copy_usr_done: inc de ; пройти 0Ah jr $+3 copy_usr_done1: dec de xor a ld (ix+0),a ; в конец ком-строки inc ix ret copy_usr_nxt: ld (ix+0),a inc ix inc c ; ++длина ком-строки ld a,c cp max_user_len ; 70 jr nc,copy_usr_nxt1 ; пройти до конца строки ld a,(de) inc de jr copy_usr_loop1 ; copy_usr_nxt1: ld a,(de) inc de or a ; конец файла jr z,copy_usr_done1 cp 0Dh ; конец строки jr nz,copy_usr_nxt1 jr copy_usr_done ;------------------------------------------------- ; Символьные клавиши осн. поля клавиатуры ; вход: a=hot-клавиша ; выход: c=скен-код клавиши ;------------------------------------------------- get_key_scancode: ld c,0 ; счетчик скен-кода cp "ё" ret z cp "Ё" ret z cp "`" ret z cp "~" ret z cp "_" jr z,get_key_scancod1+2 cp "р" jr c,get_key_scancod1 cp "я"+1 jp nc,get_key_scancod2 sub 50h get_key_scancod1: res 5,a ld c,2 cp "1" ret z cp "!" ret z inc c cp "2" ret z cp "@" ret z inc c cp "3" ret z cp "#" ret z inc c cp "4" ret z cp "$" ret z inc c cp "5" ret z cp "%" ret z inc c cp "6" ret z cp "^" ret z inc c cp "7" ret z cp "&" ret z inc c cp "8" ret z cp "*" ret z inc c cp "9" ret z cp "(" ret z inc c cp "0" ret z cp ")" ret z inc c cp "-" ret z cp "_" ret z inc c cp "=" ret z cp "+" ret z ld c,10h cp "Q" ret z cp "Й" ret z inc c cp "W" ret z cp "Ц" ret z inc c cp "E" ret z cp "У" ret z inc c cp "R" ret z cp "К" ret z inc c cp "T" ret z cp "Е" ret z inc c cp "Y" ret z cp "Н" ret z inc c cp "U" ret z cp "Г" ret z inc c cp "I" ret z cp "Ш" ret z inc c cp "O" ret z cp "Щ" ret z inc c cp "P" ret z cp "З" ret z inc c cp "[" ret z cp "{" ret z cp "Х" ret z inc c cp "]" ret z cp "}" ret z cp "Ъ" ret z ld c,1Dh cp "A" ret z cp "Ф" ret z inc c cp "S" ret z cp "Ы" ret z inc c cp "D" ret z cp "В" ret z inc c cp "F" ret z cp "А" ret z inc c cp "G" ret z cp "П" ret z inc c cp "H" ret z cp "Р" ret z inc c cp "J" ret z cp "О" ret z inc c cp "K" ret z cp "Л" ret z inc c cp "L" ret z cp "Д" ret z ld c,27h cp "'" ret z cp "Э" ret z ld c,2Ah cp "Z" ret z cp "Я" ret z inc c cp "X" ret z cp "Ч" ret z inc c cp "C" ret z cp "С" ret z inc c cp "V" ret z cp "М" ret z inc c cp "B" ret z cp "И" ret z inc c cp "N" ret z cp "Т" ret z inc c cp "M" ret z cp "Ь" ret z inc c cp "," ret z cp "Б" ret z cp "<" ret z inc c cp "." ret z cp "Ю" ret z cp ">" ret z inc c cp "/" ret z cp "." ret z cp "?" ret z ld c,35h cp '\' ; ret z cp "|" ret z ld c,38h cp " " ret z get_key_scancod2: ld c,-1 ret