     1 000000           ; > SerTest  tests serial lines using loopback
     2 000000           ;            Sends char to SLU, waits for return on same SLU
     3 000000           ;            Loops through 00 to FF, once polling, once under IRQ
     4 000000           ;            Halts when done or on failure
     5 000000           ;
     6 000000                   ORG     512
     7 001000 000402            BR      TEST
     8 001002 176500    BASE:   DEF     O176500         ; SLU base address
     9 001004 000300    VEC:    DEF     O300            ; SLU base vector
    10 001006           CON:    EQU     O177560         ; Console address
    11 001006 012706    TEST:   MOV     #512,R6         ; stack
    11 001010 001000    
    12 001012 004737            JSR     R7,@#CRLF
    12 001014 001266    
    13 001016 004737            JSR     R7,@#CRLF
    13 001020 001266    
    14 001022 004737            JSR     R7,@#ADDR
    14 001024 001360    
    15 001026 013705            MOV     @#VEC,R5
    15 001030 001004    
    16 001032 012725            MOV     #GET,(R5)+      ; set vector to receive chars
    16 001034 001202    
    17 001036 012725            MOV     #O340,(R5)+     ; set PSW to ignore IRQ during GET
    17 001040 000340    
    18 001042 012725            MOV     #SND,(R5)+      ; set vector to send chars
    18 001044 001244    
    19 001046 012715            MOV     #O340,(R5)      ; no IRQ during SND either
    19 001050 000340    
    20 001052 013705            MOV     @#BASE,R5
    20 001054 001002    
    21 001056 005002            CLR     R2              ; pass 0
    22 001060 005000            CLR     R0              ; first char
    23 001062 012715            MOV     #O100,(R5)      ; enable IRQ on rcvr
    23 001064 000100    
    24 001066 052705            BIS     #6,R5           ; BASE+6=TxBuff
    24 001070 000006    
    25 001072 010015            MOV     R0,(R5)         ; set it going
    26 001074 000001    IRQ:    WAIT                    ; for IRQ
    27 001076 105700            TSTB    R0              ; what char ?
    28 001100 001375            BNE     IRQ             ; if back to 0, all done
    29 001102 005077            CLR     @BASE-$         ; disable IRQ on RxCSR
    29 001104 177674    
    30 001106 004737            JSR     R7,@#PASS
    30 001110 001316    
    31 001112 052705            BIS     #6,R5
    31 001114 000006    
    32 001116 110015            MOVB    R0,(R5)         ; send first char, pass 1
    33 001120 013705    RCV:    MOV     @#BASE,R5       ; =BASE again
    33 001122 001002    
    34 001124 105715            TSTB    (R5)
    35 001126 100374            BPL     RCV
    36 001130 052705            BIS     #2,R5           ; BASE+2=RxBuff
    36 001132 000002    
    37 001134 011501            MOV     (R5),R1         ; get char
    38 001136 030127            BIT     R1,#&8000       ; test for error
    38 001140 100000    
    39 001142 001401            BEQ     NOERR
    40 001144 000000    PARITY: HALT                    ; parity/overrun/framing error
    41 001146 120001    NOERR:  CMPB    R0,R1
    42 001150 001401            BEQ     XMIT
    43 001152 000000    CHAR:   HALT                    ; mismatch
    44 001154 105200    XMIT:   INCB    R0
    45 001156 001404            BEQ     DONE
    46 001160 052705            BIS     #6,R5           ; BASE+6=TxBuff
    46 001162 000006    
    47 001164 110015            MOVB    R0,(R5)
    48 001166 000754            BR      RCV
    49 001170 004737    DONE:   JSR     R7,@#PASS
    49 001172 001316    
    50 001174 004737            JSR     R7,@#CRLF
    50 001176 001266    
    51 001200 000000            HALT
    52 001202           ;
    53 001202 010546    GET:    MOV     R5,-(R6)        ; push R5 in case!
    54 001204 013705            MOV     @#BASE,R5
    54 001206 001002    
    55 001210 052705            BIS     #2,R5           ; RxBuff
    55 001212 000002    
    56 001214 012501            MOV     (R5)+,R1        ; get char RxBuff+2=TxCSR
    57 001216 030127            BIT     R1,#&8000       ; test for error
    57 001220 100000    
    58 001222 001350            BNE     PARITY
    59 001224 120100            CMPB    R1,R0           ; test for right char
    60 001226 001351            BNE     CHAR
    61 001230 105200            INCB    R0              ; next char
    62 001232 001402            BEQ     HOME
    63 001234 012715            MOV     #O100,(R5)      ; enable xmit IRQ
    63 001236 000100    
    64 001240 012605    HOME:   MOV     (R6)+,R5        ; pop R5
    65 001242 000002            RTI
    66 001244           ;
    67 001244 010546    SND:    MOV     R5,-(R6)        ; push R5 in case!
    68 001246 013705            MOV     @#BASE,R5
    68 001250 001002    
    69 001252 052705            BIS     #4,R5           ; BASE+4=TxCSR
    69 001254 000004    
    70 001256 005025            CLR     (R5)+           ; prevent further IRQ until char got
    71 001260 010015            MOV     R0,(R5)
    72 001262 012605            MOV     (R6)+,R5        ; pop R5
    73 001264 000002            RTI
    74 001266           ;
    75 001266 012704    CRLF:   MOV     #13,R4
    75 001270 000015    
    76 001272 004737            JSR     R7,@#PRTN
    76 001274 001302    
    77 001276 012704            MOV     #10,R4
    77 001300 000012    
    78 001302 105737    PRTN:   TSTB    @#CON+4         ; console RDY
    78 001304 177564    
    79 001306 100375            BPL     PRTN
    80 001310 110437            MOVB    R4,@#CON+6
    80 001312 177566    
    81 001314 000207            RTS     R7
    82 001316           ;
    83 001316 005202    PASS:   INC     R2
    84 001320 004537            JSR     R5,@#PRTTXT
    84 001322 001436    
    85 001324 <string>          DEFS 
    86 001331    240            DEFB    &A0             ; space with top bit set
    87 001332                   ALIGN
    88 001332 010204            MOV     R2,R4
    89 001334 052704            BIS     #ASC"0",R4
    89 001336 000060    
    90 001340 004737            JSR     R7,@#PRTN
    90 001342 001302    
    91 001344 004537            JSR     R5,@#PRTTXT
    91 001346 001436    
    92 001350 <string>          DEFS 
    93 001355    240            DEFB    &A0
    94 001356                   ALIGN
    95 001356 000207            RTS     R7
    96 001360           ;
    97 001360 013705    ADDR:   MOV     @#BASE,R5
    97 001362 001002    
    98 001364 012704            MOV     #O30,R4         ; after shifts, 3x will be 6x
    98 001366 000030    
    99 001370 006105            ROL     R5              ; rotate 1 bit from R5 to R4
   100 001372 006104            ROL     R4
   101 001374 004737            JSR     R7,@#PRTN       ; print as ASCII digit
   101 001376 001302    
   102 001400 012703            MOV     #5,R3
   102 001402 000005    
   103 001404 012704    CLOOP:  MOV     #6,R4           ; 6>>3 becomes 6x
   103 001406 000006    
   104 001410 006105            ROL     R5
   105 001412 006104            ROL     R4
   106 001414 006105            ROL     R5
   107 001416 006104            ROL     R4
   108 001420 006105            ROL     R5
   109 001422 006104            ROL     R4
   110 001424 004737            JSR     R7,@#PRTN
   110 001426 001302    
   111 001430 005303            DEC     R3
   112 001432 001364            BNE     CLOOP
   113 001434 000207            RTS     R7
   114 001436           ;
   115 001436 111504    PRTTXT: MOVB    (R5),R4         ; get char just past where we were
   116 001440 004737            JSR     R7,@#PRTN
   116 001442 001302    
   117 001444 105725            TSTB    (R5)+
   118 001446 100373            BPL     PRTTXT
   119 001450 005205            INC     R5              ; in case it's an odd number
   120 001452 040527            BIC     R5,#1           ; in case it just became an odd one!
   120 001454 000001    
   121 001456 000205            RTS     R5
