ASMB,A,B,C,L
      HED XFORM - PROGRAM TO PRODUCE LOADER LOADERS  13 NOV 1973
* 
*     THIS PROGRAM PRODUCES THE BOOTSTRAP TAPE WHICH CAN BE USED TO 
*     EITHER RESTORE A COMPLETELY BOMBED LOADER, OR TO SWITCH FROM
*     ONE LOADER TO ANOTHER, GIVEN THAT A PAPER-TAPE TYPE LOADER CURRENTLY
*     EXISTS IN THE MACHINE.
* 
*       TO OPERATE, LOAD THIS PROGRAM; SET P TO 2, SET THE SELECT CODE OF 
*     THE PUNCH INTO SWITCH REGISTER BITS 11 - 6, AND THE READER SELECT CODE
*     INTO BITS 5 - 0.   PRESS RUN. A HALT 0 OR HLT 1 MEANS THAT THE
*     PUNCH OR READER SELECT CODES, RESPECTIVELY, ARE NOT IN THE RANGE 10 - 77. 
*     RESET THE SWITCH REGISTER TO THE PROPER SELECT CODES, AND PRESS RUN.
*     A HALT 77 INDICATES A SUCCESSFUL CONFIGURATION.  THEN PLACE THE FUNNY 
*     ABSOLUTE BINARY INTO THE READER, SET P TO 2000, AND PRESS RUN.
*     THE FUNNY PORTION  OF THE TAPE WILL BE PRODUCED, ALONG WITH SOME
*     BLANK TAPE. A HALT 76 INDICATES THAT THE PROGRAM IS READY FOR THE 
*     NEXT BINARY TAPE. PLACE THE LOADER LOADER TAPE INTO THE READER, AND 
*     PRESS RUN.  THE"NORMAL" PORTION OF THE TAPE WILL BE PRODUCED, FOLLOWED
*     BY SOME BLANK TAPE. THE PROGRAM IS NOW READY TO PRODUCE ANOTHER COMPLETE
*     BOOTSTRAP TAPE. 
* 
      ORG 2 
PUNSC EQU 0 
RDR   EQU 0 
* 
* 
      JMP *+1,I 
      DEF CONFG 
      SPC 1 
      ORG 2000B 
      SPC 1 
START CLC 0,C 
      CLA 
      RSS 
      SPC 2 
*     RESET THE BUFFER-START NEXT BLOCK 
      SPC 2 
NEWBL LDA MTEN      GET FEED FRAME COUNTER
      LDB BPNTR 
      STB BPNT
      CLB,CCE 
      JSB READ      GET A BYTE
      CMB,CCE,INB,SZB    ZERO BYTE? 
      JMP NONZR     GOT WORD COUNT
      INA,SZA       END OF TAPE?
      JMP *-5 
      JMP STRT2 
NONZR STB WDCNT 
      STB TEMP
      JSB READ
      JSB READ      GET ADDRESS 
      STB 0         START CHECKSUM
      STB ADDR
      STB TEMP0 
CHECK LDB ADDR
      ADB MAXAD 
      SEZ 
      JMP HLT55     ADDRESS TOO LARGE!
      JSB READ      GET NEXT DATA WORD
      ADA 1         UPDATE CHECKSUM 
      STB BPNT,I    STORE INTO BUFFER 
      ISZ ADDR
      ISZ BPNT
      CLE 
      ISZ WDCNT 
      JMP CHECK     GET NEXT WORD 
      JSB READ      GET TAPE CHECKSUM 
      CPB 0         CHECKSUMS MATCH?
TRAN1 JMP PNCH       YES,GO PUNCH 
      HLT 11B       CHECKSUM ERROR
      JMP START 
HLT55 HLT 55B       ADDRESS TOO LARGE!
      JMP START 
READ  NOP           IF E=0,READ WORD;=1 READ BYTE 
      CLB,CME 
RDR1  STC RDR,C 
RDR2  SFS RDR 
      JMP *-1 
RDR3  MIB RDR 
      SEZ,RSS 
      JMP READ,I
      BLF,CLE,BLF 
      JMP READ+2
BPNTR DEF BUFFR 
MTEN  DEC -10 
MAXAD OCT 100100
* 
*     PUNCH THE BUFFER IN THE FUNNY FORMAT
* 
PNCH  LDA BPNTR     RESET THE POINTER 
      STA BPNT
      LDA TEMP      AND THE COUNT 
      STA WDCNT 
