;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,(curpg16k) ;ok
push af
ld a,(curpg32klow) ;ok
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