
; 007

;W$CERR	=: 0			;  With@CorrectError  -   
				;   -    
				;        - ?


.NLIST
.INCLUDE /DSMAC.MAC/
.INCLUDE /MYMAC.MAC/
.INCLUDE /ASCII.MAC/
.INCLUDE /HWDF.MAC/
.INCLUDE /134DF.MAC/
.INCLUDE /134MC.MAC/
.LIST

MODULE NAME=<134ROM>, REL=<KX>, VER=<01>, LIBR=<MC1201>, COMM=<1801PE2-134>, TYPE=<NOSECT>

	.ASECT
	.=0

START:	JMP	ENTRYP

V4:	.WORD	IV4
 	.WORD	PR7

; for RT-11 Link-11

 	.=^O<42>

 	.WORD	0

 	.=^O<50>

 	.WORD	0

 	.=^O<360>

 	.WORD	0

; end for RT-11 Link-11

................................................................................

	.=^O<400>

DVDRVS:

  ..............................................................................
  ;
  ; MY
  ;
  PROCEDURE MY.BOT
  BEGIN
    REPEAT

      REPEAT
      UNTIL #40 SET.IN @R1

      LET @R1 := #37

      REPEAT
      UNTILB @R1 MI #0

      LET  @#172142 := R0

      REPEAT
      UNTIL #100040 SET.IN @R1

    UNTIL RESULT IS PL AND #NOP EQ @#0

    LET PC := #0
  END MY.BOT

  ..............................................................................
  ;
  ; MX
  ;
  PROCEDURE MX.BOT
  BEGIN
    LET R0 := R0 OFF.BY #^C<3>

    LET  SP  := #10002
    PUSH R0
    LET  R4  := R1
    LET  @R4 := #100

    THRU  R5 := #177777
    END

    LET R0  := R0  L.SHIFT 2
    LET @R4 := @R4 SET.BY  R0

    THRU R5 := #47040
    END

    CALL L00722

    LET  R5  := R4
    TST  (R5)+
    LET  R0  := #0
    LET  R1  := #1000
    LET  @R4 := @R4 SET.BY #40000

    REPEAT
    UNTIL @R4 MI #0
    TST  @R5

    REPEAT
    UNTIL @R4 MI #0
    TST  @R5

    CALL L00634

    LET  R0 := #1000
    LET  R1 := #1600
    CALL L00634

    LET  @R4 := @R4 OFF.BY #40000
    LET  R1  := #200
    LET  @R4 := @R4 SET.BY #10000
    LET  @R4 := @R4 SET.BY #40000

    REPEAT
    UNTIL @R4 MI #0
    TST  @R5

    REPEAT
    UNTIL @R4 MI #0
    TST  @R5

    CALL L00634

    LET @R4 := @R4 OFF.BY #40000

    JMP  @#0
  END MX.BOT

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L00634
  BEGIN
    REPEAT

      LET  R3 := #200
      PUSH #0

      THRU R3
        REPEAT
        UNTIL @R4 MI #0

        LET @R0 := @R5
        LET @SP := @SP + (R0)+
        LET R1  := R1 - #1

        IF RESULT IS EQ LEAVE LOOP
      END

      REPEAT
      UNTIL @R4 MI #0

      IF @R5 NE (SP)+ THEN
        POP
        LET R0 := @SP

        JUMPTO  MX.BOT
      END

    UNTIL R1 EQ #0

    RETURN
  END L00634

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L00706
  BEGIN
    LET @R4 := @R4 SET.BY #20

    THRU R5 := #23420
    END

    RETURN
  END L00706

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L00722
  BEGIN
    LET @R4 := @R4 OFF.BY #40
    WHILE #4000 OFF.IN @R4
      CALL L00706
    END

    RETURN
  END L00722

  ..............................................................................
  ;
  ; DU
  ;
  PROCEDURE DU.BOT
  BEGIN
    LET SP    := #N$ADR
    LET R0    := R0 OFF.BY #^C<3>
    LET R3    := #4000
    LET R2    := #636+N$ADR-DVDRVS	; 10236-7400= 636 ??????
    LET R1    := #172150
    LET (R1)+ := R0

    REPEAT
      IF @R1 MI #0 THEN
        HALT
        GOTO  DU.BOT
      END

      REPEAT
      UNTIL R3 SET.IN @R1

      LET @R1 := (R2)+
      LET R3  := R3 L.SHIFT
    UNTIL RESULT IS MI

    REPEAT
      LET R4 := #N$ADR+1000

      REPEAT
        LET (R4)+ := #0
      UNTIL R4 EQ #N$ADR+1244

      LET  -30(R4) := (R2)+	; 1244-30=1214
      LET  -44(R4) := (R2)+	; 1244-44=1200
      LET  -50(R4) := (R2)+	; 1244-50=1174
      LET   -2(R4) := #0	; 1244- 2=1242
      LET   -4(R4) := #0
      LET  -54(R4) := (R2)+
      LET  -64(R4) := (R2)+
      LET  -66(R4) := #0
      LET  -70(R4) := @R2
      LET -154(R4) := (R2)+
      LET -152(R4) := #0
      LET  -24(R4) := R0
      LET  -60(R4) := R0

      LET (R4)+      := (R2)+
      LET @R4        := R3
      LET 2(R4)      := (R2)+
      LET 4(R4)      := R3
      LET R5         := -2(R1)

      REPEAT
      UNTIL @R4 PL #0

      LET R5 := -140(R4) OFF.BY #^C<37>

      IF RESULT IS NE THEN
        HALT
        GOTO DU.BOT
      END

    UNTIL @R2 EQ #123456

    IF @#0 NE #NOP THEN
      HALT
      GOTO DU.BOT
    END

    LET PC := #0
  END DU.BOT

  ;001202  100000			BPL	1204
  ;001204  011244			MOV	@R2,-(R4)
  ;001206  000000			HALT
  ;001210  000001			WAIT
  ;001212  000000			HALT
  ;001214  000000			HALT
  ;001216  000000			HALT
  ;001220  000011			.WORD	11
  ;001222  000000			HALT
  ;001224  000060			.WORD	60
  ;001226  011074			MOV	@R0,@11160(R4)
  ;001230  011160
  ;001232  000000			HALT
  ;001234  000000			HALT
  ;001236  001000			BNE	1240
  ;001240  000041			.WORD	41
  ;001242  000000			HALT
  ;001244  000060			.WORD	60
  ;001246  011074			MOV	@R0,@11160(R4)
  ;001250  011160
  ;001252  123456			CMPB	@(R4)+,@-(SP)

  .WORD 100000   ;<000><200>
  .WORD 011244   ;<244><022>
  .WORD 000000   ;<000><000>
  .WORD 000001   ;<001><000>
  .WORD 000000   ;<000><000>
  .WORD 000000   ;<000><000>
  .WORD 000000   ;<000><000>
  .WORD 000011   ;<011><000>
  .WORD 000000   ;<000><000>
  .WORD 000060   ;'0'<000>
  .WORD 011074   ;'<'<022>
  .WORD 011160   ;''<022>
  .WORD 000000   ;<000><000>
  .WORD 000000   ;<000><000>
  .WORD 001000   ;<000><002>
  .WORD 000041   ;'!'<000>
  .WORD 000000   ;<000><000>
  .WORD 000060   ;'0'<000>
  .WORD 011074   ;'<'<022>
  .WORD 011160   ;''<022>
  .WORD 123456   ;'.'<247>

  ..............................................................................
  ;
  ; CT
  ;
  PROCEDURE CT.BOT
  BEGIN
    LET @R1 := R2 SET.BY (R3)+

    REPEAT
    UNTIL R1 MI #0	; ?? (R1) ??

    IF -2(R1) PL #0 GOTO SHDVER

    GOTO CBOOT
  END CT.BOT

  ..............................................................................
  ;
  ; MT
  ;
  PROCEDURE MT.BOT
  BEGIN
    LET @R1 := R2

    REPEAT
      LET -2(R1) := -2(R1) R.ROTATE
    UNTIL RESULT IS CS

    LET @R1 := @R1 SET.BY (R3)+

    REPEAT
    UNTILB @R1 MI #0

    LET 2(R1) :=  #177777
    LET @R1   :B= (R3)+		; MOVB	(R3)+,@R1

    .IIF NE .-WAIT .ERROR ; PROC WAIT must be next
  END MT.BOT

  ..............................................................................
  ;
  ; Wait
  ;
  PROCEDURE WAIT
  BEGIN
    REPEAT
    UNTIL R5 SET.IN @R1

    IF RESULT IS PL GOTO CBOOT2

    .IIF NE .-SHDVER .ERROR ; PROC SHDVER must be next
  END WAIT

  ..............................................................................
  ;
  ; Show Device Error message
  ;
  PROCEDURE SHDVER
  BEGIN
    $SHMESS DVER
    HALT
  END SHDVER

  ..............................................................................
  ;
  ; DP
  ;
  PROCEDURE DP.BOT
  BEGIN
    .IIF NE .-CBOOT .ERROR ; PROC CBOOT must be next
  END DP.BOT

  ..............................................................................
  ;
  ; Common boot, entry 1
  ;
  PROCEDURE CBOOT
  BEGIN
    LET @R1 := R2
    .IIF NE .-CBOOT2 .ERROR ; PROC CBOOT2 must be next
  END CBOOT

  ..............................................................................
  ;
  ; Common boot, entry 2
  ;
  PROCEDURE CBOOT2
  BEGIN
    LET  2(R1) :=  #^C<511>		; 177266
    LET  R2    :B= (R3)+
    LET  R1    :=  R1  OFF.BY #377
    LET  @R1   :=  @R1 SET.BY R2
    REPEAT
    UNTILB @R1 MI #0

    IF @R1 MI #0 THEN
      IFB @R3 NE #0     GOTO SHDVER
      IF  @R3 NE 14(R1) GOTO SHDVER
    END

    LET @R1 :B= #0
    LET PC  :=  #0
  END CBOOT2

  ..............................................................................
  ;
  ; DM
  ;
  PROCEDURE DM.BOT
  BEGIN
    LET  10(R1) := R0
    LET  @R1    := #3
    GOTO WAIT
  END DM.BOT

  ..............................................................................
  ;
  ; DB
  ;
  PROCEDURE DB.BOT
  BEGIN
    LET 10(R1) :B= R0
    LET @R1    :B= (R3)+
    LET 32(R1) :=  #14000	; 14000 ??
    GOTO CBOOT3
  END DB.BOT

  ..............................................................................
  ;
  ; MM
  ;
  PROCEDURE MM.BOT
  BEGIN
    LET 32(R1) := R0
    LET @R1    := @R1 SET.BY (R3)+

    REPEAT
    UNTIL #10000 SET.IN 12(R1)

    LET @R1 :B= (R3)+
    REPEAT
    UNTILB 12(R1) MI #0

    LET @R1 :B= (R3)+
    REPEAT
    UNTILB 12(R1) MI #0

    LET 6(R1) := #-1

    LET @R1 :B= (R3)+
    REPEAT
    UNTILB 12(R1) MI #0

    GOTO CBOOT3
  END MM.BOT

  ..............................................................................
  ;
  ; DW
  ;
  PROCEDURE DW.BOT
  BEGIN
    REPEAT
      LET @R1 := #10
      REPEAT
      UNTIL @R1 PL #0

      LET @#174006 := #1
      LET @#174016 := #40

      REPEAT
      UNTIL @R1 PL #0

      LET R2 := #0

      THRU R3 := #^D<256>
        REPEAT
        UNTILB @R1 MI #0

        LET  (R2)+ := @#174010
      END
    UNTIL #NOP EQ @R3
    LET PC := #0
  END DW.BOT

  ..............................................................................
  ;
  ; DS
  ;
  PROCEDURE DS.BOT
  BEGIN
    LET 10(R1) :B= R0

    .IIF NE .-CBOOT3 .ERROR ; PROC CBOOT3 must be next
  END DS.BOT

  ..............................................................................
  ;
  ; Common boot, entry 3
  ;
  PROCEDURE CBOOT3
  BEGIN
    MOV 16(R1), 16(R1)		; ????

    .IIF NE .-BCBOT2 .ERROR ; PROC BCBOOT2 must be next
  END CBOOT3

  ................................................................................
  ;
  ; Go to Common boot, entry 2
  ;
  PROCEDURE BCBOT2
  BEGIN
    GOTO CBOOT2
  END BCBOT2

  ..............................................................................
  ;
  ; DX
  ;
  PROCEDURE DX.BOT
  BEGIN
    LET R5 := R5 SET.BY #40

    IF R0 NE #0 THEN
      TST (R3)+
    END

    REPEAT
    UNTILB R5 SET.IN @R1

    LET @R1 :B= (R3)+

    THRU R2 := #2

      REPEAT
      UNTILB @R1 MI #0

      LET 2(R1) :B= #1

    END

    REPEAT
    UNTIL R5 SET.IN @R1

    IF RESULT IS MI GOTO SHDVER

    LET @R1 :B= (R3)

    LOOP
      REPEAT
      UNTILB R5 SET.IN @R1

      IF RESULT IS PL LEAVE LOOP

      LET (R2)+ :B= 2(R1)
    END

    IF #NOP NE @#0 GOTO SHDVER

    LET PC := #0
  END DX.BOT

  ................................................................................
  ;
  ; DK
  ;
  PROCEDURE DK.BOT
  BEGIN
    LET  R2 := R2 SHIFT #5
    LET  6(R1) := R2
    GOTO BCBOT2
  END DK.BOT

