* BINAL - BINARY PUNCH AND LOAD PROGRAM (REV. 1.0) * * * * * BINAL - A PAL-AP DROP-IN REPLACEMENT. * * * * AUTHOR * PHILIPP HACHTMANN * * * VERSION * 1.0 (24.04.2006) - INITIAL VERSION * * * * STORAGE REQUIREMENT * ONE SEGMENT * * * FEATURES: * NO 4/6/6 FORMAT, DIRECT BINARY DATA * BLOCK CHECKSUMS * LOAD AND GO CAPABLE * SUPPORTS ONLY HIGH SPEED PAPER TAPE PUNCH * * * USAGE * FIRST LOAD THE OBJECT TAPE INTO ANY SECTOR 'XX000 IN MEMORY. * TO PUNCH A SELF LOADING TAPE DO THE FOLLOWING: * -PRESS MSTCLR * -SET P TO 'XX000 * -IF LOAD AND GO IS DESIRED, PUT PROGRAM'S START ADDRESS INTO A * -PRESS START * -ENTER THE FIRST ADDRESS TO BE PUNCHED INTO A * -PRESS START * -ENTER THE LAST ADDRESS TO BE PUNCHED INTO A * -PRESS START, BINAL PUNCHES YOUR SYSTEM TAPE * * TO MAKE A BINAL SLST TAPE * USE 'XX000 THAT AS FIRST LOCATION TO BE PUNCHED. * THE LAST LOCATION TO BE PUNCHED IS 'XX577, THE REST OF THE SECTOR IS * ALWAYS AND AUTOMATICALLY PUNCHED OUT. * * LOADING SLST TAPES * SIMPLY MOUNT THE GENERATED TAPE ON THE HIGH SPEED PAPER TAPE READER * AND LOAD WITH THE STANDARD KEY-IN LOADER. * THE CONTENTS OF THE TAPE GO TO WHERE THEY COME FROM. THE THIRD STAGE * LOADER GOES TO 'XX600. THIS LOCATION CAN BE ALTERED BY ENTERING AN * ADDRESS INTO A BEFORE STARTING THE KEY-IN LOADER. * IT IS ALSO POSSIBLE TO ALTER THE THIRD-STAGE LOADER ADDRESS BEFORE * PUNCHING BY DEPOSITING ANOTHER ADDRESS INTO 'XX600. * * SPECIAL MODES OF OPERATION * IT IS POSSIBLE TO COLLECT THE OUTPUT OF MULTIPLE RUNS OF BINAL INTO * ONE SYSTEM TAPE. THIS IS DONE BY SENSE SWITCH SETTINGS: * SSW1 SET - DON'T PUNCH OUT SECOND AND THIRD STAGE LOADERS * SSW2 SET - DON'T PUNCH OUT DATA * SSW3 SET - DON'T PUNCH OUT END OF TAPE/GO BLOCK * SSW4 SET - PUNCH ONLY A GO BLOCK * * TAPE FORMAT: * THE TAPE CONTAINS HIGE DATA BLOCKS. * EVERY BLOCK IS PREPENDED WITH THE BLOCK START CHARACTER * AND THE BLOCK TYPE BYTE. * THEN FOLLOWS THE BLOCK DATA IN 16BIT BIG ENDIAN FORMAT. * * BLOCK TYPES * * DATA BLOCK * THE DATA BLOCK CONTAINS USER DATA AND A CHECKSUM. * LAYOUT: * | START ADDRESS | * | DATA LENGTH | * | DATA | * | BLOCK CHECKSUM | * * ZERO BLOCK * ZERO BLOCK IS USED TO REPRESENT ZERO CORE LOCATIONS * LAYOUT: * | START ADDRESS | * | ZERO LENGTH | * | BLOCK CHECKSUM | * * START LOC BLOCK * A BLOCK TO SET THE START LOCATION AFTER LOAD * LAYOUT; * | START ADDRESS | * | CHECKSUM (HAHA)| * * GO BLOCK * THIS BLOCK STOPS LOADING AND JUMPS TO THE START LOCATION. * IF NO START LOCATION HAS BEEN CODED THE LOADER WILL * CONTIUNE! * * STOP BLOCK * THIS BLOCK TELLS THE LOADER THAT IT SHALL STOP NOW. * LAYOUT: * NO BODY AT ALL, ONLY BLOCK START AND BLOCK TYPE :-) * ************************************************************************ * SUBR BINAL,ANF SUBR LSTART,BO3S BEGINNING OF THIRD STAGE LOADER * REL RELOCATABLE MODE ORG 0 * ANF STA STRT SAVE AUTO START LOCATION CRA HLT STA ALOC FIRST LOCATION TO PUNCH CRA HLT STA ELOC LAST LOCATION TO PUNCH * * FIRST SOME PREPARATIONS FOR THE SECOND AND THIRD STAGE LOADERS * CRA STA PTR2 CLEAR PTR2, SO KEY-IN LOADER WILL STOP THERE. STA PAUS TERMINATOR FOR THIRD STAGE LOADER * * BUT HERE WE GO OCP '0002 START PUNCH (NOT NECESSARY ON MY H316) * SR1 SKIP IF SSW 1 RESET JMP NOBO NO BOOT CODE JST PLDR PUNCH OUT LEADER JST PS2 PUNCH SECOND STAGE LOADER JST PS3 PUNCH THIRD STAGE LOADER * NOBO SS2 SKIP IF SSW 2 SET JST PDAT PUNCH OUT DATA * LDA STRT START ADDRESS SZE SET? JST ABLK MAKE ADRESS-BLOCK * SR3 SKIP IF SSW3 RESET JMP NOGO NO GO/STOP BLOCK * LDA STRT SZE JST GBLK MAKE GO BLOCK LDA STRT SNZ JST SBLK MAKE STOP BLOCK * NOGO JST PLDR END OF TAPE HAS COME. HLT JMP *-1 NO ESCAPE * * ********************** * PUNCH THE DESIRED DATA PDAT DAC ** * LOOP CRA MAIN LOOP LDA ELOC SUB ALOC AOA ONE IS MINIMUM STA AVAL AVAILABLE NUMBER OF WORDS SNZ JMP* PDAT END OF DATA, WE ARE HAPPY, RETURN * * TRY TO MAKE A ZERO BLOCK LDA ALOC JST CZER COUNT ZERO LOCATIONS - IF ANY CAS ZMIN COMPARE WITH MINIMUM FOR ZERO BLOCK JMP MKZE GO TO MAKE A ZERO BLOCK JMP MKZE GO FOR THE ZERO BLOCK AS WELL JMP FILL PREPARE CONVETIONAL BLOCK MKZE CAS AVAL BLOCK TOO BIG?? LDA AVAL YES, LIMIT BLOCK SIZE NOP TIGHT FIT JST ZBLK PRODUCE THE THE BLOCK JMP LOOP CONTINUE IN THE MAIN LOOP FILL CRA STUFF A PACKET STA BCNT CLEAR BLOCK SIZE * STUF LDA ALOC ADD BCNT CALCULATE NEW POSITION TO LOOK AT JST CFIL DETERMINE AMOUNT OF CONTIGUOUS DATA ADD BCNT ADD ACTUAL BLOCK SIZE CAS AVAL COMPARE THAT WITH AVAILABLE DATA LDA AVAL TOO MUCH, LIMIT AND GO SKP A TIGHT FIT JMP FIL2 FILL MORE! JST DBLK PRODUCE BLOCK JMP LOOP RETURN TO MAIN LOOP * FIL2 STA BCNT UPDATE BLOCK SIZE ADD ALOC MAKE NEW STARTING LOCATION JST CZER COUNT FOLLOWING ZEROS CAS ZMIN COMPARE WITH MINIMUM FOR A ZERO BLOCK JMP BEND OK, THERE ARE ENOUGH ZEROS. BLOCK SHALL BE GOOD. JMP BEND * NO, WE CONTINUE LOOKING ADD BCNT ADD CURRENT BLOCK SIZE STA BCNT AND UPDATE IT JMP STUF STUFF MORE * BEND LDA BCNT JST DBLK PUNCH THE BLOCK JMP LOOP BACK TO MAIN LOOP * ************************** * AVAL DEC 0 AVAILABLE DATA SIZE IPTR DEC 0 IMAGINARY POINTER BCNT DEC 0 PACKET SIZE COUNTER ZMIN DEC 8 MIN AMOUNT OF ZEROS FOR A BLOCK BREAK STRT DEC 0 ADDRESS FOR AUTO-START * * ******************* * MAKE A STOP BLOCK SBLK DAC ** LDA BSTA START CHARACTER ICA ADD TSTP BLOCK TYPE JST SWRD PUNCH THAT JMP* SBLK * * ******************* * MAKE A GO BLOCK GBLK DAC ** LDA BSTA START CHARACTER ICA ADD TGO BLOCK TYPE JST SWRD PUNCH THAT JMP* GBLK * * ****************** * MAKE A START ADDRESS BLOCK ABLK DAC ** STA CNT2 SAVE THE ADDRESS LDA BSTA START CHARACTER ICA ADD TSAD BLOCK TYPE JST SWRD PUNCH THAT LDA CNT2 JST SWRD JST SWRD JMP* ABLK * * ******************* * MAKE ZERO BLOCK ZBLK DAC ** PRODUCE A ZERO BLOCK STA CNT2 STORE SIZE OF BLOCK LDA BSTA START CHARACTER ICA ADD TZER BLOCK TYPE JST SWRD PUNCH THAT LDA ALOC LOAD START ADDRESS JST SWRD PUNCH START ADDRESS STA CSUM INIT CHECKSUM LDA CNT2 LOAD SIZE JST SWRD PUNCH SIZE ADD CSUM ADD CHECKSUM JST SWRD PUNCH OUT CHECKSUM LDA ALOC RELOAD POINTER ADD CNT2 CALCULATE NEW POINTER STA ALOC UPDATE ALOC JMP* ZBLK END * * ******************** * MAKE DATA BLOCK DBLK DAC ** STA CNT2 SAVE SIZE * LDA BSTA START CHARACTER ICA ADD TDAT DATA BLOCK TYPE JST SWRD PUNCH * LDA ALOC START ADDRESS JST SWRD PUNCH IT STA CSUM INIT CHECKSUM * LDA CNT2 PACKET SIZE JST SWRD PUNCH IT ADD CSUM STA CSUM UPDATE CHECKSUM * LDA CNT2 TCA STA CNT2 NOW WE USE IT AS NEG COUNTER * DDLP LDA* ALOC LOAD DATA JST SWRD PUNCH DATA ADD CSUM STA CSUM UPDATE CHECKSUM IRS ALOC IRS CNT2 JMP DDLP LOOP IT JST SWRD PUNCH CHECKSUM JMP* DBLK BLOCK DONE * * * ******************** * COUNT FILLED LOCATIONS CFIL DAC ** STA PTR STORE ADDRESS TO POINTER LDA SNZ LOAD DISCRIMINATOR OPERATION STA DISC STORE INTO COUNT ROUTINE JST COUN GO AND COUNT IT JMP* CFIL * ******************** * COUNT ZERO LOCATIONS CZER DAC ** STA PTR STORE ADDRESS TO POINTER LDA SZE STA DISC JST COUN JMP* CZER * COUN DAC ** COUNT FILLED OR EMPTY LOCATIONS CRA STA CNT2 INITIALIZE COUNTER CLOP LDA* PTR DISC SZE WILL BE DYNAMICALLY OVERWRITTEN JMP ZFIN NOW OTHER KIND OF DATA IRS CNT2 NOTE DOWN THE FIND IRS PTR POINT TO NEXT LOCATION TO BE TESTED SKP JMP ZFIN ADDRESS OVERFLOW MUST STOP COUNTING JMP CLOP COUNT ON ZFIN LDA CNT2 JMP* COUN * * *********************** * PS2 DAC ** PUNCH OUT SECOND STAGE LOADER LDA B2AD LOAD START ADDRESS OF SECOND STAGE LOADER JST P23 CALL PUNCH23 ROUTINE JMP* PS2 * PS3 DAC ** PUNCH OUT SECOND STAGE LOADER LDA S3SC LOAD START CHARACTER OTA 2 PUNCH START CHARACTER JMP *-1 LDA B3AD LOAD START ADDRESS OF SECOND STAGE LOADER JST P23 CALL PUNCH23 ROUTINE JMP* PS3 * P23 DAC ** PUNCH OUT A LOADER STA PTR SAVE POINTER L23 LDA* PTR JST SWRD PUNCH OUT CURRENT WORD SNZ JMP* P23 RETURN IRS PTR INCREMENT POINTER JMP L23 LOOP AGAIN * * ********************** * PUNCH SOME LEADER PLDR DAC ** PUNCH LEADER LDA LDRL LOAD LEADER LENGTH TCA COMPLEMENT IT STA CNT2 STORE TO LEADER COUNTER CRA LEADER IS ZERO LLP OTA 2 JMP *-1 IRS CNT2 JMP LLP JMP* PLDR * * ********************* * PUNCH ONE WORD OF DATA SWRD DAC ** ICA OTA 2 JMP *-1 ICA OTA 2 JMP *-1 WAIT JMP* SWRD * * B2AD DAC BO2S START ADDRESS OF SECOND STAGE LOADER B3AD DAC BO3S START ADDRESS OF THIRD STAGE LOADER * LDRL DEC 100 LEADER LENGTH SZE SZE INSTRUCTION FOR FILL IN SNZ SNZ INSTRUCTION FOR FILL IN * * ************************************************************************ * THIS IST THE SECOND STAGE LOADER * * IT IS IMPORTANT THAT THERE ARE NO ZERO WORDS IN THIS CODE BECAUSE THE * KEY-IN LOADER WORKS ONLY UNTIL IT DETECTS A ZERO WORD. * BO2S DAC '20 START ADDRESS, ALWAYS '20 JMP '10 JUMP BACK INTO KEY-IN LOADER * *S21 OCP '001 THIS IS THE JUMP-IN LOCATION, WILL GO TO '21 * INA '1001 READ FROM PAPER TAPE JMP '17-BO2S+*-1 WAIT SUB '17-BO2S+S3SC STAGE 3 START CHARACTER SZE JMP '17-BO2S+*-4 EAT UP ALL JUNK * INA '1001 READ FROM PAPER TAPE JMP '17-BO2S+*-1 WAIT ICA OTHER CHARACTER INA '001 READ FROM TAPE WITHOUT CLEARING A JMP '17-BO2S+*-1 WAIT * STA '17-BO2S+CNT2 STORE START ADDRESS OF THIRD STAGE * LDA '57 LOOK FOR DEPOSITED OTHER BOOT ADDRESS * SZE OK, IF WE FIND SOMETHING THERE... * STA '17-BO2S+CNT2 OVERWRITE DEFAULT VALUE LDA '17-BO2S+CNT2 RELOAD START ADDRESS STA* '17-BO2S+CNT2 STORE THAT ADDRESS INTO ITSELF IRS '17-BO2S+CNT2 CORRECT STOLEN WORD LDA '17-BO2S+CNT2 WHERE TO LOAD NOW? STA '17-BO2S+PTR2 INIT WRITE POINTER * LOP INA '1001 READ IN CHARACTER JMP '17-BO2S+*-1 WAIT ICA OTHER CHARACTER INA '001 READ FROM TAPE WITHOUT CLEARING A JMP '17-BO2S+*-1 WAIT SNZ DID WE LOAD A ZERO? JMP* '17-BO2S+CNT2 JUMP INTO THIRD STAGE LOADER STA* '17-BO2S+PTR2 STORE DATA IRS '17-BO2S+PTR2 MOVE ON JMP '17-BO2S+LOP FETCH MORE DATA * S3SC OCT '301 START CHARACTER TO RECOGNIZE STAGE3 PTR2 DAC ** MEMORY POINTER CNT2 DAC ** LOAD ADDRESS * * ************************************************************************ * HERE COMES THE THIRD STAGE LOADER * ORG '600 BO3S DAC * THAT IS FOR THE SECOND STAGE LOADER ********* * COMPLETE THE PAUS ROUTINE LDA PJ1 STA J1 LDA PJ2 STA J2 CRA STA PAUS STA JH * * START LOADING OCP 1 READER ON SLOP INA '1001 CRA AND READ JMP *-1 SUB BSTA BLOCK START? SZE JMP SLOP BACK TO SEARCH LOOP INA '1001 READ BLOCK TYPE JMP *-1 STA BTYP STORE BLOCK TYPE FOR LATER USE CAS TSAD START ADDRESS BLOCK? JMP *+2 JMP RSAD READ START ADDRESS BLOCK NOP CAS TGO GO BLOCK? JMP *+2 JMP RGO PROCESS GO BLOCK NOP CAS TDAT DATA BLOCK? JMP *+2 JMP RBLK READ DATA BLOCK NOP CAS TZER ZERO BLOCK? JMP *+2 JMP RBLK READ ZERO BLOCK NOP CAS TSTP STOP BLOCK? JMP *+2 JMP RSTP PROCESS STOP BLOCK NOP LDA EBT ERROR BLOCK TYPE JST PAUS PAUSE JMP SLOP SEARCH FOR NEW BLOCK * ******************** * START ADDRESS BLOCK RSAD JST LWRD STA RESA JST LWRD SUB RESA SZE JMP CERR CHECKSUM ERROR! JMP SLOP LOOK FOR NEW BLOCK! * * RGO JMP* RESA * ********************* * READ DATA OR ZERO BLOCK RBLK JST LWRD STA PTR START ADDRESS STA CSUM JST LWRD TCA TWO'S COMPLEMENT STA LEN GO COUNTER TCA TWO'S COMPLEMENT BACK ADD CSUM STA CSUM RLP LDA BTYPE CAS TDAT DATA BLOCK? JMP RZER NO JMP RDAT YES JMP RZER NO, CLEAR A RDAT JST LWRD STA* PTR ADD CSUM ADD TO CHECKSUM STA CSUM EL IRS PTR POINT TO NEXT LOCATION SKP JMP BO3S OVERFLOW! IRS LEN INCREMENT NEG COUNTER JMP RLP READ ON * JST LWRD NOW READ IN THE CHECKSUM SUB CSUM SNZ JMP SLOP CERR CRA CHECKSUM ERROR HALT JST PAUS JMP SLOP TRY A NEW BLOCK * RZER CRA STA* PTR STORE ZERO JMP EL USE END OF LOOP ABOVE ******* * STOP BLOCK RSTP LDA BO3S FOR SHOW JST PAUS JMP* RESA JUMP TO RESTART LOCATION * * ********************** * CONSTANTS * RESA DAC SLOP RESTART ADDRESS BSTA DEC 129 BLOCK START CHARACTER EBT OCT '125252 ERROR MESSAGE FOR A REG * * BLOCK TYPES: TSAD OCT '33 TGO OCT '44 TZER OCT '55 TSTP OCT '66 TDAT OCT '11 * * LWRD OCT 66 CAN'T BE INITIALLY ZERO! INA '1001 CLEAR A AND INPUT JMP *-1 ICA INA '1 INPUT JMP *-1 WAIT JMP* LWRD * FIN WRITE OUT LITERALS - IF ANY ******************* * THE ATTIC OF THE THIRD STAGE LOADER PJ1 JMP* PAUS LAST LOCATION THAT WILL BE LOADED FROM TAPE! PJ2 OCP '101 STOP READER PAUS DAC ** WILL BE INITIALIZED TO ZERO BEFORE PUNCHING J2 DAC ** BECOMES OCP '101 ON START OF LOAD JH HLT BECOMES CLEARED ON START OF LOAD J1 DAC ** BECOMES JMP* PAUS ON START OF LOAD * ***** VARIABLES CSUM DAC ** CHECKSUM LEN DAC ** LENGTH COUNTER BTYP DAC ** BLOCK TYPE ALOC *** ** CURRENT LOCATION TO PUNCH ELOC *** ** LAST LOCATION TO PUNCH PTR DAC ** MEMORY POINTER CNT DAC ** WHERE TO LOAD? CAN BE CHANGED. * ************************************************************ END ANF THAT'S IT, ENJOY!