;процедуры для рисования оформления, нижнего уровня (зависят от типа экрана)
DrawPieHL
;TODO
ret
DrawPanel
;hl=panel
ex de,hl
call setpgsscr40008000
call SetPgTextureC000
ld bc,38*256+160
ld hl,0x4000+(40*162)
push bc
push de
push hl
call primgega_onescreen
;call changescrpg
call setpgsscr40008000_current
pop hl
pop de
pop bc
call primgega_onescreen
;call changescrpg
jp setpgsmain40008000
;печать игрового сообщения
DrawTitle
;hl=msg (len,text)
push hl
CALL UnDrawOldTitle
pop hl
LD A,15
LD (STCNTa),A
push hl
call setpgsscr40008000
call DrawTitle_screen
call setpgsscr40008000_current
pop hl
call DrawTitle_screen
LD (curdrawingtitle),HL
jp setpgsmain40008000
DrawTitle_screen
LD C,(HL) ;len
INC L
LD A,40;32
SUB C
;RET C
RRA ;x
SCRADDR 0,TITLEY
ld de,_
add a,e
ld e,a
jr nc,$+3
inc d
MT0 LD A,(HL)
INC L
sub 32;CP 32
JR Z,MTSPC
PUSH HL
LD H,FONT88/256
add a,a
add a,a
add a,a
LD L,A
jr nc,$+3
inc h
LD B,8
call DrawCharHgtB
POP HL
MTSPC INC de ;scraddr
DEC C
JR NZ,MT0
ret
DrawCharHgtB
push de
MT1
;TODO 16c font
_left=1
_right=8
xor a
rlc (hl)
jr nc,$+4
or _left
rlc (hl)
jr nc,$+4
or _right
ld (de),a
ld a,d
add a,0x40
ld d,a
xor a
rlc (hl)
jr nc,$+4
or _left
rlc (hl)
jr nc,$+4
or _right
ld (de),a
ld a,d
add a,0x20-0x40
ld d,a
xor a
rlc (hl)
jr nc,$+4
or _left
rlc (hl)
jr nc,$+4
or _right
ld (de),a
ld a,d
add a,0x40
ld d,a
xor a
rlc (hl)
jr nc,$+4
or _left
rlc (hl)
jr nc,$+4
or _right
ld (de),a
ld a,e
add a,40
ld e,a
ld a,d
adc a,-0x60
ld d,a
inc hl
DJNZ MT1
pop de
ret
UnDrawOldTitle
push hl
SCRADDR 8,TITLEY
ld hl,_
ld e,0 ;e=gfx byte
ld bc,8*256+24*4 ;b=hgt,c=wid (/2)
call climgega
;TODO надрисовать панельку (её верхушки) с энергией
pop hl
ret
climgega
;hl=scr
;e=gfx byte
;b=hgt,c=wid (/2)
push bc
call setpgsscr40008000
pop bc
push bc
push de
push hl
call climgega_onescreen
call setpgsscr40008000_current
pop hl
pop de
pop bc
call climgega_onescreen
jp setpgsmain40008000
if 0
climgega_xy
;h=y, l=x/2
;b=hgt,c=wid (/2)
;e=gfx byte
push bc
ld a,l
ld c,h
;a=x
;c=y
ld b,0
ld l,c ;y
srl a ;x bit 0
ld h,b;0
rl h
;inc h
srl a ;x bit 1
rl h ;0x00/32/2 или 0x40/32/2
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
pop bc
endif
climgega_onescreen
;b=hgt,c=wid (/2)
;e=gfx byte
;hl=scr
climgega0
push bc
ld hx,b
push hl
ld bc,40
climgegacolumn0
ld (hl),e
add hl,bc
dec hx
jr nz,climgegacolumn0
pop hl
;0x4000,0x8000,0x6000,0xa000,0x4001
ld a,0x9f;0xa0, если не используем верхние 8 линий
cp h
ld bc,0x4000
adc hl,bc
jp pe,climgegacolumn0q ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a ;если используем верхние 8 линий
xor h
ld h,a
climgegacolumn0q
pop bc
dec c
jr nz,climgega0
ret
primgega_onescreen
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
push ix
primgega0
push bc
ld hx,b
push hl
ld bc,40
primgegacolumn0
ld a,(de)
inc de
ld (hl),a
add hl,bc
dec hx
jr nz,primgegacolumn0
pop hl
ld a,0x9f;0xa0
cp h
ld bc,0x4000
adc hl,bc
jp pe,primgegacolumn0q ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
primgegacolumn0q
pop bc
dec c
jr nz,primgega0
pop ix
ret
windLA=0x4000+(176*40)+(165/8)+0x2000;#55B9 ;ширина 58
windLAbit=0xb8;16 ;1=left;8=right
windRA=0x4000+(176*40)+(255/8)+0x6000;#55B6 ;ширина 58
windRAbit=0xb8;0x47;2 ;1=left;8=right
windEA=0x4000+(187*40)+(165/8)+0x2000;#50F0 ;ширина 148
windEAbit=0xb8;16 ;1=left;8=right
windLAwid=58;47
windEAwid=148;119
nrgPLOT
push bc
push af
call setpgsscr40008000
pop af
push af
call nrgPLOT_screen
call setpgsscr40008000_current
pop af
call nrgPLOT_screen
call setpgsmain40008000
pop bc
;jr $
;ret
;nrgGORIGHT
ld a,e
cpl;xor 2^16 ;1=left;8=right
ld e,a
rla;cp 8
ret c;nc
NextColumn
ld a,h
xor 0x40^0x80
ld h,a
ret m ;>=0x80
;bit 5,h
;set 5,h
ld a,h
xor 0x20
ld h,a
and 0x20
ret nz
;res 5,h
inc hl
ret
nrgPLOT_screen
;CY=pix, e=mask, hl=scraddr
sbc a,a
;and -(2*9);and 2*9
;add a,4*9 ;color2 (dark grey)="0", color4 (light grey)="1"
and 2*9
add a,2*9 ;color2 (dark grey)="0", color4 (light grey)="1"
push hl
ld bc,40
ld d,6
nrgPLOT_screen0
xor (hl)
and e
xor (hl)
ld (hl),a
add hl,bc
dec d
jr nz,nrgPLOT_screen0
pop hl
RET
DrawAttrField
RET
Hud_UnDrawTime
;LD HL,(#5A62)
;call Hud_ResetTimeAttrHL
;ld de,0x3d00 ;space
;ld b,d
;ld c,e
;TODO
jr DrawTime_Go
DrawTime
ld bc,(curtime)
bit 0,c
ret nz
;LD D,61 ;ROM font FIXME
push bc
ld hl,numfont
ld c,b
ld b,0
add hl,bc
SCRADDR 1,140
ld de,_
call setpgsscr40008000
ld b,16
call DrawCharHgtB
inc de
pop bc
ld hl,numfont
ld b,0
add hl,bc
ld b,16
call DrawCharHgtB
jp setpgsmain40008000
DrawTime_Go
;TODO
RET
Hud_ResetTime
Hud_ResetTimeAttrHL
RET
cls
;по идее не надо чистить панельку
;нельзя использовать OS_SETSCREEN - он используется в прерывании
if 1
SCRADDR 0,0
ld hl,_
ld e,0 ;e=gfx byte
ld bc,TITLEY*256+40*4 ;b=hgt,c=wid (/2)
jp climgega
else
ld e,0 ;color byte
OS_CLS
call changescrpg
halt
ld e,0 ;color byte
OS_CLS
jp changescrpg
endif
PR64
;de=scr
;a=char
push bc
push hl
push af
call setpgsscr40008000
pop af
push af
call PR64_screen
call setpgsscr40008000_current
pop af
call PR64_screen
call setpgsmain40008000
ex de,hl
call NextColumn
call NextColumn
ex de,hl
pop hl
pop bc
ret
PR64_screen
push de
SUB 32
ADD A,A
ADD A,A
ADD A,A
LD L,A
LD H,FONT/256
jr nc,$+3
inc h
LD B,7
PR640
_left=1
_right=8
xor a
rlc (hl)
jr nc,$+4
or _left
rlc (hl)
jr nc,$+4
or _right
ld (de),a
ld a,d
add a,0x40
ld d,a
xor a
rlc (hl)
jr nc,$+4
or _left
rlc (hl)
jr nc,$+4
or _right
ld (de),a
ld a,e
add a,40
ld e,a
ld a,d
adc a,-0x40
ld d,a
inc hl
DJNZ PR640
pop de
ret
ClearEnergyPanel ;не нужно для АТМ (на 6912 чистит грязь от генератора карты и ставит атрибуты сверху)
RET
PRSTAR
;TODO
RET
ENRAMKA
;hl=scr
call setpgsscr40008000
push hl
call EnRamka_onescreen
call setpgsscr40008000_current
pop hl
call EnRamka_onescreen
jp setpgsmain40008000
EnRamka_onescreen
ld c,0xff
push hl
call EnRamka_horline
pop hl
ld b,RAMKAHGT-1
EnRamka_onescreen0
push bc
ld de,40
add hl,de
push hl
ld a,c
and 0xb8 ;right
ld (hl),a
ld de,RAMKAWID-1
add hl,de
call NextColumn
call NextColumn
call NextColumn
ld a,c
and 0x47 ;left
ld (hl),a
pop hl
pop bc
djnz EnRamka_onescreen0
EnRamka_horline
;c=color byte
ld a,c
and 0xb8 ;right
ld (hl),a
ld b,RAMKAWID*4-1
call ScrHorLine
ld a,c
and 0x47 ;left
ld (hl),a
ret
ScrHorLine
;b=wid
;c=color byte
EnRamka_horline0
call NextColumn
ld (hl),c
djnz EnRamka_horline0
RET
ENFAKE
;рисуем полную энергию у команды
;hl=scr
;c=color byte
push bc
call setpgsscr40008000
pop bc
push bc
push hl
call EnFake_onescreen
call setpgsscr40008000_current
pop hl
pop bc
call EnFake_onescreen
jp setpgsmain40008000
EnFake_onescreen
;ld c,0xff-((15-9)*9) ;color9 (yellow)
LD b,5
ENFAKE0 push bc
PUSH HL
call NextColumn
ld a,c
and 0xb8 ;right
ld (hl),a
LD B,RAMKAWID*4-3
call ScrHorLine
ld a,c
and 0x47 ;left
ld (hl),a
POP HL
ld de,40
add hl,de
pop bc
djnz ENFAKE0
RET