;
 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      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
                CALL    EMM.GetMemBlkPages                              ; кидаем в буфер номера страниц RAM disk

                IN      A,(SLOT3)
                LD      (.slot3save),A

                LD      HL,ROM_DISK.Pages.Number
                LD      B,0
                LD      C,(HL)
                INC     C
                LD      DE,TEMP+ROM_DISK.Pages.Size
                LDIR                                                    ; кидаем дальше в буфер номера страниц ROM disk

                LD      IY,TEMP+ROM_DISK.Pages.Size                     ; 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      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      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
;

;
;  MACRO

;  ENDM
;