LINCtape images

Jay Jaeger cube1 at charter.net
Tue Nov 2 16:25:47 CDT 2021


On 10/29/2021 7:22 AM, Christian Corti via cctalk wrote:
> Short question:
> How do I transfer LINCtape images back to tape on a PDP-12? Ideally 
> there is some binary program to load via papertape to format a tape and 
> recreate it with data transfer over the console serial line.
> 
> Christian

Here is a program I wrote for reading/writing tape images via XModem 
protocol for my PDP-12, and another for comparing two linctapes.

JRJ

     8L OF XMTAPE     PAGE 01
LN=0001

0001                                     [ PROGRAM TO SEND A
0002                                     [ TAPE ON UNIT 1 TO
0003                                     [ A PC VIA XMODEM
0004                                     [
0005                                     [ CONSTANTS
0006                                     [
0007                 XSOH=1
0010                 XNAK=25
0011                 XCAN=30
0012                 XACK=6
0013                 XEOT=4
0014                 SRTAPE=1            [ SR11 1 FOR OS/12 TAPE
0015                 SRCMP=2             [ SR10 1 FOR COMPARE
0016                 SRWRIT=4            [ SR9 1 FOR WRITE
0017                                     [
0020                                     [ SPECIAL INSTRUCTIONS
0021                                     [
0022                 AXO=1
0023                 PDP=2
0024                 TMA=23
0025                 RDC=700
0026                 WDE=706
0027                 DKSF=6401
0030                 DKCC=6402
0031                 DKRB=6406
0032                 DTLS=6416
0033                 DTSF=6411
0034                                     [
0035                                     [ DATA
0036                                     [
0037                 $70
0040  0070 0000      #XMPTR  0           [ PTR INTO XMBUF
0041  0071 0000      #XMBLK  0           [ XMODEM BLOCK #
0042  0072 0000      #XMCKSM 0           [ XMODEM CHECKSUM
0043  0073 0000      #XMCNT  0           [ WORK COUNTER
0044  0074 0000      #XMACK  0           [ ACKNOWLEDGEMENT CHAR
0045  0075 0000      #ROTCNT 0           [ WORK COUNTER FOR RAR
0046  0076 0000      #WDCNTI 0           [ WORDS PER BLOCK
0047  0077 0000      #BLKCNT 0           [ BLOCKS PER TAPE
0050  0100 0000      #WDCNT  0           [ WORK COUNTER
0051  0101 0000      #HNKCNT 0           [ WORK COUNTER
0052  0102 0000      #HNKMEM 0           [ ADDRESS OF BLOCK
0053  0103 0000      #XMWORD 0           [ XMODEM INCOMING WORD
0054  0104 0000      #XMPROT 0           [ XMODEM PROTOCOL CHAR
0055                                     [
0056                                     [ INITIALIZATION
0057                                     [
0060                 $200
0061  0200 7402      #START  HLT
0062  0201 7301              CLA CLL IAC [ XMODEM BLOCK=1
0063  0202 3071 0071         DCA XMBLK
0064  0203 1177 1155         TAD (XMBUF  [ XMPTR = ADDR(XMBUF)
0065  0204 3070 0070         DCA XMPTR
0066  0205 1176 7600         TAD (0-128. [ XMCNT = -128
0067  0206 3073 0073         DCA XMCNT








     8L OF XMTAPE     PAGE 02
LN=0070

0070  0207 7404              OSR         [ IF SR11 == 0 THEN
0071  0210 0175 0001         AND (SRTAPE
0072  0211 7440              SZA
0073  0212 5220 0220         JMP INITP
0074  0213 1174 7400         TAD (0-256. [ WDCNTI= -256.
0075  0214 3076 0076         DCA WDCNTI
0076  0215 1173 7000         TAD (0-1000 [ BLKCNT = -01000
0077  0216 3077 0077         DCA BLKCNT
0100  0217 5225 0225         JMP INIT1   [ ELSE
0101  0220 7300      #INITP  CLA CLL
0102  0221 1172 7577         TAD (0-129. [ WDCNTI = -129.
0103  0222 3076 0076         DCA WDCNTI
0104  0223 1171 5000         TAD (0-3000 [ BLKCNT = - 03000
0105  0224 3077 0077         DCA BLKCNT
0106  0225 3254 0254 #INIT1  DCA BLOCK   [ BLOCK = 0
0107  0226 7404              OSR         [ IF SR10==1 THEN COMPARE
0110  0227 0170 0002         AND (SRCMP
0111  0230 7440              SZA
0112  0231 5567 0500         JMP CMPINI  [ GO COMPARE
0113  0232 7404              OSR         [ IF SR9==1 THEN WRITE
0114  0233 0166 0004         AND (SRWRIT
0115  0234 7440              SZA
0116  0235 5565 0603         JMP WTINI   [ GO WRITE
0117                                     [
0120                                     [ READ NEXT HUNK (1 FIELD)
0121                                     [ (16 BLOCKS) INTO MEM.
0122                                     [
0123  0236 7300      #RDHNK  CLA CLL
0124  0237 1164 7760         TAD (0-16.  [ HNKCNT = -16.
0125  0240 3101 0101         DCA HNKCNT
0126  0241 3102 0102         DCA HNKMEM  [ HNKMEM = 0
0127  0242 7300      #RDBLK  CLA CLL
0130  0243 1102 0102         TAD HNKMEM  [ TMA MEMORY ADDRESS
0131  0244 6141              LINC
0132  0245 0023              TMA
0133  0246 0002              PDP
0134  0247 7300              CLA CLL     [ EXTENDED, FIELD 1
0135  0250 1163 1020         TAD (1020
0136  0251 6141              LINC
0137  0252 0001              AXO
0140  0253 0710              RDC 10      [ READ UNIT 1
0141  0254 0000      #BLOCK  0
0142  0255 0002              PDP
0143  0256 2254 0254         ISZ BLOCK   [ ++BLOCK
0144  0257 7300              CLA CLL
0145  0260 1102 0102         TAD HNKMEM  [ HNKMEM += 256.
0146  0261 1162 0400         TAD (256.   [ EVEN FOR 129. WORD
0147  0262 3102 0102         DCA HNKMEM  [ SIMULATED DECTAPES
0150  0263 2101 0101         ISZ HNKCNT  [ WHILE ++HNKCNT != 0
0151  0264 5242 0242         JMP RDBLK
0152                                     [
0153                                     [ FILL XMODEM BUFFER
0154                                     [ 1 WORD AT A TIME.
0155                                     [ TRANSMIT AS NECESSARY
0156                                     [








     8L OF XMTAPE     PAGE 03
LN=0157

0157  0265 7300              CLA CLL
0160  0266 1164 7760         TAD (0-16.  [ HNKCNT = -16.
0161  0267 3101 0101         DCA HNKCNT
0162  0270 3102 0102         DCA HNKMEM  [ MEMORY ADDR=0
0163  0271 7300      #HNKSND CLA CLL
0164  0272 1076 0076         TAD WDCNTI  [ WDCNT = WDCNTI
0165  0273 3100 0100         DCA WDCNT   [ (- WORD COUNT)
0166  0274 6211      #HNKNXW CDF 10      [ FIELD 1 HOLDS DATA
0167  0275 1502 0102         TAD;HNKMEM  [ AC=WORD
0170  0276 6201              CDF 0       [ BACK TO NORMAL
0171  0277 4330 0330         JMS WDSEND  [ PUT WORD IN BUFF
0172  0300 2102 0102         ISZ HNKMEM  [ POINT TO NEXT WD
0173  0301 7000              NOP         [ FOR SKIP ON ZERO
0174  0302 2100 0100         ISZ WDCNT   [ UNTIL ++WDCNT == 0
0175  0303 5274 0274         JMP HNKNXW
0176  0304 7300              CLA CLL
0177  0305 1076 0076         TAD WDCNTI  [ BUMP MEM ADDR TO
0200  0306 1162 0400         TAD (256.   [ NEXT BLOCK.  DOES
0201  0307 1102 0102         TAD HNKMEM  [ NOTHING IF BLOCK
0202  0310 3102 0102         DCA HNKMEM  [ SIZE IS 256.
0203  0311 2101 0101         ISZ HNKCNT  [ UNTIL ++HNKCNT == 0
0204  0312 5271 0271         JMP HNKSND
0205                                     [
0206                                     [ IF WE HAVE SENT THEM
0207                                     [ ALL, FLUSH THE BUFFER
0210                                     [ AND HALT.  OTHERWISE
0211                                     [ GO BACK FOR MORE
0212                                     [
0213  0313 7300              CLA CLL
0214  0314 1077 0077         TAD BLKCNT  [ BLKCNT += 16.
0215  0315 1161 0020         TAD (16.
0216  0316 3077 0077         DCA BLKCNT
0217  0317 1077 0077         TAD BLKCNT
0220  0320 7440              SZA         [ UNTIL BLKCNT == 0
0221  0321 5236 0236         JMP RDHNK
0222  0322 4361 0361         JMS WDFLSH  [ FLUSH THE BUFFER
0223  0323 7300              CLA CLL
0224  0324 1166 0004         TAD (XEOT   [ SEND EOT CHAR
0225  0325 4560 0466         JMS CHSEND
0226  0326 7402              HLT         [ AND HALT
0227  0327 5200 0200         JMP START
0230                                     [
0231                                     [ SUBROUTINE TO PUT A
0232                                     [ WORD INTO XMODEM
0233                                     [ BUFFER AND TRIGGER
0234                                     [ A TRANSMISSION IF
0235                                     [ THE BUFFER IS FULL
0236                                     [
0237  0330 0000      #WDSEND 0           [ RETURN ADDRESS
0240  0331 3470 0070         DCA;XMPTR   [ STORE LOW 8 BITS
0241  0332 1157 7770         TAD (0-8.
0242  0333 3075 0075         DCA ROTCNT
0243  0334 1470 0070         TAD;XMPTR   [ RESTORE DATA WORD
0244  0335 7110      #WDROT  CLL RAR     [ AC >>= 8.
0245  0336 2075 0075         ISZ ROTCNT








     8L OF XMTAPE     PAGE 04
LN=0246

0246  0337 5335 0335         JMP WDROT
0247  0340 2070 0070         ISZ XMPTR   [ ++ XMPTR
0250  0341 7000              NOP         [ FOR SKIP
0251  0342 3470 0070         DCA;XMPTR   [ STORE HIGH 4 BITS
0252  0343 2070 0070         ISZ XMPTR   [ ++ XMPTR
0253  0344 7000              NOP         [ FOR SKIP
0254  0345 2073 0073         ISZ XMCNT
0255  0346 2073 0073         ISZ XMCNT
0256  0347 5730 0330         JMP;WDSEND  [ RTRN IF NOT FULL
0257  0350 4562 0400         JMS XMSEND  [ ELSE SEND BUFFER
0260  0351 7300              CLA CLL     [ RE-INITIALIZE
0261  0352 1177 1155         TAD (XMBUF  [ XMPTR = ADDR(XMBUF)
0262  0353 3070 0070         DCA XMPTR
0263  0354 1176 7600         TAD (0-128. [ XMCNT = -128.
0264  0355 3073 0073         DCA XMCNT
0265  0356 2071 0071         ISZ XMBLK   [ ++XMBLK (XMODEM BLOCK)
0266  0357 7000              NOP         [ FOR SKIP
0267  0360 5730 0330         JMP;WDSEND  [ AND RETURN
0270                                     [
0271                                     [ SUBROUTINE TO FLUSH
0272                                     [ AND AND SEND XMODEM
0273                                     [ BUFFER
0274                                     [
0275  0361 7300      #WDFLSH CLA CLL
0276  0362 1073 0073         TAD XMCNT   [ IF COUNT==128.
0277  0363 1176 7600         TAD (0-128.
0300  0364 7450              SNA
0301  0365 5761 0361         JMP;WDFLSH  [ THEN JUST RETURN
0302  0366 7300      #WDFILL CLA CLL
0303  0367 3470 0070         DCA;XMPTR   [ STUFF A 0 BYTE
0304  0370 2070 0070         ISZ XMPTR   [ ++XMPTR
0305  0371 7000              NOP         [ FOR SKIP
0306  0372 2073 0073         ISZ XMCNT   [ UNTIL ++XMCNT == 0
0307  0373 5366 0366         JMP WDFILL
0310  0374 5761 0361         JMP;WDFLSH  [ RETURN WHEN DONE
0311                                     [
0312                                     [ SUBROUTINE TO SEND
0313                                     [ AN XMODEM MESSAGE,
0314                                     [ WITH RETRIES
0315                                     [
0316                 $400
0317  0400 0000      #XMSEND 0           [ RETURN ADDRESS
0320  0401 4225 0425         JMS XMPUT   [ TRY AND SEND
0321  0402 4273 0473         JMS CHGET   [ GET ACKNOWLEDGEMENT
0322  0403 0156 0077         AND (77     [ FOR TESTING CONV.
0323  0404 3074 0074         DCA XMACK   [ SAVE IT FOR LATER
0324  0405 1074 0074         TAD XMACK   [ GET IT BACK
0325  0406 1155 7753         TAD (0-XNAK [ IF == NAK
0326  0407 7450              SNA
0327  0410 5201 0401         JMP XMSEND+1 [ THEN RETRY
0330  0411 7300              CLA CLL
0331  0412 1074 0074         TAD XMACK
0332  0413 1154 7750         TAD (0-XCAN [ IF == CANCEL
0333  0414 7440              SZA
0334  0415 5217 0417         JMP XMSND1








     8L OF XMTAPE     PAGE 05
LN=0335

0335  0416 5553 0201         JMP START+1 [ JUST RESTART
0336  0417 7300      #XMSND1 CLA CLL     [ ELSE
0337  0420 1074 0074         TAD XMACK
0340  0421 1152 7772         TAD (0-XACK [ IF != ACK
0341  0422 7440              SZA
0342  0423 5201 0401         JMP XMSEND+1 [ RETRY
0343  0424 5600 0400         JMP;XMSEND  [ ACK -- RETURN
0344                                     [
0345                                     [ SUBROUTINE TO SEND
0346                                     [ XMODEM BUFFER 1 TIME
0347                                     [
0350  0425 0000      #XMPUT  0           [ RETURN ADDRESS
0351  0426 7300              CLA CLL
0352  0427 1175 0001         TAD (XSOH   [ TRANSMIT SOH
0353  0430 4266 0466         JMS CHSEND
0354  0431 7300              CLA CLL
0355  0432 1071 0071         TAD XMBLK   [ TRANSMIT BLOCK NO.
0356  0433 4266 0466         JMS CHSEND
0357  0434 7300              CLA CLL
0360  0435 1071 0071         TAD XMBLK
0361  0436 7040              CMA         [ TRANSMIT COMPLEMENT
0362  0437 4266 0466         JMS CHSEND
0363  0440 7300              CLA CLL
0364  0441 3072 0072         DCA XMCKSM  [ XMCKSM = 0
0365  0442 1176 7600         TAD (0-128. [ XMCNT = -128.
0366  0443 3073 0073         DCA XMCNT
0367  0444 1177 1155         TAD (XMBUF  [ XMPTR = ADDR(XMBUF)
0370  0445 3070 0070         DCA XMPTR
0371  0446 7300      #XMSPUT CLA CLL     [ SEND *XMPTR
0372  0447 1470 0070         TAD;XMPTR
0373  0450 4266 0466         JMS CHSEND
0374  0451 7300              CLA CLL     [ XMCKSM += *XMPTR
0375  0452 1470 0070         TAD;XMPTR
0376  0453 1072 0072         TAD XMCKSM
0377  0454 3072 0072         DCA XMCKSM
0400  0455 2070 0070         ISZ XMPTR   [ ++XMPTR
0401  0456 7000              NOP         [ FOR SKIP
0402  0457 2073 0073         ISZ XMCNT   [ UNTIL ++XMCNT == 0
0403  0460 5246 0446         JMP XMSPUT
0404  0461 6402              DKCC        [ PREPARE FOR ACK CHAR
0405  0462 7300              CLA CLL     [ SEND CHECKSUM
0406  0463 1072 0072         TAD XMCKSM
0407  0464 4266 0466         JMS CHSEND
0410  0465 5625 0425         JMP;XMPUT   [ AND RETURN
0411                                     [
0412                                     [ ROUTINE TO SEND CHAR
0413                                     [
0414  0466 0000      #CHSEND 0           [ RETURN ADDRESS
0415  0467 6416              DTLS        [ SEND THE CHAR
0416  0470 6411              DTSF        [ CHECK FLAG
0417  0471 5270 0470         JMP *-1     [ WAIT TILL DONE
0420  0472 5666 0466         JMP;CHSEND
0421                                     [
0422                                     [ ROUTINE TO WAIT FOR
0423                                     [ AND RECEIVE A CHAR








     8L OF XMTAPE     PAGE 06
LN=0424

0424                                     [
0425  0473 0000      #CHGET  0           [ RETURN ADDRESS
0426  0474 6401              DKSF        [ WAIT FOR CHAR
0427  0475 5274 0474         JMP *-1
0430  0476 6406              DKRB        [ RECEIVE THE CHAR
0431  0477 5673 0473         JMP;CHGET   [ AND RETURN
0432                                     [
0433                                     [ COMPARE INCOMING DATA
0434                                     [ TO TAPE DRIVE 1
0435                                     [
0436  0500 7300      #CMPINI CLA CLL
0437  0501 3323 0523         DCA CMPBLK  [ CMPBLK = 0
0440  0502 3073 0073         DCA XMCNT   [ INIT XM BUFFER EMPTY
0441  0503 1151 0025         TAD (XNAK   [ PRIME INITAL NACK
0442  0504 3074 0074         DCA XMACK
0443                                     [
0444                                     [ COMPARE NEXT HUNK
0445                                     [
0446  0505 7300      #CMPHNK CLA CLL
0447  0506 1164 7760         TAD (0-16.  [ HNKCNT = -16
0450  0507 3101 0101         DCA HNKCNT
0451  0510 3102 0102         DCA HNKMEM  [ HNKMEM = 0
0452  0511 7300      #CMPRB  CLA CLL     [ READ NEXT BLOCK
0453  0512 1102 0102         TAD HNKMEM  [ GET MEM ADDR
0454  0513 6141              LINC
0455  0514 0023              TMA
0456  0515 0002              PDP
0457  0516 7300              CLA CLL
0460  0517 1163 1020         TAD (1020   [ XA MODE, FIELD 1
0461  0520 6141              LINC
0462  0521 0001              AXO
0463  0522 0710              RDC 10      [ READ UNIT 1
0464  0523 0000      #CMPBLK 0           [ BLOCK NUMBER
0465  0524 0002              PDP
0466  0525 2323 0523         ISZ CMPBLK  [ ++CMPBLK
0467  0526 7300              CLA CLL
0470  0527 1102 0102         TAD HNKMEM  [ HNKMEM += 256
0471  0530 1162 0400         TAD (256.   [ EVEN FOR 129 WORD
0472  0531 3102 0102         DCA HNKMEM  [ BLOCK TAPES
0473  0532 2101 0101         ISZ HNKCNT  [ WHILE ++HNKCNT != 0
0474  0533 5311 0511         JMP CMPRB   [ GO READ NEXT BLK
0475                                     [
0476                                     [ THEN COMPARE WHAT WE
0477                                     [ JUST READ TO INCOMING
0500                                     [ DATA FROM XMODEM
0501                                     [
0502  0534 7300              CLA CLL
0503  0535 1164 7760         TAD (0-16.  [ HNKCNT = -16.
0504  0536 3101 0101         DCA HNKCNT
0505  0537 3102 0102         DCA HNKMEM  [ HNKMEM = 0
0506  0540 7300      #CMPCBK CLA CLL
0507  0541 1076 0076         TAD WDCNTI  [ WDCNT = WDCNTI
0510  0542 3100 0100         DCA WDCNT
0511  0543 4550 1000 #CMPCWD JMS RDWD    [ GET WORD FROM XMODEM
0512  0544 7041              CMA IAC     [ AC = -AC








     8L OF XMTAPE     PAGE 07
LN=0513

0513  0545 6211              CDF 10      [ COMPARE TO DATA
0514  0546 1502 0102         TAD;HNKMEM  [ FROM TAPE
0515  0547 6201              CDF 0
0516  0550 7440              SZA         [ COMPARE OK
0517  0551 7402              HLT         [ MIS-COMPARE!!!
0520  0552 2102 0102         ISZ HNKMEM  [ POINT TO NEXT WORD
0521  0553 7000              NOP         [ FOR SKIP
0522  0554 2100 0100         ISZ WDCNT   [ UNTIL ++WDCNT == 0
0523  0555 5343 0543         JMP CMPCWD  [ GO COMPARE NEXT WD
0524  0556 7300              CLA CLL     [ BUMP UP TO NEXT
0525  0557 1076 0076         TAD WDCNTI  [ BLOCK.  DOES NOTHING
0526  0560 1162 0400         TAD (256.   [ FOR 256. WORD BLOCKS
0527  0561 1102 0102         TAD HNKMEM
0530  0562 3102 0102         DCA HNKMEM
0531  0563 2101 0101         ISZ HNKCNT  [ UNTIL ++HNKCNT == 0
0532  0564 5340 0540         JMP CMPCBK  [ GO COMPARE NEXT BLOCK
0533                                     [
0534                                     [ IF WE COMPARED IT ALL, HALT
0535                                     [
0536  0565 7300              CLA CLL
0537  0566 1077 0077         TAD BLKCNT  [ BLKCNT += 16
0540  0567 1161 0020         TAD (16.
0541  0570 3077 0077         DCA BLKCNT
0542  0571 1077 0077         TAD BLKCNT  [ RESTORE AC
0543  0572 7440              SZA
0544  0573 5305 0505         JMP CMPHNK  [ MORE TO COMPARE
0545  0574 1147 0006         TAD (XACK   [ ACK FINAL BLOCK
0546  0575 4266 0466         JMS CHSEND
0547  0576 7300              CLA CLL
0550  0577 1147 0006         TAD (XACK
0551  0600 4560 0466         JMS CHSEND
0552  0601 7402              HLT         [ HALT, THEN RESTART
0553  0602 5553 0201         JMP START+1 [ SKIP INIT HLT
0554                                     [
0555                                     [ WRITE TAPE FROM INCOMING DATA
0556                                     [
0557  0603 7402      #WTINI  HLT         [ FOR SAFETY
0560  0604 7300              CLA CLL
0561  0605 3253 0653         DCA WTBLOK  [ WTBLOK = 0
0562  0606 3073 0073         DCA XMCNT   [ INIT XMODEM BUF EMPTY
0563  0607 1151 0025         TAD (XNAK   [ PRIME INITIAL NACK
0564  0610 3074 0074         DCA XMACK
0565  0611 7300      #WTGHNK CLA CLL     [ HNKCNT = -16.
0566  0612 1164 7760         TAD (0-16.
0567  0613 3101 0101         DCA HNKCNT
0570  0614 3102 0102         DCA HNKMEM  [ HNKMEM = 0
0571  0615 7300      #WTGBK  CLA CLL
0572  0616 1076 0076         TAD WDCNTI  [ WDCNT = -WORDS/BLOCK
0573  0617 3100 0100         DCA WDCNT
0574  0620 4550 1000 #WTGWD  JMS RDWD    [ GET WORD FROM XMODEM
0575  0621 6211              CDF 10
0576  0622 3502 0102         DCA;HNKMEM  [ STORE IN TAPE BUFF
0577  0623 6201              CDF 0
0600  0624 2102 0102         ISZ HNKMEM  [ ++HNKMEM









     8L OF XMTAPE     PAGE 08
LN=0601

0601  0625 7000              NOP         [ FOR SKIP
0602  0626 2100 0100         ISZ WDCNT   [ UNTIL ++WDCNT == 0
0603  0627 5220 0620         JMP WTGWD
0604  0630 1076 0076         TAD WDCNTI  [ BUMP TO NEXT BLOCK
0605  0631 1162 0400         TAD (256.   [ HNKMEM += 256-BLKSIZE
0606  0632 1102 0102         TAD HNKMEM
0607  0633 3102 0102         DCA HNKMEM
0610  0634 2101 0101         ISZ HNKCNT  [ UNTIL ++HNKCNT == 0
0611  0635 5215 0615         JMP WTGBK
0612  0636 1164 7760         TAD (0-16.  [ HNKCNT = -16.
0613  0637 3101 0101         DCA HNKCNT
0614  0640 3102 0102         DCA HNKMEM  [ HNKMEM = 0
0615  0641 7300      #WTBLK  CLA CLL
0616  0642 1102 0102         TAD HNKMEM  [ TMA MEMORY ADDR
0617  0643 6141              LINC
0620  0644 0023              TMA
0621  0645 0002              PDP
0622  0646 7300              CLA CLL
0623  0647 1163 1020         TAD (1020   [ XA MODE, FIELD 1
0624  0650 6141              LINC
0625  0651 0001              AXO
0626  0652 0716              WDE 10      [ WRITE TAPE BLOCK
0627  0653 0000      #WTBLOK 0
0630  0654 0002              PDP
0631  0655 2253 0653         ISZ WTBLOK  [ ++WTBLOK
0632  0656 7300              CLA CLL
0633  0657 1102 0102         TAD HNKMEM  [ HNKMEM += 256.
0634  0660 1162 0400         TAD (256.   [ EVEN FOR 129 WD
0635  0661 3102 0102         DCA HNKMEM  [ BLOCKS
0636  0662 2101 0101         ISZ HNKCNT  [ UNTIL ++HNKCNT == 0
0637  0663 5241 0641         JMP WTBLK
0640                                     [
0641                                     [ IF ALL HUNKS WRITTEN
0642                                     [ THEN HALT
0643                                     [
0644  0664 7300              CLA CLL
0645  0665 1077 0077         TAD BLKCNT  [ BLKCNT += BLOCKS/HUNK
0646  0666 1161 0020         TAD (16.
0647  0667 3077 0077         DCA BLKCNT
0650  0670 1077 0077         TAD BLKCNT
0651  0671 7440              SZA
0652  0672 5211 0611         JMP WTGHNK  [ GO DO NEXT HUNK
0653  0673 1147 0006         TAD (XACK   [ ACK FINAL BLOCK
0654  0674 4560 0466         JMS CHSEND
0655  0675 7300              CLA CLL
0656  0676 1147 0006         TAD (XACK
0657  0677 4560 0466         JMS CHSEND
0660  0700 7402              HLT         [ THEN HALT -- WELL DONE!
0661  0701 5553 0201         JMP START+1 [ SKIP INITIAL HALT
0662                                     [
0663                                     [ ROUTINE TO RECEIVE
0664                                     [ A WORD FROM XMODEM
0665                                     [
0666                 $1000
0667  1000 0000      #RDWD   0           [ RETURN ADDR








     8L OF XMTAPE     PAGE 09
LN=0670

0670  1001 7300              CLA CLL
0671  1002 1073 0073         TAD XMCNT   [ IF BUFFER IS EMPTY
0672  1003 7440              SZA
0673  1004 5216 1016         JMP RDWD2   [ BUFFER NOT EMPTY
0674  1005 4237 1037         JMS XMGET   [ GO FILL BUFFER
0675  1006 7450              SNA         [ SKIP IF EOT
0676  1007 5212 1012         JMP RDWD1   [ NOT EOT -- OK
0677  1010 7402              HLT         [ EOT - NOT EXPECTED
0700  1011 5210 1010         JMP *-1     [ HARD HALT
0701  1012 1177 1155 #RDWD1  TAD (XMBUF  [ XMPTR = ADDR(XMBUFF)
0702  1013 3070 0070         DCA XMPTR
0703  1014 1176 7600         TAD (0-128. [ XMCNT = -128.
0704  1015 3073 0073         DCA XMCNT
0705  1016 7300      #RDWD2  CLA CLL     [ CLEAR AC
0706  1017 1470 0070         TAD;XMPTR   [ WORD = *XMPTR
0707  1020 3103 0103         DCA XMWORD  [ SAVE IT
0710  1021 2070 0070         ISZ XMPTR   [ ++XMPTR
0711  1022 7000              NOP         [ FOR SKIP
0712  1023 1470 0070         TAD;XMPTR   [ GET NEXT CHAR
0713  1024 2070 0070         ISZ XMPTR   [ ++XMPTR
0714  1025 7000              NOP         [ FOR SKIP
0715  1026 7012              RTR         [ >>= 2
0716  1027 7012              RTR         [ >>= 2
0717  1030 7010              RAR         [ >>= 1  == <<= 8
0720  1031 0174 7400         AND (7400   [ KEEP 4 BITS
0721  1032 1103 0103         TAD XMWORD  [ OR IN LOW 8 BITS
0722  1033 2073 0073         ISZ XMCNT
0723  1034 2073 0073         ISZ XMCNT
0724  1035 7000              NOP         [ FOR SKIP
0725  1036 5600 1000         JMP;RDWD    [ RETURN WITH WORD
0726                                     [
0727                                     [ ROUTINE TO READ 1
0730                                     [ 128 BYTE XMODEM BLOCK
0731                                     [
0732  1037 0000      #XMGET  0           [ RETURN ADDRESS
0733  1040 7300              CLA CLL
0734  1041 1177 1155         TAD (XMBUF  [ XMPTR = ADDR(XMBUF)
0735  1042 3070 0070         DCA XMPTR
0736  1043 3072 0072         DCA XMCKSM  [ XMCKSM = 0
0737  1044 1176 7600         TAD (0-128.
0740  1045 3073 0073         DCA XMCNT   [ XMCNT = -128.
0741  1046 1074 0074         TAD XMACK   [ SEND ACK OR NACK
0742  1047 4560 0466         JMS CHSEND
0743  1050 4546 0473 #XMGSOH JMS CHGET   [ WAIT FOR SOH
0744  1051 3104 0104         DCA XMPROT  [ SAVE CHAR
0745  1052 1104 0104         TAD XMPROT  [ RESTORE
0746  1053 1145 7777         TAD (0-XSOH [ IS CHAR == SOH?
0747  1054 7450              SNA
0750  1055 5267 1067         JMP XMGBLK  [ CHAR == SOH
0751  1056 7300              CLA CLL     [ CHAR != SOH
0752  1057 1104 0104         TAD XMPROT  [ IS CHAR == EOT?
0753  1060 1144 7774         TAD (0-XEOT
0754  1061 7450              SNA
0755  1062 5265 1065         JMP XMGEOT  [ CHAR IS EOT
0756  1063 4350 1150         JMS XMNACK  [ NOT EOT.  JUNK!  NAK!








     8L OF XMTAPE     PAGE 10
LN=0757

0757  1064 5250 1050         JMP XMGSOH  [ AND GO LOOK FOR SOH
0760  1065 7301      #XMGEOT CLA CLL IAC [ IF EOT -- RETURN 1
0761  1066 5637 1037         JMP;XMGET
0762  1067 4546 0473 #XMGBLK JMS CHGET   [ SOH.  GET BLOCK #
0763  1070 7041              CMA IAC     [ COMPARE TO EXPECTED
0764  1071 1071 0071         TAD XMBLK
0765  1072 7450              SNA
0766  1073 5277 1077         JMP XMGBLC  [ OK.  GET COMPLEMENT
0767  1074 7402              HLT         [ NOT OK.  HALT, THEN NAK
0770  1075 4350 1150         JMS XMNACK
0771  1076 5250 1050         JMP XMGSOH  [ THEN GET SOH AGAIN
0772  1077 4546 0473 #XMGBLC JMS CHGET   [ GET BLOCK COMPLEMENT
0773  1100 7001              IAC         [ NOW IT IS -BLOCK (ALMOST)
0774  1101 1071 0071         TAD XMBLK   [ COMPARE WITH EXPECTED
0775  1102 0143 0377         AND (377    [ 8 BIT SUM
0776  1103 7450              SNA
0777  1104 5310 1110         JMP XMGDAT  [ OK - GO GET DATA
1000  1105 7402              HLT         [ NOT OK.  HALT, THEN NAK
1001  1106 4350 1150         JMS XMNACK
1002  1107 5250 1050         JMP XMGSOH
1003  1110 4546 0473 #XMGDAT JMS CHGET   [ GET A CHAR OF DATA
1004  1111 3470 0070         DCA;XMPTR   [ *XMPTR = CHAR
1005  1112 1470 0070         TAD;XMPTR   [ RESTORE TO AC
1006  1113 1072 0072         TAD XMCKSM  [ ADD TO CHKSUM
1007  1114 3072 0072         DCA XMCKSM
1010  1115 2070 0070         ISZ XMPTR   [ ++XMPTR
1011  1116 7000              NOP         [ FOR SKIP
1012  1117 2073 0073         ISZ XMCNT   [ UNTIL ++XMCNT == 0
1013  1120 5310 1110         JMP XMGDAT
1014  1121 4546 0473 #XMGCKS JMS CHGET   [ GET CHECKSUM CHAR
1015  1122 7041              CMA IAC     [ - CHECKSUM
1016  1123 1072 0072         TAD XMCKSM  [ COMPARE WITH EXPECTED
1017  1124 0143 0377         AND (377    [ 8 BIT SUM
1020  1125 7450              SNA
1021  1126 5334 1134         JMP XMGACK  [ OK -- GO ACK
1022  1127 7402              HLT         [ FOR DEBUGGING
1023  1130 7300              CLA CLL
1024  1131 1151 0025         TAD (XNAK   [ PRIME TO NACK
1025  1132 3074 0074         DCA XMACK
1026  1133 5240 1040         JMP XMGET+1 [ AND TRY AGAIN
1027  1134 1147 0006 #XMGACK TAD (XACK   [ ACK1
1030  1135 3074 0074         DCA XMACK   [ PRIME TO ACK IT
1031  1136 7300              CLA CLL     [ BUMP XMODEM BLOCK #
1032  1137 1071 0071         TAD XMBLK
1033  1140 7001              IAC
1034  1141 0143 0377         AND (377    [ ONLY 8 BITS!
1035  1142 3071 0071         DCA XMBLK
1036  1143 1177 1155         TAD (XMBUF  [ XMPTR = ADDR(XMBUF)
1037  1144 3070 0070         DCA XMPTR
1040  1145 1176 7600         TAD (0-128. [ XMCNT = -128.
1041  1146 3073 0073         DCA XMCNT
1042  1147 5637 1037         JMP;XMGET   [ RETURN (AC=0)
1043                                     [
1044                                     [ ROUTINE TO SEND
1045                                     [ A NACK CHAR








     8L OF XMTAPE     PAGE 11
LN=1046

1046                                     [
1047  1150 0000      #XMNACK 0           [ RETURN ADDR
1050  1151 7300              CLA CLL
1051  1152 1151 0025         TAD (XNAK
1052  1153 4560 0466         JMS CHSEND
1053  1154 5750 1150         JMP;XMNACK  [ RETURN
1054                                     [
1055                                     [ XMODEM BUFFER
1056                                     [
1057  1155 0000      #XMBUF  0





















































     8R OF XMTAPE     PAGE 01

0001 AXO    0022  0137 0462 0625
0077 BLKCNT 0047  0077 0105 0214 0216 0217 0537 0541 0542 0645 0647 0650
0254 BLOCK  0141  0106 0143
0473 CHGET  0425  0321 0431 0743 0762 0772 1003 1014
0466 CHSEND 0414  0225 0353 0356 0362 0373 0407 0420 0546 0551 0654 0657
                   0742 1052
0523 CMPBLK 0464  0437 0466
0540 CMPCBK 0506  0532
0543 CMPCWD 0511  0523
0505 CMPHNK 0446  0544
0500 CMPINI 0436  0112
0511 CMPRB  0452  0474
6402 DKCC   0030  0404
6406 DKRB   0031  0430
6401 DKSF   0027  0426
6416 DTLS   0032  0415
6411 DTSF   0033  0416
0101 HNKCNT 0051  0125 0150 0161 0203 0450 0473 0504 0531 0567 0610 0613
                   0636
0102 HNKMEM 0052  0126 0130 0145 0147 0162 0167 0172 0201 0202 0451 0453
                   0470 0472 0505 0514 0520 0527 0530 0570 0576 0600 0606
                   0607 0614 0616 0633 0635
0274 HNKNXW 0166  0175
0271 HNKSND 0163  0204
0225 INIT1  0106  0100
0220 INITP  0101  0073
0002 PDP    0023  0133 0142 0456 0465 0621 0630
0242 RDBLK  0127  0151
0700 RDC    0025  0140 0463
0236 RDHNK  0123  0221
1012 RDWD1  0701  0676
1016 RDWD2  0705  0673
1000 RDWD   0667  0511 0574 0725
0075 ROTCNT 0045  0242 0245
0002 SRCMP  0015  0110
0001 SRTAPE 0014  0071
0004 SRWRIT 0016  0114
0200 START  0061  0227 0335 0553 0661
0023 TMA    0024  0132 0455 0620
0100 WDCNT  0050  0165 0174 0510 0522 0573 0602
0076 WDCNTI 0046  0075 0103 0164 0177 0507 0525 0572 0604
0706 WDE    0026  0626
0366 WDFILL 0302  0307
0361 WDFLSH 0275  0222 0301 0310
0335 WDROT  0244  0246
0330 WDSEND 0237  0171 0256 0267
0641 WTBLK  0615  0637
0653 WTBLOK 0627  0561 0631
0615 WTGBK  0571  0611
0611 WTGHNK 0565  0652
0620 WTGWD  0574  0603
0603 WTINI  0557  0116
0006 XACK   0012  0340 0545 0550 0653 0656 1027
0030 XCAN   0011  0332
0004 XEOT   0013  0224 0753
0074 XMACK  0044  0323 0324 0331 0337 0442 0564 0741 1025 1030








     8R OF XMTAPE     PAGE 02

0071 XMBLK  0041  0063 0265 0355 0360 0764 0774 1032 1035
1155 XMBUF  1057  0064 0261 0367 0701 0734 1036
0072 XMCKSM 0042  0364 0376 0377 0406 0736 1006 1007 1016
0073 XMCNT  0043  0067 0254 0255 0264 0276 0306 0366 0402 0440 0562 0671
                   0704 0722 0723 0740 1012 1041
1134 XMGACK 1027  1021
1077 XMGBLC 0772  0766
1067 XMGBLK 0762  0750
1121 XMGCKS 1014
1110 XMGDAT 1003  0777 1013
1065 XMGEOT 0760  0755
1037 XMGET  0732  0674 0761 1026 1042
1050 XMGSOH 0743  0757 0771 1002
1150 XMNACK 1047  0756 0770 1001 1053
0104 XMPROT 0054  0744 0745 0752
0070 XMPTR  0040  0065 0240 0243 0247 0251 0252 0262 0303 0304 0370 0372
                   0375 0400 0702 0706 0710 0712 0713 0735 1004 1005 1010
                   1037
0425 XMPUT  0350  0320 0410
0400 XMSEND 0317  0257 0327 0342 0343
0417 XMSND1 0336  0334
0446 XMSPUT 0371  0403
0103 XMWORD 0053  0707 0721
0025 XNAK   0010  0325 0441 0563 1024 1051
0001 XSOH   0007  0352 0746

=================================================

     8L OF CMPTAP     PAGE 01
LN=0001

0001                                     [
0002                                     [ PROGRAM TO COMARE TWO
0003                                     [ LINC TAPES IN STD OR
0004                                     [ 129. WORD FORMAT
0005                                     [
0006                                     [
0007                                     [ CONSTANTS
0010                                     [
0011                 SRTAPE=1            [ SR 11 = 1 FOR DECTAPE
0012                                     [
0013                                     [ SPECIAL INSTRUCTIONS
0014                                     [
0015                 AXO=1
0016                 PDP=2
0017                 TMA=23
0020                 RDC=700
0021                                     [
0022                                     [ DATA
0023                                     [
0024                 $70
0025  0070 0000      #WDCNTI 0           [ WORDS / BLOCK
0026  0071 0000      #BLKCNT 0           [ BLOCKS / TAPE
0027  0072 0000      #WDCNT  0           [ WORD COUNTER
0030  0073 0000      #HNKCNT 0           [ BLOCK COUNTER
0031  0074 0000      #HNKMEM 0           [ MEMORY POINTER
0032                                     [
0033                                     [ BEGIN HERE
0034                                     [
0035                 $200
0036  0200 7402      #START  HLT         [ WAIT FOR TAPE MOUNT
0037  0201 7300              CLA CLL
0040  0202 7404              OSR         [ READ RIGHT SWITCHES
0041  0203 0177 0001         AND (SRTAPE
0042  0204 7440              SZA         [ SKIP IF STD LINC TAPE
0043  0205 5213 0213         JMP INITP   [ GO INIT DEC TAPE
0044  0206 1176 7400         TAD (0-256. [ STD IS 256 WDS
0045  0207 3070 0070         DCA WDCNTI
0046  0210 1175 7000         TAD (0-1000 [ 1000 BLOCKS
0047  0211 3071 0071         DCA BLKCNT
0050  0212 5220 0220         JMP INIT1   [ CONTINUE
0051  0213 7300      #INITP  CLA CLL
0052  0214 1174 7577         TAD (0-129. [ DEC TAPES 129. WDS
0053  0215 3070 0070         DCA WDCNTI
0054  0216 1173 5000         TAD (0-3000 [ 3000 BLOCKS
0055  0217 3071 0071         DCA BLKCNT
0056  0220 7300      #INIT1  CLA CLL
0057  0221 3241 0241         DCA BLOCK0  [ RESET BLOCK #'S
0060  0222 3270 0270         DCA BLOCK1
0061                                     [
0062                                     [ READ IN THE NEXT HUNK
0063                                     [ OF 16 BLOCKS
0064                                     [
0065  0223 7300      #RDHNK  CLA CLL
0066  0224 1172 7760         TAD (0-16.
0067  0225 3073 0073         DCA HNKCNT  [ HNKCNT = -16.


    8L OF CMPTAP     PAGE 02
LN=0070

0070  0226 3074 0074         DCA HNKMEM  [ HNKMEM = 0
0071  0227 7300      #RDBLK0 CLA CLL     [ READ HUNK FROM U0
0072  0230 1074 0074         TAD HNKMEM  [ TMA MEM ADDR
0073  0231 6141              LINC
0074  0232 0023              TMA
0075  0233 0002              PDP
0076  0234 7300              CLA CLL
0077  0235 1171 1020         TAD (1020   [ XA FIELD 1
0100  0236 6141              LINC
0101  0237 0001              AXO
0102  0240 0700              RDC 0       [ READ UNIT 0
0103  0241 0000      #BLOCK0 0           [ BLOCK NUMBER
0104  0242 0002              PDP
0105  0243 2241 0241         ISZ BLOCK0  [ ++BLOCK0
0106  0244 7300              CLA CLL
0107  0245 1074 0074         TAD HNKMEM  [ HNKMEM += 256.
0110  0246 1170 0400         TAD (256.
0111  0247 3074 0074         DCA HNKMEM
0112  0250 2073 0073         ISZ HNKCNT  [ UNTIL ++HNKCNT == 0
0113  0251 5227 0227         JMP RDBLK0
0114                                     [
0115                                     [ THEN READ A HUNK
0116                                     [ FROM UNIT 1
0117                                     [
0120  0252 7300              CLA CLL
0121  0253 1172 7760         TAD (0-16.  [ HNKCNT = -16.
0122  0254 3073 0073         DCA HNKCNT
0123  0255 3074 0074         DCA HNKMEM  [ HNKMEM = 0
0124  0256 7300      #RDBLK1 CLA CLL
0125  0257 1074 0074         TAD HNKMEM  [ TMA MEM ADDR
0126  0260 6141              LINC
0127  0261 0023              TMA
0130  0262 0002              PDP
0131  0263 7300              CLA CLL
0132  0264 1167 2020         TAD (2020   [ XA MODE, FIELD 2
0133  0265 6141              LINC
0134  0266 0001              AXO
0135  0267 0710              RDC 10      [ READ UNIT 1
0136  0270 0000      #BLOCK1 0
0137  0271 0002              PDP
0140  0272 2270 0270         ISZ BLOCK1  [ ++BLOCK1
0141  0273 7300              CLA CLL
0142  0274 1074 0074         TAD HNKMEM  [ HNKMEM += 256
0143  0275 1170 0400         TAD (256.
0144  0276 3074 0074         DCA HNKMEM
0145  0277 2073 0073         ISZ HNKCNT  [ UNTIL ++HNKCNT == 0
0146  0300 5256 0256         JMP RDBLK1
0147                                     [
0150                                     [ THEN COMPARE THE
0151                                     [ TWO, 1 WORD AT A
0152                                     [ TIME, BLOCK BY BLOCK
0153                                     [ UNTIL THE HUNK IS DONE
0154                                     [
0155  0301 7300              CLA CLL
0156  0302 1172 7760         TAD (0-16.  [ BLOCKS / HUNK


    8L OF CMPTAP     PAGE 03
LN=0157

0157  0303 3073 0073         DCA HNKCNT
0160  0304 3074 0074         DCA HNKMEM  [ HNKMEM = 0
0161  0305 7300      #CMPBLK CLA CLL
0162  0306 1070 0070         TAD WDCNTI  [ WDCNT = -WORDS/BLOCK
0163  0307 3072 0072         DCA WDCNT
0164  0310 7300      #CMPWD  CLA CLL
0165  0311 6211              CDF 10      [ DATA FIELD 1
0166  0312 1474 0074         TAD;HNKMEM  [ GET WORD
0167  0313 7041              CMA IAC     [ -WORD
0170  0314 6221              CDF 20      [ DATA FIELD 2
0171  0315 1474 0074         TAD;HNKMEM
0172  0316 6201              CDF 0       [ BACK TO NORMAL
0173  0317 7440              SZA         [ DID WORDS COMPARE?
0174  0320 7402              HLT         [ MIS COMPARE !!
0175  0321 2074 0074         ISZ HNKMEM  [ ++HNKMEM
0176  0322 7000              NOP         [ FOR SKIP
0177  0323 2072 0072         ISZ WDCNT   [ UNTIL BLOCK IS DONE
0200  0324 5310 0310         JMP CMPWD
0201  0325 7300              CLA CLL
0202  0326 1070 0070         TAD WDCNTI  [ BUMP TO NEXT BLOCK
0203  0327 1170 0400         TAD (256.
0204  0330 1074 0074         TAD HNKMEM
0205  0331 3074 0074         DCA HNKMEM
0206  0332 2073 0073         ISZ HNKCNT  [ UNTIL ALL HUNKS DONE
0207  0333 5305 0305         JMP CMPBLK
0210                                     [
0211                                     [ SEE IF ALL HUNKS
0212                                     [ HAVE BEEN COMPARED
0213                                     [
0214  0334 7300              CLA CLL
0215  0335 1071 0071         TAD BLKCNT  [ BLKCNT += 16
0216  0336 1166 0020         TAD (16.
0217  0337 3071 0071         DCA BLKCNT
0220  0340 1071 0071         TAD BLKCNT  [ RESTORE BLOCK COUNTER
0221  0341 7440              SZA         [ ALL DONE?
0222  0342 5223 0223         JMP RDHNK   [ NOPE - BACK FOR MORE
0223  0343 7402              HLT         [ ALL DONE1
0224  0344 5201 0201         JMP START+1 [ TO RUN AGAIN



















     8R OF CMPTAP     PAGE 01

0001 AXO    0015  0101 0134
0071 BLKCNT 0026  0047 0055 0215 0217 0220
0241 BLOCK0 0103  0057 0105
0270 BLOCK1 0136  0060 0140
0305 CMPBLK 0161  0207
0310 CMPWD  0164  0200
0073 HNKCNT 0030  0067 0112 0122 0145 0157 0206
0074 HNKMEM 0031  0070 0072 0107 0111 0123 0125 0142 0144 0160 0166 0171
                   0175 0204 0205
0220 INIT1  0056  0050
0213 INITP  0051  0043
0002 PDP    0016  0075 0104 0130 0137
0227 RDBLK0 0071  0113
0256 RDBLK1 0124  0146
0700 RDC    0020  0102 0135
0223 RDHNK  0065  0222
0001 SRTAPE 0011  0041
0200 START  0036  0224
0023 TMA    0017  0074 0127
0072 WDCNT  0027  0163 0177
0070 WDCNTI 0025  0045 0053 0162 0202








More information about the cctech mailing list