diff --git a/client/client.bin b/client/client.bin index debe62f..3330f28 100644 Binary files a/client/client.bin and b/client/client.bin differ diff --git a/client/client.list b/client/client.list index ae30337..1d6557a 100644 --- a/client/client.list +++ b/client/client.list @@ -613,8 +613,8 @@ Current file: client.s 006186 1 .proc AppEntry 006186 1 AD 84 61 lda PSLOT ; Use slot 2 006189 1 20 07 60 jsr SSC::Init ; Initialize Super Serial Card -00618C 1 20 64 62 jsr InitHires ; Initialize Hi-Res graphics -00618F 1 20 C3 61 jsr InitInput ; Initialize input devices +00618C 1 20 8E 62 jsr InitHires ; Initialize Hi-Res graphics +00618F 1 20 ED 61 jsr InitInput ; Initialize input devices 006192 1 20 9F 61 jsr MainLoop 006195 1 ;; fall through 006195 1 .endproc @@ -639,272 +639,302 @@ Current file: client.s 00619F 1 ;;;--------------------------------------------------------- 00619F 1 .proc MainLoop 00619F 1 -00619F 1 ;;; TODO: Sort out the protocol - should be able to send -00619F 1 ;;; input state without receiving data -00619F 1 ;;; jsr SSC::HasData ; Anything to read? -00619F 1 ;;; bne :+ ; Nope -00619F 1 -00619F 1 20 A9 61 : jsr ReceivePage -0061A2 1 20 7C 62 jsr FlipHires +00619F 1 ;; Handle splash image - sent without preamble +00619F 1 20 AF 61 jsr ReceivePage +0061A2 1 20 A6 62 jsr FlipHires 0061A5 1 -0061A5 1 4C 9F 61 jmp :- ; TODO: define an exit trigger -0061A8 1 60 rts -0061A9 1 .endproc -0061A9 1 -0061A9 1 -0061A9 1 ;;;--------------------------------------------------------- -0061A9 1 ;;; Request a hires page, sending input state along every -0061A9 1 ;;; 256 bytes. -0061A9 1 ;;; -0061A9 1 -0061A9 1 .proc ReceivePage -0061A9 1 -0061A9 1 ptr := $FA -0061A9 1 -0061A9 1 .if 0 -0061A9 1 lda #Protocol::Screen -0061A9 1 jsr SSC::Put -0061A9 1 lda #0 ; data size -0061A9 1 jsr SSC::Put -0061A9 1 .endif -0061A9 1 -0061A9 1 A9 00 lda #0 ; set up write pointer -0061AB 1 85 FA sta ptr -0061AD 1 A5 E6 lda PAGE -0061AF 1 85 FB sta ptr+1 -0061B1 1 A2 20 ldx #PAGESIZE ; plan to receive this many pages -0061B3 1 A0 00 ldy #0 -0061B5 1 -0061B5 1 20 3D 60 : jsr SSC::Get -0061B8 1 91 FA sta (ptr),Y -0061BA 1 -0061BA 1 C8 iny -0061BB 1 D0 F8 bne :- ; Do a full page... -0061BD 1 -0061BD 1 ;; Interleave to maintain responsiveness -0061BD 1 .if 0 -0061BD 1 jsr SendInputState -0061BD 1 .endif -0061BD 1 -0061BD 1 E6 FB inc ptr+1 -0061BF 1 CA dex -0061C0 1 D0 F3 bne :- ; ...as many pages as we need -0061C2 1 60 rts -0061C3 1 .endproc +0061A5 1 +0061A5 1 ;;; TODO: Sort out the protocol - should be able to send +0061A5 1 ;;; input state without receiving data +0061A5 1 ;;; jsr SSC::HasData ; Anything to read? +0061A5 1 ;;; bne :+ ; Nope +0061A5 1 +0061A5 1 20 C9 61 : jsr RequestPage +0061A8 1 20 A6 62 jsr FlipHires +0061AB 1 +0061AB 1 4C A5 61 jmp :- ; TODO: define an exit trigger +0061AE 1 60 rts +0061AF 1 .endproc +0061AF 1 +0061AF 1 +0061AF 1 ;;;--------------------------------------------------------- +0061AF 1 ;;; Receive a hires page; no input sent. +0061AF 1 ;;; +0061AF 1 +0061AF 1 .proc ReceivePage +0061AF 1 +0061AF 1 ptr := $FA +0061AF 1 +0061AF 1 A9 00 lda #0 ; set up write pointer +0061B1 1 85 FA sta ptr +0061B3 1 A5 E6 lda PAGE +0061B5 1 85 FB sta ptr+1 +0061B7 1 A2 20 ldx #PAGESIZE ; plan to receive this many pages +0061B9 1 A0 00 ldy #0 +0061BB 1 +0061BB 1 20 3D 60 : jsr SSC::Get +0061BE 1 91 FA sta (ptr),Y +0061C0 1 +0061C0 1 C8 iny +0061C1 1 D0 F8 bne :- ; Do a full page... 0061C3 1 -0061C3 1 -0061C3 1 ;;;------------------------------------------------------------------- -0061C3 1 ;;; -0061C3 1 ;;; Input device routines -0061C3 1 ;;; -0061C3 1 ;;;------------------------------------------------------------------- -0061C3 1 -0061C3 1 ;;;--------------------------------------------------------- -0061C3 1 ;;; Initialize input devices and storage for detecting -0061C3 1 ;;; state transitions -0061C3 1 -0061C3 1 .proc InitInput -0061C3 1 -0061C3 1 .ifdef MOUSE_SUPPORT -0061C3 1 20 61 60 jsr Mouse::FindMouse -0061C6 1 .endif -0061C6 1 -0061C6 1 60 rts -0061C7 1 .endproc -0061C7 1 -0061C7 1 -0061C7 1 ;;;--------------------------------------------------------- -0061C7 1 ;;; Send a full set of input state updates. -0061C7 1 -0061C7 1 ;;; Assumes time to transmit is roughly comparable to time -0061C7 1 ;;; to measure input state, therefore only sending changes is -0061C7 1 ;;; not worthwhile in most cases. -0061C7 1 -0061C7 1 .proc SendInputState -0061C7 1 20 D4 61 jsr MaybeSendKeyboard -0061CA 1 20 07 62 jsr SendButtons -0061CD 1 -0061CD 1 .ifdef PADDLE_SUPPORT -0061CD 1 20 28 62 jsr SendPaddles -0061D0 1 .endif -0061D0 1 -0061D0 1 .ifdef MOUSE_SUPPORT -0061D0 1 20 15 61 jsr Mouse::SendMouse -0061D3 1 .endif +0061C3 1 E6 FB inc ptr+1 +0061C5 1 CA dex +0061C6 1 D0 F3 bne :- ; ...as many pages as we need +0061C8 1 60 rts +0061C9 1 .endproc +0061C9 1 +0061C9 1 ;;;--------------------------------------------------------- +0061C9 1 ;;; Request a hires page, sending input state along every +0061C9 1 ;;; 256 bytes. +0061C9 1 ;;; +0061C9 1 +0061C9 1 .proc RequestPage +0061C9 1 +0061C9 1 ptr := $FA +0061C9 1 +0061C9 1 A9 80 lda #Protocol::Screen +0061CB 1 20 30 60 jsr SSC::Put +0061CE 1 A9 00 lda #0 ; data size +0061D0 1 20 30 60 jsr SSC::Put 0061D3 1 -0061D3 1 .endproc -0061D3 1 -0061D3 1 -0061D3 1 ;;;------------------------------------------------------------ -0061D3 1 ;;; Keyboard -0061D3 1 -0061D3 1 ;;; NOTE: Can't use KBDSTRB to detect key up -> key down transition -0061D3 1 ;;; since the msb can change before the key code. Instead, consider -0061D3 1 ;;; these cases: -0061D3 1 ;;; -0061D3 1 ;;; OLD STATE KBD KBDSTRB RESULT -0061D3 1 ;;; Up Up - No-op -0061D3 1 ;;; Up Down - Save and send key down -0061D3 1 ;;; Down - Up Save and send key up -0061D3 1 ;;; Down - Down Save and send key ONLY if different -0061D3 1 ;;; -0061D3 1 -0061D3 1 00 last_kb: .byte 0 -0061D4 1 -0061D4 1 .proc MaybeSendKeyboard -0061D4 1 AD D3 61 lda last_kb -0061D7 1 D0 08 bne key_was_down -0061D9 1 -0061D9 1 key_was_up: -0061D9 1 ;; Key was up - send only if now down. -0061D9 1 AD 00 C0 lda KBD ; Read keyboard -0061DC 1 10 28 bpl done ; Do nothing if it is still up. -0061DE 1 4C F3 61 jmp send ; Otherwise send. -0061E1 1 -0061E1 1 key_was_down: -0061E1 1 ;; Key was down - strobe should match -0061E1 1 ;; unless the key changed or was released. -0061E1 1 AD 10 C0 lda KBDSTRB -0061E4 1 30 05 bmi kbdstrb_down -0061E6 1 -0061E6 1 kbdstrb_up: -0061E6 1 A9 00 lda #0 ; Now released -0061E8 1 4C F3 61 jmp send -0061EB 1 -0061EB 1 kbdstrb_down: -0061EB 1 CD D3 61 cmp last_kb ; Same key as last time? -0061EE 1 F0 16 beq done ; - no change, don't send. -0061F0 1 4C F3 61 jmp send -0061F3 1 -0061F3 1 8D D3 61 send: sta last_kb -0061F6 1 A5 00 lda Protocol::Keyboard -0061F8 1 20 30 60 jsr SSC::Put -0061FB 1 A9 01 lda #1 ; Data size -0061FD 1 20 30 60 jsr SSC::Put -006200 1 AD D3 61 lda last_kb -006203 1 20 30 60 jsr SSC::Put -006206 1 -006206 1 60 done: rts -006207 1 .endproc -006207 1 -006207 1 ;;;------------------------------------------------------------ -006207 1 ;;; Buttons -006207 1 -006207 1 .proc SendButtons -006207 1 -006207 1 A5 10 lda Protocol::Button0 -006209 1 20 30 60 jsr SSC::Put -00620C 1 A9 01 lda #1 ; Data size -00620E 1 20 30 60 jsr SSC::Put -006211 1 AD 61 C0 lda BUTN0 -006214 1 20 30 60 jsr SSC::Put -006217 1 -006217 1 A5 11 lda Protocol::Button1 -006219 1 20 30 60 jsr SSC::Put -00621C 1 A9 01 lda #1 ; Data size -00621E 1 20 30 60 jsr SSC::Put -006221 1 AD 62 C0 lda BUTN1 -006224 1 20 30 60 jsr SSC::Put -006227 1 -006227 1 60 rts -006228 1 .endproc -006228 1 -006228 1 ;;;------------------------------------------------------------ -006228 1 ;;; Paddles -006228 1 -006228 1 .ifdef PADDLE_SUPPORT -006228 1 .proc SendPaddles -006228 1 -006228 1 A5 20 lda Protocol::Paddle0 -00622A 1 20 30 60 jsr SSC::Put -00622D 1 A9 01 lda #1 ; Data size -00622F 1 20 30 60 jsr SSC::Put -006232 1 -006232 1 A2 00 ldx #0 -006234 1 20 4F 62 jsr pread -006237 1 98 tya +0061D3 1 A9 00 lda #0 ; set up write pointer +0061D5 1 85 FA sta ptr +0061D7 1 A5 E6 lda PAGE +0061D9 1 85 FB sta ptr+1 +0061DB 1 A2 20 ldx #PAGESIZE ; plan to receive this many pages +0061DD 1 A0 00 ldy #0 +0061DF 1 +0061DF 1 20 3D 60 : jsr SSC::Get +0061E2 1 91 FA sta (ptr),Y +0061E4 1 +0061E4 1 C8 iny +0061E5 1 D0 F8 bne :- ; Do a full page... +0061E7 1 +0061E7 1 ;; Interleave to maintain responsiveness +0061E7 1 .if 0 +0061E7 1 jsr SendInputState +0061E7 1 .endif +0061E7 1 +0061E7 1 E6 FB inc ptr+1 +0061E9 1 CA dex +0061EA 1 D0 F3 bne :- ; ...as many pages as we need +0061EC 1 60 rts +0061ED 1 .endproc +0061ED 1 +0061ED 1 +0061ED 1 ;;;------------------------------------------------------------------- +0061ED 1 ;;; +0061ED 1 ;;; Input device routines +0061ED 1 ;;; +0061ED 1 ;;;------------------------------------------------------------------- +0061ED 1 +0061ED 1 ;;;--------------------------------------------------------- +0061ED 1 ;;; Initialize input devices and storage for detecting +0061ED 1 ;;; state transitions +0061ED 1 +0061ED 1 .proc InitInput +0061ED 1 +0061ED 1 .ifdef MOUSE_SUPPORT +0061ED 1 20 61 60 jsr Mouse::FindMouse +0061F0 1 .endif +0061F0 1 +0061F0 1 60 rts +0061F1 1 .endproc +0061F1 1 +0061F1 1 +0061F1 1 ;;;--------------------------------------------------------- +0061F1 1 ;;; Send a full set of input state updates. +0061F1 1 +0061F1 1 ;;; Assumes time to transmit is roughly comparable to time +0061F1 1 ;;; to measure input state, therefore only sending changes is +0061F1 1 ;;; not worthwhile in most cases. +0061F1 1 +0061F1 1 .proc SendInputState +0061F1 1 20 FE 61 jsr MaybeSendKeyboard +0061F4 1 20 31 62 jsr SendButtons +0061F7 1 +0061F7 1 .ifdef PADDLE_SUPPORT +0061F7 1 20 52 62 jsr SendPaddles +0061FA 1 .endif +0061FA 1 +0061FA 1 .ifdef MOUSE_SUPPORT +0061FA 1 20 15 61 jsr Mouse::SendMouse +0061FD 1 .endif +0061FD 1 +0061FD 1 .endproc +0061FD 1 +0061FD 1 +0061FD 1 ;;;------------------------------------------------------------ +0061FD 1 ;;; Keyboard +0061FD 1 +0061FD 1 ;;; NOTE: Can't use KBDSTRB to detect key up -> key down transition +0061FD 1 ;;; since the msb can change before the key code. Instead, consider +0061FD 1 ;;; these cases: +0061FD 1 ;;; +0061FD 1 ;;; OLD STATE KBD KBDSTRB RESULT +0061FD 1 ;;; Up Up - No-op +0061FD 1 ;;; Up Down - Save and send key down +0061FD 1 ;;; Down - Up Save and send key up +0061FD 1 ;;; Down - Down Save and send key ONLY if different +0061FD 1 ;;; +0061FD 1 +0061FD 1 00 last_kb: .byte 0 +0061FE 1 +0061FE 1 .proc MaybeSendKeyboard +0061FE 1 AD FD 61 lda last_kb +006201 1 D0 08 bne key_was_down +006203 1 +006203 1 key_was_up: +006203 1 ;; Key was up - send only if now down. +006203 1 AD 00 C0 lda KBD ; Read keyboard +006206 1 10 28 bpl done ; Do nothing if it is still up. +006208 1 4C 1D 62 jmp send ; Otherwise send. +00620B 1 +00620B 1 key_was_down: +00620B 1 ;; Key was down - strobe should match +00620B 1 ;; unless the key changed or was released. +00620B 1 AD 10 C0 lda KBDSTRB +00620E 1 30 05 bmi kbdstrb_down +006210 1 +006210 1 kbdstrb_up: +006210 1 A9 00 lda #0 ; Now released +006212 1 4C 1D 62 jmp send +006215 1 +006215 1 kbdstrb_down: +006215 1 CD FD 61 cmp last_kb ; Same key as last time? +006218 1 F0 16 beq done ; - no change, don't send. +00621A 1 4C 1D 62 jmp send +00621D 1 +00621D 1 8D FD 61 send: sta last_kb +006220 1 A5 00 lda Protocol::Keyboard +006222 1 20 30 60 jsr SSC::Put +006225 1 A9 01 lda #1 ; Data size +006227 1 20 30 60 jsr SSC::Put +00622A 1 AD FD 61 lda last_kb +00622D 1 20 30 60 jsr SSC::Put +006230 1 +006230 1 60 done: rts +006231 1 .endproc +006231 1 +006231 1 ;;;------------------------------------------------------------ +006231 1 ;;; Buttons +006231 1 +006231 1 .proc SendButtons +006231 1 +006231 1 A5 10 lda Protocol::Button0 +006233 1 20 30 60 jsr SSC::Put +006236 1 A9 01 lda #1 ; Data size 006238 1 20 30 60 jsr SSC::Put -00623B 1 -00623B 1 ;; Need to wait 3ms between reads. -00623B 1 -00623B 1 A5 21 lda Protocol::Paddle1 -00623D 1 20 30 60 jsr SSC::Put -006240 1 A9 01 lda #1 ; Data size -006242 1 20 30 60 jsr SSC::Put -006245 1 -006245 1 A2 01 ldx #1 -006247 1 20 4F 62 jsr pread -00624A 1 98 tya -00624B 1 20 30 60 jsr SSC::Put -00624E 1 -00624E 1 60 rts -00624F 1 -00624F 1 .proc pread -00624F 1 ;; Let any previous timer reset -00624F 1 BD 64 C0 : lda PADDL0,x -006252 1 30 FB bmi :- -006254 1 -006254 1 ;; Read paddle -006254 1 AD 70 C0 lda PTRIG -006257 1 A0 00 ldy #0 -006259 1 EA nop -00625A 1 EA nop -00625B 1 BD 64 C0 : lda PADDL0,X -00625E 1 10 03 bpl done -006260 1 C8 iny -006261 1 D0 F8 bne :- -006263 1 60 done: rts -006264 1 .endproc -006264 1 -006264 1 .endproc -006264 1 .endif -006264 1 -006264 1 ;;;------------------------------------------------------------------- -006264 1 ;;; -006264 1 ;;; Hi-res graphics routines -006264 1 ;;; -006264 1 ;;;------------------------------------------------------------------- -006264 1 -006264 1 ;;;--------------------------------------------------------- -006264 1 ;;; Set up the graphics display and pointers -006264 1 -006264 1 .proc InitHires -006264 1 A9 20 lda #PAGE1 ; clear page 1 -006266 1 85 E6 sta PAGE -006268 1 20 F2 F3 jsr HCLR -00626B 1 -00626B 1 ;; Show page 1 -00626B 1 8D 57 C0 sta HIRES -00626E 1 8D 50 C0 sta TXTCLR -006271 1 8D 52 C0 sta MIXCLR -006274 1 8D 54 C0 sta LOWSCR -006277 1 -006277 1 ;; And set up writing to page 2 -006277 1 A9 40 lda #PAGE2 -006279 1 85 E6 sta PAGE -00627B 1 -00627B 1 60 rts -00627C 1 .endproc -00627C 1 -00627C 1 -00627C 1 ;;;--------------------------------------------------------- -00627C 1 ;;; Call when done with the current plotting page -00627C 1 ;;; (selected in PAGE) and it will be shown and the -00627C 1 ;;; other page will be shown. -00627C 1 -00627C 1 .proc FlipHires -00627C 1 A5 E6 lda PAGE ; plotting on which page? -00627E 1 C9 20 cmp #PAGE1 -006280 1 F0 08 beq :+ -006282 1 -006282 1 8D 55 C0 sta HISCR ; page 2 - so show it -006285 1 A9 20 lda #PAGE1 ; and plot on page 1 -006287 1 85 E6 sta PAGE -006289 1 60 rts -00628A 1 -00628A 1 8D 54 C0 : sta LOWSCR ; page 1 - so show it -00628D 1 A9 40 lda #PAGE2 ; and plot on page 2 -00628F 1 85 E6 sta PAGE -006291 1 60 rts -006292 1 .endproc -006292 1 +00623B 1 AD 61 C0 lda BUTN0 +00623E 1 20 30 60 jsr SSC::Put +006241 1 +006241 1 A5 11 lda Protocol::Button1 +006243 1 20 30 60 jsr SSC::Put +006246 1 A9 01 lda #1 ; Data size +006248 1 20 30 60 jsr SSC::Put +00624B 1 AD 62 C0 lda BUTN1 +00624E 1 20 30 60 jsr SSC::Put +006251 1 +006251 1 60 rts +006252 1 .endproc +006252 1 +006252 1 ;;;------------------------------------------------------------ +006252 1 ;;; Paddles +006252 1 +006252 1 .ifdef PADDLE_SUPPORT +006252 1 .proc SendPaddles +006252 1 +006252 1 A5 20 lda Protocol::Paddle0 +006254 1 20 30 60 jsr SSC::Put +006257 1 A9 01 lda #1 ; Data size +006259 1 20 30 60 jsr SSC::Put +00625C 1 +00625C 1 A2 00 ldx #0 +00625E 1 20 79 62 jsr pread +006261 1 98 tya +006262 1 20 30 60 jsr SSC::Put +006265 1 +006265 1 ;; Need to wait 3ms between reads. +006265 1 +006265 1 A5 21 lda Protocol::Paddle1 +006267 1 20 30 60 jsr SSC::Put +00626A 1 A9 01 lda #1 ; Data size +00626C 1 20 30 60 jsr SSC::Put +00626F 1 +00626F 1 A2 01 ldx #1 +006271 1 20 79 62 jsr pread +006274 1 98 tya +006275 1 20 30 60 jsr SSC::Put +006278 1 +006278 1 60 rts +006279 1 +006279 1 .proc pread +006279 1 ;; Let any previous timer reset +006279 1 BD 64 C0 : lda PADDL0,x +00627C 1 30 FB bmi :- +00627E 1 +00627E 1 ;; Read paddle +00627E 1 AD 70 C0 lda PTRIG +006281 1 A0 00 ldy #0 +006283 1 EA nop +006284 1 EA nop +006285 1 BD 64 C0 : lda PADDL0,X +006288 1 10 03 bpl done +00628A 1 C8 iny +00628B 1 D0 F8 bne :- +00628D 1 60 done: rts +00628E 1 .endproc +00628E 1 +00628E 1 .endproc +00628E 1 .endif +00628E 1 +00628E 1 ;;;------------------------------------------------------------------- +00628E 1 ;;; +00628E 1 ;;; Hi-res graphics routines +00628E 1 ;;; +00628E 1 ;;;------------------------------------------------------------------- +00628E 1 +00628E 1 ;;;--------------------------------------------------------- +00628E 1 ;;; Set up the graphics display and pointers +00628E 1 +00628E 1 .proc InitHires +00628E 1 A9 20 lda #PAGE1 ; clear page 1 +006290 1 85 E6 sta PAGE +006292 1 20 F2 F3 jsr HCLR +006295 1 +006295 1 ;; Show page 1 +006295 1 8D 57 C0 sta HIRES +006298 1 8D 50 C0 sta TXTCLR +00629B 1 8D 52 C0 sta MIXCLR +00629E 1 8D 54 C0 sta LOWSCR +0062A1 1 +0062A1 1 ;; And set up writing to page 2 +0062A1 1 A9 40 lda #PAGE2 +0062A3 1 85 E6 sta PAGE +0062A5 1 +0062A5 1 60 rts +0062A6 1 .endproc +0062A6 1 +0062A6 1 +0062A6 1 ;;;--------------------------------------------------------- +0062A6 1 ;;; Call when done with the current plotting page +0062A6 1 ;;; (selected in PAGE) and it will be shown and the +0062A6 1 ;;; other page will be shown. +0062A6 1 +0062A6 1 .proc FlipHires +0062A6 1 A5 E6 lda PAGE ; plotting on which page? +0062A8 1 C9 20 cmp #PAGE1 +0062AA 1 F0 08 beq :+ +0062AC 1 +0062AC 1 8D 55 C0 sta HISCR ; page 2 - so show it +0062AF 1 A9 20 lda #PAGE1 ; and plot on page 1 +0062B1 1 85 E6 sta PAGE +0062B3 1 60 rts +0062B4 1 +0062B4 1 8D 54 C0 : sta LOWSCR ; page 1 - so show it +0062B7 1 A9 40 lda #PAGE2 ; and plot on page 2 +0062B9 1 85 E6 sta PAGE +0062BB 1 60 rts +0062BC 1 .endproc +0062BC 1 diff --git a/client/client.s b/client/client.s index 862f27d..5771f46 100644 --- a/client/client.s +++ b/client/client.s @@ -120,12 +120,17 @@ PEXIT: .byte 0 ; Set when it's time to exit (Not Yet Implemente ;;;--------------------------------------------------------- .proc MainLoop + ;; Handle splash image - sent without preamble + jsr ReceivePage + jsr FlipHires + + ;;; TODO: Sort out the protocol - should be able to send ;;; input state without receiving data ;;; jsr SSC::HasData ; Anything to read? ;;; bne :+ ; Nope -: jsr ReceivePage +: jsr RequestPage jsr FlipHires jmp :- ; TODO: define an exit trigger @@ -134,20 +139,45 @@ PEXIT: .byte 0 ; Set when it's time to exit (Not Yet Implemente ;;;--------------------------------------------------------- -;;; Request a hires page, sending input state along every -;;; 256 bytes. +;;; Receive a hires page; no input sent. ;;; .proc ReceivePage ptr := $FA -.if 0 + lda #0 ; set up write pointer + sta ptr + lda PAGE + sta ptr+1 + ldx #PAGESIZE ; plan to receive this many pages + ldy #0 + +: jsr SSC::Get + sta (ptr),Y + + iny + bne :- ; Do a full page... + + inc ptr+1 + dex + bne :- ; ...as many pages as we need + rts +.endproc + +;;;--------------------------------------------------------- +;;; Request a hires page, sending input state along every +;;; 256 bytes. +;;; + +.proc RequestPage + +ptr := $FA + lda #Protocol::Screen jsr SSC::Put lda #0 ; data size jsr SSC::Put -.endif lda #0 ; set up write pointer sta ptr diff --git a/server.js b/server.js index 57eca0f..b4605be 100644 --- a/server.js +++ b/server.js @@ -29,7 +29,6 @@ $('#dither').addEventListener('input', e => { // Holds last convert result let hires_buffer = new Uint8Array(8192); -let dirty = true; // Used during conversion let convert_buffer = new Uint8Array(8192); @@ -76,7 +75,6 @@ $('#start').addEventListener('click', async e => { quantize(imagedata, indexes); convert_to_hires(indexes, convert_buffer); hires_buffer.set(convert_buffer); - dirty = true; qctx.putImageData(imagedata, 0, 0); @@ -390,14 +388,20 @@ async function getSerialPort() { // Generator yielding one byte at a time from |reader|. const reader = this.reader; this.gen = (async function*() { + console.log('gen invoked'); while (port.readable) { + console.log('readable'); const {value, done} = await reader.read(); - if (done) return; - for (const byte of value) + if (done) { console.log('gen done!'); return; } + console.log('read value: ', value); + for (const byte of value) { + console.log('yielding: ' + byte); yield byte; + console.log('after yielding: ' + byte); + } + console.log('done yielding chunk'); } })(); - }, // Close port. @@ -414,12 +418,17 @@ async function getSerialPort() { // Read N bytes from port, returns plain array. read: async (n) => { + console.log('called read: ' + n); if (n <= 0) throw new Error(); const result = []; - for await (const byte of this.gen) { - result.push(byte); - if (--n === 0) break; + console.log('gen is: ', this.gen); + while (result.length < n) { + const {value, done} = await gen.next(); + if (done) throw new Error('out of data'); + console.log('read byte: ' + value); + result.push(value); } + console.log('returning: ', result); return result; }, @@ -443,17 +452,6 @@ async function getSerialPort() { async function startStreaming() { - while (true) { - await sleep(500); - if (dirty) { - // Send a copy - let copy = new Uint8Array(hires_buffer); - dirty = false; - - await port.write(copy); - } - } - const state = { keyboard: 0, @@ -470,10 +468,14 @@ async function startStreaming() { while (true) { - const command = await port.read(1)[0]; - const size = await port.read(1)[0]; + console.log('ticking'); + const command = (await port.read(1))[0]; + const size = (await port.read(1))[0]; const data = size ? await port.read(size) : []; + console.log(command, size, data); + if (command === undefined) return; + switch (command) { // Keyboard @@ -493,7 +495,11 @@ async function startStreaming() { case 0x32: state.mousebtn = data[0]; break; // Screen - case 0x80: await port.write(hires_buffer); break; + case 0x80: + // Send a copy + let copy = new Uint8Array(hires_buffer); + await port.write(copy); + break; default: console.warn(`Unexpected protocol command: ${command}`);