;------------------------------------------------- ; Вывод сообщения ошибки по индексу ; вход: a=номер ошибки ;------------------------------------------------- print_err_message: ld e,a ld d,0 inc de ld hl,ERR0 ; массив строк ld bc,ERR0.Size ; размер массива call LCPIR ; найти строку call PRINTZ ; формат. вывод строки call newline jp newline ; Вывод строки ошибки ;A850D: invalid_param: ld de,5 ; индекс "Invalid parametr" jr MESSAGE ;------------------------------------------------- ; Вывод сообщения ошибки по индексу ; вход: de=индекс строки ;------------------------------------------------- MESSAGE: call FMESAGE ; найти строку по индексу jp PRINTZ ; формат. вывод строки ;jp A82CC ; узнать и уст. полож. курсора ; Найти строку по индексу ; вход: de=индекс строки ; выход: hl=строка FMESAGE: inc de ld hl,MSG0 ; начало массива строк ld bc,MSG0.Size ; размер массива LCPIR: xor a cpir ret po ret nz ;R11 XOR A CP (HL) JR Z,.no_mess ; dec de ld a,d or e jr nz,LCPIR ret .no_mess: INC HL RET ;[x] исправлен баг с выходом за пределы буфера PRM. Чуть оптимизирована ;----------------------------------------------------------------------; ; Форматированный вывод строки с подстановкой аргументов вместо %1-%9 ; вход: hl=буфер строки ;----------------------------------------------------------------------; PRINTZ: ld a,(hl) inc hl or a ret z cp '%' jr z,.check_PRM .char: ld c,Dss.PutChar RST ToDSS jp PRINTZ .bad_PRM: ld a,'%' jp .char .check_PRM: ld a,(hl) cp '9'+1 jr nc,.bad_PRM inc hl sub '1' push hl ;!TEST ;ld l,a ;ld h,0 ;add hl,hl ;1+1=2 ;add hl,hl ;2+2=4 ;add hl,hl ;4+4=8 ;add hl,hl ;8+8=16 размер отдельного подбуфера ADD A ADD A ADD A ADD A LD L,A LD H,0 ; ld bc,PRM1 ; буфер add hl,bc ld c,Dss.PChars ; вывод строки RST ToDSS pop hl jp PRINTZ ;!FIXIT перенести к общим буферам как у меня ; буферы аргументов командной строки PRM1: BLOCK 16,0 ; аргумент %1 PRM2: BLOCK 16,0 ; аргумент %2 PRM3: BLOCK 16,0 ; аргумент %3 PRM4: BLOCK 16,0 ; аргумент %4 PRM5: BLOCK 16,0 ; аргумент %5 PRM6: BLOCK 16,0 ; аргумент %6 PRM7: BLOCK 16,0 ; аргумент %7 PRM8: BLOCK 16,0 ; аргумент %8 PRM9: BLOCK 16,0 ; аргумент %9 ;!TODO не забыть заменить цифры на эти метки DIR1MSG EQU 0 VERSMSG EQU 1 DATEMSG EQU 2 TIMEMSG EQU 3 PAUSMSG EQU 4 ILLGMSG EQU 5 ECHOMSG EQU 6 ON__MSG EQU 7 OFF_MSG EQU 8 DIR2MSG EQU 9 DIR3MSG EQU 10 HELPMSG EQU 11 MSG0: db 0 /* 0 */ db "Volume in drive %1 %4 %5",CR,LF db "Volume Serial Number is %2",CR,LF db CR,LF,"Directory of %3",CR,LF,LF,0 /* 1 */ db "Estex DSS version %1. Shell version %2.",CR,LF,0 ;R13 /* 2 */ db "Current date: %1",CR,LF,0 /* 3 */ db "Current time: %1",CR,LF,0 /* 4 */ db "Press any key to continue . . .",CR,LF,LF,0 /* 5 */ db "Invalid parametr",CR,LF,0 /* 6 */ db "Echo is %1",CR,LF,0 /* 7 */ db "on",0 /* 8 */ db "off",0 /* 9 */ db " %1 File(s) %2 bytes",CR,LF db " %3 Dir(s) %4 bytes",CR,LF,LF,0 /* 10 */ db "%1 %2 %3 %4 %5",CR,LF,0 ;FILENAME EXT SIZE DATE TIME /* 11 */ DB "COMMANDS:",CR,LF,CR,LF DB "DIR REN | RENAME PATH HELP ",CR,LF DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF DB "MD | MKDIR TIME ECHO EXIT ",CR,LF DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 ;R11 DB 0 DZ "Unknown command" ; .Size EQU $-MSG0 /* MSG0: DB 0 DB "Volume in drive %1 has no label",CR,LF ; !FIXIT DB "Volume Serial number is %2",CR,LF DB "Directory of %3",CR,LF,CR,LF,0 DB "Estex DSS: Version %1",CR,LF,0 ;R02 DB "Current date: %1",CR,LF,0 DB "Current time: %1",CR,LF,0 DB "Press any key to continue . . .",CR,LF,0 DB "Invalid parametr",CR,LF,0 DB "Echo is %1",CR,LF,0 DB "on",0 DB "off",0 DB " %1 file(s) %2 bytes",CR,LF,CR,LF,0 ; FILENAME EXT SIZE DATE TIME DB "%1 %2 %3 %4 %5",CR,LF,0 DB "COMMANDS:",CR,LF,CR,LF DB "DIR REN | RENAME PATH HELP ",CR,LF DB "CD | CHDIR DEL | ERASE SET VER | VERSION ",CR,LF DB "MD | MKDIR TIME ECHO EXIT ",CR,LF DB "RD | RMDIR DATE CLS REBOOT ",CR,LF,0 ;R11 BYTE 0 DZ "Unknown command" ; .Size EQU $-MSG0 */ ;----------------------------------------------------------------------- ;!FIXIT функция вызывающая вывод ошибки делает в начале фильтр по номерам и несколько первых отшиваются ERR0: DB #00 DZ "Bad command or file name" DZ "Invalid function" ; 01 - неверный номер функции DZ "Invalid drive number" ; 02 - неправильный номер устройства DZ "File not found" ; 03 - файл не обнаружен DZ "Path not found" ; 04 - неверный путь DZ "Invalid handle" ; 05 - несуществующий файловый манипулятор DZ "Too many open files" ; 06 - нет свободного файлового манипулятора DZ "File already exist" ; 07 - файл существует DZ "File read only" ; 08 - файл только для чтения DZ "Root overflow" ; 09 - переполнение ROOT (корневого каталога) DZ "No free space" ; 10 - нет свободного места на диске DZ "Directory not empty" ; 11 - каталог не пуст DZ "Can't delete current directory" ; 12 - неудачная попытка удалить текущий каталог DZ "Invalid media" ; 13 - неизвестный формат DZ "Unknown operation" ;R02 ; 14 - невозможная операция DZ "Directory exist" ; 15 - каталог уже есть DZ "Invalid filename" ; 16 - неверное имя DZ "Invalid EXE-file" ; 17 - неправильный EXE-файл DZ "Not supported EXE-file" ; 18 - не поддерживаемая версия EXE-файла DZ "Access denied" ; 19 - ресурс не доступен DZ "Not ready" ; 20 - нет готовности DZ "Seek error" ; 21 - ошибка позиционирования DZ "Sector not found" ; 22 - сектор не найден DZ "CRC error" ; 23 - ошибка CRC DZ "Write protect" ; 24 - защита записи DZ "Read error" ; 25 - ошибка чтения DZ "Write error" ; 26 - ошибка записи DZ "Drive failure" ; 27 - сбой диска DZ "Extended error 28" DZ "Extended error 29" DZ "Not enough memory" ; 30 - недостаточно памяти DZ "Invalid memory block" ; 31 - несуществующий блок памяти DZ "Extended error 32" DZ "Maximum PATH size exceeded" ; 33 - превышен максимальный размер переменной DZ "Extended error 34" DZ "Too many files in directory" ; 35 - слишком много файлов в директории DZ "Directory nesting too large or number of folders > 1023" ; 36 - слишком большая вложенность каталогов или количество папок > 1023 DZ "Operation aborted by user" ; 37 - операция прервана пользователем DZ "Common error" ; 38 - общая ошибка DZ "Unexpected application termination" ; 39 - unexpected application termination / неожиданное завершение приложения DZ "40" DZ "41" DZ "42" DZ "43" DZ "44" DZ "45" DZ "46" DZ "Wrong video mode" ; 48 - неправильный видеорежим DZ "48" DZ "49" DZ "50" ;R11 DB 0 ; ограничитель, чтоб при ошибке больше, чем есть сообщений выдавалось общее: DZ "Unknown error" ; .Size EQU $-ERR0 ;----------------------------------------------------------------------- /* ; Сообщения ошибок ДОС ERR0: db 0 db "Bad command or file name",0 ;0 db "Invalid function",0 ;1 db "Invalid drive number",0 ;2 db "File not found",0 ;3 db "Path not found",0 ;4 db "Invalid handle",0 ;5 db "Too many open files",0 ;6 db "File already exist",0 ;7 db "File read only",0 ;8 db "Root overflow",0 ;9 db "No free space",0 ;10 db "Directory not empty",0 ;11 db "Can't delete current directory",0 ;12 db "Invalid media",0 ;13 db "Unknown operation",0 ;14 db "Directory exist",0 ;15 db "Invalid filename",0 ;16 db "Invalid EXE-file",0 ;17 db "Not supported EXE-file",0 ;18 db "Access denied",0 ;19 db "Not ready",0 ;20 db "Seek error",0 ;21 db "Sector not found",0 ;22 db "CRC error",0 ;23 db "Write protect",0 ;24 db "Read error",0 ;25 db "Write error",0 ;26 db "Drive failure",0 ;27 db "Extended error 28",0 ;28 db "Extended error 29",0 ;29 db "Not enough memory",0 ;30 db "Invalid memory block",0 ;31 db "Extended error 32",0 ;32 db "Extended error 33",0 ;33 db "Extended error 34",0 ;34 db "Too many files in directory",0 ;35 список файлов db "36",0 ;36 (слишком большая влож. папок или >= 1024 папок) db "User abort",0 ;37 User abort (операция прервана пользователем) db "38",0 ;38 db "39",0 ;39 db "40",0 ;40 db "41",0 ;41 db "42",0 ;42 db "43",0 ;43 db "44",0 ;44 db "45",0 ;45 db "46",0 ;46 db "47",0 ;47 db "48",0 ;48 db "49",0 ;49 db "50",0 ;50 .Size EQU $-ERR0 */