?login_element?

Subversion Repositories NedoOS

Rev

Rev 1514 | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. scrbase=0x4000
  5. sprmaxwid=32
  6. sprmaxhgt=32
  7. scrwid=160 ;double pixels
  8. scrhgt=200
  9.  
  10. STACK=0x3ff0
  11. tempsp=0x3f06 ;6 bytes for prspr
  12. INTSTACK=0x3f00
  13.  
  14.         org PROGSTART
  15. begin
  16.         jp GO ;patched by prspr
  17. GO
  18.         ld sp,STACK
  19.         OS_HIDEFROMPARENT
  20.         ld e,0 ;EGA
  21.         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
  22.         ld de,emptypal
  23.         OS_SETPAL ;включаем чёрную палитру, чтобы было незаметно переброску экрана
  24.         ld e,0
  25.         OS_CLS ;очистили текущий экран
  26.  
  27.         OS_GETMAINPAGES
  28. ;dehl=pages in 0000,4000,8000,c000
  29.         ld a,e
  30.         ld (pgmain4000),a
  31.         ld a,h
  32.         ld (pgmain8000),a
  33.         ld a,l
  34.         ld (pgmainc000),a
  35.  
  36.         OS_NEWPAGE ;заказали новую страницу, чтобы грузить туда данные
  37.         ld a,e
  38.         ld (pgvorobey),a ;запомнили её номер
  39.         OS_NEWPAGE ;заказали новую страницу, чтобы грузить туда данные
  40.         ld a,e
  41.         ld (pgscrdata0),a ;запомнили её номер
  42.         OS_NEWPAGE ;заказали другую новую страницу, чтобы грузить туда данные
  43.         ld a,e
  44.         ld (pgscrdata1),a ;запомнили её номер
  45.  
  46.         ld de,path
  47.         OS_CHDIR
  48.        
  49. pgvorobey=$+1
  50.         ld a,0
  51.         ld de,filenamevorobey
  52.         ld hl,0xc000 ;куда грузим
  53.         call loadfile_in_ahl ;загрузили один экранный файл в одну страницу
  54.        
  55.         ld a,(pgscrdata0)
  56.         ld de,filename0 ;имя файла
  57.         ld hl,0xc000 ;куда грузим
  58.         call loadfile_in_ahl ;загрузили один экранный файл в одну страницу
  59.         ld a,(pgscrdata1)
  60.         ld de,filename1 ;имя файла
  61.         ld hl,0xc000 ;куда грузим
  62.         call loadfile_in_ahl ;загрузили другой экранный файл в другую страницу
  63.  
  64. ;сейчас у нас включены страницы программы, как было
  65.  
  66.         call swapimer
  67.  
  68. ;что-то делаем...
  69. ;не важно что...
  70. ;...
  71.  
  72. ;теперь надо вывести загруженные данные на экран
  73.         ld a,(pgscrdata0)
  74.         SETPGC000 ;включили страницу с данными в c000
  75.         ld a,(user_scr0_low) ;ok
  76.         SETPG4000 ;включили пол-экрана в 4000
  77.         ld hl,0xc000
  78.         ld de,0x4000
  79.         ld bc,0x4000
  80.         ldir ;перебросили на экран
  81.  
  82.         ld hl,0x4000+8000 ;там в картинке палитра (по байту на цвет)
  83.         ld de,pal
  84.         ld b,16
  85. copypal0
  86.         ld a,(hl)
  87.         inc hl
  88.         ld (de),a
  89.         inc de
  90.         ld (de),a
  91.         inc de
  92.         djnz copypal0 ;скопировали палитру в pal (по 2 байта на цвет)
  93.        
  94.         ld a,(pgscrdata1)
  95.         SETPGC000 ;включили страницу с данными в c000
  96.         ld a,(user_scr0_high) ;ok
  97.         SETPG4000 ;включили другие пол-экрана в 4000
  98.         ld hl,0xc000
  99.         ld de,0x4000
  100.         ld bc,0x4000
  101.         ldir ;перебросили на экран
  102.  
  103.         call setpgsscr40008000_current ;включили страницы экрана
  104.         ld a,(pgvorobey)
  105.         SETPGC000
  106.         ld hl,scrbase
  107.         ld de,0xc000
  108.         ld bc,128*256+(224/2)
  109. ;b=hgt,c=wid (/2)
  110. ;de=gfx
  111. ;hl=scr
  112.         call primgega_onescreen
  113.        
  114.  
  115.         ld de,pal;sprpal
  116.         OS_SETPAL ;включили палитру спрайтов;картинки
  117.        
  118.         call setpgsmain40008000 ;включили страницу программы в 4000, как было
  119.         call setpgmainc000 ;включили страницу программы в c000, как было
  120.  
  121.         ld de,scrwid/4 + (256*scrhgt) ;d=hgt,e=wid (/8)
  122.         ld hl,0x4000 ;hl=scr
  123.         call copyimgega_curtodefault ;копируем картинку на другой экран
  124.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  125.  
  126.         ld a,(timer)
  127.         ld (uvoldtimer),a
  128.        
  129. ;главный цикл
  130. mainloop
  131.  
  132. ;вывод фона или восстановление фона под спрайтами
  133. ;... рекомендую взять из sprexamp!
  134. restorer_cursprlist=$+1
  135.         ld hl,sprlist1
  136.         ld de,sprlist1^sprlist2
  137.         ld a,h
  138.         xor d
  139.         ld h,a
  140.         ld a,l
  141.         xor e
  142.         ld l,a
  143.         ld (restorer_cursprlist),hl
  144.        push hl ;curlist
  145.  
  146. restorer0
  147.         ld e,(hl) ;x/2
  148.         ld a,e
  149.         cp 200
  150.         jr z,restorer0q
  151.         inc hl
  152.         ld c,(hl) ;y
  153.         inc hl
  154.        ld a,scrhgt
  155.        sub (hl) ;hgt
  156.        ld b,a
  157.         inc hl
  158.        push hl
  159.         ld a,e ;x/2
  160.         sub +(sprmaxwid-1)
  161.         jr nc,$+3
  162.         xor a ;если <0
  163.         ;cp scrwid-sprmaxwid
  164.         ;jr c,$+4
  165.         ;ld a,scrwid-sprmaxwid
  166.         srl a
  167.         srl a
  168.         ld e,a ;x/8 >=0
  169.         ld a,c ;y
  170.         cp -(sprmaxhgt-1)
  171.         jr c,$+3
  172.         xor a ;если <0
  173.         cp b
  174.         jr c,$+3
  175.         ld a,b
  176.         ld c,a
  177. ;e=x/8 >=0
  178. ;c=y >=0
  179.         ld b,0
  180.         ld l,c
  181.         ld h,b;0
  182.         add hl,hl ;y*2
  183.         add hl,hl ;y*4
  184.         add hl,bc ;y*5
  185.         add hl,hl ;y*10
  186.         add hl,hl ;y*20
  187.         add hl,hl ;y*40
  188.         ld d,b;0
  189.         add hl,de ;+x/8
  190.         ld bc,0x4000
  191.         add hl,bc
  192.         ;ld hl,0x4000 ;hl=scr
  193.         ;ld de,scrwid/4 + (256*scrhgt) ;d=hgt,e=wid (/8)
  194.         ld de,3 + (256*16) ;d=hgt,e=wid (/8)        
  195.         call copyimgega_defaulttoshadow
  196.        pop hl
  197.         jr restorer0
  198. restorer0q
  199. ;вывод спрайтов
  200. ;...
  201.         call setpgsscr40008000 ;включили страницы экрана
  202.  
  203.         ;ld hl,sprlist1
  204.        pop hl
  205.         ld (cursprlistaddr),hl
  206.  
  207.         ld iy,spaceship0
  208.         ld e,50 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  209.         ld c,50 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  210.         call keepspr
  211.         call prspr
  212.         ld iy,fly0
  213. curx=$+1
  214.         ld e,80 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  215.        ld a,e
  216.        ;add a,sprmaxwid-1
  217.        cp scrwid-1+(sprmaxwid-1)
  218.        jr nc,noprspr
  219. cury=$+1
  220.         ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  221.        ld a,c
  222.        add a,sprmaxhgt-1
  223.        cp scrhgt-1+(sprmaxhgt-1)
  224.        jr nc,noprspr
  225.         call keepspr
  226.         call prspr
  227. noprspr
  228.         ld iy,explosion4
  229.         ld e,60 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  230.         ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  231.         call keepspr
  232.         call prspr
  233.  
  234.         call endkeepspr
  235.  
  236.         call setpgsmain40008000 ;включили страницы программы в 4000,8000, как было
  237.  
  238. ;закончили рисовать
  239.        ld a,(timer)
  240.        push af
  241.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  242.  
  243. ;логика
  244. ;... её вызывать столько раз, сколько прошло прерываний!
  245. mainloop_uvwaittimer0
  246.         ld a,(timer)
  247. uvoldtimer=$+1
  248.         ld b,0
  249.         ld (uvoldtimer),a
  250.         sub b
  251.         ld b,a
  252.         jr z,mainloop_uvwaittimer0 ;если ни одного прерывания не прошло, крутимся тут
  253. ;b=сколько прошло прерываний
  254. mainloop_uvlogic0
  255.         push bc
  256.         ;call logic ;<----------------- свою логику пиши сюда
  257.         ld hl,curx
  258.         inc (hl)
  259.         ld hl,cury
  260.         inc (hl)
  261.         pop bc
  262.         djnz mainloop_uvlogic0
  263.  
  264. ;ждём физического переключения экрана!
  265. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  266.        pop bc ;b=timer на момент changescrpg
  267. waitchangescr0
  268.         ld a,(timer)
  269.         cp b
  270.         jr z,waitchangescr0
  271.  
  272.         ld a,(curkey)
  273.         cp key_esc
  274.         jp nz,mainloop ;выход по esc (break)
  275.        
  276.         ;YIELDGETKEYLOOP ;ждём кнопку
  277.         call swapimer
  278.         QUIT
  279.        
  280. keepspr
  281. cursprlistaddr=$+1
  282.         ld hl,0
  283.         ld (hl),e ;x
  284.         inc hl
  285.         ld (hl),c ;y
  286.         inc hl
  287.         ld a,(iy-1)
  288.         ld (hl),a ;hgt
  289.         inc hl
  290.         ld (cursprlistaddr),hl
  291.         ret
  292.        
  293. endkeepspr
  294.         ld hl,(cursprlistaddr)
  295.         ld (hl),200
  296.         ret
  297.  
  298. sprlist1
  299.         ds 3*128,200
  300. sprlist2
  301.         ds 3*128,200
  302.  
  303. pal
  304.         ds 32 ;тут будет палитра картинки
  305. ;sprpal
  306.         include "sprpal.ast" ;палитра спрайтов (надо рисовать картинку этой же палитрой!)
  307. emptypal
  308.         ds 32,0xff ;палитра, где все цвета чёрные
  309.  
  310. loadfile_in_ahl
  311. ;de=имя файла
  312. ;hl=куда грузим (0xc000)
  313. ;a=в какой странице
  314.         SETPG32KHIGH ;включили страницу A в 0xc000
  315.         push hl ;куда грузим
  316.         OS_OPENHANDLE
  317.         pop de ;куда грузим
  318.         push bc ;b=handle
  319.         ld hl,0x4000 ;столько грузим (если столько есть в файле)
  320.         OS_READHANDLE
  321.         pop bc ;b=handle
  322.         OS_CLOSEHANDLE
  323.         jp setpgmainc000 ;включили страницу программы в c000, как было
  324.  
  325. primgega_onescreen
  326. ;b=hgt,c=wid (/2)
  327. ;de=gfx
  328. ;hl=scr
  329. primgega0
  330.         push bc
  331.         ld hx,b
  332.         push hl
  333.         ld bc,40
  334. primgegacolumn0
  335.         ld a,(de)
  336.         inc de
  337.         ld (hl),a
  338.         add hl,bc
  339.         dec hx
  340.         jr nz,primgegacolumn0
  341.         pop hl
  342.         ld a,0x9f;0xa0
  343.         cp h
  344.         ld bc,0x4000
  345.         adc hl,bc
  346.         jp pe,primgegacolumn0q ;в половине случаев
  347. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  348.          inc a
  349.         xor h
  350.         ld h,a
  351. primgegacolumn0q
  352.         pop bc
  353.         dec c
  354.         jr nz,primgega0
  355.         ret
  356.  
  357.  
  358.  
  359. copyimgega_curtodefault
  360. ;d=hgt,e=wid (/8)
  361. ;hl=scr
  362.         call getuser_scr_low_cur
  363.         SETPG4000 ;set "from" page in 4000
  364.         call getuser_scr_low
  365.         SETPGC000 ;set "to" page in c000
  366.         call copyimgegalayer
  367.         call getuser_scr_high_cur
  368.         SETPG16K ;set "from" page in 4000
  369.         call getuser_scr_high
  370. copyimgegaq
  371.         SETPGC000 ;set "to" page in c000
  372.         call copyimgegalayer
  373.         call setpgmainc000
  374.         jp setpgsmain40008000
  375.  
  376. copyimgega_defaulttocur
  377. ;d=hgt,e=wid (/8)
  378. ;hl=scr
  379.         call getuser_scr_low
  380.         SETPG4000 ;set "from" page in 4000
  381.         call getuser_scr_low_cur
  382.         SETPGC000 ;set "to" page in c000
  383.         call copyimgegalayer
  384.         call getuser_scr_high
  385.         SETPG4000 ;set "from" page in 4000
  386.         call getuser_scr_high_cur
  387.         jr copyimgegaq ;set "to" page in c000, copy
  388.  
  389. copyimgega_defaulttoshadow
  390. ;d=hgt,e=wid (/8)
  391. ;hl=scr
  392.         ld a,(pgscrdata0)
  393.         SETPG4000 ;set "from" page in 4000
  394.         call getuser_scr_low
  395.         SETPGC000 ;set "to" page in c000
  396.         call copyimgegalayer
  397.         ld a,(pgscrdata1)
  398.         SETPG4000 ;set "from" page in 4000
  399.         call getuser_scr_high
  400.         jr copyimgegaq ;set "to" page in c000, copy
  401.  
  402. copyimgegalayer
  403.         push hl
  404.         ld hx,e ;wid/8
  405. copyimgega0
  406.         push de
  407.         push hl
  408.         ld b,d ;hgt
  409.         ld de,40-0x8000
  410. copyimgegacolumn0
  411.         ld a,(hl)
  412.         set 5,h
  413.         ld c,(hl)
  414.          set 7,h
  415.         ld (hl),c
  416.         res 5,h
  417.         ld (hl),a
  418.         add hl,de
  419.         djnz copyimgegacolumn0
  420.         pop hl
  421.         pop de
  422.         inc hl
  423.         dec hx
  424.         jr nz,copyimgega0
  425.         pop hl
  426.         ret
  427.        
  428. pgscrdata0
  429.         db 0
  430. pgscrdata1
  431.         db 0
  432.  
  433. curkey
  434.         db 0
  435. joystate
  436. ;bit - button (ZX key)
  437. ;7 - A (A)
  438. ;6 - B (S)
  439. ;5 - Select (Space)
  440. ;4 - Start (Enter)
  441. ;3 - Up (7)
  442. ;2 - Down (6)
  443. ;1 - Left (5)
  444. ;0 - Right (8)
  445.         db 0
  446.  
  447. path
  448.         db "loadscr",0
  449. filenamevorobey
  450.         db "vorobey.bin",0
  451. filename0
  452.         ;db "solkey.scr",0
  453.         db "0kubik.bmpx",0
  454. filename1
  455.         db "1kubik.bmpx",0
  456.  
  457.         include "mem.asm"
  458.         include "int.asm"
  459.  
  460.         include "spr.ast"
  461.         include "prspr.asm"
  462.  
  463. end
  464.  
  465.         ;display "End=",end
  466.         ;display "Free after end=",/d,#c000-end
  467.         ;display "Size ",/d,end-begin," bytes"
  468.        
  469.         savebin "loadscr.com",begin,end-begin
  470.        
  471.         LABELSLIST "../../../us/user.l",1
  472.