Preprocessor for PALD/PAL8 on TSS8/OS8

94 views
Skip to first unread message

Rick Adams

unread,
Apr 4, 2024, 9:51:56 AMApr 4
to PiDP-8
I've been playing around with doing some PAL assembler development and cooked up a preprocessor to make my life a little easier.  See  yggdrasilradio/p8pp (github.com)

If you have no need for such a thing, you might still like pawing through the sample assembler programs.

When developing the CYLON program for OS8 I had to put in an explicit check for a keystroke to end the program because ^C and ^BS didn't seem to work.  Is there something I don't know?  (Quite likely...)

folke...@gmail.com

unread,
Apr 4, 2024, 10:11:11 AMApr 4
to PiDP-8
Hi Rick,

happy to see more assembly activities here!

In case you need a quick development cycle, I developed a new PDP-8 assembler called Yamas that is completely compatible to PAL-8 and MACRO8: https://github.com/fpw/yamas

It's implemented more like a compiler than an assembler, so there is a proper frontend that generates an AST and a backend that generates code from there, so this might help in developing custom tools.

But I think more interesting for general use is the integration into my PDP-8 simulator on https://pdp8.app/

The third icon on the left brings up an assembly editor where you can paste and edit your programs, assemble them and load them right into the running machine. I was able to paste your hello.pal program into there, hit assemble and then load, switch back to the machine using the first icon and then load and run from 0200 to get the attached output, all within a few seconds. Right now it's more like a proof of concept, but I will eventually turn this into a little IDE.

You can also create custom machines using the 2nd icon that support TSS/8.

Hope that helps,
Folke

yamas-hello.png

Alen Shapiro

unread,
Apr 4, 2024, 11:00:14 AMApr 4
to PiDP-8
Hi Rick,

