uint8_t usleep_lo;
uint8_t dos_lo;
int hires = APPLE_HIRES0;
-int exit_flag;
+int usleep_count, exit_flag;
int bload(char *name) {
int load_address = -1;
usleep_lo = val;
break;
case USLEEP_HI:
- usleep(usleep_lo | (val << 8));
+ usleep_count = usleep_lo | (val << 8);
+ vrEmu6502Jam(cpu); // force a screen update before going to sleep
break;
case SYS_EXIT:
exit_flag = val | 0x100;
SDL_UpdateTexture(texture, NULL, frame, WINDOW_WIDTH * sizeof(uint32_t));
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
- SDL_Delay(1);
+
+ if (usleep_count) {
+#if 1 // hack to avoid lagginess in ribbit game
+ struct pollfd fd = {STDIN_FILENO, POLLIN | POLLPRI, 0};
+ if (poll(&fd, 1, (usleep_count + 999) / 1000) == -1) {
+ perror("poll()");
+ exit(EXIT_FAILURE);
+ }
+#else
+ usleep(usleep_count);
+#endif
+ }
int i, j;
#if TRACE
nb_instructions += i;
nb_cycles += j;
if (i == 0)
- break;
+ goto jam; //break;
pc_pair.pc1 = vrEmu6502GetPC(cpu);
bool show_trace = false;
);
pc_pair.pc0 = pc_pair.pc1;
}
+jam:
#else
i = vrEmu6502Run(cpu, INSTRS_PER_UPDATE, &j);
nb_instructions += i;
nb_cycles += j;
- if (i < INSTRS_PER_UPDATE)
- break;
+ //if (i < INSTRS_PER_UPDATE)
+ // break;
#endif
+ if (exit_flag)
+ break;
+ vrEmu6502Unjam(cpu);
}
quit:
cv equ $25
gbasl equ $26
gbash equ $27
-cursor equ $fb
+csrblnk equ $fa blink countdown
+cursor equ $fb bit 6 shown, bit 7 enabled
prevch equ $fc
state equ $fd
prevnum equ $fe
jmp loop
nosout lda sin.s
bmi issin
- lda >1000
+ lda #>1000
sta slp.lo
- lda <1000
+ lda #<1000
sta slp.hi
+ bit cursor
+ bpl loop
+ dec csrblnk
+ bne loop
+ jsr togcsr
jmp loop
issin lda sin.d
ldx state
inx
jmp newst
notesc sta prevch
- jsr togcsr
+ jsr hidecsr
lda prevch
ora #$80
jsr cout
- jsr togcsr
+ jsr showcsr
jmp loop
state1 cmp #$5b [
bne newst0 invalid escape sequence
notscln cmp #$47 G
bne notch
dec num
- jsr togcsr
+ jsr hidecsr
lda num
sta ch
- jsr togcsr
+ jsr showcsr
ldx #0
newst1 jmp newst
notch cmp #$64 d
bne notcv
dec num
- jsr togcsr
+ jsr hidecsr
lda num
sta cv
- jsr togcsr
+ jsr showcsr
ldx #0
jmp newst
notcv cmp #$72 r
cpy #25 esc [?25l or esc [?25h
bne newst3
pha
- jsr togcsr
+ jsr hidecsr
pla
ldy #0
cmp #$6c l
beq setcur
ldy #$80
setcur sty cursor
- jsr togcsr
+ jsr showcsr
ldx #0
newst3 jmp newst
state5 ldy num
iny
sty num
jmp loop
-togcsr bit cursor
- bpl rts0
+hidecsr bit cursor
+ bvs togcsr if cursor shown, toggle
+ rts
+showcsr bit cursor
+ bpl rts0 if cursor disabled, ignore
+ bvs rts0 if cursor not shown, ignore
+togcsr lda cursor
+ eor #$40
+ sta cursor toggle currently shown flag
+ lda #250
+ sta csrblnk set counter for .25s (units of 1ms)
lda cv
jsr gbascalc
lda gbash