;[]=========================================================================[] ;[] Файловые процедуры монитора-отладчика DemoN [] ;[] v0.10 - последние изменения 27.08.2006 [] ;[]=========================================================================[] LoadFile xor a ; выкл часов ld (ClockOn),a ld bc,0x0100+Dss.SelPage ; системный экран rst DssRst ld hl,Str.Load ; сообщение о загрузке файла ld c,Dss.PChars rst DssRst call LoadExe ld a,(DemonScreen) ld b,a ld c,Dss.SelPage rst DssRst ld a,On ; вкл часов ld (ClockOn),a ret LoadExe ld hl,FDebug ; имя файла IFDEF DSS_1_70 call build_filename ENDIF ld a,1 ; открыть для чтения ld c,Dss.Open rst DssRst jp c,PrErDss ; выход с ошибкой ld (FId),a ; запомнить файловый манипулятор ld hl,FDebug ; буфер для загрузки заголовка ld de,0x7F ; кол-во считываемых байт ld c,Dss.Read ; чтение rst DssRst jp c,PrErDss ; выход с ошибкой ld hl,(FDebug) ; заголовок EXE-файла ld de,0x5845 ; 'EX' проверка идентификатора sbc hl,de jr nz,.AS_BUN ld hl,FDebug+3 ld a,(hl) ; версия EXE-файла ; exe v0 & v1 IFDEF DSS_1_70 cp 2 ; если версия EXE >1 то грузим как бинарник с ORG 0x0000 jp p,.AS_BUN ELSE or a jr nz,.AS_BUN ENDIF inc hl ld e,(hl) ; DE -> начало исполняемого кода inc hl ld d,(hl) ld bc,11 ; пропускаем флаг загрузчика и зарезервированные байты add hl,bc ld a,(hl) ; мл.байт расположения кода в памяти ld (FRam),a inc hl ld a,(hl) ; ст.байт расположения кода в памяти ld (FRam+1),a inc hl ld a,(hl) ; мл.байт адреса запуска ld (Reg._PC),a ld (ListAddr),a ; мл.байт адреса листинга inc hl ld a,(hl) ; ст.байт адреса запуска ld (Reg._PC+1),a ld (ListAddr+1),a ; ст.байт адреса листинга inc hl ld a,(hl) ; мл.байт стека программы ld (Reg._SP),a inc hl ld a,(hl) ; ст.байт стека программы ld (Reg._SP+1),a ld a,e ld (.F_OFFS),a ld a,d ld (.F_OFFS+1),a .AS_BUN ld hl,0 ld ix,0 ; смещение в файле ld bc,2*256+Dss.Move_FP ; относительно конца rst DssRst jp c,PrErDss ; выход с ошибкой push hl ld de,(FRam) ; адрес расположения кода set 6,d res 7,d ; грузим через 1-е окно ld hl,0x8000 or a ; сбросить флаг C sbc hl,de ; кол-во считываемых байт ld (.L6+1),hl ex de,hl ld (.L6+4),hl pop hl call NBank ; определить кол-во банок jp c,PrErDss ; выход с ошибкой ld (MemId+1),a ; кол-во выделяемых страниц ld b,a ld c,Dss.GetMem ; выделение памяти rst DssRst jp c,PrErDss ; выход с ошибкой ld (MemId),a ; id блока памяти ld a,(FId) ; файловый манипулятор ld hl,0 .F_OFFS+2 ld ix,0 ; смещение в файле ld bc,Dss.Move_FP ; относительно начала rst DssRst jp c,PrErDss ; выход с ошибкой ld a,(MemId) ; id блока памяти ld bc,Dss.SetWin1 ; вкл 1-ю банку в 1-е окно rst DssRst jp c,PrErDss ; выход с ошибкой .L6 ld de,0x3FFF ; кол-во считываемых байт ld hl,0x4000 ; адрес загрузки кода ld a,1 ; счетчик банок ld (MemId+2),a .L5 ld a,(FId) ; файловый манипулятор ld c,Dss.Read ; чтение rst DssRst jp c,PrErDss ; выход с ошибкой ld bc,(MemId+1) ld a,b cp c ; загрзили весь файл? jr z,.L4 ; переход, если да inc a ld (MemId+2),a ; увеличить счетчик банок ld a,(MemId) ; id блока памяти ld c,Dss.SetWin1 ; вкл банку в 1-е окно rst DssRst jp c,PrErDss ; выход с ошибкой ld hl,0x4000 ; адрес в памяти для загрузки ld de,0x3FFF ; кол-во загружаемых байт jr .L5 .L4 ld a,(FId) ; файловый манипулятор ld c,Dss.Close ; закрыть файл rst DssRst jp c,PrErDss ; выход с ошибкой ld a,(MemId) ; id блока памяти ld bc,Bios.Emm_Fn4 ; вычислить физ номер 1-й банки rst BiosRst ret c ; выход с ошибкой ld (BankP),a ld a,(MemId+1) ; кол-во выделенных страниц dec a jr z,.L7 ld a,(MemId) ; id блока памяти ld bc,1*256+Bios.Emm_Fn4 ; вычислить физ номер 2-й банки rst BiosRst ret c ; выход с ошибкой ld (BankP+1),a ld a,(MemId+1) ; кол-во выделенных страниц cp 2 jr z,.L7 ld a,(MemId) ; id блока памяти ld bc,2*256+Bios.Emm_Fn4 ; вычислить физ номер 3-й банки rst BiosRst ret c ; выход с ошибкой ld (BankP+2),a ld a,(MemId+1) ; кол-во выделенных страниц cp 3 jr z,.L7 ld a,(MemId) ; id блока памяти ld bc,3*256+Bios.Emm_Fn4 ; вычислить физ номер 4-й банки rst BiosRst ret c ; выход с ошибкой ld (BankP+3),a .L7 ld hl,WinPage ld de,BankP ld a,(MemId+1) ; кол-во выделенных страниц ld b,a cp 5 jr c,$+4 ld b,4 ; подключаем не более 4 банок ld a,(FRam+1) ; ст.адрес расположения кода and 0xC0 ; окно с расположением кода or a ; 0-е окно jr nz,.L8 ld c,a ld a,(de) ld (hl),a ; подключить банку программы dec b ret z ; выход, если больше нет банок ld a,c inc de .L8 inc hl cp 0x40 ; 1-е окно jr nz,.L9 ld c,a ld a,(de) ld (hl),a ; подключить банку программы dec b ret z ; выход, если больше нет банок ld a,c inc de .L9 inc hl cp 0x80 ; 2-е окно jr nz,.L10 ld c,a ld a,(de) ld (hl),a ; подключить банку программы dec b ret z ; выход, если больше нет банок ld a,c inc de .L10 inc hl ; иначе 3-е окно ld a,(de) ld (hl),a ; подключить банку программы ret ;[]=========================================================================[] ;[] Вычисление необходимого кол-ва банок для загрузки файла в память [] ;[] Вход: HL:IX - длина файла в байтах [] ;[] DE - кол-во байт для загрузки в 1-ю банку [] ;[] Выход: A - кол-во необходимых банок [] ;[] флаг C - ошибка, код ошибки в A [] ;[]=========================================================================[] NBank: push ix ld b,h ld c,l pop hl inc bc xor a inc a sbc hl,de jr nc,$+4 jr .L5 ld de,16384 ; размер банки push af .L2 pop af .L1 inc a jr z,.L3 sbc hl,de jr nc,.L1 .L5 dec bc push af ld a,b or c jr nz,.L2 pop af or a ; сбросить флаг C ret .L3 ld a,0x1E ; "Недостаточно памяти" ; JP ErrorDSS ret IFDEF DSS_1_70 ; ------------------------------------------------------ ; Check '\' in file path ; Inp: HL->filespec ; Out: CF=0 - slash exists, CF=1 - no slash ; ------------------------------------------------------ check_bkslash PUSH BC,HL LD B,128 .next LD A, (HL) OR A JR Z,.not_exists CP "\\" JR Z,.exists INC HL DJNZ .next .not_exists SCF JR .exit .exists OR A ; CF=0 .exit POP HL,BC RET ; ---------------------------------------------------- ; Get full current path ; Inp: HP - pointer to buffer for path ; ---------------------------------------------------- get_cur_dur PUSH HL LD C, Dss.CurDisk RST DssRst JP C,PrErDss ADD A, 65 LD (HL),A INC HL LD (HL),':' INC HL LD C, Dss.CurDir RST DssRst JP C,PrErDss POP HL CALL add_back_slash RET ; ---------------------------------------------------- ; Add back slash to path string ; Inp: HL - pointer to zero ended string with path ; Out: HL - point to end ; ---------------------------------------------------- add_back_slash XOR A ; find end of path .find_eos CP (HL) JR Z,.is_eos INC HL JR .find_eos ; check last symbol is '\'' and add if not .is_eos DEC HL LD A,(HL) CP "\\" JR Z,.is_sep INC HL LD (HL),"\\" .is_sep ; mark new end of string INC HL LD (HL),0x0 RET ; ------------------------------------------------------ ; In only filename specified, build full path to file ; Inp: HL -> to filename ; Out: HL -> full path name ; ------------------------------------------------------ build_filename CALL check_bkslash RET NC LD HL, FullPath call get_cur_dur LD DE, FDebug EX DE,HL LD BC,128 LDIR LD HL, FullPath RET ENDIF BankP DS 4 ; номера банок загружаемой проги MemId DS 3 ; id-блока памяти под файл, ; кол-во выделенных банок, ; счетчик загруженных банок FId DB 0 ; файловый манипулятор FDebug DS 128 ; имя отлаживаемого файла и буфер для его чтения DB 0 IFDEF DSS_1_70 FullPath DS 256,0 ENDIF FStart DW 0x4200 FRam DW 0 ; адрес расположения кода в памяти