From 684b82ca56adb5c1f411cda9a5ea9f03223cd024 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Sun, 28 Oct 2018 22:23:33 -0700 Subject: [PATCH] reformat, dedupe --- client/client.bin | Bin 465 -> 441 bytes client/client.list | 663 ++++++++++++++++++++++----------------------- client/client.s | 490 +++++++++++++++------------------ client/macros.inc | 21 ++ client/mouse.inc | 340 ++++++++++++----------- client/ssc.inc | 151 +++++------ 6 files changed, 801 insertions(+), 864 deletions(-) create mode 100644 client/macros.inc diff --git a/client/client.bin b/client/client.bin index f55d346e388d2c81045d86292f3c68c90f3d3154..bd3952fda979e66ab5bbb1ddf18ecd0a18099335 100644 GIT binary patch delta 14 Wcmcb}ypwsuL`J4hpC?adR09An7X}9a delta 39 xcmV+?0NDSz1JMJpkpTj^VUv>qCK#yzh5DuDh5Mo)sQ{>v`pD4x=KIRf_F!vn6^Q@< diff --git a/client/client.list b/client/client.list index 68223b0..6547ed0 100644 --- a/client/client.list +++ b/client/client.list @@ -2,10 +2,16 @@ ca65 V2.16 - Git f5e9b401 Main file : client.s Current file: client.s -000000r 1 PADDLE_SUPPORT = 1 +000000r 1 ;;;------------------------------------------------------------------- +000000r 1 ;;; +000000r 1 ;;; vnIIc Client Application +000000r 1 ;;; +000000r 1 ;;;------------------------------------------------------------------- +000000r 1 +000000r 1 PADDLE_SUPPORT = 1 000000r 1 ;;; MOUSE_SUPPORT = 1 000000r 1 -000000r 1 .include "apple2.inc" +000000r 1 .include "apple2.inc" 000000r 2 000000r 2 ;----------------------------------------------------------------------------- 000000r 2 ; Zero page stuff @@ -72,66 +78,68 @@ Current file: client.s 000000r 2 BUTN1 := $C062 ; Closed-Apple Key 000000r 2 000000r 1 +000000r 1 .include "macros.inc" +000000r 2 ;;;--------------------------------------------------------- +000000r 2 ;;; +000000r 2 ;;; Generic Macros +000000r 2 ;;; +000000r 2 ;;;--------------------------------------------------------- +000000r 2 +000000r 2 .macro SaveRegisters +000000r 2 pha +000000r 2 txa +000000r 2 pha +000000r 2 tya +000000r 2 pha +000000r 2 .endmacro +000000r 2 +000000r 2 .macro RestoreRegisters +000000r 2 pla +000000r 2 tay +000000r 2 pla +000000r 2 tax +000000r 2 pla +000000r 2 .endmacro +000000r 2 +000000r 1 000000r 1 ;;;--------------------------------------------------------- 000000r 1 ;;; Hi-res graphics constants/locations 000000r 1 ;;;--------------------------------------------------------- 000000r 1 -000000r 1 PLOTPAGE := $E6 ; Active hires plotting page (Applesoft) -000000r 1 PLOTPAGE1 := $20 -000000r 1 PLOTPAGE2 := $40 -000000r 1 PAGESIZE := $20 ; Size of hi-res screen in pages +000000r 1 PAGE := $E6 ; Active hires plotting page (Applesoft) +000000r 1 PAGE1 := $20 +000000r 1 PAGE2 := $40 +000000r 1 +000000r 1 PAGESIZE := $20 ; Size of hi-res screen in pages 000000r 1 000000r 1 ;;;--------------------------------------------------------- 000000r 1 ;;; ROM routines 000000r 1 ;;;--------------------------------------------------------- 000000r 1 -000000r 1 PREAD := $FB1E ; Monitor paddle reading routine, call -000000r 1 ; with paddle # in X, returns value in Y +000000r 1 PREAD := $FB1E ; Monitor paddle reading routine, call +000000r 1 ; with paddle # in X, returns value in Y +000000r 1 +000000r 1 HCLR := $F3F2 ; Clear current hires screen to black 000000r 1 000000r 1 ;;;--------------------------------------------------------- 000000r 1 ;;; Other 000000r 1 ;;;--------------------------------------------------------- 000000r 1 -000000r 1 MAX_SLOT := 7 ; Maximum slot # on an Apple II +000000r 1 MAX_SLOT := 7 ; Maximum slot # on an Apple II 000000r 1 -000000r 1 ZP_PTR := $FA ; Write cursor location on zero page -000000r 1 -000000r 1 ;;;--------------------------------------------------------- -000000r 1 ;;; Generic Macros -000000r 1 ;;;--------------------------------------------------------- -000000r 1 -000000r 1 ;;;---------------------------------------- -000000r 1 .macro SaveRegisters -000000r 1 ;;;---------------------------------------- -000000r 1 pha -000000r 1 txa -000000r 1 pha -000000r 1 tya -000000r 1 pha -000000r 1 .endmacro -000000r 1 -000000r 1 ;;;---------------------------------------- -000000r 1 .macro RestoreRegisters -000000r 1 ;;;---------------------------------------- -000000r 1 pla -000000r 1 tay -000000r 1 pla -000000r 1 tax -000000r 1 pla -000000r 1 .endmacro +000000r 1 ZP_PTR := $FA ; Write cursor location on zero page 000000r 1 000000r 1 000000r 1 ;;;------------------------------------------------------------------- 000000r 1 ;;; -000000r 1 ;;; Application-level logic +000000r 1 ;;; Client Code 000000r 1 ;;; 000000r 1 ;;;------------------------------------------------------------------- 000000r 1 -000000r 1 -000000r 1 .org $6000 -006000 1 4C 60 60 jmp AppEntry +000000r 1 .org $6000 +006000 1 4C 60 60 jmp AppEntry 006003 1 -006003 1 .include "ssc.inc" +006003 1 .include "ssc.inc" 006003 2 ;;;------------------------------------------------------------------- 006003 2 ;;; 006003 2 ;;; Serial port routines @@ -147,118 +155,113 @@ Current file: client.s 006003 2 ;;;--------------------------------------------------------- 006003 2 006003 2 ;;; These get incremented by the slot where they appear -006003 2 UACTRL = $C08B ; Control Register -006003 2 UACMND = $C08A ; Command Register -006003 2 UASTAT = $C089 ; Status Register -006003 2 UADATA = $C088 ; Data Register - incoming and outgoing data +006003 2 UACTRL = $C08B ; Control Register +006003 2 UACMND = $C08A ; Command Register +006003 2 UASTAT = $C089 ; Status Register +006003 2 UADATA = $C088 ; Data Register - incoming and outgoing data 006003 2 006003 2 ;;; Lookup table for UACTRL register, by baud rate 006003 2 -006003 2 16 1E 1F 10 BPSCTRL: .byte $16,$1E,$1F,$10 ; 300, 9600, 19200, 115k (with 8 data bits, 1 stop bit, no echo) -006007 2 .enum -006007 2 BPS_300 -006007 2 BPS_9600 -006007 2 BPS_19200 -006007 2 BPS_115k -006007 2 .endenum +006003 2 16 1E 1F 10 BPSCTRL: .byte $16,$1E,$1F,$10 ; 300, 9600, 19200, 115k (with 8 data bits, 1 stop bit, no echo) +006007 2 .enum +006007 2 BPS_300 +006007 2 BPS_9600 +006007 2 BPS_19200 +006007 2 BPS_115k +006007 2 .endenum 006007 2 -006007 2 CMND_NRDI = $0B ; Command: no parity, RTS on, DTR on, no interrupts +006007 2 CMND_NRDI = $0B ; Command: no parity, RTS on, DTR on, no interrupts 006007 2 006007 2 006007 2 ;;;--------------------------------------------------------- -006007 2 .proc Init -006007 2 ;;;--------------------------------------------------------- 006007 2 ;;; Initialize the SSC; slot passed in A -006007 2 ;;;--------------------------------------------------------- -006007 2 0A asl ; Slot passed in A -006008 2 0A asl -006009 2 0A asl -00600A 2 0A asl ; Now $S0 -00600B 2 69 88 adc #$88 ; Low byte of UADATA -00600D 2 AA tax -00600E 2 A9 0B lda #CMND_NRDI ; Command register: no parity, RTS on, DTR on, no interrupts -006010 2 9D 02 C0 sta $C002,X -006013 2 AC 58 60 ldy PSPEED ; Control register: look up by baud rate (8 data bits, 1 stop bit) -006016 2 B9 03 60 lda BPSCTRL,Y -006019 2 9D 03 C0 sta $C003,X -00601C 2 8E 3C 60 stx MOD_UADATA_1 ; Modify references to -00601F 2 8E 49 60 stx MOD_UADATA_2 ; UADATA to point at -006022 2 8E 55 60 stx MOD_UADATA_3 ; correct slot (UADATA+S0) -006025 2 E8 inx -006026 2 8E 32 60 stx MOD_UASTAT_1 ; Modify reference to -006029 2 8E 40 60 stx MOD_UASTAT_2 ; UASTAT to point at -00602C 2 8E 4D 60 stx MOD_UASTAT_3 ; correct slot (UASTAT+S0) -00602F 2 60 rts +006007 2 +006007 2 .proc Init +006007 2 0A asl ; Slot passed in A +006008 2 0A asl +006009 2 0A asl +00600A 2 0A asl ; Now $S0 +00600B 2 69 88 adc #$88 ; Low byte of UADATA +00600D 2 AA tax +00600E 2 A9 0B lda #CMND_NRDI ; Command register: no parity, RTS on, DTR on, no interrupts +006010 2 9D 02 C0 sta $C002,X +006013 2 AC 58 60 ldy PSPEED ; Control register: look up by baud rate (8 data bits, 1 stop bit) +006016 2 B9 03 60 lda BPSCTRL,Y +006019 2 9D 03 C0 sta $C003,X +00601C 2 8E 3C 60 stx MOD_UADATA_1 ; Modify references to +00601F 2 8E 49 60 stx MOD_UADATA_2 ; UADATA to point at +006022 2 8E 55 60 stx MOD_UADATA_3 ; correct slot (UADATA+S0) +006025 2 E8 inx +006026 2 8E 32 60 stx MOD_UASTAT_1 ; Modify reference to +006029 2 8E 40 60 stx MOD_UASTAT_2 ; UASTAT to point at +00602C 2 8E 4D 60 stx MOD_UASTAT_3 ; correct slot (UASTAT+S0) +00602F 2 60 rts 006030 2 .endproc 006030 2 006030 2 006030 2 ;;;--------------------------------------------------------- -006030 2 .proc Put -006030 2 ;;;--------------------------------------------------------- 006030 2 ;;; Send accumulator out the serial port -006030 2 ;;;--------------------------------------------------------- -006030 2 48 pha ; Push A onto the stack -006031 2 MOD_UASTAT_1 := *+1 -006031 2 AD 89 C0 : lda UASTAT ; Check status bits -006034 2 29 70 and #$70 -006036 2 C9 10 cmp #$10 -006038 2 D0 F7 bne :- ; Output register is full, so loop -00603A 2 68 pla -00603B 2 MOD_UADATA_1 := *+1 -00603B 2 8D 88 C0 sta UADATA ; Put character -00603E 2 60 rts +006030 2 +006030 2 .proc Put +006030 2 48 pha ; Push A onto the stack +006031 2 MOD_UASTAT_1 := *+1 +006031 2 AD 89 C0 : lda UASTAT ; Check status bits +006034 2 29 70 and #$70 +006036 2 C9 10 cmp #$10 +006038 2 D0 F7 bne :- ; Output register is full, so loop +00603A 2 68 pla +00603B 2 MOD_UADATA_1 := *+1 +00603B 2 8D 88 C0 sta UADATA ; Put character +00603E 2 60 rts 00603F 2 .endproc -00603F 2 MOD_UASTAT_1 := Put::MOD_UASTAT_1 -00603F 2 MOD_UADATA_1 := Put::MOD_UADATA_1 +00603F 2 MOD_UASTAT_1 := Put::MOD_UASTAT_1 +00603F 2 MOD_UADATA_1 := Put::MOD_UADATA_1 00603F 2 00603F 2 ;;;--------------------------------------------------------- -00603F 2 .proc Get -00603F 2 ;;;--------------------------------------------------------- 00603F 2 ;;; Read a character from the serial port to the accumulator -00603F 2 ;;;--------------------------------------------------------- -00603F 2 MOD_UASTAT_2 := *+1 -00603F 2 AD 89 C0 lda UASTAT ; Check status bits -006042 2 29 68 and #$68 -006044 2 C9 08 cmp #$8 -006046 2 D0 F7 bne Get ; Input register empty, loop -006048 2 MOD_UADATA_2 := *+1 -006048 2 AD 88 C0 lda UADATA ; Get character -00604B 2 60 rts +00603F 2 +00603F 2 .proc Get +00603F 2 MOD_UASTAT_2 := *+1 +00603F 2 AD 89 C0 lda UASTAT ; Check status bits +006042 2 29 68 and #$68 +006044 2 C9 08 cmp #$8 +006046 2 D0 F7 bne Get ; Input register empty, loop +006048 2 MOD_UADATA_2 := *+1 +006048 2 AD 88 C0 lda UADATA ; Get character +00604B 2 60 rts 00604C 2 .endproc -00604C 2 MOD_UASTAT_2 := Get::MOD_UASTAT_2 -00604C 2 MOD_UADATA_2 := Get::MOD_UADATA_2 +00604C 2 MOD_UASTAT_2 := Get::MOD_UASTAT_2 +00604C 2 MOD_UADATA_2 := Get::MOD_UADATA_2 00604C 2 00604C 2 ;;;--------------------------------------------------------- +00604C 2 ;;; Check if the serial port has pending data +00604C 2 00604C 2 .proc HasData -00604C 2 ;;;--------------------------------------------------------- -00604C 2 ;;; Read a character from the serial port to the accumulator -00604C 2 ;;;--------------------------------------------------------- -00604C 2 MOD_UASTAT_3 := *+1 -00604C 2 AD 89 C0 lda UASTAT ; Check status bits -00604F 2 29 68 and #$68 -006051 2 C9 08 cmp #$8 -006053 2 60 rts +00604C 2 MOD_UASTAT_3 := *+1 +00604C 2 AD 89 C0 lda UASTAT ; Check status bits +00604F 2 29 68 and #$68 +006051 2 C9 08 cmp #$8 +006053 2 60 rts 006054 2 .endproc -006054 2 MOD_UASTAT_3 := HasData::MOD_UASTAT_3 +006054 2 MOD_UASTAT_3 := HasData::MOD_UASTAT_3 006054 2 006054 2 006054 2 ;;;--------------------------------------------------------- -006054 2 .proc Reset -006054 2 ;;;--------------------------------------------------------- 006054 2 ;;; Clean up serial port -006054 2 ;;;--------------------------------------------------------- -006054 2 MOD_UADATA_3 := *+1 -006054 2 2C 88 C0 bit UADATA -006057 2 60 rts +006054 2 +006054 2 .proc Reset +006054 2 MOD_UADATA_3 := *+1 +006054 2 2C 88 C0 bit UADATA +006057 2 60 rts 006058 2 .endproc -006058 2 MOD_UADATA_3 := Reset::MOD_UADATA_3 +006058 2 MOD_UADATA_3 := Reset::MOD_UADATA_3 006058 2 006058 2 .endproc 006058 2 006058 1 -006058 1 .ifdef MOUSE_SUPPORT +006058 1 .ifdef MOUSE_SUPPORT 006058 1 .include "mouse.inc" -006058 1 .endif ; MOUSE_SUPPORT +006058 1 .endif 006058 1 006058 1 006058 1 ;;;------------------------------------------------------------------- @@ -266,47 +269,45 @@ Current file: client.s 006058 1 ;;;------------------------------------------------------------------- 006058 1 006058 1 ;;; Application configuration -006058 1 03 PSPEED: .byte SSC::BPS_115k ; Hardcoded for Apple IIc (TODO: Allow configuration) -006059 1 02 PSLOT: .byte 2 ; Hardcoded for Apple IIc (TODO: Allow configuration) -00605A 1 00 PEXIT: .byte 0 ; Set when it's time to exit (Not Yet Implemented) +006058 1 03 PSPEED: .byte SSC::BPS_115k ; Hardcoded for Apple IIc (TODO: Allow configuration) +006059 1 02 PSLOT: .byte 2 ; Hardcoded for Apple IIc (TODO: Allow configuration) +00605A 1 00 PEXIT: .byte 0 ; Set when it's time to exit (Not Yet Implemented) 00605B 1 00605B 1 ;;; Keyboard state -00605B 1 00 LASTKB: .byte 0 -00605C 1 00 LASTOA: .byte 0 -00605D 1 00 LASTCA: .byte 0 +00605B 1 00 LASTKB: .byte 0 +00605C 1 00 LASTOA: .byte 0 +00605D 1 00 LASTCA: .byte 0 00605E 1 -00605E 1 .ifdef PADDLE_SUPPORT +00605E 1 .ifdef PADDLE_SUPPORT 00605E 1 00605E 1 ;;; Paddle state -00605E 1 00 LASTP0: .byte 0 -00605F 1 00 LASTP1: .byte 0 +00605E 1 00 LASTP0: .byte 0 +00605F 1 00 LASTP1: .byte 0 006060 1 -006060 1 .endif ; PADDLE_SUPPORT +006060 1 .endif ; PADDLE_SUPPORT 006060 1 006060 1 006060 1 ;;;--------------------------------------------------------- -006060 1 .proc AppEntry -006060 1 ;;;--------------------------------------------------------- 006060 1 ;;; Initialize the application, and enter the main loop -006060 1 ;;;--------------------------------------------------------- -006060 1 AD 59 60 lda PSLOT ; Use slot 2 -006063 1 20 07 60 jsr SSC::Init ; Initialize Super Serial Card -006066 1 20 8C 61 jsr InitHires ; Initialize Hi-Res graphics -006069 1 20 A0 60 jsr InitInput ; Initialize input devices -00606C 1 20 79 60 jsr MainLoop +006060 1 +006060 1 .proc AppEntry +006060 1 AD 59 60 lda PSLOT ; Use slot 2 +006063 1 20 07 60 jsr SSC::Init ; Initialize Super Serial Card +006066 1 20 8C 61 jsr InitHires ; Initialize Hi-Res graphics +006069 1 20 A0 60 jsr InitInput ; Initialize input devices +00606C 1 20 79 60 jsr MainLoop 00606F 1 -00606F 1 ; fall through +00606F 1 ; fall through 00606F 1 .endproc 00606F 1 00606F 1 ;;;--------------------------------------------------------- -00606F 1 .proc AppExit -00606F 1 ;;;--------------------------------------------------------- 00606F 1 ;;; Clean up and exit app -00606F 1 ;;;--------------------------------------------------------- -00606F 1 20 54 60 jsr SSC::Reset -006072 1 8D 54 C0 sta LOWSCR -006075 1 8D 51 C0 sta TXTSET -006078 1 60 rts +00606F 1 +00606F 1 .proc AppExit +00606F 1 20 54 60 jsr SSC::Reset +006072 1 8D 54 C0 sta LOWSCR +006075 1 8D 51 C0 sta TXTSET +006078 1 60 rts 006079 1 .endproc 006079 1 006079 1 @@ -319,48 +320,45 @@ Current file: client.s 006079 1 006079 1 ;;;--------------------------------------------------------- 006079 1 .proc MainLoop -006079 1 ;;;--------------------------------------------------------- 006079 1 006079 1 ;;; TODO: Sort out the protocol - should be able to send 006079 1 ;;; input state without receiving data -006079 1 ;;; jsr SSCHasData ; Anything to read? +006079 1 ;;; jsr SSC::HasData ; Anything to read? 006079 1 ;;; bne :+ ; Nope 006079 1 -006079 1 20 83 60 : jsr ReceivePage -00607C 1 20 A3 61 jsr FlipHires -00607F 1 4C 79 60 jmp :- ; TODO: define an exit trigger -006082 1 60 rts +006079 1 20 83 60 : jsr ReceivePage +00607C 1 20 A3 61 jsr FlipHires +00607F 1 4C 79 60 jmp :- ; TODO: define an exit trigger +006082 1 60 rts 006083 1 .endproc 006083 1 006083 1 006083 1 ;;;--------------------------------------------------------- -006083 1 .proc ReceivePage -006083 1 ;;;--------------------------------------------------------- 006083 1 ;;; Pull a hi-res page down over serial 006083 1 ;;; 006083 1 ;;; Protocol is: 006083 1 ;;; * Recieve 256 bytes (graphic data) 006083 1 ;;; * Send 1 byte (input state) -006083 1 ;;;--------------------------------------------------------- 006083 1 -006083 1 A9 00 lda #0 ; set up write pointer -006085 1 85 FA sta ZP_PTR -006087 1 A5 E6 lda PLOTPAGE -006089 1 85 FB sta ZP_PTR+1 -00608B 1 A2 20 ldx #PAGESIZE ; plan to receive this many pages -00608D 1 A0 00 ldy #0 +006083 1 .proc ReceivePage +006083 1 A9 00 lda #0 ; set up write pointer +006085 1 85 FA sta ZP_PTR +006087 1 A5 E6 lda PAGE +006089 1 85 FB sta ZP_PTR+1 +00608B 1 A2 20 ldx #PAGESIZE ; plan to receive this many pages +00608D 1 A0 00 ldy #0 00608F 1 -00608F 1 20 3F 60 : jsr SSC::Get ; TODO: look for escape codes in the sequence -006092 1 91 FA sta (ZP_PTR),Y -006094 1 C8 iny -006095 1 D0 F8 bne :- ; Do a full page... +00608F 1 20 3F 60 : jsr SSC::Get ; TODO: look for escape codes in the sequence +006092 1 91 FA sta (ZP_PTR),Y +006094 1 C8 iny +006095 1 D0 F8 bne :- ; Do a full page... 006097 1 -006097 1 20 BE 60 jsr SendInputState ; brief moment to send data back upstream +006097 1 20 BE 60 jsr SendInputState ; brief moment to send data back upstream 00609A 1 -00609A 1 E6 FB inc ZP_PTR+1 -00609C 1 CA dex -00609D 1 D0 F0 bne :- ; ...as many pages as we need -00609F 1 60 rts +00609A 1 E6 FB inc ZP_PTR+1 +00609C 1 CA dex +00609D 1 D0 F0 bne :- ; ...as many pages as we need +00609F 1 60 rts 0060A0 1 .endproc 0060A0 1 0060A0 1 @@ -373,61 +371,58 @@ Current file: client.s 0060A0 1 ;;; $7f - $ff - key down, ASCII code + $80 0060A0 1 ;;; otherwise, a transition: 0060A0 1 ;;; -0060A0 1 SIS_KBUP = $00 ; Key up -0060A0 1 SIS_OADOWN = $01 ; Open Apple transitioned to down -0060A0 1 SIS_OAUP = $02 ; Open Apple transitioned to up -0060A0 1 SIS_CADOWN = $03 ; Closed Apple transitioned to down -0060A0 1 SIS_CAUP = $04 ; Closed Apple transitioned to up +0060A0 1 SIS_KBUP = $00 ; Key up +0060A0 1 SIS_OADOWN = $01 ; Open Apple transitioned to down +0060A0 1 SIS_OAUP = $02 ; Open Apple transitioned to up +0060A0 1 SIS_CADOWN = $03 ; Closed Apple transitioned to down +0060A0 1 SIS_CAUP = $04 ; Closed Apple transitioned to up 0060A0 1 ;;; 0060A0 1 ;;; $05 - $0f : reserved 0060A0 1 ;;; -0060A0 1 SIS_MX = $10 ; Mouse X high nibble -0060A0 1 SIS_MY = $20 ; Mouse Y high nibble -0060A0 1 SIS_PDL0 = $30 ; Paddle 0 high nibble -0060A0 1 SIS_PDL1 = $40 ; Paddle 1 high nibble +0060A0 1 SIS_MX = $10 ; Mouse X high nibble +0060A0 1 SIS_MY = $20 ; Mouse Y high nibble +0060A0 1 SIS_PDL0 = $30 ; Paddle 0 high nibble +0060A0 1 SIS_PDL1 = $40 ; Paddle 1 high nibble 0060A0 1 ;;; 0060A0 1 ;;; $50 - $7e : reserved 0060A0 1 ;;; -0060A0 1 SIS_SYNC = $7f +0060A0 1 SIS_SYNC = $7f 0060A0 1 0060A0 1 ;;;--------------------------------------------------------- -0060A0 1 .proc InitInput -0060A0 1 ;;;--------------------------------------------------------- 0060A0 1 ;;; Initialize input devices and storage for detecting 0060A0 1 ;;; state transitions -0060A0 1 ;;;--------------------------------------------------------- +0060A0 1 +0060A0 1 .proc InitInput 0060A0 1 0060A0 1 ;;; Init keyboard state -0060A0 1 A9 00 lda #SIS_KBUP -0060A2 1 8D 5B 60 sta LASTKB +0060A0 1 A9 00 lda #SIS_KBUP +0060A2 1 8D 5B 60 sta LASTKB 0060A5 1 0060A5 1 ;;; Init Open/Closed Apple states -0060A5 1 A9 02 lda #SIS_OAUP ; NOTE: Don't store OA state as it fluctuates -0060A7 1 8D 5C 60 sta LASTOA -0060AA 1 A9 04 lda #SIS_CAUP ; NOTE: Don't store CA state as it fluctuates -0060AC 1 8D 5D 60 sta LASTCA +0060A5 1 A9 02 lda #SIS_OAUP ; NOTE: Don't store OA state as it fluctuates +0060A7 1 8D 5C 60 sta LASTOA +0060AA 1 A9 04 lda #SIS_CAUP ; NOTE: Don't store CA state as it fluctuates +0060AC 1 8D 5D 60 sta LASTCA 0060AF 1 -0060AF 1 .ifdef PADDLE_SUPPORT +0060AF 1 .ifdef PADDLE_SUPPORT 0060AF 1 ;;; Init Paddle state -0060AF 1 A9 30 lda #SIS_PDL0 -0060B1 1 09 08 ora #8 ; Middle of range 0...15 -0060B3 1 8D 5E 60 sta LASTP0 -0060B6 1 A9 40 lda #SIS_PDL1 -0060B8 1 09 08 ora #8 ; Middle of range 0...15 -0060BA 1 8D 5F 60 sta LASTP1 -0060BD 1 .endif +0060AF 1 A9 30 lda #SIS_PDL0 +0060B1 1 09 08 ora #8 ; Middle of range 0...15 +0060B3 1 8D 5E 60 sta LASTP0 +0060B6 1 A9 40 lda #SIS_PDL1 +0060B8 1 09 08 ora #8 ; Middle of range 0...15 +0060BA 1 8D 5F 60 sta LASTP1 +0060BD 1 .endif 0060BD 1 -0060BD 1 .ifdef MOUSE_SUPPORT -0060BD 1 jsr Mouse::FindMouse -0060BD 1 .endif +0060BD 1 .ifdef MOUSE_SUPPORT +0060BD 1 jsr Mouse::FindMouse +0060BD 1 .endif 0060BD 1 -0060BD 1 60 rts +0060BD 1 60 rts 0060BE 1 .endproc 0060BE 1 0060BE 1 0060BE 1 ;;;--------------------------------------------------------- -0060BE 1 .proc SendInputState -0060BE 1 ;;;--------------------------------------------------------- 0060BE 1 ;;; Send keyboard joystick and/or mouse state over the 0060BE 1 ;;; serial port 0060BE 1 ;;; @@ -438,11 +433,12 @@ Current file: client.s 0060BE 1 ;;; - otherwise send paddle 0 state (if it changed) 0060BE 1 ;;; - (TODO: Mouse state) 0060BE 1 ;;; - otherwise send sync byte -0060BE 1 ;;;--------------------------------------------------------- 0060BE 1 -0060BE 1 48 8A 48 98 SaveRegisters ; Store registers +0060BE 1 .proc SendInputState +0060BE 1 +0060BE 1 48 8A 48 98 SaveRegisters ; Store registers 0060C2 1 48 -0060C3 1 18 clc +0060C3 1 18 clc 0060C4 1 0060C4 1 ;;;-------------------------------------- 0060C4 1 ;;; Send key state, if it changed @@ -458,32 +454,32 @@ Current file: client.s 0060C4 1 ;;; Down - Down Save and send key ONLY if different 0060C4 1 ;;; 0060C4 1 -0060C4 1 AD 5B 60 lda LASTKB -0060C7 1 D0 0E bne KEY_WAS_DOWN +0060C4 1 AD 5B 60 lda LASTKB +0060C7 1 D0 0E bne KEY_WAS_DOWN 0060C9 1 0060C9 1 KEY_WAS_UP: -0060C9 1 AD 00 C0 lda KBD ; Read keyboard -0060CC 1 10 27 bpl END_KEY ; - still up -0060CE 1 8D 5B 60 sta LASTKB ; Down, so save it -0060D1 1 20 30 60 jsr SSC::Put ; and send it -0060D4 1 4C 86 61 jmp DONE +0060C9 1 AD 00 C0 lda KBD ; Read keyboard +0060CC 1 10 27 bpl END_KEY ; - still up +0060CE 1 8D 5B 60 sta LASTKB ; Down, so save it +0060D1 1 20 30 60 jsr SSC::Put ; and send it +0060D4 1 4C 86 61 jmp DONE 0060D7 1 0060D7 1 KEY_WAS_DOWN: -0060D7 1 ; key was down - strobe should match -0060D7 1 ; unless the key changed or was released -0060D7 1 AD 10 C0 lda KBDSTRB -0060DA 1 30 0B bmi KBDSTRB_DOWN +0060D7 1 ; key was down - strobe should match +0060D7 1 ; unless the key changed or was released +0060D7 1 AD 10 C0 lda KBDSTRB +0060DA 1 30 0B bmi KBDSTRB_DOWN 0060DC 1 KBDSTRB_UP: -0060DC 1 A9 00 lda #SIS_KBUP ; Key was released -0060DE 1 8D 5B 60 sta LASTKB ; so save it -0060E1 1 20 30 60 jsr SSC::Put ; and send it -0060E4 1 4C 86 61 jmp DONE +0060DC 1 A9 00 lda #SIS_KBUP ; Key was released +0060DE 1 8D 5B 60 sta LASTKB ; so save it +0060E1 1 20 30 60 jsr SSC::Put ; and send it +0060E4 1 4C 86 61 jmp DONE 0060E7 1 KBDSTRB_DOWN: -0060E7 1 CD 5B 60 cmp LASTKB ; Same key as last time? -0060EA 1 F0 09 beq END_KEY ; - no change -0060EC 1 8D 5B 60 sta LASTKB ; New key, so save it -0060EF 1 20 30 60 jsr SSC::Put ; and send it -0060F2 1 4C 86 61 jmp DONE +0060E7 1 CD 5B 60 cmp LASTKB ; Same key as last time? +0060EA 1 F0 09 beq END_KEY ; - no change +0060EC 1 8D 5B 60 sta LASTKB ; New key, so save it +0060EF 1 20 30 60 jsr SSC::Put ; and send it +0060F2 1 4C 86 61 jmp DONE 0060F5 1 0060F5 1 END_KEY: 0060F5 1 @@ -494,22 +490,22 @@ Current file: client.s 0060F5 1 ;;; for both OA states and bit = 0 down: lda BUTN0 ; ROL ; LDA #0 ; ROL ; ORA #signature 0060F5 1 0060F5 1 TEST_OA: -0060F5 1 AD 61 C0 lda BUTN0 ; Test Open Apple state -0060F8 1 30 10 bmi OA_IS_DOWN +0060F5 1 AD 61 C0 lda BUTN0 ; Test Open Apple state +0060F8 1 30 10 bmi OA_IS_DOWN 0060FA 1 OA_IS_UP: -0060FA 1 A9 02 lda #SIS_OAUP -0060FC 1 CD 5C 60 cmp LASTOA ; Changed? -0060FF 1 F0 19 beq END_OA ; Nope -006101 1 8D 5C 60 sta LASTOA ; Yes, save it / send it! -006104 1 20 30 60 jsr SSC::Put -006107 1 4C 86 61 jmp DONE +0060FA 1 A9 02 lda #SIS_OAUP +0060FC 1 CD 5C 60 cmp LASTOA ; Changed? +0060FF 1 F0 19 beq END_OA ; Nope +006101 1 8D 5C 60 sta LASTOA ; Yes, save it / send it! +006104 1 20 30 60 jsr SSC::Put +006107 1 4C 86 61 jmp DONE 00610A 1 OA_IS_DOWN: -00610A 1 A9 01 lda #SIS_OADOWN -00610C 1 CD 5C 60 cmp LASTOA ; Changed? -00610F 1 F0 09 beq END_OA ; Nope -006111 1 8D 5C 60 sta LASTOA ; Yes, save it / send it! -006114 1 20 30 60 jsr SSC::Put -006117 1 4C 86 61 jmp DONE +00610A 1 A9 01 lda #SIS_OADOWN +00610C 1 CD 5C 60 cmp LASTOA ; Changed? +00610F 1 F0 09 beq END_OA ; Nope +006111 1 8D 5C 60 sta LASTOA ; Yes, save it / send it! +006114 1 20 30 60 jsr SSC::Put +006117 1 4C 86 61 jmp DONE 00611A 1 00611A 1 END_OA: 00611A 1 @@ -517,89 +513,89 @@ Current file: client.s 00611A 1 ;;; Send Closed Apple state, if it changed 00611A 1 00611A 1 TEST_CA: -00611A 1 AD 62 C0 lda BUTN1 ; Has the Open Apple/Button 1 value changed? -00611D 1 30 10 bmi CA_IS_DOWN +00611A 1 AD 62 C0 lda BUTN1 ; Has the Open Apple/Button 1 value changed? +00611D 1 30 10 bmi CA_IS_DOWN 00611F 1 CA_IS_UP: -00611F 1 A9 04 lda #SIS_CAUP -006121 1 CD 5D 60 cmp LASTCA ; Changed? -006124 1 F0 19 beq END_CA ; Nope -006126 1 8D 5D 60 sta LASTCA ; Yes, save it -006129 1 20 30 60 jsr SSC::Put ; and send it -00612C 1 4C 86 61 jmp DONE +00611F 1 A9 04 lda #SIS_CAUP +006121 1 CD 5D 60 cmp LASTCA ; Changed? +006124 1 F0 19 beq END_CA ; Nope +006126 1 8D 5D 60 sta LASTCA ; Yes, save it +006129 1 20 30 60 jsr SSC::Put ; and send it +00612C 1 4C 86 61 jmp DONE 00612F 1 CA_IS_DOWN: -00612F 1 A9 03 lda #SIS_CADOWN -006131 1 CD 5D 60 cmp LASTCA ; Changed? -006134 1 F0 09 beq END_CA ; Nope -006136 1 8D 5D 60 sta LASTCA ; Yes, save it -006139 1 20 30 60 jsr SSC::Put ; and send it -00613C 1 4C 86 61 jmp DONE +00612F 1 A9 03 lda #SIS_CADOWN +006131 1 CD 5D 60 cmp LASTCA ; Changed? +006134 1 F0 09 beq END_CA ; Nope +006136 1 8D 5D 60 sta LASTCA ; Yes, save it +006139 1 20 30 60 jsr SSC::Put ; and send it +00613C 1 4C 86 61 jmp DONE 00613F 1 00613F 1 END_CA: 00613F 1 -00613F 1 .ifdef PADDLE_SUPPORT +00613F 1 .ifdef PADDLE_SUPPORT 00613F 1 00613F 1 ;;;-------------------------------------- 00613F 1 ;;; Send Paddle 0 state, if it changed 00613F 1 TEST_PDL0: -00613F 1 A2 00 ldx #0 -006141 1 20 1E FB jsr PREAD -006144 1 98 tya -006145 1 4A lsr ; Shift to low nibble -006146 1 4A lsr -006147 1 4A lsr -006148 1 4A lsr -006149 1 09 30 ora #SIS_PDL0 ; And mark it with the signature -00614B 1 CD 5E 60 cmp LASTP0 ; Change? -00614E 1 F0 09 beq END_PDL0 ; Nope -006150 1 8D 5E 60 sta LASTP0 ; Yes, save it -006153 1 20 30 60 jsr SSC::Put ; and send it -006156 1 4C 86 61 jmp DONE +00613F 1 A2 00 ldx #0 +006141 1 20 1E FB jsr PREAD +006144 1 98 tya +006145 1 4A lsr ; Shift to low nibble +006146 1 4A lsr +006147 1 4A lsr +006148 1 4A lsr +006149 1 09 30 ora #SIS_PDL0 ; And mark it with the signature +00614B 1 CD 5E 60 cmp LASTP0 ; Change? +00614E 1 F0 09 beq END_PDL0 ; Nope +006150 1 8D 5E 60 sta LASTP0 ; Yes, save it +006153 1 20 30 60 jsr SSC::Put ; and send it +006156 1 4C 86 61 jmp DONE 006159 1 END_PDL0: -006159 1 ; Chew up time so next paddle read will be correct -006159 1 ; TODO: Replace this with a "read both" strobes -006159 1 ; routine -006159 1 EA EA EA EA : .repeat 11 ; By experiment, need 11 NOPs. +006159 1 ; Chew up time so next paddle read will be correct +006159 1 ; TODO: Replace this with a "read both" strobes +006159 1 ; routine +006159 1 EA EA EA EA : .repeat 11 ; By experiment, need 11 NOPs. 00615D 1 EA EA EA EA 006161 1 EA EA EA -006164 1 nop -006164 1 .endrep -006164 1 C8 iny -006165 1 D0 F2 bne :- +006164 1 nop +006164 1 .endrep +006164 1 C8 iny +006165 1 D0 F2 bne :- 006167 1 006167 1 ;;;-------------------------------------- 006167 1 ;;; Send Paddle 1 state, if it changed 006167 1 TEST_PDL1: -006167 1 A2 01 ldx #1 -006169 1 20 1E FB jsr PREAD -00616C 1 98 tya -00616D 1 4A lsr ; Shift to low nibble -00616E 1 4A lsr -00616F 1 4A lsr -006170 1 4A lsr -006171 1 09 40 ora #SIS_PDL1 ; And mark it with the signature -006173 1 CD 5F 60 cmp LASTP1 ; Change? -006176 1 F0 09 beq END_PDL1 ; Nope -006178 1 8D 5F 60 sta LASTP1 ; Yes, save it -00617B 1 20 30 60 jsr SSC::Put ; and send it -00617E 1 4C 86 61 jmp DONE +006167 1 A2 01 ldx #1 +006169 1 20 1E FB jsr PREAD +00616C 1 98 tya +00616D 1 4A lsr ; Shift to low nibble +00616E 1 4A lsr +00616F 1 4A lsr +006170 1 4A lsr +006171 1 09 40 ora #SIS_PDL1 ; And mark it with the signature +006173 1 CD 5F 60 cmp LASTP1 ; Change? +006176 1 F0 09 beq END_PDL1 ; Nope +006178 1 8D 5F 60 sta LASTP1 ; Yes, save it +00617B 1 20 30 60 jsr SSC::Put ; and send it +00617E 1 4C 86 61 jmp DONE 006181 1 END_PDL1: -006181 1 ; NOTE: No need to chew time like PDL0 -006181 1 ; since data receive will make up for it; if we -006181 1 ; loop in SendInputState need to add it here +006181 1 ; NOTE: No need to chew time like PDL0 +006181 1 ; since data receive will make up for it; if we +006181 1 ; loop in SendInputState need to add it here 006181 1 -006181 1 .endif +006181 1 .endif 006181 1 006181 1 006181 1 ;;;-------------------------------------- 006181 1 ;;; No state changes so send sync byte 006181 1 -006181 1 A9 7F lda #SIS_SYNC -006183 1 20 30 60 jsr SSC::Put +006181 1 A9 7F lda #SIS_SYNC +006183 1 20 30 60 jsr SSC::Put 006186 1 006186 1 DONE: -006186 1 68 A8 68 AA RestoreRegisters +006186 1 68 A8 68 AA RestoreRegisters 00618A 1 68 -00618B 1 60 rts +00618B 1 60 rts 00618C 1 00618C 1 .endproc 00618C 1 @@ -611,66 +607,41 @@ Current file: client.s 00618C 1 ;;;------------------------------------------------------------------- 00618C 1 00618C 1 ;;;--------------------------------------------------------- -00618C 1 .proc InitHires -00618C 1 ;;;--------------------------------------------------------- 00618C 1 ;;; Set up the graphics display and pointers -00618C 1 ;;;--------------------------------------------------------- -00618C 1 A9 20 lda #PLOTPAGE1 ; clear page 1 -00618E 1 85 E6 sta PLOTPAGE -006190 1 20 B9 61 jsr ClearHires +00618C 1 +00618C 1 .proc InitHires +00618C 1 A9 20 lda #PAGE1 ; clear page 1 +00618E 1 85 E6 sta PAGE +006190 1 20 F2 F3 jsr HCLR 006193 1 -006193 1 20 A3 61 jsr FlipHires ; then show it and flip to 2 -006196 1 8D 57 C0 sta HIRES -006199 1 8D 50 C0 sta TXTCLR -00619C 1 8D 52 C0 sta MIXCLR -00619F 1 8D 54 C0 sta LOWSCR +006193 1 20 A3 61 jsr FlipHires ; then show it and flip to 2 +006196 1 8D 57 C0 sta HIRES +006199 1 8D 50 C0 sta TXTCLR +00619C 1 8D 52 C0 sta MIXCLR +00619F 1 8D 54 C0 sta LOWSCR 0061A2 1 -0061A2 1 60 rts +0061A2 1 60 rts 0061A3 1 .endproc 0061A3 1 0061A3 1 0061A3 1 ;;;--------------------------------------------------------- -0061A3 1 .proc FlipHires -0061A3 1 ;;;--------------------------------------------------------- 0061A3 1 ;;; Call when done with the current plotting page -0061A3 1 ;;; (selected in PLOTPAGE) and it will be shown and the +0061A3 1 ;;; (selected in PAGE) and it will be shown and the 0061A3 1 ;;; other page will be shown. -0061A3 1 ;;;--------------------------------------------------------- -0061A3 1 A5 E6 lda PLOTPAGE ; plotting on which page? -0061A5 1 C9 20 cmp #PLOTPAGE1 -0061A7 1 F0 08 beq :+ +0061A3 1 +0061A3 1 .proc FlipHires +0061A3 1 A5 E6 lda PAGE ; plotting on which page? +0061A5 1 C9 20 cmp #PAGE1 +0061A7 1 F0 08 beq :+ 0061A9 1 -0061A9 1 8D 55 C0 sta HISCR ; page 2 - so show it -0061AC 1 A9 20 lda #PLOTPAGE1 ; and plot on page 1 -0061AE 1 85 E6 sta PLOTPAGE -0061B0 1 60 rts +0061A9 1 8D 55 C0 sta HISCR ; page 2 - so show it +0061AC 1 A9 20 lda #PAGE1 ; and plot on page 1 +0061AE 1 85 E6 sta PAGE +0061B0 1 60 rts 0061B1 1 -0061B1 1 8D 54 C0 : sta LOWSCR ; page 1 - so show it -0061B4 1 A9 40 lda #PLOTPAGE2 ; and plot on page 2 -0061B6 1 85 E6 sta PLOTPAGE -0061B8 1 60 rts +0061B1 1 8D 54 C0 : sta LOWSCR ; page 1 - so show it +0061B4 1 A9 40 lda #PAGE2 ; and plot on page 2 +0061B6 1 85 E6 sta PAGE +0061B8 1 60 rts 0061B9 1 .endproc 0061B9 1 -0061B9 1 -0061B9 1 ;;;--------------------------------------------------------- -0061B9 1 .proc ClearHires -0061B9 1 ;;;--------------------------------------------------------- -0061B9 1 ;;; Clear hires plotting page (selected in PLOTPAGE) to -0061B9 1 ;;; black uses ZP_PTR; not terribly efficient -0061B9 1 ;;;--------------------------------------------------------- -0061B9 1 A9 00 lda #0 ; Set up ZP_PTR as a pointer into the hires page -0061BB 1 85 FA sta ZP_PTR -0061BD 1 A5 E6 lda PLOTPAGE -0061BF 1 85 FB sta ZP_PTR+1 -0061C1 1 A2 20 ldx #PAGESIZE ; Clear this many pages -0061C3 1 A9 00 lda #0 ; with black! -0061C5 1 A8 tay -0061C6 1 91 FA : sta (ZP_PTR),Y -0061C8 1 C8 iny -0061C9 1 D0 FB bne :- -0061CB 1 E6 FB inc ZP_PTR+1 -0061CD 1 CA dex -0061CE 1 D0 F6 bne :- -0061D0 1 60 rts -0061D1 1 .endproc -0061D1 1 diff --git a/client/client.s b/client/client.s index ed118a5..03ba50d 100644 --- a/client/client.s +++ b/client/client.s @@ -1,72 +1,58 @@ -PADDLE_SUPPORT = 1 +;;;------------------------------------------------------------------- +;;; +;;; vnIIc Client Application +;;; +;;;------------------------------------------------------------------- + + PADDLE_SUPPORT = 1 ;;; MOUSE_SUPPORT = 1 -.include "apple2.inc" + .include "apple2.inc" + + .include "macros.inc" ;;;--------------------------------------------------------- ;;; Hi-res graphics constants/locations ;;;--------------------------------------------------------- -PLOTPAGE := $E6 ; Active hires plotting page (Applesoft) -PLOTPAGE1 := $20 -PLOTPAGE2 := $40 -PAGESIZE := $20 ; Size of hi-res screen in pages +PAGE := $E6 ; Active hires plotting page (Applesoft) +PAGE1 := $20 +PAGE2 := $40 + +PAGESIZE := $20 ; Size of hi-res screen in pages ;;;--------------------------------------------------------- ;;; ROM routines ;;;--------------------------------------------------------- -PREAD := $FB1E ; Monitor paddle reading routine, call - ; with paddle # in X, returns value in Y +PREAD := $FB1E ; Monitor paddle reading routine, call + ; with paddle # in X, returns value in Y + +HCLR := $F3F2 ; Clear current hires screen to black ;;;--------------------------------------------------------- ;;; Other ;;;--------------------------------------------------------- -MAX_SLOT := 7 ; Maximum slot # on an Apple II +MAX_SLOT := 7 ; Maximum slot # on an Apple II -ZP_PTR := $FA ; Write cursor location on zero page - -;;;--------------------------------------------------------- -;;; Generic Macros -;;;--------------------------------------------------------- - -;;;---------------------------------------- -.macro SaveRegisters -;;;---------------------------------------- - pha - txa - pha - tya - pha -.endmacro - -;;;---------------------------------------- -.macro RestoreRegisters -;;;---------------------------------------- - pla - tay - pla - tax - pla -.endmacro +ZP_PTR := $FA ; Write cursor location on zero page ;;;------------------------------------------------------------------- ;;; -;;; Application-level logic +;;; Client Code ;;; ;;;------------------------------------------------------------------- + .org $6000 + jmp AppEntry -.org $6000 - jmp AppEntry + .include "ssc.inc" -.include "ssc.inc" - -.ifdef MOUSE_SUPPORT + .ifdef MOUSE_SUPPORT .include "mouse.inc" -.endif ; MOUSE_SUPPORT + .endif ;;;------------------------------------------------------------------- @@ -74,47 +60,45 @@ ZP_PTR := $FA ; Write cursor location on zero page ;;;------------------------------------------------------------------- ;;; Application configuration -PSPEED: .byte SSC::BPS_115k ; Hardcoded for Apple IIc (TODO: Allow configuration) -PSLOT: .byte 2 ; Hardcoded for Apple IIc (TODO: Allow configuration) -PEXIT: .byte 0 ; Set when it's time to exit (Not Yet Implemented) +PSPEED: .byte SSC::BPS_115k ; Hardcoded for Apple IIc (TODO: Allow configuration) +PSLOT: .byte 2 ; Hardcoded for Apple IIc (TODO: Allow configuration) +PEXIT: .byte 0 ; Set when it's time to exit (Not Yet Implemented) ;;; Keyboard state -LASTKB: .byte 0 -LASTOA: .byte 0 -LASTCA: .byte 0 +LASTKB: .byte 0 +LASTOA: .byte 0 +LASTCA: .byte 0 -.ifdef PADDLE_SUPPORT + .ifdef PADDLE_SUPPORT ;;; Paddle state -LASTP0: .byte 0 -LASTP1: .byte 0 +LASTP0: .byte 0 +LASTP1: .byte 0 -.endif ; PADDLE_SUPPORT + .endif ; PADDLE_SUPPORT -;;;--------------------------------------------------------- -.proc AppEntry ;;;--------------------------------------------------------- ;;; Initialize the application, and enter the main loop -;;;--------------------------------------------------------- - lda PSLOT ; Use slot 2 - jsr SSC::Init ; Initialize Super Serial Card - jsr InitHires ; Initialize Hi-Res graphics - jsr InitInput ; Initialize input devices - jsr MainLoop - ; fall through +.proc AppEntry + lda PSLOT ; Use slot 2 + jsr SSC::Init ; Initialize Super Serial Card + jsr InitHires ; Initialize Hi-Res graphics + jsr InitInput ; Initialize input devices + jsr MainLoop + + ; fall through .endproc -;;;--------------------------------------------------------- -.proc AppExit ;;;--------------------------------------------------------- ;;; Clean up and exit app -;;;--------------------------------------------------------- - jsr SSC::Reset - sta LOWSCR - sta TXTSET - rts + +.proc AppExit + jsr SSC::Reset + sta LOWSCR + sta TXTSET + rts .endproc @@ -127,48 +111,45 @@ LASTP1: .byte 0 ;;;--------------------------------------------------------- .proc MainLoop -;;;--------------------------------------------------------- ;;; TODO: Sort out the protocol - should be able to send ;;; input state without receiving data -;;; jsr SSCHasData ; Anything to read? +;;; jsr SSC::HasData ; Anything to read? ;;; bne :+ ; Nope -: jsr ReceivePage - jsr FlipHires - jmp :- ; TODO: define an exit trigger - rts +: jsr ReceivePage + jsr FlipHires + jmp :- ; TODO: define an exit trigger + rts .endproc -;;;--------------------------------------------------------- -.proc ReceivePage ;;;--------------------------------------------------------- ;;; Pull a hi-res page down over serial ;;; ;;; Protocol is: ;;; * Recieve 256 bytes (graphic data) ;;; * Send 1 byte (input state) -;;;--------------------------------------------------------- - lda #0 ; set up write pointer - sta ZP_PTR - lda PLOTPAGE - sta ZP_PTR+1 - ldx #PAGESIZE ; plan to receive this many pages - ldy #0 +.proc ReceivePage + lda #0 ; set up write pointer + sta ZP_PTR + lda PAGE + sta ZP_PTR+1 + ldx #PAGESIZE ; plan to receive this many pages + ldy #0 -: jsr SSC::Get ; TODO: look for escape codes in the sequence - sta (ZP_PTR),Y - iny - bne :- ; Do a full page... +: jsr SSC::Get ; TODO: look for escape codes in the sequence + sta (ZP_PTR),Y + iny + bne :- ; Do a full page... - jsr SendInputState ; brief moment to send data back upstream + jsr SendInputState ; brief moment to send data back upstream - inc ZP_PTR+1 - dex - bne :- ; ...as many pages as we need - rts + inc ZP_PTR+1 + dex + bne :- ; ...as many pages as we need + rts .endproc @@ -181,60 +162,57 @@ LASTP1: .byte 0 ;;; $7f - $ff - key down, ASCII code + $80 ;;; otherwise, a transition: ;;; - SIS_KBUP = $00 ; Key up - SIS_OADOWN = $01 ; Open Apple transitioned to down - SIS_OAUP = $02 ; Open Apple transitioned to up - SIS_CADOWN = $03 ; Closed Apple transitioned to down - SIS_CAUP = $04 ; Closed Apple transitioned to up + SIS_KBUP = $00 ; Key up + SIS_OADOWN = $01 ; Open Apple transitioned to down + SIS_OAUP = $02 ; Open Apple transitioned to up + SIS_CADOWN = $03 ; Closed Apple transitioned to down + SIS_CAUP = $04 ; Closed Apple transitioned to up ;;; ;;; $05 - $0f : reserved ;;; - SIS_MX = $10 ; Mouse X high nibble - SIS_MY = $20 ; Mouse Y high nibble - SIS_PDL0 = $30 ; Paddle 0 high nibble - SIS_PDL1 = $40 ; Paddle 1 high nibble + SIS_MX = $10 ; Mouse X high nibble + SIS_MY = $20 ; Mouse Y high nibble + SIS_PDL0 = $30 ; Paddle 0 high nibble + SIS_PDL1 = $40 ; Paddle 1 high nibble ;;; ;;; $50 - $7e : reserved ;;; - SIS_SYNC = $7f + SIS_SYNC = $7f -;;;--------------------------------------------------------- -.proc InitInput ;;;--------------------------------------------------------- ;;; Initialize input devices and storage for detecting ;;; state transitions -;;;--------------------------------------------------------- + +.proc InitInput ;;; Init keyboard state - lda #SIS_KBUP - sta LASTKB + lda #SIS_KBUP + sta LASTKB ;;; Init Open/Closed Apple states - lda #SIS_OAUP ; NOTE: Don't store OA state as it fluctuates - sta LASTOA - lda #SIS_CAUP ; NOTE: Don't store CA state as it fluctuates - sta LASTCA + lda #SIS_OAUP ; NOTE: Don't store OA state as it fluctuates + sta LASTOA + lda #SIS_CAUP ; NOTE: Don't store CA state as it fluctuates + sta LASTCA -.ifdef PADDLE_SUPPORT + .ifdef PADDLE_SUPPORT ;;; Init Paddle state - lda #SIS_PDL0 - ora #8 ; Middle of range 0...15 - sta LASTP0 - lda #SIS_PDL1 - ora #8 ; Middle of range 0...15 - sta LASTP1 -.endif + lda #SIS_PDL0 + ora #8 ; Middle of range 0...15 + sta LASTP0 + lda #SIS_PDL1 + ora #8 ; Middle of range 0...15 + sta LASTP1 + .endif -.ifdef MOUSE_SUPPORT - jsr Mouse::FindMouse -.endif + .ifdef MOUSE_SUPPORT + jsr Mouse::FindMouse + .endif - rts + rts .endproc -;;;--------------------------------------------------------- -.proc SendInputState ;;;--------------------------------------------------------- ;;; Send keyboard joystick and/or mouse state over the ;;; serial port @@ -246,10 +224,11 @@ LASTP1: .byte 0 ;;; - otherwise send paddle 0 state (if it changed) ;;; - (TODO: Mouse state) ;;; - otherwise send sync byte -;;;--------------------------------------------------------- - SaveRegisters ; Store registers - clc +.proc SendInputState + + SaveRegisters ; Store registers + clc ;;;-------------------------------------- ;;; Send key state, if it changed @@ -265,32 +244,32 @@ LASTP1: .byte 0 ;;; Down - Down Save and send key ONLY if different ;;; - lda LASTKB - bne KEY_WAS_DOWN + lda LASTKB + bne KEY_WAS_DOWN KEY_WAS_UP: - lda KBD ; Read keyboard - bpl END_KEY ; - still up - sta LASTKB ; Down, so save it - jsr SSC::Put ; and send it - jmp DONE + lda KBD ; Read keyboard + bpl END_KEY ; - still up + sta LASTKB ; Down, so save it + jsr SSC::Put ; and send it + jmp DONE KEY_WAS_DOWN: - ; key was down - strobe should match - ; unless the key changed or was released - lda KBDSTRB - bmi KBDSTRB_DOWN + ; key was down - strobe should match + ; unless the key changed or was released + lda KBDSTRB + bmi KBDSTRB_DOWN KBDSTRB_UP: - lda #SIS_KBUP ; Key was released - sta LASTKB ; so save it - jsr SSC::Put ; and send it - jmp DONE + lda #SIS_KBUP ; Key was released + sta LASTKB ; so save it + jsr SSC::Put ; and send it + jmp DONE KBDSTRB_DOWN: - cmp LASTKB ; Same key as last time? - beq END_KEY ; - no change - sta LASTKB ; New key, so save it - jsr SSC::Put ; and send it - jmp DONE + cmp LASTKB ; Same key as last time? + beq END_KEY ; - no change + sta LASTKB ; New key, so save it + jsr SSC::Put ; and send it + jmp DONE END_KEY: @@ -301,22 +280,22 @@ END_KEY: ;;; for both OA states and bit = 0 down: lda BUTN0 ; ROL ; LDA #0 ; ROL ; ORA #signature TEST_OA: - lda BUTN0 ; Test Open Apple state - bmi OA_IS_DOWN + lda BUTN0 ; Test Open Apple state + bmi OA_IS_DOWN OA_IS_UP: - lda #SIS_OAUP - cmp LASTOA ; Changed? - beq END_OA ; Nope - sta LASTOA ; Yes, save it / send it! - jsr SSC::Put - jmp DONE + lda #SIS_OAUP + cmp LASTOA ; Changed? + beq END_OA ; Nope + sta LASTOA ; Yes, save it / send it! + jsr SSC::Put + jmp DONE OA_IS_DOWN: - lda #SIS_OADOWN - cmp LASTOA ; Changed? - beq END_OA ; Nope - sta LASTOA ; Yes, save it / send it! - jsr SSC::Put - jmp DONE + lda #SIS_OADOWN + cmp LASTOA ; Changed? + beq END_OA ; Nope + sta LASTOA ; Yes, save it / send it! + jsr SSC::Put + jmp DONE END_OA: @@ -324,86 +303,86 @@ END_OA: ;;; Send Closed Apple state, if it changed TEST_CA: - lda BUTN1 ; Has the Open Apple/Button 1 value changed? - bmi CA_IS_DOWN + lda BUTN1 ; Has the Open Apple/Button 1 value changed? + bmi CA_IS_DOWN CA_IS_UP: - lda #SIS_CAUP - cmp LASTCA ; Changed? - beq END_CA ; Nope - sta LASTCA ; Yes, save it - jsr SSC::Put ; and send it - jmp DONE + lda #SIS_CAUP + cmp LASTCA ; Changed? + beq END_CA ; Nope + sta LASTCA ; Yes, save it + jsr SSC::Put ; and send it + jmp DONE CA_IS_DOWN: - lda #SIS_CADOWN - cmp LASTCA ; Changed? - beq END_CA ; Nope - sta LASTCA ; Yes, save it - jsr SSC::Put ; and send it - jmp DONE + lda #SIS_CADOWN + cmp LASTCA ; Changed? + beq END_CA ; Nope + sta LASTCA ; Yes, save it + jsr SSC::Put ; and send it + jmp DONE END_CA: -.ifdef PADDLE_SUPPORT + .ifdef PADDLE_SUPPORT ;;;-------------------------------------- ;;; Send Paddle 0 state, if it changed TEST_PDL0: - ldx #0 - jsr PREAD - tya - lsr ; Shift to low nibble - lsr - lsr - lsr - ora #SIS_PDL0 ; And mark it with the signature - cmp LASTP0 ; Change? - beq END_PDL0 ; Nope - sta LASTP0 ; Yes, save it - jsr SSC::Put ; and send it - jmp DONE + ldx #0 + jsr PREAD + tya + lsr ; Shift to low nibble + lsr + lsr + lsr + ora #SIS_PDL0 ; And mark it with the signature + cmp LASTP0 ; Change? + beq END_PDL0 ; Nope + sta LASTP0 ; Yes, save it + jsr SSC::Put ; and send it + jmp DONE END_PDL0: - ; Chew up time so next paddle read will be correct - ; TODO: Replace this with a "read both" strobes - ; routine -: .repeat 11 ; By experiment, need 11 NOPs. - nop - .endrep - iny - bne :- + ; Chew up time so next paddle read will be correct + ; TODO: Replace this with a "read both" strobes + ; routine +: .repeat 11 ; By experiment, need 11 NOPs. + nop + .endrep + iny + bne :- ;;;-------------------------------------- ;;; Send Paddle 1 state, if it changed TEST_PDL1: - ldx #1 - jsr PREAD - tya - lsr ; Shift to low nibble - lsr - lsr - lsr - ora #SIS_PDL1 ; And mark it with the signature - cmp LASTP1 ; Change? - beq END_PDL1 ; Nope - sta LASTP1 ; Yes, save it - jsr SSC::Put ; and send it - jmp DONE + ldx #1 + jsr PREAD + tya + lsr ; Shift to low nibble + lsr + lsr + lsr + ora #SIS_PDL1 ; And mark it with the signature + cmp LASTP1 ; Change? + beq END_PDL1 ; Nope + sta LASTP1 ; Yes, save it + jsr SSC::Put ; and send it + jmp DONE END_PDL1: - ; NOTE: No need to chew time like PDL0 - ; since data receive will make up for it; if we - ; loop in SendInputState need to add it here + ; NOTE: No need to chew time like PDL0 + ; since data receive will make up for it; if we + ; loop in SendInputState need to add it here -.endif + .endif ;;;-------------------------------------- ;;; No state changes so send sync byte - lda #SIS_SYNC - jsr SSC::Put + lda #SIS_SYNC + jsr SSC::Put DONE: - RestoreRegisters - rts + RestoreRegisters + rts .endproc @@ -414,66 +393,41 @@ DONE: ;;; ;;;------------------------------------------------------------------- -;;;--------------------------------------------------------- -.proc InitHires ;;;--------------------------------------------------------- ;;; Set up the graphics display and pointers -;;;--------------------------------------------------------- - lda #PLOTPAGE1 ; clear page 1 - sta PLOTPAGE - jsr ClearHires - jsr FlipHires ; then show it and flip to 2 - sta HIRES - sta TXTCLR - sta MIXCLR - sta LOWSCR +.proc InitHires + lda #PAGE1 ; clear page 1 + sta PAGE + jsr HCLR - rts + jsr FlipHires ; then show it and flip to 2 + sta HIRES + sta TXTCLR + sta MIXCLR + sta LOWSCR + + rts .endproc -;;;--------------------------------------------------------- -.proc FlipHires ;;;--------------------------------------------------------- ;;; Call when done with the current plotting page -;;; (selected in PLOTPAGE) and it will be shown and the +;;; (selected in PAGE) and it will be shown and the ;;; other page will be shown. -;;;--------------------------------------------------------- - lda PLOTPAGE ; plotting on which page? - cmp #PLOTPAGE1 - beq :+ - sta HISCR ; page 2 - so show it - lda #PLOTPAGE1 ; and plot on page 1 - sta PLOTPAGE - rts +.proc FlipHires + lda PAGE ; plotting on which page? + cmp #PAGE1 + beq :+ -: sta LOWSCR ; page 1 - so show it - lda #PLOTPAGE2 ; and plot on page 2 - sta PLOTPAGE - rts -.endproc - - -;;;--------------------------------------------------------- -.proc ClearHires -;;;--------------------------------------------------------- -;;; Clear hires plotting page (selected in PLOTPAGE) to -;;; black uses ZP_PTR; not terribly efficient -;;;--------------------------------------------------------- - lda #0 ; Set up ZP_PTR as a pointer into the hires page - sta ZP_PTR - lda PLOTPAGE - sta ZP_PTR+1 - ldx #PAGESIZE ; Clear this many pages - lda #0 ; with black! - tay -: sta (ZP_PTR),Y - iny - bne :- - inc ZP_PTR+1 - dex - bne :- - rts + sta HISCR ; page 2 - so show it + lda #PAGE1 ; and plot on page 1 + sta PAGE + rts + +: sta LOWSCR ; page 1 - so show it + lda #PAGE2 ; and plot on page 2 + sta PAGE + rts .endproc diff --git a/client/macros.inc b/client/macros.inc new file mode 100644 index 0000000..c9c67d6 --- /dev/null +++ b/client/macros.inc @@ -0,0 +1,21 @@ +;;;--------------------------------------------------------- +;;; +;;; Generic Macros +;;; +;;;--------------------------------------------------------- + +.macro SaveRegisters + pha + txa + pha + tya + pha +.endmacro + +.macro RestoreRegisters + pla + tay + pla + tax + pla +.endmacro diff --git a/client/mouse.inc b/client/mouse.inc index 7b034d1..772c291 100644 --- a/client/mouse.inc +++ b/client/mouse.inc @@ -3,7 +3,7 @@ ;;; Mouse ;;; ;;;------------------------------------------------------------------- -.error "Mouse support not fully implemented" + .error "Mouse support not fully implemented" .proc Mouse @@ -13,54 +13,54 @@ ;;; For READMOUSE and POSMOUSE -MOUSE_X_LSB := $0478 ; + slot Low byte of absolute X position -MOUSE_X_MSB := $0578 ; + slot High byte of absolute X position -MOUSE_Y_LSB := $04F8 ; + slot Low byte of absolute Y position -MOUSE_Y_MSB := $05F8 ; + slot High byte of absolute Y position -MOUSE_RSV1 := $0678 ; + slot Reserved and used by the firmware -MOUSE_RSV2 := $06F8 ; + slot Reserved and used by the firmware -MOUSE_BTN := $0778 ; + slot Button 0/1 interrupt status byte -MOUSE_MODE := $07F8 ; + slot Mode byte +MOUSE_X_LSB := $0478 ; + slot Low byte of absolute X position +MOUSE_X_MSB := $0578 ; + slot High byte of absolute X position +MOUSE_Y_LSB := $04F8 ; + slot Low byte of absolute Y position +MOUSE_Y_MSB := $05F8 ; + slot High byte of absolute Y position +MOUSE_RSV1 := $0678 ; + slot Reserved and used by the firmware +MOUSE_RSV2 := $06F8 ; + slot Reserved and used by the firmware +MOUSE_BTN := $0778 ; + slot Button 0/1 interrupt status byte +MOUSE_MODE := $07F8 ; + slot Mode byte ;;; For CLAMPMOUSE: -MOUSE_CMIN_LSB := $0478 ; low byte of low clamp -MOUSE_CMIN_MSB := $0578 ; high byte of low clamp -MOUSE_CMAX_LSB := $04F8 ; low byte of high clamp -MOUSE_CMAX_MSB := $05F8 ; high byte of high clamp +MOUSE_CMIN_LSB := $0478 ; low byte of low clamp +MOUSE_CMIN_MSB := $0578 ; high byte of low clamp +MOUSE_CMAX_LSB := $04F8 ; low byte of high clamp +MOUSE_CMAX_MSB := $05F8 ; high byte of high clamp -MOUSE_CLAMP_X := 0 ; Value for A when setting X clamp with CLAMPMOUSE -MOUSE_CLAMP_Y := 1 ; Value for A when setting X clamp with CLAMPMOUSE +MOUSE_CLAMP_X := 0 ; Value for A when setting X clamp with CLAMPMOUSE +MOUSE_CLAMP_Y := 1 ; Value for A when setting X clamp with CLAMPMOUSE ;;; Mouse ID bytes MOUSEID_MAX := 4 -MOUSEID_ADDR: .byte $05, $07, $0b, $0c, $fb -MOUSEID_VAL: .byte $38, $18, $01, $20, $d6 +MOUSEID_ADDR: .byte $05, $07, $0b, $0c, $fb +MOUSEID_VAL: .byte $38, $18, $01, $20, $d6 -SLOT_BASE := $C000 +SLOT_BASE := $C000 ;;;-------------------------------------------------- ;;; Data ;;;-------------------------------------------------- ;;; Mouse -MOUSE_SLOT: .byte 0 ; mouse slot, or 0 if none -LAST_MX: .byte $7f -LAST_MY: .byte $7f +MOUSE_SLOT: .byte 0 ; mouse slot, or 0 if none +LAST_MX: .byte $7f +LAST_MY: .byte $7f ;;;-------------------------------------------------- ;;; Routines ;;;-------------------------------------------------- -MOUSEPTR = $EB ; Zero page location +MOUSEPTR := $EB ; Zero page location -MOUSE_MIN_X := $10 -MOUSE_MAX_X := $1f -MOUSE_CENTER_X := $17 -MOUSE_MIN_Y := $20 -MOUSE_MAX_Y := $2f -MOUSE_CENTER_Y := $2f +MOUSE_MIN_X := $10 +MOUSE_MAX_X := $1f +MOUSE_CENTER_X := $17 +MOUSE_MIN_Y := $20 +MOUSE_MAX_Y := $2f +MOUSE_CENTER_Y := $2f ;;;-------------------------------------------------- @@ -74,116 +74,114 @@ MOUSE_CENTER_Y := $2f ;;; min: minimum value (2 byte) ;;; max: maximum value (2 byte) ;;;---------------------------------------- - ; Clamp X to 0...255 - lda #min - sta MOUSE_CMIN_MSB - lda #max - sta MOUSE_CMAX_MSB - lda #axis - jsr CLAMPMOUSE + lda #min + sta MOUSE_CMIN_MSB + lda #max + sta MOUSE_CMAX_MSB + lda #axis + jsr CLAMPMOUSE .endmacro ;;;---------------------------------------- .macro PosMouse px, py ;;;---------------------------------------- - ldx MOUSE_SLOT - lda #px - sta MOUSE_X_MSB,X - lda #py - sta MOUSE_Y_MSB,X - jsr POSMOUSE + ldx MOUSE_SLOT + lda #px + sta MOUSE_X_MSB,X + lda #py + sta MOUSE_Y_MSB,X + jsr POSMOUSE .endmacro -;;;--------------------------------------------------------- -.proc FindMouse ;;;--------------------------------------------------------- ;;; Find and initialize the mouse port -;;;--------------------------------------------------------- + +.proc FindMouse ;;; Reference: http://home.swbell.net/rubywand/R034MOUSEPRG.TXT - sei ; No interrupts while we're getting set up -; + sei ; No interrupts while we're getting set up + ; ;;; Step 1: Find the mouse card by scanning slots for ID bytes -; + ; - ldy #MAX_SLOT ; Start search in slot 7 + ldy #MAX_SLOT ; Start search in slot 7 TESTSLOT: - sty MOUSE_SLOT ; Save for later - tya - clc - adc #>SLOT_BASE ; Firmware is $c0 + slot - sta slot_addr + 1 ; Update msb of signature test - ldx #MOUSEID_MAX ; This many signature bytes + sty MOUSE_SLOT ; Save for later + tya + clc + adc #>SLOT_BASE ; Firmware is $c0 + slot + sta slot_addr + 1 ; Update msb of signature test + ldx #MOUSEID_MAX ; This many signature bytes TESTID: - lda MOUSEID_ADDR,x - sta MOD_MOUSE_ID + 1 ; Update lsb of signature test - slot_addr := *+1 - lda SLOT_BASE ; Self-modified - cmp MOUSEID_VAL,x ; Does it match the signature? - bne NOMATCH ; Nope - try the next slot - dex ; Yes! Keep testing - bpl TESTID ; Fall through if all done - jmp FOUND_MOUSE + lda MOUSEID_ADDR,x + sta MOD_MOUSE_ID + 1 ; Update lsb of signature test +slot_addr := *+1 + lda SLOT_BASE ; Self-modified + cmp MOUSEID_VAL,x ; Does it match the signature? + bne NOMATCH ; Nope - try the next slot + dex ; Yes! Keep testing + bpl TESTID ; Fall through if all done + jmp FOUND_MOUSE NOMATCH: - dey ; Didn't match - bne TESTSLOT ; Keep looking until slot 0 - sty MOUSE_SLOT ; Oops, no mouse - make a note - rts ; and bail + dey ; Didn't match + bne TESTSLOT ; Keep looking until slot 0 + sty MOUSE_SLOT ; Oops, no mouse - make a note + rts ; and bail -; + ; ;;; Step 2: Set up indirect calling routines -; + ; FOUND_MOUSE: - ; Slot is in y + ; Slot is in y - tya - ora #>SLOT_BASE ; Compute $Cn - needed for - sta MOUSEPTR+1 ; MSB of MOUSEPTR ($Cn00) - sta TOMOUSE_Cn ; X register before firmware calls - sta TOMOUSE_msb ; MSB of firmware calls + tya + ora #>SLOT_BASE ; Compute $Cn - needed for + sta MOUSEPTR+1 ; MSB of MOUSEPTR ($Cn00) + sta TOMOUSE_Cn ; X register before firmware calls + sta TOMOUSE_msb ; MSB of firmware calls - lda #0 - sta MOUSEPTR ; LSB of MOUSEPTR ($Cn00) + lda #0 + sta MOUSEPTR ; LSB of MOUSEPTR ($Cn00) - tya - asl ; Compute $n0 - needed for - asl - asl - asl - sta TOMOUSE_n0 ; Y register before firmware calls + tya + asl ; Compute $n0 - needed for + asl + asl + asl + sta TOMOUSE_n0 ; Y register before firmware calls -; + ; ;;; Step 3: Configure the mouse card -; + ; ;;; Initialize the mouse for use - jsr INITMOUSE ; reset, clamp to 0-1023 x/y - lda #1 ; mouse on, no interrupts - jsr SETMOUSE ; TODO: test carry bit result (set = error) -; + jsr INITMOUSE ; reset, clamp to 0-1023 x/y + lda #1 ; mouse on, no interrupts + jsr SETMOUSE ; TODO: test carry bit result (set = error) + ; ;;; Since we want deltas, clamp and center -; - ClampMouse MOUSE_CLAMP_X, MOUSE_MIN_X, MOUSE_MAX_X - ClampMouse MOUSE_CLAMP_Y, MOUSE_MIN_Y, MOUSE_MAX_Y - PosMouse MOUSE_CENTER_X, MOUSE_CENTER_Y + ; + ClampMouse MOUSE_CLAMP_X, MOUSE_MIN_X, MOUSE_MAX_X + ClampMouse MOUSE_CLAMP_Y, MOUSE_MIN_Y, MOUSE_MAX_Y + PosMouse MOUSE_CENTER_X, MOUSE_CENTER_Y - cli ; Enable interrupts so mouse can function + cli ; Enable interrupts so mouse can function - rts + rts .endproc @@ -192,104 +190,102 @@ FOUND_MOUSE: ;;; Indirect jump table for mouse firmware routines ;;;-------------------------------------------------- -SETMOUSE: ldy #$12 - jmp GoMouse -SERVEMOUSE: ldy #$13 - jmp GoMouse -READMOUSE: ldy #$14 - jmp GoMouse -CLEARMOUSE: ldy #$15 - jmp GoMouse -POSMOUSE: ldy #$16 - jmp GoMouse -CLAMPMOUSE: ldy #$17 - jmp GoMouse -HOMEMOUSE: ldy #$18 - jmp GoMouse -INITMOUSE: ldy #$19 - jmp GoMouse +SETMOUSE: ldy #$12 + jmp GoMouse +SERVEMOUSE: ldy #$13 + jmp GoMouse +READMOUSE: ldy #$14 + jmp GoMouse +CLEARMOUSE: ldy #$15 + jmp GoMouse +POSMOUSE: ldy #$16 + jmp GoMouse +CLAMPMOUSE: ldy #$17 + jmp GoMouse +HOMEMOUSE: ldy #$18 + jmp GoMouse +INITMOUSE: ldy #$19 + jmp GoMouse ;;;-------------------------------------------------- + .proc GoMouse -;;;-------------------------------------------------- - tax ; Preserve the value in A - lda (MOUSEPTR),Y ; Get the routine entry point - sta TOMOUSE_lsb ; Patch the JMP instruction - txa ; Restore the value in A + tax ; Preserve the value in A + lda (MOUSEPTR),Y ; Get the routine entry point + sta TOMOUSE_lsb ; Patch the JMP instruction + txa ; Restore the value in A ;;; The following operand bytes must be patched by the ;;; initialization code which detects the mouse. -BANK := $C054 +BANK := $C054 TOMOUSE: - TOMOUSE_Cn := *+1 - ldx #$C1 ; Set up slot in $Cn form in X - TOMOUSE_n0 := *+1 - ldy #$10 ; Set up slot in $n0 form in Y - php ; Save interrupt state - sei ; No interrupts while calling - bit BANK - TOMOUSE_slot := *+1 - jsr 0 ; Go to the mouse routine - plp ; Restore interrupt state - rts +TOMOUSE_Cn := *+1 + ldx #$C1 ; Set up slot in $Cn form in X +TOMOUSE_n0 := *+1 + ldy #$10 ; Set up slot in $n0 form in Y + php ; Save interrupt state + sei ; No interrupts while calling + bit BANK +TOMOUSE_slot := *+1 + jsr 0 ; Go to the mouse routine + plp ; Restore interrupt state + rts .endproc -TOMOUSE_Cn := GoMouse::TOMOUSE_Cn -TOMOUSE_n0 := GoMouse::TOMOUSE_n0 -TOMOUSE_lsb := GoMouse::TOMOUSE_slot -TOMOUSE_msb := GoMouse::TOMOUSE_slot+1 +TOMOUSE_Cn := GoMouse::TOMOUSE_Cn +TOMOUSE_n0 := GoMouse::TOMOUSE_n0 +TOMOUSE_lsb := GoMouse::TOMOUSE_slot +TOMOUSE_msb := GoMouse::TOMOUSE_slot+1 ;;; TODO: Turn this into a proper delta-sending routine ;;;-------------------------------------------------- .proc FOOMOUSE -;;;-------------------------------------------------- -; -;;;-------------------------------------------------- - txa ; save x - pha - tya ; save y - pha - jsr READMOUSE + txa ; save x + pha + tya ; save y + pha - jmp DONE + jsr READMOUSE - ldx MOUSE_SLOT + jmp DONE - lda MOUSE_X_LSB,x - sta LAST_MX + ldx MOUSE_SLOT - lda MOUSE_Y_LSB,x - sta LAST_MY + lda MOUSE_X_LSB,x + sta LAST_MX - lda LAST_MX - cmp #MOUSE_CENTER_X - bne SEND + lda MOUSE_Y_LSB,x + sta LAST_MY - lda LAST_MY - cmp #MOUSE_CENTER_Y - beq DONE + lda LAST_MX + cmp #MOUSE_CENTER_X + bne SEND + + lda LAST_MY + cmp #MOUSE_CENTER_Y + beq DONE SEND: - lda LAST_MX - ora #SIS_MX - jsr SSC::Put - lda LAST_MY - ora #SIS_MY - jsr SSC::Put + lda LAST_MX + ora #SIS_MX + jsr SSC::Put + lda LAST_MY + ora #SIS_MY + jsr SSC::Put - PosMouse MOUSE_CENTER_X, MOUSE_CENTER_Y + PosMouse MOUSE_CENTER_X, MOUSE_CENTER_Y DONE: - pla ; restore y - tay - pla ; restore x - tax - rts + pla ; restore y + tay + pla ; restore x + tax + rts .endproc diff --git a/client/ssc.inc b/client/ssc.inc index 6813964..74feb3b 100644 --- a/client/ssc.inc +++ b/client/ssc.inc @@ -13,110 +13,105 @@ ;;;--------------------------------------------------------- ;;; These get incremented by the slot where they appear -UACTRL = $C08B ; Control Register -UACMND = $C08A ; Command Register -UASTAT = $C089 ; Status Register -UADATA = $C088 ; Data Register - incoming and outgoing data + UACTRL = $C08B ; Control Register + UACMND = $C08A ; Command Register + UASTAT = $C089 ; Status Register + UADATA = $C088 ; Data Register - incoming and outgoing data ;;; Lookup table for UACTRL register, by baud rate -BPSCTRL: .byte $16,$1E,$1F,$10 ; 300, 9600, 19200, 115k (with 8 data bits, 1 stop bit, no echo) -.enum - BPS_300 - BPS_9600 - BPS_19200 - BPS_115k -.endenum +BPSCTRL: .byte $16,$1E,$1F,$10 ; 300, 9600, 19200, 115k (with 8 data bits, 1 stop bit, no echo) + .enum + BPS_300 + BPS_9600 + BPS_19200 + BPS_115k + .endenum -CMND_NRDI = $0B ; Command: no parity, RTS on, DTR on, no interrupts + CMND_NRDI = $0B ; Command: no parity, RTS on, DTR on, no interrupts -;;;--------------------------------------------------------- -.proc Init ;;;--------------------------------------------------------- ;;; Initialize the SSC; slot passed in A -;;;--------------------------------------------------------- - asl ; Slot passed in A - asl - asl - asl ; Now $S0 - adc #$88 ; Low byte of UADATA - tax - lda #CMND_NRDI ; Command register: no parity, RTS on, DTR on, no interrupts - sta $C002,X - ldy PSPEED ; Control register: look up by baud rate (8 data bits, 1 stop bit) - lda BPSCTRL,Y - sta $C003,X - stx MOD_UADATA_1 ; Modify references to - stx MOD_UADATA_2 ; UADATA to point at - stx MOD_UADATA_3 ; correct slot (UADATA+S0) - inx - stx MOD_UASTAT_1 ; Modify reference to - stx MOD_UASTAT_2 ; UASTAT to point at - stx MOD_UASTAT_3 ; correct slot (UASTAT+S0) - rts + +.proc Init + asl ; Slot passed in A + asl + asl + asl ; Now $S0 + adc #$88 ; Low byte of UADATA + tax + lda #CMND_NRDI ; Command register: no parity, RTS on, DTR on, no interrupts + sta $C002,X + ldy PSPEED ; Control register: look up by baud rate (8 data bits, 1 stop bit) + lda BPSCTRL,Y + sta $C003,X + stx MOD_UADATA_1 ; Modify references to + stx MOD_UADATA_2 ; UADATA to point at + stx MOD_UADATA_3 ; correct slot (UADATA+S0) + inx + stx MOD_UASTAT_1 ; Modify reference to + stx MOD_UASTAT_2 ; UASTAT to point at + stx MOD_UASTAT_3 ; correct slot (UASTAT+S0) + rts .endproc -;;;--------------------------------------------------------- -.proc Put ;;;--------------------------------------------------------- ;;; Send accumulator out the serial port -;;;--------------------------------------------------------- - pha ; Push A onto the stack -MOD_UASTAT_1 := *+1 -: lda UASTAT ; Check status bits - and #$70 - cmp #$10 - bne :- ; Output register is full, so loop - pla -MOD_UADATA_1 := *+1 - sta UADATA ; Put character - rts + +.proc Put + pha ; Push A onto the stack +MOD_UASTAT_1 := *+1 +: lda UASTAT ; Check status bits + and #$70 + cmp #$10 + bne :- ; Output register is full, so loop + pla +MOD_UADATA_1 := *+1 + sta UADATA ; Put character + rts .endproc - MOD_UASTAT_1 := Put::MOD_UASTAT_1 - MOD_UADATA_1 := Put::MOD_UADATA_1 +MOD_UASTAT_1 := Put::MOD_UASTAT_1 +MOD_UADATA_1 := Put::MOD_UADATA_1 ;;;--------------------------------------------------------- +;;; Read a character from the serial port to the accumulator + .proc Get -;;;--------------------------------------------------------- -;;; Read a character from the serial port to the accumulator -;;;--------------------------------------------------------- -MOD_UASTAT_2 := *+1 - lda UASTAT ; Check status bits - and #$68 - cmp #$8 - bne Get ; Input register empty, loop -MOD_UADATA_2 := *+1 - lda UADATA ; Get character - rts +MOD_UASTAT_2 := *+1 + lda UASTAT ; Check status bits + and #$68 + cmp #$8 + bne Get ; Input register empty, loop +MOD_UADATA_2 := *+1 + lda UADATA ; Get character + rts .endproc - MOD_UASTAT_2 := Get::MOD_UASTAT_2 - MOD_UADATA_2 := Get::MOD_UADATA_2 +MOD_UASTAT_2 := Get::MOD_UASTAT_2 +MOD_UADATA_2 := Get::MOD_UADATA_2 ;;;--------------------------------------------------------- +;;; Check if the serial port has pending data + .proc HasData -;;;--------------------------------------------------------- -;;; Read a character from the serial port to the accumulator -;;;--------------------------------------------------------- -MOD_UASTAT_3 := *+1 - lda UASTAT ; Check status bits - and #$68 - cmp #$8 - rts +MOD_UASTAT_3 := *+1 + lda UASTAT ; Check status bits + and #$68 + cmp #$8 + rts .endproc - MOD_UASTAT_3 := HasData::MOD_UASTAT_3 +MOD_UASTAT_3 := HasData::MOD_UASTAT_3 -;;;--------------------------------------------------------- -.proc Reset ;;;--------------------------------------------------------- ;;; Clean up serial port -;;;--------------------------------------------------------- -MOD_UADATA_3 := *+1 - bit UADATA - rts + +.proc Reset +MOD_UADATA_3 := *+1 + bit UADATA + rts .endproc - MOD_UADATA_3 := Reset::MOD_UADATA_3 +MOD_UADATA_3 := Reset::MOD_UADATA_3 .endproc