diff --git a/D2_FRAM.asm b/D2_FRAM.asm index 6d0453e..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,19 +45,19 @@ 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 (PORT_Y),A ACC_CopyScreenBlock @@ -118,7 +116,7 @@ NO_NEXT_SKY: EXX SCREEN_1+1: - LD DE,#C040 ; начало экрана + LD DE,ScreenStartAddress ; начало экрана LD C,0 ;!!!!!!!!!!!!!!!!!!!!!!!!!! EXX ; @@ -154,7 +152,6 @@ PLACE_L+1: OUT (SLOT1),A LD (CONT_PAGE),A ; JR TRACE_LOOP - TRACE_LOOP: LD A,#50 OUT (SLOT3),A @@ -162,29 +159,28 @@ TRACE_LOOP: 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 (PORT_Y),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 @@ -234,33 +230,33 @@ PLACE_L2+1: LD A,5 ; 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 (PORT_Y),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 @@ -268,7 +264,7 @@ PLACE_L2+1: LD A,5 HIGH_1: ; A - высота, с которой рисуется стенка ACC_SetBlockSize - LD (DE),A ; число точек потолка и пола! & LINE-Z-bufer + LD (DE),A ; число точек потолка и пола! & LINE-Z-Buffer ACC_Off NEG ; получить положение начала пола OUT (PORT_Y),A @@ -873,40 +869,39 @@ WALL: IN A,(SLOT3) LD (WALL_SLOT1_RET),A IN A,(PORT_Y) LD (WALL_PORT_Y_RET),A - LD A,#58 + LD A,#5C OUT (SLOT3),A 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 @@ -930,7 +925,7 @@ NO_DEL4: ; ; в A сколько линий до начала экрана ;WALL_NO_SCF: ; -; LD HL,140h +; LD HL,#0140 ; AND A ; SBC HL,DE ; LD A,L ; в A - сколько линий осталось до конца экрана?? @@ -947,9 +942,10 @@ NO_DEL4: ; 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 @@ -960,58 +956,59 @@ WOLL_LOOP: 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 (PORT_Y),A ; задать порт Y - + OUT (PORT_Y),A ; задать порт Y + ;!FIXIT тут может писаться в область шрифтов ACC_CopyScreenBlock - LD (DE),A ; вывести линию + LD (DE),A ; вывести линию ACC_Off LD A,E @@ -1021,16 +1018,16 @@ NO_Z_A: ; NO_WRITE_LINE: - INC DE ; новое значение X + INC DE ; новое значение X LD A,C X_ADD2+1: - ADD A,0 ; X-add-parameter 2 + ADD A,0 ; X-add-parameter 2 LD C,A X_ADD+1: - LD A,0 ; X-add-parameter + LD A,0 ; X-add-parameter ADC A,H - LD H,A ; следующая линия WOLL + LD H,A ; следующая линия WOLL DJNZ WOLL_LOOP @@ -1174,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 @@ -1605,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 @@ -1671,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: @@ -1775,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 @@ -1792,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 @@ -1800,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 @@ -1810,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 @@ -1823,7 +1813,6 @@ A_NO_ADD2: ; H - Y-координата MONSTR_ALL1: - LD A,L ADD A,A ADD A,A @@ -1839,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 ; положение по вертикали @@ -1880,12 +1869,14 @@ 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 @@ -1902,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) ; бит единичного показа цикла @@ -1962,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: @@ -2009,9 +2000,9 @@ SAVE_P2: DW 0 SAVE_PIC: IN A,(SCREEN_SWITCH) AND 1 - LD HL,#C040 + LD HL,ScreenStartAddress JR NZ,SET_1X - LD HL,#C180 + LD HL,ScreenStartAddress + #0140 SET_1X: LD IX,TABLE_PIC LD A,(IX) diff --git a/DOOM2.asm b/DOOM2.asm index ce05c57..89535c4 100644 --- a/DOOM2.asm +++ b/DOOM2.asm @@ -5,7 +5,8 @@ ;--------------------------------------- */ - +ScreenStartAddress EQU #C040 +;ScreenStartAddress EQU #C000 ; ;---------------------------[Defines section]--------------------------- DEFINE EXE_HEADER 1 @@ -71,15 +72,15 @@ CMD_Line+1: LD HL,#8080 CALL SET_HOME_PATH ;--------[загрузка ресурсов игры]------- -; выполнено в виде костыльной заглушки LD HL,Loading_TXT LD C,Dss.PChars RST ToDSS ; + CALL SAVE_ALL + ; выполнено в виде костыльной заглушки CALL Load_Resources ; - CALL SAVE_PAL - CALL SAVE_TXT_SCREEN + ;CALL SAVE_TXT_SCREEN ; LD A,Dss.SetVMod.grf320x256 ; LD BC,Dss.SetVMod.Screen_1 ; RST ToDSS @@ -111,7 +112,7 @@ CMD_Line+1: ld a,(RAMBlkIDs.d2_fram) ld (D2_FRAM_page),a -;----[] +;----[;!FIXIT переделать музло на API 5x] ; Запрашиваем страницу для каталога ; сохраняем её № в коде ; @@ -142,8 +143,8 @@ CMD_Line+1: CALL SET_PAL ;----[открыть порты масштабирования]---- -; один внутренний порт масштабирования маппится на диаппазон #XX00 -; внешних портов. Write, Dos off, CNF 0. +; один внутренний порт масштабирования маппится на диаппазон +; #XX00 внешних портов. Write, Dos off, CNF 0. LD A,1 LD HL, %0000'0100'0000'0000 ; значение LD DE, %1111'1110'0110'1111 ; маска @@ -166,7 +167,7 @@ CMD_Line+1: ; EX AF,AF' ; OUT (SLOT3),A ; Активация Акселя масштабирования, обратно только через ресет - LD BC,#100 ; C - масштаб 1:1 + LD BC,#0100 ; C - масштаб 1:1 OUT (C),C ;----------------------------------------------------------------------- @@ -188,18 +189,6 @@ CMD_Line+1: ; ;-----------[EXIT Procedure]------------; RETURN_POINT: -; DI -; LD A,#10 -; LD BC,#1FFD -; OUT (C),A -; LD A,RESET_PAGE -; OUT (SLOT3),A -; LD (#C000),HL -; HALT_L: -; ;DI -; HALT -; JR HALT_L - IN A,(FastRAM.OFF) LD A,SYS_PORT.BIOS OUT (SYS_PORT.RAM),A @@ -210,6 +199,10 @@ RETURN_POINT: ; CALL RESTORE_ALL ; + LD HL,GOTO_EXIT + LD C,Dss.PChars + RST ToDSS + ; .loop: LD BC,Dss.Exit RST ToDSS JR .loop @@ -299,19 +292,18 @@ CLEAR_GRAF_SCR: 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 LD D,E +LOOP_CLS: ACC_FillScreenOneByte PUSH DE PUSH DE ACC_Off - DJNZ LOOP_CLS ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SPSave2+1: @@ -466,9 +458,9 @@ MAIN: CALL INIT_TABLE ; !FIXIT переделать логику под новый биос? ;---[установка синхры, очистка экрана]-- - LD A,2 ; режим Pentagon - 320 строк в экране - LD C,BIOS.FN_SYNC - RST ToBIOS + ; LD A,2 ; режим Pentagon - 320 строк в экране + ; LD C,BIOS.FN_SYNC + ; RST ToBIOS ;--------------------------------------- ;------[Открытие стандартных окон]------ @@ -480,45 +472,22 @@ MAIN: CALL INIT_TABLE ; HL - место на экране по знакоместам ; (копия в IX+2,3), в новых версиях ; биоса значение HL не существенно + ; LD HL,#4000 - LD E,1 + LD E,0 LD B,8 ; графическое окно 0, HL - положение окна LD C,BIOS.LP_OPEN_S RST ToBIOS - + ; LD HL,#5000 LD E,1 LD B,9 ; графическое окно 1, HL - положение окна LD C,BIOS.LP_OPEN_S RST ToBIOS -/* - LD A,Dss.SetVMod.grf320x256 - LD BC,Dss.SetVMod.Screen_0 - RST ToDSS - LD A,Dss.SetVMod.grf320x256 - LD BC,Dss.SetVMod.Screen_1 - RST ToDSS -;графическое окно 0 -PIC_320X256_1: - DB 40,32,0,0,32,0,08,0 - DB 40,32,0,0,96,0,48,0 - - DB 40,32,0,0,32,0,00,0 ;4 - DB 40,32,0,0,96,0,40,0 ;6 - -;графическое окно 1 -PIC_320X256_2: - -; 320x256. графическое, 0-й экран -TAB_320x256_0 - -; 320x256. графическое, 1-й экран -TAB_320x256_1 -*/ ;--------------------------------------- - LD A,1 - OUT (SCREEN_SWITCH),A + LD A,(RESTORE_ALL.scr) + OUT (SCREEN_SWITCH),A ;----[переброс части кода в FastRAM]---- IN A,(SLOT3) @@ -732,13 +701,13 @@ CONT_WORK: SCR_SWITCH: IN A,(SCREEN_SWITCH) - AND 1 + ;AND 1 XOR 1 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 @@ -1607,131 +1576,246 @@ SET_HOME_PATH: RET ;*********************************************************************** SAVE_PAL: - IN A,(SLOT2) - PUSH AF - OUT (SLOT3),A - ; - LD HL,Pal_Restore_Buffer+#4000 - LD DE,0 - LD A,4 - LD C,BIOS.PIC_GET_PAL - RST ToBIOS - ; - ; LD HL,Pal_Restore_Buffer+#4000 + 1024 - ; LD DE,0 - ; LD A,5 - ; LD C,BIOS.PIC_GET_PAL - ; RST ToBIOS - ; ; - ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024 - ; LD DE,0 - ; LD A,6 - ; LD C,BIOS.PIC_GET_PAL - ; RST ToBIOS - ; ; - ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024+1024 - ; LD DE,0 - ; LD A,7 - ; LD C,BIOS.PIC_GET_PAL - ; RST ToBIOS - ; - POP AF - OUT (SLOT3),A - RET -;*********************************************************************** -RESTORE_PAL: - ; - IN A,(SLOT2) - PUSH AF - OUT (SLOT3),A - ; - LD HL,Pal_Restore_Buffer+#4000 - LD DE,0 - LD A,4 - LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры - RST ToBIOS - ; - ; LD HL,Pal_Restore_Buffer+#4000 + 1024 - ; LD DE,0 - ; LD A,5 - ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры - ; RST ToBIOS - ; ; - ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024 - ; LD DE,0 - ; LD A,6 - ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры - ; RST ToBIOS - ; ; - ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024+1024 - ; LD DE,0 - ; LD A,7 - ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры - ; RST ToBIOS - ; - POP AF - OUT (SLOT3),A - RET -;*********************************************************************** - ;!TODO тут не проверяется режим 80 или 40 -SAVE_TXT_SCREEN: - LD C,BIOS.LP_GET_PLACE - RST ToBIOS - LD (LOAD_TXT_SCREEN.CURS),DE - LD IX,#4000 + TXT_SCREEN - LD HL,#2050 ; #2028 - ; -; LD (LOAD_TXT_SCREEN.SVHL1),HL - LD DE,#0000 - IN A,(SLOT2) - LD B,A - LD C,BIOS.WIN_COPY - JP ToBIOS - -LOAD_TXT_SCREEN: - LD IX,#4000 + TXT_SCREEN -.SVHL1+1: LD HL,#2050 ; #2028 - LD DE,#0000 - IN A,(SLOT2) - LD B,A - LD C,BIOS.WIN_RESTORE - RST ToBIOS - ; -.CURS+1: LD DE,#0000 - LD C,Dss.Locate - JP ToDSS -;*********************************************************************** -RESTORE_ALL: + LD A,SYS_PORT.BIOS + OUT (SYS_PORT.ON),A + IN A,(FastRAM.ON) LD A,1 - LD HL, %0000'0100'0000'0000 ; значение - LD DE, %1111'1110'0110'1111 ; маска - LD BC,0*256 + BIOS.DCP_CONFIG - RST ToBIOS + OUT (FastRAM.SLOT0),A ; - ;LD B,3 ; 3 - установка CGA палитры - ;LD C,BIOS.SET_PAL_INIT ; номер функции - ;RST ToBIOS ; установка палитры - ; - LD A,Dss.SetVMod.txt80x32 - LD BC,Dss.SetVMod.Screen_0 - RST ToDSS - LD A,Dss.SetVMod.txt80x32 - LD BC,Dss.SetVMod.Screen_1 - RST ToDSS - ; - CALL RESTORE_PAL + LD A,#50 + OUT (SLOT3),A + XOR A + OUT (PORT_Y),A ; LD DE,0 - LD HL,#2050 - LD BC,COLORS.CGA.INC.LGRAY*256 + BIOS.LP_CLS_WIN - RST ToBIOS - ; - CALL LOAD_TXT_SCREEN +.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 + + + ; IN A,(SLOT3) + ; PUSH AF + ; IN A,(SLOT2) + ; OUT (SLOT3),A + ; ; + ; LD HL,Pal_Restore_Buffer+#4000 + ; LD DE,0 + ; LD A,#80 + 0 + ; LD C,BIOS.PIC_GET_PAL + ; RST ToBIOS + ; ; + ; LD HL,Pal_Restore_Buffer+#4000 + 1024 + ; LD DE,0 + ; LD A,#80 + 1 + ; LD C,BIOS.PIC_GET_PAL + ; RST ToBIOS + ; ; + ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024 + ; LD DE,0 + ; LD A,6 + ; LD C,BIOS.PIC_GET_PAL + ; RST ToBIOS + ; ; + ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024+1024 + ; LD DE,0 + ; LD A,7 + ; LD C,BIOS.PIC_GET_PAL + ; RST ToBIOS + ; + ; POP AF + ; OUT (SLOT3),A + ; RET ;*********************************************************************** +RESTORE_PAL: + 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 - + ; + ; IN A,(SLOT2) + ; PUSH AF + ; OUT (SLOT3),A + ; ; + ; LD HL,Pal_Restore_Buffer+#4000 + ; LD DE,0 + ; LD A,4 + ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры + ; RST ToBIOS + ; + ; LD HL,Pal_Restore_Buffer+#4000 + 1024 + ; LD DE,0 + ; LD A,5 + ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры + ; RST ToBIOS + ; ; + ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024 + ; LD DE,0 + ; LD A,6 + ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры + ; RST ToBIOS + ; ; + ; LD HL,Pal_Restore_Buffer+#4000 + 1024+1024+1024 + ; LD DE,0 + ; LD A,7 + ; LD BC,#FF*256 + BIOS.PIC_SET_PAL ; установка палитры + ; RST ToBIOS + ; + ; POP AF + ; OUT (SLOT3),A + ; RET +;*********************************************************************** + ;!TODO тут не проверяется режим 80 или 40 +; DEFINE _TXT_SCREEN #E000 +; SAVE_TXT_SCREEN: +; DI +; LD C,BIOS.LP_GET_PLACE +; RST ToBIOS +; LD (LOAD_TXT_SCREEN.CURS),DE +; ; +; XOR A +; LD B,SHARED_PAGE +; LD HL,#2050 ; #2028 +; LD DE,#0000 +; LD IX,_TXT_SCREEN +; LD C,BIOS.WIN_COPY +; JP ToBIOS +; LOAD_TXT_SCREEN: +; DI +; XOR A +; LD B,SHARED_PAGE +; LD HL,#2050 ; #2028 +; LD DE,#0000 +; LD IX,_TXT_SCREEN +; LD C,BIOS.WIN_RESTORE +; RST ToBIOS +; ; +; .CURS+1: LD DE,#0000 +; LD C,Dss.Locate +; JP ToDSS +;*********************************************************************** +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 ;*********************************************************************** ;---------------[Tables]---------------- ALIGN 2,0 @@ -1764,6 +1848,7 @@ SND_DIR: DZ "MUSIC" ;Up_Dir: DZ ".." ; Loading_TXT: DZ "\r\nPlease wait, resources are loading..." +GOTO_EXIT: DZ "\r\n < GAME OVER))) >" ; ; IFN NORM_syncPORT @@ -1786,8 +1871,7 @@ Loading_TXT: DZ "\r\nPlease wait, resources are loading..." ;CURRENT_DIR: BLOCK 257,0 ;------------------------------------ -Pal_Restore_Buffer EQU $ ;Temp_Buffer + 256 -Temp_Buffer EQU Pal_Restore_Buffer + 1024 + 1024 +Temp_Buffer EQU $ TXT_SCREEN EQU Temp_Buffer + 257 ; ; diff --git a/Music_4x.asm b/Music_4x.asm index 27eafda..62baa1e 100644 --- a/Music_4x.asm +++ b/Music_4x.asm @@ -1,5 +1,6 @@ ;----------------------------------------------------------------------- +;!FIXIT переделать музло на API 5x ;-------[инициализация винчестера]------; INIT_HDD_WORK: .currentDisk+1: ; @@ -61,20 +62,6 @@ INIT_HDD_WORK: OUT (SLOT3),A ;[ ] music and dirs - ; LD A,(CURRENT_DIR+1) - ; AND A - ; JR Z,.skip_dir - ; - ; LD HL,Up_Dir - ; LD C,Dss.ChDir - ; RST ToDSS - ; - ; LD A,'\' ; - ; LD HL,CURRENT_DIR+257 - ; LD BC,257 ;!HARDCODE длина строки пути - ; CPDR - ; INC HL - ; LD HL,SND_DIR LD DE,Temp_Buffer LD A,FAT_ATTR.DIRECTORY diff --git a/Shared_Includes b/Shared_Includes index 1a384e2..b8a215d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 1a384e2e43f985438aafa6f7fed3e7552d7b6f3d +Subproject commit b8a215d38afde3eed48f39eb961e96cdb6d9e426