Subversion Repositories NedoOS

Rev

Rev 2082 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
1916 alone 1
ZXLOOP
2080 alone 2
drawhudflag=$
3
        scf
4
        call c,drawhud
5
        ld a,55+128
6
        ld (drawhudflag),a
1916 alone 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
;------------------------
2082 alone 25
waithalt
1916 alone 26
       IF atm
27
        call setpgmap4000
28
       ENDIF
2082 alone 29
        ld a,(timer)
1916 alone 30
oldtimer=$+1
2082 alone 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
1916 alone 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
2222 alone 208
        call 0x8000 ;SFXPLAY
1916 alone 209
       else
1935 alone 210
        inc a
211
        call queue_next
2222 alone 212
       endif
213
invalidatehud
2080 alone 214
        ld a,55
215
        ld (drawhudflag),a ;звук значит событие
216
        ret