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 ************************************************************************
106 SUBR LSTART,BO3S BEGINNING OF THIRD STAGE LOADER
111 ANF STA STRT SAVE AUTO START LOCATION
114 STA ALOC FIRST LOCATION TO PUNCH
117 STA ELOC LAST LOCATION TO PUNCH
119 * FIRST SOME PREPARATIONS FOR THE SECOND AND THIRD STAGE LOADERS
121 STA PTR2 CLEAR PTR2, SO KEY-IN LOADER WILL STOP THERE.
122 STA PAUS TERMINATOR FOR THIRD STAGE LOADER
125 OCP '0002 START PUNCH (NOT NECESSARY ON MY H316)
127 SR1 SKIP IF SSW 1 RESET
128 JMP NOBO NO BOOT CODE
129 JST PLDR PUNCH OUT LEADER
130 JST PS2 PUNCH SECOND STAGE LOADER
131 JST PS3 PUNCH THIRD STAGE LOADER
133 NOBO SS2 SKIP IF SSW 2 SET
134 JST PDAT PUNCH OUT DATA
136 LDA STRT START ADDRESS
138 JST ABLK MAKE ADRESS-BLOCK
140 SR3 SKIP IF SSW3 RESET
141 JMP NOGO NO GO/STOP BLOCK
145 JST GBLK MAKE GO BLOCK
148 JST SBLK MAKE STOP BLOCK
150 NOGO JST PLDR END OF TAPE HAS COME.
155 **********************
156 * PUNCH THE DESIRED DATA
163 STA AVAL AVAILABLE NUMBER OF WORDS
165 JMP* PDAT END OF DATA, WE ARE HAPPY, RETURN
167 * TRY TO MAKE A ZERO BLOCK
169 JST CZER COUNT ZERO LOCATIONS - IF ANY
170 CAS ZMIN COMPARE WITH MINIMUM FOR ZERO BLOCK
171 JMP MKZE GO TO MAKE A ZERO BLOCK
172 JMP MKZE GO FOR THE ZERO BLOCK AS WELL
173 JMP FILL PREPARE CONVETIONAL BLOCK
174 MKZE CAS AVAL BLOCK TOO BIG??
175 LDA AVAL YES, LIMIT BLOCK SIZE
177 JST ZBLK PRODUCE THE THE BLOCK
178 JMP LOOP CONTINUE IN THE MAIN LOOP
179 FILL CRA STUFF A PACKET
180 STA BCNT CLEAR BLOCK SIZE
183 ADD BCNT CALCULATE NEW POSITION TO LOOK AT
184 JST CFIL DETERMINE AMOUNT OF CONTIGUOUS DATA
185 ADD BCNT ADD ACTUAL BLOCK SIZE
186 CAS AVAL COMPARE THAT WITH AVAILABLE DATA
187 LDA AVAL TOO MUCH, LIMIT AND GO
190 JST DBLK PRODUCE BLOCK
191 JMP LOOP RETURN TO MAIN LOOP
193 FIL2 STA BCNT UPDATE BLOCK SIZE
194 ADD ALOC MAKE NEW STARTING LOCATION
195 JST CZER COUNT FOLLOWING ZEROS
196 CAS ZMIN COMPARE WITH MINIMUM FOR A ZERO BLOCK
197 JMP BEND OK, THERE ARE ENOUGH ZEROS. BLOCK SHALL BE GOOD.
199 * NO, WE CONTINUE LOOKING
200 ADD BCNT ADD CURRENT BLOCK SIZE
201 STA BCNT AND UPDATE IT
205 JST DBLK PUNCH THE BLOCK
206 JMP LOOP BACK TO MAIN LOOP
208 **************************
210 AVAL DEC 0 AVAILABLE DATA SIZE
211 IPTR DEC 0 IMAGINARY POINTER
212 BCNT DEC 0 PACKET SIZE COUNTER
213 ZMIN DEC 8 MIN AMOUNT OF ZEROS FOR A BLOCK BREAK
214 STRT DEC 0 ADDRESS FOR AUTO-START
220 LDA BSTA START CHARACTER
230 LDA BSTA START CHARACTER
238 * MAKE A START ADDRESS BLOCK
240 STA CNT2 SAVE THE ADDRESS
241 LDA BSTA START CHARACTER
253 ZBLK DAC ** PRODUCE A ZERO BLOCK
254 STA CNT2 STORE SIZE OF BLOCK
255 LDA BSTA START CHARACTER
259 LDA ALOC LOAD START ADDRESS
260 JST SWRD PUNCH START ADDRESS
261 STA CSUM INIT CHECKSUM
264 ADD CSUM ADD CHECKSUM
265 JST SWRD PUNCH OUT CHECKSUM
266 LDA ALOC RELOAD POINTER
267 ADD CNT2 CALCULATE NEW POINTER
277 LDA BSTA START CHARACTER
279 ADD TDAT DATA BLOCK TYPE
282 LDA ALOC START ADDRESS
284 STA CSUM INIT CHECKSUM
289 STA CSUM UPDATE CHECKSUM
293 STA CNT2 NOW WE USE IT AS NEG COUNTER
295 DDLP LDA* ALOC LOAD DATA
298 STA CSUM UPDATE CHECKSUM
302 JST SWRD PUNCH CHECKSUM
308 * COUNT FILLED LOCATIONS
310 STA PTR STORE ADDRESS TO POINTER
311 LDA SNZ LOAD DISCRIMINATOR OPERATION
312 STA DISC STORE INTO COUNT ROUTINE
313 JST COUN GO AND COUNT IT
317 * COUNT ZERO LOCATIONS
319 STA PTR STORE ADDRESS TO POINTER
325 COUN DAC ** COUNT FILLED OR EMPTY LOCATIONS
327 STA CNT2 INITIALIZE COUNTER
329 DISC SZE WILL BE DYNAMICALLY OVERWRITTEN
330 JMP ZFIN NOW OTHER KIND OF DATA
331 IRS CNT2 NOTE DOWN THE FIND
332 IRS PTR POINT TO NEXT LOCATION TO BE TESTED
334 JMP ZFIN ADDRESS OVERFLOW MUST STOP COUNTING
340 ***********************
342 PS2 DAC ** PUNCH OUT SECOND STAGE LOADER
343 LDA B2AD LOAD START ADDRESS OF SECOND STAGE LOADER
344 JST P23 CALL PUNCH23 ROUTINE
347 PS3 DAC ** PUNCH OUT SECOND STAGE LOADER
348 LDA S3SC LOAD START CHARACTER
349 OTA 2 PUNCH START CHARACTER
351 LDA B3AD LOAD START ADDRESS OF SECOND STAGE LOADER
352 JST P23 CALL PUNCH23 ROUTINE
355 P23 DAC ** PUNCH OUT A LOADER
358 JST SWRD PUNCH OUT CURRENT WORD
361 IRS PTR INCREMENT POINTER
365 **********************
367 PLDR DAC ** PUNCH LEADER
368 LDA LDRL LOAD LEADER LENGTH
370 STA CNT2 STORE TO LEADER COUNTER
379 *********************
380 * PUNCH ONE WORD OF DATA
391 B2AD DAC BO2S START ADDRESS OF SECOND STAGE LOADER
392 B3AD DAC BO3S START ADDRESS OF THIRD STAGE LOADER
394 LDRL DEC 300 LEADER LENGTH
395 SZE SZE INSTRUCTION FOR FILL IN
396 SNZ SNZ INSTRUCTION FOR FILL IN
399 ************************************************************************
400 * THIS IST THE SECOND STAGE LOADER
402 * IT IS IMPORTANT THAT THERE ARE NO ZERO WORDS IN THIS CODE BECAUSE THE
403 * KEY-IN LOADER WORKS ONLY UNTIL IT DETECTS A ZERO WORD.
405 BO2S DAC '20 START ADDRESS, ALWAYS '20
406 JMP '10 JUMP BACK INTO KEY-IN LOADER
408 *S21 OCP '001 THIS IS THE JUMP-IN LOCATION, WILL GO TO '21
410 INA '1001 READ FROM PAPER TAPE
411 JMP '17-BO2S+*-1 WAIT
412 SUB '17-BO2S+S3SC STAGE 3 START CHARACTER
414 JMP '17-BO2S+*-4 EAT UP ALL JUNK
416 INA '1001 READ FROM PAPER TAPE
417 JMP '17-BO2S+*-1 WAIT
419 INA '001 READ FROM TAPE WITHOUT CLEARING A
420 JMP '17-BO2S+*-1 WAIT
422 STA '17-BO2S+CNT2 STORE START ADDRESS OF THIRD STAGE
423 * LDA '57 LOOK FOR DEPOSITED OTHER BOOT ADDRESS
424 * SZE OK, IF WE FIND SOMETHING THERE...
425 * STA '17-BO2S+CNT2 OVERWRITE DEFAULT VALUE
426 LDA '17-BO2S+CNT2 RELOAD START ADDRESS
427 STA* '17-BO2S+CNT2 STORE THAT ADDRESS INTO ITSELF
428 IRS '17-BO2S+CNT2 CORRECT STOLEN WORD
429 LDA '17-BO2S+CNT2 WHERE TO LOAD NOW?
430 STA '17-BO2S+PTR2 INIT WRITE POINTER
432 LOP INA '1001 READ IN CHARACTER
433 JMP '17-BO2S+*-1 WAIT
435 INA '001 READ FROM TAPE WITHOUT CLEARING A
436 JMP '17-BO2S+*-1 WAIT
437 SNZ DID WE LOAD A ZERO?
438 JMP* '17-BO2S+CNT2 JUMP INTO THIRD STAGE LOADER
439 STA* '17-BO2S+PTR2 STORE DATA
440 IRS '17-BO2S+PTR2 MOVE ON
441 JMP '17-BO2S+LOP FETCH MORE DATA
443 S3SC OCT '301 START CHARACTER TO RECOGNIZE STAGE3
444 PTR2 DAC ** MEMORY POINTER
445 CNT2 DAC ** LOAD ADDRESS
448 ************************************************************************
449 * HERE COMES THE THIRD STAGE LOADER
452 BO3S DAC * THAT IS FOR THE SECOND STAGE LOADER
454 * COMPLETE THE PAUS ROUTINE
463 SLOP INA '1001 CRA AND READ
465 SUB BSTA BLOCK START?
467 JMP SLOP BACK TO SEARCH LOOP
468 INA '1001 READ BLOCK TYPE
470 STA BTYP STORE BLOCK TYPE FOR LATER USE
471 CAS TSAD START ADDRESS BLOCK?
473 JMP RSAD READ START ADDRESS BLOCK
477 JMP RGO PROCESS GO BLOCK
481 JMP RBLK READ DATA BLOCK
485 JMP RBLK READ ZERO BLOCK
489 JMP RSTP PROCESS STOP BLOCK
491 LDA EBT ERROR BLOCK TYPE
493 JMP SLOP SEARCH FOR NEW BLOCK
496 * START ADDRESS BLOCK
502 JMP CERR CHECKSUM ERROR!
503 JMP SLOP LOOK FOR NEW BLOCK!
508 *********************
509 * READ DATA OR ZERO BLOCK
511 STA PTR START ADDRESS
516 TCA TWO'S COMPLEMENT BACK
526 ADD CSUM ADD TO CHECKSUM
528 EL IRS PTR POINT TO NEXT LOCATION
531 IRS LEN INCREMENT NEG COUNTER
534 JST LWRD NOW READ IN THE CHECKSUM
538 CERR CRA CHECKSUM ERROR HALT
540 JMP SLOP TRY A NEW BLOCK
544 JMP EL USE END OF LOOP ABOVE
547 RSTP LDA BO3S FOR SHOW
549 JMP* RESA JUMP TO RESTART LOCATION
552 **********************
555 RESA DAC SLOP RESTART ADDRESS
556 BSTA DEC 129 BLOCK START CHARACTER
557 EBT OCT '125252 ERROR MESSAGE FOR A REG
568 INA '1001 CLEAR A AND INPUT
575 FIN WRITE OUT LITERALS - IF ANY
577 * THE ATTIC OF THE THIRD STAGE LOADER
578 PJ1 JMP* PAUS LAST LOCATION THAT WILL BE LOADED FROM TAPE!
579 PAUS DAC ** WILL BE INITIALIZED TO ZERO BEFORE PUNCHING
580 JH HLT BECOMES CLEARED ON START OF LOAD
581 J1 DAC ** BECOMES JMP* PAUS ON START OF LOAD
585 LEN DAC ** LENGTH COUNTER
586 BTYP DAC ** BLOCK TYPE
587 ALOC *** ** CURRENT LOCATION TO PUNCH
588 ELOC *** ** LAST LOCATION TO PUNCH
589 PTR DAC ** MEMORY POINTER
590 CNT DAC ** WHERE TO LOAD? CAN BE CHANGED.
592 ************************************************************
593 END THAT'S IT, ENJOY!