atm=0
 
 
 
;ZX data:
 
;music=0;1
 
 
 
debug=0
 
demorec=0
 
demoplay=0;1
 
 
 
;control:
 
doublespeed=0;1
 
doublerotate=1
 
autostrafe=1
 
kempston=0;1
 
mouse=1
 
mindist=111 ;max=111
 
 
 
colour=7
 
ceilingcolour=0
 
floorcolour=colour*9
 
 
 
showfps=1
 
showscans=0
 
crosshair=0
 
 
 
sprites=1
 
 
 
scale64=3;1
 
 
 
;render:
 
scrhgt=16;24 ;chr$ (10,12,...,24)
 
scrwid=24;32 ;chr$
 
scrhgtpix=scrhgt*8
 
scrtopx=(32-scrwid)/2
 
scrtop=(24-scrhgt)*16+#4000+scrtopx
 
attrtop=(scrtop/8)&0x300+(0xff&scrtop)+0x5800
 
lowscrtop=#4800+scrtopx
 
lowattrtop=(lowscrtop/8)&0x300+(0xff&lowscrtop)+0x5800
 
lowscrhgt=8 ;chr$
 
lowscrhgtpix=lowscrhgt*8
 
        IF scale64
 
 maxscale=63
 
 IF scale64-3 == 0
 
  lowmaxscale=28 ;fit in low screen
 
 ELSE 
 
  lowmaxscale=19 ;fit in low screen
 
 ENDIF 
 
        ELSE 
 
 maxscale=127
 
 lowmaxscale=25 ;fit in low screen
 
        ENDIF 
 
mapdifbit=5;7
 
lores=0
 
        IF atm == 0
 
optres=1&(1-lores) ;+22t на мелких, выигрыш на крупных
 
        ELSE 
 
lores=1
 
optres=0
 
        ENDIF 
 
optfast=0
 
loresspr=0
 
optresspr=1&(1-loresspr) ;выигрыш на крупных
 
loresspr_hires=loresspr&(1-lores)
 
pixperchr=8>>lores
 
corr_coord=1
 
interpolate=16
 
 
 
doublescr=0;1
 
 
 
;tcos=#5B00
 
imer=#7F7F
 
imstack=imer
 
distbuf=#7C00 ;#300 ;ID,texx,dist
 
;imvec=#9F00
 
scrbuf=#A040
 
lowscrbuf=(scrhgtpix-lowscrhgtpix)/2+scrbuf
 
scrbufflag=scrbuf&#FF00+32
 
dropline=scrhgt*8+.scrbuf ;Y=192
 
map=#A001 ;+0 занят dropline, +32 занят флагом высоких
 
mapend=map+#2000
 
invmap=1
 
 
 
        if atm == 0
 
tscale=#C000 ;128x64, множители 0 и 63 выдают константы 0 и 3
 
             ;64x64 при scale64=1
 
        endif
 
 
 
pgtmp=#01
 
 
 
        ORG #C000,pgtmp
 
        INCBIN "walls_bw"
 
        INCBIN "goods_bw"
 
 
 
        ORG #6000,0
 
begin
 
tlogd2sca
 
       IFN scale64
 
       IF0 scale64-3
 
        INCBIN "logd2sc3"
 
       ELSE 
 
        INCBIN "logd2sc2"
 
       ENDIF 
 
       ELSE 
 
        INCBIN "logd2sc_"
 
       ENDIF 
 
tsqr2
 
        INCBIN "sqr2int"
 
tlogd
 
        INCBIN "logd"
 
tcorrlogd
 
        INCBIN "corlogd_"
 
        ORG $-256
 
       DUP 256
 
        DB {$+(scrtopx*8)}&0xff
 
       EDUP 
 
       IF lores
 
        ORG $-256
 
_=$
 
       DUP 128
 
        DB {_}&0xff
 
_=_+2
 
       EDUP 
 
        DS 128
 
       ENDIF 
 
tcos
 
        DS 256
 
tlogcos
 
        INCBIN "pluslcos"
 
tda
 
        INCBIN "da"
 
        ORG $-256
 
       DUP 256
 
        DB 0xff&({$}+128)
 
       EDUP 
 
        ORG $-256
 
       DUP 256
 
        DB 0xff&({$+(scrtopx*8)})
 
       EDUP 
 
       IF lores
 
        ORG $-256
 
_=$
 
       DUP 128
 
        DB {_}&0xff
 
