250fa6ad361b539669d88e3396c08c0ce4edf873
[h316.git] / programs / tools / src / binal.asm
1 * BINAL - BINARY PUNCH AND LOAD PROGRAM (REV. 1.0)
2 *
3 *
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
63 *
64 * TAPE FORMAT:
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.
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 *
98 * STOP BLOCK
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 *
105 SUBR BINAL,ANF
106 SUBR LSTART,BO3S BEGINNING OF THIRD STAGE LOADER
107 *
108 REL RELOCATABLE MODE
109 ORG 0
110 *
111 ANF STA STRT SAVE AUTO START LOCATION
112 CRA
113 HLT
114 STA ALOC FIRST LOCATION TO PUNCH
115 CRA
116 HLT
117 STA ELOC LAST LOCATION TO PUNCH
118 *
119 * FIRST SOME PREPARATIONS FOR THE SECOND AND THIRD STAGE LOADERS
120 * CRA
121 STA PTR2 CLEAR PTR2, SO KEY-IN LOADER WILL STOP THERE.
122 STA PAUS TERMINATOR FOR THIRD STAGE LOADER
123 *
124 * BUT HERE WE GO
125 OCP '0002 START PUNCH (NOT NECESSARY ON MY H316)
126 *
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
132 *
133 NOBO SS2 SKIP IF SSW 2 SET
134 JST PDAT PUNCH OUT DATA
135 *
136 LDA STRT START ADDRESS
137 SZE SET?
138 JST ABLK MAKE ADRESS-BLOCK
139 *
140 SR3 SKIP IF SSW3 RESET
141 JMP NOGO NO GO/STOP BLOCK
142 *
143 LDA STRT
144 SZE
145 JST GBLK MAKE GO BLOCK
146 LDA STRT
147 SNZ
148 JST SBLK MAKE STOP BLOCK
149 *
150 NOGO JST PLDR END OF TAPE HAS COME.
151 HLT
152 JMP *-1 NO ESCAPE
153 *
154 *
155 **********************
156 * PUNCH THE DESIRED DATA
157 PDAT DAC **
158 *
159 LOOP CRA MAIN LOOP
160 LDA ELOC
161 SUB ALOC
162 AOA ONE IS MINIMUM
163 STA AVAL AVAILABLE NUMBER OF WORDS
164 SNZ
165 JMP* PDAT END OF DATA, WE ARE HAPPY, RETURN
166 *
167 * TRY TO MAKE A ZERO BLOCK
168 LDA ALOC
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
176 NOP TIGHT FIT
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
181 *
182 STUF LDA ALOC
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
188 SKP A TIGHT FIT
189 JMP FIL2 FILL MORE!
190 JST DBLK PRODUCE BLOCK
191 JMP LOOP RETURN TO MAIN LOOP
192 *
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.
198 JMP BEND
199 * NO, WE CONTINUE LOOKING
200 ADD BCNT ADD CURRENT BLOCK SIZE
201 STA BCNT AND UPDATE IT
202 JMP STUF STUFF MORE
203 *
204 BEND LDA BCNT
205 JST DBLK PUNCH THE BLOCK
206 JMP LOOP BACK TO MAIN LOOP
207 *
208 **************************
209 *
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
215 *
216 *
217 *******************
218 * MAKE A STOP BLOCK
219 SBLK DAC **
220 LDA BSTA START CHARACTER
221 ICA
222 ADD TSTP BLOCK TYPE
223 JST SWRD PUNCH THAT
224 JMP* SBLK
225 *
226 *
227 *******************
228 * MAKE A GO BLOCK
229 GBLK DAC **
230 LDA BSTA START CHARACTER
231 ICA
232 ADD TGO BLOCK TYPE
233 JST SWRD PUNCH THAT
234 JMP* GBLK
235 *
236 *
237 ******************
238 * MAKE A START ADDRESS BLOCK
239 ABLK DAC **
240 STA CNT2 SAVE THE ADDRESS
241 LDA BSTA START CHARACTER
242 ICA
243 ADD TSAD BLOCK TYPE
244 JST SWRD PUNCH THAT
245 LDA CNT2
246 JST SWRD
247 JST SWRD
248 JMP* ABLK
249 *
250 *
251 *******************
252 * MAKE ZERO BLOCK
253 ZBLK DAC ** PRODUCE A ZERO BLOCK
254 STA CNT2 STORE SIZE OF BLOCK
255 LDA BSTA START CHARACTER
256 ICA
257 ADD TZER BLOCK TYPE
258 JST SWRD PUNCH THAT
259 LDA ALOC LOAD START ADDRESS
260 JST SWRD PUNCH START ADDRESS
261 STA CSUM INIT CHECKSUM
262 LDA CNT2 LOAD SIZE
263 JST SWRD PUNCH SIZE
264 ADD CSUM ADD CHECKSUM
265 JST SWRD PUNCH OUT CHECKSUM
266 LDA ALOC RELOAD POINTER
267 ADD CNT2 CALCULATE NEW POINTER
268 STA ALOC UPDATE ALOC
269 JMP* ZBLK END
270 *
271 *
272 ********************
273 * MAKE DATA BLOCK
274 DBLK DAC **
275 STA CNT2 SAVE SIZE
276 *
277 LDA BSTA START CHARACTER
278 ICA
279 ADD TDAT DATA BLOCK TYPE
280 JST SWRD PUNCH
281 *
282 LDA ALOC START ADDRESS
283 JST SWRD PUNCH IT
284 STA CSUM INIT CHECKSUM
285 *
286 LDA CNT2 PACKET SIZE
287 JST SWRD PUNCH IT
288 ADD CSUM
289 STA CSUM UPDATE CHECKSUM
290 *
291 LDA CNT2
292 TCA
293 STA CNT2 NOW WE USE IT AS NEG COUNTER
294 *
295 DDLP LDA* ALOC LOAD DATA
296 JST SWRD PUNCH DATA
297 ADD CSUM
298 STA CSUM UPDATE CHECKSUM
299 IRS ALOC
300 IRS CNT2
301 JMP DDLP LOOP IT
302 JST SWRD PUNCH CHECKSUM
303 JMP* DBLK BLOCK DONE
304 *
305 *
306 *
307 ********************
308 * COUNT FILLED LOCATIONS
309 CFIL DAC **
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
314 JMP* CFIL
315 *
316 ********************
317 * COUNT ZERO LOCATIONS
318 CZER DAC **
319 STA PTR STORE ADDRESS TO POINTER
320 LDA SZE
321 STA DISC
322 JST COUN
323 JMP* CZER
324 *
325 COUN DAC ** COUNT FILLED OR EMPTY LOCATIONS
326 CRA
327 STA CNT2 INITIALIZE COUNTER
328 CLOP LDA* PTR
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
333 SKP
334 JMP ZFIN ADDRESS OVERFLOW MUST STOP COUNTING
335 JMP CLOP COUNT ON
336 ZFIN LDA CNT2
337 JMP* COUN
338 *
339 *
340 ***********************
341 *
342 PS2 DAC ** PUNCH OUT SECOND STAGE LOADER
343 LDA B2AD LOAD START ADDRESS OF SECOND STAGE LOADER
344 JST P23 CALL PUNCH23 ROUTINE
345 JMP* PS2
346 *
347 PS3 DAC ** PUNCH OUT SECOND STAGE LOADER
348 LDA S3SC LOAD START CHARACTER
349 OTA 2 PUNCH START CHARACTER
350 JMP *-1
351 LDA B3AD LOAD START ADDRESS OF SECOND STAGE LOADER
352 JST P23 CALL PUNCH23 ROUTINE
353 JMP* PS3
354 *
355 P23 DAC ** PUNCH OUT A LOADER
356 STA PTR SAVE POINTER
357 L23 LDA* PTR
358 JST SWRD PUNCH OUT CURRENT WORD
359 SNZ
360 JMP* P23 RETURN
361 IRS PTR INCREMENT POINTER
362 JMP L23 LOOP AGAIN
363 *
364 *
365 **********************
366 * PUNCH SOME LEADER
367 PLDR DAC ** PUNCH LEADER
368 LDA LDRL LOAD LEADER LENGTH
369 TCA COMPLEMENT IT
370 STA CNT2 STORE TO LEADER COUNTER
371 CRA LEADER IS ZERO
372 LLP OTA 2
373 JMP *-1
374 IRS CNT2
375 JMP LLP
376 JMP* PLDR
377 *
378 *
379 *********************
380 * PUNCH ONE WORD OF DATA
381 SWRD DAC **
382 ICA
383 OTA 2
384 JMP *-1
385 ICA
386 OTA 2
387 JMP *-1 WAIT
388 JMP* SWRD
389 *
390 *
391 B2AD DAC BO2S START ADDRESS OF SECOND STAGE LOADER
392 B3AD DAC BO3S START ADDRESS OF THIRD STAGE LOADER
393 *
394 LDRL DEC 100 LEADER LENGTH
395 SZE SZE INSTRUCTION FOR FILL IN
396 SNZ SNZ INSTRUCTION FOR FILL IN
397 *
398 *
399 ************************************************************************
400 * THIS IST THE SECOND STAGE LOADER
401 *
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.
404 *
405 BO2S DAC '20 START ADDRESS, ALWAYS '20
406 JMP '10 JUMP BACK INTO KEY-IN LOADER
407 *
408 *S21 OCP '001 THIS IS THE JUMP-IN LOCATION, WILL GO TO '21
409 *
410 INA '1001 READ FROM PAPER TAPE
411 JMP '17-BO2S+*-1 WAIT
412 SUB '17-BO2S+S3SC STAGE 3 START CHARACTER
413 SZE
414 JMP '17-BO2S+*-4 EAT UP ALL JUNK
415 *
416 INA '1001 READ FROM PAPER TAPE
417 JMP '17-BO2S+*-1 WAIT
418 ICA OTHER CHARACTER
419 INA '001 READ FROM TAPE WITHOUT CLEARING A
420 JMP '17-BO2S+*-1 WAIT
421 *
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
431 *
432 LOP INA '1001 READ IN CHARACTER
433 JMP '17-BO2S+*-1 WAIT
434 ICA OTHER CHARACTER
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
442 *
443 S3SC OCT '301 START CHARACTER TO RECOGNIZE STAGE3
444 PTR2 DAC ** MEMORY POINTER
445 CNT2 DAC ** LOAD ADDRESS
446 *
447 *
448 ************************************************************************
449 * HERE COMES THE THIRD STAGE LOADER
450 *
451 ORG '600
452 BO3S DAC * THAT IS FOR THE SECOND STAGE LOADER
453 *********
454 * COMPLETE THE PAUS ROUTINE
455 LDA PJ1
456 STA J1
457 LDA PJ2
458 STA J2
459 CRA
460 STA PAUS
461 STA JH
462 *
463 * START LOADING
464 OCP 1 READER ON
465 SLOP INA '1001 CRA AND READ
466 JMP *-1
467 SUB BSTA BLOCK START?
468 SZE
469 JMP SLOP BACK TO SEARCH LOOP
470 INA '1001 READ BLOCK TYPE
471 JMP *-1
472 STA BTYP STORE BLOCK TYPE FOR LATER USE
473 CAS TSAD START ADDRESS BLOCK?
474 JMP *+2
475 JMP RSAD READ START ADDRESS BLOCK
476 NOP
477 CAS TGO GO BLOCK?
478 JMP *+2
479 JMP RGO PROCESS GO BLOCK
480 NOP
481 CAS TDAT DATA BLOCK?
482 JMP *+2
483 JMP RBLK READ DATA BLOCK
484 NOP
485 CAS TZER ZERO BLOCK?
486 JMP *+2
487 JMP RBLK READ ZERO BLOCK
488 NOP
489 CAS TSTP STOP BLOCK?
490 JMP *+2
491 JMP RSTP PROCESS STOP BLOCK
492 NOP
493 LDA EBT ERROR BLOCK TYPE
494 JST PAUS PAUSE
495 JMP SLOP SEARCH FOR NEW BLOCK
496 *
497 ********************
498 * START ADDRESS BLOCK
499 RSAD JST LWRD
500 STA RESA
501 JST LWRD
502 SUB RESA
503 SZE
504 JMP CERR CHECKSUM ERROR!
505 JMP SLOP LOOK FOR NEW BLOCK!
506 *
507 *
508 RGO JMP* RESA
509 *
510 *********************
511 * READ DATA OR ZERO BLOCK
512 RBLK JST LWRD
513 STA PTR START ADDRESS
514 STA CSUM
515 JST LWRD
516 TCA TWO'S COMPLEMENT
517 STA LEN GO COUNTER
518 TCA TWO'S COMPLEMENT BACK
519 ADD CSUM
520 STA CSUM
521 RLP LDA BTYPE
522 CAS TDAT DATA BLOCK?
523 JMP RZER NO
524 JMP RDAT YES
525 JMP RZER NO, CLEAR A
526 RDAT JST LWRD
527 STA* PTR
528 ADD CSUM ADD TO CHECKSUM
529 STA CSUM
530 EL IRS PTR POINT TO NEXT LOCATION
531 SKP
532 JMP BO3S OVERFLOW!
533 IRS LEN INCREMENT NEG COUNTER
534 JMP RLP READ ON
535 *
536 JST LWRD NOW READ IN THE CHECKSUM
537 SUB CSUM
538 SNZ
539 JMP SLOP
540 CERR CRA CHECKSUM ERROR HALT
541 JST PAUS
542 JMP SLOP TRY A NEW BLOCK
543 *
544 RZER CRA
545 STA* PTR STORE ZERO
546 JMP EL USE END OF LOOP ABOVE
547 *******
548 * STOP BLOCK
549 RSTP LDA BO3S FOR SHOW
550 JST PAUS
551 JMP* RESA JUMP TO RESTART LOCATION
552 *
553 *
554 **********************
555 * CONSTANTS
556 *
557 RESA DAC SLOP RESTART ADDRESS
558 BSTA DEC 129 BLOCK START CHARACTER
559 EBT OCT '125252 ERROR MESSAGE FOR A REG
560 *
561 * BLOCK TYPES:
562 TSAD OCT '33
563 TGO OCT '44
564 TZER OCT '55
565 TSTP OCT '66
566 TDAT OCT '11
567 *
568 *
569 LWRD OCT 66 CAN'T BE INITIALLY ZERO!
570 INA '1001 CLEAR A AND INPUT
571 JMP *-1
572 ICA
573 INA '1 INPUT
574 JMP *-1 WAIT
575 JMP* LWRD
576 *
577 FIN WRITE OUT LITERALS - IF ANY
578 *******************
579 * THE ATTIC OF THE THIRD STAGE LOADER
580 PJ1 JMP* PAUS LAST LOCATION THAT WILL BE LOADED FROM TAPE!
581 PJ2 OCP '101 STOP READER
582 PAUS DAC ** WILL BE INITIALIZED TO ZERO BEFORE PUNCHING
583 J2 DAC ** BECOMES OCP '101 ON START OF LOAD
584 JH HLT BECOMES CLEARED ON START OF LOAD
585 J1 DAC ** BECOMES JMP* PAUS ON START OF LOAD
586 *
587 ***** VARIABLES
588 CSUM DAC ** CHECKSUM
589 LEN DAC ** LENGTH COUNTER
590 BTYP DAC ** BLOCK TYPE
591 ALOC *** ** CURRENT LOCATION TO PUNCH
592 ELOC *** ** LAST LOCATION TO PUNCH
593 PTR DAC ** MEMORY POINTER
594 CNT DAC ** WHERE TO LOAD? CAN BE CHANGED.
595 *
596 ************************************************************
597 END THAT'S IT, ENJOY!
598