................................................................................
;
; Bootable device description
;
BTABLE:
  DV.BOT  MT  172522, MT.BOT, MT.PRM
  DV.BOT  CT  177342, CT.BOT, CT.PRM
  DV.BOT  DK  177404, DK.BOT, DK.PRM
  DV.BOT  DP  176714, DP.BOT, DP.PRM
  DV.BOT  DM  177440, DM.BOT, DM.PRM
  DV.BOT  MM  172440, MM.BOT, MM.PRM
  DV.BOT  DB  176700, DB.BOT, DB.PRM
  DV.BOT  DS  172040, DS.BOT, DS.PRM
  DV.BOT  DX  177170, DX.BOT, DX.PRM
  DV.BOT  DW  174020, DW.BOT, BTABLE
  DV.BOT  MX  177130, MX.BOT, BTABLE
  DV.BOT  MY  172140, MY.BOT, BTABLE
  DV.BOT  DU  175150, DU.BOT, BTABLE

DV.END

MT.PRM:	.WORD	060017	;<017><140>	;002100

	.WORD	001411	;<011><003>	;002102

DM.PRM:
DB.PRM:
	.BYTE	21	;<021>'9'	;002104

DS.PRM:	.BYTE	71

CT.PRM:	.WORD	004003	;<003><010>	;002106

DK.PRM:
DP.PRM:	.WORD	037405	;<005>'?'	;002110

MM.PRM:	.WORD	001300	;<300><002>	;002112

	.WORD	004407	;<007><011>	;002114
	.WORD	034431	;<031>'9'	;002116
	.WORD	001000	;<000><002>	;002120

DX.PRM:	.WORD	001407	;<007><003>	;002122

	.WORD	011427	;<027><023>	;002124

  $MESSL DVER, <<CR><LF><RUS>/sboj ustrojstwa /<LAT>>

................................................................................

L02152:
  LET @#HWERRF := #0

