DemoN/file.asm
2024-08-08 14:52:38 +03:00

379 lines
15 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[]=========================================================================[]
;[] Файловые процедуры монитора-отладчика 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 ; адрес расположения кода в памяти