|
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 - 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⟧ └─⟦6dbcc9c03⟧ Bits:30000463 DOMUS disk image └─⟦this⟧ └─⟦a2e222af0⟧ Bits:30001626 DOMUS disk image └─⟦this⟧
; 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»