|
|
DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC3600/RC7000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RegneCentralen RC3600/RC7000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 63488 (0xf800)
Types: TextFile
Notes: RCSL-43-GL-10614, RCSL-43-GL-10615, RCSL-43-GL-10616, RCSL-43-GL-10617, RCSL-43-GL-10618, RCSL-43-GL-10619
Names: »YDBX3«
└─⟦45bd0f8dd⟧ Bits:30000464 DOMUS disk image
└─⟦this⟧ »/YDBX3«
└─⟦6dbcc9c03⟧ Bits:30000463 DOMUS disk image
└─⟦this⟧ »/YDBX3«
└─⟦a2e222af0⟧ Bits:30001626 DOMUS disk image
└─⟦this⟧ »/YDBX3«
; RCSL: 43-GL10615
; AUTHOR: KDH
; DATE: 80.09.23
; DB003
; DOMUS-CAT BOOTSTRAP PROGRAM
; KEYWORDS: DOMUS,BOOTSTRAP,SYSTEM START
;
; ABSTRACT: THIS PROGRAM IS USED WHEN A CAT-DOMUS SYSTEM
; IS STARTED. THE PROGRAM IS IS A RELOCATABLE-
; LOADER, WHICH CAN LOAD SEPERATE FILES INTO AN
; COREIMAGE. THE FILES IS LOADED IN THE ORDER GIVEN
; IN A COMMAND FILE SUPPLIED BY THE OPERATOR AT
; START.
; THE PROGRAM IS PLACED ON THE FIRST 6 SEGMENTS ON
; THE SYSTEM DISC.
; CAT: CAT76 OR LATER VERSIONS
; ASCII SOURCE: RCSL: 43-GL10614
;
; ABS.BIN TAPE: RCSL: 43-GL10616 DBD03 ( DIABLO DISC )
; RCSL: 43-GL10617 DBM03 ( CDC DISC )
; RCSL: 43-GL10618 DBH03 ( FIXED HEAD DISC )
; RCSL: 43-GL10619 DBF03 ( FLEXIBLE DISC,UNIT 0 )
«ff»
; WHEN STARTED THE QUESTION 'SYSTEM: ' IS OUT PUT ON THE OPERATOR
; CONSOLE. THE ANSWER MUST BE A CAT ENTRY-NAME, AND THIS FILE
; SHOULD CONTAIN A NUMBER OF FILENAMES, WHERE EACH FILE IS A
; SYSTEM MODULE IN RELOCATABLE FORMAT. EACH FILENAME CAN BE OF ANY
; NUMBER OF CHARACTERS BUT ONLY THE FIST FIVE IS SIGNIFICANT,
; AND REST IS SKIPPED. FILE NAMES ARE SEPERATED BY ONE OR MORE
; CHARACTERS WITH VALUE LESS THEN 33 (ASCII SPACE).
;
; FIRST FILENAME HAS TO BE 'BASIS' , IDENTIFYING THE
; FILE AS A BOOTSTRAP COMMAND FILE. THE NAME IS CHECKED BUT NOT USED.
; BY THE BOOTSTRAP PROGRAM. THE LAST NAME IS 'END' WHICH
; TERMINATES THE COMMAND FILE.
;
; EXAPLE:
;
; BASIS
; MUM
; MUB
; MUC MUU MUR INT
; ....
; ....
; TTY
; DOMUS
; MUI
; END
; THE MODULES GIVEN IN THIS COMMAND FILE IS LOADED,
; TO FORM A RESULTING EXECUTABLE CORE-IMAGE, IN
; THE SAME ORDER AS GIVEN. THE LOADER STARTS LOADING OF
; REL. BIN DATA FROM WORD 400( OCT ) AND ON, AND ONLY RELOCATABLE
; DATA BLOCKS, RELOCATABLE ABS. BLOCKS, TITLE BLOCKS AND START
; BLOCKS ARE ACCEPTED.
;
; ALL STARTADDRESSES GIVEN IN STARTBLOCKS DIFFERENT
; FROM 0 AND 1B0 IS PLACED IN THE RESULTING COREIMAGE FROM
; WORD 402 (OCT) AND ON , AND THIS TABLE IS TERMINATED WITH
; THE VALUE -1 (177777 OCT). THIS LIST OF START
; ADDRESSES CAN BE USED BY AN INITIALIZATION PROGRAM IN THE
; RESULTING SYSTEM ( EXP. MUI IN MUS-SYSTEM).
;
; FOR ALL TITLE BLOCKS MET DURING LOADING THE TITLES IS OUTPUT
; ON SEGMENT 11 ON THE SYSTEM DISC EACH TITLE PLACED IN TWO
; WORDS IN RADIX 50 REPRESENTATION. THIS LIST OF TITLES
; IS TERMINATED WITH THE WORD -1 (177777 OCT).
;
; WHEN LOADING HAS BEEN FINISHED AFTER THE TRAILING 'END'
; IN THE COMMAND FILE, THE RESULTING SYSTEM IS STARTED IN
; ADDRESS 377 (OCT) IN THE LOADED SYSTEM.
;
; OPERATOR COMMUNICATION:
;
; WHEN STARTED THE BOOTSTRAP-PROGRAM OUTPUT THE QUESTION:
; ' SYSTEM: '. INPUT MUST BE A FILENAME AND ONLY FIRST FIVE
; CHARACTERS ARE SIGNIFICANT. ANY CHARACTER LESS THAN 32
; ( ASCII SPACE ) TERMINATES INPUT, AND RUBOUT CAN DURING
; INPUT BE USED TO DELETE THE PREVIOUS CHARACTER INPUT.
; IF <NL> OR <CR> IS TYPED IMMEDIATELY, THE STANDARD NAME
; 'S3600' IS USED.
«ff»
; ERROR MESSAGES:
;
; ***NOT FOUND, FILE: <FILENAME>
;
; THE FILE GIVEN BY <FILENAME> IS NOT PRESENT IN THE CATALOG.
;
;
; ***ILLEGAL BLOCK TYPE, FILE:<FILENAME>
;
; A RELOCATABLE BLOCK TYPE OTHER THAN START,TITLE,SIZE OR DATA
; BLOCK IS FOUND IN FILE <FILENAME>.
;
;
; ***ILLEGAL FILETYPE, FILE:<FILENAME>
;
; FILE <FILENAME> IS NOT A BOOTSTRAP COMMAND FILE
; AS THE FIRST NAME FOUND <> 'BASIS', OR THE FILE IS NOT
; A DATA FILE (CAT ATTR. ENTRY ONLY SET).
;
;
; ***CHECKSUM ERROR, FILE: <FILENAME>
;
; ONE OF THE RELOCATABLE BLOCKS ON FILE <FILENAME>
; HAS AN CHECKSUM ERROR.
;
;
; ***SIZE ERROR <OCTAL NUMBER>
;
; NOT ENOUGH SPACE IN CORE TO LOAD THE SYSTEM. <OCTAL NUMBER>
; IS THE MAXIMAL NUMBER OF WORDS THAT CAN BE USED BY THE LOADER.
;
;
; ***END MEDIUM, FILE: <FILENAME>
;
; FYSICAL END OF MEDIUM ON FILE <FILENAME> HAS BEEN FOUND
; BEFORE LOGICAL END OF FILE. IE. 'END' NAME IN COMMAND FILE
; OR RELOCATABLE START BLOCK MISSING IN FILE.
;
;
; ***HARDERROR ON DISC <OCTAL NUMBER>
;
; THE DISC HAS MALFUNCTION.
; <OCTAL NUMBER> IS THE HARDWARE STATUS WORD WITHOUT MODIFICATIONS.
; PLEASE CONSULT RC OR HARDWARE MANUAL FOR FURTHER INFORMATION.
;
;
; AFTER OUTPUT OF THE ERRORMESSAGE THE LOADER IS
; REINITIALIZED AND OUTPUTS THE QUIERY 'SYSTEM: '
; AGAIN.
;
;
;
«ff»
; USING THE MUS-SYSTEM:
;
;
; IF THE SYSTEM YOU WANT TO LOAD IS A 'MUS' SYSTEM YOU MUST
; FOLLOW THIS SEQUENCE OF MODULES IN YOUR COMMANDFILE
; FOR THE LOADER:
;
;
; MUM ! MUS SYSTEM MONITOR !
; ...
; ...
; ...
; ... ! REST OF NON PROCESS MODULES !
; ...
; TTY ! FIRST DRIVER MODULE !
; ... ! REST OF PROCESSES IN SYSTEM !
; ...
; S ! MUS OPERATING SYSTEM !
; MUI ! MUS INITIALIZATION !
;
;
; THIS SEQUENCE OF LOADED MODULES IS NESSECARY AS THE MUI-
; MODULE IS REMOVED AFTER SYSTEM START, AND THE S-PROCESS
; EXPECTS REST OF FREE CORE ABOVE OWN CODE.
; NOTICE: THE LOADER IS CAPABLE OF DISPLACING XREL-PARTS
; OF A MODULE OR A WHOLE XREL-MODULE INTO
; SEPERATE CORE-AREAS.
;
; 0/1: IF CPU-TYPE 0/1 IS MET NREL,XREL IS NOT SEPERATED;
; BUT LOADED SEQUENTIALLY STARTING WITH THE XREL-PART
;
; NOW MEM-SPACE IS CALCULATED USING THE STARTING ADDRESS
; (32K-1)-1.IF NO CORE DECREMENT ST ADDRESS WITH 2K;
;
; 2,3,4: IF CPU-TYPE 2/3/4 IS MET THE INTRUCTION 'SET EXT
; MEM ON ' IS USED TO ENABLE HIGH CORE IF AVAIABLE.
; NEXT LACK OF MEM IS CHECKED STARTING WITH ADDRESS
; (64K-1)-1 IN WRITE OUT DATA=ADDRESS ON THE ADDRESS
; AND READ CHECK DATA.NOTICE:LACK OF MEM MAY CAUSE
; 177777 ON DATA-BUS;
;
; DURING LOAD THE XREL-PART IF ANY IS PLACED FROM
; TOP-ADDRESS AND BACKWARDS IF HIGH MEM IS AVAIABLE
;
; COMMON: AFTER LOAD THE MON-PARAMETERS CORESIZE AND FFIRST
; ARE UPDATED ACC TO LOADER FIRST TOP -ADDRESS IN USE
; AND FIRST-TOP -4;THE CORESIZE-PROC THEN OMITTED IN MUI;
;
;
; CPU-TYPE: DESCRIPTION:
;
; 0 OLD NOVA,ALL 3603 CPU
; 1 RC3703
; 2 RC3803
; 3 RC3703E
; 4 RC3603E
«ff»
.RDX 10
.TXTM 1
; TYPE IS DEFINED ON SEP. FILE
;
; TYPE = 0 IF DIABLO DISC
; TYPE = 1 IF CDC DISC
; TYPE = 2 IF FIXED HEAD DISC
; TYPE = 3 IF FLEXIBLE DISC
; TTI AND TTO ARE DEFINED ON A SEP. FILE
;
; DEF OF DISPLACEMENTS
;
INDEX =0 ; ADDR OF INDEXBLOCK
CBUF =INDEX+1 ; ADDR OF DATA
CURINDEX=CBUF+1 ; ADDR OF CUR SLICE IN INDEXBLOCK
CURSLICE=CURINDEX+1 ; CUR SECTOR ADDR
REMSLICE=CURSLICE+1 ; REM NO OF SLICES IN FILE
RESTSEG = REMSLICE ; NO OF REM SEGMENTS IN FILE
REMSEGM=REMSLICE+1 ; REM SEGMENTS IN CURRENT SLICE
REMBYTES=REMSEGM+1 ; REM BYTES IN DATA BUFFER
CURADDR=REMBYTES+1 ; CURRENT BYTE ADDR IN DATA
;
.RDX 8
SCORSIZE = 70
SFFIRST = 60
.RDX 10
CATT =6 ; ATTRIBUTE IN ENTRY
CLENGTH=CATT+1 ; FILE LENGTH IN ENTRY
CSEGM =CLENGTH+1 ; INDEX BLOCK SEGM ADDR IN ENTRY
;
SEGMSIZE=256 ; SIZE OF DISC SEGMENT IN DEC WORDS
;
.IFE TYPE
DEV=0 ; DEVICE CODE OF RC3600 DISC
.ENDC
.IFE TYPE-1
DEV = 16 ; DEVICECODE OF CDC DISC
.ENDC
.IFE TYPE-2
DEV = 20 ; DEVICE CODE OF FIXED HEAD DISC
.ENDC
.IFE TYPE-3
DEV = 49 ; DEVICECODE OF FLEX.DISC,FIRST CHANNEL
; UNIT ZERO;
.ENDC
«ff»
0 ; STATUS FOR CDC DISC
0 ;
0 ;
;ENTRY PROCEDURES
;
PZ250: P250 ;
PZ260: P260 ;
PZ008: P008 ;
PZ004: P004 ;
PZ010: P010 ;
.LOC 21 ;
;
216B7+7 ; STOP COMMAND FOR CDC
.LOC 32 ;
PZ040: P040 ;
PZ060: P060 ;
PZ015: P015 ;
AZ40 : A40 ;
PZ001: P001 ;
AZ43: A43 ;
PZ003: P003 ;
AZ41: A41 ;
PZ090: P090 ;
«ff»
PZ1: .+2 ;
PZ2: .+1*2 ; REF NAME (BYTE)
.TXT .S3600. ; NAME
PZ30: 0 ; HASHBASE;FOUND IN UNITDESCR.BLOCK;
PZ3: 0 ; HASHVALUE;NAME REM HASHBASE;
PZ4: SEGMSIZE*6 ; SYS INDEX
PZ5: .+1 ; REF FILE 'SYS'
SEGMSIZE*6 ;
SEGMSIZE*7 ;
SEGMSIZE*6 ;
0 ;
0 ;
0 ;
0 ;
0 ;
PZ6: .+1 ; REF FILE COMMAND
SEGMSIZE*8 ;
SEGMSIZE*9 ;
SEGMSIZE*8-1 ;
0 ;
0 ;
0 ;
0 ;
0 ;
PZ7: .+1 ; REF FILE 'CURRENT LOAD'
SEGMSIZE*10 ;
SEGMSIZE*11 ;
SEGMSIZE*10 ;
0 ;
0 ;
0 ;
0 ;
0 ;
«ff»
; CONSTANTS
C127: 127 ;
C32: 32 ;
C11: 11 ;
C5: 5 ;
C3: 3 ;
C2: 2 ;
C95: 95 ;
NOENTRY: 16 ;
ESIZE: 16 ;
CM256: -256 ;
C512: 512 ;
NOSEC: 12 ;
NOSUR: 2 ;
NOCYL: 203 ;
NODRI: ;
B1B13: 1B13 ;
B234: 1B2+1B3+1B4 ;
B1B4: 1B4 ;
B1B2: 1B2 ;
B1B0: 1B0 ;
CM16: -16 ;
C47: 47 ;
C15: 15 ;
C128: 128 ;
C255: 255 ;
C256: 256 ;
C19: 19 ;
C6: 6 ;
C8: 8 ;
B1B9: 1B9 ;
DEVFL: 1B0+1B1+1B2+1B3+1B4 ;
.S: 1B13 ; BIT (START DRIVE 0)
;WORK REGISTERS
HEADS: 0 ; NO OF HEADS ON DRIVE 0 ( CDC )
WCOUNT: 0 ;
WORK: PZ2+1*2 ;
WORK1: 0 ;
LINK: 0 ;
LINK1: 0 ;
LINK2: 0 ;
LINK3: 0 ;
WSAVE: 0 ;
COREADDR: 0 ;
SEGMNO: 0 ;
CYLINDER: 0 ;
DRIVE: 0 ;
SURFACE: 0 ;
SECTOR: 0 ;
«ff»
; ; KDH,80.09.23,DB003
; CONSTANTS:
CORSIZE: 2048 ; INIT:CORESEGM; WORK:NREL-MAX + 1;
TCORSIZE: 0 ; CORESIZE (:= FIRST NOT TO USE IN
; LOADER);
TFFIRST: 0 ; SYSTEM-CORESIZE := CORESIZE-4;
; NO KNOWN REASON TO DAY;
XRMFLAG: 0 ; HIGH MEM ON - FLAG
MTAB: SEGMSIZE*13+258 ; START OF MODULE-TABLE USED BY MUI
DISPL: SEGMSIZE*13 ; START OF LOAD AREA
MSIZE: WMOV4-WMOVE ;
MODE: 0 ; DISC MODE: READ INIT.
TTAB: SEGMSIZE*12 ; START OF TITLE TABLE
PTTAB: SEGMSIZE*12 ;
«ff»
; ERROR TEXTS ;
PZ100: .+1*2 ;
.TXT .<13><10>SYSTEM: . ;
PZ101: .+1*2 ;
.TXT .***. ;
PZ102: .+1*2 ;
.TXT .<13><10>. ;
PZ103: .+1 ;
.TXT .BASIS.
PZ104: .+1 ;
.TXT .END<0><0>. ;
P200: JSR@ PZ250 ;
.TXT .NOT FOUND,FILE: . ;
«ff»
P210: JSR@ PZ260 ;
.TXT .HARD ERROR ON DISC,STATE: .
P215: LDA 0 CORSIZE ;
JSR@ PZ260 ;
.TXT .SIZE ERROR . ;
P220: JSR@ PZ250 ;
.TXT .ILLEGAL BLOCK TYPE,FILE: .
«ff»
P230: JSR@ PZ250 ;
.TXT .CHECKSUM ERROR,FILE: . ;
P240: JSR@ PZ250 ;
.TXT .END MEDIUM,FILE: . ;
P235: JSR@ PZ250 ;
.TXT .ILLEGAL FILE TYPE,FILE: .;
«ff»
.IFE TYPE
D7000: 27 ; DEV RC7000 DISC
D3600: 59 ; DEV RC3600 DISC
DCODE: 0 ;
SDEV: SKPBN 27 ; IF BUSY(27) THEN
JMP T3600 ; BEGIN
LDA 0 D7000 ;
STA 0 DCODE ; DEVICECODE:= 27;
SKPBZ 27 ;
JMP .-1 ; WAIT FOR BUSY( 27 );
JMP GOON ; GOTO SET DEVICE;
; END
T3600: SKPBN 59 ; IF -, BUSY(59) THEN HALT;
HALT ;
LDA 0 D3600 ;
STA 0 DCODE ; DEVICECODE:= 59;
SKPBZ 59 ; WAIT FOR BUSY( 59 );
JMP .-1 ;
JMP GOON ;
.LOC 255
JMP SDEV ; GOTO GET DEVICE CODE
FINST: .+1 ;
D2 ; TABLE OF DEVICE INST DIABLO
D3 ;
D4 ;
D5 ;
D6 ;
P054 ;
P051 ;
D9 ;
D10 ;
AUTO ;
D12 ;
P399 ;
D13 ;
D14 ;
D15 ;
D16 ;
TINST: .+0 ; TOP OF DEVICE INST TABLE
GOON: LDA 3 TINST ;
L1: LDA 2 FINST ; TOP:= TOP TABLE;
L2: ISZ@ +0,2 ; REPEAT
INC 2,2 ; ADDR:= FIRST OF TABLE;
SUB# 2,3 SZR ; REPEAT
JMP L2 ; INC(WORD(ADDR)); ADDR:= ADDR+1;
DSZ DCODE ; UNTIL ADDR=TOP;
JMP L1 ; UNTIL DECR(DEVICECODE)=0;
LDA 0 DEVFL ;
D2: DOA 0 DEV ; CLEAR(DONEFLAGS);
.ENDC
«ff»
.IFE TYPE-1
.LOC 254
SKPDN DEV ; WAIT FOR DONE
JMP .-1 ;
LDA 0 0 ; ! STATUS AFTHER ROM-LOAD IS SAVED IN 0 !
LDA 1 B234 ;
ANDZR 1,0 ; HEADINDEX:= STATUS(2:4) SHIFT -11;
MOVZR 0,0 ;
MOVZR 0,0 ;
MOVS 0,0 ;
JSR P079 ; TABLE:
5 ; 0 5 HEADS
19 ; 1 19 -
5 ; 2 5 -
19 ; 3 19 -
2 ; 4 2 -
4 ; 5 4 -
0 ; 6 - -
0 ; 7 - -
P079: ADD 0,3 ;
LDA 0 +0,3 ;
STA 0 HEADS ; HEADS:= TABLE(HEADINDEX);
.ENDC
.IFE TYPE-2
READR: SUB 0,0 ; READ REST:
SUB 2,2 ; ADDRESS:= SECTOR:= 0;
LDA 1 C256 ; ADDRSTEP:= 256;
LDA 3 C7 ; MAXSEGM:= 7;
FLOO: INC 2,2 ; REPEAT
ADD 1,0 ; ADDRESS:= ADDRESS+ADDRSTEP;
; SECTOR:= SECTOR + 1;
DOB 0 DEV ; DOB(ADDRESS,FIXHEAD);
DOAS 2 DEV ; DOAS(SECTOR,FIXHEAD);
SKPBZ DEV ; WAIT FOR BUSY;
JMP .-1 ;
SUB# 3,2 SZR ; UNTIL SECTOR= MAXSEGM;
JMP FLOO ;
JMP GETC ; GOTO GETCORESIZ
C7: 7 ;
.LOC 255 ;
JMP READR ;
.ENDC
«ff»
.IFE TYPE-3
;DEFINATION OF UNIT-DESCR:
; CHANNEL PROGRAM:
FCMD0= 0 ; COMMAND
FCMD1= FCMD0+1 ; NO OF SECTORS SHIFT 8 + CYLINDER
FCMD2= FCMD1+1 ; BEG.SECTOR SHIFT 8 + SLICESIZE(:=2)
FCMD3= FCMD2+1 ; BYTECOUNT
FCMD4= FCMD3+1 ; WORDADDRESS,DMA
FCMD5= FCMD4+1 ; STATUS
; OPTIONAL USER ENTRIES:
FCSIZ= FCMD5+1 ; NO OF SECTORS PR CYLINDER
FTSIZ= FCSIZ+1 ; NO OF SECTORS PR TRACK
FUSIZ= FTSIZ+1 ; SIZE OF UNIT DESCR.
; STORAGE ALLOCATION
FCBAS: .+1 ; CONTROLLER ADDRESS:
FLB00 ; UNIT 0 DESCR ADDR;
0 ; UNIT 1 DESCR ADDR;
0 ; UNIT 2 DESCR ADDR;
0 ; UNIT 3 DESCR ADDR;
FLB00: ; DESCRIPTOR UNIT ZERO;
.BLK FUSIZ ;
FLBAS: FLB00 ; ADDRESS OF DESCRIPTOR( 0 );
; COMMAND DESCRIPTION:
READ = 0 ; READ ONE BLOCK,SKIP DELETED SECTORS;
WRITE = 1 ; WRITE ONE BLOCK;
; COMMAND TABLE:
CMDTBL: .+1 ; REFERENCE TO COMMAND TABLE:
12465 ; READ SKIP
15537 ; WRITE
; PROGRAM START,PROM WAITING POINT:
.LOC 254
SKPDN DEV ; WAIT FOR DONE:
JMP .-1 ;
SUB 0,0 ; HOLE BOOTSTRAP-PROGRAM IN CORE;
DOA 0 DEV ; CLEAR DEVICE UNIT ZERO;
LDA 2 FLBAS ;
LDA 0 C8 ; DEFINE ACT DISCETTE:
STA 0 FTSIZ,2 ;
MOV 0,0 ;
STA 0 FCSIZ,2 ;
LDA 0 FCBAS ; TRANSFER CH.PROG.ADDR.TO CONTROLLER;
DOB 0 DEV ;
.ENDC
«ff»
; , KDH,80.09.23,DB003
GETC: SUBZL 1,1 ; *** LOADER START ***
DOA 1 2 ;
DIA 0 2 ; GET CPU-TYPE:
MOV# 0,0 SNR ;
JMP LMEM0 ; 0,1,2,3,4: NOVA/3603,3703,3803,
SUBZL 2,2 ; 3703E.3603E;
SUB# 0,2 SNR ;
JMP LMEM0 ; IF CPU-TYPE 0/1 THEN START ADD (32K-1)-1;
HMEM0: DICP 0 1 ;
ADC 2,2 ; IF CPU-TYPE 2/3/4 THEN
SKPDN 1 ; BEGIN
LMEM0:ADCZR 2,2 ; SET EXT MEM ON,* NO 2.INDIRECT
SUBZL 1,1 ; START ADD := (64K-1)-1;
SUB 1,2 ; END;
LDA 1 CORSIZE ;
MOV 1,1 SKP ; ADDR:= ADDR+2048;
P080: SUB 1,2 ; NEXT ADDR:
LDA 0 +0,2 ; ADDR:= ADDR-2048;
STA 2 +0,2 ; SAVE(WORD);
LDA 3 +0,2 ; WORD:= AC2;
STA 0 +0,2 ; RESTORE(WORD)
SUB 2,3 SZR ; AC3:= WORD
JMP P080 ; IF AC3<>AC2 THEN GOTO NEXT ADDR;
INC 2,2 ; CORSIZE := ADDR+2;
INC 2,2 ; CORSIZE := FIRST NOT TO USE;
STA 2 TCORSIZE ; END NEXT ADDR;
STA 2 CORSIZE ;
LDA 1 B1B13 ;
SUB 1,2 ;
STA 2 TFFIRST ; SYSTEMSIZE := CORESIZE-4;
LDA 1 B1B0 ;
SUBZ# 2,1 SZC ;
JMP P081 ;
STA 1 XRMFLAG ; IF SYSTEMSIZE > 32K THEN
STA 1 CORSIZE ; SET HIGH MEM ON - FLAG TRUE (<>0);
STA@ 2 WSXSTART ;
STA@ 2 WSXMAX ; DEF XREL MAX,START := SYSTEMSIZE;
; NOTICE: NREL MAX,START :=256;
P081: LDA 1 MSIZE ;
LDA 2 CORSIZE ;
SUB 1,2 ; NRELCORSIZE:= AC2-MOVESIZE;
STA 2 CORSIZE ;
«ff»
LDA 1 PZ100 ;
JSR@ PZ008 ; OUTTEXT(SYSTEM?);
JSR@ PZ004 ; INNAMETTY;
LDA 1 PZ102 ;
JSR@ PZ008 ; OUTTEXT(CR,NL);
LDA 1 C8 ;
LDA 0 PZ4 ; READSEGMENT(UNITDESCRIPTOR);
JSR@ PZ040 ;
LDA 3 PZ4 ; SLICESIZE('SYS') := WORD(0);
LDA 0 +0,3 ;
SUBZL 1,1 ;
MOVZR# 0,0 SNC ; IF SLICEZ REM 2 = 0
SUB 1,0 ; THEN DECR SLICEZ;
STA 0 PZ30 ;
LDA 1 C6 ; HASHBASE := SLICEZ;
LDA 0 PZ4 ;
JSR@ PZ040 ; READSEGMENT(SYS INDEX BLOCK);
LDA 2 PZ6 ;
JSR@ PZ010 ; GETFILE('COMMAND FILE');
JSR@ PZ060 ; INNAME(COMMANDFILE,NAME);
LDA 2 PZ1 ;
LDA 1 PZ103 ; IF NAME<>'BASIS' THEN ERROR(ILL);
JSR@ PZ090 ;
JMP .+2 ;
JMP P235 ;
P070: LDA 2 PZ6 ; REPEAT ! ** START MAIN LOOP ** !
JSR@ PZ060 ; INNAME('COMMAND FILE',NAME);
LDA 1 PZ104 ;
LDA 2 PZ1 ; IF NAME<> 'END' THEN
JSR@ PZ090 ; BEGIN
JMP@ .P71 ;
LDA 2 PZ7 ;
JSR@ PZ010 ; GETFILE('CURRENT LOAD');
SUB 0,0 ; PREPARE FOR LOAD:
STA 0 SZBOL ; SIZEBOOL := FALSE;
JMP S21
; LOCAL STEPPING STONES:
WP070: P070 ;
WSXSTART: SXSTART ;
WSXMAX: SXMAX ;
«ff»
; ***** RELOCATABLE LOADER ******
; ***** MAIN LOOP ******
S21: SUB 0,0 ; BLOCK:
STA 0 SCHECKSUM ; CHECKSUM:= 0;
; LEADER:
S210: JSR@ PZ015 ; READNEXTCHAR
MOV 1,1 SNR ; IF CHAR=0 THEN
JMP S210 ; GOTO LEADER;
JSR@ .S130 ; COMPLETE WORD(CHAR,WORD);
STA 1 SBL ; BLOCK:= WORD;
JSR@ .S13 ; GETWORD(WORD);
STA 1 SWORDCOUNT; WORDCOUNT:= WORD;
JSR@ .S13 ; GETWORD(WORD);
STA 1 SFLA0 ; 0.FLAGS:= WORD;
JSR@ .S13 ; GETWORD(WORD);
STA 1 SFLA1 ; 1.FLAGS:= WORD;
JSR@ .S13 ; GETWORD(WORD);
STA 1 SFLA2 ; 2.FLAGS:= WORD;
JSR@ .S13 ; GETWORD(WORD);
LDA 1 .SFLAGS ; COMMENT: CHECKSUM NOT SAVED;
STA 1 SFLAGS ; FLAGS ADDR:= REF.FLAGS;
LDA 1 SBL ;
JSR S211 ; INDEX:= TABLE;
7
9
2
6
SBL: 0
S27 ; TITLE BLOCK (SKIPPED);
S29 ; SIZE BLOCK
S22 ; DATA BLOCK
S26 ; START BLOCK
P220 ; ILLEGAL BLOCK
S211: LDA 0 +0,3 ; NEXT:
SUB# 1,0 SNR ; IF BLOCK=INDEX(0) THEN
JMP@ +5,3 ; GOTO INDEX(5);
INC 3,3 ; INDEX:= INDEX+1;
JMP S211 ; GOTO NEXT;
.S130: S130 ;
.S13: S13 ;
.S14: S14 ;
.P71: P71 ; NOT USED
«ff»
; ; KDH,80.09.23,DB003
S22: ; ***DATA:
STA 1 SZBOL ; SIZEBOOL := TRUE;
JSR@ .S13 ; GETWORD(WORD);
JSR@ .S14 ; ADJUST(WORD);
LDA 3 DISPL ; IF NREL THEN DEF LOADER DISPLACEMENT;
LDA 2 XRMFLAG ; IF HIGH MEM ON THEN
MOV# 2,2 SNR ; IF XREL MET THEN
JMP S22X ; SET LOADER DISPLACEMENT :=0;
MOVZL# 0,0 SZC ;
SUB 3,3 ; IF NREL/ABS THEN (ACO AND 1B0) = 0
S22X: ADD 1,3 ; ELSE (AC0 AND 1B0)=1;
STA 3 SCOREADDR ; COREADDR:= WORD + LOADER DISPLACEMENT;
LDA 2 SWORDCOUNT;
ADC 2,1 ; MAXLOAD:=WORD - WORDCOUNT-1;
ADC 2,3 ; MAXCORE:=COREADDRESS - WORDCOUNT-1;
MOVZL# 0,0 SZC ; IF NREL / ABS RETURN THEN
JMP S220 ; BEGIN
LDA 2 CORSIZE ; ! MAXCORE := FIRST FREE; !;
SUBZ# 3,2 SNC ; IF MAXCORE > CORESIZE
JMP P215 ; THEN GOTO SIZE ERROR;
LDA 2 SNMAX ; IF MAXLOAD > SNMAX
SUBZ# 1,2 SNC ; THEN SNMAX := MAXLOAD;
STA 1 SNMAX ; END;
JMP S225 ; IF XREL RETURN THEN
S220: LDA 2 SXMAX ; BEGIN
SUBZ# 1,2 SNC ; IF MAXLOAD > SXMAX
MOV 1,2 ; THEN SMAX := MAXLOAD;
STA 2 SXMAX ;
LDA 0 XRMFLAG ;
MOV# 0,0 SZR ;
JMP S221 ; IF -HMOFLAG THEN
LDA 1 SNSTART ; IF SXMAX > SNSTART
SUBZ# 2,1 SNC ; THEN GOTO SIZE ERROR;
JMP P215 ; END;
S221: LDA 2 TFFIRST ; IF MAXCORE>TFFIRST
SUBZ# 3,2 SNC ; THEN GOTO ERROR;
JMP P215 ;
JMP S225 ; GO TO TEST WORD COUNT;
S223: ; NEXT WORD:
JSR@ .S13 ; GETWORD(WORD);
JSR@ .S14 ; ADJUST(WORD);
STA@ 1 SCOREADDR ; 0.COREADDR:= WORD;
ISZ SCOREADDR ; INCR(COREADDR);
S225: LDA 2 PZ7 ; TEST WORD COUNT:
ISZ SWORDCOUNT; IF INCR(WORDCOUNT)<>0
JMP S223 ; THEN GOTO NEXT WORD;
ADC 1,1 ; WORD:= -1;
JMP S260 ; GOTO CHECK;
«ff»
.SFLA:SFLA0 ; REF.FLAGS
SFLA0:0 ; 0.FLAGS
SFLA1:0 ; 1.FLAGS
SFLA2:0 ; 2.FLAGS
SWORD:0 ; WORDCOUNT
SCHEC:0 ; CHECKSUM
SCORE:0 ; COREADDR
SZBOL:0 ; SIZE-BOOLEAN:
; FALSE=0: SIZEBLOCK ALLOWED TO COME;
; TRUE<>0: SIZEBLOCK NOT ALLOWED;
; KDH.80.09.23,DB003
S26: ; ***START:
JSR@ .S13 ; GETWORD(WORD);
JSR@ .S14 ; ADJUST(WORD);
S260: LDA 0 SCHECKSUM ; CHECK:
MOV 0,0 SZR ; IF CHECKSUM<>0 THEN
JMP P230 ; GOTO CHECKSUM;
COM# 1,1 SNR ; IF WORD=-1 THEN GOTO BLOCK;
JMP S21 ; END CHECH;
LDA 0 XRMFLAG ; IF HMO FLAG FALSE (0) THEN
MOV# 0,0 SZR ; BEGIN
JMP S261 ;
LDA 0 SNMAX ;
LDA 2 SXMAX ; UPDATE:
SUBZ# 0,2 SZC ;
MOV 2,0 ; SNSTART := SXSTART :=
STA 0 SNSTART ; MAX ( SNMAX,SXMAX );
STA 0 SXSTART ; END
JMP S265 ; ELSE
S261: LDA 0 SNMAX ; BEGIN
STA 0 SNSTART ; SNSTART := SNMAX;
LDA 0 SXSTART ; UPDATE SYSTEMSIZE;
STA 0 TFFIRST ; (USED IN NEXT XREL-BL TO UPDATE SX)
; END;
S265: MOVZL# 1,1 SNR ; IF PROCESS <> 1B0 OR 0 THEN
JMP@ WP070 ; BEGIN
STA@ 1 MTAB ; O.TABLE := START ADDRESS;
ISZ MTAB ; INC(TABLE);
JMP@ WP070 ; END;
SFLAG: 0 ; ADDRESS FOR ACTUAL FLAG WORD USED
SNSTART: 256 ; START LOAD ADD NREL (FIRST FREE)
SNMAX: 256 ; MAX LOAD ADD NREL (FIRST FREE)
SXSTART: 256 ; START LOAD ADD FOR XREL (FIRST FREE)
SXMAX: 256 ; MAX LOADC ADD FOR XRFEL (FIRST FREE)
«ff»
; ; KDH,80.09,23,DB003
S27: JSR@ .S13 ; ***TITLE:
STA@ 1 PTTAB ; O.CURTITLE := WORD;
ISZ PTTAB ; INC(CUR ADDR POINTER);
JSR@ .S13 ;
STA@ 1 PTTAB ; O,CURTITLE := WORD;
ISZ PTTAB ; INC(CUR ADDR POINTER);
JSR@ .S13 ;
ADC 1,1 ; WORD := -1;
JMP S260 ; END;
S29: ;
LDA 1 C3 ; ***SIZE:
LDA 0 SZBOL ; IF SIZEBLOCK ALREADY MET
MOV# 0,0 SZR ; THEN GO TO ILLEGAL;
JMP P220 ; SIZEBOOL := TRUE;
STA 1 SZBOL ;
LDA 0 SWORDCOUNT; IF WORDCOUNT <> -3
ADD# 0,1 SZR ; THEN GOTO ILLEGAL;
JMP P220 ;
JSR@ .S13 ; ZREL SIZE SKIPPED;
JSR@ .S13 ; NREL SIZE SKIPPED;
JSR@ .S13 ; XREL SIZE:
INC# 1,1 SNR ; IF SIZE = -1
JMP P220 ; THEN GOTO ILLEGAL
LDA 0 XRMFLAG ;
MOV# 0,0 SZR ; IF HMO FLAG FALSE (0 _)
JMP S291 ;
LDA 0 SNSTART ; THEN
ADD 1,0 ; SNSTART := SNSTART + XREL-SIZE;
STA 0 SNSTART ;
JMP S295 ;
S291: LDA 0 SXSTART ; ELSE
SUB 1,0 ;
STA 0 SXSTART ; SXSTART := SXSTART - XREL-SIZE(BL);
STA 0 SXMAX ; END;
S295: ADC 1,1 ; WORD := -1;
JMP S260 ; GOTO CHECK;
«ff»
;*** RELOCATABLE LOADER ***
;*** END OF MAIN LOOP ***
P71: ADC 1,1 ; ** FINISHED STAND ALONE **
STA@ 1 PTTAB ; 0.CURTITLE := -1;
STA@ 1 MTAB ; 0.TABLE:= -1;
SUBZL 0,0 ;
STA 0 MODE ; DISCMODE := WRITE;
LDA 0 TTAB ;
LDA 1 C11 ; SEGMENT NO := 11;
JSR@ PZ040 ; WRITE(LAST TITLE);
LDA 1 SNSTART ;
LDA 3 DISPL ;
ADD 3,1 ; TO ADDR:= TOP(LOAD AREA);
LDA 2 .WMOV ; FROM ADDR:= START( MOVE );
LDA 0 MSIZE ; COUNT:= SIZE( MOVE );
STA 1 WORK ; MOVE( TO,FROM,COUNT );
JSR WMOVE ;
LDA 0 XRMFLAG ;
MOV# 0,0 SNR ;
JMP P75 ;
LDA 0 TFFIRST ; IF HMO FLAG TRUE (<>0) THEN
STA 0 TCORSIZE ; BEGIN
LDA 1 B1B13 ; SET SYSTEMSIZE := CORESIZE-4;
SUB 1,0 ; END;
STA 0 TFFIRST ;
P75: LDA 3 DISPL ; UPDATE CORESIZE/SYSTEMSIZE:
LDA 2 TCORSIZE ;
STA 2 SCORSIZE,3 ; MOM-VAR :=CORESIZE;
LDA 2 TFFIRST ; MON-VAR := SYSTEMSIZE
STA 2 SFFIRST,3 ;
LDA 2 DISPL ; FROM ADDR:= START(LOAD AREA);
SUB 1,1 ; TO ADDR:= 0;
LDA 0 SNSTART ; COUNT:= SNSTART;
LDA 3 C255 ; LINK:= ADDR 8'377;
JMP@ WORK ; GOTO MOVE(TO,FROM,COUNT);
; ******** END OF PROGRAM ********
«ff»
;PROCEDURE MOVE(TO,FROM,COUNT);
; CALL: RETURN:
;AC0: COUNT DEST.
;AC1: TO ADDR DEST.
;AC2: FROM ADDR DEST.
;AC3: LINK DEST.
;
WMOVE:STA 3 WMOV2 ;
STA 0 WMOV3 ; MOVE:_:
MOV 1,3 ;
WMOV1:LDA 0 +0,2 ; REPEAT
STA 0 +0,3 ; WORD(TO ADDR):=WORD(FROM ADDR);
INC 2,2 ; INCR(TOADDR9; INCR(FROM ADDR);
INC 3,3 ; UNTIL DECR(COUNT)=0;
DSZ WMOV3 ;
JMP WMOV1 ; RETURN;
JMP@ WMOV2 ;
WMOV2: 0 ;
WMOV3: 0 ;
WMOV4: ;
.WMOV: WMOVE ;
«ff»
; PROCEDURE GETWORD(WORD);
; PROCEDURE COMPLETE WORD(CHAR,WORD);
; CALL: RETURN:
; AC0 DESTROYED
; AC1 CHAR WORD
; AC2 UNDE UNDE
; AC3 LINK DESTROYED
S130: STA 3 WMOV2 ; COMPLETE WORD:
JMP S131 ; CHAR IN AC1
S13: STA 3 WMOV2 ; GET WORD:
JSR@ PZ015 ; READNEXTCHAR
S131: ; COMPLETE WORD:
MOVS 1,0 ; WORD:= CHAR;
STA 0 S132 ;
JSR@ PZ015 ; READNEXTCHAR
LDA 0 S132 ;
ADDS 0,1 ; WORD:= CHAR SHIFT 8 + WORD;
LDA 0 SCHECKSUM ;
ADD 1,0 ; CHECKSUM:= CHECKSUM+WORD;
STA 0 SCHECKSUM ;
JMP@ WMOV2 ; RETURN;
S132: 0 ; LOCAL SAVE;
; PROCEDURE ADJUST(WORD);
; GETS THE NEXT THREE FLAG BITS FROM THE FLAGS WORDS. UPDATES
; FLAGS ADDR IF THE WORD WAS EMPTIED.
S14: LDA 0 B1B2 ; GET FLAGS:
LDA@ 2 SFLAGS ; WORD:= 0.FLAGS ADDR;
S140: MOVZL 2,2 ; FLAGS:= WO5D(0:2);
MOVL 0,0 SNC ; WORD:= WORD SHIFT 3;
JMP S140 ;
STA@ 2 SFLAGS ; 0.FLAGS ADDR:= WORD;
MOV 2,2 SNR ; IF WORD=0 THEN
ISZ SFLAGS ; INCR(FLAGS ADDR);
; ADJUST THE WORD ACCORDING TO THE FLAG BITS.
; CALL: RETURN:
; AC0: FLAGS IDENT
; AC1: WORD WORD(ADJUSTED)
; AC2: UNDE DESTR
; AC3: LINK DESTR
S150: ; ADJUST:
MOVZR 0,0 SNR ; IF FLAGS(13:14) = 0 THEN
JMP +0,3 ; RETURN(ABSOLUTE):IDENT=0;
LDA 2 C2 ;
AND 0,2 SZR ; IF FLAGS(13) = 1 THEN
JMP S151 ; GOTO XREL;
LDA 2 SNSTART ; NREL: BASE :- NSTART;
MOV 0,0 SZC ; IF FLAGS(15:15) = 1 THEN
ADD 2,2 ; BASE :=BASE*2;
ADD 2,1 ; WORD := BASE + WORD;
JMP +0,3 ; RETURN(NREL);
S151: LDA 2 SXSTART ; XREL: BASE := XSTART;
MOV 0,0 SZC ; IF FLAGS(15) = 0 OR
MOVR 0,0 SNC ; IF FLAGS(14) = 0
JMP P220 ; THEN GOTO ILLEGAL;
ADD 2,1 ; WORD := BASE + WORD;
JMP +0,3 ; RETURN(XREL):IDENT AND 1B0 = 1;
«ff»
; PROCEDURE GETBYTE(ADDR,BYTE);
; CALL: RETURN:
; AC0 BYTE
; AC1 ADDR ADDR
; AC2 UNCH
; AC3 LINK DESTROYED
A40: STA 2 A42 ;
MOVZR 1,2 ; GETBYTE:
LDA 0 +0,2 ; VALUE:= 0.(ADDR//2);
MOV 0,0 SNC ; IF ADDR(15:15)=0 THEN
MOVS 0,0 ; BYTE:= VALUE(0:7)
LDA 2 C255 ; ELSE
AND 2,0 ; BYTE:= VALUE(8:15);
A400: LDA 2 A42 ;
JMP +0,3 ; RETURN;
; PROCEDURE PUTBYTE(ADDR,BYTE);
; BYTE MUST BE IN THE RANGE 0 TO 255.
; CALL: RETURN:
; AC0 BYTE BYTE
; AC1 ADDR ADDR
; AC2 UNCH
; AC3 LINK DESTROYED
A41: STA 2 A42 ;
MOVZR 1,2 ; PUTBYTE:
LDA 1 +0,2 ; VALUE:= 0.(ADDR//2);
STA 3 +0,2 ; SAVE(LINK);
LDA 3 CM256 ;
MOV 3,3 SNC ; IF ADDR(15:15)=0 THEN
MOVS 1,1 ; VALUE(0:7):= BYTE
AND 3,1 ; ELSE
ADD 0,1 SNC ; VALUE(8:15):= BYTE;
MOVS 1,1 ;
LDA 3 +0,2 ; RESTORE(LINK);
STA 1 +0,2 ; 0.(ADDR//2):= VALUE;
MOVL 2,1 ; COMMENT: CARRY CONTAINS ADDR(15:15);
JMP A400 ; RETURN;
A42: 0 ;
«ff»
; PROCEDURE DIVIDE(DIVIDEND,DIVISOR,QUOTIENT,REMAINDER);
; CALL: RETURN:
; AC0 DIVIDEND QUOTIENT
; AC1 DIVISOR DIVISOR
; AC2 UNCH
; AC3 LINK REMAINDER
A43: STA 2 A42 ; DIVIDE:
STA 3 LINK3 ; SAVE(LINK);
SUB 3,3 ; HIGH PART:= 0;
LDA 2 CM16 ; STEPS:= 16;
MOVZL 0,0 ;
A430: MOVL 3,3 ; COMMENT:
SUB# 1,3 SZC ; DIVISION
SUB 1,3 ; AS SHOWN IN
MOVL 0,0 ; HOW TO USE
INC 2,2 SZR ; THE NOVA
JMP A430 ; COMPUTERS;
A431: LDA 2 A42 ;
JMP@ LINK3 ; RETURN;
;PROCEDURE INTTY(CHAR)
; CALL: RETURN
;AC0: - CHAR
;AC1: - DEST
;AC2: - UNCH.
;AC3: LINK DEST.
;
P000: SKPDN TTI ; INTTY:
JMP .-1 ; IF DONE(TTI)<>0 THEN GOTO INTTY;
DIAS 0 TTI ; DIAS(TTI,CHAR);
LDA 1 C127 ;
AND 1,0 ; CHAR:= CHAR EXTRACT 7;
; OUTTTY(CHAR); RETURN;
;PROCEDURE OUTTTY(CHAR);
; CALL: RETURN
;AC0: CHAR CHAR
;AC1: - DEST.
;AC2: - UNCH.
;AC3: LINK DEST.
;
P001: MOVS 0,1 ; OUTTY:
ADD 1,1 SZR ; CHAR:=CHAR +PARITY(CHAR);
JMP .-1 ;
MOVR 1,1 ;
MOVS 1,1 ;
ADD 0,1 ;
SKPBZ TTO ; REPEAT ! ! UNTIL BUSY(TTO)=0;
JMP .-1 ;
DOAS 1 TTO ; DOAS(TTO,CHAR);
JMP +0,3 ; RETURN;
«ff»
;PROCEDURE INTEST(CHAR)
; CALL: RETURN:
;AC0: - CHAR
;AC1: - DEST.
;AC2: - DEST.
;AC3: LINK DEST.
;
;RETURN +0: CHAR<32
;RETURN +1: CHAR=32
;RETURN +2: CHAR=127
;RETURN +3: CHAR>32
;
P002: MOV 3,2 ;
JSR P000 ; INTEST: INTTY(CHAR);
LDA 3 C32 ;
ADCZ# 0,3 SZC ; IF CHAR<32 THEN RETURN+0;
JMP +0,2 ;
SUB 0,3 SNR ; IF CHAR=32 THEN RETURN+1
JMP +1,2 ;
LDA 3 C127 ;
SUB 0,3 SNR ; IF CHAR=127 THEN RETURN+2 ELSE
JMP +2,2 ; RETURN+3;
JMP +3,2 ;
;PROCEDURE SETNAMEZERO
; CALL RETURN
;AC0: - UNCH.
;AC1: - 0
;AC2: - UNCH.
;AC3: LINK LINK
;
P003: SUB 1,1 ;SETNAME ZERO:
STA 1 PZ2+1 ;
STA 1 PZ2+2 ;
STA 1 PZ2+3 ; NAME:= '<0>...'
JMP +0,3 ; RETURN
«ff»
;PROCEDURE INNAMETTY
; CALL: RETURN
;AC0: - DEST.
;AC1: - DEST.
;AC2: - DEST
;AC3: LINK DEST.
;
P004: STA 3 LINK ; INNAMETTY:
JSR P002 ; REPEAT
JMP@ LINK ; INTEST(CHAR);
JMP .-2 ; IF CHAR<32 THEN RETURN;
JMP .-3 ; UNTIL CHAR>32 AND CHAR<>127;
JSR P003 ; SETNAME ZERO;
STA 1 WCOUNT ; COUNT:=0;
LDA 1 PZ2 ;
STA 1 WORK ; WORK:= ADDR NAME;
P005: LDA 1 WORK ; NEXT CHAR:
LDA 3 WCOUNT ;
LDA 2 C5 ;
ADCZ# 3,2 SZC ; IF COUNT<5 THEN
JSR A41 ; PUTBYTE(CHAR,WORK);
; UPDAT:
MOV 0,0 SNR ; IF CHAR<>0 THEN
JMP P006 ; BEGIN
P021: ISZ WORK ; WORK:= WORK+1; COUNT:=COUNT+1;
ISZ WCOUNT ; END;
P006: JSR P002 ; INTEST(CHAR)
JMP@ LINK ; IF CHAR<32 THEN RETURN;
JMP P021 ; IF CHAR=32 THEN GOTO UPDAT;
JMP P007 ; IF CHAR=127 THEN GOTO ERASE;
JMP P005 ; GOTO NEXT CHAR;
;
P007: LDA 0 C95 ; ERASE:
JSR P001 ; OUTTTY(BACKSPACE);
DSZ WORK ; WORK:=WORK-1;
SUB 0,0 ;
DSZ WCOUNT ; COUNT:= COUNT-1;
JMP P005 ; IF COUNT=0 THEN GOTO INNAMETTY
JMP P004+1 ; ELSE
; BEGIN
; CHAR:=0; GOTO NEXT CHAR;
; END;
«ff»
;PROCEDURE GETFILE
; CALL: RETURN:
;AC0: - DEST
;AC1: - DEST
;AC2: FILE FILE
;AC3: LINK DEST.
;
P010: STA 3 LINK ; GETFILE:
STA 2 WORK ;
LDA 1 PZ2+1 ; NAME.VALUE :=
LDA 0 PZ2+2 ; NAME(0:1) +
ADD 1,0 ; NAME(2:3) +
LDA 1 PZ2+3 ; NAME(4:5);
ADD 1,0 ;
LDA 1 PZ30 ; HASHBASE := UNIT-DESCR-BLOCK .0;
JSR A43 ; HASH VALUE:= VALUE REM HASHBASE;
STA 3 PZ3 ;
; POSITION(HASH):
P012: LDA 2 PZ5 ; REPEAT
LDA@ 0 INDEX,2 ; ! FILE := ' SYS '; !
STA 0 REMSLICE,2 ; REMSLICE:=0.INDEX-BLOCK ;
LDA 3 INDEX,2 ;
INC 3,3 ;
STA 3 CURINDEX,2 ; CURINDEX:=INDEXBLOCK+1 ;
SUB 0,0 ; CURPOS := 0;
P013: LDA 3 CURINDEX,2 ; WHILE CURPOS <= POS DO
LDA 1 +0,3 ; BEGIN
ADD 1,0 ;
LDA 2 PZ3 ; SLICELENGTH:= +0.CURINDEX;
SUBZ # 0,2 SNC ; CURPOS:=CURPOS+SLICELENGTH;
JMP P014 ;
LDA 2 PZ5 ;
DSZ REMSLICE,2 ;
JMP .+2 ; REMSLICE:=REMSLICE-1;
JMP P200 ; IF REMSLICE = 0 THEN NOT FOUND;
ISZ CURINDEX,2 ;
ISZ CURINDEX,2 ; CURINDEX := CURINDEX + 2;
JMP P013 ; END;
«ff»
P014: SUB 2,0 ;
LDA 2 +1,3 ; SEGMENTADDR := +1.CURINDEX +
ADD 2,1 ; SLICELENGTH -
SUB 0,1 ; (CURPOS - POS);
LDA 2 PZ5 ;
LDA 0 CBUF,2 ; COREADDR:= CORE BLOCK ;
JSR P040 ; READSEGMENT(SEGM ADDR,COREADDR) ;
LDA 3 NOENTRY ; COUNT:= NO OF ENTRYS;
STA 3 CURADDR,2 ;
LDA 2 CBUF,2 ; ENTRY:= CORE BLOCK ;
P0141: LDA 1 PZ1 ;
JSR@ PZ090 ;
JMP P016 ; IF ENTRY.NAME= NAME THEN CHECK;
LDA 3 PZ5 ; ENTRY:=ENTRY+ENTRYSIZE ;
LDA 1 ESIZE ;
ADD 1,2 ; UNTIL DECR(COUNT)<>0 ;
DSZ CURADDR,3 ;
JMP P0141 ;
MOV 3,2 ;
LDA 1 PZ30 ;
LDA 0 PZ3 ;
ADD 1,0 ; POS := POS + HASHBASE;
STA 0 PZ3 ;
JMP P012 ; END REPEAT( POSITION(HASH) );
P016: MOV 2,3 ;
LDA 0 B1B13 ; CHECK:
LDA 1 CATT,3 ;
AND 1,0 SZR ; IF ENTRY-TYPE=ENTRY ONLY THEN
JMP P235 ; ERROR(ILL) ;
LDA 2 WORK ;
LDA 1 CLENGTH,3 ;
STA 1 RESTSEG,2 ; REMSEGM IN FILE:= FILELENGTH;
LDA 1 CSEGM,3 ;
LDA 0 INDEX,2 ;
JSR P040 ; READSEGMENT(INDEX BLOCK);
LDA 0 INDEX,2 ;
STA 0 CURINDEX,2 ;
DSZ CURINDEX,2 ; CURINDEX.FILE:= INDEX.FILE-1;
SUB 0,0 ;
STA 0 REMSEGM,2 ; REMSEGM.SLICE.FILE:=0;
STA 0 REMBYTES,2 ; REMBYTES.SLICE.FILE:=0;
JMP@ LINK ;
«ff»
;PROCEDURE INCHAR(FILE,CHAR);
; CALL: RETURN:
;AC0: - CHAR
;AC1: - CHAR
;AC2: FILE FILE
;AC3: LINK DEST.
;
P015: STA 3 LINK ; INCHAR:
LDA 3 REMBYTE,2 ; WITH FILE DO
MOV 3,3 SZR ; BEGIN
JMP P020 ; IF REMBYTES=0 THEN
LDA 3 REMSEGM,2 ; BEGIN
MOV 3,3 SZR ; IF REMSEG=0 THEN
JMP P019 ; BEGIN
LDA 3 RESTSEGM,2 ; IF RESTSEGM<>0 THEN
MOV 3,3 SNR ;
JMP P240 ; BEGIN
DSZ RESTSEGM,2 ; DECR(RESTSEGM);
JMP .+1 ;
ISZ CURINDEX,2 ;
ISZ CURINDEX,2 ; CURINDEX:= CURINDEX+2;
LDA 3 CURINDEX,2 ;
LDA 0 +0,3 ;
STA 0 REMSEGM,2 ; REMSEGM:= 0.CURINDEX;
LDA 1 +1,3 ; CURSLICE:= 1.CURINDEX;
STA 1 CURSLICE,2 ; END ELSE GOTO END MEDIUM;
P019: LDA 1 CURSLICE,2 ;
DSZ REMSEGM,2 ; DECR(REMSEG);
JMP .+1 ;
LDA 0 CBUF,2 ;
JSR P040 ; READSEGMENT(BUF ADDR,CUR SLICE);
ISZ CURSLICE,2 ; INCR(CURSLICE);
MOVZL 0,0 ; CURBYTE:= BUF*2;
STA 0 CURADDR,2 ;
LDA 0 C512 ;
STA 0 REMBYTE,2 ; REMBYTES:= 512;
P020: LDA 1 CURADDR,2 ; END;
JSR@ AZ40 ; GETBYTE(CHAR,CUR ADDR);
DSZ REMBYTE,2 ; DECR(REMBYTES);
JMP .+1 ; INCR(CURADDR);
ISZ CURADDR,2 ;
MOV 0,1 ; END; RETURN ;
JMP@ LINK ; END;
«ff»
;PROCEDURE OUTTEXT(TEXT ADDR);
; CALL: RETURN:
;AC0: - DEST.
;AC1: TEXT ADDR DEST.
;AC2: - DEST.
;AC3: LINK DEST.
;
P008: STA 3 LINK ; OUTTEXT:
STA 1 WORK ;
P009: LDA 1 WORK ; REPEAT
JSR@ AZ40 ; GETBYTE(CHAR,TEXT ADDR);
JSR@ PZ001 ; OUTTTY(CHAR);
ISZ WORK ; TEXT ADDR:= TEXT ADDR + 1;
MOV 0,0 SZR ; UNTIL CHAR=0;
JMP P009 ;
JMP@ LINK ; RETURN;
«ff»
.IFE TYPE
;PROCEDURE READSEGMENT(COREADDR,SEGMNO);
; CALL: RETURN:
;AC0: CORA ADDR UNCH.
;AC1: SEGM NO DEST.
;AC2: - UNCH.
;AC3: LINK DESTROYED
;
P040: STA 3 LINK1 ; READ SEGMENT:
STA 2 WSAVE ;
STA 1 SEGMNO ;
STA 0 COREADDR ;
MOV 1,0 ;
LDA 1 NOSEC ;
JSR@ AZ43 ; COMPUTE SECTOR SURFACE CYLINDER
STA 3 SECTOR ; AND DRIVE;
LDA 1 NOSUR ;
JSR@ AZ43 ;
STA 3 SURFACE ;
LDA 1 NOCYL ;
JSR@ AZ43 ;
STA 3 CYLINDER ;
STA 0 DRIVE ;
JSR SH6 ; COMMAND:= (((DRIVE SHIFT -6)+
LDA 1 SURFACE ; SURFACE) SHIFT -4 +
ADD 1,0 ;
JSR SH4 ;
LDA 1 SECTOR ; SECTOR) SHIFT -4 + 15;
ADD 1,0 ;
JSR SH4 ;
LDA 1 C15 ;
ADD 0,1 ;
D3: DOC 1 DEV ; DOC(DEVICE, COMMAND);! ** SELECT DRIVE !
JSR P054 ; CHECK READY(DEVICE);
SUBZR 0,0 ;
LDA 1 DRIVE ;
COM 1,1 ;
MOVR 0,0 ;
INC 1,1 SZR ;
JMP .-2 ; COMMAND:= BIT(DRIVE+1) + 512 + CYLINDER
LDA 1 C512 ;
ADD 1,0 ;
LDA 1 CYLINDER ;
ADD 0,1 ;
D4: DOAP 1 DEV ; DOAP(DEVICE,COMMAND) ! ** SEEK CYLINDER !
JSR P050 ; WAIT AND SENSE;
LDA 0 COREADDR ;
D5: DOB 0 DEV ; DOB(DEVICE,CORE ADDR) ! ** SET ADDR !
LDA 1 MODE ;
LDA 3 C128 ;
ADDS 3,1 ;
D6: DOAS 1 DEV ; DOAS(DEVICE,MODE);
JSR P051 ; WAIT READ AND SENSE;
LDA 0 COREADDR ;
LDA 2 WSAVE ;
JMP @ LINK1 ; RETURN;
«ff»
;PROCEDURE SHIFT(WORD);
;
;
SH6: ADDZL 0,0 ;SHIFT6: WORD:=WORD SHIFT 2;
SH4: ADDZL 0,0 ;SHIFT4: WORD:=WORD SHIFT 2;
SH2: ADDZL 0,0 ;SHIFT2: WORD:=WORD SHIFT 2;
JMP +0,3 ; RETURN;
;PROCEDURE CHECK READY(DEVICE)
;
P054: DIA 0 DEV ; CHECK READY:
LDA 2 B1B9 ; IF DIA(DEVICE) AND 1B9<>1 THEN
AND 0,2 SNR ; ERROR(HARD) ELSE
JMP P210 ;
JMP +0,3 ; RETURN;
;PROCEDURE WAIT READ AND SENSE
;
P051: SKPBZ DEV ; REPEAT ! !
JMP .-1 ; UNTIL BUSY(DEVICE)=0;
;
;PROCEDURE WAIT AND SENSE
;
P050: LDA 2 CM256 ; WAIT AND SENSE:
INC 2,2 SZR ; WAIT MIN 50 MYSEC.
JMP .-1 ;
LDA 2 C127 ;
D9: DIA 0 DEV ;
AND# 0,2 SNR ; REPEAT ! ! UNTIL DIA(DEVICE) AND STATE<>0;
JMP .-2 ;
MOVZR# 0,0 SZC ; IF DIA(DEVICE) EXTRACT 1 = 1 THEN
JMP P210 ; GOTO ERROR (HARD);
LDA 2 DEVFL ;
AND 1,2 ;
D10: DOA 2 DEV ; CLEAR DONE FLAG;
JMP +0,3 ;
.ENDC
«ff»
.IFE TYPE-1
;PROCEDURE READSEGMENT( CORE ADDR, SEGMENT NO);
;
; AC CALL RETURN
; 0 COREADD UNCH.
; 1 SEGMNO DEST.
; 2 - UNCH.
; 3 LINK DEST
;
P040: STA 3 LINK1 ; READ SEGMENT:
STA 0 CADDR ;
MOV 1,0 ; WORDADDRESS:= COREADDRESS;
LDA 1 C32 ;
JSR@ AZ43 ; SECTOR NO := SEGMNO MOD 32;
STA 3 H.S ; ZCYL:= SEGMNO//32;
LDA 1 HEADS ;
JSR@ AZ43 ; HEADNO:= ZCYL MOD NO OF HEADS;
LDA 1 H.S ; CYLINDER:= ZCYL// NO OF HEADS;
MOVS 3,3 ;
ADD 3,1 ; HEAD.SECTOR:= HEADNO SHIFT 8 + SECTOR;
STA 1 H.S ;
STA 0 CYL ;
LDA 1 MODE ;
LDA 3 WRITEC ;
MOV 1,1 SZR ; IF MODE = WRITE THEN CHANL COM:=
STA 3 FUNC ; WRITE;
LDA 0 PHEAD ; SET CHANNELPROGRAM HEAD ADDR;
DOB 0 DEV ;
SUB 0,0 ;
DOA 0 DEV ; CLEAR(DRIVE 0);
LDA 0 .S ;
DOA 0 DEV ; START( DRIVE 0 );
SKPDN DEV ;
JMP .-1 ; WAIT ( DONE );
LDA 0 STAT ;
LDA 3 WMASK ;
AND 3,0 SZR ; IF STATUS(0:1,6:15) <> 0 THEN
JMP P210 ; GOTO ERROR(HARD);
DOA 0 DEV ; CLEAR(DRIVE 0);
LDA 0 CADDR ;
JMP@ LINK1 ; RETURN;
WRITEC: 216B7+3 ; WRITE COMMAND;
«ff»
;CHANNEL PROGRAM
CYL: ;
SEEKA: 0 ; SEEKADDRESS: CYLINDER 0;
H.S: 0 ; HEAD,SECTOR = 0, SEGMNO;
CSTART: 216B7+2 ; SEEK:
WMASK: 255*256+255-1B2-7B5 ; WORK STATUS MASK;
SEEKA ; ADDR(SEEK)
FUNC: 216B7+1 ; READDATA:
512 ; BYTECOUNT;
CADDR: 0 ; WORDADDRESS= COREADDR
216B7+7 ; STOP.
PHEAD: .+1 ; ADDR( HEAD OF CHANNEL PROGRAM);
CSTART ; DRIVE 0 ENTRY ! ONLY ONE !
STATA: ; STATUSAREA
STAT: 0 ; STATUS
0 ; BYTE TRANSFERRED
0 ; CUR ADDR
STATA ; ADDR(STATUS AREA,DRIVE0);
STATA ;
STATA ; ! IN CASE OF ERROR STATUS IS DELIVERED
STATA ; IN SAME LOCATION !
.ENDC
.IFE TYPE-2
;PROCEDURE READ SEGMENT(CORE ADDR,SEGMNO);
;
; AC CALL RETURN
; 0 COREAD. UNCH.
; 1 SEGM. DEST.
; 2 - UNCH.
; 3 LINK DEST.
;
P040: STA 3 LINK1 ;
STA 0 WSAVE ;
DOB 0 DEV ; DOB(COREADDR, FIXED HEAD);
LDA 0 MODE ; IF MODE=0 THEN
MOV 0,0 SNR ; DOAS(SEGM , FIXEDHEAD)
DOAS 1 DEV ; ELSE
MOV 0,0 SZR ; DOAP(SEGM , FIXEDHEAD);
DOAP 1 DEV ;
SKPBZ DEV ; WAIT FOR BUSY(FIXED HEAD);
JMP .-1 ;
DIA 0 DEV ; IF DIA(FIXED HEAD) EXTRACT 1 = 1 THEN
MOVZR# 0,0 SZC ; GOTO ERROR(HARD);
JMP P210 ;
LDA 0 WSAVE ;
JMP@ LINK1 ; RETURN;
.ENDC
«ff»
.IFE TYPE-3
; PROCEDURE READ SEGMENT(COREADDR,SEGMNO,512BYTES);
; CALL: RETURN:
; AC0: COREADDR UNCH.
; AC1: SEGMNO DESTR.
; AC2: UNDE UNCH.
; AC3: LINK DESTR.
P040: ; READSEGMENT(FLEX.DISC,256 BYTES SECL):
STA 3 LINK1 ;
STA 2 WSAVE ; SAVE ACC.S;
STA 0 COREADDR ;
LDA 2 FLBAS ; UNIT-DESCR-BASIS ADDR;
STA 0 FCMD4,2 ;
MOVZL 1,0 ; RUN.SECTOR := CUR.SEGMNO * 2;
LDA 1 FCSIZ,2 ;
JSR@ AZ43 ; DIVIDE ( RUN.SECTOR,CYL.SIZE );
INC 3,3 ;
INC 0,0 ;
LDA 1 FTSIZ,2 ; PH.SECTORNO := REM + 1;
MOVS 1,1 ; CUR.CYLINDER := RESULT + OFFSET;
ADD 0,1 ;
STA 1 FCMD1,2 ; CMD1 := TRACKSIZE SHIFT 8 + CUR.CYL;
LDA 0 FTSIZ,2 ;
MOV 3,1 ;
SUBZ# 1,0 SZC ; SIDEID := 1B8 IF DOUBLE ELSE ZERO;
JMP .+4 ;
SUB 0,1 ; IF DOUBLE THEN
LDA 0 C128 ; THEN PHSEC := PHSEC - TRACKSIZE;
ADD 0,1 ;
MOVS 1,1 ; AC1 := SIDEID+PHSEC SHIFT 8;
LDA 0 C2 ; AC0 := NO OF SECTORS IN BYTECOUNT;
ADD 1,0 ;
STA 0 FCMD2,2 ; CMD2 := SIDEID+PHSEC SHIFT 8+ NO OF SEC;
LDA 0 C512 ;
STA 0 FCMD3,2 ; CMD3 := BYTECOUNT;
LDA 1 MODE ;
LDA 3 CMDTBL ;
LDA 0 READ,3 ; COMMAND := READ,SKIP;
MOV 1,1 SZR ; IF MODE <> 0 THEN
LDA 0 WRITE,3 ; COMMAND := WRITE;
STA 0 FCMD0,2 ; CMD0 := COMMAND;
JSR P050 ; EXECUTE COMMAND;
LDA 0 COREADDR ;
LDA 2 WSAVE ;
JMP@ LINK1 ; RETURN;
«ff»
; PROCEDURE EXECUTE COMMAND AND TREAT STATUS;
; CALL: RETURN:
; AC0: UNDE DESTR
; AC1: UNDE DESTR
; AC2: BASE UNCH
; AC3: LINK DESTR
;
P050: ; PROCEDURE EXECUTE(FLEX DISC):
LDA 1 B1B4 ;
NEG 1,1 ; FIRST TIMER ;
LDA 0 B1B13 ;
DOA 0 DEV ; START CHANNEL PROGRAM;
LDA 0 C512 ;
NEG 0,0 ; SECOND TIMER ;
P051: SKPDZ DEV ;
JMP P054 ; REPEAT
INC 1,1 SZR ; IF DONE=TRUE THEN FINISHED := TRUE;
JMP .-3 ; IF INC(FIRST TIMER) = 0 THEN
INC 0,0 SZR ; BEGIN
JMP .+3 ; IF INC(SECOND TIMER) = 0
LDA 0 C2 ; THEN TIMEOUT
JMP P210 ; ELSE
LDA 1 B1B4 ; REINITIALIZE FIRST TIMER
NEG 1,1 ; END;
JMP P051 ; UNTIL FINISHED = TRUE;
P054: SUB 0,0 ;
DOA 0 DEV ; CLEAR DEVICE(FLEX DISC);
LDA 0 FCMD5,2 ;
MOV# 0,0 SNR ; PROCEDURE TREAT STATUS:
JMP +0,3 ;
LDA 1 B1B2 ; IF STATUS = 0 THEN RETURN;
SUB# 1,0 SZR ; ELSE
JMP P210 ; BEGIN
LDA 0 FCMD2,2 ; IF STATUS - 1B2 <> 0
MOVZL# 0,0 SZC ; THEN GOTO HARD ERROR;
JMP P056 ;
LDA 0 FCSIZ,2 ; IF SIDEID=1 THEN GOTO INC.CYL;
LDA 1 FTSIZ,2 ;
SUB# 1,0 SZR ; IF DOUBLE SIDED DISCETTE
JMP P058 ; THEN GOTO SECOND SIZE;
P056: ISZ FCMD1,2 ; **INC.CYL:
SUB 0,0 ;
JMP .+2 ;
P058: LDA 0 B1B0 ; **SECOND SIZE:
LDA 1 C256 ; **UPDATE:
ADD 1,0 ;
LDA 2 FCMD2,2 ; CMD2 := SIDEID + PHSEC:=1 +
LDA 1 C255 ; CMD2(8:15);
AND 1,2 ;
ADD 2,0 ;
LDA 2 FLBAS ;
STA 0 FCMD2,2 ; CONTINUE CURRENT OPERATION;
JMP P050 ; END;
.ENDC
«ff»
;PROCEDURE INNAME(FILE)
; CALL: RETURN:
;AC0: - DEST.
;AC1: - DEST.
;AC2: FILE DEST.
;AC3: LINK DEST.
;
P060: STA 3 LINK2 ; INNAME:
P062: JSR@ PZ015 ;
LDA 3 C127 ;
AND 3,0 ; REPEAT INCHAR(FILE) UNTIL CHAR>32;
LDA 3 C32 ;
ADCZ# 3,0 SNC ;
JMP P062 ;
JSR@ PZ003 ; SETNAMEZERO;
LDA 3 C5 ;
STA 3 WCOUNT ;
LDA 1 PZ2 ; COUNT:= 5;
STA 1 WORK ;
P064: LDA 1 WORK ; WORK:= NAME ADDR;
JSR@ AZ41 ; REPEAT
P066: JSR@ PZ015 ; IF COUNT>0 THEN PUTBYTE(WORK,CHAR);
LDA 3 C127 ; INCHAR(FILE);
AND 3,0 ;
LDA 3 C32 ;
ADCZ# 3,0 SNC ;
JMP@ LINK2 ; COUNT:=COUNT+1;
ISZ WORK ; WORK:=WORK+1;
DSZ WCOUNT ;
JMP P064 ; UNTIL CHAT=<32;
ISZ WCOUNT ;
JMP P066 ; RETURN
«ff»
;PROCEDURE COMPARE NAMES
; CALL RETURN
;
;AC0: - DEST
;AC1: ADDR1 DEST
;AC2: ADDR2 UNCH
;AC3: LINK DEST
;
;RETURN+0: NAMES EQUAL
;RETURN+1: NAMES NOT EQUAL
P090: STA 3 LINK1 ; COMPARE NAMES:
ISZ LINK1 ;
MOV 1,3 ;
LDA 0 +0,2 ;
LDA 1 +0,3 ;
SUB 0,1 SZR ;
JMP@ LINK1 ;
LDA 0 +1,2 ;
LDA 1 +1,3 ; IF NAME.ADDR1=NAME.ADDR2 THEN
SUB 1,0 SZR ; RETURN+0 ELSE RETURN+1;
JMP@ LINK1 ;
LDA 0 +2,2 ;
LDA 1 +2,3 ;
LDA 3 CM256 ;
AND 3,1 ;
AND 3,0 ;
SUB 0,1 SNR ;
DSZ LINK1 ;
JMP@ LINK1 ;
«ff»
;
; ERROR ACTIONS
;
;
P250: MOVZL 3,3 ; FILE ERROR:
STA 3 WSAVE ; ADDR:= LINK*2;
LDA 1 PZ101 ;
JSR@ PZ008 ; OUTTEXT(***);
LDA 1 WSAVE ;
JSR@ PZ008 ; OUTTEXT(ERROR);
LDA 1 PZ2 ;
JSR@ PZ008 ;
JMP AUTO ; GOTO NEW AUTOLOAD;
P260: MOVZL 3,3 ; HARD ERROR:
STA 0 WSAVE ;
STA 3 WORK1 ;
LDA 1 PZ101 ;
JSR@ PZ008 ; OUTTEXT(***);
LDA 1 WORK1 ;
JSR@ PZ008 ; OUTTEXT(ERROR);
LDA 1 WSAVE ; TEST:= 1B0;
SUBZR 2,2 SKP ; REPEAT
P262: SUB 2,1 SKP ; CHAR:=47
P264: LDA 0 C47 ; REPEAT
INC 0,0 ; STATE:=STATE-TEST;
SUBZ# 2,1 SZC ; CHAR:=CHAR+1;
JMP P262 ; UNTIL STATE<TEST;
STA 1 WORK ;
JSR@ PZ001 ; OUTTTY(CHAR);
LDA 1 WORK ; TEST:=TEST SHIFT 3;
MOVZR 2,2 ;
MOVZR 2,2 ;
MOVZR 2,2 SZR ; UNTIL TEST=0;
JMP P264 ; GOTO NEW AUTOLOAD;
«ff»
.RDX 8
.IFE TYPE
AUTO: NIOC DEV ; AUTOLOAD:
SUB 0,0 ; CLEAR DEVICE;
D12: DOC 0 DEV ; SELECT DRIVE 0
JSR P400 ;
175000 ; EXECUTE(SEEK 0);
JSR P400 ;
175400 ; EXECUTE(RECAL);
JSR P400 ;
175000 ; EXECUTE(SEEK 0);
P399: DOB 0 DEV ; START DEVICE:
D13: DOAS 0 DEV ; ADDR:= 0 ;
LDA 1 C255 ;
STA@ 1 C255 ;
D14: SKPBN DEV ; IF DEVICE NOT BUSY THEN GOTO STARTDEVICE;
JMP P399 ;
JMP@ C255 ; GOTO WAIT FOR DISC IN 377;
P400: LDA 1 +0,3 ; EXECUTE:
D15: DOAP 1 DEV ; OP:= 0.LINK;
D16: DIA 1 DEV ;
MOVS 1,2 ;
AND 1,2 SNR ; DOAP(OP);
JMP .-3 ; WAIT UNTIL READY AND DONE=1;
JMP +1,3 ;
.ENDC
«ff»
.IFE TYPE-1
.RDX 10
;SIMULATE A NEW AUTOLOAD OF THE DISC
;
;
AUTO: NIOS DEV ; AUTOLOAD: CLEAR ALL DRIVES;
LDA 1 AHEAD ; SET(CHANNEL PROGRAM HEAD ADDR);
DOB 1 DEV ;
LDA 1 .DOA ;
STA 1 254 ; WORD(376:377) :=
LDA 1 .S ; DOA 1 DEV
LDA 2 .JMP ; JMP .-1
STA 2 255 ;
.JMP: JMP 254 ; START DRIVE 0 INFINITE UNTIL
.DOA: DOA 1 DEV ; OVER-WRITTEN OF THE NEW BOOT;
AHEAD: A00 ; ADDR( HEAD OF CHANNEL PROG);
;CHANNEL PROGRAM
;
A01: 216B7+3B12+2 ; INITIALIZE:
ASEEK: 0 ; WORK; CYLINDER 0
0 ; HEAD SHIFT 8 + SECTOR = 0,0
216B7+2 ; SEEK:
A00: A01 ; WORK; ADDR(CHANNEL PROG DRIVE 0);
ASEEK ; ADDR(SEEK PARAM);
216B7+1 ; READ DATA:
512*16 ; BYTECOUNT = 16 SECTORS
0 ; A00+4; WORDADDR=0;
; ! AFTER INPUT, THE DISC CONTROLLER
; WILL DELIVER THE STATUS INFORMATION
; INTO AN AREA OF 3 WORDS WHICH ADDRESS
; IS IN WORD(A00+4): W(0:2) !
216B7+7 ; STOP.
.ENDC
«ff»
.IFE TYPE-2
AUTO: SUB 0,0 ; FIXED HEAD AUTOLOAD:
DOB 0 DEV ;
DOAS 0 DEV ; READ SEGM 0 IN PAGE ZERO;
SKPBN DEV ; WAITFOR BUSY;
JMP .-2 ;
SKPBZ DEV ;
JMP .-1 ;
JMP READR;
.ENDC
.IFE TYPE-3
.RDX 10
AUTO: LDA 1 .DOA ; FLEXIBLE DISC AUTOLOAD:
STA 1 254 ;
LDA 1 .JMP ; WORD(376:377) :=
STA 1 255 ; NIOS DEV
NIOC DEV ; JMP .-1
.JMP: JMP 254 ; OVERWRITTEN BYE NEW BOOTSTRAP:
.DOA: NIOS DEV ; SKPDN DEV
; JMP .-1
; END;
.ENDC
.END
«ff»
«nul»