/* ;------------[ПЕРЕДЕЛАТЬ!!!]------------ оптимизировать выделяемые блоки памяти проверка на ошибки при вызове DSS и BIOS ;--------------------------------------- */ ; ;---------------------------[Defines section]--------------------------- DEFINE EXE_HEADER 1 ;----------------------------------------------------------------------- ; ; ;-----------------------[Compilation parameters]------------------------ DEVICE ZXSPECTRUM4096 ; модель с 4 метрами памяти MMU 2 e, 0 ; нулевая страница в банку 2 и проверка на границы OUTPUT './Build/DOOM2/doom2.exe' ;----------------------------------------------------------------------- ; ; ;-------------------------------[Includes]------------------------------ include 'Shared_includes/constants/SP2000.inc' include 'Shared_includes/constants/dss_equ.inc' include 'Shared_includes/constants/BIOS_equ.inc' include 'Shared_includes/constants/standart_colors.inc' include 'Shared_includes/macroses/accelerator.z80' include 'Shared_includes/macroses/macros.z80' include 'Shared_includes/structures/FileSystem.inc' ;----------------------------------------------------------------------- ; ; ;-------------------------[Standart EQU section]------------------------ org_addr EQU #8000+CLP_Buffer code_addr EQU BEGIN stack_point EQU #BFFF program_start EQU BEGIN Loader_length EQU 0 ;----------------------------------------------------------------------- ; TABLE_X EQU #A000 ; таблица коэфициентов высоты TABLE_X_SIZE EQU #0800 ; её размер??? MONSTR_TABLE EQU #A800 ; таблица монстров MONSTR_TABLE_SIZE EQU #1800 ; её размер??? TABLE_W EQU #2000 ; текущие карты для TRACE ; Code start section ;[]-------------------------------------------------------------------[] IF EXE_HEADER include 'Shared_Includes/constants/EXE_Header.z80' ORG org_addr ELSE ORG org_addr - CLP_Buffer ENDIF ;[]-------------------------------------------------------------------[] ;[]-------------------------------------------------------------------[] BEGIN: DI LD (CMD_Line),IX ; сохранить указатель на параметры запуска CMD_Line+1: LD HL,#8080 CALL SET_HOME_PATH ;--------[загрузка ресурсов игры]------- ; выполнено в виде костыльной заглушки LD HL,Loading_TXT LD C,Dss.PChars RST ToDSS ; CALL Load_Resources ; CALL SAVE_PAL CALL SAVE_TXT_SCREEN ; LD A,Dss.SetVMod.grf320x256 ; LD BC,Dss.SetVMod.Screen_1 ; RST ToDSS ;--------------------------------------- ;-----[Инициализация Covox-Blaster]----- ld bc,CBL.SYS_PORT ld a,CBL.Blaster + CBL.Mono + CBL.is8bit + CBL.Int_off + CBL.KHz_16old out (c),a ; ;-----------[заглушить звук]------------ LD A,#FF ; !FIXIT разве так надо глушить? Не рудименты Sp97? 1: CALL CLEAR_COVOX_X DEC A CP #80 JR NZ,1B ;--------------------------------------- ; ;--------------------------------------- ; IN A,(SLOT3) ; PUSH AF ld a,(RAMBlkIDs.resources) ld (PalitrePage),a ld a,(RAMBlkIDs.d2_fram) ld (D2_FRAM_page),a ;----[] ; Запрашиваем страницу для каталога ; сохраняем её № в коде ; ; ДОДЕЛАТЬ!!! ; надо потом нормально выделять и ; освобождать память, а не вот это всё ; ld b,1 ld c,Dss.GetMem rst ToDSS LD (CatPage),a ;----[] CALL CLEAR_GRAF_SCR ; IN A,(SLOT3) ; PUSH AF ; LD A,3 ; OUT (SLOT3),A ; LD HL,PALITRE ; LD DE,#C000 ; LD BC,#0400 ; LDIR ; POP AF ; OUT (SLOT3),A CALL SET_PAL ;----[открыть порты масштабирования]---- ; один внутренний порт масштабирования маппится на диаппазон #XX00 ; внешних портов. Write, Dos off, CNF 0. LD A,1 LD HL, %0000'0100'0000'0000 ; значение LD DE, %1111'1110'0110'1111 ; маска LD BC,ACEX.SCALE*256 + BIOS.DCP_CONFIG RST ToBIOS ; IN A,(SLOT3) ; EX AF,AF' ; LD A,DCP_PAGE ; OUT (SLOT3),A ; LD A,ACEX.SCALE ; LD (#C400),A ; порт #XX00 Dos off ; LD (#C410),A ; порт #XX00 Dos off ; LD (#C480),A ; порт #XX00 Dos off ; LD (#C490),A ; порт #XX00 Dos off ; LD (#C500),A ; порт #XX00 Dos off ; LD (#C510),A ; порт #XX00 Dos off ; LD (#C580),A ; порт #XX00 Dos off ; LD (#C590),A ; порт #XX00 Dos off ; EX AF,AF' ; OUT (SLOT3),A ; Активация Акселя масштабирования, обратно только через ресет LD BC,#100 ; C - масштаб 1:1 OUT (C),C ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- CALL MAIN ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- ; E)eeeeee X) xx I)iiii T)tttttt ; E) X) xx I) T) ; E)eeeee X)xx I) T) ; E) X)xx I) T) ; E) X) xx I) T) ; E)eeeeee X) xx I)iiii T) ;----------------------------------------------------------------------- ; ;-----------[EXIT Procedure]------------; RETURN_POINT: ; DI ; LD A,#10 ; LD BC,#1FFD ; OUT (C),A ; LD A,RESET_PAGE ; OUT (SLOT3),A ; LD (#C000),HL ; HALT_L: ; ;DI ; HALT ; JR HALT_L IN A,(FastRAM.OFF) LD A,SYS_PORT.BIOS OUT (SYS_PORT.RAM),A ; LD A,ACEX.Config_PG.Sp2000_SoftSetUp LD BC,BIOS.RST_CONF.CUSTOM RST ToBIOS ; CALL RESTORE_ALL ; .loop: LD BC,Dss.Exit RST ToDSS JR .loop ;--------------------------------------- ;----[LP_OPEN_S]------------------------ ; Открытие стандартных окон ; LD HL,#5104 ; LD E,0 ; win_flag - флаги окна: ; ; bit 0 определяет страницу режима, которая будет ; ; открыта после исполнения функции ; LD B,4 ; 4 - спектрумовское окно, HL - положение окна ; LD C,BIOS.LP_OPEN_S ; RST ToBIOS ; ;--------------------------------------- ; SP_SAVE1: ; LD SP,0 ; EXX ; POP HL ; EXX ; POP IX ; POP IY ; EI ; RET ;======================================= ; SET_PAL_x: IN A,(FastRAM.OFF) CALL SET_PAL IN A,(FastRAM.ON) RET SET_PAL: ;----[PIC_SET_PAL Установка палитры]---- ; Значение регистров на входе: ; C=0A4h ; HL - данные палитры: ; список цветов по четыре байта B,G,R,Y ; E - номер начального цвета ; D - количество устанавливаемых цветов ; B - маска при установке палитры. ; Для нормального режима должнa ; быть 0FFh ; A - номер палитры 0..15; ; от 8 до 15 - резервные IN A,(SLOT3) PUSH AF PalitrePage+1: LD A,#FF OUT (SLOT3),A LD HL,#C000 LD DE,0 LD A,0 LD B,#FF LD C,BIOS.PIC_SET_PAL ; установка палитры RST ToBIOS ;DI LD HL,#C000 LD DE,0 LD A,1 LD B,#FF LD C,BIOS.PIC_SET_PAL ; установка палитры RST ToBIOS ;DI POP AF OUT (SLOT3),A RET ; ;---[очистка экрана стеком и акселем]--- CLEAR_GRAF_SCR: IN A,(SLOT3) PUSH AF LD (SPSave2),SP LD A,#50 OUT (SLOT3),A XOR A OUT (PORT_Y),A LD SP,#C040 + 640 LD B,640/4 ;!!!!!!!!!!![оптимизировать]!!!!!!!!!!!! LOOP_CLS: ACC_SetBlockSize LD E,0 LD D,E ACC_FillScreenOneByte PUSH DE PUSH DE ACC_Off DJNZ LOOP_CLS ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SPSave2+1: LD SP,0 POP AF OUT (SLOT3),A RET ;----------------------------------------------------------------------; ; FOR ZX-ROM in SLOT0 ; _2L_PRIKOL: ; LD A,7 ; OUT (BorderColor),A ; XOR A ; OUT (PORT_Y),A ; LD A,2 ; LD HL,#4000 ; LD B,27 ; CALL .pause_loop ; LD A,0 ; LD HL#4000 ; LD B,27 ; CALL .pause_loop ; CALL #0D6B ; CLS ; LD HL,.TXT_SP ; CALL PRINT_LOOP ; RET ; .pause_loop: ; LD (HL),A ; INC L ; PUSH DE ; POP DE ; JR NZ,.pause_loop ; INC H ; DJNZ .pause_loop ; ; ; LD HL,#8000 ; .loop: PUSH HL ; POP HL ; DEC HL ; LD A,H ; OR L ; JR NZ,.loop ; RET ; .PRINT_LOOP: ; LD A,(HL) ; INC HL ; CP #FF ; RET Z ; RST #10 ; JR .PRINT_LOOP ; .TXT_SP: DB #7F," 1982 Sinclair Research Ltd.",#FF ;----------------------------------------------------------------------; ; FLAG: DB 0 ;SAVE_PORT_Y: DB 0 ; ; CLEAR_COVOX: LD A,#80 CLEAR_COVOX_X: LD BC,CBL.COVOX_OUT CLEAR_CBL: OUT (C),A DJNZ CLEAR_CBL RET ; ; CLEAR_SP_PAL: IN A,(SLOT3) PUSH AF ; LD A,#50 OUT (SLOT3),A ; LD B,61 .LOOP_PAL_ALL: PUSH BC LD BC,PORT_Y .LOOP_PAL_C: OUT (C),B .RESES_ADR+1: LD HL,#C3F0 ; LD D,16 ; .LOOP_PAL_D: LD A,(HL) RRA RRA RRA RRA RRA AND 7 INC A LD E,A LD A,(HL) SUB E JR NC,.NO_Z XOR A .NO_Z: LD (HL),A INC L DEC D JR NZ,.LOOP_PAL_D ; CALL SOUND1 DJNZ .LOOP_PAL_C ; CALL PAUSE_INT ; POP BC LD A,(LAST_KEY) AND A JR NZ,.NO_PAL_EXE DJNZ .LOOP_PAL_ALL .NO_PAL_EXE: POP AF OUT (SLOT3),A RET ; ; ; MAIN: CALL INIT_TABLE RET C ; IN A,(PORT_Y) ; LD (SAVE_PORT_Y),A LD A,#C0 OUT (PORT_Y),A CALL RECALC_MAP RET C ; нужно ли???!!! ;----!!!!!!!!!!!!!!!!!!!!!!!!!---------- ;--------------------------------------- XOR A LD (LAST_KEY),A OUT (BorderColor),A CALL CLEAR_SP_PAL ; !FIXIT переделать логику под новый биос? ;---[установка синхры, очистка экрана]-- LD A,2 ; режим Pentagon - 320 строк в экране LD C,BIOS.FN_SYNC RST ToBIOS ;--------------------------------------- ;------[Открытие стандартных окон]------ ; регистр E - флаги окна ; бит 0 - какую страницу режима включать ; после исполнения функции ; бит 4 - на какой странице режима ; открывать окно ; HL - место на экране по знакоместам ; (копия в IX+2,3), в новых версиях ; биоса значение HL не существенно LD HL,#4000 LD E,1 LD B,8 ; графическое окно 0, HL - положение окна LD C,BIOS.LP_OPEN_S RST ToBIOS LD HL,#5000 LD E,1 LD B,9 ; графическое окно 1, HL - положение окна LD C,BIOS.LP_OPEN_S RST ToBIOS /* LD A,Dss.SetVMod.grf320x256 LD BC,Dss.SetVMod.Screen_0 RST ToDSS LD A,Dss.SetVMod.grf320x256 LD BC,Dss.SetVMod.Screen_1 RST ToDSS ;графическое окно 0 PIC_320X256_1: DB 40,32,0,0,32,0,08,0 DB 40,32,0,0,96,0,48,0 DB 40,32,0,0,32,0,00,0 ;4 DB 40,32,0,0,96,0,40,0 ;6 ;графическое окно 1 PIC_320X256_2: ; 320x256. графическое, 0-й экран TAB_320x256_0 ; 320x256. графическое, 1-й экран TAB_320x256_1 */ ;--------------------------------------- LD A,1 OUT (SCREEN_SWITCH),A ;----[переброс части кода в FastRAM]---- IN A,(SLOT3) PUSH AF D2_FRAM_page+1: LD A,#FF OUT (SLOT3),A IN A,(FastRAM.ON) LD HL,#C000 LD DE,#1000 LD BC,D2_fram_END-TRACE LDIR ; IFN NORM_syncPORT ; IM 2 ; вот теперь можно включать ; ENDIF POP AF OUT (SLOT3),A ;--------------------------------------- ; LD HL,#C3E0 LD (CLEAR_SP_PAL.RESES_ADR),HL ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; Странное место. Можно же сразу в коде ; было это сделать и не перекидывать LD HL,PAUSE_SNDC LD DE,PAUSE_SND LD BC,3 LDIR ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CALL CLEAR_COVOX IN A,(FastRAM.OFF) CALL INIT_HDD_WORK IN A,(FastRAM.ON) SOUND_SWITCH: LD HL,NAMES+1 LD A,(HL) INC A LD (HL),A DEC HL CP (HL) JR NZ,SOUND_S1 LD A,0 INC HL LD (HL),A SOUND_S1: RLCA RLCA RLCA RLCA ; ADD A,low (NAME1) LD E,A LD A,0 RLA ADD A,high (NAME1) LD D,A CALL SET_SND_FILE CALL INIT_SOUND MORE_PIC: LD HL,#0100 LD (X_SPEED),HL LD HL,#0102 LD (Y_SPEED),HL LD HL,#0200 LD (A_SPEED),HL HELP_2: CALL CLEAR_SP_PAL LD A,6 CALL SET_PICTURE CALL SCR_SWITCH LD A,6 CALL PIC_ALL_MD LD A,11 CALL PIC_ALL_MD LD A,16 CALL PIC_ALL_MD MORE_PIC_LK: LD A,21 CALL SET_PICTURE CALL SCR_SWITCH CALL SET_PAL_x LD B,240 PAUS_START: DEC B JR Z,DM_LOOP CALL PAUSE_INT LD A,(LAST_KEY) AND A JR Z,PAUS_START LD B,0 LD C,A XOR A LD (LAST_KEY),A LD A,C CP 118 JR Z,MORE_PIC CP 22 JR Z,DM_LOOP CP 38 JR Z,SOUND_SWITCH CP 9 JP Z,RETURN_POINT ; CP 76 ; JP Z,RETURN_POINT CP 5 JP Z,HELP_ JR PAUS_START HELP_: CALL FIRE_X LD HL,#0300 LD (X_SPEED),HL LD HL,#0382 LD (Y_SPEED),HL LD HL,#0500 LD (A_SPEED),HL JR DM_LOOP ;SWITCH_XX_W: ; LD HL,XX_W1 ; LD DE,XX_W2 ; LD B,3 ;SWITCH_XX_W1: ; LD A,(DE) ; LD C,(HL) ; LD (HL),A ; LD A,C ; LD (DE),A ; DJNZ SWITCH_XX_W1 ; RET PIC_ALL_MD: CALL SET_PICTURE CALL SCR_SWITCH CALL SET_PAL_x CALL CLEAR_SP_PAL RET DM_LOOP: LD A,(LAST_KEY) CP 118 JP Z,MORE_PIC_LK ; CP 37 ; CALL Z,SWITCH_XX_W ; CALL CRAZY_WALL ;DI ; CALL SET_PAL_x ; CALL FIRE_S CALL SOUND CALL CALC_NEW_PLACE CALL MAP_PLACE CALL MAKE_MAP ; соорудить относительную карту CALL SOUND CALL PRECALC_PLACE CALL SOUND CALL TRACE ; прорисовка! CALL SOUND ; CALL MONSTR_OUT CALL MONSTR_ALL CALL SOUND CALL WEAPON_OUT CALL SOUND CALL MAP_OUT CALL CLEAR_Z_BUFER LOOP_SCR: IN A,(SCR_SyncPort) BIT 5,A JR NZ,CONT_WORK CALL SOUND JR LOOP_SCR CONT_WORK: CALL SCR_SWITCH CALL SOUND JP DM_LOOP SCR_SWITCH: IN A,(SCREEN_SWITCH) AND 1 XOR 1 OUT (SCREEN_SWITCH),A LD DE,#C040 JR Z,SET_1 LD DE,#C180 SET_1: LD (SCREEN_1),DE RET PAUSE_INT: CALL SOUND1 IN A,(SCR_SyncPort) BIT 5,A JR NZ,PAUSE_INT PAUSE_INT1: CALL SOUND1 IN A,(SCR_SyncPort) BIT 5,A RET NZ JR PAUSE_INT1 PAUSE_SNDC: JP SOUND PAUSE_SND: SOUND1: RET NOP NOP RET ; MONSTR_DAT: M_PAGE EQU $-MONSTR_DAT DB 0 ; страница с общими данными монстра (картинки) ; признак конца таблицы монстров M_ADR EQU $-MONSTR_DAT DW #4000 ; адрес в странице ; M_HIGH EQU $-MONSTR_DAT DB #40 ; вертикальное положение ; M_HOR EQU $-MONSTR_DAT DW 160 ; горизонтальное положение ; M_VAR2 EQU $-MONSTR_DAT DW 0008 ; счетчик переключений ; M_XADD EQU $-MONSTR_DAT DW #0100 ; x-add параметры DB #40,#40 ; ширина-высота ??? ; M_X EQU $-MONSTR_DAT DW #0700 ; координата X ; M_Y EQU $-MONSTR_DAT DW #0700 ; координата Y ; M_VX EQU $-MONSTR_DAT DW 0000 ; скорость движения по X ; M_VY EQU $-MONSTR_DAT DW 0000 ; скорость движения по Y ; M_TYPE EQU $-MONSTR_DAT DW 0000 ; тип монстра уничтожаемый, неуничтожаемый ; исчезающий при ударе о стенку, не исчезающий ; исчезающий при соприкосновении с игроком, ; не исчезающий.... M_VAR EQU $-MONSTR_DAT DB 0 ; Переменные конкретного монстра ; M_VAR3 EQU $-MONSTR_DAT DB 0 ; Переменная монстра бит 0,1 - деление по ширине ; bit 2 - переключать по старшему ; bit 3 - ; bit 4 ; bit 5 ; bit 6 - показывать один цикл ; bit 7 - не выводить ; M_VAR4 EQU $-MONSTR_DAT DB 0 ; Переключение монстра ADD параметр MONSTR_D_LEN EQU $-MONSTR_DAT ;следующий монстр DB 0 ; - отсутствует ; ;**************************************** ; IX+0 - страница стенки ; IX+1,2 - адрес стенки в странице ; IX+3 - положение по вертикали - задает масштаб ; IX+4,5 - положение по горизонтали ; IX+6,7 - reserved ; IX+8,9 - X-add-parameter (коэфициент масштабирования по Y) ; IX+10 - реальная ширина стенки ??? ; IX+11 - реальная высота стенки ??? WALL_DATS: DB 0 DW #4000 DB #40 DW #00A0 ; 160 DB 0,0 MONSTR_DATS: DB 0,0,0,0,0,0,0,0 ; ; ************************************** ; ;CAT_PAGE EQU 15 EFF_PAGE: DB #FF PAGE_M_PLACE: DB #FF FIRE_PAGE: DB #FF BAR_PAGE: DB #FF BFGF_PAGE: DB #FF MONSTR_END_T: DW MONSTR_TABLE ;======================================================================= ;======================================================================= INCLUDE 'Music_4x.asm' ;======================================================================= ;======================================================================= SKY_1: DB #FF SKY_2: DB #FF PAGE_WEAPON: DB #FF ;*************************************** ;*************************************** MADE_FFING: LD C,SLOT3 IN B,(C) OUT (C),A LD HL,#C000 NEXT_BYTE_: LD A,(HL) CP #F7 JR NZ,NO_FFING LD (HL),0FFH NO_FFING: INC HL BIT 7,H ;!!!!!проверка на конец страницы #C000-FFFF!!!!! JR NZ,NEXT_BYTE_ OUT (C),B RET ;*************************************** INIT_TABLE: ;----[GET_RAMD_ST]---------------------- ; получение идентификатора блока, ; назначенного на RAM-Disk ; ;----[Читаем первый блок таблиц E:]-----; Tables disk Doom.trd ;--------------------------------------- !!!!! Заменить к чертям на свою подгрузку блоками! LD A,(RAMBlkIDs.resources) LD HL,TABLE_MAIN ld c,BIOS.GetMemBlkPages ; получить список страниц блока A rst ToBIOS RET C ; LD HL,TABLE_MAIN ; INC HL ; INC HL ; INC HL ; !TODO Это говно надо оптимизировать и раскидывать номера страниц сразу в код LD A,(TABLE_MAIN+3) ;!HARDCODE LD (PAGE_WEAPON),A ; INC HL ;LD A,(HL) LD A,(TABLE_MAIN+4) ;!HARDCODE LD (SKY_1),A ;INC HL LD A,(TABLE_MAIN+5) ;!HARDCODE ;LD A,(HL) LD (SKY_2),A ; LD HL,TABLE_MAIN+26 ;LD A,26 ;!HARDCODE ;ADD A,L ;LD L,A LD A,(HL) LD (WALL_DATS),A ; LD DE,MONSTR_DATS LD B,7 NEXT_HL_FFING: LD A,(HL) LD (DE),A PUSH HL PUSH DE PUSH BC CALL MADE_FFING ; замена FF-ами прозрачных цветов POP BC POP DE POP HL INC HL INC DE DJNZ NEXT_HL_FFING LD A,(MONSTR_DATS) LD (MONSTR_DAT+M_PAGE),A LD A,(MONSTR_DATS+5) LD (FIRE_PAGE),A LD A,(MONSTR_DATS+6) LD (BAR_PAGE),A ;LD HL,TABLE_MAIN ;LD A,35 ;ADD A,L ;LD L,A LD A,(TABLE_MAIN+35) LD (BFGF_PAGE),A CALL MADE_FFING LD A,(PAGE_WEAPON) CALL MADE_FFING ;LD HL,TABLE_MAIN ;LD A,33 ;ADD A,L ;LD L,A LD A,(TABLE_MAIN+33) LD (EFF_PAGE),A ; звук выстрела ; LD HL,TABLE_MAIN ; LD A,34 ; ADD A,L ; LD L,A LD A,(TABLE_MAIN+34) LD (PAGE_M_PLACE),A ; таблица с углами для монстров ;--_[Читаем четвёртый блок таблиц H:]---; Tables disk my_tab*.* /* LD A,3 ;2 ; походу, карта уровня и ещё что-то LD C,0CEH ; получить идентификатор блока от рамдиска RST ToBIOS ret c ;--------------------------------------- */ ld a,(RAMBlkIDs.d2_table) LD HL,TABLE_TRACE ld c,BIOS.GetMemBlkPages ; получить список страниц блока A rst ToBIOS RET C LD A,B ; CP 33 CCF RET C ;CP 32 ;SCF ;RET NZ ; ; ;----[Читаем третий блок таблиц G:]-----; Tables disk mapw*.d2 /* LD A,2 ;1 ; рамдиск стенок LD C,0CEH ; получить идентификатор блока от рамдиска RST ToBIOS ret c ;--------------------------------------- */ ld a,(RAMBlkIDs.map_wall) LD HL,TABLE_WALL ld c,BIOS.GetMemBlkPages ; получить список страниц блока A rst ToBIOS RET C LD A,B CP 17 CCF RET C ; B - размер рамдиска DEC A LD (MAP_ELS),A ; число стенок ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /* XOR A LD (TABLE_PIC),A RET */ ;----[Читаем первый блок таблиц F:]-----; Tables disk *.XXX - файл скриншота 81920 байт /* LD A,4 LD C,BIOS.GET_RAMD_ST RST ToBIOS JR NC,1F */ XOR A LD (TABLE_PIC),A AND A RET /* 1: LD HL,TABLE_PIC LD C,BIOS.GetMemBlkPages ; получить список страниц блока RST ToBIOS AND A RET ; ;!!!!!!!сделать сохранение скриншотов ; LD A,4 ; LD C,BIOS.GET_RAMD_ST ; получить идентификатор блока от рамдиска ; RST ToBIOS ; AND A ; JR NZ,PIC_FOR_SAVE ; XOR A ; LD (TABLE_PIC),A ; AND A ; RET ; ;PIC_FOR_SAVE: ; LD HL,TABLE_PIC ; LD C,BIOS.GetMemBlkPages ; получить список страниц блока A ; RST ToBIOS ; XOR A ; RET */ ;*************************************** BLOCK #8700-$,0 ;ВЫРАВНИВАНИЕ ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; тут выравнивание на 0 в младшем ; бите адреса TABLE_MAIN: DS 37 ; буфер под страницы файла resurses.res +1 TABLE_PIC: DS 6 ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;-------[загрузка ресурсов игры]-------- Load_Resources: in a,(SLOT3) ld (.SavePage),a LD HL,RAMBlkIDs LD DE,FilesTBL LD B,FilesTBL.END .LR_loop: PUSH BC ;++счётчик PUSH HL ;++буфер под BlockID ex de,hl ld b,(hl) ; FilesTBL inc hl ld (.FileName),hl ; B - размер блока в страницах ld c,Dss.GetMem rst ToDSS ; A - идентификатор блока памяти pop hl ;--буфер под BlockID ld (hl),a inc hl push hl ;++буфер под BlockID ; A - идентификатор блока ld hl,Temp_Buffer ld c,BIOS.GetMemBlkPages rst ToBIOS ; B - число страниц в блоке ; HL - адрес буфера, в буфере список ; физических страниц по порядку, ; заканчивающийся байтом 0FFh push hl ;++буфер со списком страниц push bc ;++сколько страниц грузим .FileName+1: ld hl,0 ld a,1 ld c,Dss.Open rst ToDSS ld (.TempFileID),a pop bc ;--сколько страниц грузим pop hl ;--буфер со списком страниц ;---[читаем] .readloop: ld a,(hl) out (SLOT3),a inc hl push hl ;++буфер со списком страниц push bc ;++сколько страниц грузим .TempFileID+1: ld a,#FF ; файловый манипулятор LD HL,#C000 ; адрес в памяти LD DE,#4000 ; количество читаемых байт LD C,Dss.Read RST ToDSS ;DI pop bc ;--сколько страниц грузим pop hl ;--буфер со списком страниц DJNZ .readloop ;---[] ;---[закрываем] ld a,(.TempFileID) ld c,Dss.Close rst ToDSS ;---[] ld de,(.FileName) ld hl,13 add hl,de ex de,hl POP HL ;--буфер под BlockID POP BC ;--счётчик DJNZ .LR_loop ;-[разобраться с таблицами!!!]- ld hl,TABLE_X_file ld a,1 ld c,Dss.Open rst ToDSS push af LD HL,TABLE_X ; адрес в памяти LD DE,TABLE_X_SIZE ; количество читаемых байт LD C,Dss.Read rst ToDSS pop af ld c,Dss.Close rst ToDSS ; ld hl,MONSTR_TABLE_file ; ld a,1 ; ld c,Dss.Open ; rst ToDSS ; push af ; LD HL,MONSTR_TABLE ; адрес в памяти ; LD DE,MONSTR_TABLE_SIZE ; количество читаемых байт ; LD C,Dss.Read ; rst ToDSS ; pop af ; ld c,Dss.Close ; rst ToDSS ;di ;------------------------------ .SavePage+1: ld a,0 out (SLOT3),a ; ; LD HL,CURRENT_DIR ; LD C,Dss.CurDir ; RST ToDSS ; LD C,Dss.CurDisk RST ToDSS LD (INIT_HDD_WORK.currentDisk),A ; RET ;Temp_Buffer: BLOCK 256,#FF TABLE_X_file: db 'table_x.tbl',0 ;MONSTR_TABLE_file: db 'monsters.tbl',0 ;-------[Таблица загрузки файлов]------- ; длина в страницах 01 байт ; имя файла 13 байт ; если имя файла < 12 символов, ; то добить нулями до 12 FilesTBL: DZ 36,'resource.res' ;0 Disk E: DZ 16,'map_wall.res' ;1 DZ 32,'d2_table.tbl' ;2 DZ 01,'d2_fram.bin',0 ;3 .END EQU ($-FilesTBL)/14 ; количество файлов RAMBlkIDs: BLOCK FilesTBL.END,0 .resources EQU RAMBlkIDs+0 .map_wall EQU RAMBlkIDs+1 .d2_table EQU RAMBlkIDs+2 .d2_fram EQU RAMBlkIDs+3 ;--------------------------------------- ; DS #8B00-$ ;ВЫРАВНИВАНИЕ RECALC_MAP: ; пересчет карты на реальные номера ; страниц стенок LD IX,MONSTR_TABLE LD HL,#4000 IN A,(SLOT1) PUSH AF LD A,(TABLE_WALL) OUT (SLOT1),A LD A,(HL) CP '1' JR NZ,NO_PROCESS RECALC_X: LD IX,MONSTR_TABLE RECALC_M2: LD A,(HL) ; код стенки BIT 4,H JR Z,NO_PRP ; проверить, какую таблицу пересчитываем BIT 5,H JR Z,NO_PRP ; если не 4-ю, то идти дальше, иначе ; - это таблица препрятствий RECALC_M2X: LD A,(HL) ; код стенки CP 'S' ; #53 JR Z,ZERO_PRP SUB ' ' JR Z,ZERO_PRP LD A,#5F ; препятствие JR ONE_PRP ZERO_PRP: XOR A ONE_PRP: LD (HL),A INC L JR NZ,RECALC_M2X INC H LD A,H AND #0F JR NZ,RECALC_M2X JR NO_PROCESS ; закончить ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; Сделать условие на максимальное кол-во ; "монстров" при заполнении таблицы по ; LDIR в процедуре MONSTR_POS, чтоб не ; залезть на стек или дальше страницы. ; MAX_IX < (ST_Point-MaxStackSize-MONSTR_D_LEN) ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NO_PRP: LD A,(HL) ; код стенки CP 'S' ; место старта? CALL Z,START_POS CP 'M' ; монстр CALL Z,MONSTR_POS CP 'N' ; огни CALL Z,MONSTR_POS1 CP 'O' ; бочки CALL Z,MONSTR_POS2 CP 'P' ; огонь bfg CALL Z,MONSTR_POS3 SUB #20 JR Z,ZERO_WOLL SUB #10 JR C,ZERO_WOLL MAP_ELS+1: CP 15 ; JR NC,ZERO_WOLL PUSH HL PUSH BC LD HL,TABLE_WALL INC A LD C,A LD B,0 ADD HL,BC LD A,(HL) ; LD A,(TABLE_WALL+1) POP BC POP HL JR NO_ZERO_W ZERO_WOLL: XOR A ; забивать нулями BIT 4,H JR NZ,NO_ZERO_W DEC A ; забивать FF-ами NO_ZERO_W: LD (HL),A INC L JR NZ,NO_PRP INC H LD A,H AND #0F JR NZ,NO_PRP LD A,H CP #50 JR NZ,NO_ST LD (MONSTR_END_T),IX ; конец таблицы монстров NO_ST: LD A,H CP #80 JR NZ,RECALC_X NO_PROCESS: POP AF OUT (SLOT1),A AND A RET START_POS: PUSH HL PUSH AF ADD HL,HL ADD HL,HL LD A,L ; ADD A,A ; ADD A,A ADD A,2 LD (X_COORD+1),A ; RL L ; RL H ; RL L ; RL H LD A,H ADD A,A ADD A,A ADD A,2 LD (Y_COORD+1),A POP AF POP HL RET MONSTR_POS1: ; факелы CALL MONSTR_POS PUSH AF LD A,(FIRE_PAGE) LD (IX-MONSTR_D_LEN+M_PAGE),A LD A,6 ; делить ширину на 4 и переключать по ; старшему адресу LD (IX-MONSTR_D_LEN+M_VAR3),A LD A,10h LD (IX-MONSTR_D_LEN+M_VAR4),A LD A,0 LD (IX-MONSTR_D_LEN+M_VAR2),A ; гореть быстрее всех POP AF RET MONSTR_POS2: ; бочки CALL MONSTR_POS PUSH AF LD A,(BAR_PAGE) LD (IX-MONSTR_D_LEN+M_PAGE),A LD A,5 ; делить ширину на 2, переключать ; по старшему адресу LD (IX-MONSTR_D_LEN+M_VAR3),A LD A,20h LD (IX-MONSTR_D_LEN+M_VAR4),A LD A,4 LD (IX-MONSTR_D_LEN+M_VAR2),A ; гореть быстрее всех POP AF RET MONSTR_DELET: ; удаление монстра ; IX - на удаляемом монстре PUSH IX PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX ; куда кидать POP DE LD HL,MONSTR_D_LEN ADD HL,DE ; откуда кидать LOOP_DEL: LD A,(HL) ; признак наличия монстра AND A JR Z,NO_LDIR LD BC,MONSTR_D_LEN LDIR ; перекинут один монстр JR LOOP_DEL NO_LDIR: LD (MONSTR_END_T),DE XOR A LD (DE),A POP AF POP BC POP DE POP HL POP IX RET MONSTR_BFG_INS: ; вставить в таблицу монстров ; RET PUSH IX PUSH AF PUSH HL PUSH DE ; огненный шар FIRE LD IX,(MONSTR_END_T) ; взять конец таблицы монстров CALL MONSTR_POS ; инициализировать нового монстра CALL MONSTR_F_INI ; для огня LD A,(X_COORD+1) ; координаты совпадают с игроком LD (IX-MONSTR_D_LEN+M_X+1),A LD A,(Y_COORD+1) LD (IX-MONSTR_D_LEN+M_Y+1),A LD HL,(ANGLE_R) ; угол поворота игрока ADD HL,HL ADD HL,HL ADD HL,HL ; x8 LD A,H AND 3Eh LD L,A LD H,0 LD DE,TAB_ANGLE3+03Eh ; взять из таблицы по направлению EX DE,HL SBC HL,DE ; скорость для FIRE LD A,(HL) LD (IX-MONSTR_D_LEN+M_VX+1),A LD (IX-MONSTR_D_LEN+M_VX),0 INC HL LD A,(HL) LD (IX-MONSTR_D_LEN+M_VY+1),A LD (IX-MONSTR_D_LEN+M_VY),0 LD (MONSTR_END_T),IX ; сохранить новый конец POP DE POP HL POP AF POP IX RET MONSTR_POS3: CALL MONSTR_POS MONSTR_F_INI: PUSH AF LD A,(BFGF_PAGE) LD (IX-MONSTR_D_LEN+M_PAGE),A LD A,8 ; шар огня, исчезающий от препятствия LD (IX-MONSTR_D_LEN+M_VAR3),A LD A,10h LD (IX-MONSTR_D_LEN+M_VAR4),A LD A,0 LD (IX-MONSTR_D_LEN+M_VAR2),A ; гореть быстрее всех LD A,-4 LD (IX-MONSTR_D_LEN+M_VX+1),A POP AF RET MONSTR_POS: ; монстры ; правильно ли проставляются координаты ; после LDIR, а не до него??? PUSH HL ; копирование таблицы монстра PUSH DE PUSH BC PUSH IX POP DE LD HL,MONSTR_DAT LD BC,MONSTR_D_LEN LDIR POP BC POP DE POP HL PUSH DE PUSH HL PUSH AF ADD HL,HL ADD HL,HL LD A,L ADD A,2 LD (IX+M_X+1),A LD A,H ADD A,A ADD A,A ADD A,2 LD (IX+M_Y+1),A LD DE,MONSTR_D_LEN ADD IX,DE LD (IX),0 ; очередной конец таблицы POP AF POP HL POP DE RET ; ;*********************************************************************** ;*********************************************************************** SET_HOME_PATH: LD C,(HL) LD B,0 INC BC INC BC INC BC ADD HL,BC ; указатель на полный путь до файла запуска LD A,(HL) PUSH HL SUB 'A' LD C,Dss.ChDisk RST ToDSS ; POP HL INC HL INC HL LD D,H LD E,L LD BC,128 XOR A CPIR LD A,'\' ; LD BC,128 CPDR LD A,(HL) CP ':' JR Z,.it_is_root ; INC HL LD (HL),0 EX DE,HL LD C,Dss.ChDir ; переход в каталог DOOM2 на всякий случай RST ToDSS .it_is_root: RET ;*********************************************************************** SAVE_PAL: IN A,(SLOT2) PUSH AF OUT (SLOT3),A ; LD HL,Pal_Restore_Buffer+#4000 LD DE,0 LD A,4 LD C,BIOS.PIC_GET_PAL RST ToBIOS ; ; LD HL,Pal_Restore_Buffer+#4000 + 1024 ; LD DE,0 ; LD A,5 ; LD C,BIOS.PIC_GET_PAL ; RST ToBIOS ; ; ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024 ; LD DE,0 ; LD A,6 ; LD C,BIOS.PIC_GET_PAL ; RST ToBIOS ; ; ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024+1024 ; LD DE,0 ; LD A,7 ; LD C,BIOS.PIC_GET_PAL ; RST ToBIOS ; POP AF OUT (SLOT3),A RET ;*********************************************************************** RESTORE_PAL: ; IN A,(SLOT2) PUSH AF OUT (SLOT3),A ; LD HL,Pal_Restore_Buffer+#4000 LD DE,0 LD A,4 LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры RST ToBIOS ; ; LD HL,Pal_Restore_Buffer+#4000 + 1024 ; LD DE,0 ; LD A,5 ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры ; RST ToBIOS ; ; ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024 ; LD DE,0 ; LD A,6 ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры ; RST ToBIOS ; ; ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024+1024 ; LD DE,0 ; LD A,7 ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры ; RST ToBIOS ; POP AF OUT (SLOT3),A RET ;*********************************************************************** ;!TODO тут не проверяется режим 80 или 40 SAVE_TXT_SCREEN: LD C,BIOS.LP_GET_PLACE RST ToBIOS LD (LOAD_TXT_SCREEN.CURS),DE LD IX,#4000 + TXT_SCREEN LD HL,#2050 ; #2028 ; ; LD (LOAD_TXT_SCREEN.SVHL1),HL LD DE,#0000 IN A,(SLOT2) LD B,A LD C,BIOS.WIN_COPY JP ToBIOS LOAD_TXT_SCREEN: LD IX,#4000 + TXT_SCREEN .SVHL1+1: LD HL,#2050 ; #2028 LD DE,#0000 IN A,(SLOT2) LD B,A LD C,BIOS.WIN_RESTORE RST ToBIOS ; .CURS+1: LD DE,#0000 LD C,Dss.Locate JP ToDSS ;*********************************************************************** RESTORE_ALL: LD A,1 LD HL, %0000'0100'0000'0000 ; значение LD DE, %1111'1110'0110'1111 ; маска LD BC,0*256 + BIOS.DCP_CONFIG RST ToBIOS ; ;LD B,3 ; 3 - установка CGA палитры ;LD C,BIOS.SET_PAL_INIT ; номер функции ;RST ToBIOS ; установка палитры ; LD A,Dss.SetVMod.txt80x32 LD BC,Dss.SetVMod.Screen_0 RST ToDSS LD A,Dss.SetVMod.txt80x32 LD BC,Dss.SetVMod.Screen_1 RST ToDSS ; CALL RESTORE_PAL ; LD DE,0 LD HL,#2050 LD BC,COLORS.CGA.INC.LGRAY*256 + BIOS.LP_CLS_WIN RST ToBIOS ; CALL LOAD_TXT_SCREEN ; RET ;*********************************************************************** ;*********************************************************************** ;---------------[Tables]---------------- ALIGN 2,0 ; TABLES_START: X_COORD: DW 90*256 Y_COORD: DW 90*256 ANGLE_A: DW -160*32+#C000 ANGLE_R: DW 0 X_SPEED: DW #300 Y_SPEED: DW #302 A_SPEED: DW #200 TABLE_TRACE: BLOCK 33,0 ; таблица трассировки/банки таблицы TABLE_WALL: BLOCK 17,0 NAMES: DB 7,1 LAST_KEY: DB 0 NAME1: DB "_1X62 CBL " NAME2: DB "2NDREAL3CBL " NAME3: DB "_ICT2 CBL " NAME4: DB "5EL CBL " NAME5: DB "_UNNY2 CBL " NAME6: DB "94956C CBL " NAME7: DB "_ENI511CCBL " ; SND_DIR: DZ "MUSIC" ;Up_Dir: DZ ".." ; Loading_TXT: DZ "\r\nPlease wait, resources are loading..." ; ; IFN NORM_syncPORT ; im_handler_emul_proc_address: ; di ; push af ; call KBD_INT ; pop af ; reti ; BLOCK +(#FF - low $) ; im_handler_emulator: ; dw im_handler_emul_proc_address ; ENDIF ; OUTEND ; конец файла doom2.exe ;-----------------------------------------------------------------------; ;------------------------------------ ;CURRENT_DIR: BLOCK 257,0 ;------------------------------------ Pal_Restore_Buffer EQU $ ;Temp_Buffer + 256 Temp_Buffer EQU Pal_Restore_Buffer + 1024 + 1024 TXT_SCREEN EQU Temp_Buffer + 257 ; ; DISPLAY "DOOM2.EXE starts - ",/H,BEGIN DISPLAY "DOOM2.EXE ends - ",/H,$ DISPLAY "DOOM2.EXE size - ",/H,$-BEGIN ;FRAM_PROG_1000H: include 'D2_FRAM.asm' ;