FORTH is still around in machine controllers. We still have old machines with FORTH processors, the RTX 2000. Not my favorite language but I still have a few books on the shelf for it.APL and FORTH were two of my favorite languages.
I also had to learn ALGOL, LISP and SNOBOL in school before moving on to Pascal, not to mention FORTRAN, BASIC and ASM.
Wow, you must have had the same prof I did!I also had to learn ALGOL, LISP and SNOBOL in school
Did you, by any chance, use Stony Brook Modula-2?My favorite language was MODULA-2,
I'm surprised you didn't do what the rest of us did: write your own assembler (in machine code!).I started with BASIC, then 6502 machine language on the Apple IIe. There wasn't an assembler program, only a "disassembler". So I'd enter a bunch of machine codes, then list it with the disassembler to check my work. I'm pretty sure I got started with a manual written by Wozniak. These days at work, I use Access and VBA.
A blast from the past!I did based on the old Zen Assembler.
I was happy to make spinning shapes and really fast counters. I wasn't smart enough to write an assembler. My only resources were the manuals and a subscription to Nibble magazine. Still, it got me started, and the machine language stuff was kind of enlightening as to how computers actually work. Then I went to college and forgot all the Apple II stuff. There was this new thing called the Internet!I'm surprised you didn't do what the rest of us did: write your own assembler (in machine code!).
This is because Google revived Java, which was a dead language, about to be abandoned (and rightfully so). Java only holds a high rank because of it's ubiquitous use on cellphones. And yes, Java is a language I know. I've written games with predictive logic (quake style) using it, and frankly. it sucks.
you've just reminded me of an old adage: "A camel is a horse designed by a committee" ...it was a language designed by committee
I started with TDI Modula-2 for the Atari-ST as an alternative to programming the MX2 operating system code in C. I loved the discipline and structure of the language but time passed it by.Did you, by any chance, use Stony Brook Modula-2?
Bob
MODULE mx2net; (*$T-$S-,$A+ *)
FROM SYSTEM IMPORT CODE,ADDRESS;
FROM NETWORK IMPORT initnetwork,recframe;
FROM GEMX IMPORT BasePageAddress;
FROM GEMDOS IMPORT TermRes,Super;
FROM BIOS IMPORT Device;
VAR
vblptr [456H] : POINTER TO ARRAY [0..7]
OF ADDRESS;
i : CARDINAL;
ssv : ADDRESS;
(* it runs as a background process in a vbl time slot *)
(*$P- *)
PROCEDURE VBLrecframe;
BEGIN
CODE(02f39H,0,04a2H); (* move.l $4a2,-(sp) save BIOS pointer *)
CODE(04b9H,0,02eH,0,04a2H); (* sub 46 from pointer *)
recframe; (* check network for data *)
CODE(023dfH,0,04a2H); (* restore BIOS pointer *)
CODE(4e75H); (* rts *)
END VBLrecframe;
(*$P+ *)
BEGIN
initnetwork(HSS);
i:=1; (* don't use 0 because some programs don't check. *)
ssv:=0;
Super(ssv);
WHILE vblptr^[i]#0H DO
INC(i);
END;
(* set up vbl vector for NETWORK input *)
vblptr^[i] := ADDRESS(VBLrecframe);
Super(ssv);
WITH BasePageAddress^ DO
TermRes(CodeLen+BssLen+LONGCARD(CodeBase-ADDRESS(BasePageAddress)),0);
END;
END mx2net.
/* These are some interface routines for MX2 using C. It is written */
/* using Mark Johnson's Shareware C compiler version 1.2 */
/* If I receive requests maybe I will write a complete interface or */
/* someone else can feel free. */
#define MX2GLOBAL 0x144L
#define MX2MAGIC 22261L
struct PIPE {
char pipename[80];
short buf[1024];
int bufsize;
int bufhead;
int buftail;
int cnt;
};
struct sysreq {
int req;
int pid;
long magic;
};
struct spinttype {
long proc;
int pid;
long data;
};
struct sysvar {
long *currentprocess;
int *MULTI;
long *slicebegin;
long *contextswitch;
long *command;
long *request;
long *CRON;
int *spintenable;
int *spintmask;
long *spint;
long *bpsave;
long *pipes;
long *sysmemsize;
long *gemsaveGvec;
long *StartProcess; /* The following are pointers to fuctions */
long *SwapProcess;
long *TermProcess;
long *NextPid;
long *SleepProcess;
long *WakeupProcess;
long *ChangeProcessPriority;
long *MultiBegin;
long *MultiEnd;
long *DozeProcess;
long *WaitProcess;
};
struct sysvar *mx2var;
main()
{
long *contextswitch,*sysmemsize;
GetSysVar(); /* store mx2 system variable pointers in mx2var */
contextswitch = (long *) mx2var->contextswitch;
printf("Total context switches %lu / address %lx / \n",
*contextswitch,contextswitch);
sysmemsize = (long *) mx2var->sysmemsize;
printf("MX2 system memory %lu / address %lx / \n\n",
*sysmemsize,sysmemsize);
exit(0);
}
/* This routine will read MX2 system variables and procedures */
/* and return them as a pointer in mx2var. */
void GetSysVar()
{
long *adr,ssv;
ssv = 0L;
ssv = (long *) trap(1,0x20,ssv);
adr = MX2GLOBAL; /* system variable address pointer */
mx2var = (struct sysvar *) *adr;
ssv = trap(1,0x20,ssv);
}