;MEMEDT.M68
;Memory Module Editor
;David F. Pallmann

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       LF=12
       CR=15

       .OFINI
       .OFDEF  MODULE,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   MODULE(A5),LIT          ;load DDB w/module spec
       INIT    MODULE(A5)              ;load driver, allocate buffer
       FETCH   MODULE(A5),A4           ;srch/fetch module, A4 is base
       JNE     NOTFND                  ; not found

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

INIT:   CLR     D5

DUMP:   CALL    OCTAL

DEVICE: DEPACK  MODULE+D.FIL(A5)
       DEPACK
       TYPE    .
       DEPACK  MODULE+D.EXT(A5)
       TYPESP  :

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

NOTFND: TYPESP  ?
       PFILE   MODULE(A5)
       TYPECR  < not found>

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