From 03f2bacd2bed6f4fcc9a8c86471e9d3b6ed18a61 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Wed, 26 Jun 2019 12:59:55 +0200 Subject: [PATCH] Add readkey and fix putchar for more targets. --- CHANGELOG.md | 2 +- docs/stdlib/frequent.md | 16 ++++++++++++++-- include/a8_kernel.mfk | 12 +++++++++++- include/c128_kernal.mfk | 17 ++++++++++++++++- include/c264_kernal.mfk | 17 ++++++++++++++++- include/c64_kernal.mfk | 4 ++-- include/cpc.mfk | 2 ++ include/pc88.mfk | 2 ++ include/vic20_kernal.mfk | 16 +++++++++++++++- 9 files changed, 79 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 746c10a9..268baadd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,7 @@ * Short functions can be now defined using expression syntax. -* C64: Printing double quote characters doesn't toggle the quotation mode anymore. +* On most Commodore targets printing double quote characters doesn't toggle the quotation mode anymore. * 6502: Fixed optimizations using index registers. diff --git a/docs/stdlib/frequent.md b/docs/stdlib/frequent.md index b14cdabd..d00fa26a 100644 --- a/docs/stdlib/frequent.md +++ b/docs/stdlib/frequent.md @@ -13,7 +13,7 @@ Uses ROM routines, so requires the appropriate ROM to be enabled if applicable. Note that this function may obey typical platform idiosyncrasies, for example: -* on CBM targets other than C64 the quote character toggles the quotation mode +* on Commodore PET targets the quote character toggles the quotation mode * printing past the end of line might insert a blank line below the current one @@ -33,9 +33,21 @@ Uses ROM routines, so requires the appropriate ROM to be enabled if applicable. Waits for and reads a single keypress. +The returning values may vary between platforms: + +* letters may be uppercase or lowercase + +* modifier keys may be applied or ignored + Available for: Commodore 64 (requires KERNAL), -ZX Spectrum. +Commodore 16 or Plus/4 (requires KERNAL), +Commodore 128 (requires KERNAL), +VIC 20 (requires KERNAL), +Atari, +Amstrad CPC, +ZX Spectrum, +NEC PC-88. #### `pointer readline()` diff --git a/include/a8_kernel.mfk b/include/a8_kernel.mfk index ee9d899a..a24a7e56 100644 --- a/include/a8_kernel.mfk +++ b/include/a8_kernel.mfk @@ -3,7 +3,7 @@ #warn a8_kernel module should be used only on Atari computer-compatible targets #endif -asm void putchar(byte a) { +noinline asm void putchar(byte a) { ? tax lda $347 pha @@ -13,6 +13,16 @@ asm void putchar(byte a) { rts } +noinline asm byte readkey() { + lda #$C + sta $2A + lda $E425 + pha + lda $E424 + pha + rts +} + inline void new_line() { putchar($9b) } diff --git a/include/c128_kernal.mfk b/include/c128_kernal.mfk index ecde3b35..4cbed02f 100644 --- a/include/c128_kernal.mfk +++ b/include/c128_kernal.mfk @@ -6,7 +6,22 @@ // CHROUT. Write byte to default output. (If not screen, must call OPEN and CHKOUT beforehands.) // Input: A = Byte to write. -asm void putchar(byte a) @$FFD2 extern +asm void chrout(byte a) @$FFD2 extern + +asm void putchar(byte a) { + JSR chrout + LDA #0 + STA $F4 + ? RTS +} + +noinline asm byte readkey() { +__read_key__start: + LDA $D0 + BEQ __read_key__start + LDX #0 + JMP $C244 +} inline void new_line() { putchar(13) diff --git a/include/c264_kernal.mfk b/include/c264_kernal.mfk index 1a25ede2..3f918581 100644 --- a/include/c264_kernal.mfk +++ b/include/c264_kernal.mfk @@ -5,7 +5,22 @@ // CHROUT. Write byte to default output. (If not screen, must call OPEN and CHKOUT beforehands.) // Input: A = Byte to write. -asm void putchar(byte a) @$FFD2 extern +asm void chrout(byte a) @$FFD2 extern + +asm void putchar(byte a) { + JSR chrout + LDA #0 + STA $CB + ? RTS +} + +noinline asm byte readkey() { +__read_key__start: + LDA $EF + BEQ __read_key__start + LDX #0 + JMP $D8D5 +} inline void new_line() { putchar(13) diff --git a/include/c64_kernal.mfk b/include/c64_kernal.mfk index cc2982ba..d1ecde68 100644 --- a/include/c64_kernal.mfk +++ b/include/c64_kernal.mfk @@ -24,7 +24,7 @@ asm void clrchn() @$FFCC extern // Output: A = Device status. asm byte readst() @$FFB7 extern -inline asm void putchar(byte a) { +asm void putchar(byte a) { JSR chrout LDA #0 STA $D4 @@ -32,7 +32,7 @@ inline asm void putchar(byte a) { } noinline asm byte readkey() { -__read_key__start +__read_key__start: LDA $C6 BEQ __read_key__start JMP $E5B4 diff --git a/include/cpc.mfk b/include/cpc.mfk index 65c86791..0bfce2d1 100644 --- a/include/cpc.mfk +++ b/include/cpc.mfk @@ -5,6 +5,8 @@ asm void putchar(byte a) @$BB5A extern +asm byte readkey() @$BB06 extern + inline void new_line() { putchar(13) putchar(10) diff --git a/include/pc88.mfk b/include/pc88.mfk index 3970b7bd..28a5e374 100644 --- a/include/pc88.mfk +++ b/include/pc88.mfk @@ -6,6 +6,8 @@ asm void putchar(byte a) @$3e0d extern +asm byte readkey() @$3583 extern + inline void new_line() { putchar(13) putchar(10) diff --git a/include/vic20_kernal.mfk b/include/vic20_kernal.mfk index 0f8c7bce..4d6153cc 100644 --- a/include/vic20_kernal.mfk +++ b/include/vic20_kernal.mfk @@ -6,7 +6,21 @@ // CHROUT. Write byte to default output. (If not screen, must call OPEN and CHKOUT beforehands.) // Input: A = Byte to write. -asm void putchar(byte a) @$FFD2 extern +asm void chrout(byte a) @$FFD2 extern + +asm void putchar(byte a) { + JSR chrout + LDA #0 + STA $D4 + ? RTS +} + +noinline asm byte readkey() { +__read_key__start: + LDA $C6 + BEQ __read_key__start + JMP $E5CF +} inline void new_line() { putchar(13)