aboutsummaryrefslogtreecommitdiff
path: root/src/pollkbd.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/pollkbd.s')
-rw-r--r--src/pollkbd.s93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/pollkbd.s b/src/pollkbd.s
new file mode 100644
index 0000000..2d44976
--- /dev/null
+++ b/src/pollkbd.s
@@ -0,0 +1,93 @@
+; in C:
+;; void poll_keyboard(void) {
+;; char c;
+;;
+;; if(!keypress()) return;
+;;
+;; /* have to latch start status because doing a keyclick clears CONSOL */
+;; if(GTIA_READ.consol == 6) start_latch = 1;
+;;
+;; c = kgetc();
+;; if(!c) return;
+;;
+;; /* maybe this shouldn't happen until user presses Enter in the edbox?
+;; would let lurkers lurk and read scrollback... */
+;; if(irc_away) {
+;; txbuf_send_str("AWAY");
+;; irc_away = 0;
+;; }
+;;
+;; if(start_latch) { /* start pressed */
+;; start_keystroke(c);
+;; } else {
+;; edbox_keystroke(c);
+;; OS.cdtmv3 = hz / 2;
+;; }
+;; }
+
+; compiles to ~128 bytes.
+
+ .include "atari.inc"
+
+ .export _poll_keyboard
+ .import _keypress, _kgetc, _start_latch, _start_keystroke
+ .import _edbox_keystroke, _txbuf_send_str, _irc_away
+
+ _hz = $f0 ; must agree with timers.h!
+
+ .rodata
+away:
+ .byte "AWAY",0
+
+ .code
+_poll_keyboard:
+ ;; if(!keypress()) return;
+ jsr _keypress
+ beq @ret ; Z flag set = no keypress
+
+ ;; if(GTIA_READ.consol == 6) start_latch = 1;
+ lda CONSOL
+ cmp #6
+ bne @nostart
+ sta _start_latch ; 6, not 1 (doesn't matter so long as it's non-zero)
+
+@nostart:
+ ; c = kgetc();
+ jsr _kgetc ; note that _kgetc can set _start_latch too
+ tax ; just to set Z flag based on return value in A
+ ; if(!c) return;
+ beq @ret ; if _kgetc returned 0, we're done
+
+ ; if(irc_away) {
+ ldx _irc_away
+ beq @noaway
+ ; irc_away = 0;
+ ldx #0
+ stx _irc_away
+ ; txbuf_send_str("AWAY");
+ pha ; _txbuf_send_str will clobber A so stash it
+ lda #<away
+ ldx #>away
+ jsr _txbuf_send_str
+ ; }
+ pla
+@noaway:
+ ; if(start_latch) { /* start pressed */
+ ldx _start_latch
+ beq @nolatch
+ ; start_keystroke(c);
+ ldx #0
+ jmp _start_keystroke
+@nolatch:
+ ; } else {
+ ;;;; ldx #0 ; X already 0
+ ; edbox_keystroke(c);
+ jsr _edbox_keystroke
+ ; OS.cdtmv3 = hz / 2;
+ lda _hz
+ lsr
+ sta CDTMV3
+ ; }
+
+@ret:
+ rts