mirror of
https://github.com/ksherlock/marlene.git
synced 2024-09-28 20:54:33 +00:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4da75367c1 | ||
|
d77291a0c0 | ||
|
d3addc3050 | ||
|
2079d4b442 | ||
|
58ab674589 | ||
|
5c0764e5b9 | ||
|
58e63dc252 |
@ -19,7 +19,7 @@ marlene: $(MARLENE_OBJS) $(COMMON_OBJS)
|
|||||||
|
|
||||||
darlene: $(DARLENE_OBJS) $(COMMON_OBJS)
|
darlene: $(DARLENE_OBJS) $(COMMON_OBJS)
|
||||||
$(CC) -lutil -o $@ $^
|
$(CC) -lutil -o $@ $^
|
||||||
iix chtyp -a 0xdc00 $@
|
# iix chtyp -a 0xdc00 $@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
137
ansi.asm
137
ansi.asm
@ -1,8 +1,14 @@
|
|||||||
case on
|
case on
|
||||||
|
mcopy ansi.mac
|
||||||
|
|
||||||
dummy start
|
dummy start
|
||||||
end
|
end
|
||||||
|
|
||||||
|
RDMAINRAM gequ $E0C002 ; Read from main memory
|
||||||
|
RDCARDRAM gequ $E0C003 ; Read from auxiliary memory
|
||||||
|
WRMAINRAM gequ $E0C004 ; Write to main memory
|
||||||
|
WRCARDRAM gequ $E0C005 ; Write to auxiliary memory
|
||||||
|
|
||||||
tables privdata
|
tables privdata
|
||||||
|
|
||||||
;
|
;
|
||||||
@ -641,6 +647,137 @@ exit anop
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
; FillChar(char, andMask, xorMask)
|
||||||
|
gen on
|
||||||
|
FillChar START
|
||||||
|
|
||||||
|
using tables
|
||||||
|
|
||||||
|
subroutine (2:char,2:andMask,2:xorMask),(16:cdata)
|
||||||
|
|
||||||
|
xx equ andMask
|
||||||
|
yy equ xorMask
|
||||||
|
|
||||||
|
lda <char
|
||||||
|
cmp #$7f
|
||||||
|
bcs space
|
||||||
|
sec
|
||||||
|
sbc #$20
|
||||||
|
bmi space
|
||||||
|
asl a ; x2
|
||||||
|
asl a ; x4
|
||||||
|
asl a ; x8
|
||||||
|
asl a ; x16
|
||||||
|
tax
|
||||||
|
bra ok
|
||||||
|
|
||||||
|
|
||||||
|
space anop
|
||||||
|
ldx #0 ; char
|
||||||
|
|
||||||
|
ok anop
|
||||||
|
|
||||||
|
; pre-calc the char mask to data.
|
||||||
|
|
||||||
|
lda CHAR_SPACE,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata
|
||||||
|
|
||||||
|
lda CHAR_SPACE+2,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata+2
|
||||||
|
|
||||||
|
lda CHAR_SPACE+4,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata+4
|
||||||
|
|
||||||
|
lda CHAR_SPACE+6,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata+6
|
||||||
|
|
||||||
|
lda CHAR_SPACE+8,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata+8
|
||||||
|
|
||||||
|
lda CHAR_SPACE+10,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata+10
|
||||||
|
|
||||||
|
lda CHAR_SPACE+12,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata+12
|
||||||
|
|
||||||
|
lda CHAR_SPACE+14,x
|
||||||
|
eor <xorMask
|
||||||
|
and <andMask
|
||||||
|
sta cdata+14
|
||||||
|
|
||||||
|
|
||||||
|
pea $e1e1
|
||||||
|
plb
|
||||||
|
plb
|
||||||
|
|
||||||
|
|
||||||
|
lda #24
|
||||||
|
sta yy
|
||||||
|
|
||||||
|
ldx #0*8*160+4*160+$2000
|
||||||
|
yloop anop
|
||||||
|
|
||||||
|
lda cdata+0
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
lda cdata+2
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
lda cdata+4
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
lda cdata+6
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
lda cdata+8
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
lda cdata+10
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
lda cdata+12
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
lda cdata+14
|
||||||
|
jsr one_line
|
||||||
|
|
||||||
|
dec yy
|
||||||
|
bne yloop
|
||||||
|
|
||||||
|
exit anop
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
one_line private
|
||||||
|
; a = character data
|
||||||
|
; x = memory address
|
||||||
|
|
||||||
|
ldy #80
|
||||||
|
loop anop
|
||||||
|
sta |$0000,x
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
dey
|
||||||
|
bne loop
|
||||||
|
rts
|
||||||
|
end
|
||||||
|
|
||||||
HideCursor start
|
HideCursor start
|
||||||
using cursor_data
|
using cursor_data
|
||||||
|
|
||||||
|
245
ansi.mac
Normal file
245
ansi.mac
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
macro
|
||||||
|
&l _ldy &r
|
||||||
|
&l anop
|
||||||
|
aif "&r"="@a",.a
|
||||||
|
aif "&r"="@x",.x
|
||||||
|
aif "&r"="@y",.y
|
||||||
|
ldy &r
|
||||||
|
ago .y
|
||||||
|
.a
|
||||||
|
tay
|
||||||
|
ago .y
|
||||||
|
.x
|
||||||
|
txy
|
||||||
|
ago .y
|
||||||
|
.y
|
||||||
|
mend
|
||||||
|
macro
|
||||||
|
&l subroutine &parms,&locals
|
||||||
|
&l anop
|
||||||
|
gbla &totallen
|
||||||
|
gbla &worklen
|
||||||
|
gbla &returnlen
|
||||||
|
&worklen seta 0
|
||||||
|
&totallen seta 0
|
||||||
|
&returnlen seta 4
|
||||||
|
lclc &len
|
||||||
|
lclc &p
|
||||||
|
lcla &i
|
||||||
|
|
||||||
|
phb
|
||||||
|
|
||||||
|
aif c:&locals=0,.doparms
|
||||||
|
.dolocals
|
||||||
|
&i seta 1
|
||||||
|
.bb
|
||||||
|
&p setc &locals(&i)
|
||||||
|
&len amid &p,2,1
|
||||||
|
aif "&len"=":",.cc
|
||||||
|
&len amid &p,1,2
|
||||||
|
&p amid &p,4,l:&p-3
|
||||||
|
ago .dd
|
||||||
|
.cc
|
||||||
|
&len amid &p,1,1
|
||||||
|
&p amid &p,3,l:&p-2
|
||||||
|
.dd
|
||||||
|
&p equ &worklen+1
|
||||||
|
&worklen seta &worklen+&len
|
||||||
|
&i seta &i+1
|
||||||
|
aif &i<=c:&locals,^bb
|
||||||
|
.doparms
|
||||||
|
|
||||||
|
aif c:&parms=0,.e
|
||||||
|
&i seta 1
|
||||||
|
.b
|
||||||
|
&p setc &parms(&i)
|
||||||
|
&len amid &p,2,1
|
||||||
|
aif "&len"=":",.c
|
||||||
|
&len amid &p,1,2
|
||||||
|
&p amid &p,4,l:&p-3
|
||||||
|
ago .d
|
||||||
|
.c
|
||||||
|
&len amid &p,1,1
|
||||||
|
&p amid &p,3,l:&p-2
|
||||||
|
.d
|
||||||
|
&p equ &totallen+&returnlen+1+&worklen
|
||||||
|
&totallen seta &totallen+&len
|
||||||
|
&i seta &i+1
|
||||||
|
aif &i<=c:&parms,^b
|
||||||
|
.e
|
||||||
|
tsc
|
||||||
|
aif &worklen=0,.f
|
||||||
|
sec
|
||||||
|
sbc #&worklen
|
||||||
|
tcs
|
||||||
|
.f
|
||||||
|
phd
|
||||||
|
tcd
|
||||||
|
mend
|
||||||
|
|
||||||
|
|
||||||
|
macro
|
||||||
|
&l lsubroutine &parms,&locals
|
||||||
|
&l anop
|
||||||
|
gbla &totallen
|
||||||
|
gbla &worklen
|
||||||
|
gbla &returnlen
|
||||||
|
&worklen seta 0
|
||||||
|
&totallen seta 0
|
||||||
|
&returnlen seta 2
|
||||||
|
lclc &len
|
||||||
|
lclc &p
|
||||||
|
lcla &i
|
||||||
|
|
||||||
|
aif c:&locals=0,.doparms
|
||||||
|
.dolocals
|
||||||
|
&i seta 1
|
||||||
|
.bb
|
||||||
|
&p setc &locals(&i)
|
||||||
|
&len amid &p,2,1
|
||||||
|
aif "&len"=":",.cc
|
||||||
|
&len amid &p,1,2
|
||||||
|
&p amid &p,4,l:&p-3
|
||||||
|
ago .dd
|
||||||
|
.cc
|
||||||
|
&len amid &p,1,1
|
||||||
|
&p amid &p,3,l:&p-2
|
||||||
|
.dd
|
||||||
|
&p equ &worklen+1
|
||||||
|
&worklen seta &worklen+&len
|
||||||
|
&i seta &i+1
|
||||||
|
aif &i<=c:&locals,^bb
|
||||||
|
.doparms
|
||||||
|
aif c:&parms=0,.e
|
||||||
|
&i seta 1
|
||||||
|
.b
|
||||||
|
&p setc &parms(&i)
|
||||||
|
&len amid &p,2,1
|
||||||
|
aif "&len"=":",.c
|
||||||
|
&len amid &p,1,2
|
||||||
|
&p amid &p,4,l:&p-3
|
||||||
|
ago .d
|
||||||
|
.c
|
||||||
|
&len amid &p,1,1
|
||||||
|
&p amid &p,3,l:&p-2
|
||||||
|
.d
|
||||||
|
&p equ &totallen+&return+1+&worklen
|
||||||
|
&totallen seta &totallen+&len
|
||||||
|
&i seta &i+1
|
||||||
|
aif &i<=c:&parms,^b
|
||||||
|
.e
|
||||||
|
tsc
|
||||||
|
aif &worklen=0,.f
|
||||||
|
sec
|
||||||
|
sbc #&worklen
|
||||||
|
tcs
|
||||||
|
.f
|
||||||
|
phd
|
||||||
|
tcd
|
||||||
|
mend
|
||||||
|
|
||||||
|
macro
|
||||||
|
&l return &r
|
||||||
|
&l anop
|
||||||
|
lclc &len
|
||||||
|
aif c:&r,.a
|
||||||
|
lclc &r
|
||||||
|
&r setc 0
|
||||||
|
&len setc 0
|
||||||
|
ago .h
|
||||||
|
.a
|
||||||
|
&len amid &r,2,1
|
||||||
|
aif "&len"=":",.b
|
||||||
|
&len amid &r,1,2
|
||||||
|
&r amid &r,4,l:&r-3
|
||||||
|
ago .c
|
||||||
|
.b
|
||||||
|
&len amid &r,1,1
|
||||||
|
&r amid &r,3,l:&r-2
|
||||||
|
.c
|
||||||
|
aif &len<>2,.d
|
||||||
|
_ldy &r
|
||||||
|
ago .h
|
||||||
|
.d
|
||||||
|
aif &len<>4,.e
|
||||||
|
ldx &r+2
|
||||||
|
ldy &r
|
||||||
|
ago .h
|
||||||
|
.e
|
||||||
|
aif &len<>10,.g
|
||||||
|
ldy #&r
|
||||||
|
ldx #^&r
|
||||||
|
ago .h
|
||||||
|
.g
|
||||||
|
mnote 'Not a valid return length',16
|
||||||
|
mexit
|
||||||
|
.h
|
||||||
|
aif &totallen=0,.i
|
||||||
|
lda &worklen+3
|
||||||
|
sta &worklen+&totallen+3
|
||||||
|
lda &worklen+1
|
||||||
|
sta &worklen+&totallen+1
|
||||||
|
.i
|
||||||
|
pld
|
||||||
|
tsc
|
||||||
|
clc
|
||||||
|
adc #&worklen+&totallen
|
||||||
|
tcs
|
||||||
|
aif &len=0,.j
|
||||||
|
tya
|
||||||
|
.j
|
||||||
|
plb
|
||||||
|
rtl
|
||||||
|
mend
|
||||||
|
|
||||||
|
macro
|
||||||
|
&l lreturn &r
|
||||||
|
&l anop
|
||||||
|
lclc &len
|
||||||
|
aif c:&r,.a
|
||||||
|
lclc &r
|
||||||
|
&r setc 0
|
||||||
|
&len setc 0
|
||||||
|
ago .h
|
||||||
|
.a
|
||||||
|
&len amid &r,2,1
|
||||||
|
aif "&len"=":",.b
|
||||||
|
&len amid &r,1,2
|
||||||
|
&r amid &r,4,l:&r-3
|
||||||
|
ago .c
|
||||||
|
.b
|
||||||
|
&len amid &r,1,1
|
||||||
|
&r amid &r,3,l:&r-2
|
||||||
|
.c
|
||||||
|
aif &len<>2,.d
|
||||||
|
_ldy &r
|
||||||
|
ago .h
|
||||||
|
.d
|
||||||
|
aif &len<>4,.e
|
||||||
|
ldx &r+2
|
||||||
|
ldy &r
|
||||||
|
ago .h
|
||||||
|
.e
|
||||||
|
aif &len<>10,.g
|
||||||
|
ldy #&r
|
||||||
|
ldx #^&r
|
||||||
|
ago .h
|
||||||
|
.g
|
||||||
|
mnote 'Not a valid return length',16
|
||||||
|
mexit
|
||||||
|
.h
|
||||||
|
aif &totallen=0,.i
|
||||||
|
lda &worklen+1
|
||||||
|
sta &worklen+&totallen+1
|
||||||
|
.i
|
||||||
|
pld
|
||||||
|
tsc
|
||||||
|
clc
|
||||||
|
adc #&worklen+&totallen
|
||||||
|
tcs
|
||||||
|
aif &len=0,.j
|
||||||
|
tya
|
||||||
|
.j
|
||||||
|
rts
|
||||||
|
mend
|
||||||
|
|
26
darlene.c
26
darlene.c
@ -25,9 +25,7 @@
|
|||||||
#include <gno/gno.h>
|
#include <gno/gno.h>
|
||||||
#include <gno/kerntool.h>
|
#include <gno/kerntool.h>
|
||||||
|
|
||||||
extern void vt100_init(void);
|
#include "vt100.h"
|
||||||
extern void vt100_process(const unsigned char *buffer, unsigned buffer_size);
|
|
||||||
extern void vt100_event(EventRecord *event);
|
|
||||||
|
|
||||||
extern void screen_init(void);
|
extern void screen_init(void);
|
||||||
extern void screen_on(void);
|
extern void screen_on(void);
|
||||||
@ -182,7 +180,7 @@ int main(int argc, char **argv) {
|
|||||||
int pid;
|
int pid;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
Word MyID;
|
Word MyID;
|
||||||
|
unsigned vt100_flags = vtDEFAULT;
|
||||||
Handle dpHandle = NULL;
|
Handle dpHandle = NULL;
|
||||||
Handle shrHandle = NULL;
|
Handle shrHandle = NULL;
|
||||||
Handle shdHandle = NULL;
|
Handle shdHandle = NULL;
|
||||||
@ -194,17 +192,24 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isatty(STDIN_FILENO)) {
|
||||||
|
ErrWriteCString("stdin required.\r\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
term_var.value = "\x05\x00vt100";
|
term_var.value = "\x05\x00vt100";
|
||||||
child_argv = NULL;
|
child_argv = NULL;
|
||||||
for (i = 1; i < argc; ++i) {
|
for (i = 1; i < argc; ++i) {
|
||||||
char *cp = argv[i];
|
char *cp = argv[i];
|
||||||
if (cp[0] != '-') break;
|
if (cp[0] != '-') break;
|
||||||
if (strcmp(cp, "--vt52") == 0) {
|
if (strcmp(cp, "--") == 0) {
|
||||||
|
break;
|
||||||
|
} else if (strcmp(cp, "--vt52") == 0) {
|
||||||
term_var.value = "\x04\x00vt52";
|
term_var.value = "\x04\x00vt52";
|
||||||
|
vt100_flags &= ~vtDECANM;
|
||||||
} else if (strcmp(cp, "--vt100") == 0) {
|
} else if (strcmp(cp, "--vt100") == 0) {
|
||||||
term_var.value = "\x05\x00vt100";
|
term_var.value = "\x05\x00vt100";
|
||||||
} else if (strcmp(cp,"--") == 0) {
|
vt100_flags |= vtDECANM;
|
||||||
break;
|
|
||||||
} else {
|
} else {
|
||||||
ErrWriteCString("Unknown option: ");
|
ErrWriteCString("Unknown option: ");
|
||||||
ErrWriteCString(cp);
|
ErrWriteCString(cp);
|
||||||
@ -251,7 +256,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
screen_init();
|
screen_init();
|
||||||
|
|
||||||
vt100_init();
|
vt100_init(vt100_flags);
|
||||||
|
|
||||||
signal(SIGCHLD,sigchild);
|
signal(SIGCHLD,sigchild);
|
||||||
pid = forkpty2(&master, NULL, NULL, NULL);
|
pid = forkpty2(&master, NULL, NULL, NULL);
|
||||||
@ -260,6 +265,11 @@ int main(int argc, char **argv) {
|
|||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* reset the controlling terminal, which was clobbered by opening a pty */
|
||||||
|
/* standard TIOCSCTTY causes ORCA/C shift errors */
|
||||||
|
#undef TIOCSCTTY
|
||||||
|
#define TIOCSCTTY (0x20000000ul | ('t' << 8) | 97)
|
||||||
|
ioctl(STDIN_FILENO, TIOCSCTTY, (void *)0);
|
||||||
|
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
17
marlene.c
17
marlene.c
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#include "telnet.h"
|
#include "telnet.h"
|
||||||
#include "marinetti.h"
|
#include "marinetti.h"
|
||||||
|
#include "vt100.h"
|
||||||
|
|
||||||
void display_pstr(const char *);
|
void display_pstr(const char *);
|
||||||
void display_cstr(const char *);
|
void display_cstr(const char *);
|
||||||
@ -31,9 +31,6 @@ void display_err(Word);
|
|||||||
extern void telnet_init(void);
|
extern void telnet_init(void);
|
||||||
extern void telnet_process(void);
|
extern void telnet_process(void);
|
||||||
|
|
||||||
extern void vt100_init(void);
|
|
||||||
extern void vt100_process(const unsigned char *buffer, unsigned buffer_size);
|
|
||||||
extern void vt100_event(EventRecord *event);
|
|
||||||
|
|
||||||
extern void screen_init(void);
|
extern void screen_init(void);
|
||||||
extern void screen_on(void);
|
extern void screen_on(void);
|
||||||
@ -113,7 +110,7 @@ int main(int argc, char **argv) {
|
|||||||
int mf = 0;
|
int mf = 0;
|
||||||
Word MyID;
|
Word MyID;
|
||||||
Word __gno;
|
Word __gno;
|
||||||
|
unsigned vt100_flags = vtDEFAULT;
|
||||||
|
|
||||||
__gno = false;
|
__gno = false;
|
||||||
ipid = -1;
|
ipid = -1;
|
||||||
@ -131,10 +128,12 @@ int main(int argc, char **argv) {
|
|||||||
for (i = 1; i < argc; ++i) {
|
for (i = 1; i < argc; ++i) {
|
||||||
char *cp = argv[i];
|
char *cp = argv[i];
|
||||||
if (cp[0] != '-') break;
|
if (cp[0] != '-') break;
|
||||||
if (strcmp(cp, "--vt52") == 0) {
|
if (strcmp(cp, "--") == 0) {
|
||||||
|
break;
|
||||||
|
} else if (strcmp(cp, "--vt52") == 0) {
|
||||||
|
vt100_flags &= ~vtDECANM;
|
||||||
} else if (strcmp(cp, "--vt100") == 0) {
|
} else if (strcmp(cp, "--vt100") == 0) {
|
||||||
|
vt100_flags |= vtDECANM;
|
||||||
} else {
|
} else {
|
||||||
ErrWriteCString("Unknown option: ");
|
ErrWriteCString("Unknown option: ");
|
||||||
ErrWriteCString(cp);
|
ErrWriteCString(cp);
|
||||||
@ -177,7 +176,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
screen_init();
|
screen_init();
|
||||||
|
|
||||||
vt100_init();
|
vt100_init(vt100_flags);
|
||||||
|
|
||||||
mf = StartUpTCP(printCallBack);
|
mf = StartUpTCP(printCallBack);
|
||||||
if (mf < 0) {
|
if (mf < 0) {
|
||||||
|
10
telnet.c
10
telnet.c
@ -108,12 +108,16 @@ void telnet_process(void) {
|
|||||||
IAC, SE
|
IAC, SE
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned char telopt_ttype[] = {
|
static unsigned char telopt_ttype_vt100[] = {
|
||||||
IAC, SB, TELOPT_TTYPE, TELQUAL_IS,
|
IAC, SB, TELOPT_TTYPE, TELQUAL_IS,
|
||||||
'V', 'T', '1', '0', '0',
|
'V', 'T', '1', '0', '0',
|
||||||
IAC, SE
|
IAC, SE
|
||||||
};
|
};
|
||||||
|
static unsigned char telopt_ttype_vt52[] = {
|
||||||
|
IAC, SB, TELOPT_TTYPE, TELQUAL_IS,
|
||||||
|
'V', 'T', '5', '2',
|
||||||
|
IAC, SE
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* don't need to process if no state, no IACs in buffer */
|
/* don't need to process if no state, no IACs in buffer */
|
||||||
@ -186,7 +190,7 @@ void telnet_process(void) {
|
|||||||
send(telopt_tspeed, sizeof(telopt_tspeed));
|
send(telopt_tspeed, sizeof(telopt_tspeed));
|
||||||
break;
|
break;
|
||||||
case TELOPT_TTYPE:
|
case TELOPT_TTYPE:
|
||||||
send(telopt_ttype, sizeof(telopt_ttype));
|
send(telopt_ttype_vt100, sizeof(telopt_ttype_vt100));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
111
vt100.c
111
vt100.c
@ -2,11 +2,12 @@
|
|||||||
* This handles vt100 commands.
|
* This handles vt100 commands.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma noroot
|
|
||||||
|
|
||||||
#include <Event.h>
|
#include <Event.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "vt100.h"
|
||||||
|
|
||||||
#define ESC "\x1b"
|
#define ESC "\x1b"
|
||||||
#define send_str(x) send((const unsigned char *)x, sizeof(x)-1)
|
#define send_str(x) send((const unsigned char *)x, sizeof(x)-1)
|
||||||
|
|
||||||
@ -20,6 +21,7 @@ extern unsigned buffer_size;
|
|||||||
extern void ReverseScrollRegion(unsigned, unsigned);
|
extern void ReverseScrollRegion(unsigned, unsigned);
|
||||||
extern void ScrollRegion(unsigned, unsigned);
|
extern void ScrollRegion(unsigned, unsigned);
|
||||||
extern void PrintChar(unsigned x, unsigned y, unsigned the_char, unsigned andMask, unsigned eorMask);
|
extern void PrintChar(unsigned x, unsigned y, unsigned the_char, unsigned andMask, unsigned eorMask);
|
||||||
|
extern void FillChar(unsigned the_char, unsigned andMask, unsigned eorMask);
|
||||||
|
|
||||||
extern void ClearScreen(void);
|
extern void ClearScreen(void);
|
||||||
extern void ClearScreen2(unsigned start, unsigned end);
|
extern void ClearScreen2(unsigned start, unsigned end);
|
||||||
@ -63,8 +65,11 @@ static unsigned parm_count;
|
|||||||
static unsigned private;
|
static unsigned private;
|
||||||
static unsigned state;
|
static unsigned state;
|
||||||
|
|
||||||
void vt100_init(void)
|
static unsigned initial_state = vtDEFAULT;
|
||||||
|
|
||||||
|
void vt100_init(unsigned flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
__x = 0;
|
__x = 0;
|
||||||
__y = 0;
|
__y = 0;
|
||||||
saved_cursor[0] = 0;
|
saved_cursor[0] = 0;
|
||||||
@ -74,20 +79,32 @@ void vt100_init(void)
|
|||||||
and_mask = 0xffff;
|
and_mask = 0xffff;
|
||||||
xor_mask = 0x0000;
|
xor_mask = 0x0000;
|
||||||
|
|
||||||
DECANM = 1;
|
initial_state = flags;
|
||||||
DECAWM = 1;
|
if (flags == -1) {
|
||||||
DECCKM = 0;
|
DECANM = 1;
|
||||||
DECKPAM = 0;
|
DECAWM = 1;
|
||||||
DECCOLM = 80;
|
DECCKM = 0;
|
||||||
DECOM = 0;
|
DECKPAM = 0;
|
||||||
DECSCNM = 0;
|
DECCOLM = 80;
|
||||||
LNM = 0;
|
DECOM = 0;
|
||||||
|
DECSCNM = 0;
|
||||||
|
LNM = 0;
|
||||||
|
} else {
|
||||||
|
DECANM = flags & vtDECANM;
|
||||||
|
DECAWM = flags & vtDECAWM;
|
||||||
|
DECCKM = flags & vtDECCKM;
|
||||||
|
DECKPAM = flags & vtDECKPAM;
|
||||||
|
DECCOLM = flags & vtDECCOLM ? 132 : 80;
|
||||||
|
DECOM = flags & vtDECOM;
|
||||||
|
DECSCNM = flags & vtDECSCNM;
|
||||||
|
LNM = flags & vtLNM;
|
||||||
|
}
|
||||||
|
|
||||||
tabs[0] = 0x8080;
|
tabs[0] = 0x0100;
|
||||||
tabs[1] = 0x8080;
|
tabs[1] = 0x0101;
|
||||||
tabs[2] = 0x8080;
|
tabs[2] = 0x0101;
|
||||||
tabs[3] = 0x8080;
|
tabs[3] = 0x0101;
|
||||||
tabs[4] = 0x0080;
|
tabs[4] = 0x0101;
|
||||||
|
|
||||||
parms[0] = 0;
|
parms[0] = 0;
|
||||||
parm_count = 0;
|
parm_count = 0;
|
||||||
@ -170,15 +187,15 @@ static void cursor_position(void) {
|
|||||||
if (y) --y;
|
if (y) --y;
|
||||||
if (x) --x;
|
if (x) --x;
|
||||||
|
|
||||||
__x = x;
|
|
||||||
if (x >= 80) x = 79;
|
if (x >= 80) x = 79;
|
||||||
if (DECOM) {
|
if (DECOM) {
|
||||||
__y = window[0] + y;
|
y = window[0] + y;
|
||||||
if (__y > window[1]) __y = window[1];
|
if (y > window[1]) y = window[1];
|
||||||
} else {
|
} else {
|
||||||
__y = y;
|
if (y >= 24) y = 23;
|
||||||
if (__y >= 24) __y = 23;
|
|
||||||
}
|
}
|
||||||
|
__x = x;
|
||||||
|
__y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cursor_position_vt52(void) {
|
static void cursor_position_vt52(void) {
|
||||||
@ -338,7 +355,7 @@ static void clear_tabs(void) {
|
|||||||
tabs[chunk] &= ~mask;
|
tabs[chunk] &= ~mask;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 3:
|
||||||
tabs[0] = 0;
|
tabs[0] = 0;
|
||||||
tabs[1] = 0;
|
tabs[1] = 0;
|
||||||
tabs[2] = 0;
|
tabs[2] = 0;
|
||||||
@ -521,7 +538,7 @@ void vt100_process(const unsigned char *buffer, unsigned buffer_size) {
|
|||||||
case '8': restore_cursor(); break;
|
case '8': restore_cursor(); break;
|
||||||
case '=': DECKPAM = 1; break;
|
case '=': DECKPAM = 1; break;
|
||||||
case '>': DECKPAM = 0; break;
|
case '>': DECKPAM = 0; break;
|
||||||
case 'c': vt100_init(); ClearScreen(); break;
|
case 'c': vt100_init(initial_state); ClearScreen(); break;
|
||||||
case '1': case '2': /* vt105 graphic stuff */ break;
|
case '1': case '2': /* vt105 graphic stuff */ break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -531,6 +548,9 @@ void vt100_process(const unsigned char *buffer, unsigned buffer_size) {
|
|||||||
|
|
||||||
case st_pound:
|
case st_pound:
|
||||||
/* #8 -> fill with Es */
|
/* #8 -> fill with Es */
|
||||||
|
if (c == '8') {
|
||||||
|
FillChar('E', 0xffff, 0x0000);
|
||||||
|
}
|
||||||
state = st_text; break;
|
state = st_text; break;
|
||||||
case st_lparen:
|
case st_lparen:
|
||||||
case st_rparen:
|
case st_rparen:
|
||||||
@ -548,6 +568,12 @@ void vt100_process(const unsigned char *buffer, unsigned buffer_size) {
|
|||||||
state = st_parm;
|
state = st_parm;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (c == ';') {
|
||||||
|
++parm_count;
|
||||||
|
parms[parm_count] = 0;
|
||||||
|
state = st_parm;
|
||||||
|
break;
|
||||||
|
}
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case st_lbracket2:
|
case st_lbracket2:
|
||||||
lbracket2:
|
lbracket2:
|
||||||
@ -623,6 +649,39 @@ void vt100_process(const unsigned char *buffer, unsigned buffer_size) {
|
|||||||
ShowCursor(__x, __y);
|
ShowCursor(__x, __y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* adb codes for extended keys. passed as-is with keypad bit set */
|
||||||
|
/* nb - kegs gobbles up fkeys for his own use */
|
||||||
|
enum {
|
||||||
|
kVK_F17 = 0x40,
|
||||||
|
kVK_VolumeUp = 0x48,
|
||||||
|
kVK_VolumeDown = 0x49,
|
||||||
|
kVK_Mute = 0x4A,
|
||||||
|
kVK_F18 = 0x4F,
|
||||||
|
kVK_F19 = 0x50,
|
||||||
|
kVK_F20 = 0x5A,
|
||||||
|
kVK_F5 = 0x60,
|
||||||
|
kVK_F6 = 0x61,
|
||||||
|
kVK_F7 = 0x62,
|
||||||
|
kVK_F3 = 0x63,
|
||||||
|
kVK_F8 = 0x64,
|
||||||
|
kVK_F9 = 0x65,
|
||||||
|
kVK_F11 = 0x67,
|
||||||
|
kVK_F13 = 0x69,
|
||||||
|
kVK_F16 = 0x6A,
|
||||||
|
kVK_F14 = 0x6B,
|
||||||
|
kVK_F10 = 0x6D,
|
||||||
|
kVK_F12 = 0x6F,
|
||||||
|
kVK_F15 = 0x71,
|
||||||
|
kVK_Help = 0x72,
|
||||||
|
kVK_Home = 0x73,
|
||||||
|
kVK_PageUp = 0x74,
|
||||||
|
kVK_ForwardDelete = 0x75,
|
||||||
|
kVK_F4 = 0x76,
|
||||||
|
kVK_End = 0x77,
|
||||||
|
kVK_F2 = 0x78,
|
||||||
|
kVK_PageDown = 0x79,
|
||||||
|
kVK_F1 = 0x7A
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// remap the iigs key to a vt100 code (if necessary) and send it out.
|
// remap the iigs key to a vt100 code (if necessary) and send it out.
|
||||||
@ -698,22 +757,22 @@ void vt100_event(EventRecord *event) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case 0x7a: // f1
|
case kVK_F1: // f1
|
||||||
if (DECANM) { cp = ESC "OP"; len = 3; }
|
if (DECANM) { cp = ESC "OP"; len = 3; }
|
||||||
else { cp = ESC "P"; len = 2; }
|
else { cp = ESC "P"; len = 2; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x78: // f2
|
case kVK_F2: // f2
|
||||||
if (DECANM) { cp = ESC "OQ"; len = 3; }
|
if (DECANM) { cp = ESC "OQ"; len = 3; }
|
||||||
else { cp = ESC "Q"; len = 2; }
|
else { cp = ESC "Q"; len = 2; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x63: // f3
|
case kVK_F3: // f3
|
||||||
if (DECANM) { cp = ESC "OR"; len = 3; }
|
if (DECANM) { cp = ESC "OR"; len = 3; }
|
||||||
else { cp = ESC "R"; len = 2; }
|
else { cp = ESC "R"; len = 2; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x76: // f4
|
case kVK_F4: // f4
|
||||||
if (DECANM) { cp = ESC "OS"; len = 3; }
|
if (DECANM) { cp = ESC "OS"; len = 3; }
|
||||||
else { cp = ESC "S"; len = 2; }
|
else { cp = ESC "S"; len = 2; }
|
||||||
break;
|
break;
|
||||||
|
11
vt100.gsh
Normal file
11
vt100.gsh
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#
|
||||||
|
#
|
||||||
|
# some settings so gsh works better with vt100.
|
||||||
|
# source vt100.gsh
|
||||||
|
#
|
||||||
|
set term=vt100
|
||||||
|
bindkey backward-delete-char "^H"
|
||||||
|
bindkey up-history "^[[A"
|
||||||
|
bindkey down-history "^[[B"
|
||||||
|
bindkey forward-char "^[[C"
|
||||||
|
bindkey backward-char "^[[D"
|
20
vt100.h
Normal file
20
vt100.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef vt100_h
|
||||||
|
#define vt100_h
|
||||||
|
|
||||||
|
enum {
|
||||||
|
vtDECCKM = 1 << 1, /* Cursor key */
|
||||||
|
vtDECANM = 1 << 2, /* ANSI/VT52 */
|
||||||
|
vtDECCOLM = 1 << 3, /* Column */
|
||||||
|
vtDECSCNM = 1 << 4, /* Screen */
|
||||||
|
vtDECOM = 1 << 6, /* Origin */
|
||||||
|
vtDECAWM = 1 << 7, /* Auto wrap */
|
||||||
|
vtDECKPAM = 1 << 8, /* Keypad Application Mode */
|
||||||
|
vtLNM = 1 << 9, /* Line Feed/New Line Mode */
|
||||||
|
vtDEFAULT = vtDECANM | vtDECAWM,
|
||||||
|
};
|
||||||
|
|
||||||
|
void vt100_init(unsigned flags);
|
||||||
|
extern void vt100_process(const unsigned char *buffer, unsigned buffer_size);
|
||||||
|
extern void vt100_event(struct EventRecord *event);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user