L02156:
  LET @#IV4   := #137
  LET @#IV4+2 := #SETV4F

  LET @#IFLAG  := #1
  LET @#HCADDR := #0

  CALL SHAT
  CALL SHSPCE

  LET  @#WSHOW := @#SU.PC
  CALL SHWRD


  ..............................................................................
  ;
  ;   -      GETCM2
  ;
  PROCEDURE GETCMD
  BEGIN
    CALL SHAT

    .IIF NE .-GETCM2 .ERROR ; PROC GETCM2 must be next
  END GETCMD

  ..............................................................................
  ;
  ;   -   .       '0..'7
  ;
  PROCEDURE GETCM2
  BEGIN
    CALL KBIN

    IF R4 LT #'0 GOTO CHKCMD
    IF R4 GE #'8 GOTO CHKCMD

    CALL TVOUT

    LET @#IFLAG := @#IFLAG OFF.BY #000002!000001

    IF #IF.REG SET.IN @#IFLAG THEN		; Rn ?
      IF #IF.RFD OFF.IN @#IFLAG THEN		;   ?
        LET @#IFLAG := @#IFLAG SET.BY #IF.RFD	;  
      ELSE
        LET @#IFLAG := @#IFLAG SET.BY #IF.RMD	;    
      END
    END

    LET R4 := R4 OFF.By #'0

    LET R3 := @#IADDR+2
    LET R2 := @#IADDR
    LET R2 := R2 C.SHIFT #3

    LET R3 := R3 + R4

    LET @#IADDR   := R2
    LET @#IADDR+2 := R3

    LET @#IFLAG := @#IFLAG SET.BY #IF.NUM

    .IIF NE .-NXTCHR .ERROR ; PROC NXTCHR must be next
  END GETCM2

  ..............................................................................
  ;
  ; 
  ;
  PROCEDURE NXTCHR
  BEGIN
    GOTO GETCM2
  END NXTCHR

  ..............................................................................
  ;
  ;    
  ;
  PROCEDURE CHKCMD
  BEGIN
    IF #IF.RS SET.IN @#IFLAG GOTO SLCMD	; RS  ? - ,  S  

    .IIF NE .-RSCMD .ERROR ; PROC RSCMD must be next
  END CHKCMD

  ..............................................................................
  ;
  ;   RS
  ;
  PROCEDURE RSCMD
  BEGIN
    IF R4 EQ #'S              GOTO SLCMD
    IF #IF.REG OFF.IN @#IFLAG GOTO SLCMD
    IF #IF.RFD OFF.IN @#IFLAG GOTO NXTCHR

   .IIF NE .-SLCMD .ERROR ; PROC SLCMD must be next
   END RSCMD

  ..............................................................................
  ;
  ; Command /
  ;
  PROCEDURE SLCMD
  BEGIN
    IF R4 NE #SLASH GOTO CRCMD

    IF @#IFLAG MI #0 AND #IF.RFD OFF.IN @#IFLAG THEN
      LET @#IFLAG := @#IFLAG OFF.BY #002000
    END

    IFB @#IFLAG EQ #0 THEN

      LET @#IFLAG := @#IFLAG OFF.BY #400

      IF #IF.RMD SET.IN @#IFLAG THEN
        LET @#IFLAG := @#IFLAG OFF.BY #IF.REG!IF.RFD!IF.RMD!002000
      END

      IF #IF.REG SET.IN @#IFLAG THEN
        LET @#IADDR+2 := @#IADDR+2 L.SHIFT 1 SET.BY #R0.SAV
      ELSE

        IF #IF.RS SET.IN @#IFLAG THEN
          LET @#IADDR+2 := #SU.PSW
          LET @#HV032 := @#LCADDR
          LET @#HV030 := @#HCADDR
          LET @#IFLAG := @#IFLAG SET.BY #400 OFF.BY #IF.RS
        END
      END

      LET @#LCADDR := @#IADDR+2
      LET @#HCADDR := @#IADDR

      LET @#IFLAG := @#IFLAG OFF.BY #000002
    END

    LET  @#HV040  := #0
    LET  @#V4FLAG := #0
    CALL L05374

    IF @#V4FLAG NE #0 THEN
      JMP BUSERR
    END

    .IIF NE .-BRNCH1 .ERROR ; PROC BRNCH1 must be next
  END SLCMD

  ..............................................................................
  ;
  ;  -> NXTCHR
  ;
  PROCEDURE BRNCH1
  BEGIN
    GOTO NXTCHR
  END BRNCH1

  ..............................................................................
  ;
  ; Command 
  ;
  PROCEDURE CRCMD
  BEGIN
    IF R4 NE #CR GOTO LFCMD

    .IIF NE .-CRCMD2 .ERROR ; PROC CRCMD2 must be next
  END CRCMD

  ..............................................................................
  ;
  ; Command  -     R4 -    - 
  ;
  PROCEDURE CRCMD2
  BEGIN
    IF #IF.NUM SET.IN @#IFLAG AND @#HV040 EQ #0 THEN

      IF @#LCADDR EQ #SU.PSW THEN
        LET @#IADDR+2 := @#IADDR+2 OFF.BY #^C<^O<357>>	;     T(?) 
      END

      LET  @#V4FLAG := #0
      CALL L05466

      IF @#V4FLAG NE #0 THEN
        JUMPTO BUSERR
      END

      LET @#IFLAG := @#IFLAG SET.BY #000002 OFF.BY #IF.NUM
    END

    LET  @#HV040 := #1
    CALL SHAT

    .IIF NE .-BRNCH2 .ERROR ; PROC BRNCH2 must be next
  END CRCMD2

  ..............................................................................
  ;
  ;  -> NXTCHR
  ;
  PROCEDURE BRNCH2
  BEGIN
    GOTO BRNCH1
  END BRNCH2

  ..............................................................................
  ;
  ; Command 
  ;
  PROCEDURE LFCMD
  BEGIN
    IF R4 NE #LF GOTO UPCMD

    LET  @#V4FLAG := #0
    CALL L05072

    .IIF NE .-CHKV4T .ERROR ; PROC CHKV4T must be next
  END LFCMD

  ..............................................................................
  ;
  ;  - 
  ;
  PROCEDURE CHKV4T
  BEGIN
    IF @#V4FLAG EQ #0 GOTO BRNCH2	;  BR BRNCH1

    JUMPTO BUSERR
  END CHKV4T

  ..............................................................................
  ;
  ; Command ^
  ;
  PROCEDURE UPCMD
  BEGIN
    IF R4 NE #UPAROW GOTO SCCMD

    LET  @#V4FLAG := #0
    CALL L05072

    GOTO CHKV4T
  END UPCMD

  ..............................................................................
  ;
  ; Command ;
  ;
  PROCEDURE SCCMD
  BEGIN
    IF R4 EQ #SCOLON THEN
      CALL TVOUT
      LET  @#IADDR+2 := #0
      LET  @#IADDR   := #0
      GOTO BRNCH2
    END

    .IIF NE .-RCMD .ERROR ; PROC RCMD must be next
  END SCCMD

  ..............................................................................
  ;
  ; Command R
  ;
  PROCEDURE RCMD
  BEGIN
    IF R4 EQ #'R THEN
      GOTO L03100
    END

    .IIF NE .-DLRCMD .ERROR ; PROC DLRCMD must be next
  END RCMD

  ..............................................................................
  ;
  ; Command $
  ;
  PROCEDURE DLRCMD
  BEGIN
    IF R4 NE #DOLLAR GOTO GPCMD

    .IIF NE .-L03100 .ERROR ; PROC L03100 must be next
  END DLRCMD

  ..............................................................................
  ;
  ;    R  $
  ;
  PROCEDURE L03100
  BEGIN
    LET @#IFLAG   := #IF.REG!002000
    LET @#IADDR+2 := #0
    LET @#IADDR   := #0
    CALL TVOUT

    .IIF NE .-BRNCH3 .ERROR ; PROC BRNCH3 must be next
  END L03100

  ..............................................................................
  ;
  ;  -> NXTCHR
  ;
  PROCEDURE BRNCH3
  BEGIN
    BR BRNCH2
  END BRNCH3

  ..............................................................................
  ;
  ; Command G and P
  ;
  PROCEDURE GPCMD
  BEGIN
    IF R4 EQ #'G OR R4 EQ #'P THEN
      CALL TVOUT
      LET  R0 := @#R0.SAV
      LET  R1 := @#R1.SAV
      LET  R2 := @#R2.SAV
      LET  R3 := @#R3.SAV
      LET  R5 := @#R5.SAV
      LET  SP := @#SP.SAV

      IF R4 EQ #'P THEN
        LET R4      := @#R4.SAV
        LET @#U.PSW := @#SU.PSW
        LET @#U.PC  := @#SU.PC
        RTT
      END
    ; ELSE 
        RESET
        LET  R4      := @#R4.SAV
        LET  @#U.PSW := #0
        LET  @#U.PC  := @#IADDR+2
        RTI
    ; END
    END

    .IIF NE .-SCMD .ERROR ; PROC SCMD must be next
  END GPCMD

  ..............................................................................
  ;
  ; Command S
  ;
  PROCEDURE SCMD
  BEGIN
    IF R4 EQ #'S THEN

      IF #IF.REG OFF.IN @#IFLAG GOTO BRNCH3

      CALL TVOUT

      LET @#IFLAG := #IF.RS!002000
      GOTO BRNCH3
    END

    .IIF NE .-ATCMD .ERROR ; PROC ATCMD must be next
  END SCMD

  ..............................................................................
  ;
  ; Command @
  ;
  PROCEDURE ATCMD
  BEGIN
    IF R4 NE #ATSIGN GOTO UNSCMD

    IF #2000 SET.IN @#IFLAG THEN	; W$CERR !! 3314 -     
											.IF NDF W$CERR
      ; 3314   - 1442,   1444
      .=.-2
      BEQ  30$
											.ENDC

      IF #IF.RS OFF.IN @#IFLAG GOTO 20$

      LET @#LCADDR := @#HV032
      LET @#HCADDR := @#HV030

;      IF @#IFLAG MI #0 THEN		; IF.NUM = 100000 -  ?
;        LET @#SU.PSW := @#IADDR+2	;  -   PSW
;      END
      TST @#IFLAG
      BPL 10$
        LET @#SU.PSW := @#IADDR+2
    10$:

      LET @#IFLAG :=  #0
      LET @#HV032 :B= #0

    AND #077000 EQ @#HV032 THEN		; WRAM?
											.IF NDF W$CERR
      ; 3374   - 1012,   1014
      .=.-2
      BNE  30$
											.ENDC

  20$:

      LET R5 := @#LCADDR
      LET R0 := (R5)

      IF @#IFLAG PL #0 GOTO 40$		; IF.NUM = 100000 -  ? -  - 

      LET (R5) := @#IADDR+2
      LET R0   := (R5)

    ELSE

      LET @#V4FLAG := #0			; ??
											.IF NDF W$CERR
  30$:
											.ENDC
      CALL L03472

      IF @#V4FLAG NE #0 THEN
        JUMPTO BUSERR
      END
    END

