/ RX01 RESTORE / This program will receive a RX01 image and write it to the disk. The / entire disk it written, with a reread check when done writing. / / This program should be started before the program (PC) sending the data / / See dump for the format of the serial data. / To run start at 0200. / SR9-11 shoulb be drive number / Should halt at label GDHLT (140) with AC = 0 if it worked. / At normal exit hitting cont will restart the program LCD=6751 / Load the command reg with AC XDR=6752 / Load or read the transfer register STR=6753 / Skip on transfer request flag SER=6754 / Skip on error flag SDN=6755 / Skip on done flag INTR=6756 / AC = 0 interrupt off, 1 = on INIT=6757 / Initialize RX8/RX01 INAD=030 / Address of serial input, 30 for console KCF2=6000 INAD KSF2=6001 INAD KCC2=6002 INAD KRS2=6004 INAD KIE2=6005 INAD KRB2=6006 INAD OUTAD=040 / Address of serial output, 40 for console TFL2=6000 OUTAD TSF2=6001 OUTAD TCF2=6002 OUTAD TPC2=6004 OUTAD TSK2=6005 OUTAD TLS2=6006 OUTAD *10 WRTLOC, 7777 / Address to write data to disk, auto inc BUFLOC, 7777 / Address to store next word received *20 DRIVE, 0 / Drive # * 2 DRVMSK, 60 / Mask for drive bits DONEFG, 0 / Set to one when fe end of data flag rx WRCMD, 104 / 8 bit write FILCMD, 100 / 8 bit fill buffer RDCMD,106 / 8 bit read EMPCMD, 102 / 8 bit empty buffer RDERR, 116 / 8 bit read error TRACK, 0 SECT, 0 SCNT, 0 NUMSEC, 0 / Number of sectors received but not written K37, 37 K377, 377 KN1, 7777 M32, -32 M115, -115 CHKSUM, 0 TEMP, 0 STATE, 0 / Where in serial data we are 0 = Need ff sector head, / 1 = need image size byte / -1 = byte1, ... -3 = byte 3 BUFCNT, 0 / Count of words received in sector ISRAC, 0 ISRFLG, 0 RISR, ISR DECIMAL NBLKSZ, -130 / 128 words + track and sector number M128, -128 OCTAL WRITEF, WRITE FREREAD,REREAD STARTF, START SIZEFG, 0 L10, 10 L32, 32 L400, 400 L412, 412 L422, 422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE L7700, 7700 L1734, 1734 L4110, LM3670, -3670 ZOO, 0 DENSW, 0 SIZE, 0 FN, 0 LTYPE, TYPE RX02, 0 LLCD, 0 /REPLACED BY ROUTINE TO LOAD CMD REGISTER LLCD1, LCD1 LLCD2, LCD2 *1 JMP I RISR / Interrupt handler *140 GDHLT, HLT JMP I STARTF *200 START, CDF 0 / Init all our variables CAF CLA CLL OSR / Init variables changed during run RTL RTL AND DRVMSK DCA DRIVE DCA DONEFG DCA CHKSUM IAC DCA STATE CMA DCA WRTLOC CMA DCA BUFLOC DCA NUMSEC TAD M32 DCA SCNT ION / Turn on serial interrupt handler CLA CLL IAC / Set bit 11 to enable interrupts KIE2 KRB2 / RPE / Testing, use PTR with emulator / RFC RECAL, CLA CLL INIT SDN / Done? JMP .-1 JMS TYPE ILP, CLA TAD STATE / Wait for size flag to be sent SZA JMP ILP TAD SIZE AND K377 / Size received is only a byte so mask our size CMA IAC TAD SIZEFG SZA / If disk size not same as image being sent HLT / then halt JMP I WRITEF TYPE, 0 TAD L412 /MAKE A DOUBLE DENSITY READ STATUS CODE TAD DRIVE LCD SDN JMP .-1 XDR /GET STATUS WORD DCA RX02 TAD RX02 AND L32 /KEEP DENSITY ERROR; DOUBLE; QUAD TAD L10 /SINGLE=10;SING/DOUB=40;DOUB=20;QUAD=22 AND L422 /SINGLE=0;SING/DOUB=0;DOUB=20;QUAD=22 DCA ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT SER NORMAL, TAD ZOO /FETCH BACK TYPE CODE SZA CLA /SKIP IF A SINGLE DENSITY TAD L7700 /DOUBLE TAD L7700 /SINGLE=7700, DOUBLE=7600 DCA DENSW /PLACE FOR LOOP CONTROL TAD ZOO CLL RTR /PUT QUAD BIT TO LINK SNA CLA /SKIP IF DOUBLE OR QUAD TAD L1734 /SINGLE TAD L4110 /D&Q=4110, S=6044 SNL /SKIP ON QUAD, IT'S OK RIGHT NOW CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2 DCA SIZE /S=7022, D=6044, Q=4110 TAD DENSW /7700 IF SINGLE, 7600 IF DOUBLE CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE AND L400 TAD DRIVE /VOILA, 400*DOUBLE + 20*DRIVE DCA FN /PLACE INTO FUNCTION CONTROL WORD CLA TAD ZOO /FETCH BACK TYPE CODE SZA CLA /SKIP IF A SINGLE DENSITY TAD M128 /256 BYTES SECTOR DOUBLE TAD M128 /128 BYTES SINGLE TAD KN1 /2 extra bytes for sector # etc in buffer TAD KN1 DCA NBLKSZ TAD RX02 AND L10 SNA CLA JMP RX01 TAD LLCD2 DCA LLCD JMP I TYPE /RETURN RX01, TAD LLCD1 DCA LLCD JMP I TYPE /RETURN PAGE WRITE, CLA CLL IOF / Turn off interrupts so we can safely update CLA / # of sectors in buffer TAD NUMSEC SNA JMP NODAT TAD KN1 DCA NUMSEC IAC NODAT, ION SZA JMP WRSEC CMA TAD DONEFG / All data rx SZA JMP WRITE / no JMP DONE / yes WRSEC, CLA CLL / We have one waiting, write it CDF 10 TAD I WRTLOC DCA TRACK TAD I WRTLOC CDF 0 DCA SECT TAD FILCMD JMS I LLCD / Do fill buffer command CDF 10 LOOP, STR SKP JMP FILL SDN / All Done? JMP LOOP / No SER / Any errors JMP WRTIT / No XDR / Yes, leave error in AC and halt HLT CLA TAD RDERR JMS I LLCD SDN JMP .-1 XDR HLT FILL, TAD I WRTLOC XDR CLA JMP LOOP WRTIT, CLA CLL TAD WRCMD JMS I LLCD STR JMP .-1 TAD SECT XDR STR JMP .-1 CLA TAD TRACK XDR SDN / Done? JMP .-1 CLA SER / Any errors JMP NEXT / No XDR / Yes, leave error in AC and halt HLT CLA TAD RDERR JMS I LLCD SDN JMP .-1 XDR HLT NEXT, CLA CLL JMP WRITE DONE, CLA CLL / Done, wait for one more byte TAD WRTLOC IAC CIA TAD BUFLOC SZA JMP DONE TAD CHKSUM / Got checksum byte, receive routine has added it AND K377 / to checksum, verify final checksum (8 bit) is zero SZA HLT / Stop if checksum wrong JMP I FREREAD PAGE REREAD, CLA IAC / Reread disk to check for errors DCA SECT DCA TRACK DCA CHKSUM RDCHK, CLA CLL / Standard read from manual TAD TRACK TAD SECT TAD K377 TAD CHKSUM DCA CHKSUM TAD RDCMD JMS I LLCD STR JMP .-1 TAD SECT XDR STR JMP .-1 CLA TAD TRACK XDR SDN / Done? JMP .-1 CLA SER / Any errors SKP JMP ERROR CLA CLL TAD EMPCMD JMS I LLCD ELOOP, STR SKP JMP EMPTY SDN JMP ELOOP SER JMP GOOD HLT EMPTY, XDR TAD CHKSUM DCA CHKSUM JMP ELOOP GOOD, CLA CLL IAC RAL / LOAD 2 ISZ SCNT SKP JMP NXTTRK TAD SECT DCA SECT TAD SECT TAD M32 SPA SNA JMP RDCHK IAC DCA SECT JMP RDCHK NXTTRK, CLA IAC DCA SECT TAD M32 DCA SCNT ISZ TRACK TAD TRACK TAD M115 SZA JMP RDCHK CLA CMA TAD K377 / fe at end before checksum TAD CHKSUM CDF 10 TAD I WRTLOC / received checksum CDF 0 AND K377 JMP GDHLT ERROR, XDR / Yes, leave error in AC and halt HLT CLA TAD RDERR JMS I LLCD SDN JMP .-1 XDR HLT JMP I STARTF LCD1, 0 TAD FN LCD JMP I LCD1 LCD2, 0 TAD FN DCA CMD TAD CMD LCD CLA TAD CMD CLL RTL RTL RAL STR JMP .-1 XDR CLA JMP I LCD2 CMD, 0 PAGE ISR, DCA ISRAC / Save AC GTF DCA ISRFLG / And flags CDF 10 / Buffer in field 1 KSF2 / Have character waiting / RSF / Testing, use PTR with emulator JMP IRET / No, not our interrupt CLA KRB2 / Get character / RRB RFC / PTR DCA TEMP TAD CHKSUM TAD TEMP DCA CHKSUM TAD STATE / Find out where in sequence we are SNA JMP SBLK / Start of block CMA IAC / STATE +1, get size flag IAC SZA JMP DATA TAD TEMP DCA SIZEFG DCA STATE JMP IRET DATA, CLA / data byte TAD TEMP DCA I BUFLOC ISZ BUFCNT JMP IRET DCA STATE / End of sector, set to 0 to check header byte ISZ NUMSEC / Inc number of sectors buffered TAD K37 CIA TAD NUMSEC SNA HLT / To many buffered, halt. Must of had to many / retries in a row IRET, CLA TAD ISRFLG RTF CLA TAD ISRAC JMP I 0 SBLK, TAD K377 CIA TAD TEMP / Is is a ff? SNA JMP FLAGOK / Yes IAC / Is it a fe? SZA HLT / No, halt ISZ DONEFG / All data received FLAGOK, STA / -1 for byte 1 DCA STATE TAD NBLKSZ / And setup to look for blocksize words DCA BUFCNT JMP IRET $