Create a demo program to check if values exist

This commit is contained in:
2026-04-19 21:39:45 +02:00
parent e5700ddc95
commit 7439e26a69

43
src/chkmat.s Normal file
View File

@@ -0,0 +1,43 @@
;-*-MIDAS-*-
TITLE CHECK MATRIX
A=1 ;Define the ACs as universal registers
B=2 ;from A to E
C=3
D=4
E=5
X=10 ;X and Y are used for indexing
Y=11 ;loops etc.
P=17 ;Define P as the stack pointer
PDLLEN==30 ;Set the size of the stack to 30 words.
PDL: BLOCK PDLLEN ;Reserve the stack memory
START: MOVE P,[-PDLLEN,,PDL-1] ;Initializes the stack
DONE: .LOGOUT 2, ;Exit from the program
;Subroutine that checks a byte array, where one byte is a 4-bit value,
;for duplicate values.
;The algorithm works as follows:
;The original word is walked through in for bit steps. Each 4-bit value
;is read, and its value is used as a bit pointer to the 'hashing'-register.
;If a number is found, the bit in the hashing register is set. If the bit
;is already set, the number has already been found the in original set.
;To make the walk through easy, we use a special feature of the PDP-10:
;We access the data register, as if it was a memory address.
;The following registers are used:
;A: Accumulator used to store the values that are read from the data field.
;B: Used to check if a bit is set, without destroying the contents of I.
;C: Contains the data field itself: 36 bits, in 4-bit segments.
;E: Used as a table to store if a number was found in the field.
;X: The byte pointer to the data field.
CHKMAT: PUSH P,A ;Save the register A
PUSH P,C ;Save the data register
PUSH P,E ;Save the E register
PUSH P,X ;Save the index register
SET E ;Set the hash register to 0.
MOVE X,[440400,,C] ;Store a byte pointer to C
LOOP: ILDB A,X ;Store a byte in A
MOVEI B,E ;Copy the table.
LSH B,A ;Shift out the bit to check.
ANDI B,1 ;Check if the first bit is set.