koreth@ssyx.ucsc.edu (Steven Grimm) (09/27/88)
Submitted-by: achowe@watmsg.waterloo.edu (Anthony C. Howe)
Posting-number: Volume 1, Issue 74
Archive-name: achlib/part01
#! /bin/sh
# This is a shell archive. Remove anything before the "#! /bin/sh" line,
# then unpack it by saving it in a file and typing "sh file."
#
# Wrapped by Steven Grimm (koreth) at ssyx on Mon Sep 26 21:23:57 1988
#
# unpacks with default permissions
#
# Contents : ACHACC.S ACHAPP.S ACHSLIB.H ACHSLIB.S LIST.C MAKEFILE
# MEMORY.C MTEST.C MTEST.LNK README RUNTIME.H
#
if `test ! -s ACHACC.S`
then
echo "x - ACHACC.S"
cat > ACHACC.S << '@\Rogue\Monster\'
;*** achacc.s
;
; 871124
;*** Long Stack Space
STACK = $200
;*** Accessory Start
.text
.extern _main
.even
move.l #U_STACK, sp
jsr _main
move.w #0, (sp)
trap #1
;*** Save Menu Line
.text
_MENUSAV::
movea.l _scrloc, a0
lea MENULINE, a1
move.w #$1e0, d0
.1:
move.l (a0)+, (a1)+
dbf d0, .1
rts
.bss
.even
MENULINE: .ds.l $1f0
;*** Restore menu line
.text
_MENURES::
movea.l _scrloc, a0
lea MENULINE, a1
move.w #$1e0, d0
.1:
move.l (a1)+, (a0)+
dbf d0, .1
rts
;*** AES Call
;
; e long pointer to AES parameter block
.text
_crystal::
move.l 4(sp), d1
move.w #200, d0
trap #2
rts
.bss
.even
retsav: .ds.l 1
.ds.l STACK
U_STACK: .ds.l 1
;*** Control Array Settings
;
;
; This .data is used to set entrys 1, 2 and 3 in the control
; array.
.data
.even
_ctrl_cnts::
; Application Manager
.dc.b 0, 1, 0 ; func 010
.dc.b 2, 1, 1 ; func 011
.dc.b 2, 1, 1 ; func 012
.dc.b 0, 1, 1 ; func 013
.dc.b 2, 1, 1 ; func 014
.dc.b 1, 1, 1 ; func 015
.dc.b 0, 0, 0 ; func 016
.dc.b 0, 0, 0 ; func 017
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 1, 0 ; func 019
; Event Manager
.dc.b 0, 1, 0 ; func 020
.dc.b 3, 5, 0 ; func 021
.dc.b 5, 5, 0 ; func 022
.dc.b 0, 1, 1 ; func 023
.dc.b 2, 1, 0 ; func 024
.dc.b 16, 7, 1 ; func 025
.dc.b 2, 1, 0 ; func 026
.dc.b 0, 0, 0 ; func 027
.dc.b 0, 0, 0 ; func 028
.dc.b 0, 0, 0 ; func 009
; Menu Manager
.dc.b 1, 1, 1 ; func 030
.dc.b 2, 1, 1 ; func 031
.dc.b 2, 1, 1 ; func 032
.dc.b 2, 1, 1 ; func 033
.dc.b 1, 1, 2 ; func 034
.dc.b 1, 1, 1 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Object Manager
.dc.b 2, 1, 1 ; func 040
.dc.b 1, 1, 1 ; func 041
.dc.b 6, 1, 1 ; func 042
.dc.b 4, 1, 1 ; func 043
.dc.b 1, 3, 1 ; func 044
.dc.b 2, 1, 1 ; func 045
.dc.b 4, 2, 1 ; func 046
.dc.b 8, 1, 1 ; func 047
.dc.b 0, 0, 0 ; func 048
.dc.b 0, 0, 0 ; func 049
; Form Manager
.dc.b 1, 1, 1 ; func 050
.dc.b 9, 1, 1 ; func 051
.dc.b 1, 1, 1 ; func 002
.dc.b 1, 1, 0 ; func 003
.dc.b 0, 5, 1 ; func 004
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Dialog Manager
.dc.b 0, 0, 0 ; func 060
.dc.b 0, 0, 0 ; func 061
.dc.b 0, 0, 0 ; func 062
.dc.b 0, 0, 0 ; func 003
.dc.b 0, 0, 0 ; func 004
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Graphics Manager
.dc.b 4, 3, 0 ; func 070
.dc.b 8, 3, 0 ; func 071
.dc.b 6, 1, 0 ; func 072
.dc.b 8, 1, 0 ; func 073
.dc.b 8, 1, 0 ; func 074
.dc.b 4, 1, 1 ; func 075
.dc.b 3, 1, 1 ; func 076
.dc.b 0, 5, 0 ; func 077
.dc.b 1, 1, 1 ; func 078
.dc.b 0, 5, 0 ; func 009
; Scrap Manager
.dc.b 0, 1, 1 ; func 080
.dc.b 0, 1, 1 ; func 081
.dc.b 0, 0, 0 ; func 082
.dc.b 0, 0, 0 ; func 083
.dc.b 0, 0, 0 ; func 084
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; fseler Manager
.dc.b 0, 2, 2 ; func 090
.dc.b 0, 0, 0 ; func 091
.dc.b 0, 0, 0 ; func 092
.dc.b 0, 0, 0 ; func 003
.dc.b 0, 0, 0 ; func 004
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Window Manager
.dc.b 5, 1, 0 ; func 100
.dc.b 5, 1, 0 ; func 101
.dc.b 1, 1, 0 ; func 102
.dc.b 1, 1, 0 ; func 103
.dc.b 2, 5, 0 ; func 104
.dc.b 6, 1, 0 ; func 105
.dc.b 2, 1, 0 ; func 106
.dc.b 1, 1, 0 ; func 107
.dc.b 6, 5, 0 ; func 108
.dc.b 0, 0, 0 ; func 009
; Resource Manger
.dc.b 0, 1, 1 ; func 110
.dc.b 0, 1, 0 ; func 111
.dc.b 2, 1, 0 ; func 112
.dc.b 2, 1, 1 ; func 113
.dc.b 1, 1, 1 ; func 114
.dc.b 0, 0, 0 ; func 115
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Shell Manager
.dc.b 0, 1, 2 ; func 120
.dc.b 3, 1, 2 ; func 121
.dc.b 1, 1, 1 ; func 122
.dc.b 1, 1, 1 ; func 123
.dc.b 0, 1, 1 ; func 124
.dc.b 0, 1, 2 ; func 125
@\Rogue\Monster\
else
echo "shar: Will not over write ACHACC.S"
fi
if `test ! -s ACHAPP.S`
then
echo "x - ACHAPP.S"
cat > ACHAPP.S << '@\Rogue\Monster\'
;*** achstart.s
;
; 871121
;*** Stack & Heap Sizes
;
; The stack sits below the heap and has STACK long words
; allocated. The heap size (memory kept after a shrink)
; is set by EXTRA. _brk monitors heap space r= ests.
STACK = $200
EXTRA = $2500
;*** Basepage Structure
LOTPA = $00 ; Low TPA address
HITPA = $04 ; High TPA address
CODEBASE = $08 ; Code segment start
CODELEN = $0c ; Code segment length
DATABASE = $10 ; Data segment start
DATALEN = $14 ; Data segment length
BSSBASE = $18 ; Bss segment start
BSSLEN = $1c ; Bss segment length
DTA = $20 ; Disk Transfer Address
PARENT = $24 ; parent's basepage
RESERVE1 = $28 ; resevered
ENVIRON = $2c ; environment string
FCB2 = $38 ; 2nd parsed fcb
FCB1 = $5c ; 1st parsed fcb
COMMAND = $80 ; Command tail
.globl _FUBAR
;*** Start here
.text
.globl __main
.globl __exit
.globl __sovf
.even
_FUBAR:
move.l 4(sp),a5
move.l a5,__base
move.l #U_STACK,sp
move.l CODELEN(a5),d0
add.l DATALEN(a5),d0
add.l BSSLEN(a5),d0
add.l #EXTRA,d0
move.l d0,-(sp)
move.l a5,-(sp)
clr.w -(sp)
move #$4a,-(sp) ; do Mshrink
trap #1
add.l #12,sp
move.l __base,a0 ; Load C external
move.l BSSBASE(a0),a1 ; a1 -> .bss region
adda.l BSSLEN(a0),a1 ; a1 -> 1st heap loc
move.l a1,__break ; Put in "break" loc
lea.l COMMAND(a0),a2 ; a2 -> command line
move.b (a2)+,d0 ; d0 = byte count
andi.l #$ff,d0 ; clear junk
move.w d0,-(a7) ; push length
move.l a2,-(a7) ; Push commnd
clr.l a6 ; Clear frame pointer
jsr __main
jmp __exit
.globl _brk
;*** brk
.text
_brk:
move.l 4(sp),a0 ; new break r= est
move.l #-1,d0
move.l __base,a1 ; basepage address
move.l HITPA(a1),a1 ; get MAX break
cmpa.l a0,a1 ; return -1 if
ble.s BRKX ; r= est >= TOP
move.l a0,__break
clr.l d0
BRKX:
rts
__sovf:
move.w #9,d0 ; String print
lea ovf,a0 ; a0-> message
move.l a0,d1 ; load proper reg
trap #2 ; Issue message
__exit:
move.w #0,d0 ; Exit
trap #2
.globl _blkfill
;*** Block Fill function:
;
; blkfill (dest, char, count);
;
; e BYTE *dest
; BYTE char to fill
; WORD count
;
.text
_blkfill:
move.l 4(a7),a0 ; -> Output area
move.w 8(a7),d1 ; = output char
move.w 10(a7),d0 ; = output count
ext.l d0 ; make it long
subq.l #1,d0 ; decrement
ble.s filldone ; Done if le
fillit: move.b d1,(a0)+ ; move a byte
dbra d0,fillit ; Continue
filldone: clr.l d0 ; always return 0
rts
.globl _index
.globl _strchr
;*** Index function to find out if a particular
; character is in a string.
;
; e long pointer to string
; short character to find
;
; x D0.L = pointer to character else NULL if failed
.text
_index:
_strchr:
move.l 4(a7),a0 ; a0 -> String
move.w 8(a7),d0 ; D0 = desired character
xindex:
tst.b (a0) ; EOS?
bne.s notend ; No, continue to look
clr.l d0 ; Not found
rts
notend:
cmp.b (a0)+,d0 ; check for character
bne.s xindex
move.l a0,d0 ; Found it
subq.l #1,d0 ; set return pointer
rts
.globl ___pname
.globl ___tname
.globl ___lname
.globl ___xeof
;*** Runtime Data
.data
.even
ovf: .dc.b 'Stack Overflow$' ; Error message
___pname: .dc.b 'C runtime',0 ; Program name
___tname: .dc.b 'CON:',0 ; Console name
___lname: .dc.b 'LST:',0 ; List device name
___xeof: .dc.b $1a ; Control-Z
.globl __base
.globl __break
.globl ___cpmrv
;*** BSS Data
.bss
.even
__base: .ds.l 1 ; Base Page
__break: .ds.l 1 ; Break function
___cpmrv: .ds.w 1 ; Last CP/M return val
.ds.l STACK
U_STACK: .ds.l 1
.globl _crystal
;*** AES Call
;
; e long pointer to AES parameter block
.text
_crystal:
move.l 4(sp),d1
move.w #200,d0
trap #2
rts
.globl _control
;*** AES Arrays
;
; short control [] =
; {
; op code,
; size in words of _int_in,
; size in words of _int_out,
; size in longs of _addr_in,
; size in longs of _addr_out,
; }
.bss
.even
_control: .ds.w 4
.globl _ctrl_cnts
;*** Control Array Settings
;
;
; This .data is used to set entrys 1, 2 and 3 in the control
; array.
.data
.even
_ctrl_cnts:
; Application Manager
.dc.b 0, 1, 0 ; func 010
.dc.b 2, 1, 1 ; func 011
.dc.b 2, 1, 1 ; func 012
.dc.b 0, 1, 1 ; func 013
.dc.b 2, 1, 1 ; func 014
.dc.b 1, 1, 1 ; func 015
.dc.b 0, 0, 0 ; func 016
.dc.b 0, 0, 0 ; func 017
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 1, 0 ; func 019
; Event Manager
.dc.b 0, 1, 0 ; func 020
.dc.b 3, 5, 0 ; func 021
.dc.b 5, 5, 0 ; func 022
.dc.b 0, 1, 1 ; func 023
.dc.b 2, 1, 0 ; func 024
.dc.b 16, 7, 1 ; func 025
.dc.b 2, 1, 0 ; func 026
.dc.b 0, 0, 0 ; func 027
.dc.b 0, 0, 0 ; func 028
.dc.b 0, 0, 0 ; func 009
; Menu Manager
.dc.b 1, 1, 1 ; func 030
.dc.b 2, 1, 1 ; func 031
.dc.b 2, 1, 1 ; func 032
.dc.b 2, 1, 1 ; func 033
.dc.b 1, 1, 2 ; func 034
.dc.b 1, 1, 1 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Object Manager
.dc.b 2, 1, 1 ; func 040
.dc.b 1, 1, 1 ; func 041
.dc.b 6, 1, 1 ; func 042
.dc.b 4, 1, 1 ; func 043
.dc.b 1, 3, 1 ; func 044
.dc.b 2, 1, 1 ; func 045
.dc.b 4, 2, 1 ; func 046
.dc.b 8, 1, 1 ; func 047
.dc.b 0, 0, 0 ; func 048
.dc.b 0, 0, 0 ; func 049
; Form Manager
.dc.b 1, 1, 1 ; func 050
.dc.b 9, 1, 1 ; func 051
.dc.b 1, 1, 1 ; func 002
.dc.b 1, 1, 0 ; func 003
.dc.b 0, 5, 1 ; func 004
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Dialog Manager
.dc.b 0, 0, 0 ; func 060
.dc.b 0, 0, 0 ; func 061
.dc.b 0, 0, 0 ; func 062
.dc.b 0, 0, 0 ; func 003
.dc.b 0, 0, 0 ; func 004
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Graphics Manager
.dc.b 4, 3, 0 ; func 070
.dc.b 8, 3, 0 ; func 071
.dc.b 6, 1, 0 ; func 072
.dc.b 8, 1, 0 ; func 073
.dc.b 8, 1, 0 ; func 074
.dc.b 4, 1, 1 ; func 075
.dc.b 3, 1, 1 ; func 076
.dc.b 0, 5, 0 ; func 077
.dc.b 1, 1, 1 ; func 078
.dc.b 0, 5, 0 ; func 009
; Scrap Manager
.dc.b 0, 1, 1 ; func 080
.dc.b 0, 1, 1 ; func 081
.dc.b 0, 0, 0 ; func 082
.dc.b 0, 0, 0 ; func 083
.dc.b 0, 0, 0 ; func 084
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; fseler Manager
.dc.b 0, 2, 2 ; func 090
.dc.b 0, 0, 0 ; func 091
.dc.b 0, 0, 0 ; func 092
.dc.b 0, 0, 0 ; func 003
.dc.b 0, 0, 0 ; func 004
.dc.b 0, 0, 0 ; func 005
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Window Manager
.dc.b 5, 1, 0 ; func 100
.dc.b 5, 1, 0 ; func 101
.dc.b 1, 1, 0 ; func 102
.dc.b 1, 1, 0 ; func 103
.dc.b 2, 5, 0 ; func 104
.dc.b 6, 1, 0 ; func 105
.dc.b 2, 1, 0 ; func 106
.dc.b 1, 1, 0 ; func 107
.dc.b 6, 5, 0 ; func 108
.dc.b 0, 0, 0 ; func 009
; Resource Manger
.dc.b 0, 1, 1 ; func 110
.dc.b 0, 1, 0 ; func 111
.dc.b 2, 1, 0 ; func 112
.dc.b 2, 1, 1 ; func 113
.dc.b 1, 1, 1 ; func 114
.dc.b 0, 0, 0 ; func 115
.dc.b 0, 0, 0 ; func 006
.dc.b 0, 0, 0 ; func 007
.dc.b 0, 0, 0 ; func 008
.dc.b 0, 0, 0 ; func 009
; Shell Manager
.dc.b 0, 1, 2 ; func 120
.dc.b 3, 1, 2 ; func 121
.dc.b 1, 1, 1 ; func 122
.dc.b 1, 1, 1 ; func 123
.dc.b 0, 1, 1 ; func 124
.dc.b 0, 1, 2 ; func 125
@\Rogue\Monster\
else
echo "shar: Will not over write ACHAPP.S"
fi
if `test ! -s ACHSLIB.H`
then
echo "x - ACHSLIB.H"
cat > ACHSLIB.H << '@\Rogue\Monster\'
/*
achslib.h
871203 A C Howe Implementation
880109 Deque stuff
*/
#define achslib_header
/* AES Exports */
extern short gl_apid;
extern short global [];
extern short control [];
/* System Variables */
extern char DEFRES;
extern char MONITOR;
extern char CONTERM;
/* Anthony's Stuff */
extern char TERM [][3];
extern short XMAX;
extern short YMAX;
extern short TABLEN;
extern void GOTOXY (); /* short, short */
extern void memmove();
extern void strcat();
extern void strncpy();
extern unsigned strlen();
extern void strnput();
extern char * STRTOK (); /* char *, char * */
extern char * NEXTTOK;
extern void PUTDEC (); /* short */
extern void PUTLONG (); /* long */
extern void ULTOA (); /* long, char * */
extern long ULD (); /* long , long */
extern long FINDI (); /* char *, short */
extern long LFINDI (); /* char *, short */
extern long gemdos ();
extern long xbios ();
/* Atari System Variables (supervisor only) */
#define SHOW_SHIFT (CONTERM |= 0x08)
#define HIDE_SHIFT (CONTERM &= 0xf7)
/* Basic Terminal Functions */
#define BEEP (Cconws (&TERM[0]))
#define SET_TERMINAL (Cconws (&TERM[1]))
#define RST_TERMINAL (Cconws (&TERM[2]))
#define HOME_CURSOR (Cconws (&TERM[3]))
#define SCREEN_CLEAR (Cconws (&TERM[4]))
#define EOL_CLEAR (Cconws (&TERM[5]))
#define EOP_CLEAR (Cconws (&TERM[6]))
#define ON_CURSOR (Cconws (&TERM[7]))
#define OFF_CURSOR (Cconws (&TERM[8]))
#define HI_LITE (Cconws (&TERM[9]))
#define LO_LITE (Cconws (&TERM[10]))
#define INS_LINE (Cconws (&TERM[11]))
#define DEL_LINE (Cconws (&TERM[12]))
#define UP_CURSOR (Cconws (&TERM[13]))
#define DOWN_CURSOR (Cconws (&TERM[14]))
#define RIGHT_CURSOR (Cconws (&TERM[15]))
#define LEFT_CURSOR (Cconws (&TERM[16]))
#define NULL 0
#define LNULL 0L
#define BLOCK 128 /* must be powers of 2 */
#define DBLOCK 256 /* double block */
#define CTRLZ 0x1a
#define RUB 0x7f
#define FILES 0x00
#define READONLY 0x01
#define HIDDEN 0x02
#define SYSTEM 0x04
#define VOLUME 0x08
#define DIRECTORY 0x10
#define ARCHIVE 0x20
typedef union cbuffer
{
struct template
{
char max_line;
char length;
char line [BLOCK - 2 * sizeof (char)];
} c;
char buf [BLOCK];
}
CBUFFER;
typedef struct command_entry
{
char *name;
void (*function) ();
}
COMMAND;
typedef struct dta_buf
{
char dummy[21]; /* first 21 bytes not used */
char attr; /* file attribute */
short ftime; /* file time stamp */
short fdate; /* file date stamp */
long fsize; /* file size in bytes */
char fname[14]; /* file name and extension */
}
DTA;
typedef struct deque
{
long *base;
long *left;
long *right;
long *end;
}
DEQUE;
#define LEFT 0
#define RIGHT 1
extern DEQUE * MKDEQ (); /* long */
extern void DEQADD (); /* DEQUE *, short, long */
extern long DEQDEL (); /* DEQUE *, short */
extern void RMDEQ (); /* DEQUE * */
@\Rogue\Monster\
else
echo "shar: Will not over write ACHSLIB.H"
fi
if `test ! -s ACHSLIB.S`
then
echo "x - ACHSLIB.S"
cat > ACHSLIB.S << '@\Rogue\Monster\'
;*** achslib.s
;
; 880507
;*** ASCII Code Equates
BS == $08
HT == $09
LF == $0a
VT == $0b
FF == $0c
CR == $0d
ZEOF == $1a
ESC == $1b
SPACE == $20
;*** Atari ST Key Equates
; Shift Bits
KRSHIFT == $01
KLSHIFT == $02
KCTRL == $04
KALT == $08
KCAPS == $10
KRMOUSE == $20
KLMOUSE == $40
; Function Keys
KF1 == $003b0000
KF2 == $003c0000
KF3 == $003d0000
KF4 == $003e0000
KF5 == $003f0000
KF6 == $00400000
KF7 == $00410000
KF8 == $00420000
KF9 == $00430000
KF10 == $00440000
KESC == $0001001b
KRETURN == $001c000d
KENTER == $0072000d
KBS == $000e0008
KDEL == $0053007f
KCTLDEL == $0053001f
KCTLLEFT == $00730000
KCTLRIGHT == $00740000
KHOME == $00470000
KUP == $00480000
KLEFT == $004b0000
KRIGHT == $004d0000
KDOWN == $00500000
KTAB == $000f0009
KINSERT == $00520000
KUNDO == $00610000
KHELP == $00620000
;*** GEMDOS Equates
CCONIN == 1 ; standard console in
CCONOUT == 2 ; standard console out
CAUXIN == 3 ; auxilary in
CAUXOUT == 4 ; auxilary out
CPRNOUT == 5 ; standard printer out
CRAWIO == 6 ; Raw I/O to standard I/O
CRAWIN == 7 ; Raw console in, no echo, no ctrl interpret
CNECIN == 8 ; Raw console in, no echo, ctrl interpreted
CCONWS == 9 ; write NULL terminated string to standard output
CCONRS == 10 ; read edited string from standard input
CCONIS == 11 ; check status of standard input
;*** Atari System Variables
;
; NOTE: must be in Supervisor mode to modify.
_DEFRES == $44a ; default monitor resolution
_MONITOR == $44c ; monitor type
_CONTERM == $484 ; attributes for the console system
;*** Terminal Definition Area
.data
.even
_TERM::
bell: .dc.b 7,0,0 ; bell code string
tset: .dc.b 0,0,0 ; terminal init
trst: .dc.b 0,0,0 ; terminal de-init
curhome: .dc.b ESC,'H',0 ; cursor home
clrscr: .dc.b ESC,'E',0 ; clear screen
clreol: .dc.b ESC,'K',0 ; clear to EOL
clreop: .dc.b ESC,'J',0 ; clear to EOP
curon: .dc.b ESC,'e',0 ; cursor on
curoff: .dc.b ESC,'f',0 ; cursor off
hilite: .dc.b ESC,'p',0 ; inverse on
lolite: .dc.b ESC,'q',0 ; inverse off
insline: .dc.b ESC,'L',0 ; insert line
delline: .dc.b ESC,'M',0 ; delete line
curup: .dc.b ESC,'A',0 ; cursor up
curdn: .dc.b ESC,'B',0 ; cursor down
currt: .dc.b ESC,'C',0 ; cursor right
curlt: .dc.b ESC,'D',0 ; cursor left
;*** GotoXY for VT-52 terminal
;
; e short X coord
; short Y coord
;
; x none
;
; Position cursor at .text coords (X,Y).
.data
.even
curaddr: .dc.b ESC,'Y',0 ; cursor addressing lead in
_XMAX:: .dc.w 80 ; max number of columns
_YMAX:: .dc.w 25 ; max number of rows
_TABLEN:: .dc.w 4 ; tab length to use
.text
_GOTOXY::
link a6,#0
movea.l #curaddr,a0 ; pnt to cursor addressing string
move.l a0,-(sp) ; put on stack
move.w #CCONWS,-(sp) ; send string to terminal
trap #1 ; do GEMDOS call
addq.l #6,sp ; correct stack
move.w _YMAX,d1 ; point to ymax value
move.w 10(a6),d0 ; get y argument
bsr.s GOTOXY1
move.w _XMAX,d1 ; point to xmax value
move.w 8(a6),d0 ; get x argument
bsr.s GOTOXY1
unlk a6
rts
GOTOXY1:
ext.l d0
divu d1,d0
swap d0 ; q = q mod max
addi.w #32,d0 ; q = q + offset
move.w d0,-(sp)
move.w #CCONOUT,-(sp)
trap #1
addq.l #4,sp
rts
;void memmove( char* dest, char* source, long length )
.text
_memmove::
.cargs .dest.l, .source.l, .len.l
movea.l .source(sp),a0 ; get source
movea.l .dest(sp),a1 ; get target
move.l .len(sp),d0 ; get length
beq.s .x ; exit if length is zero
cmpa.l a1,a0 ; check for s < t
blt.s .2 ; move tail first
.1:
move.b (a0)+,(a1)+ ; move source byte to target
subq.l #1,d0 ; decrement length
bne .1 ; loop till zero
bra.s .x
.2:
adda.l d0,a0 ; do tail first
adda.l d0,a1
.3:
move.b -(a0),-(a1)
subq.l #1,d0
bne .3
.x:
rts
;void strnput( char* s, unsigned n )
.text
_strnput::
link a6,#0
movem.l d3/a3, -(sp)
movea.l 8(a6), a3
adda.w 12(a6), a3
cmpa.l 8(a6), a3
beq.s STRNPUT1
move.b (a3), d3
clr.b (a3)
STRNPUT1:
move.l 8(a6), -(sp)
move.w #CCONWS, -(sp)
trap #1
addq.l #6, sp
cmpa.l 8(a6), a3
beq.s STRNPUT2
move.b d3, (a3)
STRNPUT2:
movem.l (sp)+, d3/a3
unlk a6
rts
;void strncpy( char* s1, char* s2, unsigned n )
.text
_strncpy::
.cargs .s1.l, .s2.l, .n.l
movea.l .s2(sp),a0
movea.l .s1(sp),a1
move.w .n(sp),d0
beq.s .X
.1: