*** empty log message ***
[h316.git] / programs / tools / src / binal.asm
CommitLineData
4102e16c 1* BINAL - BINARY PUNCH AND LOAD PROGRAM (REV. 1.0)
cf7fb3fa 2*
3*
4102e16c 4*
5*
6* BINAL - A PAL-AP DROP-IN REPLACEMENT.
7*
8*
9*
10* AUTHOR
11* PHILIPP HACHTMANN
12*
13*
14* VERSION
15* 1.0 (24.04.2006) - INITIAL VERSION
16*
17*
18*
19* STORAGE REQUIREMENT
20* ONE SEGMENT
21*
22*
23* FEATURES:
24* NO 4/6/6 FORMAT, DIRECT BINARY DATA
25* BLOCK CHECKSUMS
26* LOAD AND GO CAPABLE
27* SUPPORTS ONLY HIGH SPEED PAPER TAPE PUNCH
28*
29*
30* USAGE
31* FIRST LOAD THE OBJECT TAPE INTO ANY SECTOR 'XX000 IN MEMORY.
32* TO PUNCH A SELF LOADING TAPE DO THE FOLLOWING:
33* -PRESS MSTCLR
34* -SET P TO 'XX000
35* -IF LOAD AND GO IS DESIRED, PUT PROGRAM'S START ADDRESS INTO A
36* -PRESS START
37* -ENTER THE FIRST ADDRESS TO BE PUNCHED INTO A
38* -PRESS START
39* -ENTER THE LAST ADDRESS TO BE PUNCHED INTO A
40* -PRESS START, BINAL PUNCHES YOUR SYSTEM TAPE
41*
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.
46*
47* LOADING SLST TAPES
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.
55*
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
cf7fb3fa 63*
64* TAPE FORMAT:
4102e16c 65* THE TAPE CONTAINS HIGE DATA BLOCKS.
cf7fb3fa 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.
69*
70* BLOCK TYPES
71*
72* DATA BLOCK
73* THE DATA BLOCK CONTAINS USER DATA AND A CHECKSUM.
74* LAYOUT:
75* | START ADDRESS |
76* | DATA LENGTH |
77* | DATA |
78* | BLOCK CHECKSUM |
79*
80* ZERO BLOCK
81* ZERO BLOCK IS USED TO REPRESENT ZERO CORE LOCATIONS
82* LAYOUT:
83* | START ADDRESS |
84* | ZERO LENGTH |
85* | BLOCK CHECKSUM |
86*
87* START LOC BLOCK
88* A BLOCK TO SET THE START LOCATION AFTER LOAD
89* LAYOUT;
90* | START ADDRESS |
91* | CHECKSUM (HAHA)|
92*
93* GO BLOCK
94* THIS BLOCK STOPS LOADING AND JUMPS TO THE START LOCATION.
95* IF NO START LOCATION HAS BEEN CODED THE LOADER WILL
96* CONTIUNE!
97*
4e8a2859 98* STOP BLOCK
cf7fb3fa 99* THIS BLOCK TELLS THE LOADER THAT IT SHALL STOP NOW.
100* LAYOUT:
101* NO BODY AT ALL, ONLY BLOCK START AND BLOCK TYPE :-)
102*
103************************************************************************
104*
4102e16c 105 SUBR LSTART,BO3S BEGINNING OF THIRD STAGE LOADER
cf7fb3fa 106*
107 REL RELOCATABLE MODE
108 ORG 0
109*
4102e16c 110 STA STRT SAVE AUTO START LOCATION
cf7fb3fa 111 HLT
112 STA ALOC FIRST LOCATION TO PUNCH
113 HLT
114 STA ELOC LAST LOCATION TO PUNCH
115*
116 OCP '0002 START PUNCH (NOT NECESSARY ON MY H316)
4102e16c 117*
118 SR1 SKIP IF SSW 1 RESET
119 JMP NOBO NO BOOT CODE
cf7fb3fa 120 JST PLDR PUNCH OUT LEADER
121 JST PS2 PUNCH SECOND STAGE LOADER
cf7fb3fa 122 JST PS3 PUNCH THIRD STAGE LOADER
4102e16c 123*
124NOBO SS2 SKIP IF SSW 2 SET
d670f1ce 125 JST PDAT PUNCH OUT DATA
4102e16c 126*
127 LDA STRT START ADDRESS
128 SZE SET?
129 JST ABLK MAKE ADRESS-BLOCK
130*
131 SR3 SKIP IF SSW3 RESET
132 JMP NOGO NO GO/STOP BLOCK
133*
134 LDA STRT
d670f1ce 135 SZE
4102e16c 136 JST GBLK MAKE GO BLOCK
137 LDA STRT
138 SNZ
d670f1ce 139 JST SBLK MAKE STOP BLOCK
4102e16c 140*
141NOGO JST PLDR END OF TAPE HAS COME.
d670f1ce 142 HLT
143 JMP *-1 NO ESCAPE
144*
4102e16c 145*
d670f1ce 146**********************
147* PUNCH THE DESIRED DATA
148PDAT DAC **
cf7fb3fa 149*
150LOOP CRA MAIN LOOP
151 LDA ELOC
152 SUB ALOC
4102e16c 153 AOA ONE IS MINIMUM
154 STA AVAL AVAILABLE NUMBER OF WORDS
cf7fb3fa 155 SNZ
d670f1ce 156 JMP* PDAT END OF DATA, WE ARE HAPPY, RETURN
cf7fb3fa 157*
4102e16c 158* TRY TO MAKE A ZERO BLOCK
cf7fb3fa 159 LDA ALOC
160 JST CZER COUNT ZERO LOCATIONS - IF ANY
161 CAS ZMIN COMPARE WITH MINIMUM FOR ZERO BLOCK
162 JMP MKZE GO TO MAKE A ZERO BLOCK
163 JMP MKZE GO FOR THE ZERO BLOCK AS WELL
164 JMP FILL PREPARE CONVETIONAL BLOCK
165MKZE CAS AVAL BLOCK TOO BIG??
166 LDA AVAL YES, LIMIT BLOCK SIZE
167 NOP TIGHT FIT
168 JST ZBLK PRODUCE THE THE BLOCK
169 JMP LOOP CONTINUE IN THE MAIN LOOP
170FILL CRA STUFF A PACKET
171 STA BCNT CLEAR BLOCK SIZE
172*
173STUF LDA ALOC
174 ADD BCNT CALCULATE NEW POSITION TO LOOK AT
175 JST CFIL DETERMINE AMOUNT OF CONTIGUOUS DATA
176 ADD BCNT ADD ACTUAL BLOCK SIZE
177 CAS AVAL COMPARE THAT WITH AVAILABLE DATA
178 LDA AVAL TOO MUCH, LIMIT AND GO
179 SKP A TIGHT FIT
180 JMP FIL2 FILL MORE!
181 JST DBLK PRODUCE BLOCK
182 JMP LOOP RETURN TO MAIN LOOP
183*
184FIL2 STA BCNT UPDATE BLOCK SIZE
185 ADD ALOC MAKE NEW STARTING LOCATION
186 JST CZER COUNT FOLLOWING ZEROS
187 CAS ZMIN COMPARE WITH MINIMUM FOR A ZERO BLOCK
188 JMP BEND OK, THERE ARE ENOUGH ZEROS. BLOCK SHALL BE GOOD.
189 JMP BEND
190* NO, WE CONTINUE LOOKING
191 ADD BCNT ADD CURRENT BLOCK SIZE
192 STA BCNT AND UPDATE IT
193 JMP STUF STUFF MORE
194*
195BEND LDA BCNT
196 JST DBLK PUNCH THE BLOCK
197 JMP LOOP BACK TO MAIN LOOP
198*
d670f1ce 199**************************
cf7fb3fa 200*
201AVAL DEC 0 AVAILABLE DATA SIZE
202IPTR DEC 0 IMAGINARY POINTER
203BCNT DEC 0 PACKET SIZE COUNTER
204ZMIN DEC 8 MIN AMOUNT OF ZEROS FOR A BLOCK BREAK
205STRT DEC 0 ADDRESS FOR AUTO-START
206*
207*
208*******************
209* MAKE A STOP BLOCK
210SBLK DAC **
211 LDA BSTA START CHARACTER
212 ICA
213 ADD TSTP BLOCK TYPE
214 JST SWRD PUNCH THAT
215 JMP* SBLK
216*
217*
218*******************
219* MAKE A GO BLOCK
220GBLK DAC **
221 LDA BSTA START CHARACTER
222 ICA
223 ADD TGO BLOCK TYPE
224 JST SWRD PUNCH THAT
225 JMP* GBLK
226*
227*
228******************
229* MAKE A START ADDRESS BLOCK
230ABLK DAC **
231 STA CNT SAVE THE ADDRESS
232 LDA BSTA START CHARACTER
233 ICA
234 ADD TSAD BLOCK TYPE
235 JST SWRD PUNCH THAT
236 LDA CNT
237 JST SWRD
238 JST SWRD
239 JMP* ABLK
240*
241*
242*******************
243* MAKE ZERO BLOCK
244ZBLK DAC ** PRODUCE A ZERO BLOCK
245 STA CNT STORE SIZE OF BLOCK
246 LDA BSTA START CHARACTER
247 ICA
248 ADD TZER BLOCK TYPE
249 JST SWRD PUNCH THAT
250 LDA ALOC LOAD START ADDRESS
251 JST SWRD PUNCH START ADDRESS
252 STA CSUM INIT CHECKSUM
253 LDA CNT LOAD SIZE
254 JST SWRD PUNCH SIZE
255 ADD CSUM ADD CHECKSUM
256 JST SWRD PUNCH OUT CHECKSUM
257 LDA ALOC RELOAD POINTER
258 ADD CNT CALCULATE NEW POINTER
259 STA ALOC UPDATE ALOC
260 JMP* ZBLK END
261*
262*
263********************
264* MAKE DATA BLOCK
265DBLK DAC **
266 STA CNT SAVE SIZE
267*
268 LDA BSTA START CHARACTER
269 ICA
270 ADD TDAT DATA BLOCK TYPE
271 JST SWRD PUNCH
272*
273 LDA ALOC START ADDRESS
274 JST SWRD PUNCH IT
275 STA CSUM INIT CHECKSUM
276*
277 LDA CNT PACKET SIZE
278 JST SWRD PUNCH IT
279 ADD CSUM
280 STA CSUM UPDATE CHECKSUM
281*
282 LDA CNT
283 TCA
284 STA CNT NOW WE USE IT AS NEG COUNTER
285*
286DDLP LDA* ALOC LOAD DATA
287 JST SWRD PUNCH DATA
288 ADD CSUM
289 STA CSUM UPDATE CHECKSUM
290 IRS ALOC
291 IRS CNT
292 JMP DDLP LOOP IT
293 JST SWRD PUNCH CHECKSUM
294 JMP* DBLK BLOCK DONE
295*
296*
297*
298********************
299* COUNT FILLED LOCATIONS
300CFIL DAC **
301 STA PTR STORE ADDRESS TO POINTER
302 LDA SNZ LOAD DISCRIMINATOR OPERATION
303 STA DISC STORE INTO COUNT ROUTINE
304 JST COUN GO AND COUNT IT
305 JMP* CFIL
306*
307********************
308* COUNT ZERO LOCATIONS
309CZER DAC **
310 STA PTR STORE ADDRESS TO POINTER
311 LDA SZE
312 STA DISC
313 JST COUN
314 JMP* CZER
315*
316COUN DAC ** COUNT FILLED OR EMPTY LOCATIONS
317 CRA
318 STA CNT INITIALIZE COUNTER
319CLOP LDA* PTR
320DISC SZE WILL BE DYNAMICALLY OVERWRITTEN
321 JMP ZFIN NOW OTHER KIND OF DATA
322 IRS CNT NOTE DOWN THE FIND
323 IRS PTR POINT TO NEXT LOCATION TO BE TESTED
324 SKP
325 JMP ZFIN ADDRESS OVERFLOW MUST STOP COUNTING
326 JMP CLOP COUNT ON
327ZFIN LDA CNT
328 JMP* COUN
329*
330*
331***********************
332*
333PS2 DAC ** PUNCH OUT SECOND STAGE LOADER
334 LDA B2AD LOAD START ADDRESS OF SECOND STAGE LOADER
335 JST P23 CALL PUNCH23 ROUTINE
336 JMP* PS2
337*
338PS3 DAC ** PUNCH OUT SECOND STAGE LOADER
339 LDA S3SC LOAD START CHARACTER
340 OTA 2 PUNCH START CHARACTER
341 JMP *-1
342 LDA B3AD LOAD START ADDRESS OF SECOND STAGE LOADER
343 JST P23 CALL PUNCH23 ROUTINE
344 JMP* PS3
345*
346P23 DAC ** PUNCH OUT A LOADER
347 STA PTR SAVE POINTER
348L23 LDA* PTR
4e8a2859 349 JST SWRD PUNCH OUT CURRENT WORD
cf7fb3fa 350 SNZ
351 JMP* P23 RETURN
cf7fb3fa 352 IRS PTR INCREMENT POINTER
353 JMP L23 LOOP AGAIN
354*
355*
356**********************
357* PUNCH SOME LEADER
358PLDR DAC ** PUNCH LEADER
359 LDA LDRL LOAD LEADER LENGTH
360 TCA COMPLEMENT IT
361 STA CNT STORE TO LEADER COUNTER
362 CRA LEADER IS ZERO
363LLP OTA 2
364 JMP *-1
365 IRS CNT
366 JMP LLP
367 JMP* PLDR
368*
369*
370*********************
371* PUNCH ONE WORD OF DATA
372SWRD DAC **
373 ICA
374 OTA 2
375 JMP *-1
376 ICA
377 OTA 2
378 JMP *-1 WAIT
379 JMP* SWRD
380*
381*
382B2AD DAC BO2S START ADDRESS OF SECOND STAGE LOADER
383B3AD DAC BO3S START ADDRESS OF THIRD STAGE LOADER
384*
385LDRL DEC 100 LEADER LENGTH
cf7fb3fa 386SZE SZE INSTRUCTION FOR FILL IN
387SNZ SNZ INSTRUCTION FOR FILL IN
388*
389*
390************************************************************************
391* THIS IST THE SECOND STAGE LOADER
392*
393 ORG '317 ONLY FOR DEVELOPMENT!
394BO2S OCT '20 START ADDRESS
395 JMP '10 JUMP BACK INTO KEY-IN LOADER
396*
397*S21 OCP '001 THIS IS THE JUMP-IN LOCATION, WILL GO TO '21
398*
399 INA '1001
400 JMP '17-BO2S+*-1
401 SUB '17-BO2S+S3SC STAGE 3 START CHARACTER
402 SZE
403 JMP '17-BO2S+*-4 EAT UP ALL JUNK
404*
405 INA '1001 READ WITH CLEAR
406 JMP '17-BO2S+*-1
cf7fb3fa 407 ICA
408 INA '001 READ WITHOUT CLEAR
409 JMP '17-BO2S+*-1
cf7fb3fa 410*
4e8a2859 411 STA '17-BO2S+CNT2 STORE START ADDRESS
412 STA* '17-BO2S+CNT2 STORE START IN START
413* LDA '57 LOOK FOR DEPOSITED OTHER BOOT ADDRESS
414* SZE OK, IF WE FIND SOMETHING THERE...
415* STA '17-BO2S+CNT2 OVERWRITE DEFAULT VALUE
416 IRS '17-BO2S+CNT2 CORRECT STOLEN WORD
417 LDA '17-BO2S+CNT2
cf7fb3fa 418* JMP '776
419*
4e8a2859 420 LDA '17-BO2S+CNT2 WHERE TO LOAD NOW?
421 STA '17-BO2S+PTR2 INIT POINTER
cf7fb3fa 422*
423LOP INA '1001 READ IN CHARACTER
424 JMP '17-BO2S+*-1
425 ICA
426 INA '001 READ OTHER CHARACTER
427 JMP '17-BO2S+*-1
428 SNZ
4e8a2859 429 JMP* '17-BO2S+CNT2 JUMP INTO THIRD STAGE LOADER
cf7fb3fa 430* JMP '665
4e8a2859 431 STA* '17-BO2S+PTR2 STORE DATA
432 IRS '17-BO2S+PTR2 MOVE ON
cf7fb3fa 433 JMP '17-BO2S+LOP FETCH MORE DATA
434*
435S3SC OCT '301 START CHARACTER TO RECOGNIZE STAGE3
4e8a2859 436PTR2 DAC ** GENERAL PURPOSE MEMORY POINTER
437CNT2 DAC ** WHERE TO LOAD? CAN BE CHANGED.
cf7fb3fa 438BO2E OCT 10600 ZERO-TERMINATOR
439*
440*
441************************************************************************
442* HERE COMES THE THIRD STAGE LOADER
443*
444 ORG '600
445BO3S DAC * THAT IS FOR THE SECOND STAGE LOADER
4e8a2859 446*********
447* COMPLETE THE ATTIC
448 LDA PJ1 COMPLETE THE PAUS ROUTINE
449 STA J1
450 CRA
451 STA JH ENSURE HALT INSTRUCTION
452*
cf7fb3fa 453 OCP 1 READER ON (UNNECESSARY?)
454SLOP INA '1001 CRA AND READ
455 JMP *-1
456 SUB BSTA BLOCK START?
457 SZE
458 JMP SLOP BACK TO SEARCH LOOP
459 INA '1001 READ BLOCK TYPE
460 JMP *-1
461 STA BTYP STORE BLOCK TYPE FOR LATER USE
462 CAS TSAD START ADDRESS BLOCK?
463 JMP *+2
464 JMP RSAD READ START ADDRESS BLOCK
465 NOP
466 CAS TGO GO BLOCK?
467 JMP *+2
468 JMP RGO PROCESS GO BLOCK
469 NOP
470 CAS TDAT DATA BLOCK?
471 JMP *+2
472 JMP RBLK READ DATA BLOCK
473 NOP
474 CAS TZER ZERO BLOCK?
475 JMP *+2
476 JMP RBLK READ ZERO BLOCK
477 NOP
478 CAS TSTP STOP BLOCK?
479 JMP *+2
480 JMP RSTP PROCESS STOP BLOCK
481 NOP
4e8a2859 482 LDA ='125252 ERROR BLOCK TYPE
483 JST PAUS PAUSE
cf7fb3fa 484 JMP SLOP SEARCH FOR NEW BLOCK
4e8a2859 485 FIN
cf7fb3fa 486*
487********************
488* START ADDRESS BLOCK
489RSAD JST LWRD
490 STA RESA
491 JST LWRD
492 SUB RESA
493 SZE
494 JMP CERR CHECKSUM ERROR!
495 JMP SLOP LOOK FOR NEW BLOCK!
496*
497*
498RGO JMP* RESA
499*
500*********************
501* READ DATA OR ZERO BLOCK
502RBLK JST LWRD
503 STA PTR START ADDRESS
504 STA CSUM
505 JST LWRD
506 TCA TWO'S COMPLEMENT
507 STA LEN GO COUNTER
508 TCA TWO'S COMPLEMENT BACK
509 ADD CSUM
510 STA CSUM
511RLP LDA BTYPE
512 CAS TDAT DATA BLOCK?
513 JMP RZER NO
514 JMP RDAT YES
515 JMP RZER NO, CLEAR A
516RDAT JST LWRD
517 STA* PTR
518 ADD CSUM ADD TO CHECKSUM
519 STA CSUM
520EL IRS PTR POINT TO NEXT LOCATION
521 SKP
522 JMP BO3S OVERFLOW!
523 IRS LEN INCREMENT NEG COUNTER
524 JMP RLP READ ON
525*
526 JST LWRD NOW READ IN THE CHECKSUM
527 SUB CSUM
528 SNZ
529 JMP SLOP
530CERR CRA CHECKSUM ERROR HALT
4e8a2859 531 JST PAUS
cf7fb3fa 532 JMP SLOP TRY A NEW BLOCK
533*
534RZER CRA
535 STA* PTR STORE ZERO
536 JMP EL USE END OF LOOP ABOVE
537*******
538* STOP BLOCK
4e8a2859 539RSTP LDA BO3S FOR SHOW
540 JST PAUS
cf7fb3fa 541 JMP* RESA JUMP TO RESTART LOCATION
542*
cf7fb3fa 543*
4e8a2859 544**********************
545* CONSTANTS
546*
547RESA DAC SLOP RESTART ADDRESS
cf7fb3fa 548BSTA DEC 129 BLOCK START CHARACTER
549*
550* BLOCK TYPES:
551TSAD OCT '33
552TGO OCT '44
553TZER OCT '55
554TSTP OCT '66
555TDAT OCT '11
556*
557*
558LWRD OCT 66
559 INA '1001 CLEAR A AND INPUT
560 JMP *-1
561 ICA
562 INA '1 INPUT
563 JMP *-1 WAIT
564 JMP* LWRD
565*
566 FIN WRITE OUT LITERALS - IF ANY
4e8a2859 567*******************
568* THE ATTIC OF THE THIRD STAGE LOADER
569PJ1 JMP* PAUS LAST LOCATION THAT WILL BE LOADED FROM TAPE!
570PAUS DAC **
571JH HLT THIS WILL STAY A HALT
572J1 DAC ** WILL BE: JMP* PAUS
573*
574***** VARIABLES
575CSUM OCT 66 CHECKSUM
576LEN OCT 66 LENGTH TO GO
577BTYP OCT 66 BLOCK TYPE
578*
579*******************
580* VARIABLES OF THE MAIN PROGRAM
581ALOC *** ** NEXT WORD TO BE PUNCHED OUT
582ELOC *** ** LAST WORD TO BE PUNCHED OUT
583PTR DAC ** GENERAL PURPOSE MEMORY POINTER
584CNT DAC ** WHERE TO LOAD? CAN BE CHANGED.
cf7fb3fa 585*
586************************************************************
587 END