diff --git a/D2_FRAM.asm b/D2_FRAM.asm index c3c23dc..9851071 100644 --- a/D2_FRAM.asm +++ b/D2_FRAM.asm @@ -149,15 +149,15 @@ ANGLE_M+1: TRACE_NEXT_: ; EXX - LD HL,(PLACE_L) ; текущее положение в таблице + LD HL,(PLACE_L) ; текущее положение в таблице INC HL LD A,(HL) LD (PLACE_L1),A LD (PLACE_L2),A EXX ; -PLACE_L EQU $+1 - LD A,(TABLE_TRACE+10) ; тонкое положение - положение в квадрате +PLACE_L+1: + LD A,(TABLE_TRACE+10) ; тонкое положение - положение в квадрате ; OUT (SLOT1),A LD (CONT_PAGE),A @@ -173,7 +173,7 @@ TRACE_LOOP: LD E,(HL) ; первый и далее следующий кубик LD A,(DE) ; есть или нет? AND A - JR NZ,TRACE_CONT ; если есть, рисовать!! + JR NZ,TRACE_CONT ; если есть, рисовать!! INC L ENDR @@ -204,8 +204,7 @@ TRACE_CONT: ; EXX EX AF,AF' ;номер стенки -PLACE_L1 EQU $+1 - LD A,5 +PLACE_L1+1: LD A,5 OUT (SLOT1),A ; следующее положение в таблице ; LD C,0 @@ -232,9 +231,7 @@ PLACE_L1 EQU $+1 LD A,(HL) ; взять немасштабированно! ACC_Off ; стенка в ОЗУ акселератора! - LD A,5 -PLACE_L2 EQU $-1 - +PLACE_L2+1: LD A,5 OUT (SLOT1),A ; следующее положение EXX ; @@ -291,8 +288,7 @@ HIGH_1: ; LD A,#06 ; цвет пола ; LD A,#5F ; цвет пола серый ; LD A,#CF ; цвет пола синий - LD A,#2F ; цвет пола темнокрасный -COLOR_LO EQU $-1 +COLOR_LO+1: LD A,#2F ; цвет пола темнокрасный ; ACC_FillScreenOneByte LD (DE),A ; рисовать пол @@ -314,7 +310,7 @@ COLOR_LO EQU $-1 ; NEG ; выводимый размер стенки ; стенка в акселераторе! ACC_SetBlockSize - LD (DE),A + LD (DE),A ;!!!!! прикольно ACC_CopyScreenBlock LD (DE),A ; положить стенку! ACC_Off @@ -334,8 +330,7 @@ NEXT_ANGLE: NO_TEST: ; - LD A,0 -CONT_PAGE EQU $-1 +CONT_PAGE+1: LD A,0 ; OUT (SLOT1),A @@ -360,8 +355,7 @@ CONT_PAGE EQU $-1 PUSH HL PUSH BC ; - LD A,#0F -CORNER_1 EQU $-1 +CORNER_1+1: LD A,#0F ; AND #0F RRCA @@ -392,13 +386,11 @@ CORNER_1 EQU $-1 TRACE_END: ; - LD A,0 -TRACE_RET_SLOT3 EQU $-1 +TRACE_RET_SLOT3+1: LD A,0 ; - OUT (SLOT3),A + OUT (SLOT3),A ; - LD A,5 -TRACE_RET_SLOT1 EQU $-1 +TRACE_RET_SLOT1+1: LD A,5 ; OUT (SLOT1),A LD A,0 @@ -483,7 +475,7 @@ SET_PICTURE: ENDIF ; ld bc,#0100 ; масштабирование - 1 - OUT (C),B + OUT (C),C LD DE,(SCREEN_1) LD B,5 ; 5 СТРАНИЦ @@ -491,7 +483,6 @@ SET_PICTURE: ACC_SetBlockSize LD A,0 ; по 256 байт ACC_Off - inc a ;!FIXIT костыль, иначе со счётчиком акселя что-то не так OUT (PORT_Y),A POP AF @@ -704,8 +695,8 @@ WEAPON_OUT: LD A,#58 OUT (SLOT3),A -WEAPON_SWITCH EQU $+1 - LD HL,#4500 ; положение спрайта оружия в странице +WEAPON_SWITCH+1: + LD HL,#4500 ; положение спрайта оружия в странице ; LD DE,(SCREEN_1) LD A,E @@ -723,7 +714,6 @@ WEAPON_SWITCH EQU $+1 LD BC,#100 W_OUT_L: - LD A,#44 SUB H OUT (PORT_Y),A @@ -874,7 +864,7 @@ MAP_LOOP_1: CP #50 JR Z,MAP_LOOP_2 - LD A,0 + XOR A OUT (PORT_Y),A POP AF @@ -890,47 +880,43 @@ MAP_LOOP_1: ;*************************************** ; -WALL: ; 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 - реальная высота стенки ??? - - - IN A,(SLOT3) - LD (SLOT3_RET1),A +WALL: IN A,(SLOT3) + LD (WALL_SLOT3_RET),A IN A,(SLOT1) - LD (SLOT1_RET1),A + LD (WALL_SLOT1_RET),A IN A,(PORT_Y) - LD (RGADR_RET1),A + LD (WALL_PORT_Y_RET),A LD A,#58 OUT (SLOT3),A - LD A,(IX+0) ; страница стенки + LD A,(IX+0) ; страница стенки OUT (SLOT1),A EXX - LD C,0 ; порт масштаба + LD C,0 ; порт масштаба - LD H,TABLE_X/256 ; таблица высот и коэфициентов масштабирования - LD L,(IX+3) ; положение по Y / определяет высоту - LD A,(HL) ; масштаб - LOW + LD H,TABLE_X/256 ; таблица высот и коэфициентов масштабирования + LD L,(IX+3) ; положение по Y / определяет высоту + LD A,(HL) ; масштаб - LOW AND 3 LD (X_ADD),A INC H - LD A,(HL) ; масштаб - HIGH + LD A,(HL) ; масштаб - HIGH LD (X_ADD2),A DEC H LD A,L ADD A,A - NEG ; ширина по горизонтали + NEG ; ширина по горизонтали BIT 0,(IX+M_VAR3) JR Z,NO_DEL2 @@ -946,13 +932,13 @@ NO_DEL2: NO_DEL4: EXX - LD B,A ; реальная ширина стенки??? -; LD B,(IX+10) ; ширина стенки + LD B,A ; реальная ширина стенки??? +; LD B,(IX+10) ; ширина стенки - LD C,0 ; X-start-LOW + LD C,0 ; X-start-LOW ; LD HL,(SCREEN_1) - LD E,(IX+4) ; - адрес по горизонтали + LD E,(IX+4) ; - адрес по горизонтали LD D,(IX+5) ; ADD HL,DE @@ -961,15 +947,15 @@ NO_DEL4: ; BIT 7,D ; JR Z,WALL_NO_SCF ; SCF -; EX AF,AF' ; спрятать в AF - параметр счетчика и флаг -; ; CF - стенка не дошла до края -; ; в A сколько линий до начала экрана +; EX AF,AF' ; спрятать в AF - параметр счетчика и флаг +; ; CF - стенка не дошла до края +; ; в A сколько линий до начала экрана ;WALL_NO_SCF: ; ; LD HL,140h ; AND A ; SBC HL,DE -; LD A,L ; в A - сколько линий осталось до конца экрана?? +; LD A,L ; в A - сколько линий осталось до конца экрана?? LD HL,(SCREEN_1) ADD HL,DE @@ -977,7 +963,7 @@ NO_DEL4: ; LD A,(IX+3) LD A,B RRA - AND #7F ; разделили на 2 + AND #7F ; разделили на 2 LD E,A ; SUB 128 ; LD E,A @@ -1064,11 +1050,11 @@ NO_WRITE_LINE: INC DE ; новое значение X LD A,C -X_ADD2 equ $+1 - ADD A,0 ; X-add-parameter 2 +X_ADD2+1: + ADD A,0 ; X-add-parameter 2 LD C,A -X_ADD equ $+1 - LD A,0 ; X-add-parameter +X_ADD+1: + LD A,0 ; X-add-parameter ADC A,H LD H,A ; следующая линия WOLL @@ -1076,14 +1062,14 @@ X_ADD equ $+1 NO_WRITE_ALL: ; -RGADR_RET1 EQU $+1 - LD A,0 +WALL_PORT_Y_RET+1: + LD A,0 OUT (PORT_Y),A -SLOT3_RET1 EQU $+1 - LD A,0 +WALL_SLOT3_RET+1: + LD A,0 OUT (SLOT3),A -SLOT1_RET1 EQU $+1 - LD A,5 +WALL_SLOT1_RET+1: + LD A,5 OUT (SLOT3),A RET @@ -1321,7 +1307,7 @@ SND_OUT_S: DJNZ SND_OUT_S LD A,#C9 ; забить возврат в программу играния музыки - LD (MemPatch_SoundOnOff),A + LD (SoundOnOff),A POP BC POP AF @@ -1332,7 +1318,7 @@ SND_CONTINUE: ; PUSH BC LD A,0 ; забить NOP в программу играния музыки - LD (MemPatch_SoundOnOff),A + LD (SoundOnOff),A POP BC POP AF @@ -1355,7 +1341,7 @@ SND_INIT: ; LD (SND_P),A LD A,0 - LD (MemPatch_SoundOnOff),A + LD (SoundOnOff),A LD B,0 IN A,(SLOT3) @@ -1373,7 +1359,7 @@ SOUND: ENDIF ; IF YesSound -MemPatch_SoundOnOff: +SoundOnOff: NOP ; сюда вставляется команда RET для отключения звука и NOP для включения PUSH AF PUSH HL @@ -1400,7 +1386,7 @@ COV_ADR+1: IN A,(SLOT3) LD E,A -MemPatch_D2_FRAM_SndPage+1: +D2_FRAM_SndPage+1: LD A,0 OUT (SLOT3),A @@ -1471,7 +1457,7 @@ SND_INIT1: ;_------[Чтение секторов с диска]------- NO_NEW_COUNT: LD HL,-SND_READ_SECTORS*512 ; буфер для данных - LD A,0 ; страница буфера, если адрес в окне #C000 + LD A,(D2_FRAM_SndPage) ;!FIXIT ; страница буфера, если адрес в окне #C000 LD DE,(SND_S1) ; абсолютный номер сектора Младшая часть LD IX,(SND_S2) ; абсолютный номер сектора Старшая часть LD B,SND_READ_SECTORS ; число читаемых секторов @@ -1508,7 +1494,6 @@ NO_NEW_COUNT: LD (SND_A),HL NO_SNDP: - LD A,B CPL LD (COV_ADR),A @@ -1527,22 +1512,22 @@ NO_LD_SND: POP HL POP AF RET - ENDIF + ENDIF ; - IF !YesSound + IF !YesSound YesSoundZero: - PUSH AF - PUSH HL - CALL KBD_INT - POP HL - POP AF - RET - ENDIF + PUSH AF + PUSH HL + CALL KBD_INT + POP HL + POP AF + RET + ENDIF EFFECTS: - IF !YesSound - RET - ENDIF + IF !YesSound + RET + ENDIF LD DE,(EFF_) LD A,D CP #C0 @@ -1569,7 +1554,6 @@ EFF_LOOP: LD (EFF_),DE EX AF,AF' OUT (SLOT2),A - RET ;*************************************** diff --git a/DOOM2.asm b/DOOM2.asm index e2c663b..18278a2 100644 --- a/DOOM2.asm +++ b/DOOM2.asm @@ -12,21 +12,18 @@ ; IFDEF HARDWARE ; DEFINE NORM_ACC 1 -; DEFINE NORM_syncPORT 1 ; DEFINE NORM_FastRAM 1 ; ENDIF ; IFDEF ZXMAK2 ; DEFINE NORM_ACC 0 -; DEFINE NORM_syncPORT 0 ; DEFINE NORM_FastRAM 0 ; ENDIF ; IFDEF MAME ; DEFINE NORM_ACC 1 -; DEFINE NORM_syncPORT 0 ; DEFINE NORM_FastRAM 1 ; ENDIF - IFNDEF YesSound : DEFINE YesSound 0 : ENDIF + IFNDEF YesSound : DEFINE YesSound 1 : ENDIF DEFINE EXE_HEADER 1 ; DEFINE NEED_LOADER 1 @@ -90,8 +87,7 @@ TABLE_W EQU #2000 ; тек ORG org_addr - CLP_Buffer ENDIF -BEGIN: - DI +BEGIN: DI LD (CMD_Line),IX ; сохранить указатель на параметры запуска CMD_Line+1: @@ -128,11 +124,11 @@ Loader_length EQU 0 ;-----[Инициализация Covox-Blaster]----- ; IF YesSound ld bc,CBL.SYS_PORT - ld a,#80 + ld a,CBL.Blaster + CBL.Mono + CBL.is8bit + CBL.Int_off + CBL.KHz_16old out (c),a ; ;-----------[заглушить звук]------------ - LD A,#FF ; !FIXIT разве так надо глушить? Не рудименты Sp97? + LD A,#FF ; !FIXIT разве так надо глушить? Не рудименты Sp97? 1: CALL CLEAR_COVOX_X DEC A CP #80 @@ -149,15 +145,15 @@ Loader_length EQU 0 ld a,(RAMBlkIDs) ld bc,BIOS.GetMemPage rst ToBIOS - di - ld (MemPatch_PalitrePage),a + ;di + ld (PalitrePage),a ld a,(RAMBlkIDs+3) ld bc,BIOS.GetMemPage rst ToBIOS - di - ld (MemPatch_D2_FRAM_page),a - DI + ;di + ld (D2_FRAM_page),a + ;DI CALL CLEAR_GRAF_SCR @@ -175,9 +171,11 @@ Loader_length EQU 0 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 HL, %0000'0100'0000'0000 ; значение + LD DE, %1111'1110'0110'1111 ; маска LD BC,ACEX.SCALE*256 + BIOS.DCP_CONFIG RST ToBIOS @@ -186,42 +184,30 @@ Loader_length EQU 0 ; LD A,DCP_PAGE ; OUT (SLOT3),A ; LD A,ACEX.SCALE - -; -; один внутренний порт масштабирования -; маппится на несколько диаппазонов -; внешних портов -; Маска - - ; LD (#C400),A ; порт #0000 Dos off - ; LD (#C410),A ; порт #2000 Dos off - ; LD (#C480),A ; порт #4000 Dos off - ; LD (#C490),A ; порт #6000 Dos off - ; LD (#C500),A ; порт #8000 Dos off - ; LD (#C510),A ; порт #A000 Dos off - ; LD (#C580),A ; порт #C000 Dos off - ; LD (#C590),A ; порт #E000 Dos off - + ; 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 -;--------------------------------------- - EXX - LD BC,#100 ; масштаб 1:1 - LD D,0 - OUT (C),D - EXX + ; Активация Акселя масштабирования, обратно только через ресет + LD BC,#100 ; C - масштаб 1:1 + OUT (C),C +;----------------------------------------------------------------------- -; -; IFN NORM_syncPORT -; DI -; LD A, +(high im_handler_emulator) -; LD I,A -; ; IM 2 - пока не включаем, процедура прерывания прыгает в кэш, а он не вставлен и не прогружен -; ENDIF + +;----------------------------------------------------------------------- CALL MAIN -;------------------------------------------------------------------------ +;----------------------------------------------------------------------- + +;----------------------------------------------------------------------- + ; E)eeeeee X) xx I)iiii T)tttttt ; E) X) xx I) T) ; E)eeeee X)xx I) T) @@ -230,7 +216,7 @@ Loader_length EQU 0 ; E)eeeeee X) xx I)iiii T) -;------------------------------------------------------------------------ +;----------------------------------------------------------------------- ;----[LP_OPEN_S]------------------------ ; Открытие стандартных окон @@ -266,16 +252,16 @@ RETURN_POINT: ; OUT (SLOT3),A LD (#C000),HL HALT_L: - DI + ;DI HALT JR HALT_L ;--------------------------------------- SET_PAL_x: - FRAM_OFF + IN A,(FastRAM.OFF) CALL SET_PAL - FRAM_ON + IN A,(FastRAM.ON) RET SET_PAL: @@ -294,7 +280,7 @@ SET_PAL: IN A,(SLOT3) PUSH AF -MemPatch_PalitrePage+1: +PalitrePage+1: LD A,#FF OUT (SLOT3),A @@ -304,7 +290,7 @@ MemPatch_PalitrePage+1: LD B,#FF LD C,BIOS.PIC_SET_PAL ; установка палитры RST ToBIOS - DI + ;DI LD HL,#C000 LD DE,0 @@ -312,7 +298,7 @@ MemPatch_PalitrePage+1: LD B,#FF LD C,BIOS.PIC_SET_PAL ; установка палитры RST ToBIOS - DI + ;DI POP AF OUT (SLOT3),A @@ -324,12 +310,12 @@ CLEAR_GRAF_SCR: IN A,(SLOT3) PUSH AF - LD (MemPatch_SPSave2),SP + LD (SPSave2),SP LD A,#50 OUT (SLOT3),A - LD A,0 + XOR A OUT (PORT_Y),A LD SP,#C040 + 640 @@ -339,10 +325,7 @@ CLEAR_GRAF_SCR: LOOP_CLS: ACC_SetBlockSize LD E,0 - ACC_Off ; !FIXIT убрать????? - LD D,E - ACC_FillScreenOneByte PUSH DE PUSH DE @@ -350,7 +333,7 @@ LOOP_CLS: DJNZ LOOP_CLS ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -MemPatch_SPSave2+1: +SPSave2+1: LD SP,0 POP AF OUT (SLOT3),A @@ -411,7 +394,7 @@ MemPatch_SPSave2+1: ; FLAG: DB 0 -SAVE_RGA: DB 0 +;SAVE_PORT_Y: DB 0 ; ; CLEAR_COVOX: @@ -465,8 +448,7 @@ LOOP_PAL_D: SUB E JR NC,NO_Z XOR A -NO_Z: - LD (HL),A +NO_Z: LD (HL),A INC L DEC D JR NZ,LOOP_PAL_D @@ -489,12 +471,11 @@ NO_PAL_EXE: ; ; ; -MAIN: - CALL INIT_TABLE +MAIN: CALL INIT_TABLE RET C - IN A,(PORT_Y) - LD (SAVE_RGA),A + ;IN A,(PORT_Y) + ;LD (SAVE_PORT_Y),A LD A,#C0 OUT (PORT_Y),A CALL RECALC_MAP @@ -504,10 +485,10 @@ MAIN: ;--------------------------------------- - LD A,(SAVE_RGA) - OUT (PORT_Y),A + ;LD A,(SAVE_PORT_Y) + ;OUT (PORT_Y),A - ret c ; нужно ли???!!! + RET C ; нужно ли???!!! XOR A LD (LAST_KEY),A @@ -574,7 +555,7 @@ TAB_320x256_1 ;----[переброс части кода в FastRAM]---- IN A,(SLOT3) PUSH AF -MemPatch_D2_FRAM_page+1: +D2_FRAM_page+1: LD A,#FF OUT (SLOT3),A @@ -589,34 +570,27 @@ MemPatch_D2_FRAM_page+1: ; надо потом нормально выделять и ; освобождать память, а не вот это всё ; - ld b,1 + ld b,2 ld c,Dss.GetMem rst ToDSS - PUSH AF ; ID блока на стек - ld bc,BIOS.GetMemPage - rst ToBIOS - LD (MemPatch_CatPage),a + ; + LD (CatPage),a ld b,1 - POP AF ; ID блока со стека ld c,BIOS.GetMemPage rst ToBIOS - di + ; + ld (DOOM2_SndPage),a + ld (D2_FRAM_SndPage+#B000),a + ;di ;----[] ENDIF - - FRAM_ON - + IN A,(FastRAM.ON) + LD HL,#C000 LD DE,#1000 LD BC,D2_fram_END-TRACE LDIR - - IF YesSound - ld (MemPatch_D2_FRAM_SndPage),a - ld (MemPatch_DOOM2_SndPage),a - ENDIF - ; IFN NORM_syncPORT ; IM 2 ; вот теперь можно включать ; ENDIF @@ -639,10 +613,10 @@ MemPatch_D2_FRAM_page+1: CALL CLEAR_COVOX - FRAM_OFF + IN A,(FastRAM.OFF) CALL INIT_HDD_WORK - FRAM_ON + IN A,(FastRAM.ON) SOUND_SWITCH: IF YesSound LD HL,NAMES+1 @@ -660,9 +634,16 @@ SOUND_S1: RLCA RLCA RLCA - ADD A,#80 - LD E,A - LD D,#80 + ; + ADD A,low (NAMES+2) + LD E,A + LD A,0 + RLA + ADD A,high (NAMES+2) + LD D,A + ;ADD A,#80 + ;LD E,A + ;LD D,#80 CALL SET_SND_FILE CALL INIT_SOUND ENDIF @@ -940,7 +921,7 @@ M_VAR3 EQU $-MONSTR_DAT ; bit 6 - показывать один цикл ; bit 7 - не выводить ; -M_VAR4 EQU $-MONSTR_DAT +M_VAR4 EQU $-MONSTR_DAT DB 0 ; Переключение монстра ADD параметр MONSTR_D_LEN EQU $-MONSTR_DAT ;следующий монстр @@ -969,257 +950,28 @@ MONSTR_DATS: ; ; ************************************** ; -MSD_DATS: - DW 0,0,0,0 - DW 0,0,0,0 - ;CAT_PAGE EQU 15 EFF_PAGE: DB #FF -PAGE_M_PLACE: 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 +;======================================================================= +;======================================================================= -;-------[инициализация винчестера]------; УБРАТЬ!!! -INIT_HDD_WORK: + INCLUDE 'Music_4x.asm' - IFN YesSound - RET - ENDIF - - LD C,BIOS.HDD_INIT - RST ToBIOS - JR C,INIT_HDD_WORK -;--------------------------------------- +;======================================================================= +;======================================================================= - IN A,(SLOT3) - PUSH AF - LD A,SYS_PAGE - OUT (SLOT3),A - - LD HL,SYS_PAGE.MSD_FAT_SEC - LD DE,MSD_DATS - LD BC,16 - LDIR - POP AF - OUT (SLOT3),A - -;-----[читать секторы с винчестера]----- - LD HL,#C000 ; адрес буфера данных - LD DE,(MSD_DATS+4) ; CAT TABLE. абсолютный номер сектора младшая часть - LD IX,(MSD_DATS+6) ; абсолютный номер сектора старшая часть - LD B,32 ; число читаемых секторов -MemPatch_CatPage EQU $+1 - LD A,15 ; страница буфера, если адрес в окне 0C000h - LD C,BIOS.HDD_READ - RST ToBIOS ; загрузить CAT -;--------------------------------------- - RET - - -SND_SEC1: DW 12525 ; начальный сектор -SND_SEC2: DW 0 -SND_L1: DW 1720H ; длина -SND_L2: DW 0 - -SND_S1: DW 12525 ; текуший сектор -SND_S2: DW 0 -SND_C1: DW 1720H ; остаток до конца -SND_C2: DW 0 - -SET_SND_FILE: - IFN YesSound - ret - ENDIF - - CALL OPEN_FILE - RET C - - LD (SND_SEC1),IX ; сектор музыки!!! - LD (SND_SEC2),HL - LD HL,(FILE_DATA+2) - LD DE,(FILE_DATA+4) - AND A - RR D - RR E - RR H - LD L,H - LD H,E - LD E,D - LD D,0 - LD (SND_L1),HL ; длина в секторах - LD (SND_L2),DE ; длина в секторах - AND A - RET - -SWITCH_SND: -NAME_S+1: LD DE,NAME1 - CALL SET_SND_FILE - JR C,SWITCH_X - - LD HL,(NAME_S) - LD BC,16 - ADD HL,BC - LD (NAME_S),HL - RET - -SWITCH_X: - LD HL,NAME1 - LD (NAME_S),HL - JR SWITCH_SND - -FILE_DATA: - DW 0 ; начальный кластер - DW 0,0 ; длина файла - - DW 0 ; текущий кластер - DW 0,0 ; текущее положение в файле - DW 0 ; текущий номер сектора в кластере -; -OPEN_FILE: ; DE - name - CALL FIND_FILE - RET C - - LD C,SLOT3 - IN B,(C) - - PUSH BC - LD A,(MemPatch_CatPage) - OUT (C),A - LD BC,26 - ADD HL,BC - LD DE,FILE_DATA - LD BC,6 - LDIR - - POP BC - OUT (C),B - - LD HL,(FILE_DATA) - LD (FILE_DATA+6),HL - LD HL,0 - LD (FILE_DATA+8),HL - LD (FILE_DATA+10),HL - LD (FILE_DATA+12),HL - - LD IX,(FILE_DATA) ; номер первого кластера - DEC IX - DEC IX ; -2 !!! - LD HL,0 - SCF - LD DE,(MSD_DATS+13) ; длина кластера в байтах - RR D - RR E -SEC_MUL: - RR D - RR E - JR C,SECT_X - ADD IX,IX - ADC HL,HL - JR SEC_MUL - -SECT_X: - LD DE,(MSD_DATS+8) - ADD IX,DE - LD DE,(MSD_DATS+10) - ADC HL,DE ; HL:IX - номер первого сектора файла - - AND A - RET -; -;DE - name - 11 символов -FIND_FILE: -; - LD C,SLOT3 - IN B,(C) - PUSH BC - - LD A,(MemPatch_CatPage) - OUT (C),A - - LD HL,#C000 - -NEXT_LOOP: - LD B,11 - PUSH DE - -NAME_LOOP: - LD A,(DE) - CP (HL) - JR NZ,NEXT_NAME - INC HL - INC DE - DJNZ NAME_LOOP - - POP DE - LD A,L - AND #E0 - LD L,A - - POP BC - OUT (C),B - AND A - RET ; HL - данные файла в странице 6 - -NEXT_NAME: - POP DE - LD A,L - AND #E0 - LD L,A - LD BC,#20 - ADD HL,BC - LD A,(HL) - AND A - JR Z,END_CAT - LD A,H - AND A - JR NZ,NEXT_LOOP - -END_CAT: - POP BC - OUT (C),B - SCF - RET - -HDD_FN: - EX AF,AF' - FRAM_OFF ; отключаем кэш - IN A,(SLOT1) - PUSH AF - IN A,(SLOT3) - PUSH AF - LD A,5 ; ПЕРЕДЕЛАТЬ!!! - OUT (SLOT1),A -MemPatch_DOOM2_SndPage EQU $+1 - LD A,0 - OUT (SLOT3),A - - IN A,(PORT_Y) - PUSH AF - EX AF,AF' - - RST ToBIOS ; читать сектора с винчестера, функция #45 - DI - - POP AF - OUT (PORT_Y),A - POP AF - OUT (SLOT3),A - POP AF - OUT (SLOT1),A - FRAM_ON ; включаем кэш - RET -; -; ************************************** -; SKY_1: DB #FF SKY_2: DB #FF -PAGE_WEAPON: DB #FF +PAGE_WEAPON: DB #FF ;*************************************** ;*************************************** @@ -1416,7 +1168,7 @@ NEXT_HL_FFING: */ ;*************************************** - DS #8700-$ ;ВЫРАВНИВАНИЕ + BLOCK #8700-$,0 ;ВЫРАВНИВАНИЕ ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; тут выравнивание на 0 в младшем ; бите адреса @@ -1427,7 +1179,7 @@ TABLE_PIC: DS 6 ;-------[загрузка ресурсов игры]-------- Load_Resources: in a,(SLOT3) - ld (.MemPatch_SavePage),a + ld (.SavePage),a LD B,FilesTBL.END LD DE,FilesTBL @@ -1440,7 +1192,7 @@ Load_Resources: ex de,hl ld b,(hl) ; FilesTBL inc hl - ld (.MemPatch_FileName),hl + ld (.FileName),hl ; B - размер блока в страницах ld c,Dss.GetMem @@ -1464,12 +1216,12 @@ Load_Resources: push hl ;++буфер со списком страниц push bc ;++сколько страниц грузим -.MemPatch_FileName EQU $+1 - ld hl,.MemPatch_FileName +.FileName+1: + ld hl,0 ld a,1 ld c,Dss.Open rst ToDSS - ld (.MemPatch_TempFileID),a + ld (.TempFileID),a pop bc ;--сколько страниц грузим pop hl ;--буфер со списком страниц @@ -1481,32 +1233,32 @@ Load_Resources: push hl ;++буфер со списком страниц push bc ;++сколько страниц грузим -.MemPatch_TempFileID EQU $+1 - ld a,#FF ; файловый манипулятор - LD HL,#C000 ; адрес в памяти - LD DE,#4000 ; количество читаемых байт +.TempFileID+1: + ld a,#FF ; файловый манипулятор + LD HL,#C000 ; адрес в памяти + LD DE,#4000 ; количество читаемых байт LD C,Dss.Read - rst ToDSS - DI + RST ToDSS + ;DI - pop bc ;--сколько страниц грузим - pop hl ;--буфер со списком страниц + pop bc ;--сколько страниц грузим + pop hl ;--буфер со списком страниц DJNZ .readloop ;---[] ;---[закрываем] - ld a,(.MemPatch_TempFileID) + ld a,(.TempFileID) ld c,Dss.Close rst ToDSS ;---[] - ld de,(.MemPatch_FileName) + ld de,(.FileName) ld hl,13 add hl,de ex de,hl - POP HL ;--буфер под BlockID - POP BC ;--счётчик + POP HL ;--буфер под BlockID + POP BC ;--счётчик DJNZ .LR_loop ;-[разобраться с таблицами!!!]- @@ -1524,30 +1276,39 @@ Load_Resources: 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 + ; ld hl,MONSTR_TABLE_file + ; ld a,1 + ; ld c,Dss.Open + ; rst ToDSS + ; push af - pop af - ld c,Dss.Close - rst ToDSS -*/ - di + ; LD HL,MONSTR_TABLE ; адрес в памяти + ; LD DE,MONSTR_TABLE_SIZE ; количество читаемых байт + ; LD C,Dss.Read + ; rst ToDSS + + ; pop af + ; ld c,Dss.Close + ; rst ToDSS + + ;di ;------------------------------ -.MemPatch_SavePage equ $+1 - ld a,0 +.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 +;Temp_Buffer: BLOCK 256,#FF TABLE_X_file: db 'table_x.tbl',0 ;MONSTR_TABLE_file: db 'monsters.tbl',0 @@ -1900,24 +1661,24 @@ MONSTR_POS: ALIGN 2,0 ; TABLES_START: -X_COORD: DW 090*256 -Y_COORD: DW 090*256 -ANGLE_A: DW -160*32+0C000h -ANGLE_R: DW 0 +X_COORD: DW 90*256 +Y_COORD: DW 90*256 +ANGLE_A: DW -160*32+#C000 +ANGLE_R: DW 0 -X_SPEED: DW 300H -Y_SPEED: DW 302H -A_SPEED: DW 200H +X_SPEED: DW #300 +Y_SPEED: DW #302 +A_SPEED: DW #200 -TABLE_TRACE: DS 33 ; таблица трассировки/банки таблицы -TABLE_WALL: DS 33 +TABLE_TRACE: BLOCK 33,0 ; таблица трассировки/банки таблицы +TABLE_WALL: BLOCK 33,0 - DS TABLES_START+#74-$ ;ВЫРАВНИВАНИЕ +; BLOCK TABLES_START+#74-$,0 ;ВЫРАВНИВАНИЕ -NAMES: DB 6,1 -LAST_KEY: DB 0 +LAST_KEY: DB 0 +NAMES: DB 6,1 - DS TABLES_START+#7C-$ ;ВЫРАВНИВАНИЕ +; BLOCK TABLES_START+#7C-$,0 ;ВЫРАВНИВАНИЕ NAME1: DB "_1X62 CBL " NAME2: DB "2NDREAL3CBL " @@ -1945,13 +1706,16 @@ NAME9: DB "_ENI511CCBL " ; ENDIF ; OUTEND ; конец файла doom2.exe +DIR_NAME_11: BLOCK 11,0 +CURRENT_DIR: BLOCK 257,0 +Temp_Buffer EQU $ ; ; DISPLAY "DOOM2.EXE starts - ",/H,BEGIN DISPLAY "DOOM2.EXE ends - ",/H,$ DISPLAY "DOOM2.EXE size - ",/H,$-BEGIN -FRAM_PROG_1000H: +;FRAM_PROG_1000H: include 'D2_FRAM.asm' ; END diff --git a/Music_4x.asm b/Music_4x.asm new file mode 100644 index 0000000..963f0ba --- /dev/null +++ b/Music_4x.asm @@ -0,0 +1,431 @@ + +;----------------------------------------------------------------------- +;-------[инициализация винчестера]------; +INIT_HDD_WORK: + IFN YesSound + RET + ENDIF + +.currentDisk+1: ; + LD A,0 + OR #80 + LD HL,Temp_Buffer + LD BC,Dss.DskInfo + RST ToDSS + ; + LD B,4 ;!HARDCODE номер нужного параметра + LD DE,0 + LD HL,Temp_Buffer +.loop_param: ADD HL,DE + LD E,(HL) + INC HL + DJNZ .loop_param + LD A,(HL) + AND #80 + JR Z,.no_change_Disk + CP #90 + JR NC,.no_change_Disk + ; + LD A,3 + AND (HL) + LD D,A + INC HL + LD A,(HL) + RLCA + RLCA + ; + OR D + AND #0F + JR .start + ; +.no_change_Disk:; + XOR A +.start: LD C,BIOS.HDD_PART ; IDE-1/IDE-2 + RST ToBIOS + ; +.loop: LD C,BIOS.HDD_INIT + RST ToBIOS + JR C,.loop + ; + + CALL BPB_SetUp +;----------------------------------------------------------------------- + + IN A,(SLOT3) + PUSH AF + LD A,SYS_PAGE + OUT (SLOT3),A + + LD HL,SYS_PAGE.MSD_FAT_SEC + LD DE,MSD_DATS + LD BC,16 + LDIR + POP AF + OUT (SLOT3),A + ;!TODO music and dirs + ; парсим строку пути + ; LD HL,CURRENT_DIR+1 + ; LD DE,DIR_NAME_11 + ; PUSH DE + ; PUSH HL + ; LD BC,1*256 + Dss.DosName + ; RST ToDSS + +;-----[читать секторы с винчестера]----- +READ_DIR: + LD HL,#C000 ; адрес буфера данных + LD DE,(MSD_DATS+4) ; CAT TABLE. абсолютный номер сектора младшая часть + LD IX,(MSD_DATS+6) ; абсолютный номер сектора старшая часть + LD B,32 ; число читаемых секторов +CatPage+1: + LD A,15 ; страница буфера, если адрес в окне #C000 + LD C,BIOS.HDD_READ + RST ToBIOS ; загрузить CAT + RET +;--------------------------------------- + +MSD_DATS: WORD 0,0,0,0,0,0,0,0 + +SND_SEC1: DW 12525 ; начальный сектор +SND_SEC2: DW 0 +SND_L1: DW #1720 ; длина +SND_L2: DW 0 + +SND_S1: DW 12525 ; текуший сектор +SND_S2: DW 0 +SND_C1: DW #1720 ; остаток до конца +SND_C2: DW 0 + +SET_SND_FILE: + IFN YesSound + ret + ENDIF + + CALL OPEN_FILE + RET C + + LD (SND_SEC1),IX ; сектор музыки!!! + LD (SND_SEC2),HL + LD HL,(FILE_DATA+2) + LD DE,(FILE_DATA+4) + AND A + RR D + RR E + RR H + LD L,H + LD H,E + LD E,D + LD D,0 + LD (SND_L1),HL ; длина в секторах + LD (SND_L2),DE ; длина в секторах + AND A + RET + +SWITCH_SND: +NAME_S+1: LD DE,NAME1 + CALL SET_SND_FILE + JR C,SWITCH_X + + LD HL,(NAME_S) + LD BC,16 + ADD HL,BC + LD (NAME_S),HL + RET + +SWITCH_X: + LD HL,NAME1 + LD (NAME_S),HL + JR SWITCH_SND + +FILE_DATA: + DW 0 ; начальный кластер + DW 0,0 ; длина файла + + DW 0 ; текущий кластер + DW 0,0 ; текущее положение в файле + DW 0 ; текущий номер сектора в кластере +; +OPEN_FILE: ; DE - name + CALL FIND_FILE + RET C + + LD C,SLOT3 + IN B,(C) + + PUSH BC + LD A,(CatPage) + OUT (C),A + LD BC,26 + ADD HL,BC + LD DE,FILE_DATA + LD BC,6 + LDIR + + POP BC + OUT (C),B + + LD HL,(FILE_DATA) + LD (FILE_DATA+6),HL + LD HL,0 + LD (FILE_DATA+8),HL + LD (FILE_DATA+10),HL + LD (FILE_DATA+12),HL + + LD IX,(FILE_DATA) ; номер первого кластера + DEC IX + DEC IX ; -2 !!! + LD HL,0 + SCF + LD DE,(MSD_DATS+13) ; длина кластера в байтах + RR D + RR E +SEC_MUL: + RR D + RR E + JR C,SECT_X + ADD IX,IX + ADC HL,HL + JR SEC_MUL + +SECT_X: + LD DE,(MSD_DATS+8) + ADD IX,DE + LD DE,(MSD_DATS+10) + ADC HL,DE ; HL:IX - номер первого сектора файла + + AND A + RET +; +;DE - name - 11 символов +FIND_FILE: +; + LD C,SLOT3 + IN B,(C) + PUSH BC + + LD A,(CatPage) + OUT (C),A + + LD HL,#C000 + +NEXT_LOOP: + LD B,11 + PUSH DE + +NAME_LOOP: + LD A,(DE) + CP (HL) + JR NZ,NEXT_NAME + INC HL + INC DE + DJNZ NAME_LOOP + + POP DE + LD A,L + AND #E0 + LD L,A + + POP BC + OUT (C),B + AND A + RET ; HL - данные файла в странице 6 + +NEXT_NAME: + POP DE + LD A,L + AND #E0 + LD L,A + LD BC,#20 + ADD HL,BC + LD A,(HL) + AND A + JR Z,END_CAT + LD A,H + AND A + JR NZ,NEXT_LOOP + +END_CAT: + POP BC + OUT (C),B + SCF + RET + +HDD_FN: + EX AF,AF' + IN A,(FastRAM.OFF) + IN A,(SLOT1) + PUSH AF + IN A,(SLOT3) + PUSH AF + LD A,5 ;!FIXIT + OUT (SLOT1),A +DOOM2_SndPage+1: + LD A,0 + OUT (SLOT3),A + + IN A,(PORT_Y) + PUSH AF + EX AF,AF' + + RST ToBIOS ; читать сектора с винчестера, функция #45 + ;DI + + POP AF + OUT (PORT_Y),A + POP AF + OUT (SLOT3),A + POP AF + OUT (SLOT1),A + IN A,(FastRAM.ON) ; включаем кэш + RET +; +; +BPB_SetUp: + LD A,SYS_PAGE + LD HL,SYS_PAGE.MS_BPB + LD C,BIOS.HDD_READ_BPB + RST ToBIOS +.PARAMS: + DI + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + + LD A,(SYS_PAGE.MS_BPB+FORM_CODE) + CP #F0 + JP C,.ERROR_BPB + + LD HL,SYS_PAGE.MS_BPB+FAT_ID + LD DE,.FAT1_MSG + LD B,4 +.L1: LD A,(DE) + CP ' ' + JR NZ,.L11 + INC DE + JR .L1 +.L11: CP (HL) + JR NZ,.PC_DOS + + INC HL + INC DE + DJNZ .L1 + LD A,(HL) + CP '6' + LD HL,#81FF ; FAT16 флаг + JR Z,.FAT + CP '2' + JP NZ,.ERROR_BPB + +.PC_DOS: + LD HL,#01FF ; FAT12 флаг +.FAT: LD (SYS_PAGE.FAT_FLAG),HL + + LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек + LD (SYS_PAGE.MSD_SECS),A + + BIT 7,H + + LD IX,0 + LD HL,0 ; вычислить начальный сектор FAT + + JR Z,.NO_LD_SPECIAL + LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS) + LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2) +.NO_LD_SPECIAL: + LD BC,0 + LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS) + + ADD IX,DE + ADC HL,BC + + LD (SYS_PAGE.MSD_FAT_SEC),IX ; начальный сектор FAT + LD (SYS_PAGE.MSD_FAT_SEC2),HL ; начальный сектор FAT + + LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT + LD BC,0 + + LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs +.NEXT_ADD: + ADD IX,DE + ADC HL,BC + DEC A + JR NZ,.NEXT_ADD + + LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR + LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR + + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + RL C + RL B + RL C + RL B + RL C + RL B + LD C,B + LD B,0 ; BC - число файловых записей в секторе + LD A,C + LD (SYS_PAGE.F_P_S),A + + LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей + + EX DE,HL + DEC HL + XOR A +.NEXT_ADD2: + INC A + JR Z,.ERROR_BPB + SBC HL,BC + JR NC,.NEXT_ADD2 + EX DE,HL + + LD E,A ; A - число секторов в DIR + LD D,0 + LD BC,0 + LD (SYS_PAGE.S_P_C),A + + ADD IX,DE ; Начало DATA area + ADC HL,BC + + LD (SYS_PAGE.MSD_DAT_SEC),IX + LD (SYS_PAGE.MSD_DAT_SEC2),HL + + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + LD HL,0 + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + LD D,A + LD A,0 +.NEXT_ADD3: + ADD HL,BC ; Вычисление длины кластера + ADC A,0 + DEC D + JR NZ,.NEXT_ADD3 + + LD (SYS_PAGE.CLASTER_LEN),HL + LD B,0 + LD C,A + LD (SYS_PAGE.CLASTER_LEN2),BC + + LD HL,0 + LD BC,(SYS_PAGE.MS_BPB+S_P_T) + LD A,(SYS_PAGE.MS_BPB+H_P_S) +.BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР + ADD HL,BC + DEC A + JR NZ,.BPB_L1 + LD (SYS_PAGE.S_X_H),HL + ; + EX AF,AF' + OUT (SLOT3),A + EI + AND A + RET +.ERROR_BPB: + EX AF,AF' + OUT (SLOT3),A + SCF + EI + RET + ; +.FAT1_MSG: + DB 'FAT1' \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b5606d6..f74ae7e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569 +Subproject commit f74ae7e760de5541ee4966d509442c6421225c3b