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 |