;MAIN "VERA",8
;IM_2 Программа на вторых прерываниях
; ORG IM2 ;#6666
IMS
if INT_IM2
EX (SP),HL
LD (adr_ret+1),HL
POP HL
LD (IM2_SP+1),SP
PUSH BC ;процедуры печати спрайтов
;должны оперировать с регистром BC (POP BC)
LD SP,VARS ;может быть любым, только с умом!
PUSH IX,IY,HL,DE,BC,AF
EX AF,AF' ;'
EXX
PUSH HL,DE,BC,AF
endif
LD A,(curpgc000) ;ok ;(NUMPAGE) ;Запоминаем номер текущ. стр.
LD (RST_PGp1),A
IM2Nm2=$+1
JP IM2N
IM2N ;LD A,PG_VIEW
CALL PAGE_PG_VIEW
if EGA
ld a,(im_arroff)
cp 55
CALL nz,ARROFF ;стирание курсора на основном (visible) экране (т.е. не там, где сейчас рисуются тайлы)
else
CALL ARROFF ;стирание курсора на основном (visible) экране (т.е. не там, где сейчас рисуются тайлы)
endif
CALL DAYS ;вывод спрайта дня-ночи
LD A,(DIALOG+1)
AND A
CALL NZ,WKEYS ;кнопка ">>" в диалоге
CALL Z,FL_MESH
TXT0 LD A,PG_MUZ
CALL PAGE
TXT LD HL,ONESYM+1;адрес текущ. символа
LD A,(HL)
INC HL
LD B,(HL)
EXA
;LD A,PG_VIEW
CALL PAGE_PG_VIEW
EXA
LD DE,ONESYM
LD (DE),A
CP 5
JR NZ,TOKN
;Особый скрипт должен выдать в HL адрес диалога
LD A,B
CALL SCRIPT
LD (TXT+1),HL
JR TXT0
TOKN CP TOKEN
JR C,CLT
LD (TXT+1),HL
TXT1 LD HL,#0A11 ;H-X,L-Y текущ. позиция печати
CP 13
JR NZ,TXT3
TXT2 LD H,10
INC L
JR TXT4
TXT3
if EGA
;ld ix,0x3fc9 ;bg color 9 (green), color 7 (white)
ld ix,0x00c9 ;bg color 9 (green), color 0 (black)
endif
CALL PR64 ;посимвольная печать в окне диалога ;TODO только на теневом экране
ld a,55 ;"scf"
ld (wasdrawimg),a ;по идее надо до вывода, но мы в прерывании, без разницы
INC H
TXT4 LD (TXT1+1),HL
CLT JR PRT
CALL CLTXT
LD A,PRT-CLT-2
LD (CLT+1),A
PRT JR INV
LD DE,0 ;адрес строки
LD HL,#320E ;H-X,L-Y
if EGA
ld ix,0x003f ;bg color 7 (white), color 0 (black)
endif
CALL PR64 ;TODO только на теневом экране
LD A,INV-PRT-2
LD (PRT+1),A
ld a,55 ;"scf"
ld (wasdrawimg),a ;по идее надо до вывода, но мы в прерывании, без разницы
;Печать вещей 3*3 в мешке
INV LD A,1
DEC A
JR NZ,DIAL
LD (INV+1),A
MSTRT LD IY,MESHOK ;начальный спрайт мешка
LD L,(IY)
LD H,A;=0 ;HL=спрайту из мешка
ld a,55 ;"scf"
ld (wasdrawimg),a
CALL HL72 ;HL=адресу спрайта
if EGA
ld de,iconsscraddr
else
LD DE,#C099 ;DE=адрес в экране
endif
CALL BLOCK33
LD L,(IY+1)
LD H,0
if EGA
ld de,iconsscraddr+3
else
LD DE,#C09C
endif
CALL HL72
CALL BLOCK33
LD L,(IY+2)
LD H,0
if EGA
ld de,iconsscraddr+(40*24)
else
LD DE,#C0F9
endif
CALL HL72
CALL BLOCK33
LD L,(IY+3)
LD H,0
if EGA
ld de,iconsscraddr+(40*24)+3
else
LD DE,#C0FC
endif
CALL HL72
CALL BLOCK33
LD L,(IY+4)
LD H,0
if EGA
ld de,iconsscraddr+(40*48)
else
LD DE,#C859
endif
CALL HL72
CALL BLOCK33
LD L,(IY+5)
LD H,0
if EGA
ld de,iconsscraddr+(40*48)+3
else
LD DE,#C85C
endif
CALL HL72
CALL BLOCK33
;Печатаем лица
DIAL
LD A,0
DEC A
JR NZ,FLOOP
LD (DIAL+1),A
ld a,55 ;"scf"
ld (wasdrawimg),a
if EGA
LD HL,0xc000+(38*72*4) ;лицо гл. героя
ld de,faceiconsscraddr
else
LD HL,SPR33+(38*72) ;лицо гл. героя
LD DE,#D021
endif
CALL BLOCK33
WHO LD HL,0 ;лицо собеседника
CALL HL72
if EGA
ld de,faceiconsscraddr+(40*24)
else
LD DE,#D081
endif
CALL BLOCK33
;Мигание курсора
FLOOP LD HL,FLASH+1
LD A,(DISTV)
ADD A,A
LD BC,#0538 ;JR C,CT2
JR C,$+4
JR NZ,CTER1
LD (HL),0 ;A=0
LD BC,#0418 ;JR CT2-1
CTER1 LD (CTMOD),BC
CTER2 LD A,0
INC A
SPDFL CP FR ;скорость мигания курсора
CTMOD JR C,CT2 ;JR/JR C
LD A,(HL)
XOR 1
LD (HL),A
XOR A
CT2 LD (CTER2+1),A
;Идет ли обновление экрана?
BUSY
LD A,0
if EGA
;если что-то рисовали в теневом экране, то надо снова прочитать графику под стрелкой на теневом экране и сбросить этот флаг
;[а что если нарисовали и ещё переключили экран? невозможно, т.к. между этими двумя действиями стоит halt]
wasdrawimg=$
or a ;если рисовали на теневом экране, то scf
jr nc,IM2nowasdrawimg
ld hl,(arroffega_scraddr2)
call setpgsscr40008000_current ;shadow
ld de,(arroffega_bufaddr2);mouse_buf
ld bc,0x1008
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
call getimgega_onescreen
call setpgsmain40008000
ld a,55+128 ;"or a"
ld (wasdrawimg),a
IM2nowasdrawimg
im_swapscr=$
or a
jr nc,im_swapscrq
call swapre
call setcurscr_change
curscrnum_int=$+1
ld e,0
OS_SETSCREEN
ld a,55+128 ;"or a"
ld (im_swapscr),a
im_swapscrq
im_arroff=$
or a
CALL nc,ARRON ;рисование курсора на основном экране
else
AND A
PUSH AF
CALL NZ,ARROFFS ;стирание курсора на теневом экране
CALL ARRON ;рисование курсора на основном экране
POP AF
CALL NZ,ARRONS ;рисование курсора на теневом экране
endif
PRTIME
LD A,0 ;таймер для стирания надписи через некот. время
SUB 1
ADC A,0
LD (PRTIME+1),A
PRJR JR TIMER ;JR/JR NZ #18/#20
LD A,#18
LD (CLT+1),A
LD (PRJR),A
TIMER LD HL,MAPINGp2
INC (HL)
CLOCK LD A,0
INC A
CP 50
JR C,CLK1
LD A,(TIME+2) ;сек
INC A
CP 60
JR C,CLK2
LD A,(TIME+1) ;мин
INC A
CP 60
JR C,CLK3
LD A,(TIME) ;час
INC A
LD (TIME),A
XOR A
CLK3 LD (TIME+1),A
XOR A
CLK2 LD (TIME+2),A
XOR A
CLK1 LD (CLOCK+1),A
CALL GOTASK ;выполнить задачу
;Для печати спрайта дня/ночи
SPN
LD HL,1
DEC HL
LD A,H
OR L
JR NZ,$+8
LD (DAY_NGT),A
LD HL,SPD_NGT
LD (SPN+1),HL
MUS
LD A,PG_MUZ
CALL PAGE
MUSONp1=$+1
LD A,0
AND A
CALL Z,PLAY+2
LD A,PG_MAP
CALL PAGE
SAMPLE
LD HL,0
CALL SOUND
;Обработка мышки, клавиатуры
LD HL,(mouse_crd)
LD (OLD_CRD+1),HL
LD HL,CCURS+1
LD A,(HL)
DEC A
JR NZ,MSE
CNTCUR LD A,FRM2
DEC A
JR NZ,MSE-3
LD (HL),A
LD A,FRM2
LD (CNTCUR+1),A
MSE CALL mouse
AND %11110000
LD E,A
PUSH DE
CALL SCANER
LD (KEYSp1),A
LD C,A
CALL UDLR
LD A,C
AND %00010000
; AND %00110000
POP DE
OR E
LD E,A
RES 4,E
AND 16
LD HL,MKEYSp1
OLDK LD B,0
LD ($-1),A
JR Z,OLDK1 ;если не нажато/отжато
;нажали и держим FIRE
;------
LD HL,(mouse_crd)
LD (NEW_CRD),HL
LD HL,(OLD_CRD+1)
if FIXMOUSE==0
LD (mouse_crd),HL
endif
LD HL,FMCNT2
DEC (HL)
JR NZ,OLDK4
LD (HL),SCMOD
LD E,2
LD HL,CCURS+1 ;меняем спрайт курсора N2/N3
LD A,(HL)
if FIXMOUSE==0
LD (HL),E
endif
CP E
JR NZ,OLDK4
if FIXMOUSE==0
INC (HL)
endif
JR OLDK4
;------
OLDK1 CP B
JR Z,OLDK3 ;если не было нажато
;отжали FIRE (щелчок)
SET 4,E
LD A,SCMOD ;восстанавливаем счетчик
LD (FMCNT2),A
CALL SCRLMAP ;Скроллировали ли карту?
JR NC,OLDK3 ;нет
LD A,(KARM)
LD (CCURS+1),A
LD E,0
OLDK3 LD A,(HL)
AND %11010000
JR NZ,$+3 ;еще не обработано
;прошлое нажатие
LD (HL),E
OLDK4 LD A,#F7 ;"1-5"
IN A,(#FE)
AND 31
LD (DIGKp1),A
;--------
RST_PGp1=$+1
LD A,0
SETPGC000;CALL PAGE
IM2EX
if INT_IM2
;Выход из вторых прерываний
POP AF,BC,DE,HL
EX AF,AF' ;'
EXX
POP AF,BC,DE,HL,IY,IX
IM2_SP LD SP,0
EI
adr_ret JP 0
else
ret
endif
END_IM2
;Инициализ. мышки
INIMOUS LD BC,#FBDF
IN A,(C)
LD (ms1+1),A
LD B,#FF
IN A,(C)
LD (ms5+1),A
JR m_keys
M_SP CP 6
RET C
MSPEED LD B,-4 ;Скорость мыши [-4...+4], 0-без ускорения!
ADD A,B
CP 18
RET C
ADD A,B
RET
;OUT: A-BIT 4-лев. клав.
; 5-прав. клав.
; 6-колесо вверх
; 7-колесо вниз
; B-кол-во строк скролла колеса
mouse
LD A,255
AND A
RET Z
LD BC,#FBDF
ms1 LD DE,MAX_X*256
LD HL,mouse_crd+1 ; lef/right
IN A,(C)
LD (ms1+1),A
SUB E
JR Z,ms4
JP P,ms2
NEG
CALL M_SP ;Скорость мыши
NEG
ADD A,(HL)
JR C,ms3+1
XOR A
JR ms3+1
ms2 CALL M_SP ;Скорость мыши
ADD A,(HL)
JR C,ms3
CP D
JR C,ms3+1
ms3 LD A,D
LD (HL),A
ms4 DEC HL
LD B,#FF
ms5 LD DE,MAX_Y*256
IN A,(C)
LD (ms5+1),A
SUB E
JR Z,m_keys
JP M,ms6
CALL M_SP ;Скорость мыши
NEG
ADD A,(HL)
JR C,ms7+1
XOR A
JR ms7+1
ms6 NEG
CALL M_SP ;Скорость мыши
ADD A,(HL)
JR C,ms7
CP D
JR C,ms7+1
ms7 LD A,D
LD (HL),A
;Проверяем кнопки,
;если не ноль, то что-то нажато!
m_keys
LD B,#FA
IN A,(C)
CPL
RLCA
RLCA
RLCA
RLCA
LD D,A
AND %00110000
LD E,A
ROLL NOP ;вкл/откл. работу с колесом
;Опрос колеса
; BIT 6,D ;ср. кнопка
LD A,D
AND 15
ROLD LD B,0
LD (ROLD+1),A
SUB B
JR NZ,ROLB
LD B,A
LD A,E
RET
ROLB JR C,SCR_DW
;Прокрутить текст вверх на B строчек
SCR_UP SET 6,D
LD B,A
LD A,D
RET
;Прокрутить текст вниз на B строчек
SCR_DW SET 7,D
NEG
LD B,A
LD A,D
RET
;Вверх/вниз/влево/вправо
UDLR
LD B,0
LD ($-1),A
LD C,A
CALL KEYSPD
LD A,C
STEP LD E,1 ;Шаг приращения координат
LD D,MAX_X ;Влево/вправо
LD HL,mouse_crd+1
RRA
CALL C,PL
RRA
CALL C,MIN
LD D,MAX_Y ;Вверх/вниз
DEC HL
RRA
CALL C,PL
RRA
CALL C,MIN
RET
KEYSPD LD HL,STEP+1
AND A
JR Z,KSP2 ;курсор не движется
CP B
JR NZ,KSP2 ;появилось новое направление
LD A,(MSPEED+1)
NEG
ADD A,10 ;переменная зависит от скорости курсора
;через это кол-во итераций происходит
;увеличение шага приращения
LD B,A
KSP0 LD A,0
INC A
CP B
JR C,KSP1
XOR A
INC (HL)
KSP1 LD (KSP0+1),A
RET
KSP2 LD (HL),1
RET
PL EX AF,AF' ;'
LD A,(HL)
ADD A,E
JR C,ENDD-1
CP D
JR C,ENDD
LD A,D
ENDD LD (HL),A
EX AF,AF' ;'
RET
MIN EX AF,AF' ;'
LD A,(HL)
SUB E
JR NC,ENDD
XOR A
JR ENDD
;-------Сканирование управления---------
;первые биты (0-3) движение:
;0-RGHT,1-LEFT,2-DWN,3-UP
;4-й - огонь
;5-й бит - курсор вверх, 6-й - вниз
;7-й - Enter
;в режиме игры 5-й бит - нажатие CS или SS
SCANER
LD A,#BF ;Enter
IN A,(#FE)
CPL
RRCA
AND 128
LD B,A
SCANMOD LD A,0 ;режим 0-в игре, 1-в меню
AND A
JR Z,SGAME
LD A,#FE ;CS
IN A,(#FE)
BIT 0,A
JR Z,CURSOR
JR SCANTYP
;в режиме игры совмещаем состояние клавиш CS и SS
;и проверяем как одну
SGAME LD A,#FE ;CS
IN A,(#FE)
LD C,A
LD A,#7F ;SS
IN A,(#FE)
RRCA
AND C
CPL
RRCA
RRCA
RRCA
AND %00100000
OR B
LD B,A
SCANTYP LD A,0 ;тип управления
AND A
JP Z,QAOP
SINCL LD A,#EF ;SINCLAIR_RIGHT
IN A,(#FE)
RRCA
RL C
RRCA
RL C
RRCA
RL C
RRCA
RRCA
RL C
RLCA
RLCA
RL C
LD A,C
CPL
OR B
RET
QAOP LD A,#7F ;SP
IN A,(#FE)
RRCA
RL C
LD A,#FB ;Q
IN A,(#FE)
RRCA
RL C
LD A,#FD ;A
IN A,(#FE)
RRCA
RL C
LD A,#DF ;O,P
IN A,(#FE)
RRCA
RRCA
RL C
RLCA
RLCA
RL C
LD A,C
CPL
AND 31
OR B
RET
CURSOR LD A,#EF ;"6"/"7"
IN A,(#FE)
RLA
RLA
CPL
AND 64+32
OR B
RET
;Распаковщик
LC5
LD DE,7;SKIP "LCMP5" & LENGTH
ADD HL,DE
LD A,(HL)
INC HL
LD E,A
ADD HL,DE
LD A,(HL)
LD E,A;pазpыв
AND 3
RLCA
RLCA
RLCA
OR #C000/256
EXX
LD D,A;начало
LD E,0
EXX
LD A,(HL)
INC HL
XOR #C000/256+#18
AND #FC
LD HX,A;конец ч/б.
DLC1 LD A,(HL)
INC HL
LD LX,#FF
DLC2 EXX
JR NZ,DLC10
LD B,1
DLC3 EXA
SLA D
JR NZ,$+6
LD D,(HL)
INC HL
SLI D
DJNZ DLC7
JR C,DLC1
INC B
DLC4 LD C,%01010110
LD A,#FE
DLC5 SLA D
JR NZ,$+6
LD D,(HL)
INC HL
RL D
RLA
SLA C
JR Z,DLC6
JR C,DLC5
RRCA
JR NC,DLC5
SUB 8
DLC6 ADD A,9
DJNZ DLC3
CP 0-8+1
JR NZ,$+4
LD A,(HL)
INC HL
ADC A,#FF
LD LX,A
JR C,DLC4
; DI
; LD A,16+8+7 ;Вкл. видимым 2-й экран
; LD (page),A
; LD BC,#7FFD
; OUT (C),A
; EI
RET
DLC7 LD A,(HL)
INC HL
EXX
LD L,A
EXA
LD H,A
ADD HL,DE
CP #FF-2
JR NC,DLC8
DEC LX
DLC8 LD A,H
CP HX
JR NC,DLC13
XOR L
AND #F8
XOR L
LD B,A
XOR L
XOR H
RLCA
RLCA
LD C,A
DLC9 EXA
LD A,(BC)
DLC10 EXA
LD A,D
CP HX
JR NC,DLC14
XOR E
AND #F8
XOR E
LD B,A
XOR E
XOR D
RLCA
RLCA
LD C,A
DLC11 EXA
LD (BC),A
INC DE
JR NC,$+4
DEC HL
DEC HL
INC HL
EXA
INC LX
JR NZ,DLC8
JP DLC2
DLC13 SCF
DLC14 PUSH AF
EXX
ADD A,E
EXX
LD B,A
POP AF
LD C,E
JR NC,DLC11
LD C,L
JR DLC9
DEHRUST
;HL - FROM, DE - TO
INC HL
INC HL
INC HL ;SKIP "HR2"
LD A,(HL)
INC HL
PUSH DE
LD C,(HL)
INC HL
LD B,(HL)
INC HL
DEC BC
EX DE,HL
ADD HL,BC
EX DE,HL
LD C,(HL)
INC HL
LD B,(HL)
ADD HL,BC
SBC HL,DE
ADD HL,DE
JR C,$+4
LD D,H
LD E,L
PUSH BC
LDDR
POP BC
EX DE,HL
RLA
JR NC,DPCYES
POP DE
INC HL
LDIR
RET
DPCYES LD DE,7
ADD HL,DE
PUSH HL
EXX
POP HL
POP DE
LD B,6
DEC HL
LD A,(HL)
PUSH AF
INC SP
DJNZ $-4
EXX
LD DE,#1003
LD C,#80
DPC1 LD A,(HL)
INC HL
EXX
LD (DE),A
INC DE
DPC0 EXX
DPC0A CALL SLAC
JR C,DPC1
LD B,#01
DPC4 LD A,%01000000
DPC2 CALL SLAC
RLA
JR NC,DPC2
CP E ;3
JR C,DPC3
ADD A,B
LD B,A
XOR D ;#10
JR NZ,DPC4
DPC3 ADD A,B
CP 4
JR Z,DPC5 ;B<>1;B=4
ADC A,#FF
DPC8A CP 2
DPC8 EXX
LD C,A
LD H,#FF
EXX
JR C,DPC9 ;B=1
JR Z,DPC12
CALL SLAC
JR C,DPC12
;B>=4
LD A,%01111111
LD B,E ;3
DJNZ DPC9A1 ;JR...B=2
DPC9A2 DJNZ DPC5A2
LD B,A
SBC A,A
DPC9B CALL SLAC
RLA
DEC A
INC B
JR NZ,DPC9B
CP #FF-30
JR NZ,$+4
LD A,(HL)
INC HL
EXX
LD H,A
EXX
DPC12 LD A,(HL)
INC HL
DPC11 EXX
LD L,A
ADD HL,DE
LDIR
JR DPC0
DPC5A2 ADD A,6
RLA
LD B,A
DPC5C LD A,(HL)
INC HL
EXX
LD (DE),A
INC DE
EXX
DJNZ DPC5C
JR DPC0A
DPC5 ;B=4
CALL SLAC
LD A,D ;%00010000
JR NC,DPC5A1
LD A,(HL)
INC HL
CP D ;16
JR NC,DPC8A
OR A
JR Z,DPC6
EXX
LD B,A
EXX
LD A,(HL)
INC HL
JR DPC8
DPC9 ;B=1
LD A,%00111111
DPC5A1 ;B=4
DPC9A1 ;B=2
DPC10 CALL SLAC
RLA
JR NC,DPC10
DJNZ DPC9A2
JR DPC11
SLAC SLA C
RET NZ
LD C,(HL)
INC HL
RL C
RET
DPC6 EXX
LD B,6
DEC SP
POP AF
LD (DE),A
INC DE
DJNZ $-4
RET
;Изображение под стрелкой кидаем в буфер
;и рисуем саму стрелку
;Формат спрайта стрелки хитрый:
;сначала слово маски (младший, затем старший байт),
;потом идет слово спрайта (мл., старший байты)
;(c) Основной алгоритм Alone Coder
;(c) Небольшая переработка Саша Ксор
;6.02.2003
ARRON
LD IX,mouse_buf ;буфер под курсором (48 байт)
mouse_crd EQU $+1
LD DE,#8232; Координаты стрелки D-X,E-Y
FLASH LD A,0 ;Мигание курсора
AND A
RET NZ
ARON LD A,D
AND 7
LD B,A
INC B
LD A,-1
ADD A,A
DJNZ $-1
LD (arrow2-1),A
if EGA
ld a,(egaon)
or a
jp z,ARON_6912
;d=x,e=y
push de ;xy
ld b,0
ld a,e ;y
cp 0xc0-16
jr c,$+4
ld a,0xc0-16
ld l,a ;y
ld c,a
ld a,d ;x
;cp 0xf0
;jr c,$+4
;ld a,0xf0
srl a
srl a ;x bit 0
ld h,b;0
rl h
inc h ;0x40/32/2 или 0x80/32/2
srl a ;x bit 1
rl h
add hl,hl
add hl,hl
add hl,bc
add hl,hl
add hl,hl
add hl,hl ;y*40+scrbase
if scrbase&0xff
add a,scrbase&0xff
endif
;a=x/4
add a,l
ld l,a
adc a,h
sub l
ld h,a ;hl=scr ;не может быть переполнения при отрицательных x? maxhl = 199*40 + 127 = 8087
ld (arroffega_scraddr),hl
call setpgsscr40008000 ;visible
ld de,(arroffega_bufaddr);mouse_buf
ld bc,0x1008
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
call getimgega_onescreen
call setpgsmain40008000
pop de ;xy
ld a,(curarrowtype)
cp 45;255
ret nc;z ;нет стрелки
;ld a,1
ld l,a
ld h,0
ld c,l
ld b,h
add hl,hl
add hl,hl
add hl,hl
add hl,hl ;*0x10
add hl,bc ;*0x11
add hl,hl
add hl,hl ;*0x44
add hl,bc ;*0x45
add hl,hl
add hl,hl ;*0x114
ld bc,0xc000+4
add hl,bc
push hl
pop iy
ld a,PG_SPR
call setpg
call setpgsscr40008000 ;visible
ld c,e ;y
ld a,d ;x
srl a
add a,sprmaxwid-1
ld e,a ;x
;в 4000,8000 уже включен экран (setpgsscr40008000)
;iy=sprite data+2 = spraddr+4
;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
;(iy-3)=sprhgt
;(iy-4)=sprwid
;push ix
;сохраняем переменные prspr (т.к. мы в прерывании, могли прервать prspr)
ld a,(prspr_curscrhgt)
push af
ld (prspr_curscrhgtplus1),a
ld hl,(prsprNspraddpatch)
ld a,(prsprNpatch)
ld h,a
push hl
ld a,(prsprcolumnpatch)
push af
ld hl,(prsprmaybeqrightsp)
push hl
ld hl,(prsprqsp)
push hl
ld a,192
ld (prspr_curscrhgt),a
inc a
ld (prspr_curscrhgtplus1),a
call prspr
pop hl
ld (prsprqsp),hl
pop hl
ld (prsprmaybeqrightsp),hl
pop af
ld (prsprcolumnpatch),a
ld (prsprcolumnpatch2),a
pop hl
ld a,l
ld (prsprNspraddpatch),a
ld a,h
ld (prsprNpatch),a
pop af
ld (prspr_curscrhgt),a
inc a
ld (prspr_curscrhgtplus1),a
;pop ix
jp setpgsmain40008000
ARON_6912
endif
LD A,E
RRA
SCF
RRA
SCF ;*
RRA
AND #DF ;#5F
LD H,A
XOR D
AND 7
XOR D
RRCA
RRCA
RRCA
LD L,A
LD A,E
XOR H
AND 7
XOR H
LD H,A
;HL=адресу на экране
LD (ARRTO+1),HL ;Адрес для восстан.
;изображения под стрелочкой
EX DE,HL
LD HL,ARROW ;Адрес курсора
LD B,16
arrow1 PUSH BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD A,(HL)
INC HL
PUSH HL
LD H,(HL)
LD L,A
PUSH DE
LD A,(DE)
LD (IX),A
LD E,A
SCF
SBC A,A
LD D,0
arrow2 RL C
RL B
RLA
ADD HL,HL
RL D
JR C,arrow2
AND E
XOR D
POP DE
LD (DE),A
INC E
LD A,E
AND 31
LD A,(DE)
LD (IX+16),A
JR Z,arrow3
AND B
XOR H
LD (DE),A
INC E
LD A,E
AND 31
JR Z,arrow3-1
LD A,(DE)
LD (IX+32),A
AND C
XOR L
LD (DE),A
DEC E
arrow3 DEC E
;
;Переход на пиксельную строку ниже (новым методом)
INC D
LD A,D
AND #07
JR NZ,arrow4
LD A,E
SUB #E0
LD E,A
SBC A,A
AND #F8
ADD A,D
LD D,A
;
arrow4 POP HL
POP BC
LD A,D
;CP 88 ;если экран #4000
CP #D8 ;если экран #C000
RET NC
INC IX
INC HL
DJNZ arrow1
RET
;Восстановление фона под курсором
;Основной алгоритм Alone Coder
ARROFF
LD IX,mouse_buf
ARRTO LD HL,0
LD A,(FLASH+1)
AND A
RET NZ
if EGA
ld a,(egaon)
or a
jr z,arroff_6912
arroffega_scraddr=$+1
ld hl,0
ld a,h
or a
ret z
arroffega_bufaddr=$+1
LD de,mouse_buf
call setpgsscr40008000;_current ;visible
ld bc,0x1008
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
jp primgega_onescreen_setpgsmain40008000
arroff_6912
endif
LD BC,#101F
arroff1 LD A,(IX)
LD (HL),A
INC L
LD A,L
AND C
JR Z,arroff2+1
LD A,(IX+16)
LD (HL),A
INC L
LD A,L
AND C
JR Z,arroff2
LD A,(IX+32)
LD (HL),A
arroff2 DEC L
DEC L
INC IX
CALL LINE_HL
LD A,H
CP #D8 ;#C000+6144/256
RET Z
DJNZ arroff1
RET
;Восстановление фона под курсором на теневом экране
;Основной алгоритм Alone Coder
ARROFFS LD HL,0
LD A,(FLASH+1)
AND A
RET NZ
if EGA
ld a,(egaon)
or a
ret nz ;TODO rearrow_shadowscr
endif
LD IX,mouse_buf
LD BC,SCRWD+(#10*256) ;#101F
LD DE,31
;Проверка на выход за нижнюю границу теневого экрана
LD A,H
ARS CP SCRHG+(SHADSCR/256)
RET NC
;Проверка на выход за правую границу теневого экрана
LD A,L
AND E
CP C
RET NC
arrOFF1 LD A,(IX)
LD (HL),A
INC HL
;Проверка на выход за правую границу теневого экрана
LD A,L
AND E
CP C
JR NC,arrOFF2+1
LD A,(IX+16)
LD (HL),A
INC HL
;Проверка на выход за правую границу теневого экрана
LD A,L
AND E
CP C
JR NC,arrOFF2
LD A,(IX+32)
LD (HL),A
arrOFF2 DEC HL
ADD HL,DE
INC IX
;Проверка на выход за нижнюю границу теневого экрана
LD A,H
ARS2 CP SCRHG+(SHADSCR/256)
RET NC
DJNZ arrOFF1
RET
;Печать курсора на теневом экране
;Формат теневого экрана линейный
ARRONS LD DE,(mouse_crd); Координаты стрелки D-X,E-Y
LD A,(FLASH+1)
AND A
RET NZ
if EGA
ld a,(egaon)
or a
ret nz ;TODO arrow_shadowscr
endif
LD A,D
LD D,E
LD E,A
AND 7
DUP 3
SRL D
RR E
EDUP
LD HL,SHADSCR
ADD HL,DE
INC A
LD B,A
LD A,-1
ADD A,A
DJNZ $-1
LD (arrow22-1),A
LD (ARROFFS+1),HL ;Адрес для вспом. изобр. под стрелкой
;HL=адресу на теневом экране
;Проверка на выход за правую границу теневого экрана
LD A,L
AND 31
CP SCRWD
RET NC
;Проверка на выход за нижнюю границу теневого экрана
LD A,H
ARO CP SCRHG+(SHADSCR/256)
RET NC
EX DE,HL
LD HL,ARROW ;Адрес курсора
LD IX,mouse_buf ;буфер изобр. под курсором (48 байт)
LD B,16
arrow12 PUSH BC
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD A,(HL)
INC HL
PUSH HL
LD H,(HL)
LD L,A
PUSH DE
LD A,(DE)
LD (IX),A
LD E,A
SCF
SBC A,A
LD D,0
arrow22 RL C
RL B
RLA
ADD HL,HL
RL D
JR C,arrow22
AND E
XOR D
POP DE
LD (DE),A
;Проверка на выход за правую границу теневого экрана
INC DE
LD A,E
AND 31
CP SCRWD
JR NC,arrow32+1
LD A,(DE)
LD (IX+16),A
AND B
XOR H
LD (DE),A
;Проверка на выход за правую границу теневого экрана
INC DE
LD A,E
AND 31
CP SCRWD
JR NC,arrow32
LD A,(DE)
LD (IX+32),A
AND C
XOR L
LD (DE),A
arrow32 DEC DE
DEC DE
LD HL,32
ADD HL,DE
EX DE,HL
arrow42 POP HL
POP BC
;Проверка на выход за нижнюю границу теневого экрана
LD A,D
ARO2 CP SCRHG+(SHADSCR/256)
RET NC
INC IX
INC HL
DJNZ arrow12
RET
;Создание маски у спрайта 2*2 знакоместа
;16.05.2004, by A.Xor
;25.11.2004 Изменения
MASK
;A-номер спрайта
;1 Сдвиг вправо, влево
curarrowtype=$+1
LD B,255
LD (curarrowtype),A
CP B
RET Z
if EGA
ld a,(egaon)
or a
;jr z,MASK6912
ret nz
;MASK6912
endif
HALT
ADD A,A
ADD A,A
MSK LD H,0
LD L,A
ADD HL,HL ;HL*32
ADD HL,HL
ADD HL,HL
LD DE,ARROWS
ADD HL,DE
LD (MSKMIX+1),HL
LD (MSKMIX2+1),HL
LD IX,ARROW
;ld a,PG_VIEW
;call PAGE ;почему не было???
LD A,16
MSKLP2 EX AF,AF' ;'
LD D,(HL)
INC HL
LD E,(HL)
INC HL
EX DE,HL
LD B,H
LD C,L
ADD HL,HL
LD A,L
OR C
LD L,A
LD A,H
OR B
LD H,A
LD A,C
SRL B
RRA
OR L
LD (IX),A
LD A,H
OR B
LD (IX+1),A
EX DE,HL
INC IX
INC IX
INC IX
INC IX
EX AF,AF' ;'
DEC A
JR NZ,MSKLP2
;2 Сдвиг вверх
LD DE,ARROW+4
LD HL,ARROW
LD B,15
MSKLP3 LD A,(DE)
OR (HL)
LD (HL),A
INC HL
INC DE
LD A,(DE)
OR (HL)
LD (HL),A
INC HL,HL,HL
INC DE,DE,DE
DJNZ MSKLP3
;3 Сдвиг вниз
LD DE,ARROW+57
LD HL,ARROW+61
LD B,15
MSKLP4 LD A,(DE)
OR (HL)
LD (HL),A
DEC HL,DE
LD A,(DE)
OR (HL)
LD (HL),A
DEC HL,HL,HL
DEC DE,DE,DE
DJNZ MSKLP4
MSKMOD LD A,0
AND A
JR NZ,MSKMIX2-3
;4 Микшируем спрайт и маску
LD HL,ARROW
MSKMIX LD DE,ARROWS
LD B,16
MSKLP5 LD A,(HL)
CPL
LD (HL),A
INC HL
LD A,(HL)
CPL
LD (HL),A
INC HL
INC HL
LD A,(DE)
INC DE
LD (HL),A
LD A,(DE)
INC DE
DEC HL
LD (HL),A
INC HL
INC HL
DJNZ MSKLP5
RET
;5 Микшируем спрайт и маску
;для не активных вещей на поле (спрайты инвертированы)
LD DE,ARROW
MSKMIX2 LD HL,ARROWS
LD B,16
MSKLP6 LD A,(DE)
LD C,A
CPL
LD (DE),A
INC DE
LD A,(DE)
CPL
LD (DE),A
INC DE
INC DE
CPL
XOR (HL)
INC HL
LD (DE),A
LD A,C
XOR (HL)
INC HL
DEC DE
LD (DE),A
INC DE
INC DE
DJNZ MSKLP6
RET
;Сюда кидается видео-поток
;Нужно следить, чтобы не наехал на код!
VIDEOS EQU #C000-12288
;Обмен данных
EXCH
LD A,PG_EXCH;PG_MAP
CALL PAGE
LD HL,VIDEOS
LD DE,MAP
LD BC,12288
LD A,(DE)
LDI
DEC HL
LD (HL),A
INC HL
JP PE,$-6
RET