_=_+2
 
       EDUP 
 
        DS 128
 
       ENDIF 
 
tctg
 
        INCBIN "plusctg"
 
tsin
 
        INCBIN "sin"
 
cursprites
 
        DS 256
 
 
 
        ;DISPLAY "tables end=",$
 
 
 
       IFN doublescr
 
SETPG
 
        LD (curpg),A
 
curscr=$+1
 
        OR 0
 
        LD BC,#7FFD
 
        OUT (C),A
 
        RET 
 
       ENDIF 
 
 
 
       IFN atmpg
 
        INCLUDE "wctrl*",#08
 
       ELSE 
 
        INCLUDE "wctrl*",#C2
 
       ENDIF 
 
 
 
;переменные рендера (обновляются в начале рендера)
 
curXx
 
curx    DB #80
 
curX    DB #0
 
curYy
 
cury    DB #80
 
curY    DB #0
 
curxy   DW 0
 
curyx   DW 0
 
curYX   DW 0
 
curangle
 
        DW tsin
 
demobegin
 
       IFN demoplay
 
        INCBIN "demorec*"
 
       ELSE 
 
        DB %00111111 ;all keys released
 
       ENDIF 
 
 
 
 
 
        DS #8000-$
 
 
 
        ORG imer
 
IMER
 
;store DE in stack
 
        EXD 
 
        EX (SP),HL
 
        LD (IMJP),HL
 
        LD (IMSP),SP
 
        LD SP,imstack
 
        PUSH AF,BC,DE
 
      ;PUSH HL
 
       PUSH IX
 
       IFN doublescr
 
        LD A,#10 ;pgmus
 
        LD BC,#7FFD
 
        OUT (C),A
 
       IFN music
 
        CALL #8006 ;play mus
 
       ENDIF 
 
        LD A,(newscr)
 
        LD (curscr),A
 
curpg=$+1
 
        LD A,#10
 
        CALL SETPG
 
       ENDIF 
 
timer=$+1
 
        LD HL,2560-25
 
        DEC HL
 
        LD (timer),HL
 
       IFN showfps
 
IMframe=$+1
 
        LD A,1
 
        DEC A
 
        JNZ IMNSEC
 
        LD DE,#4100
 
       ;LD DE,#4100<1
 
       ;RR D
 
IMfps=$+1
 
        LD A,0
 
        LD C,10
 
        CALL PRDIG
 
        LD C,1
 
        CALL PRDIG
 
        XOR A
 
        LD (IMfps),A
 
        LD A,50
 
IMNSEC
 
        LD (IMframe),A
 
       ENDIF 
 
        CALL CONTROL
 
       POP IX
 
      ;POP HL
 
        POP DE,BC,AF
 
IMSP=$+1
 
        LD SP,0
 
        POP HL
 
        EXD 
 
        EI 
 
      ;RET
 
IMJP=$+1
 
        JP 0
 
 
 
       IF showfps
 
PRDIG
 
        LD L,15
 
        INC L
 
        SUB C
 
        jr NC,$-2
 
        ADD A,C
 
        PUSH AF
 
        LD A,L
 
        ADD A,A
 
        ADD A,A
 
        ADD A,A
 
        INC A
 
        LD L,A
 
        LD H,#3D
 
        PUSH DE
 
        LD B,6
 
        LD A,(HL)
 
        ld (DE),A
 
        INC L,D
 
        DJNZ $-4
 
        POP DE
 
        POP AF
 
        INC E
 
        RET 
 
       ENDIF 
 
 
 
        DS (IMER/256+1)<<8-$
 
 
 
        ORG #8000
 
imvec
 
        DS 257,IMER
 
       IF music
 
        INCBIN "DOOM-MUS"
 
       ENDIF 
 
 
 
ZXLOOP
 
       if atm
 
       call changescrpg
 
;        ld a,1
 
;curscreen=$+1
 
;        xor 1
 
;        ld (curscreen),a
 
;         add a,a
 
;         add a,a
 
;         add a,a
 
;         ld (imer_curscreen_value),a
 
        ld hl,(timer)
 
        ld (endoflastredrawtimer),hl
 
       endif
 
 
 
       IF atm == 0
 
       IF doublescr
 
        LD A,#10
 
        CALL SETPG
 
       ENDIF 
 
       ENDIF 
 
       ;HALT
 
        CALL SCAN
 
 
 
       IF doublescr
 
