-* BINARY PUNCH AND LOAD PROGRAM
+* BINAL - BINARY PUNCH AND LOAD PROGRAM (REV. 1.0)
*
*
-* LOAD
-* FIRST LOC TO A, LAST LOC TO B
-* RUN IT.
+*
+*
+* 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 DATA BLOCKS.
+* 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.
* IF NO START LOCATION HAS BEEN CODED THE LOADER WILL
* CONTIUNE!
*
-* TAPE END MARK:
+* STOP BLOCK
* THIS BLOCK TELLS THE LOADER THAT IT SHALL STOP NOW.
* LAYOUT:
* NO BODY AT ALL, ONLY BLOCK START AND BLOCK TYPE :-)
*
************************************************************************
*
- SUBR LSTART,BO3S LOADER START IS GOOD TO KNOW
+ SUBR BINAL,ANF
+ SUBR LSTART,BO3S BEGINNING OF THIRD STAGE LOADER
*
REL RELOCATABLE MODE
ORG 0
*
- STA STRT
+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 PLDR PUNCH OUT LEADER
JST PS3 PUNCH THIRD STAGE LOADER
- JST PLDR PUNCH OUT LEADER
+*
+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
- STA AVAL DETERMINED AVAILABLE DATA
+ AOA ONE IS MINIMUM
+ STA AVAL AVAILABLE NUMBER OF WORDS
SNZ
- JMP EDAT END OF DATA, WE ARE HAPPY
+ JMP* PDAT END OF DATA, WE ARE HAPPY, RETURN
*
-* FIRST TRY TO ESABLISH A ZERO BLOCK
+* TRY TO MAKE A ZERO BLOCK
LDA ALOC
JST CZER COUNT ZERO LOCATIONS - IF ANY
CAS ZMIN COMPARE WITH MINIMUM FOR ZERO BLOCK
JST DBLK PUNCH THE BLOCK
JMP LOOP BACK TO MAIN LOOP
*
-*
-* END OF DATA
-EDAT LDA STRT
- SZE
- JMP AUTO
- JST SBLK MAKE STOP BLOCK
- JMP EOT
-AUTO JST ABLK MAKE ADRESS-BLOCK
- JST GBLK MAKE GO-BLOCK
-EOT JST PLDR END OF JOB HAS COME.
- HLT
- JMP *-1 NO ESCAPE
-*
+**************************
*
AVAL DEC 0 AVAILABLE DATA SIZE
IPTR DEC 0 IMAGINARY POINTER
******************
* MAKE A START ADDRESS BLOCK
ABLK DAC **
- STA CNT SAVE THE ADDRESS
+ STA CNT2 SAVE THE ADDRESS
LDA BSTA START CHARACTER
ICA
ADD TSAD BLOCK TYPE
JST SWRD PUNCH THAT
- LDA CNT
+ LDA CNT2
JST SWRD
JST SWRD
JMP* ABLK
*******************
* MAKE ZERO BLOCK
ZBLK DAC ** PRODUCE A ZERO BLOCK
- STA CNT STORE SIZE OF BLOCK
+ STA CNT2 STORE SIZE OF BLOCK
LDA BSTA START CHARACTER
ICA
ADD TZER BLOCK TYPE
LDA ALOC LOAD START ADDRESS
JST SWRD PUNCH START ADDRESS
STA CSUM INIT CHECKSUM
- LDA CNT LOAD SIZE
+ LDA CNT2 LOAD SIZE
JST SWRD PUNCH SIZE
ADD CSUM ADD CHECKSUM
JST SWRD PUNCH OUT CHECKSUM
LDA ALOC RELOAD POINTER
- ADD CNT CALCULATE NEW POINTER
+ ADD CNT2 CALCULATE NEW POINTER
STA ALOC UPDATE ALOC
JMP* ZBLK END
*
********************
* MAKE DATA BLOCK
DBLK DAC **
- STA CNT SAVE SIZE
+ STA CNT2 SAVE SIZE
*
LDA BSTA START CHARACTER
ICA
JST SWRD PUNCH IT
STA CSUM INIT CHECKSUM
*
- LDA CNT PACKET SIZE
+ LDA CNT2 PACKET SIZE
JST SWRD PUNCH IT
ADD CSUM
STA CSUM UPDATE CHECKSUM
*
- LDA CNT
+ LDA CNT2
TCA
- STA CNT NOW WE USE IT AS NEG COUNTER
+ 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 CNT
+ IRS CNT2
JMP DDLP LOOP IT
JST SWRD PUNCH CHECKSUM
JMP* DBLK BLOCK DONE
*
COUN DAC ** COUNT FILLED OR EMPTY LOCATIONS
CRA
- STA CNT INITIALIZE COUNTER
+ STA CNT2 INITIALIZE COUNTER
CLOP LDA* PTR
DISC SZE WILL BE DYNAMICALLY OVERWRITTEN
JMP ZFIN NOW OTHER KIND OF DATA
- IRS CNT NOTE DOWN THE FIND
+ 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 CNT
+ZFIN LDA CNT2
JMP* COUN
*
*
P23 DAC ** PUNCH OUT A LOADER
STA PTR SAVE POINTER
L23 LDA* PTR
+ JST SWRD PUNCH OUT CURRENT WORD
SNZ
JMP* P23 RETURN
- JST SWRD PUNCH OUT CURRENT WORD
IRS PTR INCREMENT POINTER
JMP L23 LOOP AGAIN
*
PLDR DAC ** PUNCH LEADER
LDA LDRL LOAD LEADER LENGTH
TCA COMPLEMENT IT
- STA CNT STORE TO LEADER COUNTER
+ STA CNT2 STORE TO LEADER COUNTER
CRA LEADER IS ZERO
LLP OTA 2
JMP *-1
- IRS CNT
+ IRS CNT2
JMP LLP
JMP* PLDR
*
B3AD DAC BO3S START ADDRESS OF THIRD STAGE LOADER
*
LDRL DEC 100 LEADER LENGTH
-ALOC *** ** NEXT WORD TO BE PUNCHED OUT
-ELOC *** ** LAST WORD TO BE PUNCHED OUT
SZE SZE INSTRUCTION FOR FILL IN
SNZ SNZ INSTRUCTION FOR FILL IN
*
************************************************************************
* THIS IST THE SECOND STAGE LOADER
*
- ORG '317 ONLY FOR DEVELOPMENT!
-BO2S OCT '20 START ADDRESS
+* 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
- JMP '17-BO2S+*-1
+ 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 WITH CLEAR
- JMP '17-BO2S+*-1
-* JMP '17-BO2S+* DEBUG STOP
- ICA
- INA '001 READ WITHOUT CLEAR
- JMP '17-BO2S+*-1
-* JMP '17-BO2S+* DEBUG STOP
-*
-*
-*
- STA '17-BO2S+CNT STORE START ADDRESS
-* LDA '57 LOOK FOR DEPOSITED OTHER BOOT ADDRESS
-* SZE OK, IF WE FIND SOMETHING THERE...
-* STA '17-BO2S+CNT OVERWRITE DEFAULT VALUE
- IRS '17-BO2S+CNT CORRECT STOLEN WORD
- LDA '17-BO2S+CNT
-* JMP '776
-*
- LDA '17-BO2S+CNT WHERE TO LOAD NOW?
- STA '17-BO2S+PTR INIT POINTER
+ 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
- ICA
- INA '001 READ OTHER CHARACTER
- JMP '17-BO2S+*-1
- SNZ
- JMP* '17-BO2S+CNT JUMP INTO THIRD STAGE LOADER
-* JMP '665
- STA* '17-BO2S+PTR STORE DATA
- IRS '17-BO2S+PTR MOVE ON
+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
-PTR DAC ** GENERAL PURPOSE MEMORY POINTER
-CNT DAC ** WHERE TO LOAD? CAN BE CHANGED.
-BO2E OCT 10600 ZERO-TERMINATOR
+PTR2 DAC ** MEMORY POINTER
+CNT2 DAC ** LOAD ADDRESS
*
*
************************************************************************
*
ORG '600
BO3S DAC * THAT IS FOR THE SECOND STAGE LOADER
- OCP 1 READER ON (UNNECESSARY?)
+*********
+* 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?
JMP *+2
JMP RSTP PROCESS STOP BLOCK
NOP
- LDA '125252 ERROR BLOCK TYPE
- CRA
- STA *+1
- OCT 66 THE HALT TRICK
+ LDA EBT ERROR BLOCK TYPE
+ JST PAUS PAUSE
JMP SLOP SEARCH FOR NEW BLOCK
*
********************
SNZ
JMP SLOP
CERR CRA CHECKSUM ERROR HALT
- STA *+1
- OCT 66
+ JST PAUS
JMP SLOP TRY A NEW BLOCK
*
RZER CRA
JMP EL USE END OF LOOP ABOVE
*******
* STOP BLOCK
-RSTP CRA
- STA *+1
- OCT 66 A TRICK - HERE WILL BE THE HLT INSTRUCTION
+RSTP LDA BO3S FOR SHOW
+ JST PAUS
JMP* RESA JUMP TO RESTART LOCATION
*
-***** VARIABLES
-CSUM OCT 66 CHECKSUM
-LEN OCT 66 LENGTH TO GO
-RESA DAC SLOP RESTART ADDRESS
-BTYP OCT 66 BLOCK TYPE
*
+**********************
+* 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
TDAT OCT '11
*
*
-LWRD OCT 66
+LWRD OCT 66 CAN'T BE INITIALLY ZERO!
INA '1001 CLEAR A AND INPUT
JMP *-1
ICA
JMP* LWRD
*
FIN WRITE OUT LITERALS - IF ANY
-BO3E DEC 0 ZERO TERMINATOR
+*******************
+* 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
+ END THAT'S IT, ENJOY!
+