40$:

    LET @#LCADDR := R0
    LET @#HCADDR := #0

    .IIF NE .-L03454 .ERROR ; PROC L03454 must be next
  END ATCMD

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L03454
  BEGIN

    CALL TVOUT

    LET  @#IFLAG := #0

    CALL L05210

    .IIF NE .-BRNCH4 .ERROR ; PROC BRNCH4 must be next
  END L03454

  ..............................................................................
  ;
  ;  -> NXTCHR
  ;
  PROCEDURE BRNCH4
  BEGIN

    GOTO BRNCH3
  END BRNCH4

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L03472
  BEGIN
    LET R5 := @#LCADDR

    IF #IF.RFD!002000 OFF.IN @#IFLAG THEN
      CALL L13500
    END

    LET R0 := (R5)

    IF @#IFLAG MI #0 THEN	; IF.NUM = 100000 -  ?
      LET R0   := @#IADDR+2
      LET (R5) := R0
    END

    RETURN
  END L03472

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L03532
  BEGIN

    CALL TVOUT
    LET  R4 := #CR

    JUMPTO CRCMD2
  END L03532

  ..............................................................................
  ;
  ; Command _
  ;
  PROCEDURE UNSCMD
  BEGIN
    IF R4 NE #UNDSCR GOTO MCMD

    IF #002000 SET.IN @#IFLAG GOTO L03532

    LET  @#V4FLAG := #0
    CALL L03472

    IF @#V4FLAG NE #0 THEN
      JUMPTO BUSERR
    END

    LET @#LCADDR := @#LCADDR + R0
    LET @#HCADDR := @#HCADDR + CARRY
    LET @#LCADDR := @#LCADDR + #2
    LET @#HCADDR := @#HCADDR + CARRY

    GOTO L03454
  END UNSCMD

  ..............................................................................
  ;
  ;  M -       
  ;
  PROCEDURE MCMD
  BEGIN
    IF R4 NE #'M GOTO BCMD

    CALL TVOUT

    IF #HE.DBL SET.IN @#HWERRF THEN

      LET  R5 := #DBSERM
      GOTO SHCERR

    END

    IF #HE.INT SET.IN @#HWERRF THEN

      LET  R5 := #INTERM
      GOTO SHCERR

    END

    LET  R5 := #HLTM
    GOTO SHCERR

  END MCMD

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE BUSERR
  BEGIN
    LET R5 := #BUSERM

    .IIF NE .-SHCERR .ERROR ; PROC SHCERR must be next
  END BUSERR

  ..............................................................................
  ;
  ; Show Console Error        
  ;                         
  ;                        
  ;
  ; R5 -  
  ;
  PROCEDURE SHCERR
  BEGIN
    LET R3 := #ERMC.L

    .IIF NE .-SHERR .ERROR ; PROC SHERR must be next
  END SHCERR

  ..............................................................................
  ;
  ; Show Error    
  ;                 
  ;                
  ;
  ; R3 -  
  ; R5 -  
  ;
  PROCEDURE SHERR
  BEGIN
    THRU R3
      LET  R4 :B= (R5)+
      CALL TVOUT
    END

    LET @#IFLAG   := #0
    LET @#IADDR+2 := #0
    LET @#IADDR   := #0

    JUMPTO GETCMD
  END SHERR

												.IF NDF W$CERR
  ..............................................................................
  ;
  ;  ,       ...
  ;
  PROCEDURE BRNCH5
  BEGIN
    GOTO BRNCH4
  END BRNCH5
												.ENDC

  ..............................................................................
  ;
  ;  
  ;
  PROCEDURE BRDLCM
  BEGIN
    JUMPTO DELCMD
  END BRDLCM

  ..............................................................................
  ;
  ; Command B
  ;
  PROCEDURE BCMD
  BEGIN
    IF R4 NE #'B GOTO BRDLCM	; ? ,  

    CALL TVOUT			; 
    CALL TVNLN			;  
    LET  R4 := #'$		; 
    CALL TVOUT			; 

    LET R1 := #3		;   -  ,   -  (   ZF)
    LET R2 := #BDEV		; 

    THRU R1
      CALL KBIN			;  
      LET  (R2)+ :B= R4		; 
      CALL TVOUT			; 
    END				; 

    LET  @#BUNIT := @#BUNIT OFF.BY #^C<7>	;     10(8) -  ??

    CALL TVNLN			;  

    LET  R4 := #BTABLE		;   

    LOOP
      IF (R4) EQ #0 		;   ?
        LET  R4 := #ATSIGN	; . 
        CALL TVOUT		; 
        JUMPTO GETCM2		;  
      END

      IF @#BDEV EQ (R4)+ LEAVE LOOP	;  ?   -   
      LET R4 := R4 + #6			;  -    
    END					;  

    ;   

    LET @#IV4+2 := #NODEV	;  ,     

    LET	R5 := (R4)		; CSR
    LET R0 := (R5)+		; ?
				;   ,  

    LET @#IV4+2 := #SETV4F	;   V4

    LET R1 := #DVDRVS		;     
    LET R2 := #EDVDRV		;      + 2

    LET R2 := R2 - R1 R.SHIFT 1	;   

												.IF NDF W$CERR
    LET R2 := R2 + #1		; ??
												.ENDC

    LET R5      := #N$WNDW+N$ADR	;   halt  ( N$WNDW)    
                                        ;   (  N$ADR  )
    LET @#PARH2 := #0			;    halt     0  

    THRU R2
      LET (R5)+ := (R1)+		;       
    END

    LET R0 := @#BUNIT
    LET R5 := #100200			; ???
    LET R1 := (R4)+			; CSR
    LET R2 := (R4)+ + #N$ADR-DVDRVS	;        
                                        ;         - +7400
    LET R3 := (R4)  + #N$ADR-DVDRVS	; 4th parameter -        

    LET @#U.PSW := #PR7
    LET @#U.PC  := R2
    LET SP      := @#SP.SAV

    RESET
    ;
    ; R0 -  
    ; R1 - CSR
    ; R2 -    
    ; R3 -    
    ; R4 -           ( HALT )
    ; R5 - 100200
    ;
    RTI
  END BCMD

  ..............................................................................
  ;
  ; No such device -      CSR   
  ;
  PROCEDURE NODEV
  BEGIN
    LET @#IV4+2 := #SETV4F	;   V4
    LET R5 := #NDVM		;   
    LET R3 := #NDVM.L		;  

    JUMPTO SHERR		;    ,    
                                ;  ,     
  END NODEV

  ..............................................................................
  ;
  ;     GETCM2
  ;
  PROCEDURE L04244
  BEGIN
    JUMPTO GETCM2
  END L04244

  ..............................................................................
  ;
  ; DEL
  ;
  PROCEDURE DELCMD
  BEGIN
    IF R4 NE #RUBOUT GOTO L04330

    IF #IF.NUM OFF.IN @#IFLAG GOTO L04244

    CALL MVCRSB
    CALL SHSPCE
    CALL MVCRSB
    THRU R3 := #3
      LET C.BIT := OFF
      LET @#IADDR   := @#IADDR   R.ROTATE 1	; ROR	@#IADDR
      LET @#IADDR+2 := @#IADDR+2 R.ROTATE 1	; ROR	@#IADDR+2
    END

    GOTO L04244
  END DELCMD

  ..............................................................................
  ;
  ;     GETCM2
  ;
  PROCEDURE L04324
  BEGIN
    JUMPTO GETCM2
  END L04324


  ..............................................................................
  ;
  ;  >
  ;
  PROCEDURE L04330
  BEGIN
    IF R4 NE #RANGLE THEN
      JUMPTO TCMD
    END

    IF #002000 SET.IN @#IFLAG GOTO L04324

    LET  @#V4FLAG := #0
    CALL L03472

    IF @#V4FLAG NE #0 THEN
      JUMPTO BUSERR
    END

    IFB R0 PL #0 THEN
      LET R0 := R0 OFF.BY #^O<177400>
    ELSE
      LET R0 := R0 SET.BY #^O<177400>
    END

    LET R0       := R0 L.SHIFT 1 + #2
    LET @#LCADDR := @#LCADDR + R0

    JUMPTO L03454
  END L04330

  HLTM:
    $ERMSC <<CR><LF>/HALT INSTRUCTION/>

  DBSERM:
    $ERMSC <<CR><LF>/DOUBLE BUS ERROR/>

  INTERM:
    $ERMSC <<CR><LF>/INTERRUPT ERROR />

  BUSERM:
    $ERMSC <<CR><LF>/BUS ERROR       />

  $MESSL NDVM </DEVICE'S NOT AVAILABLE/>

  ..............................................................................
  ;
  ;   V4
  ;
  PROCEDURE SETV4F
  BEGIN
    LET @#V4FLAG := @#V4FLAG + #1

    RETURN
  END SETV4F

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L04574
  BEGIN
    LET @#HWERRF := #HE.DBL	; Double bus error

    GOTO L04612
  END L04574

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L04604
  BEGIN
    LET @#HWERRF := #HE.INT

    .IIF NE .-L04612 .ERROR ; PROC L04612 must be next
  END L04604

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L04612
  BEGIN
    LET @#SP.SAV := SP

    JUMPTO L02156
  END L04612

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE KBIN
  BEGIN
    REPEAT
    UNTILB @#TKS MI #0

    LET R4 := @#TKB OFF.BY #^C<177>

    RETURN
  END KBIN

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE TVOUT
  BEGIN
    REPEAT
    UNTILB @#TPS MI #0

    LET @#TPB := R4

    RETURN
  END TVOUT

  ..............................................................................
  ;
  ; Show normal prompt (@) clear stored address
  ;
  PROCEDURE SHAT
  BEGIN
    CALL TVNLN

    LET  R4 := #ATSIGN
    CALL TVOUT

    LET  @#IADDR+2 := 0
    LET  @#IADDR   := 0

    RETURN
  END SHAT

  ..............................................................................
  ;
  ; Show OCTAL from WSHOW
  ;
  PROCEDURE SHWRD
  BEGIN
    LET  @#TMP.S1 := R5
    LET  R4       := #0
    LET  R5       := @#WSHOW
    LET  R1       := #6
    LET  R4       := R4 C.SHIFT #1
    GOTO 20$

    THRU R1
      LET  R4 := R4 C.SHIFT #3