;ждать флаг ожидания готовности экрана (включается по прерыванию)
 
;иначе будет так:
 
;фрейм 1:
 
;видим экран0, рисуем экран1
 
;фрейм 2:
 
;видим экран0, закончили рисовать экран1, [вот тут нужно ожидание], начали рисовать экран0 (хотя его видим)
 
;фрейм 3:
 
;видим экран1
 
;готовность - это когда текущий таймер != таймер конца прошлой отрисовки
 
;проверяем оба таймера, а то могло случиться системное прерывание
 
EmulatePPU_waitforscreenready0
 
        ld hl,(timer)
 
endoflastredrawtimer=$+1
 
        ld de,0
 
        or a
 
        sbc hl,de
 
        jr z,EmulatePPU_waitforscreenready0
 
       ENDIF 
 
 
 
       IF atm
 
pgscalersnum=$+1
 
        LD A,0
 
        setpgafast
 
        
 
;        LD A,2
 
;setpgs_scr_xor=$+1
 
;        XOR 2
 
;        LD ($-1),A
 
;setpgs_scr_low=$+1
 
;        XOR 0xff-1;#7F-pgattr1
 
;        ld (curscrpg_low),a
 
;       PUSH AF
 
;        SETPG16K
 
       call getuser_scr_low
 
       SETPG16K
 
        CALL DWCLSALL
 
        xor a;LD A,0
 
        CALL DRAWWALLS
 
       call getuser_scr_high
 
       SETPG16K
 
;       POP AF
 
;setpgs_scr_high_xor_low=$+1
 
;        XOR 4;pgattr1^pgpix1
 
;        SETPG16K
 
        
 
        CALL DWCLSALL
 
        LD A,1
 
        CALL DRAWWALLS
 
 
 
       ELSE ;~atm
 
 
 
        CALL CLSCRBUF
 
        CALL DRAWWALLS
 
        CALL CHECKHEIGHTS
 
       IF sprites
 
       CALL SCANMONS
 
       CALL DRAWSPRITES
 
       ENDIF 
 
       IF crosshair
 
        CALL CROSSHAIR
 
       ENDIF 
 
       IF doublescr
 
        LD A,(curscr)
 
newscr=$+1
 
        CP 0
 
        jr Z,nohalt
 
        HALT ;if CPU is too fast
 
nohalt
 
        LD A,#17
 
        CALL SETPG
 
       ENDIF 
 
        CALL EORFILL
 
       IF doublescr
 
        LD A,(newscr)
 
        XOR 8
 
        LD (newscr),A
 
       ENDIF 
 
       ENDIF 
 
;-----------------------
 
       IF showfps
 
        LD HL,IMfps
 
        INC (HL)
 
       ENDIF 
 
 
 
curkey=$+1
 
        ld a,0
 
        cp key_esc
 
        jr z,ZXLOOPQUIT
 
        cp key_redraw
 
        call z,redraw
 
       
 
       ;LD A,0xfe
 
       ;IN A,(0xFE)
 
       ;rra ;caps shift
 
       ;JP c,ZXLOOP
 
       ;LD A,0x7F
 
       ;IN A,(0xFE)
 
       ;RRA ;space
 
       ;JP NC,ZXLOOPQUIT
 
       
 
        jr ZXLOOP
 
ZXLOOPQUIT
 
        ret
 
 
 
redraw
 
        xor a
 
        ld (curkey),a ;чтобы redraw не повторялся
 
        call redraw_cls
 
        ld a,1
 
redraw_cls
 
        ld (curscrnum),a ;for interrupt
 
        ld e,a
 
        OS_SETSCREEN
 
        ld e,0
 
        OS_CLS
 
        ret
 
 
 
        INCLUDE "WSCAN10.asm"
 
        INCLUDE "WREND.asm"
 
 
 
MONSTAB
 
;ZOMBIEMAN
 
DW #FC00
 
DW #FC0B
 
DW #FC16
 
DW #FC20
 
DW #FC2A
 
DW #FC35
 
DW 0,0
 
;AMMO
 
DW #FE89 ;G
 
DW #FE90 ;R
 
DW #FE97 ;MEGAHEALTH
 
DW #FE00 ;RL
 
DW #FE9D ;AMMO
 
DW 0,0,0
 
;STOLB
 
DW #CB29
 
 
 
        DS ((-$)&7)&0xff
 
MONSTRS
 
