DEVICE ZXSPECTRUM128
 
        include "../../_sdk/sys_h.asm"
 
 
 
scrbase=0x4000
 
sprmaxwid=32
 
sprmaxhgt=32
 
scrwid=160 ;double pixels
 
scrhgt=200
 
 
 
STACK=0x3ff0
 
tempsp=0x3f06 ;6 bytes for prspr
 
INTSTACK=0x3f00
 
 
 
        org PROGSTART
 
begin
 
        jp GO ;patched by prspr
 
GO
 
        ld sp,STACK
 
        OS_HIDEFROMPARENT
 
        ld e,0 ;EGA
 
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode) +8=noturbo, +0x80=keep gfx pages
 
        ld de,emptypal
 
        OS_SETPAL ;включаем чёрную палитру, чтобы было незаметно переброску экрана
 
        ld e,0
 
        OS_CLS ;очистили текущий экран
 
 
 
        OS_GETMAINPAGES
 
;dehl=pages in 0000,4000,8000,c000 
 
        ld a,e
 
        ld (pgmain4000),a
 
        ld a,h
 
        ld (pgmain8000),a
 
        ld a,l
 
        ld (pgmainc000),a
 
 
 
        OS_NEWPAGE ;заказали новую страницу, чтобы грузить туда данные
 
        ld a,e
 
        ld (pgvorobey),a ;запомнили её номер
 
        OS_NEWPAGE ;заказали новую страницу, чтобы грузить туда данные
 
        ld a,e
 
        ld (pgscrdata0),a ;запомнили её номер
 
        OS_NEWPAGE ;заказали другую новую страницу, чтобы грузить туда данные
 
        ld a,e
 
        ld (pgscrdata1),a ;запомнили её номер
 
 
 
        ld de,path
 
        OS_CHDIR
 
        
 
pgvorobey=$+1
 
        ld a,0
 
        ld de,filenamevorobey
 
        ld hl,0xc000 ;куда грузим
 
        call loadfile_in_ahl ;загрузили один экранный файл в одну страницу
 
        
 
        ld a,(pgscrdata0)
 
        ld de,filename0 ;имя файла
 
        ld hl,0xc000 ;куда грузим
 
        call loadfile_in_ahl ;загрузили один экранный файл в одну страницу
 
        ld a,(pgscrdata1)
 
        ld de,filename1 ;имя файла
 
        ld hl,0xc000 ;куда грузим
 
        call loadfile_in_ahl ;загрузили другой экранный файл в другую страницу
 
 
 
;сейчас у нас включены страницы программы, как было
 
 
 
        call swapimer
 
 
 
;что-то делаем...
 
;не важно что...
 
;...
 
 
 
;теперь надо вывести загруженные данные на экран
 
        ld a,(pgscrdata0)
 
        SETPGC000 ;включили страницу с данными в c000
 
        ld a,(user_scr0_low) ;ok
 
        SETPG4000 ;включили пол-экрана в 4000
 
        ld hl,0xc000
 
        ld de,0x4000
 
        ld bc,0x4000
 
        ldir ;перебросили на экран
 
 
 
        ld hl,0x4000+8000 ;там в картинке палитра (по байту на цвет)
 
        ld de,pal
 
        ld b,16
 
copypal0
 
        ld a,(hl)
 
        inc hl
 
        ld (de),a
 
        inc de
 
        ld (de),a
 
        inc de
 
        djnz copypal0 ;скопировали палитру в pal (по 2 байта на цвет)
 
        
 
        ld a,(pgscrdata1)
 
        SETPGC000 ;включили страницу с данными в c000
 
        ld a,(user_scr0_high) ;ok
 
        SETPG4000 ;включили другие пол-экрана в 4000
 
        ld hl,0xc000
 
        ld de,0x4000
 
        ld bc,0x4000
 
        ldir ;перебросили на экран
 
 
 
        call setpgsscr40008000_current ;включили страницы экрана
 
        ld a,(pgvorobey)
 
        SETPGC000
 
        ld hl,scrbase
 
        ld de,0xc000
 
        ld bc,128*256+(224/2)
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        call primgega_onescreen
 
       
 
 
 
        ld de,pal;sprpal
 
        OS_SETPAL ;включили палитру спрайтов;картинки
 
        
 
        call setpgsmain40008000 ;включили страницу программы в 4000, как было
 
        call setpgmainc000 ;включили страницу программы в c000, как было
 
 
 
        ld de,scrwid/4 + (256*scrhgt) ;d=hgt,e=wid (/8)
 
        ld hl,0x4000 ;hl=scr
 
        call copyimgega_curtodefault ;копируем картинку на другой экран
 
        call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
 
 
 
        ld a,(timer)
 
        ld (uvoldtimer),a
 
        
 
;главный цикл
 
mainloop
 
 
 