20$:
      LET  R4 := R4 OFF.BY #^C<7> + #'0
      CALL TVOUT
    END

    LET R5 := @#TMP.S1

    RETURN
  END SHWRD

  ..............................................................................
  ;
  ; Show address
  ;
  PROCEDURE SHADDR
  BEGIN
    LET  R4 := @#HASHOW
    LET  R5 := @#LASHOW
    LET  R4 := R4 C.SHIFT #1
    LET  @#WSHOW := R5
    LET  R4 := R4 C.SHIFT #72 OFF.BY #^C<1> + #'0
    CALL TVOUT
    CALL SHDIG
    CALL SHDIG
    LET  R5 := @#WSHOW

    THRU R3 := #5
      CALL SHDIG
    END
    RETURN
  END SHADDR

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE SHDIG
  BEGIN
    LET  R4 := R4 C.SHIFT #3 OFF.BY #^C<7> + #'0
    CALL TVOUT

    RETURN
  END SHDIG

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L05072
  BEGIN
    IF #400 SET.IN @#IFLAG AND #SU.PSW EQ @#LCADDR THEN

      IF R4 NE #LF THEN
        CALL TVOUT
      END

      LET R4 := #CR

      JUMPTO CRCMD2

    END

    CALL TVOUT

    IF @#IFLAG MI #0 THEN		; IF.NUM = 100000 -  ?
                                        ; , 
      LET @#V4FLAG := #0

      CALL L05466

    AND @#V4FLAG NE #0 THEN

      JUMPTO BUSERR

    END

    IF R4 NE #UPAROW GOTO L05222

    LET @#LCADDR := @#LCADDR - #2
    LET @#HCADDR := @#HCADDR - CARRY

    .IIF NE .-L05210 .ERROR ; PROC L05210 must be next
  END L05072

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L05210
  BEGIN
    LET  R4 := #LF
    CALL TVOUT

    GOTO L05242
  END L05210

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L05222
  BEGIN
    IF R4 EQ #LF THEN
      LET @#LCADDR := @#LCADDR + #2
      LET @#HCADDR := @#HCADDR + CARRY
    END

    .IIF NE .-L05242 .ERROR ; PROC L05242 must be next
  END L05222

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L05242
  BEGIN
    IF #IF.REG SET.IN @#IFLAG THEN
      LET @#LCADDR := @#LCADDR OFF.BY #^C<17> SET.BY #R0.SAV
    END

    LET  R4 := #CR
    CALL TVOUT

    LET @#LASHOW := @#LCADDR
    LET @#HASHOW := @#HCADDR

    IF #IF.REG SET.IN @#IFLAG THEN
      LET  R4 := #'R
      CALL TVOUT

      LET  @#WSHOW := @#WSHOW R.SHIFT 1 OFF.BY #^C<7> + #'0
      LET  R4       := @#WSHOW
      CALL TVOUT
    ELSE
      CALL SHADDR
    END

    LET R4 := #'/

    .IIF NE .-L05374 .ERROR ; PROC L05374 must be next
  END L05242

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L05374
  BEGIN
    CALL TVOUT
    LET R5 := @#LCADDR

    IF #IF.RFD!002000 OFF.IN @#IFLAG THEN
      CALL L13500
    END

    LET	 @#WSHOW := (R5)
    CALL SHWRD
    LET  R4 := #SPACE
    CALL TVOUT
    LET  @#IADDR+2 :=  #0
    LET  @#IADDR   :=  #0
    LET  @#IFLAG   :B= #1
    LET  @#IFLAG   :=  @#IFLAG OFF.BY #IF.NUM

    RETURN
  END L05374

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L05466
  BEGIN
    LET R5 := @#LCADDR
    IF #IF.RFD!002000 OFF.IN @#IFLAG THEN
      CALL L13500
    END

    LET (R5) := @#IADDR+2

    RETURN
  END L05466

  ..............................................................................
  ;
  ;  T
  ;
  PROCEDURE TCMD
  BEGIN
    IF R4 NE #'T THEN
      JUMPTO L04324
    END

    CALL TVOUT
    CALL KBIN
    CALL TVOUT

    IF #'0 LE R4 AND #'6 GE R4 THEN

      LET R4 := R4 - #'0

      IF RESULT IS EQ THEN
        JUMPTO TEST0
      END

      LET @#HV162 := #0

      IF #6 EQ R4 THEN
        CALL L12626
        LET  @#U.PC := #L10416
	RESET
	RTI
      END

      ; ELSIF  ,   ,    - ,       IF ELSE

      IF #1 EQ R4 THEN
        CALL TEST1
      ELSE
        IF #2 EQ R4 THEN
          CALL TEST2
        ELSE
          IF #3 EQ R4 THEN
            CALL TEST3
          ELSE
            IF #4 EQ R4 THEN
              CALL TEST4
            ELSE ; #5 EQ R4 THEN
              CALL TEST5
            END
          END
        END
      END

    END

    JUMPTO GETCMD
  END TCMD

EDVDRV:

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE ENTRYP
  BEGIN
    LET	@#SP.SAV := SP

    LET @#IV4   := #137
    LET @#IV4+2 := #SETV4F

    LET @#R0.SAV := R0
    LET @#R1.SAV := R1
    LET @#R2.SAV := R2
    LET @#R3.SAV := R3
    LET @#R4.SAV := R4
    LET @#R5.SAV := R5

    LET @#SU.PC  := @#U.PC
    LET @#LCADDR := @#U.PC
    LET @#SU.PSW := @#U.PSW
    LET @#HCADDR := #0

    .IIF NE .-L06006 .ERROR ; PROC L06006 must be next
  END ENTRYP

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L06006
  BEGIN
    IF @#PWRUP EQ #123456 THEN
      CALL   L13316
      JUMPTO L02152
    END

    ;          :)

    LOOP
      IF @#TSTMOD EQ #TVKBC THEN	;     ?

        IF @#HV002 NE #0 THEN
          LET  @#HV002 := #0
          LET  @#HV154 := R2
          CALL TEST4			; T4
        END

        LET  @#HV160 := @#HV160 + #1
        LET  @#HV156 := #0
        CALL L12556
        LET  @#PWRUP := #0		;   

        JUMPTO TEST0			; T0     
      END

      IF @#TSTMOD EQ #TVKBNC THEN	;      ?

        LET @#PWRUP := #123456		; ,  

        JUMPTO TEST0			;   T0   
      END

      ;    ,  -  

      CALL CLUPBC
      LET @#HV154 := #0
      LET @#HV160 := #0
      LET @#HV002 := #0

    END
  END L06006

  ..............................................................................
  ;
  ; T0
  ;
  PROCEDURE TEST0
  BEGIN

    LET @#HV162 := #0
    CALL TEST1

    LET  @#HV162 := #0
    CALL TEST2

    LET  @#HV162 := #0
    CALL TEST3

    IF  #TVKBNC EQ @#TSTMOD THEN	;     
      RESET
      CALL L12626
      LET  @#U.PC := #CMEMSZ
      RTI
    END

    RESET
    CALL L12626
    LET  @#U.PC := #L10416
    LET  @#HV002 := #1
    RTI
  END TEST0

  ..............................................................................
  ;
  ; T1
  ;
  PROCEDURE TEST1
  BEGIN
    REPEAT
      CALL SHASTR
      LET  R0 := @#L13776	;   
      LET  R1 := #0		;   
      LET  R2 := #0		;      
      LET  R3 := #L13774	;      

      REPEAT
        LET R2 := R2 + (R1)+ + CARRY
      UNTIL R1 HI R3

      IF R0 EQ R2 LEAVE LOOP
      LET  R3 := #E.ROM	;  

      CALL L13406

    UNTIL #7 LE @#HV162

    RETURN
  END TEST1

  ..............................................................................
  ;
  ; T2
  ;
  PROCEDURE TEST2
  BEGIN
    CALL SHASTR
    MOV  #WRAM,R0

    LOOP

      LET R4 := R0
      LET R1 := (R0)

        LET  (R0) := R4

        IFB R4 NE (R0)+ GOTO 30$

        SWAB R4

        IFB R4 NE (R0) GOTO 30$

        LET R0 := R0 - #1
        SWAB R4
        COM  R4

        LET  (R0)+ :B= R4
        SWAB R4
        LET  (R0)+ :B= R4
        SWAB R4

        IF R4 NE -(R0) GOTO 30$

      LET (R0)+ := R1 

    20$:

      IF R0 GE #WRAM+^O<776> GOTO 40$
    END

  30$:

    LET  (R0)+ := R1
    LET  R3 := #E.SRAM	;  
    CALL L13406

    IF #7 GT @#HV162 GOTO 20$

  40$:

    RETURN
  END TEST2

  ..............................................................................
  ;
  ; T3
  ;
  PROCEDURE TEST3
  BEGIN
    REPEAT
      LET  @#IV4+2 := #L06510

      CALL SHASTR

      LET  @#PARH2 := #177600	; 17 760 000 Map to IO Page

      TST  @#N$WNDW
      LET  R3 := #E.V4	;   4
      CALL L13406

    UNTIL #7 LE @#HV162

    JUMPTO L06006
  END TEST3

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L06510
  BEGIN
    LET @#IV4+2 := #SETV4F

    RETURN
  END L06510

  ..............................................................................
  ;
  ; T4
  ;
  PROCEDURE TEST4
  BEGIN
    CALL SHASTR
    LET  @#IV4+2 := #L06642
    LET  R2      := #MEDG

    THRU R1 := #MEDG.L

      LET @#LCADDR := 0
      LET R0       := (R2) SHIFT #66 OFF.BY #^C<77>
      LET @#HCADDR := R0

      LET @#PARH2  := (R2)+
      LET @#N$WNDW := #0
    END

    LET @#LCADDR := #160000
    LET @#HCADDR := #77
    TST (R2)+

    LET  @#PARH2  := #177600		; Map to IO Page
    LET  @#N$WNDW := #0
    LET  R3       := #E.ERAM	;    
    CALL L13406

    JUMPTO SETSV4
  END TEST4

  ..............................................................................
  ;
  ;   ?
  ;
  PROCEDURE L06642
  BEGIN
    LET @#IV4+2 := #MP1V4

    LET R2 := R2 - #2 - #MEDG
    LET R1 := #MSIZES
    LET R3 := R2
    LET R2 := R2 L.SHIFT 1 + R3
    LET R4 := R2 R.SHIFT 2

    IF #4 LE R4 THEN
      LET R4 := #4
    END

    LET C.BIT   := OFF
    LET R4      := R4 SHIFT #4
    LET @#HV050 := R4
    LET R1      := R1 + R2

    LET R0 := #MSIZ

    THRU R2 := #MSIZ.L
      REPEAT
      UNTILB @#TPS MI #0
      LET @#TPB :B= (R0)+
    END

    THRU R2 := #6
      REPEAT
      UNTILB @#TPS MI #0
      LET @#TPB :B= (R1)+
    END

    LET  @#HV032 := @#LCADDR
    LET  @#HV030 := @#HCADDR
    CALL L13062
    LET  @#HV052 := #0

    $SHMESS MFW

    LOOP

      THRU R4 := #10

        LET R0 := #10000

        IF #3 EQ @#TKB THEN
          JUMPTO SETSV4
        END

        CALL L13232

        THRU R0
          CALL L13500

          LET @R5 := @#LCADDR + @#HV164

