;Kурсор на прерываниях ******
BLITER ;обновл экр с уч прерыв
;jr $
if EGA==0
CALL MEM7
XOR A
LD (P_FLAG),A
DEC A
LD (V_LINE),A
endif
if EGA
call changescrpg
else
endif
if EGA==0
LD A,2
LD (V_FLAG),A
CALL V_GET2
CALL V_MRK2
LD A,1
LD (V_FLAG),A
endif
if EGA==0
CALL DS2SC
endif
if EGA==0
CALL V_copy ;м.быть уч P_FLAG=1 :)
XOR A
LD (V_FLAG),A
endif
RET
if EGA==0
DS2SC ;регенер экр
LD HL,DSCR
LD DE,SCR
LD B,192
DSS0 LD A,H
CPL
AND %11000
RET Z
PUSH BC
PUSH DE
PUSH HL
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LDI;
LDI
LDI
LDI
LDI
LDI
LDI
LDI
LD HL,V_LINE
INC (HL)
POP HL
POP DE
POP BC
INC H
INC D
LD A,H
AND 7
JR NZ,DSS1
LD A,L
ADD A,32
LD L,A
LD E,A
JR C,DSS1
LD A,H
SUB 8
LD H,A
LD A,D
SUB 8
LD D,A
DSS1 LD A,(P_FLAG)
OR A
CALL NZ,V_BLIT
DJNZ DSS0
RET
Vforce ;принудительный выв A строк
EXX
LD B,8
CALL DSS0
EXX
RET
V_BLIT ;выв курс во время рефреша
DI
EXX
XOR A
LD (P_FLAG),A
LD HL,V_LINE
LD A,(G_MY) ;очистка
CP (HL)
JR C,vbt1
JR NZ,vbt2
vbt1 ADD A,8
CP (HL)
JR C,vbt4
CALL Vforce
vbt4 CALL V_copy
vbt2 CALL V_PUT1
CALL V_PUT2
LD HL,(MX) ;взятие в буф
LD (G_MX),HL
LD A,H
LD HL,V_LINE
CP (HL)
JR C,vpt1
JR NZ,vpt2
vpt1 ADD A,8
CP (HL)
JR C,vpt4
CALL Vforce
vpt4 CALL V_GET1
CALL V_GET2
LD A,(GBAD2+1)
XOR #60
LD (GBAD1+1),A
CALL V_copy
CALL V_MRK1
JR vptR
vpt2 CALL V_GET1
CALL V_GET2
CALL V_MRK1
CALL V_MRK2
vptR EXX
EI
RET
endif ;~EGA
if 1==0
ON256 LD A,%10000
JR M2
OFF256 XOR A
M2 LD BC,#1FFD ;скорп
OUT (C),A
LD A,%11000
LD B,#7F
OUT (C),A ;пент
RET
endif
INAR0 ;Обр прерываний
PUSHs
EXX
PUSHs
PUSH AF
EX AF,AF
PUSH AF
PUSH IX
PUSH IY
LD A,(R128)
LD (IR128),A
if EGA
ld a,(curpg4000)
push af
ld a,(curpg8000)
push af
ld a,(pgmain4000)
SETPG16K
ld a,(pgmain8000)
SETPG32KLOW
;ld a,(curscrnum)
;push af
;ld a,(curscrnum_physical)
;ld (curscrnum),a
ld hl,timer
inc (hl)
endif
if 1==0 ;???
;анти-теневик
antiTM LD HL,(G_MX) ;[**]
LD A,H
OR #C0
LD H,A
CALL ON256
LD E,(HL) ;д.быть #A4 байт-заполнитель или (HL)
CALL OFF256
LD A,E
CP #A4
JR Z,INAMM
CP (HL)
RET NZ
INAMM
endif
;музыка
CALL MEM6
LD A,(MUSONF)
OR A
JR Z,INA0FX
;патч к музыке
XOR A
LD (#EEC9),A
LD (#F221),A
CALL WMUSIC+6 ;6
JR INA0M
INA0FX LD BC,#FFFD
LD A,7
OUT (C),A
LD A,B
LD B,#BF
OUT (C),A
LD (#EEC9),A
INA0M CALL pSOUND ;эффекты
CALL MMOV
;if EGA==0
LD A,(V_FLAG)
CP 1
JR Z,INA01
JR NC,INA02
;endif
CALL MEM7
LD HL,(JP_SUB+1)
PUSH HL
LD HL,(SET_SP+1)
PUSH HL
LD HL,(SCRADR)
PUSH HL
CALL V_PUT1 ;восстановление старой стрелочки
LD HL,(MX)
LD (G_MX),HL
CALL V_GET1 ;взятие с экрана из-под новой стрелочки
CALL V_MRK1 ;рисование стрелочки
POP HL
LD (SCRADR),HL
POP HL
LD (SET_SP+1),HL
POP HL
LD (JP_SUB+1),HL
JR INA02
INA01 LD (P_FLAG),A
INA02 ;LD A,(IR128)
IR128=$+1
ld a,0
CALL MEM
;SETPG32KHIGH
if EGA
GET_KEY
cp key_redraw
jr nz,$+5
ld (wascurkeyredraw),a ;иначе не пишем
;pop af
;ld (curscrnum),a
pop af ;ld a,(curpg8000)
ld (curpg8000),a
SETPG32KLOW
pop af ;ld a,(curpg4000)
ld (curpg4000),a
SETPG16K
endif
POP IY
POP IX
POP AF
EX AF,AF
POP AF
POPs
EXX
POPs
RET
;---------------------------------------
if EGA==0
G_IMG1 DEFB %11111100,%11111100 ;обычн курсор
DEFB %11111110,%10000110
DEFB %11111110,%10000010
DEFB %11111110,%10000110
DEFB %11111111,%10000011
DEFB %11111111,%11010001
DEFB %01111111,%01111011
DEFB %00001110,%00001110
G_MAP1 DEFB %11111100,%00000000 ;курсор на карте/при нажатом FIRE
DEFB %11111110,%01111000
DEFB %11111110,%01000100
DEFB %11111110,%01001000
DEFB %11111111,%01010100
DEFB %11111111,%00101010
DEFB %01111111,%00000100
DEFB %00001110,%00000000
G_FIX1 DEFB %11111100,%00000000 ;курсор при зафикс. цели
DEFB %11111110,%01111000
DEFB %11111110,%01111100
DEFB %11111110,%01111000
DEFB %11111111,%01111100
DEFB %11111111,%00101110
DEFB %01111111,%00000100
DEFB %00001110,%00000000
endif
if EGA==0
V_copy ;gbu2->gbu1
LD BC,16
LD HL,GBU2
LD DE,GBU1
LDIR
RET
endif
V_PUT1onint
if EGA
ld a,(curscrnum)
or a
ld hl,arbuf0
jr z,$+5
ld hl,arbuf1
jp rearr
endif
V_PUT1 ; gbu1->[SCR]
if EGA
;на видимом экране
call setpgsscr40008000_current
ld a,(curscrnum)
or a
ld hl,arbuf0
jr z,$+5
ld hl,arbuf1
else
LD HL,(GBAD1)
ld a,h
or a
ret z
LD DE,GBU1
endif
JR v1pEN
V_PUT2 ; gbu2->[DSCR]
if EGA
;на рисуемом экране
call setpgsscr40008000;_current
ld a,(curscrnum)
or a
ld hl,arbuf0
jr nz,$+5
ld hl,arbuf1
else
LD HL,(GBAD2)
LD DE,GBU2
endif
v1pEN
if EGA
;LD hl,(G_MX)
;ld a,h
;ld h,0
call rearr
jp setpgsmain40008000
else
CALL v1p0
LD A,L
AND 31
CP 31
RET Z
INC L
v1p0 LD B,8
PUSH HL
v1p1 LD A,(DE)
LD (HL),A
INC DE
INC H
LD A,H
AND 7
JR NZ,v1p2
LD A,L
ADD A,32
LD L,A
JR C,v1p3
LD A,H
SUB 8
LD H,A
JR v1p2
v1p3 LD A,H
CPL
AND %11000
JR Z,v1p6
v1p2 DJNZ v1p1
POP HL
RET
v1p5 INC DE
v1p6 DJNZ v1p5
POP HL
RET
endif
V_GET1onint
if EGA
ld a,(curscrnum)
or a
ld de,arbuf0
jr z,$+5
ld de,arbuf1
LD hl,(G_MX)
ld a,h
ld h,0
jp getarr
endif
V_GET1 ; HL->gbad1 [SCR]->gbu1
;выв гр курс
if EGA
;на видимом экране
call setpgsscr40008000_current
ld a,(curscrnum)
or a
ld de,arbuf0
jr z,$+5
ld de,arbuf1
V_GETgo
LD hl,(G_MX)
ld a,h
ld h,0
call getarr
jp setpgsmain40008000
else
LD DE,(G_MX)
CALL STS
CALL PCOORD
LD (GBAD1),HL
LD DE,GBU1
CALL v1g0
INC L
v1g0 LD B,8
PUSH HL
v1g1 LD A,(HL)
LD (DE),A
INC DE
INC H
LD A,H
AND 7
JR NZ,v1g2
LD A,L
ADD A,32
LD L,A
JR C,v1g2
LD A,H
SUB 8
LD H,A
v1g2 DJNZ v1g1
POP HL
RET
endif
V_GET2 ; HL->gbad2 [DSCR]->gbu2
;выв гр курс
if EGA
;на рисуемом экране
call setpgsscr40008000;_current
ld a,(curscrnum)
or a
ld de,arbuf0
jr nz,$+5
ld de,arbuf1
jp V_GETgo
else
LD DE,(G_MX)
CALL STD
CALL PCOORD
LD (GBAD2),HL
LD DE,GBU2
CALL v2g0
INC L
v2g0 LD B,8
LD A,L
AND 31
CP 24
JR C,v2g00
PUSH HL
LD HL,GBU1-GBU2
ADD HL,DE
LD BC,8
LDIR
POP HL
RET
v2g00 PUSH HL
v2g1 LD A,(HL)
LD (DE),A
INC DE
INC H
LD A,H
AND 7
JR NZ,v2g2
LD A,L
ADD A,32
LD L,A
JR C,v2g2
LD A,H
SUB 8
LD H,A
v2g2 DJNZ v2g1
POP HL
RET
endif
if EGA
V_GET_MRK2
;гарантирует, что считаем фон и рисуем в одном и том же месте
;на рисуемом экране
call setpgsscr40008000;_current
LD HL,(G_MX)
push hl
ld a,(curscrnum)
or a
ld de,arbuf0
jr nz,$+5
ld de,arbuf1
ld a,h
ld h,0
call getarr
pop hl
ld a,h
ld h,0
call prarr
jp setpgsmain40008000
endif
V_MRK2 ;mrk->SCR
if EGA
;на рисуемом экране
call setpgsscr40008000;_current
else
LD BC,(GBAD2)
endif
JR vmr1
V_MRK1onint
if EGA
LD hl,(G_MX)
ld a,h
ld h,0
jp prarr
endif
V_MRK1 ;mrk->SCR
if EGA
;на видимом экране
call setpgsscr40008000_current
else
LD BC,(GBAD1)
ld a,b
or a
ret z
endif
vmr1 LD HL,(G_MX)
if EGA
ld a,h
ld h,0
call prarr
jp setpgsmain40008000
else
LD A,H
SUB 185
JR C,vmr2
XOR 7
JR vmr3
vmr2 LD A,8
vmr3 LD (G_SIZE),A
LD A,L
AND 7
LD HL,HE_N
CALL WT
LD (JP_SUB+1),HL
LD HL,(G_IMG)
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD (SET_SP+1),SP
LD SP,HL
LD L,C
LD H,B
LD A,(G_SIZE)
LD B,A
JP JP_SUB
endif ;~EGA