?login_element?

Subversion Repositories NedoOS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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.         SETPG32KHIGH ;включили страницу с данными в c000
  75.         ld a,(user_scr0_low) ;ok
  76.         SETPG16K ;включили пол-экрана в 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.         SETPG32KHIGH ;включили страницу с данными в c000
  96.         ld a,(user_scr0_high) ;ok
  97.         SETPG16K ;включили другие пол-экрана в 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,sprpal;pal
  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.  
  135.  
  136. ;вывод спрайтов
  137. ;...
  138.         call setpgsscr40008000 ;включили страницы экрана
  139.  
  140.         ld iy,spaceship0
  141.         ld e,50 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  142.         ld c,50 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  143.         call prspr
  144.         ld iy,fly0
  145.         ld e,80 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  146.         ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  147.         call prspr
  148.         ld iy,explosion4
  149.         ld e,60 ;e=x = -(sprmaxwid-1)..159 (кодируется как x+(sprmaxwid-1))
  150.         ld c,60 ;c=y = -(sprmaxhgt-1)..199 (кодируется как есть)
  151.         call prspr
  152.  
  153.         call setpgsmain40008000 ;включили страницы программы в 4000,8000, как было
  154.  
  155. ;закончили рисовать
  156.        ld a,(timer)
  157.        push af
  158.         call changescrpg ;с этого момента (точнее, с прерывания) можем видеть, что нарисовали
  159.  
  160. ;логика
  161. ;... её вызывать столько раз, сколько прошло прерываний!
  162. mainloop_uvwaittimer0
  163.         ld a,(timer)
  164. uvoldtimer=$+1
  165.         ld b,0
  166.         ld (uvoldtimer),a
  167.         sub b
  168.         ld b,a
  169.         jr z,mainloop_uvwaittimer0 ;если ни одного прерывания не прошло, крутимся тут
  170. ;b=сколько прошло прерываний
  171. mainloop_uvlogic0
  172.         push bc
  173.         ;call logic ;<----------------- свою логику пиши сюда
  174.         pop bc
  175.         djnz mainloop_uvlogic0
  176.  
  177. ;ждём физического переключения экрана!
  178. ;можем начать новую отрисовку, только если с момента changescrpg прошло хотя бы одно прерывание (возможно, внутри logic)
  179.        pop bc ;b=timer на момент changescrpg
  180. waitchangescr0
  181.         ld a,(timer)
  182.         cp b
  183.         jr z,waitchangescr0
  184.  
  185.         ld a,(curkey)
  186.         cp key_esc
  187.         jp nz,mainloop ;выход по esc (break)
  188.        
  189.         ;YIELDGETKEYLOOP ;ждём кнопку
  190.         call swapimer
  191.         QUIT
  192.  
  193. pal
  194.         ds 32 ;тут будет палитра картинки
  195. ;sprpal
  196.         include "sprpal.ast" ;палитра спрайтов (надо рисовать картинку этой же палитрой!)
  197. emptypal
  198.         ds 32,0xff ;палитра, где все цвета чёрные
  199.  
  200. loadfile_in_ahl
  201. ;de=имя файла
  202. ;hl=куда грузим (0xc000)
  203. ;a=в какой странице
  204.         SETPG32KHIGH ;включили страницу A в 0xc000
  205.         push hl ;куда грузим
  206.         OS_OPENHANDLE
  207.         pop de ;куда грузим
  208.         push bc ;b=handle
  209.         ld hl,0x4000 ;столько грузим (если столько есть в файле)
  210.         OS_READHANDLE
  211.         pop bc ;b=handle
  212.         OS_CLOSEHANDLE
  213.         jp setpgmainc000 ;включили страницу программы в c000, как было
  214.  
  215. primgega_onescreen
  216. ;b=hgt,c=wid (/2)
  217. ;de=gfx
  218. ;hl=scr
  219. primgega0
  220.         push bc
  221.         ld hx,b
  222.         push hl
  223.         ld bc,40
  224. primgegacolumn0
  225.         ld a,(de)
  226.         inc de
  227.         ld (hl),a
  228.         add hl,bc
  229.         dec hx
  230.         jr nz,primgegacolumn0
  231.         pop hl
  232.         ld a,0x9f;0xa0
  233.         cp h
  234.         ld bc,0x4000
  235.         adc hl,bc
  236.         jp pe,primgegacolumn0q ;в половине случаев
  237. ;8000->с000 (надо 6000) или a000->e001 (надо 4001)
  238.          inc a
  239.         xor h
  240.         ld h,a
  241. primgegacolumn0q
  242.         pop bc
  243.         dec c
  244.         jr nz,primgega0
  245.         ret
  246.  
  247.  
  248.  
  249. copyimgega_curtodefault
  250. ;d=hgt,e=wid (/8)
  251. ;hl=scr
  252.         call getuser_scr_low_cur
  253.         SETPG16K ;set "from" page in 4000
  254.         call getuser_scr_low
  255.         SETPG32KHIGH ;set "to" page in c000
  256.         call copyimgegalayer
  257.         call getuser_scr_high_cur
  258.         SETPG16K ;set "from" page in 4000
  259.         call getuser_scr_high
  260. copyimgegaq
  261.         SETPG32KHIGH ;set "to" page in c000
  262.         call copyimgegalayer
  263.         call setpgmainc000
  264.         jp setpgsmain40008000
  265.  
  266. copyimgega_defaulttocur
  267. ;d=hgt,e=wid (/8)
  268. ;hl=scr
  269.         call getuser_scr_low
  270.         SETPG16K ;set "from" page in 4000
  271.         call getuser_scr_low_cur
  272.         SETPG32KHIGH ;set "to" page in c000
  273.         call copyimgegalayer
  274.         call getuser_scr_high
  275.         SETPG16K ;set "from" page in 4000
  276.         call getuser_scr_high_cur
  277.         jr copyimgegaq ;set "to" page in c000, copy
  278.  
  279. copyimgegalayer
  280.         push hl
  281.         ld hx,e ;wid/8
  282. copyimgega0
  283.         push de
  284.         push hl
  285.         ld b,d ;hgt
  286.         ld de,40-0x8000
  287. copyimgegacolumn0
  288.         ld a,(hl)
  289.         set 5,h
  290.         ld c,(hl)
  291.         set 7,h
  292.         ld (hl),c
  293.         res 5,h
  294.         ld (hl),a
  295.         add hl,de
  296.         djnz copyimgegacolumn0
  297.         pop hl
  298.         pop de
  299.         inc hl
  300.         dec hx
  301.         jr nz,copyimgega0
  302.         pop hl
  303.         ret
  304.        
  305. pgscrdata0
  306.         db 0
  307. pgscrdata1
  308.         db 0
  309.  
  310. curkey
  311.         db 0
  312. joystate
  313. ;bit - button (ZX key)
  314. ;7 - A (A)
  315. ;6 - B (S)
  316. ;5 - Select (Space)
  317. ;4 - Start (Enter)
  318. ;3 - Up (7)
  319. ;2 - Down (6)
  320. ;1 - Left (5)
  321. ;0 - Right (8)
  322.         db 0
  323.  
  324. path
  325.         db "loadscr",0
  326. filenamevorobey
  327.         db "vorobey.bin",0
  328. filename0
  329.         ;db "solkey.scr",0
  330.         db "0kubik.bmpx",0
  331. filename1
  332.         db "1kubik.bmpx",0
  333.  
  334.         include "mem.asm"
  335.         include "int.asm"
  336.  
  337.         include "spr.ast"
  338.         include "prspr.asm"
  339.  
  340. end
  341.  
  342.         ;display "End=",end
  343.         ;display "Free after end=",/d,#c000-end
  344.         ;display "Size ",/d,end-begin," bytes"
  345.        
  346.         savebin "loadscr.com",begin,end-begin
  347.        
  348.         ;LABELSLIST "../../../us/user.l"
  349.