IMD 1.16: 29/05/2007 12:33:46 FOGCPM.037 --FOGCPM037DSKPRAM COMDSKPRAM ASMw PROBE COM !"#PROBE COM$-07-00 86 SKEW COM %&FORMAT DOC'CFORMAT COM()DFORMAT COM*+KFORMAT COM,-OFORMAT COM./0OSTOKPROCOM1OZTOKPROASM72345678MFDISK DOC9:;MFDISK10COM<=>?@ABCDEFGHIJKMFDISK10COM+LMNOPQ-CPM037 DOCMFDISK2 COMRSTUVWXYZ[\]^_`aMFDISK2 COM)bcdefgMFDISK4 COMhijklmnopqrstuvwMFDISK4 COM.xyz{|}SETVISO1COM ~SETVISO1DOCPCPIP2 COMcPCPIP C PCPIP C ALL SUBBIOSCALLC %DUMP C END MACPCLIB C This is the disk name. !91!::]/$?$-͔*!,:\=7͝_A2͑ͩͳ;;;ͳͳ>;g;ͳͳ!|!v :\=͝_O͑ͩ^#V">*^#V"}!!>2*"*#"^{:[:B>,:=2:B=2>0:B>, !*!v oo}0/ qz/W{/_y1ҋxy#;;~#y|} 0O_> > > ~~#*o!7 DSKPRAM ver. 1.1 Copyright (c) 1984 Robert C. Kuhman hex DPB table for drive : SPT: H Sectors per track. BSH: H Block shift. BLM: H Block mask. EXM: H Extent mask. DSM: H Disk size-1. DRM: ~H Directory entries-1. ASV0: DSH Directory group allocation 0. ALV1: rtH Directory group allocation 1. CKS: : H Check size. OFF: per H Offset (number of reserve tracks). DPB address =Diskette needs no translation. Skew table decimal values. DPH address = >>> DSKPRAM.COM - H E L P <<< DSKPRAM displays DPB and skew tables for a floppy drive. Information provided can be used as input for ESET.COM, allowing the AMPRO's "E:" drive to read and write non-AMPRO diskette formats not included in MULTIDSK.COM. SYNTAX A0>DSKPRAM --> DPB and SKEW table for default drive A0>DSKPRAM d: --> Tables for selected drive A0>DSKPRAM ? or / --> Displays this message NOTES 1. DSKPRAM must be run in the alien system, not the AMPRO system. It will not provide useful data when used in the AMPRO on a non-AMPRO format diskette. 2. DSKPRAM does not work in some CP/M 2.2 systems. H Disk size-1. DRM: ~H Directory entries-1. ASV0: DSH Directory group allocation 0. ALV1: rtH Directory group allocation 1. CKS: : H Check size. OFF: per H Offset (number of reserve tracks). DPB address =Diskette needs no translation. TYPE21: Ctrl-S pauses, Ctrl-C Aborts, Ctrl-X skips to next file Listing file DSKPRAM.ASM ; DSKPRAM.ASM ; VER EQU 11 ; ; DSKPRAM intended use is to determine the the values of the DISK ; PARAMETER BLOCK and the SKEW TRANSLATION TABLE of a system alien ; to AMPRO MULTIDSK program. DSKPRAM is to be run on the system ; where the disk values are not known. After the host system ; parameters are are determined ESET may be used to set up the E: ; drive on the AMPRO system. ; ; Putting an NON-AMPRO disk into the AMPRO system and running DSKPRAM ; on that disk will not return useful disk parmeters. DSKPRAM must ; be run on the 5.25" CP/M system that you want to find the prameters ; for. ; ; DSKPRAM displays the disk parameter block and the skew translation ; table maintained in the target cp/m 2.2 bios in any selected system ; ; DSKPRAM.ASM is the combination of DPB.ASM and SKEW.ASM by ; Robert C. Kuhman, Sysop of the Cro's Nest RCP/M. Both are ; COPYRIGHT (c) 1984, by Robert C. Kuhman and released to the public ; domain for non-profit purposes only, not to be sold, nor bundled ; with other software for sale. Synthesis of the two programs into ; this version was performed by Fred Willink. ; ;**************************************************************** ; ; Revisions: ; Ver 1.0 as of 16 Nov 1984, Fred Willink ; Ver 1.1 4 Dec 1984, Rick Lehrbaum ; ;**************************************************************** ; BOOT EQU 0 ; BDOS EQU 05H ; FCB1 EQU 5CH ; ; ; other equates ; ACROSS EQU 8 ; ; ampro bios disk id save area ; ; ascii equates ; BELL EQU 07H ; bell TAB EQU 09H ; horz tab LF EQU 0AH ; line feed CR EQU 0DH ; carriage return SPC EQU 20H ; space ; ORG 100H ; START: LXI H,0 DAD SP ; hl=ccp stack pointer LXI SP,STACK ; set up local stack PUSH H ; save the ccp pointer for return LXI H,SIGNON CALL COSTR TEST: LDA FCB1+1 CPI '/' JZ HELP ; help CPI '?' JZ HELP CALL DPB CALL SKEW JMP EXIT ; HELP: LXI H,HLPMSG ; point to help message CALL COSTR ; display help ; ; exit no warm boot ; EXIT: POP H ; recover ccp"s stack ptr SPHL RET ; DPB: LDA FCB1 ; drive code given ? DCR A ; convert a=1 to 0 JP DPB2 CALL FCN25 DPB2: MOV E,A ; save for select ADI 'A' ; make drive code printable STA DRIVE CALL FCN14 CALL FCN31 PUSH H ; save it for dump ; LXI D,SPT ; make dph values printable CALL CVT2 LXI D,BSH CALL CVT1 LXI D,BLM CALL CVT1 LXI D,EXM CALL CVT1 LXI D,DSM CALL CVT2 LXI D,DRM CALL CVT2 LXI D,AL0 CALL CVT1 LXI D,AL1 CALL CVT1 LXI D,CKS CALL CVT2 LXI D,OFF CALL CVT2 ; LXI H,DSPLAY ; dph table CALL COSTR ; print it all POP H CALL HEXADR ; print bios address of dph LXI H,HEX CALL COSTR CALL COCRLF RET ; SKEW: LDA FCB1 ; see if drive was specified DCR A ; test ff=no JP REC2 ; yes, select drive CALL FCN25 ; no, get current drive REC2: MOV E,A MOV C,A CALL FCN14 ; select drive  CALL FCN31 ; get address of dph MOV E,M INX H MOV D,M XCHG SHLD NRECS ; save dph address for records per track MVI A,24 ; offset for seldsk: CALL BIOS ; hl=dph, set de=xlate table MOV E,M INX H MOV D,M ; de=dph XCHG ; dph in hl SHLD DPHADR ; and save MOV A,L ; get low byte ORA H ; or with high JNZ SHOWD ; if zero no translate done LXI H,NXLATE ; no translate message CALL COSTR RET ; SHOWD: LXI H,TBLMSG ; for skew table CALL COSTR ; display MVI A,20 ; number of entries STA POSIT ; set counter LHLD DPHADR ; get dph address SHLD LAST ; save it JMP ENTRY ; MORE: LHLD LAST ; get last position INX H ; update and SHLD LAST ; save it ENTRY: MOV E,M ; get byte MVI D,0 ; zero d MOV A,E ; value in a CPI 27 ; largest value JNC ZERFIL ; CPI 1 ; start of table JZ WHERE ; what position CPI 0 ; JNZ NOPE ; none of those WHERE: LDA POSIT ; see where in table CPI 20 ; first position of 20 JNZ ZERFIL ; see if need zeros NOPE: XCHG ; hl has value CALL DECOUT ; print decimal value LDA POSIT ; get count CPI 0 ; see if done JZ DONE ; yes, return MVI A,',' ; insert comma  CALL COUT CALL COSPAC ; insert space LDA POSIT ; see if done CPI 0 JZ ZERFIL ; fill remainder NOTDON: DCR A ; count down STA POSIT ; and save JMP MORE ; ZERFIL: LDA POSIT ; how many zero's CPI 0 JZ DONE ; done if zero DCR A ; count down STA POSIT ; and save MVI A,'0' CALL COUT ; print '0' LDA POSIT CPI 0 ; see if through now JZ DONE MVI A,',' CALL COUT ; print ',' CALL COSPAC ; print space JMP ZERFIL ; DONE: CALL COCRLF LXI H,DPH ; trailer message for address CALL COSTR ; display LHLD DPHADR CALL HEXADR ; print address of offset table LXI H,HEX CALL COSTR CALL COCRLF RET ; convert binary in hl to ascii decimal ; DECOUT: MVI B,0 ; leading zero fill LXI D,-100 CALL SUBTR ; hundreds LXI D,-10 CALL SUBTR ; tens MOV A,L ADI '0' ; ascii bias JMP COUT ; print and return to caller ; ; subtract powers of 10 ; SUBTR: MVI C,'0'-1 ; ascii count SUBT2: INR C DAD D ; add neg number JC SUBT2 ; ; one to many add one back ; MOV A,D ; complement CMA ; de MOV D,A MOV A,E CMA MOV E,A INX D DAD D MOV A,C ; get count ; ; check for zero ; CPI '1' ; less than 1? JNC NZERO ; no MOV  A,B ; check 0 flag ORA A MOV A,C ; restore RZ ; skip leading zero JMP COUT ; print character ; ; set flag for non-zero character ; NZERO: MVI B,0FFH ; set to zero JMP COUT ; print RET ; ; select disk, 'e' has drive number ; FCN14: PUSH B PUSH D PUSH H MVI C,14 CALL BDOS POP H POP D POP B RET ; ; get current disk number, returns current disk in 'a' ; FCN25: PUSH B PUSH D PUSH H MVI C,25 ; no drive given, get current disk CALL BDOS POP H POP D POP B RET ; ; get disk parameters, returns 'hl'=dpb address ; FCN31: PUSH B PUSH D MVI C,31 ; hl = dpb for current disk CALL BDOS POP  D POP B RET ; CVT2: PUSH H ; display 16 bit integer INX H CALL CVT1 XTHL CALL CVT1 POP H RET ; CVT1: MOV A,M ; display byte at 'hl' INX H CVT1A: CALL HEXBYT ; a,c=ascii display STAX D INX D MOV A,C STAX D INX D RET ; ; Subroutine to print hl as an address in hex ; HEXADR: MOV A,H CALL COHEX MOV A,L CALL COHEX RET ; ; print the hex byte in 'a' ; COHEX: PUSH PSW ; save byte CALL HEXLFT ; get left half CALL COUT ; and print POP PSW ; restore byte CALL HEXRHT ; right half and CALL COUT ; print RET ; HEXLFT: RAR ; make left nibble RAR RAR RAR ; HEXRHT: ANI 0FH ; make right nibble CPI 0AH JC HEXLR ADI 'A'-3AH ; HEXLR: ADI '0' RET ; ; suboutrine to return the hex value of 'a', ; least significant half in 'c', most significant in 'a'. ; used when ascii-hex is to be stored. ; HEXBYT: PUSH PSW ; save CALL HEXRHT ; get right nibble MOV C,A ; save in c POP PSW ; restore and get CALL HEXLFT ; left nibble RET ; ; subroutine to write 'a#`: R,KkW +VHhj$hT*'H PUSH B PUSH D PUSH H ANI 7FH ; strip bit 7 MOV E,A MVI C,2 ; cp/m fcn 2 CALL BDOS ; POP H POP D POP B RET ; ; print cr,lf to the console ; COCRLF: PUSH PSW MVI A,CR ; carriage return CALL COUT ; print it MVI A,LF ; line feed CALL COUT ; and print it POP A RET ; ; subroutine to write a space to the console ; COSPAC: PUSH PSW MVI A,SPC ; space CALL COUT ; and print it POP PSW RET ; ; subroutine to write bytes addressed by hl, terminated by last byte with ; 80 bit set. ; COSTR MOV A,M ; get byte CALL COUT ; print MOV A,M ; again and test RLC ; for bit 7 set RC ; yes, return INX H ; next byte JMP COSTR ; and continue ; ; bios service, offset in 'a' ; BIOS: PUSH B PUSH D LHLD BOOT+1 ; get warm boot address ADD L ; add offset to wboot MOV L,A ; to address of service PUSH H ; save it LXI H,BIORET ; return address XTHL PCHL ; BIORET: POP D POP B RET ; ; message strings ; SIGNON: DB CR,LF DB CR,LF,'DSKPRAM ver. ',VER/10+'0','.',VER MOD 10+'0' DB CR,LF,'Copyright (c) 1984 Robert C. Kuhman' DB CR,LF,LF+80H ; HEX: DB ' hex',cr,lf+80h ; DSPLAY: DB 'DPB table for drive ' DRIVE: DS 1 DB ':',CR,LF,LF DB 'SPT: ' SPT: DS 4 DB 'H',TAB,'Sectors per track.',cr,lf DB 'BSH: ' BSH: DS 2 DB 'H',TAB,'Block shift.',cr,lf DB 'BLM: ' BLM: DS 2 DB 'H',TAB,'Block mask.',cr,lf DB 'EXM: ' EXM: DS 2 DB 'H',TAB,'Extent mask.',cr,lf DB 'DSM: ' DSM: DS 4 DB 'H',TAB,'Disk size-1.',cr,lf DB 'DRM: ' DRM: DS 4 DB 'H',TAB,'Directory entries-1.',cr,lf DB 'ASV0: ' AL0: DS 2 DB 'H',TAB,'Directory group allocation 0.',cr,lf DB 'ALV1: ' AL1: DS 2 DB 'H',TAB,'Directory group allocation 1.',cr,lf DB 'CKS: ' CKS: DS 4 DB 'H',TAB,'Check size.',cr,lf DB 'OFF: ' OFF: DS 4 DB 'H',TAB,'Offset (number of reserve tracks).',cr,lf ; DMPMSG: DB 'DPB address =',SPC+80H ; NXLATE: DB BELL,'Diskette needs no translation.',cr,lf+80h ; TBLMSG: DB 'Skew table decimal values.',cr,lf+80h ; DPH: DB 'DPH address =',SPC+80H ; User help ; HLPMSG: DB CR,LF,' >>> DSKPRAM.COM - H E L P <<<' DB CR,LF DB CR,LF,'DSKPRAM displays DPB and skew tables for a floppy drive.' DB CR,LF,'Information provided can be used as input for ESET.COM,' DB CR,LF,'allowing the AMPRO''s "E:" drive to read and write non-AMPRO' DB CR,LF,'diskette formats not included in MULTIDSK.COM.' DB CR,LF DB CR,LF,' SYNTAX' DB CR,LF DB CR,LF,'A0>DSKPRAM --> DPB and SKEW table for default drive' DB CR,LF,'A0>DSKPRAM d: --> Tables for selected drive' DB CR,LF,'A0>DSKPRAM ? or / --> Displays this message' DB CR,LF DB CR,LF,' NOTES' DB CR,LF DB CR,LF,'1. DSKPRAM must be run in the alien system, not the' DB CR,LF,' AMPRO system. It will not provide useful data when' DB CR,LF,' used in the AMPRO on a non-AMPRO format diskette.' DB CR,LF DB CR,LF,'2. DSKPRAM does not work in some CP/M 2.2 systems.' DB CR,LF+80H ; NRECS: DS 2 DPHADR: DS 2 POSIT: DS 1 LAST: DS 2 ; DS 30 STACK: EQU $ ; END C4> ESET.COM,' DB CR,LF,'allowing the AMPRO''s "E:" drive to read and write non-AMPRO' DB CR,LF,'diskette formats not i8 ;b͸{2B2B@Bw{ÖüH!K]jU 2͵ ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2hZZk:h|/g}/o#|/g}/o#:h<2hqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2hZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! P!9~#A!9"w**w"j!z*"d!"f!Y"H>2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`"d!"f!!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5.ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p!C 4b!m9 Do you wish to PROBE a drive's parameters (Y/N) ? Y Which drive do you wish to PROBE (A - P) ? AA For drive %c:, the disk parameter block address is %05x hex The disk parameter block as it appears in memory (in hex): %04x %02x Parameter (SYM) Hex Decimal [ Binary ] Sectors per Track (SPT) = %04x %4d Block Shift Factor (BSH) = %02x %4d Allocation Block Mask (BLM) = %02x %4d Extent Mask (EXM) = %02x %4d Disk Size Maximum (DSM) = %04x %4d Dire::ͤ $$͔A!k ͽ;! ͽ;! ͽ;! ͽ;!G ͽ;! ͽ;! ͽ;! ͽ;!6 ͽ;!v ͽ;! ͽ;! ͽ;!" ͽ;!b ͽ;! ͽ;! ͽ;! ͽ;!> ͽ;!{ ͽ; PROBE Version 1.01 2 Sep 1984 PROBE will tell you what version of CP/M or MP/M you are running, and display the I/O byte if appropriate. It then displays the addresses of the CCP, BDOS, and BIOS. The BIOS jump table will next be displayed including the extended BIOS calls for CP/M+, and XIOS calls if running MP/M. It then displays the disk parameter blocks (DPB's), disk parameter headers (DPH's), group size, total disk size, number of directory entries, space required for directory entries, total usable space on the disk, and the disk space allocation vectors for any selected drive (A: through P:). PROBE was written in 'c' to help decode the disk formats of a number of different machines to aid in transportability. It was inspired by BDLOC, TELL, ALLOC, and a number of other public domain CP/M utilities. Paul Sittler - My Word!! RCP/M (409) 845-0510 (late nights)  Veterinary Public Health RCP/M (409) 845-0509 (24 hours) Dept of Veterinary Public Health, Texas A&M University College Station, Texas 77840-4468 !9DM!!7 s#r!!9 s#r!!; s#r!!= s#r!!? s#r!!A s#r!!C s#r!!E s#r!!G s#r! !I s#r!!K s#r!!M s#r!!O s#r!!Q s#r!!S s#r!"!U s#r*~#fo|w!&ͽ;!!͗A`is! `in& ;`in&!Mͽ;! `in&!vͽ;`in&|g}o! s`in&0|g}o! s`in& |g}o!! s`in&|g}o!, s! ! n& ;! ! n& ;!" !! n& ;!- !, n& ;! n&)!7 ~#fo! ! n&!ͽ;! n&)!? ~#fo! ! n&!ͽ;!! n&)!G ~#fo!) !! n&! ͽ;!, n&)!O ~#fo!4 !, n&!Gͽ;!ͽ;! `in&!ͽ;!ͽ;!ͽ;!4 !) ! ! !"ͽ;!Gͽ;!lͽ;!ͽ;!ͽ;!, n&)!O ~#fo!! n&)!G ~#fo! n&)!? ~#fo! n&)!7 ~#fo! !ͽ;!W9TTYCRTLPTUL1TTYPTPUP1UP2TTYPTRUR1UR2TTYCRTBATUC1 MP/M does not implement the I/O BYTE I/O Byte value is currently %d decimal, %x hexadecimal or [%s] binary LST: is currently %02x hex or [%s ] binary, or %s: PUN: is currently %02x hex or [ %s ] binary, or %s: RDR: is currently %02x hex or [ %s ] binary, or %s: CON: is currently %02x hex or [ %s] binary, or %s: ----------- Making the IOBYTE %02x hex or [%s] binary where, for the following devices: Device LST: PUN: RDR: CON: Value %s %s %s %s 00 assigns TTY: TTY: TTY: TTY: 01 assigns CRT: PTP: PTR: CRT: 10 assigns LPT: UP1: UR1: BAT: 11 assigns UL1: UP2: UR2: UC1: [%s] assigns %3s: %3s: %3s: %3s: !9DM!ͽ;!;ͽ;ͨA;!B s!B n} <!B 6YR!B n}YR!B n}N!B n}N`!?ͽ;ͨA;!B s!B n} Š!B 6!B n&|ڪ!B n&|ڵ!oͽ;h!B n&!B sh!!B n&! A!H s#r!H ~#fo| !B n&!͗A!!͗AA!? s!!͗A!F s#r!F ~#fo!@ s#r!C 6!C n&|҉!C n&! !@ ~#fo!C n&ns!C 4M!@ ^#Vr+sn!@ ^#Vr+sn&!J s#r!@ ^#Vr+sn!L s!@ ^#Vr+sn!M s!@ ^#Vr+sn!N s!@ ^#Vr+sn!@ ^#Vr+sn&!O s#r!@ ^#Vr+sn!@ ^#Vr+sn&!Q s#r!@ ^#Vr+sn!S s!@ ^#Vr+sn!T s!@ ^#Vr+sn!@ ^#Vr+sn&!U s#r!@ ^#Vr+sn!@ ^#Vr+sn&!W s#r`i!S n& ;! !T n& ;!F ~#fo!? n&!sͽ;!ͽ;!F ~#fo!ͽ;!C 6!C n&|q!C n&! n&!ͽ;!C 4?!ͽ;!J ~#fo!J ~#fo!9ͽ;!L n&!L n&!fͽ;!M n&!M n&!ͽ;!N n&!N n&!ͽ;!O ~#fo!O ~#fo!ͽ;!Q ~#fo!Q ~#fo! ͽ;`i!S n&!S n&!Mͽ;! !T n&!T n&!ͽ;!U ~#fo!U ~#fo!ͽ;!W ~#fo!W ~#fo!ͽ;! ͽ;!= ͽ;!W ~#fo!U ~#fo!T n&!S n&!Q ~#fo!O ~#fo!N n&!M n&!L n&!J ~#fo!q ͽ;!9!H ~#fo!? n&! ͽ;!H ~#fo!@ s#r!C 6!C n&|q!C n&!. !@ ~#fo!C n&ns!C 45! ͽ;!H ~#fo!,!ͽ;!C 6!C n&|!C n&!. n&!4!ͽ;!C 4Ñ!H ~#fo!@ s#r!@ ^#Vr+sn!@ ^#Vr+sn&!Y s#r!@ ~#fos#r!@ ^#Vr+sn!@ ^#Vr+sn&![ s#r!@ ^#Vr+sn!@ ^#Vr+sn&!] s#r!@ ^#Vr+sn!@ ^#Vr+sn&!_ s#r!@ ^#Vr+sn!@ ^#Vr+sn&!a s#r!:!ͽ;!Y ~#fo!l!ͽ;![ ~#fo!!ͽ;!] ~#fo!!ͽ;!_ ~#fo!"ͽ;!a ~#fo!4"ͽ;!L n&+++!c s#r!O ~#fo#!c ~#fo?!e s#r!Q ~#fo#!g s#r!Q ~#fo#!i s#r!e ~#fo!i ~#fo!k s#r!c ~#fo!f"ͽ;!e ~#fo!"ͽ;!g ~#fo!"ͽ;!i ~#fo!#ͽ;!k ~#fo!H#ͽ;!Y ~#fo!@ s#r!a ~#fo!@ s#r!O ~#fo#!D s#r!C 6!C n!D ~#fo!C n& |›!c ~#fo!#ͽ;!#ͽ;!#ͽ;!C n&|!C n&)))!$ͽ;! !@ ~#fo!C n&n& ;! !$ͽ;!C 4O !m9 Do you wish to PROBE a drive's parameters (Y/N) ? Y Which drive do you wish to PROBE (A - P) ? AA For drive %c:, the disk parameter block address is %05x hex The disk parameter block as it appears in memory (in hex): %04x %02x Parameter (SYM) Hex Decimal [ Binary ] Sectors per Track (SPT) = %04x %4d Block Shift Factor (BSH) = %02x %4d Allocation Block Mask (BLM) = %02x %4d Extent Mask (EXM) = %02x %4d Disk Size Maximum (DSM) = %04x %4d Directory Maximum -1 (DRM) = %04x %4d Allocation Mask 0 (AL0) = %02x %4d [%s] Allocation Mask 1 (AL1) = %02x %4d [%s] Directory Check Size (CKS) = %04x %4d System Tracks Offset (OFF) = %04x %4d The whole disk parameter block looks like: SPT: BSH: BLM: EXM: DSM: DRM: AL0: AL1: CKS: OFF: %04x %02x %02x %02x %04x %04x %02x %02x %04x %04x For drive %c:, the disk parameter header address is %05x hex The disk parameter header as it appears in memory (in hex): %04x %02x Address Vector Description (SYM) Hex Log to physical sector trans (XLT) = %04x Directory buffer scratchpad (DIRBUF) = %04x DPB address in DPH (DPB) = %04x Check changed disk scratchpad (CSV) = %04x Disk space allocation vector (ALV) = %04x The data allocation block or group size is %5d Kbytes The total disk size is . . . . . . . . . . %5d Kbytes The # of directory entries blocked for is %5d Entries which requires . . . . . . . . . . . . . . %5d Kbytes Leaving a useful disk capacity of. . . . . %5d Kbytes %dK Disk Allocation Block Number (Hex) 0123 4567 89AB CDEF 0123 4567 89AB CDEF ----- ---- ---- ---- ---- ---- ---- ---- ---- %04x: %s !9DM!+0ͽ;!h0ͽ;!0ͽ;`i6#6`i^#Vr+sn`i^#Vr+sn&! s#r! ~#fo+++! s#r`i6#6`i^#Vr+sn`i^#Vr+sn&! s#r! ~#fo! s#r! ~#fo#`is#r`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&! s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!" s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!$ s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!& s#r*~#fo|+`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!( s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!* s#r*~#fo|ҝ(* n}+`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!, s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn& !. s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!0 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!2 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!4 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!6 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!8 s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!: s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!< s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!> s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!@ s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!B s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!D s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!F s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!H s#r`i^#Vr+s`i^#Vr+sn`i^#Vr+sn&!J s#r! ~#fo!0ͽ;! ~#fo! 1ͽ;! ~#fo!<1ͽ;! ~#fo!n1ͽ;! ~#fo!1ͽ;! ~#fo!1ͽ;! ~#fo!2ͽ;! ~#fo!62ͽ;! ~#fo!h2ͽ;! ~#fo!2ͽ;! ~#fo!2ͽ;! ~#fo!2ͽ;! ~#fo!03ͽ;! ~#fo!b3ͽ;! ~#fo!3ͽ;! ~#fo!3ͽ;!" ~#fo!3ͽ;!$ ~#fo!*4ͽ;!& ~#fo!\4ͽ;*~#fo|"0!( ~#fo!4ͽ;!* ~#fo!4ͽ;* n}.!4ͽ;!'5ͽ;!\5ͽ;!5ͽ;!, ~#fo!5ͽ;!. ~#fo!5ͽ;!0 ~#fo!6ͽ;!2 ~#fo!K6ͽ;!4 ~#fo!6ͽ;!6 ~#fo!6ͽ;!8 ~#fo!6ͽ;!: ~#fo!7ͽ;!< ~#fo!O7ͽ;!> ~#fo!7ͽ;!@ ~#fo!7ͽ;!B ~#fo!7ͽ;!D ~#fo!8ͽ;!F ~#fo!S8ͽ;!H ~#fo!8ͽ;!J ~#fo!8ͽ;*~#fo|"0!8ͽ;!, ~#fo!9ͽ;!. ~#fo!O9ͽ;!0 ~#fo!9ͽ;!2 ~#fo!9ͽ;!4 ~#fo!9ͽ;!6 ~#fo!V/Ê/ Maximum console number check routine at: %04xH.ͽ;!8 ~#fo!// System initialization cold boot routine at: %04xH.ͽ;!: ~#fo!/0 Optional idle procedure routine at: %04xH.ͽ;!L9 This portion will tell you where your CCP starts, what your BDOS entry address is, and where your CBIOS jump table begins. The CBIOS jump table is also displayed. Your CCP beginning address is:  %04xH. Your BDOS beginning address is: %04xH. Your BDOS entry address is: %04xH. Your CBIOS jump table begins at: %04xH. Cold start routine address is: %04xH. Warm start routine address is: %04xH. Console Status routine address is: %04xH. Console Input routine (waits for char.): %04xH. Console Output routine address is: %04xH. List device output routine address is: %04xH. Punch device output routine address is: %04xH. Reader device input routine address is: %04xH. Home disk routine address is: %04xH. Select disk routine address is: %04xH. The set track disk routine address is: %04xH. The set sector disk routine address is: %04xH. The set DMA disk routine address is: %04xH. The read disk routine address is: %04xH. The write disk routine address is: %04xH. List device status routine address is: %04xH. Sector translate disk routine address is: %04xH. CP/M+ (3.x) extended bios calls follow. Note that some of these may NOT have been implemented by your system integrator. Check carefully with your manual before trying to use them. Console output status check routine at: %04xH. Aux device input status check routine at: %04xH. Aux device output status check routine at: %04xH. Character i/o table addr check routine at: %04xH. Character i/o devices init routine at: %04xH. Get disk drive table address routine at: %04xH. Set # of multi-R/W sectors routine at: %04xH. Flush host buffer routine address at: %04xH. Memory-to-memory block move routine at: %04xH. Get or set time clock routine at: %04xH. Set memory bank -- absolute routine at: %04xH. Set mem bank for next DMA move routine at: %04xH. Set mem bank #s for next move routine at: %04xH. Bios call reserved for system integr at: %04xH. Bios call 1 reserved for future use %04xH. Bios call 2 reserved for future use %04xH. MP/M II XIOS call jump addresses follow. Select memory segment routine at: %04xH. Device Polling routine at: %04xH. Start clock routine at: %04xH. Stop clock routine at: %04xH. Exit critical region routine at: %04xH.!! ͗A*s#r*~#fo|M:!:P:!:!:*## <*~#fo|‚:* 6* 6ü:*~#fo|g}o* s*~#fo|g}o* sMP/MCP/M%s* n&* n&*##!:ͽ; This is %s %d.%d. !9DM`iw#w`i~#fo|Ҧ;`i~#fo++++|N;! ~#fo`i^#Vr+s6 ! n&|g}o|{;! ~#fo`i~#fo61&Î;! ~#fo`i~#fo60! n&)s`i^#Vr+s;! ~#fo 6!9!9DM!B! /ʦ?ì?͐~#fo|Ҥ=! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ü=! 6ü=! 6! ~#fo! n&! ^#Vr+s~#fo! f@ѯgs#rå>! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+så>! n}@>! 6#6! ^#Vr+s~#fo! s#r͐n}ʥ>͐|ʥ>! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s[>͐6! ! s#r! n}?! ^#Vr+s!|?͐͐! n}>!0>! !?!9~#fo#|?!@>͐n}W?͐͐! ^#Vr+sn&!E?!9~#fo#|T?!@?! n}ʣ?! ^#Vr+s!|ڣ?͐͐! !?!9~#fo#| ?!@a??!@͐͐`in&!?!9~#fo#|?!@@͐͐`in&!?!9~#fo#|@!@^ _ &B the addresses of the CCP, BDOS, and BIOS. The BIOS jump table will next be d!91:]/=?=FCCopyright (c)1984 Robert C. Kuhman!͢>2:\=W_OA2!*͢^#V">^#V"!t͢{ !͢2>-g*+}ʿ"ç!͢>2*"*#"^{:1:>,~͚:=2:=2>0~:>,~͚EE}0~/ Gz/W{/_y1axy~~͚:=2>2͍_> ~> ~> ~~~~#â>:~͚~͚#º͚͚~ >.~#|}~~ 0O*o!'SKEW.COM v1.02 as of 10/30/84 A0>SKEW // Display Help. Address:H (DPH pointer to the Skew table.) (Record Skew Pattern for disk :) Diskette needs no translation. (Skew Table, decimal values.) SKEW.COM "H E L P" Syntax: A0>SKEW - default command A0>SKEW d: - specify any drive d: A0>SKEW // - request help Discussion: SKEW.COM is intended to be used with any CP/M v2.2 computer. It is designed to display the "Record Skew Pattern" for the selected disk drive. It also produces a decimal skew table, and the "Disk Para- meter Header (DPH)" address pointer is given as a hexadecimal two byte number. This program can be used in conjunction with programs like "ESET.COM" (AMPRO computers & ZCPR3) as a means to determine the skew table for "setting" of the "E:" drive. It will provide an accurate table for 5" & 8" drives.  0O*o!'SKEW.COM v1.02 as of 10/30/84 A0>SKEW // Display Help. Address:H (DPH pointer to the Skew table.) (Record Skew Pattern for disk :) Diskette needs no translation. (Skew Table, decimal values.) SKEW.COM "H E L P" Syntax: A0>SKEW - default command A0>SKEW d: - specify any drive d: A0>SKEW // - request help Discussion: SKEW.COM is intended to be used with any CP/M v2.2 computer. It is designed to display the "Record S OSBORNE FORMAT PROGRAMS ----------------------------------------- STUART ISTO COMPUTER PROJECTS LTD 1639 WOODLAND DRIVE VANCOUVER, B. C. V5L 329 CANADA ----------------------------------------- THERE ARE FIVE PROGRAMS HERE WHICH FORMAT DISKS IN ALL OF THE FORMATS THE OSBORNE-1 CAN READ AND WRITE. THESE PROGRAMS WILL ONLY WORK ON DOUBLE- DENSITY MACHINES. ALSO ON THIS DISK IS A VERSION OF OSTOKPRO WHICH WORKS FOR RELEASE 1.44 TO ENABLE THE OSBORNE TO READ AND WRITE KAYPRO DISKS. THIS IS A SLIGHT MODIFICATION OF THE PROGRAM SUBMITTED BY JOHN S ROBINSON, WHICH IS WRITTEN TO WORK WITH BIOS 1.41. ANYONE WHO WOULD LIKE TO DEVELOP PROGRAMS FOR READING, WRITING, OR FORMATTING OTHER DISK FORMATS PLEASE WRITE TO ME AT THE ABOVE ADDRESS.   S˯F.S{E+V͡ }˯  - G2? y(  )͡  E Z˯ -2?!!@P6N#z  6#z 6#z 6#z 26N#z  6#z 6#z 6#z q#6#z ~#w#6#z 6#z 6N#z  6#z 6#z 6#z 6#z 6#z O6N#z 6N#z @R"!O ~0:0GyOy0d8d{0(0 8:_:g.6>2>2~fy2i@CK{ IBM CP/M-86 Single-Sided Diskette Format Program ------------------------------------------------ All activity will take place on drive B OPTIONS ------- Exit--------> exit this program and return to CP/M Format------> format the disk in drive B it will erase all information on it! Single------> format 1 track on the disk in drive B Verify------> verify the disk in drive B is readable  this is a non destructive test (E)xit (F)ormat (S)ingle (V)erify Please enter 'E' or 'F' or 'S' or 'V' ==>$ Insert disk to format into drive B. Enter to format, any other key to abort $ Format a single track of the disk Enter track number ( key to abort) xx$ DONE $ Formatting track:$ Enter to format, any other key to abort $ Sector $ $ w#s#r@>2.     -21 D:1O2!T"/22-T:2<8:1<(:.  ˯ ͼ*/"2 K1>2.  D :2ͼO  D $Track $Drive A $Drive B $ {BAD}$ $ Format OK $ Please type any key to continue.$Verifying disk B to be readable Only one error per track is displayed$@}$ $ Format OK $ Please type any key to continue.$Verifying disk B to be reaormation on it! Single------> format 1 track on the disk in drive B Verify------> verify the disk in drive B is readable  R˯F.S{E+V͢ ~˯  , H1> y(  *͢  F [˯ ,1>!!@ P6N#z  6#z 6#z 6#z 26N#z  6#z 6#z 6#z q#6#z ~#w#6#z 6#z 6N#z  6#z 6#z 6#z 6#z 6#z @6N#z r6N#z @R" !O ~0:0GyOy0d8d{0(0 8:_:g.6>2>2~fy2i@CK{ DEC VT180 Double density diskette format program ------------------------------------------------- All activity will take place on drive B OPTIONS ------- Exit--------> exit this program and return to CP/M Format------> format the disk in drive B it will erase all information on it! Single------> format 1 track on the disk in drive B Verify------> verify the disk in drive B is readable  this is a non destructive test (E)xit (F)ormat (S)ingle (V)erify Please enter 'E' or 'F' or 'S' or 'V' ==>$ Insert disk to format into drive B. Enter to format, any other key to abort $ Format a single track of the disk Enter track number ( key to abort) xx$ DONE $ Formatting track:$ Enter to format, any other key to abort $ Sector $ $ w#s#r#@>2/     ,22 E:2O1!T"023.U:3< 8:2<(:/  ˯ ͻ*0"2 K2>2/  E :3ͻO  E $Track $Drive A $Drive B $ {BAD}$ $ Format OK $ Please type any key to continue.$Verifying disk B to be readable Only one error per track is displayed$@}$ $ Format OK $ Please type any key to continue.$Verifying disk B to be reformation on it! Single------> format 1 track on the disk in drive B Verify------> verify the disk in drive B is readable  S˯F.S{E+Vͣ ˯  - I2? y(  +ͣ  G \˯ -2?!!@ P6N#z  6#z 6#z 6#z 6N#z 6#z 6#z 6#z q#6#z ~#w#6#z 6#z 6N#z  6#z 6#z 6#z 6#z 6#z 6N#z 6N#z @R" !O ~0:0GyOy0d8d{0(0 8:_:g.6>2>2~fy2i@CK{ KAYPRO II Double density diskette format program ------------------------------------------------- All activity will take place on drive B OPTIONS ------- Exit--------> exit this program and return to CP/M Format------> format the disk in drive B it will erase all information on it! Single------> format 1 track on the disk in drive B Verify------> verify the disk in drive B is readable  this is a non destructive test (E)xit (F)ormat (S)ingle (V)erify Please enter 'E' or 'F' or 'S' or 'V' ==>$ Insert disk to format into drive B. Enter to format, any other key to abort $ Format a single track of the disk Enter track number ( key to abort) xx$ DONE $ Formatting track:$ Enter to format, any other key to abort $ Sector $ $ w#s#r#@>20     -23 F:3O2!T"124/V:4< 8:3<(:0  ˯ ͼ*1"2 K3>20  F :4ͼO  F $Track $Drive A $Drive B $ {BAD}$ $ Format OK $ Please type any key to continue.$Verifying disk B to be readable Only one error per track is displayed$@}$ $ Format OK $ Please type any key to continue.$Verifying disk B to be rnformation on it! Single------> format 1 track on the disk in drive B Verify------> verify the disk in drive B is readableFORMAT-DISK (c) 1983 ISTO1,-&>!F!F͚ F !F!Fͣ &2aA2!F!8FQͻ>S~!F!|F !F͘!(!F[(_[(_ AB>>D >22]͢@[(_SD>S> 2>2 x2w2v:, =x=!b x =!ipGé:wg.,:??Ga)"xɯ*TR[xRux2z:zG>( ʓ҉y2{!1>2!|F22]͢@>*>E2$:<(±:@CC :wGKx* >ɯ>'2:2>&2OO>%2OO:=4>:2@*tKp>2:w=G*tKp!4:~ʒwvw@B"@!@[r:wG[p:w:g.6ͺ0ͺ'ͺ*ͺ>2 9ͺ: =ͺ~ͺrͺlͺx # _ >X~X#[(_u02 9: 0 1 2 3 0123456789012345678901234567890123456789$= S OSBORNE FORMAT PROGRAM F Format disks Exit program Press F to format or to exit S Single density D Double density Press S or D =3$ Select disk to format (A or B)=4$ or press for main menu =&$ Place disk to be formatted in drive ='$ & press when ready Completed successfully FORMAT ERROR NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!r.9#[ s%  THIS PROG VALID ONLY FOR 1.4 CBIOS & A 59K SYSTEM$ KAYPRO DOUBLE DENSITY$!"*!!"!B" !)"!R" !g !q!w!"*>2)!{!">2!%   DISKS ARE NOW VALID$^#V#s#r(?8Osborne Computer System 59k CP/M vers 2.2 CBIOS 1.4 {Y͈‚>. .! :(!^#V!R!(=borne Computer System 59k CP/M vers 2.2 CBIOS 1.4 {Y͈‚  TITLE 'KAYPRO II DOUBLE DENSITY DISK ENABLE' PAGE 54 * * John S Robison * MAY 17, 1983 * * THIS PROGRAM WILL DYNAMICALLY MODIFY THE OSBORNE I * WITH 1.4 CBIOS AND 1.43 ROM TO PERMIT READ AND * WRITE OF KAYPRO II DOUBLE DENSITY DISKETTES. * * KAYPRO II SINGLE SIDED DOUBLE DENSITY DISKETTES * ARE FORMATTED AS FOLLOWS: * * 40 TRACKS * 10 BLOCKS PER TRACK * 512 BYTES PER BLOCK * BLOCKS NUMBERED FROM 0 THROUGH 9 * BLOCKS HARD INTERLACED AS FOLLOWS: * 0,8,3,6,1,9,4,7,2,5 * 1 SYSTEM TRACK * 64 ENTRY DIRECTORY * * EQUATES TO 1.4 CBIOS LOCATIONS * SIGNON EQU 0E561H ;LOCATION OF SIGN-ON MESSAGE DPH0DPB EQU 0E20AH ;DRIVE 0 DPB ADDRESS POINTER DPH0CSV EQU 0E20CH ;DRIVE 0 DPH CHECK SUM VECTOR ADDRESS DPH0ALV EQU 0E20EH ;DRIVE 0 DPH ALLOCATION VECTOR ADDRESS DPH1DPB EQU 0E21AH ;DRIVE 1 DPB ADDRESS POINTER DPH1CSV EQU 0E21CH ;DRIVE 1 DPH CHECK SUM VECTOR ADDRESS DPH1ALV EQU 0E21EH ;DRIVE 1 DPH ALLOCATION VECTOR ADDRESS XTAB6AD EQU 0E22AH ;ADDRESS FOR USER DEFINED XLATE TABLE USERDPB EQU 0E2EEH ;ADDRESS FOR USER DEFINED DPB NSEKTYP EQU 0E90CH ;NEW LOCATION FOR SEKTYP NHSTTYP EQU 0E90DH ;NEW LOCATION FOR HSTTYP NXLTKEY EQU 0E90EH ;NEW LOCATION FOR XLTKEY ALV0 EQU 0E910H ;NEW ALLOCATION VECTOR DRIVE 0 ALV1 EQU ALV0+25 ;NEW ALLOCATION VECTOR DRIVE 1 CSV0 EQU ALV1+25 ;NEW CHECK VECTOR DRIVE 0 CSV1 EQU CSV0+16 ;NEW CHECK VECTOR DRIVE 1 ACTSEC EQU 0EF14H ;ACTIVE SECTOR ACTDSK EQU 0EF17H ;ACTIVE DISK * * CP/M EQUATES * BDOS EQU 5 ;ENTRY TO BDOS WRSTR EQU 9 ;STRING TO CONSOLE FUNCTION RESET EQU 13 ;RESET ALL DRIVES * ORG 100H MACLIB Z80 ;Z80 MNEMONICS $*MACRO PAGE * * VALIDATE WE ARE USING 1.4 CBIOS * LXI H,SIGNON ;MESSAGE IN CBIOS LXI D,SIGNMSG ;MESSAGE IN THIS PROGRAM MVI B,SIGNL+1 ;LENGTH OF MESSAGE SIGNLOP LDAX D ;GET BYTE FROM PROGRAM CMP M ;DOES CBIOS MATCH? JNZ REJECT ;NO INX H ;YES INX D DJNZ SIGNLOP JMP ACCEPT ;CBIOS IS CORRECT ONE REJECT LXI D,REJMSG ;WRONG VERSION OF CBIOS MVI C,WRSTR ;STRING TO CONSOLE CALL BDOS ;INFORM OPERATOR RET ;BACK TO CCP REJMSG DB 0DH,0AH,'THIS PROGRAM IS VALID ONLY ' DB 0DH,0AH DB 'FOR THE 1.4 CBIOS AND A 59K SYSTEM$' ACCEPT LXI H,0 SHLD XTAB6AD ;NO TRANSLATE TABLE LXI H,DPB ;NEW DISK PARAMETER BLOCK LXI D,USERDPB ;USER DPB IN CBIOS LXI B,16 ;BLOCK IS 16 BYTES LONG LDIR ;LOAD USER DPB LXI H,ALV0 ;NEW ALV0 ADDRESS SHLD DPH0ALV ;PUT IN DPH LXI H,CSV0 ;NEW CSV0 ADDRESS SHLD DPH0CSV ;PUT IN DPH LXI H,ALV1 ;NEW ALV1 ADDRESS SHLD DPH1ALV ;PUT IN DPH LXI H,CSV1 ;NEW CSV1 ADDRESS SHLD DPH1CSV ;PUT IN DPH LXI D,NSEKTYP ;NEW ADDRESS OF SEKTYP LXI H,SEKTYP ;ADDRESS OF TABLE MVI B,SEKTYPN ;LENGTH OF TABLE CALL SPRAY ;TRANSFER VALUES LXI D,NHSTTYP ;NEW ADDRESS OF HSTTYP LXI H,HSTTYP ;ADDRESS OF TABLE MVI B,HSTTYPN ;LENGTH OF TABLE CALL SPRAY ;TRANSFER VALUES LXI D,NXLTKEY ;NEW ADDRESS OF XLTKEY LXI H,XLTKEY ;ADDRESS OF TABLE MVI B,XLTKEYN ;LENGTH OF TABLE CALL SPRAY ;TRANSFER VALUES PAGE * * PATCH TO INTERCEPT INCORRECT NUMBER OF BLOCKS * PER TRACK (6) AND SUBSTITUTE CORRECT NUMBER (10) * LXI H,PATCH1 ;EXECUTION ADDRESS FOR PATCH 1 SHLD CPATCH1+1 ;SET INTERCEPT IN CBIOS MVI A,(JMP) STA CPATCH1 LXI H,PAT1CODE ;CODE FOR PATCH 1 LXI D,PATCH1 ;DESTINATION FOR PATCH 1 LXI B,LPATCH1 ;LENGTH OF PATCH 1 LDIR ;MOVE PATCH 1 ; * PATCH TO NOT INCREMENT BLOCK NUMBER IF DRIVE * IN QUESTION IS THE KAYPRO DRIVE * LXI H,PATCH2 ;EXECUTION ADDRESS FOR PATCH 2 SHLD CPATCH2+1 ;SET INTERCEPT IN CBIOS MVI A,(JMP) STA CPATCH2 LXI H,PAT2CODE ;CODE FOR PATCH 2 LXI D,PATCH2 ;DESTINATION FOR PATCH 2 LXI B,LPATCH2 ;LENGTH OF PATCH 2 LDIR ;MOVE PATCH 2 MVI C,RESET CALL BDOS ;RESET DRIVES LXI D,COMPMSG MVI C,WRSTR CALL BDOS ;ACKNOWLEDGE SUCCESSFUL COMPLETION RET ;RETURN TO CCP COMPMSG DB 0DH,0AH,'Kaypro II Double Density ' DB 'Diskettes are now valid.$' PAGE * * SUBROUTINE TO PUT NEW VALUE AT ADDRESSES SECURED * FROM A TABLE * * DE = NEW VALUE * HL = ADDRESS OF TABLE * B = NUMBER OF ENTRIES IN TABLE * SPRAY PUSH D ;SAVE NEW VALUE SPRAY1 MOV E,M ;GET LOW BYTE OF ADDRESS INX H MOV D,M ;GET HIGH BYTE OF ADDRESS INX H XTHL ;HL = NEW VALUE, ADDR TABLE ON STACK XCHG ;HL = DESTINATION, DE = NEW VALUE MOV M,E ;LOW BYTE OF NEW VALUE TO MEMORY INX H MOV M,D ;HIGH BYTE OF NEW VALUE TO MEMORY XCHG ;HL = NEW VALUE XTHL ;HL = TABLE ADDRESS, NEW VALUE ON STACK DJNZ SPRAY1 ;PROCESS NEXT TABLE ENTRY POP D ;FIX STACK RET * * KAYPRO II DISK PARAMETER BLOCK (DPB) * DPB DB 8 ;OSBORNE CODE FOR DD 512 BYTE BLOCKS DW 40 ;40 128 BYTE RECORDS PER TRACK DB 3 ;1K BLOCK SHIFT FACTOR DB 7 ;1K BLOCK MASK DB 0 ;1K EXTENT MASK DW 194 ;195K - 1 DISK CAPACITY DW 63 ;64 - 1 DIRECTORY ENTRIES DB 0F0H ;ALLOCATION 0 (2 BLKS RESERVED FOR CBIOS) DB 0 ;ALLOCATION 1 DW 16 ;CHECK VECTOR DW 1 ;SYSTEM TRACKS PAGE * * SIGN-ON MESSAGE FOR 1.4 CBIOS (59K) * SIGNMSG DB SIGNL ;LENGTH OF MESSAGE DB 'Z'-40H DB 'Osborne Computer System' DB 0DH,0AH DB '59k CP/M vers 2.2' DB 0DH,0AH DB 'CBIOS 1.4' DB 0DH,0AH SIGNL EQU $-SIGNMSG-1 * * TABLE OF ADDRESSES USING LABEL SEKTYP WHICH * MUST BE MOVED TO MAKE ROOM FOR EXPANDED VECTORS * SEKTYP DW 0E37BH DW 0E5DAH DW 0E648H DW 0E67BH DW 0E6B0H SEKTYPN EQU ($-SEKTYP)/2 ;NUMBER OF ENTRIES * * TABLE OF ADDRESSES USING LABEL HSTTYP WHICH * MUST BE MOVED TO MAKE ROOM FOR EXPANDED VECTORS * HSTTYP DW 0E678H DW 0E6B3H DW 0E6DCH HSTTYPN EQU ($-HSTTYP)/2 ;NUMBER OF ENTRIES * * TABLE OF ADDRESSES USING LABEL XLTKEY WHICH * MUST BE MOVED TO MAKE ROOM FOR EXPANDED VECTORS * XLTKEY DW 0E7BDH DW 0E7ECH XLTKEYN EQU ($-XLTKEY)/2 ;NUMBER OF ENTRIES PAGE * * PATCH 1 TO FIX NUMBER OF BLOCKS PER TRACK * PAT1CODE CALL 0E490H ;GET DENSITY OF DRIVE JNZ 0E48AH ;UNFORMATTED DISKETTE MVI A,6 ;IS THIS A KAYPRO II? CMP B JNZ CPATCH1+5 ;NO, RELEASE INTERCEPT MVI B,10 ;YES, SET CORRECT NUMBER OF BLOCKS JMP CPATCH1+5 ;RELEASE INTERCEPT LPATCH1 EQU $-PAT1CODE ;LENGTH OF PATCH CPATCH1 EQU 0E431H ;INTERCEPT LOCATION FOR PATCH 1 PATCH1 EQU 0E980H ;EXECUTION ADDRESS FOR PATCH 1 * * PATCH 2 TO MAKE PHYSICAL SECTOR START AT 0 INSTEAD OF 1 * PAT2CODE PUSH PSW ;SAVE A & FLAGS PUSH D LXI H,DPH0DPB ;ADDRESS OF DRV 0 DPB POINTER LDA ACTDSK ;GET ACTIVE DISK NUMBER CPI 0 ;DISK 0? JRZ PAT2C1 ;YES, POINTER IS CORRECT LXI H,DPH1DPB ;NO, ADDR OF DRV 1 DPB POINTER PAT2C1 MOV E,M ;GET ACTIVE DPB ADDRESS INX H MOV D,M LXI H,USERDPB+1 ;ADDR OF KAYPRO DPB DSBC D ;DO THEY MATCH? POP D ;RESTORE DE LXI H,ACTSEC ;POINT TO ACTIVE SECTOR JRZ PAT2C2 ;YES, THEY MATCH POP PSW ;NO, NORMAL OSBORNE DISK JMP CPATCH2+3 ;RESUME NORMAL PROCESSING PAT2C2 POP PSW JMP CPATCH2+4 ;KAYPRO, BYPASS SECTOR INCREMENT LPATCH2 EQU $-PAT2CODE ;LENGTH OF PATCH CPATCH2 EQU 0E6EDH ;INTERCEPT LOCATION FOR PATCH 2 PATCH2 EQU PATCH1+LPATCH1 ;EXECUTION ADDRESS FOR PATCH 2 END  OF PATCH CPATCH2 EQU 0E6EDH ;INTERCEPT LOCATION FOR PAE INTERCEPT LPATCH1 EQU $-PAT1CODE ;LENGTH OF PATCH CPATCH1 EQU 0E431H ;INTERCEPT LOCATION FOR PATCH 1 PATCH1 EQU 0E980H ;EXE The fine programs in this library file arrive through the courtesy of the Kaypro people and the people mentioned in the messages below. There is no "formal" documentation and none is needed, as the programs are VERY easy to use. From the national KUG CBBS in Chicago (1-312-882-6747)..... Msg 01774 is 17 line(s) on 01/20/84 from STEVE RASMUSSEN to ALL KAYPRO OWNERS re: FREE MULTI-FORMAT PROGRAM Hello !! I'm Steve Rasmussen, and I work at Kaypro Corporation. The week of January 23rd I'll be releasing to production the master disks for a new program called Mfdisk. There are versions that run on the Kaypro 2, Kaypro 4, and Kaypro 10. This program allows your mighty Kaypro to read, write and format disks in seventeen other computer formats. (thirteen formats for the Kaypro 2, because double sided formats don't work real well in that machine) These programs will ONLY run on Kaypro hardware. Anyway, Kaypro Corp. has decided that rather than charge existing Kaypro customers for these programs, they should be offered at no charge, provided someone like KUG will handle the distribution headaches. I'm happy to either modem them (xmodem or lync protocol) or send them to whoever in KUG would like to take care of this. (P.S. If there are any formats not included that you would like to see, communicate them either in a letter to me on this B.B.S., or tell your dealer.) Steve Msg 01820 is 09 line(s) on 01/25/84 from PAUL MCCURE to ALL re: * MFDISK * Steve Rasmussen from Kaypro uploaded three versions of MFDISK for the Kaypros' II,IV, and 10 to MIDWAY RBBS/RCP/M. They are on drive A4:. This program is a smaller version of the Uniform program. Kaypro will be cont. to update it. However, after talking to Steve, he did say that if we could come up with other computers to put on it that we could give him the configurations for the computer that you wish to have them include. If you leave me or Steve a message on MIDWAY, I'm sure that Steve will get it. I would like to thank all of you that call MIDWAY for making it a success. Paul McCure (MIDWAY 312-293-5320 ) --End of 01820 rotocol) or send them to whoever in KUG would like to take care of this. (P.S. If there are any formats not included that you would like to see, communicate them either in a letter to me on this B.B.S., or tell your dealer.) Steve Msg 01820 is 09 line(s) on 01/25/84 from PAUL MCCURE to ALL re: * MFDISK * Steve Rasmussen from Kaypro uploaded three versions of MFDISK for the Kaypros' II,IV, and 10 to MIDWAY RBBS/RCP/M. They are on drive A4:. This program is a smaller version of the Uniform program. Kaypro will be cont. to update it. However, after talking to Steve, he did say that if we could come up with other computers to put on it that we could give him the configurations for the computer that you wish to have them include. If you leave me or Steve a mes@Copyright (c) 1983, Non-Linear SystemsNo warranty is made, expressed or implied Kaypro 10 2.0 01-04-83 @10:00amB3C32.=@ >2.=Y+}+>}+:@/o:22<(2 {=ҝ<2 +{22=+?pU :=+>!=w#"?=:<ĩ,+:,= *F=+qN1,4O=2,=*F=~#"F=!5, () 'U ') )@ :<:QQQPMMMMMMMMMMDDDCCCCCCCCw#wU = R     Ux¯x 20=*C="?=h5  S (?Dµ~@ w#s#r#*=s#r4͸K:?w/:j Z.!]?~-|Ti (?. .. . -!V?p#"?=ͩ2'!5j w#~@k/|T -?  *F=ԃ +!"4="6h5  !3=44!r?> (?H!?>͗;Zʹ/*<|.:@<2[?2j/!O//*<|| R     //̓ͩ*h5  + "?B Fatal error(s) Warning(s):=GͩAj     IRPxT G?    > Z:@<> J> J!h5  on (^ D!9*)@͍ 4:?!"#@"%@*?#0*)@+<2j >0"?yT ?D0:@<2@:@:@=2@<#~^0:@£j"?:?=2?zT, ?U 0"F=0>&2?>1&0:?0>&;:j~ 1=zTJ ?D10:@*@~<1=11O+11 #1j1<*F=U zTg (^ H  !"#$%&'j10}1ͱ k1å|  D:0 ʞ: ù1:: 1 1:"%@j:Þ::@zT ?B2G+#2~/_2~F2=G+~F23j .3yT U Ă2=ʦ3%2,3 Do you want to S)elect a disk, F)ormat a disk, or R)eturn to complete selection, and go to CP/M? ChangePlease put in a disk. S)elect again when ready.Disk Format is Unreadable.Disk Formats not Compatible.Multi Format Disk v. Function Track RetryPress "escape" to abort.Error! VerifyFormat Which Disk, A: or B:? Nothing ChangedUse arrow keys to move around, escape to abort, or return to accept.Permanent disk error encountered at track # Format aborted by User.Disk formatted for: Formatting: No errors DetectedI can't format a write-protected disk! Take off the protect & try again.Please put in a disk. F)ormat again when ready.Remove program disk, insert new disk. Press return: Are you sure that you want to do this? FormatFormatting erases any information that might currently be on the floppy6:@6Kaypro Single DensityKaypro Double DensityKaypro Double Sided/DensityOsborne I, Single DensityOsborne I, Double DensityXerox 820, Single DensityXerox 820, Double DensityTRS-80, Single DensityTRS-80 Model IIIIBM PC, Double DensityIBM PC, Dbl Sided/Dbl DensityTI Professional, Dbl DensityMorrow Micro Decision (MD2)Zenith Z-10, Double DensityNEC PC-8001a͐J!!!!!!!!!!!!!.!9 !C͐J!!9s#r"#!9~#fo#s#r+!9^#V!X͇K^~#x!9^#V!X͇K\^#VVU!9s#r* Kj*r!9^#V"!9^#V"*͵J"!!9s!9~!!!-!!5@!!X-!!X-!! X-!! X-!!! X-!!) X-!!5@͌-!9s:o&J}!!!-!!5@!!%!!9^: o&Jʵ!!!-!!5@!9^:! o&J!!9sÜ!!5@͐J!!5@!!!-! !!-! X-!!3!-!!9s#rQ!9~#fo#s#r!9^#V! Kp!9^#VB*) *!!A+!9!!9s#rï!9~#fo#s#r!9^#V*J!9^#V*J!9^#V* K!9^#V!9^#V*K+àKaypro 102.0(c) Kaypro Corporation͐J!9^#V!Jʳ͕!9s#r!JO!R c!9s#r!Ji!9^#V#eLͱK!! J³!!Y !!-!!9^#V!X͇Km^!J!!9^#V##@ͱK! S@!!9^#V##PͱK! S@!!9^#V##! S@P!! !!-!!9^#V##Y!9s#r!9^#V!X͇Km^!J!9^#V! ^#V!^!JJ!! !!-!!9^#V!X͇Ko^!J!!9^#Vs#rÈ!9^#V! ^#V!/! 9s#r!9^#V!X͇Ko! 9s#r!9^#V! ^#V!/!9^#Vs#r! 9^#V^!Jʈ! 9~#fo#s#r+^!9~#fo#s#r+sI!!9^#V!X͇K^!9^#V! ^#VͼT!!9^#V!X͇K\^#V!9^#V! ^#V!ͼT!!9^#V##ͱK! S@!9^#V͐J͕! 9s#r!JJ!!!-!!5@! c!9s#r!Jʃ!!!-!!5@! !!-!!5@!X-! X-ͻ.͌-! 9s!!!-!!5@! 9^!YJ!9^#V#eLͱK!! J8!!V !!-!I@Jg!! !!-!! !!-!! 9^#V!X͇K\^#VX-!!!5@!}2! 9^#V!X͇K^#V"Z!"X! 9^#V! 9^#V!X͇K^#V͏J!9s#r*XF!"X!9~#u!9^#V! 9^#V%! !!-!!5@! 9^#V!X͇K\^#VX-!X-! X-!9^#V!Jʧ! !!-!!5@! !!-!9^#V+.X-!!5@ . ͐J!U!!9^#V###-!9^#V!C!5@!VX-!9^#V##{!9s#r!9^#V!X-!!5@: ͐J!!9^#V!ͱK! S@͐J! 9^#VY ^#V͐J!b!!-!!5@!K !!-!k X-!~ X-!,!!9s#r!!9s!!9s!9~!!9^!9^#V!! 9s#r! 9~#,ð!! 9s#r!! 9s#r!! 9s#r!! 9s#r!! 9s#r!!9^!9^#V!,!L A O ]k y1! 9^#V!J!9^#V!J!9~!!,!!!! 9^#V!J8!!9s!9^#V! 9s#r!9^!9s!!9s! 9^#V!J{! 9^#V!J!9^ͩK!9s! 9^#V!Jʼ!9~¼!! 9s#r!!9s! 9^#V!J!9~!! 9s#r!!9s! 9^#V!JC!9^#V!J!9~#fo+s#rC*+!9s#r!9^ͩK!9n&eL!9s! 9^#V!Jʡ*+!9^#V Kz!9~#fo#s#r+á!!9s#r!9^ͩK!9n&eL!9s!9~!9^#V*#*J!!9s!!9s#r!!9^! 9^#V!!9^!9^#V!,!9~3*!9~#fo#;!9^#V!9s#r!9^#V* K^!9^#Va!͐J!!9s#r!}2W!9^#V#IJͱKͱKeL}2V:Vo&JͱK}2V!9^#V͐J!!9~*!!9^#V!-!9~ !9^#V*#!9^#V!9s#r!9^#V! KR!9^#V* KR!9^#V!X͇K\^#VU!2 !9s#r!9^#V^z~!9^#V!J~!!9s#rÝ!9~#fo#s#r+!9^#V* K!9^#V^z! !5@!9~#fo#s#r+^!5@Ì͐J!!5@! 9~!B!C!5@!0!5@͐J!!5@! 9~M!BP!C!5@!4!5@͐J! 9^#V!X͇Km^!J!9^#VO"!!ͼ$͐J!!9^#V!!ͼ$͐J!!9^#V!!ͼ$͐J!!9^#V!}2!}2!!ͼ$͐J!!9^#V!!ͼ$͐J!!9^#V+O"I:'!}2}2! )͚*! )**XF!"X!!9^#V!!ͼ$͐J!}2!!9^#V!}2!!ͼ$͐J!}2"!}2! 9^#V"*X͇Km^!J#! }2*!}2!}2:Vo&JͱK}2V!9^#V"͹K*X͇K^^#V͵J"!}2*ZND"X|–!C*X͇K^#V!!ND*X͇K^#V!! !D! !!D!!#+s*X͇Km^!J] !!9st !!9st !!9st !!9st L- 9 E Q t *X͇K^#V*KJʡ !!DMï `i#DM+`i* K""!!ND!!!D!!!D!!#+s`i)s#r!#+s!#+s*X͇KPY^#+s!9^#+s!#+s!!ND!! !D! !!D!!#+s*:o&D*!#+s!NDé *XKDM*Z KN"*ZPYK!ND͐J!}2}2}2"!}2!9^#V":Vo&4ͱK}2V!@!9~#foK"*X͇K^^#V"*J"*͵J+*͹K"!}2*ZND"X|"!C! !D! *J]#!!D!!#+s!!D!!!9s#r!DMv#`i#DM+`i* Kʏ$!!D!!#+s`i)s#r!#+s!#+s`i##+s!9^#V+#+s!#+s! !D! !!D!!#+s*:o&D*!#+s!!D!p#*XKDM*Z Kʻ$*ZPYK!D͐JI!9~#$!I:'!9^#V}2$:o&#}2:o&'J':o&|%:o&)%:o&}2! )͚*! )*J?%](*|K%*!!5@Je%!:Vo&!9s!:Vo&eL}2V:o&|&!!9s#rê%!9~#fo#s#r!9^#V* K&!!9^#V)^#V#s:o&!9^#V)^#V##n&s:o&!9^#V)~#fos#rÛ%:o&#}2! )͚*! )*JE&](*|Q&*!!5@Jk&!!!9s#rÈ&!9~#fo#s#r!9^#V* K&!!9^#V)^#V#s:o&!9^#V)^#V##n&Ks:o&!9^#V)~#foKs#ry& ':o&| '0I!9^}2V!I$!9~6'*XF!"X*͐J!O'#* K')^#V##^)!9s#rH'!*)!9s#r*͹KDM`i Kʮ'!DM!'#* KL()!9^#V!J'#*J'!')!9^#V)s#r!)!9s#r`i*JI(*Kú'!*)s#r͐J!}2w(:o&#}2:o& K ):o&|ʚ(! ):o&J(:o&|(I!DM(`i#DM:o&`i K(!Iÿ((:o&|(!I%I(%I!IOI*J)l(:o&#"! )͐J:o&|š)!}23 !"4 !}26 !}2! !!-!!5@! !!-!5!!!A+!9!}2:o&|)*4 ! 9~#foJ)! 9^#V!!-!*!1!-:o&0!5@!}26 ~**4 ! 9~#foJ%*! 9^#V!!-:3 o&:o&JZ*:o&.!(!-!*X-:6 o&|w*!*!1!-!}26 ! 9^#V"4 :o&}23 ͐J!DMì*`i#DM`i* K*:o&`i)^#Vsç*!}2OI͐J!DM`i^#V!J=+*X͇Km^!J! 9`i##DM++^#VnI!9s#r!<J:+!9^#V*!͐J!9^#V!9^#V!9^#V!9^#V+!9!9^#V!9^#V!9^#V!9^#V+!9!9^#V!9^#V!9^#V!9^#V+!9!9^#V!9^#V!9^#V!9^#V+!9͐J!!5@!L!5@! 9^#V))!5@!9^#V)!5@!9^#V))!5@!9^#V)!5@͐J!9~#~,!,!9^#V^!9^#V^Jʢ,!,!9~#fo+s#r!9~#fo#s#r!9~#fo#s#ri,͐J!!5@!9sz,,!9^͐J!!5@!=!5@! 9^#V!!5@!9^#V!!5@!9^#VX-͐J! 9^#V~ʋ-! 9~#fo#s#r+^!5@]-͐J!!5@!9sz¬-Ñ-!9^! K-!9^!@.!9^!` K-!9^!| K-!9^.!9^!͐J!0}27 !}28 ! 9~#5.! 9!9^#V!7 9.!7 ͐J!9~#Y.!!9^#Vsú.!9^#V!9^#V! ͵J!9^#V#9.!9^#V^#V! #K0!9^#Vs! !9^#V~#fo͵Js#r͐J!!9s#r.!9~#fo#s#r!9^#V! K.!!5@.*^#VRM0!9~2d0~2e0~2f0~2g0~2h0~ 2l0~ 2m0~2n0~2o0~2i02j0nf>nf>~2k0*-"5"<^#VS<*"<^#VS<*=*"Z0*"N>">v"nf"1n f ">!Put"=! ut!>Y0Rnf##nfut>2z02\0202t0202y02020[!Y0{;ICK_DIS_!^X.91!x^X.92aa17Q77a7`7!^X.93!y˹˱!0o0$y20O2\0GMy!g0_!06ˡ!Y0yݾ8(=ݾ0<ݖOm*=yͫ1*0!Y0y͢1ͫ16 666*0~0606 0606 ~w*0~w*0~w * >yw͢1ͫ1*f"1!E"fP3!"f!0#!17:\00!A7"0!Q70!7"0"0"0"0!Y06666t2!Y06qy $~͢1~w~w~w~w~w~(@5~ݾ 5~ݾ -~ݾ %~ݾ 4~ 8 64 4666*f"2!E"f͎2!"f6-Nq~0q~ 6 ('~ݾ! ~"ݾ ~#ݾ ~ݾ$(*~6~w!~w"~w#~w$~ĵ56~͢1N~=g.7^ V ~ 6~( ~/#~~-66~-y*0s#r{(7S17([0~w /~w*0w~ ~(~(*0~w*f"s4!E"fL5!~0>v ͭ5g!"f~(<=(!q!Y0~͢1~ w *f"4!E"fͺ4!"fL5N xݦ ݶݶ/ݮ y>6ͭ5L5~N x G~~(90~ݦ ݶ/ݮ N yqy>ͭ5N͍4N xݾy(>N xݦ ݶ/ݮ yo5N xݦݾ~/Gxݶy!"<e=*v% ͭ5w-- >F!7!7FN/~!RKaypro Single Density(?DKaypro Double Density(?Kaypro Double Sided/Densityo2<*22!>~A2>>!>>!b7>~ݾ(!>>~A!>w>!>>!7>!>>!~8wN {Warm Boot} ?:= ! X.28Ny#000000000001111"1%181^1e1t11111111111111111112y222223J3W3Z3}333333333344#4@4O4Y4\4k44444444"5/5i5555555555556666*6B6U6]6q6y6697;7=7?7I7K7M7O7<===C=H=K=P=S=W=a=f=o={=~============ >>>>>>>G>\>d>g>j>m>p>s>~>>>>>>>>>>!V1ͭ $@xL8@xL*yJDM*{Jo&xLV@o&xL*yJ*+++*{JDM*}J!9N#F#^#Vkb6#> 6 #=@>6#=Š@ : >½@ A@[Ү@@ú@a@{@`w# .@@@@w#@{o|g @@w#@!!|a{ !9^#V*@!9}|)A*@"@|!@$͞.LNPRM! 9s#r!-!9~#fo+s#rsXk! 9!9~#fo##s#r++^#Vk! 9s#rîk!9~#fo##s#r++^#V! 9s#rîk!9~#fo##s#r++^#Vk xjdjs[kc{kk! 9^#V^z͐J!!!jAͼT!:o&JjAs!C".A!jADM!"A*A KʾC`i^! JSB`i^! J[B`i#DM7B`i^zʾC`i^!>J|B!ÐB`i^!<JoC!`i#DM^! J¯B`i^! JʲBÐB`i`i#DM~B`i^! JB`i^! JB!`i#DM+sB÷B͂O|C!MC!NJlC!C!1U!͜U!C!͜U!VU!!͙Q! CûC`i*A#"A+).As#r`i#DM~ʻC`i^! J©C`i^! JʸC!`i#DM+sûCÃC*B!.A*Aͭ CCan't open file for redirection: ͐J$@͐J!"!͐J!!9nf]TNFy( ~w y(IIIII͐J!9^#V!CLnD!!9s#rH*BD!9s#r!BDDM~#PE++nf!9~#fo5L9Enf!9~#foKCLDnf`is#r!9~#fo!9s#rnf++!9^#Vs#r!9^#Vsrnf!9~#fo##s#rs#r!9^#V`is#r!9s#rnfÄD!9!9~#foK!9s#r!9^#V!9~#foCLʛEG˜E!E! 5@!nD!9^#V++!9^#Vsr!9^#V!9~#fo##`is#r!9^#V##A`i^#V+!utut!9^#V Out of Memory $͐J! 9^#V++DM!@D##^#VzG++PYDL G`i##ut##! s#rBDJʶF++nf##PYJʶF`i^#V##~#fos#r##utDM`i^#V`i##JG##~#F!! s#rGnf##`i~#fos#rnf! s#r!(F͐J*JD͏J*HD͏J*FD͏J*DD͏JͱKͱKͱK͐J*DD! 9~#foJG*FD! 9~#foJG*HD! 9~#foJG*JD! 9~#foJG*DD*LDJʤG! 9^#V"DDG*FD*LDJʿG! 9^#V"FDG*HD*LDJG! 9^#V"HDG*JD*LDJG! 9^#V"JD͐J!DM*BD++Hnf++##~#,HnfPYDMH!9JKPY͐J!DM*BD++eHnf++##~#ʊHnfPYDLʇHnfDMZH!9JK!9s#r!9^#V`iDLH!9^#VH`i͐J*BD| I!A!9s#r!9^#V##"BD!!9^#V##s#r!9^#Vs#r͐J!I>ISsI{II>v0 0>yII*X>v00b!9~nfFIP>v  IoI!I*ZD!I:ZG*X{vIo&:WOxog!+} 8:WO:Vy* J"f͐J!I%IIJ!9s#r!!9s#rDJ!9~#fo#s#r!9^#V! NCLsJIJ!9~#foJpJ!5J!qç |g}o|/g}/o^#V#DM!99`i͏J|z2xJ4K:xJK}MK}}J|J!}J|J!}|K}|?>o&zo&|K}|>o&|o&z2xJ4K:xJK||?K/g}/o#zMK/W{/_MKDM!>2wJ))`K#}o|gxK :wJ=2wJXK}:wJ=2wJXK}DM!>))җK =K}}/o|/g#}|JJ|g}o{_K|XL|7g}oK{_K)K}}o|gN#F# N#F#zL{L##^#VBK^#Vz.L#y(L###L#x#L#~#fo}|>?o&}|>o&{_K|g}oXL|g}o~# xmL!9yJ~#ˆL!L|!!!!!!!!!!!!!!9 !ͮ !!9s#r"#!9~#fo#s+!9^#V!X^~#x!9^#V!X\^#V!9s#r*j*r!9^#V"!9^#V"*"!!9s!9~!!!-!!!X-!!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:͐J!9^#V!!9^#VN͐J!!!9s#rQN!9~#fo#s#r!9^#V! KsNnfCJ}N8N!"!!DMÍN`iDM`i~#ʮN!9^#V`i^#VTʮNÅN! ^#V!9^#V!J#!9s#r!9^#V!JNn&u|N!"!!9^#V!JOn&u|O!"!! ^#Vsrn&un&u!Qut!9^#V!9^#V!9^#Vnf͏J! 9! KyO!!9^#V͐J! 9^#V! K§O! 9^#V! KʱO!"!! 9^#V)))DM! ^#V! ^#V͏J! 9s#r!! s! s! s`is!C! s#r! 9^#V͐J!LDMP`i&DM`iMCL8P!% ^zBPP!"!!9^#Vn@]P!"!!9^#V!JwP!5@!5@JʺP!9^#V!JʭP!5@JʷP!"!P!9^#V!JJP!"!!!! s#r!# s!$ s`i!9^#V!s#r!9^#V!J#!% s!J4Q!eQ!9^#V!s#rGQ!KQ!9^#V!s#r!͐J!!9^#V!%s!͐J! 9N#F!5@!!% s!͐J!C RSS͐J! 9^#V! K¾Q! 9^#V! KQ!"!! 9^#V)))DM!9^#V!9^#V! ^#V! ^)Q^#V͏J͐J!DM!9^#V$~iRn$&!KDM!9~#foDLQR!9^#VBK!9^#V SiR!!9^#V`iKPL!9s#rzR!9^#V!9^#V`isT!9s#rzR!9^#V!9~#foKKPY!9^#V!KPYDM`i!9~#foCLS!9^#V`iK!9^#V`i SS`i!9^#V͐J! 9N#F!!5@!!5@"J[S*JvS!"!!!TÂS*|ʂS!!9^#V!9^#V!$ ^!ͼT!"5@"|ʺS!!$ ^!9~#foJ!$ szS`i!~#fo#s#r!͐J!9N#F! T#!9~#fo KgT`i#DM+^!9s#r!9^#V! JOT! !9^#V5@!9^#V!9^#V5@TxL!xTxL"*{J!"{J*yJ±T*yJ!4£T#4*}J+"}J}yTo&"*}J! 9F+N+V+^+~+ngxTw# T!9^#V#N#F#nxTs# T!9^#V#~#foxU!UU# U!+U!}!}!9^#V#~#foxSU~SU# BU!9~#fokU#bU}!9^#V#^#V#N#FU!9^#V#^#V#N#FBU!9^#V#~#foxSU~ʽU# îUBU!9^#V#^#V#N#FîU!9^#V#n~UU#U!|!9^#V#nV# VxU +~VU9^#V#~#foxSU~ʽU# îUBU!9^#V#^#V#N#FîU!9^#V#n~UU#U!|!9^9s#rzR!9^#V!9^#V`isT!9s#rzR!9^#V!9~#foKKPY!9^#V!KPYDM`i!9~#foCLS!9^#V`iK!9^#V`i SS`i!9^#V͐J! 9N#F!!5@!!5@"J[S*JvS!"!!!TÂS*|ʂS!!9^#V!9^#V!$ ^!ͼT!"5@"|ʺS!!$ ^!9~#foJ!$ szS`i!~#fo#s#r!͐J!9N#F! T#!9~#fo KgT`i#DM+^!9s#r!9^#V! JOT! !9^#V5@!9^#V!9^#V5@TxL!xTxL"*{J!"{J*yJ±T*yJ!4£T#4*}J+"}J}yTo&"*}J! 9F+N+V+^+~+ngxTw# T!9^#V#N#F#nxTs# T!9ã>Copyright (c) 1983, Non-Linear SystemsNo warranty is made, expressed or implied Kaypro 2 2.0 01-04-83 @10:00am .=Y+2.=@ >2.=Y+}+>}+:@/o:22<(2 {=ʝҝ<2 +{22=+?pU :=+>!=w#"?=:<ĩ,+:,= *F=+qN1,4O=2,=*F=~#"F=!5, () 'U ') )@ : P P PNRLWL\LaLfLkLpLuLzLLBBBBBBBBBBB#w#w#w R     >21=Ux¯x 20=*C65  " (?D-#~µ~@ w#s#r#*=s#r4͸K:?qj <4~=Z.!]?|T -?   -!V?p#"?=ͩ65  ."?=~w#~ (?H*= ͩ *={ĩn*F=ԃ +!j=p!/!3=44| R     /*<|.:@<2[?65   * "?B:@<2[?2[?!_//ʹ//̓j     ͩxT G?    (s) Warning(s):=G65  EP5 (^ Dnated /!//)> Z> Z:@<> J>qj @0zT] ?Dr0:@<2@:@:@=2@<#~^0qj^07"?:?=zTz (^ H  !"#$%&'j?*@~ 1|  D~10:@*@~<1=11O+1qj111<*F=zT ?Bd10P1x0G0&06 "F= j 1ͱ yT ;1ù1:0 ʞ: ù1:: 1 16@ʞ: ʞ:> ;:Þ::@1*4Do you want to S)elect a disk, F)ormat a disk, or R)eturn to complete selection, and go to CP/M? ChangePlease put in a disk. S)elect again when ready.Disk Format is Unreadable.Disk Formats not Compatible.Multi Format Disk v. Function Track RetryPress "escape" to abort.Error! VerifyFormat Which Disk, A: or B:? Nothing ChangedUse arrow keys to move around, escape to abort, or return to accept.Permanent disk error encountered at track # Format aborted by User.Disk formatted for: Formatting: No errors DetectedI can't format a write-protected disk! Take off the protect & try again.Please put in a disk. F)ormat again when ready.Remove program disk, insert new disk. Press return: Are you sure that you want to do this? FormatFormatting erases any information that might currently be on the floppyf5y nKaypro Single DensityKaypro Double DensityOsborne I, Single DensityOsborne I, Double DensityXerox 820, Single DensityXerox 820, Double DensityTRS-80, Single DensityTRS-80 Model IIIIBM PC, Double DensityTI Professional, Dbl DensityMorrow Micro Decision (MD2)Zenith Z-10, Double DensityNEC PC-8001aI!**~!!!@!!@!!!!!̓-!9 !{BI!!9s#r")6 !9~#fo#s#r+!9^#V!X JY~#ʋ !9^#V!X JW^#VS!9s#r*)͎I} *)Å !9^#V")% !9^#V"'*':I"+!!9s!9~!2!!͇+!!ͺ>!!B+!!J+!!U+!!]+!!l+!!t+!!ͺ>,!9s:Bo&TIʐ!!!͇+!!ͺ>!!7!!9^:Uo&TI!!!͇+!!ͺ>!9^:lo&TI!!9sï !!ͺ>I!!ͺ>!!!͇+! !!͇+!+! !3!͇+!!9s#rd!9~#fo#s#r!9^#V!͎Iʃ!9^#VU*)) *+!![)!9!!9s#r!9~#fo#s#r!9^#V*'tI!9^#V*+sI!9^#V*+͎I!9^#V !9^#V*+hJ+sóKaypro 22.0(c) Kaypro CorporationI!9^#V!TIʹͧ!9s#r!TIa!u!9s#r!TI{!9^#V#!!͐H¹!!!!͇+!!9^#V!X Jh^!I!!9^#V!@6J! >!!9^#V!P6J! >!!9^#V! >M!!!!͇+!!9^#Vk!9s#r!9^#V!X Jh^!I!9^#V! ^#V!^!IcI!!!!͇+!!9^#V!X Jj^!TI!!9^#Vs#rÂ!9^#V! ^#V!/! 9s#r!9^#V!X Jj! 9s#r!9^#V! ^#V!/!9^#Vs#r! 9^#V^!cIʂ! 9~#fo#s#r+^!9~#fo#s#r+sC!!9^#V!X JY!9^#V! ^#VAS!!9^#V!X JW^#V!9^#V! ^#V!AS!!9^#V!6J! >!9^#VIͧ! 9s#r!TIA!!!͇+!!ͺ>!. u!9s#r!TIz!!!͇+!!ͺ>!5 !!͇+!!ͺ>!+! +@-,! 9s!!!͇+!!ͺ>! 9^!YcI!9~# !+! +^+TI !9^#V#!!͐HJ!! !!͇+!UH@Iy!!X !!͇+!!8 !!͇+!! 9^#V!X JW^#V+!!!ͺ>!}2! 9^#V!X J^#V"U!"S! 9^#V! 9^#V!X J^#VI!9s#r*S͖D!"S!9~#‡!9^#V! 9^#V7!# !!͇+!!ͺ>! 9^#V!X JW^#V+!+!E +!9^#V!TIʹ! !!͇+!!ͺ>! !!͇+!9^#V+͆,+!!ͺ> . I!g!!9^#V###͇+!9^#V!A!ͺ>!h+!9^#V͍!9s#r!9^#V!+!!ͺ>: I!!9^#V!6J! >I! 9^#Vk ^#VI!t!!͇+!!ͺ>! !!͇+! +! +!0!!9s#r!!9s!!9s!9~!!9^!9^#Vs!! 9s#r! 9~#^+!! 9s#r!! 9s#r!! 9s#r!! 9s#r!! 9s#r!!9^!9^#Vs!0!͓J S a o} C! 9^#V!TI.!9^#V!TI.!9~.!!0!!s!! 9^#V!TIJ!!9s!9^#V! 9s#r!9^!9s!!9s! 9^#V!TI! 9^#V!TI!9^.J!9s! 9^#V!TI!9~!! 9s#r!!9s! 9^#V!TI!9~!! 9s#r!!9s! 9^#V!TIU!9^#V!cI-!9~#fo+s#rU*++!9s#r!9^.J!9n&J!9s! 9^#V!TIʳ*++!9^#V͎Iʌ!9~#fo#s#r+ó!!9s#r!9^.J!9n&J!9s!9~!9^#V*+#*'sI!!9s!!9s#r!!9^! 9^#Vs!!9^!9^#Vs!0!9~E*+!9~#fo#M!9^#V!9s#r!9^#V*'͎Ip!9^#Vs!I!!9s#rÙ!9~#fo#s#r+!9^#V!͎Iʹ!!ͺ>È!9^#V!!͇+!n +!!ͺ>,!9s!ATI!!9s#r8!9^!BTI"!!9s#r8! !!+!!}2R!9^#V#\HI6J}2Q:Qo&I}2Q!9^#VI!!9~ʏ*)Ò!!9^#V!͇+!9~ʽ!9^#V*+#!9^#V!9s#r!9^#V!͏I!9^#V*'͎I!9^#V!X JW^#V!} !9s#r!9^#V^z1!9^#V!cI1:-o&|B!E!+!9^#V~!9^#V^! TIʝ:-o&||!_! !ͺ>!9~#fo#s#r+:-o&|!9~#fo#s#r+^T!9~#fo#s#r+^!ͺ>J!!9~*)!##!9^#V!͇+-> I! 9^}2-II! 9^#V!X Jh^!I!9^#V"!!͊$I!!9^#Vͭ!!͊$I!!9^#Vͭ!!͊$I!!9^#Vͭ!}2!}2!!͊$I!!9^#Vͭ!!͊$I!!9^#V+"͜GT%!}2}2!f 8'ʹ(!_ 8'(*S͖D!"S!!9^#Vͭ!!͊$I!}2!!9^#Vͭ!}2!!͊$I!}2"!}2! 9^#V"*X Jh^!I! }2!}2!}2:Qo&I}2Q!9^#V">J*X JY^#V:I"!}2*UB"S|^!{B*X J^#V!!N͜B*X J^#V!! !͜B! !!͜B!!#+s*X Jh^!I% !!9s< !!9s< !!9s< !!9s< ͓J   < *X J^#V*hJtIi !!DMw `i#DM+`i*͎I!!!N͜B!!!͜B!!!͜B!!#+s`i)s#r!#+s!#+s*X JPY^#+s!9^#+s!#+s!!N͜B!! !͜B! !!͜B!!#+s*:o&͜B*!#+s!N͜Bq *ShJDM*U͎I"*UPYhJ!N͜BI!}2}2}2"!}2!9^#V":Qo& 6JI}2Q!@!9~#foXJ"*X JY^#V"*cIʞ"*:I+*>J"!}2*UB"S|"!{B! !͜B! *cI+#!!͜B!!#+s!!͜B!!!9s#r!DMD#`i#DM+`i*͎I]$!!͜B!!#+s`i)s#r!#+s!#+s`i##+s!9^#V+#+s!#+s! !͜B! !!͜B!!#+s*:o&͜B*!#+s!!͜B!>#*ShJDM*U͎Iʉ$*UPYhJ!͜BI͜G!9~#ʟ$ͦGT%!9^#V}2ü$:o&#}2:o&'tI9%:o&|$:o&)$:o&}2!f 8'ʹ(!_ 8'(I %w&*|%*!!ͺ>TI3%!ͦGñ$!9~P%*S͖D!"S*I!i%#*͎Iʙ%)^#V##^)!9s#rb%!*)!9s#r*>JDM`i͎I%!DM!%#*͎If&)!9^#V!TI&#*TI&!%)!9^#V)s#r!)!9s#r`i*sIc&*hJ%!*)s#rI!}2Ñ&:o&#}2:o&͎I%':o&|ʴ&!T 8':o&TI&:o&|&͜G!DM&`i#DM:o&`i͎I&ͦG&':o&| 'ͦGͪG'ͪGͦGG(I"'Æ&:o&#"!T 8'I:o&|´'!}2~ !" !}2 !}2!; !!͇+!!ͺ>!" !!͇+!5!!![)!9!}2:o&|(* ! 9~#focI'! 9^#V!!͇+!(!1!͇+:o&0!ͺ>!}2 Ø(* ! 9~#focI?(! 9^#V!!͇+:~ o&:o&cIt(:o&͆,!(!͇+!(+: o&|ʑ(!(!1!͇+!}2 ! 9^#V" :o&}2~ I!DM(`i#DM`i*͎I(:o&`i)^#Vs(!}2GI!DM`i^#V!cIW)*X Jh^!I! 9`i##DM++^#VG!9s#r!<IT)!9^#V(!I!9^#V!9^#V!9^#V!9^#V*!9!9^#V!9^#V!9^#V!9^#V*!9!9^#V!9^#V!9^#V!9^#V*!9!9^#V!9^#V!9^#V!9^#V*!9I! 9^#V!9~#foTIw*!*!9^#V!9^#V͇+!9~#fo#s#r!9^#V͏Ig*!-!ͺ>9*!+!ͺ>*!*!9^#V!9^#V͇+! 9~#fo#s#r!9~#fo͎I*!*!9^#V!9^#V͇+Ñ*!*!9^#V!9^#V͇+++|+I!9~#+!]+!9^#V^!9^#V^cI'+!]+!9~#fo+s#r!9~#fo#s#r!9~#fo#s#r*I!!ͺ>!9sz~+c+!9^I!!ͺ>!=!ͺ>! 9^#V!!ͺ>!9^#V!!ͺ>!9^#V+I! 9^#V~,! 9~#fo#s#r+^!ͺ>+I!!ͺ>!9sz1,,!9^! ͎IO,!9^!@Å,!9^!`͎Io,!9^!|͏Iz,!9^Å,!9^!I!0}2 !}2 ! 9~#ʺ,! 9!9^#V! ;,! I!9~#,!!9^#Vs?-!9^#V!9^#V! :I!9^#V#;,!9^#V^#V! ͨI0!9^#Vs! !9^#V~#fo:Is#rI!!9s#rb-!9~#fo#s#r!9^#V!͎Iʂ-!!ͺ>S-*^#VR.!9~2.~2.~2.~2.~2.~ 2.~ 2.~2.~2.~2.2.nfJ=nfP=~2.*-"q4"t;^#VS};*"v;^#VS;*z<*".*"<"4=v"nf"/n f "^=!Put"~2.2.2/2.2/2.2&/2'/[!.{;MFBIOS_YaZXPROC_@8NWEXIT_55655!ZX.85!Zy˹˱!L/o0$y2 /O2.GMy!._!/6ˡ!.yݾ8(=ݾ0<ݖOm*z<y00*/!.y'0006 666*/~0606 0606 ~w*/~w*/~w *<yw'000*f" 0!E"f1!"f!/#!5:.0!5"/!50!-6"/"/"/"/!.66660!.6qy $~'0~w~w~w~w~w~(@5~ݾ 5~ݾ -~ݾ %~ݾ 4~ 8 64 4666*f" 1!E"f1!"f6-Nq~0q~ 6 ('~ݾ! ~"ݾ ~#ݾ ~ݾ$(*~ė4~w!~w"~w#~w$~:46~'0N~=g.6^ V ~ 6~( ~/#~~-6͗4~-yv 24g!"f~(<=(!q!.~'0~ w *f"83!E"f?3!"f3N xݦ ݶݶ/ݮ y>6243~N x G~~(90~ݦ ݶ/ݮ N yqy>24N3N xݾy(>N xݦ ݶ/ݮ y3N xݦݾ~/Gxݶy!"{;;*t;s#r;*v;s#r2z v844w- ( ?31N~0[5u6 ~!O1N"F#f3~$O͹3.44(  ($?3f>v% 24w-- >F!6!6FN/~!RKaypro Single Density(?DKaypro Double Density(?Kaypro Double Sided/Density:5:::-6::.156!s ZX.1No Disk Entered.! ZX.159! ZX.160@#9X.XR!+ZX.161!ZXNo Disk Entered.63!^ZX.164!ZX.165!ZX.166!ZX.167!ZX.168 ZX.170`!ZX.172!ZX.171!1ZX.173!|ZX.174!ZX.175!ZX.176!ZX.177@NWCKCTLP_ ZX.178"KZX.179!ZX.169!ZX.180! ZX.181!5ZX.182!=ZX.183@ nW.GT!}ZX.184!ZX.185!ZX.186!ZX.187!ZX.188!ZX.189!^ZX.190!ZX.191!ZX.192!ZX.193![ZX.194!<ZX.195@6ZXTOUPPER_!QZX.196!uZX.197!xZX.198 ZX.200 ZX.201 ZX.202 aZXSNGL_SET_aZXFORMAT_ ZX.203a%ZXDBL_SET_ ZX.204a1ZXF2_512_ ZX.205 ZX.206 ZX.207@GiURESTORE_aZXVERIFY_aZXTRACE_ a,ZXPUT_TRAC_ alZXCHK_TRAC_ aZXF_INVERT_ ZX.208 ZX.209!iZX.210!pZX.211+k@+S.RS@"NWALLOC_!ZX.212@NWFILL_!ZX.213,d!mZX.215!ZX.214!yZX.216!ZX.217!ZX.218!ZX.219d!ZX.221!ZX.220!bZX.222!ZX.223 ZX.224uk@NW.LS!ZX.225!;ZX.226!ZX.227 e!ZX.229!ZX.228!ZX.230!ZX.231 ZX.232!:z; H;(:.6(<.-(<[!2O ~!2[^!! "x;>2z;*x;N#"x;:z;=2z;y~y2z;y:z;(!{;5 $#5 .'(22!6=~A2E=U=!J=U=!5U=~ݾ(!N=U=~A!E=wU=!J=U=!>6U=!N=U=!~8wN {Warm Boot} ?:= !VZ 262Ny#/////9/D/I/Z/`/l///////////0 000)01040:0=0@0E0H0O0V0]0b0u0y0001Z1y11111122 2-2H2R2j2p2s2y22222222233*343@3c3g33334444 4?4B4R4Z4n444444444444'555555555;;;;;;;;;;;;;<<<<<*<-<0<;Jͽ>J*HDM*Io&J>o&J*H*+++*IDM*I!9N#F#^#Vkb6#> 6 #=?>6#=? : >B? A|?[3?@??a|?{|?`w# .]?v?E?̓?w#F?{o|g v?̓?w#g?!!|a{ !9^#V*>!9}|ڮ?*>">|!AME_ ZX.297!{ZX.298!ZX.299!ZX.300!ZX.301 ZX.302!ZX.303@nWCPM_!ZX.304 ZX.305 ZX.306!Z ZX.307I!!!?AS!:o&I?s!VB"?!?DM!"o@*o@͎ICB`i^! TI@`i^! TI@`i#DMü@`i^zCB`i^!>TIA!A`i^!<TIA!`i#DM^! TI4A`i^! TI7AA`i`i#DM~tA`i^! TIbA`i^! TIqA!`i#DM+stAI!"!I!!9nf]TNFy( ~w y(GGGGGI!9^#V!JB!!9s#rIG*B!9s#r!BDM~#C++nf!9~#foͺJʾCnf!9~#fohJJ[Cnf`is#r!9~#fo!9s#rnf++!9^#Vs#r!9^#Vsrnf!9~#fo##s#rs#r!9^#V`is#r!9s#rnf C!9!9~#fohJ!9s#r!9^#V!9~#foJ D͔ED!D! ͺ>!B!9^#V++!9^#Vsr!9^#V!9~#fo##`is#r!9^#V##͌?`i^#V+!utut!9^#V Out of Memory $I! 9^#V++DM!B##^#VzʓE++PYJʐE`i##ut##! s#rBcI;E++nf##PYTI;E`i^#V##~#fos#r##utDM`i^#V`i##TIʌE##~#gE!! s#rÌEnf##`i~#fos#rnf! s#r!íDI*BI*BI*BI*BI6J6J6JI*B! 9~#focIwF*B! 9~#focIwF*B! 9~#focIwF*B! 9~#focIwF*B*BTI)F! 9^#V"BwF*B*BTIDF! 9^#V"BwF*B*BTI_F! 9^#V"BwF*B*BTIwF! 9^#V"BI!DM*B++ØFnf++##~#ʱFnfPYDMÍF!9IhJPYI!DM*B++Fnf++##~#GnfPYJ GnfDMF!9IhJ!9s#r!9^#V`iJFG!9^#VHG`iI*B|’G!͌?!9s#r!9^#V##"B!!9^#V##s#r!9^#Vs#rI!xH>iHSsxH{iHxH>v0 0>yUHxH*S>v00b!9~nfFxHP>v  iHoxH!SH*UD!LH:UG*S{vLHo&:ROxog!+} 8:RO:Qy*H"fIͦGͪGUHI!9s#r!!9s#rH!9~#fo#s#r!9^#V! NJHUHI!9~#focIH!úH!`r7r͏|g}o|/g}/o^#V#DM!99`iI|z2H͹I:H$J}I}}^I|mI!}mI|^I!}|I}|?>o&zo&|I}|>o&|o&z2H͹I:H$J||I/g}/o#zI/W{/_IDM!>2H))I#}o|gI :H=2HI}:H=2HI}DM!>))J =J}}/o|/g#}|mI^I|g}o{_eJ|J|7g}oKJ{_eJ)`J}}o|gN#F# N#F#zډJ{ҍJ##^#VBK^#VzJ#yʭJ###ÛJ#x¨J#~#fo}|>?o&}|>o&{_eJ|g}oJ|g}o~# xJ!9H~# K!K|ɩ}v{}v{ͷ}}"Kaypro Single DeityKaypro Double DensityOsborne I,ingle DensityOsborne I, Double DensyXerox 820, Single DensityXerox 82 Double DensityTRS-80, Single DensiTRS-80 Model IIIIBM PC, Double DentyTI Professional, Dbl DensityMorr Micro Decision (MD2)Zenith Z-10, Dcon:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:I!9^#V!!9^#VͤLI!!!9s#rL!9~#fo#s#r!9^#V! ͎ILnfBTIMýL!"!!DMM`iDM`i~#3M!9^#V`i^#V}S3M M! ^#V!9^#V!I#!9s#r!9^#V!IzMn&u|zM!"!!9^#V!IʡMn&u|¡M!"!! ^#Vsrn&un&u! Put!9^#V!9^#V!9^#VnfI! 9!͎IM!!9^#VI! 9^#V!͎I,N! 9^#V! ͏I6N!"!! 9^#V)))DM! ^#V! ^#VI! 9s#r!! s! s! s`is!B! s#r! 9^#VI!"KDMâN`i&DM`iRLJʽN!% ^zNÚN!"!!9^#V>N!"!!9^#V!IN!ͺ>!ͺ>TI?O!9^#V!I2O!ͺ>TI!!% s!I!ɄBPuRuRI! 9^#V!͎ICP! 9^#V! ͏IMP!"!! 9^#V)))DM!9^#V!9^#V! ^#V! ^)P^#VII!DM!9^#V$~Pn$&!hJDM!9~#foJP!9^#VBK!9^#VͥQP!!9^#V`ihJJ!9s#rzSQ!9^#V!9^#V`iR!9s#rzSQ!9^#V!9~#fohJXJPY!9^#V!XJPYDM`i!9~#foJʜQ!9^#V`ihJ!9^#V`iͥQʜQ`i!9^#VI! 9N#F!!ͺ>!!ͺ>"TIQ*TIQ!"!!!aSR*|R!!9^#V!9^#V!$ ^!AS!"ͺ>"|?R!!$ ^!9~#foI!$ szqR`i!~#fo#s#r!I!9N#F!ÑR#!9~#fo͎IR`i#DM+^!9s#r!9^#V! TIR! !9^#Vͺ>!9^#V!9^#Vͺ>ÊRJ!RJ"*I!"I*H6S*H!4(S#4*I+"I}Ro&"*I! 9F+N+V+^+~+ngx_Sw# RS!9^#V#N#F#nx{Ss# pS!9^#V#~#foxʡS¦SʡS# ÍS!ڰS!}!}!9^#V#~#foxS~S# S!9~#foS#S}!9^#V#^#V#N#FÍS!9^#V#^#V#N#FS!9^#V#~#foxS~BT# 3TS!9^#V#^#V#N#F3T!9^#V#n~uT{T#hT!|!9^#V#nʗT#ÎTxuT +~—T{T!9~ T T TT!9~AT[T!}!9~aT{T!!9~0T:TT!9~a U{ U o&!9~AU[U o&{T!9~ T T TT!9~AT[T!}!9~aT{T!!9~0T:TT!9~ahJ!9^#V`iͥQʜQ`i!9^#VI! 9N#F!!ͺ>!!ͺ>"TIQ*TIQ!"!!!aSR*|R!!9^#V!9^#V!$ ^!AS!"ͺ>"|?R!!$ ^!9~#foI!$ szqR`i!~#fo#s#r!I!9N#F!ÑR#!9~#fo͎IR`i#DM+^!9s#r!9^#V! TIR! !9^#Vͺ>!9^#V!9^#Vͺ>ÊRJ!RJ"*I!"I*H6S*H!4(S#4*I+"I}Ro&"*I! 9F+N+V+^+~+ngx_Sw# RS!9^#V#N#F#nx{Ss# pS!9^#V#~#foxʡS¦SʡS# ÍS!ڰS!}!}!9^#V#~#foxS~S# S!9~#foS#S}!9^#V#^#V#N#FÍS!9^#V#^#V#N#FS!9^#V#~#foxS~BT# 3TS!9^#V#^#V#N#F3T!9^#V#n~uT{T#hT!|!9^#V#nʗT#ÎTxuT +~—T{T!9~ T T TT!9~AT[T!}!9~aT{T!!9~0T:TT!9~aAACopyright (c) 1983, Non-Linear SystemsNo warranty is made, expressed or implied Kaypro 4 2.0 01-04-83 @10:00am8 9 .=Y+2.=@ >2.=Y+}+>}+:@/o:22<(2 {=ʝҝ<2 +{22=+?pU :=+>!=w#"?=:<ĩ,+:,= *F=+qN1,4O=2,=*F=~#"F=!5, () 'U ') )@ :RRR+QNNNNO OOOOO1E1E1E"E"E"E"E"E"E"E"E#w#w#w: R     >21=Ux¯x 20=*C 5  "P (?D-#~µ~@ w#s#r#*=s#r4͸K:?[j <4~=Z.!]?|Tf (?# . .. . -!V?p#"?=ͩj ."?=~w#~|T -?  n*F=ԃ +! 5  /!3=44 (?H!/!?>͗;Zʹ/*<|.:@<2[?j.!L//!O//*| R     /ʹ//̓ 5  ͩ "?BNo Fatal error(s) Warning(s):=Gj     REPxT G?    > Z> Z:@<> J> 5  nd (^ Ds: !9*)@͍ 4:?!"#@"%@*?#0*)[j *@$͍ >0yT ?Dr0:@<2@:@:@=2@<#~^0[j^07"?:?=zT) ?0U 0"F=0>&2?>1&0:?0>&j*@~ 1zTG ?D~10:@*@~<1=11O+1[j111<*F=zTd (^ H  !"#$%&'j6 Ö10}1ͱ |  D1ù1:0 ʞ: ù1:: 1 1[j:> ;:Þ::zT ?B@~82G+#2~/_2~F2=G+~F2j yT U Ă2=ʦ3%2,Do you want to S)elect a disk, F)ormat a disk, or R)eturn to complete selection, and go to CP/M? ChangePlease put in a disk. S)elect again when ready.Disk Format is Unreadable.Disk Formats not Compatible.Multi Format Disk v. Function Track RetryPress "escape" to abort.Error! VerifyFormat Which Disk, A: or B:? Nothing ChangedUse arrow keys to move around, escape to abort, or return to accept.Permanent disk error encountered at track # Format aborted by User.Disk formatted for: Formatting: No errors DetectedI can't format a write-protected disk! Take off the protect & try again.Please put in a disk. F)ormat again when ready.Remove program disk, insert new disk. Press return: Are you sure that you want to do this? FormatFormatting erases any information that might currently be on the floppy =6:@Kaypro Single DensityKaypro Double DensityKaypro Double Sided/DensityOsborne I, Single DensityOsborne I, Double DensityXerox 820, Single DensityXerox 820, Double DensityTRS-80, Single DensityTRS-80 Model IIIIBM PC, Double DensityIBM PC, Dbl Sided/Dbl DensityTI Professional, Dbl DensityMorrow Micro Decision (MD2)Zenith Z-10, Double DensityNEC PC-8001aͳK!**~!!!@!!@!!!!!!0!9 !EͳK!!9s#r" !9~#fo#s#r+!9^#V!XͪLY~#u!9^#V!XͪLW^#VyV!9s#r*,Lg*o!9^#V"!9^#V"*K"!!9s!9~!!!%.!!XA!!{.!!{.!! {.!! {.!! {.!!$ {.!!XAͯ.!9s:o&Kz!!!%.!!XA!!!!!9^: o&Kʲ!!!%.!!XA!9^: o&K!!9sÙ!!XAͳK!!XA!!!%.! !!%.!{.! !3!%.!!9s#rN!9~#fo#s#r!9^#V!,Lm!9^#V?*) *!!+!9!!9s#rì!9~#fo#s#r!9^#V*L!9^#V*L!9^#V*,L!9^#V!9^#V*M+]ÝKaypro 42.0(c) Kaypro CorporationͳK!9^#V!Kʣ͑!9s#r!KK!M _!9s#r!Ke!9^#V#!!.K£!!T !!%.!!9^#V!XͪLh^!͢K!!9^#V!@L! vA!!9^#V!PL! vA!!9^#V! vA7!! !!%.!!9^#VU!9s#r!9^#V!XͪLh^!͢K!9^#V! ^#V!^!͢KLʫ!! !!%.!!9^#V!XͪLj^!K!!9^#Vs#rl!9^#V! ^#V!/! 9s#r!9^#V!XͪLj! 9s#r!9^#V! ^#V!/!9^#Vs#r! 9^#V^!Ll! 9~#fo#s#r+^!9~#fo#s#r+s-!!9^#V!XͪLY!9^#V! ^#VU!!9^#V!XͪLW^#V!9^#V! ^#V!U!!9^#V!L! vA!9^#VͳK͑! 9s#r!K+!!!%.!!XA! _!9s#r!Kd!!!%.!!XA! !!%.!!XA!{.! {./ͯ.! 9s!!!%.!!XA! 9^!YL!9~#!{.! {.-K!9^#V#!!.K4!!Q !!%.!J@͢Kc!! !!%.!! !!%.!! 9^#V!XͪLW^#V{.!!!XA!}2! 9^#V!XͪL^#V"U!"S! 9^#V! 9^#V!XͪL^#VͲK!9s#r*S4G!"S!9~#q!9^#V! 9^#V!! !!%.!!XA! 9^#V!XͪLW^#V{.!{.! {.!9^#V!Kʣ! !!%.!!XA! !!%.!9^#V+$/{.!!XA . ͳK!Q!!9^#V###%.!9^#V!A!XA!R{.!9^#Vw!9s#r!9^#V!{.!!XA: ͳK!!9^#V!L! vAͳK! 9^#VU ^#VͳK!^!!%.!!XA!F !!%.!f {.!y {.!!!9s#r!!9s!!9s!9~!!9^!9^#V]!! 9s#r! 9~#-ì!! 9s#r!! 9s#r!! 9s#r!! 9s#r!! 9s#r!!9^!9^#V]!!1M = K Yg u-! 9^#V!K!9^#V!K!9~!!!!]!! 9^#V!K4!!9s!9^#V! 9s#r!9^!9s!!9s! 9^#V!Kw! 9^#V!K!9^L!9s! 9^#V!Kʸ!9~¸!! 9s#r!!9s! 9^#V!K!9~!! 9s#r!!9s! 9^#V!K?!9^#V!L!9~#fo+s#r?*+!9s#r!9^L!9n&͈M!9s! 9^#V!Kʝ*+!9^#V,Lv!9~#fo#s#r+Ý!!9s#r!9^L!9n&͈M!9s!9~!9^#V*#*L!!9s!!9s#r!!9^! 9^#V]!!9^!9^#V]!!9~/*!9~#fo#7!9^#V!9s#r!9^#V*,LZ!9^#V]!ͳK!!9s#rÃ!9~#fo#s#r+!9^#V!,Lʣ!!XAr!9^#V!!%.! {.!!XAͯ.!9s!AK!!9s#r"!9^!BK !!9s#r"!6 !!{.!!}2R!9^#V#J͢KL}2Q:Qo&͢K}2Q!9^#VͳK!!9~y*|!!9^#V!%.!9~ʧ!9^#V*#ï!9^#V!9s#r!9^#V!-L!9^#V*,L!9^#V!XͪLW^#V!- !9s#r!9^#V^z!9^#V!L:o&|,!/!{.!9^#V~!9^#V^! Kʇ:o&|f!_i! !XA!9~#fo#s#r+:o&|ʮ!9~#fo#s#r+^͖W!9~#fo#s#r+^!XA4!!9~*!##!9^#V!%.-> ͳK! 9^}2ͳKͳK! 9^#V!XͪLh^!͢K!9^#V#!!t%ͳK!!9^#V͗!!t%ͳK!!9^#V͗!!t%ͳK!!9^#V͗!}2!}2!!t%ͳK!!9^#V͗!!t%ͳK!!9^#V+#:J'!}2}2! )R+! )͒+*S4G!"S!!9^#V͗!!t%ͳK!}2!!9^#V͗!}2!!t%ͳK!}2"!}2! 9^#V"*XͪLh^!͢K! }2!}2!}2:Qo&͢K}2Q!9^#V"L*XͪLY^#VK"!}2*UqE"S|H !E*XͪL^#V!!N:E*XͪL^#V!! !:E! !!:E!!#+s*XͪLh^!͢K!!!9s&!!!9s&!!!9s&!!!9s&!1M   !&!*XͪL^#V*MLS!!!DMa!`i#DM+`i*,L"!!N:E!!!:E!!!:E!!#+s`i)s#r!#+s!#+s*XͪLPY^#+s!9^#+s!#+s!!N:E!! !:E! !!:E!!#+s*:o&:E*!#+s!N:E[!*SMDM*U,L#*UPYM!N:EͳK!}2}2}2"!}2!9^#V":Qo& L͢K}2Q!@!9~#foL"*XͪLY^#V"*Lʈ#*K+*L"!}2*UqE"S|­#!E! !:E! *L$!!:E!!#+s!!:E!!!9s#r!DM.$`i#DM+`i*,LG%!!:E!!#+s`i)s#r!#+s!#+s`i##+s!9^#V+#+s!#+s! !:E! !!:E!!#+s*:o&:E*!#+s!!:E!($*SMDM*U,Ls%*UPYM!:EͳK:J!9~#ʉ%DJ'!9^#V}2æ%:o&#}2:o&'L':o&|%:o&)%:o&}2! )R+! )͒+͢K%)*|&*!!XAK&!:Qo&!9s!:Qo&͈M}2Q:o&|ʷ'!!9s#rb&!9~#fo#s#r!9^#V*,L&!!9^#V)^#V#s:o&!9^#V)^#V##n&s:o&!9^#V)~#fos#rS&:o&#}2! )R+! )͒+͢K&)*| '*!!XAK#'!!!9s#r@'!9~#fo#s#r!9^#V*,Lʴ'!!9^#V)^#V#s:o&!9^#V)^#V##n&Ms:o&!9^#V)~#foMs#r1'':o&|'SJ!9^}2QDJÛ%!9~'*S4G!"S*ͳK!(#*,L7()^#V##^)!9s#r(!*)!9s#r*LDM`i,Lf(!DM!y(#*,L))!9^#V!Kʶ(#*Kʳ(!Æ()!9^#V)s#r!)!9s#r`i*L)*Mr(!*)s#rͳK!}2/):o&#}2:o&,L):o&|R)! ):o&Kʖ):o&|ʖ):J!DM|)`i#DM:o&`i,Lʓ)DJw)ð):o&|ª)DJHJð)HJDJrJ͒+͢K)$):o&#"! )ͳK:o&|R*!}2. !"/ !}21 !}2! !!%.!!XA! !!%.!5!!!+!9!}2:o&|ʵ**/ ! 9~#foLʅ*! 9^#V!!%.!L+!1!%.:o&0!XA!}21 6+*/ ! 9~#foL*! 9^#V!!%.:. o&:o&L+:o&$/!(!%.!M+{.:1 o&|/+!P+!1!%.!}21 ! 9^#V"/ :o&}2. ͳK!DMd+`i#DM`i*,Lʇ+:o&`i)^#Vs_+!}2rJͳK!DM`i^#V!L+*XͪLh^!͢K! 9`i##DM++^#V͑J!9s#r!<͢K+!9^#VÜ+!ͳK!9^#V!9^#V!9^#V!9^#Vͣ,!9!9^#V!9^#V!9^#V!9^#Vͣ,!9!9^#V!9^#V!9^#V!9^#Vͣ,!9!9^#V!9^#V!9^#V!9^#Vͣ,!9ͳK! 9^#V!9~#foK-!-!9^#V!9^#V%.!9~#fo#s#r!9^#V-L-!-!XA,!+!XAÃ-!-!9^#V!9^#V%.! 9~#fo#s#r!9~#fo,Li-!-!9^#V!9^#V%./-!-!9^#V!9^#V%.++|+ͳK!9~#¡-!-!9^#V^!9^#V^L-!-!9~#fo+s#r!9~#fo#s#r!9~#fo#s#r͌-ͳK!!XA!9sz..!9^ͳK!!XA!=!XA! 9^#V!!XA!9^#V!!XA!9^#V{.ͳK! 9^#V~ʮ.! 9~#fo#s#r+^!XAÀ.ͳK!!XA!9sz.ô.!9^! ,L.!9^!@#/!9^!`,L /!9^!|-L/!9^#/!9^!ͳK!0}22 !}23 ! 9~#X/! 9!9^#V!2 \/!2 ͳK!9~#|/!!9^#Vs/!9^#V!9^#V! K!9^#V#\/!9^#V^#V! FL0!9^#Vs! !9^#V~#foKs#rͳK!!9s#r0!9~#fo#s#r!9^#V!,L 0!!XA/*^#VRp1!9~21~21~21~21~21~ 21~ 21~21~21~2121nf?nf?~21*-"7">^#VS>*">^#VS>*?*"}1*"q?"?v"nf"52n f "?!Put"?! ut!@|1Rnf##nfut>2121212121212121[!|1{;.104!lX.105\@S.SBa%lXST8t8888 lX.107!klX.1y˹˱!1o0$y21O21GMy!1_!16ˡ!|1yݾ8(=ݾ0<ݖOm*?y2*1!|1y226 666*1~0606 0606 ~w*1~w*1~w *-?yw22*f"2!E"fs4!"f!1#!T8:10!d8"1!t80!8"1"1"1"1!|16666×3!|16qy $~2~w~w~w~w~w~(@5~ݾ 5~ݾ -~ݾ %~ݾ 4~ 8 64 4666*f"3!E"fͱ3!"f6-Nq~0q~ 6 ('~ݾ! ~"ݾ ~#ݾ ~ݾ$(*~57~w!~w"~w#~w$~66~2N~=g."9^ V ~ 6~( ~/#~~-657~-yv 6g!"f~(<=(!q!|1~2~ w *f"5!E"f5!"fo6N xݦ ݶݶ/ݮ y>66o6~N x G~~(90~ݦ ݶ/ݮ N yqy>6NͰ5N xݾy(>N xݦ ݶ/ݮ y͒6N xݦݾ~/Gxݶy!">>*>s#r>*>s#r2z v87t7w- ( 5̈́4N~0[T8u6 ~!Os4N"F#6~$OW6.77(  ($5f>v% 6w-- >F!"9!"9FN/~!RKaypro Single Density(?DKaypro Double Density(?Kaypro Double Sided/Density=t8"=B==8Z=z=R_!lX.196No Disk Entered.!lX.198 lX.200 lX.201 lX.202 alXSNo Disk Entered.lXFORMAT_ lX.203a_lXDBL_SET_ lX.204 lX.205 lX.206 lX.207@5iURESTORE_alXVERIFY_alXTRACE_ alXPUT_TRAC_ aZlXCHK_TRAC_ a-lXF_INVERT_ lX.208 lX.209!lX.210!lX.211k@S.RS@\NWALLOC_!lX.212@6NWFILL_!lX.213,d!lX.215!lX.214!lX.216!lX.217!lX.218!lX.219d!)lX.221!#lX.220!lX.222!lX.223 lX.224;l@NW.LS!PlX.225!ulX.226!lX.227 e!lX.229!lX.228!lX.230!;lX.231 lX.232!QlX.233@viUSTEPIN_xe!nlX.235!clX.234!lX.236!lX.237!lX.238!lX.239 alXON_ERROR_!lX.240!lX.241!lX.242f!*lX.244!lX.243!lX.245!lX.246!lX.247!lX.248!lX.250!lX.249!|lX.251!lX.252!lX.253Eh@TWTRASH_!lX.254 lX.255f!lX.257!lX.256!lX.258!.lX.259$g!AlX.261!:lX.260!lX.262!NlX.263!~lX.264!{lX.265!lX.266 lX.267g!lX.269!lX.268!lX.270!lX.271!^lX.272g!DlX.27:> H͈>(:.6>.->[!2O ~!2[^!! ">>2>*>N#">:>=2>y~y2>y:>(!>5 $#5 .'>!>[>!>[>:.3(.*s?1?:1Oxy>&{?x˿y!|1qC1C1lX.287!lX.28ð51?? ?23     !|1"!">22!?~A2??!??!8?~ݾ(!??~A!?w?!??!8?!??!~8wN {Warm Boot} ?:= a lXLINy#1111111111 2*292<2A2E2H2[2222222222222222222333)33334!434m4z4}44444445555$525F5c5r5|5555555566E6R66666666666 7"7+727=7@7M7e7x77777\8^8`8b8l8n8p8r8 >&>3>8>f>k>n>s>v>z>>>>>>>>>>>>>>???.?1?4?7?:?=?@?j??????????????????W1ͪ GA͛M[A͛M*KDM*Ko&͛MyAo&͛M*K*+++*KDM*K!9N#F#^#Vkb6#> 6 #=¤A>6#=­A : >A AB[A@AaB{B`w# .ABA!Bw#A{o|g B!Bw#B!!|a{ !9^#V*?A!9}|LB*?A"?A|!!#lX.336!#lX.338@$!.LNPRMi~ul^+s!PYODMKl0123456789ABCDEF/u ؚl :دlׯl%e=P;>P;@ %=.=-l>.=.t# t$l=p"ͳK!!!BU!:o&͢KBs!D"QB!BDM!" C* C,LD`i^! KvC`i^! K~C`i#DMZC`i^zD`i^!>KʟC!óC`i^!<KʒD!`i#DM^! KC`i^! KCóC`i`i#DM~D`i^! KD`i^! KD!`i#DM+sDCͥP|1D!"O?D!BOKʏD!D!TV!ͿV!E!ͿV!yV!!ͼR! ED`i* C#" C+)QBs#r`i#DM~D`i^! KD`i^! KD!`i#DM+sDæDMC!QB* Cͪ ECan't open file for redirection: ͳKGAͳK!"!ͳK!!9nf]TNFy( ~w y(1J1J1J1J1JͳK!9^#V!fMʑE!!9s#rI*eE!9s#r!eEDM~#sF++nf!9~#foXM\Fnf!9~#foMfMEnf`is#r!9~#fo!9s#rnf++!9^#Vs#r!9^#Vsrnf!9~#fo##s#rs#r!9^#V`is#r!9s#rnfçE!9!9~#foM!9s#r!9^#V!9~#fofMʾF2H»F!!G! XA!ÑE!9^#V++!9^#Vsr!9^#V!9~#fo##`is#r!9^#V##*B`i^#V+!utut!9^#V Out of Memory $ͳK! 9^#V++DM!cE##^#Vz1H++PYgM.H`i##ut##! s#reELG++nf##PYKG`i^#V##~#fos#r##utDM`i^#V`i##K*H##~#H!! s#r*Hnf##`i~#fos#rnf! s#r!KGͳK*mEͲK*kEͲK*iEͲK*gEͲKLLLͳK*gE! 9~#foLI*iE! 9~#foLI*kE! 9~#foLI*mE! 9~#foLI*gE*oEKH! 9^#V"gEI*iE*oEKH! 9^#V"iEI*kE*oEKH! 9^#V"kEI*mE*oEKI! 9^#V"mEͳK!DM*eE++6Inf++##~#OInfPYDM+I!9͢KMPYͳK!DM*eE++ÈInf++##~#ʭInfPYgMʪInfDM}I!9͢KM!9s#r!9^#V`igMI!9^#VI`iͳK*eE|0J!*B!9s#r!9^#V##"eE!!9^#V##s#r!9^#Vs#rͳK!K>KSsK{KK>v0 0>yJK*S>v00b!9~nfFKP>v  KoK!J*UD!J:UG*S{vJo&:ROxog!+} 8:RO:Qy*,K"fͳKDJHJJ͢K!9s#r!!9s#rgK!9~#fo#s#r!9^#V! NfMʖKJ͢K!9~#foLʓK!XK!sityTI |g}o|/g}/o^#V#DM!99`iͲK|z2KWL:KL}pL}}K| L!} L|K!}|$L}|?>o&zo&|>L}|>o&|o&z2KWL:KL||bL/g}/o#zpL/W{/_pLDM!>2K))҃L#}o|gқL :K=2K{L}:K=2K{L}DM!>))ҺL =²L}}/o|/g#}| LK|g}o{_M|{M|7g}oL{_M)L}}o|gN#F# N#F#z'M{+M##^#VBK^#VzQM#yKM###9M#xFM#~#fo}|>?o&}|>o&{_M|g}o{M|g}o~# xM!9K~#«M!M|!!!9^: o&>ʲ!!%.!!^9^: o&͈!!9sÙ!! !!!!!%.! !!%.!{.! !!%.!!9s#rN!9~#fo##r!9^#V!\m!9^#V?* *!!+!9!!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:ͳK!9^#V!!9^#VBOͳK!!!9s#rtO!9~#fo#s#r!9^#V! ,LʖOnf"EK O[O!"!!DMðO`iDM`i~#O!9^#V`i^#VVOèO! ^#V!9^#V!͢K#!9s#r!9^#V!͢KPn&u|P!"!!9^#V!͢K?Pn&u|?P!"!! ^#Vsrn&un&u!Rut!9^#V!9^#V!9^#VnfͲK! 9!,LʜP!!9^#VͳK! 9^#V!,LP! 9^#V! -LP!"!! 9^#V)))DM! ^#V! ^#VͲK! 9s#r!! s! s! s`is!"E! s#r! 9^#VͳK!MDM@Q`i&DM`iNfM[Q!% ^zeQ8Q!"!!9^#V͑AʀQ!"!!9^#V!͢KʚQ!XA!XAKQ!9^#V!͢KQ!XAKQ!"!Q!9^#V!͢KKQ!"!!!! s#r!# s!$ s`i!9^#V!s#r!9^#V!͢K#!% s!͢KWR!R!9^#V!s#rjR!nR!9^#V!s#r!ͳK!!9^#V!%s!ͳK! 9N#F!XA!!% s!ͳK!"E,SUUͳK! 9^#V!,LR! 9^#V! -LR!"!! 9^#V)))DM!9^#V!9^#V! ^#V! ^)R^#VͲKͳK!DM!9^#V$~ʌSn$&!MDM!9~#fogMtS!9^#VBK!9^#VCTʌS!!9^#V`iMsM!9s#rzS!9^#V!9^#V`i͖U!9s#rzS!9^#V!9~#foMLPY!9^#V!LPYDM`i!9~#fofM:T!9^#V`iM!9^#V`iCT:T`i!9^#VͳK! 9N#F!!XA!!XA"K~T*KʙT!"!!!UåT*|ʥT!!9^#V!9^#V!$ ^!U!"XA"|T!!$ ^!9~#fo͢K!$ szU`i!~#fo#s#r!ͳK!9N#F!/U#!9~#fo,LʊU`i#DM+^!9s#r!9^#V! KrU! !9^#VXA!9^#V!9^#VXA(U͛M!ÛU͛M"*K!"K*KU*K!4U#4*K+"K}œUo&"*K! 9F+N+V+^+~+ngxUw# U!9^#V#N#F#nxVs# V!9^#V#~#fox?VDV?V# +V!NV!}!}!9^#V#~#foxvV~vV# eV!9~#foʎV#ÅV}!9^#V#^#V#N#F+V!9^#V#^#V#N#FeV!9^#V#~#foxvV~V# VeV!9^#V#^#V#N#FV!9^#V#n~WW#W!|!9^#V#n5W#,WxW +~5WW!9~ jW jW jWW!9~AW[W!}!9~aW{jW!!9~0W:WjW!9~aڧW{ҧW o&!9~AڽW[ҽW o&W!9~ jW jW jWW!9~AW[W!}!9~aW{jW!DM`i!9~#fofM:T!9^#V`iM!9^#V`iCT:T`i!9^#VͳK! 9N#F!!XA!!XA"K~T*KʙT!"!!!UåT*|ʥT!!9^#V!9^#V!$ ^!U!"XA"|T!!$ ^!9~#fo͢K!$ szU`i͝:͝E<ͥ͝N= = =Y ͝>B2pͥ ( =2pCA'͝>V2qͥ$͝͝ = (2q͋&#:pA2kw>2i2k>2ji2s#r++w^#V ^#V />V2q!F#~ (ͲCA2pʆ;#~ ( :( Ͳ2qÆÆ͝;͝_T͝:pAE 2kA2w+~(GO!  ͝!"m> 2i2i:q!7 $͝a{ SETDRIVE V1.3a  $ CURRENT SETTINGS: $;H ;@: $VISUAL 1050VKAYPRO K AMIGO SS A@xRAINBOW RbDEC VT180 DMORROW MOSBORNE IDDO(?( $?(?(^ (? Change current setting? [N]$Invalid drive $ Drive? [B]$ $ Media Type ? [V] A=Amigo SS V=Visual 1050 R=Rainbow O=Osborne I DD K=Kaypro D=DEC VT180 M=Morrow ;H ;@$ Insert  disk into the  : drive Press Retn when ready Press SPACE to abort$Error in media type $DISK FORMAT ERROR $DIR A: NEW SETTING IS $ (2q͋&#:pA2kw>2i2k>2ji2s#r++w^#V ^#V />V2q!F#~ (ͲCA2pʆ;#~ ( :( Ͳ2qÆÆ͝;͝_T͝:pAE 2kA2w+~(GO!  ͝!"m> 2i2i:q!7 $͝a{ SETDRIVE V1.3a  $ CURRENT SETTINGS: $;H ;@: $VISUAL 1050VKAYPRO K AMIGO SS A@xRAINBOW RbDEC VT180 DMORROW MOSBORNE IDDO(?( $?(?(^ (? Change current setting? [N]$Invalid drive $ Drive? [B]$ $ Media Type ? [V] A=Amigo SS V=Visual 1050 R=Rainbow O=Osborne I DD K=Kaypro D=DEC VT180 M=Morrow ;H ;@$ Insert  disk into the  : drive Press Retn when ready SETVISO1.CO i revisio o th SETDRIVE.CO progra distribute with the Visual 1050 computer. Thi Versio allow th Visua drive t b se t th Osborn Doubl Densit format I run onl o th Visua 1050 SETDRIVE i documente i Visual' documentation I i sel promptin o ca b comman driven e.g A>SETVISO B: wil caus th driv t b se t th Osborn D forma fo rea an write Th sourc cod ha bee sen t th Visua User' Group c/ Ra Dobbs 490 Alburt Road Huntsville Alabam 35816-1103 I ca b fairl easil modifie t suppor othe format includin Osborn Singl Density i th require disk parameters are known.*+%"'%"%%"# "t "r "py 6"E+6+!^6*F+N+:I3!!9~#ʖ QO"j'j +}|+#~ʁt6#~#<ʶ>!4Q6#6*!* |ʳ͉!ͼ"r!ͼ" Q Can't open > or < file.$çw*4 y'! 9k!"42*}ʝ4::D<*E 2D ̓H  ‚> _*E~+#4N s> > !ͦ:G¼H2D_~ÿ   >  ʚ!* }͗> !ͦ}  > _ !"# con:rdr:pun:lst: ڸ_~O7!  #i& ~!N~#~#F6,pw62=!9y=͛:>wN<!Ms 6#6 ~+† s#r{{ ڧ!ͦ#^!!/w#w!M~<6 !b~rG!T}*Kxu>w#%{=͛box h&{ !~~!TN#FwG+wO#s{ ک+!9~ !i~b!5> 6> *K w`i#᯾%,!|!!9n&:ʗɯ2>D`:!9!=:w!/xw;#4>2>2:Gexʰ:O}! DMR:° !öWrite error - Disk full $`iͭ!9~=+͛V+^+F+N~og~#fos#r}o|g}o|g}o|g|!,|}!%%,ɯ|!|}!-N|N}zc!_--{!-ze{eze{e!||g}oÉ|g}o×)ä{ozg+|/g}/oDM!z>S\)) =ɯz|MD!x<z>jS\>)) #  =ʹôN#F#x9~#~#"" "> w+ Cw w##w w #~+:n~##͓@~#.͓n*++͓w#Å*a O!p ~_#V!$ r+sbk#| !9"*++"Z *!9y *++"2 *++"}2:*++"l *++""**++"ͅ !!9l !9}2!9"͡ !9"!!9l * ʺ *   *#"+ á :! !91 *#"+!9}*61 !9:͗1 1   *#"+'D !"*!0Ci *!9D ʖ u J * ͼ*#"+"r ! }2! ""!"*#"+R !"!9 o !0}2!"!9 o !0}2!"!9 o !9 o !9|D !9#+ *+" ! ͨ o o  d u o x c s͡ !9! Nʓ !90â !9A *+"!C : è 0* !9" *+"#*' * .|g| *+"#* ʹ" !"* *z( * !k L ͨ *|A !- * s ú *'f * !͖Ê *'ʀ * ! Ê * !͖ *'ʪ * ! õ *+* s " !9* * * * * * * * !" !O9* }!!V9!!T9!" * ))))!X9NʸW * #" 4 * ))))!T9" !" * !3Nʙ Ë * #" p !9* 6 Á !936!" * !Nʤ * #" é * * " !F9! * 3 !F9#'* )!960* )#!9!H9}!F9# 2!F9##' d* )!9!H9}* )#!9!H9#}!F9# ~!F9##  ʑ!F9###' ʻ* )!960* )#!9!H9##}!F9# !F9##  !F9###  * )!9!H9##}* )#!9!H9###}!O9* }!O9! CM!O9!zD k* "!9!Q9}!O9! NŒ!O9!z? ʡ* "!96.ú !!9M !!N9͸1}" " " " " " " " !@9Memory dump at %x %s %x%s Hit return to continue  !9M:2B:2L!9DM:2_$!9M:2q!9M:2!:2':2*!#!$!*$!N$!p$!$!$͸1"*}2! "! "! "* !$͸1"*'q*'ʇ!c"*'ʯ!$͸1"*}2*'ʿͱC!#%ͧ***,!"*! DO*#"+!"*2!"*a*ͼ*"*N*sͅ!?}2!*n."*'ʵ!=%!s}2!"!"! "!@"!:"!"!"!"*'0!i%!%!%!%!&!d}2!"!"! "!P"!<"!"!"! "*'ʕ!#&!O&!t&!s}2!"!"!"!@"!`"! "!"! "*'!&!%!&!&!'!,'!d}2!"!"!"!@"!c"! "!"! ":'I!;'!^'*ͧ!v'*"**+*!DÄ*#"+Z!"*2!"*a**ͪͼ*"*N*sͅy!'"""***!96!96.!96!"**+Dʪ/*#"+*)))))*"! 9*}!9! 91t!9! 91 ʌ!9! 91 ʧ*#"+**$"""!9****!"!!9!+9/!'9!)9!! 9!+9/!9!9! 9{0!'9"*"!'9"*"!'!9**!'!$9͸1}!$9'ʰ!9*""""!9;*!96 !'! 9!"!9^"*+ ! (!9*+ 3!9*N ʺ!9*'ʁ***"**1ʁ!(!"!9!9*n.!E(!9! 9*͉"3*****!":'!_(!9!9*+'S!s(!(!(! 9͸1}*+ *"**!*NË*#"+c:'ʰ!(***2*a*s**ͪͼ*"*NͅÀ"""""**!9++"**ͼ"**"**"**ͼ*ͪ"*))"!":'ʢ*!"*)*1ʕ!"*!"""***!"!"**N2*#"+**n."!(***'*#"+*!#?/*""""*C*A*?:'u!)! 9!9"C*C ʗ!9*D !9*n."C!9:'!0)! 9**+'!"C!9#+:'+!F)! 9+*C E!`)!"!9+"?"A"C!9*\!"\*\! DʪÉ*\#"\+m*\##!9!9*\}~!96A!9#6:!9!|)ͼ"\*\!?*\"\!9!~)!9!"!9**!"!)!)!9*@+!9Ͷ!)""!9*e*c*a*_*"**+*!Dç*#"+}!"a*a2!"*a**ͪͼ*"e*eN*s͏Ü*))"c!"_*_*cDʗ"*_*c"_*_"**_+*cDʔJ*#"+(!"a*a2!"*a**_ͪͼ*"e*eN*s͏?"_"a"c"e!9*******!96 !"*!D*#"+!9*!$9*}!9# p!"*!CpR*+"#6*##!9!9*}G!96A!9#6:!"*!Dß*#"+Ã!"9**##!9}Ô!)!9!"!9!)ͼ"*'!)"""""""!9!E"!$*"!"***="*!?i*' ! *!!9****"*""**"***="U!6****'*͜"!"9**+ g!g**͉;*) *' *% *# *! * * * !w*!*!9!*!9!*!9!96!96!" * !?D! * #" +ç * )))))*" !9* }!9!9!!9!9 !!ø !" * !DC!6!* #" +!* * 6+!* ") *) !9* ") *) !9!" * ! Dʢ!Õ!* #" +y!* * 6 Ê!* "! !" * ! DV"!* #" +î!!9*  !!9*   "*! !9* }*! #"! !9* ';"* "! !9* 'S"V"ÿ!:'x"! * !* " " " "! "# "% "' ") 3;!*!*!9!9!*&,3;*"*"*"*":'#!+! 9!""! 9*""*"*!*Nʴ#Q#*"#""+)#:'v#!+**"*"2*a*"s*"*ͪͼ*""*"N͏F#! 9#E""! 9*"*&,*"""""""""3 Program PCPIP - Osborne Rev 2.0 CPM / PC-DOS file transfer utility Developed by Eric Leininger Insert CPM disk in drive A, PC disk in drive B Hit return to continue... Source for copy? (c=CPM, p=PC, r=reset, e=EXIT) Change disks and hit return to continue... *** End of PCPIP *** ..Single sided diskette, 8 sectors/track.. ..Double sided diskette, 8 sectors/track.. Note that PC to CPM file transfers will fail if any data is on side 2. Also only 80 of the 112 directory entries are available. ..Single sided diskette, 9 sectors/track.. Note that only the root directory is available. ..Double sided diskette, 9 sectors/track.. fail if any data is on side 2, only 64 of the 112 root directory entries are available (sub-directories are not supported). *** ERROR - UNRECOGNIZED DISK *** First fat entry = %x Please wait - reading IBM directory... Thank you. File = %s ; %d bytes ; %d = 1st cluster Copy to disk A:?(y/n) Copying file %s PC => CPM First cluster=%d *** WRITE ERROR, COPY ABORTED *** %c Next cluster=%d Reading cluster %d ***OOPS - attempt to read flip side*** ---Cluster skipped, copy continuing-- Hit return to continue Reading Osborne track %d sector %d FAT of %d = %d Looking for free cluster at %d Cluster %d, side %d Found free cluster at %d ***ERROR - PC disk full*** wCan't Open: %s OK, CPM to PC file transfer Enter file name:...Copy complete Copying file %s (CPM => PC) rb*** Can't open file *** %c Have read %d, cluster = %d, next = %d End of read, last read was %d, last write to %d Copy complete Make PC directory entry... Name = %s First Sector = %d Length = %d New dir entry = Close PC fat chain... Last Sector = %d Writing cluster %d Writing Osborne track %d sector %d *>+*<+!">+6"<+*<+!aCm+*<+!zD ʁ+*<+A"<+*<+ ʝ+*>+!9N +!9*<+}!9! 9#*>+#">+6"<+*<+!aC+*<+!zD +*<+A"<+Á+!96"<+">+;*$,*",* ,*,*,*,*,*,*,*,*,!",!",!9!!9",!9!9*,}!9!9*,#}!9",!9",!,",*,#",*,6!,",*,#",*,6*,!",*,!"",*,))))*,ͪ" ,*",))))*,ͪ"$,!9!",*,ͼ!9ͪ!",*,ͼ!9ͪ*,))))ͪ",!9!)!!9ʭ-*,))))*,",*",))))*,",!9!)!!91-*,))))* ,",*,))))*,",!9*,}!9*,}!9*,!9}!9*,#!9}",",",",",",","," ,"","$,3*l.*j.*h.*f.*d.*b.*`.*^.*\.!"j.!"l.!9!!9"\.!9!9*\.}!9!9*\.#}!9"j.!9"l.!j."`.*`.#"`.*`.6!l."`.*`.#"`.*`.6*j.!"b.*l.!"f.*b.))))*j.ͪ"d.*f.))))*l.ͪ"h.!9!)!9ʖ/*h.ͼ*b.))))*d."^.!9!)!91/*f.ͼ*h.))))*b."^.*^."\."^."`."b."d."f."h."j."l.*/*/*/!"/*/!9NX000*/#"/0!9*/"/! 9*/*/}&0! 9! 96"/"/"/*y0*w0!"y0!"w0*w0!N1ê0*w0#"w0Ï0!9*w0 0!9*w0  1! 9*y0! 9*w0}*y0#"y0à0!"w0*w0!Nʝ1%1*w0#"w0 1!9*w0 P1!9*w0  ʚ1*w0't1! 9*y06.*y0#"y0! 9*y0!9*w0}*y0#"y01! 9*y06"w0"y0*1*16"1*1!AC1*1!ZD 1*1a"1*1"1*1 26"11*1"1"1! 9*y06"w0"y0*1*16"1*1!AC1*1!ZD 1*1a"1*1"1*1d.*b.*`.*^.*\.!"j.!"l.!9!!9"\.!9!9*\.}!9!9*\.#}!9"j.!9"l.!j."`.*`.#"`.*`.6!l."`.*`.#"`.*`.6*j.!"b.*l.!"f.*b.))))*j.ͪ"d.*f.))))*l.ͪ"h.!9!)!9ʖ/*h.ͼ*b.))))*d."^.!9!)!91/*f.ͼ*h.))))*b."^.*^."\."^."`."b."d."f."h."j."l.*/*/*/!"/*/!9NX000*/#"/0!9*/"/! 9*/*/}&0! 9! 96"/"/"/*y0*w0!"y0!"w0*w0!N1ê0*w0#"w0Ï0!9*w0 0!9*w0  1! 9*y0! 9*w0}*y0#"y/**************************************************/ /* PCPIP - CPM to PC-DOS FILE TRANSFER UTILITY */ /* Written by Eric Leininger */ /* 2647 Welsford Rd. */ /* Columbus Ohio 43221 */ /* */ /* Do whatever you want with this program, */ /* except please do not sell it or any parts */ /* of it. */ /* */ /* This program does direct calls to BIOS */ /* routines and as distributed will work only */ /* with Osborne 1 machines. */ /* */ /* For those of you who know C well, sorry if */ /* some of my techniques are crude. One of these */ /* days I'll read my manual. */ /* */ /* Most of the technical information regarding */ /* how this works (i.e. what is the fat I keep */ /* talking about) can be found in the IBM DOS */ /* manual Appendix C. */ /* */ /**************************************************/ /* Compile instructions: */ /* -Developed using the C/80 compiler 2.0 */ /* and the M80 assembler */ /* -Needs to be linked with: */ /* CLIB.REL - C80 Library */ /* DUMP.REL - debugging routines */ /* BISOCALL.REL - BIOS call interface */ /* PCLIB.REL - miscellaneous routines */ /* (some specific to PCPIP) */ /* PRINTF.REL - formatted print routines */ /* END.REL - end marker */ /**************************************************/ /* Change History: */ /* Rev 0 12/29/82 - Original Release */ /* Rev 1 8/09/83 - Added double sided */ /* Rev 1.1 2/3/84 - Forced drive a: on */ /* IBM to CPM xfer because */ /* of problem vith vector */ /* version */ /* Rev 2.0 3/10/84- Added support for DOS */ /* 2.0 (9 sectors/track) */ /**************************************************/ /* Known Problems: */ /* -Does not look at all directory entries on */ /* a double sided disk (its on the flip side)*/ /* -Will not correctly display the size of the*/ /* PC-Dos file if over 64K. */ /* -Can create duplicate directory entries on */ /* the PC-DOS disk. */ /* -BIOS errors are not trapped */ /**************************************************/ /* Note undocumented features: */ /* -Entering 'y' before hiting return after */ /* inserting disks invokes the DEBUG mode. */ /* -Entering 's' at menu displays the FAT */ /* chain */ /**************************************************/ #include PRINTF.H #define BDOS 5 static char *copybuf; /* copy buffer */ static char *dirbuf;  /* point to pc dir */ static char *fat; /* point to file */ /* allocation table */ static char debug; /* y for debug = yes */ static int f1,ferror; /* file flags */ static char disktyp; /* s=single; d=double */ static int secclus; /* sectors/cluster */ static int cluslen; /* cluster length */ static int secoff; /* sector offset of */ /* first cluster */ static int dostyp; /* 1=1.1; 2=2.0 */ static int sectrk; /* sectors/track */ static int fatsec; /* first fat sector */ static int dirsec; /* first dir sector */ static int dirnum; /* number of directory*/ /* entries */ static int maxfat; /* highest cluster */ static int side,track,sector; /* these always refer */ /* to the osborne disk */ /* (I think) */ main(argc,argv) int argc; char *argv[]; { static int f2,c,d; static int dev; /* static char *cpmver,cpmvec; */ printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("Program PCPIP - Osborne Rev 2.0\n\n\n"); printf("CPM / PC-DOS file transfer utility\n"); printf(" Developed by Eric Leininger\n\n\n"); printf("Insert CPM disk in drive A,\n"); printf(" PC disk in drive B \n\n"); printf("Hit return to continue...\n"); c = getone(); debug = c; /* if "y" then debug on */ /* Get Buffer Space (total of 7K) */ copybuf = alloc(2560); /* clusters in/out */ dirbuf = alloc(3584); /* pc-dos directory */ fat = alloc(1024); /* pc-dos fat */ /* Read Directory on PC disk */ pcdirin(); /* Option Menu */ while (c != 'e') { printf("\nSource for copy? (c=CPM, p=PC, r=reset, e=EXIT)\n"); c = getone(); /* Search and copy to CPM */ if (c == 'p') srchdir(); /* Copy to PC */ if (c == 'c') { oztopc(); c = 'c'; } /* Reset for disk change */ if (c == 'r') { printf("Change disks and hit return to continue...\n"); c = getone(); debug = c; pcdirin(); } /* List cluster chain */ if (c == 's') lstch(); } printf("\n\n*** End of PCPIP ***\n\n\n"); exit(); } pcdirin() /* read fat, determine disk type, and then read */ /* the directory. */ { int dev,cluster; char *secadd; reset(); /* Read File Allocation Table (first copy) */ fo (secto 4 secto < 11 secto++) { dev = 1; seldev(dev); track = 0; settrk(track); secadd= fat+((sector-4)*128); setdma(secadd); setsec(sector); cpmread(); } /* determine disk type */ /* (single or double, 8 or 9 tracks) */ disktyp = '?'; cluster = getfat(0,fat); if (cluster == 0x0FFE) { printf("..Single sided diskette, 8 sectors/track..\n"); disktyp = 's'; dostyp = 1; cluslen = 512; dirsec = 12; dirnum = 64; maxfat = 314; sectrk = 8; secclus = 1; secoff = 7; } if (cluster == 0x0FFF) { printf("..Double sided diskette, 8 sectors/track..\n\n"); printf(" Note that PC to CPM file transfers will\n"); printf(" fail if any data is on side 2. Also only\n"); printf(" 80 of the 112 directory entries are \n"); printf(" available.\n"); disktyp = 'd'; dostyp = 1; cluslen = 1024; dirsec = 12; dirnum = 80; maxfat = 316; sectrk = 8; secclus = 2; secoff = 10; } if (cluster == 0x0FFC) { printf("..Single sided diskette, 9 sectors/track..\n"); printf(" Note that only the root directory\n"); printf(" is available.\n"); disktyp = 's'; dostyp = 2; cluslen = 512; dirsec = 20; dirnum = 64; maxfat = 352; sectrk = 9; secclus = 1; secoff = 9; } if (cluster == 0x0FFD) { printf("..Double sided diskette, 9 sectors/track..\n\n"); printf(" Note that PC to CPM file transfers will\n"); printf(" fail if any data is on side 2, only 64\n"); printf(" of the 112 root directory entries are \n"); printf(" available (sub-directories are not\n"); printf(" supported).\n"); disktyp = 'd'; dostyp = 2; cluslen = 1024; dirsec = 20; dirnum = 64; maxfat = 355; sectrk = 9; secclus = 2; secoff = 12; } if (disktyp == '?') { printf("*** ERROR - UNRECOGNIZED DISK ***\n"); printf(" First fat entry = %x\n",cluster); exit(); } /* Read direc!tory sectors */ printf("\nPlease wait - reading IBM directory..."); fo (secto dirsec; secto < dirsec - 1 + dirnum/4; secto++) { dev = 1; seldev(dev); track = 0; settrk(track); secadd= dirbuf+((sector-dirsec)*128); setdma(secadd); setsec(sector); cpmread(); } printf(" Thank you.\n"); return; } srchdir() /* Decode directory */ { int entry; int found; char used,erased,dir,never,*entryadd; erased = 0xE5; dir = 0x2E; never = 0x00; for (entry = 0; entry <= dirnum -1; entry++) { entryadd = dirbuf+(entry*32); used = *entryadd; if (used != erased && used != dir && used != never) {found++; getdir(found,entryadd); } } return; } getdir(found,entryadd) int found; char *entryadd; { int bytes,size,cluster,*pint; char ans,fname[15],name[9],ext[4]; bytes = 8; getstring(8,name,entryadd); entryadd = entryadd + 8; getstring(3,ext,entryadd); cname(fname,name,ext); pint = entryadd + 20; size = *pint; pint = entryadd + 18; cluster = *pint; /* need to decode 4 byte size fields */ printf("\n\nFile = %s ; %d bytes ; %d = 1st cluster\n",fname,size,cluster); printf("Copy to disk A:?(y/n)\n"); ans = getone(); if (ans == 'y') { pctooz(fname,cluster); } return; } pctooz(name,cluster) int cluster; char name[]; /**************************************************/ /* PCOZ */ /* Copies the file 'name' to the osborne disk. */ /* Uses the cluster to begin, then chains through */ /* the FAT for the remaining. */ /**************************************************/ { int fchan; char upline; upline = '\013'; printf("\n\nCopying file %s PC => CPM\n",name); ferror = 0; fchan = file(name); if (ferror != 1) { printf(" First cluster=%d\n",cluster); while (ferror != 1 && cluster < maxfat) { pcread(cluster); if (side == 0) { ferror = write(fchan,copybuf,cluslen); if (ferror != cluslen) { printf("\n\n*** WRITE ERROR, COPY ABORTED ***\n\n"); ferror = 1; } } cluster = getfat(cluster,fat); printf("%c Next cluster=%d \n",upline,cluster); } fclose(fchan); } return; } pcread(cluster) int cluster; /**************************************************/ /* PCREAD */ /* Reads the cluster requested into the copy */ /* buffer. */ /**************************************************/ { int dev,secr,check,check1; char ans,c,*secadd; dev = 1; if (debug == 'y') printf("Reading cluster %d\n",cluster); /* decode cluster to osborne side, track, */ /* and sector */ osbsec(cluster); if (side == 1) { printf("***OOPS - attempt to read flip side***\n"); printf(" ---Cluster skipped, copy continuing--\n"); printf("Hit return to continue\n"); c = getone(); } if (side != 1) { for (secr = sector;secr < sector+cluslen/128;secr++) { if (debug == 'y') printf("Reading Osborne track %d sector %d\n",track,secr); seldev(dev); settrk(track); setsec(secr); secadd = copybuf+(secr-sector)*128; setdma(secadd); cpmread(); } } return; } osbsec(cluster) /* decode cluster number to osborne side, track, */ /* and sector */ int(cluster); { int logsec,check; /* find pc-dos logical sector */ logsec = cluster - 2; logsec = logsec * secclus; logsec = logsec + secoff; /* find pc-dos track and sector */ track = logsec / sectrk; sector = logsec - track * sectrk; /* convert to osborne track and sector */ sector = sector * 4; side = 0; if (disktyp == 'd') { check = track / 2; if (track != check * 2) side = 1; track = track /2; } /* return */ return; } lstch() { int sect,nexts,empty; empty = 0; for (sect = 1;sect < maxfat;sect++) { nexts = getfat(sect,fat); printf("FAT of %d = %d \n",sect,nexts); if(nexts == 0) empty++; if(empty > 35) sect = maxfat; } return; } getnext(cluster) /* Get the next free cluster */ int(cluster); { int i,j,next; if (debug == 'y') printf("Looking for free cluster at %d\n",cluster); next = cluster; while (next != 0 && cluster <= maxfat) { next = getfat(cluster,fat); /* Check for flip side */ osbsec(cluster); if (debug == 'y') printf("Cluster %d, side %d \n",cluster,side); if (side == 1) next = 1; cluster++; } if (debug == 'y') printf("Found free cluster at %d\n",cluster-1); if(next != 0) { "printf("***ERROR - PC disk full***\n"); ferror = 1; } return(cluster-1); } file(fname) char fname[]; /**************************************************/ /* FILE */ /* */ /* This routine opens the file 'fname' and */ /* the channel number. */ /* */ /**************************************************/ { int i; char ans,dname[15]; /* First, see if file exists */ /* i = fopen(fname,"r"); if (i > 0) { fclose(i); printf("File exists on drive A:\n"); printf(" OK to overwrite? (Y/N)\n"); ans = getone(); if (ans != 'y') { ferror = 1; return; } } */ /* Now open for output */ /* Force to drive A: */ for ( i = 0; i <= 13; i++)  dname[i+2] = fname[i]; dname[0] = 'A'; dname[1] = ':'; i = fopen(fname,"w"); if (i > 0) return i; printf("Can't Open: %s\n",dname); ferror = 1; return; } oztopc() { char name[15]; int i,max; max = 14; printf("\nOK, CPM to PC file transfer\n"); printf("Enter file name:"); istring(&name[0],max); ozpc(name); printf("...Copy complete\n"); return; } pcdirout() /* Rewrite directory and FAT on PC disk */ { int base,dev,fatsize; char *secadd; /* Write directory sectors */ fo (secto dirsec secto < dirsec-1+dirnum/4 secto++) { dev = 1; seldev(dev); track = 0; settrk(track); secadd= dirbuf+((sector-dirsec)*128); setdma(secadd); setsec(sector); cpmput(); } /* Write File Allocation Table (two copies) */ fatsize = dostyp * 4; for (base = 4; base <= 4 + fatsize;base = base + fatsize) { fo (secto base secto < base-1+fatsize secto++) { dev = 1; seldev(dev); track = 0; settrk(track); secadd= fat+((sector-base)*128); setdma(secadd); setsec(sector); cpmput(); } } return; } ozpc(name) char name[]; { int i,fchan,cread; int length,cluster,start,next; char upline,dname[17]; upline = '\013'; /* Force name to drive A: */ for (i = 0; i <= 14; i++) dname[i] = name[i]; if (dname[1] != ':') { for (i = 14; i >= 0; i--) dname[i+2] = dname[i]; } dname[0] = 'A'; dname[1] = ':'; /* make sure drive is not specified on PC-DOS dir */ for (i = 0; i <= 14; i++) name[i] = dname[i+2]; printf("\n\nCopying file %s (CPM => PC)\n",dname); ferror = 0; fchan = fopen(dname,"rb"); if (fchan == 0) { printf("*** Can't open file ***\n"); return; } /* Find first empty cluster */ start = getnext(2); /* And go to it */ printf("\n"); next = start; length = 0; cread = read(fchan,copybuf,cluslen); while (cread > 0 && ferror ==0) { printf("%c Have read %d, cluster = %d, next = %d\n",upline,cread,cluster,next); cluster = next; next = pcwrite(cluster); length = length + cread; cread = read(fchan,copybuf,cluslen); } printf("End of read, last read was %d, last write to %d\n",cread,cluster); if (ferror ==0); { pclose(cluster); makedir(name,start,length); /* rewrite fat and directory */ pcdirout(); printf("\nCopy complete\n"); } fclose(fchan); return; } makedir(name,start,length) char name[]; int start,length; { char c; int i,entry; char used,erased,never,*entryadd,*namadd; int found; int bytes,size,*pint; char ans,; printf("Make PC directory entry...\n"); printf(" Name = %s\n",name); printf(" First Sector = %d\n",start); printf(" Length = %d\n",length); /* First get address of first available directory */ /* entry  */ erased = 0xE5; never = 0x00; for (entry = 0; entry <= 63; entry++) { entryadd = dirbuf+(entry*32); used = *entryadd; if (used == erased || used == never) break; } /* Now format new entry */ for (i = 0;i <= 31;i++) *(entryadd + i) = '\0'; pint = entryadd + 26; *pint = start; pint = entryadd + 28; *pint = length; for (i = 0;i <= 10;i++) *(entryadd + i) = ' '; namadd = entryadd; for (i = 0;i <= 12; i++) { if (name[i] != '.' && name[i] != '\0') { *namadd = name[i]; namadd = namadd +1; } if (name[i] == '.') namadd = entryadd + 8; if (name[i] == '\0') break; } if (debug == 'y') dump(32,entryadd,"New dir entry = "); return; } pclose(cluster) int cluster; { char c; printf("Close PC fat chain...\n"); printf(" Last Sector = %d\n",cluster); pchain(cluster,0XFFF,fat); return; } pcwrite(cluster) int clust#er; /**************************************************/ /* PCWRITE */ /* Writes the cluster requested from the copy */ /* buffer */ /**************************************************/ { int next,dev,secr; char ans,*secadd; if (debug == 'y') printf("Writing cluster %d\n",cluster); dev = 1; osbsec(cluster); for (secr = sector;secr < sector+cluslen/128;secr++) { if (debug == 'y') printf("Writing Osborne track %d sector %d\n",track,secr); seldev(dev); settrk(track); setsec(secr); secadd = copybuf+(secr-sector)*128; setdma(secadd); cpmput(); } next = getnext(cluster+1); pchain(cluster,next,fat); return(next); } /* ************* END OF PCPIP.C ************* */ ain...\n"); printf(" Last Sector = %d\n",cluster); pchain(cluster,0XFFF,fat); return; } pcwrite(cluster) int clustb:xsub ERA PCPIP.BAK b:C -m b:pcpip=a:PCPIP m80 pcpip=b:pcpip era b:pcpip.mac l80 /p:100,clib,printf,dump,bioscall,pcpip,pclib,end b:pcpip/n /e DFORMAT COM*+KFORMAT COM,-OFORMAT COM./0OSTOKPROCOM1OZTOKPROASM72345678MFDISK DOC9:;MFDISK10COM<=>?@ABCDEFGHIJKMFDISK10COM+LMNOPQMFDISK2 COMRSTUVWXYZ[\]^_`aMFDISK2 COM)bcdefgMFDISK4 COMhijklmnopqrstuvwMFDISK4 COM.xyz{|}SETVISO1COM ~SETVISO1DOCPCPIP2 COMcPCPIP C PCPIP C ALL $$$/**************************************************/ /* */ /* VBIOS.C WRITTEN BY ERIC LEININGER */ /* */ /* C FUNCTIONS TO PROVIDE ACCESS TO BIOS AND BDOS */ /* DISK SUBROUTINES */ /* */ /* ALL HAVE BEEN MODIFIED TO FIND BIOS FROM THE */ /* WARM START VECTOR AT 00H */ /**************************************************/ reset() /**************************************************/ /* */ /* This routine calls BDOS to reset both disks */ /* to read/write */ /* */ /**************************************************/ { #asm MVI C,0DH ; RESET DISK SYSTEM CALL 005H ; GO TO IT #endasm return; } seldev(dev) int dev; /**************************************************/ /* */ /* This routine calls BIOS to select a disk */ /* */ /* When entered, HL contains 0 for disk A or */ /* 1 for disk B */ /* */ /**************************************************/ { dev; #asm BSEL EQU 0ED42H+1BH MOV C,L CALL1: CALL BSEL #endasm return; } home() /**************************************************/ /* */ /* This routine brings the selected device to */ /* track 00 */ /* */ /**************************************************/ { #asm BHOME EQU 0ED42H+018H ; BIOS + 18H CALL2: CALL BHOME ; CALL BIOS #endasm return; } setdma(bufin) int *bufin; /**************************************************/ /* */ /* This routine sets the disk DMA address pointer */ /* to point to the buffer passed to the routine. */ /* */ /**************************************************/ { bufin; #asm BDMA EQU 0ED42H+024H ; BIOS + 24H MOV B,H MOV C,L CALL3: CALL BDMA #endasm return; } settrk(track) int track; /**************************************************/ /* */ /* This routine sets track pointer. */ /* Tracks are 0 to 39 */ /* */ /**************************************************/ { track; #asm BTRACK EQU 0ED42H+01EH ; BIOS + 1EH MOV C,L CALL4: CALL BTRACK #endasm return; } setsec(sec$tor) int sector; /**************************************************/ /* */ /* This routine sets sector pointer. */ /* Sectors are 0 to 19 for single, 0 to 39 for */ /* double density */ /**************************************************/ { sector; #asm BSECT EQU 0ED42H+21H ; BIOS + 21H MOV C,L CALL5: CALL BSECT #endasm return; } cpmread() /**************************************************/ /* */ /* This routine reads the disk. Before execution, */ /* the drive must be selected and the DMA */ /* address set. */ /* */ /**************************************************/ { #asm BREAD EQU 0ED42H+027H ; BIOS + 27H CALL6: CALL BREAD #endasm return; } cpmput() /**************************************************/ /* */ /* This routine writes the disk. Before using, */ /* the drive must be selected and the DMA */ /* address set. */ /* */ /**************************************************/ { #asm BWRITE EQU 0ED42H+02AH ; BIOS + 2AH CALL7: CALL BWRITE #endasm return; } /* end of file */ ne reads the disk. Before execution, */ /* the drive must be selected and the DMA */ /* address set. */ /* */ /**************************************************/ { #asm BREAD EQU 0ED42H+027H ; BIOS + 27H CALL6: CALL BREAD #endasm return; } cpmput() /*******#include PRINTF.H dump(bytes,addr,msg) int bytes; char *addr,msg[]; /**************************************************/ /* DUMP */ /* */ /* Dumps in HEX and ASCII from addr for 'bytes' */ /* bytes. Also pronts the msg. */ /* */ /**************************************************/ { int i,j,k,m,n; char l,*pblock,*pbyte; char c,temp[8],line[54]; int *intaddr; k = 0; l = k; printf("Memory dump at %x \n",addr); printf("%s \n",msg); for (m = 0;m * 16 < bytes;m = m+1) { pblock = addr + (16*m); for (i = 0;i < 51;i = i+1) { line[i] = ' '; } line[51] = '\0'; for (i = 0;i < 16;i = i+1) { pbyte = pblock + i; sprintf(&temp[0],"%x",*pbyte); if (temp[1] == '\0') { line[i*2] = '0'; line[i*2+1] = temp[0]; } if (temp[1] != '\0' && temp[2] == '\0')  { line[i*2] = temp[0]; line[i*2+1] = temp[1]; } if (temp[1] != '\0' && temp[2] != '\0' && temp[3] == '\0') { line[i*2] = '0'; line[i*2+1] = temp[2]; } if (temp[1] != '\0' && temp[2] != '\0' && temp[3] != '\0') { line[i*2] = temp[2]; line[i*2+1] = temp[3]; } l = *pbyte; if (l >= ' ' && l <= 'z') line[i+34] = l; if (l < ' ' || l > 'z') line[i+34] = '.'; } printf("%s\n",line); } printf("Hit return to continue\n"); c = getone(); return; } or (m = 0;m * 16 < bytes;m = m+1) { pblock = addr + (16*m); for (i = 0;i < 51;i = i+1) { line[i] = ' '; } line[51] = '\0'; for (i = 0;i < 16;i = i+1) { pbyte = pblock + i; sprintf(&temp[0],"%x",*pbyte); if (temp[1] == '\0') { line[i*2] = '0'; line[i*2+1] = temp[0]; } if (temp[1] != '\0' && temp[2] == '\0') $END:: DS 1 END PROBE COM$SKEW COM %&FORMAT DOC'CFORMAT COM()DFORMAT COM*+KFORMAT COM,-OFORMAT COM./0OSTOKPROCOM1OZTOKPROASM72345678MFDISK DOC9:;MFDISK10COM<=>?@ABCDEFGHIJKMFDISK10COM+LMNOPQMFDISK2 COMRSTUVWXYZ[\]^_`aMFDISK2 COM)bcdefgMFDISK4 COMhijklmnopqrstuvwMFDISK4 COM.xyz{|}SETVISO1COM ~SETVISO1DOCPCPIP2 COMcPCPIP C PCPIP C ALL SUBBIOSCALLC %DUMP C END $$$%/* PCLIB.C */ /* PCPIP miscellaneous routines */ istring(string,max) char *string; int max; { int c,count; count = 0; c = getchar(); if (c >= 'a' && c<= 'z') c = c - 'a' + 'A'; while (c != 10 && count < max) { *string = c; string = string +1; count = count +1; c =getchar(); if (c >= 'a' && c<= 'z') c = c - 'a' + 'A'; } *string = '\0'; return; } pchain(cluster,next,fat) int cluster,next; char *fat; { char c; int offset; char b1,b2,*bp; int n1,n2,n3,bi1,bi2; int w1,w2,w3,w4; /* Get nibbles from previous fat */ bi1 = 0; bi2 = 0; offset = cluster + cluster/2; b1 = *(fat + offset); b2 = *(fat + offset + 1); bi1 = b1; bi2 = b2; bp = &bi1; bp = bp+1; *bp = 0; bp = &bi2; bp = bp+1; *bp = 0; w1 = bi1/16; w3 = bi2/16; w2 = bi1-(w1*16); w4 = bi2-(w3*16); /* Break next cluster number into nibbles */ n1 = next/256; n2 = (next - n1*256)/16; n3 = next - n1*256 - n2*16; /* Determine values for byte 1 and 2 */ if (2*(cluster/2) == cluster) { bi1 = n2*16 + n3; bi2 = w3*16 + n1; } if (2*(cluster/2) != cluster) { bi1 = n3*16 + w2; bi2 = n1*16 + n2; } /* And store in the fat */ b1 = bi1; b2 = bi2; *(fat + offset) = b1; *(fat + offset + 1) = b2; return; } getfat(cluster,fat) int cluster; char *fat; /**************************************************/ /* GETFAT */ /* */ /* Reads the FAT entry for the input cluster and */ /* returns the next cluster (FFF for EOF) */ /* */ /**************************************************/ { int offset,nextsec; char b1,b2,*bp; int n1,n2,n3,n4,bi1,bi2; bi1 = 0; bi2 = 0; offset = cluster + cluster/2; b1 = *(fat + offset); b2 = *(fat + offset + 1); bi1 = b1; bi2 = b2; bp = &bi1; bp = bp+1; *bp = 0; bp = &bi2; bp = bp+1; *bp = 0; n1 = bi1/16; n3 = bi2/16; n2 = bi1-(n1*16); n4 = bi2-(n3*16); if (2*(cluster/2) == cluster) nextsec = n4*256 + n1*16 + n2; if (2*(cluster/2) != cluster) nextsec = n3*256 + n4*16 + n1; return(nextsec); } getstring(len,string,addr) int len; char string[],*addr; { int i,j; char *dispaddr; for (i = 0;i < len;i = i+1) { dispaddr = addr + i; string[i] = *dispaddr; } string[len] = '\0'; return; } cname(fname,name,ext) char fname[],name[],ext[]; { int i,j; j = 0; for (i = 0;i < 8;i = i+1) { if (name[i] != ' ' && name[i] != '\0') { fname[j] = name[i]; j = j+1; } } for (i = 0;i < 3;i = i+1) { if (ext[i] != ' ' && ext[i] != '\0') { if (i == 0) {fname[j] = '.'; j = j+1; } fname[j] = ext[i]; j = j+1; } } fname[j] = '\0'; return; } getone() /**************************************************/  /* GETONE */ /* */ /* This routine accepts and returns a single */ /* character from the keyboard (must hit return) */ /* */ /**************************************************/ { int c,d; c = getchar(); if (c >= 'A' && c<= 'Z') c = c + 'a' - 'A'; d = c; while (d != 10) { d = getchar(); } return c; } /******** END OF PCLIB.C *************/  { if (name[i] != ' ' && name[i] != '\0') { fname[j] = name[i]; j = j+1; } } for (i = 0;i < 3;i = i+1) { if (ext[i] != ' ' && ext[i] != '\0') { if (i == 0) {fname[j] = '.'; j = j+1; } fname[j] = ext[i]; j = j+1; } } fname[j] = '\0'; return; } getone() /**************************************************/  This is the release date of the disk. MFDISK2 COM RTFDISK2 COM bMFDISK4 COM hWFDISK4 COM xSETVISO1COM ~SETVISO1DOC PCPIP2 COM 1PCPIP C KCPIP C ALL SUB BIOSCALLC DUMP C END MAC PCLIB C OSTOKPRO.COM 90 A3 512 4 OZTOKPRO.ASM 2D 75 7040 55 MFDISK .DOC 8F 77 2304 18 MFDISK10.COM 68 CC 21888 171 MFDISK2 .COM AF CB 21632 169 MFDISK4 .COM 17 DB 22272 174 SETVISO1.COM 97 E1 1152 9 SETVISO1.DOC 14 3C 768 6 PCPIP2 .COM E5 08 12672 99 PCPIP .C BD 7F 19328 151 ALL .SUB F0 78 256 2 BIOSCALL.C 67 09 4736 37 DUMP & Fog Library Disk FOG-CPM.037 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Disk formatting and transfer programs and utilities for several computers. Filename Description -07-00 .86 This is the release date of the disk. -CPM037 .DOC This is the description of the disk contents. DSKPRAM .COM F30A 2K [Disk Parameters 1 of 2] Will determine the values of the disk parameter block and skew translation table of a disk. DSKPRAM .ASM 4A92 15K [Disk Parameters 2 of 2] PROBE .COM B872 17K Gives information on CP/M addresses and disk info. SKEW .COM D4EF 2K Shows directory skew pattern on a disk. FORMAT .DOC 8641 1K [Foreign Formats 1 of 5] A series of programs to allow an Osborne 1 to format disks for other computers. CFORMAT .COM 8F69 2K [Foreign Formats 2 of 5] Format an IBM-PC CPM86 single sided disk. DFORMAT .COM 9F3F 2K [Foreign Formats 3 of 5] Format a DEC VT180 disk. KFORMAT .COM 5C18 2K [Foreign Formats 4 of 5] Format a Kaypro II (single sided) disk. OFORMAT .COM 161E 3K  [Foreign Formats 5 of 5] Osborne single sided single or double density formatter. OSTOKPRO.COM 90A3 1K [Osborne to Kaypro 1 of 2] Allows an Osborne 1 to read and write a Kaypro II (single sided) disk. ASseMbler source code included. OZTOKPRO.ASM 2D75 7K [Osborne to Kaypro 2 of 2] MFDISK .DOC 8F77 3K [MultiFormat 1 of 4] Allows Kaypro II, 4, and 10 to read, write, and format disks for other computers. Similar to the proprietary Uniform program but does not support as many formats. MFDISK10.COM 68CC 22K [MultiFormat 2 of 4] MFDISK2 .COM AFCB 22K [MultiFormat 3 of 4] MFDISK4 .COM 17DB 22K [MultiFormat 4 of 4] SETVISO1.COM 97E1 2K [SETVISO1 1 of 2] Allows a Visual 1050 to read Osborne Double Density disks. SETVISO1.DOC 143C 1K [SETVISO1 2 of 2] PCPIP2 .COM E508 13K ver. 2.0 [PCPIP 1 of 7] Allows Osborne 1 to read and write single sided MS-DOS disks, either 8 or 9 sectors. 'C' source included. PCPIP .C BD7F 19K ver. 2.0 [PCPIP 2 of 7] ALL .SUB F078 1K ver. 2.0 [PCPIP 3 of 7] BIOSCALL.C 6709 5K ver. 2.0 [PCPIP 4 of 7] DUMP .C 47A9 2K ver. 2.0 [PCPIP 5 of 7] END .MAC F9AD 1K ver. 2.0 [PCPIP 6 of 7] PCLIB .C 2BB1 4K ver. 2.0 [PCPIP 7 of 7] II (single sided) disk. OFORMAT .COM 161E 3K '