PDP11: Add 11LOGO programming language and make it bootable from the NG device.

This commit is contained in:
Lars Brinkhoff 2019-02-07 08:16:52 +01:00
parent 3bdf41c809
commit a070a5375c
10 changed files with 10740 additions and 1 deletions

BIN
PDP11/11logo/11logo.lda Normal file

Binary file not shown.

2190
PDP11/11logo/eval.337 Normal file

File diff suppressed because it is too large Load diff

899
PDP11/11logo/read.62 Normal file
View file

@ -0,0 +1,899 @@
.STITLE READ -
VERN==VERN+%FNAM2
READ: PUSH A
SPUSH B
SPUSH C
SPUSH D
SPUSH E
SPUSH F
CLR RDFLAG
MOV @S,GNCN
BIC #170000,GNCN
CLR F
READA: JSR PC,RDWRD
BR READB
BIS #SEPF,RDFLAG
JSR PC,CKDOTF
READC: JSR PC,LISTB
BIT #SEPF,RDFLAG
BEQ READA
READB: BIC #SEPF,RDFLAG ;CHECK SPECIAL CHAR IN D
JSR PC,CKDOTF ;FIRST CHECK FOR PENDING ":"
CMP #15,D
BEQ READR ;C-R
CMP #'",D
BEQ READS ;STRING
CMP #'[,D
BEQ READL ;LIST
CMP #'],D
BNE .+4
ERROR+COP ;CHAR (]) OUT OF PLACE
CMP #':,D
BEQ READD ;DOTS
BITB #OPERF,DTBL(D) ;IS CHAR AN OPERATOR
BEQ READA ;NO
MOVB DTBL2(D),A
ASL A
MOV SOBLSU(A),B
;SET TYPE TO SFUN OR INFIX
MOV @B,A ;THIS HACK WORKS BECAUSE #SFUN=0
BIC #-INFIX-1,A ; AND #INFIX=10000
BR READC
READR: POPS A
MOV A,@S
CLR TOPS
JMP RETF
READS: JSR PC,GNC
JSR PC,RDST
BR .+2 ;RDST ALWAYS SKIPS
BIS #SEPF,RDFLAG
BR READC
READL: JSR PC,RDLST
POPS TOPS
BIC #SEPF,RDFLAG
BR READC
READD: BIS #DOTF,RDFLAG
BR READA
.STITLE READ - READ WORD
;READ CHARS UP THRU NEXT SEPARATOR CHAR. IF JUST A SEP,
;RETURN WITH IT IN D. OTHERWISE NUMBERIFY OR INTERN CHAR STRING,
;SKIP RETURN WITH TOKEN IN A,,B
RDWRD: CLRB RDFLAG
JSR PC,BLSTI
RDWA: JSR PC,GNC
MOVB DTBL(D),A ;GET FLAGS IN A
BIT #SEPF,A ;IS THIS CHAR A SEPARATOR?
BNE RDWB ;YES
BISB A,RDFLAG
JSR PC,BLST
BR RDWA
RDWB: JSR PC,BLSTF ;FINISH OFF STRING
RTS PC ;NO CHARS SEEN BEFORE SEP
BIT #NNUMF,RDFLAG
BNE RDWC ;NOT A POSSIBLE NUMBER
MOV TOPS,B
MOV #LNUM,A
JSR PC,CONVER ;TRY MAKING A #
SKPRET ;LOST SO LEAVE AS LSTR
SKPRET ;OK
RDWC: MOV #UFUN,A ;TRY TO INTERN STRING IN TOPS AS A SYSTEM OR USER FUNCTION
BIT #DOTF,RDFLAG ; UNLESS DOTF ON, THEN AS USER VARIABLE
BEQ RDWD
MOV #UVAR,A
BIC #DOTF,RDFLAG
RDWD: JSR PC,.INTRN ;RDSTR COMES HERE ALSO
BR RDWE
JSR PC,FRELST
RDWE: BIS A,B
SKPRET
.STITLE READ - READ STRING
;READ CHAR UP TO NEXT SPACE OR ] IF INSIDE
;A LIST. DONT ALLOW ] OR [.
;ALWAYS SKIPS
RDST: CLRB RDFLAG
JSR PC,BLSTI
BR RDSB
RDSA: JSR PC,GNC
RDSB: MOVB DTBL(D),A
BIT #SEPF,A
BEQ RDSE
CMP #' ,D
BEQ RDSX
CMP #'],D
BEQ RDSC
CMP #'[,D
BEQ RDSX
CMP #15,D
BEQ RDSX
RDSE: BIS A,RDFLAG
JSR PC,BLST
BR RDSA
RDSC: TST LISTBD ;ARE WE IN LIST
BNE RDSX ;YES
RDSD: ERROR+COP ;CHAR (D) OUT OF PLACE
RDSX: MOV #LSTR,A
MOV #LSTR, B
JSR PC,BLSTF
RDSR: RTS PC ;EMPTY STRING
MOV #LSTR,A
MOV TOPS,B
BIT #NNUMF,RDFLAG
BEQ RDSR ;IT IS A POSSIBLE NUMBER
BIT #SEPF,RDFLAG
BNE RDSR ;IT HAS A SEP CHAR IN IT
MOV #ATOM,A
JMP RDWD ; INTERN IT
.STITL READ - READ LIST
;READ THRU MATCHING ] MAKING A LIST AS U GO
RDLST: CLRB RDFLAG
JSR PC,SLISTB
RDLA: JSR PC,GNC
CMP #' ,D
BEQ RDLA ;SKIP OVER SPACES
CMP #'[,D
BEQ RDLB ;READ A LIST
CMP #'],D
BEQ RDLY ;DONE
JSR PC,RDST ;READ A STRING
BR .+2 ;RDST ALWAYS SKIPS
RDLX: JSR PC,LISTB ;ADD THIS NODE TO LIST
CMP #'[,D
BEQ RDLB
CMP #'],D ;AT END?
BNE RDLA ;NO, GET NEXT ELEMENT
RDLY: JSR PC,FLISTB
RTS PC
RDLB: JSR PC,RDLST
POPS TOPS
CLR D
BR RDLX
.STITLE READ - MISC
CKDOTF: BIT #DOTF,RDFLAG
BEQ LISTBR
BIC #DOTF,RDFLAG
PUSH A
SPUSH B
MOV #SFUN,A
MOV #$DOTS,B
JSR PC,LISTB
JMP RETB
LISTB: MOV F,C ;BUILD A LIST, ADD NODE IN A,,B TO
JSR PC,GRBAD1 ;LIST WHOSE LAST NODE PTR IS IN F
TST F
BNE LISTB1
PUSHS C
BIS #LIST,@S
LISTB1: MOV C,F
LISTBR: RTS PC
SLISTB: MOV @P,A ;START LISTB SAVE RETURN
MOV F,@P ;SAVE CURRENT LAST NODE PTR
CLR F
INC LISTBD
JMP @A
FLISTB: POP C ;SAVE RETURN
TST F
BNE FLSB1
PUSHS #LIST
FLSB1: POP F ;RESTORE OLD CURRENT NODE PTR
MOV #LIST,A
MOV @S,B
JMP @C
BLSTI: CLR NCHR
CLR E
CLR TOPS
BLSTI1: BIS #100000,E
RTS PC
BLST: ;BUILD STRING - CHAR IN D, USES E
;DESTROYS A,B,C
PUSH A
SPUSH B
SPUSH C
BIT #200,D ;CHECK IF IGNORE BIT ON
BNE BLSTRT
BIT #177,D ;CHECK IF NULL
BEQ BLSTRT
INC NCHR ;WE HAVE A CHAR
ADD #40000,E
BGE BLST2 ;IS IT THE SECOND
MOVB D,TEMP ;NO, 1ST
BLSTRT: JMP RETC
BLST2: MOVB D,TEMP+1 ;IT IS THE SECOND CHAR
MOV TEMP,B
;STORE THE CHARACTERS
BLST3: JSR PC,BSAN
BIS #100000,E
BR BLSTRT
BLSTF: ;FINISH BUILDING STRING, PUT PTR IN TOPS.
; DONT SKIP IF EMPTY STRING (TOPS=0)
TST NCHR
BEQ BSANR ;EMPTY STRING
ADD #40000,E
BGE .+4 ;IS LAST NODE USED
SKPRET
PUSH A
SPUSH B
SPUSH C
MOVB TEMP,B ;YES
JSR PC,BSAN
BLSTF1: JMP SRETC
BSAN: MOV E,C
MOV #SSTR,A
JSR PC,GRBAD1
TST E
BNE BSAN1
MOV C,TOPS ;SAVE NEW STRING PTR ON S
BIS #LSTR,TOPS
BSAN1: MOV C,E
BSANR: RTS PC
.STITL GNC - GET NEXT CHAR
GNC: PUSH A ;GET NEXT CHAR INTO D
SPUSH B ;INITIALIZE BY MOVING LSTR PTR INTO GNCN
GNC4: MOVB GNCN+2,D ; AND CLEARING TYPE FIELD (#170000)
MOV GNCN,B ;SKIPS UNLESS NO MORE CHAR
BLT GNC1 ;JUST GOT 2ND CHAR
BNE GNC3
MOV #15,D
JMP RETB ;NONE LEFT
GNC3: JSR PC,.LOAD ;GET NEXT NODE
BIS #100000,A ;SET "STILL ANOTHER CHAR" BIT
MOV A,GNCN
MOVB B,D ;FOR OUTPUT
SWAB B
MOVB B,GNCN+2
GNC2: TST D
BEQ GNC4 ;IGNORE NULL CHARS
JMP RETB
GNC1: BIC #170000,GNCN ;CLEAR "STILL ..." BIT
BR GNC2
.STITL ERRORS AND HANDLER
EMTBK: MOV #SRET,@P ;FAKE IT OUT
RTI
ERRBK: PUSH A
MOV 2(P),A ;GET LOC OF ERROR
MOV #TYO,PCHR
JSR PC,PRONL ;PRINT ADDR WHERE ERROR OCCURED
SPACE
MOV -2(A),A ;GET ERROR #
BIC #177400,A
ASL A
MOV ERTAB(A),A ;POINTS TO LIST FOR THIS ERROR
JMP @A ;XFER TO LIST
ERRRT: POP A
RTI
ERTAS: SPUSH A
MOV 2(P),A ;TYPE ASCIZ STRING, STRING FOLLOWS CALL
JSR PC,PRAS
BIT A,#1 ;IF STRING STOPPED ON ODD ADDR
BEQ .+4
INC A ;MAKE IT EVEN
MOV A,2(P)
SPOP A
RTS PC
PRLO: PUSH A ;PRINT LAST OPERATOR
SPUSH B
MOV LO,A
BEQ EMPTY
MOV LO+2,B
BR PRCO1
PRCO: PUSH A, ;PRINT CURRENT OPERATOR
SPUSH B
MOV CO,A
MOV CO+2,B
BEQ EMPTY
PRCO1: SPUSH D
JSR PC,PROAB
SPOP D
JMP RETB
PROAB: CMP A,#UFUN ;PRINT OPERATOR IN A,B
BLO PRCO2
JMP PPNAME ;PRINT PNAME
PRCO2: MOV B,A ;SYSTEM FUNCTION
ADD #4,A
JMP PRAS ;PRINT ASCIZ PNAME
EMPTY: PRTXT ^\ EMPTY \
JMP RETB
ERTAP: MOV @(P),A ;TYPE ASCIZ STRING, POINTER FOLLOWS CALL
INC @P
INC @P
PRAS: SPUSH D ;PRINT ASCIZ STRING POINTED TO BY A
PRAS1: MOVB (A)+,D
BEQ PRASR
JSR PC,@PCHR
BR PRAS1
PRASR: SPOP D
RTS PC
PRON: BIC #TF2,TFLAGS ;PRINT OCTAL NO., NO. IN A
BR PRON1 ;CALL- JSR PC,PRON
PRONL: BIS #TF2,TFLAGS
PRON1: PUSH A ;PRON DOESN'T PRINT LEADING ZEROS, PRONL DOES
SPUSH D
CLR D
SEC
ROL A ;TO TELL WHEN WE ARE DONE
BR PRON2
PRON3: CLR D
ASL A
BEQ PRON5
ROL D
ASL A
ROL D
ASL A
PRON2: ROL D
BNE PRON4
BIT #TF2,TFLAGS
BEQ PRON3
PRON4: BIS #TF2,TFLAGS
BIS #60,D
JSR PC,@PCHR
BR PRON3
PRON5: BIS #60,D
BIT #TF2,TFLAGS
BNE .+6 ;IF NOTHING HAS BEEN TYPED, TYPE A ZERO
JSR PC,@PCHR
SPOP D
SPOP A
RTS PC
PRDNL: BIS #TF1,TFLAGS
BR .+10
PRDN: BIC #TF1,TFLAGS ;PRINT DECIMAL NO. IN A
PUSH B
SPUSH D
MOV #10,B
MOV A,MQ
BGE PRDN1
NEG MQ ;ITS NEGATIVE
MOV #'-,D
JSR PC,@PCHR
PRDN1: MOV DTOTB(B),DIVIDE
BIT #TF1,TFLAGS
BNE PRDN2
BITB #MQZ,EAESR ;> ZERO?
BNE PRDN3 ;NO
BIS #TF1,TFLAGS
PRDN2: MOV MQ,D
ADD #'0,D
JSR PC,@PCHR
PRDN3: MOV AC,MQ
SUB #2,B
BNE PRDN1
MOV MQ,D
ADD #'0,D
JSR PC,@PCHR
POP D
SPOP B
RTS PC
DTOTB: 1.
10.
100.
1000.
10000.
EMPTY1: JMP EMPTY
PRS1: PUSH A ;PRINT TOP ELEMENT OF SS
SPUSH B
MOV CSPDLP,A
ADD SPRBAO,A
CMP A,S
BLOS EMPTY1
MOV @S,B
SPUSH D
JSR PC,PNODAB
SPOP D
JMP RETB
PNODAB: MOV B,A
BIC #7777,A
CMP #SSTR,A
BEQ PRS11
CMP #ATOM,A
BLOS PRS11
ERROR+INVN ;INVALID NODE
PRS11: JSR PC,PRDATA
RTS PC
PRCT: PUSH A ;PRINT CURRENT TOKEN
SPUSH B
SPUSH D
MOV CT,A
MOV CT+2,B
JSR PC,PRTAB
SPOP D
JMP RETB
PRTAB: BIC #7777,A ;PRINT TOKEN IN A,B
CMP A,#UVAR
BHIS .+6
JMP PROAB
CMP A,#UVAR
BEQ PRUV
BR PRDATA
PRATM: BIS #PQF,FLAGS2 ;PRINT ATOM IN A,B
BR PRUV1
PRUV: MOVB #':,D ;PRINT USER VARIABLE IN A,B
JSR PC,@PCHR
PPNAME: BIC #PQF,FLAGS2 ;PRINT PNAME - UOE PTR IN B
PRUV1: JSR PC,.LOAD
JMP PRLSTR ;PRINT PNAME
PRDATA: CMP #LNUM,A ;PRINT DATA IN A,B. 7777 FIELD OF A IS 0000
BEQ PRNUM ;NUMBER
CMP #SNUM,A
BEQ PRNUM
BIS #PQF,FLAGS2 ;SET PRINT QUOTE FLAG
CMP #ATOM,A
BEQ PRUV1
CMP #LSTR,A
BEQ PRLSTR ;LONG STRING
CMP #SSTR,A
BEQ PRSSTR ;SHORT STRING
BIC #PQF,FLAGS2
CMP #LIST,A
BEQ PRLST
ERROR+CPS ;CANT PRINT A SNAP
PRLSTR: JSR PC,.LOAD ;PRINT LONG STRING
PRSSTR: JSR PC,PRQQ ;PRINT SHORT STRING
PRSTR2: MOVB B,D
BLE PRSTR3 ;NULL CHAR
JSR PC,@PCHR
PRSTR3: SWAB B
MOVB B,D
BLE PRSTR4 ;NULL CHARACTER
JSR PC,@PCHR
PRSTR4: MOV A,B
BIC #170000,B
BEQ PRSRET
JSR PC,.LOAD
BR PRSTR2
PRSRET: RTS PC
PRQQ: BIT #PQF,FLAGS2 ;PRINT ' " ' IF PQF=1
BEQ PRSRET
BIT #DPQF,FLAGS2
BNE PRSRET
MOVB #'",D
JMP @PCHR
PRNUM: CLR TEMP
BIC #7777,A
CMP #SNUM,A
BEQ PRNUM2
PRNUM1: JSR PC,.LOAD ;GET FIRST NODE
BIT #7777,A ;ONLY PRINT SNUM S FOR NOW
BEQ PRNUM2
ERROR+NTB ;# TOO BIG
PRNUM2: MOV B,A
JSR PC,PRDN
RTS PC
PRLST: PUSH A ;PRINT LIST, PTR IN B
SPUSH B
SPUSH C
TST NBKTS
BEQ PRL4
MOV #'[,D
JSR PC,@PCHR
PRL4: INC NBKTS
MOV B,C
PRL1: BIT #7777,C ;EMPTY LIST
BEQ PRL2 ;YES, DONE
BIS #DPQF,FLAGS2 ;DONT PRINT QUOTE BEFORE STRINGS
BR PRL3
PRL6: SPACE
PRL3: JSR PC,.LOADC ;GET THIS NODE
MOV A,C ;SAVE PTR TO NEXT
BIC #7777,A
JSR PC,PRTAB
BIT #7777,C
BNE PRL6
PRL2: DEC NBKTS
BEQ PRL5
MOV #'],D
JSR PC,@PCHR
PRL5: JMP RETC
PRNODE: PUSH A ;PRINT NODE POINTED TO BY B
SPUSH B
SPUSH D
JSR PC,.LOAD
JSR PC,PRON
SPACE
MOV B,A
JSR PC,PRON
SPOP D
JMP RETB
SEX1: JSR PC,PRNODE ;FOR FOO$X COMMAND IN 11SIM
HALT
SEX: JSR PC,PRNODE ;FOR RUG
JMP RUG
ERTLN: ;ERR RETURN TO LEVEL N
ERTL0: ;ERR RETURN TO LEVEL 0
MOV FUNLEV,A
BEQ ERTL1
PRTXT ^\LEVEL \
JSR PC,PRDN
PRTXT ^\ LINE \
MOV CLN,A
JSR PC,PRDN
PRTXT ^\ IN \
MOV CPP,B
JSR PC,PPNAME
PRCR
ERTL1: MOV USER,U
MOV #DBITTB,A
ADD U,A
MOV #1,(A)+
CLR (A)+
CLR (A)+
CLR (A)+
CLR (A)+ ;THAT SHOULD BE ENOUGH
MOV UDSKAD(U),UNXTDB(U)
MOV #PDLINK-SLOT1,A
ADD BASEUS,A
CLR @A
CLR 2(A)
MOV A,P
MOV A,PRBAO
MOV A,PPOPL
SUB #524,A
MOV A,PPUSHL
MOV #SDLINK-SLOT1,A
ADD BASEUS,A
CLR 2(A)
CLR @A
MOV A,S
MOV A,SPRBAO
MOV A,SPOPL
SUB #524,A
MOV A,SPUSHL
MOV #TOPS,A
MOV #<NCHR-TOPS>/2,B
CLR (A)+
DEC B
BGE .-4
CLR BRAKE
JMP MLOOP
SHOW: JSR PC,GUOEB ;SHOW "FOO"
BR SHOW5
MOV B,E
JSR PC,.BINDF
SHOW5: ERROR+PNH ;PROCEDURE NOT HERE
MOV B,F
PRCR
PRTXT ^\TO \
MOV E,B
JSR PC,PPNAME
MOV F,C
JSR PC,.LOADC
MOV A,F ;SAVE PTR TO NEXT NODE
JSR PC,.LOAD ;#ARGS IN B
TST B
BEQ SHOW2
MOV A,C
SHOW1: SPACE
JSR PC,.LOADC ;NEXT ARG
MOV A,C
JSR PC,PRUV ;PRINT ITS PNAME
BIT #7777,C
BNE SHOW1
SHOW2: PRCR
BIT #7777,F
BEQ SHOW4
MOV F,C
SHOW3: JSR PC,.LOADC
MOV A,C
MOV B,@S
JSR PC,PRLN
BIT #7777,C
BNE SHOW3
SHOW4: PRTXT ^\END\
PRCR
JMP NORT
PRLN: PUSH A ;PRINT TOKENS IN LIST ON S
SPUSH B
SPUSH C
SPUSH D
BIC #DPQF,FLAGS2 ;DO PRINT QUOTE BEFORE STRINGS
MOV @S,C
BR PRLN2
PRLN1: SPACE
PRLN2: JSR PC,.LOADC
MOV A,C
JSR PC,PRTAB
BIT #7777,C ;DONE?
BNE PRLN1 ;NO
PRCR
JMP RETD
STRACE: BIT #TRACEF,FLAGS2 ;SYSTEM TRACE
BNE .+4
RTS PC
INC NBKTS
PUSH A
PRTXT ^/CT=/
BIC #DPQF,FLAGS2
JSR PC,PRCT
PRTXT ^/ CO=/
JSR PC,PRCO
PRTXT ^/ S=/
BIC #DPQF,FLAGS2
JSR PC,PRS1
PRCR
CLR NBKTS
POP A
RTS PC
ETRACE: BIC #TF6,TFLAGS
BR TRA1
TRACE: BIS #TF6,TFLAGS
TRA1: JSR PC,GUOEB
BR TRA5
JSR PC,.BNDFS
TRA5: ERROR+PNH ;PROC NOT HERE
MOV B,C ;B POINTS TO LIST OF GOODIES. FIRST IS FLAGS,,#ARGS
JSR PC,.LDP2
BIC #TPTF,A
BIT #TF6,TFLAGS
BEQ TRA2
BIS #TPTF,A
TRA2: JSR PC,.STP2
JMP NORT
SETSTF: BIS #TRACEF,FLAGS2 ;SET SYSTEM TRACE FLAG
JMP NORT
CLRSTF: BIC #TRACEF,FLAGS2
JMP NORT
FLEV: MOV FUNLEV,B ;RETURN USER PROC CALL DEPTH
JMP R1NARG
VERSN: MOV LVERNF,B
JMP R1NARG
.MACR ERMM AA
.XLIST
AA==ERMNO
ERMNO==ERMNO+1
AA'.E
.LIST
.ENDM
.MACR BEGER A
A'.E: .OFFSE 0 ;(THIS WILL BE NON-ZERO LATER)
.ENDM
.MACR ENDER
.XLIST
PRCR
JMP ERTLN
.OFFSE 0
.LIST
.ENDM
ERMNO==0
ERTAB: ERMM BSS ;BAD SS
ERMM CFL ;CANT FIND LINE #
ERMM COP ;CHAR (D) OUT OF PALCE
ERMM CPS ;CANT PRINT SNAP
ERMM CTIP ;CANT "TO" IN PROCEDURE
ERMM CTIT ;CANT "TO" IN "TO"
ERMM ERP ;EXTRA RIGHT PAREN
ERMM HNM ;... HAS NO MEANING
ERMM HNV ;... HAS NO VALUE
ERMM ILN ;..(CT).. IS AN INVALID LOGO NAME.
ERMM INF1 ;INFIX IN THE WRONG PLACE
ERMM INVN ;INVALID NODE
ERMM ITB ;INPUT TOO BIG
ERMM LCE ;LINE ... CHANGED BY EDIT
ERMM LDE ;LINE ..(B).. DOESN'T EXIST
ERMM LNTB ;LINE # TOO BIG
ERMM NDU ;NOT A DISPLAY USER
ERMM NOU ;NO OUTPUT
ERMM NSL ;NO STORAGE LEFT
ERMM NTB ;# TOO BIG
ERMM NTF ;(S) NOT "TRUE" OR "FALSE"
ERMM NTL ;NUMBER TOO LONG
ERMM NY ;NOT YET!!
ERMM OIP ;ONLY IN PROCEDURE
ERMM OOB ;OUT OF BOUNDS
ERMM OOP ;(CO) OUT OF PLACE
ERMM OOT ;OUT OF TOKENS
ERMM PAE ;PROCEDURE ..(CT).. ALREADY EXISTS
ERMM PNH ;PROCEDURE ... NOT HERE
ERMM RTB ;RESULT TOO BIG
ERMM STD ;SNAP TOO DEEP
ERMM TIP ;TOO MUCH INSIDE PARENS
ERMM TML ;TOO MANY LINES
ERMM TMS ;TOO AMNY SNAPS
ERMM UEL ;UNEXPECTED END OF LINE
ERMM WDW ;WHAT SHOULD I DO WITH ...
ERMM WIC ;YOU CAN'T WIPE WHILE IN CAMERA
ERMM WIT ;(CT) IS WRONG INPUT TO "TO"
ERMM WTA ;..(CO)..DOESN'T LIKE..(CT)..AS INPUT
ERMM WTAA ;..(CO)..DOESN'T LIKE..(A)...AS INPUT
ERMM WTAB ;..(CO)..DOESN'T LIKE..(B)...AS INPUT
ERMM YND ;YOU DON'T HAVE THE DISPLAY
ERMM YNT ;YOU DON'T HAVE THE TURTLE
ERTEND: ERMNO ;NEXT AVAILABLE ERR NO.
BEGER WTAA
PUSHS A
JSR PC,PRCO
PRTXT ^/ DOESN'T LIKE /
JSR PC,PRS1
PRTXT ^/ AS INPUT./
ENDER
BEGER WTAB
PUSHS B
JSR PC,PRCO
PRTXT ^/ DOESN'T LIKE /
JSR PC,PRS1
PRTXT ^/ AS INPUT./
ENDER
BEGER WTA
JSR PC,PRCO
PRTXT ^/ DOESN'T LIKE /
JSR PC,PRS1
PRTXT ^/ AS INPUT./
ENDER
BEGER INF1
JSR PC,PRCO
PRTXT ^/ IS IN THE WRONG PLACE./
ENDER
BEGER NOU
JSR PC,PRLO
PRTXT ^/ DIDN'T OUTPUT!/
ENDER
BEGER OOT
PRTXT ^/OUT OF TOKENS./
ENDER
BEGER BSS
PRTXT ^/BAD SS./
ENDER
BEGER NY
PRTXT ^/NOT YET!!/
ENDER
BEGER WDW
PRTXT ^/WHAT SHOULD I DO WITH /
JSR PC,PRS1
ENDER
BEGER HNV
JSR PC,PRCT
PRTXT ^/ HAS NO VALUE./
ENDER
BEGER ERP
PRTXT ^/EXTRA RIGHT PAREN./
ENDER
BEGER TIP
PRTXT ^/TOO MUCH INSIDE PARENS./
ENDER
BEGER OOP
JSR PC,PRCO
PRTXT ^/ OUT OF PLACE./
ENDER
BEGER UEL
PRTXT ^/UNEXPECTED END OF LINE./
ENDER
BEGER NSL
PRTXT ^/NO STORAGE LEFT./
ENDER
BEGER NTF
JSR PC,PRS1
PRTXT ^/ NOT "TRUE" OF "FALSE"./
ENDER
BEGER LDE
PRTXT ^\LINE \
JSR PC,PRDN ;LINE # SHOULD BE IN B
PRTXT ^\ DOESN'T EXIST.\
ENDER
BEGER LNTB
PRTXT ^\LINE NUMBER TOO BIG.\
ENDER
BEGER COP
PRTXT ^\CHAR \
JSR PC,TYO
PRTXT ^\ OUT OF PLACE.\
ENDER
BEGER CPS
PRTXT ^\CANT PRINT A SNAP\
ENDER
BEGER NTB
PRTXT ^\# TOO BIG\
ENDER
;MORE ERROR MESSAGES:
BEGER NDU
PRTXT ^/YOU DON'T HAVE A DISPLAY CONSOLE/
ENDER
BEGER NTL
PRTXT ^/NUMBER TOO LONG/
ENDER
BEGER OOB
PRTXT ^/OUT OF BOUNDS/
ENDER
BEGER TML
PRTXT ^/TOO MANY LINES/
ENDER
BEGER STD
PRTXT ^/SNAP TOO DEEP/
ENDER
BEGER TMS
PRTXT ^/TOO MANY SNAPS/
ENDER
BEGER WIC
PRTXT ^/YOU CANT WIPE WHILE IN CAMERA/
ENDER
BEGER YND
PRTXT ^/YOU DONT HAVE THE DISPLAY/
ENDER
BEGER YNT
PRTXT ^/YOU DONT HAVE THE TURTLE/
ENDER
BEGER CFL
PRTXT ^/CANT FIND LINE NO. /
ENDER
BEGER HNM
PRTXT ^/... HAS NO MEANING./
ENDER
BEGER LCE
PRTXT ^\LINE ... CHANGED BY EDIT.\
ENDER
BEGER PNH
PRTXT ^/PROCEDURE ... NOT HERE/
ENDER
BEGER PAE
CLR TOPRNM
PRTXT ^/PROCEDURE /
JSR PC,PRCT
PRTXT ^/ ALREADY EXISTS./
ENDER
BEGER ILN
JSR PC,PRCT
PRTXT ^/ IS AN INVALID LOGO NAME./
ENDER
BEGER WIT
CLR TOPRNM
JSR PC,PRCT
PRTXT ^/ CAN'T BE A DUMMY INPUT TO "TO"./
ENDER
BEGER RTB
PRTXT ^\ARITHMETIC RESULT TOO BIG.\
ENDER
BEGER ITB
PRTXT ^\ARITHMETIC INPUT TOO BIG.\
ENDER
BEGER CTIP
PRTXT ^\CANT "TO" IN A PROCEDURE.\
ENDER
BEGER CTIT
PRTXT ^\CANT "TO" IN "TO".\
ENDER
BEGER INVN
PRTXT ^\INVALID NODE.\
ENDER
BEGER OIP
PRTXT ^\ ONLY WHEN IN A PROCEDURE.\
ENDER


3103
PDP11/11logo/system.327 Normal file

File diff suppressed because it is too large Load diff

1457
PDP11/11logo/turtle.62 Normal file

File diff suppressed because it is too large Load diff

1111
PDP11/11logo/tyi.152 Normal file

File diff suppressed because it is too large Load diff

297
PDP11/11logo/zend.67 Normal file
View file

@ -0,0 +1,297 @@
.STITL DISC BLOCKS, NODE SPACE AND TEST LINES
VERN==VERN+%FNAM2
.MACR NODE A,B
.XLIST
$.==$$+1
A
B
$$==$$+1
.LIST
.ENDM
VERNF==VERN
SALTL: LTL
LTL: L1
L2
L3
L4
L5
L6
0 ;L7
0 ;L8
0 ;L9
0 ;L10
0 ;L11
0 ;L12
0 ;L13
0 ;L14
0
.EVEN
SLOT1:
MSLTLN==LUVBLK+PPDLL+SPDLL+DBUFL+DDIRL+<4*4096.> ;ALL YOU COULD POSSIBLY WANT
UVSAV: .=.+LUVBLK
.=.+PPDLL
IP=.
PDLINK: .=.+4 ;LINK TO PREVIOUS DISK BLOCK
.=.+SPDLL
IS=.
SDLINK: .=.+4
HCC==67. ;HASH CODE CONSTANT - A PRIME
UHCT: .=UHCT+<2*16.>
$OB3
$OB4
$OB5
.=UHCT+<2*23.>
$OB2
.=UHCT+<2*60.>
$OB1
.=UHCT+<2*HCC>
DBUF: .=.+DBUFL
DDIR: .=.+DDIRL
0
0
.IF2
PAD ^\ START OF NODESP\,\.
.ENDC
NODESP: 0 ;NODE 0
0
.=NODESP+80.
TRUE=140000+20.
SSTR+21. ;20
"TR
SSTR+0 ;21
"UE
FALSE=140000+22.
SSTR+23. ;22
"FA
SSTR+24. ;23
"LS
SSTR+0 ;24
'E
.=NODESP+404.
L1=101. ;PRINT "ABCD"
SFUN+102. ;NODE 101
$PRINT
LSTR+0 ;102
LSTR+103.
SSTR+104. ;103
"AB
SSTR ;104
"CD
L2=105. ;"123"
LSTR+0 ;105
LSTR+106.
SSTR+107. ;106
"12
SSTR ;107
'3
SFUN ;108
0
SFUN ;109
0
L3=110. ;(PRINT "AXBYJ" "1Q" "FOOBAR")
SFUN+111. ;110
$LPAR
SFUN+112. ;111
$PRINT
LSTR+117. ;112
LSTR+114.
SSTR+0 ;113
"1Q
SSTR+115. ;114
"AX
SSTR+116. ;115
"BY
SSTR+0 ;116
'J
LSTR+118. ;117
LSTR+113.
ATOM+119. ;118
ATOM+122.
SFUN+0 ;119
$RPAR
SFUN+0 ;120
0
$OB1=121.
0 ;121 = START OF UOB BUCKET 60.
$FOO
$FOO=122.
ATOM+125. ;122 - HEADER OF FIRST UOE
LSTR+123.
SSTR+124. ;123
"FO
SSTR+0 ;124
'O
VBIND+$FOOF ;125 - VARIABLE BINDING OF 1ST UOE
LSTR+126.
SSTR+127. ;126
"FO
SSTR+128. ;127
"OB
SSTR+0 ;128
"AR
0 ;129
0
L4=130. ;IF "TRUE" THEN PRINT "TRUE" ELSE PRINT "FALSE"
SFUN+131. ;130
$IF
LSTR+134. ;131
LSTR+132.
SSTR+133. ;132
"TR
SSTR+0 ;133
"UE
SFUN+135. ;134
$THEN
SFUN+136. ;135
$PRINT
LSTR+137. ;136
LSTR+132.
SFUN+138. ;137
$ELSE
SFUN+139. ;138
$PRINT
LSTR+0 ;139
LSTR+140.
SSTR+141. ;140
"FA
SSTR+142. ;141
"LS
SSTR+0 ;142
'E
SFUN+0 ;143
0
$$=144.
L5=$$ ;MAKE "BAR" "AB1C"
NODE SFUN+$.,$MAKE
NODE ATOM+$.,ATOM+$BAR
NODE LSTR,LSTR+$.
NODE SSTR+$.,"AB
NODE SSTR,"1C
L6=$$ ;PRINT :BAR
NODE SFUN+$.,$PRINT
NODE UVAR,UVAR+$BAR
$OB2=$$
NODE 0,$BAR ;START OF UOB BUCKET 23.
$BAR=$$
NODE ATOM,LSTR+$.
NODE SSTR+$.,"BA
NODE SSTR,'R
L7==$$ ;FOO :BAR "GRINCH"
NODE UFUN+$.,$FOO
NODE UVAR+$.,UVAR+$BAR
NODE LSTR,LSTR+$.
NODE SSTR+$.,"GR
NODE SSTR+$.,"IN
NODE SSTR,"CH
$FOOF=$$
NODE FBIND+$.,LIST+$FLLP
NODE SFBIND,LIST+$FSFB
$FLLP=$$
NODE LIST+$.,LIST+$FL0
NODE LIST+$.,LIST+$FL1
NODE LIST,LIST+$FL2
$FL0=$$
NODE SNUM+$.,2
NODE SNUM+$.,$A
NODE SNUM,$B
$FL1=$$
NODE SNUM+$.,10.
NODE SFUN+$.,$PRINT
NODE UVAR,UVAR+$A
$FL2=$$
NODE SNUM+$.,20.
NODE SFUN+$.,$PRINT
NODE UVAR,UVAR+$B
$FSFB=$$
NODE SNUM+$.,2 ;NO. ARGS
NODE SNUM+$.,0 ;PROCD SWAP NO.
NODE SNUM+$.,0 ;NO. NODES
NODE SNUM+$.,0 ;NO. FLUSHABLE NODES
NODE SNUM+$.,0 ;DISC ADDR 1
NODE SNUM+$.,0 ; " " 2
NODE SNUM+$.,0 ;# WORDS ON DISC
$OB3=$$
NODE 0,$A ;START OF UOB BUCKET 16.
$OB4=$$
NODE 0,$B ;START OF UOB BUCKET 17.
$OB5=$$
NODE 0,$C ;START OF UOB BUCKET 18.
$A=$$
NODE ATOM,LSTR+$.
NODE SSTR,'A
$B=$$
NODE ATOM+$BVB,LSTR+$.
NODE SSTR,'B
$BVB=$$
NODE VBIND,LSTR+$.
NODE SSTR+$.,"B.
NODE SSTR+$.,"HA
NODE SSTR+$.,"S.
NODE SSTR+$.,"LO
NODE SSTR,"TS
$C==$$
NODE ATOM+$CVB,LSTR+$.
NODE SSTR,'C
$CVB==$$
NODE VBIND,LNUM+$.
NODE SNUM,100.
L8=$$ ;MAKE "BLIP" 13
NODE SFUN+$.,$MAKE
NODE LSTR+$.,LSTR+$BLIP
NODE LNUM,LNUM+$.
NODE SNUM,13
L9=$$ ;PRINT : "BLIP"
NODE SFUN+$.,$PRINT
NODE SFUN+$.,$DOTS
NODE LSTR,LSTR+$BLIP
L10=$$ ;MAKE "BLIP" "XX"
NODE SFUN+$.,$MAKE
NODE LSTR+$.,LSTR+$BLIP
NODE LSTR,LSTR+$.
NODE SSTR,"XX
L11=$$ ;PRINT :"BLIP"
NODE SFUN+$.,$PRINT
NODE SFUN+$.,$DOTS
NODE LSTR,LSTR+$BLIP
L12=$$ ;MAKE "BLAP" "YY"
NODE SFUN+$.,$MAKE
NODE LSTR+$.,LSTR+$BLAP
NODE LSTR,LSTR+$.
NODE SSTR,"YY
L13==$$ ;PRINT :"BLAP"
NODE SFUN+$.,$PRINT
NODE SFUN+$.,$DOTS
NODE LSTR,LSTR+$BLAP
L14==$$ ;STARTDISPLAY
NODE SFUN,$START
L15==$$ ;FORWARD :C
NODE SFUN+$.,$FORWA
NODE UVAR,UVAR+$C
$BLAP==$$ ;"BLAP"
NODE SSTR+$.,"BL
NODE SSTR,"AP
$BLIP==$$ ;"BLIP"
NODE SSTR+$.,"BL
NODE SSTR,"IP
NNN=$$ ;NEXT NODE NO.
SOFN=NNN ;START OF FREE NODES
ASOFN=.
LOGEND=.
;IN THE EVENT THAT THE SYSTEM OBLIST
;HAS BEEN INCORRECTLY SET UP, AND THE MACRO TRIED TO WRITE OVER
;PARTS OF IT, THIS LITTLE .IFLE WILL PRINT OUT A MESSAGE
.IFLE OBX0
********
YOU ARE OVERWRITING THE SYSTEM OBLIST
********
.XLIST
.ENDC
.END


1639
PDP11/pdp11_11logo_rom.h Normal file

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,7 @@
#include "display/display.h" #include "display/display.h"
#include "display/ng.h" #include "display/ng.h"
#include "sim_video.h" #include "sim_video.h"
#include "pdp11_11logo_rom.h"
/* Run a NG cycle every this many PDP-11 "cycle" times. */ /* Run a NG cycle every this many PDP-11 "cycle" times. */
#define NG_DELAY 1 #define NG_DELAY 1
@ -42,6 +43,7 @@ t_stat ng_rd(int32 *data, int32 PA, int32 access);
t_stat ng_wr(int32 data, int32 PA, int32 access); t_stat ng_wr(int32 data, int32 PA, int32 access);
t_stat ng_svc(UNIT *uptr); t_stat ng_svc(UNIT *uptr);
t_stat ng_reset(DEVICE *dptr); t_stat ng_reset(DEVICE *dptr);
t_stat ng_boot(int32 unit, DEVICE *dptr);
t_stat ng_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat ng_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat ng_show_type(FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat ng_show_type(FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat ng_set_scale(UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat ng_set_scale(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
@ -103,7 +105,7 @@ DEVICE ng_dev = {
"NG", &ng_unit, ng_reg, ng_mod, "NG", &ng_unit, ng_reg, ng_mod,
1, 8, 16, 1, 8, 16, 1, 8, 16, 1, 8, 16,
NULL, NULL, &ng_reset, NULL, NULL, &ng_reset,
NULL, NULL, NULL, &ng_boot, NULL, NULL,
&ng_dib, DEV_DIS | DEV_DISABLE | DEV_UBUS | DEV_DEBUG, &ng_dib, DEV_DIS | DEV_DISABLE | DEV_UBUS | DEV_DEBUG,
0, ng_deb, NULL, NULL, NULL, &ng_help, NULL, 0, ng_deb, NULL, NULL, NULL, &ng_help, NULL,
&ng_description &ng_description
@ -193,6 +195,40 @@ ng_reset(DEVICE *dptr)
return SCPE_OK; return SCPE_OK;
} }
t_stat
ng_boot(int32 unit, DEVICE *dptr)
{
t_stat r;
set_cmd (0, "CPU 56K");
set_cmd (0, "NG TYPE=LOGO");
set_cmd (0, "PCLK ENABLED");
set_cmd (0, "KE ENABLED");
set_cmd (0, "RF ENABLED");
attach_cmd (0, "RF dummy");
sim_set_memory_load_file (BOOT_CODE_ARRAY, BOOT_CODE_SIZE);
r = load_cmd (0, BOOT_CODE_FILENAME);
sim_set_memory_load_file (NULL, 0);
cpu_set_boot (0400);
sim_printf ("List of 11LOGO commands:\n");
sim_printf (
"AND, BACK, BUTFIRST, BUTLAST, COUNT, CTF, DIFFERENCE, DISPLAY, DO,\n"
"EDIT, ELSE, EMPTYP, END, EQUAL, ERASETRACE, FIRST, FORWARD, FPRINT,\n"
"FPUT, GO, GREATER, HEADING, HERE, HIDETURTLE, HOME, IF, KILLDISPLAY,\n"
"LAMPOFF, LAMPON, LAST, LEFT, LESS, LEVEL, LIST, LISTP, LPUT, MAKE,\n"
"MOD, NEWSNAP, NUMBERP, OF, OUTPUT, PENDOWN, PENUP, PRINT, PRODUCT,\n"
"QUOTIENT, REQUEST, RIGHT, RUG, SENTENCE, SETHEADING, SETTURTLE, SETX,\n"
"SETXY, SETY, SHOW, SHOWTURTLE, SNAP, STARTDISPLAY, STF, STOP, SUM,\n"
"THEN, TO, TOOT, TRACE, TYPE, VERSION, WIPE, WIPECLEAN, WORD, WORDP,\n"
"XCOR, YCOR.\n\n");
sim_printf ("MIT AI memo 315 documents a later version of 11LOGO but may be helpful\n");
sim_printf ("in exploring the software. It can currently be found here:\n");
sim_printf ("https://dspace.mit.edu/handle/1721.1/6228\n\n");
sim_printf ("To get started with turtle graphics, type STARTDISPLAY.\n\n\n");
return r;
}
t_stat t_stat
ng_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc) ng_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{ {
@ -289,6 +325,12 @@ t_stat ng_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr
fprintf(st, "Set SCALE to one of 1, 2, 3, or 4 to select full size, half size,\n"); fprintf(st, "Set SCALE to one of 1, 2, 3, or 4 to select full size, half size,\n");
fprintf(st, "quarter size, or eighth size.\n\n"); fprintf(st, "quarter size, or eighth size.\n\n");
fprintf(st, "The primary software for the NG display was MIT's PDP-11 Logo, or 11LOGO.\n");
fprintf(st, "To run 11LOGO:\n\n\n");
fprintf(st, " sim> set cpu 11/45\n");
fprintf(st, " sim> set ng enabled\n");
fprintf(st, " sim> boot ng\n\n");
return SCPE_OK; return SCPE_OK;
} }
#else /* USE_DISPLAY not defined */ #else /* USE_DISPLAY not defined */

View file

@ -48,6 +48,7 @@ struct ROM_File_Descriptor {
{"VAX/vmb.exe", "VAX/vax_vmb_exe.h", 44544, 0xFFC014BB, "vax_vmb_exe"}, {"VAX/vmb.exe", "VAX/vax_vmb_exe.h", 44544, 0xFFC014BB, "vax_vmb_exe"},
{"PDP11/lunar11/lunar.lda", "PDP11/pdp11_vt_lunar_rom.h", 13824 , 0xFFF15D00, "lunar_lda"}, {"PDP11/lunar11/lunar.lda", "PDP11/pdp11_vt_lunar_rom.h", 13824 , 0xFFF15D00, "lunar_lda"},
{"PDP11/dazzledart/dazzle.lda", "PDP11/pdp11_dazzle_dart_rom.h", 6096, 0xFFF83848, "dazzle_lda"}, {"PDP11/dazzledart/dazzle.lda", "PDP11/pdp11_dazzle_dart_rom.h", 6096, 0xFFF83848, "dazzle_lda"},
{"PDP11/11logo/11logo.lda", "PDP11/pdp11_11logo_rom.h", 26009, 0xFFDD77F7, "logo_lda"},
{"swtp6800/swtp6800/swtbug.bin", "swtp6800/swtp6800/swtp_swtbug_bin.h", 1024, 0xFFFE4FBC, "swtp_swtbug_bin"}, {"swtp6800/swtp6800/swtbug.bin", "swtp6800/swtp6800/swtp_swtbug_bin.h", 1024, 0xFFFE4FBC, "swtp_swtbug_bin"},
{"3B2/rom_400.bin", "3B2/rom_400_bin.h", 32768, 0xFFD55762, "rom_400_bin"}, {"3B2/rom_400.bin", "3B2/rom_400_bin.h", 32768, 0xFFD55762, "rom_400_bin"},
}; };