mirror of
https://github.com/RyuKojiro/apple1.git
synced 2024-11-17 06:09:14 +00:00
db84fee47d
git-svn-id: svn+ssh://svn.phoenixbox.net/svn/apple1/trunk@14 64f78de7-aa59-e511-a0e8-0002a5492df0
104 lines
2.4 KiB
C
104 lines
2.4 KiB
C
//
|
|
// pia.c
|
|
// apple1
|
|
//
|
|
// Created by Daniel Loffgren on 9/12/15.
|
|
// Copyright (c) 2015 Daniel Loffgren. All rights reserved.
|
|
//
|
|
|
|
#include "pia.h"
|
|
#include <stdio.h>
|
|
#include <as6502/color.h>
|
|
#include <stdlib.h>
|
|
|
|
#define FIXME_I_SHOULDNT_BE_NULL NULL
|
|
#define KEYBOARD_READY 0xFF // This just needs to meet the requirements of being a negative number in the eyes of the 6502
|
|
#define KEYBOARD_NOTREADY 0x00
|
|
|
|
char asciiCharFromA1Char(uint8_t c) {
|
|
switch (c) {
|
|
case 0xDC: return '\\';
|
|
case 0x8D: return '\n';
|
|
}
|
|
return (char)c & ~0x20;
|
|
}
|
|
|
|
uint8_t a1CharFromAsciiChar(char c) {
|
|
switch (c) {
|
|
case '\\': return 0xDC;
|
|
case '\n': return 0x8D;
|
|
}
|
|
return (char)c;
|
|
}
|
|
|
|
void videoWriteCharCallback(struct _v6502_memory *memory, uint16_t offset, uint8_t value, void *context) {
|
|
if (value) {
|
|
char c = asciiCharFromA1Char(value);
|
|
if (c == '\r') {
|
|
fprintf(stdout, "\n\r");
|
|
}
|
|
else {
|
|
fprintf(stdout, ANSI_COLOR_BRIGHT_GREEN "%c" ANSI_COLOR_RESET, c);
|
|
}
|
|
//memory->bytes[offset] = value;
|
|
fflush(stdout);
|
|
}
|
|
}
|
|
|
|
void videoWriteNewlineCallback(struct _v6502_memory *memory, uint16_t offset, uint8_t value, void *context) {
|
|
fprintf(stdout, "\r\n");
|
|
fflush(stdout);
|
|
}
|
|
|
|
uint8_t keyboardReadReadyCallback(struct _v6502_memory *memory, uint16_t offset, int trap, a1pia *context) {
|
|
if (context->buf) {
|
|
return KEYBOARD_READY;
|
|
}
|
|
|
|
int c = getch();
|
|
|
|
if (c != ERR) {
|
|
context->buf = c;
|
|
return KEYBOARD_READY;
|
|
}
|
|
|
|
return KEYBOARD_NOTREADY;
|
|
}
|
|
|
|
uint8_t keyboardReadCharacterCallback(struct _v6502_memory *memory, uint16_t offset, int trap, a1pia *context) {
|
|
if (context->buf) {
|
|
uint8_t a = a1CharFromAsciiChar(context->buf);
|
|
context->buf = '\0';
|
|
return a;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void _doCoolVideoStart(a1pia *pia) {
|
|
|
|
}
|
|
|
|
a1pia *pia_create(v6502_memory *mem) {
|
|
a1pia *pia = malloc(sizeof(a1pia));
|
|
pia->memory = mem;
|
|
pia->screen = initscr();
|
|
//nodelay(stdscr, true);
|
|
crmode();
|
|
noecho();
|
|
nonl();
|
|
|
|
v6502_map(mem, A1PIA_KEYBOARD_INPUT, 1, (v6502_readFunction *)keyboardReadCharacterCallback, NULL, pia);
|
|
v6502_map(mem, A1PIA_KEYBOARD_CRLF_REG, 1, (v6502_readFunction *)keyboardReadReadyCallback, NULL, pia);
|
|
v6502_map(mem, A1PIA_VIDEO_OUTPUT, 1, FIXME_I_SHOULDNT_BE_NULL, videoWriteCharCallback, pia);
|
|
v6502_map(mem, A1PIA_VIDEO_CRLF_REG, 1, FIXME_I_SHOULDNT_BE_NULL, videoWriteNewlineCallback, pia);
|
|
|
|
_doCoolVideoStart(pia);
|
|
return pia;
|
|
}
|
|
|
|
void pia_destroy(a1pia *pia) {
|
|
endwin();
|
|
free(pia);
|
|
}
|