;[Вызов функций DSS]-------------------- ToDSS EQU #10 .DRV EQU #18 .Mouse EQU #30 ;--------------------------------------- ;---[Буфер под служебную строку DSS]---- ; Command_Line_parameters (CLP) ; Смещения относительно значения в IX ; при старте EXE из DSS. CLP_Buffer EQU 131 ; Полная длина буфера CLP_FM EQU -3 ; Файловый манипулятор, если exe-файл с первичным загрузчиком CLP_MemBlockID EQU -2 ; Идентификатор блока памяти CLP_ProgLevel EQU -1 ; Уровень текущей программы CLP_CLLength EQU 0 ; Длинна командной строки CLP_Parameters EQU 1 ; Параметры командной строки, заканчивается нулем (127 bytes) ;!FIXIT а если длина строки будет больше? ; (CLP_CLLength) + 3 ; начало полного пути до запускаемого приложения (вместе с именем EXE) ;--------------------------------------- ;!TODO не только FAT FAT_ATTR: .ARCHIVE EQU %0010'0000 ; bit 5 .DIRECTORY EQU %0001'0000 ; bit 4 .VOLUME_ID EQU %0000'1000 ; bit 3 .SYSTEM EQU %0000'0100 ; bit 2 .HIDDEN EQU %0000'0010 ; bit 1 .READ_ONLY EQU %0000'0001 ; bit 0 .NoDIRnoVolID EQU .READ_ONLY + .HIDDEN + .ARCHIVE + .SYSTEM ; .NoVolID EQU .READ_ONLY + .HIDDEN + .DIRECTORY + .ARCHIVE + .SYSTEM ; .NoSYSnoVolID EQU .READ_ONLY + .HIDDEN + .DIRECTORY + .ARCHIVE ; ;------------[DSS Functions]------------ Dss: .Version EQU #00 .ChDisk EQU #01 .CurDisk EQU #02 .DskInfo EQU #03 .G_ENTRY EQU #04 ; EQU #05 ; EQU #06 ; EQU #07 ; вход: нет ; выход: A - номер последнего лог. диска в системе .RescanDrives EQU #08 .BootDSK EQU #09 .BootDSK.Get EQU #00*256 + .BootDSK .BootDSK.Set EQU #01*256 + .BootDSK ; ; File i/o .Create EQU #0A .Creat_N EQU #0B ; EQU #0C .ERASE EQU #0D .Delete EQU #0E .Move EQU #0F ;!TODO .Rename EQU #10 .Open EQU #11 .Open.RW EQU 0 .Open.R EQU 1 .Open.W EQU 2 .Close EQU #12 .Read EQU #13 .Write EQU #14 .Move_FP EQU #15 .Move_FP.FrStart EQU #00*256 + .Move_FP .Move_FP.FrCurrent EQU #01*256 + .Move_FP .Move_FP.FrEnd EQU #02*256 + .Move_FP .Attrib EQU #16 .Get_D_T EQU #17 .Put_D_T EQU #18 .F_First EQU #19 .F_First.FATname EQU 0 .F_First.DOSname EQU 1 ; from FAT ; .NAME: BLOCK 8,' ' ;+ #00 +00 NAME ; .EXT: BLOCK 3,' ' ;+ #08 +08 EXT ; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT ; .RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED ; .RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED ; .CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED ; .RESERVED_FAT32_2: WORD #0000 ;+ #14 +20 RESERVED ; .TIME: WORD #0000 ;+ #16 +22 TIME ; .DATE: WORD #0000 ;+ #18 +24 DATE ; .ST_CLUSTER: WORD #0000 ;+ #1A +26 START CLUSTER ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE .F_Next EQU #1A .MkDir EQU #1B .RmDir EQU #1C .ChDir EQU #1D .CurDir EQU #1E ; EQU #1F ; EQU #20 .SysTime EQU #21 .SetTime EQU #22 ; EQU #23 ; EQU #24 ; EQU #25 ; EQU #26 ; EQU #27 ; EQU #28 ; EQU #29 ; EQU #2A ; EQU #2B ; EQU #2C ; EQU #2D ; EQU #2E ; EQU #2F ; ; Keyboard .WaitKey EQU #30 .ScanKey EQU #31 .EchoKey EQU #32 .CTRLKey EQU #33 .EDIT EQU #34 .K_CLEAR EQU #35 .K_SETUP EQU #36 .TestKey EQU #37 ; ; Memory .SetWin EQU #38 .SetWin1 EQU #39 .SetWin2 EQU #3A .SetWin3 EQU #3B .INFOMEM EQU #3C .GetMem EQU #3D .FreeMem EQU #3E .SetMem EQU #3F ; ; Execution .Exec EQU #40 .Exec.Here EQU 1*256 + .Exec .Exit EQU #41 .Wait EQU #42 .GSwitch EQU #43 .DosName EQU #44 .EX_Path EQU #45 .EX_Path.GET_ALL EQU #00*256 + .EX_Path ; Разобрать строку .EX_Path.GET_DRIVE EQU #01*256 + .EX_Path ; Выделить имя диска .EX_Path.GET_PATH EQU #02*256 + .EX_Path ; Выделить директорию .EX_Path.GET_NAME EQU #03*256 + .EX_Path ; Выделить имя файла .EX_Path.GET_TYPE EQU #04*256 + .EX_Path ; Выделить расширение файла .EX_Path.GET_ALL_EX EQU #05*256 + .EX_Path ; Выделить имя диска, путь к файлу, имя файла и расширение файла .EX_Path.RESR EQU #06*256 + .EX_Path ; Зарезервировано .EX_Path.GSWITCH EQU #07*256 + .EX_Path ; Выделить параметр командной строки .EX_Path.GETNAME EQU #08*256 + .EX_Path ; Преобразовать из 11 символьного формата в формат ДОС .EX_Path.MASK EQU #09*256 + .EX_Path ; Преобразовать из формата ДОС в 11 символьный формат .Environ EQU #46 .Environ.Init EQU 255*256 + .Environ .Environ.Read EQU #00*256 + .Environ .Environ.Get EQU #01*256 + .Environ .Environ.Set EQU #02*256 + .Environ .AppInfo EQU #47 .AppInfo.CMD_Param EQU #00*256 + .AppInfo .AppInfo.EXE_HomeDir EQU #01*256 + .AppInfo .AppInfo.EXE_FullPath EQU #02*256 + .AppInfo ; EQU #48 ; EQU #49 ; EQU #4A ; EQU #4B ; EQU #4C ; EQU #4D ; EQU #4E ; EQU #4F ; ; Video .SetVMod EQU #50 .SetVMod.Screen_0 EQU 0*256+.SetVMod .SetVMod.Screen_1 EQU 1*256+.SetVMod .SetVMod.txt40x32 EQU 2 ; текстовый 40x32x16 цветов .SetVMod.txt80x32 EQU 3 ; текстовый 80x32x16 цветов .SetVMod.grf320x256 EQU #81 ; графический 320x256x256 цветов .SetVMod.grf640x256 EQU #82 ; графический 640x256x16 цветов .GetVMod EQU #51 .Locate EQU #52 .Cursor EQU #53 .SelPage EQU #54 .Scroll EQU #55 .Clear EQU #56 .RdChar EQU #57 .WrChar EQU #58 .WinCopy EQU #59 .WinRest EQU #5A .PutChar EQU #5B .PChars EQU #5C .Lib_Sub EQU #5D ;[ ] 11/02/2024 - Функция с пополняемыми подфункциями))) .Lib_Sub.RestoreFont EQU #01*256 + .Lib_Sub ; ; Printer .RES_PRN EQU #5D .CTRLPRN EQU #5E .Print EQU #5F ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; .DRV.Init EQU #00 .DRV.Open EQU #01 .DRV.Close EQU #02 .DRV.MediaCheck EQU #03 .DRV.GetBPB EQU #04 .DRV.Read EQU #05 .DRV.Write EQU #06 .DRV.Removable EQU #07 .DRV.GenIOCTL EQU #08 .DRV.GenIOCTL.GetParams EQU #00*256 + .DRV.GenIOCTL ; Get Device Parameters .DRV.GenIOCTL.ReadTrack EQU #01*256 + .DRV.GenIOCTL ; Read track .DRV.GenIOCTL.TestTRK EQU #02*256 + .DRV.GenIOCTL ; Test track .DRV.GenIOCTL.SetParams EQU #80*256 + .DRV.GenIOCTL ; Set Device Parameters .DRV.GenIOCTL.WriteTRK EQU #81*256 + .DRV.GenIOCTL ; Write track .DRV.GenIOCTL.FormatTRK EQU #82*256 + .DRV.GenIOCTL ; Format track .DRV.GenIOCTL.Enter EQU #55AA ; for DE ;.DRV.Reserved EQU #09 .DRV.LongRead EQU #10 .DRV.LongWrite EQU #11 ; .DRV.RescanDRV EQU #FF ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; .Mouse.Init EQU #00 .Mouse.ShowCursor EQU #01 .Mouse.HideCursor EQU #02 .Mouse.ReadState EQU #03 .Mouse.SetXY EQU #04 ;.Mouse.RESERVED EQU #05 ;.Mouse.RESERVED EQU #06 .Mouse.SetBoundsY EQU #07 .Mouse.SetBoundsX EQU #08 .Mouse.SetCursorImage EQU #09 .Mouse.SetCursorChar EQU #0A .Mouse.GetCursorImage EQU #0B ;.Mouse.RESERVED EQU #0C ;.Mouse.RESERVED EQU #0D .Mouse.GetSensitive EQU #0E .Mouse.SetSensitive EQU #0F .Mouse.GetPackets EQU #80 ; Interrupt routine .Mouse.SetVideoMode EQU #81 ;.Mouse.RESERVED EQU #82 .Mouse.RefreshCursor EQU #83 ;----------------------------------------------------------------------; ; ;------------[Error codes]-------------- MODULE DSS_Error sys: .NO_ERROR EQU #00 ; 00 - нет ошибок .INVALID_FUNCTION EQU #01 ; 01 - неверный номер функции .INVALID_DRIVE EQU #02 ; 02 - неправильный номер устройства .FILE_NOT_FOUND EQU #03 ; 03 - файл не обнаружен .PATH_NOT_FOUND EQU #04 ; 04 - неверный путь .INVALID_HANDLE EQU #05 ; 05 - несуществующий файловый манипулятор .NO_HANDLES EQU #06 ; 06 - нет свободного файлового манипулятора .FILE_EXISTS EQU #07 ; 07 - файл существует .READONLY EQU #08 ; 08 - файл только для чтения .ROOT_OVERFLOW EQU #09 ; 09 - переполнение ROOT (корневого каталога) .DISK_FULL EQU #0A ; 10 - нет свободного места на диске .DIR_NOT_EMPTY EQU #0B ; 11 - каталог не пуст .CURRENT_DIR EQU #0C ; 12 - неудачная попытка удалить текущий каталог .UNKNOWN_FORMAT EQU #0D ; 13 - неизвестный формат .INVALID_ACCESS EQU #0E ; 14 - невозможная операция .DIR_EXISTS EQU #0F ; 15 - каталог уже есть .INVALID_NAME EQU #10 ; 16 - неверное имя .INVALID_EXE EQU #11 ; 17 - неправильный EXE-файл .UNKNOWN_EXE EQU #12 ; 18 - не поддерживаемая версия EXE-файла .ACCESS_DENIED EQU #13 ; 19 - ресурс не доступен .NOT_READY EQU #14 ; 20 - нет готовности .SEEK_ERROR EQU #15 ; 21 - ошибка позиционирования .SECTOR_NOT_FOUND EQU #16 ; 22 - сектор не найден .CRC_ERROR EQU #17 ; 23 - ошибка CRC .WRITE_PROTECT EQU #18 ; 24 - защита записи .READ_ERROR EQU #19 ; 25 - ошибка чтения .WRITE_ERROR EQU #1A ; 26 - ошибка записи ;.GENERAL_FAILURE EQU #1B ; 27 - общая ошибка .DRIVE_FAILURE EQU #1B ; 27 - сбой диска ;.RESERVED_28 EQU #1C ; 28 - зарезервирован ;.RESERVED_29 EQU #1D ; 29 - зарезервирован .NOT_ENOUGH_MEMORY EQU #1E ; 30 - недостаточно памяти .INVALID_MEMORY_HND EQU #1F ; 31 - несуществующий блок памяти ;.RESERVED_32 EQU #20 ; 32 - зарезервировано .ENV_ITEM_OVERFLOW EQU #21 ; 33 - превышен максимальный размер переменной ;.RESERVED_34 EQU #22 ; 34 - зарезервировано .TOO_MANY_FILES_IN_DIR EQU #23 ; 35 - слишком много файлов в директории .TOO_DEEP_DIR_DEPTH EQU #24 ; 36 - слишком большая вложенность каталогов или количество папок > 1023 .USER_ABORT EQU #25 ; 37 - операция прервана пользователем .COMMON_ERROR EQU #26 ; 38 - общая ошибка .UNEXPECTED_APP_TRMN EQU #27 ; 39 - unexpected application termination / неожиданное завершение приложения ;.RESERVED_40 EQU #28 ; 40 - зарезервировано ;.RESERVED_41 EQU #29 ; 41 - зарезервировано ;.RESERVED_42 EQU #2A ; 42 - зарезервировано ;.RESERVED_43 EQU #2B ; 43 - зарезервировано ;.RESERVED_44 EQU #2C ; 44 - зарезервировано ;.RESERVED_45 EQU #2D ; 45 - зарезервировано ;.RESERVED_46 EQU #2E ; 46 - зарезервировано ;.RESERVED_47 EQU #2F ; 47 - зарезервировано .INVALID_VIDEO_MODE EQU #30 ; 48 - неправильный видеорежим ; drv: .NO_ERROR EQU #00 ; 00 - NO ERRORS .INVALID_COMMAND EQU #01 ; 01 - BAD COMMAND .INVALID_DRIVE EQU #02 ; 02 - BAD DRIVE NUMBER .UNKNOWN_FORMAT EQU #03 ; 03 - UNKNOW FORMAT .NOT_READY EQU #04 ; 04 - NOT READY .SEEK_ERROR EQU #05 ; 05 - SEEK ERROR .SECTOR_NOT_FOUND EQU #06 ; 06 - SECTOR NOT FOUND .CRC_ERROR EQU #07 ; 07 - CRC ERROR .WRITE_PROTECT EQU #08 ; 08 - WRITE PROTECT .READ_ERROR EQU #09 ; 09 - READ ERROR .WRITE_ERROR EQU #0A ; 10 - WRITE ERROR .GENERAL_FAILURE EQU #0B ; 11 - FAILURE .DEVICE_BUSY EQU #0C ; 12 - BUSY (DEVICE OPENED) ;.RESERVED EQU #0D ; 13 - RESERVED ; mouse: .NO_ERROR EQU #00 ; 0 - NO ERROR .INVALID_COMMAND EQU #01 ; 1 - COMMAND NOT PRESENT .DEVICE_ABSENT EQU #02 ; 2 - DEVICE ABSENT .CURSOR_ON EQU #03 ; 3 - CURSOR ON (already) .CURSOR_OFF EQU #04 ; 4 - CURSOR OFF (already) .CURSOR_TOO_BIG EQU #05 ; 5 - CURSOR IMAGE VERY BIG ENDMODULE /* ; DB #00 ; DB "Bad command or file name",0 01: DB "Invalid function",0 02: DB "Invalid drive number",0 03: DB "File not found",0 04: DB "Path not found",0 ; неверный путь 05: DB "Invalid handle",0 06: DB "Extended error 6",0 ; нет свободного файлового манипулятора 07: DB "File exist",0 08: DB "File read only",0 09: DB "Root overflow",0 10: DB "No free space",0 11: DB "Directory not empty",0 12: DB "Can't delete current directory",0 13: DB "Invalid media",0 14: DB "Unknown operation",0 ; невозможная операция 15: DB "Directory exist",0 16: DB "Invalid filename",0 17: DB "Invalid EXE-file",0 18: DB "Not supported EXE-file",0 19: DB "Access denied",0 20: DB "Not ready",0 21: DB "Seek error",0 22: DB "Sector not found",0 23: DB "CRC error",0 24: DB "Write protect",0 25: DB "Read error",0 26: DB "Write error",0 27: DB "Drive failure",0 ; общая ошибка 28: DB "Extended error 28",0 29: DB "Extended error 29",0 30: DB "No free memory",0 31: DB "Invalid memory block",0 32: DB "Extended error 32",0 33: DB "Extended error 33",0 34: DB "Extended error 34",0 ; DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 */ ;--------------------------------------- ; ; ;---------------[Files]----------------- FileMode: .RW EQU 00 .Read EQU 01 .Write EQU 02 ; FileAttrib: .Normal EQU 00 ; Normal file, no attributes .RDOnly EQU 01 ; Read only attribute .Hidden EQU 02 ; Hidden file .System EQU 04 ; System file .Label EQU 08 ; Volume label .Direc EQU #10 ; Directory .Arch EQU #20 ; Archive ;--------------------------------------- ; ; ;---------[control characters]---------- _cc: .cr EQU #0D ;возврат коретки .lf EQU #0A ;новая строка .tab EQU 9 ;символ табуляции ;--------------------------------------- ; ; Приложение Б. Таблица позиционных кодов ; key ASCII/SCAN key ASCII/SCAN ; ` #00 #00 V #56 #2D ; Esc #1B #01 B #42 #2E ; 1 #31 #02 N #4E #2F ; 2 #32 #03 M #4D #30 ; 3 #33 #04 , #2C #31 ; 4 #34 #05 . #2E #32 ; 5 #35 #06 / #2F #33 ; 6 #36 #07 RShift --- #34 ; 7 #37 #08 \ #5C #35 ; 8 #38 #09 LCtrl --- #36 ; 9 #39 #0A LAlt --- #37 ; 0 #30 #0B Space #20 #38 ; - #2D #0C RAlt --- #39 ; = #3D #0D RCtrl --- #3A ; BackSpace #08 #0E F1 #00 #3B ; Tab #09 #0F F2 #00 #3C ; Q #51 #10 F3 #00 #3D ; W #57 #11 F4 #00 #3E ; E #45 #12 F5 #00 #3F ; R #52 #13 F6 #00 #40 ; T #54 #14 F7 #00 #41 ; Y #59 #15 F8 #00 #42 ; U #55 #16 F9 #00 #43 ; I #49 #17 F10 #00 #44 ; O #4F #18 F11 #00 #45 ; P #50 #19 F12 #00 #46 ; [ #5B #1A PrScrn --- #47 ; ] #5D #1B ScrlLock #00 #48 ; CapsLock #00 #1C NumLock #00 #49 ; A #41 #1D / #2F #4A ; S #53 #1E * #2A #4B ; D #44 #1F - #2D #4C ; F #46 #20 + #2B #4D ; G #47 #21 enter #0D #4E ; H #48 #22 Del . #00 #4F ; J #4A #23 Ins 0 #00 #50 ; K #4B #24 End 1 #00 #51 ; L #4C #25 Down 2 #00 #52 ; ; #3B #26 PgDw 3 #00 #53 ; ' #27 #27 Left 4 #00 #54 ; Enter #0D #28 5 #00 #55 ; LShift --- #29 Right 6 #00 #56 ; Z #5A #2A Home 7 #00 #57 ; X #58 #2B Up 8 #00 #58 ; C #43 #2C PgUp 9 #00 #59 ; Приложение В. Байт атрибутов текстового экрана ; бит 7 - Признак мерцания символа ; биты 6,5,4 - Цвет фона символа 8 цветов (0...7) RGB ; биты 3,2,1,0 - Цвет символа 16 цветов (0...15) IRGB ; Цвета для фона и для символа: ; 0 0h 0000b - Чёрный ; 1 1h 0001b - Синий ; 2 2h 0010b - Зелёный ; 3 3h 0011b - Голубой (циан) ; 4 4h 0100b - Красный ; 5 5h 0101b - Фиолетовый ; 6 6h 0110b - Коричневый ; 7 7h 0111b - Белый ; Только для символа: ; 8 8h 1000b - Серый ; 9 9h 1001b - Ярко-синий ; 10 Ah 1010b - Ярко-зелёный ; 11 Bh 1011b - Ярко-голубой ; 12 Ch 1100b - Ярко-красный ; 13 Dh 1101b - Ярко-фиолетовый ; 14 Eh 1110b - Жёлтый ; 15 Fh 1111b - Ярко-белый ;