diff options
| -rw-r--r-- | TODO | 3 | ||||
| -rw-r--r-- | config/config.c | 4 | ||||
| -rw-r--r-- | src/cmd.c | 37 | ||||
| -rw-r--r-- | src/irc.c | 40 | ||||
| -rw-r--r-- | src/irc.h | 3 | ||||
| -rw-r--r-- | src/main.c | 6 | ||||
| -rw-r--r-- | src/nio.c | 265 | ||||
| -rw-r--r-- | src/nio.h | 51 | ||||
| -rw-r--r-- | src/screen.c | 8 | ||||
| -rw-r--r-- | src/screen.h | 8 | ||||
| -rw-r--r-- | src/sio.s | 16 |
11 files changed, 139 insertions, 302 deletions
@@ -17,6 +17,9 @@ X Configurable ctcp version response. Not going to do for now. Having Other stuff: +- [*] highlight status should not get overwritten with chan text + status the next time someone speaks. in general, higher statuses + shouldn't get downgraded. - [*] edit box issues with the 240th character. currently everything seems to work properly, but you can't type 240 chars (only 239). out of patience for it right now... diff --git a/config/config.c b/config/config.c index b753bbd..8d09e8e 100644 --- a/config/config.c +++ b/config/config.c @@ -531,7 +531,7 @@ void detect_xl(void) { return; } - yn("XL/XE detected, use extra RAM", use_xl_ram); + use_xl_ram = yn("XL/XE detected, use extra RAM", use_xl_ram); if(!use_xl_ram) return; os_to_ram(); @@ -565,7 +565,7 @@ void main(void) { print("Version " VERSION "\n\n"); detect_dos(); - detect_xl(); + // detect_xl(); // not yet if(!load(0)) print("Using built-in default config.\n"); @@ -9,7 +9,7 @@ #include "config.h" /* A "command" is actually anything the user types, whether or - not it starts with a /character. */ + not it starts with a / character. */ char *command, *arg1, *arg2, *arg3; static char *target; @@ -88,14 +88,7 @@ static void cmd_chan_text(void) { /* 0x02 = ^B = enable bold */ scr_print_active("<\x02"); scr_print_active(conf->nick); - scr_print_active("\x02"); - - /* - if(!scr_current) { - scr_print_active("/"); - scr_print_active(target); - } - */ + scr_putc_active('\x02'); scr_print_active("> "); scr_print_active(command); @@ -314,16 +307,18 @@ void cmd_ctcp_ping(char *nick) { do_ctcp_ping(); } -static void do_ctcp_info(void) { - arg2 = "CLIENTINFO"; +static void do_no_arg_ctcp(char *type) { + arg2 = type; arg3 = 0; send_ctcp(); } +static void do_ctcp_info(void) { + do_no_arg_ctcp("CLIENTINFO"); +} + static void do_ctcp_ver(void) { - arg2 = "VERSION"; - arg3 = 0; - send_ctcp(); + do_no_arg_ctcp("VERSION"); } static void do_ctcp(void) { @@ -486,29 +481,25 @@ static void cmd_slash(void) { cmd_remote(); } -void cmd_command(char *cmd) { - command = cmd; +void cmd_execute(void) { + if(!*edit_box) return; + command = edit_box; if(scr_current > 1) target = scr_get_cur_name(); else target = 0; - if(cmd[0] == '/' && cmd[1] && cmd[1] != '/') + if(command[0] == '/' && command[1] && command[1] != '/') cmd_slash(); else if(target) cmd_chan_text(); else if(scr_current == SCR_PRIV || scr_current == SCR_SERVER) - cmd_send_pm(cmd); + cmd_send_pm(command); else err_no_scr_target(); } -void cmd_execute(void) { - if(!*edit_box) return; - cmd_command(edit_box); -} - void cmd_rejoin_chans(void) { char i; @@ -78,7 +78,7 @@ static void do_pong(void) { } static void bold(void) { - scr_print_active("\x02"); + scr_putc_active('\x02'); } static void hilite_bold(void) { @@ -88,30 +88,28 @@ static void hilite_bold(void) { static void do_chan_nick(void) { if(hilite) { bell(); - // scr_hilite_active(); new_scr_status = SCR_HILITE; } hilite_bold(); - scr_print_active("<"); + scr_putc_active('<'); hilite_bold(); scr_print_active(msg_src); if(scr_active == SCR_SERVER) { /* if we don't have a window for it */ - scr_print_active("/"); + scr_putc_active('/'); scr_print_active(msg_dest); } hilite_bold(); - scr_print_active(">"); + scr_putc_active('>'); hilite_bold(); - scr_print_active(" "); + scr_putc_active(' '); } static void do_priv_nick(void) { if(msg_src) { - scr_print_active("*"); + scr_putc_active('*'); scr_print_active(msg_src); scr_print_active("* "); - // scr_hilite_active(); new_scr_status = SCR_HILITE; bell(); } @@ -147,14 +145,14 @@ static void print_ping_time(char *p) { scr_print_active(" lag: "); itoa(sec, numbuf, 10); scr_print_active(numbuf); - scr_print_active("."); + scr_putc_active('.'); itoa(frac, numbuf, 10); scr_print_active(numbuf); - scr_print_active(" sec"); + scr_putc_active('s'); /* // for debugging: - scr_print_active(" "); + scr_putc_active(' '); itoa(pingtime, numbuf, 10); scr_print_active(numbuf); */ @@ -203,7 +201,7 @@ static void do_ctcp(int is_notice) { if(streq_i(ctcp_type, "ACTION")) { scr_print_active("* "); scr_print_active(msg_src); - scr_print_active(" "); + scr_putc_active(' '); scr_print_active(p); scr_eol_active(); return; @@ -355,7 +353,7 @@ static void do_mode(void) { scr_print_active(" sets mode: "); for(i = 0; i < msg_argcount; i++) { scr_print_active(msg_args[i]); - scr_print_active(" "); + scr_putc_active(' '); } if(msg_text) scr_print_active(msg_text); scr_eol_active(); @@ -367,18 +365,18 @@ static void do_mode(void) { static void do_catchall(int arg) { if(msg_src) { scr_print_active(msg_src); - scr_print_active(" "); + scr_putc_active(' '); } scr_print_active(msg_cmd); for(; arg < msg_argcount; arg++) { - scr_print_active(" "); + scr_putc_active(' '); scr_print_active(msg_args[arg]); } if(msg_text) { - scr_print_active(" "); + scr_putc_active(' '); scr_print_active(msg_text); } scr_eol_active(); @@ -586,8 +584,10 @@ static void dispatch_msg(void) { } if(scr_active != scr_current) { - scr_status[scr_active] = new_scr_status; - scr_show_status(scr_current); + if(scr_status[scr_active] < new_scr_status) { + scr_status[scr_active] = new_scr_status; + scr_show_status(scr_current); + } } } @@ -756,7 +756,7 @@ int irc_read(void) { if(!trip) return 1; last_read_min = minutes; - err = nstatus(conf->url); + err = nstatus(); if(err != 1) { scr_display(SCR_SERVER); @@ -779,7 +779,7 @@ int irc_read(void) { ind_net_rx(); if(rxbuflen > 0) { - err = nread(conf->url, rx_buf, rxbuflen); + err = nread(rx_buf, rxbuflen); if(err != 1) { ind_net_down(); print_errnum(); @@ -1,6 +1,3 @@ -/* 0 = no translation (used to use 3, CRLF) */ -#define FNET_TRANSLATION 0 - #define MAX_IRC_MSG_LEN 512 #define streq(x,y) !strcmp(x,y) @@ -78,7 +78,7 @@ void txbuf_send(void) { tx_buf[txbuflen++] = 0x0a; ind_net_tx(); - nwrite(conf->url, tx_buf, txbuflen); + nwrite(tx_buf, txbuflen); ind_net_idle(); txbuf_init(); } @@ -95,7 +95,7 @@ int fn_connect(void) { scr_print_current(conf->url); scr_eol_current(); - err = nopen(conf->url, FNET_TRANSLATION); + err = nopen(); if(err != SUCCESS) { scr_print_current("Connection failed: "); @@ -118,7 +118,7 @@ int fn_connect(void) { } void fn_disconnect(void) { - nclose(conf->url); + nclose(); // Restore old PROCEED interrupt. PIA.pactl &= ~1; // disable interrupts @@ -2,201 +2,110 @@ * N: I/O */ -#include "nio.h" -#include "sio.h" +/* "stripped down" version that harcodes some parameters! Don't + use this as example code for writing your own fujinet app! */ + #include <atari.h> #include <stddef.h> +#include "nio.h" +#include "sio.h" +#include "config.h" #define TIMEOUT 0x1f /* approx 30 seconds */ -unsigned char nunit(char* devicespec) -{ - unsigned char unit=1; - - // Set unit to 1 unless explicitly specified. - if (devicespec[1]==':') - unit=1; - else if (devicespec[2]==':') - unit=devicespec[1]-0x30; // convert from alpha to integer. - else - unit=1; - - return unit; +#define UNIT 1 /* only support one FujiNet connection! */ + +/* 0 = no translation (used to use 3, CRLF) */ +#define TRANS 0 + +static char get_status(void) { + if(OS.dcb.dstats != SUCCESS) { + // something went wrong + // do we need to return extended status? + if(OS.dcb.dstats == DERROR) { + nstatus(); + return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. + } + } + return OS.dcb.dstats; // Return SIO error or success } -unsigned char nopen(char* devicespec, unsigned char trans) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; // Fuji Device Identifier - OS.dcb.dunit = unit; // Unit number integer 1 through 4 - OS.dcb.dcomnd = 'O'; // Open - OS.dcb.dstats = DWRITE; // sending to to SIO device - OS.dcb.dbuf = devicespec; // eg: N:TCP// - OS.dcb.dtimlo = TIMEOUT; // approximately 30 second timeout - OS.dcb.dbyt = 256; // max size of our device spec - OS.dcb.daux1 = OUPDATE; // Read and write - OS.dcb.daux2 = trans; // CR/LF translation - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success +static void set_defaults(void) { + OS.dcb.ddevic = DFUJI; // Fuji Device Identifier + OS.dcb.dunit = UNIT; // Unit number integer 1 through 4 + OS.dcb.dtimlo = TIMEOUT; // approximately 30 second timeout } -unsigned char nclose(char* devicespec) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'C'; // Close - OS.dcb.dstats = 0x00; - OS.dcb.dbuf = NULL; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = 0; - OS.dcb.daux = 0; - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success. +char nopen(void) { + set_defaults(); + OS.dcb.dcomnd = 'O'; // Open + OS.dcb.dstats = DWRITE; // sending to to SIO device + OS.dcb.dbuf = conf->url; // eg: N:TCP// + OS.dcb.dbyt = 256; // max size of our device spec + OS.dcb.daux1 = OUPDATE; // Read and write + OS.dcb.daux2 = TRANS; // CR/LF translation + siov(); + + return get_status(); } -unsigned char nstatus(char* devicespec) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'S'; // status - OS.dcb.dstats = DREAD; - OS.dcb.dbuf = OS.dvstat; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = sizeof(OS.dvstat); - OS.dcb.daux = 0; - siov(); - - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status -} +char nclose(void) { + set_defaults(); + OS.dcb.dcomnd = 'C'; // Close + OS.dcb.dstats = 0x00; + OS.dcb.dbuf = NULL; + OS.dcb.dbyt = 0; + OS.dcb.daux = 0; + siov(); -unsigned char nread(char* devicespec, unsigned char* buf, unsigned short len) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'R'; // read - OS.dcb.dstats = DREAD; - OS.dcb.dbuf = buf; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = OS.dcb.daux = len; // Set the buffer size AND daux with length - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success. + return get_status(); } -unsigned char nwrite(char* devicespec, unsigned char* buf, unsigned short len) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic = DFUJI; - OS.dcb.dunit = unit; - OS.dcb.dcomnd = 'W'; // write - OS.dcb.dstats = DWRITE; - OS.dcb.dbuf = buf; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = OS.dcb.daux = len; - siov(); - - if (OS.dcb.dstats!=SUCCESS) - { - // something went wrong - // do we need to return extended status? - if (OS.dcb.dstats==DERROR) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended error. - } - } - return OS.dcb.dstats; // Return SIO error or success. +char nstatus(void) { + set_defaults(); + OS.dcb.dcomnd = 'S'; // status + OS.dcb.dstats = DREAD; + OS.dcb.dbuf = OS.dvstat; + OS.dcb.dbyt = sizeof(OS.dvstat); + OS.dcb.daux = 0; + siov(); + + return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status } -/* https://fujinet.online/wiki/?p=SIO-Command-%24FF-Reset-FujiNet */ -unsigned char nreset(void) { - OS.dcb.ddevic = 0x70; - OS.dcb.dunit = 1; - OS.dcb.dcomnd = 0xff; /* reset */ - OS.dcb.dstats = DWRITE; - OS.dcb.dbuf = 0; - OS.dcb.dtimlo = TIMEOUT; - OS.dcb.dbyt = 0; - OS.dcb.daux = 0; - siov(); - - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status +char nread(char *buf, unsigned short len) { + set_defaults(); + OS.dcb.dcomnd = 'R'; // read + OS.dcb.dstats = DREAD; + OS.dcb.dbuf = buf; + OS.dcb.dbyt = OS.dcb.daux = len; // Set the buffer size AND daux with length + siov(); + + return get_status(); } +char nwrite(char *buf, unsigned short len) { + set_defaults(); + OS.dcb.dcomnd = 'W'; // write + OS.dcb.dstats = DWRITE; + OS.dcb.dbuf = buf; + OS.dcb.dbyt = OS.dcb.daux = len; + siov(); + + return get_status(); +} -/* IRC doesn't need this */ -#if 0 -unsigned char nlogin(char* devicespec, char *login, char *password) -{ - unsigned char unit=nunit(devicespec); - - OS.dcb.ddevic=0x71; - OS.dcb.dunit=unit; - OS.dcb.dcomnd=0xFD; - OS.dcb.dstats=0x80; - OS.dcb.dbuf=login; - OS.dcb.dtimlo=0x1f; - OS.dcb.dbyt=256; - OS.dcb.daux=0; - siov(); - - if (OS.dcb.dstats!=1) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return ext err - } - - OS.dcb.dcomnd=0xFE; - OS.dcb.dstats=0x80; - OS.dcb.dbuf=password; - siov(); - - if (OS.dcb.dstats!=1) - { - nstatus(devicespec); - return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return ext err - } - - return OS.dcb.dstats; +/* https://fujinet.online/wiki/?p=SIO-Command-%24FF-Reset-FujiNet */ +char nreset(void) { + set_defaults(); + OS.dcb.ddevic = 0x70; + OS.dcb.dcomnd = 0xff; /* reset */ + OS.dcb.dstats = DWRITE; + OS.dcb.dbuf = 0; + OS.dcb.dbyt = 0; + OS.dcb.daux = 0; + siov(); + + return OS.dvstat[DVSTAT_EXTENDED_ERROR]; // return extended status } -#endif + @@ -22,51 +22,12 @@ #define DVSTAT_PROTOCOL 2 #define DVSTAT_EXTENDED_ERROR 3 -/** - * Open N: device with devicespec - * @param devicespec - an N: device spec, e.g. N:TCP://FOO.COM:1234/ - * @param translation mode, 0=none, 1=cr, 2=lf, 3=cr/lf - * @return error code, or 1 if successful. - */ -unsigned char nopen(char* devicespec, unsigned char trans); - -/** - * Close N: device with devicespec - * @param devicespec - an N: device spec to close (the unit number is extracted) - * @return error code, or 1 if successful. - */ -unsigned char nclose(char* devicespec); - -/** - * Get status of specific N: device - * @param devicespec - an N: device spec to status (the unit number is extracted) - * @return error code, or 1 if successful, DVSTAT is also filled with status info. - * - * Format of DVSTAT: - * OS.dcb.dvstat[0] = # of bytes waiting LO - * OS.dcb.dvstat[1] = # of bytes waiting HI - * OS.dcb.dvstat[2] = reserved - * OS.dcb.dvstat[3] = Error code of last I/O operation. !1 = error. - */ -unsigned char nstatus(char* devicespec); - -/** - * Read # of bytes from specific N: device. - * @param devicespec - an N: device spec to read bytes from. - * @param buf - The buffer to read into, must be at least as big as len. - * @param len - The # of bytes to read (up to 65535) - * @return error code, or 1 if successful, buf is filled with data. - */ -unsigned char nread(char* devicespec, unsigned char* buf, unsigned short len); - -/** - * Write # of bytes to specific N: device. - * @param devicespec - an N: device spec to write to. - * @param buf - The buffer to write to device, should be at least as big as len. - * @param len - The # of bytes to write (up to 65535) - * @return error code, or 1 if successful, buf is filled with data. - */ -unsigned char nwrite(char* devicespec, unsigned char* buf, unsigned short len); +char nopen(void); +char nclose(void); +char nstatus(void); +char nread(char *buf, unsigned short len); +char nwrite(char *buf, unsigned short len); +char nreset(void); /** * Send username and password credentials diff --git a/src/screen.c b/src/screen.c index 2645515..258a4a7 100644 --- a/src/screen.c +++ b/src/screen.c @@ -188,14 +188,6 @@ void scr_show_status(char s) { } } -/* -void scr_hilite_active(void) { - if(scr_active == scr_current) return; - scr_status[scr_active] = SCR_HILITE; - scr_show_status(scr_current); -} -*/ - void scr_refresh(void) { scr_display(scr_current); } diff --git a/src/screen.h b/src/screen.h index 0d3e268..af95690 100644 --- a/src/screen.h +++ b/src/screen.h @@ -7,9 +7,9 @@ #define SCR_UNUSED 0 #define SCR_INACTIVE 1 -#define SCR_ACTIVE 2 -#define SCR_HILITE 3 -#define SCR_OTHER 4 +#define SCR_OTHER 2 +#define SCR_ACTIVE 3 +#define SCR_HILITE 4 #define SCR_SERVER 0 #define SCR_PRIV 1 @@ -102,8 +102,6 @@ void scr_print_priv(const char *text); will have to call this. */ void scr_activate(char s); -void scr_hilite_active(void); - char *scr_get_cur_name(void); /* XXX: this really should be in a utils.c or common.c... */ @@ -1,17 +1,3 @@ ;; Call SIO - .export _siov - .export _rtclr - .export _cold_start - -_siov: JSR $E459 - RTS - -_rtclr: LDA #$00 - STA $12 - STA $13 - STA $14 - RTS - -_cold_start: - JMP $E477 + _siov = $e459 |
