From 3255fc51885beb7a19b6849ff9a45f2ca3da0836 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 14 Jan 2021 12:10:27 +0100 Subject: [PATCH] Microcode for the TT2500. The assembler will recieve a GC-OVERFLOW interrupt. Other TT2500 files set the GC-OVERFLOW variable to a dummy function, which seems to appease the interrupt. Since the TVDIS code was written before backquote was introduced to Maclisp, it uses comma characters without quoting. To accomodate this a call to SETSYNTAX overrides the new syntax for comma. --- Makefile | 2 +- build/lisp.tcl | 13 + build/timestamps.txt | 1 + src/minsky/tvdis.3 | 1270 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1285 insertions(+), 1 deletion(-) create mode 100644 src/minsky/tvdis.3 diff --git a/Makefile b/Makefile index 54cb8e67..6c650c30 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ SRC = syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ moon teach ken lmio1 llogo a2deh chsgtv clib sys3 lmio turnip \ mits_s rab stan_k bs cstacy kp dcp2 -pics- victor imlac rjl mb bh \ lars drnil radia gjd maint bolio cent shrdlu vis cbf digest prs jsf \ - decus bsg muds54 hello rrs 2500 + decus bsg muds54 hello rrs 2500 minsky DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \ chprog sail draw wl pc tj6 share _glpr_ _xgpr_ inquir mudman system \ xfont maxout ucode moon acount alan channa fonts games graphs humor \ diff --git a/build/lisp.tcl b/build/lisp.tcl index 7a1e4b01..25c2fcd5 100644 --- a/build/lisp.tcl +++ b/build/lisp.tcl @@ -846,6 +846,19 @@ respond "_" "2500;zap\r" respond "_" "\032" type ":kill\r" +# 2500 microcode +respond "*" ":cwd minsky\r" +respond "*" "lisp\013" +respond "Alloc?" "n\r" +respond "*" "(setq gc-overflow '(lambda (x) t))" +respond "T)" "(setsyntax '/, 'a '/,)" +respond "T" "(load \"minsky;tvdis\")" +respond "T" "(load \"2500;zap\")" +respond_load "(array im fixnum 4096)" +respond "IM" "(zap tvdis)" +respond "FINISH)" "(quit)" +expect ":KILL" + # TEACH;TS XLISP respond "*" ":complr\r" diff --git a/build/timestamps.txt b/build/timestamps.txt index dff632f2..80e4677c 100644 --- a/build/timestamps.txt +++ b/build/timestamps.txt @@ -1337,6 +1337,7 @@ midas/midas.bugs 198706130710.45 midas/-read-.-this- 197603220513.44 midas/xjsys.5 197809290102.22 minits/-how-t.21 198606232322.38 +minsky/tvdis.3 197602270042.17 mits_s/3com.3 198302161308.38 mits_s/boot11.1 198207030003.01 mits_s/camac.1 198207030003.37 diff --git a/src/minsky/tvdis.3 b/src/minsky/tvdis.3 new file mode 100644 index 00000000..6a782bd0 --- /dev/null +++ b/src/minsky/tvdis.3 @@ -0,0 +1,1270 @@ + +(AND (SETQ TVDIS '( + +(& INPUT FORMAT) +(& NORMALLY ALL CHARACTERS COMING IN AT THE INTERFACE PORT ARE DISPLAYED ON THE) +(& TEXT DISPLAY) +(& GRAPHICS COMMANDS ARE PREFACED BY AN ESCAPE CHARACTER 33 OCTAL) + +(& SPECIAL CHARACTERS) + + (CALL 000 NUL-CHR & NULL) + (CALL 001 HM-CHR & CURSOR TO TOP OF SCREEN) + (CALL 002 BL-CHR & CURSOR TO START OF LINE) + (CALL 004 RUBOUT & DELETES LAST DISPLAYED CHR) + (CALL 005 END-LINE & CURSOR TO END OF CURRENT LINE) + (CALL 006 RT-CHR & CURSOR RIGHT) + (CALL 007 BEL-CHR & FLASH SCREEN) + (CALL 010 BS-CHR & BACK SPACE) + (CALL 011 TAB-CHR & TAB MOD 8) + (CALL 014 P-CLR-CHR & HOME CLEAR OF PAGE) + (CALL 015 CR-CHR & NEW LINE) + (CALL 021 QUOTE-CHR & NEXT CHR HAS NO SPECIAL MEANING) + (CALL 033 FLAG-CHR & ESCAPE TO COMMAND MODE) + (CALL 177 DEL-CHR & DELETE IS JUST LIKE NULL) + + + + + +(& CHARACTERS BETWIXT 100 AND 137 OCTAL INCLUSIVE ARIVING AFTER AN ESCAPE WILL) +(& BE EXPECTED IN GROUPS OF THREE THE 5 LEAST SIGNIFICANT BITS OF THESE 3 CHRS WILL) +(& BE CONS UP INTO A 15 BIT DISPLAY LIST INSTRUCTION LAST CHR IS LEAST SIGNIFICANT) +(& THIS DISPLAY INSTRUCTION IS ADDED TO THE TOP OF THE DISPLAY LIST) + +(& OP CODES ARE AS FOLLOWS) + +(& /000 /00X /XXX /XXX /XXX NOP) +(& /000 /100 /0XX /XXX /XXX HOME) +(& /000 /100 /1XX /XXX /000 PENDONW) +(& /000 /100 /1XX /XXX /001 SMALL DOT) +(& /000 /100 /1XX /XXX /010 DOT) +(& /000 /100 /1XX /XXX /011 WIDE DOT) +(& /000 /100 /1XX /XXX /100 DASH) +(& /000 /100 /1XX /XXX /101 DASH DOT) +(& /000 /100 /1XX /XXX /110 WIDE DASH) +(& /000 /100 /1XX /XXX /111 PENDOWN) +(& /000 /101 /0XX /XXX /XX1 SHOWTURTLE) +(& /000 /101 /0XX /XXX /000 HIDETURTLE) +(& /000 /101 /1XX /XXX /XXX ENDSNAP) +(& /000 /110 /0XX /XXX /XXX BLINK) +(& /000 /110 /1XX /XXX /XX0 WRAP) +(& /000 /110 /1XX /XXX /XX1 BOUNCE) +(& /000 /111 /0XX /XXX /XXX RESET) +(& /000 /111 /1XX /XXX /XXX NOP) +(& /001 /0DD /DDD /DDD /DDD FORWARD DISTANCE) +(& /001 /1AA /AAA /AAA /AAA RIGHT ANGLE) +(& /010 /0HH /HHH /HHH /HHH SETHEADING HEADING) +(& /010 /1SS /SSS /SSS /SSS MOVE SPEED) +(& /011 /0SS /SSS /SSS /SSS SPIN SPEED) +(& /011 /1XX /XXX /XXX /XXX DISPLAY ADDRESS IN NEXT WORD) +(& /100 /0CC /CCC /CCC /CCC SETXY XCOR , YCOR IN NEXT WORD) +(& /100 /1DD /DDD /DDD /DDD DELTAXY DX , DY IN NEXT WORD) +(& /101 /000 /000 /000 /000 CLEARSCREEN) +(& /101 /01N /NNN /NNN /NNN REMOVE -N INSTRUCTIONS FROM THE DISPLAY LIST) +(& /11X /XXX /XXX /XXX /XXX ERROR) + + +(& GRAHIC REGISTER ALLOCATION) + + (CALL 2 XPOS & LSB'S OF X POSITION) + (CALL 3 YPOS & LSB'S OF Y POSITION) + (CALL 4 SIN & SINE OF HEADING) + (CALL 5 COS & COSE OF HEADING) + (CALL 6 HEADING & HEADING OF TURTLE) + (CALL 7 PC & POINTER TO DISPLAY LIST INSTRUTION BEING EXECUTED) + +(& SCRATCH PAD ALLOCATION) + + (CALL 40 ISAV-1 & FOR SAVING REGS DURING INTERRUPTS) + (CALL 41 ISAV-2) + (CALL 42 ISAV-3) + (CALL 43 ISAV-4) + (CALL 44 ISAV-5) + (CALL 45 SCRATCH & NEVER TRUST A SUBR WITH THIS ONE) + (CALL 46 TOP-LINE & TOP LINE ON SCREEN) + (CALL 47 SCR-VALUE & SCROLL) + (CALL 50 BACK-SCRATCH & NOT FOR SCRATCHING BACKS BUT FOR BACK'S SCRATCHING) + (CALL 51 CONS-CELL & FOR CONSING UP DISPAY INSTRUCTIONS) + (CALL 52 READ-STATE & DEPENDS ON WHAT CHARS HAVE COME IN) + (CALL 53 SNAP-STACK & POINTER TO MACRO STACK) + (CALL 54 MOVE-PEN & STOREING PEN-STATE WHILE IN MOVE) +; +; + (CALL 57 SPIN-ANGLE & LIKE CLOCK MODE 360) + (CALL 60 WRAP-MODE & ONE IF TURTLE SHOULD WRAP ELSE ZERO) + (CALL 61 SYNCH-FLAG & SYMAPHORE TO SYNCHRONIZE REFRESH AND CLOCK) + (CALL 62 CLOCK & TIME INCREMENTED EVERY CLOCK CYCLE) + (CALL 63 IN-BUFFER & COMMUNICATIONS LINK INPUT BUFFER POINTER) + (CALL 64 OUT-BUFFER & COMMUNICATIONS LINK OUTPUT BUFFER) + (CALL 65 DISPLAY-TOP & TOP OF DISPLAY LIST) + (CALL 66 DSR-STATE & COPY OF DISPLAY STATUS REGISTER) + (CALL 67 TURTLE-STATE & ZERO IF TURTLE IS HIDDEN ELSE MINUS ONE) + (CALL 70 LINE) + (CALL 71 CRSR-LINE) + (CALL 72 CRSR-COL) + (CALL 73 CRSR-REPL) + (CALL 74 OLD-REPL) +; + (CALL 76 BELL-TIME) + (CALL 77 COLOR) + +(& MEMORY ALLOCATION) + + (CALL 0 TRIG-TABLE-START) + (CALL 133 IN-BUFFER-START) + (CALL 144 SNAP-STACK-START) + (CALL 170 SNAP-STACK-END) + (CALL 170 DISPLAY-LIST-START) + (CALL 5546 SNAP-BUFFER-START) + (CALL 5546 TEXT-START) + +(& INTERUPT SERVICE ROUTINE) + + +SERV-INTERUPT (PUT 0 ISAV-1 & IT IS ORE BLESSED TO SERVE THAN TO RECIEVE) + (PUT 1 ISAV-2) + (DIS INTS 7) + (ERROR & INTERUPT WENT AWAY) + (JUMP TV-LINE & TEXTDISPLAY IS 1) + (JUMP SERV-IN & CHARACTER COMING IN ON INTERFACE) + (JUMP TV-LINE & TV-LINE HAS PRIORITY) + (JUMP SERV-CLOCK & 60TH OF A SEC INTERUPT) + (JUMP TV-LINE & TV-LINE HAS PRIORITY) + (JUMP SERV-CLOCK & CLOCK HAS PRIORITY) + (JUMP TV-LINE & THOU SHALT HAVE NO OTHER BEFOR HIM) + +(& INITIALIZE ALL) + +START (PUSHJ INIT & WE HOPE THIS IS A NOP) + (ERROR & CAUSE THIS MEANS STACK UNDERFLOW) +INIT (SUB 0 0) + (PUT 0 CONS-CELL) + (PUT 0 READ-STATE) + (PUT 0 SPIN-ANGLE) + (PUT 0 CLOCK) + (PUT 0 SYNCH-FLAG) + (PUT 0 SNAP-STACK) + (PUT 0 IN-BUFFER) + (PUT 0 WRAP-MODE) + (INC 0) + (PUT 0 TURTLE-STATE) + (NOR 0 0) + (PUT 0 OUT-BUFFER) + (LOD 0) + (DISPLAY-LIST-START) + (PUT 0 DISPLAY-TOP) + (LOD 0) + (255.) + (PUT 0 XCOR) + (PUT 0 YCOR) + (PUSHJ TV-INIT) +NEXT-TIME (PUSHJ CENTER) + +(& MAIN LOOP OF THE DISPLAY PROGRAM) + + +WAIT (PUSHJ CHECK-INTS) + (PUSHJ CHECK-FLAG) + (GET 0 IN-BUFFER & CHECK IF THERE ARE CHARACTERS IN THE BUFFER) + (NOP 0 & GET DOESN/'T SET CONDITIONALS) + (BNE SERV-IN-BUFFER & IF NOT WAIT SOME MORE) + (GET 0 SYNCH-FLAG & HAS A 60 CYCLE INTERUPT COME ?) + (NOP 0 & GET DOESN/'T SET CONDITIONALS) + (BEQ WAIT & IF SO REFRESH VECTORS) + (JUMP REFRESH) + +SERV-IN-BUFFER (DEC 0 & GET A CHAR FROM FIFO) + (PUT 0 IN-BUFFER & COUNT OF STUFF) + (ADDI PC 0) + (IN-BUFFER-START & THE END OF THE BUFFER) +MOVE-FIFO (READ PC 2 & MOVE DOWN THE BUFFER) + (NOP 0 & **** JUUST TEMP) + (WRITED PC 1) + (CMPI PC) + (- IN-BUFFER-START 1) + (BEQ GOBBLER & GOBBLES DOWN A CHARACTER) + (GET 1 2) + (JUMP MOVE-FIFO) + + +GOBBLER (GET 1 READ-STATE & HAVE WE JUST GOTTEN A FLAG?) + (NOP 1 & GET DOESN/'T SET CONDITIONALS) + (BMI QUOTED & NO SPECIAL MEANING) + (BEQ TEXT-ADD & IF NOT TEXT-ADD CHECK FOR FLAG) + (GET 3 CONS-CELL & GET PREVIOUS WORK) + (ROT 3 11.) + (ANDI 0 2 & ADD IN 5 BITS) + (37) + (ADD 0 3) + (PUT 0 CONS-CELL & SAVE IT) + (DEC 1 & CHANGE STATE) + (PUT 1 READ-STATE) + (BNE WAIT & MORE TO COME) + (GET 3 DISPLAY-TOP & ADD TO DISPLAY LIST) + (WRITEI 3 0) + (PUT 3 DISPLAY-TOP) + (JUMP WAIT) + +QUOTED (SUB 1 1 & TURN OFF QUOTE MODE) + (PUT 1 READ-STATE) + (PUSHJ TV-QUOTE) + (JUMP WAIT) + +TEXT-ADD (CMPI 2 & CHECK FOR QOTE CHR) + (QUOTE-CHR) + (BEQ SET-QUOTE) + (CMPI 2 & CHECK FOR ALT MADE CHAR) + (FLAG-CHR) + (BNE TEXT-CHAR & FOR TEXT DISPLAY) + (PUT 1 CONS-CELL & IF SO CLEAR CONS-CELL) + (LOD 0 & MAKE READ-STATE 3) + (3) + (PUT 0 READ-STATE) + (JUMP WAIT) + +SET-QUOTE (LOD 0 & TURN ON QUOTE MODE FOR ONE CHR) + (-1) + (PUT 0 READ-STATE) + (JUMP WAIT) + +TEXT-CHAR (PUSHJ TV-CHAR) + (JUMP WAIT) + +CHECK-FLAG (DIS FLAGS 3) + +POP-PLACE (POPJ) + (JUMP SERV-KEY & KEYBOARD IS 1) + (JUMP SERV-OUT & OUTPUT TO INTERFACE IS 2) + (PUSHJ SERV-OUT & DO THEM BOTH) + (JUMP SERV-KEY) + +SERV-CLOCK (GET 0 CLOCK & INCREMENT CLOCK) + (INC 0) + (PUT 0 CLOCK) + (GET 0 SPIN-ANGLE & UPDATE SPIN-ANGLE) + (INC 0) + (LOD 1) + (* 360. 100) + (PUSHJ TOO-LOW & NORMALIZE) + (PUT 0 SPIN-ANGLE) + (INC 0 & TO GARRANTEE A NON ZERO-NUMBER) + (PUT 0 SYNCH-FLAG & AND LET REFRESH START IF WAITING) + (JUMP TV-PAGE) + + +SERV-IN (GET 0 IN-BUFFER & PUT IT IN FIFO) + (ADDI 1 0) + (IN-BUFFER-START) + (INC 0) + (PUT 0 IN-BUFFER) + (GET 0 UART) + (ANDI 0 0 & UART GIVES RANDOM HIGH BITS) + (377) + (WRITE 1 0 & UARTS ARE REALLY SLOW) + (GET 0 ISAV-1) + (GET 1 ISAV-2) + (POPJ & SO THIS CAN NOT BE A JUMP CHECK-INTS) + + +SERV-KEY (GET 0 OUT-BUFFER & ADD BUFFER IS JUST ONE LONG) + (NOP 0 & GET DOESN/'T SET CONDITIONALS) + (BPL CHECK-INTS & BUT YOU CAN TYPE FASTER THAN 60 CPS) + (GET 0 KEY & BUT NOT FASTER THAN 120 CPS) + (ANDI 0 0 & KEYBOARD GIVES RANDOM HIGH BITS) + (377 & GIVE UNTO OUTPUT AS INPUT HAS GIVEN TO YOU) + (PUT 0 OUT-BUFFER) + (POPJ) + + + +SERV-OUT (GET 0 OUT-BUFFER) + (NOP 0 & GET DOESN/'T SET CONDITIONALS) + (BMI CHECK-INTS & IS THERE SOMETHING TO SEND OUT?) +CHOUT (LOD 1 & THIS ROTEN REVERSER *****) + (-7) + (PUT 1 XR & ONLY FOR THE PERMAMA MACHINE ****) +AGAIN (ADD 1 1) + (ROT 0 1) + (BPL NBIT) + (INC 1) +NBIT (BXSI AGAIN & END SICK PATCH ****) + (PUT 1 UART & SEND OUT THE CHARACTER) + (NOP 1 & UARTS ARE SLOW) + (NOP 1 & VERY SLOW) + (NOP 1 & VERY VERY SLOW) + (LOD 1 & MAKE A NOTE THAT THE DEED WAS DONE) + (-1) + (PUT 1 OUT-BUFFER & THIS IS A NEGATIVE NUMBER) + (JUMP CHECK-INTS & SHOULD BE POPJI) + +(& REFRESH - ONCE EVERY 60TH OF A SEC) + +REFRESH (LOD PC) + (DISPLAY-LIST-START) + (PUSHJ CENTER) + (PUT HEADING SYNCH-FLAG & A HANDY ZERO) + (GET XPOS 0) + (GET YPOS 0) +NEXT (READI PC 0 & INC POINTER AND GET INSTUCTION) + (GET 1 SNAP-STACK & DON/'T CHECK DISPLAT TOP INSIDE SNAPS) + (NOP 1 & GET DOESN/'T SET CONDITIONS) + (BNE DONT-LOOK-NOW & BUT SOMETHINGS ON THE STACK) + (GET 1 DISPLAY-TOP) + (CMP 1 PC & ARE WE DONE) + (BMI TURTLE & YES DRAW TURTLE) +DONT-LOOK-NOW (PUSHJ DISPATCH & SO THAT ALL IS SUBR/'S) + (JUMP NEXT) + +TURTLE (PUSHJ PEN-DOWN & SHOULD BE DOWN FOR NEXT REFRESH) + (GET 1 TURTLE-STATE & THIS DRAWS A TRIANGULAR TURTLE) + (NOP 1 & GET DOESN/'T SET CONDITIONALS) + (BEQ NEXT-TIME & IF IT IS SHOWING) + (LOD PC) + (TURTLE-PROG) +T-LOOP (INC PC) + (CREAD 0) + (BEQ NEXT-TIME & LIST ENDS WITH A 0) + (PUSHJ DISPATCH & EXECUTE IT) +TURTLE-PROG (JUMP T-LOOP & TAG SHOULD BE HERE) + (17646 & LT 90.) + (10000 7. & FD 7.) + (14000 135. & RT 135.) + (10000 10. & FD 10.) + (14000 90. & RT 90.) + (10000 10. & FD 10.) + (14000 135. & RT 135.) + (10000 7. & FD 7.) + (0 & END-TAG) + +DISPATCH (T ROT 0 -1 & MUST LOOK AT THE MOST SIG BITS) + (DIS BUS 17 & DISPLAY LIST OP CODES) + (ERROR & 0) + (JUMP SETXY & 8) + (JUMP SETHEADING & 4) + (ERROR & 12) + (JUMP FORWARD & 2) + (JUMP CLEAR-DISPLAY & 10) + (JUMP SPIN & 6) + (ERROR & 14) + (JUMP SPECIAL & 1) + (JUMP DELTAXY & 9) + (JUMP MOVE & 5) + (ERROR & 13) + (JUMP RIGHT & 3) + (ERROR & 11) + (JUMP DISPLAY & 7) + (ERROR & 15) + +SPECIAL (T ROT 0 -5 & LOOK AT NEXT MOST SIG BITS) + (DIS BUS 7 & SPECIAL DISPLAY LIST OP CODES) + (JUMP HOME & 0) + (JUMP BLINK & 4) + (JUMP SET-TURTLE & 2) + (JUMP INIT & 6) + (JUMP SET-PEN & 1) + (JUMP SET-WRAP & 5) + (JUMP ENDSNAP & 3) + (POPJ & 7) + +(& DISPLAY LIST INSTRUCTIONS) +(& SPECIAL INSTRUNTIONS FIRST) + +CENTER (PUSHJ T-PENUP) +HOME (LOD SIN & CENTER OF SCREEN) + (255.) + (GET COS SIN) + (SUB 6 6 & SO STXY WILL DO A SETHEADING 0) + (PUSHJ STXY) + (JUMP RESTORE-DSR) + +PEN-DOWN (SUB 0 0) +SET-PEN (PUSHJ SET-DSR-PEN) + (PUT 0 DSR-STATE) + (JUMP CHECK-INTS & SHOULD BE POPJI) + + +SET-TURTLE (ANDI 0 0 & ONE TO SHOW TURTLE 0 TO HIDE HER) + (1) + (PUT 0 TURTLE-STATE) + (JUMP CHECK-INTS & SHOULD BE POPJI) + +SET-WRAP (ANDI 0 0 & ONE SHE WRAPS ZERO SHE DON/'T) + (1) + (PUT 0 WRAP-MODE) + (JUMP CHECK-INTS & SHOULD BE POPJI) + +ENDSNAP (GET 1 SNAP-STACK & THIS IS A MACRO POPJ) + (NOP 1 & GET DOESN/'T SET CONDITIONALS) + (BEQ MAKE-SNAP & ATTEMPT TO POP MEANS MAKE A SNAP) + (DEC 1) + (PUT 1 SNAP-STACK) + (ADDI 1 1) + (SNAP-STACK-START) + (READ 1 PC) + (JUMP CHECK-INTS & SHOULD BE POPJI) + + +DISPLAY (PUSHJ FETCH-ARG & GETS ARG FROM NEXT WD) + (NOP 1) + (BEQ POP-PLACE & END OF DISPLAY LIST) + (GET 1 SNAP-STACK) + (ADDI 1 1) + (SNAP-STACK-START) + (CMPI 1) + (SNAP-STACK-END) +ERR5 (BEQ ERR5) + (WRITE 1 PC) + (GET PC 0) + (GET 1 SNAP-STACK) + (INC 1) + (PUT 1 SNAP-STACK) + (JUMP CHECK-INTS & SHOULD BE POPJI) + +CLEAR-DISPLAY (PUSHJ GETARG & FOR CLEARING DISPLAY LIST) + (NOP 0 & NEGATIVE ARG MEANS ITS A DELTA) + (BPL SET-TOP & POSITIVE VAULES BECOME NEW LENGTH) + (GET 1 DISPLAY-TOP) + (ADD 0 1) + (DEC 0 & TO FLUSH ITSELF) + (JUMP PUT-TOP) +SET-TOP (ADDI 0 0) + (DISPLAY-LIST-START) +PUT-TOP (PUT 0 DISPLAY-TOP) + (JUMP CHECK-INTS & SHOULD BE POPJI) + +BLINK (GET 1 CLOCK & BLINKS AT ABOUT TWICE A SEC) + (ROT 1 5) + (BMI PEN-DOWN) +PEN-UP (LOD 0) + (7) + (JUMP SET-PEN) + +FORWARD (PUSHJ GETARG & GET SIGNED ARG) +FD-BK (NOP 0) + (BPL FD & BUT UNLESS IT IS POSITIVE) + (PUSHJ INVERT-STUFF & INVERT SIN, COS AND DISTANCE) + (PUSHJ FD & DID YOU NOTICE THE TRICKY SUBROUTINE CALL?) +INVERT-STUFF (SUBI 0 0 & UN DO IT WITH THE SAME CODE) + (0) + (SUBI SIN SIN) + (0) + (SUBI COS COS) + (0) + (JUMP CHECK-INTS & SHOULD BE POPJI) + + +FD (ADD 0 0 & SHIFT) + (SUBI 0 0 & COMPLEMENT) + (0) + (PUT 0 XR) + (NOP 0 & MUST KEEP IT ON THE BUS) +CONTINUE-FD (MAGIC & MAGIC VECTOR INSTRUCTION) + (ADD 3 5 & AND ITS HELPER) + (DIS STARS 1 & SKIP IF NOT WRAP) + (JUMP OFF-SCREEN) + (JUMP CHECK-INTS & SHOULD BE POPJI) +OFF-SCREEN (GET 0 XCOR & SO WE CAN SEE IF IT WRAPS AGAIN) + (ANDI 0 0 & IT SHOULD BE JUST NINE BITS) + (777) + (PUT 0 XCOR) + (GET 0 YCOR) + (ANDI 0 0) + (777) + (PUT 0 YCOR) + (GET 0 WRAP-MODE & WHAT MADE ARE WE IN?) + (NOP 0 & GET DOESN/'T SET CONDITIONALS) + (BNE CHECK-INTS & 1 IS FALL MODE) +WRAP (PUSHJ T-PENUP & WRAP IS ON WHENN SET) + (LOD 0) + (400 & WRAP DELAY JUST A GUESS) +WRAP-LOOP (PUSHJ CHECK-INTS & KILL ENOUGH TIME TO GET AROUND) + (DEC 0) + (BPL WRAP-LOOP) + (PUSHJ RESTORE-DSR) + (JUMP CONTINUE-FD & WE ALL SHOULD) + +RIGHT (PUSHJ GETARG & GET SIGNED ARGUMENT) +RT (ADD 0 HEADING & JUMP HERE IF YOU HAVE YOU ARG IN ZERO) + (JUMP SETH) + +DELTAXY (PUSHJ GETARG & DELTA X IS IN WORD) + (GET SIN 0) + (PUSHJ FETCH-ARG & DELTA Y IS NEXT IN LINE) + (NOP 1) + (BEQ CHECK-INTS & BUT MAY NOT HAVE ARRIVED YET) + (GET COS 0) + (JUMP DELXY & DO THE DEED) + +SETXY (PUSHJ GETARG & FIRST ARG IN THIS WORD) + (ADDI SIN 0 & NEW X STORED IN SIN) + (377 & IN PEOPLE CORDIATES) + (PUSHJ FETCH-ARG & A TWO WORD INSTRUCTION) + (NOP 1) + (BEQ CHECK-INTS & OTHER ARG NOT THERE YET) + (ADDI COS 0 & NEW Y STORED IN COS) + (377) +STXY (GET 0 XCOR & JUMP HERE IF ARGS ARE IN SIN AND COS) + (ANDI 0 0 & THOW SHALT NOT BE RANDOM) + (777 & IN THINE HIGHEST PLACES) + (GET 1 YCOR & LEST THY LOWEST BITS BE RANDOM LIKEWISE) + (ANDI 1 1) + (777) + (SUB SIN 0 & DETLA X) + (SUB COS 1 & DELTA Y) +DELXY (ROT SIN 9. & JUMP HERE WITH ARGS IN SIN AND COS) + (ROT COS 9.) + (LOD 0 & ALWAYS GOES 400 STEPS) + (400 & THERE IS ROOM FOR IMPROVEMENT HERE) + (PUSHJ FD) + (JUMP TRIG-LOOKUP & RESTORE SIN AND COS) + + +SETHEADING (PUSHJ GETARG & LEAVE SIGNED ARGUMENT IN ZERO) +SETH (PUSHJ NORMALIZE & PUSHJ TO HERE IF ARG IS ALREADY IN ZERO) + (GET HEADING 0 & BEND DOWN AND TOUCH YOUR TOES) + (JUMP TRIG-LOOKUP & GET SIN AND COS ) + + +SPIN (PUSHJ GETARG) + (GET 1 SPIN-ANGLE & JUST A TIME DEPENDENT RIGHT) + (PUSHJ POS-MULTIPLY) + (JUMP RT & NOTH/'N TO IT) + +MOVE (PUT 0 SCRATCH) + (PUSHJ T-PENUP ) + (GET 1 DSR-STATE & OLD STATE IS) + (PUT 1 MOVE-PEN & WHAT TO RESTORE THE PEN TO) + (PUT 0 DSR-STATE & SO PEN WON'T COME UP WHILE WRAPING) + (GET 0 SCRATCH) + (PUSHJ GETARG) + (GET 1 CLOCK) + (PUSHJ POS-MULTIPLY & THIS IS SIMPLE BUT HAS A BUG) + (GET 0 1 & TURTLE WILL JERK WHILE MOVING ON AN ANGLE) + (PUSHJ FD-BK) + (GET 0 MOVE-PEN) + (PUT 0 DSR-STATE & RESTORE) + (JUMP PUT-DSR) + + +(& UTILITY SUBRS) + +FETCH-ARG (GET 1 DISPLAY-TOP & GET ARG FROM NEXT WORD IN DISPLAY LIST) + (SUB 1 PC & LEAVE EQ FLAG SET IF ARG NOT THERE) + (READI PC 0) + (POPJ) + +POS-MULTIPLY (PUT 2 SCRATCH & POS NUM IN 1 TIMES NUM IN 0 TO 0) + (LOD 2) + (-15.) + (PUT 2 XR & WE USE THE IR TO ITERATE 16 TIMES) + (NOP 0 & IF NUMBER IN ZERO IS NEG) + (BPL BOTH-POS) + (PUSHJ CMPL0 & CMPLEMENT IT) + (PUSHJ BOTH-POS & MULTIPLY) + (SUBI 1 1 & COMPLEMENT THE SHORT ANSWER) + (0) +CMPL0 (SUBI 0 0 & AND CMPLEMENT ANSWER) + (0) + (POPJ) + +BOTH-POS (SUB 2 2 & RESULT WILL APPEAR HERE) +POS-MULT-LOOP (ADD 2 2 & CLEARS THE CARRY) + (XADD 1 1 & REG ONE MUST BE POSITIVE) + (IFC ADD 2 0 & REG ZERO CAN BE EITHER) + (IFC INC 1 & TO PUT THE HIGH BITS IN 1) + (BXSI POS-MULT-LOOP) + (ROT 2 6. & GET NUMBER DIVED BY 64. IN 0) + (ANDI 0 2 & TEN BITS COME FROM THIS WORD) + (1777) + (ANDI 1 1 & SIX FROM THIS ONE) + (77) + (ROT 1 6.) + (ADD 0 1) + (ANDI 1 0 & ONLY 9 BITS FOR MOVE) + (777 & DO IT HERE SO THE SIGN IS RIGHT) + (GET 2 SCRATCH) + (POPJ) + +RESTORE-DSR (GET 0 DSR-STATE) +PUT-DSR (PUT 0 DSR) + (POPJ) + +T-PENUP (LOD 0 & TEMPORARY PEN UP) + (7) +SET-DSR-PEN (GET 1 DSR-STATE) + (ANDI 1 1) + (17777) + (ANDI 0 0) + (7) + (ROT 0 3) + (ADD 0 1) + (JUMP PUT-DSR) + +GETARG (ROT 0 11. & EXTRACTS 11 BIT SIGNED ARG FROM 0) + (ARS 0 3) + (ARS 0 2) + (POPJ) + +NORMALIZE (LOD 1 & NORMALIZES -1 < REG 0 < 360.) + (360.) +TOO-LOW (NOP 0 & JUMP HERE FOR OTHER NORMS) + (BPL TOO-HIGH) + (ADD 0 1) + (JUMP TOO-LOW & KEEP ADDING REG 1 UNTIL IT IS POSITIVE) +TOO-HIGH (SUB 0 1 & DONE LIKE THIS TO SAVE REGISTERS) + (BPL TOO-HIGH) + (ADD 0 1) + (POPJ) + +TRIG-LOOKUP (GET 1 HEADING & FINDS SIN AND COS OF HEADING) + (LOD 0 & FROM 90 WORD SINE TABLE) + (90.) + (SUB 1 0 & WHICH QUADRANT?) + (BMI QUAD1) + (SUB 1 0) + (BMI QUAD2) + (SUB 1 0) + (BMI QUAD3) + (SUB 1 0) + (BMI QUAD4) + (ERROR & HEADING IS NOT LESS THAN 360) + +QUAD1 (PUSHJ GETTRIG & THIS WILL GET THE RIGHT MAGINTUDES) + (ADD SIN 0 & BUT THEY NEED TO BE SORTED WITH) + (ADD COS 1 & REAGARD TO SIGN AND PHASE) + (POPJ) +QUAD2 (PUSHJ GETTRIG) + (ADD SIN 1) + (SUB COS 0) + (POPJ) +QUAD3 (PUSHJ GETTRIG) + (SUB SIN 0) + (SUB COS 1) + (POPJ) +QUAD4 (PUSHJ GETTRIG) + (SUB SIN 1) + (ADD COS 0) + (POPJ) + +GETTRIG (ADD 1 0 & JUST TO GET THINGS POSITIVE) + (ADDI 0 1) + (TRIG-TABLE-START) + (READ 0 4 & GETS THE FUNCTION WITH POSITIVE DERIVATIVE) + (SUBI 0 1) + (+ TRIG-TABLE-START 90.) + (READ 0 5 & FUCTION WITH MINUS DERIVATIVE) + (GET 0 4 & POS SLOPE) + (GET 1 5 & NEG SLOPE) + (SUB SIN SIN) + (SUB COS COS) + (POPJ) + + +MAKE-SNAP (GET 0 DISPLAY-TOP & SNAP IS TWO WORDS) + (CMP 0 PC & AND DEY BOTH GOTTA BE DER) + (BEQ CHECK-INTS) + (READD PC 0 & POINTER TO TOP OF DATA TO BE COPIED) + (ADDI 1 PC & FIND THE LENGTH OF THE DISPLAY LIST) + (- DISPLAY-LIST-START) + (ADD 1 0 & POINTER TO TOP OF NEW COPY) +MOVE-SNAP (READD PC 0 & COPY LOOP) + (NOP 0 & **** JUST TEMP) + (WRITED 1 0) + (CMPI PC) + (- DISPLAY-LIST-START 1) + (BNE MOVE-SNAP) + (INC PC) + (INC 1) +FLUSH-OLIST (LOD 0 & REPLACE IT WITH A DISPLAY INSTRUCTION) + (34000) + (WRITEI PC 0 & NOTE THIS CAN LOOSE A VECTOR OR SO AT FAST DATA RATES) + (WRITEI PC 1 ) + (PUT PC DISPLAY-TOP) + (JUMP CHECK-INTS & SHOULD BE POPJI) + +CHECK-INTS (BIS SERV-INTERUPT) + (POPJ) + + +( & TEXT DISPLAY INTERRUPT ROUTINES ) + + +(CALL 200 BLANK) +(CALL 202 CRSR-IMAGE) +(CALL 203 CRSR-COMPL) + +(CALL 010000 TV-STATE) +(CALL 167777 TV-STATE-BAR) +(CALL 006000 TV-OPTIONS) +(CALL 171777 TV-OPTIONS-BAR) + + + +(CALL 0 COLR) +(CALL 1 ADR) +(CALL 3 DATA) +(CALL 4 BLNK) + +TV-LINE (GET COLR COLOR) + (NOP COLR) + (BMI LINE-END & IF WE'RE NOT DISPLAYING) + (PUT DATA ISAV-3) + + (GET ADR LINE & START OF CURRENT LINE) + (READI ADR DATA) + (PUT DATA LINE & START OF NEXT LINE) + + (READI ADR DATA & CHAR COUNT OF CURRENT LINE) + (NOP DATA) + (BEQ LINE-EMPTY) + (PUT BLNK ISAV-4 & SAVE IT) + (GET BLNK XR) + (PUT BLNK ISAV-5 & SAVE XR) + (SUBI DATA DATA & XR COUNTS UP TO ZERO) + (1) + (PUT DATA XR) + + (PUSHJ SET-DSR & UPDATE DISPLAY STATUS) + + (ADDI COLR ADR & THE END OF THE LINE) + (36.) + (LOD BLNK) + (BLANK) +GET-WORD (READI ADR DATA) + (CHARTV DATA & CHAR-TV INSTRUCTION) + (GET DATA DATA & YEECH!) + (ROT DATA 8.) + (BXCI HALF-WORD) + (CHARTV DATA) + (GET DATA DATA & YEECH!) + (BXSI GET-WORD) + +WHOLE-WORD (CMP ADR COLR & SEE IF AT END OF LINE) + (BEQ NO-BLANKS) +BLANK-LOOP (CHARTV BLNK) + (GET BLNK BLNK & DOUBLE YEECH!) + (INC ADR) + (CHARTV BLNK) + (GET BLNK BLNK & NOT ANOTHER ONE) + (CMP ADR COLR) + (BNE BLANK-LOOP) + +NO-BLANKS (GET BLNK ISAV-5) + (PUT BLNK XR) + (GET BLNK ISAV-4) +LINE-DONE (GET DATA ISAV-3) + (GET ADR ISAV-2) + +LINE-END (CHARTV COLR) + (GET COLR COLR & AND YET ANOTHER) + (GET COLR ISAV-1) + (JUMP CHECK-INTS & POPJI) + +HALF-WORD (CHARTV BLNK) + (GET BLNK BLNK & FINALLY, THE END!) + (JUMP WHOLE-WORD) + +LINE-EMPTY (ROT COLR 8.) + (PUSHJ SET-DSR) + (JUMP LINE-DONE) + + + +SET-DSR (GET DATA DSR-STATE & UPDATE DISPLAY STATUS) + (ANDI DATA DATA) + (TV-OPTIONS-BAR) + (IOR DATA COLR) + (PUT DATA DSR) + (PUT DATA DSR-STATE) + (POPJ) + + + +( CALL 0 X) +(& CALL 1 ADR) +(& CALL 3 DATA) +( CALL 4 CNT) + +TV-PAGE (GET X SCR-VALUE & SEND SCROLL AND RESET INTERRUPT) + (PUT X SCROLL) + + (GET X BELL-TIME & CHECK STATE OF TEXT DISPLAY) + (NOP X) + (BMI PAGE-END & MINUS 1 IS OFF) + (BEQ PAGE-NORM & 0 IS NORMAL) + (DEC X) + (PUT X BELL-TIME) + (BNE PAGE-END & GREATER THAN 1 IS TEMP OFF FOR BELL FL) + (GET X COLOR & 1 IS END OF OFF PERIOD) + (ANDI X X) + (77777) + (PUT X COLOR) + +PAGE-NORM (GET X TOP-LINE & SET NEXT LINE TO BE DISPLAYED) + (PUT X LINE) + + (GET ADR CRSR-REPL & AS OLD ONE) + (GET X OLD-REPL) + (CMP X ADR) + (BEQ NO-COPY) + (PUSHJ COPY-CRSR) +NO-COPY (GET ADR ISAV-2) + +PAGE-END (GET X ISAV-1) + (JUMP CHECK-INTS & POPJI) + + + + +COPY-CRSR (PUT DATA ISAV-3) + (PUT CNT ISAV-5) + + (PUSHJ SWAP-FONT-MEM) + + (ROT ADR -4) + (ADDI ADR ADR) + (170000) + (LOD X) + (+ 170000 * 16. CRSR-IMAGE) + (LOD CNT) + (15.) +COPY-LOOP (READI ADR DATA) + (NOR DATA DATA & COMPLEMENTS IT) + (WRITEI X DATA & TO MAKE A COMPL CRSR) + (DEC CNT) + (BPL COPY-LOOP) + + (PUSHJ SWAP-FONT-MEM) + + (GET X CRSR-REPL) + (PUT X OLD-REPL) + + (GET CNT ISAV-5 & RESTORE REGS) + (GET DATA ISAV-3) + (POPJ) + + + + +SWAP-FONT-MEM (GET X DSR-STATE & SWITCH TO OR FROM FONT MEMORY) + (XORI X X) + (TV-STATE) + (PUT X DSR) + (PUT X DSR-STATE) + (POPJ) + + +( & EDIT ROUTINES FOR TEXT DISPLAY ) + +(& CALL 0 X) +(& CALL 0 COLR) +(& CALL 1 ADR) +( CALL 2 CHAR) +(& CALL 3 DATA) +(& CALL 4 BLNK) +(& CALL 4 CNT) +( CALL 4 TOP) +( CALL 5 COL) +( CALL 5 XCP) +( CALL 6 HALF) +( CALL 7 ZERO) + + +TV-OFF (SUB DATA DATA) + (PUSHJ TV-DOWN) + (LOD COLR & SET STATE TO OFF) + (-1) + (PUT COLR BELL-TIME) + (POPJ) + + + +TV-ON (LOD COLR & SET STATE TO TURN ON) + (1) + (PUT COLR BELL-TIME) + (POPJ) + + + +TV-DOWN (GET COLR COLOR & SUPPRESS LINE SERVICING) + (IORI COLR COLR) + (100000) + (PUT COLR COLOR) + + (ROT COLR 8. & BLANK SCREEN) + (XOR COLR DATA) + (PUSHJ SET-DSR) + (POPJ) + +TV-FLASH (GET COLR COLOR) + (NOP COLR) + (BMI NO-FLASH) + (LOD DATA) + (TV-OPTIONS) + (PUSHJ TV-DOWN) + (LOD COLR & TURN OFF FOR ONE HALF SECOND) + (4.) + (PUT COLR BELL-TIME) +NO-FLASH (POPJ) + + + + +TV-POS (LOD COLR) + (002014 & O OOO DDO OOO OOB BOO ) + (PUT COLR COLOR) + (JUMP CHECK-INTS & POPJI) + + + + +TV-NEG (LOD COLR) + (004000) + (PUT COLR COLOR) + (JUMP CHECK-INTS & POPJI) + + + +( & INTERRUPTABLE ROUTINES ) + + +TV-INIT (LOD ADR) + (TEXT-START) + (LOD X) + (+ 1 + TEXT-START * 30. 38.) + (SUB ZERO ZERO) + (LOD CNT) + (30.) + +TXT-LOOP (WRITED X ZERO) + (WRITE X ADR) + (GET ADR X) + (ADDI X X) + (-37.) + (DEC CNT) + (BPL TXT-LOOP) + (LOD X) + (TEXT-START) + (PUT X TOP-LINE) + (PUT X CRSR-LINE) + (PUT ZERO CRSR-COL) + (LOD DATA) + (CRSR-IMAGE) + (LOD CNT) + (1) + (INC X) + (WRITEI X CNT) + (WRITE X DATA) + (LOD DATA) + (BLANK) + (PUT DATA CRSR-REPL) + (PUT ZERO OLD-REPL) + (PUT ZERO SCR-VALUE) + (PUSHJ TV-POS) + (PUSHJ TV-ON) + (LOD X) + (12000) + (PUT X DSR-STATE) + (GET 15 X) + (PUT X SCROLL) + (JUMP CHECK-INTS & POPJI) + + + +TV-CHAR (ANDI CHAR CHAR) + (177) + ( CMPI CHAR) + (37) + (BPL CTRL-CHAR) + ( CMPI CHAR) + (177) + (BEQ NULL) + + +INSERT (PUSHJ WRITE-CHAR) + (PUSHJ INC-CRSR) + (JUMP CHECK-INTS & POPJI) + + +CTRL-CHAR (ROT CHAR 5) + (BMI NULL) + (ROT CHAR -1) + (DIS BUS 17) + (JUMP NULL & 0) + (JUMP BACKSPACE & 10) + (JUMP RUBOUT & 4) + (JUMP FORM & 14) + (JUMP BEGIN-LINE & 2) + (JUMP NULL & 12) + (JUMP INC-CRSR & 6) + (JUMP NULL & 16 WILL BE DOWN-CRSR) + (JUMP HOME-CRSR & 1) + (JUMP TAB & 11) + (JUMP END-LINE & 5) + (JUMP NEWLINE & 15) + (JUMP NULL & 3 WILL BE UP-CRSR) + (JUMP NULL & 13) + (JUMP BELL & 7) + + + +NULL (JUMP CHECK-INTS & POPJI FOR LOTS INCLUDES HI CNTL CHRS 17 TO 30) + + + +BELL (PUSHJ TV-FLASH) + (JUMP CHECK-INTS & POPJI) + +BACKSPACE (PUSHJ DEC-CRSR) + (JUMP CHECK-INTS & POPJI) + +RUBOUT (PUSHJ DEC-CRSR) + (LOD CHAR) + (BLANK) + (PUSHJ WRITE-CHAR) + (JUMP CHECK-INTS & POPJI) + + +FORM (PUSHJ HOME-CRSR) + (PUSHJ PAGE-CLEAR) + (JUMP CHECK-INTS & POPJI) + + +NEWLINE (PUSHJ LINE-CLEAR) + (PUSHJ NEXT-LINE) + (PUSHJ LINE-CLEAR) + (JUMP CHECK-INTS & POPJI) + + +TAB (GET X CRSR-COL) + (ANDI X X ) + (7) + (SUBI X X ) + (7) + (LOD CHAR) + (BLANK) +TAB-STEP (PUSHJ WRITE-CHAR) + (PUSHJ INC-CRSR) + (DEC X) + (BPL TAB-STEP) + (JUMP CHECK-INTS & POPJI) + + +TV-QUOTE (ANDI CHAR CHAR) + (177) + (PUSHJ INSERT) + (JUMP CHECK-INTS & POPJI) + + +INC-CRSR (GET COL CRSR-COL) + (CMPI COL) + (71.) + (BEQ END-L) + (PUSHJ MOVE-RIGHT) + (JUMP CHECK-INTS & POPJI) +END-L (PUSHJ NEXT-LINE) + (PUSHJ LINE-CLEAR) + (JUMP CHECK-INTS & POPJI) + + + +DEC-CRSR (GET COL CRSR-COL) + (NOP COL) + (BEQ BEGIN-L) + (PUSHJ MOVE-LEFT) + (JUMP CHECK-INTS & POPJI) +BEGIN-L (PUSHJ PREV-LINE) + (JUMP CHECK-INTS & POPJI) + + +WRITE-CHAR (PUT CHAR CRSR-REPL) + (JUMP CHECK-INTS & POPJI) + + +HOME-CRSR (PUSHJ LIFT-CRSR) + (LOD COL) + (0) + (PUT COL CRSR-COL) + (GET COL TOP-LINE) + (PUT COL CRSR-LINE) + (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) + +BEGIN-LINE (PUSHJ LIFT-CRSR) + (LOD COL) + (0) + (PUT COL CRSR-COL) + (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) + +END-LINE (PUSHJ LIFT-CRSR) + (GET ADR CRSR-LINE) + (INC ADR) + (READ ADR COL) + (PUT COL CRSR-COL) + (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) + +LINE-CLEAR (GET ADR CRSR-LINE) + (INC ADR) + (GET COL CRSR-COL) + (INC COL) + (WRITE ADR COL) + (LOD COL) + (BLANK) + (PUT COL CRSR-REPL) + (JUMP CHECK-INTS & POPJI) + + +PAGE-CLEAR (PUSHJ LINE-CLEAR) + (GET ADR CRSR-LINE) + (SUB ZERO ZERO) + (GET TOP TOP-LINE) +CLR-LOOP (READ ADR HALF) + (GET ADR HALF) + (CMP ADR TOP) + (BEQ CLR-DONE) + (ADDI COL ADR) + (1) + (WRITE COL ZERO) + (JUMP CLR-LOOP) +CLR-DONE (JUMP CHECK-INTS & POPJI) + + +UP-LINE (ADDI ADR ADR) + (-38.) + ( CMPI ADR) + (- TEXT-START 1) + (BMI UP-DONE) + (ADDI ADR ADR) + (* 31. 38.) +UP-DONE (POPJ) + + +NEXT-LINE (PUSHJ LIFT-CRSR) + (GET ADR CRSR-LINE) + (READ ADR HALF) + (GET ADR HALF) + (PUT ADR CRSR-LINE) + (SUB ZERO ZERO) + (PUT ZERO CRSR-COL) + (READ ADR HALF) + (GET ADR HALF) + (GET TOP TOP-LINE) + ( CMP ADR TOP) + (BNE MID-SCREEN) + (READ TOP HALF) + (GET TOP HALF) + (PUT TOP TOP-LINE) +MID-SCREEN (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) + + +PREV-LINE (PUSHJ LIFT-CRSR) + (GET ADR CRSR-LINE) + (GET TOP TOP-LINE) + ( CMP ADR TOP) + (BEQ ROLL-UP) + (PUSHJ UP-LINE) + (PUT ADR CRSR-LINE) + (INC ADR) + (READ ADR TOP) + (PUT TOP CRSR-COL) + (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) +ROLL-UP (PUSHJ UP-LINE & REALLY ROLLS THE SCREEN DOWN, CRSR UP) + (PUT ADR CRSR-LINE) + (PUT ADR TOP-LINE) + (SUB TOP TOP) + (PUT TOP CRSR-COL) + (INC ADR) + (WRITE ADR TOP) + (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) + + +MOVE-RIGHT (PUSHJ LIFT-CRSR) + (GET COL CRSR-COL) + (INC COL) + (PUT COL CRSR-COL) + (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) + + +MOVE-LEFT (PUSHJ LIFT-CRSR) + (GET COL CRSR-COL) + (DEC COL) + (PUT COL CRSR-COL) + (PUSHJ SET-CRSR) + (JUMP CHECK-INTS & POPJI) + + +SWAP (GET ADR CRSR-LINE) + (ADDI ADR ADR) + (2) + (GET COL CRSR-COL) + (GET ZERO CRSR-REPL) + (ROT COL 1) + (BMI UPPER-BYTE) + (ADD ADR COL) + (READ ADR DATA) + (ANDI TOP DATA) + (177400) + (ANDI DATA DATA) + (377) + (IOR TOP ZERO) + (PUT DATA CRSR-REPL) + (WRITE ADR TOP) + (POPJ) + +UPPER-BYTE (ANDI COL COL) + (77777) + (ADD ADR COL) + (READ ADR DATA) + (ROT DATA 8.) + (ANDI TOP DATA) + (177400) + (ANDI DATA DATA) + (377) + (IOR TOP ZERO) + (PUT DATA CRSR-REPL) + (ROT TOP 8.) + (WRITE ADR TOP) + (POPJ) + +LIFT-CRSR (PUSHJ SWAP) + (CMPI ZERO) + (BLANK) + (BNE LIFT-DONE) + (GET ADR CRSR-LINE) + (INC ADR) + (READ ADR DATA) + (DEC DATA) + (GET COL CRSR-COL) + (CMP COL DATA) + (BNE LIFT-DONE) + (WRITE ADR DATA) +LIFT-DONE (POPJ) + +SET-CRSR (PUSHJ SWAP) + (GET ADR CRSR-LINE) + (INC ADR) + (READ ADR DATA) + (GET COL CRSR-COL) + (CMP COL DATA) + (BMI SET-DONE) + (INC COL) + (WRITE ADR COL) + (LOD DATA) + (BLANK) + (PUT DATA CRSR-REPL) +SET-DONE (JUMP CHECK-INTS & POPJI) + + +)) T) + + + + + \ No newline at end of file