;вывод фона или восстановление фона под спрайтами
 
;... рекомендую взять из sprexamp!
 
restorer_cursprlist=$+1
 
        ld hl,sprlist1
 
        ld de,sprlist1^sprlist2
 
        ld a,h
 
        xor d
 
        ld h,a
 
        ld a,l
 
        xor e
 
        ld l,a
 
        ld (restorer_cursprlist),hl
 
       push hl ;curlist
 
restorer0
 
        ld e,(hl) ;x/2
 
        ld a,e
 
        cp 200
 
        jr z,restorer0q
 
        inc hl
 
        ld c,(hl) ;y
 
        inc hl
 
       ld a,scrhgt
 
       sub (hl) ;hgt
 
       ld b,a
 
        inc hl
 
       push hl
 
        ld a,e ;x/2
 
        sub +(sprmaxwid-1)
 
        jr nc,$+3
 
        xor a ;если <0
 
        ;cp scrwid-sprmaxwid
 
        ;jr c,$+4
 
        ;ld a,scrwid-sprmaxwid
 
        srl a
 
        srl a
 
        ld e,a ;x/8 >=0
 
        ld a,c ;y
 
        cp -(sprmaxhgt-1)
 
        jr c,$+3
 
        xor a ;если <0
 
        cp b
 
        jr c,$+3
 
        ld a,b
 
        ld c,a
 
;e=x/8 >=0
 
;c=y >=0
 
        ld b,0
 
        ld l,c
 
        ld h,b;0
 
        add hl,hl ;y*2
 
        add hl,hl ;y*4
 
        add hl,bc ;y*5
 
        add hl,hl ;y*10
 
        add hl,hl ;y*20
 
        add hl,hl ;y*40
 
        ld d,b;0
 
        add hl,de ;+x/8
 
        ld bc,0x4000
 
        add hl,bc
 
        ;ld hl,0x4000 ;hl=scr
 
        ;ld de,scrwid/4 + (256*scrhgt) ;d=hgt,e=wid (/8)
 
        ld de,3 + (256*16) ;d=hgt,e=wid (/8)        
 
        call copyimgega_defaulttoshadow
 
       pop hl
 
        jr restorer0
 
restorer0q
 
;вывод спрайтов
 
;...
 
        call setpgsscr40008000 ;включили страницы экрана
 
 
 
        ;ld hl,sprlist1
 
       pop hl
 
        ld (cursprlistaddr),hl
 
 
 
        ld iy,spaceship0
 
        ld e,50 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
 
        ld c,50 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
 
        call keepspr
 
        call prspr
 
        ld iy,fly0
 
curx=$+1
 
        ld e,80 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
 
       ld a,e
 
       ;add a,sprmaxwid-1
 
       cp scrwid-1+(sprmaxwid-1)
 
       jr nc,noprspr
 
cury=$+1
 
        ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
 
       ld a,c
 
       add a,sprmaxhgt-1
 
       cp scrhgt-1+(sprmaxhgt-1)
 
       jr nc,noprspr
 
        call keepspr
 
        call prspr
 
noprspr
 
        ld iy,explosion4
 
        ld e,60 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
 
        ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
 
        call keepspr
 
        call prspr
 
 
 
        call setpgsmain40008000 ;включили страницы программы в 4000,8000, как было
 
 
 
;закончили рисовать
 
       ld a,(timer)
 
       push af
 
        call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
 
 
 
;логика
 
;... её вызывать столько раз, сколько прошло прерываний!
 
mainloop_uvwaittimer0
 
        ld a,(timer)
 
uvoldtimer=$+1
 
        ld b,0
 
        ld (uvoldtimer),a
 
        sub b
 
        ld b,a
 
        jr z,mainloop_uvwaittimer0 ;если ни одного прерывания не прошло, крутимся тут
 
;b=сколько прошло прерываний
 
mainloop_uvlogic0
 
        push bc
 
        ;call logic ;<----------------- свою логику пиши сюда
 
        ld hl,curx
 
        inc (hl)
 
        ld hl,cury
 
        inc (hl)
 
        pop bc
 
        djnz mainloop_uvlogic0
 
 
 
;ждём физического переключения экрана!
 
;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
 
       pop bc ;b=timer на момент changescrpg
 
waitchangescr0
 
        ld a,(timer)
 
        cp b
 
        jr z,waitchangescr0
 
 
 
        ld a,(curkey)
 
        cp key_esc
 
        jp nz,mainloop ;выход по esc (break)
 
        
 
        ;YIELDGETKEYLOOP ;ждём кнопку
 
        call swapimer
 
        QUIT
 
        
 
keepspr
 
cursprlistaddr=$+1
 
        ld hl,0
 
        ld (hl),e ;x
 
        inc hl
 
        ld (hl),c ;y
 
        inc hl
 
        ld a,(iy-1)
 
        ld (hl),a ;hgt
 
        inc hl
 
        ld (cursprlistaddr),hl
 
        ret
 
        
 
