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