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