?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ZXLOOP
  2. drawhudflag=$
  3.         scf
  4.         call c,drawhud
  5.         ld a,55+128
  6.         ld (drawhudflag),a
  7.        if atm
  8.        call changescrpg
  9. ;        ld a,1
  10. ;curscreen=$+1
  11. ;        xor 1
  12. ;        ld (curscreen),a
  13. ;         add a,a
  14. ;         add a,a
  15. ;         add a,a
  16. ;         ld (imer_curscreen_value),a
  17.         ld hl,(timer)
  18.         ld (endoflastredrawtimer),hl
  19.        endif
  20.  
  21.         ;LD A,pgscale
  22.         ;CALL SETPG
  23.  
  24. ;------------------------
  25. waithalt
  26.        IF atm
  27.         call setpgmap4000
  28.        ENDIF
  29.         ld a,(timer)
  30. oldtimer=$+1
  31.         ld e,0
  32.         sub e
  33.          cp RENDERSPEEDLIMIT
  34.         jp c,waithalt;mainloop
  35.         add a,e
  36.         ld (oldtimer),a
  37.    if LOGICSPEED ;логика на скорости LOGICSPEED
  38.        sub e ;a=сколько прошло фреймов
  39. logicframesremained=$+1
  40.        add a,0 ;0..LOGICSPEED-1
  41. timeraction0
  42.         ld (logicframesremained),a
  43.         sub LOGICSPEED
  44.         jr c,timeraction0q
  45.         push af
  46.         call my_logic
  47.         pop af
  48.         jr timeraction0  ;4200 при 25 fps таймере (10000 при 50 fps таймере) на этот цикл
  49. timeraction0q
  50.    else ;всегда 25 fps логика (или 50 при RENDERSPEEDLIMIT==1) - на 17 fps дёргается
  51.       if RENDERSPEEDLIMIT > 1
  52.        res 0,a
  53.        res 0,e
  54.       endif
  55.        sub e
  56.       if RENDERSPEEDLIMIT > 1
  57.        srl a
  58.       endif
  59.         ld b,a
  60. timeraction0
  61.         push bc
  62.         call my_logic
  63.         pop bc
  64.         djnz timeraction0  ;4200 при 25 fps таймере (10000 при 50 fps таймере) на этот цикл
  65.    endif
  66.        IF atm == 0
  67.        IF doublescr
  68.         LD A,#10
  69.         CALL SETPG
  70.        ENDIF
  71.        ENDIF
  72.        ;HALT
  73.         CALL SCAN
  74.  
  75.        IF doublescr
  76. ;ждать флаг ожидания готовности экрана (включается по прерыванию)
  77. ;иначе будет так:
  78. ;фрейм 1:
  79. ;видим экран0, рисуем экран1
  80. ;фрейм 2:
  81. ;видим экран0, закончили рисовать экран1, [вот тут нужно ожидание], начали рисовать экран0 (хотя его видим)
  82. ;фрейм 3:
  83. ;видим экран1
  84. ;готовность - это когда текущий таймер != таймер конца прошлой отрисовки
  85. ;проверяем оба таймера, а то могло случиться системное прерывание
  86. EmulatePPU_waitforscreenready0
  87.         ld hl,(timer)
  88. endoflastredrawtimer=$+1
  89.         ld de,0
  90.         or a
  91.         sbc hl,de
  92.         jr z,EmulatePPU_waitforscreenready0
  93.        ENDIF
  94.  
  95.        IF atm
  96. pgscalersnum=$+1
  97.         LD A,0
  98.         setpgafast
  99.        
  100. ;        LD A,2
  101. ;setpgs_scr_xor=$+1
  102. ;        XOR 2
  103. ;        LD ($-1),A
  104. ;setpgs_scr_low=$+1
  105. ;        XOR 0xff-1;#7F-pgattr1
  106. ;        ld (curscrpg_low),a
  107. ;       PUSH AF
  108. ;        SETPG4000
  109.        call getuser_scr_low
  110.        SETPG4000
  111.         CALL DWCLSALL
  112.         xor a;LD A,0
  113.         CALL DRAWWALLS
  114.        call getuser_scr_high
  115.        SETPG4000
  116. ;       POP AF
  117. ;setpgs_scr_high_xor_low=$+1
  118. ;        XOR 4;pgattr1^pgpix1
  119. ;        SETPG4000
  120.        
  121.         CALL DWCLSALL
  122.         LD A,1
  123.         CALL DRAWWALLS
  124.        IF sprites
  125.        CALL SCANMONS
  126.        CALL DRAWSPRITES
  127.        ENDIF
  128.  
  129.        ELSE ;~atm
  130.  
  131.         CALL CLSCRBUF
  132.         CALL DRAWWALLS
  133.         CALL CHECKHEIGHTS
  134.        IF sprites
  135.        CALL SCANMONS
  136.        CALL DRAWSPRITES
  137.        ENDIF
  138.        IF crosshair
  139.         CALL CROSSHAIR
  140.        ENDIF
  141.        IF doublescr
  142.         LD A,(curscr)
  143. newscr=$+1
  144.         CP 0
  145.         jr Z,nohalt
  146.         HALT ;if CPU is too fast
  147. nohalt
  148.         LD A,#17
  149.         CALL SETPG
  150.        ENDIF
  151.         CALL EORFILL
  152.        IF doublescr
  153.         LD A,(newscr)
  154.         XOR 8
  155.         LD (newscr),A
  156.        ENDIF
  157.        ENDIF
  158. ;-----------------------
  159.        IF showfps
  160.         LD HL,IMfps
  161.         INC (HL)
  162.        ENDIF
  163.  
  164.         if atm
  165. curkey=$+1
  166.         ld a,0
  167.         cp key_esc
  168.         jr z,ZXLOOPQUIT
  169.         cp key_redraw
  170.         call z,redraw
  171.         endif
  172.        
  173.        ;LD A,0xfe
  174.        ;IN A,(0xFE)
  175.        ;rra ;caps shift
  176.        ;JP c,ZXLOOP
  177.        ;LD A,0x7F
  178.        ;IN A,(0xFE)
  179.        ;RRA ;space
  180.        ;JP NC,ZXLOOPQUIT
  181.        
  182.         jr ZXLOOP
  183. ZXLOOPQUIT
  184.         ret
  185.  
  186.         if atm
  187. redraw
  188.         xor a
  189.         ld (curkey),a ;чтобы redraw не повторялся
  190.         call redraw_cls
  191.         ld a,1
  192. redraw_cls
  193.         ;ld (curscrnum),a ;for interrupt
  194.         ld e,a
  195.         OS_SETSCREEN
  196.         ld e,0
  197.         OS_CLS
  198.         ret
  199.         endif
  200.  
  201. sfxplay
  202.        if atm
  203.         push af
  204. pgsfx=$+1
  205.         ld a,0
  206.         SETPG8000
  207.         pop af
  208.         jp 0x8000 ;SFXPLAY
  209.        else
  210.         inc a
  211.         call queue_next
  212.         ld a,55
  213.         ld (drawhudflag),a ;звук значит событие
  214.         ret
  215.        endif
  216.