#include "conio.h" static IOCharMap giocharmap = IOCHM_ASCII; #if defined(__C128__) #pragma code(lowcode) __asm bsout { ldx #0 stx 0xff00 jsr 0xffd2 sta 0xff01 } __asm bsin { lda #0 sta 0xff00 jsr 0xffe4 sta 0xff01 } __asm bsget { lda #0 sta 0xff00 jsr 0xffcf sta 0xff01 } __asm bsplot { lda #0 sta 0xff00 jsr 0xfff0 sta 0xff01 } __asm bsinit { lda #0 sta 0xff00 jsr 0xff81 sta 0xff01 } __asm dswap { sta 0xff00 jsr 0xff5f sta 0xff01 } #pragma code(code) #elif defined(__C128B__) || defined(__C128E__) #define dswap 0xff5f #define bsout 0xffd2 #define bsin 0xffe4 #define bsget 0xffcf #define bsplot 0xfff0 #define bsinit 0xff81 #elif defined(__PLUS4__) #pragma code(lowcode) __asm bsout { sta 0xff3e jsr 0xffd2 sta 0xff3f } __asm bsin { sta 0xff3e jsr 0xffe4 sta 0xff3f } __asm bsget { sta 0xff3e jsr 0xffcf sta 0xff3f } __asm bsplot { sta 0xff3e jsr 0xfff0 sta 0xff3f } __asm bsinit { sta 0xff3e jsr 0xff81 sta 0xff3f } #pragma code(code) #elif defined(__ATARI__) __asm bsout { tax lda 0xe407 pha lda 0xe406 pha txa } __asm bsin { lda 0xe405 pha lda 0xe404 pha } __asm bsget { lda 0xe405 pha lda 0xe404 pha } __asm bsplot { } __asm bsinit { } #elif defined(__VIC20__) #define bsout 0xffd2 #define bsin 0xffe4 #define bsplot 0xfff0 #define bsget 0xffcf __asm bsinit { lda #147 jmp $ffd2 } #elif defined(__CBMPET__) #define bsout 0xffd2 #define bsin 0xffe4 char detect_basic() { static const char basicV4[] = p"*** commodore basic 4.0 ***"; static const char basicV2[] = p"### commodore basic ###"; static const char basicV1[] = p"*** commodore basic ***"; static const char editor[] = {0x4C,0x4B,0xE0,0x4C,0xA7,0xE0,0x4C,0x16,0xE1}; if( memcmp( (const void*)0xdea4, basicV4, 27 ) == 0 ) { if( memcmp( (const void*)0xe000, editor, 8 ) == 0) return 48; else return 44; } else if( memcmp( (const void*)0xe180, basicV1, 23 ) == 1 ) { return 1; } else if( memcmp( (const void*)0xe1c4, basicV2, 23 ) == 1 ) { return 2; } else { printf("unknown basic rom!\n"); } return 0; } static char basic_version = 0; char get_basic_version() { if(basic_version == 0) basic_version = detect_basic(); return basic_version; } void petplot(char cx, char cy) { switch( get_basic_version() ) { case 48: __asm { /* BASIC4 80-col */ ldx cx ldy cy stx $e2 sty $e0 jsr 0xe05f } break; case 44: __asm { /* BASIC4 40-col */ ldx cx ldy cy stx $c6 sty $d8 jsr 0xe07f } break; case 2: __asm { /* BASIC2 */ ldx cx ldy cy stx $c6 sty $d8 jsr 0xe25d } break; default: __asm { /* BASIC1 */ ldx cx ldy cy stx $e2 sty $f5 jsr 0xe5db } break; } } __asm bsinit { /* no equivalent on PET */ } #define bsget 0xffcf #else #define bsout 0xffd2 #define bsin 0xffe4 #define bsplot 0xfff0 #define bsinit 0xff81 #define bsget 0xffcf #endif #if defined(__C128__) || defined(__C128B__) || defined(__C128E__) void dispmode40col(void) { if (*(volatile char *)0xd7 >= 128) { __asm { jsr dswap } } } void dispmode80col(void) { if (*(volatile char *)0xd7 < 128) { __asm { jsr dswap } } } #endif void iocharmap(IOCharMap chmap) { giocharmap = chmap; #if !defined(__ATARI__) if (chmap == IOCHM_PETSCII_1) putrch(128 + 14); else if (chmap == IOCHM_PETSCII_2) putrch(14); #endif } void putrch(char c) { __asm { lda c jsr bsout } } void putpch(char c) { #if defined(__ATARI__) if (c == 10) c = 0x9b; #else if (giocharmap >= IOCHM_ASCII) { if (c == '\n') c = 13; else if (c == '\t') { char n = wherex() & 3; do { putrch(' '); } while (++n < 4); return; } else if (giocharmap >= IOCHM_PETSCII_1) { if (c >= 65 && c < 123) { if (c >= 97 || c < 91) { #if defined(__CBMPET__) if (c >= 97) c ^= 0xa0; c ^= 0x20; #else if (c >= 97) c ^= 0x20; #endif if (giocharmap == IOCHM_PETSCII_2) c &= 0xdf; } } } } #endif putrch(c); } static char convch(char ch) { #if !defined(__ATARI__) if (giocharmap >= IOCHM_ASCII) { if (ch == 13) ch = 10; else if (giocharmap >= IOCHM_PETSCII_1) { if (ch >= 65 && ch < 219) { if (ch >= 193) ch ^= 0xa0; if (ch < 123 && (ch >= 97 || ch < 91)) ch ^= 0x20; } } } #endif return ch; } char getrch(void) { return __asm { jsr bsget sta accu }; } char getpch(void) { return convch(getrch()); } char kbhit(void) { #if defined(__CBMPET__) return __asm { lda $9e sta accu }; #else return __asm { lda $c6 sta accu }; #endif } char getche(void) { char ch; do { ch = __asm { jsr bsin sta accu }; } while (!ch); __asm { lda ch jsr bsout } return convch(ch); } char getch(void) { char ch; do { ch = __asm { jsr bsin sta accu }; } while (!ch); return convch(ch); } char getchx(void) { char ch = __asm { jsr bsin sta accu }; return convch(ch); } void putch(char c) { putpch(c); } void clrscr(void) { putrch(147); } void textcursor(bool show) { *(volatile char *)0xcc = show ? 0 : 1; } void gotoxy(char cx, char cy) { #ifdef __CBMPET__ petplot(cx, cy); #else __asm { ldx cy ldy cx clc jsr bsplot } #endif } void textcolor(char c) { *(volatile char *)0x0286 = c; } void bgcolor(char c) { *(volatile char *)0xd021 = c; } void bordercolor(char c) { *(volatile char *)0xd020 = c; } void revers(char r) { if (r) putrch(18); else putrch(18 + 128); } char wherex(void) { #if defined(__C128__) || defined(__C128B__) || defined(__C128E__) return *(volatile char *)0xec; #elif defined(__PLUS4__) return *(volatile char *)0xca; #else return *(volatile char *)0xd3; #endif } char wherey(void) { #if defined(__C128__) || defined(__C128B__) || defined(__C128E__) return *(volatile char *)0xeb; #elif defined(__PLUS4__) return *(volatile char *)0xcd; #else return *(volatile char *)0xd6; #endif }