DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC3600/RC7000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC3600/RC7000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦f647aac7c⟧ TextFile

    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«

Derivation

└─⟦45bd0f8dd⟧ Bits:30000464 DOMUS disk image
    └─ ⟦this⟧ »/YDBX3« 
└─⟦6dbcc9c03⟧ Bits:30000463 DOMUS disk image
    └─ ⟦this⟧ »/YDBX3« 
└─⟦a2e222af0⟧ Bits:30001626 DOMUS disk image
    └─ ⟦this⟧ »/YDBX3« 

TextFile


;					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»