PUN1  LDB BPNT,I
      LDA 1 
      ALF 
      AND B17 
      IOR B20 
      JSB PUNCH 
      LDA 1 
      ALF,ALF 
      AND B17 
      JSB PUNCH 
      LDA 1 
      ALF,ALF 
      ALF 
      AND B17 
      JSB PUNCH 
      LDA 1 
      AND B17 
      JSB PUNCH 
      ISZ BPNT
      ISZ WDCNT 
      JMP PUN1
      JMP NEWBL 
B17   OCT 17
B20   OCT 20
B377  OCT 377 
B77   OCT 77
      SPC 1 
PUNCH NOP      OUTPUT THE A REGISTER
PN1   OTA PUNSC 
PN2   STC PUNSC,C 
PN3   SFS PUNSC 
      JMP *-1 
      JMP PUNCH,I 
* 
*     THIS SECTION OF CODE SWITCHES THE BRANCH POINT
*      OF THE DONE-WITH-A-BLOCK SECTION.
* 
STRT2 CLA 
      LDB M80 
      JSB PUNCH    PUNCH TWENTY FEED FRAMES 
      INB,SZB 
      JMP *-2 
      HLT 76B      WAIT FOR NEXT TAPE.
      LDA TRCPY 
      LDB TRAN1 
      STB TRCPY 
      STA TRAN1 
      JMP START 
* 
TRCPY JMP COPY
M80   DEC -80 
M8    DEC -8
STCC  STC 0,C 
SFSI  SFS 0 
OTAI   OTA 0
MIBI  MIB 0 
* 
*     THIS SECTION DUPLICATES THE TAPE IN THE PHOTOREADER 
*     IT IS ENTERED ALTERNATELY WITH THE FUNNY CODE PRODUCER
* 
COPY  LDA BPNTR    RESET BUFFER POINTER 
      STA BPNT
      LDA TEMP
      STA WDCNT    RESET WORD COUNT 
      CMA,INA 
      JSB PUNCH    OUTPUT WORD COUNT
      CLA 
      JSB PUNCH    FOLLOWED BY A BLANK FRAME
      LDA TEMP0 
      ALF,ALF 
      AND B377
      JSB PUNCH 
      LDA TEMP0 
      AND B377
      JSB PUNCH 
* 
COPY1 LDA BPNT,I
      ALF,ALF 
      AND B377
      JSB PUNCH 
      LDA BPNT,I
      AND B377
      JSB PUNCH 
      ISZ BPNT
      ISZ WDCNT 
      JMP COPY1 
      LDA 1 
      ALF,ALF 
      AND B377
      JSB PUNCH 
      LDA 1 
      AND B377
      JSB PUNCH 
      CLA          PUNCH TWO FEED FRAMES
      JSB PUNCH 
      JSB PUNCH 
      JMP NEWBL 
TEMP0 BSS 1 
TEMP  BSS 1 
ADDR  BSS 1 
WDCNT BSS 1 
BPNT  BSS 1 
BUFFR BSS 0 
      SPC 2 
* 
*     CONFIGURE THE I/O INSTRUCTIONS
*      ASSUMES SWITCH REGISTER BITS:
*         11-6 = PUNCH SELECT CODE
*         5-0 = READER SELECT CODE
* 
CONFG LIA 1 
      AND B77       GET READER S.C. 
      STA 1 
      ADA M8
      SSA,RSS 
      JMP OK1 
      HLT 00B       BAD READER SELECT CODE
      JMP CONFG 
OK1   LDA 1 
      IOR STCC
      STA RDR1
      LDA 1 
      IOR SFSI
      STA RDR2
      LDA 1 
      IOR MIBI
      STA RDR3
      LIA 1 
      ALF,ALF 
      RAL,RAL 
      AND B77 
      STA 1 
      ADA M8
      SSA,RSS 
      JMP OK2 
      HLT 01B     BAD PUNCH SELECT CODE 
      JMP CONFG 
OK2   LDA 1 
      IOR STCC
      STA PN2 
      LDA 1 
      IOR OTAI
      STA PN1 
      LDA 1 
      IOR SFSI
      STA PN3 
      OCT 107077
* 
      END 
                                                                                                                                                                                                                                    