Fixed LPT low level code

Printing is now possible!
This commit is contained in:
Peter Weingartner 2022-04-13 20:04:01 -04:00
parent c9c5bb9314
commit 2ebd57fad4
5 changed files with 15021 additions and 9936 deletions

View file

@ -4,7 +4,7 @@
# and where the MCP will run (ram or flash)
#
UNIT := a2560k
MEMORY := flash
MEMORY := ram
# CPU_WDC65816 0x16 /* CPU code for the Western Design Center 65816 */
# CPU_M68000 0x20 /* CPU code for the Motorola 68000 */

View file

@ -506,7 +506,7 @@ short cli_test_lpt(short screen, int argc, const char * argv[]) {
char message[80];
unsigned char scancode;
sprintf(message, "Test parallel port:\nF1: DATA=00 F2: DATA=FF F3: STRB=1 F4: STRB=0\n");
sprintf(message, "Test parallel port:\nF1: DATA='B' F2: DATA='A' F3: STRB=1 F4: STRB=0\n");
sys_chan_write(screen, message, strlen(message));
sprintf(message, "F5: INIT=1 F6: INIT=0 F7: SEL=1 F8: SEL=0\nESC: Quit\n");
sys_chan_write(screen, message, strlen(message));
@ -518,8 +518,8 @@ short cli_test_lpt(short screen, int argc, const char * argv[]) {
scancode = sys_kbd_scancode();
switch (scancode) {
case 0x3B: /* F1 */
print(0, "DATA = 0x00\n");
*LPT_DATA_PORT = 0;
print(0, "DATA = 'B'\n");
*LPT_DATA_PORT = 'B';
break;
case 0x3C: /* F2 */
@ -586,18 +586,16 @@ short cli_test_lpt(short screen, int argc, const char * argv[]) {
short cmd_test_print(short screen, int argc, const char * argv[]) {
#if MODEL == MODEL_FOENIX_A2560K
const char * test_pattern = "0123456789ABCDEFGHIJKLMNOPQRTSUVWZXYZ\n\r";
const char * test_pattern = "0123456789ABCDEFGHIJKLMNOPQRTSUVWZXYZ\r\n";
char message[80];
unsigned short scancode = 0;
sprintf(message, "Initializing printer...\n");
sys_chan_write(screen, message, strlen(message));
print(screen, "Initializing printer...\n");
lpt_initialize();
sprintf(message, "Sending test patterns to printer (ESC to quit)...\n");
sys_chan_write(screen, message, strlen(message));
print(screen, "Sending test patterns to printer (ESC to quit)...\n");
while (scancode != 0x01) {
lpt_write(0, test_pattern, strlen(test_pattern));

View file

@ -9,9 +9,9 @@
#if MODEL == MODEL_FOENIX_A2560K
#define LPT_DATA_PORT ((volatile unsigned char *)0x00C02378)
#define LPT_DATA_PORT ((volatile unsigned char *)0xFEC02378)
#define LPT_STAT_PORT ((volatile unsigned char *)0x00C02379)
#define LPT_STAT_PORT ((volatile unsigned char *)0xFEC02379)
#define LPT_STAT_BUSY 0x80
#define LPT_STAT_ACK 0x40
#define LPT_STAT_PO 0x20
@ -19,7 +19,7 @@
#define LPT_STAT_ERROR 0x08
#define LPT_STAT_IRQ 0x04
#define LPT_CTRL_PORT ((volatile unsigned char *)0x00C0237A)
#define LPT_CTRL_PORT ((volatile unsigned char *)0xFEC0237A)
#define LPT_CTRL_STROBE 0x01
#define LPT_CTRL_AL 0x02
#define LPT_CTRL_INIT 0x04
@ -27,7 +27,7 @@
#define LPT_CTRL_IRQE 0x10
#define LPT_CTRL_BI 0x20
#define LPT_INIT_ON 0x08 /* Start the printer initialization process */
#define LPT_INIT_ON 0x04 /* Start the printer initialization process */
#define LPT_INIT_OFF 0x0C /* Stop the printer initialization process */
#define LPT_STROBE_ON 0x0D /* Strobe the printer */
#define LPT_STROBE_OFF 0x0C /* Drop the strobe to the printer */
@ -40,22 +40,15 @@ void lpt_delay() {
while (target_jiffies > sys_time_jiffies()) ;
}
/**
* Install the LPT driver
*/
short lpt_install() {
return 0;
}
void lpt_initialize() {
int i;
/* Set the outputs to start the initialization process */
*LPT_CTRL_PORT = LPT_INIT_ON;
*LPT_CTRL_PORT = LPT_CTRL_SELECT;
lpt_delay();
/* Set the outputs to stop the initialization process */
*LPT_CTRL_PORT = LPT_INIT_OFF;
*LPT_CTRL_PORT = LPT_CTRL_INIT | LPT_CTRL_SELECT;
}
/*
@ -66,25 +59,18 @@ short lpt_write_b(p_channel chan, unsigned char b) {
/* TODO: convert it to interrupt driven */
/* Wait until the printer is not busy */
while ((*LPT_STAT_PORT & LPT_STAT_BUSY) == 0) {
while ((*LPT_STAT_PORT & LPT_STAT_BUSY) == LPT_STAT_BUSY) {
lpt_delay();
}
/* Send the byte */
if (b == 0x1b) { b = 'E'}
*LPT_DATA_PORT = b;
sys_chan_write_b(0, b);
/* Strobe the interface */
//unsigned char ctrl = *LPT_CTRL_PORT;
*LPT_CTRL_PORT = LPT_STROBE_ON;
*LPT_CTRL_PORT = LPT_CTRL_INIT | LPT_CTRL_SELECT ;
lpt_delay();
*LPT_CTRL_PORT = LPT_STROBE_OFF;
/* Wait until the printer is not busy */
while ((*LPT_STAT_PORT & LPT_STAT_BUSY) == 0) {
lpt_delay();
}
*LPT_CTRL_PORT = LPT_CTRL_INIT | LPT_CTRL_SELECT | LPT_CTRL_STROBE;
return 0; /* Return success */
}
@ -106,4 +92,11 @@ short lpt_write(p_channel chan, unsigned char * buffer, short size) {
return 0;
}
/**
* Install the LPT driver
*/
short lpt_install() {
return 0;
}
#endif

5100
src/foenixmcp.s68 Normal file

File diff suppressed because it is too large Load diff

19802
src/mapfile

File diff suppressed because it is too large Load diff