; Check input file for matching brackets in SMITH! ; Prints nothing if there was an error or 'OK' if brackets match. ; R0 -> stack pointer (starts at R32) ; R1 -> work register ; R2 -> -1 ; R3 -> input char ; R4 -> scratch temp copy of PC ; R5 -> scratch temp copy of * ; R6 -> scratch for PC/* arithmetic ; R7 -> 2 ; R8 -> 9 ; R9 -> scratch char ; R10 -> 15 ; R11 -> 1 ; set up stack MOV R0, 32 MOV R2, 0 SUB R2, 1 MOV R8, 9 MOV R7, 2 MOV R10, 15 MOV R11, 1 ; push 'S' MOV R[R0], "S" SUB R0, R2 ; LABEL MainLoop ; read char MOV R3, TTY ; if char == '{' push MOV R1, R3 MOV R[R8], "{" SUB R1, R9 NOT R1 MUL R1, 2 ; LENGTH PushLeftBrace MOV R4, PC ; R4 = PC MOV R5, * MOV R6, 0 SUB R6, 10048; bytes between here and PushLeftBrace SUB R5, R6 ; R5 = PushLeftBrace SUB R5, R4 ; R5 = PushLeftBrace - PC BLA +2, NOP, R7 COR +1, R5, R1 NOP NOP ; if char == '}' pop MOV R1, R3 MOV R[R8], "}" SUB R1, R9 NOT R1 MUL R1, 15 ; LENGTH PopLeftBrace MOV R4, PC ; R4 = PC MOV R5, * MOV R6, 0 SUB R6, 10035; bytes between here and PopLeftBrace SUB R5, R6 ; R5 = PopLeftBrace SUB R5, R4 ; R5 = PopLeftBrace - PC BLA +2, NOP, R10 COR +1, R5, R1 REP 15 NOP ; if char != 0 goto MainLoop MOV R1, R3 NOT R1 NOT R1 MUL R1, 49 ; LENGTH MainLoop + 1 ; LENGTH MainLoop COR +1, -48, R1 REP 10000 NOP ; This space intentionally left blank ; x = pop SUB R0, 1 MOV R1, R[R0] ; if x != 'S' stop MOV R[R8], "S" SUB R1, R9 NOT R1 NOT R1 COR +1, +6, R1 NOP ; print 'OK' MOV R[R8], "O" MOV TTY, R9 MOV R[R8], "K" MOV TTY, R9 STOP ; LABEL PushLeftBrace ; push '{' MOV R[R0], "{" SUB R0, R2 ; LENGTH PushLeftBrace == 2 ; LABEL PopLeftBrace ; x = pop; SUB R0, 1 MOV R1, R[R0] ; if x != "{" stop MOV R[R8], "{" SUB R1, R9 NOT R1 NOT R1 MOV R4, PC ; R4 = PC MOV R5, * MOV R6, 0 SUB R6, 1 ; bytes between here and Halt SUB R5, R6 ; R5 = Halt SUB R5, R4 ; R5 = Halt - PC BLA +2, NOP, R11 COR +1, R5, R1 NOP ; LENGTH PopLeftBrace == 15 ; LABEL Halt STOP ; LENGTH Halt == 1