;DSKEDT.M68
;Disk Editor
;David F. Pallmann

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       LF=12
       CR=15

       .OFINI
       .OFDEF  DISK,D.DDB
       .OFSIZ  MEMSIZ

DEFINE  DEPACK  ADDR
       IF      NB,ADDR,LEA A1,ADDR
       SUB     #4,SP
       MOV     SP,A2
       UNPACK
       CLRB    @A2
       TTYL    @SP
       ADD     #4,SP
       ENDM

START:  PHDR    -1,0,PH$REE!PH$REU!PH$OPR;program header
       GETIMP  MEMSIZ,A5               ;allocate local memory

GETDEV: BYP                             ;bypass leading white space
       FSPEC   DISK(A5)                ;load DDB w/device spec
       INIT    DISK(A5)                ;load driver, allocate buffer
       ORB     #D$ERC,DISK+D.FLG(A5)   ;flag DDB to trap errors
       BYP                             ;bypass white space

GETBLK: GTOCT                           ;get block number
       MOV     D1,DISK+D.REC(A5)       ;set record number
       READ    DISK(A5)                ;read block

SETFLG: JOBIDX  A0
       ORW     #J.CCA,JOBTYP(A0)
       MOV     JOBTRM(A0),A1
       ORW     #T$ILC,T.STS(A1)

INIT:   MOV     DISK+D.BUF(A5),A4
       CLR     D5

DUMP:   CALL    OCTAL

DEVICE: DEPACK  DISK+D.DEV(A5)
       MOVW    DISK+D.DRV(A5),D1
       DCVT    0,OT$TRM
       TYPESP  :

BLOCK:  TYPESP  Block
       MOV     DISK+D.REC(A5),D1
       OCVT    0,OT$TRM!OT$TSP

ADDR:   CALL    OCTAL
       MOV     D5,D1
       OCVT    3,OT$TRM!OT$ZER
       TTYI
       ASCIZ   "/ "
       EVEN

CALC:   MOV     A4,A3
       ADD     D5,A3

DUMP.O: CALL    OCTAL
       MOVW    @A3,D1
       OCVT    6,OT$TRM!OT$TSP

DUMP.D: MOVW    @A3,D1
       DCVT    5,OT$TRM!OT$ZER
       TYPESP  .

DUMP.H: TYPE    $
       CALL    HEX
       MOVW    @A3,D1
       OCVT    4,OT$TRM!OT$TSP

DUMP.A: TYPE    "
       MOVB    @A3,D1
       CALL    PRINT
       MOVB    1(A3),D1
       CALL    PRINT
       TYPESP

DUMP.R: TYPE    [
       DEPACK  @A3
       TYPESP  ]

PROMPT: TYPESP  ?
       KBD     EXIT

       NUM
       BEQ     GETNUM

       CMPB    @A2,#LF
       JEQ     NXTADR
       CMPB    @A2,#CR
       JEQ     NXTADR

       CMPB    @A2,#'[
       JEQ     GETR50

       CMPB    @A2,#'"
       JEQ     GETASC

       CMPB    @A2,#'$
       JEQ     GETHEX

       CMPB    @A2,#'W
       JEQ     WRITE
       CMPB    @A2,#'w
       JEQ     WRITE

       CMPB    @A2,#'R
       JEQ     READ
       CMPB    @A2,#'r
       JEQ     READ

ERROR:  TTYI
       BYTE    7,0
       JMP     DUMP

GETNUM: MOV     A2,A1
       GTDEC
       CMPB    @A2,#CR
       BEQ     CHGOCT
       CMPB    @A2,#'.
       BEQ     CHGDEC
       CMPB    @A2,#'/
       BEQ     SETADR
       JMP     ERROR

CHGOCT: CALL    OCTAL
       MOV     A1,A2
       GTOCT
       MOVW    D1,@A3
       JMP     NXTADR

CHGDEC: MOVW    D1,@A3
       JMP     NXTADR

GETHEX: INC     A2
       CALL    HEX
       GTOCT
       CMPB    @A2,#'/
       BEQ     HEXADR
       MOVW    D1,@A3
       JMP     NXTADR

HEXADR: MOV     D1,D5
       CRLF
       JMP     DUMP

SETADR: CALL    OCTAL
       MOV     A1,A2
       GTOCT
       MOV     D1,D5
       CRLF
       JMP     DUMP

NXTADR: MOVB    #CR,D1
       TTY
       ADD     #2,D5
       CMPW    D5,#512.
       BLT     10$
       CLR     D5
10$:    JMP     DUMP

GETR50: INC     A2
       MOV     A3,A1
       PACK
       JMP     NXTADR

GETASC: INC     A2
       MOVB    (A2)+,(A3)+
       MOVB    (A2)+,(A3)+
       JMP     NXTADR

READ:   READ    DISK(A5)
       CLR     D5
       JMP     DUMP

WRITE:  WRITE   DISK(A5)

EXIT:   CALL    OCTAL
       CRLF
       EXIT

OCTAL:  JOBIDX  A0
       ANDW    #^C<J.HEX>,JOBTYP(A0)
       RTN

HEX:    JOBIDX  A0
       ORW     #J.HEX,JOBTYP(A0)
       RTN

PRINT:  CMPB    D1,#40
       BLT     10$
       CMPB    D1,#125.
       BGT     10$
       TTY
       RTN
10$:    TYPE    .
       RTN

       END