A while ago I found someone else's cylon program (thanks Mark) and modified it to check for ^C as a typed character rather than trying to hook into some tty driver interrupt handler. Here's the full program (my part's just a few lines, using variable named "K03" for ^C).

I paste the program text into the PiDP8 using this set of commands:

.R PIP
*MARKB2.PL<TTY:
<PASTE> (this line is where you paste the assembler text)
^Z
*^C
.
.PAL MARKB2.PL
.LOAD/G MARKB2

Here's the PAL program text:

/YET ANOTHER BLICKEN LIGHTS PROGRAM. THIS VERSION IS BASED ON
/ONE FOR THE IMSAI 8080, BUT USING THE PDP-8'S EAE
/MULTIPLIER QUOTIENT TO SIMPLY DISPLAY THE FRONT PANEL LIGHT
/PANEL PATTERNS (WHEREAS THE IMSAI USED ITS PROGRAMMED OUTPUT
/DISPLAY).
/
/I HAVE COMMENTED OUT THE RANDOM FEATURE AS I'VE SEEM TO HAVE
/RUN INTO A LIMIT IN PAL & MAC ASSEMBLING CODE THIS LARGE.
/
/ SW 0: 0 - DOT | 1 - DASH
/ SW 1: 0 - RIGHT       | 1 - LEFT
/ SW 2: 0 - NORMAL | 1 - BOUNCE
/ SW 3: 0 - NORMAL | 1 - RANDOM (IGNORE OTHERS)
/ SW ALL 1 OR KEYBOARD ^C = TERMINATE AND RETURN TO MONITOR PROGRAM
/
/CREATED JUNE 2022 BY MARK LAWLER
/TERMINATE WITH ^C ADDED BY ALEN SHAPIRO

MUY=7405
MQA=7501
MQL=7421
CAM=7621

IR1=10          /DELAY INNER REGISTER
IR2=11          /DELAY OUTER REGISTER

*200

START,  CLA CLL         /CLEAR ACCUMULATOR AND LINK
        JMS INSTR       /DISPLAY INSTRUCTIONS TO USER ON CONSOLE

LOOP,   CLA CLL         /CLEAR ACCUMULATOR AND LINK
        JMS GCMD        /GET COMMAND FROM SWITCHES
        TAD DSPBTS      /LOAD UP AND LIGHT UP  
        MQL             / MQ WITH DISPLAY BITS
        JMS DELAY       /TAKE A REST SO MQ ISN'T A BLUR
        JMS CDSP        /COMPUTE NEXT DISPLAY PATTERN
        JMS GETCC       /EXIT TO MONITOR IF CHAR TYPED (CHANGE TO IF ^C TYPED)
        JMP LOOP        /LET'S GO DO THIS AGAIN

GCMD,   .               /ROUTINE TO READ SWITCHES FOR COMMANDS
        CLA CLL         /CLEAR ACCUMULATOR AND LINK
        OSR             /READ IN THE SWITCH VALUES
        DCA CURSW       /STORE AWAY FOR LATER RECALL
        TAD CURSW       /HAVE THE SWITCH SETTINGS EVEN CHANGED?
        CIA             / MAKE THE NUMBER NEGATIVE
        TAD LASTSW      / AND ADD THE LAST TO IT. IF == 0 NO CHANGE
        SZA             /HAVE SWITCHES CHANGED SINCE LAST TIME?
        JMP GCMD0       / YES: LET'S GO DO SOMETHING USEFUL
        JMP GCMDE       / NO: LET'S GET OUT OF HERE
GCMD0,                  /SWITCHES CHANGED -- GRAB AND EXECUTE COMMAND
        CLA CLL
        TAD CURSW       /WHAT WERE THOSE SWITCH SETTINGS AGAIN?
        DCA LASTSW      /STORE THAT THEY'VE CHANGED
        TAD CURSW       /WHAT WERE THOSE SWITCH SETTINGS AGAIN?
        CMA             /TEST FOR 7777?
        SNA             / NO: EXAMINE SWITCH SETTINGS MORE
        JMP I [7600     / YES: EXIT TO MONITOR PROGRAM
        CMA             /WHAT WERE THOSE SWITCH SETTINGS AGAIN?
        AND (0001       /DISPLAY A DOT OR A DASH?
        SNA             / IT WAS THE DASH
        JMP GCMD1       / IT WAS THE DOT
        CLA CLL
        TAD DASH        /LOAD THE DASH
        DCA DSPBTS      / STORE IT
        JMP GCMD2       / AND TEST NEXT SWITCH
GCMD1,  TAD DOT         /LOAD THE DOT
        DCA DSPBTS      / STORE IT
GCMD2,  TAD LASTSW      /ARE WE GOING TO THE LEFT OR TO THE RIGHT?
        AND (0002
        DCA DIR         /STORE OUR DIRECTION
GCMD3,  TAD LASTSW      /DO WE WANT TO BOUNCE IN KITT MODE?
        AND (0004
        DCA BOUNCE      /STORE IF WE BOUNCE OR NOT
GCMD4,  TAD LASTSW      /DO WE WANT RANDOM BITS?
        AND (0010
        DCA RANDOM      /STORE IF WE WANT RANDMOM BITS OR NOT
GCMDE,  JMP I GCMD      /RETURN TO CALLER

CDSP,   .               /ROUTINE TO COMPUTE NEXT DISPLAY PATTERN
        CLA CLL         /CLEAR AC AND LINK
        TAD RANDOM      /CHECK FOR RANDOM BITS
        SNA             /ARE WE RANDOMIZING?
        JMP CDSP1       / NO: CALC OUR NEXT ROTATION
        JMS GETRND      / YES: TEE UP THE NEXT RANDOM NUMBER
        DCA DSPBTS      /STORE IT FOR DISPLAY
        JMP I CDSP      /AND RETURN TO CALLER
CDSP1,  JMS ROT         /TIME TO ROTATE SINCE NOT RANDOM
        JMP I CDSP      /AND RETURN TO CALLER

GETRND, 0               /ROUTINE GENERATES A RANDOM NUMBER
        CLA CLL         /CLEAR AC & AL; RN RETURNED IN AC
        TAD LRNDMQ      /LOAD THE LAST RANDOM MQ VALUE
        MQL             /STORE THAT IN THE MQ AS NEXT SEED
        TAD LSTRND      /GET THE LAST RANDOM VALUE
        MUY 5545        /MULTIPLY BY 2917 BASE 10
        TAD RNDADD      /SUM IN RANDOM NUMBER ADDEND
        DCA LSTRND      /SAVE RANDOM NUMBER FOR NEXT TIME
        CLA CLL
        MQA             /STORE WHAT IS IN MQ
        DCA LRNDMQ      /LATER AS OUR NEXT SEED VALUE
        TAD LSTRND      /CALLER EXPECTS RND VAL IN AC
        JMP I GETRND    /RETURN TO CALLER

ROT,    .               /MOVE THE DOT/DASH TO LEFT OR RIGHT
        CLA CLL         /CLEAR AC AND LINK
        TAD DSPLNK      /WAS THE LINK SET IN PREVIOUS ROTATE?
        SZA             / NO: SKIP NEXT INSTRUCTION
        CML             / YES: SET THE LINK BEFORE WE DO NEXT ROTATE
        CLA             /CLEAR THE AC
        TAD DIR         /LOAD THE DIRECTION WE ARE SUPPOSED TO ROTATE
        SNA             / !=0 SO GOING RIGHT
        JMP ROTL        / ==0 SO GOING LEFT
ROTR,   CLA
        TAD DSPBTS
        RAR             /SHIFT RIGHT ONE BIT
        JMP ROTE        /GO SAVE THE RESULTS
ROTL,   CLA
        TAD DSPBTS
        RAL             /SHIFT LEFT ONE BIT
ROTE,   DCA DSPBTS      /SAVE THE RESULTS
        SZL             /IS THE LINK SET?
        JMP ROTE1       / YES: GO TO STORING LINK IS NOW SET
        CLA             / NO: STORE THAT THE LINK
        DCA DSPLNK      /       IS NOW CLEAR
        JMP I ROT       /RETURN TO CALLER
ROTE1,  CLA             /STORE THAT THE LINK
        IAC             / HAD BEEN SET WITH THAT
        DCA DSPLNK      / LAST ROTATE
        TAD BOUNCE      /SINCE WE HIT END, DO WE CHANGE DIRECTIONS?
        SNA             / YES: WE'LL NEED TO CHANGE DIRECTIONS
        JMP I ROT       / NO: RETURN TO CALLER
        CLA
        TAD DIR         /WHAT DIRECTION WERE WE GOING?
        SZA             / YES: WERE GOING LEFT
        JMP ROTE2       / NO: WERE GOING RIGHT
        CLA             /NOW START GOING RIGHT
        IAC
        JMP ROTE3
ROTE2,  CLA             /NOW START GOING LEFT
ROTE3,  DCA DIR         /STORE OUR NEW DIRECTION,IGNORING DIR SWITCH
        JMP I ROT       /RETURN TO CALLER

DSPBTS, 0               /BIT PATTERN WE ARE DISPLAYING IN MQ
DSPLNK, 0               /DISPLAY VALUE OF LINK
DOT,    1               /WHAT A DOT SHOULD LOOK LIKE
DASH,   7               /WHAT A DASH SHOULD LOOK LIKE
CURSW,  0               /CURRENT SWITCH SETTINGS
LASTSW, -1              /LAST SWITCH SETTINGS
DIR,    0               /DIRECTION: 0=LEFT; !0=RIGHT (CALL ME LAZY)
BOUNCE, 0               /KITT MODE: 0=OFF; !0=ON
RANDOM, 0               /RANDOM BITS: 0=OFF; !0=ON
LSTRND, 0               /LAST RANDOM NUMBER
LRNDMQ, 541             /LAST RANDOM MQ
RNDADD, 541             /353 BASE 10
DELAYV, -50             /OUTLOOP DELAY

PAGE
DELAY,  .               /DELAY ROUTINE SO WE CAN SEE WHAT IS GOING ON
        CLA CLL         /CLEAR AC AND LINK
        TAD DELAYV      /LOAD OUTER LOOP COUNT
        DCA IR2         / AND STORE IT
DELAYO, ISZ IR2         /OUTER DELAY LOOP. DONE?
        JMP DELAYI      / NO: DO THE INNER LOOP
        JMP I DELAY     / YES: RETURN TO CALLER
DELAYI, ISZ IR1         /INNER DELAY LOOP. DONE?
        JMP DELAYI      / NO: DO NEXT INNER LOOP
        JMP DELAYO      / YES: DO NEXT OUTER LOOP

INSTR,  .               /ROUTINE TO DISPLAY INSTRUCTIONS ON CONSOLE
        TSF             /IS THE CONSOLE READY TO RECEIVE OUTPUT?
        SKP             / NO: WAIT THEN INITIALIZE IT
        JMP INSTR1      / YES: OUTPUT OUR INSTRUCTIONS
        DELAY           /GIVE IT SOME TIME TO COME AROUND
        CLA             /THEN SEND IT A <NUL> TO
        TLS             /INITIALIZE FURTHER
INSTR1, JMS WRMSG
        TEXT @-MARKBITS PROGRAM-@
        JMS WRMSG
        TEXT @SW 0: 0 - DOT    : 1 - DASH@
        JMS WRMSG
        TEXT @SW 1: 0 - RIGHT  : 1 - LEFT@
        JMS WRMSG
        TEXT @SW 2: 0 - NORMAL : 1 - BOUNCE@
        JMS WRMSG
        TEXT @SW 3: 0 - NORMAL : 1 - RANDOM (IGNORE OTHERS)@
        JMS WRMSG
        TEXT @SW ALL 1 OR KEYBOARD ^C = QUIT@
        JMP I INSTR     / RETURN MAIN PROGRAM

PAGE
/ WRITE MESSAGE TO CONSOLE
/ CALLING SEQUENCE
/       ... AC MUST BE ZERO
/       JMS     WRMSG
/               TEXTZ   @MESSAGE@
/       ... NORMAL RETURN, AC == 0
/
WRMSG,  .
WRLP,  
        TAD I WRMSG     / MESSAGE TEXT FOLLOWS CALL
        MQL             / SAVE NEXT MESSAGE WORD IN MQ
        ISZ WRMSG       / BUMP RETURN ADDRESS
        CLA MQA         / EMIT HI 6B OF WORD
        BSW             / SWAP BYTES IN THE AC -- PIP8/E CMD
        JMS WRHF
        CLA MQA         / EMIT LO 6B OF WORD
        JMS WRHF
        JMP WRLP

WRHF,   .               / ROUTINE WRITE HI 6B OF WORD
        AND K77         / EXTRACT 6B PAL CHAR
        SNA             / ZERO MARKS END OF MESSAGE
        JMP WREX
        TAD K40         / CONVERT 6B PAL TO 7B ASCII
        AND K77
        TAD K40
        JMS WRCHR
        JMP I WRHF
WREX,   TAD K15         / OUTOUT A CR/LF COMBINATION STARTING WITH CR
        JMS WRCHR
        TAD K12         / FOLLOWED BY LF
        JMS WRCHR
        JMP I WRMSG

K177,   177
K77,    77
K40,    40
K15,    15
K12,    12
K03,    3               /^C
TMP,    0

/ WRITE CHARACTER TO CONSOLE
/ CALLING SEQUENCE
/        ... AC MUST CONTAIN 7B ASCII CHAR
/       JMS     WRCHR
/       ... NORMAL RETURN, AC == 0
/
WRCHR,  0
        TSF             /TEST IF READY FOR NEXT
        JMP .-1         /WAIT UNTIL READY
        TLS             /SEND THE CHARACTER
        CLA             /SOME CONSOLES DO NOT CLEAR AC
        JMP I WRCHR     /RETURN TO CALLER

GETCC,  0
        KSF             /SKIP IF CHAR READY
        JMP I GETCC     /RETURN TO CALLER (NOTHING THERE)
        KRB             /READ CHARACTER INTO AC
        AND K177        /JUST 7 BITS OF CHAR
        /ECHO CHAR AND RESTORE IT FOR EXIT TEST
        DCA TMP         /SAVE CHAR
        TAD TMP         /RESTORE AC
        JMS WRCHR       /ECHO CHAR
        TAD TMP         /RESTORE AC AS WRCH CLEARS AC
        /TEST IF KB CHAR WAS ^C
        CMA IAC         /AC = -AC
        TAD K03         /AC += K03 (AC = -AC + K03)
        SZA             /ZERO IF CHAR == ^C, EXIT TO MONITOR
        JMP I GETCC     /RETURN TO CALLER (NOT ^C)
        JMP I [7600     /EXIT TO MONITOR PROGRAM
$

Rick Adams

unread,
Apr 5, 2024, 1:58:37 PMApr 5
to pid...@googlegroups.com
Your program worked on the first try.

Here's how I paste in text:

.CREATE TEST.PA
*I
<paste>
^L
*E

.

Alen Shapiro

unread,
Apr 5, 2024, 2:44:04 PMApr 5
to PiDP-8
Thanks Rick,

I'll use your paste mechanism in future. Much cleaner :-).

Rick Adams

unread,
Apr 5, 2024, 4:50:13 PMApr 5
to pid...@googlegroups.com

Also, .PA seems to be the assumed file extension for PAL source files, not .PL

If TEST.PA exists, you can assemble it and run it all in one step with EX TEST

TEST.PL is okay, but in that case you need EX TEST.PL

Mark Lawler

unread,
Apr 12, 2024, 3:01:40 PMApr 12
to PiDP-8
Oh wow.  Haven't seen that source code in a bit!  Still running on my PiDP-8 today!  Somehow I did manage to get my source to assemble with the randomized section not commented out such that SW 3 to would turn on a random display on the Multiplier Quotient vs a Kitt/Cylon back and forth.  My lizard brain seems to remember that I had to play with starting memory and PAGE placements to get around the errors.  Thanks for the update for ^C from the keyboard vs having to flip all the switches up!

Best,
-Mark

Alen Shapiro

unread,
Apr 12, 2024, 4:21:24 PMApr 12
to PiDP-8
Hi Mark, 

YW. Yup, it certainly has been a while. I'd love to get an updated copy of your Cylon/Random source. Much better than circulating an old version :-)

--Alen
(from Lisa-slayer days (pre-Mac)).

Reply all
Reply to author
Forward
0 new messages