mirror of
https://github.com/romychs/DemoN.git
synced 2025-04-09 22:06:42 +03:00
442 lines
16 KiB
NASM
442 lines
16 KiB
NASM
;[]=========================================================================[]
|
||
;[] Монитор-отладчик DemoN []
|
||
;[] v0.01 - последние изменения 10.10.2004 []
|
||
;[] v0.02 - последние изменения 07.02.2005 []
|
||
;[] v0.03 - последние изменения 11.03.2006 []
|
||
;[] v0.10 - последние изменения 27.08.2006 []
|
||
;[]=========================================================================[]
|
||
|
||
;DEVICE ZXSPECTRUM128
|
||
|
||
DEVICE NOSLOT64K
|
||
|
||
SLDOPT COMMENT WPMEM, LOGPOINT, ASSERTION
|
||
|
||
; define DEBUG 1 ;открытие дебаггерных заглушек
|
||
; define D_PRINTCH_BIOS 1
|
||
|
||
DEFINE DSS_1_70
|
||
;DEFINE DBG ; For debug with DeZog
|
||
|
||
; TODO: Set cur_dir for loaded exe
|
||
|
||
IFDEF DBG
|
||
INCLUDE "dss.asm"
|
||
DB 0
|
||
ALIGN 16384, 0
|
||
DS 0x80, 0
|
||
ENDIF
|
||
|
||
|
||
|
||
ORG 0x7F00 ; 0x8100-512
|
||
|
||
; ------------------------------------------------------
|
||
|
||
STARTPRG
|
||
DB "EXE" ; EXE ID
|
||
IFDEF DSS_1_70
|
||
DB 0x01 ; EXE VERSION
|
||
ELSE
|
||
DB 0x00
|
||
ENDIF
|
||
DW 0x0200 ; CODE OFFSET LOW
|
||
DW 0x0000 ; CODE OFFSET HIGH
|
||
DW 0x0000 ; END-BEG ;PRIMARY LOADER
|
||
DW 0x0000 ;
|
||
DW 0x0000 ; RESERVED
|
||
DW 0x0000 ;
|
||
DW OrgAdr ; LOAD ADDRESS
|
||
DW OrgAdr ; START ADDRESS
|
||
DW 0xC001 ; STACK ADDRESS
|
||
ExeFiller
|
||
IFDEF DBG
|
||
DS 106,0
|
||
ELSE
|
||
DS OrgAdr-ExeFiller,0
|
||
ENDIF
|
||
|
||
ORG 0x8100
|
||
@STACK_TOP ; for DeZog internal sim
|
||
|
||
OrgAdr
|
||
; stack 0xC001
|
||
IFDEF DBG
|
||
LD SP, STACK_TOP
|
||
LD IX,CMD_LINE1
|
||
ENDIF
|
||
|
||
push ix ; адрес командной строки
|
||
in a,(EmmWin.P2) ; банка с отладчиком
|
||
ld (BankDebug),a
|
||
in a,(EmmWin.P0) ; банка с OS
|
||
ld (BankOS),a
|
||
; ld (WinPage),a
|
||
|
||
; ld (Reg._SP),sp ; адрес стека
|
||
call SaveAllRegs ; сохранение регистровых пар
|
||
; ld a,(BankDebug)
|
||
ld a,0xFF ; скрываем банку с отладчиком
|
||
ld (WinPage+2),a
|
||
INCLUDE "cmdline.asm"
|
||
call nc,LoadFile
|
||
jp Start
|
||
|
||
HorizLine DB 8 ; количество линий
|
||
;1-длина 2-столбец 3-строка 4-символ
|
||
DB 0x4E,0x01,0x00,0xCD, 0x17,0x01,0x03,0xC4
|
||
DB 0x17,0x01,0x09,0xC4, 0x17,0x01,0x0F,0xC4
|
||
DB 0x17,0x01,0x11,0xCD, 0x4E,0x01,0x15,0xCD
|
||
DB 0x4E,0x01,0x1E,0xCD, 0x17,0x01,0x13,0xCD
|
||
|
||
VerticalLine
|
||
DB 5 ; количество линий
|
||
;1-высота 2-столбец 3-строка 4-символ
|
||
DB 0x1D,0x00,0x01,0xBA, 0x10,0x09,0x01,0xB3
|
||
DB 0x08,0x0C,0x16,0xBA, 0x14,0x18,0x01,0xBA
|
||
DB 0x1D,0x4F,0x01,0xBA
|
||
|
||
Corner DB 41 ; углы рамок
|
||
;1-столбец 2-строка 3-символ
|
||
DB 0x00,0x00,0xC9, 0x00,0x03,0xC7, 0x00,0x09,0xC7
|
||
DB 0x00,0x0F,0xC7, 0x00,0x11,0xCC, 0x00,0x15,0xCC
|
||
DB 0x00,0x1E,0xC8, 0x06,0x11,0xD1, 0x06,0x13,0xCF
|
||
DB 0x09,0x00,0xD1, 0x09,0x03,0xC5, 0x09,0x09,0xC5
|
||
DB 0x09,0x0F,0xC5, 0x0C,0x11,0xD1, 0x0C,0x15,0xCB
|
||
DB 0x0C,0x1E,0xCA, 0x12,0x0F,0xC2, 0x12,0x11,0xD8
|
||
DB 0x12,0x13,0xCF, 0x18,0x00,0xCB, 0x18,0x03,0xB6
|
||
DB 0x18,0x09,0xB6, 0x18,0x0F,0xB6, 0x18,0x15,0xCA
|
||
DB 0x00,0x13,0xCC, 0x0C,0x13,0xCF, 0x4F,0x00,0xBB
|
||
DB 0x18,0x13,0xB9, 0x4F,0x15,0xB9, 0x4F,0x1E,0xBC
|
||
DB 0x18,0x11,0xB9, 0x06,0x12,0xB3, 0x12,0x10,0xB3
|
||
DB 0x12,0x12,0xB3, 0x09,0x13,0xD1, 0x09,0x14,0xB3
|
||
DB 0x09,0x15,0xCF, 0x0C,0x12,0xB3, 0x0E,0x13,0xCB
|
||
DB 0x0E,0x14,0xBA, 0x0E,0x15,0xCA
|
||
|
||
TextStrReg DB 0x16,0x01,0x01,"IX", 0x16,0x01,0x02,"IY"
|
||
DB 0x16,0x01,0x04,"HL", 0x16,0x01,0x05,"DE"
|
||
DB 0x16,0x01,0x06,"BC", 0x16,0x01,0x07,"AF"
|
||
DB 0x16,0x01,0x0A,"HL'", 0x16,0x01,0x0B,"DE'"
|
||
DB 0x16,0x01,0x0C,"BC'", 0x16,0x01,0x0D,"AF'"
|
||
DB 0x16,0x01,0x10,"PC", 0x16, 0x0A,0x10,"IR"
|
||
DB 0x16,0x01,0x14,"SP",0
|
||
TextStrLogo DB 0x016,0x01,0x1F,0xC4,0xCD,0xCD
|
||
DB " DemoN v"
|
||
INCBIN "VERSION/major.bin"
|
||
DB "."
|
||
INCBIN "VERSION/minor.bin"
|
||
DB " build "
|
||
INCBIN "VERSION/build.bin"
|
||
DB " (alpha)-"
|
||
INCBIN "VERSION/date.bin"
|
||
DB " Igor by AlphA Studio, Hard/WCG"
|
||
DB 0x20,0xCD,0xCD,0xC4,0x00
|
||
TextStrWin DB 0x16,0x02,0x11," 0 ",0x16,0x08,0x11," 1 "
|
||
DB 0x16,0x0E,0x11," 2 ",0x16,0x14,0x11," 3 ",0
|
||
TextStrRez DB 0x16,0x0F,0x14,"REZ",0
|
||
|
||
; ------------------------------------------------------
|
||
; Процедура прорисовки линий
|
||
; HL - адрес начала таблицы
|
||
; ------------------------------------------------------
|
||
DrawLine ld c,(hl) ; количество линий
|
||
inc hl
|
||
ld b,(hl) ; длина линии
|
||
inc hl
|
||
ld e,(hl) ; столбец
|
||
inc hl
|
||
ld d,(hl) ; строка
|
||
inc hl
|
||
ld a,(hl) ; символ
|
||
push hl
|
||
.L1 push bc
|
||
push af
|
||
ld bc,Dss.WrChar ; цвет в рег.B
|
||
rst DssRst
|
||
inc d ; наращивание координаты
|
||
pop af
|
||
pop bc
|
||
djnz .L1
|
||
pop hl
|
||
dec c
|
||
jr nz,DrawLine+1
|
||
ret
|
||
; ------------------------------------------------------
|
||
; Начало программы
|
||
; ------------------------------------------------------
|
||
Start:
|
||
ld hl,Hello ; сообщение программы
|
||
ld c,Dss.PChars ; вывести строку
|
||
rst DssRst
|
||
ld c,Dss.GetVMod ; Текущий граф режим
|
||
rst DssRst
|
||
jp c,Exit
|
||
ld (OSGrafMode),a
|
||
ld a,b
|
||
ld (OSScreen),a ; и текущая страница экрана
|
||
push bc
|
||
ld bc,#0100+Dss.GetMem ; резервируем 1 страницу для оконного буфера
|
||
rst DssRst
|
||
pop de ; В D - номер страницы экрана - OSScreen
|
||
jp c,Exit ; Ошибка выделения блока памяти
|
||
ld (BufPage),a ; Сохраним страницу в переменной
|
||
ld b,a
|
||
ld a,(DemonScreen)
|
||
cp d ; если экраны ОС и Демона не совпадают
|
||
jr nz,StartNext ; то и не сохраняем экран ОСи
|
||
ld de,0 ; Сохраняем экран в доп.странице
|
||
ld hl,#2050
|
||
ld ix,#c000
|
||
ld c,Dss.WinCopy
|
||
rst DssRst
|
||
|
||
StartNext ld a,(DemonScreen) ; экран отладчика
|
||
ld b,a
|
||
ld a,3 ; установить режим 80х32
|
||
ld c,Dss.SetVMod ; Dss.SelPage
|
||
; ld bc,0x0054
|
||
rst DssRst
|
||
ifdef D_PRINTCH_BIOS
|
||
ld ix,MainWin ; Открытие окна ч/з биос
|
||
ld e,00010001b
|
||
rst BiosRst
|
||
ld (Demon.Bios_Win),a
|
||
; jr nc,.lp1
|
||
; ld c,Dss.EchoKey ; дебуггерная заглушка
|
||
; rst DssRst
|
||
|
||
endif
|
||
|
||
.lp1
|
||
; ld a,(Color._SP) ; подсветка вершины стека
|
||
; ld b,a
|
||
; ld de,0x1C01
|
||
; ld hl,0x010B
|
||
; ld a," "
|
||
; ld c,Dss.Clear
|
||
; rst DssRst
|
||
call ClearScreen
|
||
call DrawDemonScreen
|
||
|
||
; ld c,Dss.EchoKey ; дебуггерная заглушка
|
||
; rst DssRst
|
||
|
||
jp Start1
|
||
|
||
; ------------------------------------------------------
|
||
; Обновление экрана демона
|
||
; ------------------------------------------------------
|
||
RefreshScreen
|
||
call CursorRes
|
||
call ClearScreen
|
||
call DrawDemonScreen
|
||
call Refresh
|
||
call KEYB.Cursor ; вкл курсор
|
||
jp CursorSet
|
||
|
||
; ------------------------------------------------------
|
||
ClearScreen ld a,(Color.Screen)
|
||
ld b,a ; очистка экрана
|
||
ld de,0
|
||
ld hl,0x2050
|
||
ld c,Bios.Lp_Cls_Win
|
||
rst BiosRst
|
||
ret
|
||
|
||
; ------------------------------------------------------
|
||
DrawDemonScreen
|
||
ld a,(Color.Border) ; установка цвета рамки
|
||
ld (DrawLine.L1+4),a
|
||
ld (DrawCorner+10),a
|
||
ld a,0x14 ; код мнемоники INC D
|
||
ld (DrawLine.L1+6),a
|
||
|
||
ld hl,VerticalLine ; вертикальные линии
|
||
call DrawLine
|
||
|
||
ld hl,HorizLine ; горизонтальные линии
|
||
ld a,0x1C ; код мнемоники INC E
|
||
ld (DrawLine.L1+6),a
|
||
call DrawLine
|
||
|
||
ld hl,Corner
|
||
ld b,(hl) ; количество углов
|
||
DrawCorner push bc
|
||
inc hl
|
||
ld e,(hl) ; столбец
|
||
inc hl
|
||
ld d,(hl) ; строка
|
||
inc hl
|
||
ld a,(hl) ; символ
|
||
push hl
|
||
ld bc,Dss.WrChar ; цвет в рег.B
|
||
rst DssRst
|
||
pop hl
|
||
pop bc
|
||
djnz DrawCorner
|
||
|
||
ld hl,TextStrReg
|
||
ld a,(Color.TextStrReg) ; цвет регистровых пар
|
||
ld (PrnStrColor.L1+5),a
|
||
call PrnStrColor
|
||
ld hl,TextStrWin
|
||
ld a,(Color.TextStrWin) ; цвет номеров окон
|
||
ld (PrnStrColor.L1+5),a
|
||
call PrnStrColor
|
||
ld hl,TextStrLogo
|
||
ld a,(Color.TextStrLogo) ; цвет лого программы
|
||
ld (PrnStrColor.L1+5),a
|
||
call PrnStrColor
|
||
ld hl,TextStrRez
|
||
ld a,(Color.RezArea) ; цвет резидента
|
||
ld (PrnStrColor.L1+5),a
|
||
call PrnStrColor
|
||
ret
|
||
ds OrgAdr+0x700-$
|
||
|
||
; ------------------------------------------------------
|
||
Start1:
|
||
call KEYB.PreparChar ; подготовка программного курсора ввода
|
||
; ld hl,(Reg._PC)
|
||
; ld hl,0
|
||
; ld (ListAddr),hl
|
||
|
||
call Refresh
|
||
call KEYB.Keyb
|
||
|
||
; ------------------------------------------------------
|
||
Exit:
|
||
ld hl,(KEYB.Rst38.Vect+1) ; восстановление вектора DSS
|
||
ld (0039h),hl
|
||
|
||
ld a,(OSScreen) ; и текущая страница экрана
|
||
ld b,a
|
||
push bc
|
||
ld a,(OSGrafMode)
|
||
ld c,Dss.SetVMod
|
||
|
||
; ld bc,0x0100+Dss.SelPage ;восстановление экрана DSS
|
||
rst DssRst
|
||
pop bc
|
||
ld a,(DemonScreen)
|
||
cp b
|
||
jr nz,ExitNext
|
||
ld de,0 ; Восстанавливаем экран из доп.страницы
|
||
ld hl,#2050
|
||
ld ix,#c000
|
||
ld c,Dss.WinRest
|
||
ld a,(BufPage)
|
||
push af
|
||
ld b,a
|
||
rst DssRst
|
||
pop af
|
||
ld c,Dss.FreeMem ; Отдаем страницу буфера обратно ОСи
|
||
rst DssRst
|
||
|
||
ExitNext
|
||
ld bc,Dss.Exit ; нормальное завершение
|
||
rst DssRst
|
||
Return ret
|
||
|
||
; ------------------------------------------------------
|
||
Refresh
|
||
di
|
||
ld de,0x0104 ; вывод значений регистров
|
||
ld hl,(Reg._IX)
|
||
call PrintStrReg
|
||
ld de,0x0204
|
||
ld hl,(Reg._IY)
|
||
call PrintStrReg
|
||
ld de,0x0404
|
||
ld hl,(Reg._HL)
|
||
call PrintStrReg
|
||
ld de,0x0504
|
||
ld hl,(Reg._DE)
|
||
call PrintStrReg
|
||
ld de,0x0604
|
||
ld hl,(Reg._BC)
|
||
call PrintStrReg
|
||
ld de,0x0A04
|
||
ld hl,(Reg._HL_)
|
||
call PrintStrReg
|
||
ld de,0x0B04
|
||
ld hl,(Reg._DE_)
|
||
call PrintStrReg
|
||
ld de,0x0C04
|
||
ld hl,(Reg._BC_)
|
||
call PrintStrReg
|
||
ld de,0x0704
|
||
ld hl,(Reg._AF)
|
||
call PrintStrAF
|
||
ld de,0x0D04
|
||
ld hl,(Reg._AF_)
|
||
call PrintStrAF
|
||
ld de,0x1004
|
||
ld hl,(Reg._PC)
|
||
call PrintReg
|
||
ld de,0x100D
|
||
ld hl,(Reg._IR)
|
||
call PrintReg
|
||
ld de,0x1404
|
||
ld hl,(Reg._SP)
|
||
call PrintReg
|
||
call PrintSPDn
|
||
ld de,0x1413
|
||
ld hl,(RezAdr)
|
||
call PrintReg
|
||
|
||
call PrintStrWin ; вывод номеров банок в окнах
|
||
|
||
call PrintStrSP ; вывод дампа стека
|
||
|
||
call PrintDump
|
||
ei
|
||
jp DisAsm
|
||
|
||
DemonHelp call CursorRes
|
||
ld ix,HelpWnd
|
||
jp DialogWindow
|
||
|
||
; ld hl,HelpWndDlg
|
||
; jp WinDialog
|
||
HelpWnd DB 6,16,11,42,7,#27
|
||
DB "DemoN Help Page",0
|
||
DB " DemoN v"
|
||
INCBIN "VERSION/major.bin"
|
||
DB "."
|
||
INCBIN "VERSION/minor.bin"
|
||
DB " build "
|
||
INCBIN "VERSION/build.bin"
|
||
DB " (alpha)-"
|
||
INCBIN "VERSION/date.bin"
|
||
DB 0x0D
|
||
DB " Igor by AlphA Studio, Hard/WCG",0x0D,0x0D
|
||
DB " OK",0
|
||
HelpWndDlg DB 1 ; Описатель диалогового окна
|
||
DB 16+19,16,4,2
|
||
DW 0,0
|
||
|
||
INCLUDE "EQU/dss_equ.asm"
|
||
INCLUDE "EQU/bios_equ.asm"
|
||
INCLUDE "EQU/port.asm"
|
||
INCLUDE "disasm.asm"
|
||
INCLUDE "util.asm"
|
||
INCLUDE "file.asm"
|
||
INCLUDE "error.asm"
|
||
INCLUDE "clock.asm"
|
||
|
||
INCLUDE "keyb.asm"
|
||
INCLUDE "kreg.asm"
|
||
|
||
INCLUDE "kstack.asm"
|
||
INCLUDE "kdump.asm"
|
||
INCLUDE "rez.asm"
|
||
INCLUDE "step.asm"
|
||
INCLUDE "savescr.asm"
|
||
INCLUDE "data.asm"
|
||
INCLUDE "tabl.asm"
|
||
INCLUDE "loadbin.asm"
|
||
INCLUDE "windows.asm"
|
||
|
||
EndOfDaemon
|
||
;savebin "demon.exe",STARTPRG,EndOfDaemon-STARTPRG |