MP1V4R:		;      V4    ( 7 ?)

          LET @#LCADDR := @#LCADDR + #2
          LET @#HCADDR := @#HCADDR + CARRY

        END

        IF @#HCADDR EQ @#HV030 AND @#LCADDR EQ @#HV032 GOTO L07144

      END

      LET @#HV164 := @#HV164 + #2000

    END

L07144:		;     

    LET  @#IV4+2 := #MP2V4
    CALL L13062

    $SHMESS MRBW

    LOOP

      THRU R4 := #10

        LET R0 := #10000

        IF #3 EQ @#TKB THEN
          JUMPTO SETSV4
        END

        CALL L13232

        THRU R0
          CALL L13500
          LET  @#IADDR+2 :=  @#LCADDR + @#HV164
          LET  @#IADDR   :B= (R5)+
          SWAB @#IADDR
          LET  @#IADDR   :B= (R5)

          SWAB @#IADDR

          IF @#IADDR+2 NE @#IADDR THEN
            CALL L12750
          AND #7 LE @#HV162 THEN
            JUMPTO SETSV4
          END

          CALL L13500
          LET @#IADDR+2 :=  NOT @#IADDR+2
          LET (R5)+     :B= @#IADDR+2
          SWAB          @#IADDR+2
          LET (R5)      :B= @#IADDR+2

MP2V4R:		;      V4    ( 7 ?)

          LET @#LCADDR := @#LCADDR + #2
          LET @#HCADDR := @#HCADDR + CARRY

        END

        IF @#HCADDR EQ @#HV030 AND @#LCADDR EQ @#HV032 GOTO L07404

      END

      LET @#HV164 := @#HV164 + #2000

    END

L07404:		;     

    LET  @#IV4+2 := #MP3V4
    CALL L13062

    $SHMESS MBR

    LOOP

      THRU R4 := #10

        LET R0 := #10000

        IF #3 EQ @#TKB THEN
          JUMPTO SETSV4
        END

        CALL L13232

        THRU R0

          CALL L13500
          LET @#IADDR+2 := @#LCADDR + @#HV164
          LET @#IADDR+2 := NOT @#IADDR+2
          LET @#IADDR   := @R5
          LET @R5       := #0

          IF 	@#IADDR+2 NE @#IADDR THEN
            CALL L12750
          AND #7 LE @#HV162 THEN
            GOTO SETSV4
          END

