; MACRO ShowInfo text, in_disp /* DISPLAY ' ' DISPLAY '[*] ', text IF in_disp DISPLAY 'ROM:' DISPLAY ' ORG: ',/H, $$$ DISPLAY ' PAGE: ',/H, $$$$ DISPLAY 'MEM:' DISPLAY ' DISP: ',/H, $ DISPLAY ' PAGE: ',/H, $$ ELSE DISPLAY 'ROM:' DISPLAY ' ORG: ',/H, $ DISPLAY ' PAGE: ',/H, $$ ENDIF DISPLAY '[X]' DISPLAY ' ' */ ENDM ; ; ; Вход: ширина спрайта, высота, координата X, координата Y, адрес спрайта в памяти MACRO EasterTable width, height, Xcoord, Ycoord, addr WORD addr ; адрес спрайта в памяти WORD width ; Ширина BYTE height+Ycoord ; Высота + Y coord WORD Xcoord+#4040 ; X coord ; !HARDCODE Срочно исправить на метку #4040 - адрес лого BYTE Ycoord ; Y coord ENDM ; ; на входе в A номер строки. На выходе в HL адрес начала строки. портит A, HL, BC ; MACRO FIND_STRING_ADDR ; !TODO переделать на CALL FIND_STRING_ADDR ? ; SLA A ; !FIXIT переделать под количество строк > 127 ; LD HL,MSG_Buffer ; LD B,0 ; LD C,A ; ADD HL,BC ; LD A,(HL) ; INC HL ; LD H,(HL) ; LD L,A ; ENDM ; ; MACRO _mRECOVERYrdChooseTYPE vers IF vers = 1 ; если RECOVERY не подразумевает 90% безопасность пользовательских рамдисков ; то выбираем этот вариант, он шустрее, под RECOVERY всегда выбирается RAM Disk 15 ; ELSEIF vers = 2 ; Ищем свободный рамдиск LD B,SYS_PAGE.RAMD_KEYS.NUM .getRDidLoop: LD A,B DEC A LD (RECOVERYstart.RDkey),A PUSH BC ;LD BC,ROM_DISK.Pages.Size * 256 + BIOS.GetMemRMD ;RST_to_BIOS LD B,ROM_DISK.Pages.Size CALL EMM.GetMemRMD POP BC JR NC,RECOVERYstart.IMGread ; свободный рамдиск найден, выходим из цикла DEC A JR Z,RECOVERYstart.FreeMem ; ошибка - недостаточно памяти, вызываем очистку памяти DJNZ .getRDidLoop ; ELSE ASSERT 0, Invalid 'RECOVERYrdChooseTYPE' variant - RECOVERYrdChooseTYPE ENDIF ENDM ; MACRO _mRECOVERYmountTYPE vers IF vers = 1 ; Более быстрый, но захардкоженный вариант LD HL,TEMP ;LD C,BIOS.GetMemBlkPages ;RST_to_BIOS ; кидаем в буфер номера страниц RAM disk CALL EMM.GetMemBlkPages IN A,(SLOT3) LD (.slot3save),A LD HL,ROM_DISK.Pages.Number LD B,0 LD C,(HL) INC C LD DE,TEMP+5 LDIR ; кидаем дальше в буфер номера страниц ROM disk LD IY,TEMP+5 ; ROM_DISK.Pages.Number LD IX,TEMP LD B,(IY+0) LD A,R PUSH AF DI .loopIMGtoRAM: PUSH BC INC IY LD A,(IY+0) OUT (ROM.SLOT0),A LD A,(IX+0) OUT (SLOT3),A INC IX LD HL,0 LD DE,#C000 LD BC,#4000 LDIR POP BC DJNZ .loopIMGtoRAM .slot3save+*: LD A,0 OUT (SLOT3),A XOR A OUT (ROM.SLOT0),A OUT (SYS_PORT.ROM),A POP AF JP PO,.noInterrupts EI .noInterrupts: ; ELSEIF vers = 2 ; менее быстрый, но более правильный вариант через функции биоса LD (.ramdskID),A LD DE,0 ; номер сектора LD B,(ROM_DISK.Pages.Size * #4000)/512 ; счётчик - кол-ва секторов по 512 кб .loop: ;read rom disk PUSH BC LD A,1 ;размер сектора 256 EX AF,AF' LD A,#46 ;чтение из ROM-Disk EX AF,AF' LD HL,TEMP ;адрес буфера данных ;LD BC,2*256 + BIOS.BLK_RD_WR ;число секторов и номер функции ;RST_to_BIOS LD B,2 CALL BLK_RD_WR ;write to ram disk PUSH DE ;номер сектора DEC DE DEC DE .ramdskID+*: LD A,0 ;идентификатор блока EX AF,AF' LD A,#FF ;запись в RAM-Disk EX AF,AF' LD HL,TEMP ;адрес буфера данных ;LD BC,2*256 + BIOS.BLK_RD_WR ;число секторов и номер функции ;RST_to_BIOS LD B,2 ;число секторов CALL BLK_RD_WR POP DE ;номер сектора POP BC DJNZ .loop ; ELSE ASSERT 0, Invalid 'RECOVERYmountTYPE' variant - RECOVERYmountTYPE ENDIF ENDM ; ; MACRO RST_to_BIOS IF (IsInBIOS = 0) && ($ < #4000) CALL ToBIOS_FromEXT ELSE RST ToBIOS_18 ENDIF ENDM ; ; MACRO JP_to_BIOS IF (IsInBIOS = 0) && ($ < #4000) JP ToBIOS_FromEXT ELSE JP ToBIOS_18 ENDIF ENDM ;