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

442 lines
16 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.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