;[]=========================================================================[] ;[] Монитор-отладчик 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