;Xx,Yy,TYPEphase,TIMEenergy
 
DW #0F80,#AF80,#000,-1;ENEMY
 
DW #2680,#A080,#000,64
 
DW #0380,#BA80,#000,64
 
DW #0780,#B780,#000,64
 
 
 
DW #0F80,#B080,#002,64
 
DW #1380,#A080,#000,64
 
DW #1380,#AA80,#000,64
 
DW #1380,#B280,#000,64
 
DW #1380,#B380,#000,64
 
DW #1280,#B580,#002,64
 
DW #1480,#AB80,#000,64
 
DW #1480,#AE80,#002,64
 
 
 
DW #1480,#B080,#002,64
 
DW #1480,#B380,#000,64
 
DW #1580,#A180,#002,80
 
DW #1680,#AD80,#002,90
 
DW #1680,#B180,#002,100
 
DW #2180,#AD80,#002,10
 
DW #2380,#A080,#000,50
 
DW #2380,#A580,#002,50
 
 
 
DW #2680,#A480,#003,50
 
DW #2680,#B280,#004,50
 
DW #2780,#A880,#005,50
 
DW #2780,#B180,#003,64
 
 
 
DW #2780,#A380,#100,150
 
DW #2080,#A580,#101,100
 
DW #2280,#A580,#102,100
 
DW #2580,#A080,#103,20
 
DW #2080,#A080,#104,40
 
 
 
DW #1380,#A2C0,#200,0
 
DW #1380,#A440,#200,0
 
DW #1280,#A2C0,#200,0
 
DW #1280,#A440,#200,0
 
DW #1180,#A2C0,#200,0
 
DW #1180,#A440,#200,0
 
DW #1080,#A2C0,#200,0
 
DW #1080,#A440,#200,0
 
DW #0F80,#A2C0,#200,0
 
DW #0F80,#A440,#200,0
 
DW #0E80,#A2C0,#200,0
 
DW #0E80,#A440,#200,0
 
DW #0D80,#A2C0,#200,0
 
DW #0D80,#A440,#200,0
 
DW -1
 
eNDMONS
 
 
 
        ;DISPLAY "PROG END=",$
 
 
 
        ORG distbuf
 
RECMAP
 
        LD HL,WASMAP
 
        LD DE,#4000
 
       PUSH DE
 
        LD BC,szMAP
 
        LDIR 
 
       POP HL
 
        LD DE,level
 
        LD BC,endlev-level
 
        LDIR 
 
       if atm
 
       LD A,(YX+1) ;Y
 
       SUB #A0
 
       SUB map/256+31
 
       CPL 
 
       LD (IMcurYy+1),A
 
       LD A,(YX) ;X
 
       INC A
 
       LD (IMcurXx+1),A
 
       endif
 
INImons LD A,(HL)
 
        LDI 
 
        AND (HL)
 
        LDI 
 
        INC A
 
        JR Z,INImonsQ
 
        LD BC,6
 
        LDIR 
 
        JR INImons
 
INImonsQ ;
 
       EXD 
 
       if atm 
 
        LD H,map/256+31
 
       else
 
        LD H,map/256
 
       endif
 
       IF invmap
 
       LD L,map&0xff
 
       LD C,1
 
       JR GETMAPL
 
       ENDIF 
 
GETMAP0
 
       IF invmap
 
        LD L,0xff&(map+32)
 
       ELSE 
 
        LD L,map&0xff
 
       ENDIF 
 
        LD C,2
 
GETMAPL LD B,32;33
 
GETMAP1 LD A,(DE)
 
        INC DE
 
        LD (HL),0
 
        CP 13
 
        JR Z,GETMCR
 
       IF atm
 
       jr NC,GMNRLE
 
        LD A,(DE)
 
        INC DE
 
       DEC A
 
GMRLE
 
        INC L
 
        LD (HL),0
 
        DEC B
 
        DEC A
 
        jr NZ,GMRLE
 
        LD A,32
 
GMNRLE
 
       ENDIF 
 
        CP 32
 
        JR Z,GETMAPE
 
       IF atm
 
      CP 64    ;
 
      jr NC,$+4  ;
 
      ADD A,64 ;todo kill
 
       ADD A,128-64
 
       ELSE 
 
       SUB "1";+128
 
      CPL 
 
      ADD A,A
 
     CP -20
 
     jr NC,$+4
 
     LD A,-20
 
       ENDIF 
 
       LD (HL),A
 
