Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM 86/CONCURRENT/CCPM-86 2.0 SOURCE/serializ/serial16.xrf
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

1595 lines
52 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

File: serial16.a86 Page 1
1 ; Use "gencmd serial data[m100]" when producing CMD file
2
3 ; print control constants
4
5 cr equ 00Dh ; carriage return
6 lf equ 00Ah ; line feed
7 bell equ 007h ; self-explanatory
8 bs equ 008h ; backspace
9 vt equ 00Bh ; vertical tab
10
11 ; ccpm call function codes
12
13 ccpm equ 224 ; ccpm interrupt
14
15 c_read equ 1 ; request single character from console
16 c_write equ 2 ; send single character to console
17 c_writebuf equ 9 ; print string terminated by '$'
18 drv_dpb equ 31 ; get DBP offset and segment base
19 drv_resetall equ 13 ; reset disk system
20 drv_set equ 14 ; select disk drive reg DL=disk #
21 ; (0=A,1=B,etc.)
22 mc_max equ 53 ; find available memory space
23
24 ; bdos function codes for direct BIOS calls
25
26 s_bios equ 50 ; direct BIOS call function code
27 read_code equ 13 ; read a 128 byte sector
28 write_code equ 14 ; write a 128 byte sector
29
30 ; program constants
31
32 blank equ 0E5h ; data which an empty (blank)
33 ; sector will contain
34 false equ -1
35 true equ 0
36
37 cseg
38
39 start:
40 ; init serial_number
41 mov cx,length ser_def
42 mov al,'0'
43 mov bx,offset serial_number
44 initlop10:
45 mov byte ptr[bx],al
46 inc bx
47 loop initlop10
48
49 ; give sign on
50 call clear ; clear the monitor screen
51 mov dx,offset msg0 ; print sign on message
52 call pmsg
53
54 ; prompt operator for source and destination drives
55 mov dx,offset msg12 ; send source message to
56 call pmsg ; console
57 call get_char ; get disk code
58 sub al,'A' ; correct it
59 mov dskS,al ; store code for source disk
60 mov dx,offset msg13 ; send destination message
File: serial16.a86 Page 2
61 call pmsg ; to console
62 call get_char ; get disk code
63 sub al,'A' ; correct it
64 mov dskD,al ; store code for dest disk
65
66 ; prompt operator for source disk
67 mov dx,offset msg14 ; send message
68 call pmsg_wait
69
70 ; the reset function clears out any previous information pertaining
71 ; to format, sector size, density, etc. and the next time a disk is
72 ; selected those values will be reinitialized.
73 mov cl,drv_resetall ; reset disks
74 int ccpm
75
76 ; when a disk is selected, CP/M initializes the Disk Parameter Header
77 ; and the Disk Parameter Block to conform with the format of the
78 ; selected disk.
79 mov al,dskS ; select source disk
80 mov disk,al
81 mov cl,s_bios
82 mov dx,offset sel_dsk_tab
83 int ccpm
84
85 ; when the "select disk" function is performed using a direct BIOS call
86 ; the offset of the DPH (in system's extra segment) is returned in the
87 ; BX register. the first word of the DPH is the offset of the sector
88 ; translation table for the system.
89 mov xlt_offset,bx ; save offset of system's
90 ; sector translation table
91
92 ; move DPB into program data area
93 cld
94 mov cl,drv_dpb ; get system extra segment
95 int ccpm ; value and offset of DPB
96 push es ; save ES value
97 mov si,bx ; init source pointer
98 mov es,data_base
99 mov di,offset DPB
100 pop ds ; get system extra seg into DS
101 mov cx,15 ; init byte counter
102 rep movsb
103 push ds ; save system extra seg value
104 push es ; restore DS value
105 pop ds
106
107 ; get system sector translation table into data segment of program
108 pop es ; recover extra seg value
109 mov bx,xlt_offset ; get offset of trans table
110 mov si,es:word ptr[bx] ; into SI
111 test si,si ; if SI = 0 then system doesn't
112 jnz has_table ; have a translation table
113 mov bx,offset xlt_tab ; which means that I'll have
114 mov cx,spt ; to init "xlt_tab" myself
115 mov al,0
116 initlop0:
117 mov byte ptr[bx],al
118 inc al
119 inc bx
120 loop initlop0
File: serial16.a86 Page 3
121 mov al,1 ; set skew factor = 1
122 jmps init_addr_tab
123 has_table:
124 push es ; save extra seg again
125 mov bx,xlt_offset ; get offset of trans table
126 mov di,offset xlt_tab ; DI = offset of program sector
127 ; translation table
128 mov cx,spt ; use sectors/track as
129 ; counter value
130 mov es,data_base ; init ES value
131 pop ds ; init DS
132 rep movsb
133 push es ; restore old DS value
134 pop ds
135
136 ; make sure that serial numbers that cross sector boundries will be
137 ; found
138 init_addr_tab:
139 sub ax,ax ; init address offset
140 mov si,offset xlt_tab ; SI -> xlt-tab
141 mov cx,spt ; init counter
142 sub dh,dh ; DH = 0
143 initlop9:
144 mov bx,offset addr_tab
145 mov dl,byte ptr[si] ; get sector number
146 inc si ; move pointer
147 sub dl,xlt_tab ; subtract 1st sector number
148 add dl,dl ; multiply by 2
149 add bx,dx ; BX -> correct table entry
150 mov word ptr[bx],ax ; put address into table
151 add ax,128 ; AX = AX+bytes/sectorz
152 loop initlop9
153
154 ; depending on the system, each physical sector on a diskette can
155 ; be made up of a number of logical sectors (128 bytes long). the
156 ; following code analyses the system sector translate table to
157 ; determine the number of logical sectors in a physical sector.
158 mov bx,offset xlt_tab ; BX -> xlt_tab
159 xltlop0:
160 mov al,byte ptr[bx] ; AL = table entry
161 inc bx ; BX -> next byte in table
162 inc al
163 cmp al,byte ptr[bx] ; see if the two numbers are in
164 je xltlop0 ; the right order
165 sub bx,offset xlt_tab ; if they aren't then calculate
166 ; how long the sequence was
167 mov spb,bx ; and save the value
168 ; calculate skew of system sector translation table
169 mov al,xlt_tab[bx] ; get byte at xlt_tab+spb
170 sub al,xlt_tab ; and subtract byte at xlt_tab
171 mov bx,spb ; now divide by sectors/block
172 sub ah,ah ; prepare of division
173 div bl
174 mov skew,al
175 ; tell operator about skew
176 skew_prompt:
177 push ax ; save system skew
178 call clear ; clear screen
179 mov dx,offset msg21 ; send message
180 call pmsg
File: serial16.a86 Page 4
181 pop dx ; recover skew
182 or dl,030h ; make it ASCII
183 mov cl,c_write
184 int ccpm
185 ; ask operator if he/she would like to change the sector skew
186 mov dx,offset msg16
187 call pmsg
188 call get_char ; get Y/N response
189 cmp al,'N' ; check for No
190 je dont_change
191 ; ask for new skew factor
192 mov dx,offset msg17
193 call pmsg
194 call get_1num
195 mov skew,al
196 ; make new sector translation table using skew factor supplied by
197 ; operator
198 mov si,offset xlt_tab ; BX is pointer into xlt_tab
199 mov bl,byte ptr[si] ; init beginning sector number
200 mov bh,bl
201 mov dl,sptbyte ; calculate sectors/track +
202 add dl,bl ; first sector number
203 mov cl,skew ; init loop counter
204 sub ch,ch
205 xltlop1:
206 push cx ; save loop counter
207 xltlop2:
208 mov cx,spb ; init sectors/block counter
209 push bx ; save sector # registers
210 xltlop3:
211 mov byte ptr[si],bh ; put sector number into table
212 inc si ; increment pointer
213 inc bh ; increment sector number
214 loop xltlop3
215 mov ax,spb ; calculate new starting sector
216 mov cl,skew
217 mul cl
218 pop bx ; recover sector # registers
219 add bh,al ; add skew*spt to starting
220 ; sector number
221 cmp bh,dl ; compare new starting sector #
222 ; to first sector # + spt
223 jb xltlop2
224 add bl,spbbyte ; add sectors/block to 1st
225 ; starting sector number
226 mov bh,bl ; init starting sector
227 ; number of the next sector
228 ; block
229 pop cx ; recover loop counter
230 loop xltlop1
231 dont_change:
232 ; ok, now calculate many how bytes there are on a track.
233 ; bytes/track = sectors/track * logical sector size
234 mov ax,spt
235 mov bx,128
236 mul bx
237 mov bpt,ax ; save value
238
239 mov cl,mc_max ; find 64k or less of free
240 mov dx,offset mcb ; memory
File: serial16.a86 Page 5
241 int ccpm
242
243 ; check the disk for blank tracks starting at last track. blank
244 ; tracks won't be copied
245 mov dx,offset msg1 ; tell operator about search
246 call pmsg
247 cld ; set direction flag forward
248 mov dx,offset msg7 ; send 'Reading' message
249 call pmsg
250 mov cx,last_trk ; initialize track counter
251 scan_loop:
252 push cx ; save track counter
253 mov track,cl ; get current track
254 mov al,cl ; make track number ascii
255 call make_ascii
256 mov dx,offset ascii_trk ; print it
257 call pmsg
258 mov dma_addr,0 ; initialize dma offset
259 call seek ; seek to track
260 call read ; read a track
261 mov al,blank ; init AL with the character
262 ; which is found in blank
263 ; (empty) sectors
264 mov es,m_base ; init segment reg
265 mov di,0 ; offset is set to zero
266 mov cx,bpt ; how many bytes to scan
267 repe scasb ; scan until ZF=1 or CX=0
268 jne data_found ; if ZF=1 then have found data
269 call erase_trk ; erase old track message
270 pop cx ; otherwise scan another track
271 loop scan_loop ; if CX<>0
272
273 ; the diskette is blank if program flow reaches this point
274 mov dx,offset error_msg0
275 call pmsg ; inform operator that the
276 call abort ; source disk is blank and
277 ; abort operation
278
279 data_found:
280 pop cx ; if data is found then save
281 mov last_trk,cx ; the number of the non-blank
282 ; track
283 ; the information on the source disk will more than likely need to be
284 ; paged into memory. the following code calculates how many pages
285 ; or blocks will be needed.
286 mov ax,m_length ; calculate number of bytes
287 mov bx,16 ; available to be used for
288 mul bx ; a buffer area
289 mov bx,bpt
290 div bx
291 mov cx,last_trk ; CX will contain number of
292 sub cx,off ; tracks to be copied
293 cmp ax,cx ; if block1 track count<lst_trk
294 jl over0 ; then get block2 track count
295 mov B1_trk_cnt,cx ; last_trk, block_cnt=
296 mov block_cnt,1 ; 1 and jump to new_disk
297 jmps over07
298 over0:
299 dec ax
300 mov B1_trk_cnt,ax
File: serial16.a86 Page 6
301 sub dx,dx
302 mov bx,ax ; bx holds divisor
303 mov ax,cx ; hold dividend in division
304 ; operation
305 div bx ; do division
306 mov block_cnt,ax ; move result to memory
307 mov B2_trk_cnt,dx ; remainder = block2 track
308 ; count
309 over07:
310 ; prompt operator for number of serial fields on source disk
311 call get_cnt
312 cmp al,0 ; if count = 0 then don't ask
313 jz over09 ; for a starting serial number
314
315 ; prompt operator for starting serial number
316 call get_serial
317 over09:
318 ; ask operator if he/she wants to verify the copy against the source
319 ; disk and if so, how often
320 call clear ; clear monitor screen
321 mov dx,offset msg18 ; ask question
322 call pmsg
323 mov ver_freq,0 ; init verification frequency
324 ; value
325 call get_char ; get yes/no answer
326 cmp al,'N' ; check for no
327 je over01 ; if no then dont verify
328 ; ask operator for frequency of verification
329 mov dx,offset msg19 ; send message
330 call pmsg
331 call get_2num ; get response from operator
332 mov ver_freq,al ; save value
333 over01:
334
335 ; clear monitor screen
336 call clear
337
338 mov dsk_cnt,0 ; init diskette counter
339
340 ; this portion of code does the copying and serializing
341 new_disk:
342 cld ; move current serial number
343 mov es,data_base ; into insert serial message
344 mov cx,length ser_def
345 mov si,offset serial_number
346 mov di,offset serial_1
347 rep movsb
348
349 mov dx,offset msg3 ; prompt operator for
350 call pmsg_wait ; destination diskette
351
352 ; home both disk drives
353 call selectD
354 call home
355 call selectS
356 call home
357
358 mov ax,off ; don't copy reserved tracks
359 mov trackS,al
360 mov trackD,al
File: serial16.a86 Page 7
361
362 mov ax,B1_trk_cnt ; init track counter
363 mov track_cnt,ax
364
365 mov tog0,0 ; decides whether to use
366 ; B1_trk_cnt or B2_trk_cnt
367
368 mov serial_cnt,0 ; used to check if all the
369 ; serial fields were found
370
371 mov dx,offset msg7 ; send 'Reading' message
372 call pmsg
373 call seekS ; read in a track so that
374 mov dma_addr,0 ; there is always an extra
375 call read ; one in memory
376 call erase_msg ; erase "Reading" message
377
378 mov cx,block_cnt ; init block counter
379
380 create_dsk:
381 push cx ; save block counter
382 mov cx,bpt ; intialize dma offset
383 mov dma_addr,cx
384 call selectS ; select source disk
385 mov dx,offset msg7 ; send 'Reading' message
386 call pmsg
387 mov cx,track_cnt ; init track counter
388 lop0:
389 push cx ; save track counter
390 call seekS ; seek track on source drive
391 call read ; read a track
392 call erase_trk ; erase old track message
393 pop cx ; recover track counter
394 loop lop0
395 call erase_msg ; erase "Reading" message
396
397 call serialize ; insert current serial number
398 ; into all serial fields in
399 ; this block
400
401 mov dma_addr,0 ; same as above but write to
402 ; destination drive
403 call selectD ; select destination drive
404 mov dx,offset msg8 ; send "Writing" message to
405 call pmsg ; console
406 mov cx,track_cnt
407 lop1:
408 push cx
409 call seekD
410 call write
411 call erase_trk ; erase old track message
412 pop cx
413 loop lop1
414 call erase_msg ; erase "Writing" message
415
416 ; move extra track (read and searched but not written) from end of
417 ; buffer to the beginning of the buffer
418 cld ; clear direction flag
419 mov cx,bpt ; init counter
420 mov ax,cx ; calculate starting address
File: serial16.a86 Page 8
421 mov bx,B1_trk_cnt ; of data to be moved
422 mul bx
423 mov si,ax
424 mov di,0 ; where block is to be moved
425 mov ax,m_base ; init segment registers
426 push ds ; save old values
427 push es
428 mov ds,ax ; move in new values
429 mov es,ax
430 rep movsb ; do the move
431 pop es ; recover values of segment
432 pop ds ; registers
433
434 pop cx ; recover block counter
435 loop create_dsk ; do again if not last block
436 cmp tog0,1 ; check if we have reached this
437 ; point before
438 je done ; if yes then we are done
439 mov tog0,1 ; no, so toggle tog0
440 mov ax,B2_trk_cnt ; if B2_trk_cnt=0
441 cmp ax,0 ; then we are done
442 je done
443 mov track_cnt,ax ; else do above again but with
444 mov cx,1 ; B2_trk_cnt = track count
445 jmp create_dsk
446 done:
447 mov dx,offset msg8 ; send "Writing" message
448 call pmsg ; to console
449 call seekD ; write last track to dest
450 call write ; drive
451
452 mov al,count_num ; check if all serial fields
453 cmp al,serial_cnt ; were found
454 je serial_ok ; if not then there is an error
455 mov dx,offset error_msg3 ; inform operator of error
456 call pmsg
457 call abort ; abort operation
458 serial_ok:
459
460 call erase_msg ; erase "Writing" message
461
462 inc dsk_cnt ; increment diskette counter
463
464 mov ax,dsk_cntword ; get number of diskettes done
465 mov cx,ver_freqword ; get verification frequency
466 jcxz dont_verify ; don't verify if CX = 0
467 div cl ; see if it's time to verify
468 test ah,ah ; if DX = 0 then it's time
469 jnz dont_verify
470 ; do the verification
471 mov dx,offset msg20 ; send "Verifying" message
472 call pmsg
473 mov cx,last_trk ; calculate number of tracks to
474 mov ax,off ; compare
475 sub cx,ax
476 inc cx ; correct result
477 mov trackS,al
478 mov trackD,al
479 verlop0:
480 push cx ; save track counter
File: serial16.a86 Page 9
481 call selectD ; select dest disk
482 call seekD ; seek to track on dest disk
483 mov dma_addr,0 ; init offset of 1st buffer
484 call read ; read a track from source disk
485 call erase_trk ; erase old track message
486 call selectS ; select source drive
487 call seekS ; seek to current track
488 mov cx,bpt ; init 2nd buffer offset
489 push cx ; temp save
490 mov dma_addr,cx
491 call read ; read a track from dest disk
492 call erase_trk ; erase old track message
493 pop cx ; recover track data length
494 ; into byte counter
495 sub si,si ; init 1st pointer
496 mov di,cx ; init 2nd pointer
497 verlop1:
498 push ds ; save value of data seg reg
499 mov ax,m_base ; get extra seg reg value
500 mov es,ax ; init ES
501 mov ds,ax ; init DS
502 repe cmpsb ; verify
503 pop ds ; recover data seg reg value
504 je verlop2 ; if ZF = 0 then verification
505 ; failed. inform operator
506 dec di ; correct 2nd buffer pointer
507 push si ; save pointer to 1st buffer
508 push cx ; save byte pointer
509 mov si,offset ser_def ; SI -> to ser_def
510 mov cx,length ser_def ; init counter
511 repe cmpsb ; do compare
512 jne verlop3
513 pop cx ; recover byte counter
514 sub cx,length ser_def-1 ; correct it
515 pop si ; recover 1st buffer pointer
516 add si,length ser_def-1 ; correct it
517 jmps verlop1
518 ; verification failed so inform operator to try it again
519 verlop3:
520 call clear
521 mov dx,offset error_msg7
522 call pmsg
523 jmp new_disk
524 verlop2:
525 pop cx ; recover track counter
526 loop verlop0
527
528 dont_verify:
529 call clear ; clear monitor screen
530 cld ; insert current serial number
531 mov cx,length ser_def ; into remove message
532 mov es,data_base
533 mov si,offset serial_number
534 mov di,offset serial_2
535 rep movsb
536
537 mov dx,offset msg4 ; prompt operator to remove
538 call pmsg ; copy
539
540 call inc_serial ; increment current serial
File: serial16.a86 Page 10
541 ; number
542
543 jmp new_disk ; do another disk
544
545
546 ; read a track from the selected disk
547 read:
548 mov io_tab,read_code
549 jmps track_io
550
551 ; write a track to the selected disk drive
552 write:
553 mov io_tab,write_code
554 jmps track_io
555
556 ; do track input or output on selected disk drive
557 track_io:
558 mov cx,4 ; initialize io retry counter
559 io_retry:
560 push cx ; save retry counter
561 call track_setup ; init dma base address
562 mov sector,0 ; start with sector #0
563 mov cx,spt ; init sector counter
564 io_lop:
565 push cx ; save sector counter
566 call sectran ; perform sector translation
567 mov dx,offset set_sector ; set sector thru ccpm
568 mov cl,s_bios
569 int ccpm
570
571 mov dx,offset set_dma_offset ; set dma offset thru ccpm
572 mov cl,s_bios
573 int ccpm
574
575 mov cl,s_bios ; set read/write func thru ccpm
576 mov dx,offset io_tab
577 int ccpm
578 test al,al ; io error if not zero
579 jnz io_error ; tell operator about io error
580 inc sector ; next sector to read
581 pop cx ; recover sector counter
582 loop io_lop
583
584 pop cx ; clean up stack
585 mov ax,bpt ; init dma_addr for next
586 add dma_addr,ax ; track
587 ret
588 io_error:
589 pop cx ; clean up stack
590 call home ; home disk
591 pop cx ; recover retry counter
592 loop io_retry
593 ret
594
595 track_setup:
596 mov ax,m_base ; initialize dma base address
597 mov dma_base,ax
598 mov cl,s_bios
599 mov dx,offset set_dma_base
600 int ccpm
File: serial16.a86 Page 11
601 ret
602
603 ; do logical to physical sector translation
604 sectran:
605 sub ah,ah
606 mov al,sector
607 mov bx,offset xlt_tab
608 xlat xlt_tab
609 mov tsector,al
610 sub ah,ah
611 sub al,xlt_tab
612 add al,al
613 mov bx,offset addr_tab
614 add bx,ax
615 mov ax,word ptr[bx]
616 add ax,dma_addr
617 mov dma_offset,ax
618 ret
619
620 ; home the selected drive
621 home:
622 mov track,0
623 jmps seek
624
625 ; seek to the selected track on the source drive
626 seekS:
627 mov al,trackS
628 inc trackS
629 jmps display_trk
630
631 ; seek to the selected track on the destination drive
632 seekD:
633 mov al,trackD
634 inc trackD
635 display_trk:
636 mov track,al
637 call make_ascii ; make track # ascii
638 mov dx,offset ascii_trk ; send track number to
639 call pmsg ; console
640
641 ; seek to the selected track on the selected drive
642 ; "track" = desired track #
643 seek:
644 mov cl,s_bios
645 mov dx,offset seek_trk_tab
646 int ccpm
647 ret
648
649 ; select source disk
650 selectS:
651 mov dl,dskS
652 jmps select
653
654 ; select destination disk
655 selectD:
656 mov dl,dskD
657
658 ; select a disk drive for future operations
659 select:
660 mov cl,drv_set
File: serial16.a86 Page 12
661 int ccpm
662 ret
663
664 ; get starting serial number from operator
665 get_serial:
666 mov dx,offset msg2 ; send prompt message
667 call pmsg ; to console
668
669 mov dx,offset con_buf0 ; point to console input buffer
670 mov cl,10 ; CP/M read console buffer
671 int ccpm
672 cmp buf0_len,length ser_def ; check for correct number
673 ; of digits
674 jne bad_serial
675 ret
676
677 bad_serial:
678 mov error_msg2,length ser_def
679 or error_msg2,030h ; make it ASCII
680 mov dx,offset error_msg1
681 call pmsg
682 jmps get_serial
683
684 ; get from the operator how many serial fields are on the source
685 ; diskette. this is a safeguard to help prevent the wrong disk
686 ; from being used.
687 get_cnt:
688 mov dx,offset msg6 ; send prompt message
689 call pmsg ; to console
690 call get_2num ; get a number (0-99)
691 ; from operator
692 mov count_num,al ; save number
693 ret
694
695 ; input two ASCII numbers into buffer 1 and translate them into a
696 ; binary number which is returned in the AL register
697 get_2num:
698 mov dx,offset con_buf1 ; get address of buffer
699 mov cl,10
700 int ccpm
701 cmp buf1_len,2 ; can't have more than
702 jbe input_ok0 ; two digits 0-99
703 input_err0:
704 mov dx,offset error_msg6 ; tell operator about
705 call pmsg ; error and try again
706 jmp get_2num
707 input_ok0:
708 cmp buf1_len,0 ; need at least one
709 je input_err0 ; digit. tell operator
710 ; if there isn't
711 mov bx,offset input_num ; bx -> input buffer
712 mov cl,buf1_len ; (cl) = digit count
713 sub ch,ch ; zero upper half of cx
714 add bx,cx ; make bx point to
715 dec bx ; units digit of input
716
717 mov dh,byte ptr[bx] ; get units digit
718 and dh,00Fh ; mask off upper nybble
719 loop tens ; if (cx) <> 2 then get
720 ; tens digit
File: serial16.a86 Page 13
721 jmp got_it ; only had one digit
722 tens:
723 dec bx ; make bx -> to tens
724 ; digit
725 mov dl,byte ptr[bx] ; get tens digit
726 and dl,00Fh ; mask off upper nybble
727 mov al,10 ; load multiplier
728 mul dl ; do multiply
729 add dh,al ; add tens to units
730 got_it:
731 mov al,dh ; save number
732 ret
733
734
735 serialize: ; locate all occurrances of serial numbers in buffer
736
737 cld ; set direction forward
738 mov es,m_base ; point ES: to beginning of buffer
739 mov di,0
740 mov ax,bpt
741 mov bx,track_cnt
742 inc bx ; remember that an extra track was read
743 mul bx
744 mov cx,ax
745 next_serial:
746 mov si,offset ser_def ; point at pattern
747 lodsb ; get first char of pattern into AL
748 repne scasb ; look for next occurance of AL
749 jne no_match ; if not match, then we are done
750
751 push di ; save scan pointer
752 push cx ; save count
753 mov cx,(length ser_def)-1 ; residual length of pattern
754 repe cmpsb
755 pop cx ; recover scan count
756 pop di ; recover scan pointer
757 jne next_serial ; no, rest didn't match
758
759 push cx ; save scan pointer
760 dec di ; move di back to start of field
761 mov si,offset serial_number ; si points to current serial
762 ; number
763 mov cx,length ser_def ; counter for number of bytes to move
764 rep movsb
765 pop cx ; recover scan pointer
766 inc serial_cnt
767 jmp next_serial
768
769 no_match:
770 ret
771
772 ; increment the ASCII serial number
773
774 inc_serial:
775 mov cx,length ser_def ; length of serial number
776 mov bx,offset serial_number ; bx points to start of string
777 add bx,(length ser_def)-1 ; bx now points to end of string
778 addlop:
779 push cx ; save length of pointer
780 mov al,byte ptr[bx] ; get byte of serial number
File: serial16.a86 Page 14
781 inc al ; add 1 to it
782 daa ; decimal adjust it
783 lahf ; check to see if there was a
784 and ah,10h ; carry from the lower half of
785 mov cl,4 ; the al register
786 shl ah,cl
787 jc fix ; if yes then increment the next
788 ; byte of the serial number
789 mov byte ptr[bx],al ; else save byte and stop
790 pop cx ; clean up stack
791 ret
792 fix:
793 and al,0fh ; make high nybble of byte
794 or al,30h ; equal to "3" again
795 mov byte ptr[bx],al ; save byte back in serial
796 ; number
797 dec bx ; point at next higher byte
798 pop cx ; recover length of serial
799 ; number
800 loop addlop ; do again if CX<>0
801 ret
802
803 ; translate the 8 bit digit in AL to ASCII into "ascii_trk"
804 make_ascii:
805 mov dx,' ' ; fill "ascii_trk" with blanks
806 mov ascii_trk,dx
807 mov ascii_trk+2,dx
808 mov bx,offset ascii_trk+3 ; BX -> "ascii_trk"+3
809 mov dl,10 ; init divisor
810 makelop1:
811 sub ah,ah ; make AH zero
812 div dl ; and divide by 10
813 add ah,'0' ; make remainder ascii
814 mov byte ptr[bx],ah ; store it in "ascii_trk"
815 dec bx ; move pointer to next location
816 test al,al ; see if quotient zero yet
817 jnz makelop1 ; no, got more digits
818 ret
819
820 ; print the message at [DX] and wait for RETURN key
821 pmsg_wait:
822 call pmsg ; print the message
823 wait_1:
824 mov cl,c_read ; CP/M Console Input
825 int ccpm
826 cmp al,'C'-'@' ; see if control-C
827 je abort ; terminate program
828 cmp al,cr ; see if ASCII carriage return
829 jne wait_1 ; no, try again
830 ret ; back to caller
831
832 ; abort the program
833 abort:
834 mov dx,offset abort_msg
835 call pmsg_wait
836 mov cl,0 ; CP/M reboot function
837 int ccpm
838
839 ; print the string whose offset is in dx and is terminated by '$'
840 pmsg:
File: serial16.a86 Page 15
841 mov cl,c_writebuf
842 int ccpm
843 ret
844
845 ; clears the monitor screen
846 clear:
847 cmp clear_on,false ; see if clear screen enable is
848 je no_clear ; off
849 mov dx,offset clear_msg
850 call pmsg
851 no_clear:
852 ret
853
854 ; get ASCII input from operator and translate to upper case
855 get_char:
856 mov cl,c_read ; request single character
857 int ccpm ; from console
858 cmp al,'C'-'@' ; check for control-C
859 je abort ; abort operation if yes
860 and al,05Fh ; xlate lower to upper chase
861 ; echo choice back to operator
862 echo_choice:
863 push ax ; temp save
864 mov dl,bs ; write over last input
865 mov cl,c_write
866 int ccpm
867 pop dx ; get temp save
868 push dx
869 mov cl,c_write ; write it out
870 int ccpm
871 pop ax
872 ret
873
874 ; get a single ASCII number from operator and check for .
875 get_1num:
876 mov cl,c_read
877 int ccpm
878 cmp al,'C'-'@' ; check for control-C
879 je abort
880 and al,00Fh
881 ret
882
883 ; this code erases the "Reading" and "Writing" messages from the
884 ; monitor screen
885 erase_msg:
886 mov dx,offset msg10
887 call pmsg
888 ret
889
890 ; this code erases the old track numbers from the monitor screen
891 erase_trk:
892 mov dx,offset msg11
893 call pmsg
894 ret
895
896 dseg
897 org 0000h
898
899 ; Page Zero Definitions
900
File: serial16.a86 Page 16
901 code_length rw 1 ; low 16 bits code segment length
902 code_length_h rb 1 ; high 8 bits code segment length
903 code_base rw 1 ; base paragraph of code segment
904 model_8080 rb 1 ; 8080 model byte
905 data_length rw 1 ; low 16 bits data segment length
906 data_length_h rb 1 ; high 8 bits data segment length
907 data_base rw 1 ; base paragraph of data segment
908 rs 1 ; << reserved >>
909 extra_length rw 1 ; low 16 bits extra segment length
910 extra_length_h rb 1 ; high 8 bits extra segment length
911 extra_base rw 1 ; base paragraph of extra segment
912
913
914 org 0100h
915
916 seek_trk_tab db 10 ; seek track function table
917 track rb 4
918
919 sel_dsk_tab db 9 ; select disk drive
920 disk rb 4
921
922 set_dma_base db 17 ; set dma base address function table
923 dma_base rw 2
924
925 set_dma_offset db 12 ; set dma offset address function table
926 dma_offset rw 2
927
928 set_sector db 11 ; set sector function table
929 tsector rb 4 ; holds translated sector #
930 sector rb 1 ; holds untranslated sector #
931
932 io_tab rb 1 ; select read/write function table
933 rw 2
934
935 bpt rw 1 ; how many bytes per track
936
937 mcb rw 0 ; memory control block
938 m_base rw 1 ; base address (segment address)
939 m_length dw 0FFFh ; desired length of memory area
940 m_ext rw 1
941
942 ver_freqword rw 0
943 ver_freq db 0,0 ; holds verification frequency value
944 dsk_cntword rw 0
945 dsk_cnt db 0,0 ; number of copies made so far
946
947 B1_trk_cnt rw 1
948 B2_trk_cnt rw 1
949
950 block_cnt rw 1
951
952 track_cnt rw 1
953
954 tog0 rb 1
955
956 serial_cnt rb 1
957
958 count_num rs 1 ; holds number of serial fields
959 ; to expect on source disk
960 dskS db 0
File: serial16.a86 Page 17
961 dskD db 1
962
963 skew rb 1 ; reserve storage for skew factor
964 spb rw 0 ; sectors/block
965 spbbyte rb 2
966
967 DPB rb 0 ; Disk Parameter Block
968 spt rw 0 ; sector per track
969 sptbyte rb 2
970 bsh rb 1 ; block shift factor
971 blm rb 1 ; block mask
972 exm rb 1 ; extent mask
973 dsm rw 1 ; total storage capacity of drive
974 drm rw 1 ; number of directory entries
975 al0 rb 1
976 al1 rb 1
977 cks rw 1
978 off rw 1 ; number of reserved tracks
979
980 xlt_offset rw 1 ; offset of system translate table
981
982 xlt_tab rb 128 ; will contain sector translation table
983 addr_tab rw 128 ; will contain sector address offsets
984 ; from beginning of track address in
985 ; disk data buffer
986 dma_addr rw 1 ; will hold dma offset by track
987
988 trackS rb 1
989 trackD rb 1
990
991 clear_on db true
992
993 last_trk dw 76
994
995 ser_def db '654321'
996
997 msg0 db cr,lf,lf
998 db '-------------------------'
999 db '-------------------------'
1000 db '-'
1001 db cr,lf
1002 db 'SERIAL16 V1.0 Serial No. '
1003 db 'XXXX-0000-999999'
1004 db cr,lf
1005 db 'Copyright (C) 1982'
1006 db cr,lf
1007 db 'Digital Research, Inc. '
1008 db 'All Rights Reserved'
1009 db cr,lf
1010 db '-------------------------'
1011 db '-------------------------'
1012 db '-'
1013 db cr,lf,lf
1014 db 'Diskette Generation Utility',cr,lf
1015 db 'for CP/M-86 based systems'
1016 db '$'
1017
1018 msg2 db cr,lf,lf
1019 db 'Enter starting serial number '
1020 db '$'
File: serial16.a86 Page 18
1021
1022 msg6 db bell,cr,lf,lf
1023 db 'Enter number of serial fields on source disk'
1024 db ' ? '
1025 db '$'
1026
1027 msg7 db 'Reading Track '
1028 db '$'
1029
1030 msg8 db 'Writing Track '
1031 db '$'
1032
1033 msg9 rs 0
1034 ascii_trk rw 2
1035 db ' '
1036 db '$'
1037
1038 msg10 db bs,bs,bs,bs,bs,bs,bs,bs,bs,bs
1039 db bs,bs,bs,bs,bs,bs
1040 msg11 db bs,bs,bs,bs,bs
1041 db '$'
1042
1043 error_msg1 db cr,lf,lf
1044 db 'Serial number must be '
1045 error_msg2 rb 1
1046 db ' digits long. Try again !!! '
1047 db '$'
1048
1049 msg12 db cr,lf,lf,lf
1050 db 'Source Drive is (A,B,etc.) ? '
1051 db '$'
1052
1053 msg13 db cr,lf,lf
1054 db 'Destination Drive is (A,B,etc.) ? '
1055 db '$'
1056
1057 msg14 db cr,lf,lf
1058 db 'Insert Source Disk '
1059 db 'and type "Return" to continue '
1060 db cr,lf,lf
1061 db '$'
1062
1063 msg3 db cr,lf,lf
1064 db 'Insert '
1065 serial_1 rb length ser_def
1066 db ' into destination drive'
1067 db cr,lf
1068 db 'then type "Return" to continue'
1069 db cr,lf,lf
1070 db '$'
1071
1072 msg4 db bell,cr,lf,lf
1073 db 'Remove '
1074 serial_2 rb length ser_def
1075 db ' from destination drive'
1076 db cr,lf,lf
1077 db '$'
1078
1079 abort_msg db cr,lf,cr,lf
1080 db cr,lf,'*** Serialization terminated ***'
File: serial16.a86 Page 19
1081 db cr,lf
1082 db cr,lf,'Replace disk in Drive A:'
1083 db cr,lf,' then type ENTER to reboot ','$'
1084
1085 msg16 db cr,lf,lf
1086 db 'Would you like to change the skew factor'
1087 db ' (Y/N) ? '
1088 db '$'
1089
1090 msg17 db cr,lf,lf
1091 db 'Enter skew factor (1-9) ? '
1092 db '$'
1093
1094 msg18 db cr,lf,lf
1095 db 'Do you want to perform copy verification'
1096 db ' (Y/N) ? '
1097 db '$'
1098
1099 msg19 db cr,lf,lf,lf
1100 db '1 = every disk is verified'
1101 db cr,lf
1102 db '2 = every 2nd disk is verified'
1103 db cr,lf
1104 db '3 = every 3rd disk is verified'
1105 db cr,lf,'"',cr,lf,'"',cr,lf,'"',cr,lf
1106 db '99 = every 99th disk is verified'
1107 db cr,lf,lf
1108 db 'How often do you want the verification to'
1109 db ' occur (1-99) ? '
1110 db '$'
1111
1112 msg20 db 'Verifying Track '
1113 db '$'
1114
1115 msg21 db cr,lf,lf
1116 db 'The current sector skew is '
1117 db '$'
1118
1119 error_msg3 db bell,cr,lf,lf
1120 db 'Did not find all of the required serial '
1121 db 'fields'
1122 db cr,lf
1123 db '$'
1124
1125 error_msg6 db cr,lf,lf
1126 db 'Wrong. Need one or two digits'
1127 db '$'
1128
1129 error_msg7 db bell,cr,lf,lf
1130 db '**** Verification failed ****'
1131 db cr,lf,lf
1132 db 'Try it again.'
1133 db cr,lf
1134 db '$'
1135
1136 error_msg0 db bell,cr,lf,lf
1137 db ' The Source Disk is BLANK '
1138 db cr,lf
1139 db '$'
1140
File: serial16.a86 Page 20
1141 msg1 db cr,lf,lf
1142 db 'Checking for blank tracks'
1143 db cr,lf,lf
1144 db '$'
1145
1146 clear_msg db cr,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf
1147 db lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf,lf
1148 db lf,lf,lf,lf,lf
1149 db vt,vt,vt,vt,vt,vt,vt,vt,vt,vt,vt,vt,vt,vt,vt
1150 db vt,vt,vt,vt,vt,vt,vt,vt,vt
1151 db '$'
1152
1153 con_buf0 db 10 ; buffer used to read
1154 buf0_len rb 1 ; serial number
1155 serial_number rb length ser_def
1156 rb 10-1-length ser_def
1157
1158 con_buf1 db 5 ; another console input buffer
1159 buf1_len rb 1
1160 input_num rb 5
1161
1162
1163 db 0 ; force out end of data segment
**** CROSS REFERENCE *****
abort 276, 457, 827, 833, 834, 859, 879,1079
add 148, 149, 151, 202, 219, 224, 516, 586, 612, 614, 616, 714, 729,
777, 813
addlop 778, 800
addr 122, 138, 144, 258, 374, 383, 401, 483, 490, 586, 613, 616, 983,
986
ah 6, 172, 468, 605, 610, 784, 786, 811, 813, 814
al 42, 45, 58, 59, 63, 64, 79, 80, 115, 117, 118, 121, 160,
162, 163, 169, 170, 174, 189, 195, 219, 254, 261, 312, 326, 332,
359, 360, 452, 453, 477, 478, 578, 606, 609, 611, 612, 627, 633,
636, 692, 727, 729, 731, 780, 781, 789, 793, 794, 795, 816, 826,
828, 858, 860, 878, 880
al0 975
al1 976
and 718, 726, 784, 793, 860, 880
ascii 255, 256, 637, 638, 804, 806, 807, 808,1034
ax 139, 150, 151, 177, 215, 234, 237, 286, 293, 299, 300, 302, 303,
306, 358, 362, 363, 420, 423, 425, 428, 429, 440, 441, 443, 464,
474, 475, 499, 500, 501, 585, 586, 596, 597, 614, 615, 616, 617,
740, 744, 863, 871
b1 295, 300, 362, 421, 947
b2 307, 440, 948
bad 674, 677
base 98, 130, 264, 343, 425, 499, 532, 596, 597, 599, 738, 903, 907,
911, 922, 923, 938
bell 7,1022,1072,1119,1129,1136
bh 9, 200, 211, 213, 219, 221, 226
bios 26, 81, 568, 572, 575, 598, 644
bl 173, 199, 200, 202, 224, 226
blank 32, 261
blm 971
block 296, 306, 378, 950
bpt 237, 266, 289, 382, 419, 488, 585, 740, 935
bs 8, 864,1038,1039,1040
File: serial16.a86 CROSS REFERENCE Page 21
bsh 970
buf0 669, 672,1153,1154
buf1 698, 701, 708, 712,1158,1159
bx 43, 45, 46, 89, 97, 109, 110, 113, 117, 119, 125, 144, 149,
150, 158, 160, 161, 163, 165, 167, 169, 171, 209, 218, 235, 236,
287, 288, 289, 290, 302, 305, 421, 422, 607, 613, 614, 615, 711,
714, 715, 717, 723, 725, 741, 742, 743, 776, 777, 780, 789, 795,
797, 808, 814, 815
byte 45, 117, 145, 160, 163, 199, 211, 717, 725, 780, 789, 795, 814
c 15, 16, 17, 183, 824, 841, 856, 865, 869, 876
call 50, 52, 56, 57, 61, 62, 68, 178, 180, 187, 188, 193, 194,
246, 249, 255, 257, 259, 260, 269, 275, 276, 311, 316, 320, 322,
325, 330, 331, 336, 350, 353, 354, 355, 356, 372, 373, 375, 376,
384, 386, 390, 391, 392, 395, 397, 403, 405, 409, 410, 411, 414,
448, 449, 450, 456, 457, 460, 472, 481, 482, 484, 485, 486, 487,
491, 492, 520, 522, 529, 538, 540, 561, 566, 590, 637, 639, 667,
681, 689, 690, 705, 822, 835, 850, 887, 893
ccpm 13, 74, 83, 95, 184, 241, 569, 573, 577, 600, 646, 661, 671,
700, 825, 837, 842, 857, 866, 870, 877
ch 204, 713
change 190, 231
char 57, 62, 188, 325, 855
choice 862
cks 977
cl 73, 81, 94, 183, 203, 216, 217, 239, 253, 254, 467, 568, 572,
575, 598, 644, 660, 670, 699, 712, 785, 786, 824, 836, 841, 856,
865, 869, 876
cld 93, 247, 342, 418, 530, 737
clear 50, 178, 320, 336, 520, 529, 846, 847, 848, 849, 851, 991,1146
cmp 163, 189, 221, 293, 312, 326, 436, 441, 453, 672, 701, 708, 826,
828, 847, 858, 878
cmpsb 502, 511, 754
cnt 295, 296, 300, 306, 307, 311, 338, 362, 363, 368, 378, 387, 406,
421, 440, 443, 453, 462, 687, 741, 766, 945, 947, 948, 950, 952,
956
cntword 464, 944
code 27, 28, 548, 553, 901, 902, 903
con 669, 698,1153,1158
count 452, 692, 958
cr 5, 828, 997,1001,1004,1006,1009,1013,1014,1018,1022,1043,1049,
1053,1057,1060,1063,1067,1069,1072,1076,1079,1080,1081,1082,1083,
1085,1090,1094,1099,1101,1103,1105,1107,1115,1119,1122,1125,1129,
1131,1133,1136,1138,1141,1143,1146
create 380, 435, 445
cseg 37
cx 41, 101, 114, 128, 141, 206, 208, 229, 250, 252, 266, 270, 280,
281, 291, 292, 293, 295, 303, 344, 378, 381, 382, 383, 387, 389,
393, 406, 408, 412, 419, 420, 434, 444, 465, 473, 475, 476, 480,
488, 489, 490, 493, 496, 508, 510, 513, 514, 525, 531, 558, 560,
563, 565, 581, 584, 589, 591, 714, 744, 752, 753, 755, 759, 763,
765, 775, 779, 790, 798
daa 782
data 98, 130, 268, 279, 343, 532, 905, 906, 907
db 916, 919, 922, 925, 928, 943, 945, 960, 961, 991, 995, 997, 998,
999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,
1012,1013,1014,1015,1016,1018,1019,1020,1022,1023,1024,1025,1027,
1028,1030,1031,1035,1036,1038,1039,1040,1041,1043,1044,1046,1047,
1049,1050,1051,1053,1054,1055,1057,1058,1059,1060,1061,1063,1064,
1066,1067,1068,1069,1070,1072,1073,1075,1076,1077,1079,1080,1081,
File: serial16.a86 CROSS REFERENCE Page 22
1082,1083,1085,1086,1087,1088,1090,1091,1092,1094,1095,1096,1097,
1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1112,
1113,1115,1116,1117,1119,1120,1121,1122,1123,1125,1126,1127,1129,
1130,1131,1132,1133,1134,1136,1137,1138,1139,1141,1142,1143,1144,
1146,1147,1148,1149,1150,1151,1153,1158,1163
dec 299, 506, 715, 723, 760, 797, 815
def 41, 344, 509, 510, 514, 516, 531, 672, 678, 746, 753, 763, 775,
777, 995,1065,1074,1155,1156
dh 5, 142, 717, 718, 729, 731
di 99, 126, 265, 346, 424, 496, 506, 534, 739, 751, 756, 760
disk 80, 341, 523, 543, 920
display 629, 635
div 173, 290, 305, 467, 812
dl 145, 147, 148, 182, 201, 202, 221, 651, 656, 725, 726, 728, 809,
812, 864
dma 258, 374, 383, 401, 483, 490, 571, 586, 597, 599, 616, 617, 922,
923, 925, 926, 986
done 438, 442, 446
dont 190, 231, 466, 469, 528
dpb 18, 94, 99, 967
drm 974
drv 18, 19, 20, 73, 94, 660
ds 100, 103, 105, 131, 134, 426, 428, 432, 498, 501, 503
dseg 896
dsk 82, 338, 380, 435, 445, 462, 464, 919, 944, 945
dskd 64, 656, 961
dsks 59, 79, 651, 960
dsm 973
dw 939, 993
dx 51, 55, 60, 67, 82, 149, 179, 181, 186, 192, 240, 245, 248,
256, 274, 301, 307, 321, 329, 349, 371, 385, 404, 447, 455, 471,
521, 537, 567, 571, 576, 599, 638, 645, 666, 669, 680, 688, 698,
704, 805, 806, 807, 834, 849, 867, 868, 886, 892
e5h 32
echo 862
equ 5, 6, 7, 8, 9, 13, 15, 16, 17, 18, 19, 20, 22,
26, 27, 28, 32, 34, 35
erase 269, 376, 392, 395, 411, 414, 460, 485, 492, 885, 891
err0 703, 709
error 274, 455, 521, 579, 588, 678, 679, 680, 704,1043,1045,1119,1125,
1129,1136
es 96, 98, 104, 108, 110, 124, 130, 133, 264, 343, 427, 429, 431,
500, 532, 738
exm 972
ext 940
extra 909, 910, 911
false 34, 847
fffh 939
fh 718, 726, 793, 860, 880
fix 787, 792
found 268, 279
freq 323, 332, 943
freqword 465, 942
get 57, 62, 188, 194, 311, 316, 325, 331, 665, 682, 687, 690, 697,
706, 855, 875
got 721, 730
h 7, 8, 182, 679, 784, 794, 897, 902, 906, 910, 914
has 112, 123
home 354, 356, 590, 621
File: serial16.a86 CROSS REFERENCE Page 23
inc 46, 118, 119, 146, 161, 162, 212, 213, 462, 476, 540, 580, 628,
634, 742, 766, 774, 781
init 122, 138
initlop0 116, 120
initlop10 44, 47
initlop9 143, 152
input 702, 703, 707, 709, 711,1160
int 74, 83, 95, 184, 241, 569, 573, 577, 600, 646, 661, 671, 700,
825, 837, 842, 857, 866, 870, 877
io 548, 549, 553, 554, 557, 559, 564, 576, 579, 582, 588, 592, 932
it 721, 730
jb 223
jbe 702
jc 787
jcxz 466
je 164, 190, 327, 438, 442, 454, 504, 709, 827, 848, 859, 879
jl 294
jmp 445, 523, 543, 706, 721, 767
jmps 122, 297, 517, 549, 554, 623, 629, 652, 682
jne 268, 512, 674, 749, 757, 829
jnz 112, 469, 579, 817
jz 313
lahf 783
last 250, 281, 291, 473, 993
len 672, 701, 708, 712,1154,1159
length 41, 286, 344, 510, 514, 516, 531, 672, 678, 753, 763, 775, 777,
901, 902, 905, 906, 909, 910, 939,1065,1074,1155,1156
lf 6, 997,1001,1004,1006,1009,1013,1014,1018,1022,1043,1049,1053,
1057,1060,1063,1067,1069,1072,1076,1079,1080,1081,1082,1083,1085,
1090,1094,1099,1101,1103,1105,1107,1115,1119,1122,1125,1129,1131,
1133,1136,1138,1141,1143,1146,1147,1148
lodsb 747
loop 47, 120, 152, 214, 230, 251, 271, 394, 413, 435, 526, 582, 592,
719, 800
lop 564, 582
lop0 388, 394
lop1 407, 413
m 264, 286, 425, 499, 596, 738, 938, 939, 940
make 255, 637, 804
makelop1 810, 817
match 749, 769
max 22, 239
mc 22, 239
mcb 240, 937
model 904
mov 41, 42, 43, 45, 51, 55, 59, 60, 64, 67, 73, 79, 80,
81, 82, 89, 94, 97, 98, 99, 101, 109, 110, 113, 114, 115,
117, 121, 125, 126, 128, 130, 140, 141, 144, 145, 150, 158, 160,
167, 169, 171, 174, 179, 183, 186, 192, 195, 198, 199, 200, 201,
203, 208, 211, 215, 216, 226, 234, 235, 237, 239, 240, 245, 248,
250, 253, 254, 256, 258, 261, 264, 265, 266, 274, 281, 286, 287,
289, 291, 295, 296, 300, 302, 303, 306, 307, 321, 323, 329, 332,
338, 343, 344, 345, 346, 349, 358, 359, 360, 362, 363, 365, 368,
371, 374, 378, 382, 383, 385, 387, 401, 404, 406, 419, 420, 421,
423, 424, 425, 428, 429, 439, 440, 443, 444, 447, 452, 455, 464,
465, 471, 473, 474, 477, 478, 483, 488, 490, 496, 499, 500, 501,
509, 510, 521, 531, 532, 533, 534, 537, 548, 553, 558, 562, 563,
567, 568, 571, 572, 575, 576, 585, 596, 597, 598, 599, 606, 607,
609, 613, 615, 617, 622, 627, 633, 636, 638, 644, 645, 651, 656,
File: serial16.a86 CROSS REFERENCE Page 24
660, 666, 669, 670, 678, 680, 688, 692, 698, 699, 704, 711, 712,
717, 725, 727, 731, 738, 739, 740, 741, 744, 746, 753, 761, 763,
775, 776, 780, 785, 789, 795, 805, 806, 807, 808, 809, 814, 824,
834, 836, 841, 849, 856, 864, 865, 869, 876, 886, 892
movsb 102, 132, 347, 430, 535, 764
msg 376, 395, 414, 460, 834, 849, 885,1079,1146
msg0 51, 274, 997,1136
msg1 245, 680,1043,1141
msg10 886,1038
msg11 892,1040
msg12 55,1049
msg13 60,1053
msg14 67,1057
msg16 186,1085
msg17 192,1090
msg18 321,1094
msg19 329,1099
msg2 666, 678, 679,1018,1045
msg20 471,1112
msg21 179,1115
msg3 349, 455,1063,1119
msg4 537,1072
msg6 688, 704,1022,1125
msg7 248, 371, 385, 521,1027,1129
msg8 404, 447,1030
msg9 1033
mul 217, 236, 288, 422, 728, 743
new 341, 523, 543
next 745, 757, 767
no 749, 769, 848, 851
num 194, 331, 452, 690, 692, 697, 706, 711, 875, 958,1160
number 43, 345, 533, 761, 776,1155
off 292, 358, 474, 978
offset 43, 51, 55, 60, 67, 82, 89, 99, 109, 113, 125, 126, 140,
144, 158, 165, 179, 186, 192, 198, 240, 245, 248, 256, 274, 321,
329, 345, 346, 349, 371, 385, 404, 447, 455, 471, 509, 521, 533,
534, 537, 567, 571, 576, 599, 607, 613, 617, 638, 645, 666, 669,
680, 688, 698, 704, 711, 746, 761, 776, 808, 834, 849, 886, 892,
925, 926, 980
ok 454, 458
ok0 702, 707
on 847, 991
or 182, 679, 794
org 897, 914
over0 294, 298
over01 327, 333
over07 297, 309
over09 313, 317
pmsg 52, 56, 61, 68, 180, 187, 193, 246, 249, 257, 275, 322, 330,
350, 372, 386, 405, 448, 456, 472, 522, 538, 639, 667, 681, 689,
705, 821, 822, 835, 840, 850, 887, 893
pop 100, 105, 108, 131, 134, 181, 218, 229, 270, 280, 393, 412, 431,
432, 434, 493, 503, 513, 515, 525, 581, 584, 589, 591, 755, 756,
765, 790, 798, 867, 871
prompt 176
ptr 45, 110, 117, 145, 150, 160, 163, 199, 211, 615, 717, 725, 780,
789, 795, 814
push 96, 103, 104, 124, 133, 177, 206, 209, 252, 381, 389, 408, 426,
427, 480, 489, 498, 507, 508, 560, 565, 751, 752, 759, 779, 863,
File: serial16.a86 CROSS REFERENCE Page 25
868
rb 902, 904, 906, 910, 917, 920, 929, 930, 932, 954, 956, 963, 965,
967, 969, 970, 971, 972, 975, 976, 982, 988, 989,1045,1065,1074,
1154,1155,1156,1159,1160
read 15, 27, 260, 375, 391, 484, 491, 547, 548, 824, 856, 876
rep 102, 132, 347, 430, 535, 764
repe 267, 502, 511, 754
repne 748
resetall 19, 73
ret 587, 593, 601, 618, 647, 662, 675, 693, 732, 770, 791, 801, 818,
830, 843, 852, 872, 881, 888, 894
retry 559, 592
rs 908, 958,1033
rw 901, 903, 905, 907, 909, 911, 923, 926, 933, 935, 937, 938, 940,
942, 944, 947, 948, 950, 952, 964, 968, 973, 974, 977, 978, 980,
983, 986,1034
s 26, 81, 568, 572, 575, 598, 644
scan 251, 271
scasb 267, 748
sector 562, 567, 580, 606, 928, 930
sectran 566, 604
seek 259, 623, 643, 645, 916
seekd 409, 449, 482, 632
seeks 373, 390, 487, 626
sel 82, 919
select 652, 659
selectd 353, 403, 481, 655
selects 355, 384, 486, 650
ser 41, 344, 509, 510, 514, 516, 531, 672, 678, 746, 753, 763, 775,
777, 995,1065,1074,1155,1156
serial 43, 316, 345, 346, 368, 453, 454, 458, 533, 534, 540, 665, 674,
677, 682, 745, 757, 761, 766, 767, 774, 776, 956,1065,1074,1155
serialize 397, 735
set 20, 567, 571, 599, 660, 922, 925, 928
setup 561, 595
shl 786
si 97, 110, 111, 140, 145, 146, 198, 199, 211, 212, 345, 423, 495,
507, 509, 515, 516, 533, 746, 761
skew 174, 176, 195, 203, 216, 963
spb 167, 171, 208, 215, 964
spbbyte 224, 965
spt 114, 128, 141, 234, 563, 968
sptbyte 201, 969
start 39
sub 58, 63, 139, 142, 147, 165, 170, 172, 204, 292, 301, 475, 495,
514, 605, 610, 611, 713, 811
tab 82, 113, 122, 126, 138, 140, 144, 147, 158, 165, 169, 170, 198,
548, 553, 576, 607, 608, 611, 613, 645, 916, 919, 932, 982, 983
table 112, 123
tens 719, 722
test 111, 468, 578, 816
tog0 365, 436, 439, 954
track 253, 363, 387, 406, 443, 549, 554, 557, 561, 595, 622, 636, 741,
917, 952
trackd 360, 478, 633, 634, 989
tracks 359, 477, 627, 628, 988
trk 250, 256, 269, 281, 291, 295, 300, 307, 362, 392, 411, 421, 440,
473, 485, 492, 629, 635, 638, 645, 806, 807, 808, 891, 916, 947,
948, 993,1034
File: serial16.a86 CROSS REFERENCE Page 26
true 35, 991
tsector 609, 929
ver 323, 332, 465, 942, 943
verify 466, 469, 528
verlop0 479, 526
verlop1 497, 517
verlop2 504, 524
verlop3 512, 519
vt 9,1149,1150
wait 68, 350, 821, 823, 829, 835
word 110, 150, 615
write 16, 28, 183, 410, 450, 552, 553, 865, 869
writebuf 17, 841
xlat 608
xlt 89, 109, 113, 125, 126, 140, 147, 158, 165, 169, 170, 198, 607,
608, 611, 980, 982
xltlop0 159, 164
xltlop1 205, 230
xltlop2 207, 223
xltlop3 210, 214
**** end cross reference ***