?login_element?

Subversion Repositories NedoOS

Rev

Rev 938 | Go to most recent revision | 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. restorer0
  146.         ld e,(hl) ;x/2
  147.         ld a,e
  148.         cp 200
  149.         jr z,restorer0q
  150.         inc hl
  151.         ld c,(hl) ;y
  152.         inc hl
  153.        ld a,scrhgt
  154.        sub (hl) ;hgt
  155.        ld b,a
  156.         inc hl
  157.        push hl
  158.         ld a,e ;x/2
  159.         sub +(sprmaxwid-1)
  160.         jr nc,$+3
  161.         xor a ;если <0
  162.         ;cp scrwid-sprmaxwid
  163.         ;jr c,$+4
  164.         ;ld a,scrwid-sprmaxwid
  165.         srl a
  166.         srl a
  167.         ld e,a ;x/8 >=0
  168.         ld a,c ;y
  169.         cp -(sprmaxhgt-1)
  170.         jr c,$+3
  171.         xor a ;если <0
  172.         cp b
  173.         jr c,$+3
  174.         ld a,b
  175.         ld c,a
  176. ;e=x/8 >=0
  177. ;c=y >=0
  178.         ld b,0
  179.         ld l,c
  180.         ld h,b;0
  181.         add hl,hl ;y*2
  182.         add hl,hl ;y*4
  183.         add hl,bc ;y*5
  184.         add hl,hl ;y*10
  185.         add hl,hl ;y*20
  186.         add hl,hl ;y*40
  187.         ld d,b;0
  188.         add hl,de ;+x/8
  189.         ld bc,0x4000
  190.         add hl,bc
  191.         ;ld hl,0x4000 ;hl=scr
  192.         ;ld de,scrwid/4 + (256*scrhgt) ;d=hgt,e=wid (/8)
  193.         ld de,3 + (256*16) ;d=hgt,e=wid (/8)        
  194.         call copyimgega_defaulttoshadow
  195.        pop hl
  196.         jr restorer0
  197. restorer0q
  198. ;вывод спрайтов
  199. ;...
  200.         call setpgsscr40008000 ;включили страницы экрана
  201.  
  202.         ;ld hl,sprlist1
  203.        pop hl
  204.         ld (cursprlistaddr),hl
  205.  
  206.         ld iy,spaceship0
  207.         ld e,50 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  208.         ld c,50 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  209.         call keepspr
  210.         call prspr
  211.         ld iy,fly0
  212. curx=$+1
  213.         ld e,80 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  214.        ld a,e
  215.        ;add a,sprmaxwid-1
  216.        cp scrwid-1+(sprmaxwid-1)
  217.        jr nc,noprspr
  218. cury=$+1
  219.         ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  220.        ld a,c
  221.        add a,sprmaxhgt-1
  222.        cp scrhgt-1+(sprmaxhgt-1)
  223.        jr nc,noprspr
  224.         call keepspr
  225.         call prspr
  226. noprspr
  227.         ld iy,explosion4
  228.         ld e,60 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  229.         ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  230.         call keepspr
  231.         call prspr
  232.  
  233.         call setpgsmain40008000 ;включили страницы программы в 4000,8000, как было
  234.  
  235. ;закончили рисовать
  236.        ld a,(timer)
  237.        push af
  238.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  239.  
  240. ;логика
  241. ;... её вызывать столько раз, сколько прошло прерываний!
  242. mainloop_uvwaittimer0
  243.         ld a,(timer)
  244. uvoldtimer=$+1
  245.         ld b,0
  246.         ld (uvoldtimer),a
  247.         sub b
  248.         ld b,a
  249.         jr z,mainloop_uvwaittimer0 ;если ни одного прерывания не прошло, крутимся тут
  250. ;b=сколько прошло прерываний
  251. mainloop_uvlogic0
  252.         push bc
  253.         ;call logic ;<----------------- свою логику пиши сюда
  254.         ld hl,curx
  255.         inc (hl)
  256.         ld hl,cury
  257.         inc (hl)
  258.         pop bc
  259.         djnz mainloop_uvlogic0
  260.  
  261. ;ждём физического переключения экрана!
  262. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  263.        pop bc ;b=timer на момент changescrpg
  264. waitchangescr0
  265.         ld a,(timer)
  266.         cp b
  267.         jr z,waitchangescr0
  268.  
  269.         ld a,(curkey)
  270.         cp key_esc
  271.         jp nz,mainloop ;выход по esc (break)
  272.        
  273.         ;YIELDGETKEYLOOP ;ждём кнопку
  274.         call swapimer
  275.         QUIT
  276.        
  277. keepspr
  278. cursprlistaddr=$+1
  279.         ld hl,0
  280.         ld (hl),e ;x
  281.         inc hl
  282.         ld (hl),c ;y
  283.         inc hl
  284.         ld a,(iy-1)
  285.         ld (hl),a ;hgt
  286.         inc hl
  287.         ld (cursprlistaddr),hl
  288.         ret
  289.        
  290. endkeepspr
  291.         ld hl,(cursprlistaddr)
  292.         ld (hl),200
  293.         ret
  294.  
  295. sprlist1
  296.         ds 3*128,200
  297. sprlist2
  298.         ds 3*128,200
  299.  
  300. pal
  301.         ds 32 ;тут будет палитра картинки
  302. ;sprpal
  303.         include "sprpal.ast" ;палитра спрайтов (надо рисовать картинку этой же палитрой!)
  304. emptypal
  305.         ds 32,0xff ;палитра, где все цвета чёрные
  306.  
  307. loadfile_in_ahl
  308. ;de=имя файла
  309. ;hl=куда грузим (0xc000)
  310. ;a=в какой странице
  311.         SETPG32KHIGH ;включили страницу A в 0xc000
  312.         push hl ;куда грузим
  313.         OS_OPENHANDLE
  314.         pop de ;куда грузим
  315.         push bc ;b=handle
  316.         ld hl,0x4000 ;столько грузим (если столько есть в файле)
  317.         OS_READHANDLE
  318.         pop bc ;b=handle
  319.         OS_CLOSEHANDLE
  320.         jp setpgmainc000 ;включили страницу программы в c000, как было
  321.  
  322. primgega_onescreen
  323. ;b=hgt,c=wid (/2)
  324. ;de=gfx
  325. ;hl=scr
  326. primgega0
  327.         push bc
  328.         ld hx,b
  329.         push hl
  330.         ld bc,40
  331. primgegacolumn0
  332.         ld a,(de)
  333.         inc de
  334.         ld (hl),a
  335.         add hl,bc
  336.         dec hx
  337.         jr nz,primgegacolumn0
  338.         pop hl
  339.         ld a,0x9f;0xa0
  340.         cp h
  341.         ld bc,0x4000
  342.         adc hl,bc
  343.         jp pe,primgegacolumn0q ;в половине случаев
  344. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  345.          inc a
  346.         xor h
  347.         ld h,a
  348. primgegacolumn0q
  349.         pop bc
  350.         dec c
  351.         jr nz,primgega0
  352.         ret
  353.  
  354.  
  355.  
  356. copyimgega_curtodefault
  357. ;d=hgt,e=wid (/8)
  358. ;hl=scr
  359.         call getuser_scr_low_cur
  360.         SETPG4000 ;set "from" page in 4000
  361.         call getuser_scr_low
  362.         SETPGC000 ;set "to" page in c000
  363.         call copyimgegalayer
  364.         call getuser_scr_high_cur
  365.         SETPG16K ;set "from" page in 4000
  366.         call getuser_scr_high
  367. copyimgegaq
  368.         SETPGC000 ;set "to" page in c000
  369.         call copyimgegalayer
  370.         call setpgmainc000
  371.         jp setpgsmain40008000
  372.  
  373. copyimgega_defaulttocur
  374. ;d=hgt,e=wid (/8)
  375. ;hl=scr
  376.         call getuser_scr_low
  377.         SETPG4000 ;set "from" page in 4000
  378.         call getuser_scr_low_cur
  379.         SETPGC000 ;set "to" page in c000
  380.         call copyimgegalayer
  381.         call getuser_scr_high
  382.         SETPG4000 ;set "from" page in 4000
  383.         call getuser_scr_high_cur
  384.         jr copyimgegaq ;set "to" page in c000, copy
  385.  
  386. copyimgega_defaulttoshadow
  387. ;d=hgt,e=wid (/8)
  388. ;hl=scr
  389.         ld a,(pgscrdata0)
  390.         SETPG4000 ;set "from" page in 4000
  391.         call getuser_scr_low
  392.         SETPGC000 ;set "to" page in c000
  393.         call copyimgegalayer
  394.         ld a,(pgscrdata1)
  395.         SETPG4000 ;set "from" page in 4000
  396.         call getuser_scr_high
  397.         jr copyimgegaq ;set "to" page in c000, copy
  398.  
  399. copyimgegalayer
  400.         push hl
  401.         ld hx,e ;wid/8
  402. copyimgega0
  403.         push de
  404.         push hl
  405.         ld b,d ;hgt
  406.         ld de,40-0x8000
  407. copyimgegacolumn0
  408.         ld a,(hl)
  409.         set 5,h
  410.         ld c,(hl)
  411.          set 7,h
  412.         ld (hl),c
  413.         res 5,h
  414.         ld (hl),a
  415.         add hl,de
  416.         djnz copyimgegacolumn0
  417.         pop hl
  418.         pop de
  419.         inc hl
  420.         dec hx
  421.         jr nz,copyimgega0
  422.         pop hl
  423.         ret
  424.        
  425. pgscrdata0
  426.         db 0
  427. pgscrdata1
  428.         db 0
  429.  
  430. curkey
  431.         db 0
  432. joystate
  433. ;bit - button (ZX key)
  434. ;7 - A (A)
  435. ;6 - B (S)
  436. ;5 - Select (Space)
  437. ;4 - Start (Enter)
  438. ;3 - Up (7)
  439. ;2 - Down (6)
  440. ;1 - Left (5)
  441. ;0 - Right (8)
  442.         db 0
  443.  
  444. path
  445.         db "loadscr",0
  446. filenamevorobey
  447.         db "vorobey.bin",0
  448. filename0
  449.         ;db "solkey.scr",0
  450.         db "0kubik.bmpx",0
  451. filename1
  452.         db "1kubik.bmpx",0
  453.  
  454.         include "mem.asm"
  455.         include "int.asm"
  456.  
  457.         include "spr.ast"
  458.         include "prspr.asm"
  459.  
  460. end
  461.  
  462.         ;display "End=",end
  463.         ;display "Free after end=",/d,#c000-end
  464.         ;display "Size ",/d,end-begin," bytes"
  465.        
  466.         savebin "loadscr.com",begin,end-begin
  467.        
  468.         LABELSLIST "../../../us/user.l",1
  469.