                         ;REF. NO. F8
                         ;PROGRAM TITLE OCTAL DEBUGGING PROGRAM CODT
                         ;               FOR THE MCS-80 COMPUTER
                         ;
                         ;
                         ;
                         ;
                         ;ODT PROGRAM FOR THE MCS-80
                         ;

                           ;***********AUTHOR EUGENE R FISHER***********
                           ;4-20-74
         ORG 0
TTY EQU 2
SND EQU 6
FLAG EQU 3
;;
ERROR\    LXI SP,37777Q    ;SET STACK POINTER,PAGE77,LOC 377
          MVI A,277Q       ;SEND A ?
          JMP ERR
          JMP 4010Q         ;FIRST RESTART LOCATION
          NOP
          NOP
          NOP
          NOP
          NOP
          JMP 4020Q
          NOP
          NOP
          NOP
          NOP
          NOP
          JMP 4030Q
          NOP
          NOP
          NOP
          NOP
          NOP
          JMP 4040Q
          NOP
          NOP
          NOP
          NOP
          NOP
          JMP 4050Q
          NOP
 PER\    MOV C,L           ;ROUTINE TO MAKE PERIOD CURRENT LOCATION
         JMP NEXTC
 SEND\   JMP SEN           ;ENTRY POINT TO SEND ROUTINE
 GO\     CALL CRLF         ;SEND A CRLF
         MOV L,C           ;SET THE L REG
          PCHL     ;JMP TO STARTING ADDRESS
TRAP\     XTHL             ;CHANGE ORDER OF STACK H AND L LAST OUT
          PUSH D           ;FORTH OUT
          PUSH B            ;THIRD OUT
          PUSH     PSW         ;SECOND OUT
          PUSH H           ;FIRST OUT IS THE ADR WHENCE WE CAME
          MVI A,324Q  ;SEND A T
         ;
      ;THE STACK MAY BE DUMPED BY HITTING A CTRL-C TO GET THE FOLLOWING
      ; SP&1  SP A F B C D E H L
         ;
ERR\     RST SND
         CALL CRLF
 BEGIN\  XRA A             ;CLEAR THE AC
 BEG\    MVI D,4
 SAV\    MOV C,A
 NEXTC\  CALL READ
         MOV A,B
         SUI 270Q          ;IS IT A NUMBER
         JP  TERM          ;270 MUST BE TERMINATOR OR ILLEGAL DIGIT
         MOV A,B
         SUI 260Q
         JM  TERM          ;YES
         DCR D             ;)260 MUST BE DIGIT BUMP BUFFER CNT
         JZ  ERROR         ;BUFFER OVERFLOW
         MOV B,A
         MOV A,C           ;GET PREVIOUS INPUTS
         RAL
         RAL
         RAL
         JC  ERROR         ;IF CARRY NUMBER WAS TOO BIG
         ADD B
         JMP SAV
 SLASH\  MOV L,C           ;C CONTAINS ADDRESS
 GETCON\ MOV A,M           ;GET CONTENTS
         CALL OCTALP
         MVI A,240Q
         RST SND
         JMP BEGIN
 LF\     MOV A,D
         SUI 4
         JZ  NINP          ;IF CNT STILL 4 NO INPUT WAS RECEIVED
         MOV M,C           ;IF CNT _4 DEPOSIT ONPUT IN MEMORY
 NINP\   MVI A,215Q
         RST SND
         INR L             ;BUMP ADDRESS
         MOV A,H           ;GET HI PART
         CALL OCTALP       ;TYPE HI ADDRESS
         MOV A,L           ;GET LOW PART
         CALL OCTALP       ;TYPE LOW ORDER ADDRESS
         JMP GETCON
 CR\     CALL CRLF         ;SEND A CRLF
         MOV A,D
         SUI 4             ;BUFCNT #4 ?
         JZ  BEGIN         ;YES NO INPUT SINCE LAST TERMINATOR
         MOV M,C           ;LOAD MEMORY WITH INPUT
         JMP BEGIN         ;ERF
 TERM\   MOV A,B
         CPI 212Q          ;IS IT A LF
         JZ  LF
         CPI 215Q          ;IS IT RETURN
         JZ  CR
         CPI 322Q          ;R
         JZ 1000Q         ;START READER PROGRAM
         CPI 257Q
         JZ  SLASH
         CPI 307Q
         JZ  GO            ;G
         CPI 256Q          ;PERIOD
         JZ  PER
         CPI 203Q
         JZ  CTRLC         ;CONTROL C
         CPI 323Q          ;S
         JNZ ERROR         ;FOUND AN ERROR
SETX\    MOV H,C          ;SAME HI ADDRESS
         JMP ERR&1
 OCTALP\ MVI B,4           ;SET CNTR
         RLC
         RLC
         MOV E,A           ;SAVE AC
         MVI A,240Q        ;SEND A SPACE
         RST SND
         MOV A,E           ;GET THE AC
         ANI 3             ;MASK
 DECR\   DCR B             ;DECR
         RZ                ;DONE ?
         ADI 260Q          ;NO
         RST SND      ;SEND A CHARAACTER
         MOV A,E           ;GET AC
         RLC
         RLC
         RLC
         MOV E,A           ;SAVE AC
         ANI 7             ;MASK
         JMP DECR
 READ\   IN FLAG           ;ROUTINE TO READ ONE CHAR FROM TTY
         RAR
         JNC READ
         IN TTY
         MOV B,A
 SEN\    OUT TTY           ;ROUTINE TO OUTPUT AN ASCII CHAR
SEN1\    IN FLAG
         RAR
         RAR
         MOV A,B             ;RESTORE A REG FROM READ
         RC                  ;DONE?
         JMP SEN1            ;NO
CTRLC\   POP H
         MOV A,H
         CALL OCTALP
         MOV A,L
         JMP GETCON&1
 CRLF\   MVI A,215Q        ;SEND A CRLF
         RST SND
         MVI A,212Q
         JMP SEN           ;RETURN VIA SEND
         END
