Telephone Dial

The telephone dial is a somewhat unusual input device, as there is no way for the program to explicitly read it. When dial input is required, the program executes a Halt instruction. Dialling a digit n causes n to be added to the upper word of the accumulator (with the digit 0 giving n=10). Execution is then automatically resumed.

I expanded the IOSEL field to 3 bits so that I could add two more I/O sense inputs:

DIAL - high when the dial is turned away from its home position.

DIALP - goes high for each dial pulse.

Inside the State Control subcircuit, DIAL is inverted so that the branch condition is true when dialling has finished.

DIAL is also connected to the Run Control circuit to trigger a NIMS to handle dial input.

Main circuit changes

State Control changes


Dial Simulator

The dial simulator runs on a slow internal clock so that the computer simulation can keep up with it. It has 4 states. In State 0, it is paused waiting for a button to be pressed. When that happens, the digit dialled is loaded into the pulse counter and the state counter is allowed to advance. State 1 provides a delay. In state 2, pulses are generated at the DIALP output and the pulse counter counts down. When it reaches zero, the state counter advances again, through state 3 which provides another delay, and back to state 0.

Dial Timing

Dial Input Microcode

# IOSEL values for IOTST
TDFIN = 001 # Telephone dial finished
TDPUL = 101 # Telephone dial pulse

# Dial Input
1 00011 0 0000 : - - -- --- - -- - - -- - - - - - - IOTST - --- TDFIN - # If dialling finished
1 00011 0 0001 : - EOI -- --- - -- - - -- - - - - - - ---- - BNIOT 0100 # then continue program
1 00011 0 0010 : - - -- --- - -- - - -- - - - - - - IOTST - --- TDPUL - # If no dial pulse
1 00011 0 0011 : - - -- --- - -- - - -- - - - - - - ---- - BNIOT 0000 # then wait for pulse
1 00011 0 0100 : - - 11 XAC - Y0 CY1 - WAC - - MSW LSW - - ---- - --- ---- # Add 1 to MSW of accumulator
1 00011 0 0101 : - - -- --- - -- - - -- - - - - - - IOTST - --- TDPUL - # If no dial pulse
1 00011 0 0110 : - - -- --- - -- - - -- - - - - - - ---- - BNIOT 0000 # then wait for pulse
1 00011 0 0111 : - - -- --- - -- - - -- - - - - - - IOTST - --- TDFIN - # If dialling finished then continue
1 00011 0 1000 : - EOI -- --- - -- - - -- - - - - - - ---- - BNIOT 1010 # program else wait for no pulse