/* ;------------[ПЕРЕДЕЛАТЬ!!!]------------ оптимизировать выделяемые блоки памяти проверка на ошибки при вызове DSS и BIOS ;--------------------------------------- */ DEFINE TEST_SCREEN 0 ScreenStartAddress EQU #C040 ;ScreenStartAddress EQU #C000 ; ;---------------------------[Defines section]--------------------------- DEFINE EXE_HEADER 1 ; VERSIONS MIN_VER: ; 1.70.887 .DSS_V EQU 1 ; Version .DSS_M EQU 70 ; Modification .DSS_B EQU 887 ; Build ; ; 2.55 .BIOS_V EQU 2 ; Version .BIOS_M EQU 55 ; Modification ;;;;;;; ; DEFINE MIN_DSS_VERSION MIN_VER.DSS_V*256 + MIN_VER.DSS_M ; DEFINE MIN_DSS_BUILD MIN_VER.DSS_B ; DEFINE MIN_BIOS_VERSION MIN_VER.BIOS_V*256 + MIN_VER.BIOS_M ; DEFINE TXT_DSS_VERSION ('0'+MIN_VER.DSS_V),\ ; '.',\ ; ('0'+MIN_VER.DSS_M/10),\ ; ('0'+MIN_VER.DSS_M-(MIN_VER.DSS_M/10)*10),\ ; '.',\ ; ('0'+MIN_VER.DSS_B/100),\ ; ('0'+(MIN_VER.DSS_B/10 - MIN_VER.DSS_B/100*10)),\ ; ('0'+(MIN_VER.DSS_B - MIN_VER.DSS_B/10*10)) ; ; DEFINE TXT_BIOS_VERSION '0'+MIN_VER.BIOS_V,\ ; '.',\ ; '0'+MIN_VER.BIOS_M/10,\ ; '0'+MIN_VER.BIOS_M-(MIN_VER.BIOS_M/10)*10 ;----------------------------------------------------------------------- ; ; ;-----------------------[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 ;--------[загрузка ресурсов игры]------- CALL CHECK_SYSTEM ; LD HL,MESSAGES_TXT.Loading LD C,Dss.PChars RST ToDSS ; CALL SAVE_ALL ; выполнено в виде костыльной заглушки CALL Load_Resources ;--------------------------------------- ;-----[Инициализация Covox-Blaster]----- ld bc,CBL.SYS_PORT ld a,CBL.Blaster + CBL.Mono + CBL.is8bit + CBL.Int_off + CBL.KHz_16old out (c),a ; ;-----------[заглушить звук]------------ CALL CLEAR_COVOX ;--------------------------------------- ; ;--------------------------------------- ; IN A,(SLOT3) ; PUSH AF ld a,(RAMBlkIDs.resources) ld (PalitrePage),a ld a,(RAMBlkIDs.d2_fram) ld (D2_FRAM_page),a ;----[;!FIXIT переделать музло на API 5x] ; Запрашиваем страницу для каталога ; сохраняем её № в коде ; ; ДОДЕЛАТЬ!!! ; надо потом нормально выделять и ; освобождать память, а не вот это всё ; ld b,1 ld c,Dss.GetMem rst ToDSS LD (CatPage),a ;----[] CALL CLEAR_GRAF_SCR 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 ; Активация Акселя масштабирования, обратно только через ресет LD BC,#0100 ; 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: IN A,(FastRAM.OFF) LD A,SYS_PORT.BIOS OUT (SYS_PORT.RAM),A ; LD A,ACEX.Config_PG.Sp2000_SoftRestartNow LD BC,BIOS.RST_CONF.CUSTOM RST ToBIOS ; CALL RESTORE_ALL ; LD HL,MESSAGES_TXT.NormExit LD C,Dss.PChars RST ToDSS ; .loop: LD B,0 .error: LD C,Dss.Exit RST ToDSS JR .loop ;-------------------------------------------------; ;-----------------------------------------------------------------------; 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,ScreenStartAddress + 640 LD B,640/4 ;!TODO ![оптимизировать]! ACC_SetBlockSize LD E,0 LD D,E LOOP_CLS: 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 LD BC,CBL.COVOX_OUT .CLEAR: OUT (C),A DJNZ .CLEAR 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 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 ;--------------------------------------- ;------[Открытие стандартных окон]------ ; регистр E - флаги окна ; бит 0 - какую страницу режима включать ; после исполнения функции ; бит 4 - на какой странице режима ; открывать окно ; HL - место на экране по знакоместам ; (копия в IX+2,3), в новых версиях ; биоса значение HL не существенно ; LD HL,#4000 LD E,0 LD BC,BIOS.LP_OPEN_S.Graf_0 ; графическое окно 0, HL - положение окна RST ToBIOS ; LD HL,#5000 LD E,1 LD BC,BIOS.LP_OPEN_S.Graf_1 ; графическое окно 1, HL - положение окна RST ToBIOS ;--------------------------------------- IF TEST_SCREEN ; CALL MAKE_SCR_ST1 ; ENDIF LD A,(RESTORE_ALL.scr) 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 ; 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,ScreenStartAddress JR Z,SET_1 LD DE,ScreenStartAddress + #0140 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 ; ;!TODO сделать сохранение скриншотов ; 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 ;--------------------------------------- ; BLOCK #8B00-$,0 ;ВЫРАВНИВАНИЕ 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: LD A,SYS_PORT.BIOS OUT (SYS_PORT.ON),A IN A,(FastRAM.ON) LD A,1 OUT (FastRAM.SLOT0),A ; LD A,#50 OUT (SLOT3),A XOR A OUT (PORT_Y),A ; LD DE,0 .loop: LD HL,#C3E0 LD BC,#20 LDIR IN A,(PORT_Y) INC A OUT (PORT_Y),A JR NZ,.loop ; XOR A OUT (FastRAM.SLOT0),A IN A,(FastRAM.OFF) XOR A OUT (SYS_PORT.OFF),A RET ;*********************************************************************** RESTORE_PAL: LD A,SYS_PORT.BIOS OUT (SYS_PORT.ON),A IN A,(FastRAM.ON) LD A,1 OUT (FastRAM.SLOT0),A ; LD A,#50 OUT (SLOT3),A XOR A OUT (PORT_Y),A ; LD HL,0 .loop: LD DE,#C3E0 LD BC,#20 LDIR IN A,(PORT_Y) INC A OUT (PORT_Y),A JR NZ,.loop ; XOR A OUT (FastRAM.SLOT0),A IN A,(FastRAM.OFF) XOR A OUT (SYS_PORT.OFF),A RET ;*********************************************************************** RESTORE_ALL: ; LD B,3 ; 3 - установка CGA палитры ; LD C,BIOS.SET_PAL_INIT ; номер функции ; RST ToBIOS ; установка палитры CALL RESTORE_PAL ; .mode+1: LD A,Dss.SetVMod.txt80x32 .scr+2: LD BC,Dss.SetVMod RST ToDSS ; LD BC,Dss.Lib_Sub.RestoreFont RST ToDSS ; LD A,(.mode) CP #80 RET NC ; .cursor+1: LD DE,0 LD C,Dss.Locate RST ToDSS LD C,Dss.WinRest JP TXT_Screen_Copy_Restore ; ;*********************************************************************** SAVE_ALL: CALL SAVE_PAL ; узнать видеорежим LD C,Dss.GetVMod RST ToDSS LD (RESTORE_ALL.mode),A LD A,B LD (RESTORE_ALL.scr),A ; если режим текстовый - сохранить окно LD A,(RESTORE_ALL.mode) CP #80 RET NC ; LD C,Dss.Cursor RST ToDSS LD (RESTORE_ALL.cursor),DE ; LD C,Dss.WinCopy ;JP TXT_Screen_Copy_Restore ;**************************** TXT_Screen_Copy_Restore: LD A,Dss.WinCopy SUB C PUSH AF PUSH BC CALL NZ,SCREEN_IN_CACHE ; LD A,(RESTORE_ALL.mode) SUB 2 LD DE,0 LD HL,#2050 JR NZ,.next LD L,#28 .next: IN A,(SLOT2) POP BC LD B,A LD IX,TXT_SCREEN RST ToDSS POP AF RET NZ ;DEC A ;JP SCREEN_IN_CACHE ;**************************** SCREEN_IN_CACHE: LD A,SYS_PORT.BIOS OUT (SYS_PORT.ON),A IN A,(FastRAM.ON) LD A,1 OUT (FastRAM.SLOT0),A ; LD HL,TXT_SCREEN LD DE,1024*8 ; размер палитры JR Z,.no_change EX DE,HL .no_change: LD BC,80*32*2 ; максимальный размер текстового экрана LDIR ; XOR A OUT (FastRAM.SLOT0),A IN A,(FastRAM.OFF) XOR A OUT (SYS_PORT.OFF),A RET ;*********************************************************************** CHECK_SYSTEM: _mCHECK_SYS_VERSIONS MIN_VER.DSS_V, MIN_VER.DSS_M, MIN_VER.DSS_B, MIN_VER.BIOS_V, MIN_VER.BIOS_M ;*********************************************************************** ;---------------[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" ; MESSAGES_TXT: .Loading: DZ "\r\nPlease wait, resources are loading...\r\n" .NormExit: DZ "DOOM 2 demo for DSS says goodbye to you...\r\n" ;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------; IF TEST_SCREEN MAKE_SCR_ST1: IN A,(SLOT3) PUSH AF LD A,#50 OUT (SLOT3),A LD A,1 OUT (PORT_Y),A LD HL,#C300 ; .big_loop: LD C,20 ; .mid_loop: LD B,16 LD DE,#C37C LD HL,#C33C ; .sml_loop: PUSH BC LDI LDI LD A,%0000'0110 LD (DE),A DEC HL DEC HL DEC DE DEC DE DEC DE DEC DE DEC DE DEC DE LDI LDI LD A,%0000'0100 LD (DE),A DEC HL DEC HL DEC HL DEC HL DEC HL DEC HL DEC DE DEC DE DEC DE DEC DE DEC DE DEC DE POP BC DJNZ .sml_loop ; IN A,(PORT_Y) INC A INC A OUT (PORT_Y),A DEC C JR NZ,.mid_loop ; IN A,(PORT_Y) AND #80 JR NZ,MAKE_SCR_ST2 LD A,#81 OUT (PORT_Y),A JR .big_loop ; MAKE_SCR_ST2: LD HL,#C300 .big_loop: EXX LD D,#4F ; 79 port_y line LD E,#27 ; 39 port_y line LD C,PORT_Y LD B,#14 ; счётчик EXX .mid_loop: EXX OUT (C),E EXX ; LD E,(HL) INC HL LD D,(HL) INC HL LD B,(HL) DEC HL DEC HL ; EXX OUT (C),D EXX ; LD (HL),E INC HL LD (HL),D INC HL LD (HL),B SET 0,(HL) ; EXX DEC D DEC D OUT (C),D EXX ; LD (HL),B DEC HL LD (HL),D DEC HL LD (HL),E ; EXX DEC D DEC D DEC E DEC E DEC B EXX JR NZ,.mid_loop ; EXX BIT 7,E EXX JR Z,.HZ ; EXX LD D,#CF ; 207 port_y line LD E,#A7 ; 167 port_y line LD C,PORT_Y LD B,20 ; счётчик EXX JR .mid_loop ; .HZ: INC HL INC HL INC HL INC HL LD A,L CP #80 JR NZ,.big_loop ; POP AF OUT (SLOT3),A RET ENDIF ;-----------------------------------------------------------------------; OUTEND ; конец файла doom2.exe ;-----------------------------------------------------------------------; ;------------------------------------ Temp_Buffer EQU $ 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' ;