MP3V4R:		;      V4    ( 7 ?)

          LET @#LCADDR := @#LCADDR + #2
          LET @#HCADDR := @#HCADDR + CARRY

        END

        IF @#HCADDR EQ @#HV030 AND @#LCADDR EQ @#HV032 GOTO SETSV4	;     

      END

      LET @#HV164 := @#HV164 + #2000
    END

  END L06642

  ..............................................................................
  ;
  ;      (?)
  ;
  PROCEDURE L07610
  BEGIN
    LET @#HASHOW := @#HCADDR
    LET @#LASHOW := @#LCADDR
    LET R3       := #E.ARAM	;   
    CALL L13406

    CALL SHADDR

    RETURN
  END L07610

  ..............................................................................
  ;
  ;   -   ->   V4
  ;
  PROCEDURE MP1V4
  BEGIN
    CALL L07610
    IF #7 LE @#HV162 GOTO SETSV4

    JUMPTO MP1V4R
  END MP1V4

  ..............................................................................
  ;
  ;   -     ->   V4
  ;
  PROCEDURE MP2V4
  BEGIN
    CALL L07610
    IF #7 LE @#HV162 GOTO SETSV4

    JUMPTO MP2V4R
  END MP2V4

  ..............................................................................
  ;
  ;   -    ->   V4
  ;
  PROCEDURE MP3V4
  BEGIN
    CALL L07610
    IF #7 LE @#HV162 GOTO SETSV4

    JUMPTO MP3V4R
   END MP3V4

  ..............................................................................
  ;
  ;      V4
  ;
  PROCEDURE SETSV4
  BEGIN
    LET @#IV4+2 := #SETV4F

    RETURN
  END SETSV4

  ..............................................................................
  ;
  ;   
  ;
  PROCEDURE CMEMSZ
  BEGIN
    LET @#V.LTC+2 := #30000+PR7
    LET @#V.LTC   := #TMROFF

    LET R3 := #10000
    MTPS #0

    THRU R3
    END

    LET @#SSR3 := #MM3.22
    LET @#SSR0 := #MM0.EN

    LET @#NR024 := #0

    LET @#NR016 := R1
    LET @#NR020 := R2

    LET @#V.TR4   := #L10100
    LET @#V.TR4+2 := #PR7

    LET R2 := #MEDG
    LET R1 := #MEDG.L
    MTPS #0

    THRU R1
      LET @#KISAR1 := (R2)+
      LET @#20000 := #0
    END

    LET  @#KISAR1 := #177600
    TST  (R2)+
    LET  @#20000 := #0

    LET  R3 := #E.ERAM	;    
    CALL L13434

    BR L10416
  END CMEMSZ

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L10100
  BEGIN
    LET @SP := #L10106
    RTI
  END L10100

  ..............................................................................
  ;
  ;
  ;
  PROCEDIRE L10106
  BEGIN
    LET  @#V.TR4 := #L10256

    LET  @#NR022 := #200
    LET  @#NR012 := @#KISAR1

    CALL SHASTR

    LET R2 := R2 - #2 - #MEDG
    LET R1 := #MSIZES
    LET R3 := R2
    LET R2 := R2 L.SHIFT 1 + R3
    LET R1 := R1 + R2

    LET R0 := #MSIZ
    LET R2 := #MSIZ.L

    THRU R2
      REPEAT
      UNTILB @#TPS MI #0
      LET @#TPB :B= (R0)+
    END

    THRU R2 := #6
      REPEAT
      UNTILB @#TPS MI #0
        LET @#TPB :B= (R1)+
      END

    LOOP
      LET @#KISAR1 := @#NR022
      LET @#NR022  := @#NR022 + #200
      LET R0 := #10000
      LET R1 := #20000

  L10250:

      THRU R0
        LET (R1)+ := #0
      END
    END

  END L10106

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L10256
  BEGIN
    LET	@#NR014 := R0
    LET @#NR010 := R1

    IF R1 EQ #20000 THEN

      LET R0 := @#KISAR1 OFF.BY #^O<170000>

      IF RESULT IS EQ GOTO 20$

    END

    LET R4 := R4 C.SHIFT #72 + R2
    LET R3 := R3 + CARRY
    LET  @#HASHOW := R3
    LET  @#LASHOW := R4

    LET  R3 := #E.ARAM	;   
    CALL L13434

    CALL SHADDR

    LET @#LASHOW := #0
    LET @#HASHOW := #0

    IF #7 LE @#NR024 GOTO 20$

    LET R1 := @#NR010
    LET R0 := @#NR014 - #1

    LET @SP := #L10250
    RTI

  20$:

     LET SP := SP + #4
     LET R1 := @#NR016
     LET R2 := @#NR020

    .IIF NE .-L10416 .ERROR ; PROC L10416 must be next
  END L10256

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L10416
  BEGIN
    MTPS #PR7
    LET  @#NR024 := #0
    LET  @#NR016 := R1
    LET  @#NR020 := R2

    CALL SHASTR

    LET  @#V.LTC+2 := #PR7
    LET  @#V.LTC   := #TMROFF

    LET  @#V.TR4   := #EMMUV4
    LET  @#V.TR4+2 := #PR7

    LET  @#V.MMU   := #EMMUI
    LET  @#V.MMU+2 := #PR7

    LET  R0        := #77406	; <^D<127>*^O<400>&P.LNM!P.RW>?	;   , -

    LET  R3        := #177000

    MTPS #0

    THRU R3
    END

    LET  @#SSR3   := #MM3.22	; 22 
    LET  @#SSR0   := #MM0.EN	;  

    LET  @#KISAR3 := #600	;  60000
    LET  @#UISAR0 := #0		;  0

    LET  @#UISAR1 := #600	;  20000

    LET  @#UISAR7 := #177600	;  /

    LET  PS       := #140000+PR7	;   User,   Kernel,  7

    LET  @#20000  := R0		; 

    LET  @#V.TR4  := #L10620
    MTPS #0
    LET  @#160000 := #0

    GOTO ENV4
  END L10416

  ..............................................................................
  ;
  ;    
  ;    
  ;
  PROCEDURE L10620
  BEGIN
    LET R0 := R0 - @#60000	;   User  -      Kernel 

    IF RESULT IS NE GOTO EMMU	;   -    

    LET @#V.TPS   := #L10670
    LET @#V.TPS+2 := #PR7

    LET @#TPS := @#TPS SET.BY #100
    TST @#TPB

    LET  R3 := #177000
    MTPS #0

    THRU R3
    END

    GOTO ENTTY
  END L10620

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L10670
  BEGIN
    TST @#TPB
    LET @#TPS   := #0

    LET @#NS000 := #44444

    LET @#776   := #0

    JUMPTO @#776
  END L10670

  ..............................................................................
  ;
  ;    4   
  ;
  PROCEDURE EMMUV4
  BEGIN
    LET  R3 := #E.MMU4

    GOTO L10752
  END EMMUV4

  ..............................................................................
  ;
  ;    250   
  ;
  PROCEDURE EMMUI
  BEGIN
    LET  R3 := #E.MMUI

    GOTO L10752
  END EMMUI

  ..............................................................................
  ;
  ;  -    
  ;
  PROCEDURE ENTTY
  BEGIN
    LET  R3 := #E.NTTY

    GOTO L10752
  END ENTTY

  ..............................................................................
  ;
  ;   
  ;
  PROCEDURE EMMU
  BEGIN
    LET  R3 := #E.MMU

    GOTO L10752
  END EMMU

  ..............................................................................
  ;
  ;  -     4
  ;
  PROCEDURE ENV4
  BEGIN
    LET  R3 := #E.NV4

    .IIF NE .-L10752 .ERROR ; PROC L10752 must be next
  END ENV4

  ..............................................................................
  ;
  ; R3 -  
  ;
  PROCEDURE L10752
  BEGIN
    CALL L13434
    CALL SHASTR
    LET  @#NS000 := #44444

    HALT
  END L10752

  ..............................................................................
  ;
  ; ", ,  :)
  ;
  PROCEDURE TMROFF
  BEGIN
    LET	 R3 := #E.TMR	;  
    CALL L13434

    MTPS #PR7

    HALT
  END TMROFF

  ..............................................................................
  ;
  ; T5
  ;
  PROCEDURE TEST5
  BEGIN
    CALL SHASTR
    LET  @#IV4+2 := #NODEV

    CALL TVNLN

    LET  R0 := #LF
    CALL LPOUT
    LET  R0 := #RUS
    CALL LPOUT

    CALL L11230
    CALL TVNLN

    LET  R0 := #LF
    CALL LPOUT
    LET  R0 := #LAT
    CALL LPOUT

    CALL L11230

    LET  R0 := #LF
    CALL LPOUT

    ; LET  R0 := #LPGD
    ; LET  R4 := #26
    ; CALL SHSTR
    $SHMESS LPGD

												.IF NDF W$CERR
      .=.-6			;   (?) ROM
      .WORD 26			;   24 ,   26
      .=.+4
												.ENDC

    CALL TVNLN

  10$:

    LET R2 := #0
    LET R0 := #LF

    LOOP
      CALL LPOUT

      IF #LF NE R0 AND #CR NE R0 THEN
        LET R2 := R2 + #1

        IF #^D<80> LE R2 GOTO 10$
      END

      REPEAT
      UNTILB @#TKS MI #0

      LET R0 := @#TKB

      IFB #CTRLC EQ R0 LEAVE LOOP
      IF  #LF    EQ R0 GOTO 10$      

    END

    LET @#IV4+2 := #SETV4F

    RETURN
  END TEST5

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L11230
  BEGIN
    LET R1 := #'~-'0+1	;   0  ~
    LET R0 := #'0	;  0

    THRU R1
      CALL LPOUT
      LET R0 := R0 + #1
    END

    RETURN
  END L11230

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE LPOUT
  BEGIN
    LET R3 := #0

    THRU R5 := #10
      THRU R3
        IFB @#LPS MI #0 GOTO 20$
      END
    END

    $SHMESS NOLP

    LET SP      := #U.PC
    LET @#IV4+2 := #SETV4F
    JUMPTO GETCMD

  20$:

    LET @#LPB := R0

    REPEAT
    UNTILB @#TPS MI #0

    LET @#TPB :B= R0

    RETURN
  END LPOUT

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE TVNLN
  BEGIN
    LET  R4 := #LF
    CALL TVOUT
    LET  R4 := #CR
    CALL TVOUT

    RETURN
  END TVNLN

  ..............................................................................
  ;
  ; R1 - ??
  ; R2 - ??
  ; R3 -  
  ;
  PROCEDURE SHTERR
  BEGIN
    IF #1122 NE R1 THEN
      INC R2
      IF R2 LT #7 GOTO 50$
      WAIT
    END

    LET R5 := #ERRORS

    LOOP
      DEC R3
      IF RESULT IS EQ LEAVE LOOP
      LET R5 := R5 + #ERMT.L
    END

    THRU R3 := #ERMT.L
      REPEAT
      UNTILB @#TPS MI #0
      LET @#TPB :B= (R5)+
    END

  50$:

    RETURN
  END SHTERR

  ERRORS:

    $ERMST  E.ROM,  <<CR><LF><RUS>/o[ibka   pzu/<LAT>/                />	;  1
    $ERMST  E.SRAM, <<CR><LF><RUS>/o[ibka  sozu/<LAT>/                />	;  2
    $ERMST  E.V4,   <<CR><LF><RUS>/o[ibka  wektora  4/<LAT>/          />	;  3
    $ERMST  E.ARAM, <<CR><LF><RUS>/o[ibka dostupa ozu/<LAT>/          />	;  4
    $ERMST  E.RAM,  <<CR><LF><RUS>/o[ibka  ozu /<LAT>/                />	;  5
    $ERMST  E.MMU4, <<CR><LF><RUS>/wektor 4 pri rabote dp/<LAT>/      />	;  6
    $ERMST  E.MMUI, <<CR><LF><RUS>/wektor 250 pri rabote dp/<LAT>/    />	;  7
    $ERMST  E.NTTY, <<CR><LF><RUS>/net prerywaniq ot terminala /<LAT>>		; 10
    $ERMST  E.MMU,  <<CR><LF><RUS>/o[ibka dispet^era pamqti/<LAT>/    />	; 11
    $ERMST  E.NV4,  <<CR><LF><RUS>/net prerywaniq po wektoru 4/<LAT>/ />	; 12
    $ERMST  E.TMR,  <<CR><LF><RUS>/wykl@^itx tajmer/<LAT>/            />	; 13
    $ERMST  E.ERAM, <<CR><LF><RUS>/ne opredelena granica ozu /<LAT>/  />	; 14

    $MESSL MSIZ, </  /<RUS>/dostupnoe  ozu  - /<LAT>>

    $MESSL NOLP, <<CR><LF><RUS>/pe~atx ne gotowa/<LAT>>
    $MESSL MFW,  <<CR><LF><RUS>/idet prqmaq zapisx/<LAT>>
    $MESSL MRBW, <<CR><LF><RUS>/idet ~tenie i obratnaq zapisx /<LAT>>
    $MESSL MBR,  <<CR><LF><RUS>/idet ~tenie obratnoj zapisi/<LAT>/ />
    $MESSL LPGD, <<CR><LF><RUS>/pe~atx prowerena/<LAT>>

  ..............................................................................
  ;
  ;  -       
  ;
  ;  TSTMOD - TVKBNC -  
  ;               TVKBC  - 
  ;
  PROCEDURE CLUPBC
  BEGIN

    THRU R2 := #0
      TSTB @#TPS			;   ?
      IF RESULT IS MI LEAVE LOOP	; MI,  
    END					;  

    LET @#TPB := #ASTER			;   *

    THRU R2 := #0			;
      TSTB  @#TKS			;   ?
      BMI   50$				; MI,  
    END					;  

  40$:
    LET @#TSTMOD := #TVKBNC		;     
    BR  60$

  50$:
    CMP #ASTER,@#TKB			;  * ?
    BNE 40$				; 

    LET @#TSTMOD := #TVKBC		;     

  60$:

    RETURN
  END CLUPBC

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE L12556
  BEGIN
    IF  #TVKBNC NE @#TSTMOD THEN

      IF @#HV160 GE #20
        LET @#HV160 := #1
      END

      LET R2 := @#HV156 + @#HV160 + @#HV050

      LET @#LPB := R2
    END

    RETURN
  END L12556

  ..............................................................................
  ;
  ; T6 ?
  ;

  PROCEDURE L12626
  BEGIN
    LET R5 := #N$WNDW
    LET R1 := #0

    LET R2 := #<N$WNDW+^O<NWRAM1>-N$WNDW>/2

    LET @#PARH2 := #0

    THRU R2
      LET (R5)+ := (R1)+
    END

    LET @#N$WNDW           := #0
    LET @#N$WNDW+^O<NS000> := #0
    LET @#U.PSW            := #0

    LET SP                 := #SPTOP

    LET R1                 := @#TSTMOD
    LET R2                 := @#HV154

    LET @#KISAR0           := #0
    LET @#KISAR7           := #177600

    LET R0 := #^D<8>
    LET R3 := #KISDR0

    THRU R0
      LET (R3)+ := #<^D<127>*^O<400>&P.LNM!P.RW>	;   , -
    END

    LET R0 := #^D<8>
    LET R3 := #UISDR0

    THRU R0
      LET (R3)+ := #<^D<127>*^O<400>&P.LNM!P.RW>	;   , -
    END	

    RETURN
  END L12626

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE L12750
  BEGIN
    LET @#TMP.S1 := R0
    LET @#TMP.S2 := R4

      LET  @#LASHOW := @#LCADDR
      LET  @#HASHOW := @#HCADDR
      LET  R3       := #E.RAM	;  
      CALL L13406

      CALL SHADDR

      LET  R4 := #'/
      CALL TVOUT

      LET  @#WSHOW := @#IADDR
      CALL SHWRD
      CALL SHSPCE

      LET  @#WSHOW := @#IADDR+2
      CALL SHWRD

    LET  R0 := @#TMP.S1
    LET  R4 := @#TMP.S2

    RETURN
  END L12750

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE L13062
  BEGIN
    LET @#LCADDR := #0
    LET @#HCADDR := #0
    LET @#HV164  := #0
    LET @#PARH2  := #0

    RETURN
  END L13062

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE SHASTR
  BEGIN
    REPEAT
    UNTILB @#TPS MI #0
    LET @#TPB := #ASTER

    RETURN
  END SHASTR

  ..............................................................................
  ;
  ;      (  ?)
  ;

  PROCEDURE MVCRSB
  BEGIN
    CALL SCTRLW		; Ctrl/W
    CALL SHOWBS		; BS

    RETURN
  END MVCRSB

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE SCTRLW
  BEGIN
    REPEAT
    UNTILB @#TPS MI #0
    LET @#TPB := #CTRLW

    RETURN
  END SCTRLW

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE SHOWBS
  BEGIN
    REPEAT
    UNTILB @#TPS MI #0
    LET @#TPB := #BS

    RETURN
  END SHOWBS

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE L13170
  BEGIN
    IF @#HV052 EQ #0 THEN
      INC  @#HV052
      CALL SCTRLW
    END
    CALL SHOWBS

    RETURN
  END L13170

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE SHSPCE
  BEGIN
    REPEAT
    UNTILB @#TPS MI #0
    LET @#TPB := #SPACE

    RETURN
  END SHSPCE

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE L13232
  BEGIN
    IF @#HV170 NE #0 THEN
      LET  @#HV170 := #0
      CALL SHASTR
      CALL L13170
      LET  @#HV156 := #0
      CALL L12556
    ELSE
      INC  @#HV170
      CALL SHSPCE
      CALL L13170
      LET  @#HV156 := #200
      CALL L12556
    END

    RETURN
  END L13232

  ..............................................................................
  ;
  ;
  ;

  PROCEDURE L13316
  BEGIN
    CLR @#PARH2				;     

    IF #44444 EQ @#N$WNDW+NS000 THEN	; @#NS000 (@#15000)   

      LET @#PARH2 := #600		; 60000
      LET @#HV154 := R2

      IF @#N$WNDW NE #077406 THEN	; <^D<127>*^O<400>&P.LNM!P.RW>	;   , - ?
        LET  R3 := #E.MMU	;   
        CALL L13406
      END

      LET R0      := #N$WNDW
      LET @#PARH2 := #0

      THRU R1 := #<N$WNDW+20000-N$WNDW>/2
        LET (R0)+ := #0
      END

    END

    RETURN
  END L13316

  ..............................................................................
  ;
  ; R3 -  
  ;
  PROCEDURE L13406
  BEGIN
    LET  R1 := @#TSTMOD
    LET  R2 := @#HV154

    CALL SHTERR

    LET  @#HV154 := R2
    LET  @#HV162 := @#HV162 + #1

    RETURN
  END L13406

  ..............................................................................
  ;
  ; R3 -  
  ;
  PROCEDURE L13434
  BEGIN
    LET  R1 := @#NR016
    LET  R2 := @#NR020

    CALL SHTERR

    LET  @#NR020 := R2
    LET  @#NR024 := @#NR024 + #1

    RETURN
  END L13434

  ..............................................................................
  ;
  ; Show string at R0 length R4
  ;
  PROCEDURE SHSTR
  BEGIN
    THRU R4

      REPEAT
      UNTILB @#TPS MI #0

      LET @#TPB :B= (R0)+

    END
    RETURN
  END SHSTR

  ..............................................................................
  ;
  ;
  ;
  PROCEDURE L13500
  BEGIN
    LET R5 := @#LCADDR

    LET R3 := R5
    LET R5 := R5 OFF.BY #^C<17777> SET.BY #N$WNDW

    LET @#TMP.S3 := R2

      LET  R2 := @#HCADDR C.SHIFT #72
      LET  R3 := R3 OFF.BY #177

      LET  @#PARH2 := R3

    LET  R2 := @#TMP.S3

    RETURN
  END L13500

MEDG:
	.WORD	010000	;<000><020>
	.WORD	020000	;<000>' '
	.WORD	030000	;<000>'0'
	.WORD	040000	;<000>'@'
	.WORD	050000	;<000>'P'
	.WORD	060000	;<000><140>
	.WORD	070000	;<000>''
	.WORD	100000	;<000><200>
	.WORD	110000	;<000><220>
	.WORD	120000	;<000><240>
	.WORD	130000	;<000><260>
	.WORD	140000	;<000><300>
	.WORD	150000	;<000><320>
	.WORD	160000	;<000><340>
	.WORD	170000	;<000><360>
MEDG.L =: <.-MEDG>/2

MSIZES:
	.ASCII	/256 K /
	.ASCII	/512 K /
	.ASCII	/768 K /
	.ASCII	/  1 M /
	.ASCII	/1,2 M /
	.ASCII  /1,5 M /
	.ASCII  /1,7 M /
	.ASCII  /  2 M /
	.ASCII  /2,2 M /
	.ASCII  /2,5 M /
	.ASCII  /2,7 M /
	.ASCII  /  3 M /
	.ASCII  /3,2 M /
	.ASCII  /3,5 M /
	.ASCII  /3,7 M /
	.ASCII  /  4 M /

.IIF GT .+4-ROMEND    .ERROR	;   !!

	.=ROMEND-4

L13774:	.WORD	000000

L13776:
	.WORD	140166	;  ROM

.IIF NE .-ROMEND    .ERROR	;   !!

.INCLUDE /134WA.MAC/

END 134ROM

.END
