;PC=0x4000... ;SP=0x8000... ;data=0xC000... macro UNTESTED if DEBUG jr $ endif endm macro GOOD endm macro DISABLE_IFF0_KEEP_IY ;иначе pop iy запорет iy от обработчика прерывания call disable_iff0_keep_iy endm macro ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания call enable_iff0_remember_iy endm MACRO _Loop_ JP (IY) ;EMULOOP (нужный marg или нужный обработчик b/p) ENDM ;если вместо стр.команд включили др.стр. MACRO _LoopC ;OUTcom JP (IY) ENDM ;если резко сменился PC (полный DE) MACRO _LoopJP encodePC;CALCiypgcom JP (IY) ENDM ;если выключили др.стр. и резко сменился PC (полный DE) MACRO _LoopC_JP encodePC;CALCiypgcom JP (IY) ENDM ;если IN/OUT (могла измениться конфигурация памяти) MACRO _LoopSWI ;CALCpgcom JP (IY) ENDM macro decodePC ;de,pc_high -> de ld a,(pc_high) xor d and 0xc0 xor d ld d,a endm macro decodePC_to_ae ;de,pc_high -> ae ld a,(pc_high) xor d and 0xc0 xor d endm macro encodePC_AisD ld (pc_high),a and 0xc0 ld c,a ld b,tpgs/256 res 7,d set 6,d ld a,(bc) SETPG4000 ld a,0xaa ld (oddpc),a ;even, for for jp pc; TODO jp oddaddr? endm macro encodePC ld a,d encodePC_AisD endm macro get ld a,(de) endm macro next inc e call z,recountpc_inc ;keep CY! endm macro getHL get next ld l,a get next ld h,a endm macro getBC get next ld c,a get next ld b,a endm macro putmemspBC push bc ld hl,(_SP) dec hl dec hl ld (_SP),hl res 0,l ;for cputest ld a,h and 0xc0 ld c,a ld b,tpgs/256 set 7,h set 6,h ld a,(bc) SETPGC000 pop bc ld (hl),c inc l call z,recountsp_inc ld (hl),b endm macro getmemspBC call getmemspBCpp endm ;c=cmdLSB macro GETDEST_cmdc ld a,c call getdest_aisc endm ;bc=dest, a=cmdLSB ;a=cmdLSB macro GETDEST_cmda ld c,a call getdest_aisc endm ;bc=dest, a=cmdLSB ;c=cmdLSB macro GETDEST_cmdc_autoinc ld a,c call getdest_aisc_autoinc endm ;bc=dest, a=cmdLSB ;a=cmdLSB macro GETDEST_cmda_autoinc ld c,a call getdest_aisc_autoinc endm ;bc=dest, a=cmdLSB ;c=cmdLSB macro GETDEST8_cmdc ld a,c call getdest8_aisc endm ;c=dest, a=cmdLSB ;a=cmdLSB macro GETDEST8_cmda ld c,a call getdest8_aisc endm ;c=dest, a=cmdLSB ;c=cmdLSB macro GETDEST8_cmdc_autoinc ld a,c call getdest8_aisc_autoinc endm ;c=dest, a=cmdLSB ;a=cmdLSB macro GETDEST8_cmda_autoinc ld c,a call getdest8_aisc_autoinc endm ;c=dest, a=cmdLSB ;bc=data, a=cmdLSB macro PUTDEST_Loop jp putdest_Loop endm ;c=data, a=cmdLSB macro PUTDEST8_Loop jp putdest8_Loop endm ;hl=addr, bc=data macro WRMEM_hl_LoopC res 0,l ;16-bit write always at even addr ld a,h and 0xc0 jp m,2f ;ROM/ports push bc ld c,a ;ld lx,a ld b,tpgs/256 set 7,h set 6,h cp 0x40 jr z,1f ;screen if DEBUGWR ld a,h cp 0xc1 ;stack jr c,$ endif ld a,(bc) SETPGC000 pop bc ld (hl),c inc l ;call z,inchnextpg ld (hl),b _LoopC 1 ;screen ld a,(bc) SETPGC000 pop bc ld (hl),c call putscreen_c inc l ;jr z,3f;screen inchnextpg ;5 ld (hl),b ld c,b call putscreen_c _LoopC ;3 ; inc h ; jr nz,5b ;screen nextpg = ROM ; ;call hlnextpg ; _LoopC 2 ;ROM/ports if 1 inc h jp nz,wrmemrom_LoopC ;no ports ;FFB0=177660 регистр состояния клавиатуры (Разряд 6 - маска прерываний от клавиатуры. разряд доступен по записи и чтению. “0” - разрешено прерывание от клавиатуры; “1” - запрещено прерывание от клавиатуры. Разряд 7 - флаг состояния клавиатуры. Устанавливается в единицу при поступлении в регистр данных клавиатуры нового кода. Сбрасывается в “0” при чтении регистра данных клавиатуры.) ;FFB2=177662 Регистр данных клавиатуры ;177664 предназначен для указания начала экранного ОЗУ и организации рулонного сдвига экрана. При начальной установке экрана в регистре записывается значение 1330 (0x02d8). Изменение этого значения на 1 приводит к сдвигу изображения на экране по вертикали на 1 точечную строку. Сразу же после включения питания разряд 9 устанавливается в "1". При включении режима расширенной памяти разряд сбрасывается в "0". Разряды 8, 10-15 не используются. ld a,l cp 0xb0 jr z,9f ;kbd state ;TODO сюда пишет labyrinh, потом ждёт в (0xffce) 0x80a0 cp 0xb2 jr z,9f ;kbd data cp 0xb4 jr z,8f ;scroll cp 0x76 ;буфер передатчика ;jr nz,9f ;no ports call z,print_bc_to_log endif 9 _LoopC 8 ld (bkscroll),bc _LoopC endm ;hl=addr, c=data macro WRMEM8_hl_LoopC ld a,h and 0xc0 jp m,2f ;ROM/ports push bc ld c,a ld lx,a ld b,tpgs/256 set 7,h set 6,h cp 0x40 jr z,1f ;screen ld a,(bc) SETPGC000 pop bc ld (hl),c _LoopC 1 ;screen ld a,(bc) SETPGC000 pop bc ld (hl),c call putscreen_c _LoopC 2 ;ROM/ports inc h jp nz,wrmemrom_LoopC ;no ports ;TODO ports _LoopC endm macro RDMEM_ac_ret ;bc=result, a=hx ld h,a res 0,c ;16-bit read always at even addr cp 0xff jp z,rdport_c if BASIC == 0 cp 0xa0 jp nc,buserror endif ld l,c and 0xc0 ld c,a ;ld lx,a ;for nextpg ld b,tpgs/256 set 7,h set 6,h ld a,(bc) SETPGC000 ld a,hx ld c,(hl) inc l ld b,(hl) ;ret nz ;inc h ;call z,hlnextpg ;ld b,(hl) ret endm macro RDMEM8_ac_ret ;c=result, a=hx ld h,a cp 0xff jp z,rdport_c if BASIC == 0 cp 0xa0 jp nc,buserror endif ld l,c and 0xc0 ld c,a ;ld lx,a ;for nextpg ld b,tpgs/256 set 7,h set 6,h ld a,(bc) SETPGC000 ld a,hx ld c,(hl) ret endm