endkeepspr
 
        ld hl,(cursprlistaddr)
 
        ld (hl),200
 
        ret
 
 
 
sprlist1
 
        ds 3*128,200
 
sprlist2
 
        ds 3*128,200
 
 
 
pal
 
        ds 32 ;тут будет палитра картинки
 
;sprpal
 
        include "sprpal.ast" ;палитра спрайтов (надо рисовать картинку этой же палитрой!)
 
emptypal
 
        ds 32,0xff ;палитра, где все цвета чёрные
 
 
 
loadfile_in_ahl
 
;de=имя файла
 
;hl=куда грузим (0xc000)
 
;a=в какой странице
 
        SETPG32KHIGH ;включили страницу A в 0xc000
 
        push hl ;куда грузим
 
        OS_OPENHANDLE
 
        pop de ;куда грузим
 
        push bc ;b=handle
 
        ld hl,0x4000 ;столько грузим (если столько есть в файле)
 
        OS_READHANDLE
 
        pop bc ;b=handle
 
        OS_CLOSEHANDLE
 
        jp setpgmainc000 ;включили страницу программы в c000, как было
 
 
 
primgega_onescreen
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
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
 
        ret
 
 
 
 
 
 
 
copyimgega_curtodefault
 
;d=hgt,e=wid (/8)
 
;hl=scr
 
        call getuser_scr_low_cur
 
        SETPG4000 ;set "from" page in 4000
 
        call getuser_scr_low
 
        SETPGC000 ;set "to" page in c000
 
        call copyimgegalayer
 
        call getuser_scr_high_cur
 
        SETPG16K ;set "from" page in 4000
 
        call getuser_scr_high
 
copyimgegaq
 
        SETPGC000 ;set "to" page in c000
 
        call copyimgegalayer
 
        call setpgmainc000
 
        jp setpgsmain40008000
 
 
 
copyimgega_defaulttocur
 
;d=hgt,e=wid (/8)
 
;hl=scr
 
        call getuser_scr_low
 
        SETPG4000 ;set "from" page in 4000
 
        call getuser_scr_low_cur
 
        SETPGC000 ;set "to" page in c000
 
        call copyimgegalayer
 
        call getuser_scr_high
 
        SETPG4000 ;set "from" page in 4000
 
        call getuser_scr_high_cur
 
        jr copyimgegaq ;set "to" page in c000, copy
 
 
 
copyimgega_defaulttoshadow
 
;d=hgt,e=wid (/8)
 
;hl=scr
 
        ld a,(pgscrdata0)
 
        SETPG4000 ;set "from" page in 4000
 
        call getuser_scr_low
 
        SETPGC000 ;set "to" page in c000
 
        call copyimgegalayer
 
        ld a,(pgscrdata1)
 
        SETPG4000 ;set "from" page in 4000
 
        call getuser_scr_high
 
        jr copyimgegaq ;set "to" page in c000, copy
 
 
 
copyimgegalayer
 
        push hl
 
        ld hx,e ;wid/8
 
copyimgega0
 
        push de
 
        push hl
 
        ld b,d ;hgt
 
        ld de,40-0x8000
 
copyimgegacolumn0
 
        ld a,(hl)
 
        set 5,h
 
        ld c,(hl)
 
         set 7,h
 
        ld (hl),c
 
        res 5,h
 
        ld (hl),a
 
        add hl,de
 
        djnz copyimgegacolumn0
 
        pop hl
 
        pop de
 
        inc hl
 
        dec hx
 
        jr nz,copyimgega0
 
        pop hl
 
        ret 
 
        
 
pgscrdata0
 
        db 0
 
pgscrdata1
 
        db 0
 
 
 
curkey
 
        db 0
 
joystate
 
;bit - button (ZX key)
 
;7 - A (A)
 
;6 - B (S)
 
;5 - Select (Space)
 
;4 - Start (Enter)
 
;3 - Up (7)
 
;2 - Down (6)
 
;1 - Left (5)
 
;0 - Right (8) 
 
        db 0
 
 
 
path
 
        db "loadscr",0
 
filenamevorobey
 
        db "vorobey.bin",0
 
filename0
 
        ;db "solkey.scr",0
 
        db "0kubik.bmpx",0
 
filename1
 
        db "1kubik.bmpx",0
 
 
 
        include "mem.asm"
 
        include "int.asm"
 
 
 
        include "spr.ast"
 
        include "prspr.asm"
 
 
 
end
 
 
 
        ;display "End=",end
 
        ;display "Free after end=",/d,#c000-end
 
        ;display "Size ",/d,end-begin," bytes"
 
        
 
        savebin "loadscr.com",begin,end-begin
 
        
 
        LABELSLIST "../../../us/user.l",1