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