GETMAPE INC L
 
        DJNZ GETMAP1
 
        JR GETMOK
 
GETMCR  LD (HL),0
 
        INC L
 
        DJNZ GETMCR
 
GETMOK
 
       IF invmap
 
       LD L,map&0xff
 
       ENDIF 
 
        DEC C
 
        jr NZ,GETMAPL
 
       if atm
 
        LD A,H
 
        DEC H
 
        CP map/256
 
        JR NZ,GETMAP0
 
       else
 
        INC H
 
        BIT 6,H
 
        JR Z,GETMAP0
 
       endif
 
 
 
       IF atm == 0
 
        LD HL,#4000
 
        CALL INICLS
 
       IF doublescr
 
        LD A,#17
 
        CALL SETPG
 
        LD HL,#C000
 
        CALL INICLS
 
       ENDIF 
 
       ENDIF 
 
        XOR A
 
        LD H,scrbuf/256
 
        LD C,scrwid
 
PRECLS  LD L,scrbuf&0xff
 
        LD B,scrhgtpix
 
        LD (HL),A
 
        INC L
 
        DJNZ $-2
 
        INC H
 
        DEC C
 
        jr NZ,PRECLS
 
        LD BC,#FBDF
 
        IN A,(C)
 
        LD (mouseoldx),A
 
       JP LOOP
 
INICLS
 
        LD D,H
 
        ld E,1
 
        LD BC,#1800
 
        LD (HL),L
 
        LDIR 
 
        LD BC,767
 
        LD (HL),colour
 
        LDIR 
 
        RET 
 
        DS distbuf+#300-$
 
 
 
        ORG #C000
 
       IFN scale64
 
       IF0 scale64-3
 
        INCBIN "tscale3"
 
       ELSE 
 
        INCBIN "tscale2"
 
       ENDIF 
 
       ELSE 
 
        INCBIN "tscale"
 
       ENDIF 
 
end
 
 
 
        ORG scrbuf
 
GO
 
        DI 
 
        LD HL,WAStcos
 
        LD DE,tcos
 
       PUSH DE
 
        LD BC,256
 
        LDIR 
 
       POP HL
 
REtcos0
 
       DUP 2;4
 
        SRA (HL)
 
       EDUP 
 
        INC L
 
        JNZ REtcos0
 
 
 
       IFN music
 
        CALL #8000 ;init mus
 
       ENDIF 
 
        LD HL,imvec
 
        LD DE,imvec+1
 
        LD (HL),IMER
 
        LD B,E,C,L
 
        LD A,H
 
        LDIR 
 
        LD I,A
 
        IM 2
 
        EI 
 
       HALT 
 
        LD HL,-2
 
        ADD HL,SP
 
        LD (clscrbufsp),HL
 
        LD (eorfillsp),HL
 
        JP RECMAP ;->LOOP
 
 
 
WASMAP
 
       IF atm
 
        INCBIN "mapatm.E"
 
       ELSE 
 
        INCBIN "map48.E"
 
       ENDIF 
 
szMAP=$-WASMAP
 
 
 
level
 
        DB "W"
 
gfxnr   DB "0"
 
muznr   DB "A"
 
pol     DB #E7
 
potolok DB #F3
 
color   DB 7
 
levname DS 23
 
        DB 0
 
monstrs DB 0
 
prizes  DW 0 ;$$$/10
 
EXITx   DB 23
 
EXITy   DB 15+#A0
 
yx      DW #8080
 
YX      DW #BA08
 
angle   DW 64
 
endlev
 
WAStcos
 
        INCBIN "cos"
 
 
 
