mirror of
https://github.com/PDP-10/its.git
synced 2026-02-14 12:04:03 +00:00
This is the code for the CONS Lisp machine GT40 attached to 10-11 Unibus 2. It's also a Datapoint emulator and a graphical display.
9421 lines
186 KiB
Plaintext
9421 lines
186 KiB
Plaintext
.TITLE CONS-CONSOLE -- ALSO DATAPOINT EMULATOR
|
||
;ALSO GENERAL PURPOSE GRAPHICS DISPLAY
|
||
|
||
;PITTS JARVIS/JOE COHEN -- AUGUST 1973
|
||
|
||
%ABSADR==1
|
||
|
||
.IIF NDF GT40P, GT40P==0 ;1 TO ASSEMBLE GT40 ROUTINES
|
||
.IIF NDF TVP, TVP==1 ;1 TO ASSEMBLE TV ROUTINES
|
||
.IIF NDF KBDP, KBDP==0 ;0 TO USE FANCY KEYBOARD
|
||
.IIF NDF DEBUG, DEBUG==0 ;1 TO RUN UNDER PDP11 SIMULATOR?
|
||
|
||
;VARIOUS DEBUGGING AIDS
|
||
.MACRO BPT ;MISFEATURE IN PALX
|
||
RMS LOSES
|
||
.ENDM
|
||
.MACRO NOP
|
||
RMS LOSES
|
||
.ENDM
|
||
.IFNZ DEBUG
|
||
.STITL DEBUGGING VERSION FOR 11/20
|
||
BPT==3 ;BREAKPOINT INSTUCTION
|
||
NOP==BPT
|
||
PATL==100
|
||
.ENDC
|
||
.IFZ DEBUG
|
||
.STITL GT40 VERSION
|
||
DEBUG==0
|
||
BPT==3
|
||
NOP==BPT
|
||
PATL==40
|
||
.ENDC
|
||
|
||
;DLIMSW==0 ;IF NZ, ASSEMBLE DISPLAY LIMITING
|
||
;(THIS HACK USED EMT FOR SOME WEIRD REASON)
|
||
PCHIST==0 ;KEEPS HISTORY OF PCS IN PCBUF
|
||
|
||
.SBTTL DEFINITIONS
|
||
.IF2
|
||
;.IFNZ DLIMSW
|
||
;.PRINT /DISPLAY LIMITING
|
||
;/
|
||
;.ENDC
|
||
.IFNZ PCHIST
|
||
.PRINT /PC HISTORY
|
||
/
|
||
.ENDC
|
||
.ENDC
|
||
|
||
;MACROS
|
||
|
||
.MACRO PUSH A
|
||
.NLIST
|
||
MOV A,-(SP)
|
||
.LIST
|
||
.ENDM
|
||
|
||
.MACRO POP A
|
||
.NLIST
|
||
MOV (SP)+,A
|
||
.LIST
|
||
.ENDM
|
||
|
||
.MACRO REPORT TEXT,NUM
|
||
.IF2
|
||
.PRINT /TEXT NUM
|
||
/
|
||
.ENDC
|
||
.ENDM
|
||
|
||
.MACRO ZAPFLG FOO
|
||
.NLIST
|
||
%COMPAT==0
|
||
MOV PC,FOO
|
||
%COMPAT==1
|
||
.LIST
|
||
.ENDM
|
||
|
||
;REGISTER ASSIGNMENTS
|
||
|
||
A=%0 ;USED FOR ARGUMENT PASSING
|
||
B=%1
|
||
C=%2
|
||
T=%3
|
||
TT=%4
|
||
U=%5 ;RESERVED FOR PIECE OF PAPER NUMBER
|
||
SP=%6
|
||
PC=%7
|
||
.XCREF A,B,C,T,TT,SP,PC
|
||
|
||
;MEMORY MAP
|
||
|
||
NXMPC= 4 ;BUS ERROR VECTOR
|
||
NXMPSW= 6
|
||
RESPC== 10 ;RESERVED INTRUCTION VECTOR
|
||
RESPSW==12
|
||
BPTPC== 14 ;BREAK POINT VECTOR
|
||
BPTPSW==16
|
||
IOTPC== 20 ;IOT VECTOR
|
||
IOTPSW==22
|
||
PWRPC= 24 ;POWER FAIL TRAP VECTOR
|
||
PWRPS= 26
|
||
EMTPC= 30 ;EMULATE TRAP VECTOR
|
||
EMTPSW= 32
|
||
TRPPC== 34 ;TRAP INSTRUCTION VECTOR
|
||
TRPPSW==36
|
||
TIMEH==40 ;32 BIT 60 CYCLE COUNTER FOR LISPM, HIGH PART
|
||
TIMEL==42 ;" " LOW PART
|
||
TYIPC= 60 ;TTY INPUT INTERUPT VECTOR
|
||
TYIPSW= 62
|
||
LKPC= 100 ;LINE CLOCK INTERUPT VECTOR
|
||
LKPSW= 102
|
||
KLIPC= 300 ;KL11 INPUT INTERUPT VECTOR
|
||
KLIPSW=302
|
||
DSPC= 320 ;DISPLAY STOPPED INTERRUPT VECTOR
|
||
DSPSW= 322
|
||
DLPPC= 324 ;LIGHT PEN INTERRUPT VECTOR
|
||
DLPPSW=326
|
||
DTOPC= 330 ;DISPLAY TIME/SHIFT OUT VECTOR
|
||
DTOPSW=332
|
||
|
||
HMEML==35714 ;HI LIMIT OF MEM USED BY DYNAMIC HACK
|
||
DSKRQB=35716 ;DISK REQUEST BUFFER (SEE CCDISK)
|
||
DSKRBL==30. ;NUMBER OF REQUESTS IN BUFFER
|
||
DSKRBE==DSKRQB+4+<10.*DSKRBL> ;END ADDRESS
|
||
.IIF P2 .IIF GT DSKRBE-LDBFF2, .ERR DISK REQUEST BUFFER OVERLAPS AUX LOAD BUFFER
|
||
LDBUFF=37002 ;LOW 1/2 OF FLAG DOUBLE WD USED TO SIGNAL STATE OF
|
||
;LOADER BUFFER
|
||
; 0 -> BUFFER EMPTY,
|
||
;-1 -> DO READING OP
|
||
; (BUFFER FULL OF REGISTER EXAMINE COMMANDS)
|
||
;+ -> DO WRITING OP
|
||
; (BUFFER FULL OF REGISTER DEPOSIT COMMANDS)
|
||
LDBUF=37004 ;ADDRESS OF FIRST BUFFER BLOCK
|
||
LDBUFB==40 ;LOAD BUFFER LENGTH IN BLOCKS (4 WD EA)
|
||
LDBUFL==LDBUFB*10 ;LOAD BUFFER LENGTH IN BYTES
|
||
LDBFF2=36376 ;FLAG WORD FOR AUXILIARY BUFFER
|
||
LDBUF2=36400 ;ADDR OF FIRST BUFFER BLOCK IN AUX BUFFER
|
||
.IIF GT LDBUF2+LDBUFL-LDBUFF-2, .ERR BUFFERS OVERLAP
|
||
|
||
;RUGSA==37000 ;RUG STARTING ADDRESS
|
||
;RUGBRK==RUGSA+162 ;RUG BREAK POINTER HANDLER
|
||
|
||
KLIS=175610 ;KL11 INPUT STATUS
|
||
KLIB=175612 ;KL11 INPUT BUFFER
|
||
KLOS=175614 ;KL11 OUTPUT STATUS
|
||
KLOB=175616 ;KL11 OUTPUT BUFFER
|
||
TKS= 177560 ;TTY KEYBOARD STATUS
|
||
TKB= 177562 ;TTY KEYBOARD BUFFER
|
||
LKS= 177546 ;LINE CLOCK STATUS
|
||
CSR= 177570 ;CONSOLE SWITCH REGISTER
|
||
PS= 177776 ;PROCESSOR STATUS REGISTER
|
||
.SBTTL GT40 DEFINITIONS
|
||
.IFNZ GT40P
|
||
|
||
;GEOMETRY
|
||
|
||
BITPL==2000 ;BITS PER LINE
|
||
NLINS==1400 ;LINES ON SCREEN
|
||
BYTPL==BITPL/10 ;BYTES PER LINE
|
||
WRDPL==BYTPL/2 ;WORDS PER LINE
|
||
|
||
CHRWD==16 ;CHARACTER WIDTH
|
||
CHRHT=30 ;CHARACTER HEIGHT
|
||
CHRPL==BITPL/CHRWD ;CHARACTERS PER LINE
|
||
CHRLN==NLINS/CHRHT ;CHARACTER LINES ON SCREEN
|
||
|
||
DPC= 172000 ;DISPLAY PROGRAM COUNTER
|
||
DSR= 172002 ;DISPLAY STATUS REGISTER
|
||
XSR= 172004 ;X STATUS REGISTER, GRAPH PLOT INCREMENT
|
||
YSR= 172006 ;Y STATUS REGISTER, CHARACTER REGISTER
|
||
|
||
;GT40 OPCODES
|
||
|
||
DPYJMP==160000
|
||
DPYNOP==164000
|
||
DPYSTP==173400 ;STOP DISPLAY AND CAUSE INTERRUPT
|
||
DPYJSR==DPYSTP+1 ;CALL DPY SUBROUTINE
|
||
DPYRTS==DPYSTP+2 ;RETURN FROM DPY SUBROUTINE
|
||
DPYJSI==DPYSTP+3 ;INDIRECT CALL DPY SUBROUTINE
|
||
SETPNT==114000
|
||
RPOINT==130000
|
||
SVW==104000
|
||
LVW==110000
|
||
CHARS==100000
|
||
DPYNRM==3724 ;NORMAL SET GRAPHIC MODE BITS
|
||
; INTENSITY 7
|
||
; NO LIGHT PEN
|
||
; NO BLINK
|
||
; NO ITALICS
|
||
; SOLID LINE
|
||
BLENAB==20 ; LISTEN TO DBLINK BIT
|
||
DBLINK==10 ; YES BLINK (IF ENABLED)
|
||
|
||
STSNRM=171640 ;NORMAL A REGISTER SETTINGS
|
||
; ENABLE STOP INTERRUPTS
|
||
; DISABLE LIGHT PEN INTERRUPTS
|
||
SYNC==4 ; SYNCS DPU WITH CLOCK
|
||
ITALICS==20 ; CAUSE ITALICS
|
||
LITEPN==200 ; ENABLE LIGHT PEN INTERRUPTS
|
||
|
||
ESCHR==20 ;ESCAPE TO DISPLAY SLAVE (^P)
|
||
XLOD==6 ;EXTRA BYTES IN LOADER BLOCK (TYPE, SIZE, ITEM)
|
||
.ENDC ;GT40P
|
||
.SBTTL TV DEFINITIONS
|
||
.IFNZ TVP
|
||
;FROM TS TV STUFF
|
||
|
||
FONTSW==1 ;COMPILE FONTS
|
||
FONTMS==0 ;USE MACROS TO COMPILE FONTS
|
||
|
||
.MACRO CHECK TAG,LENGTH
|
||
.NLIST
|
||
.IF NE .-<TAG>-<LENGTH>
|
||
.ERROR TAG WRONG LENGTH
|
||
.ENDC
|
||
.EVEN
|
||
.LIST
|
||
.ENDM
|
||
|
||
.MACRO CONC A,B,C,D,E,F,G,H,I
|
||
A'B'C'D'E'F'G'H'I
|
||
.ENDM
|
||
|
||
TVCTL=176660 ;CONTROL REG
|
||
BOWBIT==1 ;1.1 WHITE ON BLACK OF SELECTED CHANNEL
|
||
;1.2-1.4 VIDEO SWITCH
|
||
;1.9-2.2 CHANNEL SELECT
|
||
VERINC==100000 ;2.7 VERTICAL INCREMENT MODE
|
||
TVPTR=176662 ;RELATIVE ADDRESS IN TV BUFFER
|
||
TVDAT=176664 ;DATA READ/WRITE
|
||
TVDATI=176666 ;SAME EXCEPT AUTO INCREMENTS TVPTR ON WRITE ONLY
|
||
TVCTL2=176670 ;SECOND CONTROL REG
|
||
;AT THIS ADDRESS YOU CAN WRITE WHITE ON BLACK AND VIDEO SWITCH
|
||
;AT THE TVCTL ADDRESS YOU CAN WRITE PLANE SELECT AND VERTICAL INCR
|
||
;THE OTHER THREE REGISTERS ARE REPEATED HERE
|
||
|
||
;TVMEM=200000 ;TV 16K STARTS ABOVE FIRST 32K OF ADDRESS
|
||
;TVMEM=0 ; LOW 16 BITS OF TV ADDRESS
|
||
;TVMEMX=1*10000 ;EXTENSION BITS FOR ADDR
|
||
|
||
;GEOMETRY
|
||
|
||
BITPL==576. ;BITS PER LINE
|
||
NLINS==454. ;LINES ON SCREEN
|
||
BYTPL==BITPL/10 ;BYTES PER LINE
|
||
WRDPL==BYTPL/2 ;WORDS PER LINE
|
||
|
||
CHRWD==6 ;CHARACTER WIDTH ON TEXT LINE
|
||
GRIDWD==5 ;WIDTH OF CHARACTER GRID
|
||
CHRHT==12 ;CHARACTER HEIGHT
|
||
CHRVSP==2 ;BLANK RASTER LINES BETWEEN CHARACTER LINES
|
||
LINHT==CHRHT+CHRVSP ;CHRACTER LINE HEIGHT
|
||
CHRPL==BITPL/CHRWD ;CHARACTERS PER LINE
|
||
CHRLN==NLINS/LINHT ;CHARACTER LINES ON SCREEN
|
||
|
||
TVLO==0 ;RELATIVE ORIGIN OF DISPLAY MEMORY
|
||
TVFENCE=TVHI-<LINHT*BYTPL> ;DON'T START ORDINARY TEXT LINE PAST THIS POINT
|
||
TVCFENC=TVHI-<BYTPL*<CHRHT-1>> ;DON'T TRY TO DISPLAY A CHARACTER AFTER THIS POINT
|
||
TVHI=TVLO+<BYTPL*NLINS>-2 ;HIGHEST LEGAL DISPLAY ADDRESS
|
||
...==0
|
||
....==0
|
||
|
||
;VARIOUS BUFFER SIZES AND ETC.
|
||
|
||
BUFSIZ==200 ;DL11 INPUT BUFFER SIZE
|
||
PDL==400 ;PDL SIZE
|
||
.IFNZ GT40P
|
||
MCHRPL==3*CHRPL+1 ;MAXIMUM CHARS PER LINE (ALLOW UNDERLINING OF WHOLE LINE)
|
||
LBL==MCHRPL+6 ;WORST CASE LINE LINE LENGTH
|
||
XTLBYT==6 ;EXTRA TEXT LINE BYTES
|
||
NEBISH==20 ;BYTES WE'RE WILLING TO WASTE IN FREE STORAGE ALLOCATOR
|
||
INUSE==1 ;BLOCK IN USE
|
||
DPYPDL==40 ;DPY PUSH DOWN LENGTH
|
||
OPENSW=LINBUF+2 ;0 IMPLIES LINE CLOSED, NON-0 IMPLIES LINE OPEN
|
||
MIBFRS==10 ;# MAIN/INTERUPT LEVEL COMMUNICATION BUFFERS
|
||
.ENDC ;GT40P
|
||
.IFNZ PCHIST
|
||
PCS==90. ;# PC'S TO SAVE
|
||
PCL==4 ;LENGTH OF EACH PC RECORD
|
||
PCBFL==PCS*PCL ;SIZE OF PC BUFFER
|
||
.ENDC
|
||
|
||
|
||
;BEGIN CONSOLE RELATED STUFF
|
||
|
||
.SBTTL EMT DEFINITIONS
|
||
|
||
CONS=164000 ;CONS INTERFACE BASE ADDRESS
|
||
|
||
;EMTS
|
||
EFATL=EMT!0 ;FATAL ERROR
|
||
ETEXT=EMT!1 ;OUTPUT ASCIZ TEXT STRING POINTED TO BY FOLLOWING WD
|
||
EERRO=EMT!2 ;OUTPUT TEXT CORRESPONDING TO ERROR CODE IN A
|
||
EROBUS=EMT!3 ;READ OBUS INTO DOUBLE WORD POINTED TO BY A
|
||
ERIR=EMT!4 ;READ IR INTO TRIPLE WD POINTED TO BY A
|
||
ERPC=EMT!5 ;READ MICRO PC INTO WD POINTED TO BY A
|
||
ERERWS=EMT!6 ;READ ERROR WORDS INTO DOUBLE WD POINTED TO BY A
|
||
EWDIB=EMT!7 ;WRITE DIAG INST BUFFER FROM TRIPLE WD POINTED TO BY A
|
||
EDDEST=EMT!10 ;DEPOSIT CONTENTS OF B INTO THREE WD
|
||
;BLOCK POINTED TO BY A. POSITION B
|
||
;INTO DEST FIELD OF ALU OR BYTE INST.
|
||
;THIS IS THE ALSO THE SAME FIELD USED FOR THE
|
||
;DISPATCH OFFSET OF A DISPATCH INSTRUCTION.
|
||
EDALUF=EMT!11 ;DEPOSIT B INTO ALU OP FIELD OF BLOCK POINTED TO BY A
|
||
EDOBSL=EMT!12 ;DEPOSIT B INTO OUTPUT BUS SELECT FIELD
|
||
; OF U INST POINTED TO BY A
|
||
EDMSRC=EMT!13 ;DEPOSIT B INTO M SOURCE FIELD OF U INST
|
||
; POINTED TO BY A
|
||
EDASRC=EMT!14 ;DEPOSIT B INTO A SOURCE FIELD OF U INST
|
||
; POINTED TO BY A
|
||
EUICLR=EMT!15 ;CLEAR UI 3 REG TEMP BLOCK AND SET UP A
|
||
; TO POINT THERE
|
||
EDCLK=EMT!16 ;TICK CLOCK ONCE IN DEBUG MODE
|
||
EDMM0=EMT!17 ;DEPOSIT CONTENTS OF TWO WD BLOCK
|
||
; POINTED TO BY A IN DEST GIVEN BY B.
|
||
; B IS INTERPRETED AS A DESTINATION FIELD
|
||
; (AS IN ALU INSTRUCTION). IF B IS
|
||
; A M MEMORY LOCN, DESIRED VALUE IS
|
||
; "BUILT UP" DIRECTLY IN B. OTHERWISE,
|
||
; IT IS BUILT UP IN M MEM LOCN 0 AND
|
||
; THEN STORED IN B.
|
||
ENPCLK=EMT!20 ;TICK CLOCK ONCE WITH NO-OP BIT ON
|
||
EEXAMD=EMT!21 ;EXAMINE DATA PATH MEMORIES. LOCN OF TWO
|
||
; WD BLOCK IN A, MEM LOCN
|
||
; (AS FOR DESTINATION) IN B
|
||
EDJPC=EMT!22 ;DEPOSIT B IN PC FIELD (OF JUMP INST)
|
||
; IN BLOCK POINTED TO BY A
|
||
EDCMEM=EMT!23 ;DEPOSIT 3 WD BLOCK IN A IN CONTROL MEM
|
||
; AT ADR IN B
|
||
EICLR=EMT!24 ;ZERO 3 WD BLOCK POINTED TO BY A
|
||
ECLK=EMT!25 ;CYCLE CLOCK ONCE IN REGULAR RUN MODE
|
||
EEXAMC=EMT!26 ;EXAMINE CONTROL MEM AT LOCN IN B.
|
||
; RETURN RESULT IN BLOCK POINTED TO BY A
|
||
ENCLK=EMT!27 ;CYCLE CLOCK ONCE IN REGULAR RUN MODE
|
||
; BUT WITH NO-OP BIT SET
|
||
EOCTP4=EMT!30 ;DO 4 DIGIT PRINT OF # IN A
|
||
EOCTPD=EMT!31 ;PRINT OUT TWO WD BLOCK POINTED TO BY A AS 11 OCTAL DIGITS
|
||
EPI=EMT!32 ;PRINT 3 WD BLOCK POINTED TO BY A AS U INST
|
||
EPASRC=EMT!33 ;EXTRACT A SOURCE FIELD AND PRINT IT
|
||
EPMSRC=EMT!34 ;EXTRACT M SOURCE FIELD AND PRINT IT
|
||
EPDEST=EMT!35 ;EXTRACT DEST FIELD (OF ALU OR BYTE) AND PRINT IT
|
||
EPOBSL=EMT!36 ;EXTRACT OUTPUT BUS SELECT (OF ALU) AND PRINT IT
|
||
EPALUF=EMT!37 ;EXTRACT ALU FUNCTION (OF ALU INST) AND PRINT IT
|
||
EPCRYC=EMT!40 ;EXTRACT CARRY CONTROL FIELD OF ALU INST AND PRINT IT
|
||
EPQC=EMT!41 ;EXTRACT Q CONTROL FIELD OF ALU INST AND PRINT IT
|
||
EPDDC=EMT!42 ;EXTRACT DISPATCH CONSTANT OF DISPATCH INST AND PRINT
|
||
EPDDO=EMT!43 ;EXTRACT DISPATCH OFFSET AND PRINT IT
|
||
EPDNB=EMT!44 ;EXTRACT DISPATCH # OF BITS FIELD AND PRINT IT
|
||
EPMROT=EMT!45 ;EXTRACT M ROTATE FIELD AND PRINT IT
|
||
EPJPC=EMT!46 ;EXTRACT JUMP ADDRESS FIELD OF JUMP INST AND PRINT IT
|
||
EPJRB=EMT!47 ;PRINT JUMP INST R BIT
|
||
EPJPB=EMT!50 ;PRINT JUMP INST P BIT
|
||
EPJNB=EMT!51 ;PRINT JUMP INST N BIT
|
||
EPJINV=EMT!52 ;PRINT JUMP INVERT SENSE BIT
|
||
EPJCND=EMT!53 ;PRINT JUMP CONDITION FIELD
|
||
EPBMD=EMT!54 ;PRINT BYTE INST MODE (LDB DPB ETC)
|
||
EPBLEN=EMT!55 ;PRINT BYTE INST BYTE LENGTH
|
||
|
||
EXFLD=EMT!56 ;EXTRACT BYTE FROM UINST IN 3 WD BLOCK
|
||
ELDB=EMT!56 ; POINTED TO BY A.
|
||
;B HAS FIELD DESCRIPTION (SEE IPNFLD)
|
||
;RETURN RESULT IN A.
|
||
|
||
EWPC=EMT!57 ;WRITE CONTENTS OF WD POINTED TO BY A
|
||
;INTO PC OF CONS
|
||
EPERRS=EMT!60 ;PRINT TWO WORD BLOCK POINTED TO BY A
|
||
; INTERPRETED AS ERROR BITS
|
||
ESTOP=EMT!61 ;STOP CONS AND CLEAR CONS RUNNING FLAG
|
||
EDPB==EMT!62 ;DEPOSIT B IN WORD BLOCK POINTED TO BY A
|
||
;AT POSITION SPECIFIED BY "BYTE POINTER"
|
||
;IN C. WORKS FOR UP TO 3 PRECISION
|
||
EDMDST==EMT!63 ;DEPOSIT B IN M MEM PART OF DEST OF BLOCK (A)
|
||
EDRDST==EMT!64 ;DEPOSIT B IN REG PART OF DEST OF BLOCK (A)
|
||
EDDSPO==EMT!65 ;DEPOSIT B IN DISPATCH OFFSET FIELD OF BLOCK (A)
|
||
ERPDLB==EMT!66 ;READ PDL BUFFER ADR IN B INTO 2 WD
|
||
; BLOCK POINTED TO BY A
|
||
EWPDLB==EMT!67 ;DEPOSIT BLOCK POINTED TO BY A IN
|
||
;PDL BUFFER ADR IN B
|
||
ESUSTK==EMT!70 ;SAVE ENTIRE U STACK IN USSVD BLOCK
|
||
; SAVES POINTER IN USTPNR
|
||
;NOTE: TESTS USSVDF TO SEE IF USTACK
|
||
; ALREADY SAVED. IF SO, DOES NOTHING
|
||
EUUSTK==EMT!71 ;UNSAVE ENTIRE U STACK AND POINTER
|
||
; IF THEY HAVE BEEN SAVED BY ESUSTK
|
||
ETEXTP==EMT!72 ;OUTPUT ASCIZ TEXT STRING POINTED TO BY A
|
||
ECCLK==EMT!73 ;DO ECLK UNLESS NOOPF SET, IN WHICH CASE
|
||
;DO ENCLK. CLEAR NOOPF.
|
||
EDCCLK==EMT!74 ;DO EDCLK UNLESS NOOPF SET, IN WHICH CASE
|
||
;DO ENPCLK
|
||
ERESET==EMT!75 ;RESET CONS
|
||
ERDSP==EMT!76 ;READ DISPATCH MEM INTO WD POINTED TO BY A,
|
||
;ADDR IN B. TRANSPARENT TO DISPATCH CONSTANT REGISTER.
|
||
EWDSP==EMT!77 ;WRITE DISPATCH MEM FROM WD POINTED TO BY A,
|
||
;ADDR IN B. TRANSPARENT TO DISPATCH CONSTANT REGISTER.
|
||
ERDSPC==EMT!100 ;READ DISPATCH CONSTANT REGISTER INTO WD POINTED TO BY A
|
||
EWDSPC==EMT!101 ;WRITE DISPATCH CONSTANT REGISTER FROM WD POINTED TO BY A
|
||
EWIR==EMT!102 ;DO EWDIB, THEN ENPCLK TO LOAD INTO IR
|
||
EDPBLK==EMT!103 ;TAKES POINTER TO 4 WD BLOCK IN A.
|
||
;FIRST WD IS REGISTER ADR,
|
||
;NEXT THREE ARE VALUE, WHICH IS
|
||
;DEPOSITED IN INDICATED ADR
|
||
ERL1MP==EMT!104 ;READ LVL 1 MAP INTO WD POINTED TO BY A. ADR IN B.
|
||
EWL1MP==EMT!105 ;WRITE LVL 1 MAP FROM WD POINTED TO BY A. ADR IN B.
|
||
ERL2MP==EMT!106 ;READ LVL 2 MAP INTO 2 WD BLOCK POINTED TO BY A.
|
||
;ADR IN B.
|
||
EWL2MP==EMT!107 ;WRITE LVL 2 MAP INTO 2 WD BLOCK POINTED TO BY A.
|
||
;ADR IN B.
|
||
ERMEMS==EMT!110 ;SAVE MEM SUBROUTINE (VMA+MWD)
|
||
EWMEMS==EMT!111 ;WRITE MEM SUBROUTINE (VMA+MWD)
|
||
ERDBLK==EMT!112 ;TAKES POINTER TO 4 WD BLOCK IN A.
|
||
;FIRST WD IS REGISTER ADR. EXAMINE THIS ADR, AND STORE
|
||
;RESULT IN NEXT THREE WORDS.
|
||
EWPVMA==EMT!113 ;WRITE "PHYSICAL" VMA. TAKES POINTER TO TWO WD BLOCK
|
||
; AND LOADS VMA, LVL 1 AND 2 MAPS SO THAT LOCN WILL BE REF'ED
|
||
; (CLOBBERS MWD)
|
||
EMMWC==EMT!114 ;CAUSE MAIN MEMORY WRITE CYCLE. (ASSUME EVERYTHING SET UP,
|
||
; IE, DATA IN MWD, ADR IN VMA AND MAPS, ETC)
|
||
EMMRC==EMT!115 ;CAUSE MAIN MEMORY READ CYCLE. (ASSUME ADR IN VMA AND MAPS)
|
||
EVMEMS==EMT!116 ;VALIDIFY MEMORY SUBROUTINE (JUST THE MAPS, NOT MWD,MRD,VMA)
|
||
|
||
;TRP S ARE SIMILAR TO EMTS BUT SAVE ALL AC S BEFORE DISPATCH
|
||
;AND RESTORE AFTERWARDS. NO PROVISION FOR ERROR RETURN VIA
|
||
;CARRY FLAG.
|
||
|
||
TRP=104400
|
||
|
||
IFATL=TRP!0 ;FATAL ERROR
|
||
IPNFLD=TRP!1 ;EXTRACT AND PRINT NUMERIC FIELD.
|
||
; POINTER TO U INST IN A.
|
||
; B HAS FIELD DESCRIPTOR.
|
||
; BYTE 1 LENGTH IN BITS,
|
||
; BYTE 0 NUMBER OF BITS OVER (TRIPLE
|
||
; PRECISION WISE)
|
||
;AFTER EXTRACTION, FIELD IS PRINTED AS
|
||
;A FIXED WIDTH OCTAL FIELD, WHERE WIDTH
|
||
;IS JUST GREAT ENUF TO ACCOMODATE FIELD
|
||
;SIZE
|
||
IPSFLD=TRP!2 ;EXTRACT AND PRINT "SYMBOLIC" FIELD.
|
||
; POINTER TO UINST IN A
|
||
; FIELD DESCRIPTION IN B (SAME AS FOR
|
||
; IPNFLD).
|
||
; TABLE BASE IN C.
|
||
;FIELD IS EXTRACTED, THEN VALUE USED TO
|
||
;INDEX WORD ORIENTED TABLE STARTING AT
|
||
;ADR IN C. WORD FROM TABLE POINTS AT
|
||
;.ASCIZ STRING WHICH IS PRINTED.
|
||
|
||
|
||
;EETST=EMT 1 ;EXAMINE CONS TO SEE IF ANY ERRORS ARE ON. (PARITY, ETC)
|
||
; ; IF SO, DISPLAY ERRORS AND RETURN WITH CARRY SET.
|
||
; ; IF NOT, RETURN WITH CARRY CLEAR
|
||
;ENORM=EMT 2 ;"NORMALIZE" CONS. IE CYCLE CLOCK ONCE WITH NO-OP ON TO ASSURE
|
||
; ; THAT EVERYTHING THATS GOING TO GET WRITTEN, GETS WRITTEN, ETC.
|
||
;ERDOB=EMT 3 ;READ OBUS INTO DOUBLE WORD POINTED TO BY AC A.
|
||
;ERDIR=EMT 4 ;READ IR INTO TRIPLE WORD POINTED TO BY AC A.
|
||
;EWDIB=EMT 5 ;WRITE TRIPLE WORD POINTED TO BY A
|
||
; ; INTO DIAGNOSTIC INSTRUCTION BUFFER
|
||
;EWCM=EMT 6 ;WRITE CONTROL MEMORY. A POINTS TO THREE WORD BLOCK,
|
||
; ; B GIVES CONTROL MEMORY ADDRESS. CHECKS DATA WRITTEN
|
||
; ; AND RETURNS WITH CARRY SET IF BAD.
|
||
;ERCM=EMT 7 ;READ CONTROL MEMORY. A POINTS TO THREE WORD BLOCK,
|
||
; ; B GIVES CONTROL MEMORY ADDRESS.
|
||
;ERPC=EMT 10 ;READ MICRO PC INTO ADDRESS POINTED TO BY A
|
||
;EWPC=EMT 11 ;WRITE MICRO PC FROM LOCN POINTED TO BY A
|
||
;EROPC=EMT 12 ;READ OPC VECTOR INTO 8 REGISTER VECTOR POINTED TO BY A
|
||
;ERDSM=EMT 13 ;READ DISPATCH MEMORY. LOCN IN B.
|
||
;EWDSM=EMT 14 ;WRITE DISPATCH MEMORRY. LOCN IN B.
|
||
;ERAM=EMT 15 ;READ A MEM. POINTER TO TWO WD BLOCK IN A. LOCN IN B
|
||
;ERMM=EMT 16 ;READ M MEM. (OR MMUX).
|
||
;EWDATM=EMT 17 ;WRITE "DATA PATH" MEMORIES. B HAS WHAT TO PUT IN DEST OF INST.
|
||
|
||
.SBTTL DEFINE VARIOUS CONS MACHINE WORD FORMATS
|
||
|
||
;"PSEUDO" DESTINATION DEFS
|
||
; EDMM0 KNOWS ABOUT THESE. THEY ARE DISTINGISHED FROM REAL
|
||
; DESTINATIONS BY PRESENCE OF 2000 BIT
|
||
; THESE REGISTERS ARE UNUSAL IN THAT THEY CANNOT BE SPECIFIED
|
||
; AS A NORMAL "FUNCTIONAL DESTINATION".
|
||
CSDQ== 2000 ;Q REGISTER
|
||
CSDUSP==2001 ;U CODE STACK POINTER
|
||
CSDDC== 2002 ;DISPATCH CONSTANT REGISTER
|
||
|
||
|
||
;CONS MICRO WORD FIELD DEFS
|
||
|
||
CDAMEM==1000 ;IF SET, SELECT DEST TO A MEMORY
|
||
CAMEMB==200 ; SAME BIT IN DIRECT FORM (IE IN WD1)
|
||
CDMD== 40 ;MEMORY DATA REG
|
||
CDMDWN==100 ;MEMORY DATA REG, WRITE NOW
|
||
CDVMA== 200 ;VMA
|
||
CDVMAR==240 ;VMA START READ
|
||
CDVMAW==300 ;VMA START WRITE
|
||
CDVMAM==340 ;VMA WRITE MAP
|
||
CDCPPH==440 ;PDL(POINTER), PUSH
|
||
CDCPI== 500 ;PDL(INDEX)
|
||
CDPI== 540 ;PDL INDEX
|
||
CDPP== 600 ;PDL POINTER
|
||
CDSPCH==640 ;MICRO-PC-STACK(SPCPTR), PUSH SPCPTR
|
||
CDIMH== 700 ;INSTRUCTION MODIFIER HI (44-24)
|
||
CDIML== 740 ;INSTRUCTION MODIFIER LO (23-0)
|
||
|
||
;O BUS CONTROL (ALU INST)
|
||
COBMSK==0 ;SELECT MASKING LOGIC (RANDOM)
|
||
COBA== 1 ;SELECT ALU OUTPUT
|
||
COBAR==2 ;SELECT ALU OUTPUT SHIFTED RIGHT 1
|
||
COBAL==3 ;SELECT ALU OUTPUT SHIFTED LEFT 1
|
||
|
||
;ALU FUNCTION DEFS (NOTE: THE M MUX IS HOOKED TO THE "A" SIDE OF THE ALU)
|
||
; BOOLEAN ONES ( AND THE A MEMORY IS HOOKED TO THE "B" SIDE)
|
||
USETCM==20 ;OUTPUT COMPLEMENT OF M SIDE
|
||
UANDCB==21 ;AND, COMPLEMENT BOTH
|
||
UANDCM==22 ;AND, COMPLEMENT M
|
||
USETZ== 23 ;OUTPUT ZEROS
|
||
UORCB== 24 ;IOR, COMPLEMENT BOTH
|
||
USETCA==25 ;OUTPUT COMPLEMENT OF A SIDE
|
||
UXOR== 26 ;XOR
|
||
UANDCA==27 ;AND, COMPLEMENT A SIDE
|
||
UORCM== 30 ;IOR, COMPLEMENT M SIDE
|
||
UEQV== 31 ;EQV
|
||
USETA== 32 ;OUTPUT A SIDE
|
||
UAND== 33 ;AND
|
||
USETO== 34 ;OUTPUT ONES
|
||
UORCA== 35 ;IOR, COMPLEMENT A SIDE
|
||
UIOR== 36 ;IOR
|
||
USETM== 37 ;OUTPUT M SIDE
|
||
; ARITHMETIC ONES
|
||
UAOSM== 0 ;OUTPUT M+1
|
||
USUB== 6 ;OUTPUT M-A
|
||
UADD== 11 ;OUTPUT M+A
|
||
UASHM== 14 ;OUTPUT M+M (IE ASH M 1)
|
||
USOSM== 17 ;OUTPUT M-1
|
||
|
||
|
||
;CONS OP CODES (IN PROPER PLACE FOR BIS ING INTO 3 WD)
|
||
CIALU==0 ;ALU
|
||
CIDSP==200 ;DISPATCH
|
||
CIJMP==400 ;JUMP
|
||
CIBYTE==600 ;BYTE
|
||
|
||
CIPJB==100 ;POPJ-AFTER-NEXT BIT
|
||
|
||
;CONS JUMP INSTRUCTION BITS
|
||
CIJRB==1000 ;RETURN BIT
|
||
CIJPB==400 ;PUSHJ BIT
|
||
CIJNB==200 ;N BIT (NO-OP FOLLOWING INST)
|
||
CIJINV==100 ;INVERT JUMP SENSE
|
||
CIJTC==40 ;TEST CONDITION (AS OPPOSED TO TEST BIT)
|
||
|
||
;CONS JUMP INSTRUCTION CONDITIONS
|
||
CIJALN==CIJTC+1 ;ALU NEGATIVE CONDITION
|
||
CIJA31==CIJTC+2 ;ALU BIT 31
|
||
CIJAEM==CIJTC+3 ;A = M CONDITION
|
||
CIJINT==CIJTC+4 ;INTERRUPT PENDING CONDITION
|
||
CIJPF==CIJTC+5 ;VMA NOT OK CONDITION (PAGE FAULT)
|
||
CIJPFI==CIJTC+6 ;VMA NOT OK OR INTERRUPT PENDING
|
||
CIJUC==CIJTC+7 ;UNCONDITIONAL 1
|
||
|
||
;CONS M SOURCE DEFS
|
||
CMSMMD==42 ;MAIN MEMORY DATA
|
||
CMSMWD==52 ;MAIN MEMORY WRITE DATA
|
||
CMSVMA==62 ;VMA
|
||
CMSPMD==72 ;PAGE MAP DATA
|
||
CMSQ== 43 ;Q REGISTER
|
||
CMSPPI==44 ;PDL INDEX (9-0), PDL POINTER (19-10)
|
||
CMSUS== 45 ;U STACK DATA (17-0) U STACK POINTER (31-27)
|
||
CMSUSP==55 ;SAME AS ABOVE, ALSO POP SPC POINTER
|
||
CMSDC== 46 ;DISPATCH CONSTANT
|
||
CMSCI== 47 ;PDL (INDEX)
|
||
CMSPPP==57 ;PDL (POINTER), POP
|
||
;67 UNUSED
|
||
CMSCP== 77 ;PDL (POINTER)
|
||
|
||
|
||
;CONS FUNCTIONAL DESTINATION DEFS
|
||
CFDMWD==1 ;MAIN MEMORY WRITE DATA REGISTER
|
||
CFDMMW==2 ; AS ABOVE, AND INITIATE WRITE
|
||
;3
|
||
CFDVMA==4 ;VMA
|
||
CFDVMR==5 ;VMA, START READ
|
||
CFDVMW==6 ;VMA, START WRITE
|
||
CFDVWM==7 ;VMA, WRITE MAP
|
||
CFDCP==10 ;PDL(POINTER)
|
||
CFDCPP==11 ;PDL(POINTER), PUSH
|
||
CFDCI== 12 ;PDL(INDEX)
|
||
CFDPI== 13 ;PDL INDEX
|
||
CFDPP== 14 ;PDL POINTER
|
||
CFDUSP==15 ;U STACK (CAUSES PUSH)
|
||
CFDIMH==16 ;INST MOD HI (44-24)
|
||
CFDIML==17 ;INST MOD LO (23-0)
|
||
|
||
;BITS IN DISPATCH MEM
|
||
CDMPAR==100000 ;PARITY BIT
|
||
CDMR==40000 ;R
|
||
CDMP==20000 ;P
|
||
CDMN==10000 ;N
|
||
|
||
;MISC FUNCTION BITS (IN POSITION FOR BIS ING INTO FIRST WD OF U INST)
|
||
CMF1==1_10.
|
||
CMF2==2_10.
|
||
CMF3==3_10.
|
||
|
||
;ERROR BITS
|
||
;ERROR WD 1
|
||
; HIGH BYTE FROM 164000 HIGH BYTE
|
||
CESPCP==100000 ;SPC PARITY
|
||
CEDSPP==40000 ;DISPATCH PARITY
|
||
CEHIER==20000 ;HIGH RUN LOSSAGE
|
||
CECP== 10000 ;MAIN CONTROL MEM PARITY (IN IR NOW)
|
||
CEMMP== 4000 ;M MEM PARITY
|
||
CEAMP== 2000 ;A MEM PARITY
|
||
CEPDL== 1000 ;PARITY ERROR IN PDL BUFFER
|
||
CEMNMP==400 ;MAIN MEMORY PARITY
|
||
; LOW BYTE FROM 164002 HIGH BYTE
|
||
; ;200 ;100000 ;- ERRHALT
|
||
CEHNOK==100 ;40000 ;- HIGH OK (DC SIGNAL)
|
||
CESRUN==40 ;20000 ;S RUN (1 IF RUN=1 AND ALL ERRORS ARE 0)
|
||
CESSDN==20 ;10000 ;SINGLE STEP DONE
|
||
; 4000,2000,1000, AND 400 BITS ARE OPC BITS AND ARE NOT CONSIDERED
|
||
; PART OF ERROR WORD
|
||
|
||
;WD1
|
||
; HIGH BYTE FROM HIGH BYTE OF 164010
|
||
CEWIM== 100000 ;WRITE INSTRUCTION MEMORY ON NEXT CLOCK
|
||
CEIMOD==40000 ;INSTRUCTON IN IR WAS MODIFIED VIA OA PATHS
|
||
CEINOP==20000 ;IF SET, MACHINE WILL NO-OP INSTRUCTION
|
||
; TRYING TO BE EXECUTED ON NEXT CLOCK
|
||
; REST OF BITS IN HIGH BYTE OF 164010 ARE IR BITS AND NOT
|
||
; CONSIDERED PART OF ERROR WORD.
|
||
; LOW BYTE FROM HIGH BYTE OF 164012
|
||
;200 ;100000 ;UNUSED
|
||
CENMMW==100 ;40000 ;NOT WAITING FOR MAIN MEMORY
|
||
CEWPDL==40 ;20000 ;WRITE INTO PDL BUFFER WILL OCCUR ON NEXT CLOCK
|
||
CEWSPC==20 ;10000 ;WRITE INTO SPC WILL OCCUR ON NEXT CLOCK
|
||
CEPF== 10 ;4000 ;MAPPED ADR NOT OK
|
||
CEJC== 4 ;2000 ;JUMP CONDITION BIT
|
||
CEPCS1==2 ;1000 ;PC SOURCE BIT 1
|
||
CEPCS0==1 ;400 ;PC SOURCE BIT 0
|
||
; 0 -> PC+1
|
||
; 1 -> DISPATCH MEM
|
||
; 2 -> SPC (AS IN POPJ)
|
||
; 3 -> IR 23-12 (JUMP OPERATION)
|
||
|
||
|
||
.SBTTL START OF PROGRAM
|
||
|
||
.=400+PDL
|
||
|
||
GO: RESET ;IN THE PRIVACY OF YOUR OWN HOME
|
||
MOV #2,CMREQ ;GO INTO CONSOLE MODE AS DEFAULT
|
||
GO0: CLR PS
|
||
CLR LDBUFF ;CLEAR 10 BUFFER FLAG
|
||
CLR DSKRQB+2 ;CLEAR DISK REQUEST
|
||
CLR DSKRQB ;MUST BE IN THIS ORDER!
|
||
CLR LDBFF2 ;..
|
||
CLR TNRQFG
|
||
MOV VERSE,0
|
||
MOV #GO,SP ;SET UP PUSH DOWN POINTER
|
||
MOV #KLIBRK,KLIPC ;SET UP INTERRUPT VECTORS
|
||
MOV #5_5,KLIPSW
|
||
MOV #CLKBRK,LKPC
|
||
MOV #6_5,LKPSW
|
||
MOV #4_5,A ;LEVEL 4 IN AC A
|
||
MOV #6_5,C ;ALL PROCESSOR TRAPS GO ON 6
|
||
CLR TT ;LEVEL 0 IN TT
|
||
MOV #NXMPC,B
|
||
MOV #NXMFND,(B)+ ;BUS TIME OUT
|
||
MOV C,(B)+
|
||
MOV #RESBRK,(B)+ ;RESERVED INSTRUCTION
|
||
MOV C,(B)+
|
||
MOV #RUGBRK,(B)+ ;BREAK POINT
|
||
MOV C,(B)+
|
||
MOV #IOTBRK,(B)+ ;IOT TRAP
|
||
MOV C,(B)+
|
||
MOV #POWERF,(B)+ ;POWER FAILURE
|
||
MOV C,(B)+
|
||
MOV #EMTBRK,(B)+ ;EMT
|
||
MOV TT,(B)+ ;PUT EMT ON PROGRAM LEVEL (0)
|
||
MOV #TRPBRK,(B)+ ;"TRAP" TRAP (LEV 0)
|
||
MOV TT,(B)+
|
||
MOV #TYIBRK,TYIPC ;KEYBOARD ON 4
|
||
MOV A,TYIPSW
|
||
.IF NZ TVP
|
||
CLR TVCTL ;SELECT PLANE 0
|
||
CLR TVCTL2 ;BLACK ON WHITE, CLEAR VIDEO SWITCH
|
||
.ENDC ;TVP
|
||
.IFNZ GT40P
|
||
MOV #DSPC,B ;DISPLAY BREAKS (LEV 4)
|
||
MOV #DSBRK,(B)+
|
||
MOV A,(B)+
|
||
MOV #LPBRK,(B)+
|
||
MOV A,(B)+
|
||
MOV #DTOBRK,(B)+
|
||
MOV A,(B)+
|
||
MOV #HMEML,TT
|
||
MOV TT,MEMTOP
|
||
MOV #FS,T
|
||
JSR PC,CLRL3 ;CLEAR ALL OF MEMORY, FIRST NXM STOPS IT
|
||
.ENDC ;GT40P
|
||
CLR ACTCHR
|
||
MOV #BUF,GETCC ;DL11 INPUT VECTOR
|
||
MOV #BUF,PUTCC
|
||
.IFNZ DEBUG
|
||
JSR PC,DEBST ;DO ASSORTED HACKING (RE INTERRUPT VECTORS, ETC.)
|
||
.ENDC
|
||
MOV #NXMBRK,NXMPC ;ALL FUTHER BUS ERRORS WILL HALT
|
||
;DROPS THRU
|
||
|
||
;DROPS IN
|
||
.IFNZ GT40P ;FREE STORAGE ONLY EXISTS IN GT40 VERSION
|
||
MOV MEMTOP,T
|
||
MOV #-1,-(T) ;EVERYTHING ABOVE FREE STORAGE RESERVED
|
||
MOV T,MEMTOP ;SET UP FREE STORAGE
|
||
MOV #FAKEBL+2,T
|
||
MOV T,AVAIL
|
||
MOV T,ROVER
|
||
MOV #FS+2,TT ;SET UP FAKE BLOCK
|
||
CLR -2(T) ;SIZE 0
|
||
MOV TT,(T) ;FAKEBL FD PNTR
|
||
MOV TT,2(T) ;BACK PNTR
|
||
MOV #-1,4(T) ;LOOKS TAKEN FROM ABOVE
|
||
MOV T,(TT) ;FD PNTR IN FS
|
||
MOV T,2(TT) ;BACK PNTR IN FS
|
||
MOV MEMTOP,A
|
||
SUB #FS,A ;SIZE OF FREE STORAGE (LEAVE 1 WD FOR -1)
|
||
MOV A,-(TT)
|
||
CLR RETLAD
|
||
CLR TXSTRT
|
||
CLR GRSTRT
|
||
MOV #DPYRTS,GRJMP
|
||
MOV #LOWLIN+TXTIDX,T ;INITIALIZE TEXT RING
|
||
GO2: CLR (T)+
|
||
MOV #DPYJMP,(T)
|
||
ADD #LHDRS-2,T
|
||
CMP T,#HILIN+TXTIDX
|
||
BLO GO2
|
||
CLR (T)+
|
||
MOV #DPYRTS,(T)
|
||
MOV #-DPYPDL/2,DPYPDC ;SET UP DPY PUSH DOWN LIST
|
||
MOV #DPYPDB+DPYPDL,DPYPDP
|
||
CLR CPOS ;SET SCREEN VARIABLES
|
||
CLR CLINE
|
||
MOV #NLINS-CHRHT+1,CURSY ;CURSOR Y
|
||
CLR BYTCNT
|
||
JSR PC,HU
|
||
JSR PC,CLRLIN
|
||
MOV #LOWLIN,TXSTRT
|
||
MOV #<LOWLIN+TXTIDX>,TEXTP
|
||
CLR CASE
|
||
DEC OCSR ;FORCE DSBRK TO LOOK AT CSR
|
||
MOV #MIBFRS-1,B
|
||
MOV #MIBUF,A ;SET THE MAIN/INTERUPT BUFFERS
|
||
MOV #6,C ;6 BYTES PER BUFFER
|
||
MOV #MIBUF+2,PUTDPY
|
||
MOV #MIBUF+2,GETDPY
|
||
GO3: MOV A,(A)
|
||
ADD C,(A)+
|
||
CLR (A)+ ;FOR ADDRESS
|
||
CLR (A)+ ;FOR CONTENTS
|
||
DEC B
|
||
BGT GO3
|
||
MOV #MIBUF,(A)+
|
||
CLR (A)+
|
||
CLR (A)+
|
||
.ENDC ;GT40P
|
||
MOV #100,A
|
||
MOV A,TKS ;ENABLE INTERUPTS
|
||
MOV A,@AKLIS
|
||
.IIF NZ TVP, MOV A,LKS ;CLK BRKS ENABLED IF TV
|
||
.IFNZ PCHIST
|
||
MOV #PCBUF,PCPNT
|
||
.ENDC
|
||
.IFNZ GT40P
|
||
;.IFNZ DLIMSW ;CLOCK NEEDED ONLY FOR DISPLAY LIMITING
|
||
; MOV A,LKS
|
||
; CLR DSTOPD
|
||
; CLR DTIME
|
||
; CLR TICKS
|
||
;.ENDC
|
||
MOV #DPYSA,@ADPC ;START THE DISPLAY
|
||
.ENDC ;GT40P
|
||
MAINLR:;CLR LMHTTY
|
||
CLR CNHTTY
|
||
CLR BLKTIM ;JUST TO GET OUT OF WEDGED STATE IF 60 CY COUNTER OVFL 16 BITS
|
||
BR MAINL
|
||
|
||
|
||
.SBTTL MAIN LOOP & COMMAND PROCESSOR
|
||
|
||
MAINL1: JSR PC,ADDCHR ;PROCESS CHAR FROM INPUT BUFFER
|
||
MAINL: CLR RAIDM ;USE WHOLE SCREEN
|
||
MOV CURSX,RCURSX
|
||
MOV CURSY,RCURSY
|
||
TST CMREQ
|
||
BGE CMAIN ;GO TO CONSOLE MONITOR MAIN LOOP
|
||
JSR PC,GETCHW ;WAIT FOR CHARACTER
|
||
; CMP #ESCHR,A
|
||
; BNE MAINL1
|
||
; JSR PC,CMND ;PROCESS DISPLAY SLAVE COMMAND
|
||
BR MAINL1
|
||
|
||
|
||
CMAIN: ZAPFLG CNHTTY ;INDICATE IN CONSOLE MONITOR MODE
|
||
JSR PC,ENTER
|
||
JSR PC,CDSPLY ;DISPLAY CONSOLE
|
||
JSR PC,RDHU ;HOME UP (BUT STAY BELOW RAID AREA)
|
||
CMN1R: CLR REGOPF ;NO REGISTER OPEN
|
||
CMN1: CLR DEPFLG ;DEPOSIT DONE FLAG
|
||
MOV #-1,RAIDM ;CONFINE PRINTOUT TO BETWEEN RAID AREA AND CONSOLE AREA
|
||
MOV #-1,CMREQ ;INDICATE GOT HERE
|
||
JSR PC,GECOM ;RETURN WITH ASCIZ STRING IN CBUF
|
||
;IF CNUMF HAS -1, CONVERTED INTEGER IN CNUM, +2, +4
|
||
;TERMINATING CHR IN A
|
||
CMP A,#' ;ALT MODE
|
||
BEQ CMNX
|
||
TST CVALF
|
||
BEQ CMN1A ;NO VALUE, SO WHAT EVER CNUMF HAS IS IT
|
||
MOV #CNUM,T ;CNUM MUST BE 0 IF CNUMF IS 0
|
||
MOV #CVAL,TT
|
||
ADD (TT)+,(T)+
|
||
ADC (T)
|
||
ADD (TT)+,(T)+
|
||
ADC (T)
|
||
ADD (TT)+,(T)+
|
||
DEC CNUMF ;INDICATE "NUMBER"
|
||
CMN1A: CLR CVALF ;USE UP VALUE
|
||
ASL A
|
||
MOV A,B
|
||
MOV CNUM,A ;(LOW ORDER) ARG ALSO IN A (0 IF NO ARG)
|
||
JSR PC,@COMTAB(B) ;ARGP IN CNUMF, ARG IN CNUM
|
||
MOV A,CVAL ;BUT THIS IS A NO-OP UNLESS COMMAND HAS DEC'ED CVALF
|
||
TST DEPFLG
|
||
BEQ CMN1B
|
||
JSR PC,CDSPLY ;POSSIBLY UPDATE RAID VARS
|
||
CMN1B: BR CMN1
|
||
|
||
|
||
CMNX: JMP MAINLR ;GO BACK TO DATAPOINT MODE
|
||
|
||
CMCR: JSR PC,REGCLS ;CLOSE OPEN REG, IF ANY
|
||
MOV #15,A
|
||
JSR PC,TYOCHR
|
||
RTS PC
|
||
|
||
COMERR: ETEXT
|
||
ASCQQ
|
||
TST TNRQFG
|
||
BEQ 1$
|
||
CLR LDBUFF ;REQUEST FROM 10 LOST, FLUSH IT
|
||
CLR LDBFF2 ;..
|
||
CLR TNRQFG
|
||
1$:; CLR LMHTTY ;TAKE TTY AWAY FROM LISP MACHINE
|
||
TST CNHTTY
|
||
BNE CMAINR
|
||
JMP GO0
|
||
|
||
CMAINR: MOV #GO,SP
|
||
BR CMN1R
|
||
|
||
RDFLD1: ETEXT
|
||
ASCXXX
|
||
RDFLD: JSR PC,GECOM ;GET FIELD
|
||
CMP A,#RUBCOD
|
||
BEQ RDFLD1
|
||
CMP A,#7
|
||
BEQ COMERR
|
||
TST CNUMF
|
||
BLT RDFLDX
|
||
CMP A,#40
|
||
BEQ RDFLD ;SPACE DOES NOT TERM NULL FIELD
|
||
RDFLDX: RTS PC
|
||
|
||
QFF: JSR PC,TVPREP
|
||
JSR PC,HU ;CLEAR SCREEN
|
||
JSR PC,CLEOF
|
||
JSR PC,CDSPLY ;PUT BACK CONSOLE DISPLAY
|
||
JSR PC,RDHU ;GO TO TOP OF CONSOLE AREA
|
||
CLR BLKDFR
|
||
RTS PC
|
||
|
||
RDNM: JSR U,ACSAV ;READ NUMBER
|
||
JSR PC,GECOM
|
||
JSR U,ACRES
|
||
TST CNUMF
|
||
BNE RDNM1
|
||
SEC ;SET CARRY -> NO NUMBER
|
||
RDNM1: RTS PC
|
||
|
||
GECOM: CLR SYMFND
|
||
JSR PC,GCOM ;GET COMMAND, EVAL SYMS
|
||
TST CNUMF
|
||
BLT GECOMX
|
||
TST CSYL
|
||
BEQ GECOMX
|
||
MOV #GSYMT,B ;SEARCH SYMTAB
|
||
GECSML: CMP B,#GSYMTE
|
||
BHIS GECNF ;NOT FOUND
|
||
MOV #CBUF,T
|
||
MOV (B)+,U
|
||
GECSM2: CMPB (T)+,(U)
|
||
BNE GECSM3
|
||
TSTB (U)+
|
||
BNE GECSM2
|
||
MOV (B),CNUM ;RETURN VALUE
|
||
DEC CNUMF ;INDICATE VALUE PRESENT
|
||
DEC SYMFND
|
||
GECOMX: RTS PC
|
||
|
||
GECSM3: TST (B)+ ;MOVE TO NEXT SYM
|
||
BR GECSML
|
||
|
||
GECNF: ETEXT
|
||
ASCQST
|
||
JMP BELL
|
||
|
||
SYMFND: 0
|
||
|
||
|
||
GSYMT: ASCRST ;RESET
|
||
RARSET
|
||
ASCVMA ;VMA
|
||
RAVMA
|
||
ASCMWD ;MWD
|
||
RAMWD
|
||
ASCRDR ;RAIDR
|
||
RARDRO
|
||
ASCNPF ;NOOPF
|
||
RACSWO+<<NOOPF-CSSWO>/2>
|
||
ASCLLM ;LLMODE
|
||
RACSWO+<<CLLMOD-CSSWO>/2>
|
||
ASCFSV ;FSV
|
||
RACSWO+<<CFSVAL-CSSWO>/2>
|
||
ASCPSV ;PSV
|
||
RACSWO+<<CPSVAL-CSSWO>/2>
|
||
ASCFD ;FDEST
|
||
RAFDO
|
||
ASCFS
|
||
RAFSO
|
||
ASCIR ;.IR
|
||
RAIR
|
||
ASCSIR ;IR
|
||
RASIR
|
||
ASCPC ;PC
|
||
RAPC
|
||
ASCUSP ;USP
|
||
RAUSP
|
||
ASCQ ;Q
|
||
RAQ
|
||
ASCDC1 ;DC
|
||
RADC
|
||
ASCPP ;PP
|
||
RAPP
|
||
ASCPI ;PI
|
||
RAPI
|
||
ASCCIB ;CIB
|
||
RACIBO
|
||
ACVMAR ;CVMAR
|
||
RACVMR
|
||
ACMRD ;CMRD
|
||
RACRDR
|
||
ACPMAR ;CPMAR
|
||
RACPMR
|
||
ACMWD ;CMWD
|
||
RACMWD
|
||
ACVMAW ;CVMAW
|
||
RACVMW
|
||
ACPMAW ;CPMAW
|
||
RACPMW
|
||
ASCMOD ;MODE
|
||
RAMOD
|
||
GSYMTE:
|
||
|
||
|
||
GCOM: MOV #CBUF,GCMPTR
|
||
MOV #<CBUFL-1>*2,CBUFC
|
||
JSR PC,GCZNM ;ZERO CNUM
|
||
CLR CDNUM
|
||
MOV #-1,CNUMF
|
||
CLR CSYL
|
||
CLR COMFRC ;COMMAND FORCE
|
||
GCOM1: JSR PC,CTYI
|
||
; TST LMHTTY
|
||
; BGT LMTYI ;GO FEED CHAR TO LISP MACHINE
|
||
CMP A,#3
|
||
BEQ GCOM1 ;IGNORE ^C S (IN CASE THEY COME FROM 10 IN COMMAND FILE)
|
||
CMP A,#173
|
||
BLT GCOM1B
|
||
SUB #32,A ;COLLAPSE HOLE LEFT BY LOWER CASE LETTERS
|
||
BR GCOMT ;LEAVING OPEN BRACE JUST ABOVE `
|
||
|
||
GCOM1B: CMP A,#140
|
||
BLE GCOM1A
|
||
SUB #40,A ;UPPER CASEIFY
|
||
GCOM1A: TST COMFRC
|
||
BNE GCOMT ;FORCE TO BE COMMAND CHAR
|
||
CMP A,#'0
|
||
BLT GCOM2
|
||
CMP A,#'9
|
||
BLE GCOMN ;DIGIT
|
||
GCOM2: CMP A,#'A
|
||
BLT GCOM3
|
||
CMP A,#'Z
|
||
BLE GCALP
|
||
GCOM3: CMP A,#'.
|
||
BEQ GCOMPD
|
||
CMP A,#'@
|
||
BEQ GCOMAT ;ATSIGN FORCES NEXT CHR TO DISPATCH
|
||
GCOMT: CLRB @GCMPTR ;STORE 0 ON ASCIZ STRING
|
||
CMP CBUF,(PC)+
|
||
.ASCIZ /./
|
||
BEQ GCMPT ;GEE THATS OUR SYMBOL!!
|
||
TST CSYL
|
||
BNE GCOMT1
|
||
GCNONM: CLR CNUMF ;NULLNESS, REALLY NO NUMBER
|
||
GCZNM: MOV #CNUM,TT ;ASSURE CNUM IS 0 IF NO NUMBER
|
||
CLR (TT)+
|
||
CLR (TT)+
|
||
CLR (TT)+
|
||
GCOMT1: RTS PC
|
||
|
||
;LMTYI: CMP A,#23 ;^S TAKEN AS COMMAND EVEN IF LISP MACHINE HAS TTY
|
||
; BEQ GCOMT
|
||
; CMP A,#24 ;^T ..
|
||
; BEQ GCOMT
|
||
; CMP A,#30 ;^X ..
|
||
; BEQ GCOMT
|
||
; CLR -(SP)
|
||
; MOV A,-(SP)
|
||
; CMP A,#15
|
||
; BNE 1$
|
||
; JSR PC,TYOCHR ;ECHO CR AS CR,LF,CLEOL
|
||
;1$: MOV SP,A
|
||
; JSR PC,QDPRC0
|
||
; CMP (SP)+,(SP)+ ;FLUSH TEMP REGISTERS
|
||
; BR GCOM
|
||
|
||
GCMPT: MOV CONSPT,CNUM ;SUPPLY VALUE OF PT
|
||
DEC CNUMF ;MAKE NUMBER AGAIN
|
||
BR GCOMT1
|
||
|
||
GCOMAT: DEC COMFRC ;FORCE TO BE COMMAND
|
||
BR GCOM1
|
||
|
||
GCOMN: MOV #CNUM,C ;ASSEMBLE OCTAL NUMBER
|
||
JSR PC,GCOMN1
|
||
ASL CDNUM
|
||
ADD CDNUM,T ;WHICH HAS LAST DIGIT
|
||
ASL CDNUM
|
||
ASL CDNUM
|
||
ADD T,CDNUM ;ASSEMBLE DECIMAL NUMBER
|
||
; 8+2=10.!
|
||
BR GCCHRS
|
||
|
||
GCOMPD: MOV CDNUM,CNUM ;USE DECIMAL NUMBER
|
||
CLR CNUM+2 ;LOSER S WHO TYPE THREE PRECISION DECIMAL NUMBERS DESERVE TO LOSE
|
||
TST CSYL
|
||
BEQ GCALP ;NO FLOATING POINT! INITIAL . IS ALPHABETIC
|
||
BR GCCHRS
|
||
|
||
GCOMN3: JSR PC,GCOMN2 ;THREE PRECISION DOUBLE ASL (C)
|
||
GCOMN2: ASL (C) ;THREE PRECISION ASL (C)
|
||
ROL 2(C)
|
||
ROL 4(C)
|
||
RTS PC
|
||
|
||
GCOMN1: JSR PC,GCOMN3
|
||
JSR PC,GCOMN2
|
||
GCOMN5: MOV A,T
|
||
SUB #'0,T
|
||
GCOMN4: ADD T,(C)
|
||
ADC 2(C)
|
||
ADC 4(C)
|
||
RTS PC
|
||
|
||
|
||
GCALP: JSR PC,GCNONM ;NO NUMBER
|
||
GCCHRS: MOV #-1,CSYL
|
||
DEC CBUFC
|
||
BLE GCCHR1
|
||
MOVB A,@GCMPTR ;STORE CHAR IN STRING
|
||
INC GCMPTR
|
||
GCCHR1: JMP GCOM1
|
||
|
||
CTYI: MOV CURSX,RCURSX ;MAKE SURE CURSOR DISPLAYING IN RIGHT PLACE
|
||
MOV CURSY,RCURSY
|
||
CTYI1B: TST TENMOD
|
||
BNE CTYI1 ;PDP-10 MODE, DONT TOUCH
|
||
JSR PC,WATST ;STARTING A WAIT, SO MAYBE RELOAD IR
|
||
CTYI1: TST LDBFF2
|
||
BNE 1$
|
||
TST LDBUFF
|
||
BEQ CTYI1A ;NO COMMAND FROM 10
|
||
1$: JSR PC,C10CM ;PROCESS 10 COMMAND
|
||
BR CTYI1B ;THAT MAY HAVE CLOBBERED IR, SO PUT IT BACK
|
||
|
||
CTYI1A: TST DSKRQB ;REQUEST FROM 10?
|
||
BEQ 2$ ;NO
|
||
JSR PC,DSKRUN ;YES, RUN THE DISK
|
||
2$: TST TENMOD
|
||
BNE 1$ ;PDP-10 MODE, DONT TOUCH
|
||
TST CTRUN
|
||
BEQ 1$
|
||
TST 164002 ;IF CONS TRYING TO RUN, BUT HALTED,
|
||
BMI 1$
|
||
CLR CTRUN ;LOSE, ERROR; NOT ONLY STOP, BUT STOP TRYING
|
||
JSR PC,ENTER ;SAVE STATE OF MACHINE
|
||
JSR PC,CDSPLY ;AND UPDATE THE DISPLAY
|
||
1$:
|
||
CTYI1C: JSR PC,FOO105 ;CHECK FOR 105 FOOBAR REQUEST
|
||
MOV TYICH,A ;COMMAND TYPEIN.
|
||
BEQ CTYI1 ;NO CHR
|
||
CLR TYICH
|
||
PUSH A
|
||
CMP A,#40
|
||
BLT CTYI2 ;DONT ECHO CONTROL CHRS
|
||
CMP A,#177
|
||
BEQ CTYI2 ;NOR RUBOUT
|
||
JSR PC,ADDCHR ;ECHO CHR
|
||
CTYI2: POP A
|
||
RTS PC
|
||
|
||
WATST: TST CPSVAL ;POSSIBLY STARTING A WAIT, SO RELOAD IR
|
||
BEQ WATSTX ; SAVED IR NOT VALID
|
||
MOV #CIR,A
|
||
EWIR ;RELOAD IR SO ITS THERE FOR DEBUGGING
|
||
WATSTX: RTS PC
|
||
|
||
CDSPLY: PUSH RAIDM ;GOING TO DISPLAY TEXT OUTSIDE MAIN WINDOW
|
||
CLR RAIDM
|
||
PUSH CPOS ;SAVE CURRENT CURSOR POS
|
||
PUSH CLINE
|
||
TST CLLMOD
|
||
BNE CDSPL1 ;DONT DISPLAY RAID STUFF IN LL MODE
|
||
JSR PC,TVPREP
|
||
JSR PC,HU ;START AT TOP OF SCREEN
|
||
CLR B
|
||
CDSRL: TST RAIDA(B)
|
||
BEQ CDSRL1 ;THAT ONE NULL
|
||
PUSH B
|
||
ASR B ;FLUSH BYTE BIT
|
||
MOV #1,C
|
||
JSR PC,OCTPNB ;PRINT RAID REG #
|
||
ETEXT
|
||
ASCSP ;PRINT SPACE
|
||
MOV (SP),B
|
||
MOV RAIDA(B),A
|
||
JSR PC,REGPNT ;PRINT IT OUT
|
||
TST CPOS ;CR IF NOT AT BEG OF LINE
|
||
BEQ CDSRL2
|
||
ETEXT
|
||
ASCCR
|
||
CDSRL2: POP B
|
||
CDSRL1: TST (B)+
|
||
CMP B,#<10*2>
|
||
BLT CDSRL ;LOOP IF NOT THRU
|
||
CDSPL1: CLR A ;UPDATE CONSOLE DISPLAY SECTION
|
||
MOV CDLNN,B ;LINE NUMBER TO START CURSOR DISPLAY ON
|
||
JSR PC,CSRPOS
|
||
ETEXT
|
||
CSTARS
|
||
MOV CPC,A ;PRINT PC
|
||
EOCTP4 ;4 DIGIT OCTAL PRINT
|
||
ETEXT
|
||
ASC3SP
|
||
MOV #CIR,A
|
||
EPI
|
||
ETEXT
|
||
COBTX
|
||
MOV #COBUS,A ;PRINT OUTPUT BUS
|
||
MOV #<<32.*400>+0>,B
|
||
IPNFLD
|
||
MOV #<RACSWO+<<CLLMOD-CSSWO>/2>>,A
|
||
JSR PC,REGPNT ;PRINT LLMODE=X
|
||
MOV #<RACSWO+<<CFSVAL-CSSWO>/2>>,A
|
||
JSR PC,REGPNT ;PRINT FSV=X
|
||
MOV #<RACSWO+<<CPSVAL-CSSWO>/2>>,A
|
||
JSR PC,REGPNT ;PRINT PSV=X
|
||
MOV #<RACSWO+<<NOOPF-CSSWO>/2>>,A
|
||
JSR PC,REGPNT ;PRINT NOOPF=X
|
||
ETEXT
|
||
CERRST
|
||
MOV #CCERR1,A
|
||
EPERRS
|
||
POP B
|
||
POP A
|
||
JSR PC,CSRPOS ;RESTORE CURSOR POS
|
||
CLR BLKDFR
|
||
POP RAIDM
|
||
RTS PC
|
||
|
||
;CONSOLE COMMAND PROCESSOR COMMAND FORMAT
|
||
; COMMANDS TO THE CONSOLE PROCESSOR ARE A SINGLE CHARACTER
|
||
; THEY MAY TAKE A (16 BIT MAX) NUMERIC ARG PRECEEDING.
|
||
; MANY COMMANDS ARE "INTERACTIVE" IN THAT THEY PROMPT THE
|
||
; USER FOR FURTHER ARGS ETC AFTER THE COMMAND IS INVOKED.
|
||
; WHEN THE USER IS PROMPTED, THE STANDARD DEFAULT FOR
|
||
; "I DONT WANT TO BOTHER ABOUT THIS FIELD, GO ON TO THE NEXT ON/E"
|
||
; IS SPACE. A CR USUALLY SAYS "FINISH OFF THE COMMAND AND
|
||
; EXECUTE IT. A RUBOUT INDICATES AN ERROR WAS MADE IN TYPING
|
||
; THE LAST FIELD. THE LAST FIELD IS ERASED AND MAY BE TYPED
|
||
; IN AGAIN. A CONTROL G QUITS OUT OF THE COMMAND IMMEDIATELY
|
||
; WITHOUT EXECUTING IT.
|
||
|
||
; ARGUMENTS AND VALUES.
|
||
; MANY COMMANDS CAN TAKE A NUMERIC ARGUMENT PRECEEDING
|
||
; THE COMMAND. IF NO ARGUMENT IS TYPED, THE ARGUMENT MAY
|
||
; BE SUPPLIED BY THE VALUE OF THE LAST COMMAND.
|
||
; ANY ARGUMENT TYPED OVERRIDES THE VALUE OF THE LAST COMMAND,
|
||
; HOWEVER. A CR INTERPRETED AT TOP LEVEL CAUSES THE VALUE
|
||
; OF THE LAST COMMAND TO BE DISCARDED.
|
||
|
||
; VARIOUS MEMORIES.
|
||
; THE CONSOLE PROGRAM KNOWS ABOUT THE FOLLOWING MEMORIES:
|
||
; INTERNALLY, THESE MEMORIES ARE "ADDRESSED" BY A SINGLE
|
||
; SIXTEEN BIT QUANTITY, CALLED THE "REGISTER ADDRESS".
|
||
; IN PARENS BELOW IS THE "KEY" USED TO DENOTE
|
||
; "SYMBOLICALLY" ADDRESSES IN THE GIVEN MEMORY.
|
||
; THE ADDRESS SPACE BELOW COMMENCES AT 40000. ADDRESSES BELOW THIS ARE
|
||
; "NUMBERS". (QUANTITIES WITH THE 100000 BIT SET ARE ALSO NUMBERS,
|
||
; CALLED "NEGATIVE NUMBERS"). IF "NUMBERS" ARE USED TO REFERENCE MEMORIES,
|
||
; THEY ARE RELOCATED BY THE BASE OF THE LAST MEMORY REFERENCED.
|
||
|
||
; REFERENCES TO "MAIN MEMORY".
|
||
; GENERALLY SPEAKING, REGISTER ADDRESSES ARE ASSIGNED ONLY TO REGISTERS
|
||
; WITHIN THE PROCESSOR ITSELF. THUS, TO REFERENCE MAIN MEMORY ONE MUST
|
||
; "SIMULATE" WHAT THE MICROCODE ITSELF MUST DO (IE LOAD THE VMA-START-READ
|
||
; AND READ THE READ-DATA-REGISTER, ETC.) ADDITIONALLY, THE MAP (BOTH 1ST
|
||
; AND 2ND LEVELS MUST BE SET UP PROPERLY. THIS IS A GREAT PAIN, AND ALSO
|
||
; IS VERY INEFFICIENT. BELOW IS DESCRIBED A MECHANISM FOR SOMEWHAT
|
||
; ALEVIATING THIS PROBLEM.
|
||
; PART OF THE PROBLEM IS THE NECESSITY OF SAVING AND RESTORING THE
|
||
; VARIOUS REGISTERS (VMA, MWD, LEVEL 1 AND 2 MAP). TO ASSIST HERE,
|
||
; SEVERAL "VIRTUAL" REGISTERS ARE DEFINED. THESE HAVE FUNCTIONS SIMILAR
|
||
; TO THE HARDWARE ONES, BUT HAVE INDEPENDANT EXISTANCE. THE CONSOLE PROGRAM
|
||
; TAKES CARE OF SAVING AWAY THE "REAL" VALUES AND RESTORING THEM AT THE
|
||
; APPROPRIATE TIMES.
|
||
; FOR ADDITIONAL "EFFIECIENCY" ON REFERENCES FROM THE 10, A HACK IS
|
||
; PROVIDED WHICH MAKES IT POSSIBLE TO DO A "COMPLETE" OPERATION IN ONE
|
||
; 4 WORD COMMAND BLOCK. THIS HACK IS TRIGGERRED WHEN THE 10 SPECIFIES A
|
||
; NEGATIVE REGISTER ADDRESS. THE PARTICULAR OPERATION IS SPECIFIED
|
||
; BY THE MAGNITUDE OF THE REGISTER ADDRESS. THE MOST NOTABLE ONES ARE
|
||
; MAIN MEMORY READS (PHYSICAL AND VIRTUAL PROVIDED). THE OPERATION IS TO
|
||
; WRITE THE VMA-START-READ FROM THE DATA, THEN CLOBBER THE DATA WITH THE
|
||
; READ DATA REGISTER. (IF IT WERE NOT FOR THIS HACK, ONE WOULD HAVE TO
|
||
; "TURN THE BUFFER AROUND" FOR EVERY INDIVIDUAL EXAMINE SINCE IT WOULD
|
||
; CONSIST OF "WRITING" THE VMA-START-READ AND "READING" THE READ-DATA-REGISTER.)
|
||
; SINCE DATA IS ACTUALLY FLOWING IN BOTH DIRECTIONS, NEGATIVE REGISTER
|
||
; ADDRESSES ARE DECODED IDENTICALLY REGARDLESS OF WHICH WAY THE BUFFER
|
||
; IS SET UP.
|
||
|
||
|
||
;BASIC COMMANDS:
|
||
; REGISTER EXAMINATION
|
||
; / TAKES AS ARG ADDRESS. IF ITS A "NUMBER" IT IS RELOCATED BY
|
||
; CURRENT DEFAULT MEMORY. GOES TO APPROPRIATE EXAMINE ROUTINE
|
||
; WHICH PRINTS CONTENTS OF INDICATED MEMORY. THEN GOES TO
|
||
; TO DEPOSIT ROUTINE WHICH GIVES USER AN OPPORTUNITY TO ALTER
|
||
; REGISTER CONTENTS
|
||
; <LF> EXAMINE NEXT REGISTER
|
||
; <UP ARROW> EXAMINE PREVIOUS
|
||
; \ PROMPTS WITH MEM? USER TYPES SYMBOLIC MEMORY DESIGNATOR.
|
||
; RETURNS VALUE OF REGISTER ADDRESS OF BEGINNING OF SAID MEMORY.
|
||
; ^S STOP CONS.
|
||
; ^N STEP CONS (ARG # OF TIMES, NO ARG -> 1)
|
||
; ^G START CONS (AT LOCATION). IF NO LOCATION, LAST SPECIFIED
|
||
; IS USED. IF LOCN IN CI MEM, CONSOLE COMPUTER ENTERS A LOOP
|
||
; FEEDING THE CONTENTS OF CI MEMORY AT CONS.
|
||
|
||
;STATE SAVING
|
||
; THERE ARE TWO "MODES" IN WHICH THE STATE OF CONS CAN BE "SAVED".
|
||
; "PASSIVE" MODE CONSISTS OF SAVING JUST WHAT CAN BE WITHOUT AFFECTING
|
||
; CONS IN ANY WAY. (IE THAT INFO THAT CAN BE DIRECTLY READ IN:
|
||
; THE PC, IR, OUTPUT BUS, AND ERROR INDICATIONS).
|
||
; A PASSIVE SAVE CAN BE DONE WITH CONS RUNNING, ALTHO THE RESULTS ARE
|
||
; SOMEWHAT RANDOM OF COURSE.
|
||
; "FULL" MODE SAVES THE A MEM 0 AND M MEM 0. IT ALSO DOES HAIR NECESSARY
|
||
; TO GET STARTED AGAIN RE THE IR. (SIMULATES OA HACKERY, REMEMBERS THE
|
||
; NO-OP BIT, ETC.) AFTER A FULL SAVE HAS BEEN DONE, INTERNAL CONS
|
||
; REGISTERS CAN BE EXAMINED, MODIFIED, ETC.
|
||
; THE PROCESS OF TAKING A FULL SAVE INVOLVES STOPPING CONS.
|
||
; NORMALLY WHEN THE CONSOLE LOOP IS ENTERED, FIRST A PASSIVE SAVE IS DONE.
|
||
; IF THAT SHOWS CONS STILL TO BE RUNNING, A FULL SAVE IS NOT DONE.
|
||
; IF CONS IS NOT RUNNING, A FULL SAVE IS DONE IMMEDIATELY.
|
||
; THE ^S COMMAND (STOP) WILL CAUSE A FULL SAVE TO BE DONE.
|
||
|
||
|
||
; LOW LEVEL "CLOCK TICKING"
|
||
; MOST CONSOLE MONITOR COMMANDS ARE "HIGH LEVEL" IN THE SENSE THAT
|
||
; IN ORDER TO EXECUTE THEM THE CONSOLE COMPUTER MUST GO THRU
|
||
; A (FREQUENTLY FAIRLY ELABORATE) SERIES OF MACHINATIONS, INVOLVING
|
||
; MANY CLOCK CYCLES ON CONS. HOWEVER, A "LOW LEVEL" MODE
|
||
; IS PROVIDED, WHICH ALLOWS THE USER TO DIRECTLY MANIPULATE THE MACHINE
|
||
; WITHOUT ANYTHING "EXTRA" HAPPENING THE USER DOESNT EXPLICTLY
|
||
; COMMAND. IN LOW LEVEL MODE, ONLY INFORMATION THE CONSOLE COMPUTER
|
||
; CAN DETERMINE WITHOUT DISTURBING THE STATE OF CONS IS DISPLAYED.
|
||
; (THIS CONSISTS OF THE PC, IR, OUTPUT BUS, AND ERROR INDICATIONS,
|
||
; IE PASSIVE STATE SAVES.)
|
||
|
||
COMTAB: CRTSPC ;0
|
||
COMERR ;^A
|
||
COMERR ;^B
|
||
CRTSPC ;^C
|
||
COMERR ;^D
|
||
COMERR ;^E
|
||
COMERR ;^F
|
||
COMERR ;^G (BELL)
|
||
QBS ;^H (BS)
|
||
COMERR ;^I (TAB)
|
||
QLF ;^J (LF)
|
||
COMERR ;^K
|
||
QFF ;^L (FF)
|
||
CMCR ;^M (CR)
|
||
QCN ;^N
|
||
COMERR ;^O
|
||
QCP ;^P
|
||
COMERR ;^Q (MUST BE QUOTED)
|
||
QCR ;^R
|
||
QCS ;^S
|
||
QCT ;^T
|
||
COMERR ;^U
|
||
COMERR ;^V
|
||
COMERR ;^W
|
||
COMERR ;^X
|
||
COMERR ;^Y
|
||
QCZ ;^Z (ZONK)
|
||
COMERR ;ALT
|
||
COMERR ;^\
|
||
COMERR ;^]
|
||
COMERR ;^^
|
||
COMERR ;^_
|
||
QPLS ;SPACE
|
||
COMERR ;!
|
||
COMERR ;"
|
||
COMERR ;#
|
||
COMERR ;$
|
||
COMERR ;%
|
||
QAMP ;&
|
||
COMERR ;'
|
||
COMERR ;(
|
||
COMERR ;)
|
||
COMERR ;*
|
||
QPLS ;+
|
||
COMERR ;,
|
||
COMERR ;-
|
||
COMERR ;.
|
||
QSLSH ;/
|
||
|
||
COMERR ;0 (MUST FOLLOW @ TO DISPATCH)
|
||
QM1 ;1
|
||
QM2 ;2
|
||
COMERR ;3
|
||
COMERR ;4
|
||
COMERR ;5
|
||
COMERR ;6
|
||
COMERR ;7
|
||
COMERR ;8
|
||
COMERR ;9
|
||
COMERR ;:
|
||
COMERR ;;
|
||
COMERR ;<
|
||
QEQ ;=
|
||
COMERR ;>
|
||
COMERR ;?
|
||
COMERR ;@
|
||
QA ;A (MUST FOLLOW @ TO DISPATCH)
|
||
COMERR ;B
|
||
QC ;C
|
||
QD ;D
|
||
COMERR ;E
|
||
COMERR ;F
|
||
QG ;G
|
||
COMERR ;H
|
||
COMERR ;I
|
||
COMERR ;J
|
||
COMERR ;K
|
||
COMERR ;L
|
||
QM ;M
|
||
COMERR ;N
|
||
COMERR ;O
|
||
QP ;P
|
||
COMERR ;Q
|
||
COMERR ;R
|
||
COMERR ;S
|
||
COMERR ;T
|
||
QU ;U
|
||
COMERR ;V
|
||
COMERR ;W
|
||
COMERR ;X
|
||
COMERR ;Y
|
||
COMERR ;Z
|
||
COMERR ;[
|
||
COMERR ;\
|
||
COMERR ;]
|
||
QUPAR ;^
|
||
COMERR ;_
|
||
COMERR ;`
|
||
COMERR ;{
|
||
COMERR ;|
|
||
COMERR ;}
|
||
COMERR ;~
|
||
RUBCOD=<.-COMTAB>/2 ;MAPPED CODE FOR RUBOUT
|
||
COMERR ;RUBOUT
|
||
.IFNZ <<.-COMTAB>/2>-200+32
|
||
.PRINT \COMTAB LOSES\
|
||
.ENDC
|
||
|
||
QCS:
|
||
QDPSTP: CLR CTRUN ;NO LONGER TRYING TO RUN
|
||
JSR PC,QDPHLT
|
||
QCT1:; CLR LMHTTY ;TAKE TTY AWAY FROM LISP MACHINE
|
||
RTS PC
|
||
|
||
QDPHLT: ESTOP ;STOP CONS ^S
|
||
JSR PC,ENTER ;DO FULL SAVE
|
||
RTS PC
|
||
|
||
QCT:; TST LMHTTY ;COMPLEMENT STATE OF LISP MACHINE HAVING TTY
|
||
; BNE QCT1
|
||
; ZAPFLG LMHTTY
|
||
RTS PC
|
||
|
||
QA: ADD #RAAMO,A ;ADDRESS A MEM
|
||
VALRET: DEC CVALF ;INDICATE VALUE PRESENT
|
||
RTS PC
|
||
|
||
QU: ADD #RAUSO,A ;ADDRESS U STACK
|
||
BR VALRET
|
||
|
||
QM: ADD #RAMMO,A ;ADDRESS M MEM
|
||
BR VALRET
|
||
|
||
QC: ADD #RACMO,A ;ADDRESS MAIN CONTROL MEM
|
||
BR VALRET
|
||
|
||
QP: ADD #RAPBO,A ;ADDRESS PDL BUFFER
|
||
BR VALRET
|
||
|
||
QD: ADD #RADMO,A ;ADDRESS DISPATCH MEMORY
|
||
BR VALRET
|
||
|
||
QM1: ADD #RAM1O,A ;ADDRESS LVL 1 MAP
|
||
BR VALRET
|
||
|
||
QM2: ADD #RAM2O,A ;ADDRESS LVL 2 MAP
|
||
BR VALRET
|
||
|
||
PCNSPT: MOV CONSPT,A
|
||
JSR PC,QPAD
|
||
ETEXT
|
||
ASCSLT ;SLASH TAB
|
||
MOV CONSPT,A
|
||
RTS PC
|
||
|
||
REGPNT: PUSH A ;PRINT XXX/<CURRENT VAL> WHERE XXX IS REG ADR
|
||
JSR PC,QPAD
|
||
ETEXT
|
||
ASCSLH
|
||
POP A
|
||
PUSH REGOPF ;DONT AFFECT REGOPF
|
||
MOV #QEXAMV,B
|
||
MOV #-1,QEXPF ;WANT TO PRINT IT OUT
|
||
JSR PC,REGDC
|
||
TST CPOS
|
||
BEQ REGPN2 ;DONT PRINT SPACE AT BEG OF LINE
|
||
ETEXT
|
||
ASCSP ;PRINT SPACE
|
||
REGPN2: POP REGOPF
|
||
RTS PC
|
||
|
||
QUPAR: JSR PC,REGCLS ;CLOSE REG BEFORE MODIFING PT
|
||
DEC CONSPT ;UP ARROW (OR CARRET)
|
||
BR QLF2
|
||
|
||
QLF: JSR PC,REGCLS ;CLOSE REG BEFORE MODIFING PT
|
||
INC CONSPT ;LF EXAMINE NEXT REGISTER
|
||
QLF2: TST CPOS
|
||
BEQ QLF1 ;CR UNLESS AT BEG OF LINE
|
||
ETEXT
|
||
ASCCR
|
||
QLF1: JSR PC,PCNSPT
|
||
DEC CNUMF ;SIGNAL VALID ARG IN A
|
||
QSLSH: JSR PC,QPTSET ;SET UP POINT (CONSPT)
|
||
MOV #QEXAMV,B ;/ EXAMINE
|
||
MOV #-1,QEXPF ;WANT TO PRINT IT OUT
|
||
JSR PC,REGDC ;DECODE REGISTER ADDR IN A, DISPATCHING
|
||
;VIA VECTOR IN B
|
||
MOV REGDEF,QBLMEX ;BASE OF LAST MEM EXAMINED
|
||
RTS PC
|
||
|
||
QPTSET: TST CNUMF
|
||
BEQ QSLSH3 ;NO ARG
|
||
CMP A,#RAORG
|
||
BGE QSLSH1 ;REGISTER ADDR, OK
|
||
ADD QBLMEX,A ;TRY EXAMINING WITHIN LAST MEM
|
||
CMP A,#RAORG
|
||
BLT QSLSH2 ;STILL DIDNT WIN, WILL GO TO COMERR
|
||
QSLSH1: MOV A,CONSPT ;LAST LOCN EXAMINED
|
||
QSLSH2: RTS PC
|
||
|
||
QSLSH3: MOV CONSPT,A
|
||
RTS PC
|
||
|
||
.SBTTL REGISTER ADDRESS DEFS
|
||
|
||
RAORG==40000 ; ORIGIN OF REGISTER ADDRESS SPACE
|
||
RACMO==40000 ; ORIGIN OF CONTROL MEM
|
||
RACME==50000 ; CONTROL MEMORY (C) 4K
|
||
RADMO==50000
|
||
RADME==52000 ; DISPATCH MEMORY (D) 1K
|
||
RAPBO==52000
|
||
RAPBE==54000 ; PDL BUFFER (P) 1024 REG
|
||
RAM1O==54000
|
||
RAM1E==60000 ; MAP (1ST LEVEL)(1) 2048 REG (5 BITS EA)
|
||
RAM2O==60000
|
||
RAM2E==62000 ; MAP (2ND LEVEL)(2) 1024 REG (20 BITS EA)
|
||
RAAMO==62000
|
||
RAAME==62400 ; A MEMORY (A) 256 REG
|
||
RAUSO==62400
|
||
RAUSE==62440 ; U STACK (U) 32 REG
|
||
RAMMO==62440
|
||
RAMME==62500 ; M MEMORY (M) 32 REG
|
||
RAFSO==62500 ; NOTE: M MEM MUST BE CONTIG WITH FUNCT SRC
|
||
RAFSE==62540 ; FUNCTIONAL SOURCES 32 REGS
|
||
RAFDO==62540 ; FUNCTIONAL DESTINATIONS 16 REG
|
||
RAFDE==62560
|
||
RAMWD==RAFDO+CFDMWD ;MAIN MEM WRITE DATA REGISTER
|
||
RAVMA==RAFDO+CFDVMA ;VMA (VIRTUAL MEMORY ADDRESS)
|
||
RAPP==RAFDO+CFDPP ;PDL POINTER (TO PDL BUFFER)
|
||
RAPI==RAFDO+CFDPI ;PDL INDEX (TO PDL BUFFER)
|
||
; MICROPROCESSOR REGISTERS
|
||
RARGO==62560 ; INTERNAL (COPY OF) REGISTER SECTION
|
||
RARGE==62600 ; (OR IN SOME CASES, THESE REQUIRE SPECIAL ACCESS FOR
|
||
; "HARWARE" REASONS)
|
||
RAPC==62560 ; PC (PC)
|
||
RAUSP==62561 ; U STACK POINTER (USP)
|
||
RAIR==62562 ; .IR (PUT IN DIAG INST REG, THEN LOAD INTO IR, THEN
|
||
; UPDATE OBUS DISPLAY. DIAGNOSTIC ONLY)
|
||
RASIR==62563 ; SAVED IR (THE ONE SAVE ON FULL STATE SAVE
|
||
; AND RESTORED ON FULL RESTORE)
|
||
; THIS IS NORMALLY THE UINST ABOUT TO GET EXECUTED.
|
||
RAQ==62564 ; Q REGISTER (Q)
|
||
RADC==62565 ; DISPATCH CONSTANT REGISTER (DC)
|
||
RARSET==62566 ; RESET REGISTER! DEPOSITING HERE
|
||
; CLEARS ENTIRE C, D, P, M1, M2, A, U AND
|
||
; M MEMORIES!
|
||
RASTS==62567 ; STATUS REGISTER (32 BIT, AS READ BY ERERWS)
|
||
RAOBS==62570 ; OUTPUT BUS STATUS (32 BITS)
|
||
;THE FOLLOWING REGISTERS MAKE VARIOUS FUNCTIONS AVAILABLE TO THE PDP-10
|
||
; WHICH ARE OTHERWISE ACCESSIBLE ONLY BY TYPIN.
|
||
RARS== 62571 ; RESET (CNTRL-R)
|
||
RASTEP==62572 ; STEP (CNTRL-N)
|
||
RASTOP==62573 ; STOP (CNTRL-S)
|
||
RASA== 62574 ; SET STARTING ADR (@G)
|
||
RAGO== 62575 ; GO (CNTRL-P, BUT KEEP LISTENING)
|
||
; WHEN EXAMINED, RETURN STATE OF CTRUN.
|
||
RAMOD== 62576 ;MODE REGISTER, BIT 1.1 => RUN SLOW, BIT 1.2 => DON'T HALT IF ERROR
|
||
; ZERO IS THE NORMAL DEFAULT VALUE FOR THIS REG
|
||
RARCON==62577 ;REMOTE CONSOLE, DEPOSIT = TYI, EXAMINE = TYO
|
||
|
||
; BUFFERS WITHIN THE CONSOLE COMPUTER
|
||
RACSWO==62600 ; MODE SWITCHES (CLLMOD, ETC)
|
||
RACSWE==62620
|
||
RARDRO==62620 ; "RAID" REGISTERS (RAIDR)
|
||
RARDRE==62630
|
||
RACIBO==62630
|
||
RACIBE==62640 ; CONSOLE INST BUFFER (CI) 8 REG
|
||
; (EA HOLDS A U INST. CAN BE SENT TO CONS VIA DIB IN A LOOP)
|
||
|
||
RACMFO==62640 ; MAIN MEMORY FUNCTION REGISTERS
|
||
RACVMR==62640 ; VIRTUAL MEMORY (ADDRESS), INITIATE READ
|
||
RACRDR==62641 ; CONSOLE MEMORY READ DATA (LAST READ BY RACVMR OR RACPMR)
|
||
RACPMR==62642 ; PHYSICAL MEMORY, INITIATE READ
|
||
; 62643 IS ANOTHER ADDRESS FOR 62642 (FOR LINE-FEEDING CONVENIENCE)
|
||
RACMWD==62644 ; CONSOLE MEMORY WRITE DATA REGISTER
|
||
RACVMW==62645 ; VIRTUAL MEMORY, INITIATE WRITE
|
||
; 62646 IS ANOTHER ADDRESS FOR 62645
|
||
RACPMW==62647 ; PHYSICAL MEMORY, INITIATE WRITE
|
||
RACMFE==62650
|
||
|
||
RAOPCO==62650 ;8 OLD PC REGISTERS
|
||
RAOPCE==62660
|
||
|
||
|
||
|
||
; IN ADDITION, THE CONSOLE PROGRAM KNOWS SOME ABOUT THE FOLLOWING, BUT
|
||
; THEY OBVIOUSLY DONT FIT INTO THE 16 BIT ADDRESS SCHEME:
|
||
|
||
; MAIN MEMORY VIRTUAL ADDRESS - 23 BITS
|
||
; MAIN MEMORY PHYSICAL ADDRESS - 20 BITS
|
||
|
||
; TELETYPE KLUDGE
|
||
|
||
;RATYI==RAAMO+40 ;SET BY 11, CLEARED BY LM
|
||
;RATYO==RAAMO+3 ;SET BY LM, CLEARED BY 11
|
||
|
||
.SBTTL REGISTER ADDRESS DECODER
|
||
|
||
REGDC: ;DECODE REGISTER ADDR IN A, VECTOR IN B
|
||
MOV #REGATL,C ;ADDRESS TABLE
|
||
REGDCL: CMP A,(C)
|
||
BHIS REGDC1 ;HIGHER THAN THAT
|
||
MOV -(C),REGDEF ;BASE OF LAST MEM ADDRESSED
|
||
SUB (C),A ;LEAVE RELATIVE ADDR WITHIN MEM IN B
|
||
MOV B,C
|
||
MOV A,B
|
||
MOV #QEXB,A
|
||
JMP @(C) ;FOUND IT, GO TO CORRESPONDING PLACE IN GIVEN VECTOR
|
||
|
||
REGDC1: TST (B)+
|
||
TST (C)+
|
||
CMP C,#REGATE
|
||
BLO REGDCL
|
||
JMP COMERR ;OFF END, TOO HIGH
|
||
|
||
REGDEF: 0 ;BASE OF LAST MEM SUCCESSFULLY ADDRESSED
|
||
QBLMEX: 0 ;BASE OF LAST MEM EXAMINED (WITH /, ETC)
|
||
QEXPF: 0 ;EXAMINE PRINT FLAG. IF -1 EXAMINE ROUTINE
|
||
; PRINTS DATA. OTHERWISE, IT RETURNS WITH
|
||
; POINTER TO DATA IN A, AND FIELD SPEC IN B
|
||
|
||
0 ;MUST BE HERE
|
||
REGATL: RACMO ;TOO LOW ..
|
||
REGATH: RACME ;CONTROL MEM
|
||
RADME ;DISPATCH MEM
|
||
RAPBE ;PDL BUFFER
|
||
RAM1E ;1ST LVL MAP
|
||
RAM2E ;2ND LVL MAP
|
||
RAAME ;A MEM
|
||
RAUSE ;U STACK
|
||
RAMME ;M MEM
|
||
RAFSE ;FUNCTIONAL SOURCES
|
||
RAFDE ;FUNCTIONAL DESTINATIONS
|
||
RARGE ;CONSOLE COMPUTER REGS
|
||
RACSWE ;CONSOLE COMPUTER MODES AND SWITCHES
|
||
RARDRE ;RAID REGISTERS
|
||
RACIBE ;CONSOLE COMPUTER INST BUFFER
|
||
RACMFE ;MAIN MEMORY FUNCTION REGISTERS
|
||
RAOPCE ;OLD PCS
|
||
REGATE==. ;TOP
|
||
|
||
.SBTTL EXAMINATION ROUTINES
|
||
|
||
;IF QEXPF = -1, EXAMINE AND PRINT FROB
|
||
;OTHERWISE, RETURN WITH A POINTING TO DATA AND B A FIELD SPEC
|
||
QEXAMV: COMERR ;TOO LOW
|
||
QEXC ;CONTROL MEM
|
||
QEXD ;DISPATCH MEM
|
||
QEXPB ;PDL BUFFER
|
||
QEX1MP ;1ST LVL MAP
|
||
QEX2MP ;2ND LVL MAP
|
||
QEXA ;A MEM
|
||
QEXUS ;U STACK
|
||
QEXM ;M MEM
|
||
QEXFS ;FUNCTIONAL SOURCES
|
||
QEXFD ;FUNCTIONAL DESTINATIONS
|
||
QEXCON ;CONSOLE COMPUTER REGS
|
||
QEXSW ;CONSOLE COMPUTER MODES AND SWITCHES
|
||
QEXRDR ;RAID REGISTERS
|
||
QEXCIB ;CONSOLE COMPUTER INST BUFFER
|
||
QEXMMF ;MAIN MEMORY FUNCTION REGISTERS
|
||
QEXOPC ;OLD PCS
|
||
COMERR ;TOO HI
|
||
|
||
QEXCIB: JSR PC,QEXCI1 ;GET BUFFER ADR IN C
|
||
QEXSI1: MOV A,B ;PLACE WE WANT TO STORE IT
|
||
MOV (C)+,(B)+ ;STORE THREE WDS WORTH
|
||
MOV (C)+,(B)+
|
||
MOV (C),(B)
|
||
BR QEXIR1
|
||
|
||
QEXCI1: MOV B,C ;EXAMINE CONSOLE INST BUFFER (COMPUTE ADR IN C)
|
||
ASL C ;3 WDS PER ENTRY
|
||
ADD B,C
|
||
ASL C ;CONVERT TO WORDS
|
||
ADD #CIBUF,C
|
||
RTS PC
|
||
|
||
QEXC: EEXAMC ;EXAMINE CONTROL MEM
|
||
QEXIR1: MOV #<<44.*400>+0>,B
|
||
TST QEXPF
|
||
BEQ QEXCX
|
||
EPI
|
||
CRLF: ETEXT
|
||
ASCCR
|
||
QEXCX: RTS PC
|
||
|
||
QEXFD: EWMEMS ;ASSURE VMA AND MWD VALID
|
||
MOV B,C ;FUNCTIONAL DESTINATIONS
|
||
MOV #CMSMWD,B ; TRY TO TURN INTO RIGHT THING
|
||
CMP C,#CFDMMW
|
||
BLE QEXM ;MAIN WRITE MEMORY DATA
|
||
MOV #CMSVMA,B ;VMA SOURCE
|
||
CMP C,#CFDVWM
|
||
BLE QEXM ;EXAMINE VMA IN VARIOUS FORMS
|
||
MOV #CMSCP,B ;PDL (POINTER)
|
||
CMP C,#CFDCPP
|
||
BLE QEXM
|
||
MOV #CMSCI,B ;PDL (INDEX)
|
||
CMP C,#CFDCI
|
||
BLE QEXM
|
||
CMP C,#CFDPP
|
||
BLE QEXPPI ;EXAMINE PDL INDEX OR PDL POINTER
|
||
JMP COMERR ;THATS AS MUCH AS WE FEEL LIKE..
|
||
|
||
QEXOPC: ASL B
|
||
MOV OLDPCS(B),(A)
|
||
JMP QEXPC0
|
||
|
||
QEXPPI: PUSH C ;EX PDL INDEX OR PDL POINTER
|
||
MOV #CMSPPI,B
|
||
EEXAMD ;EXAMINE BOTH
|
||
POP C
|
||
CMP C,#CFDPI
|
||
BEQ QEXPP1 ;EX PDL INDEX, ITS IN LOW PART
|
||
PUSH A ;EX PDL POINTER, ITS IN HIGH
|
||
MOV #<<10.*400>+10.>,B ; PART
|
||
EXFLD
|
||
MOV A,@(SP)
|
||
POP A
|
||
QEXPP1: BIC #176000,(A)
|
||
CLR 2(A)
|
||
MOV #<<10.*400>+0>,B
|
||
BR QEXPC1
|
||
|
||
QEXD: ERDSP ;EXAMINE DISPATCH MEM
|
||
MOV #<<16.*400>+0>,B
|
||
BR QEXPC1
|
||
|
||
QEXFS: EWMEMS ;ASSURE VMA AND MWD VALID
|
||
ADD #40,B ;EXAMINE FUNCT SOURCES
|
||
BR QEXM ; (TURN INTO M SOURCE)
|
||
|
||
QEXA1: MOV CAMEM1,(A)
|
||
MOV CAMEM1+2,2(A)
|
||
BR QEXPB1
|
||
|
||
QEXM0: MOV CMMEM0,(A)
|
||
MOV CMMEM0+2,2(A)
|
||
BR QEXPB1
|
||
|
||
QEXA: CMP B,#1
|
||
BEQ QEXA1 ;USE SAVED A MEM 1
|
||
BIS #CDAMEM,B ;EXAMINE A MEM
|
||
QEXM: TST B ;EXAMINE M MEM
|
||
BEQ QEXM0 ;USE SAVED M MEM 0
|
||
EEXAMD
|
||
QEXPB1: MOV #<<32.*400>+0>,B ;FIELD DESCRIPTION
|
||
QEXPC1: TST QEXPF
|
||
BEQ QEXMX ;JUST WANT TO FETCH DATA
|
||
DEC REGOPF
|
||
IPNFLD
|
||
QEXMX: RTS PC
|
||
|
||
QEXQ: MOV #CMSQ,B ;EXAMINE Q
|
||
BR QEXM
|
||
|
||
QEXPB: ERPDLB ;EXAMINE PDL BUFFER
|
||
BR QEXPB1
|
||
|
||
QEXRDR: ASL B ;EXAMINE RAID REGISTER
|
||
MOV B,C
|
||
MOV RAIDA(C),(A)
|
||
MOV #<<16.*400>+0>,B
|
||
TST QEXPF
|
||
BEQ QEXRDX
|
||
MOV (A),A
|
||
BEQ QEXRD1 ;0 IS NULL
|
||
JSR PC,QPAD ;PRINT IT AS ADDRESS
|
||
QEXRST: ;GET HERE TO "OPEN" RESET REGISTER
|
||
QEXRD1: ETEXT
|
||
ASCSP
|
||
DEC REGOPF
|
||
QEXRDX: RTS PC
|
||
|
||
QEXSW: MOV B,C
|
||
ASL C
|
||
MOV CSSWO(C),(A)
|
||
MOV #<<3.*400>+0>,B ;EXAMINE SWITCH (PRINT ONE DIGIT)
|
||
BR QEXPC1
|
||
|
||
QEX1MP: TST B
|
||
BEQ QEX1M1
|
||
ERL1MP ;EXAMINE 1ST LVL MAP
|
||
QEX1M2: MOV #<<5*400>+0>,B
|
||
BR QEXPC1
|
||
|
||
QEX1M1: MOV CL1M0,(A) ;LOCN 0 SAVED AWAY SPECIALLY
|
||
BR QEX1M2
|
||
|
||
QEX2MP: TST B
|
||
BEQ QEX2M1
|
||
ERL2MP ;EXAMINE 2ND LVL MAP
|
||
QEX2M2: MOV #<<20.*400>+0>,B
|
||
BR QEXPC1
|
||
|
||
QEX2M1: MOV CL2M0,(A) ;LOCN 0 SAVED AWAY SPECIALLY
|
||
MOV CL2M0+2,2(A)
|
||
BR QEX2M2
|
||
|
||
QEXSTS: MOV CCERR1,(A) ;EXAMINE SAVED ERROR STATUS
|
||
MOV CCERR2,2(A)
|
||
BR QEXPB1
|
||
|
||
QEXOBS: MOV COBUS,(A) ;EXAMINE SAVED OBUS STATUS
|
||
MOV COBUS+2,2(A)
|
||
BR QEXPB1
|
||
|
||
QEXNL: CLR B ;"NULL" EXAMINE
|
||
RTS PC
|
||
|
||
QEXGO: MOV CTRUN,(A) ;RETURN STATE OF WHETHER TRYING TO RUN OR NOT
|
||
QEX1WD: CLR 2(A)
|
||
MOV #<<16.*400>+0>,B
|
||
JMP QEXPC1
|
||
|
||
QEXMOD: MOV MODREG,(A) ;EXAMINE MODE REGISTER AS LAST SET
|
||
BR QEX1WD
|
||
|
||
QEXRCN: CLR (A) ;REMOTE CONSOLE EXAMINE, 0 OR CHAR BEING TYO'ED
|
||
TST CTRUN
|
||
BEQ QEX1WD
|
||
;; tyo wait loop in CONS
|
||
;; ((M-GARBAGE) A-TYO IR-FLAG-TO-11)
|
||
;; (JUMP A-ZERO M-ZERO .-1 IR-FLAG-TO-11)
|
||
;; ((M-GARBAGE) M-ZERO IR-FLAG-TO-11)
|
||
;;--ALSO SEE TYO HACKER AT QCN2
|
||
BIT 164010,#4000 ;IR43
|
||
BEQ QEX1WD
|
||
MOV #0,164006 ;STOP CONS
|
||
MOV #100,B
|
||
2$: MOV 164004,(A) ;LOW 16 BITS OF OBUS
|
||
BNE 3$
|
||
JSR PC,XCLK
|
||
DEC B
|
||
BGT 2$
|
||
CLR (A) ;SOMETHING SCREWED, EITHER ITS TYPING OUT RANDOMNESS OR NOT REALLY
|
||
BR QEX1WD ;IN RIGHT LOOP. AT LEAST DONT HANG UP.
|
||
|
||
3$: JSR PC,XNCLK ;CLOCK PAST FIRST ALU INST
|
||
JSR PC,XNCLK ;CLOCK PAST JUMP, NO-OP ING IT
|
||
MOV #1,164006 ; START 'ER UP
|
||
BR QEX1WD
|
||
|
||
QEXCON: ASL B ;EXAMINE CONSOLE COMPUTER REGS
|
||
CMP B,#QEXCVL
|
||
BHIS QEXCER
|
||
JMP @QEXCT(B)
|
||
|
||
QEXCER: JMP COMERR
|
||
|
||
QEXCT: QEXPC ;EXAMINE PC
|
||
QEXUSP ;U STACK POINTER
|
||
QEXIR ;HARDWARE IR
|
||
QEXSIR ;SAVED IR
|
||
QEXQ ;EXAMINE Q
|
||
QEXDC ;EXAMINE DISPATCH CONSTANT
|
||
QEXRST ;RESET REGISTER (JUST "OPEN" IT)
|
||
QEXSTS ;EXAMINE STATUS REGISTER
|
||
QEXOBS ;EXAMINE O-BUS STATUS
|
||
QEXNL ;RESET FUNCTION
|
||
QEXNL ;STEP FUNCTION
|
||
QEXNL ;STOP FUNCTION
|
||
QEXPC ;EXAMINE STARTING ADR
|
||
QEXGO ;GO FUNCTION (RETURN CTRUN)
|
||
QEXMOD ;MODE REGISTER
|
||
QEXRCN ;REMOTE CONSOLE
|
||
QEXCVL==.-QEXCT
|
||
|
||
|
||
QEXUS: PUSH A
|
||
PUSH B ;EXAMINE U STACK
|
||
ESUSTK
|
||
POP B
|
||
POP A
|
||
ASL B
|
||
MOV USSVD(B),(A)
|
||
MOV #<<16.*400>+0>,B
|
||
BR QEXPC2
|
||
|
||
QEXUSP: PUSH A
|
||
ESUSTK ;EXAMINE U STACK POINTER
|
||
POP A
|
||
MOV USTPNR,(A)
|
||
MOV #<<5.*400>+0>,B
|
||
BR QEXPC2
|
||
|
||
QEXPC: MOV CPC,(A)
|
||
QEXPC0: MOV #<<12.*400>+0>,B
|
||
BR QEXPC2
|
||
|
||
QEXDC: ERDSPC ;EXAMINE DISPATCH CONSTANT
|
||
MOV #<<8*400>+0>,B
|
||
QEXPC2: JMP QEXPC1
|
||
|
||
QEXIR: ERIR
|
||
JMP QEXIR1
|
||
|
||
QEXSIR: MOV #CIR,C
|
||
JMP QEXSI1
|
||
|
||
QEXMMF: ASL B ;MAIN MEMORY FUNCTIONS
|
||
JMP @QEMMFT(B)
|
||
|
||
QEMMFT: QECVMR ;EXAMINE CONSOLE VIRTUAL ADDRESS REGISTER
|
||
QECVRD ;EXAMINE CONSOLE READ DATA
|
||
QECVMR ;EXAMINE CONSOLE PHYSICAL ADR REGISTER
|
||
QECVRD ;EXAMINE CONSOLE READ DATA
|
||
QECVWD ;EXAMINE CONSOLE VIRTUAL WRITE DATA REGISTER
|
||
QECVMR ;EXAMINE CONSOLE VIRTUAL ADR REGISTER
|
||
QECVWD ;EXAMINE CONSOLE VIRTUAL WRITE DATA REGISTER
|
||
QECVMR ;EXAMINE CONSOLE VIRTUAL ADR REGISTER
|
||
|
||
QECVMR: MOV CVMVMA,(A) ;EXAMINE CONSOLE VIRTUAL ADR REGISTER
|
||
MOV CVMVMA+2,2(A)
|
||
QEXPB2: JMP QEXPB1 ;OUT OF RANGE, LOSE LOSE
|
||
|
||
QECVRD: MOV CVMMRD,(A) ;EXAMINE CONSOLE READ DATA REGISTER
|
||
MOV CVMMRD+2,2(A)
|
||
MOV CVMMPF,4(A) ;HIGH WORD FAULT STATUS
|
||
BR QEXPB2
|
||
|
||
QECVWD: MOV CVMMWD,(A) ;EXAMINE CONSOLE WRITE DATA REGISTER
|
||
MOV CVMMWD+2,2(A)
|
||
BR QEXPB2
|
||
|
||
QEXB: 0 ;TEMP BLOCK FOR EXAMINING FCTNS
|
||
0
|
||
0
|
||
|
||
|
||
.SBTTL DEPOSITATION ROUTINES
|
||
|
||
QDEPV: COMERR ;TOO LOW ..
|
||
QDPC ;CONTROL MEM (NUMERIC STYLE)
|
||
QDPD ;DISPATCH MEM
|
||
QDPPB ;PDL BUFFER
|
||
QDP1MP ;1ST LVL MAP
|
||
QDP2MP ;2ND LVL MAP
|
||
QDPA ;A MEM
|
||
QDPUS ;U STACK
|
||
QDPM ;M MEM
|
||
COMERR ;FUNCTIONAL SOURCES
|
||
QDPFD ;FUNCTIONAL DESTINATIONS
|
||
QDPCON ;CONSOLE COMPUTER REGS
|
||
QDPSW ;CONSOLE COMPUTER MODES AND SWITCHES
|
||
QDPRDR ;RAID REGISTERS
|
||
COMERR ;CONSOLE COMPUTER INST BUFFER
|
||
QDPMMF ;MAIN MEMORY FUNCTION REGISTERS
|
||
COMERR ;OLD PCS
|
||
COMERR ;TOO HI
|
||
|
||
QDPD: MOV #CNUM,A ;DEPOSIT IN DISPATCH MEM
|
||
EWDSP
|
||
BR QDPXIT
|
||
|
||
QDPFD: SWAB B ;DEPOSIT IN FUNCT DEST
|
||
ASR B ; (ALSO CLOBBERS M MEM 0 BUT THAT DOESNT HURT)
|
||
ASR B
|
||
ASR B
|
||
EWMEMS ;ASSURE VMA AND MWD VALID
|
||
JSR PC,QDPM ;DO STUFF
|
||
ERMEMS ;READ THEM AGAIN AS THEY MAY HAVE CHANGED
|
||
RTS PC
|
||
|
||
QDPA1: MOV #CAMEM1,A ;DEPOSIT IN A MEM 1
|
||
QDPM1: MOV CNUM,(A)+
|
||
MOV CNUM+2,(A)
|
||
BR QDPXIT
|
||
|
||
QDPM0: MOV #CMMEM0,A ;DEPOSIT IN M MEM 0
|
||
BR QDPM1
|
||
|
||
QDPA: CMP B,#1
|
||
BEQ QDPA1 ;DEPOSIT IN A MEM 1
|
||
BIS #CDAMEM,B ;DEPOSIT IN A MEM
|
||
QDPM: TST B
|
||
BEQ QDPM0
|
||
CMP B,#1 ;WRITING 1@M CLOBBERS 1@A
|
||
BNE 1$
|
||
MOV CNUM,CAMEM1
|
||
MOV CNUM+2,CAMEM1+2
|
||
1$: MOV #CNUM,A ;DEPOSIT IN M MEM
|
||
EDMM0
|
||
QDPXIT: DEC DEPFLG ;SIGNAL DEPOSIT DONE
|
||
RTS PC
|
||
|
||
QDPPB: MOV #CNUM,A ;DEPOSIT IN PDL BUFFER
|
||
EWPDLB
|
||
BR QDPXIT
|
||
|
||
QDPRDR: ASL B ;DEPOSIT IN RAID REGISTER
|
||
ADD #RAIDA,B
|
||
BR QDPRD1
|
||
|
||
QDPSW: ASL B
|
||
ADD #CSSWO,B ;DEPOSIT IN CONSOLE COMPUTER SWITCH
|
||
QDPRD1: MOV CNUM,(B)
|
||
BR QDPXIT
|
||
|
||
REGCLS: TST REGOPF ;CLOSE OPEN REGISTER
|
||
BEQ REGCLX ;NO REG OPEN
|
||
TST CNUMF
|
||
BEQ REGCLX ;NO NUMBER TYPED
|
||
MOV CONSPT,A
|
||
MOV #QDEPV,B
|
||
JSR PC,REGDC
|
||
REGCLX: RTS PC
|
||
|
||
QDP1MP: MOV #CNUM,A
|
||
TST B
|
||
BEQ QDP1M1
|
||
EWL1MP ;DEPOSIT IN LVL 1 MAP
|
||
BR QDPXIT
|
||
|
||
QDP1M1: MOV (A),CL1M0 ;HACK LOCN 0 SPECIALLY
|
||
MOV #1,CL1M0F
|
||
BR QDPXIT
|
||
|
||
QDP2MP: MOV #CNUM,A
|
||
TST B
|
||
BEQ QDP2M1
|
||
EWL2MP ;DEPOSIT IN LVL 2 MAP
|
||
BR QDPXIT
|
||
|
||
QDP2M1: MOV (A),CL2M0
|
||
MOV 2(A),CL2M0+2
|
||
MOV #1,CL2M0F
|
||
BR QDPXIT
|
||
|
||
QDPCON: ASL B ;DEPOSIT IN CONSOLE COMPUTER REGS
|
||
CMP B,#QDPVL
|
||
BHIS QDPCER
|
||
JMP @QDPCV(B)
|
||
|
||
QDPCER: JMP COMERR
|
||
|
||
QDPCV: QDPPC ;DEPOSIT IN PC
|
||
QDPUSP ;DEPOSIT IN U STACK POINTER
|
||
COMERR ;DEPOSIT IN HARDWARE IR
|
||
COMERR ;DEPOSIT IN SAVED IR
|
||
QDPQ ;DEPOSIT IN Q
|
||
QDPDC ;DEPOSIT IN DISPATCH CONSTANT REGISTER
|
||
QDPRST ;DEPOSIT IN RESET REGISTER (ZAP)
|
||
COMERR ;STATUS REGISTER
|
||
COMERR ;O-BUS STATUS
|
||
QDPRS ;RESET FUNCTION
|
||
QDPSTE ;STEP FUNCTION
|
||
QDPSTP ;STOP FUNCTION
|
||
QDPSA ;SET STARTING ADR
|
||
QDPGO ;GO FUNCTION
|
||
QDPMOD ;MODE REGISTER
|
||
QDPRCN ;REMOTE CONSOLE
|
||
QDPVL==.-QDPCV
|
||
|
||
QDPUS: PUSH B ;DEPOSIT IN U STACK
|
||
ESUSTK
|
||
POP B
|
||
ASL B
|
||
ADD #USSVD,B
|
||
MOV CNUM,(B)
|
||
BR QDPXIT
|
||
|
||
QDPUSP: ESUSTK ;DEPOSIT IN U STACK POINTER
|
||
MOV CNUM,USTPNR
|
||
BIC #177740,USTPNR
|
||
BR QDPXIT
|
||
|
||
QG:
|
||
QDPSA: MOV #1,NOOPF ;NO OP PRESENT CONTENTS OF IR
|
||
QDPPC: MOV CNUM,CPC
|
||
BIC #170000,CPC
|
||
BR QDPXIT
|
||
|
||
QDPQ: MOV #CSDQ,B ;DEPOSIT IN Q REGISTER
|
||
BR QDPM ; ("PSEUDO" DEST Q)
|
||
|
||
QDPDC: MOV #CNUM,A ;DEPOSIT IN DISPATCH CONSTANT REGISTER
|
||
EWDSPC
|
||
BR QDPXIT
|
||
|
||
QDPRST: ERESET ;RESET MISC STATE
|
||
MOV #RACMO,QDPRC ;CLEAR ALL MEMORIES!!
|
||
QDPR1: MOV #QDEPV,B ;START OFF WITH CONTROL MEM
|
||
MOV QDPRC,A
|
||
CMP A,#RAMME
|
||
BHIS QDPXIT
|
||
JSR PC,REGDC
|
||
INC QDPRC
|
||
BR QDPR1
|
||
|
||
QDPRC: 0
|
||
|
||
QDPMMF: MOV #CNUM,A
|
||
ASL B ;MAIN MEMORY FUNCTION REGISTERS
|
||
JMP @QDMMFT(B)
|
||
|
||
QDMMFT: QDCVMR ;CONSOLE VIRTUAL ADDRESS REGISTER, INITIATE READ
|
||
QDCVRD ;CONSOLE VIRTUAL READ DATA REGISTER
|
||
QDCPMR ;CONSOLE PHYSICAL ADDRESS REGISTER, INITIATE READ
|
||
QDCVRD ;CONSOLE VIRTUAL READ DATA REGISTER
|
||
QDCMWD ;CONSOLE VIRTUAL WRITE DATA REGISTER
|
||
QDCVWD ;CONSOLE VIRTUAL ADDRESS REGISTER, INITIATE WRITE
|
||
QDCMWD ;CONSOLE VIRTUAL WRITE DATA REGISTER
|
||
QDCPWD ;CONSOLE PHYSICAL ADDRESS REGISTER, INITIATE WRITE.
|
||
|
||
QDCVMR: MOV (A)+,CVMVMA ;DEPOSIT IN CONSOLE VMA, INITIATE READ
|
||
MOV (A),CVMVMA+2
|
||
EVMEMS ;"VALIDIFY" MEM SUBROUTINE
|
||
MOV #CVMVMA,A
|
||
MOV #<CFDVMR_5>,B
|
||
EDMM0 ;START READ
|
||
QDCVM1: INC CSMRDF ;HACKING WITH "REAL" READ DATA REG
|
||
JSR PC,QCVFLT ;CHECK FOR PAGE FAULT
|
||
MOV #CVMMRD,A ;UPDATE CONSOLE READ DATA REG
|
||
MOV #CMSMMD,B
|
||
EEXAMD
|
||
QDPXI1: JMP QDPXIT ;OUT OF RANGE, LOSE LOSE
|
||
|
||
QCVFLT: CLR CVMMPF ;ASSUME NO FAULT
|
||
MOV #QEXB,A ;CHECK FOR FAULT
|
||
MOV #CMSPMD,B
|
||
EEXAMD
|
||
BIT #3,(A)
|
||
BEQ 1$
|
||
INC CVMMPF ;FAULT PRESENT
|
||
1$: RTS PC
|
||
|
||
QDCVRD: MOV (A)+,CVMMRD ;DEPOSIT IN CONSOLE VIRTUAL MEM DATA REGISTER
|
||
MOV (A),CVMMRD+2 ; (TOTALLY RANDOM OPERATION)
|
||
BR QDPXI1
|
||
|
||
QDCPMR: MOV (A)+,CVMVMA ;LOAD CONSOLE "PHYSICAL" VMA
|
||
MOV (A),CVMVMA+2
|
||
MOV #CVMVMA,A
|
||
EWPVMA ;LOAD "PHYSICAL" VMA
|
||
EMMRC ;START READ CYCLE
|
||
BR QDCVM1 ;UPDATE CONSOLE READ DATA REG
|
||
|
||
QDCMWD: MOV (A)+,CVMMWD ;WRITE CONSOLE MEMORY WRITE DATA REG
|
||
MOV (A),CVMMWD+2
|
||
BR QDPXI1
|
||
|
||
QDCVWD: MOV (A)+,CVMVMA ;DEPOSIT IN CONSOLE VMA, START WRITE
|
||
MOV (A),CVMVMA+2
|
||
EVMEMS ;GET BACK EVERYTHING (SAVED MAP, ETC)
|
||
MOV #CVMMWD,A
|
||
MOV #<CFDMWD_5>,B
|
||
EDMM0 ;LOAD MWD WITH CONSOLE MWD
|
||
MOV #CVMVMA,A
|
||
MOV #<CFDVMW_5>,B
|
||
EDMM0 ;DO VMA START WRITE
|
||
JSR PC,QCVFLT ;CHECK FOR FAULT
|
||
BR QDPXI1
|
||
|
||
QDCPWD: MOV (A)+,CVMVMA ;LOAD CONSOLE "PHYSICAL" VMA, START WRITE
|
||
MOV (A),CVMVMA+2
|
||
MOV #CVMVMA,A
|
||
EWPVMA ;LOAD "PHYSICAL" VMA
|
||
MOV #CVMMWD,A
|
||
MOV #<CFDMWD_5>,B
|
||
EDMM0 ;LOAD MWD WITH CONSOLE MWD
|
||
EMMWC ;START WRITE CYCLE
|
||
BR QDPXI1
|
||
|
||
|
||
.SBTTL FUNNY-FORMAT TYPE-IN
|
||
|
||
QBS: JSR PC,QPTSET
|
||
TST CNUMF
|
||
BLT QBS1
|
||
JSR PC,PCNSPT
|
||
QBS1: MOV #QTIVEC,B ;TYPE IN FUNNY FORMATS
|
||
JSR PC,REGDC
|
||
JMP CRLF
|
||
|
||
|
||
;TYPE IN VECTOR FOR FUNNY FORMAT TYPE INS
|
||
QTIVEC: COMERR ;TOO LOW, TRY LAST MEM
|
||
QUICM ;CONTROL MEMORY
|
||
COMERR ;DISPATCH MEM
|
||
COMERR ;PDL BUFFER
|
||
COMERR ;1ST LVL MAP
|
||
COMERR ;2ND LVL MAP
|
||
COMERR ;A MEM
|
||
COMERR ;U STACK
|
||
COMERR ;M MEM
|
||
COMERR ;FUNCTIONAL SOURCES
|
||
COMERR ;FUNCTIONAL DESTINATIONS
|
||
QUICR ;CONSOLE COMPUTER REGS
|
||
COMERR ;CONSOLE COMPUTER MODES AND SWITCHES
|
||
COMERR ;RAID REGISTERS
|
||
QUICIB ;CONSOLE COMPUTER INST BUFFER
|
||
COMERR ;MAIN MEMORY FUNCTION REGISTERS
|
||
COMERR ;OLD PCS
|
||
COMERR ;TOO HI
|
||
|
||
QUICIB: JSR PC,QEXCI1 ;DEPOSIT IN CONSOLE INST BUFFER
|
||
MOV C,A
|
||
JSR PC,QUTYI
|
||
BR QUIXIT
|
||
|
||
QDPC: MOV #CNUM,A ;DO NUMERIC STYLE DEPOSIT
|
||
BR QDPC1
|
||
|
||
QUICM: EEXAMC ;GET CURRENT CONTENTS FOR DEFAULTING
|
||
PUSH B ;DEPOSIT IN CONTROL MEM
|
||
JSR PC,QUTYI
|
||
POP B
|
||
QDPC1: EDCMEM
|
||
QUIXIT: DEC DEPFLG
|
||
RTS PC
|
||
|
||
QUICR: ASL B ;SPECIAL DEPOSIT IN CONSOLE REG
|
||
CMP B,#QUIVL
|
||
BHIS QUIVER
|
||
JMP @QUIVC(B)
|
||
|
||
QUIVER: JMP COMERR
|
||
|
||
QUIVC: COMERR ;DEPOSIT IN PC
|
||
COMERR ;DEPOSIT IN U STACK POINTER
|
||
QUIIR ;DEPOSIT IN HARDWARE IR
|
||
QUISIR ;DEPOSIT IN SAVED IR
|
||
COMERR ;DEPOSIT IN Q
|
||
COMERR ;DEPOSIT IN DISPATCH CONSTANT
|
||
COMERR ;DEPOSIT IN RESET REGISTER
|
||
COMERR ;STATUS REGISTER
|
||
COMERR ;O-BUS STATUS
|
||
COMERR ;RESET FUNCTION
|
||
COMERR ;STEP FUNCTION
|
||
COMERR ;STOP FUNCTION
|
||
COMERR ;SET STARTING ADR
|
||
COMERR ;GO FUNCTION
|
||
QUIVL==.-QUIVC
|
||
|
||
QUIIR: ERIR ;READ IN CURRENT IR FOR DEFAULT
|
||
JSR PC,QUTYI ;READ IN U INST
|
||
EWIR ;PUT IN IR
|
||
MOV #COBUS,A ;READ IN NEW O BUS
|
||
EROBUS
|
||
BR QUIXIT
|
||
|
||
QUISIR: MOV #CIR,A
|
||
JSR PC,QUTYI
|
||
BR QUIXIT
|
||
|
||
|
||
;U INST TYPEIN --
|
||
; THERE ARE TWO ROUTINES ASSOCIATED WITH EA FIELD, A PROMPT
|
||
; GENERATING FIELD AND A DEPOSITING FIELD.
|
||
; AT EACH STAGE OF THE GAME THE USER IS PROMPT ED BY SOME
|
||
; PROMPT ROUTINE. IF HE TYPES A NUMBER, THAT NUMBER IS FED
|
||
; TO THE APPROPRIATE DEPOSIT ROUTINE. IF HE TYPES A SYMBOL,
|
||
; IT IS LOOKED UP IN A TABLE. IF NOT FOUND, ERROR.
|
||
; IF IT IS FOUND, IT SPECIFIES A TRANSFER ADDRESS AND A
|
||
; VALUE. THE TRANSFER ADDRESS MAY BE EITHER A PROMPT OR
|
||
; A DEPOSIT ROUTINE. IF A PROMPT, THE ARG (FROM THE SYMBOL
|
||
; TABLE) IS IGNORED. IF A DEPOSIT, IT GETS DEPOSITED!!
|
||
; EACH DEPOSIT ROUTINE FALLS THRU INTO AN "APPROPRIATE"
|
||
; PROMPT ROUTINE. CR AS A TERMINATOR, STOPS PROMPTING AND
|
||
; DEPOSITS! RUBOUT FLUSHES CURRENT COMMAND (U CAN TRY AGAIN IF
|
||
; YOU WANT). ^G QUITS OUT OF ENTIRE THING. SPACE ADVANCES
|
||
; TO THE NEXT PROMPT ROUTINE.
|
||
|
||
QUTYI: CLR QIFCRT ;POINTER TO QEXB IN A
|
||
QPUOP: ETEXT ;TYPE IN U INST
|
||
ASCTOP ;TYPE TAB OP<SPC>
|
||
JSR PC,QIFLD ;GOBBLE FIELD. IF SYMBOLIC, ZAP
|
||
BR QDUOP1 ;SPACE LEAVE OP AND REST
|
||
;THE SAME TO START WITH
|
||
QDUOP: EICLR ;INTIALIZE STUFF
|
||
MOV #<<2*400>+47>,C
|
||
EDPB
|
||
TST B
|
||
BNE QDUOP1
|
||
BIS #1_14,(A) ;ALU OP, DEFAULT ALU OUTPUT BUS
|
||
QDUOP1:
|
||
QPAS: ETEXT ;A SOURCE (D C FOR DSP)
|
||
ASCA
|
||
JSR PC,QIFLD
|
||
BR QPMS
|
||
QDAS: EDASRC
|
||
QPMS: ETEXT ;M SOURCE (ALL INSTS)
|
||
ASCM
|
||
JSR PC,QIFLD
|
||
BR QPDD
|
||
EDMSRC
|
||
QPDD: MOV 4(A),B
|
||
ASL B
|
||
ASL B
|
||
SWAB B
|
||
BIC #177771,B
|
||
JMP @QPDDT(B)
|
||
|
||
QPDDT: QPDSTA ;ALU TAKES DEST
|
||
QPDIS ;DISPATCH PROMPT SEQ
|
||
QPJMP ;JMP PROMPT SEQ
|
||
QPDSTA ;BYT TAKES DEST
|
||
|
||
|
||
QPDSTM: ETEXT ;DESTINATION M
|
||
ASCDM
|
||
JSR PC,QIFLD
|
||
BR QPDSTR
|
||
EDMDST ;DEPOSIT IN M PART OF DESTINATION
|
||
QPDSTR: ETEXT ;DESTINATION REGISTER/FUNCTION
|
||
ASCDR
|
||
JSR PC,QIFLD
|
||
BR QPAOB
|
||
EDRDST ;DEPOSIT IN R PART OF DEST
|
||
BR QPAOB
|
||
|
||
QPDSTA: ETEXT ;DESTINATION A
|
||
ASCDA
|
||
JSR PC,QIFLD
|
||
BR QPDSTM
|
||
BIS #CDAMEM,B
|
||
EDDEST
|
||
QPAOB: MOV 4(A),B
|
||
BIC #177177,B
|
||
BNE QPBYT ;BYTE PROMPT SEQ
|
||
QPALU: ETEXT ;ALU PROMPT SEQ
|
||
ASCALU
|
||
JSR PC,QIFLD
|
||
BR QPCRYC
|
||
EDALUF
|
||
QPCRYC: ETEXT
|
||
ASCCRY
|
||
JSR PC,QIFLD
|
||
BR QPQC
|
||
MOV #<<2*400>+2>,C
|
||
EDPB
|
||
QPQC: ETEXT
|
||
ASCQC
|
||
JSR PC,QIFLD
|
||
BR QPMF
|
||
MOV #<<2*400>+0>,C
|
||
EDPB
|
||
QPMF: ETEXT
|
||
ASCMF
|
||
JSR PC,QIFLD
|
||
BR QPILG
|
||
MOV #<<2*400>+12>,C
|
||
EDPB
|
||
QPILG: ETEXT
|
||
ASCILG
|
||
JSR PC,QIFLD
|
||
BR QTIDEP
|
||
MOV #<<1*400>+41.>,C
|
||
EDPB
|
||
QTIDEP: RTS PC ;RETURN FROM U INST TYPE IN
|
||
;U INST IN QEXB
|
||
|
||
QPBYT: ETEXT ;BYTE PROMPT SEQ
|
||
ASCMD
|
||
JSR PC,QIFLD
|
||
BR QPBLEN
|
||
MOV #<<2*400>+14>,C
|
||
EDPB
|
||
QPBLEN: ETEXT ;BYTE LENGTH
|
||
ASCNB
|
||
JSR PC,QIFLD
|
||
BR QPBROT
|
||
MOV #<<5*400>+5>,C
|
||
QPDNB1: EDPB
|
||
QPBROT:
|
||
QPDMR: ETEXT ;BYTE ROTATE
|
||
ASCMR
|
||
JSR PC,QIFLD
|
||
BR QPBMF
|
||
MOV #<<5*400>+0>,C
|
||
EDPB
|
||
QPBMF: BR QPMF ;MISC FUNCTION SAME POSITION IN ALL INST
|
||
|
||
QIFBS2: BIS B,4(A) ;BIS VAL OF SYM INTO WD2
|
||
QPUOPJ: JMP QPUOP
|
||
|
||
QIFBC2: BIC B,4(A) ;BIC VAL OF SYM INTO WD2
|
||
BR QPUOPJ
|
||
|
||
QIFOB: BIC #3_12.,(A) ;DEPOSIT INTO ALU OBUS SELECTION FIELD
|
||
BIS B,(A)
|
||
BR QPALU
|
||
|
||
QPDIS: ETEXT ;DISPATCH INST SEQUENCE
|
||
ASCDO ;DISPATCH OFFSET
|
||
JSR PC,QIFLD
|
||
BR QPDNB
|
||
EDDSPO ;DEPOSIT INTO DISPATCH OFFSET FIELD
|
||
QPDNB: ETEXT
|
||
ASCNB
|
||
JSR PC,QIFLD
|
||
BR QPDMR
|
||
MOV #<<3*400>+5>,C
|
||
BR QPDNB1
|
||
|
||
QPJMP: ETEXT ;JMP SEQUENCE
|
||
ASCJPC
|
||
JSR PC,QIFLD
|
||
BR QPJR
|
||
EDJPC
|
||
QPJR: ETEXT
|
||
ASCR
|
||
JSR PC,QIFLD
|
||
BR QPJP
|
||
MOV #<<1*400>+11>,C
|
||
EDPB
|
||
QPJP: ETEXT
|
||
ASCP
|
||
JSR PC,QIFLD
|
||
BR QPJN
|
||
MOV #<<1*400>+10>,C
|
||
EDPB
|
||
QPJN: ETEXT
|
||
ASCN
|
||
JSR PC,QIFLD
|
||
BR QPJI
|
||
MOV #<<1*400>+7>,C
|
||
EDPB
|
||
QPJI: ETEXT
|
||
ASCI
|
||
JSR PC,QIFLD
|
||
BR QPJC
|
||
MOV #<<1*400>+6>,C
|
||
EDPB
|
||
QPJC: ETEXT
|
||
ASCJC
|
||
JSR PC,QIFLD
|
||
BR QPJTB ;NULL HERE TO TEST BIT
|
||
ADD #40,B ;SET TEST CONDITION BIT
|
||
QPJTB1: MOV #<<6*400>+0>,C
|
||
EDPB
|
||
QPJMF: JMP QPMF
|
||
|
||
|
||
QPJTB: ETEXT
|
||
ASCTB
|
||
JSR PC,QIFLD
|
||
BR QPJMF
|
||
BR QPJTB1
|
||
|
||
QIFSU: ETEXT ;SYM UNDEFINED
|
||
ASCU ;RUB IT OUT!
|
||
QIFRUB: ETEXT
|
||
ASCXXX
|
||
BR QIFRB1
|
||
|
||
QIFLD: PUSH A ;READ IN FIELD
|
||
QIFRB1: TST QIFCRT ;SKIP UNLESS FIELD NULL
|
||
BNE QIFCL ;TYPED CR BEFORE, CLOSE REG
|
||
QIFLD1: JSR PC,GECOM ;G COM, EVAL SYMS
|
||
CMP A,#RUBCOD
|
||
BEQ QIFRUB
|
||
CMP A,#7
|
||
BEQ QIFQT
|
||
TST CNUMF
|
||
BLT QIFNM ;HE TYPED A NUMBER!
|
||
TST CSYL
|
||
BNE QIFSYL ;HE TYPED SYM, LOOK IT UP
|
||
CMP A,#40
|
||
BEQ QIFSP ;SKIP OVER THIS FLD
|
||
; IE RETURN W/O SKIPPING
|
||
CMP A,#15
|
||
BEQ QIFCL ;CR CLOSE REG
|
||
BR QIFLD1 ;SOMETHING ELSE RANDOM, IGNORE
|
||
|
||
QIFCL: MOV #QTIDEP,2(SP) ;FORCE RETURN TO QTIDEP
|
||
BR QIFSP
|
||
|
||
QIFNM: CMP A,#15 ;TERM BY CR?
|
||
BNE QIFLDX
|
||
DEC QIFCRT ;REMEMBER CR TYPED
|
||
QIFLDX: ADD #2,2(SP) ;SKIP ON RETURN
|
||
QIFSP: MOV CNUM,B ;DONT SKIP ON RETURN (MEANS SKIP
|
||
;FIELD
|
||
QIFSP1: POP A
|
||
RTS PC
|
||
|
||
QIFQT: JMP COMERR
|
||
|
||
QIFSYL: MOV #QIFST,C ;SEARCH SYMTAB
|
||
QIFSY1: CMP C,#QIFSTE
|
||
BHIS QIFSU ;SYMBOL UNDEFINED
|
||
MOV #CBUF,T
|
||
MOV (C)+,U
|
||
QIFSY2: CMPB (T)+,(U)
|
||
BNE QIFSY3 ;THAT ONE LOSES
|
||
TSTB (U)+
|
||
BNE QIFSY2 ;KEEP LOOKING
|
||
MOV (C)+,B ;VALUE TO RETURN
|
||
MOV (C)+,2(SP) ;PLACE TO FORCE RETURN
|
||
BR QIFSP1
|
||
|
||
QIFSY3: CMP (C)+,(C)+ ;TRY NEXT SYMBOL
|
||
BR QIFSY1
|
||
|
||
QIFCRT: 0 ;-1 CR TYPED
|
||
|
||
;SYMBOL TABLE FORMAT:
|
||
; WD0 POINTER TO ASCIZ STRING
|
||
; WD1 VALUE
|
||
; WD2 FORCE RETURN ADR
|
||
|
||
QIFST: ASCPJ1 ;PJ
|
||
CIPJB
|
||
QIFBS2 ;BIS INTO WD 2
|
||
ASCNPJ ;NPJ
|
||
CIPJB
|
||
QIFBC2 ;BIC INTO WD 2
|
||
ASCOL1 ;OBL1 (OUTPUT BUS LEFT 1)
|
||
COBAL_12.
|
||
QIFOB
|
||
ASCOR1 ;OBR1 (OUTPUT BUS RIGHT 1)
|
||
COBAR_12.
|
||
QIFOB
|
||
QIFSTE:
|
||
|
||
|
||
.SBTTL MISC COMMAND CHARS' ROUTINES
|
||
|
||
QCZ: EDCLK ;ZONK. CYCLE CLOCK ONCE
|
||
RTS PC
|
||
|
||
QCR:
|
||
QDPRS: JSR PC,RESSV ;RESET
|
||
ERESET
|
||
RTS PC
|
||
|
||
QCN:
|
||
QDPSTE: JSR PC,RESSV ;RESTORE STATE, SAVE AND COME BACK
|
||
CMP CNUM,#RAORG
|
||
BHIS QCN2 ;BRANCH IF ARG IS REGISTER ADDRESS
|
||
TST CNUMF
|
||
BLT QCN1
|
||
INC CNUM ;DEFAULT ARG OF 1
|
||
QCN1: SUB #1,CNUM
|
||
SBC CNUM+2
|
||
SBC CNUM+4
|
||
BLT QCNX
|
||
ECCLK
|
||
TST CMREQ
|
||
BLT QCN1 ;GUY WANTS TO QUIT OUT
|
||
QCNX: RTS PC
|
||
|
||
QCN2: SUB #RACMO,CNUM ;C MEM ADDRESS OF INSTR TO STOP AT
|
||
QCN3: JSR PC,XCCLK ;PROCEED UNTIL ABOUT TO EXECUTE THAT
|
||
CLR CPSVAL ;BUT ALWAYS PROCEED AT LEAST ONCE
|
||
QCN4: TST CMREQ
|
||
BGE QCNX ;STOP IF GUY ASKS TO QUIT OUT
|
||
MOV TYICH,A
|
||
BNE QCNTYI ;HACK TYPEIN
|
||
TST 164002
|
||
BPL QCNX ;MACHINE LOSSAGE, CEASE PROCEEDING
|
||
BIT 164010,#4000 ;IR43
|
||
BNE QCN5 ;HANDLE TYO WHILE STEPPING
|
||
MOV 164006,A ;READ PC INTO A
|
||
BIC #170000,A ; PC 12 BITS
|
||
CMP A,CNUM ;DON'T STOP IF HAVEN'T REACHED DESIRED PC
|
||
BNE QCN3
|
||
ECCLK ;CLOCK ONCE MORE TO FETCH DESIRED INSTR
|
||
CLR CPSVAL
|
||
JSR PC,PSCONS
|
||
TST NOOPF ;BUT IF ITS NOOPED, DON'T STOP
|
||
BNE QCN4 ;BECAUSE NOT REALLY EXECUTING IT
|
||
RTS PC
|
||
|
||
QCN5: MOV 164004,A ;LOW 16 BITS OF OBUS
|
||
BNE 3$
|
||
ECCLK
|
||
BR QCN5
|
||
|
||
3$: JSR PC,TYOCHR ;GOT THE STUFF, TYPE IT
|
||
MOV CURSX,RCURSX ;MAKE SURE CURSOR DISPLAYING IN RIGHT PLACE
|
||
MOV CURSY,RCURSY
|
||
ENCLK ;CLOCK PAST FIRST ALU INST
|
||
ENCLK ;CLOCK PAST JUMP, NO-OP ING IT
|
||
BR QCN3
|
||
|
||
QCNTYI: CLR TYICH ;HERE WHEN KEY HIT WHILE ONE-PROCEEDING
|
||
CMP A,#23 ;^S STOP
|
||
BEQ QCNX
|
||
BR QCN4 ;EVERYTHING ELSE IGNORED
|
||
; MOV CNUM,-(SP) ;I'M A LITTLE PARANOID ABOUT THIS
|
||
; CLR -(SP) ;OTHER CHAR, GIVE TO CONS
|
||
; MOV A,-(SP)
|
||
; CMP A,#40
|
||
; BLT 2$
|
||
; CMP A,#177
|
||
; BEQ 2$
|
||
; JSR PC,ADDCHR ;ECHO NON-CONTROLS EXCEPT RUBOUT
|
||
; MOV (SP),A
|
||
;2$: CMP A,#15
|
||
; BNE 1$
|
||
; JSR PC,TYOCHR ;ECHO CR AS CR,LF,CLEOL
|
||
;1$: MOV CURSX,RCURSX ;MAKE SURE CURSOR DISPLAYING IN RIGHT PLACE
|
||
; MOV CURSY,RCURSY
|
||
; JSR PC,ENTER ;SAVE STATE OF CONS
|
||
; CMP -(SP),-(SP) ;CHECK THE TYI REGISTER
|
||
; MOV SP,A
|
||
; MOV #RATYI-RAAMO+CDAMEM,B
|
||
; EEXAMD
|
||
; BIS (SP)+,(SP)+ ;IS IT ZERO?
|
||
; BEQ 3$ ;YES, OK
|
||
; JSR PC,BELL ;NO, BEEP, PREV CHAR NOT PICKED UP YET
|
||
; BR 4$
|
||
|
||
;3$: MOV SP,A ;GIVE IT THE CHARACTER
|
||
; MOV #RATYI-RAAMO+CDAMEM,B
|
||
; EDMM0
|
||
;4$: CMP (SP)+,(SP)+ ;FLUSH TEMP REGISTERS
|
||
; JSR PC,LEAVE ;RESTORE STATE OF CONS
|
||
; MOV (SP)+,CNUM
|
||
; BR QCN4 ;RETURN TO ONE-PROCEED LOOP
|
||
|
||
QCP:; JSR PC,RESSV ;RESTORE STATE, SAVE AND COME BACK
|
||
; ECCLK ;MAYBE XCT IR (MIGHT CAUSE IR PARITY ERR)
|
||
; ECLK ;MAKE SURE ERRORS CLEARED
|
||
; MOV #1,164006 ;SET RUN!
|
||
;QCP1: WAIT
|
||
; TST CMREQ
|
||
; BLT QCP1
|
||
; RTS PC
|
||
|
||
QDPGO: MOV #-1,CTRUN ;INDICATE "TRYING TO RUN"
|
||
JSR PC,QDPRUN
|
||
; TST CNUM ;IF VALUE STORING IS NON-ZERO, DON'T GIVE UP TTY
|
||
; BNE 1$
|
||
; ZAPFLG LMHTTY ;GIVE THE TTY TO THE LISP MACHINE
|
||
; TST CNUM ;IF VALUE STORING NON-ZERO
|
||
; BEQ 1$
|
||
; COM LMHTTY ;SET IT NEGATIVE FOR REMOTE CONSOLE MODE
|
||
1$: RTS PC
|
||
|
||
QDPRUN: TST CTRUN ;SET REAL RUN. FIRST SEE IF REALLY WANT TO
|
||
BEQ QDPRUX ; MUST HAVE BEEN CLEARED BY DETECTING AN ERROR
|
||
JSR PC,LEAVE ;START MACHINE, KEEP LISTENING (PRESUMABLY TO 10)
|
||
ECCLK
|
||
ECLK
|
||
MOV #1,164006
|
||
MOV #-1,CRUN ;CONS SHOULD REALLY BE RUNNING NOW!
|
||
QDPRUX: RTS PC
|
||
|
||
RESSV: JSR PC,LEAVE ;LEAVE - CALL BACK -ENTER -RETURN
|
||
JSR PC,@(SP) ;CALL GUY BACK
|
||
JSR PC,ENTER
|
||
JSR PC,CDSPLY ;UPDATE DISPLAY
|
||
TST (SP)+
|
||
RTS PC
|
||
|
||
QPLS: MOV #CNUM,TT ;PLUS, SPACE
|
||
MOV #CVAL,T ;JUST RETURN ARG AS VALUE
|
||
MOV (TT)+,(T)+
|
||
MOV (TT)+,(T)+
|
||
MOV (TT),(T)
|
||
DEC CVALF
|
||
QAMP3: RTS PC
|
||
|
||
QAMP: INC NOOPF ;NO OP FIRST CYCLE
|
||
MOV A,B ;SEND CONSOLE INST BUFFER
|
||
JSR PC,QEXCI1 ;TO MACHINE, ARG IS HOW MANY TO
|
||
MOV C,QAMPL ;POINTER TO BUFFER AT LAST PLACE
|
||
JSR PC,RESSV
|
||
QAMP2: MOV #CIBUF,A
|
||
QAMP1: TST CMREQ
|
||
BGE QAMP3 ;LEAVE LOOP
|
||
CMP A,QAMPL
|
||
BHIS QAMP2
|
||
EWDIB
|
||
EDCCLK ;DO DEBUG CLOCK OR NOOP DEBUG
|
||
ADD #<3*2>,A ; CLOCK FIRST TIME
|
||
BR QAMP1
|
||
|
||
QAMPL: 0 ;HIGH CONSOLE BUFFER ADR TO SEND
|
||
|
||
QEQ: TST CNUMF
|
||
BEQ QEQ1 ;TYPE OUT LAST REG INSTEAD
|
||
MOV A,B ;=
|
||
MOV #6,C
|
||
JSR PC,OCTPNB
|
||
QEQ2: JMP CRLF
|
||
|
||
QEQ1: CLR QEXPF ;FETCH PT AND PRINT NUMERIC
|
||
MOV CONSPT,A
|
||
MOV #QEXAMV,B
|
||
JSR PC,REGDC
|
||
IPNFLD
|
||
BR QEQ2
|
||
|
||
QDPRCN: MOV #CNUM,A
|
||
;QDPRC0: TST CTRUN
|
||
; BNE 1$
|
||
JMP COMERR
|
||
|
||
;1$: PUSH A
|
||
; JSR PC,QDPHLT ;STOP MOMENTARILY
|
||
; POP A
|
||
; MOV #RATYI-RAAMO+CDAMEM,B
|
||
; EDMM0
|
||
; JMP QDPRUN ;RESUME (IF NO ERROR)
|
||
|
||
QDPMOD: TST CTRUN
|
||
BEQ 10$
|
||
JMP COMERR ;DOESN'T WIN IF MACHINE RUNNING
|
||
|
||
10$: MOV CNUM,MODREG ;STORE INTO MODE REGISTER
|
||
MODSET: MOV #100000,A ;CONVERT TO MACHINE FORMAT
|
||
BIT #1,MODREG ;SLOW MODE
|
||
BEQ 1$
|
||
BIS #400,A
|
||
1$: BIT #2,MODREG ;DISABLE ERROR HALT MODE
|
||
BNE 2$
|
||
BIS #1000,A
|
||
2$: MOV A,164006 ;STORE INTO HARDWARE MODE
|
||
RTS PC
|
||
|
||
.SBTTL PRINT ADDRESS
|
||
|
||
QPAD: MOV #GSYMT,TT ;PRINT SYMBOL IF ONE FOUND EXACTLY EQUAL
|
||
QPASY1: CMP TT,#GSYMTE
|
||
BHIS QPASYX ;NO MATCH
|
||
CMP A,2(TT)
|
||
BEQ QPASYF ;FOUND IT
|
||
ADD #4,TT
|
||
BR QPASY1
|
||
|
||
QPASYF: MOV (TT),A ;SYMBOL FOUND, PRINT IT
|
||
ETEXTP
|
||
RTS PC
|
||
|
||
QPASYX: MOV #QPADV,B ;PRINT ADDRESS (IN A)
|
||
JSR PC,REGDC
|
||
RTS PC
|
||
|
||
QPADV: QPATL ;TOO LOW, JUST PRINT NUMBER
|
||
QPAC ;CONTROL MEM PRINT ADDRESS VECTOR
|
||
QPADM ;DISPATCH MEM
|
||
QPAPB ;PDL BUFFER
|
||
QPA1MP ;1ST LVL MAP
|
||
QPA2MP ;2ND LVL MAP
|
||
QPAA ;A MEM
|
||
QPAUS ;U STACK
|
||
QPAM ;M MEM
|
||
QPAFS ;FUNCTIONAL SOURCES
|
||
QPAFD ;FUNCTIONAL DESTINATIONS
|
||
QPANUL ;CONSOLE COMPUTER REGS
|
||
QPANUL ;CONSOLE COMPUTER MODES AND SWITCHES
|
||
QPARDR ;RAID REGISTERS
|
||
QPACIB ;CONSOLE COMPUTER INST BUFFER
|
||
QPANUL ;MAIN MEMORY FUNCTION REGISTERS
|
||
QPANUL ;OLD PCS
|
||
QPANUL ;TOO HI
|
||
|
||
QPA1MP: MOV #4,C
|
||
JSR PC,OCTPNB
|
||
ETEXT ;1ST LVL MAP
|
||
ASC1MP
|
||
RTS PC
|
||
|
||
QPA2MP: MOV #4,C
|
||
JSR PC,OCTPNB
|
||
ETEXT ;2ND LVL MAP
|
||
ASC2MP
|
||
RTS PC
|
||
|
||
QPARDR: ETEXT ;RAID REGISTERS
|
||
ASCRDP
|
||
MOV #1,C
|
||
JSR PC,OCTPNB
|
||
RTS PC
|
||
|
||
QPACIB: ETEXT ;CONSOLE INST BUFFER
|
||
ASCCBP ;CIB+
|
||
MOV #2,C
|
||
JSR PC,OCTPNB
|
||
RTS PC
|
||
|
||
QPAUS: MOV #2,C ;PRINT U STACK ADR
|
||
JSR PC,OCTPNB
|
||
ETEXT
|
||
ASCIUS
|
||
RTS PC
|
||
|
||
QPADM: MOV #4,C ;PRINT DISPATCH MEM ADR
|
||
JSR PC,OCTPNB
|
||
ETEXT
|
||
ASCIDM
|
||
RTS PC
|
||
|
||
QPAC: MOV #4,C ;PRINT CONTROL MEM ADR
|
||
JSR PC,OCTPNB
|
||
ETEXT
|
||
ASCICM
|
||
RTS PC
|
||
|
||
QPAPB: MOV #4,C ;PRINT PDL BUFFER ADR
|
||
JSR PC,OCTPNB
|
||
ETEXT
|
||
ASCIPB
|
||
RTS PC
|
||
|
||
QPAA: MOV #3,C
|
||
JSR PC,OCTPNB
|
||
ETEXT
|
||
ASCIAM
|
||
RTS PC
|
||
|
||
QPAFD: MOV #2,C ;FUNCTIONAL DEST
|
||
JSR PC,OCTPNB
|
||
ETEXT
|
||
ASCFDP
|
||
RTS PC
|
||
|
||
QPAFS: ADD #40,B ;TURN F SRC INTO M ADR S
|
||
QPAM: MOV #2,C
|
||
JSR PC,OCTPNB
|
||
ETEXT
|
||
ASCIMM
|
||
RTS PC
|
||
|
||
QPANUL: ADD REGDEF,B ;GET BACK FULL ADR
|
||
QPANL1: ETEXT ;DONT KNOW HOW TO PRINT THAT, SO
|
||
ASCREG ;PRINT INTERNAL ADDR
|
||
QPATL: MOV #6,C
|
||
JSR PC,OCTPNB
|
||
RTS PC
|
||
|
||
.SBTTL EMT HANDLER
|
||
|
||
EMTBRK: CMP SP,#PDL+30
|
||
BLO STAKO ;STACK OVERFLOW
|
||
PUSH #EMTRET
|
||
PUSH A
|
||
BIC #17,6(SP) ;CLEAR PROCESSOR FLAGS
|
||
; SO THEY CAN BE USED TO RETURN INFO
|
||
MOV 4(SP),A ;GET RETURN PC
|
||
MOV -(A),A ;GET EMT INST
|
||
ASL A ;SHIFT TO CONVERT TO WORD INDEX
|
||
CMP A,#TWHEMT
|
||
BHI BADEMT ;OUT OF RANGE
|
||
MOV EMTTAB-TWLEMT(A),A
|
||
RTS A ;XFER TO EMT ROUTINE. WHEN IT RETURNS, IT WILL GO
|
||
;TO EMTRET AND RETURN AGAIN
|
||
XFATL: BPT
|
||
EMTERX: BIS #1,4(SP) ;SET CARRY ON RETURN INDICATING ERROR
|
||
RTS PC
|
||
|
||
EMTRET: RTI
|
||
|
||
STAKO: BPT
|
||
BADEMT: BPT
|
||
|
||
;THIS ROUTINE MUST BE CALLED IMMEDIATELY AFTER EMT DISPATCH BY EMT WANTING
|
||
;TO ACCESS ARG AFTER THE EMT. IT SAVES ALL AC S, LOADS THE WD AFTER THE EMT
|
||
;INTO A, AND BUGGERS THE RETURN SO IT WILL RESTORE THE STATE OF THE MACHINE
|
||
;AND SKIP OVER THE ARG WORD. U IS CLOBBERED IN THIS PROCESS ALTHO IT WILL
|
||
;BE RESTORED AT EXIT FROM EMT
|
||
|
||
EMTARG: JSR U,ACSAV ;SAVE AC S (PUSHING 5 WDS)
|
||
MOV <5+1+1+1>*2(SP),U ;ACCESS EMT ADR (+2)
|
||
; ON STACK ARE 5 WDS PUSHED AT ACSAV, ONE FOR JSR U,
|
||
; ONE BY JSR PC,EMTARG AND ONE FOR EMTRET.
|
||
MOV (U)+,A ;GET ARG WD
|
||
MOV U,<5+1+1+1>*2(SP) ;SMASH BACK SO ARG WD WILL BE SKIPPED OVER
|
||
EMTSA1: JSR PC,@<5+1>*2(SP) ;CALL BACK EMT HANDLER TO FINISH THAT STUFF
|
||
JSR U,ACRES
|
||
TST (SP)+ ;FLUSH WD WHERE EMT GUY CALLED US
|
||
RTS PC
|
||
|
||
EMTSAV: JSR U,ACSAV ;CALLED BY EMT S WISHING TO SAVE AND RESTORE ALL ACS
|
||
BR EMTSA1
|
||
|
||
LEMT=EMT!0
|
||
TWLEMT=LEMT+LEMT
|
||
EMTTAB: XFATL ;EMT 0
|
||
XTEXT ; 1
|
||
XERRO ; 2
|
||
XROBUS ; 3
|
||
XRIR ; 4
|
||
XRPC ;EMT 5
|
||
XRERWS ; 6
|
||
XWDIB ; 7
|
||
XDDEST ; 10
|
||
XDALUF ; 11
|
||
XDOBSL ;EMT 12
|
||
XDMSRC ; 13
|
||
XDASRC ; 14
|
||
XUICLR ; 15
|
||
XDCLK ; 16
|
||
XDMM0 ;EMT 17
|
||
XNPCLK ; 20
|
||
XEXAMD ; 21
|
||
XDJPC ; 22
|
||
XDCMEM ; 23
|
||
XICLR ; 24
|
||
XCLK ; 25
|
||
XEXAMC ; 26
|
||
XNCLK ; 27
|
||
XOCTP4 ; 30
|
||
XOCTPD ; 31
|
||
XPI ; 32
|
||
XPASRC ; 33
|
||
XPMSRC ; 34
|
||
XPDEST ; 35
|
||
XPOBSL ; 36
|
||
XPALUF ; 37
|
||
XPCRYC ; 40
|
||
XPQC ; 41
|
||
XPDDC ; 42
|
||
XPDDO ; 43
|
||
XPDNB ; 44
|
||
XPMROT ; 45
|
||
XPJPC ; 46
|
||
XPJRB ; 47
|
||
XPJPB ; 50
|
||
XPJNB ; 51
|
||
XPJINV ; 52
|
||
XPJCND ; 53
|
||
XPBMD ; 54
|
||
XPBLEN ; 55
|
||
XXFLD ; 56
|
||
XWPC ; 57
|
||
XPERRS ; 60
|
||
XSTOP ; 61
|
||
XDPB ; 62
|
||
XDMDST ; 63
|
||
XDRDST ; 64
|
||
XDDSPO ; 65
|
||
XRPDLB ; 66
|
||
XWPDLB ; 67
|
||
XSUSTK ; 70
|
||
XUUSTK ; 71
|
||
XTEXTP ; 72
|
||
XCCLK ; 73
|
||
XDCCLK ; 74
|
||
XRESET ; 75
|
||
XRDSP ; 76
|
||
XWDSP ; 77
|
||
XRDSPC ;100
|
||
XWDSPC ;101
|
||
XWIR ;102
|
||
XDPBLK ;103
|
||
XRL1MP ;104
|
||
XWL1MP ;105
|
||
XRL2MP ;106
|
||
XWL2MP ;107
|
||
XRMEMS ;110
|
||
XWMEMS ;111
|
||
XRDBLK ;112
|
||
XWPVMA ;113
|
||
XMMWC ;114
|
||
XMMRC ;115
|
||
XVMEMS ;116
|
||
HEMT=EMT!<<.-EMTTAB>/2>
|
||
TWHEMT==HEMT+HEMT
|
||
|
||
|
||
.SBTTL RANDOM EMT ROUTINES
|
||
|
||
XTEXTP: JSR PC,EMTSAV ;PRINT ASCIZ TEXT STRING IN A
|
||
BR PTEXT
|
||
|
||
XTEXT: JSR PC,EMTARG ;SAVE ALL AC S, CHANGE EMT RETURN, RTN WD AFTER EMT IN A
|
||
PTEXT: MOV A,B ;TYPE OUT ASCIZ STRING POINTED TO BY A -CLOBBERS ACS-
|
||
PTEXTL: MOVB (B)+,A
|
||
BEQ PTEXTX
|
||
PUSH B
|
||
JSR PC,TYOCHR
|
||
POP B
|
||
BR PTEXTL
|
||
|
||
PTEXTX: RTS PC
|
||
|
||
XERRO: CMP A,#NERMS ;OUTPUT SYSTEM ERR MSG WHOSE NUMBER IS IN A
|
||
BHIS XERROF
|
||
ASL A
|
||
MOV ERRTXT(A),A
|
||
BR PTEXT
|
||
|
||
XERROF: EFATL
|
||
|
||
ERRTXT: ;POINTER TO ASCIZ STRING FOR ERR MSG
|
||
NERMS==<.-ERRTXT>/2
|
||
|
||
|
||
XROBUS: PUSH A ;READ OBUS INTO DOUBLE WD POINTED TO BY A
|
||
MOV 164004,(A)+
|
||
MOVB 164000,(A)+
|
||
MOVB 164012,(A)+
|
||
POP A
|
||
RTS PC
|
||
|
||
XRIR: PUSH A ;READ IR INTO TRIPLE WD POINTED TO BY A
|
||
MOV 164014,(A)+
|
||
MOV 164016,(A)+
|
||
MOV 164010,(A)
|
||
BIC #160000,(A) ;THOSE BITS ARENT REALLY PART OF IR
|
||
POP A
|
||
RTS PC
|
||
|
||
XRPC: MOV 164006,(A) ;READ PC INTO WD POINTED TO BY A
|
||
BIC #170000,(A) ; PC 12 BITS
|
||
RTS PC
|
||
|
||
|
||
XRERWS: PUSH A ;READ ERROR DOUBLE WORD INTO BLOCK POINTED TO BY A
|
||
MOVB 164003,(A)+ ;LOW BYTE FROM HIGH BYTE OF 002
|
||
MOVB 164001,(A)+ ;HIGH BYTE FROM HIGH BYTE OF 000
|
||
BIC #17,-2(A) ;THOSE BITS SOMETHING ELSE ..
|
||
MOVB 164013,(A)+ ;LOW BYTE FROM HIGH BYTE OF 012
|
||
MOVB 164011,(A)+ ;HIGH BYTE FROM HIGH BYTE OF 010
|
||
BIC #17600,-(A) ;THOSE BITS ALSO SOMETHING ELSE ..
|
||
POP A
|
||
RTS PC
|
||
|
||
XWDIB: MOV (A)+,164000 ;WRITE DIAG INST BUFFER FROM TRIPLE WD POINTED TO BY A
|
||
MOV (A)+,164002
|
||
MOV (A),164004
|
||
SUB #<2*2>,A ;RESTORE A
|
||
RTS PC
|
||
|
||
XDDEST: ;DEPOSIT B INTO DEST FIELD OF
|
||
ROR B ;DONT CARE ABT CARRY SINCE WILL MASK
|
||
ROR B ;LOW 2 BITS OF B GO IN HIGH 2 BITS OF FIRST WD
|
||
PUSH B ;PUSH IT WHEN LOW BYTE HAS HIGH 8 BITS
|
||
ROR B ;GET BIT OUT OF CARRY BACK INTO WD
|
||
BIC #37777,B
|
||
BIC #140000,(A)
|
||
BIS B,(A)+
|
||
POP B
|
||
BIC #377,(A) ;OTHER 8 BITS GO IN LOW BYTE OF SECOND WD
|
||
BISB B,(A)
|
||
TST -(A) ;RESTORE A
|
||
RTS PC
|
||
|
||
|
||
XDALUF: ;DEPOSIT B INTO ALU OP FIELD OFU-INST POINTED TO BY A
|
||
ROL B
|
||
ROL B
|
||
ROL B
|
||
ROL B
|
||
BIC #1760,(A)
|
||
BIC #176017,B
|
||
BIS B,(A)
|
||
RTS PC
|
||
|
||
|
||
XDOBSL: ;DEPOSIT B INTO OUTPUT BUS CNTRL
|
||
SWAB B ;OF U INST POINTED TO BY A
|
||
ROL B
|
||
ROL B
|
||
ROL B
|
||
ROL B
|
||
BIC #030000,(A)
|
||
BIC #147777,B
|
||
BIS B,(A)
|
||
RTS PC
|
||
|
||
|
||
XDMSRC: ;DEPOSIT B INTO M SRC FIELD
|
||
TST (A)+
|
||
SWAB B
|
||
BIC #037400,(A)
|
||
BIC #140377,B
|
||
BIS B,(A)
|
||
TST -(A)
|
||
RTS PC
|
||
|
||
XDASRC: ;DEPOSIT B INTO A SRC FIELD
|
||
TST (A)+
|
||
ROR B ;DONT CARE ABT CARRY SINCE WILL MASK
|
||
ROR B ;LOW 2 BITS OF B GO IN HIGH 2 BITS OF SECOND WD
|
||
PUSH B ;PUSH IT WHEN LOW BYTE HAS
|
||
;HIGH 6 BITS RIGHT ADJUSTED
|
||
ROR B ;GET BIT OUT OF CARRY BACK INTO WD
|
||
BIC #37777,B
|
||
BIC #140000,(A)
|
||
BIS B,(A)+
|
||
POP B
|
||
BIC #77,(A) ;OTHER 6 BITS GO IN LOW BYTE OF THIRD WD
|
||
BIC #177700,B
|
||
BIS B,(A)
|
||
SUB #4,A
|
||
RTS PC
|
||
|
||
|
||
XUICLR: MOV #UI+6,A ;CLEAR OUT TEM 3 REG BLOCK AND LEAVE A POINTING THERE
|
||
CLR -(A)
|
||
CLR -(A)
|
||
CLR -(A)
|
||
RTS PC
|
||
|
||
XDMM0: PUSH A
|
||
PUSH B ;SAVE FINAL DEST
|
||
BIT B,#3740
|
||
BEQ XDMMM ;DEST IS MM LOCN, BUILD THERE
|
||
CLR B ;BUILD IN M MEM 0
|
||
XDMMM: MOV #XDMTM1,A ;CLEAR MM LOCN
|
||
JSR PC,XICLR
|
||
PUSH B ;SAVE BUILD DEST
|
||
JSR PC,XDDEST ;AND PUT IT INTO U INST
|
||
MOV (SP),B
|
||
JSR PC,XDMSRC ;ALSO M SRC
|
||
MOV #COBA,B
|
||
JSR PC,XDOBSL
|
||
MOV #USETZ,B
|
||
JSR PC,XDALUF
|
||
JSR PC,XWIR
|
||
JSR PC,XDCLK
|
||
MOV 4(SP),T ;GET BACK ORIG CONTENTS OF A
|
||
TST (T)+
|
||
BNE XDMMB
|
||
TST (T)
|
||
BEQ XDMMC ;DEPOSITING ZERO
|
||
XDMMB: MOV #UASHM,B ;LOAD ASH IN ALU FCTN
|
||
EDALUF
|
||
MOV 4(SP),T ;GET BACK ORIG CONTENTS OF A
|
||
MOV 2(T),C ;DEPOSIT 2 WD BLOCK POINTED
|
||
BEQ XDMMA ;TO BY A IN M MEMORY LOCN 0
|
||
JSR PC,XDM0A
|
||
XDMMA: MOV @4(SP),C
|
||
JSR PC,XDM0A
|
||
XDMMC: JSR PC,XNPCLK ;MAKE SURE DATA NOT IN PASS AROUND PATH
|
||
MOV #USETM,B
|
||
EDALUF
|
||
; EWIR
|
||
; MOV #XDM0BB,A
|
||
; EROBUS
|
||
; MOV 4(SP),C ;GET BACK ORIG CONTENTS OF A
|
||
; CMP (C),XDM0BB
|
||
; BNE XDM0ER
|
||
; CMP 2(C),XDM0BB+2
|
||
; BNE XDM0ER
|
||
POP C ;BUILD DEST
|
||
POP B ;FINAL DEST
|
||
MOV #XDMTM1,A ;RESTORE A
|
||
CMP B,C
|
||
BEQ XDM0EX ;HAVE STORED IT WHERE DESIRED
|
||
PUSH B
|
||
BIT #2000,B
|
||
BNE XDMSD ;GEE, REALLY WANT THIS IN PSEUDO DEST
|
||
JSR PC,XDDEST ;DEPOSIT IN FINAL DEST
|
||
; MOV #USETM,B
|
||
; JSR PC,XDALUF
|
||
JSR PC,XWIR
|
||
JSR PC,XDCLK
|
||
JSR PC,XNPCLK ;GENERATE AN EXTRA JUST TO MAKE SURE
|
||
POP B ;IT REALLY GETS WRITTEN IF TO PDL BUFFER
|
||
XDM0EX:;BIT #CDAMEM,B
|
||
; BEQ XDM0X1
|
||
; PUSH B
|
||
; EDASRC ;CHECK DEPOSIT INTO A MEM
|
||
; MOV #USETA,B
|
||
; EDALUF
|
||
; EWIR
|
||
; MOV #XDM0BB,A
|
||
; EROBUS
|
||
; MOV 2(SP),C
|
||
; CMP (C),XDM0BB
|
||
; BNE XDM0E1
|
||
; CMP 2(C),XDM0BB+2
|
||
; BNE XDM0E1
|
||
;XDM0X2: POP B
|
||
XDM0X1: POP A
|
||
RTS PC
|
||
|
||
;XDM0ER: POP B
|
||
XDM0E1: POP B
|
||
POP A
|
||
RTS PC
|
||
; JMP EMTERX ;LOSES ON DIRECT CALL
|
||
|
||
XDMSD: CMP B,#CSDQ ;DEPOSIT IN PSEUDO DEST
|
||
BNE XDM0E1
|
||
BIS #3,(A) ;LOAD Q INTO Q CONTROL
|
||
EWIR
|
||
EDCLK
|
||
POP B
|
||
BR XDM0X1
|
||
|
||
XDM0BB: 0
|
||
0
|
||
|
||
XDMTM1: 0
|
||
0
|
||
0
|
||
|
||
|
||
XDM0A: MOV #16.,T ;LOOP COUNT
|
||
MOV #4,TT ;CARRY IN BIT OF ALU
|
||
XDM0B: BIC TT,(A)
|
||
TST C
|
||
BGE XDM0C
|
||
BIS TT,(A) ;SET CARRY IN
|
||
XDM0C: JSR PC,XWIR ;GO DIRECTLY TO SAVE TIME!
|
||
JSR PC,XDCLK
|
||
ROL C
|
||
DEC T
|
||
BNE XDM0B
|
||
RTS PC
|
||
|
||
XEXAMD: PUSH A ;EXAMINE DATA PATH MEMORIES
|
||
PUSH B
|
||
MOV #XEXM1,A
|
||
EICLR
|
||
EDDEST
|
||
MOV #COBA,B
|
||
EDOBSL
|
||
MOV (SP),B
|
||
BIT B,#CDAMEM
|
||
BNE XEXAM ;A MEM
|
||
EDMSRC
|
||
MOV #USETM,B
|
||
XEXAM1: EDALUF
|
||
EWIR
|
||
MOV 2(SP),A
|
||
EROBUS
|
||
POP B
|
||
POP A
|
||
RTS PC
|
||
|
||
XEXAM: EDASRC
|
||
MOV #USETA,B
|
||
BR XEXAM1
|
||
|
||
XEXM1: 0
|
||
0
|
||
0
|
||
|
||
|
||
XDJPC: ROR B ;DEPOSIT B INTO JUMP FIELD OF A
|
||
ROR B
|
||
ROR B
|
||
ROR B
|
||
PUSH B
|
||
ROR B
|
||
BIC #7777,B
|
||
BIC #170000,(A)
|
||
BIS B,(A)
|
||
POP B
|
||
BIC #377,2(A)
|
||
BISB B,2(A)
|
||
RTS PC
|
||
|
||
XDCMEM: PUSH A ;LOAD U INST POINTED TO BY A INTO CONTROL
|
||
PUSH B ;MEM LOCN IN B
|
||
MOV 2(SP),A
|
||
ADD #4,A
|
||
MOV #CDAMEM+1,B
|
||
JSR PC,XDMM0 ;DEPOSIT HI PART IN A-MEM LOCN 1
|
||
MOV 2(SP),A
|
||
CLR B
|
||
JSR PC,XDMM0 ;DEPOSIT LOW PART IN M-MEM LOCN 0
|
||
; MOV #XDCIPC,A
|
||
; JSR PC,XRPC ;SAVE PC BEFORE HACKING HAIRY PART
|
||
MOV #XDCIB,A
|
||
JSR PC,XICLR
|
||
BIS #CIJMP,4(A)
|
||
MOV (SP),B
|
||
JSR PC,XDJPC
|
||
BIS #CIJNB+CIJRB+CIJPB+CIJUC,(A)
|
||
BIS #40000,2(A) ;A SOURCE 1
|
||
JSR PC,XWIR
|
||
; MOV #XDCTPC,A
|
||
; JSR PC,XRPC
|
||
; DEC XDCTPC
|
||
; BIC #170000,XDCTPC
|
||
; CMP XDCTPC,XDCIPC
|
||
; BEQ XDCEC1
|
||
; INC XDCME1 ;THEY SHOULD HAVE BEEN EQUAL
|
||
XDCEC1: JSR PC,XCLK
|
||
; ERPC
|
||
; CMP XDCTPC,(SP)
|
||
; BEQ XDCEC2
|
||
; INC XDCME2
|
||
XDCEC2: JSR PC,XNPCLK
|
||
; ERPC
|
||
; DEC XDCTPC
|
||
; BIC #170000,XDCTPC
|
||
; CMP XDCTPC,XDCIPC
|
||
; BEQ XDCEC3
|
||
; INC XDCME3
|
||
XDCEC3: POP B
|
||
POP A
|
||
RTS PC
|
||
|
||
;XDCME1: 0
|
||
;XDCME2: 0
|
||
;XDCME3: 0
|
||
|
||
XDCIB: 0
|
||
0
|
||
0
|
||
|
||
;XDCIPC: 0 ;INITIAL PC (BEFORE HACKING)
|
||
;XDCTPC: 0 ;TEMP FOR READING IN PC
|
||
|
||
|
||
XICLR: PUSH A ;CLEAR THREE INST BLOCK POINTED
|
||
CLR (A)+ ;TO BY A
|
||
CLR (A)+
|
||
CLR (A)
|
||
POP A
|
||
RTS PC
|
||
|
||
XEXAMC: PUSH A ;EXAMINE CONTROL MEM AT LOCN IN B
|
||
PUSH B
|
||
MOV #XEXC1,A
|
||
EICLR
|
||
BIS #CIJNB+CIJUC,(A)
|
||
EDJPC
|
||
BIS #CIJMP,4(A)
|
||
EWIR
|
||
EDCLK
|
||
ENCLK
|
||
POP B
|
||
POP A
|
||
ERIR
|
||
RTS PC
|
||
|
||
XEXC1: 0
|
||
0
|
||
0
|
||
|
||
XRESET: MOV #4,164006 ;DO CONS RESET
|
||
MOV #0,164006
|
||
JMP MODSET ;SET SPEED AND ENABLE HALT ON ERROR
|
||
|
||
; MOV #101000,164006 ;NORMAL SPEED, ENABLE HALT ON ERROR
|
||
; CLR MODREG
|
||
; RTS PC
|
||
|
||
XDCLK: MOV #110,164006 ;TICK CLOCK IN DEBUG MODE
|
||
MOV #112,164006 ;NOT CHANGING OPCS
|
||
RTS PC
|
||
|
||
XWIR: JSR PC,XWDIB ;WRITE INTO IR (FIRST INTO DIB)
|
||
BR XNPCLK ;THEN NO-OP CLOCK
|
||
|
||
XDCCLK: TST NOOPF ;EDCLK UNLESS NOOPF SET
|
||
BEQ XDCLK ;IN WHICH CASE ENPCLK
|
||
CLR NOOPF
|
||
XNPCLK: MOV #130,164006 ;TICK CLOCK WITH BOTH DEBUG AND NO OP ON
|
||
MOV #132,164006 ;NOT AFFECTING OPCS
|
||
MOV #112,164006 ;CLEAR NO OP
|
||
RTS PC
|
||
|
||
XCLK: MOV #0,164006 ;TICK CLOCK ONCE IN REGULAR RUN
|
||
MOV #2,164006 ;MODE
|
||
RTS PC
|
||
|
||
XCCLK: TST NOOPF ;CLOCK UNLESS NOOPF SET
|
||
BEQ XCLK ;NO NOOP
|
||
CLR NOOPF
|
||
XNCLK: MOV #120,164006 ;CYCLE CLOCK ONCE IN REGULAR
|
||
MOV #122,164006 ;MODE WITH NO-OP BIT SET, NOT AFFECTING OPCS
|
||
MOV #12,164006 ;CLEAR NO OP
|
||
RTS PC
|
||
|
||
|
||
XOCTPD: JSR PC,EMTSAV ;PRINT 11 OCTAL DIGITS OF BLOCK POINTED TO BY A
|
||
PUSH A
|
||
MOV 2(A),A ;GET HIGH WORD
|
||
CLC
|
||
ROR A
|
||
ASR A
|
||
ASR A
|
||
ASR A
|
||
MOV #5,C
|
||
JSR PC,OCTPN ;PRINT HIGH FIVE DIGITS (14 BITS WORTH)
|
||
MOV (SP),C
|
||
MOV (C),A
|
||
ROL A ;GET HIGH BIT OF LOW WORD IN CARRY
|
||
MOV 2(C),A
|
||
ROL A
|
||
MOV #1,C
|
||
JSR PC,OCTPN ;PRINT THE SPLIT DIGIT
|
||
POP C
|
||
MOV (C),A
|
||
MOV #5,C
|
||
BR OCTPN ;FINISH OFF WITH LAST 5 DIGITS.
|
||
|
||
XPI: MOV 4(A),C ;PRINT BLOCK POINTED TO BY A AS U INST.
|
||
BIT #100,C
|
||
BEQ XPI1 ;TEST POPJ BIT
|
||
ETEXT ;POPJ BIT ON
|
||
ASCPJ
|
||
XPI1: ROL C
|
||
SWAB C
|
||
BIC #177774,C
|
||
ASL C
|
||
JMP @XPIDT(C) ;DISPATCH ON OP CODE
|
||
|
||
XOCTP4: JSR PC,EMTSAV ;SAVE AC S
|
||
MOV #4,C ;PRINT 4 DIGITS OF A
|
||
OCTPN: MOV A,B ;PRINT # DIGITS IN C OF A
|
||
OCTPNB: MOV #6,T
|
||
CLR A ;DROP IN HERE SINCE FIRST "DIGIT" HAS ONE BIT
|
||
OCTPL: ROL B
|
||
ROL A
|
||
CMP C,T
|
||
BLT OCTPL1 ;DONT WANT THAT DIGIT
|
||
ADD #'0,A
|
||
PUSH B
|
||
PUSH C
|
||
PUSH T
|
||
JSR PC,ADDCHR
|
||
POP T
|
||
POP C
|
||
POP B
|
||
OCTPL1: DEC T
|
||
BEQ OCTPX
|
||
CLR A
|
||
ROL B
|
||
ROL A
|
||
ROL B
|
||
ROL A
|
||
BR OCTPL
|
||
|
||
OCTPX: RTS PC
|
||
|
||
.SBTTL ASCII CONSTANTS
|
||
|
||
ASC3SP: .ASCIZ / /
|
||
ASC2SP=ASC3SP+1
|
||
ASCSP=ASC3SP+2
|
||
ASCPJ: .ASCIZ / PJ /
|
||
ASCALU: .ASCIZ /ALU /
|
||
ASCDSP: .ASCIZ /DSP /
|
||
ASCJMP: .ASCIZ /JMP /
|
||
ASCBYT: .ASCIZ /BYT /
|
||
ASCA: .ASCIZ /A /
|
||
ASCM: .ASCIZ /M /
|
||
ASCD: .ASCIZ /D /
|
||
ASCDM: .ASCIZ /DM /
|
||
ASCDR: .ASCIZ /DR /
|
||
ASCDA: .ASCIZ /DA /
|
||
ASCMSK: .ASCIZ /MSK?? /
|
||
ASCAR1: .ASCIZ /ALUR1 /
|
||
ASCAL1: .ASCIZ /ALUL1 /
|
||
ASCMB: .ASCIZ /MULT /
|
||
ASCINM: .ASCIZ /INCM /
|
||
ASC1: .ASCIZ /1 /
|
||
ASC2: .ASCIZ /2 /
|
||
ASC3: .ASCIZ /3 /
|
||
ASC4: .ASCIZ /4 /
|
||
ASC5: .ASCIZ /5 /
|
||
ASCSUB: .ASCIZ /SUB /
|
||
ASC7: .ASCIZ /7 /
|
||
ASC10: .ASCIZ /10 /
|
||
ASCADD: .ASCIZ /ADD /
|
||
ASC12: .ASCIZ /12 /
|
||
ASC13: .ASCIZ /13 /
|
||
ASLSHM: .ASCIZ /LSHM /
|
||
ASC15: .ASCIZ /15 /
|
||
ASC16: .ASCIZ /16 /
|
||
ASCDCM: .ASCIZ /DECM /
|
||
ASETCM: .ASCIZ /SETCM /
|
||
AANDCB: .ASCIZ /ANDCB /
|
||
AANDCM: .ASCIZ /ANDCM /
|
||
ASETZ: .ASCIZ /SETZ /
|
||
AORCB: .ASCIZ /ORCB /
|
||
ASETCA: .ASCIZ /SETCA /
|
||
AXOR: .ASCIZ /XOR /
|
||
AANDCA: .ASCIZ /ANDCA /
|
||
AORCM: .ASCIZ /ORCM /
|
||
AEQV: .ASCIZ /EQV /
|
||
ASETA: .ASCIZ /SETA /
|
||
AAND: .ASCIZ /AND /
|
||
ASETO: .ASCIZ /SETO /
|
||
AORCA: .ASCIZ /ORCA /
|
||
AOR: .ASCIZ /OR /
|
||
ASETM: .ASCIZ /SETM /
|
||
ASCC0: .ASCIZ /C0 /
|
||
ASCC1: .ASCIZ /C1 /
|
||
ASCCL: .ASCIZ /CRYLAST /
|
||
ASCCQ: .ASCIZ /CRYQ /
|
||
ASCNUL: .ASCIZ //
|
||
ASCQL: .ASCIZ /QLEFT /
|
||
ASCQR: .ASCIZ /QRIGHT /
|
||
ASCLQ: .ASCIZ /LOADQ /
|
||
ASCDC: .ASCIZ /DISP-C /
|
||
ASCDO: .ASCIZ /DISP-O /
|
||
ASCNB: .ASCIZ /BYT-LEN /
|
||
ASCMR: .ASCIZ /M-ROT /
|
||
ASCR: .ASCIZ /R /
|
||
ASCP: .ASCIZ /P /
|
||
ASCN: .ASCIZ /N /
|
||
ASCI: .ASCIZ /I /
|
||
ASCTB: .ASCIZ /TEST-BIT /
|
||
ASCSR: .ASCIZ / R /
|
||
ASCLDB: .ASCIZ /LDB /
|
||
ASCDPB: .ASCIZ /DPB /
|
||
ASCSBB: .ASCIZ /SUBS /
|
||
ASCAUM: .ASCIZ /ALU- /
|
||
ASCAUH: .ASCIZ /ALU-31 /
|
||
|
||
ASCAEM: .ASCIZ /A=M /
|
||
ASCINT: .ASCIZ /INT /
|
||
ASCPF: .ASCIZ /PF /
|
||
ASCIPF: .ASCIZ /IPF /
|
||
ASCUNC: .ASCIZ /UNC /
|
||
ASCQQ: .ASCIZ /??
|
||
/
|
||
ASCSPC: .ASCIZ /PC-FROM-SP /
|
||
ASCPC1: .ASCIZ /PC+1 /
|
||
ASCJT: .ASCIZ /JC-TRUE /
|
||
ASCJF: .ASCIZ /JC-FALSE /
|
||
ASCSPP: .ASCIZ /SPC-PAR /
|
||
ASCDPP: .ASCIZ /DSP-PAR /
|
||
ASCHER: .ASCIZ /HI-ERR /
|
||
ASCCPP: .ASCIZ /C-MEM-PAR /
|
||
ASCMPP: .ASCIZ /M-MEM-PAR /
|
||
ASCAPP: .ASCIZ /A-MEM-PAR /
|
||
ASCPPP: .ASCIZ /PDL-BUF-PAR /
|
||
ASCMNP: .ASCIZ /MN-MEM-PAR /
|
||
ASCHOK: .ASCIZ /HI-NOT-OK /
|
||
ASCRUN: .ASCIZ /SRUN /
|
||
ASCWIM: .ASCIZ /W-C-MEM /
|
||
ASCIMD: .ASCIZ /IMOD /
|
||
ASCNOP: .ASCIZ /NOP /
|
||
ASCMMW: .ASCIZ /MN-MEM-WT /
|
||
ASCWPD: .ASCIZ /W-P-BUF /
|
||
ASCWSP: .ASCIZ /W-USTK /
|
||
ASCICM: .ASCIZ /@C/
|
||
ASCIAM: .ASCIZ /@A/
|
||
ASCIMM: .ASCIZ /@M/
|
||
ASCIPB: .ASCIZ /@P/
|
||
ASCIUS: .ASCIZ /@U/
|
||
ASC1MP: .ASCIZ /@1/
|
||
ASC2MP: .ASCIZ /@2/
|
||
ASCIDM: .ASCIZ /@D/
|
||
ASCREG: .ASCIZ /REGADR /
|
||
ASCCR: .ASCIZ /
|
||
/
|
||
ASCSLT: .ASCIZ ?/ ?
|
||
ASCQQJ: .ASCIZ /JC?? /
|
||
ASCQST=ASCQQJ+3
|
||
ASCTOP: .ASCIZ / OP /
|
||
ASCQC: .ASCIZ /QC /
|
||
ASCMF: .ASCIZ /MF /
|
||
ASCXXX: .ASCIZ /XXX /
|
||
ASCU: .ASCIZ /U /
|
||
ASCCRY: .ASCIZ /CRYC /
|
||
ASCJC: .ASCIZ /JC /
|
||
ASCJPC: .ASCIZ /J-ADR /
|
||
ASCMD: .ASCIZ /MD /
|
||
ASCHLT: .ASCIZ /HALT /
|
||
ASCMF2: .ASCIZ /MF2 /
|
||
ASCLLB: .ASCIZ /LD-LOW-PC-BIT /
|
||
ASCLLR: .ASCIZ /LOW-PC-BIT-SEL-HW /
|
||
ASCIR: .ASCIZ /.IR/
|
||
ASCSIR: .ASCIZ /IR/
|
||
ASCPC: .ASCIZ /PC/
|
||
ASCUSP: .ASCIZ /USP/
|
||
ASCFSP: .ASCIZ /+FSRC/
|
||
ASCFS=ASCFSP+1
|
||
ASCFDP: .ASCIZ /+FDST/
|
||
ASCFD=ASCFDP+1 ;HACK HACK
|
||
ASCQ: .ASCIZ /Q/
|
||
ASCPP: .ASCIZ /PP/
|
||
ASCPI: .ASCIZ /PI/
|
||
ASCCIB: .ASCIZ /CIB/
|
||
ASCCBP: .ASCIZ /CIB+/
|
||
ACVMAR: .ASCIZ /CVMAR/
|
||
ACMRD: .ASCIZ /CMRD/
|
||
ACPMAR: .ASCIZ /CPMAR/
|
||
ACMWD: .ASCIZ /CMWD/
|
||
ACVMAW: .ASCIZ /CVMAW/
|
||
ACPMAW: .ASCIZ /CPMAW/
|
||
|
||
CSTARS: .ASCIZ /******************************************************
|
||
PC= /
|
||
COBTX: .ASCIZ /
|
||
OBUS= /
|
||
CERRST: .ASCIZ /
|
||
STATUS: /
|
||
ASCLLM: .ASCIZ /LLMODE/
|
||
ASCFSV: .ASCIZ /FSV/
|
||
ASCPSV: .ASCIZ /PSV/
|
||
ASCSLH: .ASCIZ ?/?
|
||
ASCNPF: .ASCIZ /NOOPF/
|
||
ASCRDR: .ASCIZ /RAIDR/
|
||
ASCRDP: .ASCIZ /RAIDR+/
|
||
ASCDC1: .ASCIZ /DC/
|
||
ASCVMA: .ASCIZ /VMA/
|
||
ASCMWD: .ASCIZ /MWD/
|
||
ASCRST: .ASCIZ /RESET/
|
||
ASCPJ1: .ASCIZ /PJ/
|
||
ASCNPJ: .ASCIZ /NPJ/
|
||
ASCOL1: .ASCIZ /OBL1/
|
||
ASCOR1: .ASCIZ /OBR1/
|
||
ASCMOD: .ASCIZ /MODE/
|
||
ASCILG: .ASCIZ /ILONG /
|
||
ASCB42: .ASCIZ /BIT42 /
|
||
ASCPFG: .ASCIZ /PDP11-FLAG /
|
||
.EVEN
|
||
|
||
|
||
.SBTTL PRINT VARIOUS FIELDS
|
||
|
||
XPIDT: XPIALU
|
||
XPIDSP
|
||
XPIJMP
|
||
XPIBYT
|
||
|
||
XPIALU: ETEXT
|
||
ASCALU
|
||
EPASRC ;PRINT A SOURCE
|
||
EPMSRC ;PRINT M SOURCE
|
||
EPOBSL ;PRINT OUTPUT BUS SELECT
|
||
EPDEST ;PRINT DEST
|
||
EPALUF ;PRINT ALU FCTN
|
||
EPCRYC ;PRINT CARRY CODE
|
||
EPQC ;PRINT Q CONTROL
|
||
MOV #XPALMF,C ;MISC FCTN
|
||
BR XPMF1
|
||
|
||
XPALMF: ASCNUL ;MF S FOR ALU
|
||
ASCHLT
|
||
ASCMF2
|
||
ASCLLB
|
||
|
||
XPIDSP: ETEXT
|
||
ASCDSP
|
||
EPDDC ;PRINT DISPATCH CONSTANT
|
||
EPMSRC
|
||
EPDDO ;PRINT DISPATCH OFFSET
|
||
EPDNB ;DISPATCH # BITS
|
||
EPMROT ;M ROTATE
|
||
XPMF: MOV #XPMFT,C ;MISC FTCN
|
||
XPMF1: MOV #<<2*400>+12>,B
|
||
IPSFLD
|
||
BIT #1000,4(A) ;THE 4 EXTRA BITS (BUT DON'T PRINT PARITY BIT)
|
||
BEQ 1$
|
||
ETEXT
|
||
ASCILG
|
||
1$: BIT #2000,4(A)
|
||
BEQ 2$
|
||
ETEXT
|
||
ASCB42
|
||
2$: BIT #4000,4(A)
|
||
BEQ 3$
|
||
ETEXT
|
||
ASCPFG
|
||
3$: RTS PC
|
||
|
||
XPMFT: ASCNUL ;MISC FCTN TBL FOR JMP BYT DSP
|
||
ASCHLT
|
||
ASCMF2
|
||
ASCLLR
|
||
|
||
XPIJMP: ETEXT
|
||
ASCJMP
|
||
EPASRC
|
||
EPMSRC
|
||
EPJPC ;NEW PC
|
||
EPJRB ;R BIT
|
||
EPJPB ;P BIT
|
||
EPJNB ;N BIT
|
||
EPJINV ;INVERT
|
||
EPJCND ;CONDITION
|
||
BR XPMF ;ONLY THING LEFT IS MISC FCTN
|
||
|
||
XPIBYT: ETEXT
|
||
ASCBYT
|
||
EPASRC
|
||
EPMSRC
|
||
EPDEST
|
||
EPBMD ;BYTE MODE
|
||
EPBLEN ;BYTE LENGTH
|
||
EPMROT ;BYTE ROTATE
|
||
BR XPMF ;ONLY THING LEFT IS MISC FCTN
|
||
|
||
|
||
XPASRC: ETEXT ;PRINT A SOURCE
|
||
ASCA
|
||
XPASR1: MOV #<<8*400>+36>,B ;8 BIT FLD 36 OVER
|
||
; ENTER HERE FOR DISPATCH CONSTANT
|
||
XPMSR1: IPNFLD ;EXTRACT AND PRINT FIELD
|
||
RTS PC
|
||
|
||
XPMSRC: ETEXT ;PRINT M SOURCE
|
||
ASCM
|
||
MOV #<<6*400>+30>,B ;6 BIT FIELD 30 OVER
|
||
BR XPMSR1
|
||
|
||
XPDEST: ;PRINT DEST (OF BYTE AND ALU INSTS)
|
||
BIT #CAMEMB,2(A)
|
||
BNE XPDES1 ;A MEM DESTINATION
|
||
ETEXT ;M MEM AND/OR REGISTER DESTINATION
|
||
ASCDM
|
||
MOV #<<5*400>+16>,B ;PRINT M MEM DEST
|
||
IPNFLD
|
||
ETEXT
|
||
ASCDR ;PRINT REGISTER DEST
|
||
MOV #<<4*400>+23>,B
|
||
IPNFLD
|
||
RTS PC
|
||
|
||
XPDES1: ETEXT ;PRINT A MEM DESTINATION
|
||
ASCDA
|
||
MOV #<<8*400>+16>,B
|
||
IPNFLD
|
||
RTS PC
|
||
|
||
|
||
XPOBSL: MOV #<<2*400>+14>,B ;PRINT O BUS SELECTOR FIELD OF ALU INST
|
||
MOV #XOPBTX,C
|
||
IPSFLD
|
||
RTS PC
|
||
|
||
XOPBTX: ASCMSK
|
||
ASCALU
|
||
ASCAR1
|
||
ASCAL1
|
||
|
||
XPALUF: BIT #1000,(A) ;PRINT ALU FCTN
|
||
BEQ XPALU1
|
||
ETEXT
|
||
ASCMB ;"MULTIPLY" BIT ON
|
||
XPALU1: MOV #<<5*400>+4>,B
|
||
MOV #XPALTX,C
|
||
IPSFLD
|
||
RTS PC
|
||
|
||
XPALTX: ASCINM
|
||
ASC1
|
||
ASC2
|
||
ASC3
|
||
ASC4
|
||
ASC5
|
||
ASCSUB
|
||
ASC7
|
||
ASC10
|
||
ASCADD
|
||
ASC12
|
||
ASC13
|
||
ASLSHM
|
||
ASC15
|
||
ASC16
|
||
ASCDCM
|
||
ASETCM
|
||
AANDCB
|
||
AANDCM
|
||
ASETZ
|
||
AORCB
|
||
ASETCA
|
||
AXOR
|
||
AANDCA
|
||
AORCM
|
||
AEQV
|
||
ASETA
|
||
AAND
|
||
ASETO
|
||
AORCA
|
||
AOR
|
||
ASETM
|
||
|
||
|
||
XPCRYC: MOV #<<2*400>+2>,B ;PRINT CARRY CONTROL FIELD
|
||
MOV #XPCRYT,C
|
||
IPSFLD
|
||
RTS PC
|
||
|
||
XPCRYT: ASCC0
|
||
ASCC1
|
||
ASCCL
|
||
ASCCQ
|
||
|
||
XPQC: MOV #<<2*400>+0>,B ;PRINT Q CONTROL FIELD
|
||
MOV #XPQCT,C
|
||
IPSFLD
|
||
RTS PC
|
||
|
||
XPQCT: ASCNUL
|
||
ASCQL
|
||
ASCQR
|
||
ASCLQ
|
||
|
||
XPDDC: ETEXT ;PRINT DISPATCH CONSTANT
|
||
ASCDC ;DISPATCH CONSTANT SAME AS A SOURCE
|
||
JMP XPASR1
|
||
|
||
XPDDO: ETEXT ;PRINT DISPATCH OFFSET
|
||
ASCDO
|
||
MOV #<<12*400>+16>,B ;10. BIT FIELD 16 OVER
|
||
IPNFLD
|
||
RTS PC
|
||
|
||
XPDNB: ETEXT ;PRINT # BITS FIELD OF DISPATCH INST
|
||
ASCNB ;GET BYTE LENGTH
|
||
MOV #<<3*400>+5>,B
|
||
IPNFLD
|
||
RTS PC
|
||
|
||
XPMROT: ETEXT ;PRINT M ROTATE FIELD
|
||
ASCMR
|
||
XPMRT1: MOV #<<5*400>+0>,B ;ENTER HERE FOR JUMP COND ON BIT
|
||
IPNFLD
|
||
RTS PC
|
||
|
||
XPJPC: ETEXT ;PRINT JUMP NEW PC FIELD
|
||
ASCJPC
|
||
MOV #<<14*400>+14>,B
|
||
IPNFLD
|
||
RTS PC
|
||
|
||
|
||
XPJRB: MOV #<<1*400>+11>,B ;PRINT JUMP R BIT FIELD
|
||
MOV #XPJRBT,C
|
||
XPJPB1: IPSFLD
|
||
RTS PC
|
||
|
||
XPJRBT: ASCNUL
|
||
ASCR
|
||
|
||
XPJPB: MOV #<<1*400>+10>,B ;PRINT JUMP P BIT FIELD
|
||
MOV #XPJPBT,C
|
||
BR XPJPB1
|
||
|
||
XPJPBT: ASCNUL
|
||
ASCP
|
||
|
||
XPJNB: MOV #<<1*400>+7>,B ;PRINT JUMP N BIT FIELD
|
||
MOV #XPJNBT,C
|
||
BR XPJPB1
|
||
|
||
XPJNBT: ASCNUL
|
||
ASCN
|
||
|
||
XPJINV: MOV #<<1*400>+6>,B ;PRINT JUMP INVERT SENSE FIELD
|
||
MOV #XPJIBT,C
|
||
BR XPJPB1
|
||
|
||
XPJIBT: ASCNUL
|
||
ASCI
|
||
|
||
XPJCND: MOV #<<5*400>+0>,B ;PRINT JUMP CONDITION FIELD
|
||
BIT #40,(A)
|
||
BEQ XPJCN1 ;XFER ON TEST BIT
|
||
MOV #XPJCNT,C
|
||
IPSFLD
|
||
RTS PC
|
||
|
||
XPJCN1: ETEXT ;TEST BIT
|
||
ASCTB
|
||
JMP XPMRT1 ;SAME AS M ROTATE
|
||
|
||
XPJCNT: ASCNUL ;0 ;TABLE OF JUMP CONDITIONS
|
||
ASCAUM ;1
|
||
ASCAUH ;2
|
||
ASCAEM ;3
|
||
ASCINT ;4
|
||
ASCPF ;5
|
||
ASCIPF ;6
|
||
ASCUNC ;7
|
||
ASCQQJ ;10
|
||
ASCQQJ ;11
|
||
ASCQQJ ;12
|
||
ASCQQJ ;13
|
||
ASCQQJ ;14
|
||
ASCQQJ ;15
|
||
ASCQQJ ;16
|
||
ASCQQJ ;17
|
||
ASCQQJ ;20
|
||
ASCQQJ ;21
|
||
ASCQQJ ;22
|
||
ASCQQJ ;23
|
||
ASCQQJ ;24
|
||
ASCQQJ ;25
|
||
ASCQQJ ;26
|
||
ASCQQJ ;27
|
||
ASCQQJ ;30
|
||
ASCQQJ ;31
|
||
ASCQQJ ;32
|
||
ASCQQJ ;33
|
||
ASCQQJ ;34
|
||
ASCQQJ ;35
|
||
ASCQQJ ;36
|
||
ASCQQJ ;37
|
||
|
||
XPBMD: MOV #<<2*400>+14>,B ;PRINT MODE FIELD OF BYTE INST
|
||
MOV #XPBMTX,C
|
||
IPSFLD
|
||
RTS PC
|
||
|
||
XPBMTX: ASCNUL
|
||
ASCLDB
|
||
ASCSBB
|
||
ASCDPB
|
||
|
||
XPBLEN: ETEXT ;PRINT BYTE LENGTH FIELD OF BYTE INST
|
||
ASCNB
|
||
MOV #<<5*400>+5>,B
|
||
IPNFLD
|
||
RTS PC
|
||
|
||
XXFLD: PUSH B
|
||
MOV 4(A),C ;EXTRACT FIELD FROM U INST
|
||
MOV 2(A),T ;B HAS FIELD DESC
|
||
MOV (A),TT
|
||
MOVB B,U
|
||
BEQ XXFLD1
|
||
XXFLD2: ROR C
|
||
ROR T
|
||
ROR TT
|
||
DEC U
|
||
BNE XXFLD2
|
||
XXFLD1: MOVB 1(SP),U ;FIELD LENGTH
|
||
CMP U,#16.
|
||
BLE XXFLD3
|
||
MOV #16.,U ;GIVE LOW 16. BITS OF FIELD > 16. BITS
|
||
XXFLD3: ASL U
|
||
MOV TT,A
|
||
BIC XXMSK(U),A
|
||
POP B
|
||
RTS PC
|
||
|
||
XXMSK: 177777
|
||
177776
|
||
177774
|
||
177770
|
||
177760
|
||
177740
|
||
177700
|
||
177600
|
||
177400
|
||
177000
|
||
176000
|
||
174000
|
||
170000
|
||
160000
|
||
140000
|
||
100000
|
||
0
|
||
|
||
|
||
|
||
XWPC: MOV (A),B ;WRITE LOCN POINTED TO BY A INTO CONS PC
|
||
PUSH B
|
||
MOV #XWPCI,A
|
||
EICLR
|
||
BIS #CIJMP,4(A)
|
||
EDJPC
|
||
BIS #CIJUC,(A)
|
||
EWIR
|
||
EDCLK
|
||
MOV #XWPCT,A
|
||
ERPC
|
||
CMP XWPCT,(SP)+
|
||
BEQ XWPCR
|
||
INC XWPCL
|
||
JMP EMTERX
|
||
|
||
XWPCR: RTS PC
|
||
|
||
XWPCI: 0
|
||
0
|
||
0
|
||
XWPCT: 0
|
||
XWPCL: 0
|
||
|
||
|
||
XPERRS: PUSH A ;PRINT ERRORS
|
||
BIT #CESPCP,(A)
|
||
BEQ XPER1
|
||
ETEXT
|
||
ASCSPP
|
||
XPER1: BIT #CEDSPP,(A)
|
||
BEQ XPER2
|
||
ETEXT
|
||
ASCDPP
|
||
XPER2: BIT #CEHIER,(A)
|
||
BEQ XPER3
|
||
ETEXT
|
||
ASCHER
|
||
XPER3: BIT #CECP,(A)
|
||
BEQ XPER4
|
||
ETEXT
|
||
ASCCPP
|
||
XPER4: BIT #CEMMP,(A)
|
||
BEQ XPER5
|
||
ETEXT
|
||
ASCMPP
|
||
XPER5: BIT #CEAMP,(A)
|
||
BEQ XPER6
|
||
ETEXT
|
||
ASCAPP
|
||
XPER6: BIT #CEPDL,(A)
|
||
BEQ XPER7
|
||
ETEXT
|
||
ASCPPP
|
||
XPER7: BIT #CEMNMP,(A)
|
||
BEQ XPER8
|
||
ETEXT
|
||
ASCMNP
|
||
XPER8: BIT #CEHNOK,(A)
|
||
BEQ XPER9
|
||
ETEXT
|
||
ASCHOK
|
||
XPER9: BIT #CESRUN,(A)+
|
||
BEQ XPER10
|
||
ETEXT
|
||
ASCRUN
|
||
XPER10: BIT #CEWIM,(A) ;2ND WORD BITS
|
||
BEQ XPER11
|
||
ETEXT
|
||
ASCWIM
|
||
XPER11: BIT #CEIMOD,(A)
|
||
BEQ XPER12
|
||
ETEXT
|
||
ASCIMD
|
||
XPER12: BIT #CEINOP,(A)
|
||
BEQ XPER13
|
||
ETEXT
|
||
ASCNOP
|
||
XPER13: BIT #CENMMW,(A)
|
||
BNE XPER14
|
||
ETEXT
|
||
ASCMMW
|
||
XPER14: BIT #CEWPDL,(A)
|
||
BEQ XPER15
|
||
ETEXT
|
||
ASCWPD
|
||
XPER15: BIT #CEWSPC,(A)
|
||
BEQ XPER16
|
||
ETEXT
|
||
ASCWSP
|
||
XPER16: BIT #CEPF,(A)
|
||
BEQ XPER17
|
||
ETEXT
|
||
ASCPF
|
||
XPER17: MOV #<<1*400>+2>,B ;JUMP CONDITION BIT
|
||
MOV #XPERJT,C
|
||
IPSFLD
|
||
MOV #<<2*400>+0>,B ;PC SOURCE FIELD
|
||
MOV #XPERPT,C
|
||
IPSFLD
|
||
POP A
|
||
RTS PC
|
||
|
||
XPERJT: ASCJF
|
||
ASCJT
|
||
|
||
XPERPT: ASCPC1
|
||
ASCDSP
|
||
ASCSPC
|
||
ASCJMP
|
||
|
||
.SBTTL READ & WRITE VARIOUS PARTS OF CONS
|
||
|
||
XSTOP: TST CTRUN
|
||
BEQ XSTOP1
|
||
TST 164002
|
||
BMI XSTOP1
|
||
CLR CTRUN ;LOSE, ERROR; NOT ONLY STOP, BUT STOP TRYING
|
||
; CLR LMHTTY ;ALSO FLUSH TTY
|
||
XSTOP1: MOV #0,164006 ;STOP CONS
|
||
CLR CRUN
|
||
RTS PC
|
||
|
||
XDPB: PUSH B ;DPB B IN BLOCK (A) AT POS IN C
|
||
PUSH C
|
||
MOVB 1(SP),U ;# BITS IN FIELD
|
||
ASL U
|
||
MOV XXMSK(U),C ;MASK FOR FIELD
|
||
BIC C,B ;CLEAR ANY EXTRA BITS IN B
|
||
COM C
|
||
MOVB (SP),U ;# PLACES TO SHIFT
|
||
JSR PC,XDPBS ;SHIFT IFY
|
||
BIC C,(A)
|
||
BIC T,2(A)
|
||
BIC TT,4(A)
|
||
MOV B,C
|
||
MOVB (SP),U
|
||
JSR PC,XDPBS
|
||
BIS C,(A)
|
||
BIS T,2(A)
|
||
BIS TT,4(A)
|
||
POP C
|
||
POP B
|
||
XDPBX: RTS PC
|
||
|
||
XDPBS: CLR T
|
||
CLR TT
|
||
XDPBS1: TST U ;THREE PRECISION SHIFT OF C T TT AMT IN U
|
||
BEQ XDPBX
|
||
ASL C
|
||
ROL T
|
||
ROL TT
|
||
DEC U
|
||
BR XDPBS1
|
||
|
||
XDMDST: MOV #<<5*400>+16>,C ;DEPOSIT IN M MEM PART OF DESTINATION
|
||
XDRDS1: BIC #CAMEMB,2(A) ;TURN OFF A DEST BIT
|
||
XDDSP1: EDPB
|
||
RTS PC
|
||
|
||
XDRDST: MOV #<<4*400>+16+5>,C ;DEPOSIT IN REG PART OF DESTINATION
|
||
BR XDRDS1
|
||
|
||
XDDSPO: MOV #<<10.*400>+16>,C ;DEPOSIT IN DISPATCH OFFSET FIELD
|
||
BR XDDSP1
|
||
|
||
|
||
XRPDLB: JSR PC,SVPDLI ;READ PDL BUFFER ADR IN B
|
||
MOV #CMSCI,B ; STORE RESULT IN 2 WD BLOCK(A)
|
||
EEXAMD ;READ DATA
|
||
RSPDLI: PUSH A ;RESTORE PDL INDEX
|
||
MOV #SVPITM,A
|
||
BR RSPI1
|
||
|
||
XWPDLB: JSR PC,SVPDLI ;WRITE PDL BUFFER ADR IN B FROM
|
||
MOV #<CFDCI_5>,B ; DATA IN BLOCK(A)
|
||
EDMM0
|
||
BR RSPDLI
|
||
|
||
SVPDLI: PUSH A
|
||
MOV B,SVPDTM ;SAVE DESIRED NEW CONTENTS OR
|
||
MOV #SVPITM,A ;PDL INDEX
|
||
MOV #CMSPPI,B
|
||
EEXAMD ;SAVE PDL INDEX
|
||
BIC #176000,(A)+ ;LEAVE JUST PI
|
||
CLR (A)
|
||
MOV #SVPDTM,A
|
||
RSPI1: MOV #<CFDPI_5>,B
|
||
EDMM0 ;WRITE IN NEW CONTENTS
|
||
MOV SVPDTM,B
|
||
POP A
|
||
RTS PC
|
||
|
||
SVPDTM: 0 ;TEMP BLOCK HOLDING NEW DATA
|
||
0
|
||
SVPITM: 0 ;TEMP BLOCK HOLDING OLD PI
|
||
0
|
||
|
||
XSURUP: MOV #XSUTP,A ;SAVE ENTIRE USTACK
|
||
MOV #CMSUS,B ;GET USTACK POINTER
|
||
EEXAMD
|
||
MOV #<<5*400>+27.>,B ;POINTER READS INTO THOSE BITS
|
||
EXFLD
|
||
RTS PC
|
||
|
||
XSUSTK: TST USSVDF
|
||
BNE XSUSTY ;ALREADY SAVED
|
||
JSR PC,XSURUP ;READ U STACK PNTR
|
||
MOV A,USTPNR
|
||
MOV #32.,XSUSTC ;SAVE 32 REG
|
||
ASL A ;CONVERT TO WDS
|
||
ADD #USSVD,A ;GET ADR IN USTK IMAGE
|
||
XSUSTL: MOV A,XSUSTP
|
||
MOV #XSUTP,A
|
||
MOV #CMSUSP,B ;USTACK DATA, POP
|
||
EEXAMD
|
||
EDCLK ;CLOCK WITH THAT IN IR TO POP
|
||
MOV XSUSTP,A
|
||
MOV XSUTP,(A) ;SALT DATA AWAY
|
||
TST -(A) ;HARDWARE DECREMENTS ON POP
|
||
DEC XSUSTC
|
||
BEQ XSUSTX ;THRU
|
||
CMP A,#USSVD
|
||
BHIS XSUSTL
|
||
MOV #USSVDE-2,A ;WRAP AROUND TO TOP
|
||
BR XSUSTL
|
||
XSUSTX: DEC USSVDF ;INDICATE SAVED
|
||
XSUSTY: RTS PC
|
||
|
||
XSUSTP: 0 ;POINTER TO PLACE IN PDL BUFFER
|
||
XSUSTC: 0 ;COUNT OF LOCNS
|
||
XSUTP: 0 ;TEMP BLOCK
|
||
0
|
||
|
||
XUUSTK: TST USSVDF
|
||
BEQ XUUSTX
|
||
XUUST1: JSR PC,XSURUP ;READ USTACK PDL
|
||
CMP A,USTPNR
|
||
BEQ XUUST2 ;GOT THAT RESTORED ..
|
||
MOV #XSUTP,A
|
||
MOV #CMSUSP,B
|
||
EEXAMD ;BUMP IT BY ONE
|
||
EDCLK ;CLOCK IT WITH THAT IN IR
|
||
BR XUUST1 ;TRY AGAIN!
|
||
XUUST2: MOV #32.,XSUSTC
|
||
INC A ;HARDWARE WILL INC BEFORE PUSH
|
||
BIC #177740,A ;SET UP A TO POINT TO USSVD
|
||
ASL A ; LOCN THAT WILL GET WRITTEN
|
||
XUUST4: ADD #USSVD,A
|
||
XUUST3: MOV (A)+,XSUTP ;HARDWARE INCRS ON PUSH
|
||
MOV A,XSUSTP
|
||
MOV #XSUTP,A
|
||
CLR 2(A) ;MAYBE RUN A LITTLE FASTER (HA)
|
||
MOV #<CFDUSP_5>,B ;RESTORE THAT ONE
|
||
EDMM0
|
||
DEC XSUSTC
|
||
BEQ XUUSTX ;THRU
|
||
MOV XSUSTP,A
|
||
CMP A,#USSVDE
|
||
BLO XUUST3
|
||
CLR A
|
||
BR XUUST4
|
||
XUUSTX: CLR USSVDF ;NOW RESTORED
|
||
RTS PC
|
||
|
||
XRDSP: PUSH A ;READ DISPATCH MEMORY
|
||
PUSH B ;FIRST SAVE DISPATCH CONSTANT REGISTER
|
||
JSR PC,XDSPSU ;"SET UP" DISPATCH INST
|
||
EWIR ;PUT THAT CONCONCTION IN IR ..
|
||
MOV #XRDT,A ;READ IN PC SELECT BITS AND FIGURE OUT P AND R
|
||
ERERWS ;READ IN ERROR WDS
|
||
MOV XRDT+2,C
|
||
BIC #177774,C ;GET PC SELECT BITS
|
||
ASL C
|
||
MOV XRDSTB(C),XRDSPW ;TRANSLATE TO WHAT THOSE TWO BITS REALLY MEAN
|
||
MOV #XRDSB,A ;GET POINTER TO UINST AGAIN
|
||
BIS #CMF1,(A) ;TURN ON MISC FCTN 1 (FORCE STRAIGHT DISPATCH)
|
||
EWIR
|
||
EDCLK ;EXECUTE INST
|
||
MOV #XRDT,A
|
||
ERPC ;READ IN PC
|
||
MOV XRDT,C ;GOBBLE PC BITS
|
||
BIS XRDSPW,C ;IOR IN P AND R BITS
|
||
BIT #1_13.,164010 ;TEST NO-OP CONDITION
|
||
BEQ XRDS1
|
||
BIS #CDMN,C ;N BIT MUST HAVE BEEN ON
|
||
XRDS1: POP B
|
||
POP A
|
||
MOV C,(A)
|
||
RTS PC
|
||
|
||
XRDSTB: CDMR+CDMP ; (PC+1) IT WAS GOING TO FALL THRU, SO BOTH P AND R SET
|
||
0 ; (DSP)
|
||
CDMR ; (SPC) IT WAS GOING TO POPJ
|
||
0 ; (JMP) ??
|
||
|
||
XRDSPW: 0 ;TEMP FOR BUILDING UP WD
|
||
XRDT: 0 ;TEMP BLOCK
|
||
0
|
||
XRDSB: 0 ;TEMP BLOCK FOR DISPATCH U INST
|
||
0
|
||
0
|
||
|
||
XDSPSU: MOV #XRDT,A ;READ DISP CONST
|
||
ERDSPC ; CAUTION!! TAKES DISP OFFSET ARG IN 2(SP)
|
||
XDSPS1: ESUSTK ;SAVE USTACK SINCE HACKING WITH
|
||
;DISP MEMORY CAN CLOBBER IT
|
||
; (REMOVE THIS WHEN HARDWARE MOD
|
||
; MADE)
|
||
MOV #XRDSB,A ;DUMMY UP DISP INST
|
||
EICLR
|
||
BIS #CIDSP,4(A)
|
||
MOV 2(SP),B ;GET DESIRED DISPATCH OFFSET
|
||
EDDEST ;STORE IN DISPATCH OFFSET (SAME FLD AS DEST)
|
||
MOV XRDT,B
|
||
EDASRC ;PUT IN DISPATCH CONSTANT AS IT IS
|
||
RTS PC
|
||
|
||
XWDSP: PUSH A ;WRITE DISPATCH MEM
|
||
PUSH B
|
||
MOV (A),C
|
||
BIC #100000,C ;THAT BIT TO BE PARITY
|
||
JSR PC,PARCMP ;RETURN 0 OR -1 IN T
|
||
BIC #77777,T ;LEAVE PARITY IN DESIRED PLACE
|
||
BIS C,T ;OR IN REST OF BITS
|
||
MOV T,XRDT ;SAVE THAT
|
||
CLR XRDT+2
|
||
MOV #XRDT,A
|
||
CLR B
|
||
EDMM0 ;PUT DATA TO WRITE IN MM LOCN 0
|
||
JSR PC,XDSPSU ;SET UP DISP INSTRUCTION
|
||
BIS #CMF2,(A) ;MF2 IS WRITE DISPATCH MEM
|
||
EWIR ;PUT IN IR
|
||
EDCLK ;EXECUTE
|
||
ENPCLK ;LET IT ACTUALLY GET WRITTEN
|
||
POP B
|
||
POP A
|
||
RTS PC
|
||
|
||
PARCMP: MOV #-1,T ;COMPUTE PARITY OF C
|
||
TST C
|
||
BEQ PARCMX ;SPECIAL CASE CHECK FOR 0 TO RUN FAST
|
||
MOV #16.,TT ;RETURN T -1 OR 0 SUCH AS TO MAKE ODD PARITY
|
||
PARCM1: ROL C
|
||
BCC PARCM2
|
||
COM T
|
||
PARCM2: DEC TT
|
||
BNE PARCM1
|
||
ROL C ;RESTORE TO FORMER GLORY
|
||
PARCMX: RTS PC
|
||
|
||
XRDSPC: PUSH A ;READ DISP CONSTANT
|
||
MOV #XRDCTB,A
|
||
MOV #CMSDC,B
|
||
EEXAMD
|
||
MOV (A),@(SP)
|
||
POP A
|
||
RTS PC
|
||
|
||
XRDCTB: 0
|
||
0
|
||
|
||
XWDSPC: PUSH A ;WRITE DISP CONSTANT
|
||
MOV (A),XRDT ;DESIRED CONTENTS OF DISP CONST REGISTER.
|
||
CLR -(SP) ;PUT 0 IN DISP OFFSET (FOR RANDOMNESS,
|
||
JSR PC,XDSPS1 ; SHOULDNT MATTER)
|
||
BIS #CMF1,(A) ;SET FORCE XFER BIT TO STOP ANY CLOBBERAGE OF
|
||
EWIR ;U STACK OR U STACK POINTER
|
||
EDCLK
|
||
TST (SP)+
|
||
POP A
|
||
RTS PC
|
||
|
||
XDPBLK: PUSH A ;DEPOSITIFY 4 WD BLOCK POINTED TO BY A
|
||
MOV (A),A
|
||
BLT XDPBL2 ;MINUS -> COMBINATION BLOCK
|
||
BEQ XDPBL1 ;ADDRESS OF 0 IS NULL BLOCK
|
||
XCVMR2: MOV (SP),C
|
||
MOV #CNUM,T
|
||
TST (C)+ ;SPACE PAST REG ADR
|
||
MOV (C)+,(T)+
|
||
MOV (C)+,(T)+
|
||
MOV (C),(T)
|
||
MOV #-1,CNUMF ;INDICATE NUMBER TYPED
|
||
MOV #QDEPV,B
|
||
JSR PC,REGDC
|
||
XDPBL1: POP A
|
||
RTS PC
|
||
|
||
XDPBL2: NEG A
|
||
ASL A
|
||
CMP A,#XCBLTL
|
||
BHIS XDPBL1 ;IGNORE IF TOO HIGH
|
||
JMP @XCBLT-2(A)
|
||
|
||
XCBLT: XCVMR ;VIRTUAL MEMORY READ
|
||
XCPMR ;PHYSICAL MEMORY READ
|
||
XCBLTL==.-XCBLT+2
|
||
|
||
XCPMR: MOV #RACPMR,A ;CONSOLE PHYSICAL VMA, START READ
|
||
BR XCPMR1
|
||
|
||
XCVMR: MOV #RACVMR,A ;CONSOLE VIRTUAL VMA, START READ
|
||
XCPMR1: MOV #XCVMR1,-(SP)
|
||
MOV 2(SP),-(SP) ;PUSH POINTER TO BLOCK TO FAKE OUT LOSING ROUTINE
|
||
BR XCVMR2 ; THIS WILL ALSO BE IN A ON RETURN
|
||
|
||
XCVMR1: TST (A)+ ;POINTER TO BLOCK IN A ON RETURN
|
||
MOV CVMMRD,(A)+ ;CLOBBER BACK CONSOLE READ DATA REG
|
||
MOV CVMMRD+2,(A)+
|
||
MOV CVMMPF,(A) ;HIGH WORD PAGE FAULT STATUS
|
||
BR XDPBL1
|
||
|
||
XRDBLK: PUSH A ;EXAMINIFY 4 WD BLOCK POINTED TO BY A
|
||
MOV (A),A
|
||
BLT XDPBL2 ;COMBINATION OP, SAME AS ON WRITE
|
||
BEQ XDPBL1
|
||
MOV #QEXB,B ;CLEAR IT OUT TO MINIMIZE RANDOMNESS, ESPECIALLY IN
|
||
CLR (B)+ ;HIGH ORDER WORDS
|
||
CLR (B)+
|
||
CLR (B)
|
||
MOV #QEXAMV,B
|
||
CLR QEXPF ;DONT PRINT IT OUT
|
||
JSR PC,REGDC ;EXAMINE STUFF AND LEAVE RESULT IN QEXB
|
||
MOV (SP),A
|
||
TST (A)+
|
||
MOV #QEXB,B
|
||
MOV (B)+,(A)+ ;STORE DATA
|
||
MOV (B)+,(A)+
|
||
MOV (B),(A)
|
||
BR XDPBL1
|
||
|
||
XRL1MP: PUSH A ;READ LVL 1 MAP
|
||
MOV #XRL1T1,A
|
||
MOV #<<11.*400>+12.>,C ;SHIFT 12 TO MOVE INTO LVL1 PART OF VMA
|
||
EDPB
|
||
MOV #<CFDVMA_5>,B
|
||
EDMM0 ;PUT THAT IN VMA
|
||
MOV #XRL1T2,A ;NOW READ MAP DATA
|
||
MOV #CMSPMD,B
|
||
EEXAMD
|
||
MOV #<<5*400>+27.>,B ;GET LVL1 MAP PART
|
||
ELDB
|
||
MOV A,B
|
||
POP A
|
||
MOV B,(A) ;STORE AWAY DATA
|
||
RTS PC
|
||
|
||
XRL1T1: 0 ;TEMP TO CONSTRUCT VMA
|
||
0
|
||
|
||
XRL1T2: 0 ;TEMP TO READ BACK MAP DATA
|
||
0
|
||
|
||
XWL1MP: PUSH A ;WRITE LVL 1 MAP
|
||
PUSH B
|
||
MOV (A),B ;DATA TO WRITE
|
||
MOV #XWL1T1,A
|
||
MOV #<<5*400>+27.>,C ;PUT IN RIGHT PLACE
|
||
EDPB
|
||
MOV #<CFDMWD_5>,B
|
||
EDMM0 ;AND PUT THAT IN WRITE DATA REG
|
||
POP B
|
||
MOV #XRL1T2,A ;GENERATE RIGHT THING TO PUT IN VMA
|
||
MOV #<<11.*400>+12.>,C ;SHIFT 12 TO MOVE INTO LVL1 PART OF VMA
|
||
EDPB
|
||
MOV #<CFDVWM_5>,B ;VMA WRITE MAP
|
||
EDMM0 ;WILL WRITE FIRST LVL MAP
|
||
POP A
|
||
RTS PC
|
||
|
||
XWL1T1: 0 ;DATA TO WRITE (GOES TO MWD)
|
||
0
|
||
|
||
XWL1T2: 0 ;ADDRESS WD (GOES TO VMA WRITE MAP)
|
||
0
|
||
|
||
XRL2A: PUSH B ;SET UP ADDRESS FOR LVL 2 MAP
|
||
MOV #XRL2T1,A ;WRITE HIGH 5 BITS OF ADDRESS IN LVL1 MAP LOCN 0
|
||
ASL B
|
||
ASL B
|
||
ASL B
|
||
SWAB B
|
||
BIC #177740,B
|
||
MOV B,(A)
|
||
CLR B
|
||
EWL1MP
|
||
MOV #XRL2T2,A ;PUT LOW 5 BITS IN VMA WD
|
||
POP B
|
||
MOV #<<5*400>+7>,C
|
||
EDPB
|
||
RTS PC
|
||
|
||
XRL2MP: PUSH A ;READ LVL 2 MAP
|
||
JSR PC,XRL2A ;PUT RIGHT THING IN LVL 1 MAP AND GEN RIGHT THING
|
||
;FOR VMA
|
||
MOV #<CFDVMA_5>,B ;NOW PUT THAT IN VMA
|
||
EDMM0
|
||
MOV #XRL2T3,A ;READ VMA DATA
|
||
MOV #CMSPMD,B
|
||
EEXAMD
|
||
MOV #<<4*400>+16.+7>,B ;LDB HIGH DATA WD
|
||
ELDB
|
||
MOV (SP),B
|
||
MOV A,2(B) ;STORE HIGH DATA WD
|
||
MOV #XRL2T3,A
|
||
MOV #<<16.*400>+7>,B
|
||
ELDB ;LDB LOW DATA WD
|
||
MOV A,@(SP) ;STORE LOW DATA WD
|
||
XWL2M1: MOV #1,CL1M0F ;INDICATE LVL 1 MAP LOCN 0 HAS BEEN HACKED
|
||
POP A ; (NOT NECESSARILY TO 0)
|
||
RTS PC
|
||
|
||
XRL2T1: 0 ;LVL 1 MAP DATA
|
||
|
||
XRL2T2: 0 ;VMA ADR WD
|
||
0
|
||
|
||
XRL2T3: 0 ;MAP DATA READ BACK
|
||
0
|
||
|
||
XWL2MP: PUSH A ;WRITE 2ND LVL MAP
|
||
JSR PC,XRL2A ;GENERATE RIGHT THING TO PUT IN VMA
|
||
;MUST DO THIS FIRST SINCE IN WRITES IN 1ST LVL MAP
|
||
;AND CLOBBERS MWD. LEAVE STUFF TO PUT IN VMA IN
|
||
;XRL2T2
|
||
MOV (SP),A
|
||
MOV 2(A),B ;SET UP DATA FOR MWD (HIGH WD)
|
||
MOV #XWL2T1,A
|
||
MOV #<<4*400>+16.+7>,C
|
||
EDPB
|
||
MOV @(SP),B ;SET UP DATA FOR MWD (LOW WD)
|
||
MOV #<<16.*400>+7>,C
|
||
EDPB
|
||
MOV #<CFDMWD_5>,B
|
||
EDMM0 ;PUT THAT IN MWD
|
||
MOV #XRL2T2,A ;GET BACK POINTER TO STUFF TO PUT IN VMA
|
||
MOV #<CFDVWM_5>,B
|
||
EDMM0 ;PUT IT IN VMA WRITE MAP
|
||
BR XWL2M1 ;CLR OUT LVL 1 MAP LOCN 0 AGAIN
|
||
|
||
XWL2T1: 1 ;SET UP DATA FOR MWD (1 SELECTS 2ND LVL MAP)
|
||
0
|
||
|
||
XRMEMS: PUSH A
|
||
PUSH B
|
||
MOV #CSVMA,A ;SAVE MEM SUBROUTINE
|
||
MOV #CMSVMA,B
|
||
EEXAMD ;SAVE VMA
|
||
MOV #CSPMD,A
|
||
MOV #CMSPMD,B
|
||
EEXAMD ;SAVE PAGE FAULT STATUS
|
||
MOV #CSMWD,A
|
||
MOV #CMSMWD,B
|
||
EEXAMD ;SAVE MWD
|
||
MOV #CSMRD,A
|
||
MOV #CMSMMD,B
|
||
EEXAMD ;SAVE MAIN MEMORY READ DATA
|
||
CLR CSMRDF ;AND INDICATE IT HASNT CHANGED
|
||
MOV #CL1M0,A
|
||
CLR B
|
||
ERL1MP ;SAVE 1ST LEVEL MAP, LOCN 0
|
||
CLR CL1M0F ; VALID IN HARDWARE STATE
|
||
MOV #CL2M0,A
|
||
CLR B
|
||
ERL2MP
|
||
CLR CL2M0F ;CLR HACKED WITH 2ND LVL MAP, LOCN 0 FLAG
|
||
POP B ; (SINCE ITS SUCH A PAIN TO RELOAD)
|
||
POP A
|
||
RTS PC
|
||
|
||
XWMEMS: PUSH A ;RESTORE MEMORY SUBROUTINE
|
||
PUSH B ;NOTE: THIS ROUTINE CAN ALSO BE CALLED WITH THE
|
||
TST CSMRDF ; INTENTION OF "VALIDIFING" THE MEM SUBROUTINE
|
||
BEQ XWMEM1 ;XFER ON READ DATA MEMORY REG HASNT BEEN CHANGED
|
||
MOV #CSMGBR,A ;TRY TO RESTORE IT
|
||
EWPVMA ; BY WRITING IN A GARBAGE REGISTER AND
|
||
MOV #CSMRD,A ; READING IT BACK
|
||
MOV #<CFDMWD_5>,B
|
||
EDMM0 ;PUT DATA IN MWD
|
||
EMMWC ;DO MAIN MEM WRITE CYCLE
|
||
EMMRC ;DO MAIN MEM READ CYCLE, GETTING IT BACK!!
|
||
XWMEM1: TST CL2M0F
|
||
BEQ XWMEM2
|
||
MOV #CL2M0,A
|
||
CLR B
|
||
EWL2MP ;RESTORE LVL 2 MAP, LOCN 0
|
||
XWMEM2: TST CL1M0F
|
||
BEQ XWMEM3
|
||
MOV #CL1M0,A
|
||
CLR B
|
||
EWL1MP ;RESTORE LVL 1 MAP, LOCN 0
|
||
CLR CL1M0F ;SINCE IF VALIDIFING, ITS NO LONGER NECESSARILY 0
|
||
XWMEM3: MOV #CSMWD,A
|
||
MOV #<CFDMWD_5>,B
|
||
EDMM0 ;RESTORE MWD
|
||
MOV #CSVMA,A
|
||
MOV #<CFDVMA_5>,B
|
||
EDMM0 ;RESTORE VMA
|
||
BIT #1,CSPMD ;RESTORE PAGE FAULT STATUS
|
||
BEQ 1$
|
||
MOV #SETRPF,A
|
||
JSR PC,XWIR
|
||
JSR PC,XDCLK
|
||
JSR PC,XNPCLK
|
||
BR 2$
|
||
|
||
1$: BIT #2,CSPMD
|
||
BEQ 2$
|
||
MOV #SETWPF,A
|
||
JSR PC,XWIR
|
||
JSR PC,XDCLK
|
||
JSR PC,XNPCLK
|
||
2$: POP B
|
||
POP A
|
||
RTS PC
|
||
|
||
XVMEMS: PUSH A ;VALIDIFY MAPS FOR CONSOLE VIRTUAL
|
||
PUSH B ; READ OR WRITE CYCLE
|
||
TST CL2M0F
|
||
BEQ XVMEM2
|
||
MOV #CL2M0,A
|
||
CLR B
|
||
EWL2MP ;RESTORE LVL 2 MAP, LOCN 0
|
||
CLR CL2M0F ;REMEMBER THAT IT IS RESTORED
|
||
XVMEM2: TST CL1M0F
|
||
BEQ XVMEM3
|
||
MOV #CL1M0,A
|
||
CLR B
|
||
EWL1MP ;RESTORE LVL 1 MAP, LOCN 0
|
||
CLR CL1M0F ;REMEMBER THAT IT IS RESTORED
|
||
XVMEM3: POP B
|
||
POP A
|
||
RTS PC
|
||
|
||
XMMRC: MOV #XMMRI,A ;DO MAIN MEM READ CYCLE
|
||
BR XMMWC1
|
||
|
||
XMMWC: MOV #XMMWI,A ;DO MAIN MEM WRITE CYCLE
|
||
XMMWC1: EWIR
|
||
EDCLK
|
||
RTS PC
|
||
|
||
XMMWI: <COBA_12.>+<USETM_4> ;O-BUS FROM ALU, ALU-OP SETM
|
||
<CMSVMA_8>+<CFDVMW_3> ;M-SRC VMA, FDST VMA-START-WRITE
|
||
CIALU
|
||
|
||
XMMRI: <COBA_12.>+<USETM_4>
|
||
<CMSVMA_8>+<CFDVMR_3> ;M-SRC VMA, FDST VMA-START-READ
|
||
CIALU
|
||
|
||
XWPVMA: PUSH A ;WRITE "PHYSICAL" VMA
|
||
PUSH B
|
||
MOV (A)+,XWPVT1
|
||
MOV (A),XWPVT1+2
|
||
TST CL1M0F
|
||
BLT XWPVM1 ;0 ALREADY THERE
|
||
MOV #CZERO,A
|
||
CLR B
|
||
EWL1MP ;MAKE SURE LEVEL 1 MAP LOCN 0 POINTS TO LEVEL 2 LOCN 0
|
||
MOV #-1,CL1M0F
|
||
XWPVM1: MOV #XWPVT1,A
|
||
PUSH (A) ;SAVE LOW VMA BEFORE CLOBBERING IT
|
||
BIS #1,(A) ;SELECT 2ND LVL MAP
|
||
BIS #3000,2(A) ;SET VALID AND WRITE OK
|
||
MOV #<CFDMWD_5>,B
|
||
EDMM0 ;PUT THAT IN MWD
|
||
MOV #CZERO,A
|
||
MOV #<CFDVWM_5>,B
|
||
EDMM0 ;PUT ZERO ON VMA, WRITE MAP (WRITES LVL2 MAP LOCN 0)
|
||
MOV #1,CL2M0F ;FLAG HACKED WITH LVL 2 MAP LOCN 0
|
||
MOV #XWPVT1,A ;RESTORE A
|
||
POP (A) ;GET BACK LOW VMA
|
||
BIC #177600,(A) ;BITS WITHIN PAGE REALLY COME FROM VMA
|
||
CLR 2(A) ;REST DONT (SELECT LOCN 0, LVL 1 AND 2 MAPS)
|
||
MOV #<CFDVMA_5>,B
|
||
EDMM0 ;PUT THAT IN VMA
|
||
POP B
|
||
POP A
|
||
RTS PC
|
||
|
||
XWPVT1: 0
|
||
0
|
||
|
||
CZERO: 0
|
||
0
|
||
|
||
SETRPF: 010760 ;((VMA-START-READ) VMA)
|
||
.BYTE 50,62
|
||
0
|
||
|
||
SETWPF: 010760 ;((VMA-START-WRITE) VMA)
|
||
.BYTE 60,62
|
||
0
|
||
|
||
.SBTTL TRAP HANDLER
|
||
|
||
TRPBRK: CMP SP,#PDL+30 ;TRP BRK
|
||
BLO ISTKO
|
||
BIC #17,2(SP) ;CLEAR PROCESSOR FLAGS ON RETURN
|
||
JSR U,ACSAV ;PUSHES 5 FROBS (+1 FOR JSR)
|
||
MOV <5+1>*2(SP),U ;GET RETURN PC
|
||
MOV -(U),U
|
||
ASL U
|
||
CMP U,#TWHTRP
|
||
BHI BADTRP
|
||
JSR PC,@TRPTAB-TWLTRP(U)
|
||
TRPRET: JSR U,ACRES
|
||
RTI
|
||
|
||
TRPERX: BIS #1,<6+1+1>*2(SP) ;SET CARRY ON RETURN
|
||
RTS PC
|
||
|
||
JFATL: BPT
|
||
ISTKO: BPT
|
||
BADTRP: BPT
|
||
|
||
LTRP=TRP!0
|
||
TWLTRP=LTRP+LTRP
|
||
TRPTAB: JFATL ;TRP 0
|
||
JPNFLD ; 1
|
||
JPSFLD ; 2
|
||
|
||
HTRP=TRP!<<.-TRPTAB>/2>
|
||
TWHTRP==HTRP+HTRP
|
||
|
||
JPNFLD: CMP B,#<17.*400>
|
||
BGE JPNF1 ;FIELD > 16. BITS
|
||
JPNF2: EXFLD ;PRINT NUMERIC FIELD
|
||
MOV B,C
|
||
SWAB C
|
||
BIC #177400,C ;GET # OF BITS IN C
|
||
MOVB JPNTAB(C),C ;CONVERT TO # OF DIGITS
|
||
JSR PC,OCTPN
|
||
MOV #' ,A
|
||
JMP ADDCHR
|
||
|
||
JPNF1: PUSH A
|
||
PUSH B
|
||
ADD #170020,B ;.BYTE -20,20
|
||
JSR PC,JPNFLD ;PRINT OUT HIGH PART (S)
|
||
POP B
|
||
POP A
|
||
BIC #177400,B
|
||
BIS #<16.*400>,B ;PRINT 16 BITS AT ORIGINAL POSITION
|
||
BR JPNF2
|
||
|
||
JPNTAB: <1*400>+1
|
||
<1*400>+1
|
||
<2*400>+2
|
||
<3*400>+2
|
||
<3*400>+3
|
||
<4*400>+4
|
||
<5*400>+4
|
||
<5*400>+5
|
||
<6*400>+6
|
||
<6*400>+6
|
||
|
||
JPSFLD: PUSH C
|
||
EXFLD
|
||
ASL A
|
||
ADD (SP)+,A
|
||
MOV (A),A
|
||
JMP PTEXT
|
||
|
||
|
||
.SBTTL SAVE & RESTORE STATE OF MACHINE
|
||
|
||
ENTER: JSR PC,PSCONS ;ENTER, SAVING STATE AS APPRO TO CLLMOD
|
||
TST CLLMOD
|
||
BNE ENTERX
|
||
JSR PC,FSCONS ;HIGH LVL MODE, DO FULL
|
||
ENTERX: RTS PC
|
||
|
||
LEAVE: JSR PC,FRCONS ;LEAVE, RESTORING WHAT SAVED
|
||
JSR PC,PRCONS
|
||
RTS PC
|
||
|
||
PSCONS: TST CPSVAL ;DO PASSIVE STATE CHANGE..
|
||
BNE PSCONX ;STATE ALREADY SAVED
|
||
MOV #CCERR1,A ;"PASSIVE" STATE SAVE
|
||
ERERWS ;READ ERROR WDS
|
||
MOV #CPC,A ;SAVE STATE OF CONS PROCESSOR
|
||
ERPC ; (AS BEST AS CAN)
|
||
MOV #CIR,A
|
||
ERIR
|
||
MOV #COBUS,A
|
||
EROBUS
|
||
; BIT #CESRUN,CCERR1 ;THIS BIT STAYS ON IF MACHINE STOPS FOR ERROR SO..
|
||
; BNE PSCONX ;MACHINE STILL RUNNING, THIS FAIRLY RANDOM
|
||
INC CPSVAL ;INDICATE STATE SAVED
|
||
CLR NOOPF ;IS NEXT INST TO BE NO-OP ED?
|
||
BIT #CEINOP,CCERR2
|
||
BEQ PSCONX
|
||
INC NOOPF ;YEP, THAT INST A LOSER
|
||
PSCONX: RTS PC
|
||
|
||
|
||
FSCONS: TST CFSVAL ;DO FULL STATE SAVE
|
||
BNE FSCONX ;FULL STATE ALREADY SAVED
|
||
ESTOP ;STOP MACHINE, CLEAR CRUN, LEAVE CTRUN ALONE.
|
||
JSR PC,PSCONS ;DO PASSIVE SAVE
|
||
MOV #OLDPCS,A ;SAVE OLD PCS
|
||
1$: MOV @#164002,(A)
|
||
BIC #170000,(A)+
|
||
MOV #40,164006
|
||
MOV #0,164006
|
||
CMP A,#OLDPCS+20
|
||
BLO 1$
|
||
MOV #CMMEM0,A
|
||
CLR B
|
||
EEXAMD ;SAVE M MEM LOCN 0
|
||
MOV #CAMEM1,A
|
||
MOV #CDAMEM+1,B
|
||
EEXAMD ;SAVE A MEM LOCN 1
|
||
ERMEMS ;SAVE MEM SUBROUTINE (VMA+MWD)
|
||
INC CFSVAL ;INDICATE FULL SAVE VALID
|
||
FSCONX: RTS PC
|
||
|
||
PRCONS: CLR CPSVAL ;DO "RESTORE" AFTER PASSIVE SAVE
|
||
RTS PC
|
||
|
||
FRCONS: TST CFSVAL
|
||
BEQ FRCONX
|
||
EUUSTK ;RESTORE U STACK IF SAVED
|
||
EWMEMS ;RESTORE MEM SUBROUTINE (VMA+MWD)
|
||
MOV #CAMEM1,A ;DO RESTORE AFTER FULL SAVE
|
||
MOV #CDAMEM+1,B
|
||
EDMM0 ;RESTORE A MEM LOCN 1
|
||
MOV #CMMEM0,A
|
||
CLR B
|
||
EDMM0 ;RESTORE M MEM LOCN 0
|
||
MOV #OLDPCS,A ;RESTORE OPC HISTORY REGISTERS
|
||
1$: PUSH A
|
||
EWPC ;LOAD PC WITH WHAT IS TO GO IN OPCS
|
||
POP A
|
||
MOV #40,164006 ;THEN CLOCK OPCS
|
||
MOV #0,164006
|
||
TST (A)+
|
||
CMP A,#OLDPCS+20
|
||
BLO 1$
|
||
MOV CPC,CPCT ;COPY PC
|
||
DEC CPCT ;COMPENSATE FOR THE FACT IT WILL GET INCREMENTED
|
||
MOV #CPCT,A ;WHEN IR IS RELOADED
|
||
EWPC
|
||
MOV #CIR,A
|
||
EWIR ;PUT IR BACK (THIS INCRS THE PC)
|
||
CLR CFSVAL ;CLEAR FULL SAVE VALID
|
||
FRCONX: RTS PC
|
||
|
||
|
||
.SBTTL TEST LOOPS
|
||
|
||
TL2: MOV #TL2DTA,A ;DEST DEPOSIT IN DATA PATH MEM
|
||
CLR TL2DTA ; M LOCN 10 INITIALLY
|
||
MOV CSR,TL2DTA+2
|
||
MOV #10,B ;DEST M MEM LOCN 10
|
||
EDMM0
|
||
BCS TL2B
|
||
JMP TL2
|
||
|
||
TL2B: INC TL2DTC
|
||
JMP TL2
|
||
|
||
TL2DTA: 0
|
||
0
|
||
TL2DTC: 0
|
||
|
||
TL3: MOV #377,TL3T1 ;A MEM LOCN
|
||
TL3A: MOV TL3T1,TL3T2 ;ADDRESS TEST ON A MEM
|
||
MOV TL3T1,TL3T2+2
|
||
MOV #TL3T2,A
|
||
MOV TL3T1,B
|
||
BIS #CDAMEM,B
|
||
EDMM0
|
||
DEC TL3T1
|
||
BGE TL3A
|
||
TL3B: MOV #377,TL3T1
|
||
TL3C: MOV #TL3T2,A
|
||
MOV TL3T1,B
|
||
BIS #CDAMEM,B
|
||
EEXAMD
|
||
CMP TL3T1,TL3T2
|
||
BNE TL3L
|
||
CMP TL3T1,TL3T2+2
|
||
BNE TL3L
|
||
TL3D: DEC TL3T1
|
||
BGE TL3C
|
||
JMP TL3
|
||
|
||
TL3L: INC TL3LC
|
||
JMP TL3D
|
||
|
||
TL3T1: 0
|
||
TL3T2: 0
|
||
0
|
||
TL3LC: 0
|
||
|
||
TL4: CLR TL4T1 ;TEST ABILITY TO WRITE PC
|
||
TL4A: MOV #TL4T2,A
|
||
EICLR ;CLEAR 3 WD BLOCK
|
||
BIS #CIJMP,4(A)
|
||
MOV TL4T1,B
|
||
EDJPC
|
||
BIS #47,(A) ;SET TEST CONDITION AND UNCONDITONAL CONDITION
|
||
EWIR ;LOAD INTO IR
|
||
EDCLK ;EXECUTE IT
|
||
MOV #TL4T3,A
|
||
ERPC
|
||
CMP TL4T3,TL4T1
|
||
BNE TL4L
|
||
TL4L1: INC TL4T1
|
||
BIC #170000,TL4T1
|
||
BR TL4A
|
||
|
||
TL4L: INC TL4LC
|
||
BR TL4L1
|
||
|
||
TL4LC: 0
|
||
TL4T1: 0
|
||
TL4T2: 0
|
||
0
|
||
0
|
||
TL4T3: 0
|
||
|
||
TL5: CLR TL5T1 ;DATA TEST ON CONTROL MEM
|
||
TL5A: EUICLR
|
||
MOV CSR,(A)
|
||
MOV CSR,2(A)
|
||
MOV CSR,4(A)
|
||
BIC #177000,4(A) ;THATS HOW MANY THERE ARE
|
||
MOV TL5T1,B
|
||
EDCMEM
|
||
MOV #TL5T2,A
|
||
MOV TL5T1,B
|
||
EEXAMC
|
||
BIC #177000,TL5T2+4 ;DONT TRY TO CHECK PARITY FOR NOW
|
||
CMP UI,TL5T2
|
||
BNE TL5L
|
||
CMP UI+2,TL5T2+2
|
||
BNE TL5L
|
||
CMP UI+4,TL5T2+4
|
||
BNE TL5L
|
||
TL5L1: INC TL5T1
|
||
BIC #170000,TL5T1 ;MASK TO CNTRL MEM SIZE
|
||
JMP TL5A
|
||
|
||
TL5L: INC TL5LC
|
||
JMP TL5L1
|
||
|
||
TL5LC: 0
|
||
TL5T1: 0
|
||
TL5T2: 0
|
||
0
|
||
0
|
||
|
||
TL6: CLR TL6T1 ;ADDRESS TEST ON CONTROL MEM
|
||
MOV CSR,CSRSV
|
||
TL6C: EUICLR
|
||
MOV TL6T1,(A)
|
||
MOV TL6T1,2(A)
|
||
MOV TL6T1,4(A)
|
||
TST CSRSV
|
||
BGE TL6A
|
||
COM (A)
|
||
COM 2(A)
|
||
COM 4(A)
|
||
TL6A: BIC #177000,4(A)
|
||
MOV TL6T1,B
|
||
EDCMEM
|
||
INC TL6T1
|
||
BIC #170000,TL6T1 ;MASK TO CNTRL MEM SIZE
|
||
BNE TL6C
|
||
TL6D: MOV #TL6T2,A
|
||
MOV TL6T1,B
|
||
EEXAMC
|
||
BIC #177000,TL6T2+4
|
||
MOV TL6T1,A
|
||
TST CSRSV
|
||
BGE TL6E
|
||
COM A
|
||
TL6E: CMP A,TL6T2
|
||
BNE TL6L
|
||
CMP A,TL6T2+2
|
||
BNE TL6L
|
||
BIC #177000,A
|
||
CMP A,TL6T2+4
|
||
BNE TL6L
|
||
TL6B: INC TL6T1
|
||
BIC #170000,TL6T1 ;MASK TO CNTRL MEM SIZE
|
||
BNE TL6D
|
||
JMP TL6
|
||
|
||
TL6L: INC TL6T3
|
||
JMP TL6B
|
||
|
||
TL6T1: 0
|
||
TL6T2: 0
|
||
0
|
||
0
|
||
TL6T3: 0
|
||
CSRSV: 0
|
||
|
||
TL7: CLR TL7T1 ;ADDRESS TEST ON PDL BUFFER
|
||
MOV CSR,CSRSV
|
||
TL7A: MOV TL7T1,A
|
||
TST CSRSV
|
||
BGE TL7B
|
||
COM A
|
||
TL7B: MOV A,TL7T2
|
||
MOV A,TL7T2+2
|
||
MOV #TL7T2,A
|
||
MOV TL7T1,B
|
||
EWPDLB
|
||
INC TL7T1
|
||
CMP TL7T1,#2000
|
||
BNE TL7A
|
||
CLR TL7T1
|
||
TL7C: MOV TL7T1,B
|
||
MOV #TL7T3,A
|
||
ERPDLB
|
||
MOV TL7T1,C
|
||
TST CSRSV
|
||
BGE TL7D
|
||
COM C
|
||
TL7D: CMP TL7T3,C
|
||
BNE TL7L
|
||
CMP TL7T3+2,C
|
||
BNE TL7L
|
||
TL7L1: INC TL7T1
|
||
CMP TL7T1,#2000
|
||
BNE TL7C
|
||
JMP TL7
|
||
|
||
TL7L: INC TL7LC
|
||
JMP TL7L1
|
||
|
||
TL7LC: 0
|
||
TL7T1: 0
|
||
TL7T2: 0
|
||
0
|
||
TL7T3: 0
|
||
0
|
||
|
||
.SBTTL DISPLAY INTERRUPT ROUTINES
|
||
|
||
.IFNZ GT40P
|
||
|
||
RETST: PUSH T
|
||
PUSH TT
|
||
JSR PC,RETBLK
|
||
POP TT
|
||
POP T
|
||
RTS PC
|
||
|
||
;DISPLAY INTERRUPT ROUTINES
|
||
|
||
LPBRK: JSR PC,DPYSAV
|
||
BPT ;LIGHT PEN
|
||
RTI
|
||
DTOBRK: JSR PC,DPYSAV
|
||
BPT ;TIMEOUT/SHIFTOUT
|
||
RTI
|
||
|
||
DPYSAV: MOV DPC,SAVDPC ;SAVE STATE OF DISPLAY
|
||
MOV DSR,SAVDSR
|
||
MOV XSR,SAVXSR
|
||
MOV YSR,SAVYSR
|
||
RTS PC
|
||
|
||
DSBRK: PUSH A
|
||
PUSH B
|
||
;;;;;;; JSR PC,DPYSAV
|
||
CMP OCSR,CSR ;CHECK SWITCH REGISTER OPTIONS
|
||
BEQ DSBRK1
|
||
PUSH C
|
||
MOV CSR,OCSR
|
||
MOV #1,A ;DON'T BLINK
|
||
MOV #DBLINK,B
|
||
MOV #DPYSPT,C
|
||
COM OCSR ;FAKE OUT SETDPY
|
||
JSR PC,SETDPY
|
||
COM OCSR
|
||
ASL A ;ITALICS
|
||
MOV #ITALICS,B
|
||
MOV #DPYSA,C
|
||
JSR PC,SETDPY
|
||
POP C
|
||
DSBRK1: MOV RETLAD,A
|
||
BEQ .+6
|
||
JSR PC,RETST ;FREE BLOCKS
|
||
|
||
DSBRK3:
|
||
;.IFNZ DLIMSW
|
||
; TST DSTOPD
|
||
; BNE DUNLIM ;BR IF WE WERE JUST RESTARTED BY CLOCK
|
||
;.ENDC
|
||
MOV @ADPC,A
|
||
MOV -2(A),B ;HALT INSTRUCTION
|
||
BIC #3,B
|
||
CMP #DPYSTP,B
|
||
BNE DSBERR ;ITS NOT A HALT!!!
|
||
MOV -2(A),B
|
||
BIC #177774,B
|
||
ASL B ;MAKE IT A WORD INDEX
|
||
JMP @.+4(B) ;DISPATCH
|
||
|
||
DSBERR ;0 ERROR
|
||
AJSR ;1 DPYJSR
|
||
ARTS ;2 DPYRTS
|
||
AJSI ;3 DPYJSI
|
||
;DISPLAY INTERRUPT CONTINUED
|
||
|
||
DSBERR: TST FORGIV ;TO ERR IS HUMAN (PROBABLY A TIMING SCREW)
|
||
BNE DSRET ;TO FORGIVE, DIVINE
|
||
JSR PC,DPYSAV
|
||
BPT ;ILLEGAL INSTRUCTION
|
||
BR DSRET
|
||
|
||
AJSR: TST (A)+
|
||
BEQ DSRET ;DPYJSR 0 IS A NOOP
|
||
JSR PC,AJPUSH
|
||
MOV -(A),A ;JSR DESTINATION
|
||
BR DSRET
|
||
|
||
AJSI: TST (A)
|
||
BEQ DSRET ;DPYJSI 0 IS NOOP
|
||
TST @(A)+ ;DPYJSI @0 IS ALSO NOOP
|
||
BEQ DSRET
|
||
JSR PC,AJPUSH
|
||
MOV @-(A),A
|
||
BR DSRET
|
||
|
||
AJPUSH: INC DPYPDC
|
||
BLE .+4
|
||
BPT ;DISPLAY OVERPUSH
|
||
SUB #2,DPYPDP
|
||
MOV A,@DPYPDP
|
||
RTS PC
|
||
|
||
ARTS: DEC DPYPDC
|
||
MOV @DPYPDP,A
|
||
ADD #2,DPYPDP
|
||
DSRET: MOV @GETDPY,B
|
||
BEQ DSTART
|
||
PUSH A
|
||
MOV GETDPY,A
|
||
MOV 2(A),(B) ;PUT CONTENTS IN ADDRESS
|
||
CLR (A) ;FREE THIS BUFFER
|
||
MOV -(A),B ;NEXT ON RING
|
||
TST (B)+ ;POINT AT ADDRESS
|
||
MOV B,GETDPY
|
||
POP A
|
||
BR DSRET
|
||
|
||
;.IFNZ DLIMSW
|
||
; CMP A,#TXSTRT+2
|
||
; BNE DSTART
|
||
; TST DTIME ;READY TO DISPLAY TEXT
|
||
; BEQ DLIMIT ;BR IF IT TOOK<CLOCK TICK TO SHOW ALL LISTS
|
||
;DRSTRT: CLR DTIME
|
||
;.ENDC
|
||
DSTART: MOV A,@ADPC ;RESTART THE DISPLAY
|
||
DEXIT: POP B
|
||
POP A
|
||
RTI
|
||
|
||
;.IFNZ DLIMSW
|
||
;DLIMIT: MOV A,DSTOPD ;SAVE DPC & SET FLAG
|
||
; BR DEXIT
|
||
;DUNLIM: MOV DSTOPD,A ;RESUME FROM LIMITING
|
||
; CLR DSTOPD
|
||
; BR DRSTRT
|
||
;.ENDC
|
||
|
||
SETDPY: BIT A,OCSR
|
||
BNE SETDP1
|
||
BIC B,(C)
|
||
RTS PC
|
||
SETDP1: BIS B,(C)
|
||
RTS PC
|
||
.ENDC ;GT40P
|
||
|
||
.SBTTL CLOCK INTERRUPT ROUTINE
|
||
|
||
CLKBRK:
|
||
;.IFZ DLIMSW
|
||
.IFZ TVP
|
||
BPT ;CLOCK INTERRUPTS NOT ENABLED
|
||
.IFF ;TVP
|
||
JSR PC,CRSCLK ;BLINK TV CURSOR
|
||
.ENDC ;TVP
|
||
INC TIMEL ;MAKE 32 BIT 60 CYCLE COUNTER FOR LISPM
|
||
BNE CLKBRX
|
||
INC TIMEH
|
||
CLKBRX:
|
||
RTI
|
||
;.ENDC
|
||
;.IFNZ PCHIST
|
||
; CMP PCPNT,#<PCBUF+PCBFL>
|
||
; BLO .+10
|
||
; MOV #PCBUF,PCPNT
|
||
; MOV (SP),@PCPNT
|
||
; ADD #2,PCPNT
|
||
; MOV 2(SP),@PCPNT
|
||
; ADD #2,PCPNT
|
||
;.ENDC
|
||
;.IFNZ DLIMSW
|
||
; INC TICKS
|
||
; TST DSTOPD
|
||
; BNE CLKDS ;BR IF DISPLAY STOPPPED
|
||
; INC DTIME
|
||
; RTI
|
||
;
|
||
;CLKDS: MOV #DLINT,@ADPC ;CAUSE DISPLAY INTERRUPT
|
||
; RTI
|
||
;
|
||
;DLINT: DPYSTP ;DISPLAY LIST TO CAUSE INTERRUPT
|
||
;.ENDC
|
||
|
||
.SBTTL 105 FOOBAR ROUTINE
|
||
|
||
;IF THE MACHINE IS STOPPED, AND SOMEONE HITS RIGHT-CTRL RIGHT-META CALL
|
||
;ON THE KNIGHT KEYBOARD, RESTART THE MACHINE. SAVES WALKING TO THE OTHER ROOM.
|
||
FOO105: TST CTRUN
|
||
BMI FOO109 ;JUMP IF RUNNING
|
||
BIT #20000,164002 ;ALSO TEST IF MACHINE REALLY RUNNING
|
||
BNE FOO109 ; (THIS EXPECIALLY FOR PDP-10 MODE)
|
||
TST 164102
|
||
BPL FOO109 ;JUMP IF KEYBOARD NOT READY
|
||
MOV 164100,-(SP) ;GET INPUT, CLEAR KEYBOARD (OK SINCE MACH STOPPED)
|
||
COM (SP) ;COMPENSATE FOR BRAIN BUBBLES
|
||
BIC #165700,(SP) ;CLEAR ALL BUT RIGHT CTL, RIGHT META, KEYCODE
|
||
CMP (SP)+,#12020 ;CHECK FOR CONTROL META CALL
|
||
BNE FOO109
|
||
MOV #1,CNUM ;1@G
|
||
JSR PC,QG
|
||
JSR PC,QDPGO ;^P
|
||
FOO109: RTS PC
|
||
|
||
.SBTTL KEYBOARD INTERRUPT ROUTINE
|
||
|
||
TYIBRK: TSTB @AKLOS
|
||
BEQ TYIBRK
|
||
PUSH A
|
||
PUSH B
|
||
MOVB TKB,A
|
||
BIC #177600,A ;LOSEY LOSEY
|
||
TST TYIQF
|
||
BMI TYIB1 ;CHAR QUOTED
|
||
CMP A,#' ;CNTRL X
|
||
BEQ TYICX
|
||
CMP A,#' ;CNTRL Q
|
||
BEQ TYICQ
|
||
TST TYIQM ;(LOOK FOR OTHER CONTROLS?) CHECK QUOTE MODE
|
||
BEQ TYIB2 ;NO
|
||
CMP A,#' ;CNTRL S
|
||
BEQ TYICS ; STOP LISP MACHINE
|
||
CMP A,#' ;CNTRL D
|
||
BEQ TYICD ; COMPLEMENT STATE OF DISPLAY CONSOLE SWITCH
|
||
TYIB2: MOV #-1,CMREQ ;NOT TRYING TO ENTER MONITOR MODE NOW..
|
||
TST CNHTTY
|
||
BNE TYIMCM ;CONSOLE HAS THE TTY, FEED IT CHAR
|
||
; TST LMHTTY
|
||
; BNE TYIMCM ;LISP MACHINE HAS THE TTY, FEED CHAR TO CONSOLE
|
||
BR TYIMGT ;NEITHER, FEED CHARACTER TO TTY LINE TO 10
|
||
|
||
TYIB1: CLR TYIQF ;PROCESS CHAR WHICH HAS BEEN QUOTED
|
||
BR TYIB2
|
||
|
||
TYICS: CLR 164006 ;STOP LISP MACHINE, ENTER CONSOLE MONITOR LOOP
|
||
CLR CTRUN
|
||
CLR CRUN
|
||
TYICX: INC CMREQ ;CNTRL X TYPED
|
||
BEQ TYIEX ;ON FIRST CNTRL X, TRY FOR GRACEFUL ENTRY
|
||
ZAPFLG CNHTTY ;GRONK AND RESET WORLD
|
||
; CLR LMHTTY
|
||
JMP GO0 ;(TRY TO ENTER CONSOLE LOOP)
|
||
|
||
TYICQ: MOV #-1,TYIQF ;QUOTE FOLLOWING CHAR
|
||
BR TYIEX
|
||
|
||
TYICD: COM CONSF ;COMPLEMENT "DISPLAY CONSOLE" FLAG
|
||
BR TYIEX
|
||
|
||
TYIMCM: MOV A,TYICH ;LEAVE CHAR FOR CONSOLE MONITOR
|
||
BR TYIEX
|
||
|
||
TYIMGT: MOVB A,@AKLOB ;GT40 MODE SEND CHAR TO 10
|
||
TYIEX: POP B
|
||
POP A
|
||
RTI
|
||
|
||
.SBTTL TTY LINE INPUT INTERRUPT ROUTINE
|
||
|
||
KLIBRK: PUSH A
|
||
MOV @AKLIB,A ;GET THAT CHARACTER
|
||
BGE .+4
|
||
BPT ;DL11 HARDWARE ERROR
|
||
BIC #177600,A
|
||
CMP #177,A
|
||
BEQ KLIRET ;IGNORE PADDING ON INTERRUPT LEVEL
|
||
.IFNZ DEBUG
|
||
MOVB A,177566 ;ECHO ON CONSOLE
|
||
.ENDC
|
||
CMP ACTCHR,#BUFSIZ
|
||
BGE KLIER
|
||
INC ACTCHR
|
||
MOVB A,@PUTCC
|
||
CMP ACTCHR,MAXACT
|
||
BLE .+10
|
||
MOV ACTCHR,MAXACT ;TO FIND A GOOD SIZE FOR BUFFER
|
||
INC PUTCC
|
||
CMP PUTCC,#BUFEND
|
||
BLO KLIRET
|
||
MOV #BUF,PUTCC
|
||
KLIRET: POP A
|
||
RTI
|
||
|
||
KLIER: BPT ;BUFFER OVERFLOWED
|
||
BR KLIRET
|
||
|
||
.SBTTL PROCESSOR TRAP ROUTINES
|
||
|
||
NXMFND: PUSH MEMTOP
|
||
SUB #2,T ;REGISTER HAS ALREADY BEEN INCREMENTED
|
||
MOV T,MEMTOP
|
||
POP T
|
||
RTI
|
||
|
||
POWERF: HALT
|
||
; JSR U,ACSAV
|
||
; MOV #POWERU,PWRPC
|
||
; MOV SP,SAVSP
|
||
; HALT
|
||
POWERU: HALT
|
||
; RESET
|
||
; MOV #<7_5>,PS
|
||
; MOV #POWERF,PWRPC
|
||
; MOV SAVSP,SP
|
||
; MOV #100,A ;RENABLE ALL INTERRUPTS
|
||
; MOV A,TKS
|
||
; MOV A,@AKLIS
|
||
;.IFNZ DLIMSW
|
||
; MOV A,LKS
|
||
; CLR DSTOPD
|
||
; CLR DTIME
|
||
;.ENDC
|
||
; MOV #DPYSA,@ADPC
|
||
; JSR U,ACRES
|
||
; RTI
|
||
|
||
;VARIAOUS PROCESSOR ERRORS COME HERE
|
||
|
||
NXMBRK: BPT
|
||
RTI
|
||
|
||
IOTBRK: BPT
|
||
RTI
|
||
|
||
RESBRK: BPT
|
||
RTI
|
||
|
||
RUGBRK: TST CSR ;THERE'S NO RUG IN THIS LOSING MACHINE
|
||
BMI BPTBRK ;SIGN OF SWITCHES => STOP FOR CARPET
|
||
JMP GO0 ;OTHERWISE REINITIALIZE PROGRAM
|
||
|
||
;BPT BREAKS COME HERE IF THERE IS NO RUG.
|
||
;DON'T WANT TO HALT THE 11 SINCE 11TEN INTERFACE WOULDN'T BE ABLE TO GET TO BUS.
|
||
;WANT TO PUT CONTENTS OF REGISTERS IN CORE WHERE CARPET CAN GET AT THEM.
|
||
|
||
BPTBRK: .REPT 7 ;SAVE THE ACS
|
||
MOV %0+.RPCNT,BPTACS+<2*.RPCNT>
|
||
.ENDR
|
||
|
||
WAIT ;PUT 000001 IN LIGHTS (11/05)
|
||
BR . ;WAIT FOR RELOAD OR MANUAL INTERVENTION
|
||
;BRANCH TO POINT SO STUFF WILL AUTOMATICALLY START IT.
|
||
.REPT 7 ;PROCEED
|
||
MOV BPTACS+<2*.RPCNT>,%0+.RPCNT
|
||
.ENDR
|
||
RTI
|
||
|
||
BPTACS: .BLKW 7
|
||
|
||
.SBTTL WAIT FOR COMMAND FROM 10 OR KEYBOARD TYPEIN
|
||
|
||
GETCH1: TST TENMOD
|
||
BNE GETCH0
|
||
JSR PC,WATST ;STARTING A WAIT, LOAD IR
|
||
GETCH0: WAIT
|
||
GETCHW: CLR A
|
||
TST CMREQ ;WANT TO GO TO CONSOLE MONITOR
|
||
BGE GETC1 ;RETURN NULL CHAR
|
||
TST LDBFF2
|
||
BNE 1$
|
||
TST LDBUFF ;COMMANDS FROM 10 APPEARED?
|
||
BEQ GETCH2
|
||
1$: JSR PC,C10CM ;YEP, HACK THEM
|
||
GETCH2: TST DSKRQB ;REQUEST FROM 10?
|
||
BEQ 2$ ;NO
|
||
JSR PC,DSKRUN ;YES, RUN THE DISK
|
||
2$: JSR PC,FOO105 ;CHECK FOR 105 FOOBAR REQUEST
|
||
TST ACTCHR
|
||
BLE GETCH1 ;WAIT TILL CHARS IN BUFFER
|
||
GETCHR: DEC ACTCHR
|
||
MOVB @GETCC,A
|
||
INC GETCC
|
||
CMP GETCC,#BUFEND
|
||
BLO GETC1
|
||
MOV #BUF,GETCC
|
||
GETC1: RTS PC
|
||
|
||
C10CM: ZAPFLG TNRQFG
|
||
MOV #LDBUF,A
|
||
MOV #LDBUFF,-(SP)
|
||
MOV #<LDBUF+LDBUFL>,-(SP)
|
||
TST LDBUFF
|
||
BEQ C10CM2
|
||
BGT CLDR1 ;DEPOSIT IN REGISTER ADRS
|
||
CEXR1: TST (A) ;EXAMINE REGISTER ADRS
|
||
BEQ CEXRX ;EXIT ON ZERO (SAVES A BIT OF TIME)
|
||
ERDBLK
|
||
ADD #<4*2>,A
|
||
CMP A,(SP)
|
||
BLO CEXR1
|
||
BR CEXRX
|
||
|
||
CLDR1: TST (A)
|
||
BEQ CEXRX ;SAVE A BIT OF TIME
|
||
EDPBLK
|
||
ADD #<4*2>,A
|
||
CMP A,(SP)
|
||
BLO CLDR1
|
||
CEXRX: TST (SP)+
|
||
CLR @(SP)+ ;CLEAR FLAG FOR BUFFER THAT GOT SERVICED
|
||
CLR TNRQFG
|
||
RTS PC
|
||
|
||
C10CM2: MOV #LDBFF2,2(SP)
|
||
MOV #<LDBUF2+LDBUFL>,(SP)
|
||
MOV #LDBUF2,A
|
||
TST LDBFF2
|
||
BGT CLDR1
|
||
BEQ CEXRX
|
||
BR CEXR1
|
||
|
||
.SBTTL RUN DISK FOR 10
|
||
|
||
;A REQUEST IS 5 WORDS:
|
||
; COMMAND REG, TRACK REG, DUSH REG, LM CORE ADD, LM PAGE COUNT
|
||
|
||
;BASHES ALL REGISTERS
|
||
DSKRUN: CLR DSKRQB+2 ;CLEAR SUCCESSFULL TRANSFER COUNT
|
||
MOV DSKRQB,A ;GET REQUEST COUNT
|
||
BLE DSKRNE
|
||
MOV #DSKRQB+4,B ;POINTER TO FIRST REQUEST
|
||
DSKRN0: MOV #164320,C ;SET UP THE UNIBUS MAP (USE MAP REGS 10 AND UP)
|
||
MOV 6(B),T ;CORE ADD
|
||
BIS #100000,T ;WRITE PERMIT
|
||
MOV 8(B),TT ;PAGE COUNT
|
||
1$: MOV T,(C)+ ;STORE MAP
|
||
INC T ;NEXT PAGE
|
||
DEC TT
|
||
BGT 1$
|
||
20$: TSTB 176700 ;MAKE SURE DISK CONTROL IS IDLE
|
||
BPL DSKRNE ;IF NOT, TREAT AS ERROR
|
||
MOV 4(B),176702 ;DUSH
|
||
MOV #150000,176704 ;CA<15:0>. CA<17:16> IS CMD<13:12>, BUT FORTUNATELY IT'S ZERO.
|
||
MOV 8(B),T ;PAGE COUNT
|
||
SWAB T ;400 PDP11 WORDS PER PAGE
|
||
NEG T
|
||
MOV T,176706 ;-WC
|
||
MOV 2(B),176710 ;TRACK
|
||
MOV (B),176700 ;COMMAND
|
||
DSKRN2: TSTB 176700 ;AWAIT COMPLETION
|
||
BPL DSKRN2
|
||
TST 176700 ;CHECK ERROR SUMMARY
|
||
BMI DSKRNE ;LOSE
|
||
INC DSKRQB+2 ;WIN
|
||
ADD #10.,B ;NEXT REQUEST
|
||
DEC A ;COUNT
|
||
BGT DSKRN0
|
||
MOV #-1,DSKRQB+2 ;WON ON ALL TRANSFERS
|
||
DSKRNE: CLR DSKRQB ;AWAKEN, MONSTER
|
||
RTS PC
|
||
|
||
.SBTTL PUT CHARACTER ON SCREEN
|
||
|
||
TYOCHR: JSR PC,TVPREP
|
||
CMP A,#12
|
||
BEQ TYOCH1 ;JUST CLEAR LINE ON LF
|
||
CMP A,#15
|
||
BNE ADDCHR ;NORMAL CHR
|
||
JSR PC,CLEOL ;CLEAR REST OF THIS LINE
|
||
JSR PC,CR ; (INCLUDING CLEAR LINE ON CR, LF)
|
||
TST RAIDM
|
||
BEQ TYOCH2 ;NOT IN RAID MODE, USE WHOLE SCREEN
|
||
MOV CLINE,A
|
||
INC A
|
||
CMP A,CDLNN
|
||
BLT TYOCH2 ;STILL GOING TO BE ABOVE CONSOLE AREA
|
||
RDHU: CLR B ;HOME UP TO BOTTOM OF ACTIVE RAID AREA
|
||
MOV #RAIDA,A ;COUNT LINES IN USE
|
||
RDHU1: TST (A)+
|
||
BEQ RDHU2 ;THAT ONE ISNT
|
||
INC B
|
||
RDHU2: CMP A,#RAIDA+<10*2>
|
||
BLO RDHU1 ;LOOP
|
||
CLR A
|
||
JSR PC,CSRPOS ;POSITION CURSOR THERE
|
||
BR TYOCH1
|
||
|
||
TYOCH2: JSR PC,LF
|
||
TYOCH1: JSR PC,CLEOL
|
||
TYOCHX: CLR BLKDFR
|
||
RTS PC
|
||
|
||
TVPREP:
|
||
.IFNZ TVP
|
||
MOV #PPVAR,U
|
||
JSR PC,BLKOFF
|
||
.ENDC ;TVP
|
||
RTS PC
|
||
|
||
ADDCHR: BIC #177600,A
|
||
.IF NZ TVP
|
||
PUSH U
|
||
JSR PC,TVPREP
|
||
CMP #40,A
|
||
BGT FORMAT ;CONTROL CHARACTER
|
||
JSR PC,TVO
|
||
ADDCRT: CLR BLKDFR
|
||
POP U
|
||
.ENDC ;TVP
|
||
.IFNZ GT40P
|
||
CMP #40,A
|
||
BGT FORMAT ;CONTROL CHARACTER
|
||
CMP CPOS,#MCHRPL
|
||
BGE RTSPC1 ;IGNORE OVERFLOW
|
||
PUTCHR: TST OPENSW
|
||
BNE PUTCH1
|
||
JSR PC,OPNLIN ;OPEN UP THIS LINE
|
||
PUTCH1: CMP CPOS,BYTCNT
|
||
BLT PUTCH2
|
||
MOV CPOS,BYTCNT ;IN CASE WE LINE FED OR MOVED UP FROM FULL LINE TO NEARLY EMPTY ONE
|
||
PUTCH6: INC BYTCNT
|
||
PUTCH2: MOVB A,@LINPNT
|
||
PUTCH3: INC LINPNT
|
||
INC CPOS
|
||
ADD #CHRWD,CURSX
|
||
.ENDC ;GT40P
|
||
RTSPC1: RTS PC
|
||
|
||
;HERE FOR CONTROL CHARACTER
|
||
|
||
FORMAT: ASL A
|
||
.IFNZ GT40P
|
||
JMP @DPTAB(A)
|
||
.ENDC ;GT40P
|
||
.IFNZ TVP
|
||
JSR PC,@DPTAB(A)
|
||
BR ADDCRT
|
||
.ENDC ;TVP
|
||
|
||
DPTAB: FORMA1 ;^@ 00
|
||
FORMA1 ;^A 01
|
||
FORMA1 ;^B 02
|
||
FORMA1 ;^C 03
|
||
FORMA1 ;^D 04
|
||
FORMA1 ;^E 05
|
||
FORMA1 ;^F 06
|
||
BELL ;^G 07
|
||
BS ;^H 10
|
||
TAB ;^I 11
|
||
LF ;^J 12
|
||
ALT ;^K 13
|
||
FORMA1 ;^L 14
|
||
CR ;^M 15
|
||
FORMA1 ;^N 16
|
||
FORMA1 ;^O 17
|
||
FORMA1 ;^P 20
|
||
FORMA1 ;^Q 21
|
||
FORMA1 ;^R 22
|
||
FORMA1 ;^S 23
|
||
FORMA1 ;^T 24
|
||
FORMA1 ;^U 25
|
||
FORMA1 ;^V 26
|
||
FORMA1 ;^W 27
|
||
CFS ;^X 30 MOVE FORWARD
|
||
CLRCHR ;^Y 31 CLEAR CHARACTER
|
||
MU ;^Z 32 MOVE UP
|
||
ALT ;^[ 33 ALT-MODE
|
||
HD ;^\ 34 HOME DOWN
|
||
HU ;^] 35 HOME UP
|
||
CLEOL ;^^ 36 CLEAR TO END OF LINE
|
||
CLEOF ;^_ 37 CLEAR TO END OF FILE
|
||
|
||
.IFNZ GT40P
|
||
|
||
BELL: CLR DSR ;TRYING TO WRITE DSR CAUSES BEEP
|
||
ALT:
|
||
FORMA1: RTS PC
|
||
|
||
BS: BIT #1_2,CSR
|
||
BEQ MB ;IF OPTION NOT CHOSEN, JUST MOVE BACK
|
||
CMP CPOS,#MCHRPL
|
||
BGE RTSPC1
|
||
SUB #CHRWD*2,CURSX ;TO COMPENSATE FOR MOVING IT FWD ONE
|
||
MOV #10,A
|
||
BR PUTCHR ;NOW INSERT BS
|
||
|
||
MB: TST CPOS ;MOVE BACK
|
||
BEQ CRTSPC
|
||
CMP LINPNT,#OPENSW
|
||
BLOS MB1 ;AT BEGINNING OR LINE NOT OPEN
|
||
DEC LINPNT
|
||
MB1: DEC CPOS
|
||
SUB #CHRWD,CURSX
|
||
RTS PC
|
||
|
||
TAB: CMP CPOS,#MCHRPL
|
||
BGE CRTSPC
|
||
MOV #40,A ;AT LEAST ONE SPACE
|
||
JSR PC,ADDCHR
|
||
BIT #7,CPOS
|
||
BNE TAB
|
||
RTS PC
|
||
|
||
CR: CLR CPOS
|
||
CLR CURSX
|
||
MOV #OPENSW,LINPNT
|
||
RTS PC
|
||
|
||
CFS: CMP CPOS,#MCHRPL ;FORWARD SPACE
|
||
BGE CRTSPC
|
||
BIT #1_2,CSR
|
||
BEQ PUTCH3
|
||
TST OPENSW ;IF INSERTING BS, BE A BIT CLEVER ABOUT FS
|
||
BNE .+6
|
||
JSR PC,OPNLIN
|
||
JSR PC,PUTCH3 ;GO PAST A CHAR
|
||
CMPB @LINPNT,#10 ;IS NEXT CHAR A BS?
|
||
BNE FORMA1 ;NO
|
||
SUB #CHRWD*2,CURSX
|
||
JSR PC,CFS ;RECURSIVELY GO PAST BACKSPACE
|
||
BR PUTCH3 ;NOW GO PAST A REAL CHAR TO GET TO RIGHT COLUMN
|
||
|
||
LF: TST @TEXTP
|
||
BEQ LF1 ;LINE DIDN'T EXIST (YET)
|
||
TST OPENSW
|
||
BEQ LF2 ;LINE NEVER OPENED
|
||
LF1: JSR PC,CLSLIN ;CLOSE THE LINE
|
||
LF2: MOV TEXTP,A
|
||
MOV NXTIDX-TXTIDX(A),A
|
||
ADD #TXTIDX,A
|
||
MOV A,TEXTP
|
||
INC CLINE
|
||
SUB #CHRHT,CURSY
|
||
CMP CLINE,#CHRLN-1
|
||
BLE CRTSPC
|
||
JMP HU ;AT BOTTOM, GO TO TOP
|
||
CRTSPC: RTS PC
|
||
|
||
HD: JSR PC,CR
|
||
HD1: CMP CLINE,#CHRLN-1
|
||
BGE HD2
|
||
JSR PC,LF
|
||
BR HD1
|
||
HD2: RTS PC
|
||
|
||
MU: TST CLINE ;MOVE UP
|
||
BEQ CRTSPC ;ALREADY AT TOP LINE
|
||
TST @TEXTP
|
||
BEQ MU0 ;IF LINE DIDN'T EXIST, INVENT CRLF
|
||
TST OPENSW
|
||
BEQ MU1 ;BR IF NO LINE OPEN
|
||
MU0: JSR PC,CLSLIN
|
||
MU1: DEC CLINE
|
||
ADD #CHRHT,CURSY
|
||
MOV TEXTP,A
|
||
SUB #TXTIDX,A
|
||
MOV BACIDX(A),A
|
||
ADD #TXTIDX,A
|
||
MOV A,TEXTP
|
||
RTS PC
|
||
|
||
HU: JSR PC,CR ;HOME UP
|
||
HU1: TST CLINE
|
||
BEQ CRTSPC
|
||
JSR PC,MU
|
||
BR HU1
|
||
|
||
CLEOL: TST @TEXTP
|
||
BEQ CLEOL2 ;LET MU OR LF WORRY ABOUT LINE WHICH NEVER EXISTED
|
||
TST OPENSW
|
||
BNE .+6
|
||
JSR PC,OPNLIN ;OPEN IT SO WE CAN FREE WHERE IT POINTED
|
||
BIT #1,CPOS
|
||
BEQ CLEOL1
|
||
MOVB #' ,@LINPNT
|
||
CLEOL1: MOV CPOS,BYTCNT
|
||
JSR PC,CLSLIN
|
||
CLEOL2: RTS PC
|
||
|
||
CLEOF: JSR PC,CLEOL ;CLEAR THE LINE THAT'S THERE
|
||
MOV #CHRLN-1,B
|
||
SUB CLINE,B ;# OF ADDITIONAL LINES TO FLUSH
|
||
BEQ CLEOF3
|
||
MOV TXSTRT,C ;TOP LINE
|
||
BNE .+4
|
||
BPT ;HOW CAN THERE BE NO TEXT?
|
||
;FLUSH TEXT
|
||
CLEOF1: MOV BACIDX(C),C
|
||
MOV TXTIDX(C),A
|
||
BEQ CLEOF2 ;NO TEXT ON THAT LINE
|
||
CLR TXTIDX(C)
|
||
JSR PC,RETLIN ;RETURN LINE TO FREE STORAGE
|
||
CLEOF2: DEC B
|
||
BGT CLEOF1
|
||
CLEOF3: MOV #GRJSR-HJSIDX,TT ;FLUSH THE GRAPHICS AS WELL
|
||
MOV GRSTRT,T
|
||
BEQ CLEOF4
|
||
BPT ;GRAPHICS FLUSHED
|
||
; JSR PC,DITEM2
|
||
; BR CLEOF3
|
||
CLEOF4: RTS PC
|
||
|
||
CSRPOS: PUSH A ;POSITION CURSOR TO H,V IN A,B
|
||
PUSH B
|
||
CSPV1: CMP (SP),CLINE
|
||
BEQ CSPH1 ;VERTICAL POSITION RIGHT
|
||
BLE CSPV2
|
||
JSR PC,LF ;MOVE DOWN
|
||
BR CSPV1
|
||
|
||
CSPV2: JSR PC,MU ;MOVE UP ONE
|
||
BR CSPV1
|
||
|
||
CSPH1: CMP 2(SP),CPOS
|
||
BEQ CSPHX ;HORIZONAL POSITION RIGHT TOO
|
||
BLE CSPH2
|
||
JSR PC,CFS ;FORWARD SPACE
|
||
BR CSPH1
|
||
|
||
CSPH2: JSR PC,MB ;MOVE BACK
|
||
BR CSPH1
|
||
|
||
CSPHX: POP B
|
||
POP A
|
||
RTS PC
|
||
|
||
;HERE TO CLOSE A LINE
|
||
|
||
CLSLIN: MOV BYTCNT,A
|
||
ASR A ;MAKE A EVEN
|
||
ADC A
|
||
ASL A
|
||
ADD #XTLBYT,A ;SIZE OF BUFFER DESIRED (INCLUDE CHARS,CRLF,DPYRTS)
|
||
MOV A,B
|
||
JSR PC,GETBLK
|
||
MOV #CHARS,(A)
|
||
ADD A,B
|
||
MOV #DPYRTS,-(B)
|
||
MOV #<<15_10>+12>,-(B)
|
||
MOV BYTCNT,B
|
||
BEQ CLSL2 ;EMPTY LINE
|
||
MOV A,TT
|
||
MOV #LINBUF,T
|
||
MOV (T)+,(TT)+
|
||
ASR B
|
||
ADC B ;WORD COUNT
|
||
CLSL1: MOV (T)+,(TT)+
|
||
DEC B
|
||
BGT CLSL1
|
||
CLSL2: MOV A,@TEXTP
|
||
CLRLIN: CLR BYTCNT
|
||
MOV #LINBUF+LBL-4,T ;DON'T CLEAR CRLF OR DPYRTS
|
||
MOV #LINBUF,TT ;OR THE CHARS EITHER
|
||
CLRL1: CLR -(T)
|
||
CMP T,TT
|
||
BHI CLRL1
|
||
RTS PC
|
||
|
||
CLRL3: CLR (T)+
|
||
CMP T,TT
|
||
BLO CLRL3
|
||
RTS PC
|
||
|
||
;OPENS CURRENT LINE, COPIES CURRENT LINE INTO LINBUF
|
||
; AND RETURNS LINE BUFFER TO FREE STORAGE
|
||
OPNLIN: PUSH A
|
||
MOV @TEXTP,T
|
||
BEQ OPNL4 ;NO TEXT ON LINE
|
||
MOV #LINBUF,TT
|
||
MOV (T)+,(TT)+ ;SHOULD BE CHARS
|
||
MOV (T)+,(TT)+
|
||
BGE .-2 ;UGH! THIS WORKS ONLY BECAUSE DPYRTS
|
||
;HAS 100000 BIT ON, AND CHARS DON'T.
|
||
CMP -(TT),-(TT) ;DPYRTS AND CRLF
|
||
MOV TT,T
|
||
SUB #LINBUF+2,TT ;NUMBER OF BYTES IN LINE
|
||
MOV TT,BYTCNT
|
||
OPNL1: MOV #LINBUF+LBL-2,TT
|
||
MOV #DPYRTS,(TT)
|
||
MOV #<15_10>+12,-(TT)
|
||
MOV #" ,A ;2 SPACES
|
||
BIT #1,A
|
||
BEQ OPNL2
|
||
MOVB A,(T)+ ;FILL ODD BYTE
|
||
BR OPNL2
|
||
MOV A,(T)+ ;FILL LINE WITH SPACES
|
||
OPNL2: CMP T,TT
|
||
BLO .-4
|
||
MOV @TEXTP,A
|
||
BEQ OPNL3 ;NO LINE TO RETURN
|
||
MOV #FAKEL,@TEXTP
|
||
JSR PC,RETLIN ;RETURN LINE AT INTERUPT LEVEL
|
||
OPNL3: MOV #LINBUF,@TEXTP
|
||
POP A
|
||
RTS PC
|
||
|
||
;HERE FOR NO TEXT ON OPEN LINE
|
||
|
||
OPNL4: MOV #LINBUF,T
|
||
MOV #CHARS,(T)+
|
||
CLR BYTCNT
|
||
BR OPNL1
|
||
|
||
.IFNZ 0 ;FLUSHED TO SAVE CORE
|
||
|
||
.SBTTL DISPLAY SLAVE COMMAND PROCESSOR
|
||
|
||
CMND: JSR PC,GETCHW ;GET COMMAND
|
||
CMP A,#CMTBLL/2
|
||
BHIS RTSPC3 ;NOT A COMMAND IGNORE
|
||
MOV A,COMAND ;FOR DEBUGGING
|
||
CLR CKS
|
||
CLR C ;ONE LESS THAN # OF WORDS WE EXPECT
|
||
ASL A
|
||
JMP @CMTBL(A) ;DISPACH
|
||
|
||
;COMMAND DISPATCH TABLE
|
||
CMTBL: LODERS ;LOAD A LIST AND SHOW IT
|
||
LODER ;JUST LOAD IT
|
||
DITEM ;DELETE AN ITEM
|
||
GO0 ;RESTART WORLD
|
||
SITEM ;SHOW AND ITEM
|
||
EITEM ;ERASE AN ITEM
|
||
CITEM ;COPY AN ITEM
|
||
MITEM ;MOVE ITEM
|
||
CMITEM ;CHANGE THE SET GRAPHICS MODE OF ITEM
|
||
ADITEM ;ADD TO AN ITEM
|
||
SBRITM ;SUBROUTINIZE AN ITEM
|
||
USBITM ;UNSUBROUTINIZE AN ITEM
|
||
|
||
CMTBLL==.-CMTBL
|
||
|
||
;DRAWING PROGRAM STYLE COMMANDS
|
||
|
||
;HERE TO LOAD DISPLAY ITEM AND SHOW IT
|
||
LODERS: MOV #<XLOD+2>,C ;COUNT
|
||
JSR PC,GETWRD
|
||
CMP A,#2
|
||
BEQ LODER2
|
||
CMP A,#1
|
||
BNE RTSPC3
|
||
JSR PC,LODER ;LOAD ITEM
|
||
RTSPC3: RTS PC
|
||
|
||
|
||
;HERE TO DELETE AN ITEM FROM OVER COMMUNICATION LINK
|
||
|
||
LODER2: JSR PC,GETWRD
|
||
MOV A,C
|
||
SUB #<XLOD-2>,C
|
||
LOD2A: JSR PC,DITEM
|
||
TST C
|
||
BGT LOD2A
|
||
JSR PC,LODEND
|
||
RTS PC
|
||
|
||
GETCNT: JSR PC,GETWRD ;SIZE OF BLOCK
|
||
MOV A,C
|
||
MOV A,COUNT ;FOR DEBUGGING
|
||
ADD #<XITEM-XLOD>,A ;BYTES OF CORE WE WANT
|
||
SUB #<XLOD-2>,C ;WE'VE ONLY 2 LEFT TO READ
|
||
RTS PC
|
||
|
||
GTAIB2: JSR PC,GTAIB ;DO GTAIB TWICE
|
||
;GET WORD AND INSERT AT (B)+
|
||
GTAIB: JSR PC,GETWRD
|
||
MOV A,(B)+
|
||
RTS PC
|
||
|
||
;HERE TO READ A WORD IN LODER FORMAT
|
||
GETWRD: JSR PC,GETCHW ;6 BITS
|
||
PUSH A
|
||
JSR PC,GETCHW ;4 BITS
|
||
SWAB A
|
||
ASR A
|
||
ASR A
|
||
ADD A,(SP)
|
||
MOVB (SP),A
|
||
BIC #<377_10>,A
|
||
ADD A,CKS
|
||
DEC C
|
||
JSR PC,GETCHW ;LAST 6 BITS
|
||
SWAB A
|
||
ASL A
|
||
ASL A
|
||
ADD A,(SP)
|
||
DEC C
|
||
BLT POPAJ ;ONLY 8 BITS OF CHECK SUM
|
||
MOVB 1(SP),A
|
||
BIC #<377_10>,A
|
||
ADD A,CKS
|
||
POPAJ: POP A
|
||
RTS PC
|
||
|
||
;SOME SBRS USED BY ALL STYLE COMMANDS
|
||
;GET ITEM AND FIND IT
|
||
;CALL WITH ITEM # IN A
|
||
;RETURN WITH ITEM # IN A, & IF FOUND, Z BIT CLEARED, & ITEM ADDR IN T
|
||
GFITEM: JSR PC,GETWRD
|
||
FHEDR: MOV #GRSTRT-HNXIDX,TT
|
||
BR FHEDR2
|
||
FHEDR1: MOV T,TT
|
||
FHEDR2: MOV HNXIDX(TT),T
|
||
BEQ RTSPC4 ;BR IF ITEM DOESN'T EXIST
|
||
CMP A,HITIDX(T)
|
||
BNE FHEDR1
|
||
CLZ ;FOUND IT, CLR Z BIT
|
||
RTSPC4: RTS PC
|
||
|
||
;CREATE A HEADR, CALL WITH ITEM # IN A
|
||
;INSERT INTO DISPLAY RING &RETURN WITH HEADR ADDR IN T
|
||
CHEDR: JSR PC,FHEDR
|
||
BNE DELIS1 ;ALREADY EXISTS
|
||
PUSH A
|
||
MOV #HSIZE,A
|
||
JSR PC,GETBLK ;GET A NEW HEADER BLOCK
|
||
MOV A,T
|
||
POP A
|
||
PUSH T
|
||
MOV #DPYNOP,(T)+ ;SETPNT
|
||
MOV #DPYNOP,(T)+ ;X
|
||
MOV #DPYNOP,(T)+ ;Y
|
||
MOV #DPYJSR,(T)+
|
||
CLR (T)+ ;THIS ITEM'S LIST ADDR
|
||
CMP (T)+,(T)+ ;JMP OR JSR TO NEXT LIST & NEXT LIST
|
||
MOV A,(T)+ ;ITEM #
|
||
CLR (T)+ ;LIST ADDR
|
||
CLR (T)+ ;# OF SUBR CALLS TO THIS LIST
|
||
POP T
|
||
IINSRT: MOV GRJMP,HJMIDX(T)
|
||
MOV GRSTRT,HNXIDX(T)
|
||
MOV T,GRSTRT ;FLASH
|
||
MOV #DPYJMP,GRJMP
|
||
RTS PC
|
||
|
||
;DELETE ITEM WITH # IN A
|
||
;RETURN HEADR ADDR, IF ANY, IN T & CLR Z BIT
|
||
GDELIS: JSR PC,GETWRD
|
||
DELIS: JSR PC,FHEDR
|
||
BEQ RTSPC4 ;HEADER DOESN'T EXIST
|
||
DELIS1: TST HIAIDX(T)
|
||
BEQ RTSPC4 ;NO ASSOCIATED LIST
|
||
CLR HDSIDX(T) ;DON'T SHOW IT
|
||
PUSH A
|
||
MOV HIAIDX(T),A ;LIST ADDR
|
||
CLR HIAIDX(T)
|
||
JSR PC,RETLIN ;FREE IT UP
|
||
POP A
|
||
CLZ
|
||
RTS PC
|
||
|
||
;LISP STYLE COMMANDS
|
||
|
||
;HERE TO LOAD AN ITEM
|
||
LODER: JSR PC,GETCNT
|
||
SUB #LINHDR,A ;LIST BYTES IN HEADER
|
||
PUSH A ;LIST SIZE IN A
|
||
JSR PC,GETWRD
|
||
JSR PC,CHEDR ;CREATE A HEADR
|
||
MOV T,B ;HEADR ADDR
|
||
PUSH B
|
||
JSR PC,GTAIB ;SET POINT
|
||
JSR PC,GTAIB2 ;X&Y
|
||
POP B
|
||
POP A ;LIST SIZE
|
||
JSR PC,GETBLK ;GET ITEM
|
||
MOV A,T
|
||
MOV A,HIAIDX(B) ;LIST ADDR
|
||
MOV #DPYRTS,(A)
|
||
MOV T,HDSIDX(B) ;DEST OF DPYJSR
|
||
MOV A,B
|
||
JSR PC,GTALL ;GET WRDS UNTILL C=0, PUT THEM AT (B)+, CHECKSUM
|
||
RTS PC
|
||
|
||
;HERE TO DELETE AN ITEM!
|
||
DITEM: JSR PC,GDELIS
|
||
TST T
|
||
BEQ RTSPC4 ;NO HEADER EXISTS
|
||
DHEDR: TST HSCIDX(T)
|
||
BNE EDHEDR
|
||
DITEM2: MOV HJMIDX(T),HJMIDX(TT) ;TAKE IT OUT OF DISPLAY LIST RING
|
||
MOV HNXIDX(T),HNXIDX(TT)
|
||
PUSH A
|
||
MOV T,A ;HEADER ADDR
|
||
JSR PC,RETLIN
|
||
BR POPAJ
|
||
|
||
EDHEDR: BPT ;CAN'T DELETE THIS, IT'S A SUBR
|
||
RTS PC
|
||
|
||
;GET ALL WORDS AND INSERT AT (B)+, THEN CHECKSUM
|
||
;MAIN LODER LOOP
|
||
|
||
GTALL1: MOV #DPYRTS,2(B)
|
||
PUSH B ;SAVE THE ADDRESS
|
||
JSR PC,GETWRD
|
||
TST @PUTDPY ;PUT THE WORD IN LIST AT INTERRUPT LEVEL
|
||
BEQ .+4
|
||
BPT ;NOT FAST ENOUGH FOR OUR TASTE
|
||
MOV PUTDPY,B
|
||
MOV A,2(B) ;THAT'S THE CONTENTS
|
||
POP A ;GET THE ADDRESS BACK
|
||
MOV A,(B) ;ADDRESS MARKS BUFFER AS GOOD
|
||
MOV -(B),B ;NEXT BUFFER ON RING
|
||
TST (B)+ ;MAKE IT POINT TO ADDRESS
|
||
MOV B,PUTDPY ;SET FOR NEXT TIME
|
||
MOV A,B ;GET ADRRESS BACK IN RIGHT PLACE
|
||
TST (B)+ ;AND INCREMENT IT
|
||
GTALL: TST C
|
||
BGT GTALL1
|
||
LODEND: TST C
|
||
BEQ .+4
|
||
BPT ;ODD # OF BYTES
|
||
LGCKS: JSR PC,GETWRD
|
||
TSTB CKS
|
||
BEQ .+4
|
||
BPT ;CHECKSUM
|
||
RTS PC
|
||
|
||
;HERE TO SHOW DISPLAY ITEM
|
||
SITEM: JSR PC,GFITEM ;GET ITEM NUMBER AND FIND IT
|
||
BEQ RTSPC5 ;NO SUCH ITEM
|
||
RSITEM: MOV HIAIDX(T),HDSIDX(T)
|
||
RTS PC
|
||
|
||
;HERE TO ERASE ITEM
|
||
EITEM: JSR PC,GFITEM
|
||
BEQ RTSPC5 ;NO SUCH ITEM
|
||
CLR HDSIDX(T)
|
||
RTS PC
|
||
|
||
;HERE TO CALL ITEM2 AS A SUBROUTINE OF ITEM1
|
||
SBRITM: INC C ;2 MORE WORDS LEFT
|
||
JSR PC,GFITEM
|
||
BEQ IG1WD2
|
||
MOV T,B ;SOURCE ADDR
|
||
JSR PC,GFITEM
|
||
BEQ RTSPC5
|
||
INC HSCIDX(T) ;# OF TIMES THIS IS CALLED AS SUBR
|
||
ADD #HDSIDX,T ;WHERE TO DPYJSR TO
|
||
PUSH T
|
||
MOV HIAIDX(B),A ;OLD DEST LIST
|
||
MOV #4,T ;ADDED SIZE OF CALLING ITEM
|
||
JSR PC,TCOPY ;COPY CALLING ROUTINE, RETURN WITH NEW ADDRESS IN A
|
||
;PNTR TO LAST WORD IN T
|
||
MOV #DPYJSI,(T)+ ;PUT A CALL TO SUBR AT END OF NEW COPY
|
||
POP (T)+
|
||
MOV #DPYRTS,(T)
|
||
PUSH HIAIDX(B) ;OLD DEST LIST
|
||
MOV A,HIAIDX(B)
|
||
TST HDSIDX(B)
|
||
BEQ .+6 ;WASN'T BEING SHOWN
|
||
MOV A,HDSIDX(B) ;SHOW IT
|
||
POP A
|
||
BEQ RTSPC5 ;SHOULDN'T HAPPEN
|
||
JSR PC,RETLIN ;FLUSH OLD LIST
|
||
RTSPC5: RTS PC
|
||
|
||
;HERE TO UNSUBROUTINIZE AN ITEM
|
||
USBITM: INC C ;2 MORE WORDS LEFT
|
||
JSR PC,GFITEM
|
||
BEQ IG1WD2
|
||
MOV T,B ;OLD SOURCE
|
||
JSR PC,GFITEM
|
||
BEQ RTSPC5
|
||
MOV HIAIDX(B),B
|
||
MOV T,A
|
||
ADD #HDSIDX,A ;DEST OF DPYJSRS
|
||
USBIT1: CMP (B),#DPYRTS
|
||
BEQ RTSPC5 ;END OF THAT LIST
|
||
CMP (B)+,#DPYJSI
|
||
BNE USBIT1 ;THAT WORD WASN'T A SBR CALL
|
||
CMP (B),A
|
||
BNE USBIT1 ;DEST WASN'T WHAT WE WANTED
|
||
CLR (B) ;FLUSH IT
|
||
DEC HSCIDX(T) ;ONE LESS CALL TO ME
|
||
RTS PC
|
||
BR USBIT1 ;NOOP PREV INSTR TO REMOVE ALL CALLS TO THIS ITEM
|
||
|
||
IG1WD2: JMP IG1WD
|
||
|
||
;HERE TO COPY ITEM
|
||
CITEM: INC C ;2 MORE WORDS LEFT
|
||
JSR PC,GFITEM
|
||
BEQ IG1WD1 ;NO SUCH ITEM
|
||
PUSH T ;HEADER ADDRESS
|
||
JSR PC,GETWRD
|
||
JSR PC,CHEDR ;CREATE A HEADER
|
||
POP A ;SOURCE HEADER ADDR
|
||
MOV HSPIDX(A),HSPIDX(T) ;SETPOINT
|
||
MOV HXCIDX(A),HXCIDX(T) ;X
|
||
MOV HYCIDX(A),HYCIDX(T) ;Y
|
||
TST HIAIDX(A)
|
||
BEQ RTSPC5 ;NO LIST
|
||
PUSH A ;OLD HEADER ADDR
|
||
PUSH T ;NEW HEADER ADDR
|
||
MOV HIAIDX(A),A ;LIST TO BE COPIED
|
||
CLR T
|
||
JSR PC,TCOPY ;COPY LIST
|
||
POP T ;NEW HEADER ADDR
|
||
MOV A,HIAIDX(T) ;LIST ADDRESS
|
||
POP A
|
||
TST HDSIDX(A)
|
||
BEQ RTSPC5 ;OLD ITEM WASN'T BEING SHOWN
|
||
MOV HIAIDX(T),HDSIDX(T)
|
||
RTS PC
|
||
|
||
|
||
;MAKE A COPY OF ITEM WITH ADDRESS IN A,
|
||
; LEAVE T EXTRA BYTES
|
||
;RETURN PNTR TO NEW ITEM IN A, TO END OF NEW ITEM IN T
|
||
TCOPY: PUSH TT
|
||
PUSH A
|
||
MOV -BLIDX(A),TT
|
||
BIC #INUSE,TT
|
||
SUB #BXTRA,TT ;MAX LIST SIZE
|
||
ADD A,TT ;PNTR PAST END OF LIST
|
||
TCOPY2: CMP A,TT
|
||
BHIS TCOPY3 ;PAST END OF LIST
|
||
CMP (A)+,#DPYRTS ;FIND THE END OF DISPLAY INSTRUCTIONS
|
||
BNE TCOPY2
|
||
TCOPY3: SUB (SP),A
|
||
MOV A,TT
|
||
ASR TT ;# OF WORDS TO BLT
|
||
PUSH TT
|
||
ADD T,A ;GRAND TOTAL SIZE
|
||
JSR PC,GETBLK
|
||
MOV A,T ;COPY ADDR
|
||
POP TT ;WD COUNT
|
||
POP A ;SOURCE ADDR
|
||
PUSH T
|
||
TCOPY1: MOV (A)+,(T)+ ;BLT OLD ITEM TO NEW
|
||
DEC TT
|
||
BGT TCOPY1
|
||
TST -(T) ;LAST WORD IN COPY
|
||
POP A ;COPY ADDRESS
|
||
POP TT
|
||
RTS PC
|
||
|
||
;CHANGE MODE (INTENSITY, BLINK, ETC)
|
||
CMITEM: INC C ;2 MORE WORDS LEFT
|
||
JSR PC,GFITEM
|
||
IG1WD1: BEQ IG1WD
|
||
JSR PC,GETWRD
|
||
MOV (T),TT ;OLD SET GRAPH MODE WORD
|
||
BIC #003777,TT ;COMBINE OLD MODE
|
||
BIC #174000,A ;WITH NEW ENABLE, ETC. BITS
|
||
BIS A,TT
|
||
MOV TT,(T) ;NEW WORD
|
||
RTS PC
|
||
|
||
;ADD TO ITEM1 N WORDS
|
||
ADITEM: JSR PC,GETCNT ;RETURNS AMOUNT OF CORE WE NEED IN A
|
||
MOV A,B ;# OF XTRA BYTES
|
||
JSR PC,GFITEM
|
||
BNE ADITE1 ;BR IF FOUND ITEM
|
||
INC C ;IGNORE CKS ALSO
|
||
BR IGWDS
|
||
ADITE1: MOV HIAIDX(T),A ;OLD LIST ADDR
|
||
PUSH A
|
||
PUSH T ;HEADR ADDR
|
||
MOV B,T
|
||
JSR PC,TCOPY
|
||
MOV T,B ;END OF NEW LIST
|
||
POP T ;HEADR ADR
|
||
MOV A,HIAIDX(T) ;LIST ADDR
|
||
TST HDSIDX(T)
|
||
BEQ ADITE2
|
||
MOV A,HDSIDX(T)
|
||
ADITE2: JSR PC,GTALL
|
||
POP A
|
||
JSR PC,RETLIN ;FREE OLD LIST SPACE
|
||
RTS PC
|
||
|
||
|
||
;MOVE AN ITEM TO X, Y
|
||
MITEM: MOV #2,C ;3 MORE WORDS
|
||
JSR PC,GFITEM
|
||
BEQ IG2WD ;NO SUCH ITEM
|
||
MOV T,B ;ITEM ADDRESS
|
||
ADD #HXCIDX,B
|
||
JSR PC,GTAIB2 ;GET X&Y
|
||
RTS PC
|
||
|
||
;IGNORE 2 WORDS
|
||
IG2WD: MOV #2,C
|
||
BR IGWDS1
|
||
;IGNORE 1 WORD
|
||
IG1WD: MOV #1,C
|
||
;IGNORE C WORDS
|
||
IGWDS1: JSR PC,GETWRD
|
||
IGWDS: TST C
|
||
BGE IGWDS1
|
||
RTS PC
|
||
|
||
.ENDC ;IFNZ 0
|
||
|
||
.SBTTL DYNAMIC STORAGE ALLOCATOR ROUTINES
|
||
|
||
GETBLK: ASR A ;INSURE AN EVEN # OF BYTES
|
||
ADC A
|
||
ASL A
|
||
ADD #BXTRA,A ;SIZE OF BLOCK HE REALLY WANTS
|
||
BGT .+4
|
||
BPT ;HE WANTS NEGATIVE OR ZERO BLOCK
|
||
PUSH PS ;DON'T ALLOW RETBLK AT INTERRUPT LEVEL
|
||
MOV DSPSW,PS
|
||
MOV ROVER,T
|
||
BNE GETBL1
|
||
MOV @AVAIL,T
|
||
MOV T,ROVER
|
||
GETBL1: MOV (T),TT ;NEXT BLOCK
|
||
CMP A,-(T)
|
||
BLOS GETBL2 ;FOUND A WINNER
|
||
CMP TT,AVAIL
|
||
BEQ GETBL3 ;END OF CHAIN
|
||
MOV TT,T
|
||
BR GETBL1
|
||
|
||
;HERE IF WINNER FOUND
|
||
|
||
GETBL2: MOV TT,ROVER
|
||
SUB A,(T) ;SIZE OF THIS BLOCK NOW
|
||
CMP (T)+,#NEBISH
|
||
BLO GETB21
|
||
MOV T,TT ;BREAK INTO TWO BLOCKS
|
||
ADD -(T),TT ;ORIGIN OF NEW BLOCK
|
||
MOV (T),-4(TT) ;SIZE INTO TOP OF OLD BLOCK
|
||
GETBL4: MOV A,T ;LENGTH OF NEW BLOCK
|
||
BIS #INUSE,A ;MARKS BLOCK IN USE
|
||
CLR (TT)+ ;CLEAR FREE NEXT BLK PNTR
|
||
MOV A,-BLIDX(TT) ;MARKER INTO BLOCK
|
||
MOV TT,A ;RETURN POINTER TO CALLER
|
||
ADD T,TT ;ORIGIN OF NEXT BLOCK
|
||
MOV #INUSE,-BLIDX-2(TT) ;MARK LAST WORD OF NEW BLOCK
|
||
POP PS
|
||
RTS PC
|
||
|
||
;HERE TO GIVE CALLER ENTIRE BLOCK
|
||
|
||
GETB21: JSR PC,UNLINK ;TAKE BLOCK OUT OF FREE LIST
|
||
ADD -2(T),A ;SIZE OF BLOCK
|
||
MOV T,TT ;NEW BLOCK
|
||
BR GETBL4
|
||
|
||
;BLOCK FORMAT
|
||
;FREE BLOCK
|
||
;SIZE
|
||
BNXIDX==2 ;PNTR TO NEXT FREE BLOCK
|
||
;PNTR TO PREVIOUS FREE BLOCK
|
||
;BLOCK
|
||
;SIZE
|
||
|
||
;ALLOCATED BLOCK
|
||
;SIZE!INUSE
|
||
;IF NON-ZERO, PNTR TO NEXT BLOCK TO BE FREED
|
||
BLIDX==BNXIDX+2 ;BLOCK
|
||
;SIZE!INUSE
|
||
|
||
BXTRA==6 ;NUMBER OF EXTRA BYTES IN A BLOCK
|
||
|
||
;HERE ON END OF FREE LIST
|
||
|
||
GETBL3: TST ROVER
|
||
BEQ ENOFRE ;BLOCK CANNOT BE FOUND
|
||
CLR ROVER
|
||
MOV @AVAIL,T
|
||
BR GETBL1
|
||
|
||
;TAKES BLOCK IN T AND PATCHES IT OUT OF FREE STORAGE LIST
|
||
UNLINK: MOV (T),TT
|
||
MOV TT,@2(T) ;PATCH FORWARD POINTER INTO PRECEEDING BLOCK
|
||
MOV 2(T),2(TT) ;PATCH BACK POINTER INTO NEXT BLOCK
|
||
CMP ROVER,T
|
||
BNE .+6
|
||
MOV TT,ROVER ;DON'T LET ROVER POINT TO NON-EXISTENT BLOCK
|
||
RTS PC
|
||
|
||
|
||
;ERROR ROUTINES
|
||
ENOFRE: CLR A ;NO FREE STORAGE LEFT
|
||
; JSR PC,ESND
|
||
MOV #GO,SP
|
||
JMP MAINL
|
||
|
||
;EINT: MOV #34,A ;INTERNAL ERROR
|
||
;ESND: MOV A,@AKLOB
|
||
; BR .+6
|
||
;ESND1: JSR PC,GETWRD
|
||
; TST C ;IGNORE C+1 WORDS
|
||
; BGE ESND1
|
||
; RTS PC
|
||
;HERE TO RETURN A BLOCK TO FREE STORAGE (RUNS DURING DISPLAY INTERRUPTS)
|
||
|
||
RETBLK: MOV A,OLDBLK ;SAVE FOR DEBUGGING
|
||
TST -(A)
|
||
CMP A,#FS+2
|
||
BHIS .+4
|
||
BPT ;CAN'T TAKE THAT ONE BACK
|
||
MOV -2(A),T ;SIZE
|
||
BIT #INUSE,T
|
||
BNE .+4
|
||
BPT ;CAN'T FREE A BLOCK WHICH ISN'T IN USE
|
||
MOV (A),RETLAD ;IF NZ, NEXT BLOCK TO BE FREED
|
||
BIC #INUSE,T
|
||
BIT #INUSE,-4(A) ;IS BLOCK BELOW RESERVED
|
||
BNE RETBL1 ;YES, CHECK LOWER BOUND
|
||
SUB -4(A),A ;POINTS TO ENLARGED BLOCK
|
||
ADD T,-2(A) ;NEW SIZE
|
||
MOV A,T
|
||
ADD -2(A),T ;POINTS TO BLOCK ABOVE
|
||
MOV -2(A),-4(T) ;PUT MARKER AT TOP OF BLOCK
|
||
BIT #INUSE,-2(T)
|
||
BNE RTSPC2 ;BLOCK ABOVE RESERVED, GOOD BYE
|
||
ADD -2(T),-2(A) ;NEW SIZE OF MOBY BIG BLOCK
|
||
JSR PC,UNLINK ;TAKE THIS BLOCK OUT OF FREE LIST
|
||
MOV A,T ;MARK TOP OF ENLARGED BLOCK
|
||
ADD -2(A),T ;POINTS TO NEXT BLOCK
|
||
MOV -2(A),-4(T) ;MARK TOP OF BLOCK WITH SIZE
|
||
RTS PC
|
||
|
||
;BLOCK BELOW RESERVED, CHECK ABOVE
|
||
|
||
RETBL1: MOV T,-2(A) ;MARK THIS BLOCK AS FREE
|
||
ADD A,T ;POINTS TO NEXT BLOCK
|
||
MOV -2(A),-4(T) ;MARKER INTO TOP OF BLOCK
|
||
BIT #INUSE,-2(T)
|
||
BNE LINK ;BR IF BLOCK ABOVE RESERVED, PATCH THIS ONE BACK IN
|
||
JSR PC,UNLINK ;TAKE BLOCK ABOVE OUT OF FREE STORAGE
|
||
ADD -2(T),-2(A) ;NEW SIZE
|
||
MOV A,T
|
||
ADD -2(A),T ;POINTS TO NEXT BLOCK
|
||
MOV -2(A),-4(T) ;MARK TOP OF BLOCK
|
||
LINK: ;PATCH THIS IN AT AVAIL
|
||
CMP ROVER,A
|
||
BNE .+6
|
||
CLR ROVER
|
||
MOV AVAIL,T ;PREVIOUS BLOCK
|
||
MOV (T),TT ;NEXT BLOCK
|
||
MOV A,(T) ;FWD PNTR IN PREV BLK
|
||
MOV TT,(A) ;FWD PNTR IN THI BLK
|
||
MOV T,2(A) ;BACK PNTR IN THIS BLK
|
||
MOV A,2(TT) ;BACK PNTR IN NEXT BLK
|
||
RTSPC2: RTS PC
|
||
|
||
;MAIN PROGRAM LEVEL ROUTINE TO RETURN BLOCK AT INTERRUPT LEVEL
|
||
|
||
RETLIN: CMP #FAKEL,A
|
||
BEQ RETERR
|
||
TST A
|
||
BEQ RETERR
|
||
PUSH PS
|
||
MOV DSPSW,PS ;GO TO DISPLAY INTERRUPT LEVEL
|
||
MOV RETLAD,-BNXIDX(A) ;ADD LIST TO FRONT OF CHIAN
|
||
MOV A,RETLAD
|
||
;.IFNZ DLIMSW
|
||
; EMT ;IF DISP ISN'T RUNNING, FREE BLOCK ON DISBRK LEVEL
|
||
;.ENDC
|
||
.IFNZ DEBUG
|
||
IOT ;FAKE A DISPLAY INTERRUPT
|
||
.ENDC
|
||
POP PS
|
||
RTS PC
|
||
|
||
RETERR: BPT
|
||
.ENDC ;GT40P
|
||
|
||
.SBTTL TV CHARACTER DISPLAY ROUTINES
|
||
.IFNZ TVP
|
||
|
||
TVOMSK: BIC #177600,A ;HERE IF YOU DON'T TRUST THE HIGH BITS
|
||
TVO: JSR PC,GENCHR ;GENERATES CHARACTER AND ADVANCES CURSOR
|
||
;BY FALLING INTO LEDADC
|
||
;LEDADC ADVANCES LINE EDITOR CURSOR
|
||
;TAKES AND PRESERVES CHAR IN A
|
||
CFS::
|
||
LEDADC: TST PPPHS(U)
|
||
BGT LEDAD1
|
||
ADD #20,PPPHS(U) ;# BITS/WORD
|
||
ADD #2,PPCC(U) ;ADVANCE TO NEXT WORD IN DISPLAY
|
||
CMP PPCC(U),#TVCFENCE
|
||
BLOS LEDAD1
|
||
MOV #TVLO,PPCC(U)
|
||
LEDAD1: SUB #CHRWD,PPPHS(U)
|
||
INC PPCPOS(U)
|
||
RTS PC
|
||
|
||
;RETREATS LINE EDITOR CURSOR
|
||
|
||
BS::
|
||
LEDREC: TST PPCPOS(U)
|
||
BEQ LEDRE1
|
||
DEC PPCPOS(U)
|
||
ADD #CHRWD,PPPHS(U)
|
||
CMP #<20-CHRWD>,PPPHS(U)
|
||
BGE LEDRE1
|
||
SUB #20,PPPHS(U) ;BACKUP A WORD IN DISPLAY
|
||
SUB #2,PPCC(U)
|
||
CMP PPCC(U),#TVLO
|
||
BHIS LEDRE1
|
||
MOV #TVFENCE,PPCC(U)
|
||
LEDRE1: RTS PC
|
||
|
||
;TURN BLINKER OFF
|
||
BLKOFF: ZAPFLG BLKDFR
|
||
TST BLKPHS
|
||
BEQ 1$
|
||
JSR PC,XORCHR
|
||
CLR BLKPHS
|
||
1$: RTS PC
|
||
|
||
|
||
;CLOCK BREAK COMES HERE TO HACK BLINKER
|
||
CRSCLK: DEC BLKTIM
|
||
BGT 1$
|
||
TST BLKDFR
|
||
BNE 1$
|
||
TST BLKPHS
|
||
BNE 2$ ;ALWAYS TURN BLINKER OFF ON TIME
|
||
; TST LMHTTY ;THESE DAYS, TURN CURSOR ON ONLY IF IN DATAPOINT TO 10 MODE
|
||
; BNE 1$
|
||
TST CNHTTY
|
||
BNE 1$
|
||
2$: PUSH U
|
||
MOV #PPVAR,U
|
||
JSR PC,XORCHR
|
||
POP U
|
||
COM BLKPHS
|
||
MOV #15.,BLKTIM
|
||
1$: TST BELTIM
|
||
BEQ 4$
|
||
DEC BELTIM
|
||
BGT 4$
|
||
CLR BELTIM
|
||
JSR PC,BOWXOR
|
||
4$: RTS PC
|
||
|
||
BOWXOR: BIT #BOWBIT,TVCTL
|
||
BEQ 1$
|
||
BIC #BOWBIT,TVCTL
|
||
RTS PC
|
||
|
||
1$: BIS #BOWBIT,TVCTL
|
||
RTS PC
|
||
|
||
;COME HERE TO "DISPLAY" "FORMAT" CHARACTER ANYWAY
|
||
ALT: ASR A ;COMPENSATE FOR ASL DONE BEFORE DISPATCH
|
||
JMP TVO
|
||
|
||
;BELL, FLASH SCREEN
|
||
|
||
BELL: PUSH PS
|
||
MOV #300,PS ;PREVENT CLOCK BREAKS
|
||
TST BELTIM
|
||
BNE 1$ ;ONLY ONE BELL AT A TIME
|
||
MOV #20.,BELTIM
|
||
JSR PC,BOWXOR
|
||
1$: POP PS
|
||
RTS PC
|
||
|
||
FORMA1:: ;HERE TO IGNORE RANDOM CONTROL CHARS
|
||
TAB:: ;TAB NOT IMPLEM
|
||
RTS PC
|
||
|
||
MU: MOV CPOS,A
|
||
MOV CLINE,B
|
||
DEC B
|
||
BGT SXYJ
|
||
CLR B
|
||
SXYJ: JMP SETXY
|
||
|
||
HD: CLR A
|
||
MOV #CHRLN-1,B
|
||
BR SXYJ
|
||
|
||
;HERE FOR LINE FEED, NO FRILLS
|
||
|
||
LF: INC PPLINE(U)
|
||
ADD #<BYTPL*LINHT>,PPLCC(U)
|
||
ADD #<BYTPL*LINHT>,PPCC(U)
|
||
CMP #TVFENCE,PPLCC(U)
|
||
BHI LF1
|
||
CLR PPLINE(U)
|
||
SUB PPLCC(U),PPCC(U)
|
||
ADD #TVLO,PPCC(U)
|
||
MOV #TVLO,PPLCC(U)
|
||
LF1: RTS PC
|
||
|
||
;HERE FOR CARRIAGE RETURN
|
||
|
||
CR: MOV PPLCC(U),PPCC(U) ;ORIGIN OF THIS LINE
|
||
CR1: MOV #20-CHRWD,PPPHS(U) ;PHASE
|
||
CLR PPCPOS(U) ;CHAR POSN
|
||
RTS PC
|
||
;DATA POINT ROUTINES
|
||
|
||
;CLEARS TO END OF LINE
|
||
|
||
CLEOL: PUSH PPCC(U)
|
||
PUSH PPPHS(U)
|
||
PUSH PPCPOS(U)
|
||
JSR PC,CLEOL1 ;DO THE DIRTY WORK
|
||
CLEOX: POP PPCPOS(U)
|
||
POP PPPHS(U)
|
||
POP PPCC(U)
|
||
RTS PC
|
||
|
||
CLEOL1: CMP PPCPOS(U),#CHRPL-1
|
||
BGE CLEOLX ;ALREADY AT END OF LINE
|
||
CMP PPPHS(U),#20-CHRWD
|
||
BEQ CLEOL2 ;IF AT START OF WORD, START CLEARING WORD-WISE
|
||
JSR PC,CLRCHR ;ELSE CLEAR 1 CHAR AT A TIME TILL REACH WORD BOUNDARY.
|
||
JSR PC,LEDADC
|
||
BR CLEOL1
|
||
|
||
CLEOL2: MOV PPLCC(U),-(SP)
|
||
SUB PPCC(U),(SP)
|
||
ADD #BYTPL,(SP) ;# OF BYTES TO CLEAR
|
||
ASR (SP)
|
||
PUSH PPCC(U) ;ADDR OF 1ST WORD TO CLEAR,
|
||
PUSH #LINHT ;# LINES TO PROCESS
|
||
CLEOL3: MOV 2(SP),TVPTR ;START CLEARING HERE
|
||
BIC #VERINC,TVCTL ;HORIZONTAL INCREMENT MODE
|
||
MOV 4(SP),TT ;# WDS TO CLEAR
|
||
CLEOL4: CLR TVDATI
|
||
DEC TT
|
||
BNE CLEOL4
|
||
ADD #BYTPL,2(SP)
|
||
DEC (SP)
|
||
BGT CLEOL3
|
||
ADD #6,SP ;CLEANSE STACK
|
||
MOV TVPTR,PPCC(U)
|
||
BR CR1 ;RESET X AND PHASE
|
||
|
||
CLEOLX: MOV PPLCC(U),T
|
||
ADD #<LINHT*BYTPL>,T ;HERE IF ALREADY AT END OF LINE
|
||
MOV T,PPCC(U)
|
||
BR CR1
|
||
;DATA POINT ROUTINES CONTINUED
|
||
|
||
;CLEARS TO END OF SCREEN
|
||
|
||
CLEOF: PUSH PPCC(U)
|
||
PUSH PPPHS(U)
|
||
PUSH PPCPOS(U)
|
||
PUSH PPLCC(U)
|
||
TST PPCPOS(U) ;IF WE'RE AT THE LEFT MARGIN
|
||
BEQ CLEOF0 ;START DOING FAST LINE-BY-LINE CLEARING RIGHT AWAY.
|
||
JSR PC,CLEOL1 ;CLEAR TO END OF LINE FIRST
|
||
CLEOF0: MOV #TVHI+2,TT
|
||
SUB PPCC(U),TT
|
||
ASR TT ;# OF WDS REMAINING IN TV MEMORY
|
||
BEQ CLEOFX
|
||
MOV #TVDATI,T
|
||
BIC #VERINC,TVCTL ;HORIZONTAL INCREMENT MODE
|
||
CLEOF1: CLR (T)
|
||
DEC TT
|
||
BNE CLEOF1
|
||
CLEOFX: POP PPLCC(U)
|
||
BR CLEOX ;RESTORE ALL THAT OTHER STUFF
|
||
|
||
;HERE TO HOME UP
|
||
|
||
HU: MOV PPORG(U),PPCC(U) ;RESET MA
|
||
MOV PPORG(U),PPLCC(U)
|
||
CLR PPCPOS(U)
|
||
CLR PPLINE(U)
|
||
BR CR1 ;SET CHARACTER PHASE AND X
|
||
;MULTIPLY, DIVIDE SUBROUTINES, BORROWED FROM TRANTOR
|
||
|
||
R0==%0 ;for some reason they like funny names for ACs
|
||
R1==%1
|
||
R2==%2
|
||
R3==%3
|
||
R4==%4
|
||
R5==%5
|
||
|
||
.MACRO SOB R,D
|
||
DEC R
|
||
BNE D
|
||
.ENDM SOB
|
||
|
||
;.sbttl Register save/restore routines
|
||
|
||
; SAVE6 routine saves R0 through R5 on stack, R0 at top:
|
||
; SP -> R0
|
||
; R1
|
||
; R2
|
||
; R3
|
||
; R4
|
||
; R5
|
||
; Call by JSR R5,SAVE6. Restore regs by REST6 routine.
|
||
|
||
save6: push r4 ; R5 already on stack by JSR.
|
||
push r3
|
||
push r2
|
||
push r1
|
||
push r0
|
||
jmp (r5) ; return.
|
||
|
||
|
||
; SAVE5 is similar to SAVE6, but only saves r0-r4, thus leaving r5
|
||
; as a return ptr for JSR R5,FOO calls. Call with "JSR R4,SAVE5".
|
||
|
||
save5: push r3 ; R4 on stack from JSR.
|
||
push r2
|
||
push r1
|
||
push r0
|
||
jmp (r4)
|
||
|
||
|
||
; REST6 routine restores R0 through R5 from stack, where
|
||
; R0 is considered to be the top word of the stack (which is
|
||
; how SAVE6 pushes the registers). Call by JSR R5,REST6.
|
||
; REST6 returns with the 6 words popped off the stack.
|
||
|
||
rest6: tst (sp)+ ; forget old R5 contents.
|
||
pop r0 ; restore other regs.
|
||
pop r1
|
||
pop r2
|
||
pop r3
|
||
pop r4
|
||
rts r5 ; return and restore R5.
|
||
|
||
; Same as above, except used for restoring SAVE5 calls.
|
||
; Call with "JSR R4,REST5".
|
||
|
||
rest5: tst (sp)+ ; forget old R4 contents.
|
||
pop r0 ; restore regs
|
||
pop r1
|
||
pop r2
|
||
pop r3
|
||
rts r4 ; and return
|
||
|
||
; .sbttl Flow of control macros
|
||
|
||
;IF macro: Generates code that executes the if clause
|
||
;if the specified conditon is true, the else clause if
|
||
;it is false. The else clause is not required. Example:
|
||
; if eq,< mov r0,r1
|
||
; mov (r1)+,r2 >
|
||
; else < jsr pc,foo >
|
||
|
||
.macro if cond,code
|
||
.nlist
|
||
gncnt===gncnt+1
|
||
.irp foo,\gncnt
|
||
.iif p1, .word 0
|
||
.else
|
||
%.itmp===<g'foo-<.+2>>/2
|
||
.iif gt %.itmp-377, .err Branch out of range
|
||
.iif lt %.itmp+377, .err Branch out of range
|
||
.iif eq <b'cond>&400, <b'cond>+%.itmp+400
|
||
.ielse <b'cond>+%.itmp-400
|
||
.endc
|
||
code
|
||
g'foo===.
|
||
ifcnt===foo
|
||
.endm .irp
|
||
.list
|
||
.endm if
|
||
|
||
.macro else code
|
||
gncnt===gncnt+1
|
||
.irp foo,\ifcnt
|
||
.irp bar,\gncnt
|
||
br g'bar
|
||
g'foo===.
|
||
code
|
||
g'bar===.
|
||
.endm
|
||
.endm
|
||
.endm else
|
||
|
||
gncnt===777 ;gensym count.
|
||
|
||
|
||
;LOOP macro allows loops without labels. Use RPTL and EXITL
|
||
;to repeat loop and exit loop. Both take branch condition arguments.
|
||
;If condition arg is null, then BR is used, i.e. unconditional.
|
||
;End of CODE falls out of loop unless specific RPTL is used.
|
||
|
||
;Example of LOOP macro:
|
||
;loop < cmpb r0,(r1)+ ;found char yet?
|
||
; exitl eq ;exit loop on equal.
|
||
; inc r2 ;not found.
|
||
; cmp r2,r5 ;too many?
|
||
; rptl lt ;no, keep going.
|
||
; jmp error ;too many.
|
||
; >
|
||
; ;EXITL comes here.
|
||
|
||
;Loop defines two lables around the code argument,
|
||
;the first for looping back via the RPTL macro, the
|
||
;second for exiting the loop via the EXITL macro.
|
||
;Labels are of the form %Lnv or %Xnv where n signifies
|
||
;that this is the nth use of the LOOP macro, and v is
|
||
;the level of nesting of this loop macro. Up to 7
|
||
;levels of nesting are allowed.
|
||
%level===0
|
||
%loopn===0
|
||
.macro loop code
|
||
.iif eq %level, %loopn===%loopn+1
|
||
%level===%level+1
|
||
.if gt <10*%loopn>+%level-7777
|
||
.error Too many loops and/or nestings.
|
||
.mexit
|
||
.endc
|
||
.if gt %level-7
|
||
.error Too many loop nestings (7 allowed).
|
||
.mexit
|
||
.endc
|
||
.irp n,\<<10*%loopn>+%level>
|
||
%l'n===. ;loop back to here.
|
||
code
|
||
%x'n===. ;exit to here.
|
||
.endm .irp
|
||
%level===%level-1
|
||
.endm loop
|
||
|
||
.macro rptl cond
|
||
.if eq %level
|
||
.error RPTL not inside LOOP
|
||
.mexit
|
||
.endc
|
||
.irp n,\<<10*%loopn>+%level>
|
||
.iif b cond, br %l'n ;loop back.
|
||
.ielse b'cond %l'n
|
||
.endm .irp
|
||
.endm rptl
|
||
|
||
; SORL expands into a SOB instruction back to the last LOOP
|
||
; point. SORL takes one arg, a register to use with the SOB
|
||
; instruction.
|
||
.macro sorl r
|
||
.if eq %level
|
||
.error SORL not inside LOOP
|
||
.mexit
|
||
.endc
|
||
.irp n,\<<10*%loopn>+%level>
|
||
sob r,%l'n
|
||
.endm .irp
|
||
.endm sorl
|
||
|
||
|
||
.macro exitl cond
|
||
.if eq %level
|
||
.error EXITL not inside LOOP
|
||
.mexit
|
||
.endc
|
||
.irp n,\<<10*%loopn>+%level>
|
||
.iif b cond, br %x'n ;exit.
|
||
.ielse b'cond %x'n
|
||
.endm .irp
|
||
.endm exitl
|
||
|
||
;.sbttl Multiply, Divide, Base-conversion
|
||
|
||
;.if eq pdp11-10
|
||
|
||
; DIV2 divides a double word quantity by a single word
|
||
; quantity yielding a quotient and remainder. It is meant
|
||
; to simulate the DIV instruction found on reasonable 11s.
|
||
|
||
; ARGS: VALS:
|
||
; SP -> divisor SP -> quotient
|
||
; dividend lo remainder
|
||
; dividend hi
|
||
|
||
div2: jsr r4,save5 ; save regs
|
||
mov 20(sp),r0 ; dividend hi
|
||
mov 16(sp),r1 ; divident lo
|
||
mov 14(sp),r2 ; divisor
|
||
if mi,< neg r2 ; negate divisor and dividend
|
||
com r0 ; double word negate
|
||
neg r1 ; ...
|
||
adc r0 > ; ...
|
||
clr r3
|
||
mov #16.,r4
|
||
loop < asl r3
|
||
rol r1
|
||
rol r0
|
||
cmp r2,r0
|
||
if le,< sub r2,r0
|
||
inc r3 >
|
||
sorl r4
|
||
>
|
||
mov r0,20(sp)
|
||
mov r3,16(sp)
|
||
jsr r4,rest5
|
||
pop (sp)
|
||
rts r5
|
||
|
||
|
||
|
||
; Multiply routine, args and vals each 1 word.
|
||
|
||
; ARGS: VALS:
|
||
; SP -> A SP -> P (product)
|
||
; B
|
||
|
||
mul1: jsr r5,save6 ; save registers r0-r5.
|
||
mov 16(sp),r1 ; first arg.
|
||
mov 20(sp),r2 ; second arg.
|
||
clr 20(sp) ; where result will go.
|
||
loop < tst r2 ; done?
|
||
exitl eq ; yes, exit the loop.
|
||
ror r2 ; no, get next bit in arg2.
|
||
if cs,< add r1,20(sp) > ; if bit is 1 then add arg1 into result
|
||
asl r1 ; then mult arg1 by 2.
|
||
rptl ; and repeat.
|
||
>
|
||
jsr r5,rest6 ; restore regs.
|
||
mov (sp)+,(sp) ; pop R5 down one word.
|
||
rts r5 ; return with result on stack.
|
||
;.endc
|
||
;DATA POINT ROUTINES CONTINUED
|
||
|
||
CSRPOS: JSR PC,TVPREP
|
||
|
||
;HERE TO SET CURSOR GIVEN A DATAPOINT COORDINATE PAIR (X,Y)
|
||
;X AND Y ARE IN A AND B RESPECTIVELY, (0,0) IS UPPER LEFTHAND CORNER
|
||
;(1,3) IS THE SECOND CHARACTER OF FOURTH LINE
|
||
|
||
SETXY: CMP #CHRPL,A ;CHECK FOR LEGAL POSITION
|
||
BLOS SETXY1
|
||
CMP #CHRLN,B
|
||
BLOS SETXY1
|
||
SETXY0: MOV B,PPLINE(U)
|
||
MOV A,PPCPOS(U)
|
||
MOV B,-(SP) ;Y POSITION
|
||
MOV #BYTPL*LINHT,-(SP) ;FIND ORIGIN OF LINE IN MEMORY
|
||
JSR 5,MUL1
|
||
MOV (SP),PPLCC(U)
|
||
MOV (SP)+,PPCC(U)
|
||
CLR -(SP) ;FOR DIVIDE LATER
|
||
MOV A,-(SP) ;X POSITION
|
||
MOV #CHRWD,-(SP)
|
||
JSR 5,MUL1 ;PUSH #BITS FROM LEFT OF SCREEN
|
||
MOV #20,-(SP)
|
||
JSR 5,DIV2
|
||
MOV (SP)+,T ;QUOTIENT
|
||
ASL T ;BYTES FROM BEGIN OF LINE
|
||
ADD T,PPCC(U)
|
||
MOV #20-CHRWD,T ;PHASE OF LEFT EDGE OF WORD
|
||
BIT #1,(SP)
|
||
BEQ 1$
|
||
BPT ;DIVIDE BIT THE BAG?
|
||
1$: SUB (SP)+,T ;REMAINDER
|
||
MOV T,PPPHS(U) ;SET PHASE
|
||
CMP PPORG(U),#TVLO
|
||
BEQ .+4
|
||
BPT ;NOT PREPARED TO HANDLE THAT PROBLEM
|
||
ADD PPORG(U),PPCC(U)
|
||
ADD PPORG(U),PPLCC(U)
|
||
BIT #1,PPCC(U) ;MAKE SURE IT LINES UP ON WORD BOUNDARY
|
||
BEQ .+4
|
||
BPT
|
||
SETXY1: RTS PC
|
||
|
||
;SAVE ALL ACS ON STACK
|
||
|
||
ACSAVE: PUSH TT
|
||
PUSH T
|
||
PUSH C
|
||
PUSH B
|
||
PUSH A
|
||
PUSH U ;RETURN ADDRESS
|
||
MOV 14(SP),U ;RESTORE U
|
||
RTS PC
|
||
.SBTTL CHARACTER GENERATOR ROUTINES
|
||
|
||
;ROUTINES TO GENERATE A CHARACTER
|
||
;CALL WITH CHARACTER IN A AND PAGE PRINTER IN U
|
||
;PRESERVES ALL ACS
|
||
|
||
;IOR CHARACTER AT CURSOR
|
||
|
||
GENCHR: JSR U,ACSAVE
|
||
MOV PPPHS(U),C
|
||
MOV PPCC(U),TVPTR
|
||
ASL A ;MAKE IT A BYTE OFFSET
|
||
MOV CTAB(A),T ;POINTS AT FONT DESCRIPTION
|
||
JSR PC,GENCH1
|
||
ACREST: POP A
|
||
POP B
|
||
POP C
|
||
POP T
|
||
POP TT
|
||
POP U
|
||
CRTSPC: RTS PC
|
||
|
||
;CLEARS CHARACTER AT LINE EDITOR CURSOR
|
||
|
||
CLRCHR: JSR U,ACSAVE
|
||
MOV CTAB+<177*2>,T ;RUBOUT MASKS ENTIRE CHARACTER
|
||
MOV PPPHS(U),C
|
||
MOV PPCC(U),TVPTR
|
||
JSR PC,CLRCH1
|
||
BR ACREST
|
||
|
||
;BLINK CHARACTER AT CURSOR
|
||
|
||
XORCHR: JSR U,ACSAVE
|
||
MOV CTAB+<177*2>,T ;RUBOUT MASKS ENTIRE CHARACTER
|
||
MOV PPPHS(U),C
|
||
MOV PPCC(U),TVPTR
|
||
JSR PC,XORCH1
|
||
BR ACREST
|
||
|
||
;ARRAY OF ROUTINES TO SHIFT B LEFT SPECIFIED AMOUNT
|
||
;ONLY EVEN INDICES WILL BE USED SINCE CHAR WIDTH AND WORD WIDTH BOTH EVEN
|
||
;INCOMING MASK IN B IS KNOWN TO BE 0 EXCEPT IN BOTTOM 5 BITS, WHICH HELPS
|
||
SHLTAB: SHL0
|
||
SHL2
|
||
SHL4
|
||
SHL6
|
||
SHL8
|
||
SHL10
|
||
SHL12
|
||
SHL14
|
||
|
||
SHL14: ROR B
|
||
ROR B
|
||
ROR B
|
||
BIC #37777,B
|
||
RTS PC
|
||
|
||
SHL10: ASL B
|
||
ASL B
|
||
SHL8: SWAB B
|
||
RTS PC
|
||
|
||
SHL12: SWAB B
|
||
SHL4: ASL B
|
||
ASL B
|
||
SHL2: ASL B
|
||
ASL B
|
||
SHL0: RTS PC
|
||
|
||
;ARRAY OF ROUTINES TO SHIFT B RIGHT SPECIFIED AMOUNT
|
||
;ONLY NEED EVEN AMOUNTS LESS THAN GRID WIDTH (I.E. -2, -4)
|
||
|
||
SHR4
|
||
SHR2
|
||
SHRTAB:: ;INDEXED NEGATIVELY
|
||
|
||
SHL6: SWAB B
|
||
SHR2: ASR B
|
||
ASR B
|
||
RTS PC
|
||
|
||
SHR4: ASR B
|
||
ASR B
|
||
ASR B
|
||
ASR B
|
||
RTS PC
|
||
|
||
.MACRO CGEN OP ;OP IS GEN, CLR, OR XOR
|
||
;The lowest level character generator
|
||
;AC use (CLOBBERS ALL)
|
||
|
||
;A temp
|
||
;B bit raster
|
||
;C number of desired shifts
|
||
;T points into font description
|
||
;TT counts lines
|
||
;U -
|
||
;Called with TVPTR already set up from PPCC
|
||
|
||
;THIS ROUTINE CLOBBERS -ALL- ACS
|
||
|
||
OP'CH1: BIS #VERINC,TVCTL ;USE VERTICAL INCREMENT MODE
|
||
TST C ;CHECK SHIFT COUNT
|
||
BLT OP'OVRL ;OVERLAP CASE
|
||
MOV SHLTAB(C),C ;EASY CASE, GET PTR TO SHIFT ROUTINE
|
||
OP'EZCS:MOV #CHRHT,TT ;LINE COUNTER
|
||
OP'CGLP:MOVB (T)+,B ;CHARACTER RASTER LINE INTO B
|
||
JSR PC,(C) ;SHIFT IT
|
||
.LIF IDN OP,GEN
|
||
BIS B,TVDATI ;IOR INTO TV MEMORY AND BUMP TVPTR
|
||
.LIF IDN OP,CLR
|
||
BIC B,TVDATI ;ANDCA ..
|
||
.IF IDN OP,XOR
|
||
MOV B,A ;NO XOR INSN ON MACHINE
|
||
BIC TVDAT,A
|
||
BIC B,TVDAT
|
||
BIS A,TVDATI
|
||
.ENDC
|
||
DEC TT ;LOOP. NOT WORTH OPEN-CODING SINCE
|
||
BNE OP'CGLP ;SHIFT ROUTINES ARE SO SLOW ANYWAY AND
|
||
RTS PC ;WE'RE TIGHT ON CORE.
|
||
|
||
;Character overlaps word boundaries. Do first column
|
||
;then transfer back to EZCS to do second column.
|
||
|
||
OP'OVRL:PUSH C
|
||
MOV SHRTAB(C),C ;routine to shift right
|
||
JSR PC,OP'EZCS ;generate first column
|
||
SUB #CHRHT,T ;restore T
|
||
SUB #<CHRHT*BYTPL>-2,TVPTR ;point to top of second column
|
||
POP C
|
||
MOV SHLTAB+20(C),C ;SHIFT LEFT ROUTINE
|
||
BR OP'EZCS ;DO SECOND COLUMN
|
||
.ENDM CGEN
|
||
|
||
;ASSEMBLE 3 FLAVORS OF CHARACTER GENERATOR
|
||
|
||
CGEN GEN
|
||
CGEN XOR
|
||
CGEN CLR
|
||
|
||
RTSPC: RTS PC
|
||
.SBTTL KEYBOARD TABLES
|
||
.IFNZ KBDP
|
||
|
||
.MACRO KBDKEY N,PLAIN,SH,SL,SLSH,TOP
|
||
.XLIST
|
||
.=XTAB+N
|
||
.BYTE PLAIN
|
||
.=XTAB+N+100
|
||
.BYTE SH
|
||
.=XTAB+N+200
|
||
.BYTE SL
|
||
.=XTAB+N+300
|
||
.BYTE SLSH
|
||
.=XTAB+N+400
|
||
.BYTE TOP
|
||
.LIST
|
||
.ENDM
|
||
|
||
;WHAT FOLLOWS IS THE GRAND CHARACTER CONVERSION TABLE
|
||
|
||
;AN 8 BIT QUANTITY IS USED TO INDEX INTO THE XTAB
|
||
; 0-5 KEYBOARD KEY NUMBER
|
||
; 6 SHIFT
|
||
; 7 SHIFT LOCK
|
||
; 8 TOP (6 AND 7 GUARANTEED TO BE ZERO)
|
||
|
||
;IF THE BYTE PICKED IS NEGATIVE, YOU HAVE STRUCK A KEY THAT DOES NOT
|
||
;HAVE AN ASCII CODE. THESE CODES ARE ASSIGNED AS FOLLOWS:
|
||
|
||
NASCTB: NONAS1 ; 0 ILLEGAL
|
||
RTSPC ; -1 BREAK
|
||
ESCAPE ; -2 ESCAPE
|
||
CALL ; -3 CALL
|
||
RTSPC ; -4 CLEAR
|
||
RTSPC ; -5 CAP DELTA
|
||
RTSPC ; -6 CIRCLE MINUS
|
||
RTSPC ; -7 DEL
|
||
RTSPC ; -10 CIRCLE PLUS
|
||
RTSPC ; -11 BACK
|
||
RTSPC ; -12 NEXT
|
||
RTSPC ; -13 HELP
|
||
RTSPC ; -14 BACK SPACE
|
||
MAXNAS==<<.-NASCTB>/2>-1 ;MAXIMUM # NON-ASCII CHARACTERS
|
||
|
||
;GOODIES TO PRINT TO REPRESENT META BITS
|
||
|
||
METATB: .BYTE 0,2,3,6 ;NOTHING, ALPHA, BETA, EPSILON
|
||
.EVEN
|
||
|
||
|
||
; CHAR NORMAL SHIFT LOCK SHIFT&LOCK TOP
|
||
|
||
XTAB:
|
||
KBDKEY 0, -1, -1, -1, -1, -1 ;BREAK
|
||
KBDKEY 1, -2, -2, -2, -2, -2 ;ESCAPE
|
||
KBDKEY 2, '1, '!, '1, '!, '!
|
||
KBDKEY 3, '2, '", '2, '", '"
|
||
KBDKEY 4, '3, '#, '3, '#, '#
|
||
KBDKEY 5, '4, '$, '4, '$, '$
|
||
KBDKEY 6, '5, '%, '5, '%, '%
|
||
KBDKEY 7, '6, '&, '6, '&, '&
|
||
KBDKEY 10, '7, '', '7, '', ''
|
||
KBDKEY 11, '8, '(, '8, '(, '(
|
||
KBDKEY 12, '9, '), '9, '), ')
|
||
KBDKEY 13, '0, '_, '0, '_, '_
|
||
KBDKEY 14, '-, '=, '-, '=, '=
|
||
KBDKEY 15, '@, '`, '@, '`, '`
|
||
KBDKEY 16, '^, '~, '^, '~, '~
|
||
KBDKEY 17, 10, 10, 10, 10, 10 ;BACK SPACE
|
||
KBDKEY 20, -3, -3, -3, -3, -3 ;CALL
|
||
KBDKEY 21, -4, -4, -4, -4, -4 ;CLEAR
|
||
KBDKEY 22, 11, 11, 11, 11, 11 ;TAB
|
||
KBDKEY 23, 33, 33, 33, 33, 33 ;ALT-MODE
|
||
KBDKEY 24, 'q, 'Q, 'Q, 'Q, 4, ;and
|
||
KBDKEY 25, 'w, 'W, 'W, 'W, 37 ;or
|
||
KBDKEY 26, 'e, 'E, 'E, 'E, 22 ;intersection
|
||
KBDKEY 27, 'r, 'R, 'R, 'R, 23 ;union
|
||
KBDKEY 30, 't, 'T, 'T, 'T, 20 ;subset
|
||
KBDKEY 31, 'y, 'Y, 'Y, 'Y, 21 ;superset
|
||
KBDKEY 32, 'u, 'U, 'U, 'U, 5 ;not
|
||
KBDKEY 33, 'i, 'I, 'I, 'I, 26 ;xor
|
||
KBDKEY 34, 'o, 'O, 'O, 'O, 1 ;down arrow
|
||
KBDKEY 35, 'p, 'P, 'P, 'P, 13 ;up arrow
|
||
KBDKEY 36, '[, '{, '[, '{, '{
|
||
KBDKEY 37, '], '}, '], '}, '}
|
||
KBDKEY 40, '\, '|, '\, '|, '|
|
||
KBDKEY 41, '/, 16, '/, 16, 16 ;infinity
|
||
KBDKEY 42, -6, -5, -6, -5, -5 ;circle minus, cap delta
|
||
KBDKEY 43, -10, -7, -10, -7, -7 ;circle plus, cap del
|
||
KBDKEY 44, 14, 14, 14, 14, 14 ;form
|
||
KBDKEY 45, 13, 13, 13, 13, 13 ;vertical tab
|
||
KBDKEY 46, 177, 177, 177, 177, 177 ;rubout
|
||
KBDKEY 47, 'a, 'A, 'A, 'A, 34 ;.leq.
|
||
KBDKEY 50, 's, 'S, 'S, 'S, 35 ;.geq
|
||
KBDKEY 51, 'd, 'D, 'D, 'D, 36 ;equivalence
|
||
KBDKEY 52, 'f, 'F, 'F, 'F, 17 ;delta (partial derivative)
|
||
KBDKEY 53, 'g, 'G, 'G, 'G, 32 ;not equals
|
||
KBDKEY 54, 'h, 'H, 'H, 'H, -13 ;HELP!!!!!
|
||
KBDKEY 55, 'j, 'J, 'J, 'J, 30 ;back arrow
|
||
KBDKEY 56, 'k, 'K, 'K, 'K, 31 ;forward arrow
|
||
KBDKEY 57, 'l, 'L, 'L, 'L, 27 ;both ways arrow
|
||
KBDKEY 60,<';>, '+,<';>, '+, '+
|
||
KBDKEY 61, ':, '*, ':, '*, '*
|
||
KBDKEY 62, 15, 15, 15, 15, 15 ;carriage return
|
||
KBDKEY 63, 12, 12, 12, 12, 12 ;line feed
|
||
KBDKEY 64, 37, 37, 37, 37, 37 ;next, back gives ^_
|
||
;KBDKEY 64, -12, -11, -12, -11, -11 ;next, back
|
||
KBDKEY 65, 'z, 'Z, 'Z, 'Z, 2 ;alpha
|
||
KBDKEY 66, 'x, 'X, 'X, 'X, 3 ;beta
|
||
KBDKEY 67, 'c, 'C, 'C, 'C, 6 ;epsilon
|
||
KBDKEY 70, 'v, 'V, 'V, 'V, 10 ;lambda
|
||
KBDKEY 71, 'b, 'B, 'B, 'B, 7 ;pi
|
||
KBDKEY 72, 'n, 'N, 'N, 'N, 24 ;for all
|
||
KBDKEY 73, 'm, 'M, 'M, 'M, 25 ;there exists
|
||
KBDKEY 74,<',>, '<,<',>, '<, '<
|
||
KBDKEY 75, '., '>, '., '>, '>
|
||
KBDKEY 76, '/, '?, '/, '?, '?
|
||
KBDKEY 77, 40, 40, 40, 40, 40 ;space
|
||
.ENDC ;KBDP
|
||
.SBTTL FONT MACROS AND DEFINITION
|
||
|
||
.IIF E FONTSW,CTAB==0
|
||
.IF NE FONTSW
|
||
FNTORG==.
|
||
.MACRO CTBENT A
|
||
.XCREF ...'A
|
||
...'A
|
||
.ENDM
|
||
|
||
CTAB: .REPT 200
|
||
CTBENT \.RPCNT
|
||
.ENDR
|
||
|
||
.MACRO FONT A
|
||
....==0
|
||
...==1_GRIDWD
|
||
|
||
.IRPC CHR,A
|
||
...==..._<-1>
|
||
.IF NB CHR
|
||
....==....!...
|
||
.ENDC
|
||
.ENDM
|
||
|
||
.IF NE ...-1
|
||
ERROR \CURCHR
|
||
.ENDC
|
||
|
||
;...FOO==%XLIST
|
||
;.REPT ...FOO
|
||
;.LIST
|
||
;.ENDR
|
||
.BYTE ....
|
||
;.XLIST
|
||
;%XLIST=...FOO
|
||
.ENDM
|
||
|
||
.MACRO CDEF A
|
||
CURCHR==''A
|
||
CDEF1 \CURCHR
|
||
.ENDM
|
||
|
||
.MACRO CDEF1 A
|
||
;.XCREF ...'A
|
||
CURCHR==A
|
||
;...FOO==%XLIST
|
||
;.REPT ...FOO
|
||
;.LIST
|
||
;.ENDR
|
||
...'A==.
|
||
;.XLIST
|
||
;%XLIST=...FOO
|
||
.ENDM
|
||
|
||
.MACRO ERROR NUM
|
||
.IF1
|
||
.ERROR ;FONT LOSSAGE NUM
|
||
.ENDC
|
||
.ENDM
|
||
.ENDC
|
||
.XLIST
|
||
.IF NE FONTSW
|
||
.IF NE FONTMS
|
||
.XCREF CURCHR,FONT,CDEF1,CDEF
|
||
|
||
CDEF1 0
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 1
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <* * *>
|
||
FONT < *** >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 2
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ** *>
|
||
FONT <* * >
|
||
FONT <* * >
|
||
FONT <* * >
|
||
FONT < ** *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 3
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT <* >
|
||
FONT <* >
|
||
|
||
CDEF1 4
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * * >
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 5
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < *>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 6
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < * >
|
||
FONT < *** >
|
||
FONT < * >
|
||
FONT < ** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 7
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 10
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * * >
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 11
|
||
FONT <*** >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < * *>
|
||
FONT < ** >
|
||
FONT < * *>
|
||
FONT < ** >
|
||
|
||
CDEF1 12
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <*** >
|
||
FONT < >
|
||
FONT < ***>
|
||
FONT < * >
|
||
FONT < ** >
|
||
FONT < * >
|
||
FONT < >
|
||
|
||
CDEF1 13
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < *** >
|
||
FONT <* * *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 14
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 15
|
||
FONT < *** >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT < * *>
|
||
FONT < *** >
|
||
FONT < * *>
|
||
FONT < * *>
|
||
|
||
CDEF1 16
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * * >
|
||
FONT <* * *>
|
||
FONT <* * *>
|
||
FONT < * * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 17
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < * >
|
||
FONT < *>
|
||
FONT < ****>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 20
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ****>
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT < ****>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 21
|
||
FONT < >
|
||
FONT < >
|
||
FONT <**** >
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT <**** >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 22
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 23
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 24
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <*****>
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 25
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < ****>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 26
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <** **>
|
||
FONT <* * *>
|
||
FONT <** **>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 27
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
|
||
CDEF1 30
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 31
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 32
|
||
FONT < >
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT <* >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 33
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * * >
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 34
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 35
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 36
|
||
FONT < >
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 37
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <!>
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <">
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <#>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * * >
|
||
FONT <*****>
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT <*****>
|
||
FONT < * * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <$>
|
||
FONT < * >
|
||
FONT < *** >
|
||
FONT <* * *>
|
||
FONT <* * >
|
||
FONT < *** >
|
||
FONT < * *>
|
||
FONT <* * *>
|
||
FONT < *** >
|
||
FONT < * >
|
||
FONT < >
|
||
|
||
CDEF <%>
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT <** *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <* **>
|
||
FONT <* **>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <&>
|
||
FONT < >
|
||
FONT < * >
|
||
FONT <* * >
|
||
FONT <* * >
|
||
FONT < * >
|
||
FONT <* * *>
|
||
FONT <* * >
|
||
FONT < ** *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <'>
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT <** >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <(>
|
||
FONT < >
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <)>
|
||
FONT < >
|
||
FONT <* >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <* >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <*>
|
||
FONT < >
|
||
FONT < * >
|
||
FONT <* * *>
|
||
FONT < *** >
|
||
FONT < * >
|
||
FONT < *** >
|
||
FONT <* * *>
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <+>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <,>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT <** >
|
||
FONT < >
|
||
|
||
CDEF <->
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <.>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF </>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <* >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 0
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* **>
|
||
FONT <* * *>
|
||
FONT <** *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 1
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < ** >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 2
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 3
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT < *>
|
||
FONT < ** >
|
||
FONT < *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 4
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < ** >
|
||
FONT < * * >
|
||
FONT <* * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 5
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT <* >
|
||
FONT <**** >
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 6
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < * >
|
||
FONT <* >
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 7
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 8
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF 9
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < ****>
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT < ** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <:>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <;>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT <** >
|
||
FONT < >
|
||
|
||
CDEF1 74
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <=>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 76
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <?>
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <@>
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* ***>
|
||
FONT <* * *>
|
||
FONT <* ***>
|
||
FONT <* >
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF A
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <*****>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF B
|
||
FONT < >
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF C
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF D
|
||
FONT < >
|
||
FONT <**** >
|
||
FONT < * *>
|
||
FONT < * *>
|
||
FONT < * *>
|
||
FONT < * *>
|
||
FONT < * *>
|
||
FONT <**** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF E
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <**** >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF F
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <**** >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF G
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* **>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF H
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <*****>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF I
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF J
|
||
FONT < >
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF K
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* * >
|
||
FONT <* * >
|
||
FONT <** >
|
||
FONT <* * >
|
||
FONT <* * >
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF L
|
||
FONT < >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF M
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <** **>
|
||
FONT <* * *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF N
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <** *>
|
||
FONT <* * *>
|
||
FONT <* **>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF O
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF P
|
||
FONT < >
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF Q
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* * *>
|
||
FONT <* * >
|
||
FONT < ** *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF R
|
||
FONT < >
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT <* * >
|
||
FONT <* * >
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF S
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* >
|
||
FONT < *** >
|
||
FONT < *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF T
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF U
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF V
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF W
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* * *>
|
||
FONT <** **>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF X
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < * * >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF Y
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF Z
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT <* >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <[>
|
||
FONT < ***>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < ***>
|
||
FONT < >
|
||
|
||
CDEF <\>
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < *>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <]>
|
||
FONT <*** >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*** >
|
||
FONT < >
|
||
|
||
CDEF <^>
|
||
FONT < * >
|
||
FONT < * * >
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF <_>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <*****>
|
||
|
||
CDEF <`>
|
||
FONT < ** >
|
||
FONT < ** >
|
||
FONT < **>
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF a
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT < *>
|
||
FONT < ****>
|
||
FONT <* *>
|
||
FONT < ****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF b
|
||
FONT < >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF c
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT < ****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF d
|
||
FONT < >
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < ****>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < ****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF e
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT <* >
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF f
|
||
FONT < >
|
||
FONT < ** >
|
||
FONT < * *>
|
||
FONT < * >
|
||
FONT <*** >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF g
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < ****>
|
||
FONT < *>
|
||
FONT < *** >
|
||
|
||
CDEF h
|
||
FONT < >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF i
|
||
FONT < >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF j
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *>
|
||
FONT < >
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT < *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
|
||
CDEF k
|
||
FONT < >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* *>
|
||
FONT <* * >
|
||
FONT <*** >
|
||
FONT <* * >
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF l
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF m
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <** * >
|
||
FONT <* * *>
|
||
FONT <* * *>
|
||
FONT <* * *>
|
||
FONT <* * *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF n
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* ** >
|
||
FONT <** *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF o
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF p
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <**** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <**** >
|
||
FONT <* >
|
||
FONT <* >
|
||
|
||
CDEF q
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < *** >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < ****>
|
||
FONT < *>
|
||
FONT < *>
|
||
|
||
CDEF r
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* ** >
|
||
FONT <** *>
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT <* >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF s
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < ****>
|
||
FONT <* >
|
||
FONT < *** >
|
||
FONT < *>
|
||
FONT <**** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF t
|
||
FONT < >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < **>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF u
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < *** >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF v
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF w
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* * *>
|
||
FONT <* * *>
|
||
FONT < * * >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF x
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < * * >
|
||
FONT <* *>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF y
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT <* *>
|
||
FONT < * * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <* >
|
||
|
||
CDEF z
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT <*****>
|
||
FONT < * >
|
||
FONT < *** >
|
||
FONT < * >
|
||
FONT <*****>
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 173
|
||
FONT < *>
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < *>
|
||
FONT < >
|
||
|
||
CDEF1 174
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
|
||
CDEF1 175
|
||
FONT <* >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT < * >
|
||
FONT <* >
|
||
FONT < >
|
||
|
||
CDEF1 176
|
||
FONT < ** *>
|
||
FONT <* ** >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
FONT < >
|
||
|
||
CDEF1 177
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
FONT <*****>
|
||
.ENDC ;.IF NE FONTMS
|
||
.IF E FONTMS
|
||
...0==.
|
||
.BYTE 140,140,140,140,140,140,140,140,140,140
|
||
...1==.
|
||
.BYTE 000,004,004,004,004,025,016,004,000,000
|
||
...2==.
|
||
.BYTE 000,000,000,015,022,022,022,015,000,000
|
||
...3==.
|
||
.BYTE 000,000,000,016,021,036,021,036,020,020
|
||
...4==.
|
||
.BYTE 000,000,000,004,012,021,000,000,000,000
|
||
...5==.
|
||
.BYTE 000,000,000,000,037,001,000,000,000,000
|
||
...6==.
|
||
.BYTE 000,000,000,006,010,016,010,006,000,000
|
||
...7==.
|
||
.BYTE 000,000,000,037,012,012,012,012,000,000
|
||
...10==.
|
||
.BYTE 000,000,020,020,010,004,012,021,000,000
|
||
...11==.
|
||
.BYTE 034,010,010,010,000,006,005,006,005,006
|
||
...12==.
|
||
.BYTE 020,020,020,034,000,007,004,006,004,000
|
||
...13==.
|
||
.BYTE 000,004,016,025,004,004,004,004,000,000
|
||
...14==.
|
||
.BYTE 000,004,004,037,004,004,037,000,000,000
|
||
...15==.
|
||
.BYTE 016,020,020,016,000,016,011,016,011,011
|
||
...16==.
|
||
.BYTE 000,000,000,012,025,025,012,000,000,000
|
||
...17==.
|
||
.BYTE 000,014,002,001,017,021,021,016,000,000
|
||
...20==.
|
||
.BYTE 000,000,017,020,020,020,017,000,000,000
|
||
...21==.
|
||
.BYTE 000,000,036,001,001,001,036,000,000,000
|
||
...22==.
|
||
.BYTE 000,000,016,021,021,021,000,000,000,000
|
||
...23==.
|
||
.BYTE 000,000,021,021,021,016,000,000,000,000
|
||
...24==.
|
||
.BYTE 000,021,021,037,021,012,012,004,000,000
|
||
...25==.
|
||
.BYTE 000,037,001,001,017,001,001,037,000,000
|
||
...26==.
|
||
.BYTE 000,000,016,033,025,033,016,000,000,000
|
||
...27==.
|
||
.BYTE 000,004,002,037,002,004,010,037,010,004
|
||
...30==.
|
||
.BYTE 000,000,004,010,037,010,004,000,000,000
|
||
...31==.
|
||
.BYTE 000,000,004,002,037,002,004,000,000,000
|
||
...32==.
|
||
.BYTE 000,001,002,037,004,037,010,020,000,000
|
||
...33==.
|
||
.BYTE 000,004,004,012,021,012,004,004,000,000
|
||
...34==.
|
||
.BYTE 000,002,004,010,004,002,000,016,000,000
|
||
...35==.
|
||
.BYTE 000,010,004,002,004,010,000,016,000,000
|
||
...36==.
|
||
.BYTE 000,000,037,000,037,000,037,000,000,000
|
||
...37==.
|
||
.BYTE 000,000,000,021,012,004,000,000,000,000
|
||
...40==.
|
||
.BYTE 000,000,000,000,000,000,000,000,000,000
|
||
...41==.
|
||
.BYTE 000,004,004,004,004,004,000,004,000,000
|
||
...42==.
|
||
.BYTE 012,012,012,000,000,000,000,000,000,000
|
||
...43==.
|
||
.BYTE 000,000,012,037,012,012,037,012,000,000
|
||
...44==.
|
||
.BYTE 004,016,025,024,016,005,025,016,004,000
|
||
...45==.
|
||
.BYTE 000,037,031,002,004,010,023,023,000,000
|
||
...46==.
|
||
.BYTE 000,010,024,024,010,025,022,015,000,000
|
||
...47==.
|
||
.BYTE 014,014,030,000,000,000,000,000,000,000
|
||
...50==.
|
||
.BYTE 000,001,002,004,004,004,002,001,000,000
|
||
...51==.
|
||
.BYTE 000,020,010,004,004,004,010,020,000,000
|
||
...52==.
|
||
.BYTE 000,004,025,016,004,016,025,004,000,000
|
||
...53==.
|
||
.BYTE 000,000,004,004,037,004,004,000,000,000
|
||
...54==.
|
||
.BYTE 000,000,000,000,000,000,014,014,030,000
|
||
...55==.
|
||
.BYTE 000,000,000,000,037,000,000,000,000,000
|
||
...56==.
|
||
.BYTE 000,000,000,000,000,000,014,014,000,000
|
||
...57==.
|
||
.BYTE 000,000,001,002,004,010,020,000,000,000
|
||
...60==.
|
||
.BYTE 000,016,021,023,025,031,021,016,000,000
|
||
...61==.
|
||
.BYTE 000,004,014,004,004,004,004,016,000,000
|
||
...62==.
|
||
.BYTE 000,016,021,001,002,004,010,037,000,000
|
||
...63==.
|
||
.BYTE 000,016,021,001,006,001,021,016,000,000
|
||
...64==.
|
||
.BYTE 000,002,006,012,022,037,002,002,000,000
|
||
...65==.
|
||
.BYTE 000,037,020,036,001,001,021,016,000,000
|
||
...66==.
|
||
.BYTE 000,006,010,020,036,021,021,016,000,000
|
||
...67==.
|
||
.BYTE 000,037,001,002,002,004,004,004,000,000
|
||
...70==.
|
||
.BYTE 000,016,021,021,016,021,021,016,000,000
|
||
...71==.
|
||
.BYTE 000,016,021,021,017,001,002,014,000,000
|
||
...72==.
|
||
.BYTE 000,000,000,014,014,000,014,014,000,000
|
||
...73==.
|
||
.BYTE 000,000,000,014,014,000,014,014,030,000
|
||
...74==.
|
||
.BYTE 000,000,002,004,010,004,002,000,000,000
|
||
...75==.
|
||
.BYTE 000,000,000,037,000,037,000,000,000,000
|
||
...76==.
|
||
.BYTE 000,000,010,004,002,004,010,000,000,000
|
||
...77==.
|
||
.BYTE 000,016,021,002,004,004,000,004,000,000
|
||
...100==.
|
||
.BYTE 000,016,021,027,025,027,020,016,000,000
|
||
...101==.
|
||
.BYTE 000,016,021,021,037,021,021,021,000,000
|
||
...102==.
|
||
.BYTE 000,036,021,021,036,021,021,036,000,000
|
||
...103==.
|
||
.BYTE 000,016,021,020,020,020,021,016,000,000
|
||
...104==.
|
||
.BYTE 000,036,011,011,011,011,011,036,000,000
|
||
...105==.
|
||
.BYTE 000,037,020,020,036,020,020,037,000,000
|
||
...106==.
|
||
.BYTE 000,037,020,020,036,020,020,020,000,000
|
||
...107==.
|
||
.BYTE 000,016,021,020,020,023,021,016,000,000
|
||
...110==.
|
||
.BYTE 000,021,021,021,037,021,021,021,000,000
|
||
...111==.
|
||
.BYTE 000,016,004,004,004,004,004,016,000,000
|
||
...112==.
|
||
.BYTE 000,001,001,001,001,001,021,016,000,000
|
||
...113==.
|
||
.BYTE 000,021,022,024,030,024,022,021,000,000
|
||
...114==.
|
||
.BYTE 000,020,020,020,020,020,020,037,000,000
|
||
...115==.
|
||
.BYTE 000,021,033,025,021,021,021,021,000,000
|
||
...116==.
|
||
.BYTE 000,021,021,031,025,023,021,021,000,000
|
||
...117==.
|
||
.BYTE 000,016,021,021,021,021,021,016,000,000
|
||
...120==.
|
||
.BYTE 000,036,021,021,036,020,020,020,000,000
|
||
...121==.
|
||
.BYTE 000,016,021,021,021,025,022,015,000,000
|
||
...122==.
|
||
.BYTE 000,036,021,021,036,024,022,021,000,000
|
||
...123==.
|
||
.BYTE 000,016,021,020,016,001,021,016,000,000
|
||
...124==.
|
||
.BYTE 000,037,004,004,004,004,004,004,000,000
|
||
...125==.
|
||
.BYTE 000,021,021,021,021,021,021,016,000,000
|
||
...126==.
|
||
.BYTE 000,021,021,021,021,012,012,004,000,000
|
||
...127==.
|
||
.BYTE 000,021,021,021,021,025,033,021,000,000
|
||
...130==.
|
||
.BYTE 000,021,021,012,004,012,021,021,000,000
|
||
...131==.
|
||
.BYTE 000,021,021,012,004,004,004,004,000,000
|
||
...132==.
|
||
.BYTE 000,037,001,002,037,010,020,037,000,000
|
||
...133==.
|
||
.BYTE 007,004,004,004,004,004,004,004,007,000
|
||
...134==.
|
||
.BYTE 000,000,020,010,004,002,001,000,000,000
|
||
...135==.
|
||
.BYTE 034,004,004,004,004,004,004,004,034,000
|
||
...136==.
|
||
.BYTE 004,012,021,000,000,000,000,000,000,000
|
||
...137==.
|
||
.BYTE 000,000,000,000,000,000,000,000,000,037
|
||
...140==.
|
||
.BYTE 006,006,003,000,000,000,000,000,000,000
|
||
...141==.
|
||
.BYTE 000,000,000,016,001,017,021,017,000,000
|
||
...142==.
|
||
.BYTE 000,020,020,036,021,021,021,036,000,000
|
||
...143==.
|
||
.BYTE 000,000,000,016,021,020,020,017,000,000
|
||
...144==.
|
||
.BYTE 000,001,001,017,021,021,021,017,000,000
|
||
...145==.
|
||
.BYTE 000,000,000,016,021,036,020,016,000,000
|
||
...146==.
|
||
.BYTE 000,006,011,010,034,010,010,010,000,000
|
||
...147==.
|
||
.BYTE 000,000,000,016,021,021,021,017,001,016
|
||
...150==.
|
||
.BYTE 000,020,020,036,021,021,021,021,000,000
|
||
...151==.
|
||
.BYTE 000,000,004,000,004,004,004,004,000,000
|
||
...152==.
|
||
.BYTE 000,000,001,000,001,001,001,001,021,016
|
||
...153==.
|
||
.BYTE 000,020,020,021,022,034,022,021,000,000
|
||
...154==.
|
||
.BYTE 000,004,004,004,004,004,004,004,000,000
|
||
...155==.
|
||
.BYTE 000,000,000,032,025,025,025,025,000,000
|
||
...156==.
|
||
.BYTE 000,000,000,026,031,021,021,021,000,000
|
||
...157==.
|
||
.BYTE 000,000,000,016,021,021,021,016,000,000
|
||
...160==.
|
||
.BYTE 000,000,000,036,021,021,021,036,020,020
|
||
...161==.
|
||
.BYTE 000,000,000,016,021,021,021,017,001,001
|
||
...162==.
|
||
.BYTE 000,000,000,026,031,020,020,020,000,000
|
||
...163==.
|
||
.BYTE 000,000,000,017,020,016,001,036,000,000
|
||
...164==.
|
||
.BYTE 000,004,004,037,004,004,004,003,000,000
|
||
...165==.
|
||
.BYTE 000,000,000,021,021,021,021,016,000,000
|
||
...166==.
|
||
.BYTE 000,000,000,021,021,021,012,004,000,000
|
||
...167==.
|
||
.BYTE 000,000,000,021,021,025,025,012,000,000
|
||
...170==.
|
||
.BYTE 000,000,000,021,012,004,012,021,000,000
|
||
...171==.
|
||
.BYTE 000,000,000,021,021,021,012,004,010,020
|
||
...172==.
|
||
.BYTE 000,000,000,037,002,016,010,037,000,000
|
||
...173==.
|
||
.BYTE 001,002,002,002,004,002,002,002,001,000
|
||
...174==.
|
||
.BYTE 004,004,004,004,004,004,004,004,004,004
|
||
...175==.
|
||
.BYTE 020,010,010,010,004,010,010,010,020,000
|
||
...176==.
|
||
.BYTE 015,026,000,000,000,000,000,000,000,000
|
||
...177==.
|
||
.BYTE 037,037,037,037,037,037,037,037,037,037
|
||
.ENDC ;.IF E FONTMS
|
||
.LIST
|
||
|
||
.IIF E FONTSW,.=.+3000 ;APPROXIMATE SIZE OF FONT
|
||
|
||
REPORT FONT SIZE=,\.-FNTORG
|
||
.NLIST
|
||
.ENDC ;.IF NE FONTSW
|
||
.LIST
|
||
|
||
PPVAR: .OFFSET -. ;PAGE PRINTER VARIABLES.
|
||
PPCC:: TVLO ;ADDRESS WHERE NEXT CHARACTER GOES
|
||
PPPHS:: 20-CHRWD ;CHARACTER PHASE
|
||
;PPX:: -BITPL ;X POSITION OF CHARACTER
|
||
;PPLE:: 0 ;LINE EDITOR ASSOCIATED WITH PAGE
|
||
;PPCREG:: .BYTE -1 ;CONSOLE REGISTER #
|
||
; .BYTE 0 ;UNUSED
|
||
|
||
;PPCHN:: -1 ;PAGE PRINTER CHANNEL, -1=>THESE VARIABLES UNUSED
|
||
;PPY:: -NLINS ;Y POSITION
|
||
PPLCC:: TVLO ;ORIGIN OF THIS LINE IN MEMORY
|
||
PPORG:: TVLO ;ORIGIN OF THIS PIECE OF PAPER IN MEMORY
|
||
PPCPOS:: 0 ;CHARACTER COLUMN POSITION (0=LEFT MARGIN)
|
||
PPLINE:: 0 ;LINE NUMBER (0=TOP LINE)
|
||
;PPXORG:: -BITPL ;X ORIGIN OF PAGE
|
||
;PPYORG:: -NLINS ;Y ORIGIN OF PAGE
|
||
;PPFONT:: CTAB ;FONT WE ARE PRINTING WITH
|
||
;PPLPG:: .BYTE 4 ;LINES/GLITCH COUNTER
|
||
;PPLPGK:: .BYTE 4 ;LINES/GLITCH CONSTANT (0=>WRAP AROUND)
|
||
;PPNGL:: .BYTE 11 ;# GLITCHES/PAGE COUNTER
|
||
;PPNGLK:: .BYTE 11 ;# GLITCHES/PAGE CONSTANT
|
||
PPLEN:: .OFFSET 0
|
||
|
||
CPOS=PPVAR+PPCPOS
|
||
CLINE=PPVAR+PPLINE
|
||
|
||
BLKPHS: 0 ;0 NORMAL 1 CHAR UNDER BLINKER INVERTED
|
||
BLKTIM: 0 ;COUNT DOWN CLOCK BREAKS UNTIL BLINK
|
||
BELTIM: 0 ;IF NON-ZERO, COUNT DOWN CLOCK BREAKS UNTIL BELL
|
||
.ENDC ;TVP
|
||
BLKDFR: 0 ;NON-ZERO INHIBIT BLINKING [OUTSIDE CONDITIONAL FOR EASE]
|
||
|
||
.SBTTL SOME LOWER LEVEL GOODIES
|
||
|
||
ACSAV: PUSH A ;CALL WITH JSR U,
|
||
PUSH B
|
||
PUSH C
|
||
PUSH T
|
||
PUSH TT
|
||
JMP @U
|
||
|
||
ACRES: TST (SP)+ ;CALL WITH JSR U,
|
||
POP TT
|
||
POP T
|
||
POP C
|
||
POP B
|
||
POP A
|
||
RTS U
|
||
|
||
.IFNZ DEBUG
|
||
|
||
;DEBST-- START UP 11/20
|
||
|
||
DEBST: MOV #174000,AKLIS
|
||
MOV #174002,AKLIB
|
||
MOV #174004,AKLOS
|
||
MOV #174006,AKLOB
|
||
MOV #KLIBRK,320 ;WAS CLOBBERED
|
||
MOV #DSBRK,20 ;USE IOT TO FAKE DISPLAY INTERRUPT
|
||
MOV DSPSW,22
|
||
MOV #FDPC,ADPC
|
||
RTS PC
|
||
|
||
FDPC: 0 ;FAKE DPC
|
||
|
||
.ENDC ;DEBUG
|
||
|
||
.SBTTL VARIABLES
|
||
|
||
;SOME DEBUGGING AIDS
|
||
|
||
VERSE: %FNAM2 ;VERSION NUMBER
|
||
|
||
.IFNZ GT40P
|
||
ADPC: DPC ;CAN BE CHANGED TO NON-NXM FOR DEBUGGING ON PDP11
|
||
.ENDC ;GT40P
|
||
AKLIS: KLIS
|
||
AKLIB: KLIB
|
||
AKLOS: KLOS
|
||
AKLOB: KLOB
|
||
|
||
;VARIABLES
|
||
|
||
ACTCHR: 0 ;# CHARACTERS BUFFERED
|
||
MAXACT: 0 ;THE BIGGEST ACTCHR WE'VE SEEN
|
||
GETCC: 0 ;WHERE TO GET NEXT CHARACTER
|
||
PUTCC: 0 ;WHERE TO PUT NEXT CHARACTER
|
||
|
||
.IFNZ GT40P
|
||
CURSX: 0 ;X-Y CURSOR POSITION
|
||
CURSY: 0 ; (SCOPE COORDS)
|
||
BYTCNT: 0 ;# CHARACTERS ON THIS LINE
|
||
LINPNT: 0 ;BYTE POINTER INTO LINBUF
|
||
OCSR: 0 ;OLD CONSOLE SWITCH REGISTER
|
||
AVAIL: 0 ;POINTS TO FIRST FREE BLOCK
|
||
ROVER: 0 ;POINTS TO HEAD OF SEARCH LIST
|
||
OLDBLK: 0
|
||
CASE: 0 ;-1 IMPLIES SHIFT OUT (SPECIAL CHARACTERS)
|
||
TEXTP: 0 ;INDIRECT POINTER TO TEXT LINE
|
||
TLINE: 0 ;INDEX OF TOP RING ON SCREEN
|
||
CKS: 0 ;LODER CHECKSUM
|
||
COMAND: 0 ;FOR DEBUGGING (DISPLAY SLAVE COMMAND)
|
||
COUNT: 0 ;FOR DEBUGGING (# BYTES IN LODER BLOCK)
|
||
CLINE: 0 ;CURRENT LINE (STARTS AT 0)
|
||
CPOS: 0 ;CURSOR POSITION ON LINE
|
||
.ENDC ;GT40P
|
||
MEMTOP: 0 ;FIRST NXM
|
||
|
||
.IFZ GT40P
|
||
CURSX: CURSY: RCURSX: RCURSY: 0 ;THESE ARE HERE TO MAKE PALX HAPPY
|
||
.ENDC
|
||
|
||
;INTERUPT LEVEL STORAGE
|
||
|
||
;.IFNZ DLIMSW
|
||
;TICKS: 0 ;CLOCK TICK TIMER
|
||
;DTIME: 0 ;TIME TO DISPLAY EVERYTHING
|
||
;DSTOPD: 0 ;IF NON 0, WHERE DISPLAY STOPPED
|
||
;.ENDC
|
||
.IFNZ PCHIST
|
||
PCPNT: 0
|
||
PCBUF: .=.+PCBFL
|
||
.ENDC
|
||
RETLAD: 0 ;ADDRESS OF BLOCK TO BE RETURNED
|
||
SAVSP: 0 ;SP SAVED AT POWER FAILURE
|
||
SAVDPC: 0 ;DPY STATUS AT LAST DISPLAY BREAK
|
||
SAVDSR: 0
|
||
SAVXSR: 0
|
||
SAVYSR: 0
|
||
FORGIV: 0 ;IF NON-ZERO, IGNORE MYSTERIOUS DISPLAYS STOPS
|
||
|
||
;CONSOLE RELATED STORAGE AND SWITCHES
|
||
|
||
CNHTTY: 0 ;0 NORMAL DATAPOINT MODE TO 10, NON-ZERO LM CONSOLE HAS THE TTY
|
||
;LMHTTY: 0 ;NON-ZERO LISP MACHINE HAS THE TTY, NEGATIVE REMOTE CONSOLE MODE
|
||
;LMTOCK: 0 ;LISP-MACHINE TYPE-OUT CHECK DELAY COUNTER
|
||
|
||
TNRQFG: 0 ;-1 PROCESSING REGISTER EXAM/DEPOS REQUEST FROM 10
|
||
CONSF: 0 ;0 FULL CONSOLE SCREEN USED FOR TTY
|
||
;-1 BOTTOM N LINES USED TO DISPLAY "LISP MACHINE CONSOLE"
|
||
TYIQM: 0 ;TYPE IN QUOTE MODE
|
||
;CHARACTERS ARE ACTED UPON AT THE INTERRUPT LEVEL AS FOLLOWS:
|
||
;ALWAYS ACTIVE:
|
||
; ^Q QUOTES FOLLOWING CHR
|
||
; ^X ENTERS CONSOLE MONITOR MODE
|
||
;IN ADDITION, IF TYIQM=2
|
||
; ^S STOP LISP MACHINE
|
||
; ^N SINGLE STEP LISP MACHINE
|
||
; ^D COMPLEMENT DISPLAY CONSOLE SWITCH
|
||
; (HOWEVER, THE CONSOLE IS ALWAYS DISPLAYED IN CONSOLE MONITOR MODE,
|
||
; INDEPENDANT OF THE SETTING OF THE DISPLAY CONSOLE SWITCH).
|
||
TYIQF: 0 ;IF -1, QUOTE NEXT TYI CHAR
|
||
TYICH: 0 ;CHAR INPUT FROM KEYBOARD FOR CONSOLE MONITOR
|
||
CMREQ: -1 ;-1 NOT TRYING TO REACH CONSOLE MONITOR LEVEL
|
||
;0 CNTRL X TYPED. RANDOM LOOPS SEEING THIS SHOULD XFER TO
|
||
; CONSOLE MONITOR LOOP
|
||
; IF A SECOND CNTRL X IS TYPED WHEN CMREQ=0, A GROSS QUIT OUT
|
||
; AND REINITIALIZATION AT GO WILL OCCUR.
|
||
CDLNN: CHRLN-7 ;LINE NUMBER TO START CONSOLE DISPLAY ON
|
||
; (THIS MAY MAKE REMAINING SCREEN DATAPOINT SIZED)
|
||
|
||
;SAVED CONS MACHINE STATE
|
||
CSSWO: ;ORIGIN OF BLOCK OF SWITCHES ACCESSIBLE VIA RACSWO-RACSWE REGISTER
|
||
;ADDRESSES
|
||
CPSVAL: 0 ;NON ZERO -> PASSIVE STATE SAVE VALID
|
||
CFSVAL: 0 ;NON ZERO -> FULL STATE SAVE VALID
|
||
;THE "RUN" FLIP-FLOP IN CONS:
|
||
; CTRUN REFLECTS THE "COMMAND" FROM THE 10 OR THE GT40 KEYBOARD.
|
||
;WHEN THE 10 EXAMINES RAGO, THE CONTENTS OF CTRUN ARE RETURNNED.
|
||
;QDPGO AND QDPSTP ARE THE ROUTINES TO SET AND CLEAR CTRUN RESPECTIVELY.
|
||
; CRUN REFLECTS THE "ACTUAL" STATE OF CONS. QDPRUN AND QDPHLT
|
||
;ARE ROUTINES TO SET AND CLEAR CRUN. NORMALLY, CRUN "FOLLOWS" CTRUN,
|
||
;BUT VARIOUS CIRCUMSTANCES AND CAUSE IT TO DIFFER MOMENTARILY
|
||
;(TYPE IN/OUT LOSSAGE NOTABLY).
|
||
CRUN: 0 ;NON ZERO -> CONS ACTUALLY RUNNING
|
||
; IF THIS SET, CONS CLOCK SHOULD ACTUALLY BE TICKING AT HIGH SPEED.
|
||
; SET BY QDPRUN, CLEARED BY ESTOP (AND QDPHLT WHICH CALLS IT).
|
||
CTRUN: 0 ;NON ZERO -> CONS "TRYING" TO RUN, ALTHO IT MAY BE TEMPORARILY STOPPED.
|
||
; SET BY QDPGO (CNTRL-P OR RUN COMMAND FROM 10)
|
||
; CLEARED BY QDPSTP (CNTRL-S OR STOP COMMAND FROM 10)
|
||
; ALSO IF CRUN WAS -1 AND CONS HALTED DUE TO AN ERROR
|
||
|
||
CLLMOD: 0 ;NON ZERO "LOW LEVEL MODE", 0 NORMAL
|
||
NOOPF: 0 ;NON ZERO -> NEXT INST WAS TO BE NO-OP ED WHEN
|
||
; MACHINE STATE SAVED
|
||
|
||
MODREG: 0 ;SAVES LAST SETTING OF MODE REGISTER (RAMOD)
|
||
|
||
TENMOD: 0 ;NON ZERO -> PDP-10 FLAVOR CONSOLE PRGM ACTIVE, PDP-11 TO DO NOTHING
|
||
; EXCEPT CNTRL-META-CALL HACK.
|
||
CSSWE: ;END OF RACSW BLOCK
|
||
.IFGE <<CSSWE-CSSWO>/2-<RACSWE-RACSWO>>
|
||
.ERR RACSW OVERFLOW!!
|
||
.ENDC
|
||
|
||
COBUS: 0 ;"OBSERVED" OBUS (LOW 16 BITS)
|
||
0 ; HIGH 16 BITS
|
||
CIR: 0 ;"OBSERVED" IR 15-00
|
||
0 ; IR 31-16
|
||
0 ; IR 44-32
|
||
CPC: 0 ;"OBSERVED" PC
|
||
CPCT: 0 ; TEMP (AT FRCONS)
|
||
CCERR1: 0 ;"OBSERVED" ERROR WD1
|
||
; (HIGH BYTE COMES FROM 164000 HIGH BYTE)
|
||
; (LOW BYTE COMES FROM HIGH BYTE OF 164002)
|
||
CCERR2: 0 ;"OBSERVED" ERROR WD2
|
||
; (HIGH BYTE COMES FROM 164010 HIGH BYTE)
|
||
; (LOW BYTE FROM 164012 HIGH BYTE)
|
||
|
||
;M MEM LOCN 0 GET CLOBBERED BY VARIOUS OPERATIONS SO IT MUST
|
||
;BE SAVED AND RESTORED. IT AND A MEM LOCN 1 ARE USED WHEN
|
||
;WRITING CONTROL MEMORY
|
||
|
||
CMMEM0: 0 ;SAVED M MEM LOCN 0 (LOW WD)
|
||
0 ; HIGH WD
|
||
CAMEM1: 0 ;SAVED A MEM LOCN 1 (LOW WD)
|
||
0
|
||
CSVMA: 0 ;SAVED VMA (LOW WD)
|
||
0
|
||
CSPMD: 0 ;SAVED PAGE MAP DATA (LOW WD). 1-BIT=READ-FLT, 2-BIT=WRT-FLT
|
||
0
|
||
CSMWD: 0 ;SAVED WRITE DATA REGISTER (LOW WD)
|
||
0
|
||
CSMRD: 0 ;SAVED READ DATA REGISTER
|
||
0
|
||
CSMRDF: 0 ;.NE. 0, -> READ DATA REGISTER ALTERED, SO (TRY) TO RESTORE IT
|
||
|
||
CSMGBR: 177 ;ADDRESS OF GARBAGE REGISTER TO WRITE IN ORDER TO RELOAD (LAST IN PG 0)
|
||
0 ;READ DATA REGISTER (20 BIT PHYSICAL ADDRESS)
|
||
CL1M0: 0 ;LEVEL 1 MAP, LOCN 0
|
||
|
||
CL1M0F: 0 ;.NE. 0, LVL 1 MAP LOCN 0 HACKED
|
||
; IF -1, 0 HAS BEEN WRITTEN IN HARDWARE
|
||
CL2M0: 0 ;LEVEL 2 MAP, LOCN 0
|
||
0
|
||
CL2M0F: 0 ;.NE. 0, LVL 2 MAP LOCN 0 HACKED
|
||
|
||
CVMMWD: 0 ;CONSOLE "VIRTUAL" MAIN MEM WRITE DATA REGISTER
|
||
0
|
||
CVMVMA: 0 ;CONSOLE "VIRTUAL" MAIN MEM ADDRESS REGISTER
|
||
0
|
||
CVMMRD: 0 ;CONSOSLE "VIRTUAL" MAIN MEM READ DATA REGISTER
|
||
0
|
||
CVMMPF: 0 ;PAGE FAULT FLAG ON CONSOLE VIRTUAL READ/WRITE (0 OR 1)
|
||
USSVDF: 0 ;U STACK SAVED IN USSVD
|
||
USTPNR: 0 ;SAVED USTACK POINTER
|
||
USSVD: .BLKW 32. ;SAVED STATE OF USTACK
|
||
USSVDE: ; (ALL 32 REGS SAVED SINCE THERE IS
|
||
; NO RANDOM ACCESS TO HARDWARE RAM)
|
||
|
||
UI: 0 ;TEM BLOCK FOR "ASSEMBLING" MICRO INSTRUCTIONS
|
||
0
|
||
0
|
||
|
||
OLDPCS: .BLKW 8 ;OLD PCS
|
||
|
||
;COMMAND VARIABLES AND SWITCHES
|
||
|
||
CDNUM: 0 ;ASSEMBLED DECIMAL NUMBER
|
||
|
||
CNUM: 0 ;RETURNED NUMERIC VALUE FROM COMMAND SCANNER.
|
||
0 ; (POTENTIALLY 3 PRECISION)
|
||
0
|
||
0 ;MUST BE HERE SO RESET WILL RUN FAST!!
|
||
; DURING READIN, ASSEMBLE OCTAL NUMBER HERE
|
||
CNUMF: 0 ; (ON RETURN FROM GCOM) -1 NUMBER HAS BEEN TYPED VALUE IN CNUM
|
||
|
||
CBUFL==10 ;COMMAND BUFFER LENGTH IN WDS
|
||
|
||
CBUF: .BLKW CBUFL ;ASCIZ STRING TYPED IN
|
||
|
||
CDELIM: 0 ;DELIMITER ENCOUNTERED
|
||
CBUFC: 0 ;AMT OF ROOM REMAINING IN CBUF
|
||
GCMPTR: 0 ;FILLING POINTER TO CBUF
|
||
CSYL: 0 ;-1 NON NULL SYLABLE SEEN
|
||
CVAL: 0 ;VALUE OF PREVIOUS COMMAND
|
||
0 ; POTENTIALLY 3 PRECISION
|
||
0
|
||
|
||
CVALF: 0 ;-1 -> CVAL NON-NULL
|
||
COMFRC: 0 ;-1 FORCE NEXT CHR TO BE COMMAND CHAR (@ SETS THIS)
|
||
CONSPT: 0 ;"." FOR CONS MACHINE
|
||
REGOPF: 0 ;-1 REG OPEN
|
||
|
||
|
||
CIBUF: .REPT 8 ;CONSOLE INSTRUCTION BUFFER
|
||
0
|
||
0
|
||
0
|
||
.ENDR
|
||
|
||
;"RAID MODE" VARIABLES AND SWITCHES.
|
||
RAIDA: .REPT 8 ;REGISTER ADDRESSES TO BE DISPLAYED. 0 -> NULL
|
||
0
|
||
.ENDR
|
||
RAIDM: 0 ;-1 CURRENTLY PRINTING TEXT IN RAID MODE,
|
||
; IE WRAP CURSOR BETWEEN LINES
|
||
; C(RAIDN) AND CDLNN
|
||
DEPFLG: 0 ;NON ZERO -> DEPOSIT TYPE OPERATION
|
||
; DONE BY LAST COMMAND, SO DO CDSPLY
|
||
|
||
.SBTTL DISPLAY LISTS & BUFFERS
|
||
.IFNZ GT40P
|
||
|
||
;TEXT RING HEADER
|
||
|
||
DPYSA:
|
||
STSNRM ;SET STATUS REGISTER
|
||
SETPNT ;OFF SCREEN
|
||
0 ;WATSE SOME TIME TO LET
|
||
1400 ;THE MAIN PROGRAM RUN A LITTLE
|
||
CHARS
|
||
17 ;SHIFT IN
|
||
.ASCII /**************************/
|
||
.EVEN
|
||
DPYSPT: SETPNT+DPYNRM ;CURSOR
|
||
RCURSX: 0
|
||
RCURSY: NLINS-CHRHT+1
|
||
CHARS
|
||
<177_10>+17 ;CURSOR
|
||
17 ;SHIFT IN
|
||
0
|
||
SETPNT+DPYNRM
|
||
0 ;X
|
||
NLINS-CHRHT+1 ;Y
|
||
DPYJSR
|
||
TXSTRT: 0 ;PATCHED BY PROGRAM
|
||
DPYJSR
|
||
GRJSR
|
||
DPYJMP
|
||
DPYSA
|
||
|
||
GRHDR==.-HJSIDX
|
||
GRJSR: DPYNOP
|
||
DPYNOP
|
||
GRJMP: DPYRTS
|
||
GRSTRT: 0
|
||
|
||
;FORMAT OF DISPLAY ITEM
|
||
HSPIDX==0 ;SETPOINT
|
||
HXCIDX==2 ;X CORDINATE
|
||
HYCIDX==4 ;Y COORDINATE
|
||
HJSIDX==6 ;DPYJSR
|
||
HDSIDX==10 ;DESTINATION (LIST)
|
||
HJMIDX==12 ;DPYJMP
|
||
HNXIDX==14 ;ADDRESS OF NEXT HEADER
|
||
HITIDX==16 ;ITEM NUMBER
|
||
HIAIDX==20 ;ADDRESS OF LIST
|
||
HSCIDX==22 ;# OF SUBROUTINE CALLS TO THIS LIST
|
||
|
||
HSIZE==HSCIDX+2 ;SIZE OF HEADER
|
||
LINHDR==HYCIDX+2 ;NUMBER OF LIST BYTES IN HEADER
|
||
|
||
;DISPLAY LIST
|
||
;DPYRTS
|
||
XITEM==2 ;NUMBER OF EXTRA BYTES IN LIST (DPYRTS)
|
||
|
||
;RING OF LINE HEADERS
|
||
|
||
LHDRS==12 ;SIZE OF LINE HEADER
|
||
|
||
;DPYJSR
|
||
TXTIDX==2 ;OFFSET OF TEXT POINTER
|
||
JMPIDX==4 ;OFFSET OF DPYJMP
|
||
NXTIDX==6 ;OFFSET OF NEXT LINE HEADER
|
||
BACIDX==10 ;OFFSET OF BACK POINTER
|
||
|
||
|
||
FAKEL: CHARS
|
||
<<15_10>+12>
|
||
DPYRTS
|
||
|
||
LOWLIN: DPYJSR
|
||
0
|
||
DPYJMP
|
||
.+4
|
||
HILIN
|
||
|
||
.REPT CHRLN-2
|
||
.XLIST
|
||
DPYJSR
|
||
0
|
||
DPYJMP
|
||
.+4
|
||
.+2-<LHDRS*2>
|
||
.LIST
|
||
.ENDR
|
||
|
||
HILIN: DPYJSR
|
||
0
|
||
DPYRTS
|
||
LOWLIN
|
||
.+2-<LHDRS*2>
|
||
.ENDC ;GT40P
|
||
;DL11 INPUT BUFFER
|
||
|
||
BUF=.
|
||
.=.+BUFSIZ
|
||
BUFEND==.
|
||
|
||
.IFNZ GT40P
|
||
;DPY CHARACTER LINE BUFFER
|
||
|
||
LINBUF=.
|
||
.=.+LBL
|
||
.EVEN
|
||
|
||
;DPY PUSH DOWN LIST
|
||
|
||
DPYPDP: 0 ;PUSH DOWN POINTER
|
||
DPYPDC: 0 ;PUSH DOWN COUNTER
|
||
DPYPDB=.
|
||
.=.+DPYPDL
|
||
.ENDC ;GT40P
|
||
|
||
;PATCH AREA
|
||
|
||
PAT:PATCH:
|
||
.=.+PATL
|
||
|
||
.IFNZ GT40P
|
||
;***********INTERUPT/MAIN PROG LEVEL COMMUNICATION RING********
|
||
|
||
;ALL OF THIS HACKERY IS TO PUT GOODIES INTO DISPLAY LIST WHILE
|
||
;DISPLAY IS STOPPED AT INTERUPT LEVEL. BUFFERS ARE SET UP AT GO3.
|
||
;EACH BUFFER IS 6 BYTES AND IS OF THE FOLLOWING FORM
|
||
|
||
; NEXT ON RING
|
||
; ADDRESS TO WRITE FOLLOWING WORD
|
||
; CONTENTS
|
||
|
||
;GETDPY AND PUTDPY POINT AT ADDRESS WORD OF BUFFER AND ARE FOR
|
||
;INTERUPT AND MAIN PROGRAM LEVELS RESPECTIVELY
|
||
|
||
PUTDPY: 0
|
||
GETDPY: 0
|
||
MIBUF: .=.+<MIBFRS*6>
|
||
|
||
;FAKE BLOCK
|
||
FAKEBL: 0
|
||
FS+2
|
||
FAKEBL+2
|
||
-1
|
||
|
||
;FREE STORAGE
|
||
FS=. ;FREE STORAGE STARTS HERE
|
||
REPORT <DL11 BUFSIZ=>,\BUFSIZ
|
||
REPORT <FS=>,\FS
|
||
REPORT <FS SIZE=>,\<HMEML-FS>
|
||
.IFF
|
||
REPORT <FIRST FREE LOC=>,\.
|
||
REPORT <LEFT BEFORE MEM TOP=>,\HMEML-.
|
||
.ENDC ;GT40P
|
||
|
||
.END GO
|