diff --git a/D2_FRAM.asm b/D2_FRAM.asm index 8a83e4a..c40a131 100644 --- a/D2_FRAM.asm +++ b/D2_FRAM.asm @@ -15,9 +15,7 @@ SND_READ_SECTORS EQU 4 Module__D2_FRAM__Start EQU $ ; -TRACE: - - IN A,(SLOT1) +TRACE: IN A,(SLOT1) LD (TRACE_RET_SLOT1),A IN A,(SLOT3) LD (TRACE_RET_SLOT3),A @@ -47,21 +45,21 @@ TRACE: NO_SKY_2: OUT (SLOT1),A - LD A,0 ;????????? не нужно? + ;LD A,0 ;????????? не нужно? LD C,80 SKY_LOOP_1: ACC_SetBlockSize - LD B,0 + LD A,0 ACC_CopyBlock LD B,(HL) ACC_SetBlockSize LD B,#80 ACC_Off - XOR A + ;XOR A - OUT (RGADR),A + OUT (PORT_Y),A ACC_CopyScreenBlock LD (DE),A ACC_Off @@ -69,14 +67,14 @@ SKY_LOOP_1: INC DE INC DE - OUT (RGADR),A + OUT (PORT_Y),A ACC_CopyScreenBlock LD (DE),A ACC_Off DEC DE - OUT (RGADR),A + OUT (PORT_Y),A ACC_CopyScreenBlock LD (DE),A ACC_Off @@ -84,7 +82,7 @@ SKY_LOOP_1: INC DE INC DE - OUT (RGADR),A + OUT (PORT_Y),A ACC_CopyScreenBlock LD (DE),A ACC_Off @@ -98,11 +96,7 @@ SKY_LOOP_1: RES 7,H SET 6,H - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND LD A,(SKY_1) LD B,A @@ -118,20 +112,17 @@ NO_NEXT_SKY: DEC C JR NZ,SKY_LOOP_1 - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF -; + CALL SOUND + EXX -SCREEN_1 EQU $+1 - LD DE,#C040 ; начало экрана - LD C,0 ;!!!!!!!!!!!!!!!!!!!!!!!!!! +SCREEN_1+1: + LD DE,ScreenStartAddress ; начало экрана + LD C,0 ;!!!!!!!!!!!!!!!!!!!!!!!!!! EXX ; - LD HL,0 ; начальный угол * 32 -ANGLE_M EQU $-2 +ANGLE_M+1: + LD HL,0 ; начальный угол * 32 + ; LD A,H RLCA @@ -148,50 +139,48 @@ ANGLE_M EQU $-2 TRACE_NEXT_: ; EXX - LD HL,(PLACE_L) ; текущее положение в таблице - INC HL - LD A,(HL) - LD (PLACE_L1),A - LD (PLACE_L2),A + 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 ; JR TRACE_LOOP - TRACE_LOOP: LD A,#50 OUT (SLOT3),A XOR A - OUT (RGADR),A + OUT (PORT_Y),A REPT 16 - LD E,(HL) ; первый и далее следующий кубик - LD A,(DE) ; есть или нет? - AND A - JR NZ,TRACE_CONT ; если есть, рисовать!! - INC L + LD E,(HL) ; первый и далее следующий кубик + LD A,(DE) ; есть или нет? + AND A + JR NZ,TRACE_CONT ; если есть, рисовать!! + INC L ENDR PURE_LINE: -; EXX - ACC_SetBlockSize - LD A,#80 ; пустая стенка - ACC_Off - ; LD (DE),A ; LINE-Z-bufer - OUT (RGADR),A - - LD A,(COLOR_LO) - - ACC_FillScreenOneByte - LD (DE),A - ACC_Off - LD A,#70 ; Z-bufer - LD (DE),A + ACC_SetBlockSize + LD A,#80 ; пустая стенка + ACC_Off + ;LD (DE),A ; LINE-Z-Buffer + OUT (PORT_Y),A + ; + LD A,(COLOR_LO) + ; + ACC_FillScreenOneByte + LD (DE),A + ACC_Off + LD A,#70 ; Z-Buffer + LD (DE),A EXX ; JR NEXT_ANGLE @@ -203,8 +192,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 @@ -231,9 +219,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 ; @@ -244,33 +230,33 @@ PLACE_L2 EQU $-1 ; EXX LD H,TABLE_X/256 - LD L,A ; высота TABLE_X - таблица высот - LD B,(HL) ; старшая часть коэфициента - ; ld b,0 + LD L,A ; высота TABLE_X - таблица высот + LD B,(HL) ; старшая часть коэфициента +; ld b,0 INC H - LD L,(HL) ; младшая часть коэфициента/смещение в стенке - ; LD C,0 - OUT (C),L ; масштабирование - ; OUTI ; B уменьшается сначала! + LD L,(HL) ; младшая часть коэфициента/смещение в стенке +; LD C,0 + OUT (C),L ; масштабирование +; OUTI ; B уменьшается сначала! BIT 7,A - JR Z,HIGH_1 ; 64 точки, не на весь экран + JR Z,HIGH_1 ; 64 точки, не на весь экран ; <64 точки, на весь экран XOR A - OUT (RGADR),A ; с самого начала + OUT (PORT_Y),A ; с самого начала ACC_SetBlockSize - LD (DE),A ; 256 байт И LINE-Z-bufer!!!! + LD (DE),A ; 256 байт И LINE-Z-Buffer!!!! ACC_Off LD A,#58 OUT (SLOT3),A ACC_CopyScreenBlock - LD (DE),A ; ФИГАКС всю линию!!! + LD (DE),A ; ФИГАКС всю линию!!! ACC_Off XOR A - LD (DE),A ; LINE-Z-bufer!!!! + LD (DE),A ; LINE-Z-Buffer!!!! EXX ; JR NEXT_ANGLE @@ -278,10 +264,10 @@ PLACE_L2 EQU $-1 HIGH_1: ; A - высота, с которой рисуется стенка ACC_SetBlockSize - LD (DE),A ; число точек потолка и пола! & LINE-Z-bufer + LD (DE),A ; число точек потолка и пола! & LINE-Z-Buffer ACC_Off NEG ; получить положение начала пола - OUT (RGADR),A + OUT (PORT_Y),A LD L,A LD A,#58 @@ -290,8 +276,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 ; рисовать пол @@ -305,20 +290,20 @@ COLOR_LO EQU $-1 LD A,L NEG - OUT (RGADR),A + OUT (PORT_Y),A LD A,L -; IN A,(RGADR) +; IN A,(PORT_Y) ADD A,A ; NEG ; выводимый размер стенки ; стенка в акселераторе! ACC_SetBlockSize - LD (DE),A + LD (DE),A ;!!!!! прикольно ACC_CopyScreenBlock - LD (DE),A ; положить стенку! + LD (DE),A ; положить стенку! ACC_Off - EXX ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + EXX ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NEXT_ANGLE: @@ -333,8 +318,7 @@ NEXT_ANGLE: NO_TEST: ; - LD A,0 -CONT_PAGE EQU $-1 +CONT_PAGE+1: LD A,0 ; OUT (SLOT1),A @@ -344,13 +328,7 @@ CONT_PAGE EQU $-1 LD L,A JP NZ,TRACE_LOOP -; CALL SOUND ; играть музыку на ковоксбластере!!! - - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND ; играть музыку на ковоксбластере!!! INC H BIT 7,H @@ -359,8 +337,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 @@ -391,17 +368,15 @@ 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 - OUT (RGADR),A + OUT (PORT_Y),A RET ; ;*************************************** @@ -463,9 +438,8 @@ NO_CORN1: ; ;*************************************** ; -SET_PICTURE: ; A - относительный номер страницы - +SET_PICTURE: LD C,SLOT1 IN B,(C) PUSH BC @@ -476,14 +450,10 @@ SET_PICTURE: LD A,#50 OUT (C),A - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND ; ld bc,#0100 ; масштабирование - 1 - OUT (C),B + OUT (C),C LD DE,(SCREEN_1) LD B,5 ; 5 СТРАНИЦ @@ -491,7 +461,7 @@ SET_PICTURE: ACC_SetBlockSize LD A,0 ; по 256 байт ACC_Off - OUT (RGADR),A + OUT (PORT_Y),A POP AF @@ -522,11 +492,7 @@ LOOP_PG: POP BC - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND DJNZ PIC_LOOP @@ -703,8 +669,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 @@ -722,10 +688,9 @@ WEAPON_SWITCH EQU $+1 LD BC,#100 W_OUT_L: - LD A,#44 SUB H - OUT (RGADR),A + OUT (PORT_Y),A ; ;------[оптимизировать?]---------------- OUT (C),C ; МАСШТАБ 1:1, начинать с 0 @@ -788,7 +753,7 @@ MAP_LOOP_2: LD BC,#0100 OUT (C),C ; МАСШТАБ 1:1 - IF NORM_ACC +; IF NORM_ACC LD B,16 LD A,184 @@ -805,7 +770,7 @@ MAP_LOOP_1: INC H REPT 4 - OUT (RGADR),A + OUT (PORT_Y),A ACC_CopyBlock LD (DE),A ACC_Off @@ -814,55 +779,55 @@ MAP_LOOP_1: DJNZ MAP_LOOP_1 - ELSE +; ELSE - LD B,16 - LD A,184 +; LD B,16 +; LD A,184 -MAP_LOOP_1: +; MAP_LOOP_1: - ACC_SetBlockSize - LD C,#40 - ACC_CopyBlock - LD C,(HL) - ACC_Off +; ACC_SetBlockSize +; LD C,#40 +; ACC_CopyBlock +; LD C,(HL) +; ACC_Off - OUT (RGADR),A - ACC_CopyBlock - LD (DE),A - ACC_Off - INC A - LD L,64 - ACC_CopyBlock - LD C,(HL) - ACC_Off - OUT (RGADR),A - ACC_CopyBlock - LD (DE),A - ACC_Off - INC A - LD L,64*2 - ACC_CopyBlock - LD C,(HL) - ACC_Off - OUT (RGADR),A - ACC_CopyBlock - LD (DE),A - ACC_Off - INC A - LD L,64*3 - ACC_CopyBlock - LD C,(HL) - ACC_Off - OUT (RGADR),A - ACC_CopyBlock - LD (DE),A - ACC_Off - INC A - INC H - LD L,0 - DJNZ MAP_LOOP_1 - ENDIF +; OUT (PORT_Y),A +; ACC_CopyBlock +; LD (DE),A +; ACC_Off +; INC A +; LD L,64 +; ACC_CopyBlock +; LD C,(HL) +; ACC_Off +; OUT (PORT_Y),A +; ACC_CopyBlock +; LD (DE),A +; ACC_Off +; INC A +; LD L,64*2 +; ACC_CopyBlock +; LD C,(HL) +; ACC_Off +; OUT (PORT_Y),A +; ACC_CopyBlock +; LD (DE),A +; ACC_Off +; INC A +; LD L,64*3 +; ACC_CopyBlock +; LD C,(HL) +; ACC_Off +; OUT (PORT_Y),A +; ACC_CopyBlock +; LD (DE),A +; ACC_Off +; INC A +; INC H +; LD L,0 +; DJNZ MAP_LOOP_1 +; ENDIF LD BC,240 EX DE,HL @@ -873,8 +838,8 @@ MAP_LOOP_1: CP #50 JR Z,MAP_LOOP_2 - LD A,0 - OUT (RGADR),A + XOR A + OUT (PORT_Y),A POP AF POP HL @@ -889,69 +854,64 @@ 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 - IN A,(RGADR) - LD (RGADR_RET1),A - LD A,#58 + LD (WALL_SLOT1_RET),A + IN A,(PORT_Y) + LD (WALL_PORT_Y_RET),A + LD A,#5C OUT (SLOT3),A - LD A,(IX+0) ; страница стенки + LD A,(IX+0) ; страница стенки OUT (SLOT1),A EXX - LD C,0 ; порт масштаба - - 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 (X_ADD2),A - DEC H - - LD A,L - ADD A,A - NEG ; ширина по горизонтали - - BIT 0,(IX+M_VAR3) - JR Z,NO_DEL2 - RRA - AND #7F -NO_DEL2: - BIT 1,(IX+M_VAR3) - JR Z,NO_DEL4 - AND A - RRA - RRA - AND #3F + LD C,0 ; порт масштаба + ; + 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 (X_ADD2),A + DEC H + ; + LD A,L + ADD A,A + NEG ; ширина по горизонтали + ; + BIT 0,(IX+M_VAR3) + JR Z,NO_DEL2 + RRA + AND #7F +NO_DEL2: BIT 1,(IX+M_VAR3) + JR Z,NO_DEL4 + AND A + RRA + RRA + AND #3F 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 @@ -960,15 +920,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 +; LD HL,#0140 ; AND A ; SBC HL,DE -; LD A,L ; в A - сколько линий осталось до конца экрана?? +; LD A,L ; в A - сколько линий осталось до конца экрана?? LD HL,(SCREEN_1) ADD HL,DE @@ -976,15 +936,16 @@ NO_DEL4: ; LD A,(IX+3) LD A,B RRA - AND #7F ; разделили на 2 + AND #7F ; разделили на 2 LD E,A ; SUB 128 ; LD E,A LD D,0 SBC HL,DE + ;!FIXIT после вычитания в HL адрес по которому будет запись блока, может залезать на шрифты EX DE,HL - LD H,(IX+2) ; старший адрес стенки + LD H,(IX+2) ; старший адрес стенки LD L,(IX+1) LD A,#58 @@ -992,97 +953,94 @@ NO_DEL4: WOLL_LOOP: XOR A - OUT (RGADR),A + OUT (PORT_Y),A LD A,D + ;!FIXIT тут проверка на старший адрес, но шрифтам это не поможет CP #C3 - JR NC,NO_WRITE_ALL ; не выводить за экран и закончить + JR NC,NO_WRITE_ALL ; не выводить за экран и закончить CP #C0 - JR C,NO_WRITE_LINE ; не выводить за экран - - LD A,(DE) ; Z-bufer!!! + JR C,NO_WRITE_LINE ; не выводить за экран + ;!FIXIT тут может читаться из области шрифтов + LD A,(DE) ; чтение из Z-Buffer EXX - CP L + CP L EXX JR C,NO_WRITE_LINE EXX - LD B,1 - OUT (C),C ; масштаб - 1 - ACC_SetBlockSize - LD B,#40 ; задать длину линии - ACC_Off + LD B,1 + OUT (C),C ; масштаб - 1 + ACC_SetBlockSize + LD B,#40 ; задать длину линии + ACC_Off EXX ACC_CopyBlock - LD A,(HL) ; взять линию стенки + LD A,(HL) ; взять линию стенки ACC_Off EXX -; L - высота -128..0..127 !!! - LD B,(HL) - INC H - LD A,(HL) ; масштаб - HIGH - OUT (C),A - INC H - LD A,L - ADD A,A - JR NC,NO_Z_A1 - XOR A + ; L - высота -128..0..127 !!! + LD B,(HL) + INC H + LD A,(HL) ; масштаб - HIGH + OUT (C),A + INC H + LD A,L + ADD A,A + JR NC,NO_Z_A1 + XOR A NO_Z_A1: - NEG - ACC_SetBlockSize - LD (HL),A ; задать длину линии - ACC_Off - DEC H - DEC H - LD A,L + NEG + ACC_SetBlockSize + LD (HL),A ; задать длину линии + ACC_Off + DEC H + DEC H + LD A,L EXX BIT 7,A JR Z,NO_Z_A XOR A NO_Z_A: - OUT (RGADR),A ; задать порт Y - + OUT (PORT_Y),A ; задать порт Y + ;!FIXIT тут может писаться в область шрифтов ACC_CopyScreenBlock - LD (DE),A ; вывести линию + LD (DE),A ; вывести линию ACC_Off LD A,E AND #0F - IF YesSound - CALL Z,SOUND - ; ELSE - ; CALL Z,YesSoundZero - ENDIF - + CALL Z,SOUND + ; NO_WRITE_LINE: - INC DE ; новое значение X + 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 + LD H,A ; следующая линия WOLL DJNZ WOLL_LOOP NO_WRITE_ALL: ; -RGADR_RET1 EQU $+1 - LD A,0 - OUT (RGADR),A -SLOT3_RET1 EQU $+1 - LD A,0 +WALL_PORT_Y_RET+1: + LD A,0 + OUT (PORT_Y),A +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 @@ -1172,11 +1130,7 @@ MAP_L4: POP HL PUSH HL - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND LD C,16 @@ -1204,9 +1158,7 @@ MAP_L6: POP HL PUSH HL - IF YesSound - CALL SOUND - ENDIF + CALL SOUND LD C,16 @@ -1219,7 +1171,7 @@ MAP_L8: LD A,(HL) LD (DE),A LD A,L - SUB 40H + SUB #40 LD L,A LD A,H SBC A,0 @@ -1307,7 +1259,9 @@ CONT_MOVE: ;COV_ADR: DB 0 ;SND_P: DB #FF SND_A: DW #C000 - IF YesSound + + + SND_STOP: ; остановить музыку PUSH AF @@ -1320,7 +1274,7 @@ SND_OUT_S: DJNZ SND_OUT_S LD A,#C9 ; забить возврат в программу играния музыки - LD (MemPatch_SoundOnOff),A + LD (SoundOnOff),A POP BC POP AF @@ -1331,7 +1285,7 @@ SND_CONTINUE: ; PUSH BC LD A,0 ; забить NOP в программу играния музыки - LD (MemPatch_SoundOnOff),A + LD (SoundOnOff),A POP BC POP AF @@ -1354,36 +1308,29 @@ SND_INIT: ; LD (SND_P),A LD A,0 - LD (MemPatch_SoundOnOff),A + LD (SoundOnOff),A LD B,0 IN A,(SLOT3) LD E,A JR SND_INIT1 - ENDIF + + SOUND: - IF !YesSound - ; PUSH AF - ; CALL KBD_INT - ; POP AF - RET - ENDIF -; - IF YesSound -MemPatch_SoundOnOff EQU $ - NOP ; сюда вставляется команда RET для отключения звука и NOP для включения +SoundOnOff: + NOP ; сюда вставляется команда RET для отключения звука и NOP для включения +SoundOnOff2: + NOP PUSH AF PUSH HL SND_MORE: - CALL KBD_INT - IN A,(#FE) ; - XOR 0 ; covox адрес -COV_ADR EQU $-1 +COV_ADR+1: + XOR 0 ; covox адрес ; AND #80 JP NZ,NO_LD_SND @@ -1401,8 +1348,14 @@ COV_ADR EQU $-1 IN A,(SLOT3) LD E,A -MemPatch_D2_FRAM_SndPage EQU $+1 - LD A,0 + + + ;!FIXIT DEBUG + ; LD A,COLORS.CGA.BORDER.CYAN + ; OUT (BorderColor),A + ; + + LD A,CBL.BUFFER_PAGE OUT (SLOT3),A L_DDX: @@ -1419,6 +1372,13 @@ L_DDX: DEC D JR NZ,L_DDX + + ;!FIXIT DEBUG + ; LD A,COLORS.CGA.BORDER.BLACK + ; OUT (BorderColor),A + ; + + LD (SND_A),HL LD A,H @@ -1426,7 +1386,6 @@ L_DDX: JP NZ,NO_SNDP SND_INIT1: - PUSH IX PUSH AF EX AF,AF' @@ -1473,11 +1432,11 @@ SND_INIT1: ;_------[Чтение секторов с диска]------- NO_NEW_COUNT: LD HL,-SND_READ_SECTORS*512 ; буфер для данных - LD A,0 ; страница буфера, если адрес в окне #C000 - LD DE,(SND_S1) ; абсолютный номер сектора Младшая часть - LD IX,(SND_S2) ; абсолютный номер сектора Старшая часть + LD A,CBL.BUFFER_PAGE ; страница буфера, если адрес в окне #C000 + LD DE,(SND_S1) ; абсолютный номер сектора Младшая часть + LD IX,(SND_S2) ; абсолютный номер сектора Старшая часть LD B,SND_READ_SECTORS ; число читаемых секторов - LD C,BIOS.HDD_READ ; функция чтения + LD C,BIOS.HDD_READ ; функция чтения CALL HDD_FN ;--------------------------------------- @@ -1510,7 +1469,6 @@ NO_NEW_COUNT: LD (SND_A),HL NO_SNDP: - LD A,B CPL LD (COV_ADR),A @@ -1529,22 +1487,16 @@ NO_LD_SND: POP HL POP AF RET - ENDIF -; - IF !YesSound -YesSoundZero: - PUSH AF - PUSH HL - CALL KBD_INT - POP HL - POP AF - RET - ENDIF + +; YesSoundZero: +; PUSH AF +; PUSH HL +; CALL KBD_INT +; POP HL +; POP AF +; RET EFFECTS: - IF !YesSound - RET - ENDIF LD DE,(EFF_) LD A,D CP #C0 @@ -1571,7 +1523,6 @@ EFF_LOOP: LD (EFF_),DE EX AF,AF' OUT (SLOT2),A - RET ;*************************************** @@ -1582,7 +1533,7 @@ CLEAR_Z_BUFER: OUT (SLOT3),A LD A,0 - OUT (RGADR),A + OUT (PORT_Y),A LD DE,(SCREEN_1) ACC_SetBlockSize @@ -1651,15 +1602,15 @@ KBD_INT: .NO_LAST_KEY: POP AF - CP 20 ; CTRL + CP 20 ; CTRL JR Z,.EFF_ON - CP 117 ; KEY_UP + CP 117 ; KEY_UP JR Z,.DIR_UP - CP 114 ; KEY_DN + CP 114 ; KEY_DN JR Z,.DIR_DN - CP 107 ; KEY_LF + CP 107 ; KEY_LF JR Z,.DIR_LF - CP 116 ; KEY_RT + CP 116 ; KEY_RT JR Z,.DIR_RT JR .KBD_INT2 @@ -1717,79 +1668,72 @@ OFF_BYTE: DB #FF ; TAB_ANGLE: - DB 0,1 ; 0 - DB 1,1 ; 45 - DB 1,1 ; 45 - DB 1,0 ; 90 - DB 1,0 ; 90 - DB 1,-1 ; 135 - DB 1,-1 ; 135 - DB 0,-1 ; 180 - DB 0,-1 ; 180 - DB -1,-1 - DB -1,-1 - DB -1,0 - DB -1,0 - DB -1,1 - DB -1,1 - DB 0,1 ; 0 - + DB 0 , 1 ; 0 + DB 1 , 1 ; 45 + DB 1 , 1 ; 45 + DB 1 , 0 ; 90 + DB 1 , 0 ; 90 + DB 1 , -1 ; 135 + DB 1 , -1 ; 135 + DB 0 , -1 ; 180 + DB 0 , -1 ; 180 + DB -1 , -1 + DB -1 , -1 + DB -1 , 0 + DB -1 , 0 + DB -1 , 1 + DB -1 , 1 + DB 0 , 1 ; 0 TAB_ANGLE2: - DB 0,2 ; 0 - DB 1,2 ; 22 - DB 2,2 ; 45 - DB 2,1 ; 67 - DB 2,0 ; 90 - DB 2,-1 ; 112 - DB 2,-2 ; 135 - DB 1,-2 ; 157 - DB 0,-2 ; 180 - DB -1,-2 - DB -2,-2 - DB -2,-1 - DB -2,0 - DB -2,1 - DB -2,2 - DB -1,2 ; 0 - + DB 0 , 2 ; 0 + DB 1 , 2 ; 22 + DB 2 , 2 ; 45 + DB 2 , 1 ; 67 + DB 2 , 0 ; 90 + DB 2 , -1 ; 112 + DB 2 , -2 ; 135 + DB 1 , -2 ; 157 + DB 0 , -2 ; 180 + DB -1 , -2 + DB -2 , -2 + DB -2 , -1 + DB -2 , 0 + DB -2 , 1 + DB -2 , 2 + DB -1 , 2 ; 0 TAB_ANGLE3: - - DB 4,2 ; 67 - DB 4,1 ; 67 - - DB 4,0 ; 90 - DB 4,-1 ; 112 - DB 4,-2 ; 135 - DB 4,-3 ; 135 - DB 4,-4 ; 135 - DB 3,-4 ; 157 - DB 2,-4 ; 157 - DB 1,-4 ; 157 - - DB 0,-4 ; 180 - DB -1,-4 - DB -2,-4 - DB -3,-4 - DB -4,-4 - DB -4,-3 - DB -4,-2 - DB -4,-1 - - DB -4,0 - DB -4,1 - DB -4,2 - DB -4,3 - DB -4,4 ; 0 - DB -3,4 ; 0 - DB -2,4 ; 0 - DB -1,4 ; 0 - - DB 0,4 ; 0 - DB 1,4 ; 0 - DB 2,4 ; 22 - DB 3,4 ; 45 - DB 4,4 ; 45 - DB 4,3 ; 45 + DB 4 , 2 ; 67 + DB 4 , 1 ; 67 + DB 4 , 0 ; 90 + DB 4 , -1 ; 112 + DB 4 , -2 ; 135 + DB 4 , -3 ; 135 + DB 4 , -4 ; 135 + DB 3 , -4 ; 157 + DB 2 , -4 ; 157 + DB 1 , -4 ; 157 + DB 0 , -4 ; 180 + DB -1 , -4 + DB -2 , -4 + DB -3 , -4 + DB -4 , -4 + DB -4 , -3 + DB -4 , -2 + DB -4 , -1 + DB -4 , 0 + DB -4 , 1 + DB -4 , 2 + DB -4 , 3 + DB -4 , 4 ; 0 + DB -3 , 4 ; 0 + DB -2 , 4 ; 0 + DB -1 , 4 ; 0 + DB 0 , 4 ; 0 + DB 1 , 4 ; 0 + DB 2 , 4 ; 22 + DB 3 , 4 ; 45 + DB 4 , 4 ; 45 + DB 4 , 3 ; 45 MONSTR_ALL: @@ -1821,7 +1765,7 @@ MONSTR_LOOP: SUB (IX+M_X+1) ; положение монстра ADD A,64 JR Z,NO_M_OUT - BIT 7,A ; проверка на дальность + BIT 7,A ; проверка на дальность JR NZ,NO_M_OUT ; не выводить SUB 64 @@ -1838,7 +1782,7 @@ MONSTR_LOOP: SUB 64 NEG - LD H,A ; H - Y, L - X + LD H,A ; H - Y, L - X OR L JR Z,NO_M_OUT ; проверка на 0 @@ -1846,7 +1790,7 @@ MONSTR_LOOP: BIT 7,H JR Z,A_NO_ADD4 - LD A,H ; поворот на 180 -X->X; -Y->Y + LD A,H ; поворот на 180 -X->X; -Y->Y NEG LD H,A LD A,L @@ -1856,7 +1800,7 @@ MONSTR_LOOP: A_NO_ADD4: BIT 7,L JR Z,A_NO_ADD2 - LD A,L ; поворот на 90 Y->X; -X->Y + LD A,L ; поворот на 90 Y->X; -X->Y NEG LD L,H LD H,A @@ -1869,7 +1813,6 @@ A_NO_ADD2: ; H - Y-координата MONSTR_ALL1: - LD A,L ADD A,A ADD A,A @@ -1885,23 +1828,23 @@ MONSTR_ALL1: LD A,(PAGE_M_PLACE) OUT (SLOT1),A - LD E,(HL) ; угол младший + LD E,(HL) ; угол младший INC L - LD D,(HL) ; угол старший + LD D,(HL) ; угол старший INC L - LD C,(HL) ; высота + LD C,(HL) ; высота POP AF OUT (SLOT1),A LD A,D ADD A,B - LD D,A ; добавить квадрант + LD D,A ; добавить квадрант DEC C BIT 7,C JR Z,MONST_H1 - LD C,0 ; монстр рядом + LD C,0 ; монстр рядом MONST_H1: INC C LD (IX+M_HIGH),C ; положение по вертикали @@ -1926,21 +1869,18 @@ MONST_H1: LD (IX+M_HOR),L ; угол LD (IX+M_HOR+1),H - LD DE,128 - ADD HL,DE + ; LD DE,128 ; А чёб не упростить так: + ; ADD HL,DE ; LD DE,256+320-128 + ; LD DE,256+320 ; SBC HL,DE + ; AND A ; и всё... HL может переполняться при ADD 128? - нет + ; SBC HL,DE ; ; проверка попадания монстра в угол зрения + LD DE,256+320-128 + SBC HL,DE ; проверка попадания монстра в угол зрения - LD DE,256+320 - AND A - SBC HL,DE ; проверка попадания монстра в угол зрения CALL C,WALL - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF - + CALL SOUND NO_M_OUT: call MONSTR_NEXT_P @@ -1953,15 +1893,15 @@ MONSTR_NEXT_P: RET NZ LD A,(IX+M_VAR2) ; счетчик цикла - AND 0Fh + AND #0F RLCA RLCA RLCA RLCA ADD A,(IX+M_VAR2) ; добавить младший байт к старшему LD (IX+M_VAR2),A - AND 0F0h - RET NZ ; вернуться, если не 0 + AND #F0 + RET NZ ; вернуться, если не 0 ; JR NC,NO_ADD_MX BIT 6,(IX+M_VAR3) ; бит единичного показа цикла @@ -2013,15 +1953,15 @@ CONT_MONS: LD A,(IX+M_ADR+1) ; переключатель адреса ADD A,(IX+M_VAR4) ; сколько добавлять - AND 3Fh - OR 40h + AND #3F + OR #40 LD (IX+M_ADR+1),A - CP 40h ; признак завершения цикла + CP #40 ; признак завершения цикла RET SW_MONS: LD A,(IX+M_ADR) ; переключатель адреса - ADD A,40H + ADD A,#40 LD (IX+M_ADR),A AND A ; признак завершения цикла ;NO_ADD_MX: @@ -2055,25 +1995,25 @@ NO_SAVE: SAVE_HL: DW 0 SAVE_P1: DW 0 SAVE_P2: DW 0 -SAVE_RGA2: DB 0 +; SAVE_RGA2: DB 0 SAVE_PIC: - IN A,(RGMOD) + IN A,(SCREEN_SWITCH) AND 1 - LD HL,0C040H + LD HL,ScreenStartAddress JR NZ,SET_1X - LD HL,0C180H + LD HL,ScreenStartAddress + #0140 SET_1X: LD IX,TABLE_PIC LD A,(IX) AND A RET Z - LD DE,08436h + LD DE,#8436 SAVE_PIC_X: LD (SAVE_HL),HL ; Pic line - IN A,(RGADR) + IN A,(PORT_Y) LD (SAVE_RGA2),A LD C,SLOT2 @@ -2084,10 +2024,10 @@ SAVE_PIC_X: LD (SAVE_P2),BC LD A,#50 - OUT (C),A ; Screen + OUT (C),A ; Screen LD A,#FF - OUT (RGADR),A ; Line 1 + OUT (PORT_Y),A ; Line 1 LD A,(IX) OUT (SLOT2),A @@ -2097,7 +2037,6 @@ NEXT_SV_LN: LD B,160 LOOP_SV_PIC: - LD A,(HL) LD (DE),A INC HL @@ -2116,24 +2055,25 @@ LOOP_SV_PIC: INC IX LD A,(IX) OUT (SLOT2),A ; next page - LD DE,8000h + LD DE,#8000 NO_NEXT_PAGE: DJNZ LOOP_SV_PIC ; CALL SOUND - IN A,(RGADR) + IN A,(PORT_Y) DEC A - OUT (RGADR),A - CP 0FFh + OUT (PORT_Y),A + CP #FF JR NZ,NEXT_SV_LN LD BC,(SAVE_P2) OUT (C),B LD BC,(SAVE_P1) OUT (C),B - LD A,(SAVE_RGA2) - OUT (RGADR),A +SAVE_RGA2+1: + LD A,0 + OUT (PORT_Y),A RET diff --git a/DOOM2.asm b/DOOM2.asm index b025c17..87c1642 100644 --- a/DOOM2.asm +++ b/DOOM2.asm @@ -5,50 +5,50 @@ ;--------------------------------------- */ + DEFINE TEST_SCREEN 0 + +ScreenStartAddress EQU #C040 +;ScreenStartAddress EQU #C000 ; ;---------------------------[Defines section]--------------------------- - IFNDEF HARDWARE : IFNDEF ZXMAK2 : IFNDEF MAME : DEFINE HARDWARE 1 : ENDIF : ENDIF : ENDIF + 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 +;;;;;;; - 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 +; 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 - IFNDEF YesSound : DEFINE YesSound 0 : ENDIF +; 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 EXE_HEADER 1 -; DEFINE NEED_LOADER 1 - - IFDEF HARDWARE - DISPLAY "[]------[ Compilation target: Sprinter 2000 ]------[]" - ENDIF - IFDEF ZXMAK2 - DISPLAY "[]------[ Compilation target: emulator ZXMAK2 ]------[]" - ENDIF - IFDEF MAME - DISPLAY "[]------[ Compilation target: emulator MAME ]------[]" - ENDIF +; 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 и проверка на границы + DEVICE ZXSPECTRUM4096 ; модель с 4 метрами памяти + MMU 2 e, 0 ; нулевая страница в банку 2 и проверка на границы OUTPUT './Build/DOOM2/doom2.exe' ;----------------------------------------------------------------------- ; @@ -58,26 +58,29 @@ 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 +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 +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 @@ -89,179 +92,124 @@ TABLE_W EQU #2000 ; тек ELSE ORG org_addr - CLP_Buffer ENDIF - -BEGIN: - DI - - LD (CMD_Line),IX ; сохранить указатель на параметры запуска - LD HL,#8080 -CMD_Line: EQU $-2 -/* -; Доделать???!!!! - LD C,(HL) - LD B,0 - INC BC - INC BC - INC BC - ADD HL,BC ; указатель на полный путь до файла запуска - ld c,Dss.ChDir ; переход в каталог DOOM2 на всякий случай - rst ToDSS - DI -*/ - ; IN A,(SLOT3) - ; LD C,BIOS.SPRINTER_ALL - ; RST ToBIOS +;[]-------------------------------------------------------------------[] + +;[]-------------------------------------------------------------------[] +BEGIN: DI + LD (CMD_Line),IX ; сохранить указатель на параметры запуска +CMD_Line+1: + LD HL,#8080 + CALL SET_HOME_PATH ;--------[загрузка ресурсов игры]------- -; выполнено в виде костыльной заглушки - call Load_Resources - - IFDEF NEED_LOADER -Loader_length EQU $-BEGIN - ELSE -Loader_length EQU 0 - ENDIF + CALL CHECK_SYSTEM + ; + LD HL,MESSAGES_TXT.Loading + LD C,Dss.PChars + RST ToDSS + ; + CALL SAVE_ALL + ; выполнено в виде костыльной заглушки + CALL Load_Resources ;--------------------------------------- ;-----[Инициализация 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? -1: - CALL CLEAR_COVOX_X - DEC A - CP #80 - JR NZ,1B + CALL CLEAR_COVOX ;--------------------------------------- ; -; ENDIF ;--------------------------------------- - IN A,(SLOT3) - PUSH AF - - ld a,(RAMBlkIDs) - ld bc,BIOS.GetMemPage - rst ToBIOS - di - ld (MemPatch_PalitrePage),a - - ld a,(RAMBlkIDs+3) - ld bc,BIOS.GetMemPage - rst ToBIOS - di - ld (MemPatch_D2_FRAM_page),a - DI - - 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 + 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 - IN A,(SLOT3) - EX AF,AF' - LD A,DCP_PAGE - OUT (SLOT3),A - LD A,ACEX.SCALE - ;----[открыть порты масштабирования]---- -; -; один внутренний порт масштабирования -; маппится на несколько диаппазонов -; внешних портов -; Маска 1110 0000 1110 0111 +; один внутренний порт масштабирования маппится на диаппазон +; #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 +;-----------------------------------------------------------------------; - 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 -;--------------------------------------- - - EX AF,AF' - OUT (SLOT3),A - EXX - LD BC,#100 ; масштаб 1:1 - LD D,0 - OUT (C),D - EXX - -; - IFN NORM_syncPORT - DI - LD A, +(high im_handler_emulator) - LD I,A -; IM 2 - пока не включаем, процедура прерывания прыгает в кэш, а он не вставлен и не прогружен - ENDIF +;-----------------------------------------------------------------------; CALL MAIN +;-----------------------------------------------------------------------; +;-----------------------------------------------------------------------; -;----[LP_OPEN_S]------------------------ -; Открытие стандартных окон - - LD HL,5104H - 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 -;======================================= -; +; 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,10h - LD BC,1FFDh - OUT (C),A - LD A,0A0h ; Reset page. Работает ли?!!!!!!!!! - OUT (SLOT3),A - LD (0C000h),HL -HALT_L: - DI - HALT - JR HALT_L -;--------------------------------------- - +;----------------[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: - FRAM_OFF + IN A,(FastRAM.OFF) CALL SET_PAL - FRAM_ON + IN A,(FastRAM.ON) RET SET_PAL: @@ -280,8 +228,8 @@ SET_PAL: IN A,(SLOT3) PUSH AF - LD A,#FF -MemPatch_PalitrePage equ $-1 +PalitrePage+1: + LD A,#FF OUT (SLOT3),A LD HL,#C000 @@ -290,7 +238,7 @@ MemPatch_PalitrePage equ $-1 LD B,#FF LD C,BIOS.PIC_SET_PAL ; установка палитры RST ToBIOS - DI + ;DI LD HL,#C000 LD DE,0 @@ -298,7 +246,7 @@ MemPatch_PalitrePage equ $-1 LD B,#FF LD C,BIOS.PIC_SET_PAL ; установка палитры RST ToBIOS - DI + ;DI POP AF OUT (SLOT3),A @@ -310,55 +258,97 @@ CLEAR_GRAF_SCR: IN A,(SLOT3) PUSH AF - LD (MemPatch_SPSave2),SP + LD (SPSave2),SP LD A,#50 OUT (SLOT3),A - LD A,0 - OUT (RGADR),A + XOR A + OUT (PORT_Y),A - LD SP,#C040+640 + LD SP,ScreenStartAddress + 640 LD B,640/4 -;!!!!!!!!!!![оптимизировать]!!!!!!!!!!!! -LOOP_CLS: +;!TODO ![оптимизировать]! ACC_SetBlockSize - LD E,0 - ACC_Off ; !FIXIT убрать????? - - LD D,E - + LD E,0 + LD D,E +LOOP_CLS: ACC_FillScreenOneByte - PUSH DE - PUSH DE + PUSH DE + PUSH DE ACC_Off - DJNZ LOOP_CLS ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -MemPatch_SPSave2 EQU $+1 - LD SP,0 +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_RGA: DB 0 +;SAVE_PORT_Y: DB 0 ; ; CLEAR_COVOX: LD A,#80 - -CLEAR_COVOX_X: LD BC,CBL.COVOX_OUT - -; IF YesSound -CLEAR_CBL: - OUT (C),A - DJNZ CLEAR_CBL -; ENDIF +.CLEAR: OUT (C),A + DJNZ .CLEAR RET ; ; @@ -366,25 +356,22 @@ CLEAR_CBL: CLEAR_SP_PAL: IN A,(SLOT3) PUSH AF - + ; LD A,#50 OUT (SLOT3),A - + ; LD B,61 - -LOOP_PAL_ALL: +.LOOP_PAL_ALL: PUSH BC - - LD BC,RGADR - -LOOP_PAL_C: + LD BC,PORT_Y +.LOOP_PAL_C: OUT (C),B -; -PAL_RESES_ADR+1: LD HL,#C3F0 -; +.RESES_ADR+1: + LD HL,#C3F0 + ; LD D,16 - -LOOP_PAL_D: + ; +.LOOP_PAL_D: LD A,(HL) RRA RRA @@ -396,63 +383,46 @@ LOOP_PAL_D: LD E,A LD A,(HL) SUB E - JR NC,NO_Z + 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 - + JR NZ,.LOOP_PAL_D + ; CALL SOUND1 - DJNZ LOOP_PAL_C - + 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: + JR NZ,.NO_PAL_EXE + DJNZ .LOOP_PAL_ALL +.NO_PAL_EXE: POP AF OUT (SLOT3),A RET ; ; ; -MAIN: - CALL INIT_TABLE +MAIN: CALL INIT_TABLE RET C - IN A,(RGADR) - LD (SAVE_RGA),A LD A,#C0 - OUT (RGADR),A + OUT (PORT_Y),A CALL RECALC_MAP + RET C ; нужно ли???!!! ;----!!!!!!!!!!!!!!!!!!!!!!!!!---------- ;--------------------------------------- - - - LD A,(SAVE_RGA) - OUT (RGADR),A - - 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 ;--------------------------------------- ;------[Открытие стандартных окон]------ @@ -464,78 +434,49 @@ MAIN: ; HL - место на экране по знакоместам ; (копия в IX+2,3), в новых версиях ; биоса значение HL не существенно + ; LD HL,#4000 - LD E,1 - LD B,8 ; графическое окно 0, HL - положение окна - LD C,BIOS.LP_OPEN_S + LD E,0 + LD BC,BIOS.LP_OPEN_S.Graf_0 ; графическое окно 0, HL - положение окна RST ToBIOS - + ; LD HL,#5000 LD E,1 - LD B,9 ; графическое окно 1, HL - положение окна - LD C,BIOS.LP_OPEN_S + LD BC,BIOS.LP_OPEN_S.Graf_1 ; графическое окно 1, HL - положение окна RST ToBIOS ;--------------------------------------- - LD A,1 - OUT (RGMOD),A + IF TEST_SCREEN + ; + CALL MAKE_SCR_ST1 + ; + ENDIF + + + + LD A,(RESTORE_ALL.scr) + OUT (SCREEN_SWITCH),A ;----[переброс части кода в FastRAM]---- IN A,(SLOT3) PUSH AF - LD A,#FF -MemPatch_D2_FRAM_page equ $-1 +D2_FRAM_page+1: + LD A,#FF OUT (SLOT3),A - IF YesSound -;----[] -; Запрашиваем страницы для музла и -; каталога, сохраняем их № в коде -; 0 страница блока - CatPage -; 1 страница блока - SndPage -; -; ДОДЕЛАТЬ!!! -; надо потом нормально выделять и -; освобождать память, а не вот это всё -; - ld b,1 - ld c,Dss.GetMem - rst ToDSS - PUSH AF ; ID блока на стек - ld bc,BIOS.GetMemPage - rst ToBIOS - LD (MemPatch_CatPage),a - ld b,1 - POP AF ; ID блока со стека - ld c,BIOS.GetMemPage - rst ToBIOS - 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 - + ; POP AF OUT (SLOT3),A ;--------------------------------------- ; LD HL,#C3E0 - LD (PAL_RESES_ADR),HL + LD (CLEAR_SP_PAL.RESES_ADR),HL ; ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; Странное место. Можно же сразу в коде @@ -548,33 +489,36 @@ MemPatch_D2_FRAM_page equ $-1 CALL CLEAR_COVOX - FRAM_OFF - CALL INIT_HDD_WORK - FRAM_ON + IN A,(FastRAM.OFF) + CALL INIT_HDD_WORK + IN A,(FastRAM.ON) + SOUND_SWITCH: - IF YesSound - 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 + 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,#80 - LD E,A - LD D,#80 - CALL SET_SND_FILE - CALL INIT_SOUND - ENDIF + 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 @@ -583,6 +527,7 @@ MORE_PIC: LD (Y_SPEED),HL LD HL,#0200 LD (A_SPEED),HL + HELP_2: CALL CLEAR_SP_PAL LD A,6 @@ -624,20 +569,21 @@ PAUS_START: 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,300H + LD HL,#0300 LD (X_SPEED),HL - LD HL,382H + LD HL,#0382 LD (Y_SPEED),HL - LD HL,500H + LD HL,#0500 LD (A_SPEED),HL JR DM_LOOP @@ -669,101 +615,63 @@ DM_LOOP: ; CALL Z,SWITCH_XX_W ; CALL CRAZY_WALL - DI + ;DI ; CALL SET_PAL_x ; CALL FIRE_S - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + + CALL SOUND CALL CALC_NEW_PLACE CALL MAP_PLACE CALL MAKE_MAP ; соорудить относительную карту - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND CALL PRECALC_PLACE - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND - CALL TRACE ; прорисовка! + CALL TRACE ; прорисовка! - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND ; CALL MONSTR_OUT CALL MONSTR_ALL - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND CALL WEAPON_OUT - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND CALL MAP_OUT CALL CLEAR_Z_BUFER LOOP_SCR: - IF NORM_syncPORT - IN A,(SCR_SyncPort) - BIT 5,A - JR NZ,CONT_WORK + IN A,(SCR_SyncPort) + BIT 5,A + JR NZ,CONT_WORK - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF - - JR LOOP_SCR - - ELSE - EI - HALT - ENDIF + CALL SOUND + JR LOOP_SCR CONT_WORK: CALL SCR_SWITCH - IF YesSound - CALL SOUND - ; ELSE - ; CALL YesSoundZero - ENDIF + CALL SOUND JP DM_LOOP SCR_SWITCH: - IN A,(RGMOD) - AND 1 + IN A,(SCREEN_SWITCH) + ;AND 1 XOR 1 - OUT (RGMOD),A + OUT (SCREEN_SWITCH),A - LD DE,#C040 + LD DE,ScreenStartAddress JR Z,SET_1 - LD DE,#C180 + LD DE,ScreenStartAddress + #0140 SET_1: LD (SCREEN_1),DE RET @@ -771,22 +679,18 @@ SET_1: PAUSE_INT: CALL SOUND1 - IF NORM_syncPORT - IN A,(SCR_SyncPort) - BIT 5,A - JR NZ,PAUSE_INT + + 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 - ELSE - EI - HALT - ret - ENDIF + CALL SOUND1 + IN A,(SCR_SyncPort) + BIT 5,A + RET NZ + JR PAUSE_INT1 + PAUSE_SNDC: JP SOUND @@ -799,48 +703,48 @@ SOUND1: ; MONSTR_DAT: -M_PAGE EQU $-MONSTR_DAT - DB 0 ; страница с общими данными монстра (картинки) -; признак конца таблицы монстров -M_ADR EQU $-MONSTR_DAT - DW #4000 ; адрес в странице +M_PAGE EQU $-MONSTR_DAT + DB 0 ; страница с общими данными монстра (картинки) +; признак конца таблицы монстров +M_ADR EQU $-MONSTR_DAT + DW #4000 ; адрес в странице ; -M_HIGH EQU $-MONSTR_DAT - DB #40 ; вертикальное положение +M_HIGH EQU $-MONSTR_DAT + DB #40 ; вертикальное положение ; -M_HOR EQU $-MONSTR_DAT - DW 160 ; горизонтальное положение +M_HOR EQU $-MONSTR_DAT + DW 160 ; горизонтальное положение ; -M_VAR2 EQU $-MONSTR_DAT - DW 0008 ; счетчик переключений +M_VAR2 EQU $-MONSTR_DAT + DW 0008 ; счетчик переключений ; -M_XADD EQU $-MONSTR_DAT - DW #0100 ; x-add параметры - DB #40,#40 ; ширина-высота ??? +M_XADD EQU $-MONSTR_DAT + DW #0100 ; x-add параметры + DB #40,#40 ; ширина-высота ??? ; -M_X EQU $-MONSTR_DAT - DW #0700 ; координата X +M_X EQU $-MONSTR_DAT + DW #0700 ; координата X ; -M_Y EQU $-MONSTR_DAT - DW #0700 ; координата Y +M_Y EQU $-MONSTR_DAT + DW #0700 ; координата Y ; -M_VX EQU $-MONSTR_DAT - DW 0000 ; скорость движения по X +M_VX EQU $-MONSTR_DAT + DW 0000 ; скорость движения по X ; -M_VY EQU $-MONSTR_DAT - DW 0000 ; скорость движения по Y +M_VY EQU $-MONSTR_DAT + DW 0000 ; скорость движения по Y ; -M_TYPE EQU $-MONSTR_DAT - DW 0000 ; тип монстра уничтожаемый, неуничтожаемый -; исчезающий при ударе о стенку, не исчезающий -; исчезающий при соприкосновении с игроком, -; не исчезающий.... +M_TYPE EQU $-MONSTR_DAT + DW 0000 ; тип монстра уничтожаемый, неуничтожаемый +; исчезающий при ударе о стенку, не исчезающий +; исчезающий при соприкосновении с игроком, +; не исчезающий.... -M_VAR EQU $-MONSTR_DAT - DB 0 ; Переменные конкретного монстра +M_VAR EQU $-MONSTR_DAT + DB 0 ; Переменные конкретного монстра ; -M_VAR3 EQU $-MONSTR_DAT - DB 0 +M_VAR3 EQU $-MONSTR_DAT + DB 0 ; Переменная монстра бит 0,1 - деление по ширине ; bit 2 - переключать по старшему ; bit 3 - @@ -849,11 +753,11 @@ M_VAR3 EQU $-MONSTR_DAT ; bit 6 - показывать один цикл ; bit 7 - не выводить ; -M_VAR4 EQU $-MONSTR_DAT - DB 0 ; Переключение монстра ADD параметр +M_VAR4 EQU $-MONSTR_DAT + DB 0 ; Переключение монстра ADD параметр MONSTR_D_LEN EQU $-MONSTR_DAT ;следующий монстр - DB 0 ; - отсутствует + DB 0 ; - отсутствует ; ;**************************************** ; IX+0 - страница стенки @@ -867,272 +771,39 @@ MONSTR_D_LEN EQU $-MONSTR_DAT ;сле ; IX+11 - реальная высота стенки ??? WALL_DATS: - DB 0 - DW #4000 - DB #40 - DW #00A0 ; 160 - DB 0,0 + DB 0 + DW #4000 + DB #40 + DW #00A0 ; 160 + DB 0,0 MONSTR_DATS: - DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 ; ; ************************************** ; -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: -; - LD DE,NAME1 -NAME_S EQU $-2 -; - 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 -; -FIND_FILE: ;DE - name - 11 символов -; - 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 0E0H - LD L,A - - POP BC - OUT (C),B - AND A - RET ; HL - данные файла в странице 6 - -NEXT_NAME: - POP DE - LD A,L - AND 0E0H - LD L,A - LD BC,020H - 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,(RGADR) - PUSH AF - EX AF,AF' - - RST ToBIOS ; читать сектора с винчестера, функция #45 - DI - - POP AF - OUT (RGADR),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 ;*************************************** ;*************************************** @@ -1145,12 +816,12 @@ MADE_FFING: NEXT_BYTE_: LD A,(HL) - CP 0F7H + CP #F7 JR NZ,NO_FFING LD (HL),0FFH NO_FFING: INC HL - BIT 7,H ;!!!!!проверка на конец страницы #C000-FFFF!!!!! + BIT 7,H ;!!!!!проверка на конец страницы #C000-FFFF!!!!! JR NZ,NEXT_BYTE_ OUT (C),B @@ -1167,32 +838,36 @@ INIT_TABLE: ;----[Читаем первый блок таблиц E:]-----; Tables disk Doom.trd ;--------------------------------------- !!!!! Заменить к чертям на свою подгрузку блоками! - LD A,(RAMBlkIDs) + 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 - LD A,(HL) - LD (PAGE_WEAPON),A - INC HL - LD A,(HL) - LD (SKY_1),A - INC HL - LD A,(HL) - LD (SKY_2),A + ; INC HL + ; INC HL + ; INC HL - LD HL,TABLE_MAIN - LD A,26 - ADD A,L - LD L,A + ; !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: @@ -1202,7 +877,7 @@ NEXT_HL_FFING: PUSH DE PUSH BC - CALL MADE_FFING ; замена FF-ами прозрачных цветов + CALL MADE_FFING ; замена FF-ами прозрачных цветов POP BC POP DE @@ -1218,11 +893,11 @@ NEXT_HL_FFING: LD A,(MONSTR_DATS+6) LD (BAR_PAGE),A - LD HL,TABLE_MAIN - LD A,35 - ADD A,L - LD L,A - LD A,(HL) + ;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 @@ -1230,58 +905,63 @@ NEXT_HL_FFING: LD A,(PAGE_WEAPON) CALL MADE_FFING - LD HL,TABLE_MAIN - LD A,33 - ADD A,L - LD L,A - LD A,(HL) - LD (EFF_PAGE),A ; звук выстрела + ;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,(HL) - LD (PAGE_M_PLACE),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 ; получить идентификатор блока от рамдиска + LD A,3 ;2 ; походу, карта уровня и ещё что-то + LD C,0CEH ; получить идентификатор блока от рамдиска RST ToBIOS ret c ;--------------------------------------- */ - ld a,(RAMBlkIDs+2) + ld a,(RAMBlkIDs.d2_table) LD HL,TABLE_TRACE ld c,BIOS.GetMemBlkPages ; получить список страниц блока A rst ToBIOS RET C LD A,B - CP 32 - SCF - RET NZ + ; + CP 33 + CCF + RET C + ;CP 32 + ;SCF + ;RET NZ + ; ; ;----[Читаем третий блок таблиц G:]-----; Tables disk mapw*.d2 /* - LD A,2 ;1 ; рамдиск стенок - LD C,0CEH ; получить идентификатор блока от рамдиска + LD A,2 ;1 ; рамдиск стенок + LD C,0CEH ; получить идентификатор блока от рамдиска RST ToBIOS ret c ;--------------------------------------- */ - ld a,(RAMBlkIDs+1) + ld a,(RAMBlkIDs.map_wall) LD HL,TABLE_WALL ld c,BIOS.GetMemBlkPages ; получить список страниц блока A rst ToBIOS RET C LD A,B - CP 33 + CP 17 CCF - RET C ; B - размер рамдиска + RET C ; B - размер рамдиска DEC A - LD (MAP_ELS),A ; число стенок + LD (MAP_ELS),A ; число стенок ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /* @@ -1309,7 +989,7 @@ NEXT_HL_FFING: RST ToBIOS AND A RET -; ;!!!!!!!сделать сохранение скриншотов +; ;!TODO сделать сохранение скриншотов ; LD A,4 ; LD C,BIOS.GET_RAMD_ST ; получить идентификатор блока от рамдиска ; RST ToBIOS @@ -1329,22 +1009,22 @@ NEXT_HL_FFING: */ ;*************************************** - DS #8700-$ ;ВЫРАВНИВАНИЕ + BLOCK #8700-$,0 ;ВЫРАВНИВАНИЕ ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; тут выравнивание на 0 в младшем ; бите адреса -TABLE_MAIN: DS 37 ; буфер под станицы файла resurses.res +1 +TABLE_MAIN: DS 37 ; буфер под страницы файла resurses.res +1 TABLE_PIC: DS 6 ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;-------[загрузка ресурсов игры]-------- Load_Resources: in a,(SLOT3) - ld (.MemPatch_SavePage),a + ld (.SavePage),a - LD B,FilesTBL.END - LD DE,FilesTBL LD HL,RAMBlkIDs + LD DE,FilesTBL + LD B,FilesTBL.END .LR_loop: PUSH BC ;++счётчик @@ -1353,7 +1033,7 @@ Load_Resources: ex de,hl ld b,(hl) ; FilesTBL inc hl - ld (.MemPatch_FileName),hl + ld (.FileName),hl ; B - размер блока в страницах ld c,Dss.GetMem @@ -1377,12 +1057,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 ;--буфер со списком страниц @@ -1394,32 +1074,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 ;-[разобраться с таблицами!!!]- @@ -1437,30 +1117,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 @@ -1480,10 +1169,14 @@ FilesTBL: .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-$ ;ВЫРАВНИВАНИЕ + BLOCK #8B00-$,0 ;ВЫРАВНИВАНИЕ RECALC_MAP: ; пересчет карты на реальные номера @@ -1508,14 +1201,14 @@ RECALC_M2: 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 20H ; код пробела + SUB ' ' JR Z,ZERO_PRP - LD A,05Fh ; препятствие + LD A,#5F ; препятствие JR ONE_PRP ZERO_PRP: XOR A @@ -1525,9 +1218,9 @@ ONE_PRP: JR NZ,RECALC_M2X INC H LD A,H - AND 0Fh + AND #0F JR NZ,RECALC_M2X - JR NO_PROCESS ; закончить + JR NO_PROCESS ; закончить ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; Сделать условие на максимальное кол-во @@ -1548,13 +1241,12 @@ NO_PRP: CALL Z,MONSTR_POS2 CP 'P' ; огонь bfg CALL Z,MONSTR_POS3 - SUB 20H + SUB #20 JR Z,ZERO_WOLL - SUB 10H + SUB #10 JR C,ZERO_WOLL -; - CP 15 -MAP_ELS EQU $-1 +MAP_ELS+1: + CP 15 ; JR NC,ZERO_WOLL @@ -1584,16 +1276,16 @@ NO_ZERO_W: JR NZ,NO_PRP INC H LD A,H - AND 0Fh + AND #0F JR NZ,NO_PRP LD A,H - CP 50H + CP #50 JR NZ,NO_ST LD (MONSTR_END_T),IX ; конец таблицы монстров NO_ST: LD A,H - CP 80h + CP #80 JR NZ,RECALC_X NO_PROCESS: @@ -1807,65 +1499,381 @@ MONSTR_POS: 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 + 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 - - DS TABLES_START+#74-$ ;ВЫРАВНИВАНИЕ - -NAMES: DB 6,1 -LAST_KEY: DB 0 - - DS TABLES_START+#7C-$ ;ВЫРАВНИВАНИЕ - -NAME1: DB "_1X62 CBL " -NAME2: DB "2NDREAL3CBL " -NAME3: DB "_ICT2 CBL " -;NAME4: DB "MISS2 CBL " -;NAME5: DB "5EL CBL " -NAME6: DB "_UNNY2 CBL " -NAME8: DB "94956C CBL " -NAME9: DB "_ENI511CCBL " +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 " ; - IFN NORM_syncPORT +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" +;-----------------------------------------------------------------------; -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 +;-----------------------------------------------------------------------; + 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: +;FRAM_PROG_1000H: include 'D2_FRAM.asm' -; - END ; \ No newline at end of file diff --git a/Music_4x.asm b/Music_4x.asm new file mode 100644 index 0000000..c5d45ca --- /dev/null +++ b/Music_4x.asm @@ -0,0 +1,493 @@ + +;----------------------------------------------------------------------- +;!FIXIT переделать музло на API 5x +;-------[инициализация винчестера]------; +INIT_HDD_WORK: +.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) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD HL,SYS_PAGE.MSD_FAT_SEC + LD DE,MSD_DATS + LD BC,16 ;!HARDCODE + LDIR + EX AF,AF' + OUT (SLOT3),A + + ;[x] music and dirs + LD HL,SND_DIR + LD DE,Temp_Buffer + LD A,FAT_ATTR.DIRECTORY + LD BC,Dss.F_First.FATname + RST ToDSS + JR NC,.start_setup + ; + LD A,#C9 ; RET opcode - disable music + LD (SoundOnOff2),A + RET + ; +.start_setup: +;-=-=-=-=-=-=-=- + LD HL,(Temp_Buffer+26) ; first dir cluster + CALL NSECTOR + LD (MSD_DATS.MSD_CAT_SEC2),HL + LD (MSD_DATS.MSD_CAT_SEC),IX + ;JP READ_DIR +;-=-=-=-=-=-=-=- + + + + ; В FAT12/FAT16 для корневого каталога выделено место между FAT и данными. + ; Как узнать его размер в секторах? Число элементов корневого каталога умножаем на 32, + ; добавляем размер сектора, вычитаем единицу и делим это всё на размер сектора. + ; Кластер папки #2258 + ; IX:HL относительный сектор папки #897E0 (E0 97 08 00) + ; +;.skip_dir: + ; LD DE,(MSD_DATS.MSD_CAT_SEC) ; CAT TABLE. абсолютный номер сектора младшая часть + ; LD IX,(MSD_DATS.MSD_CAT_SEC2) ; абсолютный номер сектора старшая часть +;-----[читать секторы с винчестера]----- + +READ_DIR: + LD HL,#C000 ; адрес буфера данных + LD DE,(MSD_DATS.MSD_CAT_SEC) ; CAT TABLE. абсолютный номер сектора младшая часть + LD IX,(MSD_DATS.MSD_CAT_SEC2) ; абсолютный номер сектора старшая часть + LD B,32 ; число читаемых секторов +CatPage+1: + LD A,0 ; страница буфера, если адрес в окне #C000 + LD C,BIOS.HDD_READ ; IX:DE - абсолютный номер сектора + RST ToBIOS ; загрузить CAT + RET + +; KOSTILYI: +; INC IX +; RET +;--------------------------------------- + +MSD_DATS: +.MSD_FAT_SEC DW 00 +.MSD_FAT_SEC2 DW 00 +.MSD_CAT_SEC DW 00 +.MSD_CAT_SEC2 DW 00 +.MSD_DAT_SEC DW 00 +.MSD_DAT_SEC2 DW 00 +.CLASTER_LEN DW 00 +.CLASTER_LEN2 DW 00 + +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: + 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.CLASTER_LEN + 1) ; длина кластера в байтах + 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.MSD_DAT_SEC) + ADD IX,DE + LD DE,(MSD_DATS.MSD_DAT_SEC2) + 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 + ; + LD A,CBL.BUFFER_PAGE + OUT (SLOT3),A + IN A,(PORT_Y) + PUSH AF + EX AF,AF' + RST ToBIOS ; читать сектора с винчестера, функция #45 + ; + 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 DE,SYS_PAGE.MS_BPB+FAT_ID + LD HL,.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,(DE) + 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) ; Размер сектора + LD A,B + RL C + RLA + RL C + RLA + RL C + RLA + LD C,A + LD B,0 ; BC - число файловых записей в секторе + LD (SYS_PAGE.FilesPerSector),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 BC,0 + LD D,B + LD (SYS_PAGE.SectorsPerCluster),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) ; Размер сектора + ; D = 0 + LD H,D + LD L,D + LD E,D + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + LD D,A + XOR A +.NEXT_ADD3: + ADD HL,BC ; Вычисление длины кластера + ADC A,E + DEC D + JR NZ,.NEXT_ADD3 + + LD (SYS_PAGE.CLASTER_LEN),HL + LD B,E + LD C,A + LD (SYS_PAGE.CLASTER_LEN2),BC + ; + ; DE=0 + EX DE,HL ;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' + + +;-=-=-=-=-=-=-=- +; in: HL - CLUSTER +; out: HL:IX - SECTOR +NSECTOR: + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + ; + LD DE,0 ;!FIXIT for FAT32 + DEC HL + DEC HL + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + ; + RRA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D + LD DE,(MSD_DATS.MSD_DAT_SEC) ;first data sector ;!FIXIT а если начальный сектор > #FFFF + XOR A + ADD IX,DE + LD DE,(MSD_DATS.MSD_DAT_SEC2) + ADC HL,DE + ;!TODO а надо ли проверять переполнение HL:IX? + RET +;-=-=-=-=-=-=-=- \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 95c15f4..a0e68ce 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 95c15f46dcd79b9ea7f60eca0011152305fbc366 +Subproject commit a0e68ce3a19bd47537585e49bfbf5e45fab197a1