ObjTab
 
        DB "wolfblokC"
 
        DW begin
 
        DW end-begin
 
        DB #10
 
        DW begin
 
       IFN atmpg
 
        INCLUDE "SAVEOBJ*",#20
 
       ELSE 
 
        INCLUDE "SAVEOBJ*",#C0
 
       ENDIF 
 
        ORG $,0
 
       IFN atmpg ;{#5BE9}-#0F4F ;atm hack
 
        LD BC,_prep
 
        PUSH BC
 
        LD A,#FF
 
        LD BC,#3FF0
 
        PUSH BC
 
        LD BC,#FFF7
 
        JP #3D2F
 
_prep
 
       ENDIF 
 
;prepare 48K block
 
        DI ;IY
 
        LD H,#C1
 
INIRETAB0 ;
 
        LD L,0
 
        LD B,maxscale+1
 
INIRETAB1 ;
 
        LD A,(HL)
 
        CP 128-(scrhgtpix/2)
 
        JNC $+4
 
        LD A,128-(scrhgtpix/2)
 
        CP 128+(scrhgtpix/2);-1
 
        JC $+4
 
       ;LD A,128+(scrhgtpix/2)-1 ;видно линию внизу от переполнй
 
       LD A,dropline-(scrbuf+(scrhgtpix/2)-128)
 
        ADD A,scrbuf+(scrhgtpix/2)-128
 
        LD (HL),A
 
        INC L
 
        DJNZ INIRETAB1
 
        INC H
 
        LD A,H
 
        INC A ;#C0XX,#FFXX не трогаем
 
        JNZ INIRETAB0
 
       LD HL,#FF00
 
       LD DE,#FF01
 
       LD BC,maxscale
 
       LD (HL),1
 
       LDIR 
 
        LD HL,#5800
 
        LD DE,#5801
 
        LD BC,767
 
        LD (HL),L
 
        LDIR 
 
       LD BC,#7FFD
 
       LD A,pgtmp|#10
 
       OUT (C),A
 
        LD HL,#C000
 
        LD DE,#4000
 
        LD BC,#1800
 
        LDIR 
 
       LD BC,#7FFD
 
       LD A,#10
 
       OUT (C),A
 
        LD DE,#C000+maxscale+1
 
       LD HY,#FE
 
;4 upper textures = #09A6
 
;4 lower textures = #0AAC
 
        LD HL,#4000
 
        CALL GETTEX
 
        CALL GETTEX
 
        CALL GETTEX
 
        CALL GETTEX
 
        LD HL,#4800
 
        CALL GETTEX
 
        CALL GETTEX
 
        CALL GETTEX
 
        CALL GETTEX
 
        LD HL,#5000
 
        CALL GETTEX
 
        CALL GETTEX
 
        PUSH DE
 
       LD BC,#7FFD
 
       LD A,#11
 
       OUT (C),A
 
        LD HL,#DB00
 
        LD DE,#4000
 
        LD BC,#1800
 
        LDIR 
 
       LD BC,#7FFD
 
       LD A,#10
 
       OUT (C),A
 
        POP DE
 
       LD HL,#4008
 
       CALL GETSPR;TEX
 
        LD IY,23610
 
        EI 
 
       CALL 8026
 
       JP C,GO
 
       JP nenado
 
 
 
GETTEX
 
       IFN scale64
 
        LD LY,#40
 
       ELSE 
 
        LD LY,#80
 
       ENDIF 
 
        LD BC,#0880 ;B=width/8, C=#80(mask)
 
GETTEX00 ;
 
       PUSH BC
 
GETTEX0 CALL GETTEXLINE
 
        INC LY
 
       IF0 scale64
 
       INC LY
 
       ENDIF 
 
        RRC C
 
        JNC GETTEX0
 
        INC L
 
       POP BC
 
        DJNZ GETTEX00
 
       DEC HY,HY
 
        RET 
 
 
 
GETSPR
 
       IFN scale64
 
        LD LY,#40
 
       ELSE 
 
        LD LY,#80
 
       ENDIF 
 
        LD BC,#0880 ;B=width/8, C=#80(mask)
 
GETSPR00 ;
 
       PUSH BC
 
GETSPR0 CALL GETSPRLINE
 
        INC LY
 
       IF0 scale64
 
       INC LY
 
       ENDIF 
 
        RRC C
 
        JNC GETSPR0
 
        INC L
 
       POP BC
 
        DJNZ GETSPR00
 
       DEC HY,HY
 
        RET 
 
 
 
GETTEXLINE
 
       PUSH HL
 
GETTEXRETRY ;
 
       LD (gettexDE),DE ;linelength addr
 
       POP HL
 
       PUSH HL
 
        LD (IY),E
 
       IF0 scale64
 
       LD (IY+1),E
 
       ENDIF 
 
        INC HY
 
        LD (IY),D
 
       IF0 scale64
 
       LD (IY+1),D
 
       ENDIF 
 
        DEC HY
 
        INC E
 
        JNZ GETTEXniD
 
GETTEXiD INC D
 
       LD E,maxscale+1
 
       JR GETTEXRETRY
 
GETTEXniD ;
 
        LD LX,0;C ;bit
 
        LD HX,17 ;dots
 
        LD B,62 ;62..1 -> 1..62
 
GETTEX1 ;
 
        CALL DHL
 
        LD A,(HL)
 
        AND C
 
        CP LX
 
        LD LX,A
 
        JZ GETTEXN
 
       LD A,HX
 
       OR A
 
       JZ GETTEXN
 
        LD A,'tscale+63
 
        SUB B
 
        LD (DE),A
 
        DEC HX ;17-pixels
 
        INC E ;todo check before write
 
        JZ GETTEXiD
 
GETTEXN ;
 
        DJNZ GETTEX1
 
        LD A,HX ;17-pixels
 
        ADD A,A
 
        ADD A,A
 
        ADD A,A
 
        SUB HX  ;*7
 
       ADD A,DWJP
 
gettexDE=$+1
 
        LD (0),A
 
       POP HL
 
        RET 
 
 
 
GETSPRLINE
 
       PUSH HL
 
GETSPRRETRY ;
 
       POP HL
 
       PUSH HL
 
        LD (IY),E
 
       IF0 scale64
 
       LD (IY+1),E
 
       ENDIF 
 
        INC HY
 
        LD (IY),D
 
       IF0 scale64
 
       LD (IY+1),D
 
       ENDIF 
 
        DEC HY
 
       LD A,H
 
       OR 6
 
       LD H,A
 
       LD A,L
 
       ADD A,#E0
 
       LD L,A ;line 62
 
        LD HX,1
 
GETSPR1 ;
 
        CALL FIND10
 
        JNC GETSPRQ ;end of column
 
        LD A,HX
 
        CPL 
 
        LD (DE),A ;Y
 
        INC E
 
        JZ GETSPRiD
 
        CALL FIND1HEIGHT
 
        LD A,HX
 
        CPL 
 
        LD (DE),A ;Y2
 
        INC E
 
        JZ GETSPRiD
 
        CALL FIND0HEIGHT
 
        LD A,HX
 
        CPL 
 
        LD (DE),A ;Y3
 
        INC E
 
        JZ GETSPRiD
 
        JR GETSPR1
 
GETSPRQ
 
        LD A,#C0
 
        LD (DE),A
 
        INC E
 
        JNZ GETSPRniD
 
GETSPRiD INC D
 
       LD E,maxscale+1
 
       JR GETSPRRETRY
 
GETSPRniD ;
 
        LD A,#FF
 
        LD (DE),A
 
        INC E
 
        JNZ $+5
 
         INC D
 
         LD E,maxscale+1
 
       POP HL
 
        RET 
 
 
 
maxVhgt=10;16?
 
 
 
;HX=V
 
;HL=mask
 
FIND10
 
        LD A,HX
 
        CP 63
 
        RET Z ;CY=0: end of column
 
        CALL GETPIXEL
 
        RET C ;CY=1: pixel
 
        CALL UHL
 
        INC HX ;V
 
        JR FIND10
 
FIND1HEIGHT
 
       ;LD LX,HX ;oldV
 
        LD B,0
 
F1H0    CALL GETPIXEL
 
        RET NC ;transparent
 
        RET Z ;0
 
        CALL UHL
 
        INC HX ;V
 
        INC B
 
        LD A,B
 
        CP maxVhgt
 
        JC F1H0
 
        RET 
 
FIND0HEIGHT
 
       ;LD LX,HX ;oldV
 
        LD B,0
 
F0H0    CALL GETPIXEL
 
        RET NC ;transparent
 
        RET NZ ;1
 
        CALL UHL
 
        INC HX ;V
 
        INC B
 
        LD A,B
 
        CP maxVhgt
 
        JC F0H0
 
        RET 
 
 
 
GETPIXEL
 
        LD A,HX
 
        CP 63
 
        RET Z ;CY=0: transparent
 
        LD A,(HL)
 
        AND C
 
        RET NZ ;CY=0: transparent
 
        RES 3,L
 
        LD A,(HL)
 
        AND C
 
        SET 3,L
 
        SCF ;CY=1: pixel (Z)
 
        RET 
 
 
 
UHL
 
        LD A,H
 
        DEC H
 
        AND 7
 
        RET NZ
 
        LD A,L
 
        SUB #20
 
        LD L,A
 
        RET C
 
        LD A,H
 
        ADD A,8
 
        LD H,A
 
        RET 
 
 
 
        DS #C000-$