3103 lines
No EOL
67 KiB
Text
3103 lines
No EOL
67 KiB
Text
.TITLE PDP11 LOGO
|
||
|
||
FOO==VERNF
|
||
VERN==%FNAM2
|
||
FOO==VERNF
|
||
.STITL CONFIGURATION PARAMTERS
|
||
.IF1
|
||
.PRINT /0=>FULL 1=>NO DEBUG 2=>QUERY
|
||
ASSSW=/
|
||
.TTYMAC FLAG
|
||
ASSSW=FLAG
|
||
.ENDM
|
||
|
||
.IFZ ASSSW
|
||
DEBUG==1
|
||
DISASS==1
|
||
GCDBUG==1
|
||
MNUSRS==10.
|
||
MNSLTS==5
|
||
.ENDC
|
||
|
||
.IFZ <ASSSW-1>
|
||
DEBUG==0
|
||
DISASS==0
|
||
GCDBUG==1 ;ZERO LATER, BUT DOESN'T WORK YET
|
||
MNUSRS==4
|
||
MNSLTS==2
|
||
.ENDC
|
||
|
||
.IFZ <ASSSW-2>
|
||
.MACR SETFLG FLG
|
||
.PRINT /FLG=/
|
||
.TTYMAC FLAG
|
||
FLG==FLAG
|
||
.ENDM
|
||
.ENDM
|
||
|
||
SETFLG DEBUG
|
||
SETFLG DISASS
|
||
SETFLG GCDBUG
|
||
SETFLG MNUSRS
|
||
SETFLG MNSLTS
|
||
.ENDC
|
||
.ENDC
|
||
|
||
.MACR FOR FLG
|
||
.XLIST
|
||
.IFNZ FLG
|
||
.LIST
|
||
.ENDM
|
||
|
||
.MACR ENDC FLG
|
||
.XLIST
|
||
.IFZ FLG
|
||
.LIST
|
||
.ENDC
|
||
.LIST
|
||
.ENDM
|
||
|
||
.STITL SYSTEM PARAMETERS
|
||
|
||
A=%0
|
||
B=%1
|
||
C=%2
|
||
D=%3
|
||
E=%4
|
||
F=%5
|
||
U=%5
|
||
P=%6
|
||
SP=%6
|
||
PC=%7
|
||
|
||
|
||
|
||
ERROR=TRAP
|
||
|
||
RUG=100000 ;DONT CHANGE THE S.A., RADIA!!
|
||
SKPRET==EMT
|
||
|
||
;DEVICE INFORMATION
|
||
|
||
;CONSOLE SWITCHES
|
||
SWB=177570 ;CONSOLE SWITCH DATA
|
||
;CONSOLE TELETYPE
|
||
;BREAK LEVEL 4
|
||
TKBRV=60 ;CONSOLE KEYBOARD BREAK VECTOR
|
||
TKS=177560 ;CONSOLE KEYBOARD STATUS
|
||
TKB=177562 ;CONSOLE KEYBOARD DATA
|
||
TPBRV=64 ;CONSOLE PRINTER BREAK VECTOR
|
||
TPS=177564 ;CONSOLE PRINTER STATUS
|
||
TPB=177566 ;CONSOLE PRINTER DATA
|
||
;DM11
|
||
;BREAK LEVEL 5
|
||
DMRBRV=310 ;DM11 RECEIVER BREAK VECTOR
|
||
DMTBRV=314 ;DM11 TRANSMITTER BREAK VECTOR
|
||
DMCSR=175000 ;DM11 CONTROL AND STATUS REGISTER
|
||
DMBAR=175002 ;DM11 BUFFER ACTIVE REGISTER
|
||
DMBCR=175004 ;DM11 BREAK CONTROL REGISTER
|
||
DMTBR=175006 ;DM11 TABLE BASE REGISTER
|
||
;PROGRAMMABLE CLOCK
|
||
;BREAK LEVEL 6
|
||
PCBRV=104 ;PROGRAMMABLE CLOCK BREAK VECTOR
|
||
PCS=172540 ;PROGRAMMABLE CLOCK STATUS
|
||
PCSTBF=172542 ;PROGRAMMABLE CLOCK SET BUFFER
|
||
PCCNT=172544 ;PROGRAMMABLE CLOCK COUNTER
|
||
;RF11/RS11 DISK
|
||
;BREAK LEVEL 5
|
||
DSKBRV=204 ;DISK BREAK VECTOR
|
||
DSKS=177460 ;DISK STATUS REGISTER
|
||
DSKDBR=177472 ;DISK DATA REGISTER
|
||
DSKWC=177462 ;DISK WORD COUNT
|
||
DSKCA=177464 ;DISK CURRENT ADDRESS
|
||
DSKA=177466 ;DISK ADDRESS
|
||
DSKAE=177470 ;DISK EXTENDED ADDRESS
|
||
DSKMT=177474 ;DISK MAINTENCE(WELL...)
|
||
DSKSG=177476 ;DISK SEGMENT
|
||
;TK DISPLAY
|
||
;BREAK LEVEL 7?
|
||
DISBRV=270 ;DISPLAY BREAK VECTOR
|
||
NGCSR=164040 ;DISPLAY CONTROL AND STATUS REGISTER
|
||
NGREL=164042 ;DISPLAY RELOCATION REGISTER
|
||
;DC11 HIGH SPEED LIN INTERFACE
|
||
;BREAK LEVEL 5
|
||
DCRBRV=300 ;RECIEVE BREAK VECTOR
|
||
DCRS=174000 ;RECIEVE STATUS WORD
|
||
DCRB=174002 ;RECIEVE BUFFER
|
||
DCTBRV=304 ;TRANSMIT BREAK VECTOR
|
||
DCTS=174004 ;TRANSMIT STATUS
|
||
DCTB=174006 ;TRANSMIT BUFFER
|
||
;POWER FAIL
|
||
PFBRV=24
|
||
;BUS ERRORS
|
||
BEBRV=4
|
||
;TRAPS
|
||
TRPBRV=34
|
||
EMTBRV=30
|
||
IOTBRV=20
|
||
BPTBRV=14
|
||
PWFBRV=24
|
||
;EAE REGISTERS
|
||
DIVIDE=177300
|
||
AC=177302
|
||
MQ=177304
|
||
MULTIP=177306
|
||
SR=177310
|
||
EAESR==177311
|
||
NORMAL=177312
|
||
LGS=177314
|
||
ARS=177316
|
||
SIPRBT==2
|
||
MQZ==10
|
||
;PSSESOR STATUS
|
||
PS=177776
|
||
.STITL ALLOCATION PARAMETERS
|
||
|
||
SYPDLL==100
|
||
TMPDLL==20
|
||
PPDLL==600
|
||
SPDLL==600
|
||
DBUFL==400
|
||
DDIRBL==400
|
||
|
||
DTIBFL==2000
|
||
DEDBFL==2000
|
||
DDIRL==2000
|
||
|
||
DWRTEC==103
|
||
DREADC==105
|
||
DWRTCC==107
|
||
|
||
FRTRCF==1
|
||
SWTRCF==2
|
||
SPTRCF==4
|
||
GCTRCF==10
|
||
|
||
FRSCED==1 ;FLUSHED DUE TO SCEDULEING
|
||
FRDSKW==3 ;HANGING ON DISK
|
||
FRTYIW==4 ;HANGING ON TYI OF CHAR
|
||
FRTYOW==5 ;HANGING ON FULL TYO BUFFER
|
||
FRRAND==6 ;HANGING FOR "UNKNOWN" REASON
|
||
FRNEWU==7 ;HANGING BECUASE HAVE NOT YET BEEN INITIALIZED
|
||
FRTYIH==10 ;HANGING ON LINE INPUT
|
||
.STITL MACROS
|
||
.MACR PUSH AA
|
||
MOV AA,-(P)
|
||
JSR PC,PPUSHT
|
||
.ENDM
|
||
|
||
.MACR POP AA
|
||
MOV (P)+,AA
|
||
JSR PC,PPOPT
|
||
.ENDM
|
||
|
||
.MACR PUSHS AA
|
||
JSR PC,SPUSHT
|
||
MOV AA,@S
|
||
.ENDM
|
||
|
||
.MACR POPS AA
|
||
MOV @S,AA
|
||
JSR PC,SPOPT
|
||
.ENDM
|
||
|
||
.MACR SPUSH AA
|
||
MOV AA,-(P)
|
||
.ENDM
|
||
|
||
.MACR SPOP AA
|
||
MOV (P)+,AA
|
||
.ENDM
|
||
|
||
.MACR SPUSHS AA
|
||
SUB #2,S
|
||
MOV AA,@S
|
||
.ENDM
|
||
|
||
.MACR SPOPS AA
|
||
MOV @S,AA
|
||
ADD #2,S
|
||
.ENDM
|
||
|
||
.MACR TEXT AA
|
||
.XLIST
|
||
.ASCII \AA\
|
||
.BYTE 0
|
||
.EVEN
|
||
.LIST
|
||
.ENDM
|
||
|
||
.MACR PRTXT AA
|
||
.XLIST
|
||
JSR PC,ERTAS
|
||
TEXT ^\AA\
|
||
.LIST
|
||
.ENDM
|
||
|
||
|
||
.MACR PRCR
|
||
JSR PC,.CRLF
|
||
.ENDM
|
||
|
||
.MACR SPACE
|
||
JSR PC,.SPACE
|
||
.ENDM
|
||
|
||
.MACR TIMER A
|
||
JSR PC,.TIME
|
||
.ENDM
|
||
|
||
.MACR UNTIME A
|
||
JSR E,.UTIME
|
||
A
|
||
.ENDM
|
||
|
||
.MACR UTIMER A
|
||
JSR PC,.TIME
|
||
.ENDM
|
||
|
||
.MACR UUNTIM A
|
||
MOV #A,.+20
|
||
ADD USER,.+12
|
||
JSR E,.UTIME
|
||
0
|
||
.ENDM
|
||
.MACR REPT1 A,B
|
||
.XLIST
|
||
.REPT A
|
||
B
|
||
.ENDR
|
||
.LIST
|
||
.ENDM
|
||
.MACR REPT2 A,B,C
|
||
.XLIST
|
||
.REPT A
|
||
B
|
||
C
|
||
.ENDR
|
||
.LIST
|
||
.ENDM
|
||
|
||
|
||
.MACR NOP NUM
|
||
.XLIST
|
||
.IFG NUM
|
||
BR .+<NUM*2>
|
||
NOP <NUM-1>
|
||
.ENDC
|
||
.LIST
|
||
.ENDM
|
||
|
||
.MACR EXCH LOC1,LOC2
|
||
MOV LOC1,EXCH1
|
||
MOV LOC2,LOC1
|
||
MOV EXCH1,LOC2
|
||
.ENDM
|
||
|
||
.MACR PAD A,B
|
||
.PRINT \A B\
|
||
.ENDM
|
||
.STITL TRAP VECTORS
|
||
|
||
|
||
;TRAP VECTORS
|
||
;UNUSED VECTORS
|
||
.=0
|
||
REPT2 100,.+2,IOT ;GO TO 2ND WORD OF VECTOR AND DIE
|
||
|
||
.=TRPBRV
|
||
ERRBK ;TRAP IS USED FOR ERRORS
|
||
0
|
||
|
||
.=TKBRV
|
||
TKBRK ;CONSOLE TTY KEYBOARD
|
||
200 ;IS ON BR4
|
||
|
||
.=TPBRV
|
||
TPBRK ;CONSOLE TTY PRINTER
|
||
200 ;IS ON BR4
|
||
|
||
.=PCBRV
|
||
CLKBRK ;PROGRAMMABLE CLOCK
|
||
300 ;IS ON BR6
|
||
|
||
.=DSKBRV
|
||
DSKBRK ;FIXED HEAD DISK
|
||
300 ;IS ON BR5, INT ROUTINE RUNS ON LEVEL 6
|
||
|
||
.=DISBRV
|
||
DISBRK ;DISPLAY
|
||
240 ;???????????
|
||
|
||
.=DMRBRV
|
||
DMRBRK ;DM11 RECEIVE
|
||
240 ;?
|
||
|
||
.=DMTBRV
|
||
DMTBRK ;DM11 TRANSMIT
|
||
240 ;?
|
||
|
||
.=IOTBRV
|
||
IOTBRK
|
||
340
|
||
|
||
.=EMTBRV
|
||
EMTBK
|
||
340
|
||
|
||
.=DCRBRV ;DC11 RECIEVE
|
||
DCRBRK
|
||
240
|
||
|
||
.=DCTBRV ;DC11 TRANSMIT
|
||
DCTBRK
|
||
240
|
||
.STITL SYSTEM VARIABLES(ONE COPY)
|
||
|
||
|
||
.=400
|
||
JMP START
|
||
.=.+SYPDLL ;SYSTEM PDL
|
||
SPDLP: . ;SYSTEM PDL POINTER
|
||
PAT:
|
||
PATCH: .=.+200 ;PATCH AREA
|
||
PATEND:
|
||
.=770
|
||
LVERNF: VERNF
|
||
.=<.!377>+1
|
||
DMCA=.-NFDMTY
|
||
.=.+40 ;DM11 CURRENT ADDRESS
|
||
DMWC=.-NFDMTY
|
||
.=.+40 ;DM11 -BYTE COUNT
|
||
.=.+40 ;DM11 BIT ASSEMBLY TABLE
|
||
.=.+40 ;UNUSED
|
||
DMTT: .=.+200 ;DM11 TUMBLE TABLE
|
||
|
||
TKBRK: MOV TKB,CHI
|
||
BIC #177600,CHI
|
||
CMP CHI,BRKCHR
|
||
BNE TKBRK1
|
||
MOV PC,BRAKE
|
||
TKBRK1: RTI
|
||
TPBRK: HALT
|
||
DISBRK: HALT
|
||
DMRBRK: HALT
|
||
DMTBRK: HALT
|
||
|
||
TMPDLP: TMPDL
|
||
TMPDL: .=.+<TMPDLL*2>
|
||
ELAPSE: 0
|
||
0
|
||
USER: -1
|
||
ULAST: 0 ;LAST USER WHO WAS RUN
|
||
NULTIM: 0
|
||
0
|
||
TIME: 0 ;TIME IN 1/100 TH'S OF A SEC
|
||
0 ;FROM START OF SYSTEM RUN
|
||
QUANT: 4 ;UQUANT SET FRCM THIS
|
||
UQUANT: 0 ;TIME IN 1/100THS USER SHOULD RUN
|
||
NRABLU: 0 ;NUMBER OF USERS WITH FLSADR=0
|
||
NSWPU: 0 ;NUMBER OF USERS ASSIGNED TO SLOTS BUT NOT YET IN
|
||
NINU: 0 ; " " " " " " AND ALREADY IN
|
||
PUSPSL: 0 ;PREFERED USER SLOT TO SWAP
|
||
PUSRSP: 0 ;PREFERED USER TO SWAP OUT
|
||
SWPLEP: SWPLST ;PLACE TOO PUT NEXT REQ
|
||
SWPLST: .=.+<MNSLTS*2>+2 ;LIST OF SWAP REQUESTS
|
||
MSWPOR: .=.+<16*MNSLTS*2> ;MOBY SWAP IN AND OUT BLOCKS
|
||
SYSWPR: .=.+<16*MNUSRS> ;10 DISK REQUEST BLOCKS FOR GENERAL USE
|
||
DSKCRB: 0 ;CURRENT DISK REQUEST
|
||
SLOTST: .=.+<MNSLTS*4> ;WORD 1 = SLOT USER
|
||
;WORD 2 = NEG, USER COMING IN; 1, USER JUST IN, >1 USER IN A WHILE
|
||
0 ;SO END TEST ALWAYS WORKS
|
||
0
|
||
|
||
DKRTYS: 0 ;# OF DISK RETRYS
|
||
CORTOP: 0 ;FIRST NON-EX LOCATION
|
||
NUNODE: 0 ;NUMBER OF NODES PER USER
|
||
NUSERS: 1 ;NUMBER OF USERS
|
||
NSLOTS: 1 ;NUMBER OF IN CORE SLOTS
|
||
NUSER2: 2
|
||
FOO==0
|
||
.MACR MSWF
|
||
MSWPOR+FOO
|
||
FOO==FOO+34
|
||
.ENDM
|
||
SLTCAD: REPT2 MNSLTS,MSWF,0
|
||
USWCNT: 0 ;NEGATIVE LENGTH OF USER SLOT
|
||
USLENT: 0 ;LENGHT OF SLOT IN BYTES
|
||
DUSECT: 0 ;COUNT OF SYSTEM DISK USAGES MOD 256
|
||
DSKDST: 20000 ;DISK OFFSET( NO USER OR SYSTEM CRAP BEFORE HERE)
|
||
2
|
||
DCLRUS: 20000 ;ADDRESS OF CLEAR USER IMAGE
|
||
2
|
||
DCRBFS: 40000 ;ADDRESS OF RECIEVE BUFFERS
|
||
2
|
||
DCTBFS: 42000 ;ADDRESS OF TRANSMIT BUFFERS
|
||
2
|
||
DSKRND: 140000 ;START OF RANDOM USER STORAGE
|
||
2
|
||
SNXTDB: 100000 ;NEXT BLOCK AVAILABLE
|
||
2
|
||
SDSKAD: 100000 ;BASE OF SYSTEM DISK BLOCKS
|
||
2
|
||
SDBITB: 1 ;SYSTEM DISK BIT TABLE
|
||
REPT1 7,0
|
||
SDBITE: 100000
|
||
SFLAGS: 0 ;RANDOM SYSTEM FLAGS
|
||
LOCKUS: -1 ;INDEX OF USER LOCKED IN CORE
|
||
GCLOCK: -1 ;USER USING GARBAGE COLLLECTOR IS LOCKED IN
|
||
CRMES: .BYTE 15,0 ;CR FOR ERTAP
|
||
RWWSW: 0
|
||
BRKCHR: 0 ;THE BREAK CHAR FOR TODAY!
|
||
JDCSW: 0
|
||
;DISPLAY SYSTEM VARIABLES
|
||
DLEN==400 ;LENGTH OF EACH DISPLAY LIST (IN BYTES)
|
||
DPDLL==60 ;LENGTH OF EACH DISPLAY PDL (IN BYTES)
|
||
TLEN==20 ;LENGTH OF EACH TURTLE LIST (IN BYTES)
|
||
SDPDLL==60*3 ;TOTAL LENGTH OF DISPLAY PDL AREA (IN BYTES)
|
||
SDLEN==400*3 ;TOTAL LENGTH OF DISPLAY LIST AREA (IN BYTES)
|
||
STLEN==20*3 ;TOTAL LENGTH OF TURTLE LIST AREA (IN BYTES)
|
||
|
||
DCONS: ;USER DISPLAY CONSOLE TABLE
|
||
.BYTE 0
|
||
.BYTE 1
|
||
.BYTE 2
|
||
REPT1 5,.BYTE -1
|
||
SDISBT: ;EACH ENTRY HAS A 1 IN THE NTH BIT OVER
|
||
.BYTE 1,2,4
|
||
.EVEN
|
||
|
||
SDPDLP: ;DISPLAY PDL POINTER TABLE
|
||
<DPDL-DISREL>+<DPDLL*<0+1>>
|
||
<DPDL-DISREL>+<DPDLL*<1+1>>
|
||
<DPDL-DISREL>+<DPDLL*<2+1>>
|
||
STLIST: ;TURTLE DISPLAY LIST AREA TABLE
|
||
REPT1 3,TLIST+<TLEN*.RPCNT>
|
||
|
||
;DISPLAY TEMPORARIES
|
||
;THESE MUST BE IN THIS ORDER
|
||
NEWX: .WORD 0,0 ;NEWX IS A TEMPORARY STORAGE FOR ROUTINES
|
||
; LIKE SETXY. IT CONTAINS WHAT CURX WILL BE SET
|
||
; TO IF THE ROUTINE DOESN'T
|
||
; ENCOUNTER A FATAL ERROR
|
||
NEWY: .WORD 0,0 ;LIKE NEWX
|
||
;END OF ORDER
|
||
TUT: 0 ;TURTLE TOP. POINTS TO TOP OF TURTLE DISPLAY LIST
|
||
SNPTEM: 0 ;USED BY GARBAGE COLLECTOR
|
||
|
||
|
||
EXCH1: 0
|
||
.CSRET==-127.
|
||
GCMKL: TOPS
|
||
TOPS1
|
||
GCP1
|
||
GCP2
|
||
GCPREV
|
||
0
|
||
.STITL SYSTEM VARIABLES (ONE COPY PER USER)
|
||
|
||
UBLK=.
|
||
FLSRES: 0 ;REASON USER NOT RUNNING
|
||
FLSADR: 0 ;ADDRESS TO START AT AFTER FLUSH
|
||
UACA: 0
|
||
UACB: 0
|
||
UACC: 0
|
||
UACD: 0
|
||
UACE: 0
|
||
TIMUSD: 0
|
||
0
|
||
UPC: 0 ;PROGRAM COUNTER
|
||
UTTY: 0
|
||
BRAKE: 0
|
||
;DO NOT CHANGE THE ORDER BELOW
|
||
USWPAD: .=.+4 ;BEGINNING OF SWAP AREA
|
||
DTYIBF: .=.+4 ;BEGINING OF TYI BUFFER ON DISK
|
||
DEDTBF: .=.+4 ;BEGINNG OF EDIT BUFFER
|
||
DHDDIR: .=.+4 ;BEGINING OF DISK DIRECTORY(OF HOME DISK)
|
||
UNXTDB: .=.+4 ;NEXT DISK BLOCK AWAILABLE
|
||
UDSKAD: .=.+4 ;RANDOM DISK STORAGE AREA
|
||
|
||
LUBLK==.-UBLK
|
||
L==LUBLK
|
||
|
||
.=.+<MNUSRS-1*LUBLK>
|
||
;NODE TYPES
|
||
SFUN==000000
|
||
INFIX==10000
|
||
UFUN==20000
|
||
UVAR==30000
|
||
TYP1==40000
|
||
;THE FOLLOWING TYPES ARE NEEDED IN THIS ORDER BY THE CONVERT ROUTINES
|
||
SSTR==70000 ;NOT VALID TOKEN TYPE
|
||
SNP==100000
|
||
ATOM==110000
|
||
SNUM==120000 ;NOT A VALID TOKEN TYPE
|
||
LNUM==130000
|
||
LSTR==140000
|
||
RNUM==150000
|
||
LIST==170000
|
||
SENT==LIST
|
||
;END OF ORDER
|
||
|
||
;BINDING TYPES
|
||
FBIND==20000
|
||
VBIND==30000
|
||
SFBIND==120000 ;SWAPPED OUT FUNCTION BINDING
|
||
SVBIND==130000 ;SWAPPED OUT VARIABLE BINDING
|
||
|
||
|
||
;SOE FLAGS SEE OLE MACRO STUFF
|
||
VNAF==2000
|
||
|
||
;READ FLAGS SEE DTBL:
|
||
DOTF==400 ;IN LEFT HALF
|
||
;EVAL FLAGS - PUSHED BY PEVAL
|
||
PTLPF==1 ;PREVIOUS TOKEN WAS LEFT PAREN
|
||
RTF==2 ;REPEAT TOKEN
|
||
CRF==4 ;CURRENT TOKEN IS CR
|
||
EDITF==10 ;EDIT FLAG
|
||
TOF==20 ;TO FLAG
|
||
IFF==40 ;IF FLAG
|
||
TPTF==400 ;THIS PROCEDURE TRACED FLAG ;MUST BE IN LEFT HALF
|
||
|
||
;EVAL FLAGS2 - NOT PUSHED
|
||
TESTF==1
|
||
TRACEF==2
|
||
PQF==4 ;PRINT QUOTE FLAG - FOR PRSTR
|
||
DPQF=10 ;DONT " " "
|
||
MMF==20 ;MULTIPLE MAKE FLAG
|
||
ERRF==40 ;ERROR FLAG
|
||
DSAMFL==1000 ;DISK ALMOST FULL
|
||
PPNAIF==2000 ;P PDL NOT ALL THE WAY IN
|
||
SPNAIF==4000 ;S PDL NOT ALL THE WAY IN
|
||
|
||
;TEMP FLAGS IN TFLAGS
|
||
TF6==1
|
||
TF1==100
|
||
TF2==200
|
||
TF3==400
|
||
TF4==10000
|
||
TF5==20000
|
||
|
||
;FLAGS IN LEFT HALF OF 1ST NODE OF SWAPPED PROC LIST
|
||
; TPTF==400 DEFINED ABOVE
|
||
.STITL USER VARIABLES
|
||
|
||
UVBLK=.
|
||
;BELOW RELATIVE TO BASE OF SLOT WHEN USER NOT RUNNING
|
||
UAB: NODESP-SLOT1 ;BASE OF CURRENT USER'S NODE SPACE
|
||
S: IS-SLOT1
|
||
UPDLP: IP-SLOT1 ;USER PDL POINTER(ONLY WHEN USER NOT RUNNING)
|
||
SPOPL: IS-SLOT1
|
||
SPUSHL: IS-SLOT1-524
|
||
SSWPAD: IS-SLOT1-400+4-2
|
||
SPBASE: IS-SLOT1
|
||
SPRBAO: IS-SLOT1 ;SAME FOR S : S-SPRBAO = REL ADDR OF TOP THING ON S PDL
|
||
PPOPL: IP-SLOT1
|
||
PPUSHL: IP-SLOT1-524
|
||
PSWPAD: IP-SLOT1-400+4-2
|
||
PPBASE: IP-SLOT1
|
||
PRBAO: IP-SLOT1 ;PDL REL BASE ADDR OFFSET
|
||
SUHCT: UHCT-SLOT1 ;START OF USER HASH CODE TABLE
|
||
GCBITS: DBUF-SLOT1
|
||
BASEUS: 0 ;BASE OF USER SLOT(MUST BE LAST RELOCATED)
|
||
UVREND=. ;END OF VARIABLES TO BE RELOCATED
|
||
;BELOW ARE NOT RELATIVE
|
||
UAC: 0 ;EAE AC
|
||
UMQ: 0 ;EAE MQ
|
||
USR: 0 ;EAE STATUS REGISTER
|
||
RELA==1
|
||
RELB==2
|
||
RELC==4
|
||
RELD==10
|
||
RELE==20
|
||
ACRELF: 0
|
||
NNGC: 0 ;NUMBER OF NODES GARBAGE COLLECTED
|
||
ERRINA: -1 ;ADDRESS OF SWAPED IN ERROE ROUTINE
|
||
SSAVEA: 0 ;PLACE S PDL SAVED WHEN MARKING SWAPED OUT PDL
|
||
0
|
||
FREE: SOFN ;START OF FREE NODES
|
||
TOPS: 0 ;GC MARK FROM HERE IF NON 0
|
||
TOPS1: 0 ; "
|
||
GCP1: 0
|
||
GCP2: 0
|
||
GCPREV: 0
|
||
;THE FOLLOWING ARE PUSHED BY PEVAL
|
||
CPP: 0 ;CURRENT PROCEDURE POINTER
|
||
CPSN: 0 ;C.P. SWAP NO.
|
||
CLN: 0 ;CURRENT LINE NO.
|
||
CLP: 0 ;CURRENT LINE POINTER - GOOD IF CPSN'S AGREE
|
||
CLGN: 0 ;CURRENT LINE GENERATION NO.
|
||
CTN: 0 ;CURRENT TOKEN NO.
|
||
CTP: 0 ;CURRENT TOKEN POINTER
|
||
FUNLEV: 0 ;FUNCTION LEVEL
|
||
IFLEV: 0 ;IF LEVEL
|
||
FLAGS: 0 ;FLAG WORD
|
||
CSPDLP: 0 ;CURRENT S PDL PTR AFTER LAST PEVAL PUSH
|
||
CPDLP: 0 ;CURRENT PDL PTR AFTER LAST PEVAL PUSH
|
||
;END OF PEVAL PUSHES EXCEPT REL. S, CO AND CO+2 ARE ALSO PUSHED
|
||
|
||
;THE FOLLOWING ARE PUSHED (SOMETIMES) BY EVAL
|
||
CO: 0 ;CURRENT OPERATOR
|
||
0
|
||
NOR: 0 ;NO. OF OPERANDS STILL NEEDED BEFORE CO CAN BE EXECUTED
|
||
;END OF EVAL PUSHES
|
||
COF: 0 ;CURRENT OPERATOR FLAGS
|
||
LO: 0 ;LAST OPERATOR
|
||
0
|
||
CT: 0 ;CURRENT TOKEN
|
||
0 ; "
|
||
RDFLAG: 0 ;FOR READ
|
||
LISTBD: 0 ;LIST BUILD DEPTH
|
||
PSTOPR: 0 ;RETURN ADDR FOR PSTOP
|
||
UNGRAB: 0 ;FOR .GRAB. PUTTING A NODE ADDR HERE MEANS THAT IT
|
||
;WILL BE THE NEXT GRABBED. GC WILL MARK FROM "UNGRAB"
|
||
;USE WITH CAUTION!!
|
||
TEMP: 0
|
||
TFLAGS: 0 ;TEMP FLAGS (ALL TFN'S SHOULD EVENTALLY POINT HERE)
|
||
NCHR: 0 ;FOR BLST
|
||
TOPRNM: 0 ;PTR TO UOE OF PROC. BEING "TO"'ED
|
||
FNLLP: 0 ;FIRST NODE OF LIST OF LINE POINTERS (FOR "TO")
|
||
FLAGS2: 0 ;EVAL FLAGS - NOT PUSHED BY PEVAL
|
||
ALTL: 0 ;TEST LINE POINTER
|
||
LINENO: 0 ;FOR TEST MODE
|
||
CHI: 0 ;FOR TYI
|
||
PRMTCH: '? ;PROMPT CHAR
|
||
GNCN: 0 ;"GET NEXT CHAR" NODE
|
||
0
|
||
NBKTS: 0 ;FOR RDSTR
|
||
PCHR: TYO ;PLACE WHERE OUTPUT CHARS GO (TYO, BLST, ...)
|
||
DBITTB: .=.+40
|
||
DBITBE=.-2
|
||
|
||
|
||
;VARIABLES AND CONSTANTS FOR DISPLAY SYSTEM
|
||
|
||
;THESE MUST BE IN THIS ORDER
|
||
DORBEG==. ;MARKS BEGINNING OF THESE VARIABLES
|
||
CURX: .WORD 0,0 ;CURX = CURRENT X POSITION
|
||
; THE FIREST WORD IS THE INTEGER PART
|
||
; THE SECOND WORD IS THE FRACTION PART
|
||
CURY: .WORD 0,0 ;CURY = CURRENT Y POSITION
|
||
CURA: 0 ;CURA = THE CURRENT ANGLE
|
||
OLDX: 0 ;CONTAINS CURX AT THE TIME OF LAST NEW SNAP
|
||
OLDY: 0 ;CONTAINS CURY AT THE TIME OF LAST NEW SNAP
|
||
OLDIR: .BYTE 0 ;CONTAINS DIREC WHEN DR.LIN LAST CALLED
|
||
DFLAGS: .BYTE 0
|
||
.EVEN
|
||
|
||
DOREND==. ;MARKS END OF THESE VARIABLES
|
||
;END OF ORDER
|
||
|
||
STB: 0 ;STATIC AREA BOTTOM
|
||
STT: 0 ;STATIC AREA TOP.POINTS TO TOP OF STATIC DISPLAY AREA
|
||
DYB: 0 ;DYNAMIC BOTTOM. POINTS TO BOT OF DY AREA
|
||
DYR: 0 ;ROVING POINTER USED BY DISPLAY STORAGE ALLOCATIN ROUTINES
|
||
DYT: 0 ;POINTER TO DYNAMIC AREA TOP
|
||
TUB: 0 ;POINTER TO TURTLE AREA BOTTOM
|
||
SNLIST: 0 ;POINTER TO SNAP LIST
|
||
SNABOT: 0 ;BOTTOM OF CURRENT SNAP
|
||
SINA: 0 ;CONTAINS SIN OF THE CURENT ANGLE
|
||
COSA: 0 ;CONTAINS COS OF THE CURENT ANGLE
|
||
DIREC: 0 ;CONTAINS DIRECTION CODE FRO CURRENT ANGLE
|
||
BYCNT: 0 ;KEEPS TRACK OF LAST BIT IN DISPLAY LIST
|
||
PUSHJT: 0 ;DISPLAY PUSHJ TO TURTLE
|
||
DISBIT: 0 ;HAS A BIT SET CORRESPONDING TO DISPLAY SLOT
|
||
|
||
|
||
;THIS MUST BE AT THE END
|
||
MAXELN==60
|
||
ERRBUF: .=.+MAXELN
|
||
LUVBLK==.-UVBLK
|
||
|
||
|
||
;DISPLAY COMMANDS
|
||
ADDX==150000
|
||
ADDY==144000
|
||
ADDXY==ADDX!ADDY
|
||
DPUSHJ==100000
|
||
DPOP==140200
|
||
DPOPJ==140100
|
||
DSTOP==140400
|
||
DRSTXY==143000 ;RESET X AND Y TO 0
|
||
|
||
TURSIZ==4 ;THE SIZE OF THE TURTLE
|
||
|
||
;FLAGS USED FOR DFLAGS
|
||
PENUF==1
|
||
HOOKF==2
|
||
HIDETF==4
|
||
TURTF==10
|
||
TEMF==20
|
||
.STITL SYSTEM OBLIST
|
||
|
||
VARIABLE==4 ;FOR VARIABLE NUMBER OF ARGUMENTS
|
||
$==-1 ;DEFAULT INDICATOR IN OLE
|
||
YINFIX==20 ;"YES INFIX" FLAG FOR OLE
|
||
;ARGUMENT TYPES
|
||
; 0 ==== ANYTHING
|
||
ANYT==0
|
||
ATOMT==1
|
||
WORDT==ATOMT ;A WORD IS THE SAME AS AN ATOM
|
||
NUMT==2
|
||
SENTT==4
|
||
SNAPT==10
|
||
LISTT==20
|
||
ANSLT==ATOMT+NUMT+SENTT+LISTT ;ALL BUT SNAP
|
||
|
||
;SOE FIELDS 1.==RIGHT BYTE (EVEN ADDR) 2.==LEFT BYTE
|
||
; 1.1==RIGHT BIT 2.8==LEFT BIT
|
||
;1.1-1.8 INPUT TYPE ACCEPTABLE BY THIS PROCEDURE
|
||
;2.1-2.2 "STANDARD" NO. OF INPUT ARGS
|
||
;2.3 VNAF 1==CAN TAKE "ANY" NO. OF ARGS
|
||
;2.5 INFIX 1==THIS IS AN INFIX PROCEDURE
|
||
;2.6-2.8 PRECEDENCE
|
||
|
||
.MACR NGPTWO A
|
||
.XLIST
|
||
NGP2=NGP2*2
|
||
FOO==A
|
||
.IFLE NGP2-FOO
|
||
NGPTWO A
|
||
.ENDC
|
||
.LIST
|
||
.ENDM
|
||
|
||
|
||
|
||
|
||
;****************************************************
|
||
;MACRO TO DEFINE SYSTEM OBLIST ELEMENTS
|
||
;THE PARAMETERS ARE:
|
||
;1) THE PRINT NAME
|
||
;2) THE NAME OF THE POINTER TO THE OBLIST ELEMENT.
|
||
; THIS PARAMETER CAN BE $ IF YOU DON'T CARE ABOUT THE
|
||
; NAME, OR IF YOU WANT THE NAME TO BE $PNAME
|
||
;3) THE ADDRESS OF THE PROGRAM
|
||
; THIS PARAMETER CAN BE $ IF THE NAME OF THE PROGRAM
|
||
; IS THE SAME AS THE PRINT NAME
|
||
;4) THE PRECEDENCE. A NUMBER FROM 0-7
|
||
;5) THE TYPE OF PERMISSIBLE ARGUMENTS
|
||
; IF IT CAN TAKE MORE THAN ONE KIND OF ARGUMENT
|
||
; ADD UP ALL THE KINDS. EG NUMT+LISTT+ATOMT
|
||
;6) THE STANDARD NUMBER OF ARGUMENTS + THE SYMBOL "VARIABLE"
|
||
; IF IT CAN ALSO TAKE A VARIABLE NUMBER OF ARGUMENTS
|
||
;7) THE SYMBOL "YINFIX" IF THIS IS AN INFIX OPERATOR
|
||
|
||
;
|
||
;IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
|
||
|
||
;ANY PARAMETER THAT YOU WANT TO BE 0 YOU CAN LEAVE OUT
|
||
;ANY PARAMETER YOU DON'T CARE ABOUT YOU CAN LEAVE OUT.
|
||
|
||
|
||
|
||
.MACR OLE PNAME,OBNAME,ADDR,PRECED,ARGTYP,NUMARG,QINFIX
|
||
.XLIST
|
||
OBX0=OBSTRT-. ;CHECK TO SEE THAT THE OBLIST DOESN'T
|
||
;OVERWRITE THE OBLIST ELEMENTS
|
||
.IF2
|
||
.IFNDF OBNAME
|
||
OBNAME=0 ;TO AVOID UNDEFINED SYMBOL ERROR
|
||
.ENDC
|
||
.ENDC
|
||
.IFG OBX0
|
||
OBADD2 ;POINTER TO OBLIST ELEMENT
|
||
OBADD1=.
|
||
.=OBADD2
|
||
.IFL OBNAME+0 ;$ HAS BEEN DEFINED TO BE -1
|
||
$'PNAME=.
|
||
.ENDC
|
||
.IFGE OBNAME+0
|
||
$'OBNAME=.
|
||
.ENDC
|
||
|
||
|
||
.BYTE ARGTYP+0
|
||
OBX1=NUMARG+0
|
||
OBX2=PRECED+0*40
|
||
.BYTE QINFIX+OBX1+OBX2
|
||
|
||
.IFL ADDR+0
|
||
PNAME ;ADDRESS OF PROGRAM
|
||
.ENDC
|
||
.IFGE ADDR+0
|
||
ADDR+0
|
||
.ENDC
|
||
|
||
TEXT ^\PNAME\
|
||
|
||
OBADD2=.
|
||
.=OBADD1
|
||
.ENDC
|
||
|
||
.IFLE OBX0
|
||
.LIST
|
||
********
|
||
NUMOBS IS LESS THAN THE NUMBER OF SYSTEM OBLIST ELEMENTS.
|
||
THEREFORE, YOU ARE OVERWRITING THE SYSTEM OBLIST
|
||
********
|
||
.XLIST
|
||
.ENDC
|
||
.LIST
|
||
.ENDM
|
||
.MACR CDM A
|
||
A==<.-SOBLSU>/2
|
||
.ENDM
|
||
;THE SYSTEM OBLIST
|
||
;ADD ITEMS (EXCEPT FOR SPECIAL CHAR ITEMS) ALPHABETICALLY.
|
||
|
||
|
||
;****
|
||
NUMOBS==91. ;THE NUMBER OF OBLIST ELEMENTS
|
||
;**** WHENEVER YOU ADD AN OBLIST ELEMENT, MAKE SURE YOU INCREMENT
|
||
;**** NUMOBS !!!!!!
|
||
SOOMX: 2+SOBLSU ;2 > THAN HIGHEST ADDR USED IN SYS OBLIST
|
||
NGP2==1
|
||
NGPTWO SOBLSU-SOBLST+2
|
||
SOBP2: NGP2 ;( SMALLEST POWER OF 2 >= NUMOBS )*2
|
||
OBADD1=.
|
||
OBADD2=.+<2*NUMOBS>
|
||
OBSTRT=OBADD2 ;WHERE THE SYSTEM OBLIST ELEMENTS START
|
||
|
||
SOBLST: OLE AND,$
|
||
OLE BACK,$,$,2,NUMT,1
|
||
OLE BUTFIRST,$,$,2,ANYT,1
|
||
OLE BUTLAST,$,$,2,ANYT,1
|
||
OLE COUNT,$,$,2,ANYT,1
|
||
OLE CTF,$,CLRSTF,2
|
||
OLE DIFFERENCE,$,DIFF,2,NUMT,2
|
||
OLE DISPLAY,$,$,2,LISTT+SNAPT,1
|
||
OLE DO,$,$,2,,1
|
||
OLE EDIT,$,$,2
|
||
OLE ELSE,$,$,2
|
||
OLE EMPTYP,$,$,2,ANYT,1
|
||
OLE END,$,$,2
|
||
OLE EQUAL,$,$,2,NUMT,2
|
||
OLE ERASETRACE,$,ETRACE,2,,1
|
||
OLE FIRST,$,$,2,ANYT,1
|
||
OLE FORWARD,$,$,2,NUMT,1
|
||
OLE FPRINT,$,$,2,,1+VARIABLE
|
||
OLE FPUT,$,$,2,,2+VARIABLE
|
||
OLE GO,$,$,2,NUMT,1
|
||
OLE GREATER,$,GREATR,2,NUMT,2
|
||
OLE HEADING,$,$,2
|
||
OLE HERE,$,$,2
|
||
OLE HIDETURTLE,$,$,2
|
||
OLE HOME,$,$,2
|
||
OLE IF,$,$,2,WORDT,1
|
||
OLE KILLDISPLAY,$,$,2
|
||
OLE LAMPOFF,LPOFF,$,2
|
||
OLE LAMPON,LPON,$,2
|
||
OLE LAST,$,$,2,ANYT,1
|
||
OLE LEFT,$,$,2,NUMT,1
|
||
OLE LESS,$,$,2,NUMT,2
|
||
OLE LEVEL,$,FLEV,2
|
||
OLE LIST,$,LIST.P,2,,2+VARIABLE
|
||
OLE LISTP,$,$,2,,1
|
||
OLE LPUT,$,$,2,,2+VARIABLE
|
||
OLE MAKE,$,$,2,,2
|
||
OLE MOD,$,$,2,NUMT,2
|
||
OLE NEWSNAP,$,$,2
|
||
OLE NUMBERP,$,NUMBP,2,ANYT,1
|
||
OLE OF,$
|
||
OLE OUTPUT,$,$,2,0,1
|
||
OLE PENDOWN,$,$,2
|
||
OLE PENUP,$,$,2
|
||
OLE PRINT,$,$,2,ANSLT,1+VARIABLE
|
||
OLE PRODUCT,$,PROD,2,NUMT,2+VARIABLE
|
||
OLE QUOTIENT,$,DIVDE,2,NUMT,2
|
||
OLE REQUEST,$,RQUEST,2
|
||
OLE RIGHT,$,$,2,NUMT,1
|
||
OLE RUG,$,RUNRUG
|
||
OLE SENTENCE,$,$,2,ANYT,2+VARIABLE
|
||
OLE SETHEADING,$,$,2,NUMT,1
|
||
OLE SETTURTLE,$,$,2,SENTT,1
|
||
OLE SETX,$,$,2,NUMT,1
|
||
OLE SETXY,$,$,2,NUMT,2
|
||
OLE SETY,$,$,2,NUMT,1
|
||
OLE SHOW,$,$,2,,1
|
||
OLE SHOWTURTLE,$,$,2
|
||
OLE SNAP,$,$,2
|
||
OLE STARTDISPLAY,$,$,2
|
||
OLE STF,$,SETSTF,2
|
||
OLE STOP,$,$,2
|
||
OLE SUM,$,$,2,NUMT,2+VARIABLE
|
||
OLE THEN,$,$,2
|
||
OLE TO,$,$,2
|
||
OLE TOOT,$,$,2,NUMT,1
|
||
OLE TRACE,$,$,2,,1
|
||
OLE TYPE,$,$,2,ANSLT,1+VARIABLE
|
||
OLE VERSION,$,VERSN,2
|
||
OLE WIPE,$,$,2,ATOMT+NUMT,1
|
||
OLE WIPECLEAN,$,$,2
|
||
OLE WORD,$,$,2,ANYT,2+VARIABLE
|
||
OLE WORDP,$,$,2,ANYT,1
|
||
OLE XCOR,$,$,2
|
||
SOBLSU: OLE YCOR,$,$,2 ;MUST BE ON LAST ENTRY BEFORE SINGLE CHAR ENTRIES
|
||
OLE ^\!\,LLPAR,LLPAR,1,ANYT,1
|
||
CDM HAS$
|
||
OLE ^\#\,PROC,PROC,6,ATOMT,1
|
||
CDM LP$
|
||
OLE ^\(\,LPAR,LPAR,1,,1
|
||
CDM RP$
|
||
OLE ^\)\,RPAR,RPAR,1
|
||
CDM PRD$
|
||
OLE ^\*\,STAR,PROD,5,NUMT,2+VARIABLE,YINFIX
|
||
CDM PLU$
|
||
OLE ^\+\,PLUS,SUM,4,NUMT,2+VARIABLE,YINFIX
|
||
OLE ^\+.\,UPLUS,UPLUS,6,NUMT,1
|
||
CDM MIN$
|
||
OLE ^\-\,MINUS,DIFF,4,NUMT,2,YINFIX
|
||
OLE ^\-.\,UMINS,UMINS,6,NUMT,1
|
||
CDM DIV$
|
||
OLE ^\/\,SLSH,DIVDE,5,NUMT,2,YINFIX
|
||
CDM DOTS$
|
||
OLE ^\:\,DOTS,DOTS,6,ATOMT,1
|
||
CDM LSS$
|
||
OLE ^\<\,LESS,LESS,3,NUMT,2,YINFIX
|
||
CDM EQL$
|
||
OLE ^\=\,EQUAL,EQUAL,3,NUMT,2,YINFIX
|
||
CDM GTR$
|
||
OLE ^\>\,GRTR,GREATR,3,NUMT,2,YINFIX
|
||
CDM BKSL$
|
||
; OLE ^/^/,BKSL,MOD,5,NUMT,2,YINFIX
|
||
|
||
.=OBADD2
|
||
|
||
.STITLE DISPATCH TABLE (ENGLISH)
|
||
;FLAGS--
|
||
;FSF -- SPECIAL ON INPUT
|
||
;FOF -- SPECIAL ON OUTPUT
|
||
;FQF -- QUOTING CHARACTER
|
||
;SEPF -- SEPARATOR CHARACTER
|
||
;WSF -- WORD SEPARATOR
|
||
;NNUMF -- NOT A NUMBER
|
||
;OPERF -- OPERATOR
|
||
|
||
;FLAGS--BYTE ONE NUMBER--BYTE TWO
|
||
; FSF FOF FQF SEPF WSF NNUMF OPERF #
|
||
;^@ . . . . . NNUMF . .
|
||
;^A . . . . . NNUMF . .
|
||
;^B . FOF . . . NNUMF . 0
|
||
;^C FSF . . . . NNUMF . 0
|
||
;^D FSF . . . . NNUMF . 2
|
||
;^E . . . . . NNUMF . .
|
||
;^F . . . . . NNUMF . .
|
||
;^G FSF FOF . . . NNUMF . 4
|
||
;^H . FOF . . . NNUMF . 2
|
||
;^I . FOF . SEPF WSF NNUMF . 10
|
||
;^J . FOF . SEPF WSF NNUMF . 12
|
||
;^K . FOF . SEPF WSF NNUMF . 14
|
||
;^L . FOF . SEPF WSF NNUMF . 16
|
||
;^M FSF FOF . SEPF WSF NNUMF . 6
|
||
;^N FSF . . . . NNUMF . 10
|
||
;^O . . . . . NNUMF . .
|
||
;^P . . . . . NNUMF . .
|
||
;^Q FSF . . . . NNUMF . 12
|
||
;^R FSF . . . . NNUMF . 14
|
||
;^S FSF . . . . NNUMF . 16
|
||
;^T . . . . . NNUMF . .
|
||
;^U . . . . . NNUMF . .
|
||
;^V . . . . . NNUMF . .
|
||
;^W FSF . . . . NNUMF . 20
|
||
;^X FSF . . . . NNUMF . 22
|
||
;^Y FSF . . . . NNUMF . 24
|
||
;^Z FSF . . . . NNUMF . 26
|
||
;^[ . . . . . NNUMF . .
|
||
;^\ . . . . . NNUMF . .
|
||
;^] . . . . . NNUMF . .
|
||
;^^ . . . . . NNUMF . .
|
||
;^_ . . . . . NNUMF . .
|
||
|
||
;SP . . . SEPF WSF NNUMF . .
|
||
;! . . . . . NNUMF . .
|
||
;" . . . SEPF . NNUMF . .
|
||
;# . . . SEPF . NNUMF OPERF HAS$
|
||
;$ . . . . . NNUMF . .
|
||
;% . . . . . NNUMF . .
|
||
;& . . . . . NNUMF . .
|
||
;' . . . SEPF . NNUMF . .
|
||
;( . . . SEPF . NNUMF OPERF LP$
|
||
;) . . . SEPF . NNUMF OPERF RP$
|
||
;* . . . SEPF . NNUMF OPERF PRD$
|
||
;+ . . . SEPF . NNUMF OPERF PLU$
|
||
;, . . . . . NNUMF . .
|
||
;- . . . SEPF . NNUMF OPERF MIN$
|
||
;. . . . . . NNUMF . .
|
||
;/ . . . SEPF . NNUMF OPERF DIV$
|
||
;0 . . . . . . . .
|
||
;1 . . . . . . . .
|
||
;2 . . . . . . . .
|
||
;3 . . . . . . . .
|
||
;4 . . . . . . . .
|
||
;5 . . . . . . . .
|
||
;6 . . . . . . . .
|
||
;7 . . . . . . . .
|
||
;8. . . . . . . . .
|
||
;9. . . . . . . . .
|
||
;: . . . SEPF . NNUMF OPERF DOTS$
|
||
;; . . . SEPF . NNUMF . .
|
||
;< . . . SEPF . NNUMF OPERF LSS$
|
||
;= . . . SEPF . NNUMF OPERF EQL$
|
||
;> . . . SEPF . NNUMF OPERF GTR$
|
||
;? . . . . . NNUMF . .
|
||
|
||
;@ . . . . . NNUMF . .
|
||
;A . . . . . NNUMF . .
|
||
;B . . . . . NNUMF . .
|
||
;C . . . . . NNUMF . .
|
||
;D . . . . . NNUMF . .
|
||
;E . . . . . NNUMF . .
|
||
;F . . . . . NNUMF . .
|
||
;G . . . . . NNUMF . .
|
||
;H . . . . . NNUMF . .
|
||
;I . . . . . NNUMF . .
|
||
;J . . . . . NNUMF . .
|
||
;K . . . . . NNUMF . .
|
||
;L . . . . . NNUMF . .
|
||
;M . . . . . NNUMF . .
|
||
;N . . . . . NNUMF . .
|
||
;O . . . . . NNUMF . .
|
||
;P . . . . . NNUMF . .
|
||
;Q . . . . . NNUMF . .
|
||
;R . . . . . NNUMF . .
|
||
;S . . . . . NNUMF . .
|
||
;T . . . . . NNUMF . .
|
||
;U . . . . . NNUMF . .
|
||
;V . . . . . NNUMF . .
|
||
;W . . . . . NNUMF . .
|
||
;X . . . . . NNUMF . .
|
||
;Y . . . . . NNUMF . .
|
||
;Z . . . . . NNUMF . .
|
||
;[ . . FQF SEPF WSF NNUMF . 0
|
||
;\ . . . . . NNUMF . .
|
||
;] . . FQF SEPF WSF NNUMF . 2
|
||
;^ . . . SEPF . NNUMF OPERF BKSL$
|
||
;_ . . . SEPF . NNUMF . .
|
||
|
||
;` . . . . . NNUMF . .
|
||
;a . . . . . NNUMF . .
|
||
;b . . . . . NNUMF . .
|
||
;c . . . . . NNUMF . .
|
||
;d . . . . . NNUMF . .
|
||
;e . . . . . NNUMF . .
|
||
;f . . . . . NNUMF . .
|
||
;g . . . . . NNUMF . .
|
||
;h . . . . . NNUMF . .
|
||
;i . . . . . NNUMF . .
|
||
;j . . . . . NNUMF . .
|
||
;k . . . . . NNUMF . .
|
||
;l . . . . . NNUMF . .
|
||
;m . . . . . NNUMF . .
|
||
;n . . . . . NNUMF . .
|
||
;o . . . . . NNUMF . .
|
||
;p . . . . . NNUMF . .
|
||
;q . . . . . NNUMF . .
|
||
;r . . . . . NNUMF . .
|
||
;s . . . . . NNUMF . .
|
||
;t . . . . . NNUMF . .
|
||
;u . . . . . NNUMF . .
|
||
;v . . . . . NNUMF . .
|
||
;w . . . . . NNUMF . .
|
||
;x . . . . . NNUMF . .
|
||
;y . . . . . NNUMF . .
|
||
;z . . . . . NNUMF . .
|
||
;{ . . . . . NNUMF . .
|
||
;| . . . . . NNUMF . .
|
||
;} . . . . . NNUMF . .
|
||
;~ . . . . . NNUMF . .
|
||
;RBO FSF . . . . NNUMF . 30
|
||
|
||
.STITLE SYSTEM DISPATCH TABLE (BYTE ONE)
|
||
|
||
;FLAG DEFINITIONS
|
||
FSF==200 ;SPECIAL INPUT
|
||
FOF==100 ;SPECIAL OUTPUT
|
||
FQF==20 ;QUOTING
|
||
SEPF==4 ;SEPARATOR
|
||
WSF==2 ;WORD SEPARATOR
|
||
NNUMF==40 ;NOT A NUMBER
|
||
OPERF==10 ;OPERATOR
|
||
|
||
DTBL:
|
||
.BYTE NNUMF,NNUMF ;^@ ;^A
|
||
.BYTE FOF!NNUMF,FSF!NNUMF ;^B ECHOES AS BLANK ;^C COPYS NEXT CHARACTER
|
||
.BYTE FSF!NNUMF,NNUMF ;^D DELETES NEXT CHARACTER ;^E
|
||
.BYTE NNUMF,FSF!FOF!NNUMF ;^F ;^G BREAK
|
||
.BYTE FOF!NNUMF,FOF!SEPF!WSF!NNUMF ;^H BACKSPACE ;^I TABULATE
|
||
.BYTE FOF!SEPF!WSF!NNUMF,FOF!SEPF!WSF!NNUMF ;^J LINE FEED ;^K TABULATE VERTICALLY
|
||
.BYTE FOF!SEPF!WSF!NNUMF,FSF!FOF!SEPF!WSF!NNUMF ;^L FORM FEED ;^M CARRIAGE RETURN ECHOES AS CARRIAGE RETURN LINE FEED
|
||
.BYTE FSF!NNUMF,NNUMF ;^N GET NEXT WORD ;^O
|
||
.BYTE NNUMF,FSF!NNUMF ;^P ;^Q SUPER-QUOTE
|
||
.BYTE FSF!NNUMF,FSF!NNUMF ;^R COPY REST OF LINE ;^S SKIP NEXT WORD
|
||
.BYTE NNUMF,NNUMF ;^T ;^U
|
||
.BYTE NNUMF,FSF!NNUMF ;^V ;^W ERASE LAST WORD
|
||
.BYTE FSF!NNUMF,FSF!NNUMF ;^X CLARIFY INPUT ;^Y EDIT PREVIOUS LINE
|
||
.BYTE FSF!NNUMF,NNUMF ;^Z DESTROY INPUT BUFFER ;^[ MAYBE ALTMODE
|
||
.BYTE NNUMF,NNUMF ;^\ ;^]
|
||
.BYTE NNUMF,NNUMF ;^^ ;^_ WELL, ANY BETTER IDEAS FOR THEM?
|
||
.BYTE SEPF!WSF!NNUMF,NNUMF ;SP ;! ?????
|
||
.BYTE SEPF!NNUMF,SEPF!NNUMF!OPERF ;" ;# ACTION OF
|
||
.BYTE NNUMF,NNUMF ;$ ;%
|
||
.BYTE NNUMF,NNUMF!OPERF ;& ;' (MAYBE LE)
|
||
.BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF!OPERF ;( ARITHMETIC GROUPING ;) DITTO
|
||
.BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF!OPERF ;* MULTIPLY ;+ ADD
|
||
.BYTE NNUMF,SEPF!NNUMF!OPERF ;, ;- SUBTRACT
|
||
.BYTE NNUMF,SEPF!NNUMF!OPERF ;. ;/ DIVIDE
|
||
.BYTE 0,0 ;0 ;1
|
||
.BYTE 0,0 ;2 ;3
|
||
.BYTE 0,0 ;4 ;5
|
||
.BYTE 0,0 ;6 ;7
|
||
.BYTE 0,0 ;8. ;9.
|
||
.BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF ;: THING OF ;; PROPERTY OF
|
||
.BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF!OPERF ;< ;=
|
||
.BYTE SEPF!NNUMF!OPERF,NNUMF ;> ;?
|
||
.BYTE NNUMF,NNUMF ;@ ;A
|
||
.BYTE NNUMF,NNUMF ;B ;C
|
||
.BYTE NNUMF,NNUMF ;D ;E
|
||
.BYTE NNUMF,NNUMF ;F ;G
|
||
.BYTE NNUMF,NNUMF ;H ;I
|
||
.BYTE NNUMF,NNUMF ;J ;K
|
||
.BYTE NNUMF,NNUMF ;L ;M
|
||
.BYTE NNUMF,NNUMF ;N ;O
|
||
.BYTE NNUMF,NNUMF ;P ;Q
|
||
.BYTE NNUMF,NNUMF ;R ;S
|
||
.BYTE NNUMF,NNUMF ;T ;U
|
||
.BYTE NNUMF,NNUMF ;V ;W
|
||
.BYTE NNUMF,NNUMF ;X ;Y
|
||
.BYTE NNUMF,FQF!SEPF!WSF!NNUMF ;Z ;[
|
||
.BYTE NNUMF,FQF!SEPF!WSF!NNUMF ;\ LOGICAL OR ;]
|
||
.BYTE SEPF!NNUMF!OPERF,SEPF!NNUMF ;^ EXPONENTIATE, MAYBE ;_ MAKE
|
||
.BYTE NNUMF,NNUMF ;` GRAVE ACCENT. LOOK THAT UP ON YOUR TELTERM. ;a LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;b LOWER CASE ;c LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;d LOWER CASE ;e LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;f LOWER CASE ;g LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;h LOWER CASE ;i LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;j LOWER CASE ;k LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;l LOWER CASE ;m LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;n LOWER CASE ;o LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;p LOWER CASE ;q LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;r LOWER CASE ;s LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;t LOWER CASE ;u LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;v LOWER CASE ;w LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;x LOWER CASE ;y LOWER CASE
|
||
.BYTE NNUMF,NNUMF ;Z LOWER CASE ;LEFT BRACE
|
||
.BYTE NNUMF,NNUMF ;VERTICAL BAR ;RIGHT BRACE
|
||
.BYTE NNUMF,FSF!NNUMF ;TILDE ;RUBOUT
|
||
|
||
.STITLE SYSTEM DISPATCH TABLE (BYTE TWO)
|
||
;NUMBERS POINT TO OTHER TABLES
|
||
;$ POINTS TO SYSTEM OBLIST
|
||
|
||
DTBL2:
|
||
.BYTE 0,0 ;^@ ;^A
|
||
.BYTE 0,0 ;^B ECHOES AS BLANK ;^C COPYS NEXT CHARACTER
|
||
.BYTE 2,0 ;^D DELETES NEXT CHARACTER ;^E
|
||
.BYTE 0,4 ;^F ;^G BREAK
|
||
.BYTE 2,10 ;^H BACKSPACE ;^I TABULATE
|
||
.BYTE 12,14 ;^J LINE FEED ;^K TABULATE VERTICALLY
|
||
.BYTE 16,6 ;^L FORM FEED ;^M CARRIAGE RETURN ECHOES AS CARRIAGE RETURN LINE FEED
|
||
.BYTE 10,0 ;^N GET NEXT WORD ;^O
|
||
.BYTE 0,12 ;^P ;^Q SUPER-QUOTE
|
||
.BYTE 14,16 ;^R ;^S SKIP NEXT WORD
|
||
.BYTE 0,0 ;^T ;^U
|
||
.BYTE 0,20 ;^V ;^W ERASE LAST WORD
|
||
.BYTE 22,24 ;^X CLARIFY INPUT ;^Y
|
||
.BYTE 26,0 ;^Z DESTROY INPUT BUFFER ;^[ MAYBE ALTMODE
|
||
.BYTE 0,0 ;^\ ;^]
|
||
.BYTE 0,0 ;^^ ;^_ WELL, ANY BETTER IDEAS FOR THEM?
|
||
.BYTE 0,0 ;SP ;! ?????
|
||
.BYTE 0,HAS$ ;" ;# ACTION OF
|
||
.BYTE 0,0 ;$ ;%
|
||
.BYTE 0,0 ;& ;' (MAYBE LE)
|
||
.BYTE LP$,RP$ ;( ARITHMETIC GROUPING ;) DITTO
|
||
.BYTE PRD$,PLU$ ;* MULTIPLY ;+ ADD
|
||
.BYTE 0,MIN$ ;, ;- SUBTRACT
|
||
.BYTE 0,DIV$ ;. ;/ DIVIDE
|
||
.BYTE 0,0 ;0 ;1
|
||
.BYTE 0,0 ;2 ;3
|
||
.BYTE 0,0 ;4 ;5
|
||
.BYTE 0,0 ;6 ;7
|
||
.BYTE 0,0 ;8. ;9.
|
||
.BYTE DOTS$,0 ;: THING OF ;; PROPERTY OF
|
||
.BYTE LSS$,EQL$ ;< ;=
|
||
.BYTE GTR$,0 ;> ;?
|
||
.BYTE 0,0 ;@ ;A
|
||
.BYTE 0,0 ;B ;C
|
||
.BYTE 0,0 ;D ;E
|
||
.BYTE 0,0 ;F ;G
|
||
.BYTE 0,0 ;H ;I
|
||
.BYTE 0,0 ;J ;K
|
||
.BYTE 0,0 ;L ;M
|
||
.BYTE 0,0 ;N ;O
|
||
.BYTE 0,0 ;P ;Q
|
||
.BYTE 0,0 ;R ;S
|
||
.BYTE 0,0 ;T ;U
|
||
.BYTE 0,0 ;V ;W
|
||
.BYTE 0,0 ;X ;Y
|
||
.BYTE 0,0 ;Z ;[
|
||
.BYTE 0,2 ;\ LOGICAL OR ;]
|
||
.BYTE BKSL$,0 ;^ TEMPORARILY MODULO (MAYBE EXPONENTIATE) ;_ MAKE
|
||
.BYTE 0,0 ;` GRAVE ACCENT. LOOK THAT UP ON YOUR TELTERM. ;a LOWER CASE
|
||
.BYTE 0,0 ;b LOWER CASE ;c LOWER CASE
|
||
.BYTE 0,0 ;d LOWER CASE ;e LOWER CASE
|
||
.BYTE 0,0 ;f LOWER CASE ;g LOWER CASE
|
||
.BYTE 0,0 ;h LOWER CASE ;i LOWER CASE
|
||
.BYTE 0,0 ;j LOWER CASE ;k LOWER CASE
|
||
.BYTE 0,0 ;l LOWER CASE ;m LOWER CASE
|
||
.BYTE 0,0 ;n LOWER CASE ;o LOWER CASE
|
||
.BYTE 0,0 ;p LOWER CASE ;q LOWER CASE
|
||
.BYTE 0,0 ;r LOWER CASE ;s LOWER CASE
|
||
.BYTE 0,0 ;t LOWER CASE ;u LOWER CASE
|
||
.BYTE 0,0 ;v LOWER CASE ;w LOWER CASE
|
||
.BYTE 0,0 ;x LOWER CASE ;y LOWER CASE
|
||
.BYTE 0,0 ;z LOWER CASE ;{ OPEN BRACE
|
||
.BYTE 0,0 ;| VERTICAL BAR, MAYBE OR, MAYBE XOR ;} CLOSE BRACE
|
||
.BYTE 0,30 ;~ TILDE, LOGICAL NOT ;RBO RUBOUT????
|
||
.STITL LOSS CHECKING ROUTINES
|
||
|
||
IOTBRK: INC #-4
|
||
LOSSCT=.-2
|
||
BGT LOSER
|
||
SPUSH A
|
||
SPUSH USER
|
||
MOV #-1,USER
|
||
PRCR
|
||
PRTXT ^/BAD TRAP--VECTOR /
|
||
MOV 6(SP),A
|
||
SUB #4,A ;MAKE IT REAL
|
||
CMP #BEBRV,A ;IS IT A BUS ERROR?
|
||
BEQ BUSSER
|
||
JSR PC,PRON
|
||
PRTXT ^/ TRAPPED FROM /
|
||
MOV 12(SP),A
|
||
JSR PC,PRON
|
||
PRCR
|
||
SPOP USER
|
||
SPOP A
|
||
ADD #4,SP
|
||
RTI
|
||
EMTBRK: HALT
|
||
BUSSER: PRTXT ^/BUSS ERROR!!!/
|
||
LOSER: PRTXT ^/I GIVE UP!!/
|
||
HALT
|
||
BR .-2
|
||
.STITL DISK STARTER
|
||
|
||
|
||
|
||
DSKSRT: MOV #DCRDRB,A ;CHECK FOR DC11 RECIEVE FIRST
|
||
TST 14(A)
|
||
BNE DSKSGO
|
||
MOV #SYSWPR,A ;NEXT LOOK AT SYSTEM REQUESTS
|
||
DSKSR1: TSTB 14(A) ;IS THE FUNCTION NON ZERO?
|
||
BNE DSKSGO ;FOUND A REQUEST, GO DO IT
|
||
ADD #16,A ;LOOK AT NEXT BLOCK
|
||
CMP #16*MNUSRS+SYSWPR,A ;LAST BLOCK?
|
||
BGT DSKSR1
|
||
MOV SWPLST,A ;MOOBY SWAP OUT REQS?
|
||
BNE DSKSGO
|
||
CLR DSKS
|
||
RTS PC ;NO DISK REQUESTS EXTANT, BETTER LUCK NEXT TIME
|
||
|
||
DSKSGO: MOV A,DSKCRB ;ADDRESS OF BLOCK ABOUT TO BE SERVICED
|
||
MOV (A),B
|
||
BEQ .+4 ;BRANCH IF NO
|
||
JSR PC,(B) ;RUN START ROUTINE
|
||
DSKSG1: TST (A)+
|
||
MOV #DSKWC,B ;START OF DISK I/O WORDS
|
||
MOV (A)+,(B)+ ;WORD COUNT
|
||
MOV (A)+,(B) ;CORE ADDRESS
|
||
ADD #2,(B)+ ;GODFORSAKEN DEC!!!!!
|
||
MOV (A)+,(B)+ ;LOW ORDER DISK ADDRESS
|
||
MOV (A)+,(B)+ ;HIGH " " "
|
||
TST (A)+ ;GO PAST UNUSED WORD
|
||
MOVB (A),DSKS ;SET FUCTION, ENABLE INTERUPT, GO!!
|
||
RTS PC
|
||
|
||
|
||
DPROVK: SPUSH PS
|
||
MOV #340,PS
|
||
CMP #200,DSKS ;IF THE INTERUPT IS OFF AND THE DISK IS READY
|
||
BNE DSKSG2 ;PROVOKE IT; OTHERWISE LEAVE IT FOR SOMEONE ELSE
|
||
SPUSH A
|
||
SPUSH B
|
||
JSR PC,DSKSRT
|
||
SPOP B
|
||
SPOP A
|
||
DSKSG2: SPOP PS
|
||
RTS PC
|
||
.STITL DISK REQUEST BLOCK GRABBER
|
||
|
||
SYDRBG: SPUSH PS ;SAVE OLD PROSSESOR LEVEL
|
||
MOV #340,PS ;LOCK OUT INTERUPTS
|
||
MOV #SYSWPR,A ;LOOK FOR A FREE SYSTEM DISK REQUEST BLOCK
|
||
SDRBG1: TST 14(A) ;IS IT FREE?
|
||
BEQ SDRBG2
|
||
ADD #16,A ;LOOK AT NEXT ONE
|
||
CMP #16*MNUSRS+SYSWPR,A ;ANY MORE?
|
||
BGT SDRBG1 ;YES, SEE IF FREE
|
||
SPOP PS ;NO MORE, WE HAVE LOST BIG
|
||
WAIT ;THIS WILL PROBABLY NOT DO ANY GOOD
|
||
BR SYDRBG ;AND CERTAINLY WON'T UNLESS OUR PRIORITY IS <5
|
||
SDRBG2: MOV DUSECT,14(A) ;LABEL BLOCK AS IN USE, BUT NO REQUEST
|
||
INCB DUSECT+1 ;SO PEOPLE CAN DISTINGUISH
|
||
SPOP PS ;YOU CAN INTERUPT NOW.
|
||
RTS PC
|
||
|
||
|
||
;USER ROUTINE TO FLUSH UNTIL DISK REQUEST POINTED TO BY A DONE
|
||
|
||
DSKWA2: ADD #14,A
|
||
DSKWAI: MOV USER,U
|
||
MOV (A),B
|
||
DSKWA1: CMP B,(A)
|
||
BEQ DNDONE
|
||
JSR PC,RUNME
|
||
RTS PC
|
||
DNDONE: MOV #FRDSKW,FLSRES(U)
|
||
JSR PC,FLUSH
|
||
BR DSKWA1
|
||
|
||
UBLKGR: MOV #DBITTB,A ;USERS BIT TABLE ADDR
|
||
MOV #DBITBE,B
|
||
MOV #UNXTDB,D ;POINTER TO ADDR OF NEXT AWAILABLE BLOCK
|
||
ADD USER,D
|
||
MOV #DBITBE,E ;END OF USERS BIT TABLE
|
||
CLR F ;DISK ISN'T NEARLY FULL
|
||
BIT #DSAMFL,FLAGS2 ;IS THE DISK ALLMOST FULL?
|
||
BEQ .+4 ;NO
|
||
INC F ;YES
|
||
JSR PC,BLKGRB ;GO DO GOOD THINGS
|
||
RTS PC ;DISK REALLY FULL
|
||
TST F ;IS DISK NEARLY FULL?
|
||
BEQ UBLKG1 ;NO, SKIP RETURN
|
||
BIS #DSAMFL,FLAGS2 ;YES WARN THE WORLD.
|
||
UBLKG1: JMP SRET ;WIN ANYWAY, SKIP RETURN
|
||
|
||
UBLKFR: MOV #DBITTB,E
|
||
MOV USER,B
|
||
MOV UDSKAD(B),D
|
||
JSR PC,BLKFRE
|
||
BIC #DSAMFL,FLAGS2 ;DISK NOW SURELY HAS A FREE BLOCK
|
||
RTS PC
|
||
|
||
;GRABS A DISK BLOCK AND A REQUEST BLOCK
|
||
;REQUEST BLOCK ADDR RETURNS IN A
|
||
;DISK BLOCK ADDR RETURNS IN B AND C
|
||
;ARGS: BEGINNING OF BIT TABLE IN A
|
||
;END OF BIT TABLE IN B
|
||
;ADDR OF NEXT BLOCK WORDS IN D
|
||
;DISK ALMOST FULL FLAG IN F
|
||
BLKGRB: CLR C
|
||
BLKGR3: MOV #1,E
|
||
BLKGR2: BIT E,(A) ;IS THIS BLOCK FREE?
|
||
BEQ BLKGR5 ;YES, PRAISE THE LORD!
|
||
INC C ;NO, TRY THE NEXT BLOCK
|
||
ASL E
|
||
BCC BLKGR2 ;NO OVERFLOW?
|
||
TST (A)+ ;NEXT WORD
|
||
CMP A,B ;AT END OF THE TABLE
|
||
BLE BLKGR3 ;CONTINUE
|
||
TST F ;NO BLOCK AVAILABLE, ARE WE REAL FULL?
|
||
BEQ BLKGR4 ;NO, BUT CLOSE
|
||
RTS PC ;YES, VERY FULL
|
||
BLKGR4: INC F ;DISK ALMOST FULL
|
||
BR BLKGR6
|
||
BLKGR5: BIS E,(A) ;THAT BLOCK IS NO LONGER FREE
|
||
CLR F ;AND THE DISK ISN'T NEARLY FULL
|
||
BLKGR6: JSR PC,SYDRBG ;GET A DISK REQUEST BLOCK
|
||
MOV #-200,2(A) ;ALL BLOCKS ARE THIS LONG
|
||
MOV (D),6(A) ;NEXT AVAILABLE BLOCK
|
||
MOV 2(D),10(A)
|
||
SPUSH (D)
|
||
SPUSH 2(D)
|
||
SWAB C ;MULTIPLY BY 200
|
||
ASR C
|
||
BIC #100000,C
|
||
MOV 6(D),2(D) ;LOW ORDER BASE ADDR
|
||
ADD 4(D),C ;LOW ORDER BASE ADDR
|
||
ADC 2(D)
|
||
MOV C,(D)
|
||
SPOP C
|
||
SPOP B
|
||
JMP SRET
|
||
|
||
;FREES THE DISK BLOCK WHOSE LOW ORDER ADDR IS IN C
|
||
;BASE OF THIS DISK SPACE IS IN D
|
||
;ADDRESS OF THE APPRPRIATE BIT TABLE IS IN E
|
||
BLKFRE: SUB D,C ;RELOCATE DISK ADDR RELATIVE TO ZERO
|
||
MOV #1,B
|
||
BIT #177,C
|
||
BEQ .+4
|
||
HALT
|
||
BLKFR1: BIT #3777,C ;IS ADDR DIVISABLE BY 20*200?
|
||
BEQ BLKFR2 ;YES
|
||
SUB #200,C ;NO, TRY TO MAKE IT BE
|
||
ASL B ;AND GET "REMAINDER" IN B
|
||
BR BLKFR1
|
||
BLKFR2: SWAB C ;DIVIDE BY 400
|
||
ASR C ;BY 2
|
||
ASR C ;BY 2=>DIVIDED BY 400*2*2=2000=4000/2
|
||
ADD C,E ;GET POINTER INTO BIT TABLE
|
||
BIC B,(E) ;AND FREE THE BLOCK
|
||
RTS PC
|
||
.STITL DISK INTERUPT ROUTINE
|
||
|
||
|
||
DSKBRK: SPUSH A
|
||
SPUSH B
|
||
BIT #100000,DSKS ;ANY ERROR BITS SET?
|
||
BNE DSKLOS ;BITE THE BAG!
|
||
MOV DSKCRB,A ;POINTER TO FUNCTION WORD
|
||
CLR 14(A) ;REQUEST HAS BEEN SERVICED
|
||
MOV (A),B
|
||
BEQ .+4 ;NO
|
||
JSR PC,(B) ;YES, GO DO IT
|
||
CLR (A)
|
||
DSKRTY: JSR PC,DSKSRT ;LOOK FOR SOMETHING ELSE TO DO
|
||
DSKRET: SPOP B
|
||
SPOP A
|
||
RTI
|
||
|
||
DSKLOS: HALT ;DISK LOST BIG
|
||
MOV #400,DSKS ;POWER CLEAR IT
|
||
HALT ;GIVE IT A CHANCE
|
||
BR DSKRTY ;TRY AGAIN(EVENTUALLY)
|
||
.STITL SCHEDUALER
|
||
|
||
|
||
RUNME: TST USER
|
||
BGE RUNME1
|
||
RUNME2: RTS PC ;SYSTEM CALLED RUNME
|
||
RUNME1: TST FLSADR(U) ;IF HE WANTS TO RUN HE SHOULD JSR HERE
|
||
BEQ RUNME2 ;IF FLSADR IS ZERO, JUST KEEP RUNNING HIM
|
||
MOV #-1,USER ;SYSTEM IS NOW USER
|
||
JSR PC,UACSAV ;STORE HIS ACS
|
||
CLR FLSADR(U) ;GUY IS NOW RUNABLE
|
||
CLR FLSRES(U)
|
||
INC NRABLU
|
||
SPOP UPC(U) ;HE SHOULD START AFTER THE JSR PC,RUNME
|
||
NEXTU1: MOV #SLOTST,A ;TRY TO RUN USER IN U
|
||
NEXTU2: CMP U,(A)+ ;IS HE ASSIGNED A SLOT IN CORE?
|
||
BNE NEXTU3 ;NOT THIS ONE, ANYWAY
|
||
TST (A) ;IS HE ALL THE WAY IN?
|
||
BLT NEXTUS ;NO CAN'T RUN HIM YET
|
||
BEQ NEXTU3
|
||
CMP #FRNEWU,FLSRES(U)
|
||
BNE NEXT14
|
||
MOV #UGO,FLSADR(U)
|
||
TST RWWSW
|
||
BNE NEXT15
|
||
MOV SLTCAD-SLOTST-2(A),C
|
||
MOV #16,D
|
||
JMP NEXT11
|
||
NEXT14: CLR FLSRES(U)
|
||
JMP RUNUSR
|
||
|
||
|
||
|
||
;CALL TO GET INDEX OF NEXT USER TO RUN
|
||
|
||
NEXTUS: SUB #LUBLK,ULAST ;COUNT BACKWARDS
|
||
BGE .+10 ;DON'T GO NEG
|
||
MOV #<MNUSRS-1>*LUBLK,ULAST ;LAST POSSIBLE USER INDEX
|
||
MOV ULAST,U ;SEE IF THIS IS A GOOD GUY TO RUN
|
||
NEXT15: CMP #FRTYIH,FLSRES(U)
|
||
BEQ NEXTUS
|
||
TST FLSADR(U) ;IF FLSADR IS ZERO, RUNABLE(???)
|
||
BEQ NEXTU1 ;RUN HIM.
|
||
BLT NEXTUS ;NEG=>NON EX USER
|
||
MOV U,USER ;USER IS NOW USER
|
||
JSR PC,UACRES ;RESTORE HIS ACS
|
||
JMP @FLSADR(U) ;SEE IF HE SHOULD REALLY RUN
|
||
|
||
|
||
|
||
NEXTU3: TST (A)+ ;EXTANT CORE SLOT?
|
||
BNE NEXTU2 ;YES, CHECK NEXT ONE
|
||
MOV PUSPSL,A ;SEE IF THERE IS A PREFERED SLOT
|
||
BGT NEXTU6
|
||
MOV #SLOTST,A
|
||
NEXTU4: TST (A)+
|
||
TST (A)+
|
||
BLT NEXTU4
|
||
BEQ NEXTUS
|
||
CMP #1,-2(A)
|
||
BEQ NEXTU4 ;GUY HASN'T RUN YET, DON'T SWAP HIM OUT
|
||
MOV -2(A),B ;USER THAT MAY BE SWAPED OUT
|
||
CMP B,LOCKUS ;IS HE LOCKED IN?
|
||
BEQ NEXTU4 ;YES, DON'T BOTHER HIM
|
||
CMP B,GCLOCK
|
||
BEQ NEXTU4
|
||
TST NSWPU ;ARE THERE USERS BEING SWAPED?
|
||
BEQ NEXTU6 ;NO, SWAP ONE
|
||
CMP NINU,#1 ;IS THERE ONLY ONE USER IN CORE?
|
||
BEQ NEXTUS ;YES, RUN HIM
|
||
NEXTU6: CLR PUSPSL ;IF THERE WAS A PREFERED SLOT, WE ARE DOING IT
|
||
TST -(A)
|
||
MOV -2(A),B ;FOUND A GOOD SLOT, USER TO SWAP OUT INTO B
|
||
MOV U,-2(A) ;NEW OCCUPANT OF SLOT
|
||
|
||
FOR DEBUG
|
||
BIT #SWTRCF,SFLAGS ;TRACE SWAPS?
|
||
BEQ NEXTU5
|
||
SPUSH A
|
||
PRTXT ^/SWAPPING: /
|
||
MOV B,A
|
||
JSR PC,PRON
|
||
SPACE
|
||
MOV U,A ;USER WHO IS COMING IN
|
||
JSR PC,PRON
|
||
SPACE
|
||
MOV (P),A
|
||
SUB #SLOTST+2,A
|
||
ASR A
|
||
ASR A
|
||
JSR PC,PRON ;SLOT
|
||
SPACE
|
||
MOV TIME,A
|
||
JSR PC,PRON
|
||
PRCR
|
||
SPOP A
|
||
.ENDC
|
||
ENDC DEBUG
|
||
|
||
NEXTU5: CLR D
|
||
MOV SLTCAD-SLOTST-2(A),C ;MOBY SWAP OUT BLOCK FOR THIS SLOT
|
||
MOV #SWPOST,(C)+ ;SWAP OUT USER START ROUTINE
|
||
MOV USWCNT,(C)+ ;WORD COUNT OF A USER SLOT
|
||
MOV SLTCAD-SLOTST(A),(C)+ ;SLOT CORE ADDRESS
|
||
MOV USWPAD(B),(C)+ ;LOW ORDER SWAP OUT ADDR OF U TO SWAP OUT
|
||
MOV USWPAD+2(B),(C)+ ;HIGH OORDER
|
||
TST (C)+ ;WASTED WORD
|
||
MOV #DWRTEC,(C)+ ;DISK WRITE COMMAND
|
||
NEXT11: DEC NINU ;ONE LESS IN CORE
|
||
INC NSWPU ;ONE MORE MOVING AROUND
|
||
MOV #SWPIST,(C)+ ;SWAP IN USER START ROUTINE
|
||
MOV USWCNT,(C)+ ;SLOT WORD COUT
|
||
MOV SLTCAD-SLOTST(A),(C)+ ;SLOT CORE ADDRESS
|
||
CMP #FRNEWU,FLSRES(U)
|
||
BNE NEXT12
|
||
MOV DCLRUS,(C)+
|
||
MOV DCLRUS+2,(C)+
|
||
MOV #UGO,FLSADR(U)
|
||
MOV UDSKAD(U),UNXTDB(U)
|
||
MOV UDSKAD+2(U),UNXTDB+2(U)
|
||
BR NEXT13
|
||
NEXT12: MOV USWPAD(U),(C)+ ; " "
|
||
MOV USWPAD+2(U),(C)+ ;USER ADDRESS ON DISK
|
||
NEXT13: MOV A,(C)+ ;ADDRESS OF PLACE TO ZAP TO 1 WHEN DONE
|
||
MOV #DREADC,(C) ;READ FROM DISK
|
||
SUB #32,C ;BEGINING OF MOOBY SWAP REQ PAIR
|
||
ADD D,C
|
||
SPUSH PS
|
||
MOV #340,PS ;NO INTS!
|
||
MOV C,@SWPLEP
|
||
ADD #2,SWPLEP
|
||
SPOP PS
|
||
MOV #-1,(A) ;NOT IN YET
|
||
BR NEXT10
|
||
|
||
NEXTU7: MOV #-1,USER ;FLUSH ENTERS HERE, SYSTEM NOW USER
|
||
MOV #SLOTST,A ;SEE IF THIS SUPER FLUSHED GUY IS IN CORE
|
||
NEXTU8: CMP U,(A)+
|
||
BNE NEXTU9 ;NOT HERE.
|
||
TST (A)+ ;IS HE REALLY IN?
|
||
BLE NEXT10 ;NO, NOT REALLY
|
||
CMP #FRDSKW,FLSRES ;IF JUST HUNG ON DISK
|
||
BEQ NEXT10 ;FORGET HIM
|
||
MOV A,PUSPSL ;HE IS PREFERED OUT
|
||
MOV U,PUSRSP
|
||
BR NEXT10
|
||
NEXTU9: TST (A)+
|
||
BNE NEXTU8
|
||
NEXT10: JMP NEXTUS
|
||
|
||
FLUSH: TST USER
|
||
BGE FLUSH4
|
||
RTS PC
|
||
FLUSH4: JSR PC,UACSAV ;STOP USER; STORE HIS ACS
|
||
MOV AC,UAC
|
||
MOV MQ,UMQ
|
||
MOV SR,USR
|
||
MOV FLSADR(U),A
|
||
SPOP FLSADR(U) ;SAVE PC
|
||
TST A ;IS THIS GUY ALREADY STOPED?
|
||
BNE NEXTU7 ;GO TRY ANOTHER GUY
|
||
UUNTIM TIMUSD
|
||
MOV #-1,USER
|
||
TIMER NULTIM
|
||
TST FLSRES(U)
|
||
BNE .+10
|
||
MOV #FRRAND,FLSRES(U)
|
||
DEC NRABLU
|
||
MOV P,UPDLP ;SAVE USER'S POINTER
|
||
MOV SPDLP,P ;SYSTEM PDL
|
||
|
||
FOR DEBUG
|
||
BIT #FRTRCF,SFLAGS
|
||
BEQ FLUSH3
|
||
PRTXT ^/FLUSHING USER /
|
||
MOV U,A
|
||
JSR PC,PRON
|
||
SPACE
|
||
MOV TIME,A
|
||
JSR PC,PRON
|
||
PRCR
|
||
.ENDC
|
||
ENDC DEBUG
|
||
|
||
FLUSH3: MOV #UVBLK,A
|
||
MOV BASEUS,B ;TO BLT OUT USER VARIABLES
|
||
FLUSH1: SUB B,(A)+ ;UNRELOCATE A POINTER
|
||
CMP #UVREND,A ;END OF VARS TO BE UNRELOCATED?
|
||
BGT FLUSH1 ;GO DO ANOTHER
|
||
MOV #UVBLK,A ;SET UP FOR BLT
|
||
MOV ACRELF,C
|
||
BEQ FLUSH2
|
||
MOV U,D
|
||
ADD #UACA-2,D ;POINTER TO USERS ACS
|
||
FLUSH5: TST (D)+ ;NEXT AC TO MAYBE RELOCATE
|
||
TST C
|
||
BEQ FLUSH2 ;NO MORE TO RELOCATE
|
||
CLC
|
||
ROR C
|
||
BCC FLUSH5 ;DON'T RELOCATE THIS ONE
|
||
SUB B,(D)
|
||
BR FLUSH5
|
||
FLUSH2: MOV (A)+,(B)+ ;ONE AT A TIME, KIDDIES!
|
||
CMP #UVBLK+LUVBLK-MAXELN,A ;DONE?
|
||
BGT FLUSH2
|
||
JMP NEXTUS
|
||
;RUNUSR, THE "MAIN LOOP"
|
||
|
||
RUNUSR: CMP U,PUSRSP ;AM I THE GUY THEY WANT OUT?
|
||
BNE .+6 ;BRANCH IF NO
|
||
CLR PUSPSL ;I DON'T WANT TO GO!
|
||
INC (A) ;INDICATE THAT THIS GUY HAS BEEN RUN
|
||
MOV SLTCAD-SLOTST(A),D ;SLOT ADDRESS THIS GUY IS IN
|
||
TST (D)+ ;REALLY RIGHT NOW
|
||
MOV D,B ;BASE OF SLOT
|
||
MOV #UVBLK,C ;BASE OF USER VARIABLES
|
||
RUNUS1: MOV (B)+,(C)+ ;BLTTTTTTTTTTTT!
|
||
CMP #UVBLK+LUVBLK,C
|
||
BGT RUNUS1
|
||
MOV #UVBLK,C ;TO RELOCATE VARIABLES
|
||
RUNUS2: ADD D,(C)+ ;ADD BASE OF SLOT
|
||
CMP #UVREND-2,C
|
||
BGT RUNUS2
|
||
MOV D,BASEUS
|
||
MOV ACRELF,A
|
||
BEQ RUNUS5
|
||
MOV U,B
|
||
ADD #UACA-2,B
|
||
RUNUS6: TST (B)+
|
||
TST A
|
||
BEQ RUNUS5
|
||
CLC
|
||
ROR A
|
||
BCC RUNUS6
|
||
ADD D,(B)
|
||
BR RUNUS6
|
||
RUNUS5:
|
||
FOR DEBUG
|
||
BIT #FRTRCF,SFLAGS
|
||
BEQ RUNUS4
|
||
PRTXT ^/STARTING USER /
|
||
MOV U,A
|
||
JSR PC,PRON
|
||
SPACE
|
||
MOV TIME,A
|
||
JSR PC,PRON
|
||
PRCR
|
||
.ENDC
|
||
ENDC DEBUG
|
||
|
||
RUNUS4: MOV P,SPDLP ;SAVE SYSTEM PDL POINTER
|
||
MOV UPDLP,P ;GET USER PDL POINTER
|
||
MOV U,USER ;NOW HE'S REALLY THE GUY
|
||
SPUSH UPC(U) ;PLACE TO START USER
|
||
MOV QUANT,UQUANT ;RUN FOR 3 1/100TH'S????
|
||
UNTIME NULTIM
|
||
UTIMER TIMUSD
|
||
MOV UAC,AC
|
||
MOV UMQ,MQ
|
||
MOV USR,SR
|
||
JMP UACRES ;RESTORE USER ACS AND START USER
|
||
|
||
|
||
SCHEDP: TST UQUANT ;SEE IF IT'S TIME TO FLUSH
|
||
BLE .+4 ;NOT YET
|
||
RTS PC
|
||
SPUSH U
|
||
MOV USER,U
|
||
MOV #FRSCED,FLSRES(U)
|
||
JSR PC,FLUSH
|
||
JSR PC,RUNME
|
||
SPOP U
|
||
RTS PC
|
||
.STITL CLOCK BREAK ROUTINE
|
||
|
||
CLKBRK: SPUSH A
|
||
SPUSH B
|
||
ADD #200,TIME
|
||
ADC TIME+2
|
||
DEC UQUANT
|
||
TSTB DSKS ;IS THE DISK BUSY?
|
||
BGE .+6 ;YES
|
||
JSR PC,DSKSRT
|
||
CMP #13183.,TIME+2 ;IS IT MIDNIGHT?
|
||
BLE DATEC ;YES, CHANGE THE DATE
|
||
CLKBR1: JMP @#CLKBR2
|
||
CLKBR2: SPOP B
|
||
SPOP A
|
||
RTI
|
||
|
||
|
||
CLKBDM: BIT #7777,TIME ;EVERY 4 BRKS (=<4*128>/10,000 SECS)
|
||
BNE CLKBR2 ;1/20 < T < 1/21 SECS
|
||
JSR PC,DMSQ
|
||
JSR PC,TI2Q
|
||
BR CLKBR2
|
||
|
||
DATEC: CLR TIME+2 ;TIME IS NOW ZERO
|
||
INC RDAY ;CHANGE THE DAY
|
||
MOV RMONTH,A
|
||
CMPB RDAY,DMON(A)
|
||
BLE CLKBR1 ;NOT ON A MONTH BOUNDARY
|
||
INC RMONTH
|
||
MOV #1,RDAY
|
||
CMP #12,RMONTH
|
||
BLE CLKBR1
|
||
INC RYEAR
|
||
MOV #1,RMONTH
|
||
BR CLKBR1
|
||
|
||
RDAY: 0
|
||
RMONTH: 0
|
||
RYEAR: 0
|
||
DMON: .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31.
|
||
.STITL SWAP START+STOP ROUTINES
|
||
|
||
SWPOST: MOV #SWPOSP,(A) ;SWAP OUT USER START, SET UP STOP
|
||
RTS PC
|
||
|
||
SWPOSP: TST (P)+ ;FLUSH RETURN, WE'RE NOT GOING BACK THAT WAY
|
||
ADD #16,A ;POINT TO SWAP IN BLOCK
|
||
JSR PC,DSKSGO ;START DISK ON THAT
|
||
JMP DSKRET ;AND RETURN FROM INTERUPT
|
||
|
||
SWPIST: MOV #SWPISP,(A) ;SWAP IN START, SET UP STOP
|
||
RTS PC
|
||
|
||
SWPISP: CLR UQUANT ;SCHED REAL SOON
|
||
MOV 12(A),B ;FLAG
|
||
MOV #1,(B) ;THIS GUY IS IN AND NOT RUN YET
|
||
SUB #2,SWPLEP
|
||
SPUSH A
|
||
MOV #SWPLST+2,A
|
||
MOV #SWPLST,B
|
||
MOV (A)+,(B)+
|
||
BNE .-2
|
||
INC NINU ;ONE MORE GUY IN
|
||
DEC NSWPU ;ONE LESS GUY MOVING
|
||
SPOP A
|
||
RTS PC
|
||
.STITL MISC ROUTINES
|
||
|
||
ACSAV: MOV E,-(P)
|
||
MOV D,-(P)
|
||
MOV C,-(P)
|
||
MOV B,-(P)
|
||
MOV A,-(P)
|
||
JMP (F)
|
||
|
||
ACRES: TST (P)+
|
||
MOV (P)+,A
|
||
MOV (P)+,B
|
||
MOV (P)+,C
|
||
MOV (P)+,D
|
||
MOV (P)+,E
|
||
RTS F
|
||
|
||
UACSAV: MOV A,UACA(U)
|
||
MOV B,UACB(U)
|
||
MOV C,UACC(U)
|
||
MOV D,UACD(U)
|
||
MOV E,UACE(U)
|
||
RTS PC
|
||
|
||
UACRES: MOV UACA(U),A
|
||
MOV UACB(U),B
|
||
MOV UACC(U),C
|
||
MOV UACD(U),D
|
||
MOV UACE(U),E
|
||
RTS PC
|
||
|
||
|
||
|
||
PPUSHT: CMP P,PPUSHL
|
||
BLOS .+4
|
||
RTS PC
|
||
BIT #177000,P ;IS IT THE SYSYTEM PDL?
|
||
BNE .+4
|
||
RTS PC ;YES, IGNORE
|
||
JMP PPSWPO ;PDL REALLY OVERFLOWED
|
||
|
||
PPOPT: CMP P,PPOPL
|
||
BHIS .+4
|
||
RTS PC
|
||
JMP PPSWPI
|
||
|
||
SPUSHT: SUB #2,S
|
||
CMP S,SPUSHL
|
||
BLOS .+4
|
||
RTS PC
|
||
JMP SPSWPO
|
||
|
||
SPOPT: ADD #2,S
|
||
CMP S,SPOPL
|
||
BHI .+4
|
||
RTS PC
|
||
JMP SPSWPI
|
||
|
||
.SPACE: PRTXT ^\ \
|
||
RTS PC
|
||
|
||
.CRLF: JMP @#.+4
|
||
JSR PC,ERTAP
|
||
CRMES
|
||
RTS PC
|
||
|
||
CRLF: MOV #15,D
|
||
JMP TYO
|
||
.STITL P AND S PDL SWAP OUTERS
|
||
|
||
PPSWPO: JSR F,ACSAV ;TIME TO WORK!
|
||
|
||
FOR DEBUG
|
||
BIT #SPTRCF,SFLAGS
|
||
BEQ PPSWP1
|
||
SUB #100,PPUSHL ;SO IT DOESN'T OVERFLOW AGAIN
|
||
PRTXT ^/SWAPPING OUT P PDL /
|
||
MOV P,A
|
||
SUB A,PRBAO
|
||
NEG A
|
||
JSR PC,PRON
|
||
PRCR
|
||
ADD #100,PPUSHL
|
||
.ENDC
|
||
ENDC DEBUG
|
||
|
||
PPSWP1: JSR PC,UBLKGR ;GET ALL THE GOOD STUFF WE NEED
|
||
HALT ;WHAT, NO DISK SPACE
|
||
HALT ;STOP, YOU STUPID MACHINE
|
||
SPUSH B ;SAVE ADDRESS
|
||
MOV PSWPAD,4(A) ;PLACE WHERE PDL IS
|
||
MOVB #DWRTEC,14(A) ;WRITE IT ONTO THE RIGHT PLACE
|
||
JSR PC,DSKWA2 ;FLUSH UNTIL IT IS REALLY OUT
|
||
MOV BASEUS,A
|
||
ADD #PDLINK+4-SLOT1,A ;GIVING US THE LINK ADDRESS+4 FOR THIS GUY
|
||
MOV C,-(A) ;HIGH ORDER PART
|
||
SPOP -(A) ;LOW ORDER PART
|
||
BIT #PPNAIF,FLAGS2 ;WAS THE PDL NOT ALL THE WAY IN ANYWAY?
|
||
BNE .+10 ;PART ALREADY OUT
|
||
SUB #54,PPOPL ;NONE OUT BEFORE, CHANGE LIMIT
|
||
BIS #PPNAIF,FLAGS2 ;CERTAINLY NOT ALL IN NOW
|
||
MOV PSWPAD,B ;ADDRESS-2 PDL SWAPED FROM
|
||
MOV (B),-(A) ;MOVE WORDS UP
|
||
MOV -(B),-(A)
|
||
CMP B,P
|
||
BGE .-4
|
||
ADD #374,P ;PDL HAS MOVED!
|
||
ADD #374,PRBAO
|
||
JSR F,ACRES ;ALL DONE!
|
||
RTS PC
|
||
|
||
|
||
SPSWPO: JSR F,ACSAV ;TIME TO WORK!
|
||
|
||
FOR DEBUG
|
||
BIT #SPTRCF,SFLAGS
|
||
BEQ SPSWP1
|
||
PRTXT ^/SWAPING OUT S PDL /
|
||
MOV S,A
|
||
SUB A,SPRBAO
|
||
NEG A
|
||
JSR PC,PRON
|
||
PRCR
|
||
.ENDC
|
||
ENDC DEBUG
|
||
|
||
SPSWP1: JSR PC,UBLKGR ;GET ALL THE GOOD STUFF WE NEED
|
||
HALT ;WHAT, NO DISK SPACE
|
||
HALT ;STOP, YOU STUPID MACHINE
|
||
SPUSH B ;SAVE ADDRESS
|
||
MOV SSWPAD,4(A) ;PLACE WHERE PDL IS
|
||
MOVB #DWRTEC,14(A) ;WRITE IT ONTO THE RIGHT PLACE
|
||
JSR PC,DSKWA2 ;FLUSH UNTIL IT IS REALLY OUT
|
||
MOV BASEUS,A
|
||
ADD #SDLINK+4-SLOT1,A ;GIVING US THE LINK ADDRESS+4 FOR THIS GUY
|
||
MOV C,-(A) ;HIGH ORDER PART
|
||
SPOP -(A) ;LOW ORDER PART
|
||
BIT #SPNAIF,FLAGS2 ;WAS THE PDL NOT ALL THE WAY IN ANYWAY?
|
||
BNE .+10 ;PART ALREADY OUT
|
||
SUB #54,SPOPL ;NONE OUT BEFORE, CHANGE LIMIT
|
||
BIS #SPNAIF,FLAGS2 ;CERTAINLY NOT ALL IN NOW
|
||
MOV SSWPAD,B ;ADDRESS-2 PDL SWAPED FROM
|
||
MOV (B),-(A) ;MOVE WORDS UP
|
||
MOV -(B),-(A)
|
||
CMP B,S
|
||
BGE .-6
|
||
ADD #374,S ;PDL HAS MOVED!
|
||
ADD #374,SPRBAO
|
||
JSR F,ACRES ;ALL DONE!
|
||
RTS PC
|
||
|
||
.STITL P AND S PDL SWAPER INERS
|
||
PPSWPI: BIT #PPNAIF,FLAGS2 ;IS THE PDL ALL THE WAY IN?
|
||
BNE .+4 ;NO (PRAISE THE LORD!)
|
||
HALT
|
||
JSR F,ACSAV
|
||
|
||
FOR DEBUG
|
||
BIT #SPTRCF,SFLAGS
|
||
BEQ PSWPI1
|
||
PRTXT ^/SWAPING IN P PDL /
|
||
MOV P,A
|
||
SUB A,PRBAO
|
||
NEG A
|
||
JSR PC,PRON
|
||
PRCR
|
||
.ENDC
|
||
ENDC DEBUG
|
||
|
||
PSWPI1: MOV PSWPAD,A
|
||
MOV A,B
|
||
ADD #374,A
|
||
MOV (A),(B)
|
||
MOV -(A),-(B)
|
||
CMP A,P
|
||
BGT .-4
|
||
SUB #374,P
|
||
SUB #374,PRBAO
|
||
JSR PC,SYDRBG
|
||
TST (A)+
|
||
MOV #-200,(A)+
|
||
MOV PSWPAD,(A)+
|
||
MOV PPBASE,E
|
||
MOV (E)+,C
|
||
MOV C,(A)+
|
||
MOV (E),(A)+
|
||
TST (A)+
|
||
MOVB #DREADC,(A)
|
||
JSR PC,DSKWAI
|
||
MOV PPBASE,D
|
||
TST (D)+
|
||
BNE PSWPI2
|
||
TST (D)
|
||
BNE PSWPI2
|
||
BIC #PPNAIF,FLAGS2 ;IF BOTH LINKS ARE ZERO NOW, THERE IS NO MORE PDL ON DISK
|
||
ADD #54,PPOPL
|
||
PSWPI2: JSR PC,UBLKFR
|
||
JSR F,ACRES
|
||
RTS PC
|
||
|
||
SPSWPI: BIT #SPNAIF,FLAGS2 ;IS THE PDL ALL THE WAY IN?
|
||
BNE .+4 ;NO (PRAISE THE LORD!)
|
||
HALT
|
||
JSR F,ACSAV
|
||
|
||
FOR DEBUG
|
||
BIT #SPTRCF,SFLAGS
|
||
BEQ SSWPI1
|
||
PRTXT ^/SWAPING IN S PDL /
|
||
MOV S,A
|
||
SUB A,SPRBAO
|
||
NEG A
|
||
JSR PC,PRON
|
||
PRCR
|
||
.ENDC
|
||
ENDC DEBUG
|
||
|
||
SSWPI1: MOV SSWPAD,A
|
||
MOV A,B
|
||
MOV (A),(B)
|
||
ADD #374,A
|
||
MOV (A),(B)
|
||
MOV -(A),-(B)
|
||
CMP A,S
|
||
BGT .-6
|
||
SUB #374,S
|
||
SUB #374,SPRBAO
|
||
JSR PC,SYDRBG
|
||
TST (A)+
|
||
MOV #-200,(A)+
|
||
MOV SSWPAD,(A)+
|
||
MOV SPBASE,E
|
||
MOV (E)+,C
|
||
MOV C,(A)+
|
||
MOV (E),(A)+
|
||
TST (A)+
|
||
MOVB #DREADC,(A)
|
||
JSR PC,DSKWAI
|
||
MOV SPBASE,D
|
||
TST (D)+
|
||
BNE SSWPI2
|
||
TST (D)
|
||
BNE SSWPI2
|
||
BIC #SPNAIF,FLAGS2 ;IF BOTH LINKS ARE ZERO NOW, THERE IS NO MORE PDL ON DISK
|
||
ADD #54,SPOPL
|
||
SSWPI2: JSR PC,UBLKFR
|
||
JSR F,ACRES
|
||
RTS PC
|
||
|
||
|
||
|
||
.IFZ 105
|
||
|
||
SWAPER: CLR A
|
||
SWAP1: PUSH A
|
||
PUSHS A
|
||
INC A
|
||
CMP A,B
|
||
BGT SWAP2
|
||
BR SWAP1
|
||
SWAP2: POP C
|
||
POPS D
|
||
DEC A
|
||
CMP A,D
|
||
BEQ .+4
|
||
HALT
|
||
CMP A,C
|
||
BEQ .+4
|
||
HALT
|
||
TST A
|
||
BEQ SWAPER
|
||
BR SWAP2
|
||
.ENDC
|
||
.STITL TIMER ROUTINES
|
||
|
||
.TIME: SPUSH A
|
||
SPUSH B
|
||
SPUSH C
|
||
SPUSH D
|
||
SPUSH PS
|
||
MOV #340,PS
|
||
JSR PC,GTIME
|
||
JSR PC,URELTM
|
||
MOV TMPDLP,D
|
||
MOV (A),(D)+
|
||
MOV -(A),(D)+
|
||
MOV D,TMPDLP
|
||
CLR (A)+
|
||
CLR (A)
|
||
JSR PC,RELTIM
|
||
SPOP PS
|
||
SPOP D
|
||
SPOP C
|
||
SPOP B
|
||
SPOP A
|
||
RTS PC
|
||
|
||
.UTIME: SPUSH A
|
||
SPUSH B
|
||
SPUSH C
|
||
SPUSH D
|
||
SPUSH PS
|
||
MOV #340,PS
|
||
JSR PC,GTIME
|
||
JSR PC,URELTM
|
||
MOV (E)+,A
|
||
ADD ELAPSE,(A)+
|
||
ADC (A)
|
||
ADD ELAPSE+2,(A)
|
||
MOV TMPDLP,D
|
||
MOV -(D),ELAPSE
|
||
MOV -(D),ELAPSE+2
|
||
MOV D,TMPDLP
|
||
JSR PC,RELTIM
|
||
SPOP PS
|
||
SPOP D
|
||
SPOP C
|
||
SPOP B
|
||
SPOP A
|
||
RTS E
|
||
|
||
URELTM: MOV #ELAPSE,A
|
||
ADD B,(A)+
|
||
ADC (A)
|
||
ADD C,(A)
|
||
RTS PC
|
||
|
||
RELTIM: MOV #ELAPSE,A
|
||
SUB B,(A)+
|
||
SBC (A)
|
||
SUB C,(A)
|
||
RTS PC
|
||
|
||
|
||
GTIME: MOV PCCNT,B
|
||
ADD #200,B
|
||
TSTB PCS
|
||
BGE .+6
|
||
MOV #200,B
|
||
MOV TIME+2,C
|
||
ADD TIME,B
|
||
ADC C
|
||
RTS PC
|
||
|
||
.STITL COMMUNICATE WITH MAIN MACHINE
|
||
|
||
RJLSW: 0 ;NON-ZERO=> ACTIVATE COMMUNICATE LINK
|
||
REDY10: 0 ;NON-ZERO=>10 IS READY
|
||
SYSMES: 0 ;NUMBER OF MESSAGES WAITING FOR THE SYSTEM
|
||
.MACR EXCHA X,Y
|
||
MOV X,A
|
||
MOV Y,X
|
||
MOV A,Y
|
||
.ENDM
|
||
|
||
;LOGIN STRING
|
||
LOGMES: .BYTE 'Z-100,'S-100,'S-100,'_-100
|
||
.ASCII /R11LOGO/
|
||
.BYTE 33
|
||
.ASCII /U11HERE/
|
||
.BYTE 'K-100,0
|
||
.EVEN
|
||
|
||
;RECIEVE VARIABLES
|
||
RBPOIN: 0
|
||
DCRBIP: DCRBF1-2 ;INITIAL POINTER
|
||
DCRACF: 0 ;ACKNOWLEDGE FLAG
|
||
DCRCKS: 0 ;CHECKSUM OF INCOMING WORDS
|
||
DCRMID: 0 ;ID # SENT WITH MESSAGE
|
||
DCRWCT: 0 ;WORD COUNT OF CURRENT MESSAGE
|
||
DCRPRB: 0 ;"PARITY" BITS FOR INCOMING WORD
|
||
DCRWBL: 0 ;BUILD RECIEVED WORD HERE
|
||
|
||
DCRLST: .=.+40 ;MESSAGES WAITNING TO BE PICKED UP
|
||
|
||
DCRDRB: .WORD 0,-400,DCRBF2-2,0,0,0,0 ;DISK REQUEST BLOCK
|
||
|
||
|
||
;TRANSMIT VARIABLES
|
||
TBPOIN: 0
|
||
DCTSMS: .=.+20 ;SMALL (1 OR 2 CHAR)MESSAGES TO BE SENT
|
||
DCTBST: .=.+40 ;MESSAGES WAITING TO BE SENT
|
||
;BUFFERS
|
||
DCRBF1: .=.+100 ;RECIEVE BUFFER 1
|
||
DCRBF2: .=.+100 ; " " 2
|
||
|
||
;DC11 PDLS
|
||
.=.+20
|
||
RLOGIN
|
||
RPDLP: .-2
|
||
.=.+20
|
||
TLOGIN
|
||
TPDLP: .-2
|
||
|
||
;RECIEVE INTERUPT ROUTINES
|
||
|
||
DCRBRK: SPUSH A
|
||
EXCHA RPDLP,P ;SET UP RECIEVE PDL
|
||
MOV DCRB,A ;GET CHAR FROM LINE
|
||
RTS PC ;RESUME PROCESSING
|
||
|
||
RFLUSH: EXCHA RPDLP,P ;RESTORE PDL
|
||
SPOP A
|
||
RTI
|
||
|
||
RLOGIN: BIS #100,DCTS ;WAKE UP TRANSMIT ROUTINE
|
||
JSR PC,RFLUSH ;GET NEXT CHAR
|
||
CMP #140,A ;IS IT SYNC?
|
||
BNE RLOGIN ;NO, WAIT FOR THE 10 TO WAKE UP
|
||
INC REDY10 ;10 IS READY TO COMMUNICATE
|
||
|
||
RECLOP: JSR PC,RFLUSH ;GET THE NEXT CHAR OFF THE LINE
|
||
SUB #140,A ;IS IT CONTROL CHAR?
|
||
BLT RECLOP ;NO (THIS SHOULDN'T HAPPEN)
|
||
CMP #10,A ;IS IT TOO BIG?
|
||
BLE RECLOP ;YUP (THIS SHOULD HAPPEN EVEN LESS!!)
|
||
ASL A
|
||
JMP @RECTAB(A) ;DO THE CONTROL CHAR
|
||
|
||
RECTAB: RECLOP ;NULL, SYNC(WHATEVER YOU WANT TO CALL IT)
|
||
STPREC ;STOP!
|
||
ACTREC ;WELL?????
|
||
RECLOP ;???
|
||
RECLOP ;????
|
||
ACKREC ;ACKNOWLEDGEMENT OF TRANSMITTED MESSAGE
|
||
NAKREC ;NEGATIVE, PLEASE SEND AGAIN
|
||
DATA ;DATA BLOCK COMES NEXT
|
||
|
||
STPREC:ACTREC: BR RECLOP
|
||
|
||
NAKREC: MOV #-1,DCRACF ;FOR NAK
|
||
BR ACKRC1
|
||
ACKREC: CLR DCRACF
|
||
ACKRC1: JSR PC,GBITCH ;GET NUMBER OF MESSAGE BEING "ACK"ED
|
||
BR RECLOP ;LOSE!
|
||
CMP #20,A ;IS IT TOO BIG?
|
||
BLE RECLOP
|
||
ASL A
|
||
MOV DCRACF,DCTBST(A) ;TELL TRANSMIT ROUTINES ACK OR NAK
|
||
BR RECLOP
|
||
|
||
DATA: CLR DCRCKS ;CLEAR CHECKSUM
|
||
JSR PC,GWORD ;GET A WORD OFF THE LINE
|
||
JMP RECLOP ;BAD PARITY IN WORD, CAN'T WIN
|
||
MOVB DCRWBL+1,DCRMID ;SENDERS ID # FOR THIS DATA
|
||
MOVB A,DCRWCT ;NUMBER OF WORDS FOLLOWING, INC. CHECKSUM
|
||
MOV DCRBIP,RBPOIN ;POINTER TO CURRENT BUFFER
|
||
DATA1: ADD #2,RBPOIN ;POINT TO NEXT WORD
|
||
JSR PC,GWORD
|
||
BR NODATA ;PARITY ERROR IN WORD
|
||
MOV A,@RBPOIN ;SAVE WORD
|
||
DEC DCRWCT ;IS IT THE LAST ONE(CHECKSUM)?
|
||
BGT DATA1 ;NO
|
||
TST DCRCKS ;SHOULD BE ZERO
|
||
BNE NODATA ;NO SUCH LUCK
|
||
TST DCRDRB+14 ;HAS THE LAST MESSAGE MADE IT TO THE DISK?
|
||
BNE NODATA ;NO, CAN'T KEEP THIS MESSAGE
|
||
SPUSH B
|
||
MOV #DCRLST,B
|
||
TST (B)+ ;IS THIS RECIEVE BUFFER FREE?
|
||
BNE .-2 ;NO
|
||
TST -(B) ;FOUND A FREE ONE
|
||
CMP #DCRLST+40,B ;IS IT REALLY ONE?
|
||
BGE NODATA ;NO PLACE TO PUT MESSAGE
|
||
EXCHA DCRBIP,DCRDRB+4 ;EXCH BUFFER USAGE
|
||
TST (A)+
|
||
MOV (A),A ;THIS IS THE MESSAGE ID
|
||
MOV A,(B) ;SO THE USER CAN FIND IT
|
||
BIT #177400,A ;IS THIS MESSAGE FOR THE SYSTEM?
|
||
BNE .+6 ;NO
|
||
INC SYSMES ;TELL THE SYSTEM IT HAS A MESSAGE
|
||
SUB #DCRLST,B
|
||
ASL B
|
||
ASL B
|
||
ASL B
|
||
ASL B
|
||
ADD DCRBFS,B
|
||
MOV B,DCRDRB+6
|
||
MOV DCRBFS+2,DCRDRB+10 ;DISK ADDRESS OF BUFFER
|
||
MOV #DCTSMS,A ;FIND A SMALL MESSAGE SLOT
|
||
TST (A)+
|
||
BNE .-2
|
||
MOV #<145_10>,B
|
||
BIS DCRMID,B
|
||
ADD #40,B
|
||
SWAB B
|
||
MOV B,-(A)
|
||
SPOP B
|
||
JMP RECLOP
|
||
|
||
NODATA: JMP RECLOP
|
||
|
||
;GET 16 BIT WORD OFF THE LINE
|
||
;6 BITS, 6 BITS, 2 PARITY+4 BITS (PPBBBB)
|
||
;3 333 222 222 111 111
|
||
GWORD: JSR PC,GBITCH ;GET A BINARY CHAR
|
||
RTS PC ;BAD CHAR, LOSE
|
||
MOV A,DCRWBL ;STATRT BUILDING WORD 0 000 000 000 BBB BBB
|
||
JSR PC,GBITCH
|
||
RTS PC ;BAD CHAR
|
||
SWAB A ; 0 0BB BBB B00 000 000
|
||
ASR A ; 0 00B BBB BB0 000 000
|
||
ASR A ; 0 000 BBB BBB 000 000
|
||
BIS A,DCRWBL ; 0 000 222 222 111 111
|
||
JSR PC,GBITCH
|
||
DCRRTS: RTS PC ;BAD CHAR
|
||
ASL A ; 0 000 000 00B BBB BB0
|
||
ASL A ; 0 000 000 0BB BBB B00
|
||
ASL A ; 0 000 000 BBB BBB 000
|
||
ASL A ; 0 000 00B BBB BB0 000
|
||
BISB A,DCRWBL+1 ; BB BB0 000
|
||
SWAB A ; B BBB 000 000 000 0BB
|
||
MOVB A,DCRPRB ; 00 000 0BB
|
||
SPUSH B
|
||
MOV DCRWBL,A
|
||
JSR PC,BITCNT ;GET NUMBER OF BITS IN THE WORD
|
||
BIC #177774,B ;MOD 4
|
||
COM B ;AND COMPLEMENTED
|
||
CMP B,DCRPRB ;IS IT THE SAME AS WAS SENT ON THE LINE?
|
||
BNE GWORDB ;NO, HAVE GOT BAD WORD
|
||
ADD A,DCRCKS ;YES, ADD TO CHECKSUM
|
||
SPOP B
|
||
JMP SRET
|
||
GWORDB: SPOP B
|
||
RTS PC
|
||
|
||
;GET 6 BITS OFF THE LINE
|
||
GBITCH: JSR PC,RFLUSH
|
||
SUB #40,A
|
||
BIT #177700,A
|
||
BNE DCRRTS
|
||
JMP SRET
|
||
|
||
BITCNT: SPUSH A
|
||
CLR B
|
||
BR BITCT2
|
||
BITCT1: INC B
|
||
BITCT2: ASL A
|
||
BCS BITCT1
|
||
BNE BITCT2
|
||
SPOP A
|
||
RTS PC
|
||
|
||
;TRANSMIT INTERUPT ROUTINES
|
||
|
||
DCTBRK: SPUSH A
|
||
EXCHA TPDLP,P
|
||
RTS PC
|
||
|
||
TFLUSH: MOV A,DCTB
|
||
T1FLSH: EXCHA TPDLP,P
|
||
SPOP A
|
||
RTI
|
||
|
||
TLOGIN: MOV #'Z-100,A
|
||
JSR PC,TFLUSH
|
||
MOV #LOGMES,TBPOIN
|
||
LOGSEN: MOVB @TBPOIN,A
|
||
BEQ LOGDNE
|
||
INC TBPOIN
|
||
BIC #100,DCTS ;DON'T CARE IF NO ECHO
|
||
JSR PC,TFLUSH
|
||
BR LOGSEN
|
||
LOGDNE: BIC #100,DCTS ;PUT IT TO SLEEP
|
||
JSR PC,T1FLSH
|
||
TST REDY10
|
||
BEQ LOGDNE
|
||
;FALL IN HERE WHEN 10 IS READY TO RECIEVE
|
||
.STITL INITIALIZE THE WORLD!
|
||
START: RESET
|
||
MOV SPDLP,P ;SET UP SYSTEM PDL
|
||
CLR TIME
|
||
MOV #200,PCSTBF ;EVERY 128/10000 TH'S
|
||
MOV #113,PCS
|
||
TST RJLSW
|
||
BEQ NODC11
|
||
MOV #121,DCRS
|
||
MOV #121,DCTS
|
||
MOV #'Z-100,DCTB
|
||
NODC11: MOV #CORCHK,BEBRV ;WHERE TO GO ON MEM TRAP
|
||
MOV #LOGEND,A ;LAST LOCATION WITH CRAP IN IT
|
||
ADD #200,A
|
||
TST (A) ;IS IT REALLY THERE?
|
||
BR .-6 ;LOOP ENDED BY MEM TRAP
|
||
CORCHK: BIC #377,A
|
||
MOV #BEBRV+2,BEBRV
|
||
MOV A,CORTOP
|
||
SUB #22000+SLOT1,A ;FUDGE AREA (NOW RADIA CAN FIT DDT THERE!)
|
||
CLR B
|
||
MOV #MQ+2,C
|
||
MOV A,-(C) ;MOVE A TO MQ
|
||
CLR -(C) ;CLEAR HIGH ORDER(AC)
|
||
MOV NSLOTS,-(C) ;DIVIDE
|
||
MOV MQ,B ;GET RESULT
|
||
CMP B,#MSLTLN
|
||
BLO .+6
|
||
MOV #MSLTLN,B
|
||
BIC #37,B
|
||
MOV #SLOT1-2,A ;BEGINING OF SLOT-2 (FOR DISK)
|
||
MOV #SLTCAD+2,C ;ADDRESS OF SLOT
|
||
MOV NSLOTS,D
|
||
MOV D,NINU ;NUMBER OF USERS IN CORE NOW.
|
||
CLR E
|
||
SLTAL1: MOV A,(C)+ ;ADDRESS OF THIS SLOT
|
||
ADD B,A ;NEXT ONE
|
||
MOV E,SLOTST-SLTCAD-4(C) ;USER OF THIS SLOT
|
||
MOV #1,SLOTST-SLTCAD-2(C) ;JUST SWAPED IN
|
||
ADD #LUBLK,E ;NEXT USER
|
||
TST (C)+
|
||
DEC D
|
||
BGT SLTAL1 ;DO THIS NSLOTS TIMES
|
||
MOV B,USLENT
|
||
ASR B
|
||
MOV B,A ;SAVE A POSITIVE WORD COUNT
|
||
NEG B
|
||
MOV B,USWCNT
|
||
MOV #3,A
|
||
MOV #-1,B ;SIE OF DISK IN A AND B
|
||
SUB DSKRND,B ;MINUS RANDOM SYSTEM STORAGE
|
||
SUB DSKRND+2,B
|
||
MOV #MQ+2,C
|
||
MOV B,-(C)
|
||
MOV A,-(C)
|
||
MOV NUSERS,-(C) ;DIVIDE AMOUNT OF DISK BY # OF USERS
|
||
MOV #-1,A ;FULL ALOCATION
|
||
TST AC
|
||
BNE .+6
|
||
MOV MQ,A ;AMOUNT OF DISK PER USER
|
||
DALOC2: ADD USWCNT,A ;ADD NEGATIVE WORD COUNT TO AMOUNT OF DISK
|
||
SUB #DTIBFL+DEDBFL+DDIRL,A ;SUBTRACT FIXED BUFFERS
|
||
BGT DALOC3 ;RESULT <15 BITS
|
||
MOV #77777,A ;MAKE IT 15 BITS
|
||
DALOC3: BIC #377,A ;TO GET # OF WORDS OF RANDOM STORAGE
|
||
MOV A,E ;SAVE THAT QUANT IN E FOR (MUCH) LATER
|
||
SWAB A
|
||
MOV A,B
|
||
ASL A ;NUMBER OF BLOCKS (200 WORDS) NOW IN A
|
||
ASR B
|
||
ASR B
|
||
ASR B ;NUMBER OF BLOCKS/20 NOW IN B
|
||
MOV #DBITTB,C ;SET UP TO INIT DISK BIT TABLE
|
||
DALOC5: DEC B ;20 BLOCKS (=1 WORD IN TABLE)AT A TIME
|
||
BLT DALOC4 ;ALL DONE
|
||
CLR (C)+
|
||
BR DALOC5
|
||
DALOC4: CLR (C) ;ONLY SOME BITS ON IN THIS WORD
|
||
COM (C)
|
||
MOV #1,D
|
||
BIC #177760,A ;# OF WORDS MOD 20
|
||
DALOC6: DEC A
|
||
BLT DALOC7
|
||
BIC D,(C)
|
||
ASL D
|
||
BR DALOC6
|
||
DALOC7: TST (C)+
|
||
CMP C,#DBITBE
|
||
BGT DALOC8
|
||
MOV #-1,(C)
|
||
BR DALOC7
|
||
DALOC8: BIS #1,DBITTB ;FIRST BLOCK TO BE USED
|
||
BIS #100000,DBITBE ;IMPOSSIBLE TO GO OFF TOP
|
||
MOV E,D
|
||
MOV #3,A
|
||
MOV #-1,B
|
||
|
||
|
||
MOV #MNUSRS,E
|
||
MOV #LUBLK*<MNUSRS>,U
|
||
UVINIT: SUB #LUBLK,U ;FOR NEXT GUY DOWN
|
||
MOV #-1,FLSADR(U) ;INDICATE THAT THIS GUY ISN'T REALLY HERE
|
||
CLR FLSRES(U)
|
||
DEC E
|
||
CMP E,NUSERS ;MAYBE HE REALLY IS HERE
|
||
BGE UVINIT ;NOPE!
|
||
CLR FLSADR(U)
|
||
MOV #FRNEWU,FLSRES(U)
|
||
MOV #UDSKAD+4,C
|
||
ADD U,C
|
||
SUB D,B ;AMOUNT OF RANDOM STORAGE
|
||
SBC A
|
||
MOV A,-(C) ;HIGH ORDER RANDOM STORAGE ADDR
|
||
MOV B,-(C) ;LOW ORDER
|
||
MOV A,-(C) ;HIGH ORDER RANDOM STORAGE ADDR
|
||
MOV B,-(C) ;LOW ORDER
|
||
SUB #DDIRL,B
|
||
SBC A
|
||
MOV A,-(C) ;HIGH DISK DIR
|
||
MOV B,-(C) ;LOW
|
||
SUB #DEDBFL,B
|
||
SBC A
|
||
MOV A,-(C)
|
||
MOV B,-(C)
|
||
SUB #DTIBFL,B
|
||
SBC A
|
||
MOV A,-(C)
|
||
MOV B,-(C)
|
||
ADD USWCNT,B
|
||
BCS .+4
|
||
DEC A
|
||
MOV A,-(C)
|
||
MOV B,-(C)
|
||
TST E
|
||
BGT UVINIT
|
||
MOV #SLOT1,D
|
||
MOV #SOFN,B
|
||
MOV #ASOFN-SLOT1,C
|
||
ADD D,C
|
||
ADD USLENT,D ;LAST AVAILABLE WORD ADDR
|
||
CLR LINENO
|
||
INIT1: INC B
|
||
BIT #10000,B
|
||
BNE INIT2
|
||
MOV B,(C)+
|
||
CLR (C)+
|
||
CMP D,C
|
||
BHI INIT1
|
||
INIT2: CLR (C)+
|
||
CLR @C
|
||
ADD #SOFN,B
|
||
MOV B,NUNODE ;NUMBER OF NODES PER USER
|
||
MOV #UVBLK,A ;TO INITIALIZE USER VARIABLES IN SWAPPED OUT USERS
|
||
MOV #SLOT1,B ;SET UP FOR BLT
|
||
SETUVS: MOV (A)+,(B)+ ;BLLLLLLLLLLLLLLLLLT
|
||
CMP #UVBLK+LUVBLK,A
|
||
BGT SETUVS
|
||
TST RWWSW
|
||
BNE STARTF
|
||
JSR PC,SYDRBG ;GET A SYSTEM DISK REQUEST BLOCK
|
||
CLR (A)+ ;NO START ROUTINE
|
||
MOV USWCNT,(A)+ ;LENGTH OF A USER SLOT
|
||
MOV #SLOT1-2,(A)+ ;SWAP OUT SLOT1
|
||
MOV DCLRUS,(A)+ ;GETS PUT INTO THE CLEAR USER PLACE
|
||
MOV DCLRUS+2,(A)+
|
||
TST (A)+
|
||
MOVB #DWRTEC,(A)
|
||
STARTF: MOV NUSERS,NUSER2
|
||
ASL NUSER2
|
||
TST JDCSW
|
||
BNE ITINIT
|
||
MOV #UTYO,TYO+2
|
||
MOV #UTYI,TYI+2
|
||
MOV #3,BRKCHR
|
||
JMP NEXTUS
|
||
ITINIT: JMP TINIT
|
||
|
||
UGO: JSR PC,RUNME
|
||
PRTXT ^/11LOGO /
|
||
MOV LVERNF,A
|
||
JSR PC,PRDN
|
||
PRCR
|
||
RSTART:
|
||
MOV SALTL,ALTL
|
||
MOV #100,TKS ;ENABLE INTERRUPTS FOR TYI
|
||
TEST1:
|
||
MLOOP: JSR PC,SCHEDP
|
||
TST BRAKE(U)
|
||
BEQ MLOOP1
|
||
JSR PC,BRAKR ;BREAK
|
||
JMP ERTLN
|
||
MLOOP1: JSR PC,GETSTR
|
||
JSR PC,MREAD
|
||
JSR PC,EVLINE
|
||
ERROR+WDW ;WHAT SHOULD I DOO WITH (S)
|
||
BR MLOOP
|
||
WSTART: MOV #IP,P ;USE WITH CAUTION!!
|
||
BR RSTART
|
||
RUNRUG: 3
|
||
BR .+2 ;RUG SHOULD RETURN HERE IF $P'ED
|
||
BR .+2
|
||
JMP NORT
|
||
.STITL GET A STRING
|
||
|
||
GSTR9: MOV CLN,B
|
||
JSR PC,GTLINE
|
||
ERROR+LDE ;LINE ..(B).. DOESN'T EXIST
|
||
MOV C,A
|
||
BR GSTR8
|
||
GETSTR: TST FUNLEV ;ARE WE IN A PROC
|
||
BEQ GSTR0 ;NO
|
||
BIT #ERRF,FLAGS2 ;ERROR, MAYBE
|
||
BNE GSTR0 ;YES
|
||
MOV CLP,B ;NO, GET THIS NODE OF LLP
|
||
BEQ GSTR9
|
||
JSR PC,.LOAD
|
||
BIT #7777,A ;IS IT LAST NODE
|
||
BNE GSTR8
|
||
SPUSH A ;"STOP" POPS 5 WORDS
|
||
SPUSH A
|
||
SPUSH A
|
||
SPUSH A
|
||
JMP PSTOP
|
||
GSTR8: MOV A,CLP
|
||
MOV A,B
|
||
JSR PC,.LOAD
|
||
JSR PC,.LOAD ;OK, GET FIRST NODE OF LINE, = LINE #
|
||
MOV B,CLN
|
||
MOV A,CTP ;IN CASE THERE IS; NO GENERATION #
|
||
MOV A,C
|
||
JSR PC,.LOADC ;GET SECOND NODE
|
||
CLR CLGN ; IF TYPE = SNUM, IT IS GEN #
|
||
MOV A,C
|
||
BIC #7777,C
|
||
CMP #SNUM,C
|
||
BNE GSTR6
|
||
MOV B,CLGN ;IT IS
|
||
MOV A,CTP
|
||
;FALLS THROUGH
|
||
|
||
;FALLS IN
|
||
GSTR6: BIS #LIST,CTP
|
||
SPUSHS CTP
|
||
BIT #TRACEF,FLAGS2
|
||
BEQ GSTRT
|
||
PRCR
|
||
PRTXT ^\ #\
|
||
MOV CPP,B
|
||
JSR PC,PPNAME ;PRINT PNAME
|
||
PRTXT ^\ LINE \
|
||
MOV CLN,A
|
||
JSR PC,PRDN
|
||
PRCR
|
||
JSR PC,PRLN
|
||
BR GSTRT
|
||
|
||
|
||
GSTR0: BIT #TESTF,FLAGS2
|
||
BEQ GSTR1
|
||
MOV ALTL,A
|
||
MOV (A)+,B
|
||
BEQ DONE
|
||
MOV A,ALTL
|
||
PUSHS B
|
||
PRCR
|
||
PRTXT ^/TEST LINE /
|
||
INC LINENO
|
||
MOV LINENO,A
|
||
JSR PC,PRDN
|
||
PRCR
|
||
JSR PC,PRLN
|
||
CLR FLAGS
|
||
CLR CO
|
||
CLR CO+2
|
||
CLR NOR
|
||
GSTRT: RTS PC
|
||
POP A ;GET RETURN ADDR
|
||
PUSH #1
|
||
JMP @A
|
||
GSTR1: JSR PC,RDSTR
|
||
BR GSTRT
|
||
DONE: PRTXT ^/ALL DONE!/
|
||
PRCR
|
||
SPOP A ;CROCK!!!
|
||
JMP RSTART ;BLECTCH?
|
||
.STITL READ A STRING - PTR ON S
|
||
RDSTR1: PRCR
|
||
RDSTR: CLR NBKTS
|
||
CLR BRAKE
|
||
MOV PRMTCH,D
|
||
BEQ RDSTR9
|
||
JSR PC,TYO
|
||
RDSTR9: JSR PC,RLINE
|
||
JSR PC,BLSTI
|
||
RDSTR2: JSR PC,TYI
|
||
TST BRAKE
|
||
BEQ .+10
|
||
JSR PC,BRAKR
|
||
BR RDSTR7
|
||
CMP BRKCHR,D ;BREAK TYPED?
|
||
BEQ RDSTR7 ;YES
|
||
TST NBKTS ;IN A LIST?
|
||
BGT RDSTR3 ;YES
|
||
CMP #15,D ;CR?
|
||
BEQ RDSTR4
|
||
RDSTR3: CMP #'[,D
|
||
BNE RDSTR6
|
||
INC NBKTS
|
||
RDSTR6: CMP #'],D
|
||
BNE RDSTR5
|
||
DEC NBKTS
|
||
RDSTR5: JSR PC,BLST
|
||
BR RDSTR2
|
||
RDSTR4: JSR PC,BLSTF
|
||
BR RDSTR ;NO CHARS TYPED
|
||
PUSHS TOPS
|
||
CLR TOPS
|
||
RTS PC
|
||
RDSTR7: JSR PC,BLSTF
|
||
BR RDSTR1
|
||
JSR PC,FRELST
|
||
BR RDSTR1
|
||
RQUEST: PUSH PRMTCH
|
||
MOV #'<,PRMTCH
|
||
JSR PC,RDSTR
|
||
POP PRMTCH
|
||
JMP ORT
|
||
.STITL MORE READ ROUTINES!!!
|
||
MREAD: TST FUNLEV ;ARE WE IN PROC?
|
||
BEQ MRD1 ;NO
|
||
BIT #ERRF,FLAGS2 ;YES, BUT ERROR?
|
||
BNE MRD1 ;YES
|
||
RTS PC ;NO
|
||
MRD1: BIT #TESTF,FLAGS2
|
||
BNE MRD2
|
||
JMP READ ;CONVERT CHAR STRING TO TOKEN LIST
|
||
MRD2: RTS PC
|
||
|
||
|
||
RLINE: TST USER
|
||
BLT RLINE1
|
||
TST JDCSW
|
||
BEQ RLINE1
|
||
PUSH U
|
||
MOV USER,U
|
||
MOV #FRTYIH,FLSRES(U)
|
||
JSR PC,FLUSH ;RETURNS WHEN LINE DONE
|
||
JSR PC,RUNME
|
||
POP U
|
||
RLINE1: RTS PC
|
||
.STITL EVAL 1 LINES
|
||
EVLINE: TST TOPRNM
|
||
BNE EVLI4
|
||
EVLI6: JSR PC,IGNT ;EVALUATES 1 LINES ON S
|
||
EVLI1: BIT #CRF,FLAGS
|
||
BNE EVLI2
|
||
JSR PC,EVAL
|
||
BR EVLI3 ;NO OUTPUT, OK
|
||
RTS PC
|
||
EVLI3: BIT #CRF,FLAGS
|
||
BNE EVLI2
|
||
JSR PC,GNT
|
||
BIS #RTF,FLAGS
|
||
BR EVLI1
|
||
EVLI4: MOV @S,B
|
||
JSR PC,.LOAD
|
||
MOV A,D
|
||
BIC #7777,A
|
||
CMP #SNUM,A
|
||
BEQ EVLI5 ;AN SNUM
|
||
CMP #LNUM,A
|
||
BNE EVLI6 ;NOT EVEN A NUMBER
|
||
JSR PC,.LOAD ;AN LNUM, SEE IF TOO BIG
|
||
BIT #7777,A
|
||
BNE EVLI7 ;TOO BIG
|
||
BIC #170000,D ;MAKE IT INTO AN SNUM
|
||
ADD D,A
|
||
JSR PC,GRBAD
|
||
MOV C,@S
|
||
EVLI5: JSR PC,ADLN
|
||
POPS A
|
||
EVLI2: SKPRET
|
||
EVLI7: ERROR+LNTB ;LINE # TOO BIG
|
||
.STITL GET NEXT TOKEN
|
||
|
||
GNT: BIT #RTF,FLAGS ;IS REPEAT TOKEN FLAG SET?
|
||
BEQ GNT1
|
||
BIC #RTF,FLAGS ;YES
|
||
MOV CT,A
|
||
MOV CT+2,B
|
||
BNE GNT6
|
||
CMP #SFUN,A
|
||
BNE GNT6
|
||
BIS #CRF,FLAGS
|
||
GNT6: RTS PC
|
||
GNT1: BIC #PTLPF,FLAGS
|
||
CMP #$LLPAR,CT+2 ;IS CT "("
|
||
BEQ GNT3
|
||
CMP #$LPAR,CT+2
|
||
BNE .+8.
|
||
GNT3: BIS #PTLPF,FLAGS ;YES, SET PTLPF
|
||
MOV CT,B ;GET LINK TO NEXT TOKEN
|
||
MOV B,CTP
|
||
BIT #7777,B
|
||
BEQ GNT2 ;ANY TOKENS LEFT
|
||
JSR PC,.LOAD ;YES
|
||
GNT4: MOV A,CT
|
||
MOV B,CT+2
|
||
RTS PC
|
||
GNT2: BIT #CRF,FLAGS
|
||
BNE GNT5
|
||
BIS #CRF,FLAGS
|
||
MOV #SFUN,A
|
||
CLR B
|
||
BR GNT4
|
||
GNT5: ERROR+OOT ;OUT OF TOKENS
|
||
IGNT: POPS B
|
||
BIT #7777,B
|
||
BEQ IGNT1
|
||
BIC #CRF,FLAGS
|
||
JSR PC,.LOAD
|
||
IGNT2: MOV A,CT
|
||
MOV B,CT+2
|
||
BIS #RTF,FLAGS
|
||
MOV #1,CTN
|
||
RTS PC
|
||
IGNT1: BIS #CRF,FLAGS
|
||
MOV #SFUN,A
|
||
CLR B
|
||
BR IGNT2
|
||
TYO: JMP @#STYO
|
||
STYO: TSTB TPS
|
||
BPL .-4
|
||
MOV D,TPB
|
||
RTS PC
|
||
UTYO: TSTB TPS
|
||
BPL .-4
|
||
MOVB D,TPB
|
||
CMP #15,D
|
||
BNE UTYOR
|
||
MOV #12,D
|
||
JSR PC,TYO
|
||
MOV #15,D
|
||
UTYOR: RTS PC
|
||
TYOT: 0
|
||
0
|
||
CH: 0
|
||
TYI: JMP @#STYI
|
||
STYI: WAIT
|
||
TSTB TKS
|
||
BPL STYI
|
||
MOVB TKB,D
|
||
BIC #177200,D
|
||
BR STYO
|
||
UTYI: WAIT
|
||
TST CHI
|
||
BEQ UTYI
|
||
MOVB CHI,D
|
||
CLR CHI
|
||
BIC #177600,D
|
||
BR TYO
|
||
.STITL GARBAGE COLLECTOR
|
||
NNODES==4096.
|
||
GCBTL== NNODES/8./2.*2.+2. ;GARBAGE COLLECT BIT TABLE LENGTH
|
||
|
||
MARKN: SPUSH A ;MARK NODE(B)
|
||
SPUSH B
|
||
MOV B,A
|
||
BIC #170000,A
|
||
BIC #177770,B
|
||
MOVB BMT(B),B
|
||
ASR A
|
||
ASR A
|
||
ASR A
|
||
ADD GCBITS,A
|
||
BISB B,(A)
|
||
SPOP B
|
||
SPOP A
|
||
RTS PC
|
||
|
||
BMT: .BYTE 1,2,4,10,20,40,100,200
|
||
.IFNZ GCDBUG
|
||
LMT: DMK ;SYSTEM FUNCTION
|
||
DMK ;INFIX (SYSTEM FUNCTION)
|
||
DMK ;USER FUNCTION
|
||
DMK ;VARIABLE BINDING
|
||
GCDIE ;UNUSED
|
||
GCDIE ;UNUSED
|
||
GCDIE ;UNUSED
|
||
DMK ;SHORT STRING
|
||
MKSNP ;SNAP
|
||
DMK ;ATOM
|
||
DMK ;SHORT NUMBER
|
||
GCMARK ;LONG NUMBEB
|
||
GCMARK ;LONG STRING
|
||
GCDIE ;TBA
|
||
GCMARK ;SENTENCE
|
||
GCMARK ;LIST
|
||
.ENDC
|
||
|
||
|
||
MARKL: CMP B,#SNP ;IS LIST A SNAP?
|
||
BLOS MKL0 ;NO
|
||
CMP B,#<SNP+10000>
|
||
BLO MKSNPL ;YES
|
||
MKL0: PUSH A ;MARK LIST
|
||
SPUSH B ;NODE ADDS IN B
|
||
SPUSH C
|
||
.IFNZ GCDBUG
|
||
SPUSH D
|
||
.ENDC
|
||
MOV B,A
|
||
MKL1: MOV A,C
|
||
BIT #7777,C ;IS THERE ANOTHER NODE
|
||
BEQ MKL3
|
||
MOV C,B ;YES, MARK IT
|
||
JSR PC, MARKN
|
||
JSR PC,.LOADC ;GET IT
|
||
|
||
.IFNZ GCDBUG
|
||
MOV A,D
|
||
SWAB D
|
||
BIC #177417,D
|
||
ASR D
|
||
ASR D
|
||
ASR D ;ALL THIS GIVES YOU THE TYPE*2
|
||
JMP @LMT(D) ;WHICH YOU MIGHT MARK ON
|
||
|
||
DMK: BR MKL1
|
||
GCDIE: HALT
|
||
GCMARK: JSR PC,MARKL
|
||
BR MKL1
|
||
.ENDC
|
||
MKSNPL: EXCH SNPTEM,C ;B POINTS TO SNAP
|
||
JSR PC,MKDC
|
||
MOV SNPTEM,C ;RESTORE C
|
||
BR MKL0
|
||
MKSNP: JSR PC,MKDC ;ONLY MARKS THE DISPLAY CODE
|
||
JSR PC,MKL0 ;ALSO NEED TO MARK THE NODES
|
||
BR MKL1
|
||
|
||
.IFZ GCDBUG
|
||
BIC #7777,A
|
||
CMP #100000,A
|
||
BLO MKL1
|
||
BEQ MKSNP
|
||
CMP #120000,A
|
||
BLOS MKL1
|
||
JSR PC,MARKL
|
||
BR MKL1
|
||
.ENDC
|
||
|
||
MKL3: .IFNZ GCDBUG
|
||
SPOP D
|
||
.ENDC
|
||
SPOP C
|
||
SPOP B
|
||
POP A
|
||
RTS PC
|
||
|
||
.GCOLL: JSR F,ACSAV
|
||
PUSH ACRELF
|
||
MOV USER,U
|
||
.GCOL2: TST GCLOCK ;IS SOMEONE ELSE GC'ING?
|
||
BLT .GCOL3 ;NO, GO AHEAD
|
||
JSR PC,FLUSH ;WAIT
|
||
BR .GCOL2
|
||
.GCOL3: MOV U,GCLOCK
|
||
JSR PC,RUNME
|
||
MOV GCBITS,A ;GARBAGE COLLECT
|
||
MOV #GCBTL/2-1,B ;CLEAR BIT TABLE
|
||
MOV #1,(A)+ ;ALWAYS PROTECT NODE ZERO
|
||
.GCOL1: CLR (A)+
|
||
DEC B
|
||
BGT .GCOL1
|
||
PUSHS SNLIST ;PROTECT THESE LOSERS
|
||
SPUSHS #TRUE
|
||
SPUSHS #FALSE
|
||
|
||
MOV #RELE,ACRELF
|
||
MOV #HCC,F ;NUMBER OF HASH CODE ELEMENTS
|
||
MOV SUHCT,E ;ADDRESS OF HASH TABLE
|
||
MKUOBL: DEC F
|
||
BLT MKTPS
|
||
MOV (E)+,D ;GET A HASH CODE ELEMENT
|
||
MKUOBI: MOV D,C
|
||
BEQ MKUOBL ;NO MORE
|
||
MOV D,B ;MARK THE NODE
|
||
JSR PC,MARKN
|
||
JSR PC,.LOADC
|
||
MOV A,D
|
||
MOV B,C
|
||
JSR PC,MARKN ;MARK NODE POINTED TO BY THIS ONE
|
||
JSR PC,.LOADC ;THEN GET IT
|
||
JSR PC,MARKL ;SHOULD BE PNAME POINTER NODE
|
||
MOV A,C
|
||
MKUOE: BIT #7777,C ;ONE OTHER NODE?
|
||
BEQ MKUOBI ;NO
|
||
MOV C,B ;YES
|
||
JSR PC,MARKN ;MARK IT
|
||
JSR PC,.LOADC
|
||
MOV C,SNPTEM ;SAVE IN CASE VBIND IS SNAP
|
||
MOV A,C
|
||
BIC #7777,A
|
||
CMP #FBIND,A
|
||
BEQ MKFB ;FUNCTION BINDING
|
||
CMP #VBIND,A
|
||
BEQ MKVB ;VARIABLE BINDING
|
||
CMP #SFBIND,A
|
||
BEQ MKSFB ;SWAPPED FB
|
||
CMP #SVBIND,A
|
||
BEQ MKSVB ;SWAPPED VB
|
||
HALT ;BUG
|
||
MKVB: JSR PC,MARKL
|
||
BR MKUOE
|
||
MKFB: JSR PC,MARKL
|
||
BR MKUOE
|
||
MKSVB: BR MKUOE
|
||
MKSFB: JSR PC,MARKL
|
||
BR MKUOE
|
||
|
||
|
||
MKTPS: MOV #GCMKL,F
|
||
MKRNDM: MOV (F)+,B ;POINTER TO POINTER
|
||
BEQ MKSPDL ;LAST ONE
|
||
MOV (B),B ;REAL NODE ADDRESS
|
||
BEQ MKRNDM ;NOTHING THERE
|
||
JSR PC,MARKL
|
||
BR MKRNDM
|
||
MKSPDL: MOV SPBASE,E
|
||
MKSP1: MOV -(E),B ;GET A S PDL WORD
|
||
CMP E,S ;END OF S PDL?
|
||
BLT MKSP2 ;YES
|
||
JSR PC,MARKL ;MARK S PDL WORD
|
||
BR MKSP1
|
||
MKSP2: MOV SPBASE,A
|
||
TST (A)+
|
||
BNE MKSP3 ;THERE I S PDL ON DISK, GO MARK IT
|
||
TST (A)
|
||
BEQ MKSP4
|
||
MKSP3: JSR PC,UBLKGR
|
||
HALT
|
||
HALT
|
||
MOV B,SSAVEA
|
||
MOV C,SSAVEA+2 ;PLACE TO SAVE S PDL
|
||
MOV SSWPAD,4(A)
|
||
MOVB #DWRTEC,14(A) ;WRITE OUT CURRENT S PDL
|
||
JSR PC,DSKWA2
|
||
MKSP8: MOV SPBASE,B
|
||
TST (B)+ ;IS @HERE ANODHER BLOCK ON DHSK?
|
||
BNE MKSP5 ;YES
|
||
TST (B)
|
||
BEQ MKSP6 ;NO
|
||
MKSP5: JSR PC,SYDRBG ;PREPARE TO SWAP IN BLOCK
|
||
CLR (A)+
|
||
MOV #-200,(A)+
|
||
MOV SSWPAD,(A)+
|
||
MOV SPBASE,B
|
||
MOV (B)+,(A)+
|
||
MOV (B)+,(A)+
|
||
TST (A)+
|
||
MOVB #DREADC,(A)
|
||
JSR PC,DSKWAI
|
||
MOV #200,F
|
||
MOV SPBASE,E
|
||
MKSP7: MOV -(E),B ;MRK THIS PIECE OF S PDL
|
||
JSR PC,MARKL
|
||
DEC F
|
||
BGT MKSP7
|
||
BR MKSP8
|
||
MKSP6: JSR PC,SYDRBG ;PREPARE TO SWAP CURBENT PDL |