1 * BINAL - BINARY PUNCH AND LOAD PROGRAM (REV. 1.0)
6 * BINAL - A PAL-AP DROP-IN REPLACEMENT.
15 * 1.0 (24.04.2006) - INITIAL VERSION
24 * NO 4/6/6 FORMAT, DIRECT BINARY DATA
27 * SUPPORTS ONLY HIGH SPEED PAPER TAPE PUNCH
31 * FIRST LOAD THE OBJECT TAPE INTO ANY SECTOR 'XX000 IN MEMORY.
32 * TO PUNCH A SELF LOADING TAPE DO THE FOLLOWING:
35 * -IF LOAD AND GO IS DESIRED, PUT PROGRAM'S START ADDRESS INTO A
37 * -ENTER THE FIRST ADDRESS TO BE PUNCHED INTO A
39 * -ENTER THE LAST ADDRESS TO BE PUNCHED INTO A
40 * -PRESS START, BINAL PUNCHES YOUR SYSTEM TAPE
42 * TO MAKE A BINAL SLST TAPE
43 * USE 'XX000 THAT AS FIRST LOCATION TO BE PUNCHED.
44 * THE LAST LOCATION TO BE PUNCHED IS 'XX577, THE REST OF THE SECTOR IS
45 * ALWAYS AND AUTOMATICALLY PUNCHED OUT.
48 * SIMPLY MOUNT THE GENERATED TAPE ON THE HIGH SPEED PAPER TAPE READER
49 * AND LOAD WITH THE STANDARD KEY-IN LOADER.
50 * THE CONTENTS OF THE TAPE GO TO WHERE THEY COME FROM. THE THIRD STAGE
51 * LOADER GOES TO 'XX600. THIS LOCATION CAN BE ALTERED BY ENTERING AN
52 * ADDRESS INTO A BEFORE STARTING THE KEY-IN LOADER.
53 * IT IS ALSO POSSIBLE TO ALTER THE THIRD-STAGE LOADER ADDRESS BEFORE
54 * PUNCHING BY DEPOSITING ANOTHER ADDRESS INTO 'XX600.
56 * SPECIAL MODES OF OPERATION
57 * IT IS POSSIBLE TO COLLECT THE OUTPUT OF MULTIPLE RUNS OF BINAL INTO
58 * ONE SYSTEM TAPE. THIS IS DONE BY SENSE SWITCH SETTINGS:
59 * SSW1 SET - DON'T PUNCH OUT SECOND AND THIRD STAGE LOADERS
60 * SSW2 SET - DON'T PUNCH OUT DATA
61 * SSW3 SET - DON'T PUNCH OUT END OF TAPE/GO BLOCK
62 * SSW4 SET - PUNCH ONLY A GO BLOCK
65 * THE TAPE CONTAINS HIGE DATA BLOCKS.
66 * EVERY BLOCK IS PREPENDED WITH THE BLOCK START CHARACTER
67 * AND THE BLOCK TYPE BYTE.
68 * THEN FOLLOWS THE BLOCK DATA IN 16BIT BIG ENDIAN FORMAT.
73 * THE DATA BLOCK CONTAINS USER DATA AND A CHECKSUM.
81 * ZERO BLOCK IS USED TO REPRESENT ZERO CORE LOCATIONS
88 * A BLOCK TO SET THE START LOCATION AFTER LOAD
94 * THIS BLOCK STOPS LOADING AND JUMPS TO THE START LOCATION.
95 * IF NO START LOCATION HAS BEEN CODED THE LOADER WILL
99 * THIS BLOCK TELLS THE LOADER THAT IT SHALL STOP NOW.
101 * NO BODY AT ALL, ONLY BLOCK START AND BLOCK TYPE :-)
103 ************************************************************************
105 SUBR LSTART,BO3S BEGINNING OF THIRD STAGE LOADER
110 STA STRT SAVE AUTO START LOCATION
113 STA ALOC FIRST LOCATION TO PUNCH
116 STA ELOC LAST LOCATION TO PUNCH
118 * FIRST SOME PREPARATIONS FOR THE SECOND AND THIRD STAGE LOADERS
120 STA PTR2 CLEAR PTR2, SO KEY-IN LOADER WILL STOP THERE.
121 STA PAUS TERMINATOR FOR THIRD STAGE LOADER
124 OCP '0002 START PUNCH (NOT NECESSARY ON MY H316)
126 SR1 SKIP IF SSW 1 RESET
127 JMP NOBO NO BOOT CODE
128 JST PLDR PUNCH OUT LEADER
129 JST PS2 PUNCH SECOND STAGE LOADER
130 JST PS3 PUNCH THIRD STAGE LOADER
132 NOBO SS2 SKIP IF SSW 2 SET
133 JST PDAT PUNCH OUT DATA
135 LDA STRT START ADDRESS
137 JST ABLK MAKE ADRESS-BLOCK
139 SR3 SKIP IF SSW3 RESET
140 JMP NOGO NO GO/STOP BLOCK
144 JST GBLK MAKE GO BLOCK
147 JST SBLK MAKE STOP BLOCK
149 NOGO JST PLDR END OF TAPE HAS COME.
154 **********************
155 * PUNCH THE DESIRED DATA
162 STA AVAL AVAILABLE NUMBER OF WORDS
164 JMP* PDAT END OF DATA, WE ARE HAPPY, RETURN
166 * TRY TO MAKE A ZERO BLOCK
168 JST CZER COUNT ZERO LOCATIONS - IF ANY
169 CAS ZMIN COMPARE WITH MINIMUM FOR ZERO BLOCK
170 JMP MKZE GO TO MAKE A ZERO BLOCK
171 JMP MKZE GO FOR THE ZERO BLOCK AS WELL
172 JMP FILL PREPARE CONVETIONAL BLOCK
173 MKZE CAS AVAL BLOCK TOO BIG??
174 LDA AVAL YES, LIMIT BLOCK SIZE
176 JST ZBLK PRODUCE THE THE BLOCK
177 JMP LOOP CONTINUE IN THE MAIN LOOP
178 FILL CRA STUFF A PACKET
179 STA BCNT CLEAR BLOCK SIZE
182 ADD BCNT CALCULATE NEW POSITION TO LOOK AT
183 JST CFIL DETERMINE AMOUNT OF CONTIGUOUS DATA
184 ADD BCNT ADD ACTUAL BLOCK SIZE
185 CAS AVAL COMPARE THAT WITH AVAILABLE DATA
186 LDA AVAL TOO MUCH, LIMIT AND GO
189 JST DBLK PRODUCE BLOCK
190 JMP LOOP RETURN TO MAIN LOOP
192 FIL2 STA BCNT UPDATE BLOCK SIZE
193 ADD ALOC MAKE NEW STARTING LOCATION
194 JST CZER COUNT FOLLOWING ZEROS
195 CAS ZMIN COMPARE WITH MINIMUM FOR A ZERO BLOCK
196 JMP BEND OK, THERE ARE ENOUGH ZEROS. BLOCK SHALL BE GOOD.
198 * NO, WE CONTINUE LOOKING
199 ADD BCNT ADD CURRENT BLOCK SIZE
200 STA BCNT AND UPDATE IT
204 JST DBLK PUNCH THE BLOCK
205 JMP LOOP BACK TO MAIN LOOP
207 **************************
209 AVAL DEC 0 AVAILABLE DATA SIZE
210 IPTR DEC 0 IMAGINARY POINTER
211 BCNT DEC 0 PACKET SIZE COUNTER
212 ZMIN DEC 8 MIN AMOUNT OF ZEROS FOR A BLOCK BREAK
213 STRT DEC 0 ADDRESS FOR AUTO-START
219 LDA BSTA START CHARACTER
229 LDA BSTA START CHARACTER
237 * MAKE A START ADDRESS BLOCK
239 STA CNT2 SAVE THE ADDRESS
240 LDA BSTA START CHARACTER
252 ZBLK DAC ** PRODUCE A ZERO BLOCK
253 STA CNT2 STORE SIZE OF BLOCK
254 LDA BSTA START CHARACTER
258 LDA ALOC LOAD START ADDRESS
259 JST SWRD PUNCH START ADDRESS
260 STA CSUM INIT CHECKSUM
263 ADD CSUM ADD CHECKSUM
264 JST SWRD PUNCH OUT CHECKSUM
265 LDA ALOC RELOAD POINTER
266 ADD CNT2 CALCULATE NEW POINTER
276 LDA BSTA START CHARACTER
278 ADD TDAT DATA BLOCK TYPE
281 LDA ALOC START ADDRESS
283 STA CSUM INIT CHECKSUM
288 STA CSUM UPDATE CHECKSUM
292 STA CNT2 NOW WE USE IT AS NEG COUNTER
294 DDLP LDA* ALOC LOAD DATA
297 STA CSUM UPDATE CHECKSUM
301 JST SWRD PUNCH CHECKSUM
307 * COUNT FILLED LOCATIONS
309 STA PTR STORE ADDRESS TO POINTER
310 LDA SNZ LOAD DISCRIMINATOR OPERATION
311 STA DISC STORE INTO COUNT ROUTINE
312 JST COUN GO AND COUNT IT
316 * COUNT ZERO LOCATIONS
318 STA PTR STORE ADDRESS TO POINTER
324 COUN DAC ** COUNT FILLED OR EMPTY LOCATIONS
326 STA CNT2 INITIALIZE COUNTER
328 DISC SZE WILL BE DYNAMICALLY OVERWRITTEN
329 JMP ZFIN NOW OTHER KIND OF DATA
330 IRS CNT2 NOTE DOWN THE FIND
331 IRS PTR POINT TO NEXT LOCATION TO BE TESTED
333 JMP ZFIN ADDRESS OVERFLOW MUST STOP COUNTING
339 ***********************
341 PS2 DAC ** PUNCH OUT SECOND STAGE LOADER
342 LDA B2AD LOAD START ADDRESS OF SECOND STAGE LOADER
343 JST P23 CALL PUNCH23 ROUTINE
346 PS3 DAC ** PUNCH OUT SECOND STAGE LOADER
347 LDA S3SC LOAD START CHARACTER
348 OTA 2 PUNCH START CHARACTER
350 LDA B3AD LOAD START ADDRESS OF SECOND STAGE LOADER
351 JST P23 CALL PUNCH23 ROUTINE
354 P23 DAC ** PUNCH OUT A LOADER
357 JST SWRD PUNCH OUT CURRENT WORD
360 IRS PTR INCREMENT POINTER
364 **********************
366 PLDR DAC ** PUNCH LEADER
367 LDA LDRL LOAD LEADER LENGTH
369 STA CNT2 STORE TO LEADER COUNTER
378 *********************
379 * PUNCH ONE WORD OF DATA
390 B2AD DAC BO2S START ADDRESS OF SECOND STAGE LOADER
391 B3AD DAC BO3S START ADDRESS OF THIRD STAGE LOADER
393 LDRL DEC 100 LEADER LENGTH
394 SZE SZE INSTRUCTION FOR FILL IN
395 SNZ SNZ INSTRUCTION FOR FILL IN
398 ************************************************************************
399 * THIS IST THE SECOND STAGE LOADER
401 * IT IS IMPORTANT THAT THERE ARE NO ZERO WORDS IN THIS CODE BECAUSE THE
402 * KEY-IN LOADER WORKS ONLY UNTIL IT DETECTS A ZERO WORD.
404 BO2S DAC '20 START ADDRESS, ALWAYS '20
405 JMP '10 JUMP BACK INTO KEY-IN LOADER
407 *S21 OCP '001 THIS IS THE JUMP-IN LOCATION, WILL GO TO '21
409 INA '1001 READ FROM PAPER TAPE
410 JMP '17-BO2S+*-1 WAIT
411 SUB '17-BO2S+S3SC STAGE 3 START CHARACTER
413 JMP '17-BO2S+*-4 EAT UP ALL JUNK
415 INA '1001 READ FROM PAPER TAPE
416 JMP '17-BO2S+*-1 WAIT
418 INA '001 READ FROM TAPE WITHOUT CLEARING A
419 JMP '17-BO2S+*-1 WAIT
421 STA '17-BO2S+CNT2 STORE START ADDRESS OF THIRD STAGE
422 * LDA '57 LOOK FOR DEPOSITED OTHER BOOT ADDRESS
423 * SZE OK, IF WE FIND SOMETHING THERE...
424 * STA '17-BO2S+CNT2 OVERWRITE DEFAULT VALUE
425 LDA '17-BO2S+CNT2 RELOAD START ADDRESS
426 STA* '17-BO2S+CNT2 STORE THAT ADDRESS INTO ITSELF
427 IRS '17-BO2S+CNT2 CORRECT STOLEN WORD
428 LDA '17-BO2S+CNT2 WHERE TO LOAD NOW?
429 STA '17-BO2S+PTR2 INIT WRITE POINTER
431 LOP INA '1001 READ IN CHARACTER
432 JMP '17-BO2S+*-1 WAIT
434 INA '001 READ FROM TAPE WITHOUT CLEARING A
435 JMP '17-BO2S+*-1 WAIT
436 SNZ DID WE LOAD A ZERO?
437 JMP* '17-BO2S+CNT2 JUMP INTO THIRD STAGE LOADER
438 STA* '17-BO2S+PTR2 STORE DATA
439 IRS '17-BO2S+PTR2 MOVE ON
440 JMP '17-BO2S+LOP FETCH MORE DATA
442 S3SC OCT '301 START CHARACTER TO RECOGNIZE STAGE3
443 PTR2 DAC ** MEMORY POINTER
444 CNT2 DAC ** LOAD ADDRESS
447 ************************************************************************
448 * HERE COMES THE THIRD STAGE LOADER
451 BO3S DAC * THAT IS FOR THE SECOND STAGE LOADER
453 * COMPLETE THE PAUS ROUTINE
462 SLOP INA '1001 CRA AND READ
464 SUB BSTA BLOCK START?
466 JMP SLOP BACK TO SEARCH LOOP
467 INA '1001 READ BLOCK TYPE
469 STA BTYP STORE BLOCK TYPE FOR LATER USE
470 CAS TSAD START ADDRESS BLOCK?
472 JMP RSAD READ START ADDRESS BLOCK
476 JMP RGO PROCESS GO BLOCK
480 JMP RBLK READ DATA BLOCK
484 JMP RBLK READ ZERO BLOCK
488 JMP RSTP PROCESS STOP BLOCK
490 LDA EBT ERROR BLOCK TYPE
492 JMP SLOP SEARCH FOR NEW BLOCK
495 * START ADDRESS BLOCK
501 JMP CERR CHECKSUM ERROR!
502 JMP SLOP LOOK FOR NEW BLOCK!
507 *********************
508 * READ DATA OR ZERO BLOCK
510 STA PTR START ADDRESS
515 TCA TWO'S COMPLEMENT BACK
525 ADD CSUM ADD TO CHECKSUM
527 EL IRS PTR POINT TO NEXT LOCATION
530 IRS LEN INCREMENT NEG COUNTER
533 JST LWRD NOW READ IN THE CHECKSUM
537 CERR CRA CHECKSUM ERROR HALT
539 JMP SLOP TRY A NEW BLOCK
543 JMP EL USE END OF LOOP ABOVE
546 RSTP LDA BO3S FOR SHOW
548 JMP* RESA JUMP TO RESTART LOCATION
551 **********************
554 RESA DAC SLOP RESTART ADDRESS
555 BSTA DEC 129 BLOCK START CHARACTER
556 EBT OCT '125252 ERROR MESSAGE FOR A REG
567 INA '1001 CLEAR A AND INPUT
574 FIN WRITE OUT LITERALS - IF ANY
576 * THE ATTIC OF THE THIRD STAGE LOADER
577 PJ1 JMP* PAUS LAST LOCATION THAT WILL BE LOADED FROM TAPE!
578 PAUS DAC ** WILL BE INITIALIZED TO ZERO BEFORE PUNCHING
579 JH HLT BECOMES CLEARED ON START OF LOAD
580 J1 DAC ** BECOMES JMP* PAUS ON START OF LOAD
584 LEN DAC ** LENGTH COUNTER
585 BTYP DAC ** BLOCK TYPE
586 ALOC *** ** CURRENT LOCATION TO PUNCH
587 ELOC *** ** LAST LOCATION TO PUNCH
588 PTR DAC ** MEMORY POINTER
589 CNT DAC ** WHERE TO LOAD? CAN BE CHANGED.
591 ************************************************************
592 END THAT'S IT, ENJOY!