mirror of
https://github.com/romychs/DemoN.git
synced 2025-04-09 22:06:42 +03:00
379 lines
15 KiB
NASM
379 lines
15 KiB
NASM
;[]=========================================================================[]
|
||
;[] Файловые процедуры монитора-отладчика 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 ; адрес расположения кода в памяти
|