Make HRCG cursor blink, fix some timing/lagginess issues in emulator
authorNick Downing <nick@ndcode.org>
Wed, 25 May 2022 13:27:18 +0000 (23:27 +1000)
committerNick Downing <nick@ndcode.org>
Wed, 25 May 2022 13:27:18 +0000 (23:27 +1000)
hrcg/emu_65c02.c
hrcg/terminal.asm
hrcg/vrEmu6502

index 821c93e..b20e2ca 100644 (file)
@@ -117,7 +117,7 @@ uint8_t key_waiting;
 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;
@@ -301,7 +301,8 @@ void mem_write(uint16_t addr, uint8_t val) {
     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;
@@ -502,7 +503,18 @@ int main(int argc, char **argv) {
     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
@@ -512,7 +524,7 @@ int main(int argc, char **argv) {
       nb_instructions += i;
       nb_cycles += j;
       if (i == 0)
-        break;
+        goto jam; //break;
 
       pc_pair.pc1 = vrEmu6502GetPC(cpu);
       bool show_trace = false;
@@ -610,13 +622,17 @@ int main(int argc, char **argv) {
         );
       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:
index 56127e5..9b5ea48 100644 (file)
@@ -6,7 +6,8 @@ ch      equ     $24
 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
@@ -65,10 +66,15 @@ loop        lda     sout.s
        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
@@ -100,11 +106,11 @@ notctld   cmp     #$1b                    esc
        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
@@ -131,19 +137,19 @@ state3    cmp     #$30                    0
 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
@@ -177,14 +183,14 @@ setprv    ldy     num
        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
@@ -201,8 +207,17 @@ notcr      sta     linebuf,y
        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
index c62bf11..bcc7cd3 160000 (submodule)
@@ -1 +1 @@
-Subproject commit c62bf1102d16e5cba3af033475d10799ecfffb2d
+Subproject commit bcc7cd30781afd101b9b83358d161d59cbf62d7b